/** @file
Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
VOID *
TestPointGetAcpi (
IN UINT32 Signature
);
EFI_STATUS
CheckDrhd (
IN EFI_ACPI_DMAR_HEADER *Dmar
)
{
EFI_ACPI_DMAR_STRUCTURE_HEADER *DmarStructHeader;
INTN DmarLen;
EFI_ACPI_DMAR_DRHD_HEADER *Drhd;
UINT32 Reg32;
//
// Sub table
//
DmarLen = Dmar->Header.Length - sizeof(EFI_ACPI_DMAR_HEADER);
DmarStructHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)(Dmar + 1);
while (DmarLen > 0) {
switch (DmarStructHeader->Type) {
case EFI_ACPI_DMAR_TYPE_DRHD:
Drhd = (EFI_ACPI_DMAR_DRHD_HEADER *)DmarStructHeader;
Reg32 = MmioRead32 ((UINTN)Drhd->RegisterBaseAddress + R_GSTS_REG);
if ((Reg32 & B_GSTS_REG_TE) == 0) {
return EFI_INVALID_PARAMETER;
}
break;
case EFI_ACPI_DMAR_TYPE_RMRR:
case EFI_ACPI_DMAR_TYPE_ATSR:
case EFI_ACPI_DMAR_TYPE_RHSA:
case EFI_ACPI_DMAR_TYPE_ANDD:
default:
break;
}
DmarStructHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINT8 *)DmarStructHeader + DmarStructHeader->Length);
DmarLen -= DmarStructHeader->Length;
}
return EFI_SUCCESS;
}
EFI_STATUS
TestPointVtdEngine (
VOID
)
{
EFI_ACPI_DMAR_HEADER *Dmar;
EFI_STATUS Status;
Status = EFI_SUCCESS;
Dmar = TestPointGetAcpi (EFI_ACPI_4_0_DMA_REMAPPING_TABLE_SIGNATURE);
if (Dmar == NULL) {
DEBUG ((DEBUG_ERROR, "No DMAR table\n"));
Status = EFI_INVALID_PARAMETER;
} else {
Status = CheckDrhd (Dmar);
}
if (EFI_ERROR(Status)) {
TestPointLibAppendErrorString (
PLATFORM_TEST_POINT_ROLE_PLATFORM_IBV,
NULL,
TEST_POINT_BYTE3_END_OF_DXE_DMA_PROTECTION_ENABLED_ERROR_CODE \
TEST_POINT_READY_TO_BOOT \
TEST_POINT_BYTE3_END_OF_DXE_DXE_DMA_PROTECTION_ENABLED_ERROR_STRING
);
}
return Status;
}