blob: 992143eedab061225d77436fa9642a954ccd3fc6 [file] [log] [blame]
// 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-arbiter.h"
#include <gtest/gtest.h>
#include <hwreg/bitfields.h>
#include "src/graphics/display/drivers/intel-i915/hardware-common.h"
namespace i915 {
namespace {
TEST(ArbitrationControlTest, HighPriorityQueueWatermark) {
auto arb_ctl = registers::ArbitrationControl::GetForArbiter(0).FromValue(0);
// Example from the the reference manuals.
//
// Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 1 page 51
// DG1: IHD-OS-DG1-Vol 2c-2.21 Part 1 page 13
arb_ctl.set_reg_value(0).set_high_priority_queue_watermark(4);
EXPECT_EQ(3u, arb_ctl.high_priority_queue_watermark_bits());
EXPECT_EQ(4, arb_ctl.high_priority_queue_watermark());
// Edge cases to catch any undefined behavior.
arb_ctl.set_reg_value(0).set_high_priority_queue_watermark(1);
EXPECT_EQ(0u, arb_ctl.high_priority_queue_watermark_bits());
EXPECT_EQ(1, arb_ctl.high_priority_queue_watermark());
arb_ctl.set_reg_value(0).set_high_priority_queue_watermark(2);
EXPECT_EQ(1u, arb_ctl.high_priority_queue_watermark_bits());
EXPECT_EQ(2, arb_ctl.high_priority_queue_watermark());
arb_ctl.set_reg_value(0).set_high_priority_queue_watermark(7);
EXPECT_EQ(6u, arb_ctl.high_priority_queue_watermark_bits());
EXPECT_EQ(7, arb_ctl.high_priority_queue_watermark());
arb_ctl.set_reg_value(0).set_high_priority_queue_watermark(8);
EXPECT_EQ(7u, arb_ctl.high_priority_queue_watermark_bits());
EXPECT_EQ(8, arb_ctl.high_priority_queue_watermark());
}
TEST(ArbitrationControlTest, LowPriorityBackToBackRequestLimit) {
auto arb_ctl = registers::ArbitrationControl::GetForArbiter(0).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 1 page 51
// DG1: IHD-OS-DG1-Vol 2c-2.21 Part 1 page 13
arb_ctl.set_reg_value(0).set_low_priority_back_to_back_request_limit(1);
EXPECT_EQ(0u, arb_ctl.low_priority_back_to_back_request_limit_bits());
EXPECT_EQ(1, arb_ctl.low_priority_back_to_back_request_limit());
arb_ctl.set_reg_value(0).set_low_priority_back_to_back_request_limit(2);
EXPECT_EQ(1u, arb_ctl.low_priority_back_to_back_request_limit_bits());
EXPECT_EQ(2, arb_ctl.low_priority_back_to_back_request_limit());
arb_ctl.set_reg_value(0).set_low_priority_back_to_back_request_limit(4);
EXPECT_EQ(2u, arb_ctl.low_priority_back_to_back_request_limit_bits());
EXPECT_EQ(4, arb_ctl.low_priority_back_to_back_request_limit());
arb_ctl.set_reg_value(0).set_low_priority_back_to_back_request_limit(8);
EXPECT_EQ(3u, arb_ctl.low_priority_back_to_back_request_limit_bits());
EXPECT_EQ(8, arb_ctl.low_priority_back_to_back_request_limit());
}
TEST(ArbitrationControlTest, GetForArbiter) {
// The register MMIO addresses come from the reference manuals.
//
// Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 1 page 51
// DG1: IHD-OS-DG1-Vol 2c-2.21 Part 1 page 13
auto arb_ctl = registers::ArbitrationControl::GetForArbiter(0).FromValue(0);
EXPECT_EQ(0x45000u, arb_ctl.reg_addr());
auto arb_ctl_abox1 = registers::ArbitrationControl::GetForArbiter(1).FromValue(0);
EXPECT_EQ(0x45800u, arb_ctl_abox1.reg_addr());
auto arb_ctl_abox2 = registers::ArbitrationControl::GetForArbiter(2).FromValue(0);
EXPECT_EQ(0x45808u, arb_ctl_abox2.reg_addr());
}
TEST(ArbitrationControl2Test, DisplayCaptureWriteRequestLimit) {
auto arb_ctl2 = registers::ArbitrationControl2::GetForArbiter(0).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 1 page 54
// DG1: IHD-OS-DG1-Vol 2c-2.21 Part 1 page 16
arb_ctl2.set_reg_value(0).set_display_capture_write_request_limit(1);
EXPECT_EQ(0u, arb_ctl2.display_capture_write_request_limit_bits());
EXPECT_EQ(1, arb_ctl2.display_capture_write_request_limit());
arb_ctl2.set_reg_value(0).set_display_capture_write_request_limit(2);
EXPECT_EQ(1u, arb_ctl2.display_capture_write_request_limit_bits());
EXPECT_EQ(2, arb_ctl2.display_capture_write_request_limit());
arb_ctl2.set_reg_value(0).set_display_capture_write_request_limit(4);
EXPECT_EQ(2u, arb_ctl2.display_capture_write_request_limit_bits());
EXPECT_EQ(4, arb_ctl2.display_capture_write_request_limit());
arb_ctl2.set_reg_value(0).set_display_capture_write_request_limit(8);
EXPECT_EQ(3u, arb_ctl2.display_capture_write_request_limit_bits());
EXPECT_EQ(8, arb_ctl2.display_capture_write_request_limit());
}
TEST(ArbitrationControl2Test, DisplayStateBufferWriteRequestLimitTigerLake) {
auto arb_ctl2 = registers::ArbitrationControl2::GetForArbiter(0).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 1 page 54
// DG1: IHD-OS-DG1-Vol 2c-2.21 Part 1 page 16
arb_ctl2.set_reg_value(0).set_display_state_buffer_write_request_limit_tiger_lake(1);
EXPECT_EQ(0u, arb_ctl2.display_state_buffer_write_request_limit_tiger_lake_bits());
EXPECT_EQ(1, arb_ctl2.display_state_buffer_write_request_limit_tiger_lake());
arb_ctl2.set_reg_value(0).set_display_state_buffer_write_request_limit_tiger_lake(2);
EXPECT_EQ(1u, arb_ctl2.display_state_buffer_write_request_limit_tiger_lake_bits());
EXPECT_EQ(2, arb_ctl2.display_state_buffer_write_request_limit_tiger_lake());
arb_ctl2.set_reg_value(0).set_display_state_buffer_write_request_limit_tiger_lake(4);
EXPECT_EQ(2u, arb_ctl2.display_state_buffer_write_request_limit_tiger_lake_bits());
EXPECT_EQ(4, arb_ctl2.display_state_buffer_write_request_limit_tiger_lake());
arb_ctl2.set_reg_value(0).set_display_state_buffer_write_request_limit_tiger_lake(8);
EXPECT_EQ(3u, arb_ctl2.display_state_buffer_write_request_limit_tiger_lake_bits());
EXPECT_EQ(8, arb_ctl2.display_state_buffer_write_request_limit_tiger_lake());
}
TEST(ArbitrationControl2Test, Par5RequestLimitTigerLake) {
auto arb_ctl2 = registers::ArbitrationControl2::GetForArbiter(0).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 1 page 55
// DG1: IHD-OS-DG1-Vol 2c-2.21 Part 1 page 17
arb_ctl2.set_reg_value(0).set_par5_request_limit_tiger_lake(1);
EXPECT_EQ(0u, arb_ctl2.par5_request_limit_tiger_lake_bits());
EXPECT_EQ(1, arb_ctl2.par5_request_limit_tiger_lake());
arb_ctl2.set_reg_value(0).set_par5_request_limit_tiger_lake(2);
EXPECT_EQ(1u, arb_ctl2.par5_request_limit_tiger_lake_bits());
EXPECT_EQ(2, arb_ctl2.par5_request_limit_tiger_lake());
arb_ctl2.set_reg_value(0).set_par5_request_limit_tiger_lake(4);
EXPECT_EQ(2u, arb_ctl2.par5_request_limit_tiger_lake_bits());
EXPECT_EQ(4, arb_ctl2.par5_request_limit_tiger_lake());
arb_ctl2.set_reg_value(0).set_par5_request_limit_tiger_lake(16);
EXPECT_EQ(3u, arb_ctl2.par5_request_limit_tiger_lake_bits());
EXPECT_EQ(16, arb_ctl2.par5_request_limit_tiger_lake());
}
TEST(ArbitrationControl2Test, FrameBufferCompressionRequestLimitTigerLake) {
auto arb_ctl2 = registers::ArbitrationControl2::GetForArbiter(0).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 1 page 55
// DG1: IHD-OS-DG1-Vol 2c-2.21 Part 1 page 17
arb_ctl2.set_reg_value(0).set_framebuffer_compression_request_limit_tiger_lake(1);
EXPECT_EQ(0u, arb_ctl2.framebuffer_compression_request_limit_tiger_lake_bits());
EXPECT_EQ(1, arb_ctl2.framebuffer_compression_request_limit_tiger_lake());
arb_ctl2.set_reg_value(0).set_framebuffer_compression_request_limit_tiger_lake(2);
EXPECT_EQ(1u, arb_ctl2.framebuffer_compression_request_limit_tiger_lake_bits());
EXPECT_EQ(2, arb_ctl2.framebuffer_compression_request_limit_tiger_lake());
arb_ctl2.set_reg_value(0).set_framebuffer_compression_request_limit_tiger_lake(4);
EXPECT_EQ(2u, arb_ctl2.framebuffer_compression_request_limit_tiger_lake_bits());
EXPECT_EQ(4, arb_ctl2.framebuffer_compression_request_limit_tiger_lake());
arb_ctl2.set_reg_value(0).set_framebuffer_compression_request_limit_tiger_lake(8);
EXPECT_EQ(3u, arb_ctl2.framebuffer_compression_request_limit_tiger_lake_bits());
EXPECT_EQ(8, arb_ctl2.framebuffer_compression_request_limit_tiger_lake());
}
TEST(ArbitrationControl2Test, MaxInflightLowPriorityReadRequestsTigerLake) {
auto arb_ctl2 = registers::ArbitrationControl2::GetForArbiter(0).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 1 page 56
// DG1: IHD-OS-DG1-Vol 2c-2.21 Part 1 page 18
arb_ctl2.set_reg_value(0).set_max_inflight_low_priority_read_requests(1);
EXPECT_EQ(0u, arb_ctl2.max_inflight_low_priority_read_requests_bits());
EXPECT_EQ(1, arb_ctl2.max_inflight_low_priority_read_requests());
arb_ctl2.set_reg_value(0).set_max_inflight_low_priority_read_requests(2);
EXPECT_EQ(1u, arb_ctl2.max_inflight_low_priority_read_requests_bits());
EXPECT_EQ(2, arb_ctl2.max_inflight_low_priority_read_requests());
arb_ctl2.set_reg_value(0).set_max_inflight_low_priority_read_requests(3);
EXPECT_EQ(2u, arb_ctl2.max_inflight_low_priority_read_requests_bits());
EXPECT_EQ(3, arb_ctl2.max_inflight_low_priority_read_requests());
arb_ctl2.set_reg_value(0).set_max_inflight_low_priority_read_requests(4);
EXPECT_EQ(3u, arb_ctl2.max_inflight_low_priority_read_requests_bits());
EXPECT_EQ(4, arb_ctl2.max_inflight_low_priority_read_requests());
}
TEST(ArbitrationControl2Test, MaxInflightHighPriorityReadRequestsTigerLake) {
auto arb_ctl2 = registers::ArbitrationControl2::GetForArbiter(0).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 1 page 56
// DG1: IHD-OS-DG1-Vol 2c-2.21 Part 1 page 18
arb_ctl2.set_reg_value(0).set_max_inflight_high_priority_read_requests(128);
EXPECT_EQ(0u, arb_ctl2.max_inflight_high_priority_read_requests_bits());
EXPECT_EQ(128, arb_ctl2.max_inflight_high_priority_read_requests());
arb_ctl2.set_reg_value(0).set_max_inflight_high_priority_read_requests(64);
EXPECT_EQ(1u, arb_ctl2.max_inflight_high_priority_read_requests_bits());
EXPECT_EQ(64, arb_ctl2.max_inflight_high_priority_read_requests());
arb_ctl2.set_reg_value(0).set_max_inflight_high_priority_read_requests(32);
EXPECT_EQ(2u, arb_ctl2.max_inflight_high_priority_read_requests_bits());
EXPECT_EQ(32, arb_ctl2.max_inflight_high_priority_read_requests());
arb_ctl2.set_reg_value(0).set_max_inflight_high_priority_read_requests(16);
EXPECT_EQ(3u, arb_ctl2.max_inflight_high_priority_read_requests_bits());
EXPECT_EQ(16, arb_ctl2.max_inflight_high_priority_read_requests());
}
TEST(ArbitrationControl2Test, RequestTransactionIdQueueWatermarkTigerLake) {
auto arb_ctl2 = registers::ArbitrationControl2::GetForArbiter(0).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 1 page 56
// DG1: IHD-OS-DG1-Vol 2c-2.21 Part 1 page 18
arb_ctl2.set_reg_value(0).set_request_transaction_id_queue_watermark(8);
EXPECT_EQ(0u, arb_ctl2.request_transaction_id_queue_watermark_bits());
EXPECT_EQ(8, arb_ctl2.request_transaction_id_queue_watermark());
arb_ctl2.set_reg_value(0).set_request_transaction_id_queue_watermark(16);
EXPECT_EQ(1u, arb_ctl2.request_transaction_id_queue_watermark_bits());
EXPECT_EQ(16, arb_ctl2.request_transaction_id_queue_watermark());
arb_ctl2.set_reg_value(0).set_request_transaction_id_queue_watermark(32);
EXPECT_EQ(2u, arb_ctl2.request_transaction_id_queue_watermark_bits());
EXPECT_EQ(32, arb_ctl2.request_transaction_id_queue_watermark());
}
TEST(ArbitrationControl2Test, GetForArbiter) {
// The register MMIO addresses come from the reference manuals.
//
// Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 1 page 54
// DG1: IHD-OS-DG1-Vol 2c-2.21 Part 1 page 16
auto arb_ctl2 = registers::ArbitrationControl2::GetForArbiter(0).FromValue(0);
EXPECT_EQ(0x45004u, arb_ctl2.reg_addr());
auto arb_ctl2_abox1 = registers::ArbitrationControl2::GetForArbiter(1).FromValue(0);
EXPECT_EQ(0x45804u, arb_ctl2_abox1.reg_addr());
auto arb_ctl2_abox2 = registers::ArbitrationControl2::GetForArbiter(2).FromValue(0);
EXPECT_EQ(0x4580cu, arb_ctl2_abox2.reg_addr());
}
TEST(BandwidthBuddyControl, GetForArbiter) {
// The register MMIO addresses come from the reference manuals.
//
// Rocket Lake: IHD-OS-RKL-Vol 2-7.22 page 30
// Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 1 page 171
// DG1: IHD-OS-DG1-Vol 2c-2.21 Part 1 page 136
auto bw_buddy0_ctl = registers::BandwidthBuddyControl::GetForArbiter(0).FromValue(0);
EXPECT_EQ(0x45130u, bw_buddy0_ctl.reg_addr());
auto bw_buddy1_ctl = registers::BandwidthBuddyControl::GetForArbiter(1).FromValue(0);
EXPECT_EQ(0x45140u, bw_buddy1_ctl.reg_addr());
auto bw_buddy2_ctl = registers::BandwidthBuddyControl::GetForArbiter(2).FromValue(0);
EXPECT_EQ(0x45150u, bw_buddy2_ctl.reg_addr());
}
TEST(BandwidthBuddyPageMask, GetForArbiter) {
// The register MMIO addresses come from the reference manuals.
//
// Rocket Lake: IHD-OS-RKL-Vol 2-7.22 page 32
// Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 1 page 173
// DG1: IHD-OS-DG1-Vol 2c-2.21 Part 1 page 138
auto bw_buddy0_page_mask = registers::BandwidthBuddyPageMask::GetForArbiter(0).FromValue(0);
EXPECT_EQ(0x45134u, bw_buddy0_page_mask.reg_addr());
auto bw_buddy1_page_mask = registers::BandwidthBuddyPageMask::GetForArbiter(1).FromValue(0);
EXPECT_EQ(0x45144u, bw_buddy1_page_mask.reg_addr());
auto bw_buddy2_page_mask = registers::BandwidthBuddyPageMask::GetForArbiter(2).FromValue(0);
EXPECT_EQ(0x45154u, bw_buddy2_page_mask.reg_addr());
}
TEST(MbusArbiterBoxControlTest, GetForArbiter) {
// The register MMIO addresses come from the reference manuals.
//
// Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 page 8
// DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 page 8
auto mbus_abox_ctl = registers::MbusArbiterBoxControl::GetForArbiter(0).FromValue(0);
EXPECT_EQ(0x45038u, mbus_abox_ctl.reg_addr());
auto mbus_abox1_ctl = registers::MbusArbiterBoxControl::GetForArbiter(1).FromValue(0);
EXPECT_EQ(0x45048u, mbus_abox1_ctl.reg_addr());
auto mbus_abox2_ctl = registers::MbusArbiterBoxControl::GetForArbiter(2).FromValue(0);
EXPECT_EQ(0x4504cu, mbus_abox2_ctl.reg_addr());
}
TEST(MbusDisplayBufferBoxControlTest, GetForSlice) {
// The register MMIO addresses come from the reference manuals.
//
// Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 page 10
// DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 page 10
auto mbus_bbox_ctl_s1 = registers::MbusDisplayBufferBoxControl::GetForSlice(0).FromValue(0);
EXPECT_EQ(0x45040u, mbus_bbox_ctl_s1.reg_addr());
auto mbus_bbox_ctl_s2 = registers::MbusDisplayBufferBoxControl::GetForSlice(1).FromValue(0);
EXPECT_EQ(0x45044u, mbus_bbox_ctl_s2.reg_addr());
}
TEST(MbusPipeDataBoxControlTest, GetForPipe) {
// The register MMIO addresses come from the reference manuals.
//
// Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 page 12
// DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 page 12
auto pipe_mbus_dbox_ctl_a =
registers::MbusPipeDataBoxControl::GetForPipe(PipeId::PIPE_A).FromValue(0);
EXPECT_EQ(0x7003cu, pipe_mbus_dbox_ctl_a.reg_addr());
auto pipe_mbus_dbox_ctl_b =
registers::MbusPipeDataBoxControl::GetForPipe(PipeId::PIPE_B).FromValue(0);
EXPECT_EQ(0x7103cu, pipe_mbus_dbox_ctl_b.reg_addr());
auto pipe_mbus_dbox_ctl_c =
registers::MbusPipeDataBoxControl::GetForPipe(PipeId::PIPE_C).FromValue(0);
EXPECT_EQ(0x7203cu, pipe_mbus_dbox_ctl_c.reg_addr());
// TODO(https://fxbug.dev/42060657): Add a test for pipe D, when we support it.
// The MMIO address is 0x7303c.
}
TEST(PipeArbiterControlTest, DisplayStreamBufferArbitrationInterval) {
auto pipe_arb_ctl_a = registers::PipeArbiterControl::GetForPipe(PipeId::PIPE_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 1 page 670
// DG1: IHD-OS-DG1-Vol 2c-2.21 Part 1 page 670
pipe_arb_ctl_a.set_reg_value(0).set_display_stream_buffer_arbitration_interval(16);
EXPECT_EQ(0u, pipe_arb_ctl_a.display_stream_buffer_arbitration_interval_bits());
EXPECT_EQ(16, pipe_arb_ctl_a.display_stream_buffer_arbitration_interval());
pipe_arb_ctl_a.set_reg_value(0).set_display_stream_buffer_arbitration_interval(32);
EXPECT_EQ(1u, pipe_arb_ctl_a.display_stream_buffer_arbitration_interval_bits());
EXPECT_EQ(32, pipe_arb_ctl_a.display_stream_buffer_arbitration_interval());
pipe_arb_ctl_a.set_reg_value(0).set_display_stream_buffer_arbitration_interval(64);
EXPECT_EQ(2u, pipe_arb_ctl_a.display_stream_buffer_arbitration_interval_bits());
EXPECT_EQ(64, pipe_arb_ctl_a.display_stream_buffer_arbitration_interval());
pipe_arb_ctl_a.set_reg_value(0).set_display_stream_buffer_arbitration_interval(128);
EXPECT_EQ(3u, pipe_arb_ctl_a.display_stream_buffer_arbitration_interval_bits());
EXPECT_EQ(128, pipe_arb_ctl_a.display_stream_buffer_arbitration_interval());
}
TEST(PipeArbiterControlTest, DisplayBufferRequestsPerStreamerRequest) {
auto pipe_arb_ctl_a = registers::PipeArbiterControl::GetForPipe(PipeId::PIPE_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 1 page 670
// DG1: IHD-OS-DG1-Vol 2c-2.21 Part 1 page 670
pipe_arb_ctl_a.set_reg_value(0).set_display_buffer_requests_per_streamer_request(2);
EXPECT_EQ(0u, pipe_arb_ctl_a.display_buffer_requests_per_streamer_request_bits());
EXPECT_EQ(2, pipe_arb_ctl_a.display_buffer_requests_per_streamer_request());
pipe_arb_ctl_a.set_reg_value(0).set_display_buffer_requests_per_streamer_request(4);
EXPECT_EQ(1u, pipe_arb_ctl_a.display_buffer_requests_per_streamer_request_bits());
EXPECT_EQ(4, pipe_arb_ctl_a.display_buffer_requests_per_streamer_request());
pipe_arb_ctl_a.set_reg_value(0).set_display_buffer_requests_per_streamer_request(8);
EXPECT_EQ(2u, pipe_arb_ctl_a.display_buffer_requests_per_streamer_request_bits());
EXPECT_EQ(8, pipe_arb_ctl_a.display_buffer_requests_per_streamer_request());
pipe_arb_ctl_a.set_reg_value(0).set_display_buffer_requests_per_streamer_request(16);
EXPECT_EQ(3u, pipe_arb_ctl_a.display_buffer_requests_per_streamer_request_bits());
EXPECT_EQ(16, pipe_arb_ctl_a.display_buffer_requests_per_streamer_request());
}
TEST(PipeArbiterControlTest, GetForPipe) {
// The register MMIO addresses come from the reference manuals.
//
// Tiger Lake: IHD-OS-TGL-Vol 2c-1.22-Rev2.0 Part 2 page 669
// DG1: IHD-OS-DG1-Vol 2c-2.21 Part 2 page 669
auto pipe_arb_ctl_a = registers::PipeArbiterControl::GetForPipe(PipeId::PIPE_A).FromValue(0);
EXPECT_EQ(0x70028u, pipe_arb_ctl_a.reg_addr());
auto pipe_arb_ctl_b = registers::PipeArbiterControl::GetForPipe(PipeId::PIPE_B).FromValue(0);
EXPECT_EQ(0x71028u, pipe_arb_ctl_b.reg_addr());
auto pipe_arb_ctl_c = registers::PipeArbiterControl::GetForPipe(PipeId::PIPE_C).FromValue(0);
EXPECT_EQ(0x72028u, pipe_arb_ctl_c.reg_addr());
// TODO(https://fxbug.dev/42060657): Add a test for pipe D, when we support it.
// The MMIO address is 0x73028.
}
} // namespace
} // namespace i915