// 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-ddi-phy-tiger-lake.h"

#include <cstdint>

#include <gtest/gtest.h>

#include "src/graphics/display/drivers/intel-i915/hardware-common.h"

namespace registers {

namespace {

TEST(PhyMiscTest, GetForDdi) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 page 664
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 page 663

  auto phy_misc_a = PhyMisc::GetForDdi(i915::DdiId::DDI_A).FromValue(0);
  EXPECT_EQ(0x64c00u, phy_misc_a.reg_addr());

  auto phy_misc_b = PhyMisc::GetForDdi(i915::DdiId::DDI_B).FromValue(0);
  EXPECT_EQ(0x64c04u, phy_misc_b.reg_addr());

  auto phy_misc_c = PhyMisc::GetForDdi(i915::DdiId::DDI_C).FromValue(0);
  EXPECT_EQ(0x64c08u, phy_misc_c.reg_addr());
}

TEST(PortCommonLane5Test, GetForDdi) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 page 885
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 page

  auto port_cl_dw5_a = PortCommonLane5::GetForDdi(i915::DdiId::DDI_A).FromValue(0);
  EXPECT_EQ(0x162014u, port_cl_dw5_a.reg_addr());

  auto port_cl_dw5_b = PortCommonLane5::GetForDdi(i915::DdiId::DDI_B).FromValue(0);
  EXPECT_EQ(0x6c014u, port_cl_dw5_b.reg_addr());

  auto port_cl_dw5_c = PortCommonLane5::GetForDdi(i915::DdiId::DDI_C).FromValue(0);
  EXPECT_EQ(0x160014u, port_cl_dw5_c.reg_addr());
}

TEST(PortCommonLaneMainLinkPowerTest, SetPoweredUpLanes) {
  auto port_cl_dw10 = PortCommonLaneMainLinkPower::GetForDdi(i915::DdiId::DDI_A).FromValue(0);

  // The test cases come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 page 888
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 page 900

  port_cl_dw10.set_reg_value(0).set_powered_up_lanes(4);
  EXPECT_EQ(0u, port_cl_dw10.power_down_lane0());
  EXPECT_EQ(0u, port_cl_dw10.power_down_lane1());
  EXPECT_EQ(0u, port_cl_dw10.power_down_lane2());
  EXPECT_EQ(0u, port_cl_dw10.power_down_lane3());

  port_cl_dw10.set_reg_value(0).set_powered_up_lanes(2);
  EXPECT_EQ(0u, port_cl_dw10.power_down_lane0());
  EXPECT_EQ(0u, port_cl_dw10.power_down_lane1());
  EXPECT_EQ(1u, port_cl_dw10.power_down_lane2());
  EXPECT_EQ(1u, port_cl_dw10.power_down_lane3());

  port_cl_dw10.set_reg_value(0).set_powered_up_lanes(1);
  EXPECT_EQ(0u, port_cl_dw10.power_down_lane0());
  EXPECT_EQ(1u, port_cl_dw10.power_down_lane1());
  EXPECT_EQ(1u, port_cl_dw10.power_down_lane2());
  EXPECT_EQ(1u, port_cl_dw10.power_down_lane3());
}

TEST(PortCommonLaneMainLinkPowerTest, SetPoweredUpLanesReversed) {
  auto port_cl_dw10 = PortCommonLaneMainLinkPower::GetForDdi(i915::DdiId::DDI_A).FromValue(0);

  // The test cases come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 page 888
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 page 900

  port_cl_dw10.set_reg_value(0).set_powered_up_lanes_reversed(4);
  EXPECT_EQ(0u, port_cl_dw10.power_down_lane0());
  EXPECT_EQ(0u, port_cl_dw10.power_down_lane1());
  EXPECT_EQ(0u, port_cl_dw10.power_down_lane2());
  EXPECT_EQ(0u, port_cl_dw10.power_down_lane3());

  port_cl_dw10.set_reg_value(0).set_powered_up_lanes_reversed(2);
  EXPECT_EQ(1u, port_cl_dw10.power_down_lane0());
  EXPECT_EQ(1u, port_cl_dw10.power_down_lane1());
  EXPECT_EQ(0u, port_cl_dw10.power_down_lane2());
  EXPECT_EQ(0u, port_cl_dw10.power_down_lane3());

  port_cl_dw10.set_reg_value(0).set_powered_up_lanes_reversed(1);
  EXPECT_EQ(1u, port_cl_dw10.power_down_lane0());
  EXPECT_EQ(1u, port_cl_dw10.power_down_lane1());
  EXPECT_EQ(1u, port_cl_dw10.power_down_lane2());
  EXPECT_EQ(0u, port_cl_dw10.power_down_lane3());
}

