/** @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; | |
} |