(TEST) MemoryInitPeiLib: select memory based on fdt

This commit is contained in:
BigfootACA 2022-02-10 21:11:11 +08:00
parent 0a8aa1487b
commit 1c3175982c
2 changed files with 63 additions and 30 deletions

View File

@ -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 */

View File

@ -26,6 +26,15 @@
// This varies by device
#include <Configuration/DeviceMemoryMap.h>
#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);