TEST(PortCommonLaneMainLinkPowerTest, GetForDdi) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 page 887
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 page 899

  auto port_cl_dw10_a = PortCommonLaneMainLinkPower::GetForDdi(i915::DdiId::DDI_A).FromValue(0);
  EXPECT_EQ(0x162028u, port_cl_dw10_a.reg_addr());

  auto port_cl_dw10_b = PortCommonLaneMainLinkPower::GetForDdi(i915::DdiId::DDI_B).FromValue(0);
  EXPECT_EQ(0x6c028u, port_cl_dw10_b.reg_addr());

  auto port_cl_dw10_c = PortCommonLaneMainLinkPower::GetForDdi(i915::DdiId::DDI_C).FromValue(0);
  EXPECT_EQ(0x160028u, port_cl_dw10_c.reg_addr());
}

TEST(PortCommonLaneMiscPowerTest, GetForDdi) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 page 890
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 page 902

  auto port_cl_dw12_a = PortCommonLaneMiscPower::GetForDdi(i915::DdiId::DDI_A).FromValue(0);
  EXPECT_EQ(0x162030u, port_cl_dw12_a.reg_addr());

  auto port_cl_dw12_b = PortCommonLaneMiscPower::GetForDdi(i915::DdiId::DDI_B).FromValue(0);
  EXPECT_EQ(0x6c030u, port_cl_dw12_b.reg_addr());

  auto port_cl_dw12_c = PortCommonLaneMiscPower::GetForDdi(i915::DdiId::DDI_C).FromValue(0);
  EXPECT_EQ(0x160030u, port_cl_dw12_c.reg_addr());
}

TEST(PortCommonLanePowerStatusTest, GetForDdi) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 page 892
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 page 904

  auto port_cl_dw15_a = PortCommonLanePowerStatus::GetForDdi(i915::DdiId::DDI_A).FromValue(0);
  EXPECT_EQ(0x16203cu, port_cl_dw15_a.reg_addr());

  auto port_cl_dw15_b = PortCommonLanePowerStatus::GetForDdi(i915::DdiId::DDI_B).FromValue(0);
  EXPECT_EQ(0x6c03cu, port_cl_dw15_b.reg_addr());

  auto port_cl_dw15_c = PortCommonLanePowerStatus::GetForDdi(i915::DdiId::DDI_C).FromValue(0);
  EXPECT_EQ(0x16003cu, port_cl_dw15_c.reg_addr());
}

TEST(PortCommonLane16Test, GetForDdi) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 page 894
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 page 906

  auto port_cl_dw16_a = PortCommonLane16::GetForDdi(i915::DdiId::DDI_A).FromValue(0);
  EXPECT_EQ(0x162040u, port_cl_dw16_a.reg_addr());

  auto port_cl_dw16_b = PortCommonLane16::GetForDdi(i915::DdiId::DDI_B).FromValue(0);
  EXPECT_EQ(0x6c040u, port_cl_dw16_b.reg_addr());

  auto port_cl_dw16_c = PortCommonLane16::GetForDdi(i915::DdiId::DDI_C).FromValue(0);
  EXPECT_EQ(0x160040u, port_cl_dw16_c.reg_addr());
}

