From 1c3175982c067ea30fd21b6c6aa231c2c5fade1f Mon Sep 17 00:00:00 2001 From: BigfootACA Date: Thu, 10 Feb 2022 21:11:11 +0800 Subject: [PATCH] (TEST) MemoryInitPeiLib: select memory based on fdt --- .../Include/Configuration/DeviceMemoryMap.h | 25 ++++++- .../MemoryInitPeiLib/MemoryInitPeiLib.c | 68 +++++++++++-------- 2 files changed, 63 insertions(+), 30 deletions(-) diff --git a/sdm845Pkg/Include/Configuration/DeviceMemoryMap.h b/sdm845Pkg/Include/Configuration/DeviceMemoryMap.h index 1614798..fbc1ca4 100644 --- a/sdm845Pkg/Include/Configuration/DeviceMemoryMap.h +++ b/sdm845Pkg/Include/Configuration/DeviceMemoryMap.h @@ -14,7 +14,7 @@ EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE | \ EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTABLE -typedef enum { NoHob, AddMem, AddDev, MaxMem } DeviceMemoryAddHob; +typedef enum { NoHob, AddMem, AddDev, Mem4G, Mem6G, Mem8G, Mem10G, MaxMem } DeviceMemoryAddHob; typedef struct { EFI_PHYSICAL_ADDRESS Address; @@ -158,6 +158,29 @@ static ARM_MEMORY_REGION_DESCRIPTOR_EX gDeviceMemoryDescriptorEx[] = { ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED, AddMem, EfiRuntimeServicesData}, + /* 4GiB Memory */ + {0xA0000000, 0xDDFA0000, EFI_RESOURCE_SYSTEM_MEMORY, + SYSTEM_MEMORY_RESOURCE_ATTR_CAPABILITIES, + ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK, Mem4G, EfiConventionalMemory}, + + /* 6GiB Memory */ + {0xA0000000, 0x15AE00000, EFI_RESOURCE_SYSTEM_MEMORY, + SYSTEM_MEMORY_RESOURCE_ATTR_CAPABILITIES, + ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK, Mem6G, EfiConventionalMemory}, + + /* 8GiB Memory */ + {0xA0000000, 0xE0000000, EFI_RESOURCE_SYSTEM_MEMORY, + SYSTEM_MEMORY_RESOURCE_ATTR_CAPABILITIES, + ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK, Mem8G, EfiConventionalMemory}, + {0x180000000, 0xFC8A0000, EFI_RESOURCE_SYSTEM_MEMORY, + SYSTEM_MEMORY_RESOURCE_ATTR_CAPABILITIES, + ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK, Mem8G, EfiConventionalMemory}, + + /* 10GiB Memory */ + {0xA0000000, 0x254AC0000, EFI_RESOURCE_SYSTEM_MEMORY, + SYSTEM_MEMORY_RESOURCE_ATTR_CAPABILITIES, + ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK, Mem10G, EfiConventionalMemory}, + /* Other */ /* AOP_SS_MSG_RAM */ diff --git a/sdm845Pkg/Library/MemoryInitPeiLib/MemoryInitPeiLib.c b/sdm845Pkg/Library/MemoryInitPeiLib/MemoryInitPeiLib.c index 52bd856..db27491 100644 --- a/sdm845Pkg/Library/MemoryInitPeiLib/MemoryInitPeiLib.c +++ b/sdm845Pkg/Library/MemoryInitPeiLib/MemoryInitPeiLib.c @@ -26,6 +26,15 @@ // This varies by device #include +#define SIZE_KB ((UINTN)(1024)) +#define SIZE_MB ((UINTN)(SIZE_KB * 1024)) +#define SIZE_GB ((UINTN)(SIZE_MB * 1024)) +#define SIZE_MB_BIG(_Size,_Value) ((_Size) > ((_Value) * SIZE_MB)) +#define SIZE_MB_SMALL(_Size,_Value) ((_Size) < ((_Value) * SIZE_MB)) +#define SIZE_MB_IN(_Min,_Max,_Size) \ + if (SIZE_MB_BIG((MemoryTotal), (_Min)) && SIZE_MB_SMALL((MemoryTotal), (_Max)))\ + Mem = Mem##_Size##G, MemGB = _Size + extern UINT64 mSystemMemoryEnd; VOID BuildMemoryTypeInformationHob(VOID); @@ -89,16 +98,46 @@ MemoryPeim(IN EFI_PHYSICAL_ADDRESS UefiMemoryBase, IN UINT64 UefiMemorySize) UINTN MemoryBase = 0; UINTN MemorySize = 0; UINTN MemoryTotal = 0; + DeviceMemoryAddHob Mem = Mem4G; + UINT8 MemGB = 4; fdt *Fdt; Fdt = GetFdt(); ASSERT(Fdt != NULL); + while (fdt_get_memory(Fdt, (int)Node, (uint64_t*)&MemoryBase, (uint64_t*)&MemorySize)) { + MemoryTotal += MemorySize; + DEBUG(( + EFI_D_INFO, + "FDT Memory %-2d: 0x%016llx - 0x%016llx (0x%016llx)\n", + Node, MemoryBase, (MemoryBase + MemorySize), MemorySize + )); + Node++; + } + + // Memory Min Max Config + SIZE_MB_IN (3072, 4608, 4); + SIZE_MB_IN (5120, 6656, 6); + SIZE_MB_IN (7168, 8704, 8); + SIZE_MB_IN (9216, 10752, 10); + + DEBUG((EFI_D_INFO, "FDT Memory Total: 0x%016lx (%d GiB)\n", MemoryTotal, MemoryTotal / SIZE_GB)); + DEBUG((EFI_D_INFO, "Select Config: %d GiB\n", MemGB)); + // Run through each memory descriptor while (MemoryDescriptorEx->Length != 0) { if (MemoryDescriptorEx->MemoryType == EfiConventionalMemory) MemoryTotal += MemoryDescriptorEx->Length; switch (MemoryDescriptorEx->HobOption) { + case Mem4G: + case Mem6G: + case Mem8G: + case Mem10G: + if (MemoryDescriptorEx->HobOption != Mem) { + MemoryDescriptorEx++; + continue; + } + // fallthrough case AddMem: case AddDev: AddHob(MemoryDescriptorEx); @@ -120,33 +159,6 @@ MemoryPeim(IN EFI_PHYSICAL_ADDRESS UefiMemoryBase, IN UINT64 UefiMemorySize) MemoryDescriptorEx++; } - while (fdt_get_memory(Fdt, (int)Node, (uint64_t*)&MemoryBase, (uint64_t*)&MemorySize)) { - MemoryTotal += MemorySize; - DEBUG(( - EFI_D_INFO, - "FDT Memory %-2d: 0x%016llx - 0x%016llx (0x%016llx)\n", - Node, MemoryBase, (MemoryBase + MemorySize), MemorySize - )); - ASSERT(Index < MAX_ARM_MEMORY_REGION_DESCRIPTOR_COUNT); - MemoryDescriptor[Index].PhysicalBase = MemoryBase; - MemoryDescriptor[Index].VirtualBase = MemoryBase; - MemoryDescriptor[Index].Length = MemorySize; - MemoryDescriptor[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK; - BuildResourceDescriptorHob( - EFI_RESOURCE_SYSTEM_MEMORY, - SYSTEM_MEMORY_RESOURCE_ATTR_CAPABILITIES, - MemoryBase, - MemorySize - ); - BuildMemoryAllocationHob( - MemoryBase, - MemorySize, - EfiConventionalMemory - ); - Index++; - Node++; - } - // Last one (terminator) ASSERT(Index < MAX_ARM_MEMORY_REGION_DESCRIPTOR_COUNT); MemoryDescriptor[Index].PhysicalBase = 0; @@ -154,8 +166,6 @@ MemoryPeim(IN EFI_PHYSICAL_ADDRESS UefiMemoryBase, IN UINT64 UefiMemorySize) MemoryDescriptor[Index].Length = 0; MemoryDescriptor[Index].Attributes = 0; - DEBUG((EFI_D_INFO, "Memory Total: 0x%016lx (%d GiB)\n", MemoryTotal, MemoryTotal / (1024 * 1024 * 1024))); - // Build Memory Allocation Hob DEBUG((EFI_D_INFO, "Configure MMU In \n")); InitMmu(MemoryDescriptor); -- 2.45.2