// Copyright 2023 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-memory-controller.h"

#include <gtest/gtest.h>
#include <hwreg/bitfields.h>

namespace i915 {

namespace {

TEST(MemoryChannelTimingsAlderLakeTest, GetForControllerAndChannel) {
  // The memory controller / channel base MMIO addresses come from the processor
  // datasheets, plus the 0x140'000 base for the GPU aperture.
  //
  // Raptor Lake: 743846-001 Section 3.2 pages 99-100
  // Alder Lake S: 655259-003 Section 3.2 pages 83-34

  auto controller0_channel0_timings =
      registers::MemoryChannelTimingsAlderLake::GetForControllerAndChannel(0, 0).FromValue(0);
  EXPECT_EQ(0x14e'000u, controller0_channel0_timings.reg_addr());

  auto controller0_channel1_timings =
      registers::MemoryChannelTimingsAlderLake::GetForControllerAndChannel(0, 1).FromValue(0);
  EXPECT_EQ(0x14e'800u, controller0_channel1_timings.reg_addr());

  auto controller1_channel0_timings =
      registers::MemoryChannelTimingsAlderLake::GetForControllerAndChannel(1, 0).FromValue(0);
  EXPECT_EQ(0x15e'000u, controller1_channel0_timings.reg_addr());

  auto controller1_channel1_timings =
      registers::MemoryChannelTimingsAlderLake::GetForControllerAndChannel(1, 1).FromValue(0);
  EXPECT_EQ(0x15e'800u, controller1_channel1_timings.reg_addr());
}

TEST(MemoryChannelTimingsTigerLakeTest, GetForUControllerAndChannel) {
  // The memory controller / channel base MMIO addresses come from the processor
  // datasheets, plus the 0x140'000 base for the GPU aperture.
  //
  // Tiger Lake U: 631122-003 Section 3.2 pages 106-107

  auto controller0_channel0_timings =
      registers::MemoryChannelTimingsTigerLake::GetForUControllerAndChannel(0, 0).FromValue(0);
  EXPECT_EQ(0x144'000u, controller0_channel0_timings.reg_addr());

  auto controller0_channel1_timings =
      registers::MemoryChannelTimingsTigerLake::GetForUControllerAndChannel(0, 1).FromValue(0);
  EXPECT_EQ(0x144'400u, controller0_channel1_timings.reg_addr());

  auto controller1_channel0_timings =
      registers::MemoryChannelTimingsTigerLake::GetForUControllerAndChannel(1, 0).FromValue(0);
  EXPECT_EQ(0x154'000u, controller1_channel0_timings.reg_addr());

  auto controller1_channel1_timings =
      registers::MemoryChannelTimingsTigerLake::GetForUControllerAndChannel(1, 1).FromValue(0);
  EXPECT_EQ(0x154'400u, controller1_channel1_timings.reg_addr());
}

TEST(MemoryChannelTimingsTigerLakeTest, GetForHControllerAndChannel) {
  // The memory controller / channel base MMIO addresses come from the processor
  // datasheets, plus the 0x140'000 base for the GPU aperture.
  //
  // Tiger Lake H: 643524-003 Section 3.2 pages 110-111

  auto controller0_channel0_timings =
      registers::MemoryChannelTimingsTigerLake::GetForHControllerAndChannel(0, 0).FromValue(0);
  EXPECT_EQ(0x14e'000u, controller0_channel0_timings.reg_addr());

  auto controller0_channel1_timings =
      registers::MemoryChannelTimingsTigerLake::GetForHControllerAndChannel(0, 1).FromValue(0);
  EXPECT_EQ(0x14e'800u, controller0_channel1_timings.reg_addr());

  auto controller1_channel0_timings =
      registers::MemoryChannelTimingsTigerLake::GetForHControllerAndChannel(1, 0).FromValue(0);
  EXPECT_EQ(0x15e'000u, controller1_channel0_timings.reg_addr());

  auto controller1_channel1_timings =
      registers::MemoryChannelTimingsTigerLake::GetForHControllerAndChannel(1, 1).FromValue(0);
  EXPECT_EQ(0x15e'800u, controller1_channel1_timings.reg_addr());
}

TEST(MemoryChannelTimingsIceLakeTest, GetForChannel) {
  // The memory controller / channel base MMIO addresses come from the processor
  // datasheets, plus the 0x140'000 base for the GPU aperture.
  //
  // Rocket Lake: 636761-004 Section 3.2 page 96
  // Ice Lake: 341078-004 Section 3.2 pages 99-100

  auto channel0_timings = registers::MemoryChannelTimingsIceLake::GetForChannel(0).FromValue(0);
  EXPECT_EQ(0x144'000u, channel0_timings.reg_addr());

  auto channel1_timings = registers::MemoryChannelTimingsIceLake::GetForChannel(1).FromValue(0);
  EXPECT_EQ(0x144'400u, channel1_timings.reg_addr());
}

TEST(MemoryChannelTimingsSkylakeTest, GetForChannel) {
  // The memory controller / channel base MMIO addresses come from the processor
  // datasheets, plus the 0x140'000 base for the GPU aperture.
  //
  // Comet Lake: 615212-003 Section 7 page 146
  // Whiskey Lake: 338024-001 Section 7 page 142

  auto channel0_timings = registers::MemoryChannelTimingsSkylake::GetForChannel(0).FromValue(0);
  EXPECT_EQ(0x144'000u, channel0_timings.reg_addr());

  auto channel1_timings = registers::MemoryChannelTimingsSkylake::GetForChannel(1).FromValue(0);
  EXPECT_EQ(0x144'400u, channel1_timings.reg_addr());
}

TEST(MemoryAddressDecoderInterChannelConfigIceLakeTest, GetForController) {
  // The memory controller / channel base MMIO addresses come from the processor
  // datasheets, plus the 0x140'000 base for the GPU aperture.
  //
  // Tiger Lake: Processor Datasheet Vol 2a (631122-003) page 139
  // Ice Lake: Processor Datasheet Vol 2 (341078-004) page 128

  auto controller0_inter_channel_config =
      registers::MemoryAddressDecoderInterChannelConfigIceLake::GetForController(0);
  EXPECT_EQ(0x145'000u, controller0_inter_channel_config.addr());

  auto controller1_inter_channel_config =
      registers::MemoryAddressDecoderInterChannelConfigIceLake::GetForController(1);
  EXPECT_EQ(0x155'000u, controller1_inter_channel_config.addr());
}

TEST(MemoryAddressDecoderInterChannelConfigIceLakeTest, GetForAlderLakeController) {
  // The memory controller / channel base MMIO addresses come from the processor
  // datasheets, plus the 0x140'000 base for the GPU aperture.
  //
  // Raptor Lake: 743846-001 Section 3.2 pages 99-100
  // Alder Lake S: 655259-003 Section 3.2 pages 83-34

  auto controller0_inter_channel_config =
      registers::MemoryAddressDecoderInterChannelConfigIceLake::GetForAlderLakeController(0);
  EXPECT_EQ(0x14d'800u, controller0_inter_channel_config.addr());

  auto controller1_inter_channel_config =
      registers::MemoryAddressDecoderInterChannelConfigIceLake::GetForAlderLakeController(1);
  EXPECT_EQ(0x15d'800u, controller1_inter_channel_config.addr());
}

TEST(MemoryAddressDecoderDimmParametersAlderLakeTest, DimmSDdrChipWidth) {
  auto channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersAlderLake::GetForControllerAndChannel(0, 0)
          .FromValue(0);

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_ddr_chip_width_select(
      registers::MemoryAddressDecoderDimmParametersAlderLake::DdrChipWidthValue::kX8);
  EXPECT_EQ(8, channel0_dimm_parameters.dimm_s_ddr_chip_width());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_ddr_chip_width_select(
      registers::MemoryAddressDecoderDimmParametersAlderLake::DdrChipWidthValue::kX16);
  EXPECT_EQ(16, channel0_dimm_parameters.dimm_s_ddr_chip_width());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_ddr_chip_width_select(
      registers::MemoryAddressDecoderDimmParametersAlderLake::DdrChipWidthValue::kX32);
  EXPECT_EQ(32, channel0_dimm_parameters.dimm_s_ddr_chip_width());
}

TEST(MemoryAddressDecoderDimmParametersAlderLakeTest, DimmLDdrChipWidth) {
  auto channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersAlderLake::GetForControllerAndChannel(0, 0)
          .FromValue(0);

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_ddr_chip_width_select(
      registers::MemoryAddressDecoderDimmParametersAlderLake::DdrChipWidthValue::kX8);
  EXPECT_EQ(8, channel0_dimm_parameters.dimm_l_ddr_chip_width());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_ddr_chip_width_select(
      registers::MemoryAddressDecoderDimmParametersAlderLake::DdrChipWidthValue::kX16);
  EXPECT_EQ(16, channel0_dimm_parameters.dimm_l_ddr_chip_width());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_ddr_chip_width_select(
      registers::MemoryAddressDecoderDimmParametersAlderLake::DdrChipWidthValue::kX32);
  EXPECT_EQ(32, channel0_dimm_parameters.dimm_l_ddr_chip_width());
}

TEST(MemoryAddressDecoderDimmParametersAlderLakeTest, DimmSRankCount) {
  auto channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersAlderLake::GetForControllerAndChannel(0, 0)
          .FromValue(0);

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_rank_count_minus_1(0);
  EXPECT_EQ(1, channel0_dimm_parameters.dimm_s_rank_count());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_rank_count_minus_1(1);
  EXPECT_EQ(2, channel0_dimm_parameters.dimm_s_rank_count());
}

TEST(MemoryAddressDecoderDimmParametersAlderLakeTest, DimmLRankCount) {
  auto channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersAlderLake::GetForControllerAndChannel(0, 0)
          .FromValue(0);

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_rank_count_minus_1(0);
  EXPECT_EQ(1, channel0_dimm_parameters.dimm_l_rank_count());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_rank_count_minus_1(1);
  EXPECT_EQ(2, channel0_dimm_parameters.dimm_l_rank_count());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_rank_count_minus_1(2);
  EXPECT_EQ(3, channel0_dimm_parameters.dimm_l_rank_count());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_rank_count_minus_1(3);
  EXPECT_EQ(4, channel0_dimm_parameters.dimm_l_rank_count());
}

TEST(MemoryAddressDecoderDimmParametersAlderLakeTest, DimmSSizeMb) {
  auto channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersAlderLake::GetForControllerAndChannel(0, 0)
          .FromValue(0);

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_size_512mb(0);
  EXPECT_EQ(0, channel0_dimm_parameters.dimm_s_size_mb());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_size_512mb(1);
  EXPECT_EQ(512, channel0_dimm_parameters.dimm_s_size_mb());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_size_512mb(8);
  EXPECT_EQ(4'096, channel0_dimm_parameters.dimm_s_size_mb());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_size_512mb(127);
  EXPECT_EQ(65'024, channel0_dimm_parameters.dimm_s_size_mb());
}

TEST(MemoryAddressDecoderDimmParametersAlderLakeTest, DimmLSizeMb) {
  auto channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersAlderLake::GetForControllerAndChannel(0, 0)
          .FromValue(0);

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_size_512mb(0);
  EXPECT_EQ(0, channel0_dimm_parameters.dimm_l_size_mb());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_size_512mb(1);
  EXPECT_EQ(512, channel0_dimm_parameters.dimm_l_size_mb());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_size_512mb(8);
  EXPECT_EQ(4'096, channel0_dimm_parameters.dimm_l_size_mb());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_size_512mb(127);
  EXPECT_EQ(65'024, channel0_dimm_parameters.dimm_l_size_mb());
}

TEST(MemoryAddressDecoderDimmParametersAlderLakeTest, GetForControllerAndChannel) {
  // The memory controller / channel base MMIO addresses come from the processor
  // datasheets, plus the 0x140'000 base for the GPU aperture.
  //
  // Raptor Lake: 743846-001 Section 3.2 pages 99-100
  // Alder Lake S: 655259-003 Section 3.2 pages 83-34

  auto controller0_channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersAlderLake::GetForControllerAndChannel(0, 0)
          .FromValue(0);
  EXPECT_EQ(0x14d'80cu, controller0_channel0_dimm_parameters.reg_addr());

  auto controller0_channel1_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersAlderLake::GetForControllerAndChannel(0, 1)
          .FromValue(0);
  EXPECT_EQ(0x14d'810u, controller0_channel1_dimm_parameters.reg_addr());

  auto controller1_channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersAlderLake::GetForControllerAndChannel(1, 0)
          .FromValue(0);
  EXPECT_EQ(0x15d'80cu, controller1_channel0_dimm_parameters.reg_addr());

  auto controller1_channel1_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersAlderLake::GetForControllerAndChannel(1, 1)
          .FromValue(0);
  EXPECT_EQ(0x15d'810u, controller1_channel1_dimm_parameters.reg_addr());
}

TEST(MemoryAddressDecoderDimmParametersCometLakeTest, DimmSDdrChipWidth) {
  auto channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersCometLake::GetForControllerAndChannel(0, 0)
          .FromValue(0);

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_ddr_chip_width_select(
      registers::MemoryAddressDecoderDimmParametersCometLake::DdrChipWidthValue::kX8);
  EXPECT_EQ(8, channel0_dimm_parameters.dimm_s_ddr_chip_width());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_ddr_chip_width_select(
      registers::MemoryAddressDecoderDimmParametersCometLake::DdrChipWidthValue::kX16);
  EXPECT_EQ(16, channel0_dimm_parameters.dimm_s_ddr_chip_width());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_ddr_chip_width_select(
      registers::MemoryAddressDecoderDimmParametersCometLake::DdrChipWidthValue::kX32);
  EXPECT_EQ(32, channel0_dimm_parameters.dimm_s_ddr_chip_width());
}

TEST(MemoryAddressDecoderDimmParametersCometLakeTest, DimmLDdrChipWidth) {
  auto channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersCometLake::GetForControllerAndChannel(0, 0)
          .FromValue(0);

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_ddr_chip_width_select(
      registers::MemoryAddressDecoderDimmParametersCometLake::DdrChipWidthValue::kX8);
  EXPECT_EQ(8, channel0_dimm_parameters.dimm_l_ddr_chip_width());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_ddr_chip_width_select(
      registers::MemoryAddressDecoderDimmParametersCometLake::DdrChipWidthValue::kX16);
  EXPECT_EQ(16, channel0_dimm_parameters.dimm_l_ddr_chip_width());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_ddr_chip_width_select(
      registers::MemoryAddressDecoderDimmParametersCometLake::DdrChipWidthValue::kX32);
  EXPECT_EQ(32, channel0_dimm_parameters.dimm_l_ddr_chip_width());
}

TEST(MemoryAddressDecoderDimmParametersCometLakeTest, DimmSRankCount) {
  auto channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersCometLake::GetForControllerAndChannel(0, 0)
          .FromValue(0);

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_rank_count_minus_1(0);
  EXPECT_EQ(1, channel0_dimm_parameters.dimm_s_rank_count());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_rank_count_minus_1(1);
  EXPECT_EQ(2, channel0_dimm_parameters.dimm_s_rank_count());
}

TEST(MemoryAddressDecoderDimmParametersCometLakeTest, DimmLRankCount) {
  auto channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersCometLake::GetForControllerAndChannel(0, 0)
          .FromValue(0);

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_rank_count_minus_1(0);
  EXPECT_EQ(1, channel0_dimm_parameters.dimm_l_rank_count());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_rank_count_minus_1(1);
  EXPECT_EQ(2, channel0_dimm_parameters.dimm_l_rank_count());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_rank_count_minus_1(2);
  EXPECT_EQ(3, channel0_dimm_parameters.dimm_l_rank_count());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_rank_count_minus_1(3);
  EXPECT_EQ(4, channel0_dimm_parameters.dimm_l_rank_count());
}

TEST(MemoryAddressDecoderDimmParametersCometLakeTest, DimmSSizeMb) {
  auto channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersCometLake::GetForControllerAndChannel(0, 0)
          .FromValue(0);

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_size_512mb(0);
  EXPECT_EQ(0, channel0_dimm_parameters.dimm_s_size_mb());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_size_512mb(1);
  EXPECT_EQ(512, channel0_dimm_parameters.dimm_s_size_mb());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_size_512mb(8);
  EXPECT_EQ(4'096, channel0_dimm_parameters.dimm_s_size_mb());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_size_512mb(127);
  EXPECT_EQ(65'024, channel0_dimm_parameters.dimm_s_size_mb());
}

TEST(MemoryAddressDecoderDimmParametersCometLakeTest, DimmLSizeMb) {
  auto channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersCometLake::GetForControllerAndChannel(0, 0)
          .FromValue(0);

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_size_512mb(0);
  EXPECT_EQ(0, channel0_dimm_parameters.dimm_l_size_mb());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_size_512mb(1);
  EXPECT_EQ(512, channel0_dimm_parameters.dimm_l_size_mb());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_size_512mb(8);
  EXPECT_EQ(4'096, channel0_dimm_parameters.dimm_l_size_mb());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_size_512mb(127);
  EXPECT_EQ(65'024, channel0_dimm_parameters.dimm_l_size_mb());
}

TEST(MemoryAddressDecoderDimmParametersCometLakeTest, GetForControllerAndChannel) {
  // The memory controller / channel base MMIO addresses come from the processor
  // datasheets, plus the 0x140'000 base for the GPU aperture.
  //
  // Tiger Lake: Processor Datasheet Vol 2a (631122-003) pages 141-143
  // Ice Lake: Processor Datasheet Vol 2 (341078-004) pages 131-132

  auto controller0_channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersCometLake::GetForControllerAndChannel(0, 0)
          .FromValue(0);
  EXPECT_EQ(0x145'00cu, controller0_channel0_dimm_parameters.reg_addr());

  auto controller0_channel1_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersCometLake::GetForControllerAndChannel(0, 1)
          .FromValue(0);
  EXPECT_EQ(0x145'010u, controller0_channel1_dimm_parameters.reg_addr());

  auto controller1_channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersCometLake::GetForControllerAndChannel(1, 0)
          .FromValue(0);
  EXPECT_EQ(0x155'00cu, controller1_channel0_dimm_parameters.reg_addr());

  auto controller1_channel1_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersCometLake::GetForControllerAndChannel(1, 1)
          .FromValue(0);
  EXPECT_EQ(0x155'010u, controller1_channel1_dimm_parameters.reg_addr());
}

TEST(MemoryAddressDecoderDimmParametersCometLakeTest, GetForTigerLakeHControllerAndChannel) {
  // The memory controller / channel base MMIO addresses come from the processor
  // datasheets, plus the 0x140'000 base for the GPU aperture.
  //

  auto controller0_channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersCometLake::GetForTigerLakeHControllerAndChannel(
          0, 0)
          .FromValue(0);
  EXPECT_EQ(0x14d'80cu, controller0_channel0_dimm_parameters.reg_addr());

  auto controller0_channel1_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersCometLake::GetForTigerLakeHControllerAndChannel(
          0, 1)
          .FromValue(0);
  EXPECT_EQ(0x14d'810u, controller0_channel1_dimm_parameters.reg_addr());

  auto controller1_channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersCometLake::GetForTigerLakeHControllerAndChannel(
          1, 0)
          .FromValue(0);
  EXPECT_EQ(0x15d'80cu, controller1_channel0_dimm_parameters.reg_addr());

  auto controller1_channel1_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersCometLake::GetForTigerLakeHControllerAndChannel(
          1, 1)
          .FromValue(0);
  EXPECT_EQ(0x15d'810u, controller1_channel1_dimm_parameters.reg_addr());
}

TEST(MemoryAddressDecoderDimmParametersSkylakeTest, DimmSDdrChipWidth) {
  auto channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersSkylake::GetForChannel(0).FromValue(0);

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_ddr_chip_width_select(
      registers::MemoryAddressDecoderDimmParametersSkylake::DdrChipWidthValue::kX8);
  EXPECT_EQ(8, channel0_dimm_parameters.dimm_s_ddr_chip_width());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_ddr_chip_width_select(
      registers::MemoryAddressDecoderDimmParametersSkylake::DdrChipWidthValue::kX16);
  EXPECT_EQ(16, channel0_dimm_parameters.dimm_s_ddr_chip_width());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_ddr_chip_width_select(
      registers::MemoryAddressDecoderDimmParametersSkylake::DdrChipWidthValue::kX32);
  EXPECT_EQ(32, channel0_dimm_parameters.dimm_s_ddr_chip_width());
}

TEST(MemoryAddressDecoderDimmParametersSkylakeTest, DimmLDdrChipWidth) {
  auto channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersSkylake::GetForChannel(0).FromValue(0);

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_ddr_chip_width_select(
      registers::MemoryAddressDecoderDimmParametersSkylake::DdrChipWidthValue::kX8);
  EXPECT_EQ(8, channel0_dimm_parameters.dimm_l_ddr_chip_width());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_ddr_chip_width_select(
      registers::MemoryAddressDecoderDimmParametersSkylake::DdrChipWidthValue::kX16);
  EXPECT_EQ(16, channel0_dimm_parameters.dimm_l_ddr_chip_width());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_ddr_chip_width_select(
      registers::MemoryAddressDecoderDimmParametersSkylake::DdrChipWidthValue::kX32);
  EXPECT_EQ(32, channel0_dimm_parameters.dimm_l_ddr_chip_width());
}

TEST(MemoryAddressDecoderDimmParametersSkylakeTest, DimmSRankCount) {
  auto channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersSkylake::GetForChannel(0).FromValue(0);

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_rank_count_minus_1(0);
  EXPECT_EQ(1, channel0_dimm_parameters.dimm_s_rank_count());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_rank_count_minus_1(1);
  EXPECT_EQ(2, channel0_dimm_parameters.dimm_s_rank_count());
}

TEST(MemoryAddressDecoderDimmParametersSkylakeTest, DimmLRankCount) {
  auto channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersSkylake::GetForChannel(0).FromValue(0);

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_rank_count_minus_1(0);
  EXPECT_EQ(1, channel0_dimm_parameters.dimm_l_rank_count());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_rank_count_minus_1(1);
  EXPECT_EQ(2, channel0_dimm_parameters.dimm_l_rank_count());
}

TEST(MemoryAddressDecoderDimmParametersSkylakeTest, DimmSSizeMb) {
  auto channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersSkylake::GetForChannel(0).FromValue(0);

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_size_1gb(0);
  EXPECT_EQ(0, channel0_dimm_parameters.dimm_s_size_mb());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_size_1gb(1);
  EXPECT_EQ(1'024, channel0_dimm_parameters.dimm_s_size_mb());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_size_1gb(8);
  EXPECT_EQ(8'192, channel0_dimm_parameters.dimm_s_size_mb());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_s_size_1gb(63);
  EXPECT_EQ(64'512, channel0_dimm_parameters.dimm_s_size_mb());
}

TEST(MemoryAddressDecoderDimmParametersSkylakeTest, DimmLSizeMb) {
  auto channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersSkylake::GetForChannel(0).FromValue(0);

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_size_1gb(0);
  EXPECT_EQ(0, channel0_dimm_parameters.dimm_l_size_mb());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_size_1gb(1);
  EXPECT_EQ(1'024, channel0_dimm_parameters.dimm_l_size_mb());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_size_1gb(8);
  EXPECT_EQ(8'192, channel0_dimm_parameters.dimm_l_size_mb());

  channel0_dimm_parameters.set_reg_value(0).set_dimm_l_size_1gb(63);
  EXPECT_EQ(64'512, channel0_dimm_parameters.dimm_l_size_mb());
}

TEST(MemoryAddressDecoderDimmParametersSkylakeTest, GetForChannel) {
  // The register MMIO addresses come from the processor datasheets, plus the
  // 0x140'000 base for the GPU aperture.
  //

  auto channel0_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersSkylake::GetForChannel(0).FromValue(0);
  EXPECT_EQ(0x145'00cu, channel0_dimm_parameters.reg_addr());

  auto channel1_dimm_parameters =
      registers::MemoryAddressDecoderDimmParametersSkylake::GetForChannel(1).FromValue(0);
  EXPECT_EQ(0x145'010u, channel1_dimm_parameters.reg_addr());
}

TEST(MemoryControllerBiosDataIceLakeTest, DdrPhyBusFrequencyHzForTigerLake) {
  auto bios_data = registers::MemoryControllerBiosDataIceLake::Get().FromValue(0);

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k100Mhz)
      .set_controller_frequency_multiplier(0)
      .set_ddr_phy_bus_clock_multiplier_shift_tiger_lake(0);
  EXPECT_EQ(0, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(0)
      .set_ddr_phy_bus_clock_multiplier_shift_tiger_lake(0);
  EXPECT_EQ(0, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k100Mhz)
      .set_controller_frequency_multiplier(0)
      .set_ddr_phy_bus_clock_multiplier_shift_tiger_lake(1);
  EXPECT_EQ(0, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(0)
      .set_ddr_phy_bus_clock_multiplier_shift_tiger_lake(1);
  EXPECT_EQ(0, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k100Mhz)
      .set_controller_frequency_multiplier(3)
      .set_ddr_phy_bus_clock_multiplier_shift_tiger_lake(0);
  EXPECT_EQ(300'000'000, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(3)
      .set_ddr_phy_bus_clock_multiplier_shift_tiger_lake(0);
  EXPECT_EQ(400'000'000, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k100Mhz)
      .set_controller_frequency_multiplier(3)
      .set_ddr_phy_bus_clock_multiplier_shift_tiger_lake(1);
  EXPECT_EQ(600'000'000, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(3)
      .set_ddr_phy_bus_clock_multiplier_shift_tiger_lake(1);
  EXPECT_EQ(800'000'000, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(4)
      .set_ddr_phy_bus_clock_multiplier_shift_tiger_lake(0);
  EXPECT_EQ(533'333'333, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(4)
      .set_ddr_phy_bus_clock_multiplier_shift_tiger_lake(1);
  EXPECT_EQ(1'066'666'667, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(5)
      .set_ddr_phy_bus_clock_multiplier_shift_tiger_lake(0);
  EXPECT_EQ(666'666'667, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(5)
      .set_ddr_phy_bus_clock_multiplier_shift_tiger_lake(1);
  EXPECT_EQ(1'333'333'333, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k100Mhz)
      .set_controller_frequency_multiplier(255)
      .set_ddr_phy_bus_clock_multiplier_shift_tiger_lake(1);
  EXPECT_EQ(51'000'000'000, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(255)
      .set_ddr_phy_bus_clock_multiplier_shift_tiger_lake(1);
  EXPECT_EQ(68'000'000'000, bios_data.ddr_phy_bus_frequency_hz());
}

TEST(MemoryControllerBiosDataIceLakeTest, ControllerQuadClockFrequencyHzTigerLake) {
  auto bios_data = registers::MemoryControllerBiosDataIceLake::Get().FromValue(0);

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k100Mhz)
      .set_controller_frequency_multiplier(0);
  EXPECT_EQ(0, bios_data.controller_quad_clock_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(0);
  EXPECT_EQ(0, bios_data.controller_quad_clock_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k100Mhz)
      .set_controller_frequency_multiplier(3);
  EXPECT_EQ(300'000'000, bios_data.controller_quad_clock_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(3);
  EXPECT_EQ(400'000'000, bios_data.controller_quad_clock_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(4);
  EXPECT_EQ(533'333'333, bios_data.controller_quad_clock_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(5);
  EXPECT_EQ(666'666'667, bios_data.controller_quad_clock_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k100Mhz)
      .set_controller_frequency_multiplier(255);
  EXPECT_EQ(25'500'000'000, bios_data.controller_quad_clock_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(255);
  EXPECT_EQ(34'000'000'000, bios_data.controller_quad_clock_frequency_hz());
}

TEST(MemoryControllerBiosDataIceLakeTest, ControllerFrequencyBaseHzX3) {
  auto bios_data = registers::MemoryControllerBiosDataIceLake::Get().FromValue(0);

  bios_data.set_reg_value(0).set_controller_frequency_base_select(
      registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k100Mhz);
  EXPECT_EQ(300'000'000, bios_data.controller_frequency_base_hz_x3());

  bios_data.set_reg_value(0).set_controller_frequency_base_select(
      registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz);
  EXPECT_EQ(400'000'000, bios_data.controller_frequency_base_hz_x3());
}

TEST(MemoryControllerBiosDataIceLakeTest, ControllerFrequencyBaseHzX3Invalid) {
  auto bios_data = registers::MemoryControllerBiosDataIceLake::Get().FromValue(0);

  bios_data.set_reg_value(0).set_controller_frequency_base_select(
      static_cast<registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue>(7));
  EXPECT_EQ(0, bios_data.controller_frequency_base_hz_x3());

  bios_data.set_reg_value(0).set_controller_frequency_base_select(
      static_cast<registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue>(6));
  EXPECT_EQ(0, bios_data.controller_frequency_base_hz_x3());
}

TEST(MemoryControllerBiosDataIceLakeTest, DataTransmitRailMaxCurrentMilliamps) {
  auto bios_data = registers::MemoryControllerBiosDataIceLake::Get().FromValue(0);

  bios_data.set_reg_value(0).set_data_transmit_rail_max_current_multiplier(0);
  EXPECT_EQ(0, bios_data.data_transmit_rail_max_current_milliamps());

  bios_data.set_reg_value(0).set_data_transmit_rail_max_current_multiplier(1);
  EXPECT_EQ(250, bios_data.data_transmit_rail_max_current_milliamps());

  bios_data.set_reg_value(0).set_data_transmit_rail_max_current_multiplier(2);
  EXPECT_EQ(500, bios_data.data_transmit_rail_max_current_milliamps());

  bios_data.set_reg_value(0).set_data_transmit_rail_max_current_multiplier(15);
  EXPECT_EQ(3'750, bios_data.data_transmit_rail_max_current_milliamps());
}

TEST(MemoryControllerBiosDataIceLakeTest, DataTransmitRailVoltageMillivolts) {
  auto bios_data = registers::MemoryControllerBiosDataIceLake::Get().FromValue(0);

  bios_data.set_reg_value(0).set_data_transmit_rail_voltage_multiplier(0);
  EXPECT_EQ(0, bios_data.data_transmit_rail_voltage_millivolts());

  bios_data.set_reg_value(0).set_data_transmit_rail_voltage_multiplier(1);
  EXPECT_EQ(5, bios_data.data_transmit_rail_voltage_millivolts());

  bios_data.set_reg_value(0).set_data_transmit_rail_voltage_multiplier(2);
  EXPECT_EQ(10, bios_data.data_transmit_rail_voltage_millivolts());

  bios_data.set_reg_value(0).set_data_transmit_rail_voltage_multiplier(1023);
  EXPECT_EQ(5'115, bios_data.data_transmit_rail_voltage_millivolts());
}

TEST(MemoryControllerBiosDataIceLakeTest, DdrPhyBusFrequencyHzIceLake) {
  auto bios_data = registers::MemoryControllerBiosDataIceLake::Get().FromValue(0);

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k100Mhz)
      .set_controller_frequency_multiplier(0)
      .set_ddr_phy_bus_clock_multiplier_shift_ice_lake(0);
  EXPECT_EQ(0, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(0)
      .set_ddr_phy_bus_clock_multiplier_shift_ice_lake(0);
  EXPECT_EQ(0, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k100Mhz)
      .set_controller_frequency_multiplier(0)
      .set_ddr_phy_bus_clock_multiplier_shift_ice_lake(1);
  EXPECT_EQ(0, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(0)
      .set_ddr_phy_bus_clock_multiplier_shift_ice_lake(1);
  EXPECT_EQ(0, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k100Mhz)
      .set_controller_frequency_multiplier(3)
      .set_ddr_phy_bus_clock_multiplier_shift_ice_lake(0);
  EXPECT_EQ(300'000'000, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(3)
      .set_ddr_phy_bus_clock_multiplier_shift_ice_lake(0);
  EXPECT_EQ(400'000'000, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k100Mhz)
      .set_controller_frequency_multiplier(3)
      .set_ddr_phy_bus_clock_multiplier_shift_ice_lake(1);
  EXPECT_EQ(600'000'000, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(3)
      .set_ddr_phy_bus_clock_multiplier_shift_ice_lake(1);
  EXPECT_EQ(800'000'000, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(4)
      .set_ddr_phy_bus_clock_multiplier_shift_ice_lake(0);
  EXPECT_EQ(533'333'333, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(4)
      .set_ddr_phy_bus_clock_multiplier_shift_ice_lake(1);
  EXPECT_EQ(1'066'666'667, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(5)
      .set_ddr_phy_bus_clock_multiplier_shift_ice_lake(0);
  EXPECT_EQ(666'666'667, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(5)
      .set_ddr_phy_bus_clock_multiplier_shift_ice_lake(1);
  EXPECT_EQ(1'333'333'333, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k100Mhz)
      .set_controller_frequency_multiplier(255)
      .set_ddr_phy_bus_clock_multiplier_shift_ice_lake(1);
  EXPECT_EQ(51'000'000'000, bios_data.ddr_phy_bus_frequency_hz());

  bios_data.set_reg_value(0)
      .set_controller_frequency_base_select(
          registers::MemoryControllerBiosDataIceLake::ControllerFrequencyBaseValue::k133Mhz)
      .set_controller_frequency_multiplier(255)
      .set_ddr_phy_bus_clock_multiplier_shift_ice_lake(1);
  EXPECT_EQ(68'000'000'000, bios_data.ddr_phy_bus_frequency_hz());
}

TEST(MemoryControllerBiosDataSkylakeTest, ControllerQuadClockFrequencyHz) {
  auto bios_data = registers::MemoryControllerBiosDataSkylake::Get().FromValue(0);

  // Test cases from the register-level reference.
  //
  // Kaby Lake: Processor Datasheet Vol 2 (631122-003) Section 6.83 page 198

  bios_data.set_reg_value(0).set_controller_frequency_multiplier(0);
  EXPECT_EQ(0, bios_data.controller_quad_clock_frequency_hz());

  bios_data.set_reg_value(0).set_controller_frequency_multiplier(3);
  EXPECT_EQ(800'000'000, bios_data.controller_quad_clock_frequency_hz());

  bios_data.set_reg_value(0).set_controller_frequency_multiplier(4);
  EXPECT_EQ(1'066'666'667, bios_data.controller_quad_clock_frequency_hz());

  bios_data.set_reg_value(0).set_controller_frequency_multiplier(5);
  EXPECT_EQ(1'333'333'333, bios_data.controller_quad_clock_frequency_hz());

  bios_data.set_reg_value(0).set_controller_frequency_multiplier(6);
  EXPECT_EQ(1'600'000'000, bios_data.controller_quad_clock_frequency_hz());

  bios_data.set_reg_value(0).set_controller_frequency_multiplier(7);
  EXPECT_EQ(1'866'666'667, bios_data.controller_quad_clock_frequency_hz());

  bios_data.set_reg_value(0).set_controller_frequency_multiplier(8);
  EXPECT_EQ(2'133'333'333, bios_data.controller_quad_clock_frequency_hz());
}

}  // namespace

}  // namespace i915
