SystemTableInfo GUID is not a Spec defined GUID. The latest SBL and CBL produces ACPI and SMBIOS table information. So removing the SystemTableInfo GUID implementation. Cc: Maurice Ma <maurice.ma@intel.com> Cc: Guo Dong <guo.dong@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Benjamin You <benjamin.you@intel.com> Cc: Zhiguang Liu <zhiguang.liu@intel.com> Signed-off-by: Guo Dong <guo.dong@intel.com> Signed-off-by: Thiyagu Kesavan Balakrishnan <thiyagux.kesavan.balakrishnan@intel.com> Reviewed-by: Guo Dong <guo.dong@intel.com>
		
			
				
	
	
		
			295 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			295 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  This library will parse the Slim Bootloader to get required information.
 | 
						|
 | 
						|
  Copyright (c) 2014 - 2021, Intel Corporation. All rights reserved.<BR>
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include <PiDxe.h>
 | 
						|
#include <Library/BaseLib.h>
 | 
						|
#include <Library/BaseMemoryLib.h>
 | 
						|
#include <Library/DebugLib.h>
 | 
						|
#include <Library/PcdLib.h>
 | 
						|
#include <Library/IoLib.h>
 | 
						|
#include <Library/HobLib.h>
 | 
						|
#include <Library/BlParseLib.h>
 | 
						|
#include <IndustryStandard/Acpi.h>
 | 
						|
#include <UniversalPayload/PciRootBridges.h>
 | 
						|
 | 
						|
/**
 | 
						|
  This function retrieves the parameter base address from boot loader.
 | 
						|
 | 
						|
  This function will get bootloader specific parameter address for UEFI payload.
 | 
						|
  e.g. HobList pointer for Slim Bootloader, and coreboot table header for Coreboot.
 | 
						|
 | 
						|
  @retval NULL            Failed to find the GUID HOB.
 | 
						|
  @retval others          GUIDed HOB data pointer.
 | 
						|
 | 
						|
**/
 | 
						|
VOID *
 | 
						|
EFIAPI
 | 
						|
