| /** @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; | |
| } |