blob: 71a95b0ab4b358c22b4a42d1c9bfe08e2bb86d23 [file] [log] [blame]
// 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