TEST(PortCompensation0Test, GetForDdi) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 page 896
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 page 908

  auto port_comp_dw0_a = PortCompensation0::GetForDdi(i915::DdiId::DDI_A).FromValue(0);
  EXPECT_EQ(0x162100u, port_comp_dw0_a.reg_addr());

  auto port_comp_dw0_b = PortCompensation0::GetForDdi(i915::DdiId::DDI_B).FromValue(0);
  EXPECT_EQ(0x6c100u, port_comp_dw0_b.reg_addr());

  auto port_comp_dw0_c = PortCompensation0::GetForDdi(i915::DdiId::DDI_C).FromValue(0);
  EXPECT_EQ(0x160100u, port_comp_dw0_c.reg_addr());
}

TEST(PortCompensation1Test, GetForDdi) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 page 897
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 page 909

  auto port_comp_dw1_a = PortCompensation1::GetForDdi(i915::DdiId::DDI_A).FromValue(0);
  EXPECT_EQ(0x162104u, port_comp_dw1_a.reg_addr());

  auto port_comp_dw1_b = PortCompensation1::GetForDdi(i915::DdiId::DDI_B).FromValue(0);
  EXPECT_EQ(0x6c104u, port_comp_dw1_b.reg_addr());

  auto port_comp_dw1_c = PortCompensation1::GetForDdi(i915::DdiId::DDI_C).FromValue(0);
  EXPECT_EQ(0x160104u, port_comp_dw1_c.reg_addr());
}

TEST(PortCompensationStatusTest, GetForDdi) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 page 897
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 page 909

  auto port_comp_dw3_a = PortCompensationStatus::GetForDdi(i915::DdiId::DDI_A).FromValue(0);
  EXPECT_EQ(0x16210cu, port_comp_dw3_a.reg_addr());

  auto port_comp_dw3_b = PortCompensationStatus::GetForDdi(i915::DdiId::DDI_B).FromValue(0);
  EXPECT_EQ(0x6c10cu, port_comp_dw3_b.reg_addr());

  auto port_comp_dw3_c = PortCompensationStatus::GetForDdi(i915::DdiId::DDI_C).FromValue(0);
  EXPECT_EQ(0x16010cu, port_comp_dw3_c.reg_addr());
}

TEST(PortCompensationSourceTest, GetForDdi) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 page 897
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 page 909

  auto port_comp_dw8_a = PortCompensationSource::GetForDdi(i915::DdiId::DDI_A).FromValue(0);
  EXPECT_EQ(0x162120u, port_comp_dw8_a.reg_addr());

  auto port_comp_dw8_b = PortCompensationSource::GetForDdi(i915::DdiId::DDI_B).FromValue(0);
  EXPECT_EQ(0x6c120u, port_comp_dw8_b.reg_addr());

  auto port_comp_dw8_c = PortCompensationSource::GetForDdi(i915::DdiId::DDI_C).FromValue(0);
  EXPECT_EQ(0x160120u, port_comp_dw8_c.reg_addr());
}

TEST(PortCompensationNominalVoltageReferencesTest, GetForDdi) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 page 902
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 page 915

  auto port_comp_dw9_a =
      PortCompensationNominalVoltageReferences::GetForDdi(i915::DdiId::DDI_A).FromValue(0);
  EXPECT_EQ(0x162124u, port_comp_dw9_a.reg_addr());

  auto port_comp_dw9_b =
      PortCompensationNominalVoltageReferences::GetForDdi(i915::DdiId::DDI_B).FromValue(0);
  EXPECT_EQ(0x6c124u, port_comp_dw9_b.reg_addr());

  auto port_comp_dw9_c =
      PortCompensationNominalVoltageReferences::GetForDdi(i915::DdiId::DDI_C).FromValue(0);
  EXPECT_EQ(0x160124u, port_comp_dw9_c.reg_addr());
}

