mirror of https://github.com/acidanthera/audk.git
149 lines
4.4 KiB
C
149 lines
4.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 - 2021, 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_WARN,
|
|
"Failed to add memory space :0x%lx 0x%lx\n",
|
|
BaseAddress,
|
|
Length
|
|
));
|
|
}
|
|
|
|
Status = gDS->AllocateMemorySpace (
|
|
EfiGcdAllocateAddress,
|
|
GcdType,
|
|
Alignment,
|
|
Length,
|
|
&BaseAddress,
|
|
ImageHandle,
|
|
NULL
|
|
);
|
|
} else {
|
|
Status = gDS->AddIoSpace (
|
|
GcdType,
|
|
BaseAddress,
|
|
Length
|
|
);
|
|
if (EFI_ERROR (Status)) {
|
|
DEBUG ((
|
|
DEBUG_WARN,
|
|
"Failed to add IO space :0x%lx 0x%lx\n",
|
|
BaseAddress,
|
|
Length
|
|
));
|
|
}
|
|
|
|
Status = gDS->AllocateIoSpace (
|
|
EfiGcdAllocateAddress,
|
|
GcdType,
|
|
Alignment,
|
|
Length,
|
|
&BaseAddress,
|
|
ImageHandle,
|
|
NULL
|
|
);
|
|
}
|
|
|
|
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;
|
|
EFI_PEI_GRAPHICS_INFO_HOB *GfxInfo;
|
|
ACPI_BOARD_INFO *AcpiBoardInfo;
|
|
|
|
Status = EFI_SUCCESS;
|
|
//
|
|
// Report MMIO/IO Resources
|
|
//
|
|
ReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFEC00000, SIZE_4KB, 0, ImageHandle); // IOAPIC
|
|
|
|
ReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFED00000, SIZE_1KB, 0, ImageHandle); // HPET
|
|
|
|
//
|
|
// 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;
|
|
}
|