/** @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
VOID
DumpCharArray (
IN CHAR8 *Ch,
IN UINTN Size
);
VOID
DumpAcpiTableHeader (
IN EFI_ACPI_DESCRIPTION_HEADER *Table
);
BOOLEAN
IsMmioExit (
IN EFI_PHYSICAL_ADDRESS BaseAddress,
IN UINT64 Length,
IN BOOLEAN CheckAllocated
);
EFI_STATUS
DumpAcpiMcfg (
IN EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *Mcfg
)
{
EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *Struct;
UINTN Count;
UINTN Index;
DumpAcpiTableHeader (&Mcfg->Header);
Count = Mcfg->Header.Length - sizeof(EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER);
Count = Count / sizeof(EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE);
Struct = (VOID *)(Mcfg + 1);
for (Index = 0; Index < Count; Index++) {
DEBUG ((DEBUG_INFO, " "));
DEBUG ((DEBUG_INFO, " Segment :"));
DEBUG ((DEBUG_INFO, " BaseAddress=0x%016lx", Struct->BaseAddress));
DEBUG ((DEBUG_INFO, " Seg=0x%04x Bus=(0x%02x-0x%02x)",
Struct->PciSegmentGroupNumber,
Struct->StartBusNumber,
Struct->EndBusNumber
));
DEBUG ((DEBUG_INFO, "\n"));
Struct++;
}
return EFI_SUCCESS;
}
EFI_STATUS
CheckAcpiMcfg (
IN EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *Mcfg
)
{
EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *Struct;
UINTN Count;
UINTN Index;
Count = Mcfg->Header.Length - sizeof(EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER);
Count = Count / sizeof(EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE);
Struct = (VOID *)(Mcfg + 1);
for (Index = 0; Index < Count; Index++) {
if (!IsMmioExit (Struct->BaseAddress, (Struct->EndBusNumber - Struct->StartBusNumber + 1) * SIZE_1MB, TRUE)) {
DEBUG ((DEBUG_ERROR, "MCFG resource (0x%x) is not reported correctly.\n", Struct->BaseAddress));
return EFI_NOT_STARTED;
}
Struct++;
}
return EFI_SUCCESS;
}