TEST(PortCompensationLowVoltageReferencesTest, GetForDdi) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 page 903
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 page 916

  auto port_comp_dw10_a =
      PortCompensationLowVoltageReferences::GetForDdi(i915::DdiId::DDI_A).FromValue(0);
  EXPECT_EQ(0x162128u, port_comp_dw10_a.reg_addr());

  auto port_comp_dw10_b =
      PortCompensationLowVoltageReferences::GetForDdi(i915::DdiId::DDI_B).FromValue(0);
  EXPECT_EQ(0x6c128u, port_comp_dw10_b.reg_addr());

  auto port_comp_dw10_c =
      PortCompensationLowVoltageReferences::GetForDdi(i915::DdiId::DDI_C).FromValue(0);
  EXPECT_EQ(0x160128u, port_comp_dw10_c.reg_addr());
}

struct LaneRegisterInstance {
  i915::DdiId ddi_id;
  PortLane lane;
  uint32_t address;
};

TEST(PortPhysicalCoding1, GetForDdiLane) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 pages 904-906
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 pages 917-919

  static constexpr LaneRegisterInstance kInstances[] = {
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kAux, .address = 0x162304},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kAll, .address = 0x162604},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane0, .address = 0x162804},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane1, .address = 0x162904},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane2, .address = 0x162a04},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane3, .address = 0x162b04},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kAux, .address = 0x6c304},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kAll, .address = 0x6c604},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane0, .address = 0x6c804},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane1, .address = 0x6c904},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane2, .address = 0x6ca04},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane3, .address = 0x6cb04},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kAux, .address = 0x160304},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kAll, .address = 0x160604},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane0, .address = 0x160804},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane1, .address = 0x160904},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane2, .address = 0x160a04},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane3, .address = 0x160b04},
  };

  for (const LaneRegisterInstance& instance : kInstances) {
    auto port_pcs_dw1 =
        PortPhysicalCoding1::GetForDdiLane(instance.ddi_id, instance.lane).FromValue(0);
    EXPECT_EQ(instance.address, port_pcs_dw1.reg_addr())
        << "DDI: " << static_cast<int>(instance.ddi_id)
        << " Lane: " << static_cast<int>(instance.lane);
  }
}

TEST(PortPhysicalCoding9, GetForDdiLane) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 pages 908-910
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 pages 922-924

  static constexpr LaneRegisterInstance kInstances[] = {
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kAux, .address = 0x162324},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kAll, .address = 0x162624},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane0, .address = 0x162824},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane1, .address = 0x162924},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane2, .address = 0x162a24},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane3, .address = 0x162b24},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kAux, .address = 0x6c324},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kAll, .address = 0x6c624},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane0, .address = 0x6c824},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane1, .address = 0x6c924},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane2, .address = 0x6ca24},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane3, .address = 0x6cb24},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kAux, .address = 0x160324},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kAll, .address = 0x160624},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane0, .address = 0x160824},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane1, .address = 0x160924},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane2, .address = 0x160a24},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane3, .address = 0x160b24},
  };

  for (const LaneRegisterInstance& instance : kInstances) {
    auto port_pcs_dw9 =
        PortPhysicalCoding9::GetForDdiLane(instance.ddi_id, instance.lane).FromValue(0);
    EXPECT_EQ(instance.address, port_pcs_dw9.reg_addr())
        << "DDI: " << static_cast<int>(instance.ddi_id)
        << " Lane: " << static_cast<int>(instance.lane);
  }
}

TEST(PortTransmitterMipiEqualizationTest, GetForDdiLane) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 pages 929-931
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 pages 945-947

  static constexpr LaneRegisterInstance kInstances[] = {
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kAux, .address = 0x162380},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kAll, .address = 0x162680},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane0, .address = 0x162880},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane1, .address = 0x162980},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane2, .address = 0x162a80},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane3, .address = 0x162b80},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kAux, .address = 0x6c380},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kAll, .address = 0x6c680},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane0, .address = 0x6c880},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane1, .address = 0x6c980},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane2, .address = 0x6ca80},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane3, .address = 0x6cb80},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kAux, .address = 0x160380},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kAll, .address = 0x160680},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane0, .address = 0x160880},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane1, .address = 0x160980},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane2, .address = 0x160a80},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane3, .address = 0x160b80},
  };

  for (const LaneRegisterInstance& instance : kInstances) {
    auto port_tx_dw0 =
        PortTransmitterMipiEqualization::GetForDdiLane(instance.ddi_id, instance.lane).FromValue(0);
    EXPECT_EQ(instance.address, port_tx_dw0.reg_addr())
        << "DDI: " << static_cast<int>(instance.ddi_id)
        << " Lane: " << static_cast<int>(instance.lane);
  }
}

