| // 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-transcoder.h" |
| |
| #include <lib/mmio/mmio-buffer.h> |
| |
| #include <optional> |
| |
| #include <gtest/gtest.h> |
| #include <mock-mmio-range/mock-mmio-range.h> |
| |
| #include "src/graphics/display/drivers/intel-i915/hardware-common.h" |
| #include "src/graphics/display/drivers/intel-i915/registers-ddi.h" |
| |
| namespace i915 { |
| |
| namespace { |
| |
| TEST(TranscoderDdiControlTest, DdiKabyLake) { |
| // The bit patterns come from the reference manuals. |
| // |
| // Kaby Lake: IHD-OS-KBL-Vol 2c-1.17 Part 2 page 953 |
| // Skylake: IHD-OS-SKL-Vol 2c-05.16 Part 2 page 927 |
| |
| auto transcoder_ddi_control_a = |
| registers::TranscoderDdiControl::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_A) |
| .FromValue(0); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_ddi_kaby_lake(std::nullopt); |
| EXPECT_EQ(0b0'000'0000'00000000'00000000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(std::nullopt, transcoder_ddi_control_a.ddi_kaby_lake()); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_ddi_kaby_lake(DdiId::DDI_B); |
| EXPECT_EQ(0b0'001'0000'00000000'00000000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_B), transcoder_ddi_control_a.ddi_kaby_lake()); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_ddi_kaby_lake(DdiId::DDI_C); |
| EXPECT_EQ(0b0'010'0000'00000000'00000000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_C), transcoder_ddi_control_a.ddi_kaby_lake()); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_ddi_kaby_lake(DdiId::DDI_D); |
| EXPECT_EQ(0b0'011'0000'00000000'00000000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_D), transcoder_ddi_control_a.ddi_kaby_lake()); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_ddi_kaby_lake(DdiId::DDI_E); |
| EXPECT_EQ(0b0'100'0000'00000000'00000000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_E), transcoder_ddi_control_a.ddi_kaby_lake()); |
| } |
| |
| TEST(TranscoderDdiControlTest, DdiTigerLake) { |
| // The bit patterns come from the reference manuals. |
| // |
| // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 pages 1371 |
| |
| auto transcoder_ddi_control_a = |
| registers::TranscoderDdiControl::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_A) |
| .FromValue(0); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_ddi_tiger_lake(std::nullopt); |
| EXPECT_EQ(0b0'0000'000'00000000'00000000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(std::nullopt, transcoder_ddi_control_a.ddi_tiger_lake()); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_ddi_tiger_lake(DdiId::DDI_A); |
| EXPECT_EQ(0b0'0001'000'00000000'00000000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_A), transcoder_ddi_control_a.ddi_tiger_lake()); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_ddi_tiger_lake(DdiId::DDI_B); |
| EXPECT_EQ(0b0'0010'000'00000000'00000000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_B), transcoder_ddi_control_a.ddi_tiger_lake()); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_ddi_tiger_lake(DdiId::DDI_C); |
| EXPECT_EQ(0b0'0011'000'00000000'00000000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_C), transcoder_ddi_control_a.ddi_tiger_lake()); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_ddi_tiger_lake(DdiId::DDI_TC_1); |
| EXPECT_EQ(0b0'0100'000'00000000'00000000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_TC_1), transcoder_ddi_control_a.ddi_tiger_lake()); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_ddi_tiger_lake(DdiId::DDI_TC_2); |
| EXPECT_EQ(0b0'0101'000'00000000'00000000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_TC_2), transcoder_ddi_control_a.ddi_tiger_lake()); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_ddi_tiger_lake(DdiId::DDI_TC_3); |
| EXPECT_EQ(0b0'0110'000'00000000'00000000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_TC_3), transcoder_ddi_control_a.ddi_tiger_lake()); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_ddi_tiger_lake(DdiId::DDI_TC_4); |
| EXPECT_EQ(0b0'0111'000'00000000'00000000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_TC_4), transcoder_ddi_control_a.ddi_tiger_lake()); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_ddi_tiger_lake(DdiId::DDI_TC_5); |
| EXPECT_EQ(0b0'1000'000'00000000'00000000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_TC_5), transcoder_ddi_control_a.ddi_tiger_lake()); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_ddi_tiger_lake(DdiId::DDI_TC_6); |
| EXPECT_EQ(0b0'1001'000'00000000'00000000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_TC_6), transcoder_ddi_control_a.ddi_tiger_lake()); |
| } |
| |
| TEST(TranscoderDdiControlTest, PortSyncPrimaryTranscoderKabyLake) { |
| // The bit patterns come from the reference manuals. |
| // |
| // Kaby Lake: IHD-OS-KBL-Vol 2c-1.17 Part 2 page 954 |
| // Skylake: IHD-OS-SKL-Vol 2c-05.16 Part 2 page 928 |
| |
| auto transcoder_ddi_control_a = |
| registers::TranscoderDdiControl::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_A) |
| .FromValue(0); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_port_sync_primary_kaby_lake(TranscoderId::TRANSCODER_EDP); |
| EXPECT_EQ(0b00000000'0000'00'00'00000000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(TranscoderId::TRANSCODER_EDP, |
| transcoder_ddi_control_a.port_sync_primary_transcoder_kaby_lake()); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_port_sync_primary_kaby_lake(TranscoderId::TRANSCODER_A); |
| EXPECT_EQ(0b00000000'0000'01'00'00000000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(TranscoderId::TRANSCODER_A, |
| transcoder_ddi_control_a.port_sync_primary_transcoder_kaby_lake()); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_port_sync_primary_kaby_lake(TranscoderId::TRANSCODER_B); |
| EXPECT_EQ(0b00000000'0000'10'00'00000000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(TranscoderId::TRANSCODER_B, |
| transcoder_ddi_control_a.port_sync_primary_transcoder_kaby_lake()); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_port_sync_primary_kaby_lake(TranscoderId::TRANSCODER_C); |
| EXPECT_EQ(0b00000000'0000'11'00'00000000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(TranscoderId::TRANSCODER_C, |
| transcoder_ddi_control_a.port_sync_primary_transcoder_kaby_lake()); |
| } |
| |
| TEST(TranscoderDdiControlTest, InputPipeId) { |
| // The bit patterns come from the reference manuals. |
| // |
| // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 pages 1373 |
| // Kaby Lake: IHD-OS-KBL-Vol 2c-1.17 Part 2 page 955 |
| |
| auto transcoder_ddi_control_a = |
| registers::TranscoderDdiControl::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_A) |
| .FromValue(0); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_input_pipe_id(PipeId::PIPE_A); |
| EXPECT_EQ(0b00000000'00000000'0'000'0000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(PipeId::PIPE_A, transcoder_ddi_control_a.input_pipe_id()); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_input_pipe_id(PipeId::PIPE_B); |
| EXPECT_EQ(0b00000000'00000000'0'101'0000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(PipeId::PIPE_B, transcoder_ddi_control_a.input_pipe_id()); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_input_pipe_id(PipeId::PIPE_C); |
| EXPECT_EQ(0b00000000'00000000'0'110'0000'00000000u, transcoder_ddi_control_a.reg_value()); |
| EXPECT_EQ(PipeId::PIPE_C, transcoder_ddi_control_a.input_pipe_id()); |
| |
| // TODO(https://fxbug.dev/42060657): Add a test for Tiger Lake's pipe D, when we support |
| // it. The golden value is 0b00000000'00000000'0'111'0000'00000000u |
| |
| transcoder_ddi_control_a.set_reg_value(0b00000000'00000000'0'001'0000'00000000u); |
| EXPECT_EQ(PipeId::PIPE_INVALID, transcoder_ddi_control_a.input_pipe_id()); |
| |
| transcoder_ddi_control_a.set_reg_value(0b00000000'00000000'0'010'0000'00000000u); |
| EXPECT_EQ(PipeId::PIPE_INVALID, transcoder_ddi_control_a.input_pipe_id()); |
| |
| transcoder_ddi_control_a.set_reg_value(0b00000000'00000000'0'011'0000'00000000u); |
| EXPECT_EQ(PipeId::PIPE_INVALID, transcoder_ddi_control_a.input_pipe_id()); |
| } |
| |
| TEST(TranscoderDdiControlTest, DisplayPortLaneCount) { |
| auto transcoder_ddi_control_a = |
| registers::TranscoderDdiControl::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_A) |
| .FromValue(0); |
| |
| // The valid values and encodings are listed in the reference manuals. |
| // |
| // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 pages 1374 |
| // Kaby Lake: IHD-OS-KBL-Vol 2c-1.17 Part 2 page 956 |
| // Skylake: IHD-OS-SKL-Vol 2c-05.16 Part 2 page 930 |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_display_port_lane_count(1); |
| EXPECT_EQ(0u, transcoder_ddi_control_a.display_port_lane_count_selection()); |
| EXPECT_EQ(1, transcoder_ddi_control_a.display_port_lane_count()); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_display_port_lane_count(2); |
| EXPECT_EQ(1u, transcoder_ddi_control_a.display_port_lane_count_selection()); |
| EXPECT_EQ(2, transcoder_ddi_control_a.display_port_lane_count()); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_display_port_lane_count(3); |
| EXPECT_EQ(2u, transcoder_ddi_control_a.display_port_lane_count_selection()); |
| EXPECT_EQ(3, transcoder_ddi_control_a.display_port_lane_count()); |
| |
| transcoder_ddi_control_a.set_reg_value(0); |
| transcoder_ddi_control_a.set_display_port_lane_count(4); |
| EXPECT_EQ(3u, transcoder_ddi_control_a.display_port_lane_count_selection()); |
| EXPECT_EQ(4, transcoder_ddi_control_a.display_port_lane_count()); |
| } |
| |
| TEST(TranscoderDdiControlTest, GetForKabyLakeTranscoder) { |
| // The register MMIO addresses come from the reference manuals. |
| // |
| // Kaby Lake: IHD-OS-KBL-Vol 2c-1.17 Part 2 page 952 |
| // Skylake: IHD-OS-SKL-Vol 2c-05.16 Part 2 page 926 |
| |
| auto transcoder_ddi_control_a = |
| registers::TranscoderDdiControl::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_A) |
| .FromValue(0); |
| EXPECT_EQ(0x60400u, transcoder_ddi_control_a.reg_addr()); |
| |
| auto transcoder_ddi_control_b = |
| registers::TranscoderDdiControl::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_B) |
| .FromValue(0); |
| EXPECT_EQ(0x61400u, transcoder_ddi_control_b.reg_addr()); |
| |
| auto transcoder_ddi_control_c = |
| registers::TranscoderDdiControl::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_C) |
| .FromValue(0); |
| EXPECT_EQ(0x62400u, transcoder_ddi_control_c.reg_addr()); |
| |
| auto transcoder_ddi_control_edp = |
| registers::TranscoderDdiControl::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_EDP) |
| .FromValue(0); |
| EXPECT_EQ(0x6f400u, transcoder_ddi_control_edp.reg_addr()); |
| } |
| |
| TEST(TranscoderDdiControlTest, GetForTigerLakeTranscoder) { |
| // The register MMIO addresses come from the reference manuals. |
| // |
| // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 pages 1367-1368 |
| |
| auto transcoder_ddi_control_a = |
| registers::TranscoderDdiControl::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_A) |
| .FromValue(0); |
| EXPECT_EQ(0x60400u, transcoder_ddi_control_a.reg_addr()); |
| |
| auto transcoder_ddi_control_b = |
| registers::TranscoderDdiControl::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_B) |
| .FromValue(0); |
| EXPECT_EQ(0x61400u, transcoder_ddi_control_b.reg_addr()); |
| |
| auto transcoder_ddi_control_c = |
| registers::TranscoderDdiControl::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_C) |
| .FromValue(0); |
| EXPECT_EQ(0x62400u, transcoder_ddi_control_c.reg_addr()); |
| |
| // TODO(https://fxbug.dev/42060657): Add a test for transcoder D, when we support it. |
| // The MMIO address is 0x63400. |
| } |
| |
| TEST(TranscoderConfigTest, GetForKabyLakeTranscoder) { |
| // The register MMIO addresses come from the reference manuals. |
| // |
| // Kaby Lake: IHD-OS-KBL-Vol 2c-1.17 Part 2 page 949 |
| // Skylake: IHD-OS-SKL-Vol 2c-05.16 Part 2 page 924 |
| |
| auto transcoder_config_a = |
| registers::TranscoderConfig::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_A) |
| .FromValue(0); |
| EXPECT_EQ(0x70008u, transcoder_config_a.reg_addr()); |
| |
| auto transcoder_config_b = |
| registers::TranscoderConfig::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_B) |
| .FromValue(0); |
| EXPECT_EQ(0x71008u, transcoder_config_b.reg_addr()); |
| |
| auto transcoder_config_c = |
| registers::TranscoderConfig::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_C) |
| .FromValue(0); |
| EXPECT_EQ(0x72008u, transcoder_config_c.reg_addr()); |
| |
| auto transcoder_config_edp = |
| registers::TranscoderConfig::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_EDP) |
| .FromValue(0); |
| EXPECT_EQ(0x7f008u, transcoder_config_edp.reg_addr()); |
| |
| // TODO(fxbug.com/109672): Add a test for the WD transcoder, when we support |
| // it. The MMIO address is 0x7e008. |
| } |
| |
| TEST(TranscoderConfigTest, GetForTigerLakeTranscoder) { |
| // The register MMIO addresses come from the reference manuals. |
| // |
| // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 pages 1367-1368 |
| |
| auto transcoder_config_a = |
| registers::TranscoderConfig::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_A) |
| .FromValue(0); |
| EXPECT_EQ(0x70008u, transcoder_config_a.reg_addr()); |
| |
| auto transcoder_config_b = |
| registers::TranscoderConfig::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_B) |
| .FromValue(0); |
| EXPECT_EQ(0x71008u, transcoder_config_b.reg_addr()); |
| |
| auto transcoder_config_c = |
| registers::TranscoderConfig::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_C) |
| .FromValue(0); |
| EXPECT_EQ(0x72008u, transcoder_config_c.reg_addr()); |
| |
| // TODO(https://fxbug.dev/42060657): Add a test for transcoder D, when we support it. |
| // The MMIO address is 0x73008. |
| |
| // TODO(fxbug.com/109672): Add a test for the WD transcoders, when we support |
| // them. The MMIO addresses are 0x7e008 for WD0 and 0x7d008 for WD1. |
| } |
| |
| TEST(TranscoderClockSelectTest, DdiClockKabyLake) { |
| // The bit patterns come from the reference manuals. |
| // |
| // Kaby Lake: IHD-OS-KBL-Vol 2c-1.17 Part 2 page 947 |
| // Skylake: IHD-OS-SKL-Vol 2c-05.16 Part 2 page 923 |
| |
| auto transcoder_clock_select_a = |
| registers::TranscoderClockSelect::GetForTranscoder(TranscoderId::TRANSCODER_A).FromValue(0); |
| |
| transcoder_clock_select_a.set_reg_value(0); |
| transcoder_clock_select_a.set_ddi_clock_kaby_lake(std::nullopt); |
| EXPECT_EQ(0b000'00000'00000000'00000000'00000000u, transcoder_clock_select_a.reg_value()); |
| EXPECT_EQ(std::nullopt, transcoder_clock_select_a.ddi_clock_kaby_lake()); |
| |
| transcoder_clock_select_a.set_reg_value(0); |
| transcoder_clock_select_a.set_ddi_clock_kaby_lake(DdiId::DDI_B); |
| EXPECT_EQ(0b010'00000'00000000'00000000'00000000u, transcoder_clock_select_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_B), transcoder_clock_select_a.ddi_clock_kaby_lake()); |
| |
| transcoder_clock_select_a.set_reg_value(0); |
| transcoder_clock_select_a.set_ddi_clock_kaby_lake(DdiId::DDI_C); |
| EXPECT_EQ(0b011'00000'00000000'00000000'00000000u, transcoder_clock_select_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_C), transcoder_clock_select_a.ddi_clock_kaby_lake()); |
| |
| transcoder_clock_select_a.set_reg_value(0); |
| transcoder_clock_select_a.set_ddi_clock_kaby_lake(DdiId::DDI_D); |
| EXPECT_EQ(0b100'00000'00000000'00000000'00000000u, transcoder_clock_select_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_D), transcoder_clock_select_a.ddi_clock_kaby_lake()); |
| |
| transcoder_clock_select_a.set_reg_value(0); |
| transcoder_clock_select_a.set_ddi_clock_kaby_lake(DdiId::DDI_E); |
| EXPECT_EQ(0b101'00000'00000000'00000000'00000000u, transcoder_clock_select_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_E), transcoder_clock_select_a.ddi_clock_kaby_lake()); |
| } |
| |
| TEST(TranscoderClockSelectTest, DdiClockKabyLakePreservesReservedBits) { |
| auto transcoder_clock_select_a = |
| registers::TranscoderClockSelect::GetForTranscoder(TranscoderId::TRANSCODER_A).FromValue(0); |
| |
| transcoder_clock_select_a.set_reg_value(0xffff'ffff); |
| transcoder_clock_select_a.set_ddi_clock_kaby_lake(std::nullopt); |
| EXPECT_EQ(0b000'11111'11111111'11111111'11111111u, transcoder_clock_select_a.reg_value()); |
| EXPECT_EQ(std::nullopt, transcoder_clock_select_a.ddi_clock_kaby_lake()); |
| |
| transcoder_clock_select_a.set_reg_value(0xffff'ffff); |
| transcoder_clock_select_a.set_ddi_clock_kaby_lake(DdiId::DDI_D); |
| EXPECT_EQ(0b100'11111'11111111'11111111'11111111u, transcoder_clock_select_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_D), transcoder_clock_select_a.ddi_clock_kaby_lake()); |
| } |
| |
| TEST(TranscoderClockSelectTest, DdiClockTigerLake) { |
| // The bit patterns come from the reference manuals. |
| // |
| // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 pages 1365 |
| |
| auto transcoder_clock_select_a = |
| registers::TranscoderClockSelect::GetForTranscoder(TranscoderId::TRANSCODER_A).FromValue(0); |
| |
| transcoder_clock_select_a.set_reg_value(0); |
| transcoder_clock_select_a.set_ddi_clock_tiger_lake(std::nullopt); |
| EXPECT_EQ(0b0000'0000'00000000'00000000'00000000u, transcoder_clock_select_a.reg_value()); |
| EXPECT_EQ(std::nullopt, transcoder_clock_select_a.ddi_clock_tiger_lake()); |
| |
| transcoder_clock_select_a.set_reg_value(0); |
| transcoder_clock_select_a.set_ddi_clock_tiger_lake(DdiId::DDI_A); |
| EXPECT_EQ(0b0001'0000'00000000'00000000'00000000u, transcoder_clock_select_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_A), transcoder_clock_select_a.ddi_clock_tiger_lake()); |
| |
| transcoder_clock_select_a.set_reg_value(0); |
| transcoder_clock_select_a.set_ddi_clock_tiger_lake(DdiId::DDI_B); |
| EXPECT_EQ(0b0010'0000'00000000'00000000'00000000u, transcoder_clock_select_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_B), transcoder_clock_select_a.ddi_clock_tiger_lake()); |
| |
| transcoder_clock_select_a.set_reg_value(0); |
| transcoder_clock_select_a.set_ddi_clock_tiger_lake(DdiId::DDI_C); |
| EXPECT_EQ(0b0011'0000'00000000'00000000'00000000u, transcoder_clock_select_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_C), transcoder_clock_select_a.ddi_clock_tiger_lake()); |
| |
| transcoder_clock_select_a.set_reg_value(0); |
| transcoder_clock_select_a.set_ddi_clock_tiger_lake(DdiId::DDI_TC_1); |
| EXPECT_EQ(0b0100'0000'00000000'00000000'00000000u, transcoder_clock_select_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_TC_1), transcoder_clock_select_a.ddi_clock_tiger_lake()); |
| |
| transcoder_clock_select_a.set_reg_value(0); |
| transcoder_clock_select_a.set_ddi_clock_tiger_lake(DdiId::DDI_TC_2); |
| EXPECT_EQ(0b0101'0000'00000000'00000000'00000000u, transcoder_clock_select_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_TC_2), transcoder_clock_select_a.ddi_clock_tiger_lake()); |
| |
| transcoder_clock_select_a.set_reg_value(0); |
| transcoder_clock_select_a.set_ddi_clock_tiger_lake(DdiId::DDI_TC_3); |
| EXPECT_EQ(0b0110'0000'00000000'00000000'00000000u, transcoder_clock_select_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_TC_3), transcoder_clock_select_a.ddi_clock_tiger_lake()); |
| |
| transcoder_clock_select_a.set_reg_value(0); |
| transcoder_clock_select_a.set_ddi_clock_tiger_lake(DdiId::DDI_TC_4); |
| EXPECT_EQ(0b0111'0000'00000000'00000000'00000000u, transcoder_clock_select_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_TC_4), transcoder_clock_select_a.ddi_clock_tiger_lake()); |
| |
| transcoder_clock_select_a.set_reg_value(0); |
| transcoder_clock_select_a.set_ddi_clock_tiger_lake(DdiId::DDI_TC_5); |
| EXPECT_EQ(0b1000'0000'00000000'00000000'00000000u, transcoder_clock_select_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_TC_5), transcoder_clock_select_a.ddi_clock_tiger_lake()); |
| |
| transcoder_clock_select_a.set_reg_value(0); |
| transcoder_clock_select_a.set_ddi_clock_tiger_lake(DdiId::DDI_TC_6); |
| EXPECT_EQ(0b1001'0000'00000000'00000000'00000000u, transcoder_clock_select_a.reg_value()); |
| EXPECT_EQ(std::make_optional(DdiId::DDI_TC_6), transcoder_clock_select_a.ddi_clock_tiger_lake()); |
| } |
| |
| TEST(TranscoderClockSelectTest, GetForTranscoder) { |
| // The register MMIO addresses come from the reference manuals. |
| // |
| // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 page 1365 |
| // Kaby Lake: IHD-OS-KBL-Vol 2c-1.17 Part 2 page 947 |
| // Skylake: IHD-OS-SKL-Vol 2c-05.16 Part 2 page 922 |
| |
| auto transcoder_clock_select_a = |
| registers::TranscoderClockSelect::GetForTranscoder(TranscoderId::TRANSCODER_A).FromValue(0); |
| EXPECT_EQ(0x46140u, transcoder_clock_select_a.reg_addr()); |
| |
| auto transcoder_clock_select_b = |
| registers::TranscoderClockSelect::GetForTranscoder(TranscoderId::TRANSCODER_B).FromValue(0); |
| EXPECT_EQ(0x46144u, transcoder_clock_select_b.reg_addr()); |
| |
| auto transcoder_clock_select_c = |
| registers::TranscoderClockSelect::GetForTranscoder(TranscoderId::TRANSCODER_C).FromValue(0); |
| EXPECT_EQ(0x46148u, transcoder_clock_select_c.reg_addr()); |
| |
| // TODO(https://fxbug.dev/42060657): Add a test for transcoder D, when we support it. |
| // The MMIO address is 0x4614c. |
| } |
| |
| TEST(TranscoderDataMTest, PayloadSize) { |
| // The two mappings come from the "TU or VC payload Size" field description in |
| // the reference manuals. |
| // |
| // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 1 page 328 |
| // Kaby Lake: IHD-OS-KBL-Vol 2c-1.17 Part 1 pages 427-428 |
| // Skylake: IHD-OS-SKL-Vol 2c-05.16 Part 1 page 423 |
| // |
| auto data_m_a = |
| registers::TranscoderDataM::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_A).FromValue(0); |
| |
| data_m_a.set_reg_value(0); |
| data_m_a.set_payload_size(64); |
| EXPECT_EQ(63u, data_m_a.payload_size_select()); |
| EXPECT_EQ(64, data_m_a.payload_size()); |
| |
| data_m_a.set_reg_value(0); |
| data_m_a.set_payload_size(63); |
| EXPECT_EQ(62u, data_m_a.payload_size_select()); |
| EXPECT_EQ(63, data_m_a.payload_size()); |
| } |
| |
| TEST(TranscoderDataMTest, GetForKabyLakeTranscoder) { |
| // The register MMIO addresses come from the reference manuals. |
| // |
| // Kaby Lake: IHD-OS-KBL-Vol 2c-1.17 Part 1 page 427 |
| // Skylake: IHD-OS-SKL-Vol 2c-05.16 Part 1 page 422 |
| |
| auto data_m_a = |
| registers::TranscoderDataM::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_A).FromValue(0); |
| EXPECT_EQ(0x60030u, data_m_a.reg_addr()); |
| |
| auto data_m_b = |
| registers::TranscoderDataM::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_B).FromValue(0); |
| EXPECT_EQ(0x61030u, data_m_b.reg_addr()); |
| |
| auto data_m_c = |
| registers::TranscoderDataM::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_C).FromValue(0); |
| EXPECT_EQ(0x62030u, data_m_c.reg_addr()); |
| |
| auto data_m_edp = |
| registers::TranscoderDataM::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_EDP) |
| .FromValue(0); |
| EXPECT_EQ(0x6f030u, data_m_edp.reg_addr()); |
| } |
| |
| TEST(TranscoderDataMTest, GetForTigerLakeTranscoder) { |
| // The register MMIO addresses come from the reference manuals. |
| // |
| // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 1 page 328 |
| |
| auto data_m_a = registers::TranscoderDataM::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_A) |
| .FromValue(0); |
| EXPECT_EQ(0x60030u, data_m_a.reg_addr()); |
| |
| auto data_m_b = registers::TranscoderDataM::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_B) |
| .FromValue(0); |
| EXPECT_EQ(0x61030u, data_m_b.reg_addr()); |
| |
| auto data_m_c = registers::TranscoderDataM::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_C) |
| .FromValue(0); |
| EXPECT_EQ(0x62030u, data_m_c.reg_addr()); |
| |
| // TODO(https://fxbug.dev/42060657): Add a test for transcoder D, when we support it. |
| // The MMIO address is 0x63030. |
| } |
| |
| TEST(TranscoderDataNTest, GetForKabyLakeTranscoder) { |
| // The register MMIO addresses come from the reference manuals. |
| // |
| // Kaby Lake: IHD-OS-KBL-Vol 2c-1.17 Part 1 page 429 |
| // Skylake: IHD-OS-SKL-Vol 2c-05.16 Part 1 page 424 |
| |
| auto data_n_a = |
| registers::TranscoderDataN::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_A).FromValue(0); |
| EXPECT_EQ(0x60034u, data_n_a.reg_addr()); |
| |
| auto data_n_b = |
| registers::TranscoderDataN::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_B).FromValue(0); |
| EXPECT_EQ(0x61034u, data_n_b.reg_addr()); |
| |
| auto data_n_c = |
| registers::TranscoderDataN::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_C).FromValue(0); |
| EXPECT_EQ(0x62034u, data_n_c.reg_addr()); |
| |
| auto data_n_edp = |
| registers::TranscoderDataN::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_EDP) |
| .FromValue(0); |
| EXPECT_EQ(0x6f034u, data_n_edp.reg_addr()); |
| } |
| |
| TEST(TranscoderDataNTest, GetForTigerLakeTranscoder) { |
| // The register MMIO addresses come from the reference manuals. |
| // |
| // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 1 page 330 |
| |
| auto data_n_a = registers::TranscoderDataN::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_A) |
| .FromValue(0); |
| EXPECT_EQ(0x60034u, data_n_a.reg_addr()); |
| |
| auto data_n_b = registers::TranscoderDataN::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_B) |
| .FromValue(0); |
| EXPECT_EQ(0x61034u, data_n_b.reg_addr()); |
| |
| auto data_n_c = registers::TranscoderDataN::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_C) |
| .FromValue(0); |
| EXPECT_EQ(0x62034u, data_n_c.reg_addr()); |
| |
| // TODO(https://fxbug.dev/42060657): Add a test for transcoder D, when we support it. |
| // The MMIO address is 0x63034. |
| } |
| |
| TEST(TranscoderLinkMTest, GetForKabyLakeTranscoder) { |
| // The register MMIO addresses come from the reference manuals. |
| // |
| // Kaby Lake: IHD-OS-KBL-Vol 2c-1.17 Part 1 page 1123 |
| // Skylake: IHD-OS-SKL-Vol 2c-05.16 Part 1 page 1112 |
| |
| auto link_m_a = |
| registers::TranscoderLinkM::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_A).FromValue(0); |
| EXPECT_EQ(0x60040u, link_m_a.reg_addr()); |
| |
| auto link_m_b = |
| registers::TranscoderLinkM::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_B).FromValue(0); |
| EXPECT_EQ(0x61040u, link_m_b.reg_addr()); |
| |
| auto link_m_c = |
| registers::TranscoderLinkM::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_C).FromValue(0); |
| EXPECT_EQ(0x62040u, link_m_c.reg_addr()); |
| |
| auto link_m_edp = |
| registers::TranscoderLinkM::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_EDP) |
| .FromValue(0); |
| EXPECT_EQ(0x6f040u, link_m_edp.reg_addr()); |
| } |
| |
| TEST(TranscoderLinkMTest, GetForTigerLakeTranscoder) { |
| // The register MMIO addresses come from the reference manuals. |
| // |
| // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 1 page 1300 |
| |
| auto link_m_a = registers::TranscoderLinkM::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_A) |
| .FromValue(0); |
| EXPECT_EQ(0x60040u, link_m_a.reg_addr()); |
| |
| auto link_m_b = registers::TranscoderLinkM::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_B) |
| .FromValue(0); |
| EXPECT_EQ(0x61040u, link_m_b.reg_addr()); |
| |
| auto link_m_c = registers::TranscoderLinkM::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_C) |
| .FromValue(0); |
| EXPECT_EQ(0x62040u, link_m_c.reg_addr()); |
| |
| // TODO(https://fxbug.dev/42060657): Add a test for transcoder D, when we support it. |
| // The MMIO address is 0x63040. |
| } |
| |
| TEST(TranscoderLinkNTest, GetForKabyLakeTranscoder) { |
| // The register MMIO addresses come from the reference manuals. |
| // |
| // Kaby Lake: IHD-OS-KBL-Vol 2c-1.17 Part 1 page 1124 |
| // Skylake: IHD-OS-SKL-Vol 2c-05.16 Part 1 page 1114 |
| |
| auto link_n_a = |
| registers::TranscoderLinkN::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_A).FromValue(0); |
| EXPECT_EQ(0x60044u, link_n_a.reg_addr()); |
| |
| auto link_n_b = |
| registers::TranscoderLinkN::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_B).FromValue(0); |
| EXPECT_EQ(0x61044u, link_n_b.reg_addr()); |
| |
| auto link_n_c = |
| registers::TranscoderLinkN::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_C).FromValue(0); |
| EXPECT_EQ(0x62044u, link_n_c.reg_addr()); |
| |
| auto link_n_edp = |
| registers::TranscoderLinkN::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_EDP) |
| .FromValue(0); |
| EXPECT_EQ(0x6f044u, link_n_edp.reg_addr()); |
| } |
| |
| TEST(TranscoderLinkNTest, GetForTigerLakeTranscoder) { |
| // The register MMIO addresses come from the reference manuals. |
| // |
| // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 1 page 1301 |
| |
| auto link_n_a = registers::TranscoderLinkN::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_A) |
| .FromValue(0); |
| EXPECT_EQ(0x60044u, link_n_a.reg_addr()); |
| |
| auto link_n_b = registers::TranscoderLinkN::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_B) |
| .FromValue(0); |
| EXPECT_EQ(0x61044u, link_n_b.reg_addr()); |
| |
| auto link_n_c = registers::TranscoderLinkN::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_C) |
| .FromValue(0); |
| EXPECT_EQ(0x62044u, link_n_c.reg_addr()); |
| |
| // TODO(https://fxbug.dev/42060657): Add a test for transcoder D, when we support it. |
| // The MMIO address is 0x63044. |
| } |
| |
| TEST(TranscoderMainStreamAttributeMiscTest, GetForKabyLakeTranscoder) { |
| // The register MMIO addresses come from the reference manuals. |
| // |
| // Kaby Lake: IHD-OS-KBL-Vol 2c-1.17 Part 2 page 964 |
| // Skylake: IHD-OS-SKL-Vol 2c-05.16 Part 2 page 938 |
| |
| auto transcoder_main_stream_attribute_misc_a = |
| registers::TranscoderMainStreamAttributeMisc::GetForKabyLakeTranscoder( |
| TranscoderId::TRANSCODER_A) |
| .FromValue(0); |
| EXPECT_EQ(0x60410u, transcoder_main_stream_attribute_misc_a.reg_addr()); |
| |
| auto transcoder_main_stream_attribute_misc_b = |
| registers::TranscoderMainStreamAttributeMisc::GetForKabyLakeTranscoder( |
| TranscoderId::TRANSCODER_B) |
| .FromValue(0); |
| EXPECT_EQ(0x61410u, transcoder_main_stream_attribute_misc_b.reg_addr()); |
| |
| auto transcoder_main_stream_attribute_misc_c = |
| registers::TranscoderMainStreamAttributeMisc::GetForKabyLakeTranscoder( |
| TranscoderId::TRANSCODER_C) |
| .FromValue(0); |
| EXPECT_EQ(0x62410u, transcoder_main_stream_attribute_misc_c.reg_addr()); |
| |
| auto transcoder_main_stream_attribute_misc_edp = |
| registers::TranscoderMainStreamAttributeMisc::GetForKabyLakeTranscoder( |
| TranscoderId::TRANSCODER_EDP) |
| .FromValue(0); |
| EXPECT_EQ(0x6f410u, transcoder_main_stream_attribute_misc_edp.reg_addr()); |
| } |
| |
| TEST(TranscoderMainStreamAttributeMiscTest, GetForTigerLakeTranscoder) { |
| // The register MMIO addresses come from the reference manuals. |
| // |
| // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 pages 1394 |
| |
| auto transcoder_main_stream_attribute_misc_a = |
| registers::TranscoderMainStreamAttributeMisc::GetForTigerLakeTranscoder( |
| TranscoderId::TRANSCODER_A) |
| .FromValue(0); |
| EXPECT_EQ(0x60410u, transcoder_main_stream_attribute_misc_a.reg_addr()); |
| |
| auto transcoder_main_stream_attribute_misc_b = |
| registers::TranscoderMainStreamAttributeMisc::GetForTigerLakeTranscoder( |
| TranscoderId::TRANSCODER_B) |
| .FromValue(0); |
| EXPECT_EQ(0x61410u, transcoder_main_stream_attribute_misc_b.reg_addr()); |
| |
| auto transcoder_main_stream_attribute_misc_c = |
| registers::TranscoderMainStreamAttributeMisc::GetForTigerLakeTranscoder( |
| TranscoderId::TRANSCODER_C) |
| .FromValue(0); |
| EXPECT_EQ(0x62410u, transcoder_main_stream_attribute_misc_c.reg_addr()); |
| |
| // TODO(https://fxbug.dev/42060657): Add a test for transcoder D, when we support it. |
| // The MMIO address is 0x63410. |
| } |
| |
| TEST(TranscoderVariableRateRefreshControlTest, GetForTigerLakeTranscoder) { |
| // The register MMIO addresses come from the reference manual. |
| // |
| // Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 page 1406 |
| |
| auto transcoder_variable_rate_refresh_control_a = |
| registers::TranscoderVariableRateRefreshControl::GetForTigerLakeTranscoder( |
| TranscoderId::TRANSCODER_A) |
| .FromValue(0); |
| EXPECT_EQ(0x60420u, transcoder_variable_rate_refresh_control_a.reg_addr()); |
| |
| auto transcoder_variable_rate_refresh_control_b = |
| registers::TranscoderVariableRateRefreshControl::GetForTigerLakeTranscoder( |
| TranscoderId::TRANSCODER_B) |
| .FromValue(0); |
| EXPECT_EQ(0x61420u, transcoder_variable_rate_refresh_control_b.reg_addr()); |
| |
| auto transcoder_variable_rate_refresh_control_c = |
| registers::TranscoderVariableRateRefreshControl::GetForTigerLakeTranscoder( |
| TranscoderId::TRANSCODER_C) |
| .FromValue(0); |
| EXPECT_EQ(0x62420u, transcoder_variable_rate_refresh_control_c.reg_addr()); |
| |
| // TODO(https://fxbug.dev/42060657): Add a test for transcoder D, when we support it. |
| // The MMIO address is 0x63420. |
| } |
| |
| TEST(TranscoderChickenTest, GetForKabyLakeDdi) { |
| // The register MMIO addresses come from the Kaby Lake Workarounds description |
| // at IHD-OS-KBL-Vol 16-1.17 page 30. |
| // |
| // The registers used by DDIs A-D are not the same as the registers used by |
| // the transcoders A-D. This can be confirmed by cross-checking the |
| // workarounds with BSpec IDs 1143 and 1144, on pages 30-31. |
| |
| auto transcoder_chicken_a = |
| registers::TranscoderChicken::GetForKabyLakeDdi(DdiId::DDI_B).FromValue(0); |
| EXPECT_EQ(0x420c0u, transcoder_chicken_a.reg_addr()); |
| |
| auto transcoder_chicken_b = |
| registers::TranscoderChicken::GetForKabyLakeDdi(DdiId::DDI_C).FromValue(0); |
| EXPECT_EQ(0x420c4u, transcoder_chicken_b.reg_addr()); |
| |
| auto transcoder_chicken_c = |
| registers::TranscoderChicken::GetForKabyLakeDdi(DdiId::DDI_D).FromValue(0); |
| EXPECT_EQ(0x420c8u, transcoder_chicken_c.reg_addr()); |
| |
| auto transcoder_chicken_edp = |
| registers::TranscoderChicken::GetForKabyLakeDdi(DdiId::DDI_A).FromValue(0); |
| EXPECT_EQ(0x420ccu, transcoder_chicken_edp.reg_addr()); |
| } |
| |
| TEST(TranscoderChickenTest, GetForKabyLakeTranscoder) { |
| // The register MMIO addresses come from the Kaby Lake Workarounds description |
| // at IHD-OS-KBL-Vol 16-1.17 page 31. |
| |
| auto transcoder_chicken_a = |
| registers::TranscoderChicken::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_A) |
| .FromValue(0); |
| EXPECT_EQ(0x420c0u, transcoder_chicken_a.reg_addr()); |
| |
| auto transcoder_chicken_b = |
| registers::TranscoderChicken::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_B) |
| .FromValue(0); |
| EXPECT_EQ(0x420c4u, transcoder_chicken_b.reg_addr()); |
| |
| auto transcoder_chicken_c = |
| registers::TranscoderChicken::GetForKabyLakeTranscoder(TranscoderId::TRANSCODER_C) |
| .FromValue(0); |
| EXPECT_EQ(0x420c8u, transcoder_chicken_c.reg_addr()); |
| } |
| |
| TEST(TranscoderChickenTest, GetForTigerLakeTranscoder) { |
| // The register MMIO addresses come from the reference manual. |
| // |
| // Tiger Lake: IHD-OS-DG1-Vol 12-2.21 page 192 |
| |
| auto transcoder_chicken_a = |
| registers::TranscoderChicken::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_A) |
| .FromValue(0); |
| EXPECT_EQ(0x420c0u, transcoder_chicken_a.reg_addr()); |
| |
| auto transcoder_chicken_b = |
| registers::TranscoderChicken::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_B) |
| .FromValue(0); |
| EXPECT_EQ(0x420c4u, transcoder_chicken_b.reg_addr()); |
| |
| auto transcoder_chicken_c = |
| registers::TranscoderChicken::GetForTigerLakeTranscoder(TranscoderId::TRANSCODER_C) |
| .FromValue(0); |
| EXPECT_EQ(0x420c8u, transcoder_chicken_c.reg_addr()); |
| |
| // TODO(https://fxbug.dev/42060657): Add a test for transcoder D, when we support it. |
| // The MMIO address is 0x420d8. |
| } |
| |
| } // namespace |
| |
| } // namespace i915 |