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