]> git.proxmox.com Git - mirror_edk2.git/blobdiff - CorebootModulePkg/CbSupportDxe/CbSupportDxe.c
Pkg-Module: CorebootModulePkg
[mirror_edk2.git] / CorebootModulePkg / CbSupportDxe / CbSupportDxe.c
diff --git a/CorebootModulePkg/CbSupportDxe/CbSupportDxe.c b/CorebootModulePkg/CbSupportDxe/CbSupportDxe.c
new file mode 100644 (file)
index 0000000..1b3e74a
--- /dev/null
@@ -0,0 +1,199 @@
+/** @file\r
+  This driver will report some MMIO/IO resources to dxe core, extract smbios and acpi \r
+  tables from coreboot and install.\r
+  \r
+  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+#include "CbSupportDxe.h"\r
+\r
+UINTN mPmCtrlReg = 0;\r
+/**\r
+  Reserve MMIO/IO resource in GCD\r
+\r
+  @param  IsMMIO        Flag of whether it is mmio resource or io resource.\r
+  @param  GcdType       Type of the space.\r
+  @param  BaseAddress   Base address of the space.\r
+  @param  Length        Length of the space.\r
+  @param  Alignment     Align with 2^Alignment\r
+  @param  ImageHandle   Handle for the image of this driver.\r
+\r
+  @retval EFI_SUCCESS   Reserve successful\r
+**/\r
+EFI_STATUS\r
+CbReserveResourceInGcd (\r
+  IN BOOLEAN               IsMMIO,\r
+  IN UINTN                 GcdType,\r
+  IN EFI_PHYSICAL_ADDRESS  BaseAddress,\r
+  IN UINT64                Length,\r
+  IN UINTN                 Alignment,\r
+  IN EFI_HANDLE            ImageHandle\r
+  )\r
+{\r
+       EFI_STATUS               Status;\r
+\r
+  if (IsMMIO) {\r
+    Status = gDS->AddMemorySpace (\r
+                    GcdType,\r
+                    BaseAddress,\r
+                    Length,\r
+                    EFI_MEMORY_UC\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      DEBUG ((\r
+        EFI_D_ERROR,\r
+        "Failed to add memory space :0x%x 0x%x\n",\r
+        BaseAddress,\r
+        Length\r
+        ));\r
+    }\r
+    ASSERT_EFI_ERROR (Status);\r
+    Status = gDS->AllocateMemorySpace (\r
+                    EfiGcdAllocateAddress,\r
+                    GcdType,\r
+                    Alignment,\r
+                    Length,\r
+                    &BaseAddress,\r
+                    ImageHandle,\r
+                    NULL\r
+                    );\r
+    ASSERT_EFI_ERROR (Status);\r
+  } else {\r
+    Status = gDS->AddIoSpace (\r
+                    GcdType,\r
+                    BaseAddress,\r
+                    Length\r
+                    );\r
+    ASSERT_EFI_ERROR (Status);\r
+    Status = gDS->AllocateIoSpace (\r
+                    EfiGcdAllocateAddress,\r
+                    GcdType,\r
+                    Alignment,\r
+                    Length,\r
+                    &BaseAddress,\r
+                    ImageHandle,\r
+                    NULL\r
+                    );\r
+    ASSERT_EFI_ERROR (Status);\r
+  }\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Notification function of EVT_GROUP_READY_TO_BOOT event group.\r
+\r
+  This is a notification function registered on EVT_GROUP_READY_TO_BOOT event group.\r
+  When the Boot Manager is about to load and execute a boot option, it reclaims variable\r
+  storage if free size is below the threshold.\r
+\r
+  @param  Event        Event whose notification function is being invoked.\r
+  @param  Context      Pointer to the notification function's context.\r
+\r
+**/\r
+VOID\r
+OnReadyToBoot (\r
+  EFI_EVENT  Event,\r
+  VOID       *Context\r
+  )\r
+{      \r
+       //\r
+       // Enable SCI\r
+       //\r
+       IoOr16 (mPmCtrlReg, BIT0);\r
+       \r
+       DEBUG ((EFI_D_ERROR, "Enable SCI bit at 0x%x before boot\n", mPmCtrlReg));      \r
+}\r
+\r
+/**\r
+  Main entry for the Coreboot Support DXE module.\r
+  \r
+  @param[in] ImageHandle    The firmware allocated handle for the EFI image.\r
+  @param[in] SystemTable    A pointer to the EFI System Table.\r
+  \r
+  @retval EFI_SUCCESS       The entry point is executed successfully.\r
+  @retval other             Some error occurs when executing this entry point.\r
+\r
+**/\r
+EFI_STATUS\r
+CbDxeEntryPoint (\r
+  IN EFI_HANDLE         ImageHandle,\r
+  IN EFI_SYSTEM_TABLE   *SystemTable\r
+  )\r
+{  \r
+       EFI_STATUS Status;\r
+       EFI_EVENT  ReadyToBootEvent;\r
+       EFI_HOB_GUID_TYPE  *GuidHob;\r
+       SYSTEM_TABLE_INFO  *pSystemTableInfo;\r
+       ACPI_BOARD_INFO    *pAcpiBoardInfo;\r
+       \r
+       Status = EFI_SUCCESS;\r
+       //\r
+       // Report MMIO/IO Resources\r
+       //\r
+       Status = CbReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFEE00000, SIZE_1MB, 0, SystemTable); // LAPIC \r
+       ASSERT_EFI_ERROR (Status);\r
+       \r
+       Status = CbReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFEC00000, SIZE_4KB, 0, SystemTable); // IOAPIC \r
+       ASSERT_EFI_ERROR (Status);\r
+       \r
+       Status = CbReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFED00000, SIZE_1KB, 0, SystemTable); // HPET \r
+       ASSERT_EFI_ERROR (Status);\r
+       \r
+       //\r
+       // Find the system table information guid hob\r
+       //\r
+       GuidHob = GetFirstGuidHob (&gUefiSystemTableInfoGuid);\r
+       ASSERT (GuidHob != NULL);\r
+  pSystemTableInfo = (SYSTEM_TABLE_INFO *)GET_GUID_HOB_DATA (GuidHob);\r
+       \r
+       //\r
+       // Install Acpi Table\r
+       //\r
+       if (pSystemTableInfo->AcpiTableBase != 0 && pSystemTableInfo->AcpiTableSize != 0) {             \r
+               DEBUG ((EFI_D_ERROR, "Install Acpi Table at 0x%x, length 0x%x\n", (UINTN)pSystemTableInfo->AcpiTableBase, pSystemTableInfo->AcpiTableSize));    \r
+               Status = gBS->InstallConfigurationTable (&gEfiAcpiTableGuid, (VOID *)(UINTN)pSystemTableInfo->AcpiTableBase);\r
+               ASSERT_EFI_ERROR (Status);\r
+       }\r
+       \r
+       //\r
+       // Install Smbios Table\r
+       //\r
+       if (pSystemTableInfo->SmbiosTableBase != 0 && pSystemTableInfo->SmbiosTableSize != 0) {                 \r
+               DEBUG ((EFI_D_ERROR, "Install Smbios Table at 0x%x, length 0x%x\n", (UINTN)pSystemTableInfo->SmbiosTableBase, pSystemTableInfo->SmbiosTableSize));      \r
+               Status = gBS->InstallConfigurationTable (&gEfiSmbiosTableGuid, (VOID *)(UINTN)pSystemTableInfo->SmbiosTableBase);\r
+               ASSERT_EFI_ERROR (Status);\r
+       }\r
+       \r
+       //\r
+       // Find the acpi board information guid hob\r
+       //\r
+       GuidHob = GetFirstGuidHob (&gUefiAcpiBoardInfoGuid);\r
+       ASSERT (GuidHob != NULL);\r
+  pAcpiBoardInfo = (ACPI_BOARD_INFO *)GET_GUID_HOB_DATA (GuidHob); \r
+  \r
+  mPmCtrlReg = (UINTN)pAcpiBoardInfo->PmCtrlRegBase;\r
+       DEBUG ((EFI_D_ERROR, "PmCtrlReg at 0x%x\n", mPmCtrlReg));       \r
+        \r
+       //\r
+       // Register callback on the ready to boot event \r
+       // in order to enable SCI\r
+       //      \r
+       ReadyToBootEvent = NULL;\r
+  Status = EfiCreateEventReadyToBootEx (\r
+                    TPL_CALLBACK,\r
+                    OnReadyToBoot,\r
+                    NULL,\r
+                    &ReadyToBootEvent\r
+                    );\r
+  ASSERT_EFI_ERROR (Status);\r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r