]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ShellPkg: acpiview: Add library for SBBR ACPI requirements validation
authorKrzysztof Koch <krzysztof.koch@arm.com>
Wed, 25 Mar 2020 09:39:23 +0000 (17:39 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Wed, 6 May 2020 17:00:57 +0000 (17:00 +0000)
For Arm-based platforms, define and implement an interface for Server
Base Boot Requirements (SBBR) compliance checks. The library is
responsible for validating that all mandatory ACPI tables are installed
on the platform.

Internally, the library maintains a data structure which tracks
instance counts for ACPI tables which are labeled as 'mandatory' in any
SBBR specification version. The provided interface allows:
- resetting all instance counts to 0
- incremementing the instance count for a table with a given signature
- validating the instance counts against the requirements in SBBR

The ACPI table requirements for each SBBR spec version are represented
internally as a list of table signatures.

Every missing mandatory table (for the input SBBR version) is reported
to the user as a separate error. If all requirements are met, an info
message is displayed.

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

Signed-off-by: Krzysztof Koch <krzysztof.koch@arm.com>
Reviewed-by: Sami Mujawar <Sami.Mujawar@arm.com>
Reviewed-by: Zhichao Gao <zhichao.gao@intel.com>
ShellPkg/Library/UefiShellAcpiViewCommandLib/Arm/SbbrValidator.c [new file with mode: 0644]
ShellPkg/Library/UefiShellAcpiViewCommandLib/Arm/SbbrValidator.h [new file with mode: 0644]
ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf

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
diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Arm/SbbrValidator.h b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Arm/SbbrValidator.h
new file mode 100644 (file)
index 0000000..3135f74
--- /dev/null
@@ -0,0 +1,91 @@
+/** @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
index ea504c934aeebaa452a380e6ea169586e467642a..d21ecd40a8cf8f2d99613fde2ddb2a66702e6ad3 100644 (file)
@@ -1,7 +1,7 @@
 ##  @file\r
 # Provides Shell 'acpiview' command functions\r
 #\r
-# Copyright (c) 2016 - 2019, ARM Limited. All rights reserved.<BR>\r
+# Copyright (c) 2016 - 2020, ARM Limited. All rights reserved.<BR>\r
 #\r
 #  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 #\r
   Parsers/Madt/MadtParser.h\r
   Parsers/Pptt/PpttParser.h\r
 \r
+[Sources.ARM, Sources.AARCH64]\r
+  Arm/SbbrValidator.h\r
+  Arm/SbbrValidator.c\r
+\r
 [Packages]\r
   MdePkg/MdePkg.dec\r
   ShellPkg/ShellPkg.dec\r