TEST(PortTransmitter1Test, GetForDdiLane) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 pages 932-934
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 pages 949-951

  static constexpr LaneRegisterInstance kInstances[] = {
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kAux, .address = 0x162384},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kAll, .address = 0x162684},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane0, .address = 0x162884},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane1, .address = 0x162984},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane2, .address = 0x162a84},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane3, .address = 0x162b84},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kAux, .address = 0x6c384},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kAll, .address = 0x6c684},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane0, .address = 0x6c884},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane1, .address = 0x6c984},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane2, .address = 0x6ca84},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane3, .address = 0x6cb84},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kAux, .address = 0x160384},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kAll, .address = 0x160684},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane0, .address = 0x160884},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane1, .address = 0x160984},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane2, .address = 0x160a84},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane3, .address = 0x160b84},
  };

  for (const LaneRegisterInstance& instance : kInstances) {
    auto port_tx_dw1 = PortTransmitter1::GetForDdiLane(instance.ddi_id, instance.lane).FromValue(0);
    EXPECT_EQ(instance.address, port_tx_dw1.reg_addr())
        << "DDI: " << static_cast<int>(instance.ddi_id)
        << " Lane: " << static_cast<int>(instance.lane);
  }
}

TEST(PortTransmitterVoltageSwing, VoltageSwingSelect) {
  struct TestCase {
    int value;
    uint32_t bit3;
    uint32_t bits20;
  };
  static constexpr TestCase kTestCases[] = {
      {.value = 0b0000, .bit3 = 0, .bits20 = 0b000}, {.value = 0b0001, .bit3 = 0, .bits20 = 0b001},
      {.value = 0b0010, .bit3 = 0, .bits20 = 0b010}, {.value = 0b0100, .bit3 = 0, .bits20 = 0b100},
      {.value = 0b0101, .bit3 = 0, .bits20 = 0b101}, {.value = 0b0111, .bit3 = 0, .bits20 = 0b111},
      {.value = 0b1000, .bit3 = 1, .bits20 = 0b000}, {.value = 0b1001, .bit3 = 1, .bits20 = 0b001},
      {.value = 0b1010, .bit3 = 1, .bits20 = 0b010}, {.value = 0b1100, .bit3 = 1, .bits20 = 0b100},
      {.value = 0b1101, .bit3 = 1, .bits20 = 0b101}, {.value = 0b1111, .bit3 = 1, .bits20 = 0b111},
  };
  for (const TestCase& test_case : kTestCases) {
    SCOPED_TRACE(testing::Message() << "Value: " << test_case.value);
    auto port_tx_dw2 =
        PortTransmitterVoltageSwing::GetForDdiLane(i915::DdiId::DDI_A, PortLane::kMainLinkLane0)
            .FromValue(0);

    port_tx_dw2.set_reg_value(0).set_voltage_swing_select(test_case.value);
    EXPECT_EQ(test_case.bit3, port_tx_dw2.voltage_swing_select_bit3());
    EXPECT_EQ(test_case.bits20, port_tx_dw2.voltage_swing_select_bits20());
    EXPECT_EQ(test_case.value, port_tx_dw2.voltage_swing_select());
  }
}

