UINTN shift;\r
UINT32 version;\r
\r
+ {\r
+ // Can 'memreserve' be printed by below code?\r
+ INTN num = fdt_num_mem_rsv(FdtBlob);\r
+ INTN i, err;\r
+ UINT64 addr = 0,size = 0;\r
+\r
+ for (i = 0; i < num; i++) {\r
+ err = fdt_get_mem_rsv(FdtBlob, i, &addr, &size);\r
+ if (err) {\r
+ DEBUG((EFI_D_ERROR, "Error (%d) : Cannot get memreserve section (%d)\n", err, i));\r
+ }\r
+ else {\r
+ Print(L"/memreserve/ \t0x%lx \t0x%lx;\n",addr,size);\r
+ }\r
+ }\r
+ }\r
+\r
depth = 0;\r
shift = 4;\r
\r
}\r
}\r
\r
+STATIC\r
+BOOLEAN\r
+IsLinuxReservedRegion (\r
+ IN EFI_MEMORY_TYPE MemoryType\r
+ )\r
+{\r
+ switch(MemoryType) {\r
+ case EfiRuntimeServicesCode:\r
+ case EfiRuntimeServicesData:\r
+ case EfiUnusableMemory:\r
+ case EfiACPIReclaimMemory:\r
+ case EfiACPIMemoryNVS:\r
+ return TRUE;\r
+ default:\r
+ return FALSE;\r
+ }\r
+}\r
+\r
+\r
typedef struct {\r
UINTN Base;\r
UINTN Size;\r
UINT32 ClusterId;\r
UINT32 CoreId;\r
UINT64 CpuReleaseAddr;\r
+ UINTN MemoryMapSize;\r
+ EFI_MEMORY_DESCRIPTOR *MemoryMap;\r
+ UINTN MapKey;\r
+ UINTN DescriptorSize;\r
+ UINT32 DescriptorVersion;\r
+ UINTN Pages;\r
\r
err = fdt_check_header ((VOID*)(UINTN)(*FdtBlobBase));\r
if (err != 0) {\r
}\r
DEBUG_CODE_END();\r
\r
+ //\r
// Set Linux CmdLine\r
+ //\r
if ((CommandLineArguments != NULL) && (AsciiStrLen (CommandLineArguments) > 0)) {\r
err = fdt_setprop(fdt, node, "bootargs", CommandLineArguments, AsciiStrSize(CommandLineArguments));\r
if (err) {\r
}\r
}\r
\r
+ //\r
// Set Linux Initrd\r
+ //\r
if (InitrdImageSize != 0) {\r
InitrdImageStart = cpu_to_fdt64 (InitrdImage);\r
err = fdt_setprop(fdt, node, "linux,initrd-start", &InitrdImageStart, sizeof(EFI_PHYSICAL_ADDRESS));\r
}\r
}\r
\r
+ //\r
// Set Physical memory setup if does not exist\r
+ //\r
node = fdt_subnode_offset(fdt, 0, "memory");\r
if (node < 0) {\r
// The 'memory' node does not exist, create it\r
}\r
}\r
\r
+ //\r
+ // Add the memory regions reserved by the UEFI Firmware\r
+ //\r
+\r
+ // Retrieve the UEFI Memory Map\r
+ MemoryMap = NULL;\r
+ MemoryMapSize = 0;\r
+ Status = gBS->GetMemoryMap (&MemoryMapSize, MemoryMap, &MapKey, &DescriptorSize, &DescriptorVersion);\r
+ if (Status == EFI_BUFFER_TOO_SMALL) {\r
+ Pages = EFI_SIZE_TO_PAGES (MemoryMapSize) + 1;\r
+ MemoryMap = AllocatePages (Pages);\r
+ Status = gBS->GetMemoryMap (&MemoryMapSize, MemoryMap, &MapKey, &DescriptorSize, &DescriptorVersion);\r
+ }\r
+\r
+ // Go through the list and add the reserved region to the Device Tree\r
+ if (!EFI_ERROR(Status)) {\r
+ for (Index = 0; Index < (MemoryMapSize / sizeof(EFI_MEMORY_DESCRIPTOR)); Index++) {\r
+ if (IsLinuxReservedRegion ((EFI_MEMORY_TYPE)MemoryMap[Index].Type)) {\r
+ DEBUG((DEBUG_VERBOSE, "Reserved region of type %d [0x%X, 0x%X]\n",\r
+ MemoryMap[Index].Type,\r
+ (UINTN)MemoryMap[Index].PhysicalStart,\r
+ (UINTN)(MemoryMap[Index].PhysicalStart + MemoryMap[Index].NumberOfPages * EFI_PAGE_SIZE)));\r
+ err = fdt_add_mem_rsv(fdt, MemoryMap[Index].PhysicalStart, MemoryMap[Index].NumberOfPages * EFI_PAGE_SIZE);\r
+ if (err != 0) {\r
+ Print(L"Warning: Fail to add 'memreserve' (err:%d)\n", err);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ //\r
// Setup Arm Mpcore Info if it is a multi-core or multi-cluster platforms\r
+ //\r
for (Index=0; Index < gST->NumberOfTableEntries; Index++) {\r
// Check for correct GUID type\r
if (CompareGuid (&gArmMpCoreInfoGuid, &(gST->ConfigurationTable[Index].VendorGuid))) {\r