(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_WRITE_BACK_CACHEABLE | \
|
||||||
EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTABLE
|
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 {
|
typedef struct {
|
||||||
EFI_PHYSICAL_ADDRESS Address;
|
EFI_PHYSICAL_ADDRESS Address;
|
||||||
@ -158,6 +158,29 @@ static ARM_MEMORY_REGION_DESCRIPTOR_EX gDeviceMemoryDescriptorEx[] = {
|
|||||||
ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED, AddMem,
|
ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED, AddMem,
|
||||||
EfiRuntimeServicesData},
|
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 */
|
/* Other */
|
||||||
|
|
||||||
/* AOP_SS_MSG_RAM */
|
/* AOP_SS_MSG_RAM */
|
||||||
|
@ -26,6 +26,15 @@
|
|||||||
// This varies by device
|
// This varies by device
|
||||||
#include <Configuration/DeviceMemoryMap.h>
|
#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;
|
extern UINT64 mSystemMemoryEnd;
|
||||||
|
|
||||||
VOID BuildMemoryTypeInformationHob(VOID);
|
VOID BuildMemoryTypeInformationHob(VOID);
|
||||||
@ -89,16 +98,46 @@ MemoryPeim(IN EFI_PHYSICAL_ADDRESS UefiMemoryBase, IN UINT64 UefiMemorySize)
|
|||||||
UINTN MemoryBase = 0;
|
UINTN MemoryBase = 0;
|
||||||
UINTN MemorySize = 0;
|
UINTN MemorySize = 0;
|
||||||
UINTN MemoryTotal = 0;
|
UINTN MemoryTotal = 0;
|
||||||
|
DeviceMemoryAddHob Mem = Mem4G;
|
||||||
|
UINT8 MemGB = 4;
|
||||||
fdt *Fdt;
|
fdt *Fdt;
|
||||||
|
|
||||||
Fdt = GetFdt();
|
Fdt = GetFdt();
|
||||||
ASSERT(Fdt != NULL);
|
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
|
// Run through each memory descriptor
|
||||||
while (MemoryDescriptorEx->Length != 0) {
|
while (MemoryDescriptorEx->Length != 0) {
|
||||||
if (MemoryDescriptorEx->MemoryType == EfiConventionalMemory)
|
if (MemoryDescriptorEx->MemoryType == EfiConventionalMemory)
|
||||||
MemoryTotal += MemoryDescriptorEx->Length;
|
MemoryTotal += MemoryDescriptorEx->Length;
|
||||||
switch (MemoryDescriptorEx->HobOption) {
|
switch (MemoryDescriptorEx->HobOption) {
|
||||||
|
case Mem4G:
|
||||||
|
case Mem6G:
|
||||||
|
case Mem8G:
|
||||||
|
case Mem10G:
|
||||||
|
if (MemoryDescriptorEx->HobOption != Mem) {
|
||||||
|
MemoryDescriptorEx++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// fallthrough
|
||||||
case AddMem:
|
case AddMem:
|
||||||
case AddDev:
|
case AddDev:
|
||||||
AddHob(MemoryDescriptorEx);
|
AddHob(MemoryDescriptorEx);
|
||||||
@ -120,33 +159,6 @@ MemoryPeim(IN EFI_PHYSICAL_ADDRESS UefiMemoryBase, IN UINT64 UefiMemorySize)
|
|||||||
MemoryDescriptorEx++;
|
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)
|
// Last one (terminator)
|
||||||
ASSERT(Index < MAX_ARM_MEMORY_REGION_DESCRIPTOR_COUNT);
|
ASSERT(Index < MAX_ARM_MEMORY_REGION_DESCRIPTOR_COUNT);
|
||||||
MemoryDescriptor[Index].PhysicalBase = 0;
|
MemoryDescriptor[Index].PhysicalBase = 0;
|
||||||
@ -154,8 +166,6 @@ MemoryPeim(IN EFI_PHYSICAL_ADDRESS UefiMemoryBase, IN UINT64 UefiMemorySize)
|
|||||||
MemoryDescriptor[Index].Length = 0;
|
MemoryDescriptor[Index].Length = 0;
|
||||||
MemoryDescriptor[Index].Attributes = 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
|
// Build Memory Allocation Hob
|
||||||
DEBUG((EFI_D_INFO, "Configure MMU In \n"));
|
DEBUG((EFI_D_INFO, "Configure MMU In \n"));
|
||||||
InitMmu(MemoryDescriptor);
|
InitMmu(MemoryDescriptor);
|
||||||
|
Loading…
Reference in New Issue
Block a user