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