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