mirror of https://github.com/acidanthera/audk.git
224 lines
7.4 KiB
C
224 lines
7.4 KiB
C
/** @file
|
|
Arm Server Base Boot Requirements ACPI table requirement validator.
|
|
|
|
Copyright (c) 2020, ARM Limited. All rights reserved.
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
@par Glossary:
|
|
- Sbbr or SBBR - Server Base Boot Requirements
|
|
- Sbsa or SBSA - Server Base System Architecture
|
|
|
|
@par Reference(s):
|
|
- Arm Server Base Boot Requirements 1.2, September 2019
|
|
- Arm Server Base Boot Requirements 1.1, May 2018
|
|
- Arm Server Base Boot Requirements 1.0, March 2016
|
|
- Arm Server Base System Architecture 6.0
|
|
**/
|
|
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/UefiLib.h>
|
|
#include "AcpiParser.h"
|
|
#include "Arm/SbbrValidator.h"
|
|
|
|
/**
|
|
SBBR specification version strings
|
|
**/
|
|
STATIC CONST CHAR8 *ArmSbbrVersions[ArmSbbrVersionMax] = {
|
|
"1.0", // ArmSbbrVersion_1_0
|
|
"1.1", // ArmSbbrVersion_1_1
|
|
"1.2" // ArmSbbrVersion_1_2
|
|
};
|
|
|
|
/**
|
|
SBBR 1.0 mandatory ACPI tables
|
|
**/
|
|
STATIC CONST UINT32 ArmSbbr10Mandatory[] = {
|
|
EFI_ACPI_6_3_EXTENDED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE,
|
|
EFI_ACPI_6_3_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE,
|
|
EFI_ACPI_6_3_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE,
|
|
EFI_ACPI_6_3_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE,
|
|
EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE,
|
|
EFI_ACPI_6_3_DEBUG_PORT_2_TABLE_SIGNATURE,
|
|
EFI_ACPI_6_3_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE
|
|
};
|
|
|
|
/**
|
|
SBBR 1.1 mandatory ACPI tables
|
|
**/
|
|
STATIC CONST UINT32 ArmSbbr11Mandatory[] = {
|
|
EFI_ACPI_6_3_EXTENDED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE,
|
|
EFI_ACPI_6_3_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE,
|
|
EFI_ACPI_6_3_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE,
|
|
EFI_ACPI_6_3_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE,
|
|
EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE,
|
|
EFI_ACPI_6_3_DEBUG_PORT_2_TABLE_SIGNATURE,
|
|
EFI_ACPI_6_3_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE,
|
|
EFI_ACPI_6_3_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE
|
|
};
|
|
|
|
/**
|
|
SBBR 1.2 mandatory ACPI tables
|
|
**/
|
|
STATIC CONST UINT32 ArmSbbr12Mandatory[] = {
|
|
EFI_ACPI_6_3_EXTENDED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE,
|
|
EFI_ACPI_6_3_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE,
|
|
EFI_ACPI_6_3_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE,
|
|
EFI_ACPI_6_3_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE,
|
|
EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE,
|
|
EFI_ACPI_6_3_DEBUG_PORT_2_TABLE_SIGNATURE,
|
|
EFI_ACPI_6_3_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE,
|
|
EFI_ACPI_6_3_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE,
|
|
EFI_ACPI_6_3_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_STRUCTURE_SIGNATURE
|
|
};
|
|
|
|
/**
|
|
Mandatory ACPI tables for every SBBR specification version.
|
|
**/
|
|
STATIC CONST ACPI_SBBR_REQ ArmSbbrReqs[ArmSbbrVersionMax] = {
|
|
{ ArmSbbr10Mandatory, ARRAY_SIZE (ArmSbbr10Mandatory) }, // SBBR v1.0
|
|
{ ArmSbbr11Mandatory, ARRAY_SIZE (ArmSbbr11Mandatory) }, // SBBR v1.1
|
|
{ ArmSbbr12Mandatory, ARRAY_SIZE (ArmSbbr12Mandatory) } // SBBR v1.2
|
|
};
|
|
|
|
/**
|
|
Data structure to track instance counts for all ACPI tables which are
|
|
defined as 'mandatory' in any SBBR version.
|
|
**/
|
|
STATIC ACPI_TABLE_COUNTER ArmSbbrTableCounts[] = {
|
|
{ EFI_ACPI_6_3_EXTENDED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, 0 },
|
|
{ EFI_ACPI_6_3_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE, 0 },
|
|
{ EFI_ACPI_6_3_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, 0 },
|
|
{ EFI_ACPI_6_3_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE, 0 },
|
|
{ EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE, 0 },
|
|
{ EFI_ACPI_6_3_DEBUG_PORT_2_TABLE_SIGNATURE, 0 },
|
|
{ EFI_ACPI_6_3_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE, 0 },
|
|
{ EFI_ACPI_6_3_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE, 0 },
|
|
{ EFI_ACPI_6_3_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_STRUCTURE_SIGNATURE, 0 }
|
|
};
|
|
|
|
/**
|
|
Reset the platform ACPI table instance count for all SBBR-mandatory tables.
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
ArmSbbrResetTableCounts (
|
|
VOID
|
|
)
|
|
{
|
|
UINT32 Table;
|
|
|
|
for (Table = 0; Table < ARRAY_SIZE (ArmSbbrTableCounts); Table++) {
|
|
ArmSbbrTableCounts[Table].Count = 0;
|
|
}
|
|
}
|
|
|
|
/**
|
|
Increment instance count for SBBR-mandatory ACPI table with the given
|
|
signature.
|
|
|
|
@param [in] Signature ACPI table signature.
|
|
|
|
@retval TRUE Count incremented successfully.
|
|
@retval FALSE Table with the input signature not found.
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
ArmSbbrIncrementTableCount (
|
|
UINT32 Signature
|
|
)
|
|
{
|
|
UINT32 Table;
|
|
|
|
for (Table = 0; Table < ARRAY_SIZE (ArmSbbrTableCounts); Table++) {
|
|
if (Signature == ArmSbbrTableCounts[Table].Signature) {
|
|
ArmSbbrTableCounts[Table].Count++;
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/**
|
|
Validate that all ACPI tables required by the given SBBR specification
|
|
version are installed on the platform.
|
|
|
|
@param [in] Version SBBR spec version to validate against.
|
|
|
|
@retval EFI_SUCCESS All required tables are present.
|
|
@retval EFI_INVALID_PARAMETER Invalid SBBR version.
|
|
@retval EFI_NOT_FOUND One or more mandatory tables are missing.
|
|
@retval EFI_UNSUPPORTED Mandatory ACPI table does not have its
|
|
instance count tracked.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
ArmSbbrReqsValidate (
|
|
ARM_SBBR_VERSION Version
|
|
)
|
|
{
|
|
UINT32 Table;
|
|
UINT32 Index;
|
|
UINT32 MandatoryTable;
|
|
CONST UINT8 *SignaturePtr;
|
|
BOOLEAN IsArmSbbrViolated;
|
|
|
|
if (Version >= ArmSbbrVersionMax) {
|
|
return EFI_INVALID_PARAMETER;
|
|
}
|
|
|
|
IsArmSbbrViolated = FALSE;
|
|
|
|
// Go through the list of mandatory tables for the input SBBR version
|
|
for (Table = 0; Table < ArmSbbrReqs[Version].TableCount; Table++) {
|
|
MandatoryTable = ArmSbbrReqs[Version].Tables[Table];
|
|
SignaturePtr = (CONST UINT8 *)(UINTN)&MandatoryTable;
|
|
|
|
// Locate the instance count for the table with the given signature
|
|
Index = 0;
|
|
while ((Index < ARRAY_SIZE (ArmSbbrTableCounts)) &&
|
|
(ArmSbbrTableCounts[Index].Signature != MandatoryTable))
|
|
{
|
|
Index++;
|
|
}
|
|
|
|
if (Index >= ARRAY_SIZE (ArmSbbrTableCounts)) {
|
|
IncrementErrorCount ();
|
|
Print (
|
|
L"\nERROR: SBBR v%a: Mandatory %c%c%c%c table's instance count not " \
|
|
L"found\n",
|
|
ArmSbbrVersions[Version],
|
|
SignaturePtr[0],
|
|
SignaturePtr[1],
|
|
SignaturePtr[2],
|
|
SignaturePtr[3]
|
|
);
|
|
return EFI_UNSUPPORTED;
|
|
}
|
|
|
|
if (ArmSbbrTableCounts[Index].Count == 0) {
|
|
IsArmSbbrViolated = TRUE;
|
|
IncrementErrorCount ();
|
|
Print (
|
|
L"\nERROR: SBBR v%a: Mandatory %c%c%c%c table is missing",
|
|
ArmSbbrVersions[Version],
|
|
SignaturePtr[0],
|
|
SignaturePtr[1],
|
|
SignaturePtr[2],
|
|
SignaturePtr[3]
|
|
);
|
|
}
|
|
}
|
|
|
|
if (!IsArmSbbrViolated) {
|
|
Print (
|
|
L"\nINFO: SBBR v%a: All mandatory ACPI tables are installed",
|
|
ArmSbbrVersions[Version]
|
|
);
|
|
}
|
|
|
|
Print (L"\n");
|
|
|
|
return IsArmSbbrViolated ? EFI_NOT_FOUND : EFI_SUCCESS;
|
|
}
|