]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c
UefiPayloadPkg: Replace MEMROY_ENTRY by MEMORY_ENTRY
[mirror_edk2.git] / UefiPayloadPkg / UefiPayloadEntry / UefiPayloadEntry.c
index ae16f25c7c0e0023282f7cbfc1075e0fc7fdc23c..3646da2ba53050d976462ea377afc8816d24cf95 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
@@ -212,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
@@ -387,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
@@ -471,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
@@ -553,7 +393,7 @@ BuildGenericHob (
 **/\r
 EFI_STATUS\r
 EFIAPI\r
-PayloadEntry (\r
+_ModuleEntryPoint (\r
   IN UINTN                     BootloaderParameter\r
   )\r
 {\r
@@ -563,12 +403,11 @@ PayloadEntry (
   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
@@ -580,6 +419,25 @@ PayloadEntry (
 \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
   if (EFI_ERROR (Status)) {\r