blob: 25ca9e4e5f7cdf13a8c151a6aa44f4118aa618cc [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/registers-typec.h"
#include <zircon/compiler.h>
#include <gtest/gtest.h>
#include <mock-mmio-range/mock-mmio-range.h>
#include "src/graphics/display/drivers/intel-i915/hardware-common.h"
namespace i915 {
class RegisterTypeCTest : public ::testing::Test {
protected:
constexpr static int kMmioRangeSize = 0x100000;
ddk_mock::MockMmioRange mmio_range_{kMmioRangeSize, ddk_mock::MockMmioRange::Size::k32};
fdf::MmioBuffer mmio_buffer_{mmio_range_.GetMmioBuffer()};
};
using DynamicFlexIoDisplayPortMainLinkLaneEnabledTest = RegisterTypeCTest;
// TODO(https://fxbug.dev/42061535): Separate MMIO address testing and bit helper methods
// testing.
TEST_F(DynamicFlexIoDisplayPortMainLinkLaneEnabledTest, Getter) {
constexpr uint32_t kFiaOffsets[] = {0x1638C0, 0x16E8C0, 0x16F8C0};
// Test `enabled_main_links_bits` getter.
mmio_range_.Expect(ddk_mock::MockMmioRange::AccessList({
{.address = kFiaOffsets[0], .value = 0x0000'003c, .write = false},
{.address = kFiaOffsets[1], .value = 0x0000'00f3, .write = false},
{.address = kFiaOffsets[2], .value = 0x0000'0031, .write = false},
}));
{
const auto ddi_to_test = DdiId::DDI_TC_1;
const auto reg_to_test =
registers::DynamicFlexIoDisplayPortMainLinkLaneEnabled::GetForDdi(DdiId::DDI_TC_1)
.ReadFrom(&mmio_buffer_);
EXPECT_EQ(reg_to_test.enabled_display_port_main_link_lane_bits(ddi_to_test), 0xcu);
}
{
const auto ddi_to_test = DdiId::DDI_TC_4;
const auto reg_to_test =
registers::DynamicFlexIoDisplayPortMainLinkLaneEnabled::GetForDdi(DdiId::DDI_TC_4)
.ReadFrom(&mmio_buffer_);
EXPECT_EQ(reg_to_test.enabled_display_port_main_link_lane_bits(ddi_to_test), 0xfu);
}
{
const auto ddi_to_test = DdiId::DDI_TC_5;
const auto reg_to_test =
registers::DynamicFlexIoDisplayPortMainLinkLaneEnabled::GetForDdi(DdiId::DDI_TC_5)
.ReadFrom(&mmio_buffer_);
EXPECT_EQ(reg_to_test.enabled_display_port_main_link_lane_bits(ddi_to_test), 0x1u);
}
}
// TODO(https://fxbug.dev/42061535): Separate MMIO address testing and bit helper methods
// testing.
TEST_F(DynamicFlexIoDisplayPortMainLinkLaneEnabledTest, Setter) {
constexpr uint32_t kFiaOffsets[] = {0x1638C0, 0x16E8C0, 0x16F8C0};
// Test `enabled_main_links_bits` getter.
mmio_range_.Expect(ddk_mock::MockMmioRange::AccessList({
{.address = kFiaOffsets[0], .value = 0x0000'003c, .write = false},
{.address = kFiaOffsets[0], .value = 0x0000'003f, .write = true},
{.address = kFiaOffsets[1], .value = 0x0000'00f3, .write = false},
{.address = kFiaOffsets[1], .value = 0x0000'0013, .write = true},
{.address = kFiaOffsets[2], .value = 0x0000'0031, .write = false},
{.address = kFiaOffsets[2], .value = 0x0000'003c, .write = true},
}));
{
const auto ddi_to_test = DdiId::DDI_TC_1;
auto reg_to_test =
registers::DynamicFlexIoDisplayPortMainLinkLaneEnabled::GetForDdi(ddi_to_test)
.ReadFrom(&mmio_buffer_);
reg_to_test.set_enabled_display_port_main_link_lane_bits(ddi_to_test, 0xfu)
.WriteTo(&mmio_buffer_);
}
{
const auto ddi_to_test = DdiId::DDI_TC_4;
auto reg_to_test =
registers::DynamicFlexIoDisplayPortMainLinkLaneEnabled::GetForDdi(ddi_to_test)
.ReadFrom(&mmio_buffer_);
reg_to_test.set_enabled_display_port_main_link_lane_bits(ddi_to_test, 0x1u)
.WriteTo(&mmio_buffer_);
}
{
const auto ddi_to_test = DdiId::DDI_TC_5;
auto reg_to_test =
registers::DynamicFlexIoDisplayPortMainLinkLaneEnabled::GetForDdi(ddi_to_test)
.ReadFrom(&mmio_buffer_);
reg_to_test.set_enabled_display_port_main_link_lane_bits(ddi_to_test, 0xcu)
.WriteTo(&mmio_buffer_);
}
}
TEST_F(DynamicFlexIoDisplayPortMainLinkLaneEnabledTest, GetRejectsComboDdi) {
// COMBO DDIs should not be supported
EXPECT_DEATH(registers::DynamicFlexIoDisplayPortMainLinkLaneEnabled::GetForDdi(DdiId::DDI_A),
"DDI_TC_1");
}
TEST_F(DynamicFlexIoDisplayPortMainLinkLaneEnabledTest,
EnabledDisplayPortLaneBitsRejectsDdisFromDifferentFia) {
EXPECT_DEATH(
{
const auto reg_to_test =
registers::DynamicFlexIoDisplayPortMainLinkLaneEnabled::GetForDdi(DdiId::DDI_TC_1)
.FromValue(0);
reg_to_test.enabled_display_port_main_link_lane_bits(DdiId::DDI_B);
},
"IsDdiCoveredByThisRegister");
// DDIs must be in the same FIA.
EXPECT_DEATH(
{
const auto reg_to_test =
registers::DynamicFlexIoDisplayPortMainLinkLaneEnabled::GetForDdi(DdiId::DDI_TC_1)
.FromValue(0);
reg_to_test.enabled_display_port_main_link_lane_bits(DdiId::DDI_TC_3);
},
"IsDdiCoveredByThisRegister");
}
TEST_F(DynamicFlexIoDisplayPortMainLinkLaneEnabledTest, SetterNotSupportComboDdi) {
// COMBO DDIs should not be supported
EXPECT_DEATH(
{
auto reg_to_test =
registers::DynamicFlexIoDisplayPortMainLinkLaneEnabled::GetForDdi(DdiId::DDI_TC_1)
.FromValue(0);
reg_to_test.set_enabled_display_port_main_link_lane_bits(DdiId::DDI_B, 0x1u)
.WriteTo(&mmio_buffer_);
},
"IsDdiCoveredByThisRegister");
}
TEST_F(DynamicFlexIoDisplayPortMainLinkLaneEnabledTest,
SetEnabledDisplayPortLaneBitsRejectsDdisFromDifferentFia) {
// DDIs must be in the same FIA.
EXPECT_DEATH(
{
auto reg_to_test =
registers::DynamicFlexIoDisplayPortMainLinkLaneEnabled::GetForDdi(DdiId::DDI_TC_1)
.FromValue(0);
reg_to_test.set_enabled_display_port_main_link_lane_bits(DdiId::DDI_TC_3, 0x3u)
.WriteTo(&mmio_buffer_);
},
"IsDdiCoveredByThisRegister");
// enabled_main_links_mask must be valid
EXPECT_DEATH(registers::DynamicFlexIoDisplayPortMainLinkLaneEnabled::GetForDdi(DdiId::DDI_TC_1)
.FromValue(0)
.set_enabled_display_port_main_link_lane_bits(DdiId::DDI_TC_1, 0xau)
.WriteTo(&mmio_buffer_);
, "invalid");
}
using DynamicFlexIoScratchPadTest = RegisterTypeCTest;
// TODO(https://fxbug.dev/42061535): Separate MMIO address testing and bit helper methods
// testing.
TEST_F(DynamicFlexIoScratchPadTest, Getter) {
constexpr uint32_t kFiaOffsets[] = {0x1638A0, 0x16E8A0, 0x16F8A0};
// Test `display_port_tx_lane_assignment`, `type_c_live_state` getters
// and helper method `display_port_assigned_tx_lane_count`.
mmio_range_.Expect(ddk_mock::MockMmioRange::AccessList({
{.address = kFiaOffsets[0], .value = 0b0000'0000'0010'1100, .write = false},
{.address = kFiaOffsets[1], .value = 0b0100'0001'0000'1111, .write = false},
{.address = kFiaOffsets[2], .value = 0b0000'0000'0010'1111, .write = false},
}));
{
const auto ddi_to_test = DdiId::DDI_TC_1;
auto reg_to_test =
registers::DynamicFlexIoScratchPad::GetForDdi(ddi_to_test).ReadFrom(&mmio_buffer_);
EXPECT_EQ(reg_to_test.display_port_assigned_tx_lane_count(ddi_to_test), 2u);
EXPECT_EQ(reg_to_test.display_port_tx_lane_assignment(ddi_to_test), 0b1100u);
EXPECT_EQ(reg_to_test.type_c_live_state(ddi_to_test),
registers::DynamicFlexIoScratchPad::TypeCLiveState::kTypeCHotplugDisplay);
EXPECT_EQ(reg_to_test.display_port_tx_lane_assignment_bits_connector_0(), 0b1100u);
EXPECT_EQ(reg_to_test.type_c_live_state_connector_0(), 0b001u);
}
{
const auto ddi_to_test = DdiId::DDI_TC_4;
auto reg_to_test =
registers::DynamicFlexIoScratchPad::GetForDdi(ddi_to_test).ReadFrom(&mmio_buffer_);
EXPECT_EQ(reg_to_test.display_port_assigned_tx_lane_count(ddi_to_test), 1u);
EXPECT_EQ(reg_to_test.display_port_tx_lane_assignment(ddi_to_test), 0b0001u);
EXPECT_EQ(reg_to_test.type_c_live_state(ddi_to_test),
registers::DynamicFlexIoScratchPad::TypeCLiveState::kThunderboltHotplugDisplay);
EXPECT_EQ(reg_to_test.display_port_tx_lane_assignment_bits_connector_1(), 0b0001u);
EXPECT_EQ(reg_to_test.type_c_live_state_connector_1(), 0b010u);
}
{
const auto ddi_to_test = DdiId::DDI_TC_5;
auto reg_to_test =
registers::DynamicFlexIoScratchPad::GetForDdi(ddi_to_test).ReadFrom(&mmio_buffer_);
EXPECT_EQ(reg_to_test.display_port_assigned_tx_lane_count(ddi_to_test), 4u);
EXPECT_EQ(reg_to_test.display_port_tx_lane_assignment(ddi_to_test), 0b1111u);
EXPECT_EQ(reg_to_test.type_c_live_state(ddi_to_test),
registers::DynamicFlexIoScratchPad::TypeCLiveState::kTypeCHotplugDisplay);
EXPECT_EQ(reg_to_test.display_port_tx_lane_assignment_bits_connector_0(), 0b1111u);
EXPECT_EQ(reg_to_test.type_c_live_state_connector_0(), 0b001u);
}
}
TEST_F(DynamicFlexIoScratchPadTest, GetRejectsComboDdi) {
// COMBO DDIs should not be supported
EXPECT_DEATH(registers::DynamicFlexIoScratchPad::GetForDdi(DdiId::DDI_A), "DDI_TC_1");
}
TEST_F(DynamicFlexIoScratchPadTest, HelperMethodsRejectDdiFromDifferentFia) {
// DDIs must be in the same FIA.
EXPECT_DEATH(registers::DynamicFlexIoScratchPad::GetForDdi(DdiId::DDI_TC_1)
.FromValue(0)
.display_port_assigned_tx_lane_count(DdiId::DDI_TC_3),
"IsDdiCoveredByThisRegister");
EXPECT_DEATH(registers::DynamicFlexIoScratchPad::GetForDdi(DdiId::DDI_TC_1)
.FromValue(0)
.display_port_tx_lane_assignment(DdiId::DDI_TC_3),
"IsDdiCoveredByThisRegister");
EXPECT_DEATH(registers::DynamicFlexIoScratchPad::GetForDdi(DdiId::DDI_TC_1)
.FromValue(0)
.type_c_live_state(DdiId::DDI_TC_3),
"IsDdiCoveredByThisRegister");
}
using DynamicFlexIoPinAssignmentTest = RegisterTypeCTest;
// TODO(https://fxbug.dev/42061535): Separate MMIO address testing and bit helper methods
// testing.
TEST_F(DynamicFlexIoPinAssignmentTest, Getter) {
constexpr uint32_t kFiaOffsets[] = {0x163880, 0x16E880, 0x16F880};
// Test `pin_assignment_for_ddi` getter.
mmio_range_.Expect(ddk_mock::MockMmioRange::AccessList({
{.address = kFiaOffsets[0], .value = 0b0000'0000'0000'0110, .write = false},
{.address = kFiaOffsets[1], .value = 0b0000'0000'0001'0101, .write = false},
{.address = kFiaOffsets[2], .value = 0b0000'0000'0000'0100, .write = false},
}));
{
const auto ddi_to_test = DdiId::DDI_TC_1;
auto reg_to_test = registers::DynamicFlexIoDisplayPortPinAssignment::GetForDdi(ddi_to_test)
.ReadFrom(&mmio_buffer_);
EXPECT_EQ(reg_to_test.pin_assignment_for_ddi(ddi_to_test),
registers::DynamicFlexIoDisplayPortPinAssignment::PinAssignment::kF);
EXPECT_EQ(reg_to_test.display_port_pin_assignment_connector_0(), 0b0110u);
EXPECT_EQ(
reg_to_test.set_display_port_pin_assignment_connector_0(0b0000).pin_assignment_for_ddi(
DdiId::DDI_TC_1),
registers::DynamicFlexIoDisplayPortPinAssignment::PinAssignment::kNone);
EXPECT_EQ(
reg_to_test.set_display_port_pin_assignment_connector_0(0b0001).pin_assignment_for_ddi(
DdiId::DDI_TC_1),
registers::DynamicFlexIoDisplayPortPinAssignment::PinAssignment::kA);
EXPECT_EQ(
reg_to_test.set_display_port_pin_assignment_connector_0(0b0010).pin_assignment_for_ddi(
DdiId::DDI_TC_1),
registers::DynamicFlexIoDisplayPortPinAssignment::PinAssignment::kB);
EXPECT_EQ(
reg_to_test.set_display_port_pin_assignment_connector_0(0b0011).pin_assignment_for_ddi(
DdiId::DDI_TC_1),
registers::DynamicFlexIoDisplayPortPinAssignment::PinAssignment::kC);
EXPECT_EQ(
reg_to_test.set_display_port_pin_assignment_connector_0(0b0100).pin_assignment_for_ddi(
DdiId::DDI_TC_1),
registers::DynamicFlexIoDisplayPortPinAssignment::PinAssignment::kD);
EXPECT_EQ(
reg_to_test.set_display_port_pin_assignment_connector_0(0b0101).pin_assignment_for_ddi(
DdiId::DDI_TC_1),
registers::DynamicFlexIoDisplayPortPinAssignment::PinAssignment::kE);
EXPECT_EQ(
reg_to_test.set_display_port_pin_assignment_connector_0(0b0110).pin_assignment_for_ddi(
DdiId::DDI_TC_1),
registers::DynamicFlexIoDisplayPortPinAssignment::PinAssignment::kF);
}
{
const auto ddi_to_test = DdiId::DDI_TC_4;
auto reg_to_test = registers::DynamicFlexIoDisplayPortPinAssignment::GetForDdi(ddi_to_test)
.ReadFrom(&mmio_buffer_);
EXPECT_EQ(reg_to_test.pin_assignment_for_ddi(ddi_to_test),
registers::DynamicFlexIoDisplayPortPinAssignment::PinAssignment::kA);
EXPECT_EQ(reg_to_test.display_port_pin_assignment_connector_1(), 0b0001u);
}
{
const auto ddi_to_test = DdiId::DDI_TC_5;
auto reg_to_test = registers::DynamicFlexIoDisplayPortPinAssignment::GetForDdi(ddi_to_test)
.ReadFrom(&mmio_buffer_);
EXPECT_EQ(reg_to_test.pin_assignment_for_ddi(ddi_to_test),
registers::DynamicFlexIoDisplayPortPinAssignment::PinAssignment::kD);
EXPECT_EQ(reg_to_test.display_port_pin_assignment_connector_0(), 0b0100u);
}
}
TEST_F(DynamicFlexIoPinAssignmentTest, GetRejectsComboDdi) {
// COMBO DDIs should not be supported
EXPECT_DEATH(registers::DynamicFlexIoDisplayPortPinAssignment::GetForDdi(DdiId::DDI_A),
"DDI_TC_1");
}
TEST_F(DynamicFlexIoPinAssignmentTest, PinAssignmentRejectDdiFromDifferentFia) {
// DDIs must be in the same FIA.
EXPECT_DEATH(registers::DynamicFlexIoDisplayPortPinAssignment::GetForDdi(DdiId::DDI_TC_1)
.FromValue(0)
.pin_assignment_for_ddi(DdiId::DDI_TC_3),
"IsDdiCoveredByThisRegister");
}
using DynamicFlexIoDisplayPortControllerSafeStateSettingsTest = RegisterTypeCTest;
// TODO(https://fxbug.dev/42061535): Separate MMIO address testing and bit helper methods
// testing.
TEST_F(DynamicFlexIoDisplayPortControllerSafeStateSettingsTest, Getter) {
constexpr uint32_t kFiaOffsets[] = {0x163894, 0x16E894, 0x16F894};
// Test `set_disable_safe_mode_for_ddi` setter.
mmio_range_.Expect(ddk_mock::MockMmioRange::AccessList({
{.address = kFiaOffsets[0], .value = 0b0000'0000'0000'0000, .write = false},
{.address = kFiaOffsets[0], .value = 0b0000'0000'0000'0001, .write = true},
{.address = kFiaOffsets[1], .value = 0b0000'0000'0000'0010, .write = false},
{.address = kFiaOffsets[1], .value = 0b0000'0000'0000'0000, .write = true},
{.address = kFiaOffsets[2], .value = 0b0000'0000'0000'0000, .write = false},
{.address = kFiaOffsets[2], .value = 0b0000'0000'0000'0001, .write = true},
}));
{
const auto ddi_to_test = DdiId::DDI_TC_1;
auto reg_to_test =
registers::DynamicFlexIoDisplayPortControllerSafeStateSettings::GetForDdi(ddi_to_test)
.ReadFrom(&mmio_buffer_);
EXPECT_EQ(reg_to_test.display_port_safe_mode_disabled_connector_0(), 0u);
reg_to_test.set_safe_mode_disabled_for_ddi(ddi_to_test, true);
EXPECT_EQ(reg_to_test.display_port_safe_mode_disabled_connector_0(), 1u);
reg_to_test.WriteTo(&mmio_buffer_);
}
{
const auto ddi_to_test = DdiId::DDI_TC_4;
auto reg_to_test =
registers::DynamicFlexIoDisplayPortControllerSafeStateSettings::GetForDdi(ddi_to_test)
.ReadFrom(&mmio_buffer_);
EXPECT_EQ(reg_to_test.display_port_safe_mode_disabled_connector_1(), 1u);
reg_to_test.set_safe_mode_disabled_for_ddi(ddi_to_test, false);
EXPECT_EQ(reg_to_test.display_port_safe_mode_disabled_connector_1(), 0u);
reg_to_test.WriteTo(&mmio_buffer_);
}
{
const auto ddi_to_test = DdiId::DDI_TC_5;
auto reg_to_test =
registers::DynamicFlexIoDisplayPortControllerSafeStateSettings::GetForDdi(ddi_to_test)
.ReadFrom(&mmio_buffer_);
EXPECT_EQ(reg_to_test.display_port_safe_mode_disabled_connector_0(), 0u);
reg_to_test.set_safe_mode_disabled_for_ddi(ddi_to_test, true);
EXPECT_EQ(reg_to_test.display_port_safe_mode_disabled_connector_0(), 1u);
reg_to_test.WriteTo(&mmio_buffer_);
}
}
TEST_F(DynamicFlexIoDisplayPortControllerSafeStateSettingsTest, GetRejectsComboDdi) {
// COMBO DDIs should not be supported
EXPECT_DEATH(
registers::DynamicFlexIoDisplayPortControllerSafeStateSettings::GetForDdi(DdiId::DDI_A),
"DDI_TC_1");
}
TEST_F(DynamicFlexIoDisplayPortControllerSafeStateSettingsTest,
SetSafeModeDisabledRejectsDdiFromDifferentFia) {
// DDIs must be in the same FIA.
EXPECT_DEATH(
registers::DynamicFlexIoDisplayPortControllerSafeStateSettings::GetForDdi(DdiId::DDI_TC_1)
.FromValue(0)
.set_safe_mode_disabled_for_ddi(DdiId::DDI_TC_3, true),
"IsDdiCoveredByThisRegister");
}
using DynamicFlexIoDisplayPortPhyModeStatusTest = RegisterTypeCTest;
// TODO(https://fxbug.dev/42061535): Separate MMIO address testing and bit helper methods
// testing.
TEST_F(DynamicFlexIoDisplayPortPhyModeStatusTest, Getter) {
constexpr uint32_t kFiaOffsets[] = {0x163890, 0x16E890, 0x16F890};
// Test `phy_is_ready_for_ddi` getter.
mmio_range_.Expect(ddk_mock::MockMmioRange::AccessList({
{.address = kFiaOffsets[0], .value = 0b0000'0000'0000'0001, .write = false},
{.address = kFiaOffsets[1], .value = 0b0000'0000'0000'0001, .write = false},
{.address = kFiaOffsets[2], .value = 0b0000'0000'0000'0010, .write = false},
}));
{
const auto ddi_to_test = DdiId::DDI_TC_1;
auto reg_to_test = registers::DynamicFlexIoDisplayPortPhyModeStatus::GetForDdi(ddi_to_test)
.ReadFrom(&mmio_buffer_);
EXPECT_EQ(reg_to_test.display_port_phy_is_ready_connector_0(), 1u);
EXPECT_EQ(reg_to_test.display_port_phy_is_ready_connector_1(), 0u);
EXPECT_EQ(reg_to_test.phy_is_ready_for_ddi(ddi_to_test), 1u);
}
{
const auto ddi_to_test = DdiId::DDI_TC_4;
auto reg_to_test = registers::DynamicFlexIoDisplayPortPhyModeStatus::GetForDdi(ddi_to_test)
.ReadFrom(&mmio_buffer_);
EXPECT_EQ(reg_to_test.display_port_phy_is_ready_connector_0(), 1u);
EXPECT_EQ(reg_to_test.display_port_phy_is_ready_connector_1(), 0u);
EXPECT_EQ(reg_to_test.phy_is_ready_for_ddi(ddi_to_test), 0u);
}
{
const auto ddi_to_test = DdiId::DDI_TC_5;
auto reg_to_test = registers::DynamicFlexIoDisplayPortPhyModeStatus::GetForDdi(ddi_to_test)
.ReadFrom(&mmio_buffer_);
EXPECT_EQ(reg_to_test.display_port_phy_is_ready_connector_0(), 0u);
EXPECT_EQ(reg_to_test.display_port_phy_is_ready_connector_1(), 1u);
EXPECT_EQ(reg_to_test.phy_is_ready_for_ddi(ddi_to_test), 0u);
}
}
TEST_F(DynamicFlexIoDisplayPortPhyModeStatusTest, GetRejectsComboDdi) {
// COMBO DDIs should not be supported
EXPECT_DEATH(registers::DynamicFlexIoDisplayPortPhyModeStatus::GetForDdi(DdiId::DDI_A),
"DDI_TC_1");
}
TEST_F(DynamicFlexIoDisplayPortPhyModeStatusTest, PhyIsReadyRejectsDdiFromDifferentFia) {
// DDIs must be in the same FIA.
EXPECT_DEATH(registers::DynamicFlexIoDisplayPortPhyModeStatus::GetForDdi(DdiId::DDI_TC_1)
.FromValue(0)
.phy_is_ready_for_ddi(DdiId::DDI_TC_3),
"IsDdiCoveredByThisRegister");
}
TEST_F(RegisterTypeCTest, ReadWriteDekelRegister) {
// TypeC Port 1 (HIP_INDEX_REG0)
{
constexpr uint32_t kPhysicalInternalAddress = 0x2200;
constexpr auto kDdiToTest = DdiId::DDI_TC_1;
constexpr uint32_t kHipIndex0Addr = 0x1010a0;
constexpr uint32_t kBaseAddr = 0x168000;
constexpr uint32_t kRegMmioAddr = kBaseAddr | (kPhysicalInternalAddress & 0xfff);
mmio_range_.Expect(ddk_mock::MockMmioRange::AccessList({
{.address = kHipIndex0Addr, .value = 0x000cc000f, .write = false},
{.address = kHipIndex0Addr, .value = 0x000cc0002, .write = true},
{.address = kRegMmioAddr, .value = 0xfeedcafe, .write = false},
{.address = kHipIndex0Addr, .value = 0x000cc000b, .write = false},
{.address = kHipIndex0Addr, .value = 0x000cc0002, .write = true},
{.address = kRegMmioAddr, .value = 0xdeadbeef, .write = true},
}));
auto dkl_reg = registers::DekelOpaqueRegister<kPhysicalInternalAddress>::GetForDdi(kDdiToTest)
.ReadFrom(&mmio_buffer_);
EXPECT_EQ(dkl_reg.reg_value(), 0xfeedcafeu);
dkl_reg.set_reg_value(0xdeadbeef).WriteTo(&mmio_buffer_);
}
// TypeC Port 6 (HIP_INDEX_REG1)
{
constexpr uint32_t kPhysicalInternalAddress = 0x2200;
constexpr auto kDdiToTest = DdiId::DDI_TC_6;
constexpr uint32_t kHipIndex1Addr = 0x1010a4;
constexpr uint32_t kBaseAddr = 0x16D000;
constexpr uint32_t kRegMmioAddr = kBaseAddr | (kPhysicalInternalAddress & 0xfff);
mmio_range_.Expect(ddk_mock::MockMmioRange::AccessList({
{.address = kHipIndex1Addr, .value = 0x00cc0f00, .write = false},
{.address = kHipIndex1Addr, .value = 0x00cc0200, .write = true},
{.address = kRegMmioAddr, .value = 0xfeedcafe, .write = false},
{.address = kHipIndex1Addr, .value = 0x00cc0b00, .write = false},
{.address = kHipIndex1Addr, .value = 0x00cc0200, .write = true},
{.address = kRegMmioAddr, .value = 0xdeadbeef, .write = true},
}));
auto dkl_reg = registers::DekelOpaqueRegister<kPhysicalInternalAddress>::GetForDdi(kDdiToTest)
.ReadFrom(&mmio_buffer_);
EXPECT_EQ(dkl_reg.reg_value(), 0xfeedcafeu);
dkl_reg.set_reg_value(0xdeadbeef).WriteTo(&mmio_buffer_);
}
}
TEST_F(RegisterTypeCTest, DekelLaneRegister) {
{
// Lane 0
constexpr uint32_t kPhysicalInternalAddress = 0x00A0;
constexpr uint32_t kHipIndex0Addr = 0x1010a0;
constexpr uint32_t kBaseAddr = 0x168000;
constexpr uint32_t kRegMmioAddr = kBaseAddr | (kPhysicalInternalAddress & 0xfff);
mmio_range_.Expect(ddk_mock::MockMmioRange::AccessList({
{.address = kHipIndex0Addr, .value = 0x00cc000f, .write = false},
{.address = kHipIndex0Addr, .value = 0x00cc0000, .write = true},
{.address = kRegMmioAddr, .value = 0x000000f0, .write = false},
}));
registers::DekelDisplayPortMode::GetForLaneDdi(0, DdiId::DDI_TC_1).ReadFrom(&mmio_buffer_);
}
{
// Lane 1
constexpr uint32_t kPhysicalInternalAddress = 0x10A0;
constexpr uint32_t kHipIndex0Addr = 0x1010a0;
constexpr uint32_t kBaseAddr = 0x168000;
constexpr uint32_t kRegMmioAddr = kBaseAddr | (kPhysicalInternalAddress & 0xfff);
mmio_range_.Expect(ddk_mock::MockMmioRange::AccessList({
{.address = kHipIndex0Addr, .value = 0x00cc000f, .write = false},
{.address = kHipIndex0Addr, .value = 0x00cc0001, .write = true},
{.address = kRegMmioAddr, .value = 0x000000f0, .write = false},
}));
registers::DekelDisplayPortMode::GetForLaneDdi(1, DdiId::DDI_TC_1).ReadFrom(&mmio_buffer_);
}
}
} // namespace i915