TEST(PortTransmitterVoltageSwingTest, GetForDdiLane) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 pages 935-937
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 pages 953-955

  static constexpr LaneRegisterInstance kInstances[] = {
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kAux, .address = 0x162388},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kAll, .address = 0x162688},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane0, .address = 0x162888},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane1, .address = 0x162988},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane2, .address = 0x162a88},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane3, .address = 0x162b88},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kAux, .address = 0x6c388},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kAll, .address = 0x6c688},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane0, .address = 0x6c888},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane1, .address = 0x6c988},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane2, .address = 0x6ca88},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane3, .address = 0x6cb88},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kAux, .address = 0x160388},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kAll, .address = 0x160688},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane0, .address = 0x160888},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane1, .address = 0x160988},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane2, .address = 0x160a88},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane3, .address = 0x160b88},
  };

  for (const LaneRegisterInstance& instance : kInstances) {
    auto port_tx_dw2 =
        PortTransmitterVoltageSwing::GetForDdiLane(instance.ddi_id, instance.lane).FromValue(0);
    EXPECT_EQ(instance.address, port_tx_dw2.reg_addr())
        << "DDI: " << static_cast<int>(instance.ddi_id)
        << " Lane: " << static_cast<int>(instance.lane);
  }
}

TEST(PortTransmitterEqualizationTest, GetForDdiLane) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 pages 938-940
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 pages 957-959

  static constexpr LaneRegisterInstance kInstances[] = {
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kAux, .address = 0x162390},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kAll, .address = 0x162690},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane0, .address = 0x162890},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane1, .address = 0x162990},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane2, .address = 0x162a90},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane3, .address = 0x162b90},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kAux, .address = 0x6c390},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kAll, .address = 0x6c690},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane0, .address = 0x6c890},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane1, .address = 0x6c990},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane2, .address = 0x6ca90},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane3, .address = 0x6cb90},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kAux, .address = 0x160390},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kAll, .address = 0x160690},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane0, .address = 0x160890},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane1, .address = 0x160990},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane2, .address = 0x160a90},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane3, .address = 0x160b90},
  };

  for (const LaneRegisterInstance& instance : kInstances) {
    auto port_tx_dw4 =
        PortTransmitterEqualization::GetForDdiLane(instance.ddi_id, instance.lane).FromValue(0);
    EXPECT_EQ(instance.address, port_tx_dw4.reg_addr())
        << "DDI: " << static_cast<int>(instance.ddi_id)
        << " Lane: " << static_cast<int>(instance.lane);
  }
}

TEST(PortTransmitterVoltageTest, GetForDdiLane) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 pages 941-943
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 pages 961-963

  static constexpr LaneRegisterInstance kInstances[] = {
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kAux, .address = 0x162394},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kAll, .address = 0x162694},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane0, .address = 0x162894},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane1, .address = 0x162994},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane2, .address = 0x162a94},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane3, .address = 0x162b94},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kAux, .address = 0x6c394},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kAll, .address = 0x6c694},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane0, .address = 0x6c894},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane1, .address = 0x6c994},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane2, .address = 0x6ca94},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane3, .address = 0x6cb94},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kAux, .address = 0x160394},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kAll, .address = 0x160694},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane0, .address = 0x160894},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane1, .address = 0x160994},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane2, .address = 0x160a94},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane3, .address = 0x160b94},
  };

  for (const LaneRegisterInstance& instance : kInstances) {
    auto port_tx_dw5 =
        PortTransmitterVoltage::GetForDdiLane(instance.ddi_id, instance.lane).FromValue(0);
    EXPECT_EQ(instance.address, port_tx_dw5.reg_addr())
        << "DDI: " << static_cast<int>(instance.ddi_id)
        << " Lane: " << static_cast<int>(instance.lane);
  }
}

