blob: 7136e33b632fd8775de8ae72385af82944efd6fd [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/fuse-config.h"
#include <lib/mmio/mmio.h>
#include <cstdint>
#include <gtest/gtest.h>
#include <mock-mmio-range/mock-mmio-range.h>
#include "src/graphics/display/drivers/intel-i915/registers.h"
namespace i915 {
namespace {
class FuseConfigTest : public ::testing::Test {
public:
FuseConfigTest() = default;
~FuseConfigTest() override = default;
void TearDown() override { mmio_range_.CheckAllAccessesReplayed(); }
protected:
constexpr static int kMmioRangeSize = 0x60000;
ddk_mock::MockMmioRange mmio_range_{kMmioRangeSize, ddk_mock::MockMmioRange::Size::k32};
fdf::MmioBuffer mmio_buffer_{mmio_range_.GetMmioBuffer()};
};
TEST_F(FuseConfigTest, TigerLakeDefault) {
// Tiger Lake: IHD-OS-TGL-Vol 2c-12.21 Part 1 pages 432-434
constexpr int kDfsmOffset = 0x51000;
constexpr int kNuc11GpuDeviceId = 0x9a49;
mmio_range_.Expect({.address = kDfsmOffset, .value = 0});
FuseConfig fuse_config = FuseConfig::ReadFrom(mmio_buffer_, kNuc11GpuDeviceId);
EXPECT_EQ(652'800, fuse_config.core_clock_limit_khz);
EXPECT_EQ(true, fuse_config.graphics_enabled);
EXPECT_EQ(true, fuse_config.pipe_enabled[0]);
EXPECT_EQ(true, fuse_config.pipe_enabled[1]);
EXPECT_EQ(true, fuse_config.pipe_enabled[2]);
EXPECT_EQ(true, fuse_config.pipe_enabled[3]);
EXPECT_EQ(true, fuse_config.edp_enabled);
EXPECT_EQ(true, fuse_config.display_capture_enabled);
EXPECT_EQ(true, fuse_config.display_stream_compression_enabled);
EXPECT_EQ(true, fuse_config.frame_buffer_compression_enabled);
EXPECT_EQ(true, fuse_config.display_power_savings_enabled);
}
TEST_F(FuseConfigTest, TigerLakeAllFusesBlown) {
// Tiger Lake: IHD-OS-TGL-Vol 2c-12.21 Part 1 pages 432-434
constexpr int kDfsmOffset = 0x51000;
constexpr int kNuc11GpuDeviceId = 0x9a49;
mmio_range_.Expect({.address = kDfsmOffset, .value = 0xffffffff});
FuseConfig fuse_config = FuseConfig::ReadFrom(mmio_buffer_, kNuc11GpuDeviceId);
EXPECT_EQ(652'800, fuse_config.core_clock_limit_khz);
EXPECT_EQ(true, fuse_config.graphics_enabled);
EXPECT_EQ(false, fuse_config.pipe_enabled[0]);
EXPECT_EQ(false, fuse_config.pipe_enabled[1]);
EXPECT_EQ(false, fuse_config.pipe_enabled[2]);
EXPECT_EQ(false, fuse_config.pipe_enabled[3]);
EXPECT_EQ(false, fuse_config.edp_enabled);
EXPECT_EQ(false, fuse_config.display_capture_enabled);
EXPECT_EQ(false, fuse_config.display_stream_compression_enabled);
EXPECT_EQ(false, fuse_config.frame_buffer_compression_enabled);
EXPECT_EQ(false, fuse_config.display_power_savings_enabled);
}
TEST_F(FuseConfigTest, KabyLakeDefault) {
// Tiger Lake: IHD-OS-KBL-Vol 2c-1.17 Part 1 pages 497-499
constexpr int kDfsmOffset = 0x51000;
constexpr int kAtlasGpuDeviceId = 0x591c;
mmio_range_.Expect({.address = kDfsmOffset, .value = 0});
FuseConfig fuse_config = FuseConfig::ReadFrom(mmio_buffer_, kAtlasGpuDeviceId);
EXPECT_EQ(675'000, fuse_config.core_clock_limit_khz);
EXPECT_EQ(true, fuse_config.graphics_enabled);
EXPECT_EQ(true, fuse_config.pipe_enabled[0]);
EXPECT_EQ(true, fuse_config.pipe_enabled[1]);
EXPECT_EQ(true, fuse_config.pipe_enabled[2]);
EXPECT_EQ(false, fuse_config.pipe_enabled[3]);
EXPECT_EQ(true, fuse_config.edp_enabled);
EXPECT_EQ(true, fuse_config.display_capture_enabled);
EXPECT_EQ(true, fuse_config.display_stream_compression_enabled);
EXPECT_EQ(true, fuse_config.frame_buffer_compression_enabled);
EXPECT_EQ(true, fuse_config.display_power_savings_enabled);
}
TEST_F(FuseConfigTest, KabyLakeAllFusesBlown) {
// Tiger Lake: IHD-OS-KBL-Vol 2c-1.17 Part 1 pages 497-499
constexpr int kDfsmOffset = 0x51000;
constexpr int kAtlasGpuDeviceId = 0x591c;
mmio_range_.Expect({.address = kDfsmOffset, .value = 0xffffffff});
FuseConfig fuse_config = FuseConfig::ReadFrom(mmio_buffer_, kAtlasGpuDeviceId);
EXPECT_EQ(337'500, fuse_config.core_clock_limit_khz);
EXPECT_EQ(false, fuse_config.graphics_enabled);
EXPECT_EQ(false, fuse_config.pipe_enabled[0]);
EXPECT_EQ(false, fuse_config.pipe_enabled[1]);
EXPECT_EQ(false, fuse_config.pipe_enabled[2]);
EXPECT_EQ(false, fuse_config.pipe_enabled[3]);
EXPECT_EQ(false, fuse_config.edp_enabled);
EXPECT_EQ(false, fuse_config.display_capture_enabled);
EXPECT_EQ(true, fuse_config.display_stream_compression_enabled);
EXPECT_EQ(false, fuse_config.frame_buffer_compression_enabled);
EXPECT_EQ(false, fuse_config.display_power_savings_enabled);
}
} // namespace
} // namespace i915