GetParameterBase (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_HOB_HANDOFF_INFO_TABLE          *HandoffTable;
 | 
						|
 | 
						|
  HandoffTable = (EFI_HOB_HANDOFF_INFO_TABLE *)(UINTN) GET_BOOTLOADER_PARAMETER ();
 | 
						|
  if ((HandoffTable->Header.HobType == EFI_HOB_TYPE_HANDOFF) &&
 | 
						|
    (HandoffTable->Header.HobLength == sizeof (EFI_HOB_HANDOFF_INFO_TABLE)) &&
 | 
						|
    (HandoffTable->Header.Reserved == 0)) {
 | 
						|
    return (VOID *)HandoffTable;
 | 
						|
  }
 | 
						|
 | 
						|
  return NULL;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  This function retrieves a GUIDed HOB data from Slim Bootloader.
 | 
						|
 | 
						|
  This function will search SBL HOB list to find the first GUIDed HOB that
 | 
						|
  its GUID matches Guid.
 | 
						|
 | 
						|
  @param[in]  Guid        A pointer to HOB GUID to search.
 | 
						|
 | 
						|
  @retval NULL            Failed to find the GUID HOB.
 | 
						|
  @retval others          GUIDed HOB data pointer.
 | 
						|
 | 
						|
**/
 | 
						|
VOID *
 | 
						|
GetGuidHobDataFromSbl (
 | 
						|
  IN       EFI_GUID      *Guid
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT8                  *GuidHob;
 | 
						|
  CONST VOID             *HobList;
 | 
						|
 | 
						|
  HobList = GetParameterBase ();
 | 
						|
  ASSERT (HobList != NULL);
 | 
						|
  GuidHob = GetNextGuidHob (Guid, HobList);
 | 
						|
  if (GuidHob != NULL) {
 | 
						|
    return GET_GUID_HOB_DATA (GuidHob);
 | 
						|
  }
 | 
						|
 | 
						|
  return NULL;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Acquire the memory map information.
 | 
						|
 | 
						|
  @param  MemInfoCallback     The callback routine
 | 
						|
  @param  Params              Pointer to the callback routine parameter
 | 
						|
 | 
						|
  @retval RETURN_SUCCESS     Successfully find out the memory information.
 | 
						|
  @retval RETURN_NOT_FOUND   Failed to find the memory information.
 | 
						|
 | 
						|
**/
 | 
						|
RETURN_STATUS
 | 
						|
EFIAPI
 | 
						|
ParseMemoryInfo (
 | 
						|
  IN  BL_MEM_INFO_CALLBACK       MemInfoCallback,
 | 
						|
  IN  VOID                       *Params
 | 
						|
  )
 | 
						|
{
 | 
						|
  MEMORY_MAP_INFO               *MemoryMapInfo;
 | 
						|
  UINTN                          Idx;
 | 
						|
 | 
						|
  MemoryMapInfo = (MEMORY_MAP_INFO *) GetGuidHobDataFromSbl (&gLoaderMemoryMapInfoGuid);
 | 
						|
  if (MemoryMapInfo == NULL) {
 | 
						|
    ASSERT (FALSE);
 | 
						|
    return RETURN_NOT_FOUND;
 | 
						|
  }
 | 
						|
 | 
						|
  for (Idx = 0; Idx < MemoryMapInfo->Count; Idx++) {
 | 
						|
    MemInfoCallback (&MemoryMapInfo->Entry[Idx], Params);
 | 
						|
  }
 | 
						|
 | 
						|
  return RETURN_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Acquire SMBIOS table from slim bootloader.
 | 
						|
 | 
						|
  @param  SmbiosTable           Pointer to the SMBIOS table info.
 | 
						|
 | 
						|
  @retval RETURN_SUCCESS            Successfully find out the tables.
 | 
						|
  @retval RETURN_NOT_FOUND          Failed to find the tables.
 | 
						|
 | 
						|
**/
 | 
						|
RETURN_STATUS
 | 
						|
EFIAPI
 | 
						|
ParseSmbiosTable (
 | 
						|
    OUT UNIVERSAL_PAYLOAD_SMBIOS_TABLE     *SmbiosTable
 | 
						|
  )
 | 
						|
{
 | 
						|
  UNIVERSAL_PAYLOAD_SMBIOS_TABLE         *TableInfo;
 | 
						|
 | 
						|
  TableInfo = (UNIVERSAL_PAYLOAD_SMBIOS_TABLE *)GetGuidHobDataFromSbl (&gUniversalPayloadSmbiosTableGuid);
 | 
						|
  if (TableInfo == NULL) {
 | 
						|
    ASSERT (FALSE);
 | 
						|
    return RETURN_NOT_FOUND;
 | 
						|
  }
 | 
						|
 | 
						|
  SmbiosTable->SmBiosEntryPoint = TableInfo->SmBiosEntryPoint;
 | 
						|
 | 
						|
  return RETURN_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Acquire ACPI table from slim bootloader.
 | 
						|
 | 
						|
  @param  AcpiTableHob              Pointer to the ACPI table info.
 | 
						|
 | 
						|
  @retval RETURN_SUCCESS            Successfully find out the tables.
 | 
						|
  @retval RETURN_NOT_FOUND          Failed to find the tables.
 | 
						|
 | 
						|
**/
 | 
						|
RETURN_STATUS
 | 
						|
EFIAPI
 | 
						|
ParseAcpiTableInfo (
 | 
						|
  OUT UNIVERSAL_PAYLOAD_ACPI_TABLE        *AcpiTableHob
 | 
						|
  )
 | 
						|
{
 | 
						|
  UNIVERSAL_PAYLOAD_ACPI_TABLE         *TableInfo;
 | 
						|
 | 
						|
  TableInfo = (UNIVERSAL_PAYLOAD_ACPI_TABLE *)GetGuidHobDataFromSbl (&gUniversalPayloadAcpiTableGuid);
 | 
						|
  if (TableInfo == NULL) {
 | 
						|
    ASSERT (FALSE);
 | 
						|
    return RETURN_NOT_FOUND;
 | 
						|
  }
 | 
						|
 | 
						|
  AcpiTableHob->Rsdp = TableInfo->Rsdp;
 | 
						|
 | 
						|
  return RETURN_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Find the serial port information
 | 
						|
 | 
						|
  @param[out]  SerialPortInfo     Pointer to serial port info structure
 | 
						|
 | 
						|
  @retval RETURN_SUCCESS     Successfully find the serial port information.
 | 
						|
  @retval RETURN_NOT_FOUND   Failed to find the serial port information .
 | 
						|
 | 
						|
**/
 | 
						|
RETURN_STATUS
 | 
						|
EFIAPI
 | 
						|
ParseSerialInfo (
 | 
						|
  OUT SERIAL_PORT_INFO     *SerialPortInfo
 | 
						|
  )
 | 
						|
{
 | 
						|
  SERIAL_PORT_INFO              *BlSerialInfo;
 | 
						|
 | 
						|
  BlSerialInfo = (SERIAL_PORT_INFO *) GetGuidHobDataFromSbl (&gUefiSerialPortInfoGuid);
 | 
						|
  if (BlSerialInfo == NULL) {
 | 
						|
    ASSERT (FALSE);
 | 
						|
    return RETURN_NOT_FOUND;
 | 
						|
  }
 | 
						|
 | 
						|
  CopyMem (SerialPortInfo, BlSerialInfo, sizeof (SERIAL_PORT_INFO));
 | 
						|
 | 
						|
  return RETURN_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Find the video frame buffer information
 | 
						|
 | 
						|
  @param  GfxInfo             Pointer to the EFI_PEI_GRAPHICS_INFO_HOB structure
 | 
						|
 | 
						|
  @retval RETURN_SUCCESS     Successfully find the video frame buffer information.
 | 
						|
  @retval RETURN_NOT_FOUND   Failed to find the video frame buffer information .
 | 
						|
 | 
						|
**/
 | 
						|
RETURN_STATUS
 | 
						|
EFIAPI
 | 
						|
ParseGfxInfo (
 | 
						|
  OUT EFI_PEI_GRAPHICS_INFO_HOB       *GfxInfo
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_PEI_GRAPHICS_INFO_HOB           *BlGfxInfo;
 | 
						|
 | 
						|
  BlGfxInfo = (EFI_PEI_GRAPHICS_INFO_HOB *) GetGuidHobDataFromSbl (&gEfiGraphicsInfoHobGuid);
 | 
						|
  if (BlGfxInfo == NULL) {
 | 
						|
    return RETURN_NOT_FOUND;
 | 
						|
  }
 | 
						|
 | 
						|
  CopyMem (GfxInfo, BlGfxInfo, sizeof (EFI_PEI_GRAPHICS_INFO_HOB));
 | 
						|
 | 
						|
  return RETURN_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Find the video frame buffer device information
 | 
						|
 | 
						|
  @param  GfxDeviceInfo      Pointer to the EFI_PEI_GRAPHICS_DEVICE_INFO_HOB structure
 | 
						|
 | 
						|
  @retval RETURN_SUCCESS     Successfully find the video frame buffer information.
 | 
						|
  @retval RETURN_NOT_FOUND   Failed to find the video frame buffer information.
 | 
						|
 | 
						|
**/
 | 
						|
RETURN_STATUS
 | 
						|
EFIAPI
 | 
						|
ParseGfxDeviceInfo (
 | 
						|
  OUT EFI_PEI_GRAPHICS_DEVICE_INFO_HOB       *GfxDeviceInfo
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_PEI_GRAPHICS_DEVICE_INFO_HOB           *BlGfxDeviceInfo;
 | 
						|
 | 
						|
  BlGfxDeviceInfo = (EFI_PEI_GRAPHICS_DEVICE_INFO_HOB *) GetGuidHobDataFromSbl (&gEfiGraphicsDeviceInfoHobGuid);
 | 
						|
  if (BlGfxDeviceInfo == NULL) {
 | 
						|
    return RETURN_NOT_FOUND;
 | 
						|
  }
 | 
						|
 | 
						|
  CopyMem (GfxDeviceInfo, BlGfxDeviceInfo, sizeof (EFI_PEI_GRAPHICS_DEVICE_INFO_HOB));
 | 
						|
 | 
						|
  return RETURN_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Parse and handle the misc info provided by bootloader
 | 
						|
 | 
						|
  @retval RETURN_SUCCESS           The misc information was parsed successfully.
 | 
						|
  @retval RETURN_NOT_FOUND         Could not find required misc info.
 | 
						|
  @retval RETURN_OUT_OF_RESOURCES  Insufficant memory space.
 | 
						|
 | 
						|
**/
 | 
						|
RETURN_STATUS
 | 
						|
EFIAPI
 | 
						|
ParseMiscInfo (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  RETURN_STATUS                          Status;
 | 
						|
  UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES     *BlRootBridgesHob;
 | 
						|
  UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES     *PldRootBridgesHob;
 | 
						|
 | 
						|
  Status = RETURN_NOT_FOUND;
 | 
						|
  BlRootBridgesHob = (UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES *) GetGuidHobDataFromSbl (
 | 
						|
                       &gUniversalPayloadPciRootBridgeInfoGuid
 | 
						|
                     );
 | 
						|
  if (BlRootBridgesHob != NULL) {
 | 
						|
    //
 | 
						|
    // Migrate bootloader root bridge info hob from bootloader to payload.
 | 
						|
    //
 | 
						|
    PldRootBridgesHob = BuildGuidHob (
 | 
						|
                                      &gUniversalPayloadPciRootBridgeInfoGuid,
 | 
						|
                                      BlRootBridgesHob->Header.Length
 | 
						|
                                     );
 | 
						|
    ASSERT (PldRootBridgesHob != NULL);
 | 
						|
    if (PldRootBridgesHob != NULL) {
 | 
						|
      CopyMem (PldRootBridgesHob, BlRootBridgesHob, BlRootBridgesHob->Header.Length);
 | 
						|
      DEBUG ((DEBUG_INFO, "Create PCI root bridge info guid hob\n"));
 | 
						|
      Status = RETURN_SUCCESS;
 | 
						|
    } else {
 | 
						|
      Status = RETURN_OUT_OF_RESOURCES;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return Status;
 | 
						|
}
 | 
						|
 |