# ARM processor package.\r
#\r
# Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR>\r
-# Copyright (c) 2011 - 2012, ARM Limited. All rights reserved.\r
+# Copyright (c) 2011 - 2013, ARM Limited. All rights reserved.\r
#\r
# This program and the accompanying materials\r
# are licensed and made available under the terms and conditions of the BSD License\r
# 0xC00 = cp10 | cp11\r
gArmTokenSpaceGuid.PcdArmNsacr|0xC00|UINT32|0x00000039\r
\r
- gArmTokenSpaceGuid.PcdArmNonSecModeTransition|0x0|UINT32|0x0000003E\r
-\r
# System Memory (DRAM): These PCDs define the region of in-built system memory\r
# Some platforms can get DRAM extensions, these additional regions will be declared\r
# to UEFI by ArmPLatformPlib \r
gArmTokenSpaceGuid.PcdArmLinuxKernelMaxOffset|0x08000000|UINT32|0x0000001F\r
# The Linux ATAGs are expected to be under 0x4000 (16KB) from the beginning of the System Memory\r
gArmTokenSpaceGuid.PcdArmLinuxAtagMaxOffset|0x4000|UINT32|0x00000020\r
- # If the fixed FDT address is not available, then it should be loaded the below the kernel\r
- # The recommandation from the Linux kernel is to have the FDT below 16KB\r
- gArmTokenSpaceGuid.PcdArmLinuxFdtMaxOffset|0x4000|UINT32|0x00000023\r
\r
#\r
# ARM Architectural Timer\r
# ARM Architectural Timer Interrupt(GIC PPI) number\r
gArmTokenSpaceGuid.PcdArmArchTimerSecIntrNum|29|UINT32|0x00000035 \r
gArmTokenSpaceGuid.PcdArmArchTimerIntrNum|30|UINT32|0x00000036\r
+\r
+[PcdsFixedAtBuild.ARM]\r
+ # By default we do not do a transition to non-secure mode\r
+ gArmTokenSpaceGuid.PcdArmNonSecModeTransition|0x0|UINT32|0x0000003E\r
+ # If the fixed FDT address is not available, then it should be loaded below the kernel.\r
+ # The recommendation from the Linux kernel is to have the FDT below 16KB.\r
+ # (see the kernel doc: Documentation/arm/Booting)\r
+ gArmTokenSpaceGuid.PcdArmLinuxFdtMaxOffset|0x4000|UINT32|0x00000023\r
+ # The FDT blob must be loaded at a 64bit aligned address.\r
+ gArmTokenSpaceGuid.PcdArmLinuxFdtAlignment|0x8|UINT32|0x00000026\r
{\r
EFI_STATUS Status;\r
EFI_PHYSICAL_ADDRESS NewFdtBlobBase;\r
+ EFI_PHYSICAL_ADDRESS NewFdtBlobAllocation;\r
UINTN NewFdtBlobSize;\r
+ UINT32 FdtAlignment;\r
VOID* fdt;\r
INTN err;\r
INTN node;\r
//\r
NewFdtBlobSize = OriginalFdtSize + FDT_ADDITIONAL_ENTRIES_SIZE;\r
\r
+ // If FDT load address needs to be aligned, allocate more space.\r
+ FdtAlignment = PcdGet32 (PcdArmLinuxFdtAlignment);\r
+ if (FdtAlignment != 0) {\r
+ NewFdtBlobSize += FdtAlignment;\r
+ }\r
+\r
// Try below a watermark address\r
Status = EFI_NOT_FOUND;\r
- if (PcdGet32(PcdArmLinuxFdtMaxOffset) != 0) {\r
+ if (PcdGet32 (PcdArmLinuxFdtMaxOffset) != 0) {\r
NewFdtBlobBase = LINUX_FDT_MAX_OFFSET;\r
Status = gBS->AllocatePages (AllocateMaxAddress, EfiBootServicesData, EFI_SIZE_TO_PAGES(NewFdtBlobSize), &NewFdtBlobBase);\r
if (EFI_ERROR(Status)) {\r
}\r
}\r
\r
+ NewFdtBlobAllocation = NewFdtBlobBase;\r
+ if (FdtAlignment != 0) {\r
+ NewFdtBlobBase = ALIGN (NewFdtBlobBase, FdtAlignment);\r
+ }\r
+\r
// Load the Original FDT tree into the new region\r
fdt = (VOID*)(UINTN)NewFdtBlobBase;\r
err = fdt_open_into((VOID*)(UINTN)(*FdtBlobBase), fdt, NewFdtBlobSize);\r
return EFI_SUCCESS;\r
\r
FAIL_NEW_FDT:\r
- gBS->FreePages (NewFdtBlobBase, EFI_SIZE_TO_PAGES (NewFdtBlobSize));\r
+ gBS->FreePages (NewFdtBlobAllocation, EFI_SIZE_TO_PAGES (NewFdtBlobSize));\r
\r
FAIL_ALLOCATE_NEW_FDT:\r
*FdtBlobSize = (UINTN)fdt_totalsize ((VOID*)(UINTN)(*FdtBlobBase));\r