This PEIM will parse coreboot table in memory and report resource information into pei core.\r
This file contains the main entrypoint of the PEIM.\r
\r
-Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2014 - 2016, 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
#define LEGACY_8259_MASK_REGISTER_SLAVE 0xA1\r
\r
EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {\r
- { EfiACPIReclaimMemory, 0x008 },\r
- { EfiACPIMemoryNVS, 0x004 },\r
- { EfiReservedMemoryType, 0x004 },\r
- { EfiRuntimeServicesData, 0x080 },\r
- { EfiRuntimeServicesCode, 0x080 },\r
+ { EfiACPIReclaimMemory, FixedPcdGet32 (PcdMemoryTypeEfiACPIReclaimMemory) },\r
+ { EfiACPIMemoryNVS, FixedPcdGet32 (PcdMemoryTypeEfiACPIMemoryNVS) },\r
+ { EfiReservedMemoryType, FixedPcdGet32 (PcdMemoryTypeEfiReservedMemoryType) },\r
+ { EfiRuntimeServicesData, FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesData) },\r
+ { EfiRuntimeServicesCode, FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesCode) },\r
{ EfiMaxMemoryType, 0 }\r
};\r
\r
}\r
}\r
\r
+/**\r
+ Based on memory base, size and type, build resource descripter HOB.\r
+\r
+ @param Base Memory base address.\r
+ @param Size Memory size.\r
+ @param Type Memory type.\r
+ @param Param A pointer to CB_MEM_INFO.\r
+\r
+ @retval EFI_SUCCESS if it completed successfully.\r
+**/\r
+EFI_STATUS\r
+CbMemInfoCallback (\r
+ UINT64 Base,\r
+ UINT64 Size,\r
+ UINT32 Type,\r
+ VOID *Param\r
+ )\r
+{\r
+ CB_MEM_INFO *MemInfo;\r
+ UINTN Attribue;\r
+\r
+ Attribue = EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
+ EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
+ EFI_RESOURCE_ATTRIBUTE_TESTED |\r
+ EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
+ EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
+ EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
+ EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE;\r
+\r
+ if ((Base < 0x100000) && ((Base + Size) > 0x100000)) {\r
+ Size -= (0x100000 - Base);\r
+ Base = 0x100000;\r
+ }\r
+\r
+ MemInfo = (CB_MEM_INFO *)Param;\r
+ if (Base >= 0x100000) {\r
+ if (Type == CB_MEM_RAM) {\r
+ if (Base < 0x100000000ULL) {\r
+ MemInfo->UsableLowMemTop = (UINT32)(Base + Size);\r
+ } else {\r
+ Attribue &= ~EFI_RESOURCE_ATTRIBUTE_TESTED;\r
+ }\r
+ BuildResourceDescriptorHob (\r
+ EFI_RESOURCE_SYSTEM_MEMORY,\r
+ Attribue,\r
+ (EFI_PHYSICAL_ADDRESS)Base,\r
+ Size\r
+ );\r
+ } else if (Type == CB_MEM_TABLE) {\r
+ BuildResourceDescriptorHob (\r
+ EFI_RESOURCE_MEMORY_RESERVED,\r
+ Attribue,\r
+ (EFI_PHYSICAL_ADDRESS)Base,\r
+ Size\r
+ );\r
+ MemInfo->SystemLowMemTop = ((UINT32)(Base + Size) + 0x0FFFFFFF) & 0xF0000000;\r
+ } else if (Type == CB_MEM_RESERVED) {\r
+ if ((MemInfo->SystemLowMemTop == 0) || (Base < MemInfo->SystemLowMemTop)) {\r
+ BuildResourceDescriptorHob (\r
+ EFI_RESOURCE_MEMORY_RESERVED,\r
+ Attribue,\r
+ (EFI_PHYSICAL_ADDRESS)Base,\r
+ Size\r
+ ); \r
+ }\r
+ }\r
+ }\r
+ \r
+ return EFI_SUCCESS;\r
+}\r
+\r
/**\r
This is the entrypoint of PEIM\r
\r
IN CONST EFI_PEI_SERVICES **PeiServices\r
)\r
{\r
- EFI_STATUS Status;\r
- UINT64 LowMemorySize, HighMemorySize;\r
- UINT64 PeiMemSize = SIZE_64MB; // 64 MB\r
+ EFI_STATUS Status;\r
+ UINT64 LowMemorySize;\r
+ UINT64 PeiMemSize = SIZE_64MB; // 64 MB\r
EFI_PHYSICAL_ADDRESS PeiMemBase = 0;\r
UINT32 RegEax;\r
UINT8 PhysicalAddressBits;\r
FRAME_BUFFER_INFO* pFbInfo;\r
ACPI_BOARD_INFO* pAcpiBoardInfo;\r
UINTN PmCtrlRegBase, PmTimerRegBase, ResetRegAddress, ResetValue;\r
+ UINTN PmEvtBase;\r
+ UINTN PmGpeEnBase;\r
+ CB_MEM_INFO CbMemInfo;\r
\r
- LowMemorySize = 0;\r
- HighMemorySize = 0;\r
-\r
- Status = CbParseMemoryInfo (&LowMemorySize, &HighMemorySize);\r
- if (EFI_ERROR(Status))\r
- return Status;\r
-\r
- DEBUG((EFI_D_ERROR, "LowMemorySize: 0x%lx.\n", LowMemorySize));\r
- DEBUG((EFI_D_ERROR, "HighMemorySize: 0x%lx.\n", HighMemorySize));\r
-\r
- ASSERT (LowMemorySize > 0);\r
-\r
+ //\r
+ // Report lower 640KB of RAM. Attribute EFI_RESOURCE_ATTRIBUTE_TESTED \r
+ // is intentionally omitted to prevent erasing of the coreboot header \r
+ // record before it is processed by CbParseMemoryInfo.\r
+ //\r
BuildResourceDescriptorHob (\r
EFI_RESOURCE_SYSTEM_MEMORY,\r
(\r
EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
- EFI_RESOURCE_ATTRIBUTE_TESTED |\r
EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
(UINT64)(0x60000)\r
);\r
\r
- BuildResourceDescriptorHob (\r
- EFI_RESOURCE_SYSTEM_MEMORY,\r
- (\r
- EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
- EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
- EFI_RESOURCE_ATTRIBUTE_TESTED |\r
- EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
- EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
- EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
- EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE\r
- ),\r
- (EFI_PHYSICAL_ADDRESS)(0x100000),\r
- (UINT64) (LowMemorySize - 0x100000)\r
- );\r
-\r
- if (HighMemorySize > 0) {\r
- BuildResourceDescriptorHob (\r
- EFI_RESOURCE_SYSTEM_MEMORY,\r
- (\r
- EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
- EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
- EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
- EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
- EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
- EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE\r
- ),\r
- (EFI_PHYSICAL_ADDRESS)(0x100000000ULL),\r
- HighMemorySize\r
- );\r
+ ZeroMem (&CbMemInfo, sizeof(CbMemInfo));\r
+ Status = CbParseMemoryInfo (CbMemInfoCallback, (VOID *)&CbMemInfo);\r
+ if (EFI_ERROR(Status)) {\r
+ return Status;\r
}\r
\r
+ LowMemorySize = CbMemInfo.UsableLowMemTop;\r
+ DEBUG ((EFI_D_INFO, "Low memory 0x%lx\n", LowMemorySize));\r
+ DEBUG ((EFI_D_INFO, "SystemLowMemTop 0x%x\n", CbMemInfo.SystemLowMemTop));\r
+\r
//\r
// Should be 64k aligned\r
//\r
if ((CbParseGetCbHeader (1, &pCbHeader) == RETURN_SUCCESS)\r
&& ((UINTN)pCbHeader > BASE_4KB)) {\r
DEBUG((EFI_D_ERROR, "Actual Coreboot header: %p.\n", pCbHeader));\r
- PcdSet32 (PcdCbHeaderPointer, (UINT32)(UINTN)pCbHeader);\r
+ Status = PcdSet32S (PcdCbHeaderPointer, (UINT32)(UINTN)pCbHeader);\r
+ ASSERT_EFI_ERROR (Status);\r
}\r
\r
//\r
//\r
// Create guid hob for acpi board information\r
//\r
- Status = CbParseFadtInfo (&PmCtrlRegBase, &PmTimerRegBase, &ResetRegAddress, &ResetValue);\r
+ Status = CbParseFadtInfo (&PmCtrlRegBase, &PmTimerRegBase, &ResetRegAddress, &ResetValue, &PmEvtBase, &PmGpeEnBase);\r
ASSERT_EFI_ERROR (Status);\r
pAcpiBoardInfo = NULL;\r
pAcpiBoardInfo = BuildGuidHob (&gUefiAcpiBoardInfoGuid, sizeof (ACPI_BOARD_INFO));\r
pAcpiBoardInfo->PmTimerRegBase = (UINT64)PmTimerRegBase;\r
pAcpiBoardInfo->ResetRegAddress = (UINT64)ResetRegAddress;\r
pAcpiBoardInfo->ResetValue = (UINT8)ResetValue;\r
+ pAcpiBoardInfo->PmEvtBase = (UINT64)PmEvtBase;\r
+ pAcpiBoardInfo->PmGpeEnBase = (UINT64)PmGpeEnBase;\r
DEBUG ((EFI_D_ERROR, "Create acpi board info guid hob\n"));\r
\r
//\r
DEBUG ((EFI_D_ERROR, "Create frame buffer info guid hob\n"));\r
}\r
\r
+ //\r
+ // Parse platform specific information from coreboot. \r
+ //\r
+ Status = CbParsePlatformInfo ();\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((EFI_D_ERROR, "Error when parsing platform info, Status = %r\n", Status));\r
+ return Status;\r
+ }\r
+\r
//\r
// Mask off all legacy 8259 interrupt sources\r
//\r