/** @file
Unit tests for CEDT Generator
Copyright (c) 2025, Google, Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
extern "C" {
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "GoogleTest/Protocol/MockConfigurationManagerProtocol.h"
EFI_STATUS
EFIAPI
AcpiCedtLibConstructor (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
);
EFI_STATUS
EFIAPI
AcpiCedtLibDestructor (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
);
// Global generator instance
static ACPI_TABLE_GENERATOR *gCedtGenerator = NULL;
// C++ wrapper functions for C linkage functions
EFI_STATUS
RegisterAcpiTableGenerator (
IN CONST ACPI_TABLE_GENERATOR *CONST TableGenerator
)
{
if (TableGenerator == NULL) {
return EFI_INVALID_PARAMETER;
}
gCedtGenerator = const_cast(TableGenerator);
return EFI_SUCCESS;
}
EFI_STATUS
DeregisterAcpiTableGenerator (
IN CONST ACPI_TABLE_GENERATOR *CONST TableGenerator
)
{
if (TableGenerator == NULL) {
return EFI_INVALID_PARAMETER;
}
// Clear the stored generator
gCedtGenerator = NULL;
return EFI_SUCCESS;
}
}
using namespace testing;
using ::testing::_;
using ::testing::NiceMock;
using ::testing::Return;
using ::testing::DoAll;
using ::testing::SetArgPointee;
using ::testing::AtLeast;
#define WRAP_ACCESSOR(accessor) \
[this] \
(IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *This, \
IN CONST CM_OBJECT_ID CmObjectId, \
IN CONST CM_OBJECT_TOKEN Token, \
IN OUT CM_OBJ_DESCRIPTOR *CmObject \
) \
{ \
return this->accessor(This, CmObjectId, Token, CmObject); \
}
class CedtGeneratorTest : public ::testing::Test {
protected:
MockConfigurationManagerProtocol MockConfigMgrProtocol;
CM_STD_OBJ_CONFIGURATION_MANAGER_INFO CfgMgrInfo = { 0 };
void
ValidateChbs (
EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE *Expected,
EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE *Actual
)
{
// Fields that should never change.
EXPECT_EQ (
Actual->Type,
EFI_ACPI_6_4_CEDT_STRUCTURE_TYPE_CXL_HOST_BRIDGE_STRUCTURE
);
EXPECT_EQ (Actual->Reserved0, 0U);
EXPECT_EQ (
Actual->RecordLength,
sizeof (EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE)
);
EXPECT_EQ (Actual->Reserved1, 0U);
// Fields that can change.
EXPECT_EQ (Actual->Uid, Expected->Uid);
EXPECT_EQ (Actual->CxlVersion, Expected->CxlVersion);
EXPECT_EQ (Actual->Base, Expected->Base);
EXPECT_EQ (Actual->Length, Expected->Length);
}
void
ValidateCfmws (
CONST EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE *Expected,
EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE *Actual,
UINT32 *ExpectedInterleaveTargets,
UINT32 ExpectedInterleaveTargetCount
)
{
EXPECT_EQ (
Actual->Type,
EFI_ACPI_6_4_CEDT_STRUCTURE_TYPE_CXL_FIXED_MEMORY_WINDOW_STRUCTURE
);
EXPECT_EQ (Actual->Reserved0, 0U);
EXPECT_EQ (Actual->Reserved1, 0U);
EXPECT_EQ (Actual->Reserved2, 0U);
EXPECT_EQ (Actual->RecordLength, Expected->RecordLength);
EXPECT_EQ (Actual->BaseHpa, Expected->BaseHpa);
EXPECT_EQ (Actual->WindowSize, Expected->WindowSize);
EXPECT_EQ (
Actual->EncodedNumberOfInterleaveWays,
Expected->EncodedNumberOfInterleaveWays
);
EXPECT_EQ (Actual->InterleaveArithmetic, Expected->InterleaveArithmetic);
EXPECT_EQ (
Actual->HostBridgeInterleaveGranularity,
Expected->HostBridgeInterleaveGranularity
);
EXPECT_EQ (Actual->WindowRestrictions, Expected->WindowRestrictions);
EXPECT_EQ (Actual->QtgId, Expected->QtgId);
for (UINT32 Index = 0; Index < ExpectedInterleaveTargetCount; Index++) {
EXPECT_EQ (Actual->InterleaveTargetList[Index], ExpectedInterleaveTargets[Index]);
}
}
void
SetUp (
) override
{
// Set up default behavior for GetObject
ON_CALL (MockConfigMgrProtocol, GetObject (_, _, _, _))
.WillByDefault (Return (EFI_NOT_FOUND));
// Set up configuration manager info
CfgMgrInfo.Revision = CREATE_REVISION (1, 0);
CfgMgrInfo.OemId[0] = 'T';
CfgMgrInfo.OemId[1] = 'E';
CfgMgrInfo.OemId[2] = 'S';
CfgMgrInfo.OemId[3] = 'T';
CfgMgrInfo.OemId[4] = 'I';
CfgMgrInfo.OemId[5] = 'D';
EXPECT_CALL (MockConfigMgrProtocol, GetObject (_, CREATE_CM_STD_OBJECT_ID (EStdObjCfgMgrInfo), CM_NULL_TOKEN, _))
.WillRepeatedly (
DoAll (
SetArgPointee<3>(
CM_OBJ_DESCRIPTOR {
CREATE_CM_STD_OBJECT_ID (EStdObjCfgMgrInfo),
sizeof (CM_STD_OBJ_CONFIGURATION_MANAGER_INFO),
&CfgMgrInfo,
1
}
),
Return (EFI_SUCCESS)
)
);
// Set up call to get all host bridges.
EXPECT_CALL (
MockConfigMgrProtocol,
GetObject (
_,
CREATE_CM_ARCH_COMMON_OBJECT_ID (EArchCommonObjCxlHostBridgeInfo),
CM_NULL_TOKEN,
_
)
)
.WillRepeatedly (
Invoke (WRAP_ACCESSOR (GetAllHostBridges))
);
// Set up call to get a single host bridge.
EXPECT_CALL (
MockConfigMgrProtocol,
GetObject (
_,
CREATE_CM_ARCH_COMMON_OBJECT_ID (EArchCommonObjCxlHostBridgeInfo),
Ne ((UINTN)CM_NULL_TOKEN),
_
)
)
.WillRepeatedly (
Invoke (WRAP_ACCESSOR (GetHostBridgeByToken))
);
// Setup call to get fixed memory windows.
EXPECT_CALL (
MockConfigMgrProtocol,
GetObject (
_,
CREATE_CM_ARCH_COMMON_OBJECT_ID (EArchCommonObjCxlFixedMemoryWindowInfo),
CM_NULL_TOKEN,
_
)
)
.WillRepeatedly (
Invoke (WRAP_ACCESSOR (GetAllWindows))
);
// Initialize the CEDT library with our mock protocol
EXPECT_EQ (AcpiCedtLibConstructor (NULL, NULL), EFI_SUCCESS);
// Setup common test data with proper initialization
mAcpiTableInfo.TableGeneratorId = CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdCedt);
mAcpiTableInfo.AcpiTableSignature = EFI_ACPI_6_4_CXL_EARLY_DISCOVERY_TABLE_SIGNATURE;
mAcpiTableInfo.AcpiTableRevision = EFI_ACPI_6_4_CEDT_CXL_EARLY_DISCOVERY_TABLE_REVISION_01;
}
void
TearDown (
) override
{
if (mTableUnderTest != nullptr) {
gCedtGenerator->FreeTableResources (
gCedtGenerator,
&mAcpiTableInfo,
gConfigurationManagerProtocol,
&mTableUnderTest
);
}
// Clean up the CEDT library
AcpiCedtLibDestructor (NULL, NULL);
}
// Setup the mocks for each type of object that can be requested from
// ConfigurationManager.
void
SetupHostBridgeInfo (
CM_ARCH_COMMON_CXL_HOST_BRIDGE_INFO *HostBridges,
UINT64 HostBridgesCount
)
{
// Copy config into test vector.
mHostBridgeInfo.resize (HostBridgesCount);
for (UINT64 i = 0; i < HostBridgesCount; i++) {
mHostBridgeInfo[i] = HostBridges[i];
}
}
void
SetupFixedMemoryWindowInfo (
CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO *Windows,
UINT64 WindowsCount
)
{
// Copy config into test vector.
mWindowInfo.resize (WindowsCount);
for (UINT64 i = 0; i < WindowsCount; i++) {
mWindowInfo[i] = Windows[i];
}
}
EFI_STATUS
GetHostBridgeByToken (
IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *This,
IN CONST CM_OBJECT_ID CmObjectId,
IN CONST CM_OBJECT_TOKEN Token,
IN OUT CM_OBJ_DESCRIPTOR *CmObject
)
{
(void)This;
(void)CmObjectId;
if (CmObject == nullptr) {
return EFI_INVALID_PARAMETER;
}
for (CM_ARCH_COMMON_CXL_HOST_BRIDGE_INFO &HostBridge : mHostBridgeInfo) {
if ((UINTN)HostBridge.Token == Token) {
*CmObject = CM_OBJ_DESCRIPTOR {
CREATE_CM_ARCH_COMMON_OBJECT_ID (EArchCommonObjCxlHostBridgeInfo),
sizeof (CM_ARCH_COMMON_CXL_HOST_BRIDGE_INFO),
&HostBridge,
1
};
return EFI_SUCCESS;
}
}
return EFI_NOT_FOUND;
}
EFI_STATUS
GetAllHostBridges (
IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *This,
IN CONST CM_OBJECT_ID CmObjectId,
IN CONST CM_OBJECT_TOKEN Token,
IN OUT CM_OBJ_DESCRIPTOR *CmObject
)
{
(void)This;
(void)CmObjectId;
if (CmObject == nullptr) {
return EFI_INVALID_PARAMETER;
}
*CmObject = CM_OBJ_DESCRIPTOR {
CREATE_CM_ARCH_COMMON_OBJECT_ID (EArchCommonObjCxlHostBridgeInfo),
static_cast(sizeof (CM_ARCH_COMMON_CXL_HOST_BRIDGE_INFO) * mHostBridgeInfo.size ()),
mHostBridgeInfo.data (),
static_cast(mHostBridgeInfo.size ())
};
return EFI_SUCCESS;
}
EFI_STATUS
GetAllWindows (
IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *This,
IN CONST CM_OBJECT_ID CmObjectId,
IN CONST CM_OBJECT_TOKEN Token,
IN OUT CM_OBJ_DESCRIPTOR *CmObject
)
{
(void)This;
(void)CmObjectId;
if (CmObject == nullptr) {
return EFI_INVALID_PARAMETER;
}
*CmObject = CM_OBJ_DESCRIPTOR {
CREATE_CM_ARCH_COMMON_OBJECT_ID (EArchCommonObjCxlFixedMemoryWindowInfo),
static_cast(sizeof (CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO) * mWindowInfo.size ()),
mWindowInfo.data (),
static_cast(mWindowInfo.size ())
};
return EFI_SUCCESS;
}
CM_STD_OBJ_ACPI_TABLE_INFO mAcpiTableInfo;
std::vector mHostBridgeInfo;
std::vector mWindowInfo;
EFI_ACPI_DESCRIPTION_HEADER *mTableUnderTest = nullptr;
CM_ARCH_COMMON_CXL_HOST_BRIDGE_INFO mDefaultHb[2] = {
{
42,
5,
1,
0x100000000
},
{
71,
2,
0,
0xF00000000
},
};
EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE mDefaultHbExpected[2] = {
{
0,
0,
32,
5,
1,
0,
0x100000000,
0x10000
},
{
0,
0,
32,
2,
0,
0,
0xF00000000,
0x2000
}
};
CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO mDefaultWindows[2] = {
{
0x40000000,
0xA0000000,
2,
0,
1024,
EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE_WINDOW_RESTRICTIONS_HOST_ONLY_COHERENT,
7,
{
42, 71
},
},
{
0xF0000000,
0xC0000000,
2,
0,
16384,
EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE_WINDOW_RESTRICTIONS_HOST_ONLY_COHERENT,
7,
{
71, 42
},
}
};
};
TEST_F (CedtGeneratorTest, SmokeTest) {
EXPECT_EQ (
gCedtGenerator->BuildAcpiTable (
gCedtGenerator,
&mAcpiTableInfo,
gConfigurationManagerProtocol,
&mTableUnderTest
),
EFI_SUCCESS
);
EXPECT_EQ (mTableUnderTest->Length, 36U);
}
TEST_F (CedtGeneratorTest, ChbsOnlyTest) {
SetupHostBridgeInfo (&mDefaultHb[0], 2);
EXPECT_EQ (
gCedtGenerator->BuildAcpiTable (
gCedtGenerator,
&mAcpiTableInfo,
gConfigurationManagerProtocol,
&mTableUnderTest
),
EFI_SUCCESS
);
EXPECT_EQ (mTableUnderTest->Length, 100U);
EFI_ACPI_6_4_CXL_EARLY_DISCOVERY_TABLE *Cedt =
(EFI_ACPI_6_4_CXL_EARLY_DISCOVERY_TABLE *)mTableUnderTest;
EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE *Chbs =
(EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE *)(&Cedt->CedtStructure[0]);
ValidateChbs (&mDefaultHbExpected[0], &Chbs[0]);
ValidateChbs (&mDefaultHbExpected[1], &Chbs[1]);
}
TEST_F (CedtGeneratorTest, CfmwsWithNoInterleavingTest) {
SetupHostBridgeInfo (&mDefaultHb[0], 1);
CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO Window = mDefaultWindows[0];
Window.NumberOfInterleaveWays = 1;
Window.HostBridgeInterleaveGranularity = 256;
SetupFixedMemoryWindowInfo (&Window, 1);
EXPECT_EQ (
gCedtGenerator->BuildAcpiTable (
gCedtGenerator,
&mAcpiTableInfo,
gConfigurationManagerProtocol,
&mTableUnderTest
),
EFI_SUCCESS
);
EXPECT_EQ (mTableUnderTest->Length, 108U);
EFI_ACPI_6_4_CXL_EARLY_DISCOVERY_TABLE *Cedt =
(EFI_ACPI_6_4_CXL_EARLY_DISCOVERY_TABLE *)mTableUnderTest;
EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE *Chbs =
(EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE *)(&Cedt->CedtStructure[0]);
EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE *Cfmws =
(EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE *)
(((EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE *)&Cedt->CedtStructure[0]) + 1);
CONST EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE ExpectedCfmws = {
1,
0,
40,
0,
0x40000000,
0xA0000000,
0,
0,
0,
0,
EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE_WINDOW_RESTRICTIONS_HOST_ONLY_COHERENT,
7,
};
UINT32 ExpectedInterleaveTargetList[1] = { 5 };
ValidateChbs (&mDefaultHbExpected[0], &Chbs[0]);
ValidateCfmws (&ExpectedCfmws, Cfmws, &ExpectedInterleaveTargetList[0], 1);
}
TEST_F (CedtGeneratorTest, CfmwsWith2WayInterleavingTest) {
SetupHostBridgeInfo (&mDefaultHb[0], 2);
SetupFixedMemoryWindowInfo (&mDefaultWindows[0], 2);
EXPECT_EQ (
gCedtGenerator->BuildAcpiTable (
gCedtGenerator,
&mAcpiTableInfo,
gConfigurationManagerProtocol,
&mTableUnderTest
),
EFI_SUCCESS
);
EXPECT_EQ (mTableUnderTest->Length, 188U);
EFI_ACPI_6_4_CXL_EARLY_DISCOVERY_TABLE *Cedt =
(EFI_ACPI_6_4_CXL_EARLY_DISCOVERY_TABLE *)mTableUnderTest;
EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE *Chbs =
(EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE *)(&Cedt->CedtStructure[0]);
EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE *Cfmws0 =
(EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE *)
(((EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE *)&Cedt->CedtStructure[0]) + 2);
EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE *Cfmws1 =
(EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE *)
(((UINT8 *)(Cfmws0 + 1)) + 2 * sizeof (UINT32));
EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE Cfmws0Expected = {
1,
0,
44,
0,
0x40000000,
0xA0000000,
1,
0,
0,
2,
EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE_WINDOW_RESTRICTIONS_HOST_ONLY_COHERENT,
7,
};
EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE Cfmws1Expected = {
1,
0,
44,
0,
0xF0000000,
0xC0000000,
1,
0,
0,
6,
EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE_WINDOW_RESTRICTIONS_HOST_ONLY_COHERENT,
7,
};
UINT32 InterleaveTargetListExpected[2][2] = {
{ 5, 2 },
{ 2, 5 },
};
ValidateChbs (&mDefaultHbExpected[0], &Chbs[0]);
ValidateChbs (&mDefaultHbExpected[1], &Chbs[1]);
ValidateCfmws (&Cfmws0Expected, Cfmws0, &InterleaveTargetListExpected[0][0], 2);
ValidateCfmws (&Cfmws1Expected, Cfmws1, &InterleaveTargetListExpected[1][0], 2);
}
TEST_F (CedtGeneratorTest, InvalidInterleaveWaysTest) {
SetupHostBridgeInfo (&mDefaultHb[0], 1);
CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO Window = mDefaultWindows[0];
Window.NumberOfInterleaveWays = 7;
SetupFixedMemoryWindowInfo (&Window, 1);
EXPECT_EQ (
gCedtGenerator->BuildAcpiTable (
gCedtGenerator,
&mAcpiTableInfo,
gConfigurationManagerProtocol,
&mTableUnderTest
),
EFI_INVALID_PARAMETER
);
}
TEST_F (CedtGeneratorTest, InvalidInterleaveGranularityTest) {
SetupHostBridgeInfo (&mDefaultHb[0], 1);
CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO Window = mDefaultWindows[0];
Window.HostBridgeInterleaveGranularity = 42;
SetupFixedMemoryWindowInfo (&Window, 1);
EXPECT_EQ (
gCedtGenerator->BuildAcpiTable (
gCedtGenerator,
&mAcpiTableInfo,
gConfigurationManagerProtocol,
&mTableUnderTest
),
EFI_INVALID_PARAMETER
);
}
TEST_F (CedtGeneratorTest, InvalidHpaAlignmentTest) {
SetupHostBridgeInfo (&mDefaultHb[0], 1);
CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO Window = mDefaultWindows[0];
Window.BaseHostPhysicalAddress = 0x04000000;
SetupFixedMemoryWindowInfo (&Window, 1);
EXPECT_EQ (
gCedtGenerator->BuildAcpiTable (
gCedtGenerator,
&mAcpiTableInfo,
gConfigurationManagerProtocol,
&mTableUnderTest
),
EFI_INVALID_PARAMETER
);
}
TEST_F (CedtGeneratorTest, InvalidWindowSizeTest) {
SetupHostBridgeInfo (&mDefaultHb[0], 1);
CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO Window = mDefaultWindows[0];
Window.WindowSizeBytes = 0xA1000000;
SetupFixedMemoryWindowInfo (&Window, 1);
EXPECT_EQ (
gCedtGenerator->BuildAcpiTable (
gCedtGenerator,
&mAcpiTableInfo,
gConfigurationManagerProtocol,
&mTableUnderTest
),
EFI_INVALID_PARAMETER
);
}
TEST_F (CedtGeneratorTest, InvalidWindowSizeWithInterleavingTest) {
SetupHostBridgeInfo (&mDefaultHb[0], 2);
CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO Windows[2] = {
mDefaultWindows[0],
mDefaultWindows[1],
};
// Window size should be a multiple of 512MB.
Windows[0].WindowSizeBytes = 0x30000000;
SetupFixedMemoryWindowInfo (&Windows[0], 2);
EXPECT_EQ (
gCedtGenerator->BuildAcpiTable (
gCedtGenerator,
&mAcpiTableInfo,
gConfigurationManagerProtocol,
&mTableUnderTest
),
EFI_INVALID_PARAMETER
);
}
TEST_F (CedtGeneratorTest, InvalidWindowRestrictionsTest) {
SetupHostBridgeInfo (&mDefaultHb[0], 1);
CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO Window = mDefaultWindows[0];
Window.WindowRestrictions = 0xF0;
SetupFixedMemoryWindowInfo (&Window, 1);
EXPECT_EQ (
gCedtGenerator->BuildAcpiTable (
gCedtGenerator,
&mAcpiTableInfo,
gConfigurationManagerProtocol,
&mTableUnderTest
),
EFI_INVALID_PARAMETER
);
}
TEST_F (CedtGeneratorTest, InvalidInterleaveArithmeticTest) {
SetupHostBridgeInfo (&mDefaultHb[0], 1);
CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO Window = mDefaultWindows[0];
Window.InterleaveArithmetic = 2;
SetupFixedMemoryWindowInfo (&Window, 1);
EXPECT_EQ (
gCedtGenerator->BuildAcpiTable (
gCedtGenerator,
&mAcpiTableInfo,
gConfigurationManagerProtocol,
&mTableUnderTest
),
EFI_INVALID_PARAMETER
);
}
TEST_F (CedtGeneratorTest, InvalidInterleaveTargetTest) {
SetupHostBridgeInfo (&mDefaultHb[0], 1);
CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO Window = mDefaultWindows[0];
Window.InterleaveTargetTokens[0] = 41;
Window.NumberOfInterleaveWays = 1;
SetupFixedMemoryWindowInfo (&Window, 1);
EXPECT_EQ (
gCedtGenerator->BuildAcpiTable (
gCedtGenerator,
&mAcpiTableInfo,
gConfigurationManagerProtocol,
&mTableUnderTest
),
EFI_NOT_FOUND
);
}
TEST_F (CedtGeneratorTest, InvalidAbsentChbsForCfmwsTest) {
CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO Window = mDefaultWindows[0];
Window.NumberOfInterleaveWays = 1;
SetupFixedMemoryWindowInfo (&Window, 1);
EXPECT_EQ (
gCedtGenerator->BuildAcpiTable (
gCedtGenerator,
&mAcpiTableInfo,
gConfigurationManagerProtocol,
&mTableUnderTest
),
EFI_NOT_FOUND
);
}
int
main (
int argc,
char *argv[]
)
{
testing::InitGoogleTest (&argc, argv);
return RUN_ALL_TESTS ();
}