**/\r
EFI_STATUS\r
MemInfoCallbackMmio (\r
- IN MEMROY_MAP_ENTRY *MemoryMapEntry,\r
+ IN MEMORY_MAP_ENTRY *MemoryMapEntry,\r
IN VOID *Params\r
)\r
{\r
\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
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
//\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
**/\r
EFI_STATUS\r
EFIAPI\r
-PayloadEntry (\r
+_ModuleEntryPoint (\r
IN UINTN BootloaderParameter\r
)\r
{\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
\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