blob: 0de3c891b343cc7833d7802526ed4201fa5a3696 [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.h"
#include <gtest/gtest.h>
namespace i915 {
namespace {
TEST(RegistersTest, CdClockCtlFreqDecimal) {
// Test cases from IHD-OS-KBL-Vol 2c-1.17 Part 1 page 329.
// Same cases are in IHD-OS-SKL-Vol 2c-05.16 Part 1 page 326.
EXPECT_EQ(0b01'0011'0011'1u, registers::CdClockCtl::FreqDecimal(308'570));
EXPECT_EQ(0b01'0101'0000'1u, registers::CdClockCtl::FreqDecimal(337'500));
EXPECT_EQ(0b01'1010'1111'0u, registers::CdClockCtl::FreqDecimal(432'000));
EXPECT_EQ(0b01'1100'0001'0u, registers::CdClockCtl::FreqDecimal(450'000));
EXPECT_EQ(0b10'0001'1011'0u, registers::CdClockCtl::FreqDecimal(540'000));
EXPECT_EQ(0b10'0110'1000'0u, registers::CdClockCtl::FreqDecimal(617'140));
EXPECT_EQ(0b10'1010'0010'0u, registers::CdClockCtl::FreqDecimal(675'000));
// Test cases from IHD-OS-TGL-Vol 2c-12.21 Part 1 pages 221-222.
// Same cases are in IHD-OS-DG1-Vol 2c-2.21 Part 1 pages 181-182.
EXPECT_EQ(0b00'1010'0111'0u, registers::CdClockCtl::FreqDecimal(168'000));
EXPECT_EQ(0b00'1010'1100'0u, registers::CdClockCtl::FreqDecimal(172'800));
EXPECT_EQ(0b00'1011'0010'0u, registers::CdClockCtl::FreqDecimal(179'200));
EXPECT_EQ(0b00'1011'0011'0u, registers::CdClockCtl::FreqDecimal(180'000));
EXPECT_EQ(0b00'1011'1111'0u, registers::CdClockCtl::FreqDecimal(192'000));
EXPECT_EQ(0b01'0011'0010'0u, registers::CdClockCtl::FreqDecimal(307'200));
EXPECT_EQ(0b01'0011'0111'0u, registers::CdClockCtl::FreqDecimal(312'000));
EXPECT_EQ(0b01'0100'0011'0u, registers::CdClockCtl::FreqDecimal(324'000));
EXPECT_EQ(0b01'0100'0101'1u, registers::CdClockCtl::FreqDecimal(326'400));
EXPECT_EQ(0b01'1101'1111'0u, registers::CdClockCtl::FreqDecimal(480'000));
EXPECT_EQ(0b10'0010'0111'0u, registers::CdClockCtl::FreqDecimal(552'000));
EXPECT_EQ(0b10'0010'1100'0u, registers::CdClockCtl::FreqDecimal(556'800));
EXPECT_EQ(0b10'1000'0111'0u, registers::CdClockCtl::FreqDecimal(648'000));
EXPECT_EQ(0b10'1000'1100'0u, registers::CdClockCtl::FreqDecimal(652'800));
}
TEST(DisplayStrapsTest, ReferenceFrequencyKhzTigerLake) {
auto display_straps = registers::DisplayStraps::Get().FromValue(0);
display_straps.set_reg_value(0).set_reference_frequency_select_tiger_lake(
registers::DisplayStraps::ReferenceFrequencySelectTigerLake::k19_2Mhz);
EXPECT_EQ(19'200, display_straps.reference_frequency_khz_tiger_lake());
display_straps.set_reg_value(0).set_reference_frequency_select_tiger_lake(
registers::DisplayStraps::ReferenceFrequencySelectTigerLake::k24Mhz);
EXPECT_EQ(24'000, display_straps.reference_frequency_khz_tiger_lake());
display_straps.set_reg_value(0).set_reference_frequency_select_tiger_lake(
registers::DisplayStraps::ReferenceFrequencySelectTigerLake::k38_4Mhz);
EXPECT_EQ(38'400, display_straps.reference_frequency_khz_tiger_lake());
display_straps.set_reg_value(0).set_reference_frequency_select_tiger_lake(
static_cast<registers::DisplayStraps::ReferenceFrequencySelectTigerLake>(0b11));
EXPECT_EQ(0, display_straps.reference_frequency_khz_tiger_lake());
}
TEST(RegistersTest, PowerWellControlAux_TigerLake) {
auto reg = registers::PowerWellControlAux::Get().FromValue(0);
// AUX IO Power request
reg.set_reg_value(0).set_power_on_request_combo_or_usb_c(DdiId::DDI_A, /*enabled=*/true);
EXPECT_EQ(reg.power_on_request_a(), 1u);
EXPECT_EQ(reg.powered_on_combo_or_usb_c(DdiId::DDI_A), 0u);
reg.set_reg_value(0).set_power_on_request_combo_or_usb_c(DdiId::DDI_B, /*enabled=*/true);
EXPECT_EQ(reg.power_on_request_b(), 1u);
EXPECT_EQ(reg.powered_on_combo_or_usb_c(DdiId::DDI_B), 0u);
reg.set_reg_value(0).set_power_on_request_combo_or_usb_c(DdiId::DDI_C, /*enabled=*/true);
EXPECT_EQ(reg.power_on_request_c(), 1u);
EXPECT_EQ(reg.powered_on_combo_or_usb_c(DdiId::DDI_C), 0u);
// USB-C Power request
reg.set_reg_value(0).set_power_on_request_combo_or_usb_c(DdiId::DDI_TC_1,
/*enabled=*/true);
EXPECT_EQ(reg.power_on_request_usb_c_1(), 1u);
EXPECT_EQ(reg.powered_on_combo_or_usb_c(DdiId::DDI_TC_1), 0u);
reg.set_reg_value(0).set_power_on_request_combo_or_usb_c(DdiId::DDI_TC_2,
/*enabled=*/true);
EXPECT_EQ(reg.power_on_request_usb_c_2(), 1u);
EXPECT_EQ(reg.powered_on_combo_or_usb_c(DdiId::DDI_TC_2), 0u);
reg.set_reg_value(0).set_power_on_request_combo_or_usb_c(DdiId::DDI_TC_3,
/*enabled=*/true);
EXPECT_EQ(reg.power_on_request_usb_c_3(), 1u);
EXPECT_EQ(reg.powered_on_combo_or_usb_c(DdiId::DDI_TC_3), 0u);
reg.set_reg_value(0).set_power_on_request_combo_or_usb_c(DdiId::DDI_TC_4,
/*enabled=*/true);
EXPECT_EQ(reg.power_on_request_usb_c_4(), 1u);
EXPECT_EQ(reg.powered_on_combo_or_usb_c(DdiId::DDI_TC_4), 0u);
reg.set_reg_value(0).set_power_on_request_combo_or_usb_c(DdiId::DDI_TC_5,
/*enabled=*/true);
EXPECT_EQ(reg.power_on_request_usb_c_5(), 1u);
EXPECT_EQ(reg.powered_on_combo_or_usb_c(DdiId::DDI_TC_5), 0u);
reg.set_reg_value(0).set_power_on_request_combo_or_usb_c(DdiId::DDI_TC_6,
/*enabled=*/true);
EXPECT_EQ(reg.power_on_request_usb_c_6(), 1u);
EXPECT_EQ(reg.powered_on_combo_or_usb_c(DdiId::DDI_TC_6), 0u);
// Thunderbolt Power request
reg.set_reg_value(0).set_power_on_request_thunderbolt(DdiId::DDI_TC_1, /*enabled=*/true);
EXPECT_EQ(reg.power_on_request_thunderbolt_1(), 1u);
EXPECT_EQ(reg.powered_on_thunderbolt(DdiId::DDI_TC_1), 0u);
reg.set_reg_value(0).set_power_on_request_thunderbolt(DdiId::DDI_TC_2, /*enabled=*/true);
EXPECT_EQ(reg.power_on_request_thunderbolt_2(), 1u);
EXPECT_EQ(reg.powered_on_thunderbolt(DdiId::DDI_TC_2), 0u);
reg.set_reg_value(0).set_power_on_request_thunderbolt(DdiId::DDI_TC_3, /*enabled=*/true);
EXPECT_EQ(reg.power_on_request_thunderbolt_3(), 1u);
EXPECT_EQ(reg.powered_on_thunderbolt(DdiId::DDI_TC_3), 0u);
reg.set_reg_value(0).set_power_on_request_thunderbolt(DdiId::DDI_TC_4, /*enabled=*/true);
EXPECT_EQ(reg.power_on_request_thunderbolt_4(), 1u);
EXPECT_EQ(reg.powered_on_thunderbolt(DdiId::DDI_TC_4), 0u);
reg.set_reg_value(0).set_power_on_request_thunderbolt(DdiId::DDI_TC_5, /*enabled=*/true);
EXPECT_EQ(reg.power_on_request_thunderbolt_5(), 1u);
EXPECT_EQ(reg.powered_on_thunderbolt(DdiId::DDI_TC_5), 0u);
reg.set_reg_value(0).set_power_on_request_thunderbolt(DdiId::DDI_TC_6, /*enabled=*/true);
EXPECT_EQ(reg.power_on_request_thunderbolt_6(), 1u);
EXPECT_EQ(reg.powered_on_thunderbolt(DdiId::DDI_TC_6), 0u);
// AUX IO Power state
reg.set_reg_value(0).set_powered_on_a(1);
EXPECT_TRUE(reg.powered_on_combo_or_usb_c(DdiId::DDI_A));
reg.set_reg_value(0).set_powered_on_b(1);
EXPECT_TRUE(reg.powered_on_combo_or_usb_c(DdiId::DDI_B));
reg.set_reg_value(0).set_powered_on_c(1);
EXPECT_TRUE(reg.powered_on_combo_or_usb_c(DdiId::DDI_C));
// USB-C Power state
reg.set_reg_value(0).set_powered_on_usb_c_1(1);
EXPECT_TRUE(reg.powered_on_combo_or_usb_c(DdiId::DDI_TC_1));
reg.set_reg_value(0).set_powered_on_usb_c_2(1);
EXPECT_TRUE(reg.powered_on_combo_or_usb_c(DdiId::DDI_TC_2));
reg.set_reg_value(0).set_powered_on_usb_c_3(1);
EXPECT_TRUE(reg.powered_on_combo_or_usb_c(DdiId::DDI_TC_3));
reg.set_reg_value(0).set_powered_on_usb_c_4(1);
EXPECT_TRUE(reg.powered_on_combo_or_usb_c(DdiId::DDI_TC_4));
reg.set_reg_value(0).set_powered_on_usb_c_5(1);
EXPECT_TRUE(reg.powered_on_combo_or_usb_c(DdiId::DDI_TC_5));
reg.set_reg_value(0).set_powered_on_usb_c_6(1);
EXPECT_TRUE(reg.powered_on_combo_or_usb_c(DdiId::DDI_TC_6));
// Thunderbolt Power state
reg.set_reg_value(0).set_powered_on_thunderbolt_1(1);
EXPECT_TRUE(reg.powered_on_thunderbolt(DdiId::DDI_TC_1));
reg.set_reg_value(0).set_powered_on_thunderbolt_2(1);
EXPECT_TRUE(reg.powered_on_thunderbolt(DdiId::DDI_TC_2));
reg.set_reg_value(0).set_powered_on_thunderbolt_3(1);
EXPECT_TRUE(reg.powered_on_thunderbolt(DdiId::DDI_TC_3));
reg.set_reg_value(0).set_powered_on_thunderbolt_4(1);
EXPECT_TRUE(reg.powered_on_thunderbolt(DdiId::DDI_TC_4));
reg.set_reg_value(0).set_powered_on_thunderbolt_5(1);
EXPECT_TRUE(reg.powered_on_thunderbolt(DdiId::DDI_TC_5));
reg.set_reg_value(0).set_powered_on_thunderbolt_6(1);
EXPECT_TRUE(reg.powered_on_thunderbolt(DdiId::DDI_TC_6));
}
TEST(DataBufferControlTest, GetForSlice) {
// The register MMIO addresses come from the reference manual.
//
// Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 1 page 331
// DG1: IHD-OS-DG1-Vol 2c-2.21 Part 1 page 309
// Kaby Lake: IHD-OS-KBL-Vol 2c-1.17 Part 1 page 430
auto dbuf_ctl_s1 = registers::DataBufferControl::GetForSlice(0).FromValue(0);
EXPECT_EQ(0x45008u, dbuf_ctl_s1.reg_addr());
auto dbuf_ctl_s2 = registers::DataBufferControl::GetForSlice(1).FromValue(0);
EXPECT_EQ(0x44fe8u, dbuf_ctl_s2.reg_addr());
}
TEST(DataBufferControl2Test, GetForSlice) {
// The register MMIO addresses come from the reference manual.
//
// Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 1 page 333
// DG1: IHD-OS-DG1-Vol 2c-2.21 Part 1 page 311
auto dbuf_ctl2_s1 = registers::DataBufferControl2::GetForSlice(0).FromValue(0);
EXPECT_EQ(0x44ffcu, dbuf_ctl2_s1.reg_addr());
auto dbuf_ctl2_s2 = registers::DataBufferControl2::GetForSlice(1).FromValue(0);
EXPECT_EQ(0x44fe4u, dbuf_ctl2_s2.reg_addr());
}
} // namespace
} // namespace i915