blob: af0342bfeba6b3234d79f5e019c5999504f4e8b0 [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-display/i2c/gmbus-gpio.h"
#include <lib/driver/testing/cpp/scoped_global_logger.h>
#include <gtest/gtest.h>
#include "src/graphics/display/drivers/intel-display/hardware-common.h"
namespace intel_display {
namespace {
class GMBusPinPairTest : public ::testing::Test {
private:
fdf_testing::ScopedGlobalLogger logger_;
};
TEST_F(GMBusPinPairTest, GetForDdi_TigerLake) {
constexpr auto kTigerLake = registers::Platform::kTigerLake;
{
std::optional<GMBusPinPair> pin_pair = GMBusPinPair::GetForDdi(DdiId::DDI_A, kTigerLake);
ASSERT_TRUE(pin_pair.has_value());
EXPECT_EQ(pin_pair->number(), 0b0001);
EXPECT_EQ(pin_pair->ddi_id(), DdiId::DDI_A);
}
{
std::optional<GMBusPinPair> pin_pair = GMBusPinPair::GetForDdi(DdiId::DDI_B, kTigerLake);
ASSERT_TRUE(pin_pair.has_value());
EXPECT_EQ(pin_pair->number(), 0b0010);
EXPECT_EQ(pin_pair->ddi_id(), DdiId::DDI_B);
}
{
std::optional<GMBusPinPair> pin_pair = GMBusPinPair::GetForDdi(DdiId::DDI_C, kTigerLake);
ASSERT_TRUE(pin_pair.has_value());
EXPECT_EQ(pin_pair->number(), 0b0011);
EXPECT_EQ(pin_pair->ddi_id(), DdiId::DDI_C);
}
{
std::optional<GMBusPinPair> pin_pair = GMBusPinPair::GetForDdi(DdiId::DDI_TC_1, kTigerLake);
ASSERT_TRUE(pin_pair.has_value());
EXPECT_EQ(pin_pair->number(), 0b1001);
EXPECT_EQ(pin_pair->ddi_id(), DdiId::DDI_TC_1);
}
{
std::optional<GMBusPinPair> pin_pair = GMBusPinPair::GetForDdi(DdiId::DDI_TC_2, kTigerLake);
ASSERT_TRUE(pin_pair.has_value());
EXPECT_EQ(pin_pair->number(), 0b1010);
EXPECT_EQ(pin_pair->ddi_id(), DdiId::DDI_TC_2);
}
{
std::optional<GMBusPinPair> pin_pair = GMBusPinPair::GetForDdi(DdiId::DDI_TC_3, kTigerLake);
ASSERT_TRUE(pin_pair.has_value());
EXPECT_EQ(pin_pair->number(), 0b1011);
EXPECT_EQ(pin_pair->ddi_id(), DdiId::DDI_TC_3);
}
{
std::optional<GMBusPinPair> pin_pair = GMBusPinPair::GetForDdi(DdiId::DDI_TC_4, kTigerLake);
ASSERT_TRUE(pin_pair.has_value());
EXPECT_EQ(pin_pair->number(), 0b1100);
EXPECT_EQ(pin_pair->ddi_id(), DdiId::DDI_TC_4);
}
{
std::optional<GMBusPinPair> pin_pair = GMBusPinPair::GetForDdi(DdiId::DDI_TC_5, kTigerLake);
ASSERT_TRUE(pin_pair.has_value());
EXPECT_EQ(pin_pair->number(), 0b1101);
EXPECT_EQ(pin_pair->ddi_id(), DdiId::DDI_TC_5);
}
{
std::optional<GMBusPinPair> pin_pair = GMBusPinPair::GetForDdi(DdiId::DDI_TC_6, kTigerLake);
ASSERT_TRUE(pin_pair.has_value());
EXPECT_EQ(pin_pair->number(), 0b1110);
EXPECT_EQ(pin_pair->ddi_id(), DdiId::DDI_TC_6);
}
}
TEST_F(GMBusPinPairTest, GetForDdi_Skylake) {
constexpr auto kSkylake = registers::Platform::kSkylake;
{
std::optional<GMBusPinPair> pin_pair = GMBusPinPair::GetForDdi(DdiId::DDI_A, kSkylake);
ASSERT_FALSE(pin_pair.has_value());
}
{
std::optional<GMBusPinPair> pin_pair = GMBusPinPair::GetForDdi(DdiId::DDI_B, kSkylake);
ASSERT_TRUE(pin_pair.has_value());
EXPECT_EQ(pin_pair->number(), 0b0101);
EXPECT_EQ(pin_pair->ddi_id(), DdiId::DDI_B);
}
{
std::optional<GMBusPinPair> pin_pair = GMBusPinPair::GetForDdi(DdiId::DDI_C, kSkylake);
ASSERT_TRUE(pin_pair.has_value());
EXPECT_EQ(pin_pair->number(), 0b0100);
EXPECT_EQ(pin_pair->ddi_id(), DdiId::DDI_C);
}
{
std::optional<GMBusPinPair> pin_pair = GMBusPinPair::GetForDdi(DdiId::DDI_D, kSkylake);
ASSERT_TRUE(pin_pair.has_value());
EXPECT_EQ(pin_pair->number(), 0b0110);
EXPECT_EQ(pin_pair->ddi_id(), DdiId::DDI_D);
}
{
std::optional<GMBusPinPair> pin_pair = GMBusPinPair::GetForDdi(DdiId::DDI_E, kSkylake);
ASSERT_FALSE(pin_pair.has_value());
}
for (const DdiId invalid_ddi :
{DdiId::DDI_TC_3, DdiId::DDI_TC_4, DdiId::DDI_TC_5, DdiId::DDI_TC_6}) {
EXPECT_DEATH_IF_SUPPORTED({ GMBusPinPair::GetForDdi(invalid_ddi, kSkylake); }, "Invalid");
}
}
TEST_F(GMBusPinPairTest, HasValidPinPair_TigerLake) {
constexpr auto kTigerLake = registers::Platform::kTigerLake;
for (const DdiId ddi_with_valid_pin_pair :
{DdiId::DDI_A, DdiId::DDI_B, DdiId::DDI_C, DdiId::DDI_TC_1, DdiId::DDI_TC_2, DdiId::DDI_TC_3,
DdiId::DDI_TC_4, DdiId::DDI_TC_5, DdiId::DDI_TC_6}) {
EXPECT_TRUE(GMBusPinPair::HasValidPinPair(ddi_with_valid_pin_pair, kTigerLake));
}
}
TEST_F(GMBusPinPairTest, HasValidPinPair_Skylake) {
constexpr auto kSkylake = registers::Platform::kSkylake;
for (const DdiId ddi_with_valid_pin_pair : {DdiId::DDI_B, DdiId::DDI_C, DdiId::DDI_D}) {
EXPECT_TRUE(GMBusPinPair::HasValidPinPair(ddi_with_valid_pin_pair, kSkylake));
}
for (const DdiId ddi_without_valid_pin_pair :
{DdiId::DDI_A, DdiId::DDI_TC_2, DdiId::DDI_TC_3, DdiId::DDI_TC_4, DdiId::DDI_TC_5,
DdiId::DDI_TC_6}) {
EXPECT_FALSE(GMBusPinPair::HasValidPinPair(ddi_without_valid_pin_pair, kSkylake));
}
}
class GpioPortTest : public ::testing::Test {
private:
fdf_testing::ScopedGlobalLogger logger_;
};
TEST_F(GpioPortTest, GetForDdi_TigerLake) {
constexpr auto kTigerLake = registers::Platform::kTigerLake;
{
std::optional<GpioPort> pin_pair = GpioPort::GetForDdi(DdiId::DDI_A, kTigerLake);
ASSERT_TRUE(pin_pair.has_value());
EXPECT_EQ(pin_pair->number(), 0b0001);
EXPECT_EQ(pin_pair->ddi_id(), DdiId::DDI_A);
}
{
std::optional<GpioPort> pin_pair = GpioPort::GetForDdi(DdiId::DDI_B, kTigerLake);
ASSERT_TRUE(pin_pair.has_value());
EXPECT_EQ(pin_pair->number(), 0b0010);
EXPECT_EQ(pin_pair->ddi_id(), DdiId::DDI_B);
}
{
std::optional<GpioPort> pin_pair = GpioPort::GetForDdi(DdiId::DDI_C, kTigerLake);
ASSERT_TRUE(pin_pair.has_value());
EXPECT_EQ(pin_pair->number(), 0b0011);
EXPECT_EQ(pin_pair->ddi_id(), DdiId::DDI_C);
}
{
std::optional<GpioPort> pin_pair = GpioPort::GetForDdi(DdiId::DDI_TC_1, kTigerLake);
ASSERT_TRUE(pin_pair.has_value());
EXPECT_EQ(pin_pair->number(), 0b1001);
EXPECT_EQ(pin_pair->ddi_id(), DdiId::DDI_TC_1);
}
{
std::optional<GpioPort> pin_pair = GpioPort::GetForDdi(DdiId::DDI_TC_2, kTigerLake);
ASSERT_TRUE(pin_pair.has_value());
EXPECT_EQ(pin_pair->number(), 0b1010);
EXPECT_EQ(pin_pair->ddi_id(), DdiId::DDI_TC_2);
}
{
std::optional<GpioPort> pin_pair = GpioPort::GetForDdi(DdiId::DDI_TC_3, kTigerLake);
ASSERT_TRUE(pin_pair.has_value());
EXPECT_EQ(pin_pair->number(), 0b1011);
EXPECT_EQ(pin_pair->ddi_id(), DdiId::DDI_TC_3);
}
{
std::optional<GpioPort> pin_pair = GpioPort::GetForDdi(DdiId::DDI_TC_4, kTigerLake);
ASSERT_TRUE(pin_pair.has_value());
EXPECT_EQ(pin_pair->number(), 0b1100);
EXPECT_EQ(pin_pair->ddi_id(), DdiId::DDI_TC_4);
}
{
std::optional<GpioPort> pin_pair = GpioPort::GetForDdi(DdiId::DDI_TC_5, kTigerLake);
ASSERT_TRUE(pin_pair.has_value());
EXPECT_EQ(pin_pair->number(), 0b1101);
EXPECT_EQ(pin_pair->ddi_id(), DdiId::DDI_TC_5);
}
{
std::optional<GpioPort> pin_pair = GpioPort::GetForDdi(DdiId::DDI_TC_6, kTigerLake);
ASSERT_TRUE(pin_pair.has_value());
EXPECT_EQ(pin_pair->number(), 0b1110);
EXPECT_EQ(pin_pair->ddi_id(), DdiId::DDI_TC_6);
}
}
TEST_F(GpioPortTest, GetForDdi_Skylake) {
constexpr auto kSkylake = registers::Platform::kSkylake;
{
std::optional<GpioPort> gpio_port = GpioPort::GetForDdi(DdiId::DDI_A, kSkylake);
ASSERT_FALSE(gpio_port.has_value());
}
{
std::optional<GpioPort> gpio_port = GpioPort::GetForDdi(DdiId::DDI_B, kSkylake);
ASSERT_TRUE(gpio_port.has_value());
EXPECT_EQ(gpio_port->number(), 0b0100);
EXPECT_EQ(gpio_port->ddi_id(), DdiId::DDI_B);
}
{
std::optional<GpioPort> gpio_port = GpioPort::GetForDdi(DdiId::DDI_C, kSkylake);
ASSERT_TRUE(gpio_port.has_value());
EXPECT_EQ(gpio_port->number(), 0b0011);
EXPECT_EQ(gpio_port->ddi_id(), DdiId::DDI_C);
}
{
std::optional<GpioPort> gpio_port = GpioPort::GetForDdi(DdiId::DDI_D, kSkylake);
ASSERT_TRUE(gpio_port.has_value());
EXPECT_EQ(gpio_port->number(), 0b0101);
EXPECT_EQ(gpio_port->ddi_id(), DdiId::DDI_D);
}
{
std::optional<GpioPort> gpio_port = GpioPort::GetForDdi(DdiId::DDI_E, kSkylake);
ASSERT_FALSE(gpio_port.has_value());
}
for (const DdiId invalid_ddi :
{DdiId::DDI_TC_3, DdiId::DDI_TC_4, DdiId::DDI_TC_5, DdiId::DDI_TC_6}) {
EXPECT_DEATH_IF_SUPPORTED({ GpioPort::GetForDdi(invalid_ddi, kSkylake); }, "Invalid");
}
}
TEST_F(GpioPortTest, HasValidPort_TigerLake) {
constexpr auto kTigerLake = registers::Platform::kTigerLake;
for (const DdiId ddi_with_valid_port :
{DdiId::DDI_A, DdiId::DDI_B, DdiId::DDI_C, DdiId::DDI_TC_1, DdiId::DDI_TC_2, DdiId::DDI_TC_3,
DdiId::DDI_TC_4, DdiId::DDI_TC_5, DdiId::DDI_TC_6}) {
EXPECT_TRUE(GpioPort::HasValidPort(ddi_with_valid_port, kTigerLake));
}
}
TEST_F(GpioPortTest, HasValidPort_Skylake) {
constexpr auto kSkylake = registers::Platform::kSkylake;
for (const DdiId ddi_with_valid_port : {DdiId::DDI_B, DdiId::DDI_C, DdiId::DDI_D}) {
EXPECT_TRUE(GpioPort::HasValidPort(ddi_with_valid_port, kSkylake));
}
for (const DdiId ddi_without_valid_port : {DdiId::DDI_A, DdiId::DDI_TC_2, DdiId::DDI_TC_3,
DdiId::DDI_TC_4, DdiId::DDI_TC_5, DdiId::DDI_TC_6}) {
EXPECT_FALSE(GpioPort::HasValidPort(ddi_without_valid_port, kSkylake));
}
}
} // namespace
} // namespace intel_display