REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the ShellPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Ray Ni <ray.ni@intel.com>
		
			
				
	
	
		
			224 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			224 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @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;
 | |
| }
 |