mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-10-27 18:45:25 +00:00 
			
		
		
		
	 e7663fdd82
			
		
	
	
		e7663fdd82
		
	
	
	
	
		
			
			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;
 | |
| }
 | |
| 
 |