(TEST) MemoryInitPeiLib: select memory based on fdt
This commit is contained in:
parent
0a8aa1487b
commit
1c3175982c
@ -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 */
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user