mirror of https://github.com/acidanthera/audk.git
172 lines
5.6 KiB
C
172 lines
5.6 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 and PcdPciExpressBaseSize 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);
|
|
Status = PcdSet64S (PcdPciExpressBaseSize, AcpiBoardInfo->PcieBaseSize);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|