]> git.proxmox.com Git - mirror_edk2.git/blobdiff - CorebootModulePkg/Library/CbParseLib/CbParseLib.c
Coreboot*Pkg: Retire CorebootPayloadPkg and CorebootModulePkg
[mirror_edk2.git] / CorebootModulePkg / Library / CbParseLib / CbParseLib.c
diff --git a/CorebootModulePkg/Library/CbParseLib/CbParseLib.c b/CorebootModulePkg/Library/CbParseLib/CbParseLib.c
deleted file mode 100644 (file)
index 38f31bd..0000000
+++ /dev/null
@@ -1,721 +0,0 @@
-/** @file\r
-  This library will parse the coreboot table in memory and extract those required\r
-  information.\r
-\r
-  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
-  SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-\r
-#include <Uefi/UefiBaseType.h>\r
-#include <Library/BaseLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/PcdLib.h>\r
-#include <Library/IoLib.h>\r
-#include <Library/CbParseLib.h>\r
-\r
-#include <IndustryStandard/Acpi.h>\r
-\r
-#include "Coreboot.h"\r
-\r
-\r
-/**\r
-  Convert a packed value from cbuint64 to a UINT64 value.\r
-\r
-  @param  val      The pointer to packed data.\r
-\r
-  @return          the UNIT64 value after conversion.\r
-\r
-**/\r
-UINT64\r
-cb_unpack64 (\r
-  IN struct cbuint64 val\r
-  )\r
-{\r
-  return LShiftU64 (val.hi, 32) | val.lo;\r
-}\r
-\r
-\r
-/**\r
-  Returns the sum of all elements in a buffer of 16-bit values.  During\r
-  calculation, the carry bits are also been added.\r
-\r
-  @param  Buffer      The pointer to the buffer to carry out the sum operation.\r
-  @param  Length      The size, in bytes, of Buffer.\r
-\r
-  @return Sum         The sum of Buffer with carry bits included during additions.\r
-\r
-**/\r
-UINT16\r
-CbCheckSum16 (\r
-  IN UINT16   *Buffer,\r
-  IN UINTN    Length\r
-  )\r
-{\r
-  UINT32 Sum, TmpValue;\r
-  UINTN  Idx;\r
-  UINT8  *TmpPtr;\r
-\r
-  Sum = 0;\r
-  TmpPtr = (UINT8 *)Buffer;\r
-  for(Idx = 0; Idx < Length; Idx++) {\r
-    TmpValue  = TmpPtr[Idx];\r
-    if (Idx % 2 == 1) {\r
-      TmpValue <<= 8;\r
-    }\r
-\r
-    Sum += TmpValue;\r
-\r
-    // Wrap\r
-    if (Sum >= 0x10000) {\r
-      Sum = (Sum + (Sum >> 16)) & 0xFFFF;\r
-    }\r
-  }\r
-\r
-  return (UINT16)((~Sum) & 0xFFFF);\r
-}\r
-\r
-\r
-/**\r
-  Find coreboot record with given Tag from the memory Start in 4096\r
-  bytes range.\r
-\r
-  @param  Start              The start memory to be searched in\r
-  @param  Tag                The tag id to be found\r
-\r
-  @retval NULL              The Tag is not found.\r
-  @retval Others            The pointer to the record found.\r
-\r
-**/\r
-VOID *\r
-EFIAPI\r
-FindCbTag (\r
-  IN  VOID     *Start,\r
-  IN  UINT32   Tag\r
-  )\r
-{\r
-  struct cb_header   *Header;\r
-  struct cb_record   *Record;\r
-  UINT8              *TmpPtr;\r
-  UINT8              *TagPtr;\r
-  UINTN              Idx;\r
-  UINT16             CheckSum;\r
-\r
-  Header = NULL;\r
-  TmpPtr = (UINT8 *)Start;\r
-  for (Idx = 0; Idx < 4096; Idx += 16, TmpPtr += 16) {\r
-    Header = (struct cb_header *)TmpPtr;\r
-    if (Header->signature == CB_HEADER_SIGNATURE) {\r
-      break;\r
-    }\r
-  }\r
-\r
-  if (Idx >= 4096) {\r
-    return NULL;\r
-  }\r
-\r
-  if ((Header == NULL) || (Header->table_bytes == 0)) {\r
-    return NULL;\r
-  }\r
-\r
-  //\r
-  // Check the checksum of the coreboot table header\r
-  //\r
-  CheckSum = CbCheckSum16 ((UINT16 *)Header, sizeof (*Header));\r
-  if (CheckSum != 0) {\r
-    DEBUG ((EFI_D_ERROR, "Invalid coreboot table header checksum\n"));\r
-    return NULL;\r
-  }\r
-\r
-  CheckSum = CbCheckSum16 ((UINT16 *)(TmpPtr + sizeof (*Header)), Header->table_bytes);\r
-  if (CheckSum != Header->table_checksum) {\r
-    DEBUG ((EFI_D_ERROR, "Incorrect checksum of all the coreboot table entries\n"));\r
-    return NULL;\r
-  }\r
-\r
-  TagPtr = NULL;\r
-  TmpPtr += Header->header_bytes;\r
-  for (Idx = 0; Idx < Header->table_entries; Idx++) {\r
-    Record = (struct cb_record *)TmpPtr;\r
-    if (Record->tag == CB_TAG_FORWARD) {\r
-      TmpPtr = (VOID *)(UINTN)((struct cb_forward *)(UINTN)Record)->forward;\r
-      if (Tag == CB_TAG_FORWARD) {\r
-        return TmpPtr;\r
-      } else {\r
-        return FindCbTag (TmpPtr, Tag);\r
-      }\r
-    }\r
-    if (Record->tag == Tag) {\r
-      TagPtr = TmpPtr;\r
-      break;\r
-    }\r
-    TmpPtr += Record->size;\r
-  }\r
-\r
-  return TagPtr;\r
-}\r
-\r
-\r
-/**\r
-  Find the given table with TableId from the given coreboot memory Root.\r
-\r
-  @param  Root               The coreboot memory table to be searched in\r
-  @param  TableId            Table id to be found\r
-  @param  pMemTable          To save the base address of the memory table found\r
-  @param  pMemTableSize      To save the size of memory table found\r
-\r
-  @retval RETURN_SUCCESS            Successfully find out the memory table.\r
-  @retval RETURN_INVALID_PARAMETER  Invalid input parameters.\r
-  @retval RETURN_NOT_FOUND          Failed to find the memory table.\r
-\r
-**/\r
-RETURN_STATUS\r
-EFIAPI\r
-FindCbMemTable (\r
-  IN  struct cbmem_root  *Root,\r
-  IN  UINT32             TableId,\r
-  OUT VOID               **pMemTable,\r
-  OUT UINT32             *pMemTableSize\r
-  )\r
-{\r
-  UINTN                Idx;\r
-  BOOLEAN              IsImdEntry;\r
-  struct cbmem_entry  *Entries;\r
-\r
-  if ((Root == NULL) || (pMemTable == NULL)) {\r
-    return RETURN_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // Check if the entry is CBMEM or IMD\r
-  // and handle them separately\r
-  //\r
-  Entries = Root->entries;\r
-  if (Entries[0].magic == CBMEM_ENTRY_MAGIC) {\r
-    IsImdEntry = FALSE;\r
-  } else {\r
-    Entries = (struct cbmem_entry *)((struct imd_root *)Root)->entries;\r
-    if (Entries[0].magic == IMD_ENTRY_MAGIC) {\r
-      IsImdEntry = TRUE;\r
-    } else {\r
-      return RETURN_NOT_FOUND;\r
-    }\r
-  }\r
-\r
-  for (Idx = 0; Idx < Root->num_entries; Idx++) {\r
-    if (Entries[Idx].id == TableId) {\r
-      if (IsImdEntry) {\r
-        *pMemTable = (VOID *) ((UINTN)Entries[Idx].start + (UINTN)Root);\r
-      } else {\r
-        *pMemTable = (VOID *) (UINTN)Entries[Idx].start;\r
-      }\r
-      if (pMemTableSize != NULL) {\r
-        *pMemTableSize = Entries[Idx].size;\r
-      }\r
-\r
-      DEBUG ((EFI_D_INFO, "Find CbMemTable Id 0x%x, base %p, size 0x%x\n",\r
-        TableId, *pMemTable, Entries[Idx].size));\r
-      return RETURN_SUCCESS;\r
-    }\r
-  }\r
-\r
-  return RETURN_NOT_FOUND;\r
-}\r
-\r
-\r
-/**\r
-  Acquire the memory information from the coreboot table in memory.\r
-\r
-  @param  MemInfoCallback     The callback routine\r
-  @param  pParam              Pointer to the callback routine parameter\r
-\r
-  @retval RETURN_SUCCESS     Successfully find out the memory information.\r
-  @retval RETURN_NOT_FOUND   Failed to find the memory information.\r
-\r
-**/\r
-RETURN_STATUS\r
-EFIAPI\r
-CbParseMemoryInfo (\r
-  IN  CB_MEM_INFO_CALLBACK  MemInfoCallback,\r
-  IN  VOID                  *pParam\r
-  )\r
-{\r
-  struct cb_memory         *rec;\r
-  struct cb_memory_range   *Range;\r
-  UINT64                   Start;\r
-  UINT64                   Size;\r
-  UINTN                    Index;\r
-\r
-  //\r
-  // Get the coreboot memory table\r
-  //\r
-  rec = (struct cb_memory *)FindCbTag (0, CB_TAG_MEMORY);\r
-  if (rec == NULL) {\r
-    rec = (struct cb_memory *)FindCbTag ((VOID *)(UINTN)PcdGet32 (PcdCbHeaderPointer), CB_TAG_MEMORY);\r
-  }\r
-\r
-  if (rec == NULL) {\r
-    return RETURN_NOT_FOUND;\r
-  }\r
-\r
-  for (Index = 0; Index < MEM_RANGE_COUNT(rec); Index++) {\r
-    Range = MEM_RANGE_PTR(rec, Index);\r
-    Start = cb_unpack64(Range->start);\r
-    Size = cb_unpack64(Range->size);\r
-    DEBUG ((EFI_D_INFO, "%d. %016lx - %016lx [%02x]\n",\r
-            Index, Start, Start + Size - 1, Range->type));\r
-\r
-    MemInfoCallback (Start, Size, Range->type, pParam);\r
-  }\r
-\r
-  return RETURN_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
-  Acquire the coreboot memory table with the given table id\r
-\r
-  @param  TableId            Table id to be searched\r
-  @param  pMemTable          Pointer to the base address of the memory table\r
-  @param  pMemTableSize      Pointer to the size of the memory table\r
-\r
-  @retval RETURN_SUCCESS     Successfully find out the memory table.\r
-  @retval RETURN_INVALID_PARAMETER  Invalid input parameters.\r
-  @retval RETURN_NOT_FOUND   Failed to find the memory table.\r
-\r
-**/\r
-RETURN_STATUS\r
-EFIAPI\r
-CbParseCbMemTable (\r
-  IN  UINT32     TableId,\r
-  OUT VOID       **pMemTable,\r
-  OUT UINT32     *pMemTableSize\r
-  )\r
-{\r
-  struct cb_memory         *rec;\r
-  struct cb_memory_range   *Range;\r
-  UINT64                   Start;\r
-  UINT64                   Size;\r
-  UINTN                    Index;\r
-\r
-  if (pMemTable == NULL) {\r
-    return RETURN_INVALID_PARAMETER;\r
-  }\r
-  *pMemTable = NULL;\r
-\r
-  //\r
-  // Get the coreboot memory table\r
-  //\r
-  rec = (struct cb_memory *)FindCbTag (0, CB_TAG_MEMORY);\r
-  if (rec == NULL) {\r
-    rec = (struct cb_memory *)FindCbTag ((VOID *)(UINTN)PcdGet32 (PcdCbHeaderPointer), CB_TAG_MEMORY);\r
-  }\r
-\r
-  if (rec == NULL) {\r
-    return RETURN_NOT_FOUND;\r
-  }\r
-\r
-  for (Index = 0; Index < MEM_RANGE_COUNT(rec); Index++) {\r
-    Range = MEM_RANGE_PTR(rec, Index);\r
-    Start = cb_unpack64(Range->start);\r
-    Size = cb_unpack64(Range->size);\r
-\r
-    if ((Range->type == CB_MEM_TABLE) && (Start > 0x1000)) {\r
-      if (FindCbMemTable ((struct  cbmem_root *)(UINTN)(Start + Size - DYN_CBMEM_ALIGN_SIZE), TableId, pMemTable, pMemTableSize) == RETURN_SUCCESS)\r
-        return RETURN_SUCCESS;\r
-    }\r
-  }\r
-\r
-  return RETURN_NOT_FOUND;\r
-}\r
-\r
-\r
-/**\r
-  Acquire the acpi table from coreboot\r
-\r
-  @param  pMemTable          Pointer to the base address of the memory table\r
-  @param  pMemTableSize      Pointer to the size of the memory table\r
-\r
-  @retval RETURN_SUCCESS     Successfully find out the memory table.\r
-  @retval RETURN_INVALID_PARAMETER  Invalid input parameters.\r
-  @retval RETURN_NOT_FOUND   Failed to find the memory table.\r
-\r
-**/\r
-RETURN_STATUS\r
-EFIAPI\r
-CbParseAcpiTable (\r
-  OUT VOID       **pMemTable,\r
-  OUT UINT32     *pMemTableSize\r
-  )\r
-{\r
-  return CbParseCbMemTable (SIGNATURE_32 ('I', 'P', 'C', 'A'), pMemTable, pMemTableSize);\r
-}\r
-\r
-/**\r
-  Acquire the smbios table from coreboot\r
-\r
-  @param  pMemTable          Pointer to the base address of the memory table\r
-  @param  pMemTableSize      Pointer to the size of the memory table\r
-\r
-  @retval RETURN_SUCCESS     Successfully find out the memory table.\r
-  @retval RETURN_INVALID_PARAMETER  Invalid input parameters.\r
-  @retval RETURN_NOT_FOUND   Failed to find the memory table.\r
-\r
-**/\r
-RETURN_STATUS\r
-EFIAPI\r
-CbParseSmbiosTable (\r
-  OUT VOID       **pMemTable,\r
-  OUT UINT32     *pMemTableSize\r
-  )\r
-{\r
-  return CbParseCbMemTable (SIGNATURE_32 ('T', 'B', 'M', 'S'), pMemTable, pMemTableSize);\r
-}\r
-\r
-/**\r
-  Find the required fadt information\r
-\r
-  @param  pPmCtrlReg         Pointer to the address of power management control register\r
-  @param  pPmTimerReg        Pointer to the address of power management timer register\r
-  @param  pResetReg          Pointer to the address of system reset register\r
-  @param  pResetValue        Pointer to the value to be written to the system reset register\r
-  @param  pPmEvtReg          Pointer to the address of power management event register\r
-  @param  pPmGpeEnReg        Pointer to the address of power management GPE enable register\r
-\r
-  @retval RETURN_SUCCESS     Successfully find out all the required fadt information.\r
-  @retval RETURN_NOT_FOUND   Failed to find the fadt table.\r
-\r
-**/\r
-RETURN_STATUS\r
-EFIAPI\r
-CbParseFadtInfo (\r
-  OUT UINTN      *pPmCtrlReg,\r
-  OUT UINTN      *pPmTimerReg,\r
-  OUT UINTN      *pResetReg,\r
-  OUT UINTN      *pResetValue,\r
-  OUT UINTN      *pPmEvtReg,\r
-  OUT UINTN      *pPmGpeEnReg\r
-  )\r
-{\r
-  EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *Rsdp;\r
-  EFI_ACPI_DESCRIPTION_HEADER                   *Rsdt;\r
-  UINT32                                        *Entry32;\r
-  UINTN                                         Entry32Num;\r
-  EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE     *Fadt;\r
-  EFI_ACPI_DESCRIPTION_HEADER                   *Xsdt;\r
-  UINT64                                        *Entry64;\r
-  UINTN                                         Entry64Num;\r
-  UINTN                                         Idx;\r
-  RETURN_STATUS                                 Status;\r
-\r
-  Rsdp = NULL;\r
-  Status = RETURN_SUCCESS;\r
-\r
-  Status = CbParseAcpiTable ((VOID **)&Rsdp, NULL);\r
-  if (RETURN_ERROR(Status)) {\r
-    return Status;\r
-  }\r
-\r
-  if (Rsdp == NULL) {\r
-    return RETURN_NOT_FOUND;\r
-  }\r
-\r
-  DEBUG ((EFI_D_INFO, "Find Rsdp at %p\n", Rsdp));\r
-  DEBUG ((EFI_D_INFO, "Find Rsdt 0x%x, Xsdt 0x%lx\n", Rsdp->RsdtAddress, Rsdp->XsdtAddress));\r
-\r
-  //\r
-  // Search Rsdt First\r
-  //\r
-  Rsdt     = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->RsdtAddress);\r
-  if (Rsdt != NULL) {\r
-    Entry32  = (UINT32 *)(Rsdt + 1);\r
-    Entry32Num = (Rsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 2;\r
-    for (Idx = 0; Idx < Entry32Num; Idx++) {\r
-      if (*(UINT32 *)(UINTN)(Entry32[Idx]) == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
-        Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UINTN)(Entry32[Idx]);\r
-        if (pPmCtrlReg != NULL) {\r
-          *pPmCtrlReg = Fadt->Pm1aCntBlk;\r
-        }\r
-        DEBUG ((EFI_D_INFO, "PmCtrl Reg 0x%x\n", Fadt->Pm1aCntBlk));\r
-\r
-        if (pPmTimerReg != NULL) {\r
-          *pPmTimerReg = Fadt->PmTmrBlk;\r
-        }\r
-        DEBUG ((EFI_D_INFO, "PmTimer Reg 0x%x\n", Fadt->PmTmrBlk));\r
-\r
-        if (pResetReg != NULL) {\r
-          *pResetReg = (UINTN)Fadt->ResetReg.Address;\r
-        }\r
-        DEBUG ((EFI_D_INFO, "Reset Reg 0x%lx\n", Fadt->ResetReg.Address));\r
-\r
-        if (pResetValue != NULL) {\r
-          *pResetValue = Fadt->ResetValue;\r
-        }\r
-        DEBUG ((EFI_D_INFO, "Reset Value 0x%x\n", Fadt->ResetValue));\r
-\r
-        if (pPmEvtReg != NULL) {\r
-          *pPmEvtReg = Fadt->Pm1aEvtBlk;\r
-          DEBUG ((EFI_D_INFO, "PmEvt Reg 0x%x\n", Fadt->Pm1aEvtBlk));\r
-        }\r
-\r
-        if (pPmGpeEnReg != NULL) {\r
-          *pPmGpeEnReg = Fadt->Gpe0Blk + Fadt->Gpe0BlkLen / 2;\r
-          DEBUG ((EFI_D_INFO, "PmGpeEn Reg 0x%x\n", *pPmGpeEnReg));\r
-        }\r
-\r
-        //\r
-        // Verify values for proper operation\r
-        //\r
-        ASSERT(Fadt->Pm1aCntBlk != 0);\r
-        ASSERT(Fadt->PmTmrBlk != 0);\r
-        ASSERT(Fadt->ResetReg.Address != 0);\r
-        ASSERT(Fadt->Pm1aEvtBlk != 0);\r
-        ASSERT(Fadt->Gpe0Blk != 0);\r
-\r
-        DEBUG_CODE_BEGIN ();\r
-          BOOLEAN    SciEnabled;\r
-\r
-          //\r
-          // Check the consistency of SCI enabling\r
-          //\r
-\r
-          //\r
-          // Get SCI_EN value\r
-          //\r
-          if (Fadt->Pm1CntLen == 4) {\r
-            SciEnabled = (IoRead32 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;\r
-          } else {\r
-            //\r
-            // if (Pm1CntLen == 2), use 16 bit IO read;\r
-            // if (Pm1CntLen != 2 && Pm1CntLen != 4), use 16 bit IO read as a fallback\r
-            //\r
-            SciEnabled = (IoRead16 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;\r
-          }\r
-\r
-          if (!(Fadt->Flags & EFI_ACPI_5_0_HW_REDUCED_ACPI) &&\r
-              (Fadt->SmiCmd == 0) &&\r
-              !SciEnabled) {\r
-            //\r
-            // The ACPI enabling status is inconsistent: SCI is not enabled but ACPI\r
-            // table does not provide a means to enable it through FADT->SmiCmd\r
-            //\r
-            DEBUG ((DEBUG_ERROR, "ERROR: The ACPI enabling status is inconsistent: SCI is not"\r
-              " enabled but the ACPI table does not provide a means to enable it through FADT->SmiCmd."\r
-              " This may cause issues in OS.\n"));\r
-            ASSERT (FALSE);\r
-          }\r
-        DEBUG_CODE_END ();\r
-        return RETURN_SUCCESS;\r
-      }\r
-    }\r
-  }\r
-\r
-  //\r
-  // Search Xsdt Second\r
-  //\r
-  Xsdt     = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->XsdtAddress);\r
-  if (Xsdt != NULL) {\r
-    Entry64  = (UINT64 *)(Xsdt + 1);\r
-    Entry64Num = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 3;\r
-    for (Idx = 0; Idx < Entry64Num; Idx++) {\r
-      if (*(UINT32 *)(UINTN)(Entry64[Idx]) == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
-        Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UINTN)(Entry64[Idx]);\r
-        if (pPmCtrlReg)\r
-          *pPmCtrlReg = Fadt->Pm1aCntBlk;\r
-        DEBUG ((EFI_D_ERROR, "PmCtrl Reg 0x%x\n", Fadt->Pm1aCntBlk));\r
-\r
-        if (pPmTimerReg)\r
-          *pPmTimerReg = Fadt->PmTmrBlk;\r
-        DEBUG ((EFI_D_ERROR, "PmTimer Reg 0x%x\n", Fadt->PmTmrBlk));\r
-\r
-        if (pResetReg)\r
-          *pResetReg = (UINTN)Fadt->ResetReg.Address;\r
-        DEBUG ((EFI_D_ERROR, "Reset Reg 0x%lx\n", Fadt->ResetReg.Address));\r
-\r
-        if (pResetValue)\r
-          *pResetValue = Fadt->ResetValue;\r
-        DEBUG ((EFI_D_ERROR, "Reset Value 0x%x\n", Fadt->ResetValue));\r
-\r
-        if (pPmEvtReg != NULL) {\r
-          *pPmEvtReg = Fadt->Pm1aEvtBlk;\r
-           DEBUG ((EFI_D_INFO, "PmEvt Reg 0x%x\n", Fadt->Pm1aEvtBlk));\r
-        }\r
-\r
-        if (pPmGpeEnReg != NULL) {\r
-          *pPmGpeEnReg = Fadt->Gpe0Blk + Fadt->Gpe0BlkLen / 2;\r
-          DEBUG ((EFI_D_INFO, "PmGpeEn Reg 0x%x\n", *pPmGpeEnReg));\r
-        }\r
-        return RETURN_SUCCESS;\r
-      }\r
-    }\r
-  }\r
-\r
-  return RETURN_NOT_FOUND;\r
-}\r
-\r
-/**\r
-  Find the serial port information\r
-\r
-  @param  pRegBase           Pointer to the base address of serial port registers\r
-  @param  pRegAccessType     Pointer to the access type of serial port registers\r
-  @param  pRegWidth          Pointer to the register width in bytes\r
-  @param  pBaudrate          Pointer to the serial port baudrate\r
-  @param  pInputHertz        Pointer to the input clock frequency\r
-  @param  pUartPciAddr       Pointer to the UART PCI bus, dev and func address\r
-\r
-  @retval RETURN_SUCCESS     Successfully find the serial port information.\r
-  @retval RETURN_NOT_FOUND   Failed to find the serial port information .\r
-\r
-**/\r
-RETURN_STATUS\r
-EFIAPI\r
-CbParseSerialInfo (\r
-  OUT UINT32      *pRegBase,\r
-  OUT UINT32      *pRegAccessType,\r
-  OUT UINT32      *pRegWidth,\r
-  OUT UINT32      *pBaudrate,\r
-  OUT UINT32      *pInputHertz,\r
-  OUT UINT32      *pUartPciAddr\r
-  )\r
-{\r
-  struct cb_serial    *CbSerial;\r
-\r
-  CbSerial = FindCbTag (0, CB_TAG_SERIAL);\r
-  if (CbSerial == NULL) {\r
-    CbSerial = FindCbTag ((VOID *)(UINTN)PcdGet32 (PcdCbHeaderPointer), CB_TAG_SERIAL);\r
-  }\r
-\r
-  if (CbSerial == NULL) {\r
-    return RETURN_NOT_FOUND;\r
-  }\r
-\r
-  if (pRegBase != NULL) {\r
-    *pRegBase = CbSerial->baseaddr;\r
-  }\r
-\r
-  if (pRegWidth != NULL) {\r
-    *pRegWidth = CbSerial->regwidth;\r
-  }\r
-\r
-  if (pRegAccessType != NULL) {\r
-    *pRegAccessType = CbSerial->type;\r
-  }\r
-\r
-  if (pBaudrate != NULL) {\r
-    *pBaudrate = CbSerial->baud;\r
-  }\r
-\r
-  if (pInputHertz != NULL) {\r
-    *pInputHertz = CbSerial->input_hertz;\r
-  }\r
-\r
-  if (pUartPciAddr != NULL) {\r
-    *pUartPciAddr = CbSerial->uart_pci_addr;\r
-  }\r
-\r
-  return RETURN_SUCCESS;\r
-}\r
-\r
-/**\r
-  Search for the coreboot table header\r
-\r
-  @param  Level              Level of the search depth\r
-  @param  HeaderPtr          Pointer to the pointer of coreboot table header\r
-\r
-  @retval RETURN_SUCCESS     Successfully find the coreboot table header .\r
-  @retval RETURN_NOT_FOUND   Failed to find the coreboot table header .\r
-\r
-**/\r
-RETURN_STATUS\r
-EFIAPI\r
-CbParseGetCbHeader (\r
-  IN  UINTN  Level,\r
-  OUT VOID   **HeaderPtr\r
-  )\r
-{\r
-  UINTN Index;\r
-  VOID  *TempPtr;\r
-\r
-  if (HeaderPtr == NULL) {\r
-    return RETURN_NOT_FOUND;\r
-  }\r
-\r
-  TempPtr = NULL;\r
-  for (Index = 0; Index < Level; Index++) {\r
-    TempPtr = FindCbTag (TempPtr, CB_TAG_FORWARD);\r
-    if (TempPtr == NULL) {\r
-      break;\r
-    }\r
-  }\r
-\r
-  if ((Index >= Level) && (TempPtr != NULL)) {\r
-    *HeaderPtr = TempPtr;\r
-    return RETURN_SUCCESS;\r
-  }\r
-\r
-  return RETURN_NOT_FOUND;\r
-}\r
-\r
-/**\r
-  Find the video frame buffer information\r
-\r
-  @param  pFbInfo            Pointer to the FRAME_BUFFER_INFO structure\r
-\r
-  @retval RETURN_SUCCESS     Successfully find the video frame buffer information.\r
-  @retval RETURN_NOT_FOUND   Failed to find the video frame buffer information .\r
-\r
-**/\r
-RETURN_STATUS\r
-EFIAPI\r
-CbParseFbInfo (\r
-  OUT FRAME_BUFFER_INFO       *pFbInfo\r
-  )\r
-{\r
-  struct cb_framebuffer       *CbFbRec;\r
-\r
-  if (pFbInfo == NULL) {\r
-    return RETURN_INVALID_PARAMETER;\r
-  }\r
-\r
-  CbFbRec = FindCbTag (0, CB_TAG_FRAMEBUFFER);\r
-  if (CbFbRec == NULL) {\r
-    CbFbRec = FindCbTag ((VOID *)(UINTN)PcdGet32 (PcdCbHeaderPointer), CB_TAG_FRAMEBUFFER);\r
-  }\r
-\r
-  if (CbFbRec == NULL) {\r
-    return RETURN_NOT_FOUND;\r
-  }\r
-\r
-  DEBUG ((EFI_D_INFO, "Found coreboot video frame buffer information\n"));\r
-  DEBUG ((EFI_D_INFO, "physical_address: 0x%lx\n", CbFbRec->physical_address));\r
-  DEBUG ((EFI_D_INFO, "x_resolution: 0x%x\n", CbFbRec->x_resolution));\r
-  DEBUG ((EFI_D_INFO, "y_resolution: 0x%x\n", CbFbRec->y_resolution));\r
-  DEBUG ((EFI_D_INFO, "bits_per_pixel: 0x%x\n", CbFbRec->bits_per_pixel));\r
-  DEBUG ((EFI_D_INFO, "bytes_per_line: 0x%x\n", CbFbRec->bytes_per_line));\r
-\r
-  DEBUG ((EFI_D_INFO, "red_mask_size: 0x%x\n", CbFbRec->red_mask_size));\r
-  DEBUG ((EFI_D_INFO, "red_mask_pos: 0x%x\n", CbFbRec->red_mask_pos));\r
-  DEBUG ((EFI_D_INFO, "green_mask_size: 0x%x\n", CbFbRec->green_mask_size));\r
-  DEBUG ((EFI_D_INFO, "green_mask_pos: 0x%x\n", CbFbRec->green_mask_pos));\r
-  DEBUG ((EFI_D_INFO, "blue_mask_size: 0x%x\n", CbFbRec->blue_mask_size));\r
-  DEBUG ((EFI_D_INFO, "blue_mask_pos: 0x%x\n", CbFbRec->blue_mask_pos));\r
-  DEBUG ((EFI_D_INFO, "reserved_mask_size: 0x%x\n", CbFbRec->reserved_mask_size));\r
-  DEBUG ((EFI_D_INFO, "reserved_mask_pos: 0x%x\n", CbFbRec->reserved_mask_pos));\r
-\r
-  pFbInfo->LinearFrameBuffer    = CbFbRec->physical_address;\r
-  pFbInfo->HorizontalResolution = CbFbRec->x_resolution;\r
-  pFbInfo->VerticalResolution   = CbFbRec->y_resolution;\r
-  pFbInfo->BitsPerPixel         = CbFbRec->bits_per_pixel;\r
-  pFbInfo->BytesPerScanLine     = (UINT16)CbFbRec->bytes_per_line;\r
-  pFbInfo->Red.Mask             = (1 << CbFbRec->red_mask_size) - 1;\r
-  pFbInfo->Red.Position         = CbFbRec->red_mask_pos;\r
-  pFbInfo->Green.Mask           = (1 << CbFbRec->green_mask_size) - 1;\r
-  pFbInfo->Green.Position       = CbFbRec->green_mask_pos;\r
-  pFbInfo->Blue.Mask            = (1 << CbFbRec->blue_mask_size) - 1;\r
-  pFbInfo->Blue.Position        = CbFbRec->blue_mask_pos;\r
-  pFbInfo->Reserved.Mask        = (1 << CbFbRec->reserved_mask_size) - 1;\r
-  pFbInfo->Reserved.Position    = CbFbRec->reserved_mask_pos;\r
-\r
-  return RETURN_SUCCESS;\r
-}\r
-\r