]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellAcpiViewCommandLib/Arm/SbbrValidator.c
ShellPkg: acpiview: Add library for SBBR ACPI requirements validation
[mirror_edk2.git] / ShellPkg / Library / UefiShellAcpiViewCommandLib / Arm / SbbrValidator.c
diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Arm/SbbrValidator.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Arm/SbbrValidator.c
new file mode 100644 (file)
index 0000000..d328441
--- /dev/null
@@ -0,0 +1,222 @@
+/** @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