X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=CorebootModulePkg%2FCbSupportPei%2FCbSupportPei.c;fp=CorebootModulePkg%2FCbSupportPei%2FCbSupportPei.c;h=8fa0ac5c1efa79b52ce59a0c84bc3de2a11f64b5;hp=80fd611bc8e43ba584ca703e2a76b72e92ffd9d1;hb=2d90b74d027b457615c0739ac9114a976be9eaed;hpb=c46bf81d2d966d51b07f7bf16c202f8fc1c4d50b 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 @@ -140,6 +140,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 @@ -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 //