mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-11-04 11:29:11 +00:00 
			
		
		
		
	REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the DynamicTablesPkg 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: Sami Mujawar <sami.mujawar@arm.com>
		
			
				
	
	
		
			212 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			212 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  Acpi Helper
 | 
						|
 | 
						|
  Copyright (c) 2017 - 2021, Arm Limited. All rights reserved.<BR>
 | 
						|
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
**/
 | 
						|
 | 
						|
#include <Library/BaseLib.h>
 | 
						|
#include <Library/DebugLib.h>
 | 
						|
 | 
						|
// Module specific include files.
 | 
						|
#include <Library/AcpiHelperLib.h>
 | 
						|
 | 
						|
/** Convert a hex number to its ASCII code.
 | 
						|
 | 
						|
 @param [in]  Hex   Hex number to convert.
 | 
						|
                    Must be 0 <= x < 16.
 | 
						|
 | 
						|
 @return The ASCII code corresponding to x.
 | 
						|
         -1 if error.
 | 
						|
**/
 | 
						|
UINT8
 | 
						|
EFIAPI
 | 
						|
AsciiFromHex (
 | 
						|
  IN  UINT8  Hex
 | 
						|
  )
 | 
						|
{
 | 
						|
  if (Hex < 10) {
 | 
						|
    return (UINT8)(Hex + '0');
 | 
						|
  }
 | 
						|
 | 
						|
  if (Hex < 16) {
 | 
						|
    return (UINT8)(Hex - 10 + 'A');
 | 
						|
  }
 | 
						|
 | 
						|
  ASSERT (FALSE);
 | 
						|
  return (UINT8)-1;
 | 
						|
}
 | 
						|
 | 
						|
/** Convert an ASCII char representing an hexadecimal number
 | 
						|
    to its integer value.
 | 
						|
 | 
						|
 @param [in]  Char  Char to convert.
 | 
						|
                    Must be between '0'-'9' or 'A'-'F' or 'a'-'f'.
 | 
						|
 | 
						|
 @return The corresponding integer (between 0-16).
 | 
						|
         -1 if error.
 | 
						|
**/
 | 
						|
UINT8
 | 
						|
EFIAPI
 | 
						|
HexFromAscii (
 | 
						|
  IN  CHAR8  Char
 | 
						|
  )
 | 
						|
{
 | 
						|
  if ((Char >= '0') && (Char <= '9')) {
 | 
						|
    return (UINT8)(Char - '0');
 | 
						|
  }
 | 
						|
 | 
						|
  if ((Char >= 'A') && (Char <= 'F')) {
 | 
						|
    return (UINT8)(Char - 'A' + 10);
 | 
						|
  }
 | 
						|
 | 
						|
  if ((Char >= 'a') && (Char <= 'f')) {
 | 
						|
    return (UINT8)(Char - 'a' + 10);
 | 
						|
  }
 | 
						|
 | 
						|
  ASSERT (FALSE);
 | 
						|
  return (UINT8)-1;
 | 
						|
}
 | 
						|
 | 
						|
/** Check if a HID is a valid PNP ID.
 | 
						|
 | 
						|
  @param     [in] Hid     The Hid to validate.
 | 
						|
 | 
						|
  @retval    TRUE         The Hid is a valid PNP ID.
 | 
						|
  @retval    FALSE        The Hid is not a valid PNP ID.
 | 
						|
**/
 | 
						|
BOOLEAN
 | 
						|
