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