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