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