]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c
UefiPayloadPkg: Fix the build failure for non-universal payload
[mirror_edk2.git] / UefiPayloadPkg / UefiPayloadEntry / UefiPayloadEntry.c
index 91b3a874139dca17c52076682ea6ee7ce9d6e592..9efe01d0941deea388370b78e5206d69ad74f083 100644 (file)
@@ -24,7 +24,7 @@ STATIC UINT32 mTopOfLowerUsableDram = 0;
 **/\r
 EFI_STATUS\r
 MemInfoCallbackMmio (\r
-  IN MEMROY_MAP_ENTRY          *MemoryMapEntry,\r
+  IN MEMORY_MAP_ENTRY          *MemoryMapEntry,\r
   IN VOID                      *Params\r
   )\r
 {\r
@@ -103,7 +103,7 @@ MemInfoCallbackMmio (
 **/\r
 EFI_STATUS\r
 FindToludCallback (\r
-  IN MEMROY_MAP_ENTRY          *MemoryMapEntry,\r
+  IN MEMORY_MAP_ENTRY          *MemoryMapEntry,\r
   IN VOID                      *Params\r
   )\r
 {\r
@@ -168,7 +168,7 @@ FindToludCallback (
 **/\r
 EFI_STATUS\r
 MemInfoCallback (\r
-  IN MEMROY_MAP_ENTRY          *MemoryMapEntry,\r
+  IN MEMORY_MAP_ENTRY          *MemoryMapEntry,\r
   IN VOID                      *Params\r
   )\r
 {\r
@@ -198,11 +198,6 @@ MemInfoCallback (
              EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
              EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE;\r
 \r
-  if (Base >= BASE_4GB) {\r
-    // Remove tested attribute to avoid DXE core to dispatch driver to memory above 4GB\r
-    Attribue &= ~EFI_RESOURCE_ATTRIBUTE_TESTED;\r
-  }\r
-\r
   BuildResourceDescriptorHob (Type, Attribue, (EFI_PHYSICAL_ADDRESS)Base, Size);\r
   DEBUG ((DEBUG_INFO , "buildhob: base = 0x%lx, size = 0x%lx, type = 0x%x\n", Base, Size, Type));\r
 \r
@@ -217,167 +212,6 @@ MemInfoCallback (
 \r
 \r
 \r
-/**\r
-  Find the board related info from ACPI table\r
-\r
-  @param  AcpiTableBase          ACPI table start address in memory\r
-  @param  AcpiBoardInfo          Pointer to the acpi board info strucutre\r
-\r
-  @retval RETURN_SUCCESS     Successfully find out all the required information.\r
-  @retval RETURN_NOT_FOUND   Failed to find the required info.\r
-\r
-**/\r
-RETURN_STATUS\r
-ParseAcpiInfo (\r
-  IN   UINT64                                   AcpiTableBase,\r
-  OUT  ACPI_BOARD_INFO                          *AcpiBoardInfo\r
-  )\r
-{\r
-  EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *Rsdp;\r
-  EFI_ACPI_DESCRIPTION_HEADER                   *Rsdt;\r
-  UINT32                                        *Entry32;\r
-  UINTN                                         Entry32Num;\r
-  EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE     *Fadt;\r
-  EFI_ACPI_DESCRIPTION_HEADER                   *Xsdt;\r
-  UINT64                                        *Entry64;\r
-  UINTN                                         Entry64Num;\r
-  UINTN                                         Idx;\r
-  UINT32                                        *Signature;\r
-  EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *MmCfgHdr;\r
-  EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *MmCfgBase;\r
-\r
-  Rsdp = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)(UINTN)AcpiTableBase;\r
-  DEBUG ((DEBUG_INFO, "Rsdp at 0x%p\n", Rsdp));\r
-  DEBUG ((DEBUG_INFO, "Rsdt at 0x%x, Xsdt at 0x%lx\n", Rsdp->RsdtAddress, Rsdp->XsdtAddress));\r
-\r
-  //\r
-  // Search Rsdt First\r
-  //\r
-  Fadt     = NULL;\r
-  MmCfgHdr = NULL;\r
-  Rsdt     = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->RsdtAddress);\r
-  if (Rsdt != NULL) {\r
-    Entry32  = (UINT32 *)(Rsdt + 1);\r
-    Entry32Num = (Rsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 2;\r
-    for (Idx = 0; Idx < Entry32Num; Idx++) {\r
-      Signature = (UINT32 *)(UINTN)Entry32[Idx];\r
-      if (*Signature == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
-        Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)Signature;\r
-        DEBUG ((DEBUG_INFO, "Found Fadt in Rsdt\n"));\r
-      }\r
-\r
-      if (*Signature == EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE) {\r
-        MmCfgHdr = (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *)Signature;\r
-        DEBUG ((DEBUG_INFO, "Found MM config address in Rsdt\n"));\r
-      }\r
-\r
-      if ((Fadt != NULL) && (MmCfgHdr != NULL)) {\r
-        goto Done;\r
-      }\r
-    }\r
-  }\r
-\r
-  //\r
-  // Search Xsdt Second\r
-  //\r
-  Xsdt     = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->XsdtAddress);\r
-  if (Xsdt != NULL) {\r
-    Entry64  = (UINT64 *)(Xsdt + 1);\r
-    Entry64Num = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 3;\r
-    for (Idx = 0; Idx < Entry64Num; Idx++) {\r
-      Signature = (UINT32 *)(UINTN)Entry64[Idx];\r
-      if (*Signature == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
-        Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)Signature;\r
-        DEBUG ((DEBUG_INFO, "Found Fadt in Xsdt\n"));\r
-      }\r
-\r
-      if (*Signature == EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE) {\r
-        MmCfgHdr = (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *)Signature;\r
-        DEBUG ((DEBUG_INFO, "Found MM config address in Xsdt\n"));\r
-      }\r
-\r
-      if ((Fadt != NULL) && (MmCfgHdr != NULL)) {\r
-        goto Done;\r
-      }\r
-    }\r
-  }\r
-\r
-  if (Fadt == NULL) {\r
-    return RETURN_NOT_FOUND;\r
-  }\r
-\r
-Done:\r
-\r
-  AcpiBoardInfo->PmCtrlRegBase   = Fadt->Pm1aCntBlk;\r
-  AcpiBoardInfo->PmTimerRegBase  = Fadt->PmTmrBlk;\r
-  AcpiBoardInfo->ResetRegAddress = Fadt->ResetReg.Address;\r
-  AcpiBoardInfo->ResetValue      = Fadt->ResetValue;\r
-  AcpiBoardInfo->PmEvtBase       = Fadt->Pm1aEvtBlk;\r
-  AcpiBoardInfo->PmGpeEnBase     = Fadt->Gpe0Blk + Fadt->Gpe0BlkLen / 2;\r
-\r
-  if (MmCfgHdr != NULL) {\r
-    MmCfgBase = (EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *)((UINT8*) MmCfgHdr + sizeof (*MmCfgHdr));\r
-    AcpiBoardInfo->PcieBaseAddress = MmCfgBase->BaseAddress;\r
-    AcpiBoardInfo->PcieBaseSize = (MmCfgBase->EndBusNumber + 1 - MmCfgBase->StartBusNumber) * 4096 * 32 * 8;\r
-  } else {\r
-    AcpiBoardInfo->PcieBaseAddress = 0;\r
-    AcpiBoardInfo->PcieBaseSize = 0;\r
-  }\r
-  DEBUG ((DEBUG_INFO, "PmCtrl  Reg 0x%lx\n",  AcpiBoardInfo->PmCtrlRegBase));\r
-  DEBUG ((DEBUG_INFO, "PmTimer Reg 0x%lx\n",  AcpiBoardInfo->PmTimerRegBase));\r
-  DEBUG ((DEBUG_INFO, "Reset   Reg 0x%lx\n",  AcpiBoardInfo->ResetRegAddress));\r
-  DEBUG ((DEBUG_INFO, "Reset   Value 0x%x\n", AcpiBoardInfo->ResetValue));\r
-  DEBUG ((DEBUG_INFO, "PmEvt   Reg 0x%lx\n",  AcpiBoardInfo->PmEvtBase));\r
-  DEBUG ((DEBUG_INFO, "PmGpeEn Reg 0x%lx\n",  AcpiBoardInfo->PmGpeEnBase));\r
-  DEBUG ((DEBUG_INFO, "PcieBaseAddr 0x%lx\n", AcpiBoardInfo->PcieBaseAddress));\r
-  DEBUG ((DEBUG_INFO, "PcieBaseSize 0x%lx\n", AcpiBoardInfo->PcieBaseSize));\r
-\r
-  //\r
-  // Verify values for proper operation\r
-  //\r
-  ASSERT(Fadt->Pm1aCntBlk != 0);\r
-  ASSERT(Fadt->PmTmrBlk != 0);\r
-  ASSERT(Fadt->ResetReg.Address != 0);\r
-  ASSERT(Fadt->Pm1aEvtBlk != 0);\r
-  ASSERT(Fadt->Gpe0Blk != 0);\r
-\r
-  DEBUG_CODE_BEGIN ();\r
-    BOOLEAN    SciEnabled;\r
-\r
-    //\r
-    // Check the consistency of SCI enabling\r
-    //\r
-\r
-    //\r
-    // Get SCI_EN value\r
-    //\r
-   if (Fadt->Pm1CntLen == 4) {\r
-      SciEnabled = (IoRead32 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;\r
-    } else {\r
-      //\r
-      // if (Pm1CntLen == 2), use 16 bit IO read;\r
-      // if (Pm1CntLen != 2 && Pm1CntLen != 4), use 16 bit IO read as a fallback\r
-      //\r
-      SciEnabled = (IoRead16 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;\r
-    }\r
-\r
-    if (!(Fadt->Flags & EFI_ACPI_5_0_HW_REDUCED_ACPI) &&\r
-        (Fadt->SmiCmd == 0) &&\r
-       !SciEnabled) {\r
-      //\r
-      // The ACPI enabling status is inconsistent: SCI is not enabled but ACPI\r
-      // table does not provide a means to enable it through FADT->SmiCmd\r
-      //\r
-      DEBUG ((DEBUG_ERROR, "ERROR: The ACPI enabling status is inconsistent: SCI is not"\r
-        " enabled but the ACPI table does not provide a means to enable it through FADT->SmiCmd."\r
-        " This may cause issues in OS.\n"));\r
-    }\r
-  DEBUG_CODE_END ();\r
-\r
-  return RETURN_SUCCESS;\r
-}\r
-\r
-\r
 /**\r
   It will build HOBs based on information from bootloaders.\r
 \r
@@ -392,8 +226,7 @@ BuildHobFromBl (
   EFI_STATUS                       Status;\r
   SYSTEM_TABLE_INFO                SysTableInfo;\r
   SYSTEM_TABLE_INFO                *NewSysTableInfo;\r
-  ACPI_BOARD_INFO                  AcpiBoardInfo;\r
-  ACPI_BOARD_INFO                  *NewAcpiBoardInfo;\r
+  ACPI_BOARD_INFO                  *AcpiBoardInfo;\r
   EFI_PEI_GRAPHICS_INFO_HOB        GfxInfo;\r
   EFI_PEI_GRAPHICS_INFO_HOB        *NewGfxInfo;\r
   EFI_PEI_GRAPHICS_DEVICE_INFO_HOB GfxDeviceInfo;\r
@@ -476,24 +309,26 @@ BuildHobFromBl (
   //\r
   // Create guid hob for acpi board information\r
   //\r
-  Status = ParseAcpiInfo (SysTableInfo.AcpiTableBase, &AcpiBoardInfo);\r
-  ASSERT_EFI_ERROR (Status);\r
-  if (!EFI_ERROR (Status)) {\r
-    NewAcpiBoardInfo = BuildGuidHob (&gUefiAcpiBoardInfoGuid, sizeof (ACPI_BOARD_INFO));\r
-    ASSERT (NewAcpiBoardInfo != NULL);\r
-    CopyMem (NewAcpiBoardInfo, &AcpiBoardInfo, sizeof (ACPI_BOARD_INFO));\r
-    DEBUG ((DEBUG_INFO, "Create acpi board info guid hob\n"));\r
-  }\r
+  AcpiBoardInfo = BuildHobFromAcpi (SysTableInfo.AcpiTableBase);\r
+  ASSERT (AcpiBoardInfo != NULL);\r
 \r
   //\r
   // Parse memory info and build memory HOBs for reserved DRAM and MMIO\r
   //\r
   DEBUG ((DEBUG_INFO , "Building ResourceDescriptorHobs for reserved memory:\n"));\r
-  Status = ParseMemoryInfo (MemInfoCallbackMmio, &AcpiBoardInfo);\r
+  Status = ParseMemoryInfo (MemInfoCallbackMmio, AcpiBoardInfo);\r
   if (EFI_ERROR(Status)) {\r
     return Status;\r
   }\r
 \r
+  //\r
+  // Parse the misc info provided by bootloader\r
+  //\r
+  Status = ParseMiscInfo ();\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((DEBUG_WARN, "Error when parsing misc info, Status = %r\n", Status));\r
+  }\r
+\r
   //\r
   // Parse platform specific information.\r
   //\r
@@ -554,28 +389,27 @@ BuildGenericHob (
 /**\r
   Entry point to the C language phase of UEFI payload.\r
 \r
+  @param[in]   BootloaderParameter    The starting address of bootloader parameter block.\r
+\r
   @retval      It will not return if SUCCESS, and return error when passing bootloader parameter.\r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
-PayloadEntry (\r
+_ModuleEntryPoint (\r
   IN UINTN                     BootloaderParameter\r
   )\r
 {\r
   EFI_STATUS                    Status;\r
   PHYSICAL_ADDRESS              DxeCoreEntryPoint;\r
-  EFI_HOB_HANDOFF_INFO_TABLE    *HandoffHobTable;\r
   UINTN                         MemBase;\r
-  UINTN                         MemSize;\r
   UINTN                         HobMemBase;\r
   UINTN                         HobMemTop;\r
   EFI_PEI_HOB_POINTERS          Hob;\r
+  SERIAL_PORT_INFO              SerialPortInfo;\r
+  UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO  *UniversalSerialPort;\r
 \r
-  // Call constructor for all libraries\r
-  ProcessLibraryConstructorList ();\r
-\r
-  DEBUG ((DEBUG_INFO, "GET_BOOTLOADER_PARAMETER() = 0x%lx\n", GET_BOOTLOADER_PARAMETER()));\r
-  DEBUG ((DEBUG_INFO, "sizeof(UINTN) = 0x%x\n", sizeof(UINTN)));\r
+  Status = PcdSet64S (PcdBootloaderParameter, BootloaderParameter);\r
+  ASSERT_EFI_ERROR (Status);\r
 \r
   // Initialize floating point operating environment to be compliant with UEFI spec.\r
   InitializeFloatingPointUnits ();\r
@@ -585,9 +419,26 @@ PayloadEntry (
   HobMemBase = ALIGN_VALUE (MemBase + PcdGet32 (PcdPayloadFdMemSize), SIZE_1MB);\r
   HobMemTop  = HobMemBase + FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);\r
 \r
-  // DXE core assumes the memory below HOB region could be used, so include the FV region memory into HOB range.\r
-  MemSize    = HobMemTop - MemBase;\r
-  HandoffHobTable = HobConstructor ((VOID *)MemBase, MemSize, (VOID *)HobMemBase, (VOID *)HobMemTop);\r
+  HobConstructor ((VOID *)MemBase, (VOID *)HobMemTop, (VOID *)HobMemBase, (VOID *)HobMemTop);\r
+\r
+  //\r
+  // Build serial port info\r
+  //\r
+  Status = ParseSerialInfo (&SerialPortInfo);\r
+  if (!EFI_ERROR (Status)) {\r
+    UniversalSerialPort = BuildGuidHob (&gUniversalPayloadSerialPortInfoGuid, sizeof (UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO));\r
+    ASSERT (UniversalSerialPort != NULL);\r
+    UniversalSerialPort->Header.Revision = UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO_REVISION;\r
+    UniversalSerialPort->Header.Length   = sizeof (UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO);\r
+    UniversalSerialPort->UseMmio         = (SerialPortInfo.Type == 1)?FALSE:TRUE;\r
+    UniversalSerialPort->RegisterBase    = SerialPortInfo.BaseAddr;\r
+    UniversalSerialPort->BaudRate        = SerialPortInfo.Baud;\r
+    UniversalSerialPort->RegisterStride  = (UINT8)SerialPortInfo.RegWidth;\r
+  }\r
+\r
+  // The library constructors might depend on serial port, so call it after serial port hob\r
+  ProcessLibraryConstructorList ();\r
+  DEBUG ((DEBUG_INFO, "sizeof(UINTN) = 0x%x\n", sizeof(UINTN)));\r
 \r
   // Build HOB based on information from Bootloader\r
   Status = BuildHobFromBl ();\r
@@ -611,7 +462,7 @@ PayloadEntry (
   IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);\r
   IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE,  0xFF);\r
 \r
-  Hob.HandoffInformationTable = HandoffHobTable;\r
+  Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE *) GetFirstHob(EFI_HOB_TYPE_HANDOFF);\r
   HandOffToDxeCore (DxeCoreEntryPoint, Hob);\r
 \r
   // Should not get here\r