TEST(PortTransmitterLowDropoutRegulatorTest, GetForDdiLane) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 pages 945-947
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 pages 965-967

  static constexpr LaneRegisterInstance kInstances[] = {
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kAux, .address = 0x162398},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kAll, .address = 0x162698},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane0, .address = 0x162898},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane1, .address = 0x162998},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane2, .address = 0x162a98},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane3, .address = 0x162b98},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kAux, .address = 0x6c398},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kAll, .address = 0x6c698},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane0, .address = 0x6c898},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane1, .address = 0x6c998},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane2, .address = 0x6ca98},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane3, .address = 0x6cb98},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kAux, .address = 0x160398},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kAll, .address = 0x160698},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane0, .address = 0x160898},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane1, .address = 0x160998},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane2, .address = 0x160a98},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane3, .address = 0x160b98},
  };

  for (const LaneRegisterInstance& instance : kInstances) {
    auto port_tx_dw6 =
        PortTransmitterLowDropoutRegulator::GetForDdiLane(instance.ddi_id, instance.lane)
            .FromValue(0);
    EXPECT_EQ(instance.address, port_tx_dw6.reg_addr())
        << "DDI: " << static_cast<int>(instance.ddi_id)
        << " Lane: " << static_cast<int>(instance.lane);
  }
}

TEST(PortTransmitterNScalarTest, GetForDdiLane) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 pages 948-950
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 pages 969-971

  static constexpr LaneRegisterInstance kInstances[] = {
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kAux, .address = 0x16239c},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kAll, .address = 0x16269c},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane0, .address = 0x16289c},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane1, .address = 0x16299c},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane2, .address = 0x162a9c},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane3, .address = 0x162b9c},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kAux, .address = 0x6c39c},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kAll, .address = 0x6c69c},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane0, .address = 0x6c89c},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane1, .address = 0x6c99c},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane2, .address = 0x6ca9c},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane3, .address = 0x6cb9c},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kAux, .address = 0x16039c},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kAll, .address = 0x16069c},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane0, .address = 0x16089c},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane1, .address = 0x16099c},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane2, .address = 0x160a9c},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane3, .address = 0x160b9c},
  };

  for (const LaneRegisterInstance& instance : kInstances) {
    auto port_tx_dw7 =
        PortTransmitterNScalar::GetForDdiLane(instance.ddi_id, instance.lane).FromValue(0);
    EXPECT_EQ(instance.address, port_tx_dw7.reg_addr())
        << "DDI: " << static_cast<int>(instance.ddi_id)
        << " Lane: " << static_cast<int>(instance.lane);
  }
}

TEST(PortTransmitterDutyCycleCorrectionTest, GetForDdiLane) {
  // The register MMIO addresses come from the reference manuals.
  //
  // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 pages 951-953
  // DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 pages 972-974

  static constexpr LaneRegisterInstance kInstances[] = {
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kAux, .address = 0x1623a0},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kAll, .address = 0x1626a0},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane0, .address = 0x1628a0},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane1, .address = 0x1629a0},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane2, .address = 0x162aa0},
      {.ddi_id = i915::DdiId::DDI_A, .lane = PortLane::kMainLinkLane3, .address = 0x162ba0},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kAux, .address = 0x6c3a0},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kAll, .address = 0x6c6a0},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane0, .address = 0x6c8a0},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane1, .address = 0x6c9a0},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane2, .address = 0x6caa0},
      {.ddi_id = i915::DdiId::DDI_B, .lane = PortLane::kMainLinkLane3, .address = 0x6cba0},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kAux, .address = 0x1603a0},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kAll, .address = 0x1606a0},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane0, .address = 0x1608a0},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane1, .address = 0x1609a0},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane2, .address = 0x160aa0},
      {.ddi_id = i915::DdiId::DDI_C, .lane = PortLane::kMainLinkLane3, .address = 0x160ba0},
  };

  for (const LaneRegisterInstance& instance : kInstances) {
    auto port_tx_dw8 =
        PortTransmitterDutyCycleCorrection::GetForDdiLane(instance.ddi_id, instance.lane)
            .FromValue(0);
    EXPECT_EQ(instance.address, port_tx_dw8.reg_addr())
        << "DDI: " << static_cast<int>(instance.ddi_id)
        << " Lane: " << static_cast<int>(instance.lane);
  }
}

}  // namespace

}  // namespace registers
