| // Copyright 2022 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/graphics/display/drivers/intel-i915/fake-dpcd-channel.h" |
| |
| namespace i915 { |
| namespace testing { |
| |
| void FakeDpcdChannel::SetDefaults() { |
| SetDpcdRevision(dpcd::Revision::k1_4); |
| SetSinkCount(kDefaultSinkCount); |
| SetMaxLaneCount(kDefaultLaneCount); |
| SetMaxLinkRate(dpcd::LinkBw::k1620Mbps); |
| } |
| |
| void FakeDpcdChannel::PopulateLinkRateTable(std::vector<uint16_t> values) { |
| std::memset(registers.data() + dpcd::DPCD_SUPPORTED_LINK_RATE_START, 0, |
| kMaxLinkRateTableEntries * 2); |
| for (unsigned i = 0; i < values.size() && i < kMaxLinkRateTableEntries; i++) { |
| unsigned offset = dpcd::DPCD_SUPPORTED_LINK_RATE_START + (i * 2); |
| registers[offset] = static_cast<uint8_t>(values[i] & 0xFF); |
| registers[offset + 1] = (values[i] >> 8); |
| } |
| } |
| |
| bool FakeDpcdChannel::DpcdRead(uint32_t addr, uint8_t* buf, size_t size) { |
| if (addr + size > registers.size()) { |
| return false; |
| } |
| |
| std::memcpy(buf, registers.data() + addr, size); |
| return true; |
| } |
| |
| bool FakeDpcdChannel::DpcdWrite(uint32_t addr, const uint8_t* buf, size_t size) { |
| if (addr + size > registers.size()) { |
| return false; |
| } |
| |
| std::memcpy(registers.data() + addr, buf, size); |
| return true; |
| } |
| |
| } // namespace testing |
| } // namespace i915 |