1fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma/** @file 2fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma This driver will report some MMIO/IO resources to dxe core, extract smbios and acpi 3fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma tables from coreboot and install. 4fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 5fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Copyright (c) 2014, Intel Corporation. All rights reserved.<BR> 6fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma This program and the accompanying materials 7fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma are licensed and made available under the terms and conditions of the BSD License 8fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma which accompanies this distribution. The full text of the license may be found at 9fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma http://opensource.org/licenses/bsd-license.php. 10fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 11fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 12fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 13fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 14fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma**/ 15fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma#include "CbSupportDxe.h" 16fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 17fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice MaUINTN mPmCtrlReg = 0; 18fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma/** 19fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Reserve MMIO/IO resource in GCD 20fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 21fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma @param IsMMIO Flag of whether it is mmio resource or io resource. 22fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma @param GcdType Type of the space. 23fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma @param BaseAddress Base address of the space. 24fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma @param Length Length of the space. 25fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma @param Alignment Align with 2^Alignment 26fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma @param ImageHandle Handle for the image of this driver. 27fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 28fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma @retval EFI_SUCCESS Reserve successful 29fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma**/ 30fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice MaEFI_STATUS 31fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice MaCbReserveResourceInGcd ( 32fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma IN BOOLEAN IsMMIO, 33fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma IN UINTN GcdType, 34fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma IN EFI_PHYSICAL_ADDRESS BaseAddress, 35fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma IN UINT64 Length, 36fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma IN UINTN Alignment, 37fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma IN EFI_HANDLE ImageHandle 38fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ) 39fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma{ 40fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma EFI_STATUS Status; 41fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 42fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma if (IsMMIO) { 43fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Status = gDS->AddMemorySpace ( 44fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma GcdType, 45fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma BaseAddress, 46fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Length, 47fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma EFI_MEMORY_UC 48fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ); 49fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma if (EFI_ERROR (Status)) { 50fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma DEBUG (( 51fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma EFI_D_ERROR, 5242e548a846cf93bd97f27220bc9c6b5e487e96feScott Duplichan "Failed to add memory space :0x%lx 0x%lx\n", 53fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma BaseAddress, 54fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Length 55fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma )); 56fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma } 57fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ASSERT_EFI_ERROR (Status); 58fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Status = gDS->AllocateMemorySpace ( 59fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma EfiGcdAllocateAddress, 60fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma GcdType, 61fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Alignment, 62fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Length, 63fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma &BaseAddress, 64fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ImageHandle, 65fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma NULL 66fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ); 67fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ASSERT_EFI_ERROR (Status); 68fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma } else { 69fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Status = gDS->AddIoSpace ( 70fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma GcdType, 71fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma BaseAddress, 72fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Length 73fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ); 74fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ASSERT_EFI_ERROR (Status); 75fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Status = gDS->AllocateIoSpace ( 76fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma EfiGcdAllocateAddress, 77fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma GcdType, 78fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Alignment, 79fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Length, 80fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma &BaseAddress, 81fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ImageHandle, 82fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma NULL 83fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ); 84fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ASSERT_EFI_ERROR (Status); 85fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma } 86fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma return Status; 87fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma} 88fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 89fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma/** 90fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Notification function of EVT_GROUP_READY_TO_BOOT event group. 91fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 92fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma This is a notification function registered on EVT_GROUP_READY_TO_BOOT event group. 93fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma When the Boot Manager is about to load and execute a boot option, it reclaims variable 94fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma storage if free size is below the threshold. 95fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 96fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma @param Event Event whose notification function is being invoked. 97fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma @param Context Pointer to the notification function's context. 98fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 99fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma**/ 100fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice MaVOID 101c952b5b124693c3864dbdf6ab5bb80fb399f2af2Scott DuplichanEFIAPI 102fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice MaOnReadyToBoot ( 103c952b5b124693c3864dbdf6ab5bb80fb399f2af2Scott Duplichan IN EFI_EVENT Event, 104c952b5b124693c3864dbdf6ab5bb80fb399f2af2Scott Duplichan IN VOID *Context 105fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ) 106fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma{ 107fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // 108fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // Enable SCI 109fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // 110fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma IoOr16 (mPmCtrlReg, BIT0); 111fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 11242e548a846cf93bd97f27220bc9c6b5e487e96feScott Duplichan DEBUG ((EFI_D_ERROR, "Enable SCI bit at 0x%lx before boot\n", (UINT64)mPmCtrlReg)); 113fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma} 114fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 115fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma/** 116fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Main entry for the Coreboot Support DXE module. 117fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 118fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma @param[in] ImageHandle The firmware allocated handle for the EFI image. 119fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma @param[in] SystemTable A pointer to the EFI System Table. 120fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 121fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma @retval EFI_SUCCESS The entry point is executed successfully. 122fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma @retval other Some error occurs when executing this entry point. 123fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 124fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma**/ 125fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice MaEFI_STATUS 1266d577625ed4eb154414e2b041a976eb6aac76f78Scott DuplichanEFIAPI 127fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice MaCbDxeEntryPoint ( 128fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma IN EFI_HANDLE ImageHandle, 129fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma IN EFI_SYSTEM_TABLE *SystemTable 130fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ) 131fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma{ 132fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma EFI_STATUS Status; 133fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma EFI_EVENT ReadyToBootEvent; 134fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma EFI_HOB_GUID_TYPE *GuidHob; 135fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma SYSTEM_TABLE_INFO *pSystemTableInfo; 136fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ACPI_BOARD_INFO *pAcpiBoardInfo; 137fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 138fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Status = EFI_SUCCESS; 139fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // 140fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // Report MMIO/IO Resources 141fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // 142fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Status = CbReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFEE00000, SIZE_1MB, 0, SystemTable); // LAPIC 143fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ASSERT_EFI_ERROR (Status); 144fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 145fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Status = CbReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFEC00000, SIZE_4KB, 0, SystemTable); // IOAPIC 146fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ASSERT_EFI_ERROR (Status); 147fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 148fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Status = CbReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFED00000, SIZE_1KB, 0, SystemTable); // HPET 149fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ASSERT_EFI_ERROR (Status); 150fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 151fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // 152fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // Find the system table information guid hob 153fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // 154fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma GuidHob = GetFirstGuidHob (&gUefiSystemTableInfoGuid); 155fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ASSERT (GuidHob != NULL); 156fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma pSystemTableInfo = (SYSTEM_TABLE_INFO *)GET_GUID_HOB_DATA (GuidHob); 157fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 158fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // 159fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // Install Acpi Table 160fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // 161fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma if (pSystemTableInfo->AcpiTableBase != 0 && pSystemTableInfo->AcpiTableSize != 0) { 16242e548a846cf93bd97f27220bc9c6b5e487e96feScott Duplichan DEBUG ((EFI_D_ERROR, "Install Acpi Table at 0x%lx, length 0x%x\n", pSystemTableInfo->AcpiTableBase, pSystemTableInfo->AcpiTableSize)); 163fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Status = gBS->InstallConfigurationTable (&gEfiAcpiTableGuid, (VOID *)(UINTN)pSystemTableInfo->AcpiTableBase); 164fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ASSERT_EFI_ERROR (Status); 165fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma } 166fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 167fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // 168fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // Install Smbios Table 169fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // 170fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma if (pSystemTableInfo->SmbiosTableBase != 0 && pSystemTableInfo->SmbiosTableSize != 0) { 17142e548a846cf93bd97f27220bc9c6b5e487e96feScott Duplichan DEBUG ((EFI_D_ERROR, "Install Smbios Table at 0x%lx, length 0x%x\n", pSystemTableInfo->SmbiosTableBase, pSystemTableInfo->SmbiosTableSize)); 172fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Status = gBS->InstallConfigurationTable (&gEfiSmbiosTableGuid, (VOID *)(UINTN)pSystemTableInfo->SmbiosTableBase); 173fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ASSERT_EFI_ERROR (Status); 174fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma } 175fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 176fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // 177fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // Find the acpi board information guid hob 178fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // 179fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma GuidHob = GetFirstGuidHob (&gUefiAcpiBoardInfoGuid); 180fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ASSERT (GuidHob != NULL); 181fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma pAcpiBoardInfo = (ACPI_BOARD_INFO *)GET_GUID_HOB_DATA (GuidHob); 182fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 183fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma mPmCtrlReg = (UINTN)pAcpiBoardInfo->PmCtrlRegBase; 18442e548a846cf93bd97f27220bc9c6b5e487e96feScott Duplichan DEBUG ((EFI_D_ERROR, "PmCtrlReg at 0x%lx\n", (UINT64)mPmCtrlReg)); 185fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 186fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // 187fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // Register callback on the ready to boot event 188fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // in order to enable SCI 189fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma // 190fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ReadyToBootEvent = NULL; 191fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma Status = EfiCreateEventReadyToBootEx ( 192fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma TPL_CALLBACK, 193fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma OnReadyToBoot, 194fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma NULL, 195fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma &ReadyToBootEvent 196fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ); 197fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma ASSERT_EFI_ERROR (Status); 198fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 199fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma return EFI_SUCCESS; 200fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma} 201fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma 202