mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-19 11:44:24 +02:00
Today's UefiPayloadPkg always uses 0xE0000000 as the PCIE base address and ignores the value set in AcpiBoardInfo HOB created by the boot loader. This makes the payload binary cannot work in environment where the PCIE base address set by boot loader doesn't equal to 0xE0000000. The patch enhances UefiPayloadPkg so that the PCIE base address set by boot loader in the AcpiBoardInfo HOB is used. Signed-off-by: Ray Ni <ray.ni@intel.com> Reviewed-by: Maurice Ma <maurice.ma@intel.com> Reviewed-by: Guo Dong <guo.dong@intel.com> Cc: Benjamin You <benjamin.you@intel.com>
170 lines
5.4 KiB
C
170 lines
5.4 KiB
C
/** @file
|
|
This driver will report some MMIO/IO resources to dxe core, extract smbios and acpi
|
|
tables from bootloader.
|
|
|
|
Copyright (c) 2014 - 2020, Intel Corporation. All rights reserved.<BR>
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
#include "BlSupportDxe.h"
|
|
|
|
/**
|
|
Reserve MMIO/IO resource in GCD
|
|
|
|
@param IsMMIO Flag of whether it is mmio resource or io resource.
|
|
@param GcdType Type of the space.
|
|
@param BaseAddress Base address of the space.
|
|
@param Length Length of the space.
|
|
@param Alignment Align with 2^Alignment
|
|
@param ImageHandle Handle for the image of this driver.
|
|
|
|
@retval EFI_SUCCESS Reserve successful
|
|
**/
|
|
EFI_STATUS
|
|
ReserveResourceInGcd (
|
|
IN BOOLEAN IsMMIO,
|
|
IN UINTN GcdType,
|
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
|
IN UINT64 Length,
|
|
IN UINTN Alignment,
|
|
IN EFI_HANDLE ImageHandle
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
|
|
if (IsMMIO) {
|
|
Status = gDS->AddMemorySpace (
|
|
GcdType,
|
|
BaseAddress,
|
|
Length,
|
|
EFI_MEMORY_UC
|
|
);
|
|
if (EFI_ERROR (Status)) {
|
|
DEBUG ((
|
|
DEBUG_ERROR,
|
|
"Failed to add memory space :0x%lx 0x%lx\n",
|
|
BaseAddress,
|
|
Length
|
|
));
|
|
}
|
|
ASSERT_EFI_ERROR (Status);
|
|
Status = gDS->AllocateMemorySpace (
|
|
EfiGcdAllocateAddress,
|
|
GcdType,
|
|
Alignment,
|
|
Length,
|
|
&BaseAddress,
|
|
ImageHandle,
|
|
NULL
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
} else {
|
|
Status = gDS->AddIoSpace (
|
|
GcdType,
|
|
BaseAddress,
|
|
Length
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
Status = gDS->AllocateIoSpace (
|
|
EfiGcdAllocateAddress,
|
|
GcdType,
|
|
Alignment,
|
|
Length,
|
|
&BaseAddress,
|
|
ImageHandle,
|
|
NULL
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
return Status;
|
|
}
|
|
|
|
|
|
/**
|
|
Main entry for the bootloader support DXE module.
|
|
|
|
@param[in] ImageHandle The firmware allocated handle for the EFI image.
|
|
@param[in] SystemTable A pointer to the EFI System Table.
|
|
|
|
@retval EFI_SUCCESS The entry point is executed successfully.
|
|
@retval other Some error occurs when executing this entry point.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
BlDxeEntryPoint (
|
|
IN EFI_HANDLE ImageHandle,
|
|
IN EFI_SYSTEM_TABLE *SystemTable
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
EFI_HOB_GUID_TYPE *GuidHob;
|
|
SYSTEM_TABLE_INFO *SystemTableInfo;
|
|
EFI_PEI_GRAPHICS_INFO_HOB *GfxInfo;
|
|
ACPI_BOARD_INFO *AcpiBoardInfo;
|
|
|
|
Status = EFI_SUCCESS;
|
|
//
|
|
// Report MMIO/IO Resources
|
|
//
|
|
Status = ReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFEC00000, SIZE_4KB, 0, ImageHandle); // IOAPIC
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
Status = ReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFED00000, SIZE_1KB, 0, ImageHandle); // HPET
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
//
|
|
// Find the system table information guid hob
|
|
//
|
|
GuidHob = GetFirstGuidHob (&gUefiSystemTableInfoGuid);
|
|
ASSERT (GuidHob != NULL);
|
|
SystemTableInfo = (SYSTEM_TABLE_INFO *)GET_GUID_HOB_DATA (GuidHob);
|
|
|
|
//
|
|
// Install Acpi Table
|
|
//
|
|
if (SystemTableInfo->AcpiTableBase != 0 && SystemTableInfo->AcpiTableSize != 0) {
|
|
DEBUG ((DEBUG_ERROR, "Install Acpi Table at 0x%lx, length 0x%x\n", SystemTableInfo->AcpiTableBase, SystemTableInfo->AcpiTableSize));
|
|
Status = gBS->InstallConfigurationTable (&gEfiAcpiTableGuid, (VOID *)(UINTN)SystemTableInfo->AcpiTableBase);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
|
|
//
|
|
// Install Smbios Table
|
|
//
|
|
if (SystemTableInfo->SmbiosTableBase != 0 && SystemTableInfo->SmbiosTableSize != 0) {
|
|
DEBUG ((DEBUG_ERROR, "Install Smbios Table at 0x%lx, length 0x%x\n", SystemTableInfo->SmbiosTableBase, SystemTableInfo->SmbiosTableSize));
|
|
Status = gBS->InstallConfigurationTable (&gEfiSmbiosTableGuid, (VOID *)(UINTN)SystemTableInfo->SmbiosTableBase);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
|
|
//
|
|
// Find the frame buffer information and update PCDs
|
|
//
|
|
GuidHob = GetFirstGuidHob (&gEfiGraphicsInfoHobGuid);
|
|
if (GuidHob != NULL) {
|
|
GfxInfo = (EFI_PEI_GRAPHICS_INFO_HOB *)GET_GUID_HOB_DATA (GuidHob);
|
|
Status = PcdSet32S (PcdVideoHorizontalResolution, GfxInfo->GraphicsMode.HorizontalResolution);
|
|
ASSERT_EFI_ERROR (Status);
|
|
Status = PcdSet32S (PcdVideoVerticalResolution, GfxInfo->GraphicsMode.VerticalResolution);
|
|
ASSERT_EFI_ERROR (Status);
|
|
Status = PcdSet32S (PcdSetupVideoHorizontalResolution, GfxInfo->GraphicsMode.HorizontalResolution);
|
|
ASSERT_EFI_ERROR (Status);
|
|
Status = PcdSet32S (PcdSetupVideoVerticalResolution, GfxInfo->GraphicsMode.VerticalResolution);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
|
|
//
|
|
// Set PcdPciExpressBaseAddress by HOB info
|
|
//
|
|
GuidHob = GetFirstGuidHob (&gUefiAcpiBoardInfoGuid);
|
|
if (GuidHob != NULL) {
|
|
AcpiBoardInfo = (ACPI_BOARD_INFO *)GET_GUID_HOB_DATA (GuidHob);
|
|
Status = PcdSet64S (PcdPciExpressBaseAddress, AcpiBoardInfo->PcieBaseAddress);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|