}\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
+ 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
UINTN PmCtrlRegBase, PmTimerRegBase, ResetRegAddress, ResetValue;\r
UINTN PmEvtBase;\r
UINTN PmGpeEnBase;\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
+ CB_MEM_INFO CbMemInfo;\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
+ // 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
(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