IsValidPnpId (
 | 
						|
  IN  CONST CHAR8  *Hid
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINTN  Index;
 | 
						|
 | 
						|
  if (AsciiStrLen (Hid) != 7) {
 | 
						|
    return FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  // A valid PNP ID must be of the form "AAA####"
 | 
						|
  // where A is an uppercase letter and # is a hex digit.
 | 
						|
  for (Index = 0; Index < 3; Index++) {
 | 
						|
    if (!IS_UPPER_CHAR (Hid[Index])) {
 | 
						|
      return FALSE;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  for (Index = 3; Index < 7; Index++) {
 | 
						|
    if (!IS_UPPER_HEX (Hid[Index])) {
 | 
						|
      return FALSE;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
/** Check if a HID is a valid ACPI ID.
 | 
						|
 | 
						|
  @param     [in] Hid     The Hid to validate.
 | 
						|
 | 
						|
  @retval    TRUE         The Hid is a valid ACPI ID.
 | 
						|
  @retval    FALSE        The Hid is not a valid ACPI ID.
 | 
						|
**/
 | 
						|
BOOLEAN
 | 
						|
IsValidAcpiId (
 | 
						|
  IN  CONST CHAR8  *Hid
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINTN  Index;
 | 
						|
 | 
						|
  if (AsciiStrLen (Hid) != 8) {
 | 
						|
    return FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  // A valid ACPI ID must be of the form "NNNN####"
 | 
						|
  // where N is an uppercase letter or a digit ('0'-'9')
 | 
						|
  // and # is a hex digit.
 | 
						|
  for (Index = 0; Index < 4; Index++) {
 | 
						|
    if (!(IS_UPPER_CHAR (Hid[Index]) || IS_DIGIT (Hid[Index]))) {
 | 
						|
      return FALSE;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  for (Index = 4; Index < 8; Index++) {
 | 
						|
    if (!IS_UPPER_HEX (Hid[Index])) {
 | 
						|
      return FALSE;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
/** Convert a EisaId string to its compressed UINT32 equivalent.
 | 
						|
 | 
						|
  Cf. ACPI 6.4 specification, s19.3.4 "ASL Macros": "Eisaid"
 | 
						|
 | 
						|
  @param  [in]  EisaIdStr   Input EisaId string.
 | 
						|
  @param  [out] EisaIdInt   Output EisaId UINT32 (compressed).
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The function completed successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
AmlGetEisaIdFromString (
 | 
						|
  IN  CONST CHAR8   *EisaIdStr,
 | 
						|
  OUT       UINT32  *EisaIdInt
 | 
						|
  )
 | 
						|
{
 | 
						|
  if ((EisaIdStr == NULL)         ||
 | 
						|
      (!IsValidPnpId (EisaIdStr)) ||
 | 
						|
      (EisaIdInt == NULL))
 | 
						|
  {
 | 
						|
    ASSERT (0);
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  /* Cf. ACPI 6.4 specification, s19.3.4 "ASL Macros": "Eisaid"
 | 
						|
 | 
						|
  Converts and compresses the 7-character text argument into its corresponding
 | 
						|
  4-byte numeric EISA ID encoding (Integer). This can be used when declaring
 | 
						|
  IDs for devices that are EISA IDs.
 | 
						|
 | 
						|
  The algorithm used to convert the TextID is as shown in the following
 | 
						|
  example:
 | 
						|
    Starting with a seven character input string "PNP0303", we want to create
 | 
						|
    a DWordConst. This string contains a three character manufacturer code
 | 
						|
    "PNP", a three character hex product identifier "030", and a one character
 | 
						|
    revision identifier "3".
 | 
						|
    The compressed manufacturer code is created as follows:
 | 
						|
      1) Find hex ASCII value for each letter
 | 
						|
      2) Subtract 40h from each ASCII value
 | 
						|
      3) Retain 5 least significant bits for each letter and discard remaining
 | 
						|
         0's:
 | 
						|
 | 
						|
      Byte 0:
 | 
						|
        Bit 7: reserved (0)
 | 
						|
        Bit 6-2: 1st character of compressed mfg code "P"
 | 
						|
        Bit 1-0: Upper 2 bits of 2nd character of mfg code "N"
 | 
						|
      Byte 1:
 | 
						|
        Bit 7-5: Lower 3 bits of 2nd character of mfg code "N"
 | 
						|
        Bit 4-0: 3rd character of mfg code "P"
 | 
						|
      Byte 2:
 | 
						|
        Bit 7-4: 1st hex digit of product number "0"
 | 
						|
        Bit 3-0: 2nd hex digit of product number "3"
 | 
						|
      Byte 3:
 | 
						|
        Bit 7-4: 3rd hex digit of product number "0"
 | 
						|
        Bit 3-0: 4th hex digit of product number "3"
 | 
						|
  */
 | 
						|
  *EisaIdInt = SwapBytes32 (
 | 
						|
                 ((EisaIdStr[0] - 0x40) << 26)       |
 | 
						|
                 ((EisaIdStr[1] - 0x40) << 21)       |
 | 
						|
                 ((EisaIdStr[2] - 0x40) << 16)       |
 | 
						|
                 (HexFromAscii (EisaIdStr[3]) << 12) |
 | 
						|
                 (HexFromAscii (EisaIdStr[4]) << 8)  |
 | 
						|
                 (HexFromAscii (EisaIdStr[5]) << 4)  |
 | 
						|
                 (HexFromAscii (EisaIdStr[6]))
 | 
						|
                 );
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 |