summaryrefslogtreecommitdiffstats
path: root/CorebootModulePkg/CbSupportPei/CbSupportPei.c
diff options
context:
space:
mode:
Diffstat (limited to 'CorebootModulePkg/CbSupportPei/CbSupportPei.c')
-rwxr-xr-xCorebootModulePkg/CbSupportPei/CbSupportPei.c126
1 files changed, 80 insertions, 46 deletions
diff --git a/CorebootModulePkg/CbSupportPei/CbSupportPei.c b/CorebootModulePkg/CbSupportPei/CbSupportPei.c
index 80fd611bc8..8fa0ac5c1e 100755
--- a/CorebootModulePkg/CbSupportPei/CbSupportPei.c
+++ b/CorebootModulePkg/CbSupportPei/CbSupportPei.c
@@ -141,6 +141,72 @@ CbPeiReportRemainedFvs (
}
/**
+ Based on memory base, size and type, build resource descripter HOB.
+
+ @param Base Memory base address.
+ @param Size Memory size.
+ @param Type Memory type.
+ @param Param A pointer to CB_MEM_INFO.
+
+ @retval EFI_SUCCESS if it completed successfully.
+**/
+EFI_STATUS
+CbMemInfoCallback (
+ UINT64 Base,
+ UINT64 Size,
+ UINT32 Type,
+ VOID *Param
+ )
+{
+ CB_MEM_INFO *MemInfo;
+ UINTN Attribue;
+
+ Attribue = EFI_RESOURCE_ATTRIBUTE_PRESENT |
+ EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
+ EFI_RESOURCE_ATTRIBUTE_TESTED |
+ EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
+ EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
+ EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
+ EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE;
+
+ MemInfo = (CB_MEM_INFO *)Param;
+ if (Base >= 0x100000) {
+ if (Type == CB_MEM_RAM) {
+ if (Base < 0x100000000ULL) {
+ MemInfo->UsableLowMemTop = (UINT32)(Base + Size);
+ } else {
+ Attribue &= ~EFI_RESOURCE_ATTRIBUTE_TESTED;
+ }
+ BuildResourceDescriptorHob (
+ EFI_RESOURCE_SYSTEM_MEMORY,
+ Attribue,
+ (EFI_PHYSICAL_ADDRESS)Base,
+ Size
+ );
+ } else if (Type == CB_MEM_TABLE) {
+ BuildResourceDescriptorHob (
+ EFI_RESOURCE_MEMORY_RESERVED,
+ Attribue,
+ (EFI_PHYSICAL_ADDRESS)Base,
+ Size
+ );
+ MemInfo->SystemLowMemTop = ((UINT32)(Base + Size) + 0x0FFFFFFF) & 0xF0000000;
+ } else if (Type == CB_MEM_RESERVED) {
+ if ((MemInfo->SystemLowMemTop == 0) || (Base < MemInfo->SystemLowMemTop)) {
+ BuildResourceDescriptorHob (
+ EFI_RESOURCE_MEMORY_RESERVED,
+ Attribue,
+ (EFI_PHYSICAL_ADDRESS)Base,
+ Size
+ );
+ }
+ }
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
This is the entrypoint of PEIM
@param FileHandle Handle of the file being invoked.
@@ -155,9 +221,9 @@ CbPeiEntryPoint (
IN CONST EFI_PEI_SERVICES **PeiServices
)
{
- EFI_STATUS Status;
- UINT64 LowMemorySize, HighMemorySize;
- UINT64 PeiMemSize = SIZE_64MB; // 64 MB
+ EFI_STATUS Status;
+ UINT64 LowMemorySize;
+ UINT64 PeiMemSize = SIZE_64MB; // 64 MB
EFI_PHYSICAL_ADDRESS PeiMemBase = 0;
UINT32 RegEax;
UINT8 PhysicalAddressBits;
@@ -173,23 +239,12 @@ CbPeiEntryPoint (
UINTN PmCtrlRegBase, PmTimerRegBase, ResetRegAddress, ResetValue;
UINTN PmEvtBase;
UINTN PmGpeEnBase;
-
- LowMemorySize = 0;
- HighMemorySize = 0;
-
- Status = CbParseMemoryInfo (&LowMemorySize, &HighMemorySize);
- if (EFI_ERROR(Status))
- return Status;
-
- DEBUG((EFI_D_ERROR, "LowMemorySize: 0x%lx.\n", LowMemorySize));
- DEBUG((EFI_D_ERROR, "HighMemorySize: 0x%lx.\n", HighMemorySize));
-
- ASSERT (LowMemorySize > 0);
+ CB_MEM_INFO CbMemInfo;
//
// Report lower 640KB of RAM. Attribute EFI_RESOURCE_ATTRIBUTE_TESTED
- // is intentionally omitted to prevent erasing of the coreboot header
- // record before it is processed by CbParseMemoryInfo.
+ // is intentionally omitted to prevent erasing of the coreboot header
+ // record before it is processed by CbParseMemoryInfo.
//
BuildResourceDescriptorHob (
EFI_RESOURCE_SYSTEM_MEMORY,
@@ -221,37 +276,16 @@ CbPeiEntryPoint (
(UINT64)(0x60000)
);
- BuildResourceDescriptorHob (
- EFI_RESOURCE_SYSTEM_MEMORY,
- (
- EFI_RESOURCE_ATTRIBUTE_PRESENT |
- EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
- EFI_RESOURCE_ATTRIBUTE_TESTED |
- EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
- EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
- EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
- EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
- ),
- (EFI_PHYSICAL_ADDRESS)(0x100000),
- (UINT64) (LowMemorySize - 0x100000)
- );
-
- if (HighMemorySize > 0) {
- BuildResourceDescriptorHob (
- EFI_RESOURCE_SYSTEM_MEMORY,
- (
- EFI_RESOURCE_ATTRIBUTE_PRESENT |
- EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
- EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
- EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
- EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
- EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
- ),
- (EFI_PHYSICAL_ADDRESS)(0x100000000ULL),
- HighMemorySize
- );
+ ZeroMem (&CbMemInfo, sizeof(CbMemInfo));
+ Status = CbParseMemoryInfo (CbMemInfoCallback, (VOID *)&CbMemInfo);
+ if (EFI_ERROR(Status)) {
+ return Status;
}
+ LowMemorySize = CbMemInfo.UsableLowMemTop;
+ DEBUG ((EFI_D_INFO, "Low memory 0x%lx\n", LowMemorySize));
+ DEBUG ((EFI_D_INFO, "SystemLowMemTop 0x%x\n", CbMemInfo.SystemLowMemTop));
+
//
// Should be 64k aligned
//