summaryrefslogtreecommitdiffstats
path: root/CorebootModulePkg/CbSupportPei
diff options
context:
space:
mode:
authorgdong1 <guo.dong@intel.com>2016-10-26 16:48:40 -0700
committerMaurice Ma <maurice.ma@intel.com>2016-10-26 17:11:54 -0700
commit2d90b74d027b457615c0739ac9114a976be9eaed (patch)
tree329c5e2ede4a6bd69c83218932c8f3492ccf727a /CorebootModulePkg/CbSupportPei
parentc46bf81d2d966d51b07f7bf16c202f8fc1c4d50b (diff)
downloadedk2-2d90b74d027b457615c0739ac9114a976be9eaed.tar.gz
edk2-2d90b74d027b457615c0739ac9114a976be9eaed.tar.bz2
edk2-2d90b74d027b457615c0739ac9114a976be9eaed.zip
CorebootModulePkg: Fix memmap issue
Some reserved memory (e.g. CSE reserved memory) might be in the middle of usable physical memory. The current memory map caculation could not handle this case. This patch fixed this issue. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: gdong1 <guo.dong@intel.com> Reviewed-by: Maurice Ma <maurice.ma@intel.com>
Diffstat (limited to 'CorebootModulePkg/CbSupportPei')
-rwxr-xr-xCorebootModulePkg/CbSupportPei/CbSupportPei.c126
-rw-r--r--CorebootModulePkg/CbSupportPei/CbSupportPei.h6
2 files changed, 86 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
//
diff --git a/CorebootModulePkg/CbSupportPei/CbSupportPei.h b/CorebootModulePkg/CbSupportPei/CbSupportPei.h
index f897dc4ac5..ed5cdb4ab0 100644
--- a/CorebootModulePkg/CbSupportPei/CbSupportPei.h
+++ b/CorebootModulePkg/CbSupportPei/CbSupportPei.h
@@ -38,5 +38,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include <Guid/AcpiBoardInfoGuid.h>
#include <Ppi/MasterBootMode.h>
+#include "Coreboot.h"
+
+typedef struct {
+ UINT32 UsableLowMemTop;
+ UINT32 SystemLowMemTop;
+} CB_MEM_INFO;
#endif