public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: fix FDT handling for RPi4
@ 2020-03-06  5:53 Andrei Warkentin
  2020-03-06  5:53 ` [edk2-non-osi][PATCH 1/1] Platform/RaspberryPi/RPi4/TrustedFirmware: rev RPi4 TF-A for DTB fix Andrei Warkentin
  2020-03-06 12:46 ` [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: fix FDT handling for RPi4 Pete Batard
  0 siblings, 2 replies; 6+ messages in thread
From: Andrei Warkentin @ 2020-03-06  5:53 UTC (permalink / raw)
  To: devel; +Cc: ard.biesheuvel, leif, pete, philmd

A rev-up of start4.elf VPU firmware meant that
the previous scheme of loading the DTB over top
of RPI_EFI.FD no longer works - the DT is now
loaded way before the armstub, so any overlap
means the DT is overridden.

This change re-arranges a few items in the FD,
allowing the DTB to loaded directly after the
FD in physical memory.

This moves UEFI image down by 0x10000, and reduces
the FD image size by 0x10000, leaving space for
a DTB to be loaded by config.txt at 0x1f0000.

You need a matching "rev RPi4 TF-A for DTB fix" patch
to edk2-non-osi, as it requires a TF-A build with these
options:

PRELOADED_BL33_BASE=0x20000 RPI3_PRELOADED_DTB_BASE=0x1f0000

Note: the same problem still affects the Pi 3, and will be
fixed in a separate change.

Signed-off-by: Andrei Warkentin <andrey.warkentin@gmail.com>
---
 Platform/RaspberryPi/Library/PlatformLib/PlatformLib.inf  |  2 ++
 Platform/RaspberryPi/Library/PlatformLib/RaspberryPiMem.c | 13 ++++++++++++-
 Platform/RaspberryPi/RPi4/RPi4.dsc                        | 10 +++++++---
 Platform/RaspberryPi/RPi4/RPi4.fdf                        | 20 +++++++-------------
 Platform/RaspberryPi/RPi4/Readme.md                       | 10 +++++-----
 Platform/RaspberryPi/RaspberryPi.dec                      | 15 ++++++++-------
 6 files changed, 41 insertions(+), 29 deletions(-)

diff --git a/Platform/RaspberryPi/Library/PlatformLib/PlatformLib.inf b/Platform/RaspberryPi/Library/PlatformLib/PlatformLib.inf
index 77cdbe39..3aac6a98 100644
--- a/Platform/RaspberryPi/Library/PlatformLib/PlatformLib.inf
+++ b/Platform/RaspberryPi/Library/PlatformLib/PlatformLib.inf
@@ -44,6 +44,8 @@
 [FixedPcd]
   gArmTokenSpaceGuid.PcdFdBaseAddress
   gArmTokenSpaceGuid.PcdFvBaseAddress
+  gRaspberryPiTokenSpaceGuid.PcdFdtBaseAddress
+  gRaspberryPiTokenSpaceGuid.PcdFdtSize
   gArmPlatformTokenSpaceGuid.PcdCoreCount
   gArmTokenSpaceGuid.PcdArmPrimaryCoreMask
   gArmTokenSpaceGuid.PcdArmPrimaryCore
diff --git a/Platform/RaspberryPi/Library/PlatformLib/RaspberryPiMem.c b/Platform/RaspberryPi/Library/PlatformLib/RaspberryPiMem.c
index e795a885..dec8e09d 100644
--- a/Platform/RaspberryPi/Library/PlatformLib/RaspberryPiMem.c
+++ b/Platform/RaspberryPi/Library/PlatformLib/RaspberryPiMem.c
@@ -94,7 +94,18 @@ ArmPlatformGetVirtualMemoryMap (
   VirtualMemoryInfo[Index].Type             = RPI_MEM_RUNTIME_REGION;
   VirtualMemoryInfo[Index++].Name           = L"FD Variables";
 
-  if (BCM2711_SOC_REGISTERS == 0) {
+  if (BCM2711_SOC_REGISTERS != 0) {
+     //
+     // Only the Pi 4 firmware today expects the DTB to directly follow the
+     // FD instead of overlapping the FD.
+     //
+     VirtualMemoryTable[Index].PhysicalBase    = FixedPcdGet32 (PcdFdtBaseAddress);
+     VirtualMemoryTable[Index].VirtualBase     = VirtualMemoryTable[Index].PhysicalBase;
+     VirtualMemoryTable[Index].Length          = FixedPcdGet32 (PcdFdtSize);;
+     VirtualMemoryTable[Index].Attributes      = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK;
+     VirtualMemoryInfo[Index].Type             = RPI_MEM_RESERVED_REGION;
+     VirtualMemoryInfo[Index++].Name           = L"Flattened Device Tree";
+  } else {
      //
      // TF-A reserved RAM only exists for the Pi 3 TF-A.
      //
diff --git a/Platform/RaspberryPi/RPi4/RPi4.dsc b/Platform/RaspberryPi/RPi4/RPi4.dsc
index da62dc5b..2e98c3e1 100644
--- a/Platform/RaspberryPi/RPi4/RPi4.dsc
+++ b/Platform/RaspberryPi/RPi4/RPi4.dsc
@@ -279,7 +279,10 @@
   gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibraryPropertyMask|1
   gEfiMdePkgTokenSpaceGuid.PcdPostCodePropertyMask|0
   gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|320
-  gRaspberryPiTokenSpaceGuid.PcdFdtBaseAddress|0x20000
+  #
+  # Follows right after the FD image.
+  #
+  gRaspberryPiTokenSpaceGuid.PcdFdtBaseAddress|0x001f0000
 
   # DEBUG_ASSERT_ENABLED       0x01
   # DEBUG_PRINT_ENABLED        0x02
@@ -393,8 +396,9 @@
   # Size of the region used by UEFI in permanent memory (Reserved 64MB)
   gArmPlatformTokenSpaceGuid.PcdSystemMemoryUefiRegionSize|0x04000000
   #
-  # This matches PcdFvBaseAddress, since everything less is ATF, and
-  # will be reserved away.
+  # 0x00000000 - 0x001F0000  FD (PcdFdBaseAddress, PcdFdSize)
+  # 0x001F0000 - 0x00200000 DTB (PcdFdtBaseAddress, PcdFdtSize)
+  # 0x00200000 - ...        RAM (PcdSystemMemoryBase, PcdSystemMemorySize)
   #
   gArmTokenSpaceGuid.PcdSystemMemoryBase|0x00200000
   gArmTokenSpaceGuid.PcdSystemMemorySize|0x3fe00000
diff --git a/Platform/RaspberryPi/RPi4/RPi4.fdf b/Platform/RaspberryPi/RPi4/RPi4.fdf
index c3832035..a59d3b60 100644
--- a/Platform/RaspberryPi/RPi4/RPi4.fdf
+++ b/Platform/RaspberryPi/RPi4/RPi4.fdf
@@ -25,11 +25,11 @@
 
 [FD.RPI_EFI]
 BaseAddress   = 0x00000000|gArmTokenSpaceGuid.PcdFdBaseAddress
-Size          = 0x00200000|gArmTokenSpaceGuid.PcdFdSize
+Size          = 0x001f0000|gArmTokenSpaceGuid.PcdFdSize
 ErasePolarity = 1
 
 BlockSize     = 0x00001000|gRaspberryPiTokenSpaceGuid.PcdFirmwareBlockSize
-NumBlocks     = 0x200
+NumBlocks     = 0x1f0
 
 ################################################################################
 #
@@ -53,16 +53,10 @@ NumBlocks     = 0x200
 0x00000000|0x00020000
 FILE = $(TFA_BUILD_BL31)
 
-#
-# DTB.
-#
-0x00020000|0x00010000
-DATA = { 0x00 }
-
 #
 # UEFI image
 #
-0x00030000|0x001b0000
+0x00020000|0x001b0000
 gArmTokenSpaceGuid.PcdFvBaseAddress|gArmTokenSpaceGuid.PcdFvSize
 FV = FVMAIN_COMPACT
 
@@ -76,7 +70,7 @@ FV = FVMAIN_COMPACT
 #
 
 # NV_VARIABLE_STORE
-0x001e0000|0x0000e000
+0x001d0000|0x0000e000
 gRaspberryPiTokenSpaceGuid.PcdNvStorageVariableBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize
 
 DATA = {
@@ -119,11 +113,11 @@ DATA = {
 }
 
 # NV_EVENT_LOG
-0x001ee000|0x00001000
+0x001de000|0x00001000
 gRaspberryPiTokenSpaceGuid.PcdNvStorageEventLogBase|gRaspberryPiTokenSpaceGuid.PcdNvStorageEventLogSize
 
 # NV_FTW_WORKING header
-0x001ef000|0x00001000
+0x001df000|0x00001000
 gRaspberryPiTokenSpaceGuid.PcdNvStorageFtwWorkingBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize
 
 DATA = {
@@ -138,7 +132,7 @@ DATA = {
 }
 
 # NV_FTW_WORKING data
-0x001f0000|0x00010000
+0x001e0000|0x00010000
 gRaspberryPiTokenSpaceGuid.PcdNvStorageFtwSpareBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
 
 ################################################################################
diff --git a/Platform/RaspberryPi/RPi4/Readme.md b/Platform/RaspberryPi/RPi4/Readme.md
index 21c9fd4f..e2f0d698 100644
--- a/Platform/RaspberryPi/RPi4/Readme.md
+++ b/Platform/RaspberryPi/RPi4/Readme.md
@@ -49,8 +49,8 @@ Build instructions from the top level edk2-platforms Readme.md apply.
     ```
     Additionally, if you want to use PL011 instead of the miniUART, you can add the lines:
     ```
-    device_tree_address=0x20000
-    device_tree_end=0x30000
+    device_tree_address=0x1f0000
+    device_tree_end=0x200000
     device_tree=bcm2711-rpi-4-b.dtb
     dtoverlay=miniuart-bt
     ```
@@ -80,12 +80,12 @@ You can pass a custom Device Tree and overlays using the following:
 ```
 (...)
 disable_commandline_tags=2
-device_tree_address=0x20000
-device_tree_end=0x30000
+device_tree_address=0x1f0000
+device_tree_end=0x200000
 device_tree=bcm2711-rpi-4-b.dtb
 ```
 
-Note: the address range **must** be `[0x20000:0x30000]`.
+Note: the address range **must** be `[0x1f0000:0x200000]`.
 `dtoverlay` and `dtparam` parameters are also supported **when** providing a Device Tree`.
 
 ## Custom `bootargs`
diff --git a/Platform/RaspberryPi/RaspberryPi.dec b/Platform/RaspberryPi/RaspberryPi.dec
index 25058ccc..3ebb83d9 100644
--- a/Platform/RaspberryPi/RaspberryPi.dec
+++ b/Platform/RaspberryPi/RaspberryPi.dec
@@ -36,13 +36,14 @@
 
 [PcdsFixedAtBuild.common]
   gRaspberryPiTokenSpaceGuid.PcdFdtBaseAddress|0x10000|UINT32|0x00000001
-  gRaspberryPiTokenSpaceGuid.PcdFirmwareBlockSize|0x0|UINT32|0x00000002
-  gRaspberryPiTokenSpaceGuid.PcdNvStorageEventLogBase|0x0|UINT32|0x00000003
-  gRaspberryPiTokenSpaceGuid.PcdNvStorageEventLogSize|0x0|UINT32|0x00000004
-  gRaspberryPiTokenSpaceGuid.PcdNvStorageVariableBase|0x0|UINT32|0x00000005
-  gRaspberryPiTokenSpaceGuid.PcdNvStorageFtwSpareBase|0x0|UINT32|0x00000006
-  gRaspberryPiTokenSpaceGuid.PcdNvStorageFtwWorkingBase|0x0|UINT32|0x00000007
-  gRaspberryPiTokenSpaceGuid.PcdExtendedMemoryBase|0x0|UINT32|0x00000008
+  gRaspberryPiTokenSpaceGuid.PcdFdtSize|0x10000|UINT32|0x00000002
+  gRaspberryPiTokenSpaceGuid.PcdFirmwareBlockSize|0x0|UINT32|0x00000003
+  gRaspberryPiTokenSpaceGuid.PcdNvStorageEventLogBase|0x0|UINT32|0x00000004
+  gRaspberryPiTokenSpaceGuid.PcdNvStorageEventLogSize|0x0|UINT32|0x00000005
+  gRaspberryPiTokenSpaceGuid.PcdNvStorageVariableBase|0x0|UINT32|0x00000006
+  gRaspberryPiTokenSpaceGuid.PcdNvStorageFtwSpareBase|0x0|UINT32|0x00000007
+  gRaspberryPiTokenSpaceGuid.PcdNvStorageFtwWorkingBase|0x0|UINT32|0x00000008
+  gRaspberryPiTokenSpaceGuid.PcdExtendedMemoryBase|0x0|UINT32|0x00000009
 
 [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]
   gRaspberryPiTokenSpaceGuid.PcdCpuClock|0|UINT32|0x0000000d
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [edk2-non-osi][PATCH 1/1] Platform/RaspberryPi/RPi4/TrustedFirmware: rev RPi4 TF-A for DTB fix
  2020-03-06  5:53 [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: fix FDT handling for RPi4 Andrei Warkentin
@ 2020-03-06  5:53 ` Andrei Warkentin
  2020-03-06 12:46   ` Pete Batard
  2020-03-06 12:46 ` [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: fix FDT handling for RPi4 Pete Batard
  1 sibling, 1 reply; 6+ messages in thread
From: Andrei Warkentin @ 2020-03-06  5:53 UTC (permalink / raw)
  To: devel; +Cc: ard.biesheuvel, leif, pete, philmd

This is a required change for the "fix FDT handling for RPi4" patch.

It's the same TF-A, but built with different options:
- PRELOADED_BL33_BASE=0x20000 (down from 0x30000)
- RPI3_PRELOADED_DTB_BASE=0x1f0000 (up from 0x20000)

Signed-off-by: Andrei Warkentin <andrey.warkentin@gmail.com>
---
 Platform/RaspberryPi/RPi4/TrustedFirmware/Readme.md         |   2 +-
 Platform/RaspberryPi/RPi4/TrustedFirmware/bl31_miniuart.bin | Bin 41072 -> 41072 bytes
 Platform/RaspberryPi/RPi4/TrustedFirmware/bl31_pl011.bin    | Bin 41072 -> 41072 bytes
 3 files changed, 1 insertion(+), 1 deletion(-)

diff --git a/Platform/RaspberryPi/RPi4/TrustedFirmware/Readme.md b/Platform/RaspberryPi/RPi4/TrustedFirmware/Readme.md
index 7f1749d..b3e7d6d 100644
--- a/Platform/RaspberryPi/RPi4/TrustedFirmware/Readme.md
+++ b/Platform/RaspberryPi/RPi4/TrustedFirmware/Readme.md
@@ -5,7 +5,7 @@ The `bl31_#####.bin` TF-A binaries found in this repository were built on a Debi
 from https://github.com/pbatard/arm-trusted-firmware/tree/pi4 (pi4 branch) using the command:
 
 ```
-make PLAT=rpi4 RPI3_PRELOADED_DTB_BASE=0x20000 PRELOADED_BL33_BASE=0x30000 SUPPORT_VFP=1 [RPI3_USE_PL011_UART=1] DEBUG=0 all
+make PLAT=rpi4 RPI3_PRELOADED_DTB_BASE=0x1f0000 PRELOADED_BL33_BASE=0x20000 SUPPORT_VFP=1 [RPI3_USE_PL011_UART=1] DEBUG=0 all
 ```
 
 The only difference between these firmwares is that the `RPI3_USE_PL011_UART=1` option was added
diff --git a/Platform/RaspberryPi/RPi4/TrustedFirmware/bl31_miniuart.bin b/Platform/RaspberryPi/RPi4/TrustedFirmware/bl31_miniuart.bin
index e53aa0ef40fd2a8a66fee22439de2860813aa42f..4ae39b79ffd483abab2f4ad29d6c380d4cd017ca 100644
GIT binary patch
delta 10889
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
Ag#Z8m

delta 10645
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

diff --git a/Platform/RaspberryPi/RPi4/TrustedFirmware/bl31_pl011.bin b/Platform/RaspberryPi/RPi4/TrustedFirmware/bl31_pl011.bin
index e0d53f4bdc4e3404d39b7176543d64bdcef03886..915085d6754984c358aac16ce444d8a83214d090 100644
GIT binary patch
delta 10853
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
L+z`Jr@ZkRgVA`Co

delta 10848
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
H`|f`NMF{Z?

-- 
2.17.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: fix FDT handling for RPi4
  2020-03-06  5:53 [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: fix FDT handling for RPi4 Andrei Warkentin
  2020-03-06  5:53 ` [edk2-non-osi][PATCH 1/1] Platform/RaspberryPi/RPi4/TrustedFirmware: rev RPi4 TF-A for DTB fix Andrei Warkentin
@ 2020-03-06 12:46 ` Pete Batard
  2020-03-06 16:48   ` Ard Biesheuvel
  1 sibling, 1 reply; 6+ messages in thread
From: Pete Batard @ 2020-03-06 12:46 UTC (permalink / raw)
  To: Andrei Warkentin, devel; +Cc: ard.biesheuvel, leif, philmd

Please see one note at the end:

On 2020.03.06 05:53, Andrei Warkentin wrote:
> A rev-up of start4.elf VPU firmware meant that
> the previous scheme of loading the DTB over top
> of RPI_EFI.FD no longer works - the DT is now
> loaded way before the armstub, so any overlap
> means the DT is overridden.
> 
> This change re-arranges a few items in the FD,
> allowing the DTB to loaded directly after the
> FD in physical memory.
> 
> This moves UEFI image down by 0x10000, and reduces
> the FD image size by 0x10000, leaving space for
> a DTB to be loaded by config.txt at 0x1f0000.
> 
> You need a matching "rev RPi4 TF-A for DTB fix" patch
> to edk2-non-osi, as it requires a TF-A build with these
> options:
> 
> PRELOADED_BL33_BASE=0x20000 RPI3_PRELOADED_DTB_BASE=0x1f0000
> 
> Note: the same problem still affects the Pi 3, and will be
> fixed in a separate change.
> 
> Signed-off-by: Andrei Warkentin <andrey.warkentin@gmail.com>
> ---
>   Platform/RaspberryPi/Library/PlatformLib/PlatformLib.inf  |  2 ++
>   Platform/RaspberryPi/Library/PlatformLib/RaspberryPiMem.c | 13 ++++++++++++-
>   Platform/RaspberryPi/RPi4/RPi4.dsc                        | 10 +++++++---
>   Platform/RaspberryPi/RPi4/RPi4.fdf                        | 20 +++++++-------------
>   Platform/RaspberryPi/RPi4/Readme.md                       | 10 +++++-----
>   Platform/RaspberryPi/RaspberryPi.dec                      | 15 ++++++++-------
>   6 files changed, 41 insertions(+), 29 deletions(-)
> 
> diff --git a/Platform/RaspberryPi/Library/PlatformLib/PlatformLib.inf b/Platform/RaspberryPi/Library/PlatformLib/PlatformLib.inf
> index 77cdbe39..3aac6a98 100644
> --- a/Platform/RaspberryPi/Library/PlatformLib/PlatformLib.inf
> +++ b/Platform/RaspberryPi/Library/PlatformLib/PlatformLib.inf
> @@ -44,6 +44,8 @@
>   [FixedPcd]
>     gArmTokenSpaceGuid.PcdFdBaseAddress
>     gArmTokenSpaceGuid.PcdFvBaseAddress
> +  gRaspberryPiTokenSpaceGuid.PcdFdtBaseAddress
> +  gRaspberryPiTokenSpaceGuid.PcdFdtSize
>     gArmPlatformTokenSpaceGuid.PcdCoreCount
>     gArmTokenSpaceGuid.PcdArmPrimaryCoreMask
>     gArmTokenSpaceGuid.PcdArmPrimaryCore
> diff --git a/Platform/RaspberryPi/Library/PlatformLib/RaspberryPiMem.c b/Platform/RaspberryPi/Library/PlatformLib/RaspberryPiMem.c
> index e795a885..dec8e09d 100644
> --- a/Platform/RaspberryPi/Library/PlatformLib/RaspberryPiMem.c
> +++ b/Platform/RaspberryPi/Library/PlatformLib/RaspberryPiMem.c
> @@ -94,7 +94,18 @@ ArmPlatformGetVirtualMemoryMap (
>     VirtualMemoryInfo[Index].Type             = RPI_MEM_RUNTIME_REGION;
>     VirtualMemoryInfo[Index++].Name           = L"FD Variables";
>   
> -  if (BCM2711_SOC_REGISTERS == 0) {
> +  if (BCM2711_SOC_REGISTERS != 0) {
> +     //
> +     // Only the Pi 4 firmware today expects the DTB to directly follow the
> +     // FD instead of overlapping the FD.
> +     //
> +     VirtualMemoryTable[Index].PhysicalBase    = FixedPcdGet32 (PcdFdtBaseAddress);
> +     VirtualMemoryTable[Index].VirtualBase     = VirtualMemoryTable[Index].PhysicalBase;
> +     VirtualMemoryTable[Index].Length          = FixedPcdGet32 (PcdFdtSize);;
> +     VirtualMemoryTable[Index].Attributes      = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK;
> +     VirtualMemoryInfo[Index].Type             = RPI_MEM_RESERVED_REGION;
> +     VirtualMemoryInfo[Index++].Name           = L"Flattened Device Tree";
> +  } else {
>        //
>        // TF-A reserved RAM only exists for the Pi 3 TF-A.
>        //
> diff --git a/Platform/RaspberryPi/RPi4/RPi4.dsc b/Platform/RaspberryPi/RPi4/RPi4.dsc
> index da62dc5b..2e98c3e1 100644
> --- a/Platform/RaspberryPi/RPi4/RPi4.dsc
> +++ b/Platform/RaspberryPi/RPi4/RPi4.dsc
> @@ -279,7 +279,10 @@
>     gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibraryPropertyMask|1
>     gEfiMdePkgTokenSpaceGuid.PcdPostCodePropertyMask|0
>     gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|320
> -  gRaspberryPiTokenSpaceGuid.PcdFdtBaseAddress|0x20000
> +  #
> +  # Follows right after the FD image.
> +  #
> +  gRaspberryPiTokenSpaceGuid.PcdFdtBaseAddress|0x001f0000
>   
>     # DEBUG_ASSERT_ENABLED       0x01
>     # DEBUG_PRINT_ENABLED        0x02
> @@ -393,8 +396,9 @@
>     # Size of the region used by UEFI in permanent memory (Reserved 64MB)
>     gArmPlatformTokenSpaceGuid.PcdSystemMemoryUefiRegionSize|0x04000000
>     #
> -  # This matches PcdFvBaseAddress, since everything less is ATF, and
> -  # will be reserved away.
> +  # 0x00000000 - 0x001F0000  FD (PcdFdBaseAddress, PcdFdSize)
> +  # 0x001F0000 - 0x00200000 DTB (PcdFdtBaseAddress, PcdFdtSize)
> +  # 0x00200000 - ...        RAM (PcdSystemMemoryBase, PcdSystemMemorySize)
>     #
>     gArmTokenSpaceGuid.PcdSystemMemoryBase|0x00200000
>     gArmTokenSpaceGuid.PcdSystemMemorySize|0x3fe00000
> diff --git a/Platform/RaspberryPi/RPi4/RPi4.fdf b/Platform/RaspberryPi/RPi4/RPi4.fdf
> index c3832035..a59d3b60 100644
> --- a/Platform/RaspberryPi/RPi4/RPi4.fdf
> +++ b/Platform/RaspberryPi/RPi4/RPi4.fdf
> @@ -25,11 +25,11 @@
>   
>   [FD.RPI_EFI]
>   BaseAddress   = 0x00000000|gArmTokenSpaceGuid.PcdFdBaseAddress
> -Size          = 0x00200000|gArmTokenSpaceGuid.PcdFdSize
> +Size          = 0x001f0000|gArmTokenSpaceGuid.PcdFdSize
>   ErasePolarity = 1
>   
>   BlockSize     = 0x00001000|gRaspberryPiTokenSpaceGuid.PcdFirmwareBlockSize
> -NumBlocks     = 0x200
> +NumBlocks     = 0x1f0
>   
>   ################################################################################
>   #
> @@ -53,16 +53,10 @@ NumBlocks     = 0x200
>   0x00000000|0x00020000
>   FILE = $(TFA_BUILD_BL31)
>   
> -#
> -# DTB.
> -#
> -0x00020000|0x00010000
> -DATA = { 0x00 }
> -
>   #
>   # UEFI image
>   #
> -0x00030000|0x001b0000
> +0x00020000|0x001b0000
>   gArmTokenSpaceGuid.PcdFvBaseAddress|gArmTokenSpaceGuid.PcdFvSize
>   FV = FVMAIN_COMPACT
>   
> @@ -76,7 +70,7 @@ FV = FVMAIN_COMPACT
>   #
>   
>   # NV_VARIABLE_STORE
> -0x001e0000|0x0000e000
> +0x001d0000|0x0000e000
>   gRaspberryPiTokenSpaceGuid.PcdNvStorageVariableBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize
>   
>   DATA = {
> @@ -119,11 +113,11 @@ DATA = {
>   }
>   
>   # NV_EVENT_LOG
> -0x001ee000|0x00001000
> +0x001de000|0x00001000
>   gRaspberryPiTokenSpaceGuid.PcdNvStorageEventLogBase|gRaspberryPiTokenSpaceGuid.PcdNvStorageEventLogSize
>   
>   # NV_FTW_WORKING header
> -0x001ef000|0x00001000
> +0x001df000|0x00001000
>   gRaspberryPiTokenSpaceGuid.PcdNvStorageFtwWorkingBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize
>   
>   DATA = {
> @@ -138,7 +132,7 @@ DATA = {
>   }
>   
>   # NV_FTW_WORKING data
> -0x001f0000|0x00010000
> +0x001e0000|0x00010000
>   gRaspberryPiTokenSpaceGuid.PcdNvStorageFtwSpareBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
>   
>   ################################################################################
> diff --git a/Platform/RaspberryPi/RPi4/Readme.md b/Platform/RaspberryPi/RPi4/Readme.md
> index 21c9fd4f..e2f0d698 100644
> --- a/Platform/RaspberryPi/RPi4/Readme.md
> +++ b/Platform/RaspberryPi/RPi4/Readme.md
> @@ -49,8 +49,8 @@ Build instructions from the top level edk2-platforms Readme.md apply.
>       ```
>       Additionally, if you want to use PL011 instead of the miniUART, you can add the lines:
>       ```
> -    device_tree_address=0x20000
> -    device_tree_end=0x30000
> +    device_tree_address=0x1f0000
> +    device_tree_end=0x200000
>       device_tree=bcm2711-rpi-4-b.dtb
>       dtoverlay=miniuart-bt
>       ```
> @@ -80,12 +80,12 @@ You can pass a custom Device Tree and overlays using the following:
>   ```
>   (...)
>   disable_commandline_tags=2
> -device_tree_address=0x20000
> -device_tree_end=0x30000
> +device_tree_address=0x1f0000
> +device_tree_end=0x200000
>   device_tree=bcm2711-rpi-4-b.dtb
>   ```
>   
> -Note: the address range **must** be `[0x20000:0x30000]`.
> +Note: the address range **must** be `[0x1f0000:0x200000]`.
>   `dtoverlay` and `dtparam` parameters are also supported **when** providing a Device Tree`.
>   
>   ## Custom `bootargs`
> diff --git a/Platform/RaspberryPi/RaspberryPi.dec b/Platform/RaspberryPi/RaspberryPi.dec
> index 25058ccc..3ebb83d9 100644
> --- a/Platform/RaspberryPi/RaspberryPi.dec
> +++ b/Platform/RaspberryPi/RaspberryPi.dec
> @@ -36,13 +36,14 @@
>   
>   [PcdsFixedAtBuild.common]
>     gRaspberryPiTokenSpaceGuid.PcdFdtBaseAddress|0x10000|UINT32|0x00000001
> -  gRaspberryPiTokenSpaceGuid.PcdFirmwareBlockSize|0x0|UINT32|0x00000002
> -  gRaspberryPiTokenSpaceGuid.PcdNvStorageEventLogBase|0x0|UINT32|0x00000003
> -  gRaspberryPiTokenSpaceGuid.PcdNvStorageEventLogSize|0x0|UINT32|0x00000004
> -  gRaspberryPiTokenSpaceGuid.PcdNvStorageVariableBase|0x0|UINT32|0x00000005
> -  gRaspberryPiTokenSpaceGuid.PcdNvStorageFtwSpareBase|0x0|UINT32|0x00000006
> -  gRaspberryPiTokenSpaceGuid.PcdNvStorageFtwWorkingBase|0x0|UINT32|0x00000007
> -  gRaspberryPiTokenSpaceGuid.PcdExtendedMemoryBase|0x0|UINT32|0x00000008
> +  gRaspberryPiTokenSpaceGuid.PcdFdtSize|0x10000|UINT32|0x00000002
> +  gRaspberryPiTokenSpaceGuid.PcdFirmwareBlockSize|0x0|UINT32|0x00000003
> +  gRaspberryPiTokenSpaceGuid.PcdNvStorageEventLogBase|0x0|UINT32|0x00000004
> +  gRaspberryPiTokenSpaceGuid.PcdNvStorageEventLogSize|0x0|UINT32|0x00000005
> +  gRaspberryPiTokenSpaceGuid.PcdNvStorageVariableBase|0x0|UINT32|0x00000006
> +  gRaspberryPiTokenSpaceGuid.PcdNvStorageFtwSpareBase|0x0|UINT32|0x00000007
> +  gRaspberryPiTokenSpaceGuid.PcdNvStorageFtwWorkingBase|0x0|UINT32|0x00000008
> +  gRaspberryPiTokenSpaceGuid.PcdExtendedMemoryBase|0x0|UINT32|0x00000009

Since I got the same remark last time I went for something similar, I'm 
just going to point out that you only want to change/add the ids for the 
Pcds you are explicitly modifying or adding, and leave the rest as is 
even if it breaks sequentiality.

In other words, you could just have inserted a:

gRaspberryPiTokenSpaceGuid.PcdFdtSize|0x10000|UINT32|0x00000009

either after gRaspberryPiTokenSpaceGuid.PcdFdtBaseAddress or preferably 
at the end, since I would assert that we care less about grouping the 
PCDs in a logical order here than we care about finding out the next 
free PCD id to use.

I'm hoping that this can be fixed by a maintainer at integration, rather 
than require a v2, since that's the only comment I have on this patchset.

With this:

Reviewed-by: Pete Batard <pete@akeo.ie>
Tested-by: Pete Batard <pete@akeo.ie>

>   [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]
>     gRaspberryPiTokenSpaceGuid.PcdCpuClock|0|UINT32|0x0000000d




^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [edk2-non-osi][PATCH 1/1] Platform/RaspberryPi/RPi4/TrustedFirmware: rev RPi4 TF-A for DTB fix
  2020-03-06  5:53 ` [edk2-non-osi][PATCH 1/1] Platform/RaspberryPi/RPi4/TrustedFirmware: rev RPi4 TF-A for DTB fix Andrei Warkentin
@ 2020-03-06 12:46   ` Pete Batard
  2020-03-06 16:52     ` Ard Biesheuvel
  0 siblings, 1 reply; 6+ messages in thread
From: Pete Batard @ 2020-03-06 12:46 UTC (permalink / raw)
  To: Andrei Warkentin, devel; +Cc: ard.biesheuvel, leif, philmd

On 2020.03.06 05:53, Andrei Warkentin wrote:
> This is a required change for the "fix FDT handling for RPi4" patch.
> 
> It's the same TF-A, but built with different options:
> - PRELOADED_BL33_BASE=0x20000 (down from 0x30000)
> - RPI3_PRELOADED_DTB_BASE=0x1f0000 (up from 0x20000)
> 
> Signed-off-by: Andrei Warkentin <andrey.warkentin@gmail.com>

Reviewed-by: Pete Batard <pete@akeo.ie>
Tested-by: Pete Batard <pete@akeo.ie>

> ---
>   Platform/RaspberryPi/RPi4/TrustedFirmware/Readme.md         |   2 +-
>   Platform/RaspberryPi/RPi4/TrustedFirmware/bl31_miniuart.bin | Bin 41072 -> 41072 bytes
>   Platform/RaspberryPi/RPi4/TrustedFirmware/bl31_pl011.bin    | Bin 41072 -> 41072 bytes
>   3 files changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/Platform/RaspberryPi/RPi4/TrustedFirmware/Readme.md b/Platform/RaspberryPi/RPi4/TrustedFirmware/Readme.md
> index 7f1749d..b3e7d6d 100644
> --- a/Platform/RaspberryPi/RPi4/TrustedFirmware/Readme.md
> +++ b/Platform/RaspberryPi/RPi4/TrustedFirmware/Readme.md
> @@ -5,7 +5,7 @@ The `bl31_#####.bin` TF-A binaries found in this repository were built on a Debi
>   from https://github.com/pbatard/arm-trusted-firmware/tree/pi4 (pi4 branch) using the command:
>   
>   ```
> -make PLAT=rpi4 RPI3_PRELOADED_DTB_BASE=0x20000 PRELOADED_BL33_BASE=0x30000 SUPPORT_VFP=1 [RPI3_USE_PL011_UART=1] DEBUG=0 all
> +make PLAT=rpi4 RPI3_PRELOADED_DTB_BASE=0x1f0000 PRELOADED_BL33_BASE=0x20000 SUPPORT_VFP=1 [RPI3_USE_PL011_UART=1] DEBUG=0 all
>   ```
>   
>   The only difference between these firmwares is that the `RPI3_USE_PL011_UART=1` option was added
> diff --git a/Platform/RaspberryPi/RPi4/TrustedFirmware/bl31_miniuart.bin b/Platform/RaspberryPi/RPi4/TrustedFirmware/bl31_miniuart.bin
> index e53aa0ef40fd2a8a66fee22439de2860813aa42f..4ae39b79ffd483abab2f4ad29d6c380d4cd017ca 100644
> GIT binary patch
> delta 10889
> zcmaia3wTsjmhRf;R6;@sR8p09VpSzTNTEUqdGS0+Kv1NW5ET`r0(hm3OdA5-NTO8%
> zx^26zeL3tXHhMdiAexkYN7@jj+Q9_y+S>GtAu+ZySBDDtq66K$N%6}4*QttTzM1b{
> zzOOj@?7jBd>%G=qCuh5rv)#%*yICBT4s%M{!X#=c6I*-9Jg=Wf_{n@r|MB^1f1zAv
> zuE>*CYH|@3zJ%wvWNO-jr$)4oi1bFHvkpA*J9?`;Ximwl1B8dDC$ie(aD`XbW4=qH
> z{+J|r*_>TEJ(im8#*cnxGFNXgnHhn?Ten1;9pB)G_nRQ=k4a<=7OH0I4wE!2mnEc#
> zzsnydEK2xS5Mn1!@6*`V7EeuYbR0_fnPR^5u+n~6Rh$ZW5-+Oc?^tY26*0oBg_J2;
> zK(0$_6Yt4{WQ%x5PD*|*{y{Ud<Lh-rQ)q__Bxfi=ReqLympCdNDHivK#xm__jBq;U
> zRxJeXcQ{PivFIt`an#K4(=<K&R40a?id_p4ZS9=}97LYV8}*0UJ~fl|M*YF|pz7<r
> zp^|=KxoH1XK*E9w2Qa57zRI8~{MVwXDJX_Ai%zKI<OM#Ix`kdd!4Urr@<ho`QnK8P
> z=onFxk7%X=vqI5V0_NQCa0;*80_2{NwX=#I!n`VQ5F}T|jQm;E8E!eob*oMKBY+nm
> zwjA%}Uxn8`G-1x}>)kFqmBK!7e$O`2jdiQZt+!YxG|=d)Y?(@d0T9c`GC{q8Tr(NS
> zp8^8t0&5okZ=o)ei4sm?Y#{NN^a0gs>>JNqWB;Tv)YMHw|B?B9CVes(<8{TP1u9nF
> z+gCP6{xvn(84pYNJ@_)v1!Hs-ye-(g=D=E*Ei5FlTV3^8Gf~YNlboDZBsR!L($<vP
> zNei_4J(Y^~<_03gX(tK<hlh9FsPAfL&HUR<9v^D^=;m<BC-{xb+hizh=1eVG#|Eg^
> zQ_0xNO|(p7shLR6CdHd$)k@qr(KX$ZPMMTApOnFB`AB+h`T$X<EpzjEfms+;)%<Z(
> zyBN>7M7cYCasrEXI}o}4Y&#HCqx?UY$I@-%FG0o^RK<Tu6;3r--b~NX?6LYKix#?3
> zf28f_QDK`hB>qLLK4MoFVEw$aTZPHQ4iy>e7h|Cji~l|OV8+B58^;<i=c2;u@!cFQ
> zHe`4`7Ags=>l271cw@NGn4dmYzLk+YXYJUC#w`9LSaw|>F1!!s()lY!m*oE#j>{T0
> zwsgnpCovb+u*F|0MW$7Gd8|yyyhZtFtSrvFMSLgk&z$Xk91OvA4I=MmBCY;)ARJ6M
> zJyAo&VS23om9WnTaM+cXVs&2YfSI_XDZko8RTc=&L1f)iAoLSzDh{>4tgQai3LG$s
> z_HTt<45%sobl8i>M1{V4w1CY_wGQlEct4Qx#>1~O^Wlxm)tA_;Db(5d(=c}%Biu1p
> zqhY^>joameSvg59fV^tK5fGbkgcV0fJ<D?EpJ1dn>fbZ$D;%eU-(c7jXGDTa&@soX
> zD;X5JqN@HZ2%vk+P>~_Ym^hsslNnke&t#>#7snY=%7Y4Wu)stcfZN0KIhZ%z_s8ib
> ztg}~)Fy;rbzMHPTRKWNuVEAg1Gl|EGc%0%)#F$}EsL6ic5}vdAi(n-zan=Om%V&hf
> z0X^XZUj$O##9?BOD#9V+ba;(b^Fl}GE%%6+azTMpFl0H-K3Ab}a)~`4T4a>N=4h=W
> z{cW6VGg0lp&EYDaO$%H$ME1TRG6QNML$xv#Jm<fH`Wpmz27>IeQJ{r}ivNxI!uT}k
> zCS|Djcfi^z+Z_+Y^5_ci|4zncPkp2nuD1$q*8_M2pW+s*&Ict#%@5tEKitNC4u4O)
> zF^Zz|IO{F!vxB|hKeNjULp~?e3I3p(=syTtB!El4kX<~URX(#plSohg@mATJJx{zS
> z6LNC%P9fH?Xzj=XF2uHzc(+kh%@jdZ;RK)poyq@_tj?LA)!ISdTc|lAh#*3UZ6ein
> z$b&ieh$S+9;?LaJ>E~ELW-ag@;J(5Mu%KR#S$I!^P>sk-CN1<1*5CrVHay%JR8=QO
> zJ!Y2k)JQC0tE3n$z$_Gj1-8`Jv5%={<ERJ4E|qgwvhjZN=5XS!Af)X{)&hOy1zxFG
> zyt`%mq?EL0;TlMH`z<)~MWX#2jy7P<C+AMeh=R-Q_sK^lO-rkc2t|WXE+9cz-J0xz
> zE&Al%NyWFd!d1i8ob2xeA(ucP+;o2n`?M-*P8*`LA_k=R`(^CpjJZb=j7-?+dtzgW
> zjYO?>eYlD-wB`u-QL_JN<h;*D>Gwh$2VU~OCaWi>m@2R$&BaMEk=fUIRuszLPhK;(
> z5HzrmJSy#HL0R!0j#(-G#TZ}3+WACkvQg6DfI%Av#Wbij-M>vP%Uv!m%DuUZ5?H_-
> z>Mz6nIouzTH*%*vwihZNp@nVV15Sb6?}BuhZrdEHZ39-{G*5u0lWvRA&cm3h>@cPy
> zyq-z5?JyC$#(2VMgH>z?>~(MjyY9UzUzn2epU&Tj^K&Nl8ZsGe4#JN}d)6^=9MVu&
> zM)LZUTgCe_FRxgvl+}5;;*@+oZ;j}YXYy>~Ga2u!5L4wc=d{QX!WoWoia$f@&YYxn
> zR7rM)X0Co#lOu8NH}Yd=MLsjWhXnw!WaH3s<i3><f)A<GH%$wSX6OWrsYTA6I!*km
> zTt78MY>_{o`mOklTz~7&@>sO@`zYZOY@B_9&;N^}#<Bf3mfOAMuxnQ<=~HC<Z8^dw
> z^KY9i%yRv0Z;7vD*6khQIeF~%48@cn|8{%2_*TYF>r3!uQ{XTN9)K3@YNmIcJTq<f
> zVwXaNCt!DbENr9f5ElP8H$ZSMg<2PB0YW-iWup8b%G3d9<uzE~Nmw}V8G-*bh>|O&
> zPfvRs19ky;ne$IjWlOFWvYXfqTBc_t4H$~~r|<prf@*TUCQnVzjY9AY-6E6nmt-*+
> z;dGb+Qj+|?iIBpk+A5#PpE`wca@c<!`1dUG1h#@DK7-8z1o??n@7eLxBwbml0_gK?
> z!Y5;AEYClD9b82Z6(M5hw?t7@Yu$)fTKx}Q8{YNqD#TjMafpB?I`5M&%y@W`=ZT^N
> z<>N@7X+a%%@!6fc`aaON8j?(fPgwmv8DCHlKf3VwPCiml>_)&cg3y&UYWoo67s{bf
> z9LT;L2}FOqI=t%&#)SONcy0xS7$>AXnYo-}5wSODRC`LLD$issaGiy*iUO~LQureT
> zWc8m=qn$&T*MI|pb0SI@G#$D&oM#}1YZa2cwbGRgJz(P?fL)V0O{O}(<8d?vWNJaC
> zyK|e+yZ*&?-~`0Zm|Fn+B`D-jT|JBphj-7l;UcE^Z&0NtTMP68K|jpYu2Nj5LUCP6
> zYR!L#FLy#ZE+xs^tk58GXw^&QMc(6zW$+X%s2lUuhfBPOYlF|@{Q=}D<h@xbmqGeT
> zuyX>eu_l>_5Ds91!tWOUtq?u^p|P^N>)-~MuEE9cWo%(aydRM5%+D<pI3)86Em<Gn
> zjVpN%Oq|X7LnxUulnbJKMOGK4Ec=w<$K$4jCkH?mSlWRx%H_CU^BQCWDx4RVm$i?i
> zRjl<;cf20XI^p^|b0}PYSICbGC%QL|(?7?hU||e3{o^>k_t9AkECD1q34k1VKfyY)
> z_ajt@JU?<kgW&QwTtRRsDZpWMca4KhS~!OFI5v}h$k-cs$A$JF-phgaJKU^_@pEW6
> zkX|+Jb^D3tfA%T7G8@E%W6$BXMe>EBda+%`7Uv@7<QGp|o}H%81oo!vbiGNj9OdA{
> zHrxCxonxDAhX#@B&UR)`(-pI)7a=c^ofD_^TxlJzzjSk9UmB{4Cfsa~E2V>=q)K)#
> zO0|^O>iev!<;`v&@I-5+qNYyv6&JZ_yuJ)nzmH!oB*a7paqoj$`x~RR&|R1>9YYDF
> zHcI?IY-wY)Ql+M@L{R#2MpJI3#BvhO1-O@#Q<9hPj%I*SFl-|cXQP}N6*bv|>l`Hx
> zWbSK5;Ca9O#27Jyiv+p7WUX6MsEP><ZmWJ9qV=MDI(H}NBrq3?!aTT5%$QF!*a*`v
> zisNKRwZW9;bOmdGsU$?;K_Iq&UuJc+)Ai;`J|GPeFGLB-d$>Xgj%iL0+spT=9Urny
> z$=Gl~jrI?Kh<}l_rEiI3>6rDnAo={PZQ@lKKRXxQgTmQU#el4yo#Xx-(SW*5`bT4_
> zsSe4<u#N1Du;$7$bhlzPe69Ky+7JlrwL_}R`RI3s*#?G2?2U;s@F)>Hz{geQ$OZB}
> zoY_@I{a{3@bF#$mrDIO>*uQ`^c8j=Z`KLL~^)+aYlxd#I);*+m;bz@ZK~M7?3Q67o
> zYr*`zd^2IY{OXR7%S4?m+lT|L^K-!XFy@-O05BIv;DUFAM2r^VHD-iyF#LnEdagx$
> zE;r4!C7p&K44e#${zVxIHJ@ysn}agvpXU|`s}%DxvaW$TcCq*HY=l?{U7mLA<hgfb
> z>AYe`8&;B2+0!k~y`!LH1j;A%d6u+SMnSzi3hEc~;Jj(#6M1HyEvpgp4saqO*q#{$
> zS0nT0+w!=F0uwuX0eus8Gn9f(&k4|P<*a7$Gq2s)<&m}XEt7tWJJoVPyObimNqBmj
> zdJDZx3VAtn>;@D+!SQ^XdnUUtlvsr4XLvR%$%ETq%`H^Y?|4<)SqBWA&o)TM7p|SK
> z*vjfB3WwMTE<Ie1$abVnfzlgC8O~Y52o8LI`|DH{<JJedoflEtaCpG2&l##QwWC~|
> z?7udZLN6l7aFyCMKAc5DV6G1lX~4)R7H7Sz)-1UusJz(3-i~`3nsZDpcXDQ9T(4&6
> zL)dj($&jyTX&F&r75A{&_)u-LNmLtkc&hwFb0kRECnqvBY&Jc~Qj}T8MUI0jHN7Jp
> zWj6PrQJnRGvm!`<IlKolblcVb{opQKpr<*Tf6c^O{a%A`E3%NqSpZBed$=^PI3L5j
> zk2RJF>%<&ujOX=H@JM-0BhtOHrea)ssAfU?wW(aoek6~S-6lHaxw0HFB$LYR)4)Eo
> zw~w_aGAY0=x(6YF_p_!r@BA1&oe?*dYs){ki-v|in0^mY5zZCfYyfg4580e`*b(7Y
> zR?Jzb{s$n{ix$(_?O0?$z7Ic!Qe!@DZnzg$aUjq(=NusHS%Z-2;rkZguE;Mda_kOs
> zly?nwufgsGICi@|T6bWTkNpP4zsy`<cXN7S=VF4hV#zuHQ$gie`#7#}N=(I;;ptSm
> z7)Ld)n^bZLbLc-MFp|F-rWW|VEM&Lf3Mp)2!e4?z*vuZp!KFFT`n9^K_RYu;*8l_O
> z=&6QjJIonwZv!aYmP7hgHN#&B#5Og##)>o&gYwBX1{ZKdZ$$Lk@{Ect>p(~lsl;A0
> zy99pG=fS=`#b}bP+jM|oHX*GzD(v3YXf2?mR%~G-bL?o|U2+KqcUMUXE-4%K6l)<=
> z4OL|z!eO5fZ3HMACD*iLazM^qn3DGwc*LEcmBq>~h`8-t4Km9iNY_{`AfN`$P{-xd
> z3$qITXk2B75av3u_95hgTD7)3E==wTkej`3cFFKv_7Z~ZI5VD<A1|y=Wr-C)N}GVW
> zGn;h2EU*OS$~#IXjztVPZ;1GZE73*(B97?1k#EKFz#TIaasYVA01Ov3N9Bz>rp6G0
> zD+en%eUY`SQKin51a#ibCH+In=A93iv|>Sz?@U^owp^kq4auEz*b)EYd>eiW*1D6M
> zcQ-1OCt`4uUrl<4Y+O_<Tr#jI$M)~co=WF5bYQv_PkNn_v0Ti88Ba`d)+s_>Ta*_2
> zGJ33C$R=GfYjLW(X@Xt~8ehk60_4i2U0Kh({(?-@?MM&qu~b`^+?>vij7I3LaLTYa
> zpF%PYryJa#F|T0{rD_45v&A5(L*7UoRX!Aa?8tma9ogG}z2RJWq%DelWS$Hxo+=j0
> zuNT`U)nn0z>N;GXA`+h@{aMVxcM4lD1~Pw+%)2w^L5}+Sw;_Up<Po#Rg}~oDK7BJX
> zrI86raV%#8LT7?QV_o^ZeGXt_5?PstV6k@omeFI@g9vv^A%=Hk%bgjx-W<F$ttQDR
> zA~~KT;vlB~$uOo1patD))YN>bNp|{heX9qf7a{$~J<HE?^Ker4&Ec6$!5OR-qN?HQ
> z=0<%u2QUZRT(}5RNRVZB<&^m#a&G4_Pr;k$9zvYMz|2pyx^~%tEeA%)t*QZJ3WmQA
> z>!*R0<Jxw)_pYf6KfM4BaUo+YI3HEw4_W#j;5e+1dd#uH{%+6{vEoQugRwp#la}Np
> zw4`Wke}mOfB}@L4ymQIyTYYOtUkWNms`ruNn&%f`zGZ?IVkZMdJLSG5cJW7fY{^ej
> zZJAG<XGEgGw%j3TCf8~MP=H)<_a?<|mY>|6kL$KrYC$I?Y3Y*uZxQ@2;^zm-@HO{P
> zTP|vOj)6h2#zo+)$UBd(NPTIl;xWrNm*%-~aRQ&vd@!S*7yFGK`Mci-M7}VvrzSya
> zY&|OwZ&E9wbq<Q9n0pBC52-~)V1&+gT|Ym(>s#zufVGpjOT8OS%aY-Z-*gvxxz5VO
> zF9ucY|6cdgk~Xrq<J?M2%^q<3su~sdSv2BDG!g@XXACOEW(cQKNsB|ms0^u@PR&A9
> z6ESAvsK130UFdY3goH+-nr0?%9@eX|7CVzl^D-OyvW4O;E1}Xd%%{XqKp+#;;fxc&
> zL8o&Y`d%-fP?<{JHcNco-U;LLiWvwRd1F52YwSZoHN&|@hJKWD-)h)`Sm3GT%)_(Q
> zYg%486B^#tW?71zKgxT(KnuMwA8{F|9R>_H%@lnsEU(3jCMm)*H$GiZrgFNWuj7gA
> z13tO_o*eP6)bB~J-nU69*2~t}hd#z#oXu2VBiAn;+)F$VtUwvYcb@_f;@Ik`)Zmh$
> zCq7V(k{}z^3FNT974r(_veB?SjQ4C5cU$pPdX@%c%)ObZ6=a*C0w4!p<F;X;f__<9
> zPO4MRxp#XE#~Z@Q(*8(l7D9Rthji$#l6Ci*;RE3SeOcbPH$yxr)0Smq@lBpd;X=s+
> zjD&g^@B0bW$)j@FvT34UHZHS>rSipP{{s<YQsp%Ke_!R}Vo)Bed{6w7e0uq!{2-(<
> zKU?i@E>`;?e=sWiY>^!KSRdSe<EsJcltjMg49YXhA9kbTQ>7s*2%m?qVZS2!>DyYu
> zE&oppy!#YvmGkI--oN?(yI+Y=@cHnt?5bLt$?>Vh8{M7_8SIf`+V{Q^)BeUi6e>p@
> zAgA0naiI_4w+p=!pK5CNZ4<f=^=dHMljwUGb7K~?`^G5vEyPc4=gfeszdjc_4oClR
> zFr6*+`}SD*s6rgmIRn?0(|3d}PVgjlEWSTVD82-F&jT}7##nS0SPO?-3xBNJL0?$(
> zhcWjNe);(HFcOCNj*l8<UtReWUC~~KS^GAiq;T>FM~eAXul<9r^H%`xLKqKVZ?^pM
> zfvK4s1OVk9Lg`h3^m#>%@-tPJ)iHiKam7-Fl4RYAB4x9+<INRwMXB#O0gGzuZ9&j$
> zO`#CJFoZzWKGIP16j0zVh+H@7KQPqHct_SAmyU-la~y!=<dY3(Z3P-_c(PH{Af9n@
> z(hwzhZZ*tP!TOM4B;kv$eDa~xxsUNesuohiHo1>H#X3HL8p(E~C$Y&is_`)@*X)!B
> zAIdOoQOPQUNme&=SqH;h028AXTELC(DyyTLcNa9c`{vU#=j)VuTy+%xYQ^NgkkY)H
> zL;Lbf3xBvmnKr$sPTBJI%oy4rV6s~^PcOqh15#WHL4rRtd6XzmCBB0`0l8Og!aC|U
> zzf$IL<J0@*x0|`pz(!Z1XZHnz*>J2jVzlria)FBC)Q>pZ+u4wmVgFn++9@bxdsE;=
> z%tYsJDS_j62p*Q2)4%&lcK_}RYU<HsO7`NgU)k^xwr=az-5V9<XizQoH%;!}eJFY^
> z9lNSVIp0O~=bKHT*Or^}Hr_qc+p>s4E$Y2_M453&fi-!kKXabb+E**7-uq2-?71xs
> zL#^{k&R&`2&Q`V1stKqnNj+Ll7H=6O!C$8wW2mYFf%DZdr27^jDUxNd4PPA)r;p_z
> zSujjDx~4%+^|OJ4=&vo1&TjN=?D)7#6Z>~l6m`1L<bE9Q0yI*?Mv2V$X7w}*XlS<t
> zO<K|0o-K2RPQp;R`~3zg?yuDpr%B^ag8YFY!~X`v{RS#)t~La1MGP9_uaWVORJcz<
> z)+g0;B-9MQBSQ=PH$XDBBbd)a=zTts_D?1)l#RciIDV^kejpxVKnQkY+=%h~+qCm#
> zc&?(w=S*;i1?B};S;4DJ+PTJYRCS|1+?!@S_EW6a&=c4%5ULkqa34F4?;%`Uuimlz
> z>M!GvKp45A3{K%O4(`Gj-I=O56e}iJkOHD=Vkf?`w(-#+Qyg`Ei<0k2iaz=k=C`8>
> z!WZdnJGJ(ox01dMZEIY-j=3TCa^UzNmO3i{w+2Cc6~zsn9J`3BuE1JQ3*v7PtVg+S
> z^k8Eb>Ohz)K9{CIepY`6-n+9|fk}hq;I2O#U)3jv70T~@a^TSv_g}4AdmEX&Zi*U=
> ziK1giU<N1y27e3)p8F-<{WSLIDlu-5)y#9%P~m)G8g$@^Y>=1=v*104QMYv|V+Xgv
> zJhszVFIa=9OoLzTYEE}6QG+Lq{V{`I<GqVaPuOn`yQ{wSk^ToLZW4k6cc~C_c2H)j
> z-lBLCYi}TVn>>l^kt6d)VVl7>=nvXB!c@c2_<0er@6E{bzmjG3rQxatmxlK<;opH!
> zm{&@<56%3&7%+85t_>Rn&FAv#RmI{_ndRDZ+nRLz1rEHGWz4nY+F4rQu}UovKwVpn
> zF{)(03owqe&-6Vb&$#U4g30<;MGM6s4R4ZZ)qhulXFA5NPE^Fd%dEAJ$N#9rWd7vG
> zPnCQ^CB<(_eJw6Hvt;yR{}A=TFNFEAj;9~XRmE!^E$dwBlpQm45knyXc{t1kx)>K3
> z@4(m$KL=Uxt<c7fyeB7!$*UmeYRH!h2CnJUb!$r?e|-{kyZ7uW{9#8_P4K3Cbp7pR
> zUxDc32rCr;=ki}A#XAW<U^|BGy$(bK!q_OH0mC10Iq|oybCs-KXD<oK!1`Px0!IP*
> z0!n&z6s~YPae-jJcmPRRjXAXY9r(V>BVIA#-8O~JZCxo6ws%v)_UT*GUwdLw2|nEV
> z_kzehH-|gj3e{Rc{GVZPeJE7x@a2I2M&c0OJxX#M+rSUH|IlqDDgOS`gaR@SeHNEu
> zUBZ{{Cy|D@r{jB~u7raYx0(1e#f|zud|yd(;+zTRWWw2xl5lXrN)7E9Q+qn@#1BnK
> z)47q&5xiSLcfk0THTq^HZ~uwK-9)uqCbwi#RVtw23zd^OM7}0!gYW^{K2ckZrvqYO
> zxFBlqEMEUq)M`mowGRGc`?IJm!=G|k#|{;5o`(;cxP+!&cxLBD7!m3`Sf0fRE_4q*
> zMHBQGjHSX(MZ{f134R|Eg`W|lv7cfKidr9nn(aGL%Q71|una_T|BczOb&Fbi3{}M-
> zp4)ba+HPpK?JCCIxcGn|h#~Qa{P-sYNo}YEf@<c`lW2GFXP7cn7x&AAr?%bp7S0-i
> zD_l4{)B8J&p9Lg8FXAr-8o<CcFz{-GfhKwADN8~*!ZUvpx`;CUf|}{yE5Cj!HxErH
> z^aI1pxs-H+IaEsqbE$E(>>J=@0bG&!wX?-mxxUtm|3kGuS$G(nly}pz3RsnUBGty6
> z8m{8%hdEA-Q!_XksKDL{!-&UtbdAN=Oa9xYuR8wM1~p0qrP%Bi-Nyeu<NxPn<I`?*
> zCU{;m{<j<d$MXEn2CLOoF<f<g71|Ye-mKR`pNEE1^n?{V8)EPs`S}K0eA*RMv*Wm*
> zK~-Ma*^q;_z1W<~0KYW=LYIF4s4)Nzg#k>a|7jrGY@AaNIR{TZXT=Za%rnsZW)zw@
> z15I@pO)M{ue|psN;2HT&L$)XzIVQ`%^>l~u#F(x5vkD4kO)t6CzO;IS-Ck&)F@45#
> znYAN(I+2;e|8_*4(-DmLA6PT~jm-OuH#u*|U{rXNtLG=&oo0;bV&r*NHtH$j3;b`3
> z-5;52>uA@XQye>*!l1h&&(|W)e~dg2$Yo6fv9>S}+2rgOzr3qQMqVS2S4+YJ6a1b3
> zeHmF_SsI@Aj68cLl<|yxb$Fgu>j}x(8zXNoN1o=Y@ah+l=c`p6Lfjs^)A!W>1<4r8
> Ag#Z8m
> 
> delta 10645
> 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
> 
> diff --git a/Platform/RaspberryPi/RPi4/TrustedFirmware/bl31_pl011.bin b/Platform/RaspberryPi/RPi4/TrustedFirmware/bl31_pl011.bin
> index e0d53f4bdc4e3404d39b7176543d64bdcef03886..915085d6754984c358aac16ce444d8a83214d090 100644
> GIT binary patch
> delta 10853
> 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
> L+z`Jr@ZkRgVA`Co
> 
> delta 10848
> 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
> H`|f`NMF{Z?
> 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: fix FDT handling for RPi4
  2020-03-06 12:46 ` [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: fix FDT handling for RPi4 Pete Batard
@ 2020-03-06 16:48   ` Ard Biesheuvel
  0 siblings, 0 replies; 6+ messages in thread
From: Ard Biesheuvel @ 2020-03-06 16:48 UTC (permalink / raw)
  To: Pete Batard
  Cc: Andrei Warkentin, edk2-devel-groups-io, Leif Lindholm,
	Philippe Mathieu-Daudé

On Fri, 6 Mar 2020 at 13:46, Pete Batard <pete@akeo.ie> wrote:
>
> Please see one note at the end:
>
> On 2020.03.06 05:53, Andrei Warkentin wrote:
> > A rev-up of start4.elf VPU firmware meant that
> > the previous scheme of loading the DTB over top
> > of RPI_EFI.FD no longer works - the DT is now
> > loaded way before the armstub, so any overlap
> > means the DT is overridden.
> >
> > This change re-arranges a few items in the FD,
> > allowing the DTB to loaded directly after the
> > FD in physical memory.
> >
> > This moves UEFI image down by 0x10000, and reduces
> > the FD image size by 0x10000, leaving space for
> > a DTB to be loaded by config.txt at 0x1f0000.
> >
> > You need a matching "rev RPi4 TF-A for DTB fix" patch
> > to edk2-non-osi, as it requires a TF-A build with these
> > options:
> >
> > PRELOADED_BL33_BASE=0x20000 RPI3_PRELOADED_DTB_BASE=0x1f0000
> >
> > Note: the same problem still affects the Pi 3, and will be
> > fixed in a separate change.
> >
> > Signed-off-by: Andrei Warkentin <andrey.warkentin@gmail.com>
> > ---
> >   Platform/RaspberryPi/Library/PlatformLib/PlatformLib.inf  |  2 ++
> >   Platform/RaspberryPi/Library/PlatformLib/RaspberryPiMem.c | 13 ++++++++++++-
> >   Platform/RaspberryPi/RPi4/RPi4.dsc                        | 10 +++++++---
> >   Platform/RaspberryPi/RPi4/RPi4.fdf                        | 20 +++++++-------------
> >   Platform/RaspberryPi/RPi4/Readme.md                       | 10 +++++-----
> >   Platform/RaspberryPi/RaspberryPi.dec                      | 15 ++++++++-------
> >   6 files changed, 41 insertions(+), 29 deletions(-)
> >
> > diff --git a/Platform/RaspberryPi/Library/PlatformLib/PlatformLib.inf b/Platform/RaspberryPi/Library/PlatformLib/PlatformLib.inf
> > index 77cdbe39..3aac6a98 100644
> > --- a/Platform/RaspberryPi/Library/PlatformLib/PlatformLib.inf
> > +++ b/Platform/RaspberryPi/Library/PlatformLib/PlatformLib.inf
> > @@ -44,6 +44,8 @@
> >   [FixedPcd]
> >     gArmTokenSpaceGuid.PcdFdBaseAddress
> >     gArmTokenSpaceGuid.PcdFvBaseAddress
> > +  gRaspberryPiTokenSpaceGuid.PcdFdtBaseAddress
> > +  gRaspberryPiTokenSpaceGuid.PcdFdtSize
> >     gArmPlatformTokenSpaceGuid.PcdCoreCount
> >     gArmTokenSpaceGuid.PcdArmPrimaryCoreMask
> >     gArmTokenSpaceGuid.PcdArmPrimaryCore
> > diff --git a/Platform/RaspberryPi/Library/PlatformLib/RaspberryPiMem.c b/Platform/RaspberryPi/Library/PlatformLib/RaspberryPiMem.c
> > index e795a885..dec8e09d 100644
> > --- a/Platform/RaspberryPi/Library/PlatformLib/RaspberryPiMem.c
> > +++ b/Platform/RaspberryPi/Library/PlatformLib/RaspberryPiMem.c
> > @@ -94,7 +94,18 @@ ArmPlatformGetVirtualMemoryMap (
> >     VirtualMemoryInfo[Index].Type             = RPI_MEM_RUNTIME_REGION;
> >     VirtualMemoryInfo[Index++].Name           = L"FD Variables";
> >
> > -  if (BCM2711_SOC_REGISTERS == 0) {
> > +  if (BCM2711_SOC_REGISTERS != 0) {
> > +     //
> > +     // Only the Pi 4 firmware today expects the DTB to directly follow the
> > +     // FD instead of overlapping the FD.
> > +     //
> > +     VirtualMemoryTable[Index].PhysicalBase    = FixedPcdGet32 (PcdFdtBaseAddress);
> > +     VirtualMemoryTable[Index].VirtualBase     = VirtualMemoryTable[Index].PhysicalBase;
> > +     VirtualMemoryTable[Index].Length          = FixedPcdGet32 (PcdFdtSize);;
> > +     VirtualMemoryTable[Index].Attributes      = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK;
> > +     VirtualMemoryInfo[Index].Type             = RPI_MEM_RESERVED_REGION;
> > +     VirtualMemoryInfo[Index++].Name           = L"Flattened Device Tree";
> > +  } else {
> >        //
> >        // TF-A reserved RAM only exists for the Pi 3 TF-A.
> >        //
> > diff --git a/Platform/RaspberryPi/RPi4/RPi4.dsc b/Platform/RaspberryPi/RPi4/RPi4.dsc
> > index da62dc5b..2e98c3e1 100644
> > --- a/Platform/RaspberryPi/RPi4/RPi4.dsc
> > +++ b/Platform/RaspberryPi/RPi4/RPi4.dsc
> > @@ -279,7 +279,10 @@
> >     gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibraryPropertyMask|1
> >     gEfiMdePkgTokenSpaceGuid.PcdPostCodePropertyMask|0
> >     gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|320
> > -  gRaspberryPiTokenSpaceGuid.PcdFdtBaseAddress|0x20000
> > +  #
> > +  # Follows right after the FD image.
> > +  #
> > +  gRaspberryPiTokenSpaceGuid.PcdFdtBaseAddress|0x001f0000
> >
> >     # DEBUG_ASSERT_ENABLED       0x01
> >     # DEBUG_PRINT_ENABLED        0x02
> > @@ -393,8 +396,9 @@
> >     # Size of the region used by UEFI in permanent memory (Reserved 64MB)
> >     gArmPlatformTokenSpaceGuid.PcdSystemMemoryUefiRegionSize|0x04000000
> >     #
> > -  # This matches PcdFvBaseAddress, since everything less is ATF, and
> > -  # will be reserved away.
> > +  # 0x00000000 - 0x001F0000  FD (PcdFdBaseAddress, PcdFdSize)
> > +  # 0x001F0000 - 0x00200000 DTB (PcdFdtBaseAddress, PcdFdtSize)
> > +  # 0x00200000 - ...        RAM (PcdSystemMemoryBase, PcdSystemMemorySize)
> >     #
> >     gArmTokenSpaceGuid.PcdSystemMemoryBase|0x00200000
> >     gArmTokenSpaceGuid.PcdSystemMemorySize|0x3fe00000
> > diff --git a/Platform/RaspberryPi/RPi4/RPi4.fdf b/Platform/RaspberryPi/RPi4/RPi4.fdf
> > index c3832035..a59d3b60 100644
> > --- a/Platform/RaspberryPi/RPi4/RPi4.fdf
> > +++ b/Platform/RaspberryPi/RPi4/RPi4.fdf
> > @@ -25,11 +25,11 @@
> >
> >   [FD.RPI_EFI]
> >   BaseAddress   = 0x00000000|gArmTokenSpaceGuid.PcdFdBaseAddress
> > -Size          = 0x00200000|gArmTokenSpaceGuid.PcdFdSize
> > +Size          = 0x001f0000|gArmTokenSpaceGuid.PcdFdSize
> >   ErasePolarity = 1
> >
> >   BlockSize     = 0x00001000|gRaspberryPiTokenSpaceGuid.PcdFirmwareBlockSize
> > -NumBlocks     = 0x200
> > +NumBlocks     = 0x1f0
> >
> >   ################################################################################
> >   #
> > @@ -53,16 +53,10 @@ NumBlocks     = 0x200
> >   0x00000000|0x00020000
> >   FILE = $(TFA_BUILD_BL31)
> >
> > -#
> > -# DTB.
> > -#
> > -0x00020000|0x00010000
> > -DATA = { 0x00 }
> > -
> >   #
> >   # UEFI image
> >   #
> > -0x00030000|0x001b0000
> > +0x00020000|0x001b0000
> >   gArmTokenSpaceGuid.PcdFvBaseAddress|gArmTokenSpaceGuid.PcdFvSize
> >   FV = FVMAIN_COMPACT
> >
> > @@ -76,7 +70,7 @@ FV = FVMAIN_COMPACT
> >   #
> >
> >   # NV_VARIABLE_STORE
> > -0x001e0000|0x0000e000
> > +0x001d0000|0x0000e000
> >   gRaspberryPiTokenSpaceGuid.PcdNvStorageVariableBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize
> >
> >   DATA = {
> > @@ -119,11 +113,11 @@ DATA = {
> >   }
> >
> >   # NV_EVENT_LOG
> > -0x001ee000|0x00001000
> > +0x001de000|0x00001000
> >   gRaspberryPiTokenSpaceGuid.PcdNvStorageEventLogBase|gRaspberryPiTokenSpaceGuid.PcdNvStorageEventLogSize
> >
> >   # NV_FTW_WORKING header
> > -0x001ef000|0x00001000
> > +0x001df000|0x00001000
> >   gRaspberryPiTokenSpaceGuid.PcdNvStorageFtwWorkingBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize
> >
> >   DATA = {
> > @@ -138,7 +132,7 @@ DATA = {
> >   }
> >
> >   # NV_FTW_WORKING data
> > -0x001f0000|0x00010000
> > +0x001e0000|0x00010000
> >   gRaspberryPiTokenSpaceGuid.PcdNvStorageFtwSpareBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
> >
> >   ################################################################################
> > diff --git a/Platform/RaspberryPi/RPi4/Readme.md b/Platform/RaspberryPi/RPi4/Readme.md
> > index 21c9fd4f..e2f0d698 100644
> > --- a/Platform/RaspberryPi/RPi4/Readme.md
> > +++ b/Platform/RaspberryPi/RPi4/Readme.md
> > @@ -49,8 +49,8 @@ Build instructions from the top level edk2-platforms Readme.md apply.
> >       ```
> >       Additionally, if you want to use PL011 instead of the miniUART, you can add the lines:
> >       ```
> > -    device_tree_address=0x20000
> > -    device_tree_end=0x30000
> > +    device_tree_address=0x1f0000
> > +    device_tree_end=0x200000
> >       device_tree=bcm2711-rpi-4-b.dtb
> >       dtoverlay=miniuart-bt
> >       ```
> > @@ -80,12 +80,12 @@ You can pass a custom Device Tree and overlays using the following:
> >   ```
> >   (...)
> >   disable_commandline_tags=2
> > -device_tree_address=0x20000
> > -device_tree_end=0x30000
> > +device_tree_address=0x1f0000
> > +device_tree_end=0x200000
> >   device_tree=bcm2711-rpi-4-b.dtb
> >   ```
> >
> > -Note: the address range **must** be `[0x20000:0x30000]`.
> > +Note: the address range **must** be `[0x1f0000:0x200000]`.
> >   `dtoverlay` and `dtparam` parameters are also supported **when** providing a Device Tree`.
> >
> >   ## Custom `bootargs`
> > diff --git a/Platform/RaspberryPi/RaspberryPi.dec b/Platform/RaspberryPi/RaspberryPi.dec
> > index 25058ccc..3ebb83d9 100644
> > --- a/Platform/RaspberryPi/RaspberryPi.dec
> > +++ b/Platform/RaspberryPi/RaspberryPi.dec
> > @@ -36,13 +36,14 @@
> >
> >   [PcdsFixedAtBuild.common]
> >     gRaspberryPiTokenSpaceGuid.PcdFdtBaseAddress|0x10000|UINT32|0x00000001
> > -  gRaspberryPiTokenSpaceGuid.PcdFirmwareBlockSize|0x0|UINT32|0x00000002
> > -  gRaspberryPiTokenSpaceGuid.PcdNvStorageEventLogBase|0x0|UINT32|0x00000003
> > -  gRaspberryPiTokenSpaceGuid.PcdNvStorageEventLogSize|0x0|UINT32|0x00000004
> > -  gRaspberryPiTokenSpaceGuid.PcdNvStorageVariableBase|0x0|UINT32|0x00000005
> > -  gRaspberryPiTokenSpaceGuid.PcdNvStorageFtwSpareBase|0x0|UINT32|0x00000006
> > -  gRaspberryPiTokenSpaceGuid.PcdNvStorageFtwWorkingBase|0x0|UINT32|0x00000007
> > -  gRaspberryPiTokenSpaceGuid.PcdExtendedMemoryBase|0x0|UINT32|0x00000008
> > +  gRaspberryPiTokenSpaceGuid.PcdFdtSize|0x10000|UINT32|0x00000002
> > +  gRaspberryPiTokenSpaceGuid.PcdFirmwareBlockSize|0x0|UINT32|0x00000003
> > +  gRaspberryPiTokenSpaceGuid.PcdNvStorageEventLogBase|0x0|UINT32|0x00000004
> > +  gRaspberryPiTokenSpaceGuid.PcdNvStorageEventLogSize|0x0|UINT32|0x00000005
> > +  gRaspberryPiTokenSpaceGuid.PcdNvStorageVariableBase|0x0|UINT32|0x00000006
> > +  gRaspberryPiTokenSpaceGuid.PcdNvStorageFtwSpareBase|0x0|UINT32|0x00000007
> > +  gRaspberryPiTokenSpaceGuid.PcdNvStorageFtwWorkingBase|0x0|UINT32|0x00000008
> > +  gRaspberryPiTokenSpaceGuid.PcdExtendedMemoryBase|0x0|UINT32|0x00000009
>
> Since I got the same remark last time I went for something similar, I'm
> just going to point out that you only want to change/add the ids for the
> Pcds you are explicitly modifying or adding, and leave the rest as is
> even if it breaks sequentiality.
>
> In other words, you could just have inserted a:
>
> gRaspberryPiTokenSpaceGuid.PcdFdtSize|0x10000|UINT32|0x00000009
>
> either after gRaspberryPiTokenSpaceGuid.PcdFdtBaseAddress or preferably
> at the end, since I would assert that we care less about grouping the
> PCDs in a logical order here than we care about finding out the next
> free PCD id to use.
>
> I'm hoping that this can be fixed by a maintainer at integration, rather
> than require a v2, since that's the only comment I have on this patchset.
>
> With this:
>
> Reviewed-by: Pete Batard <pete@akeo.ie>
> Tested-by: Pete Batard <pete@akeo.ie>
>

Agreed

Pushed as 91ed4f904e16..828fcbf96a38

Thanks all.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [edk2-non-osi][PATCH 1/1] Platform/RaspberryPi/RPi4/TrustedFirmware: rev RPi4 TF-A for DTB fix
  2020-03-06 12:46   ` Pete Batard
@ 2020-03-06 16:52     ` Ard Biesheuvel
  0 siblings, 0 replies; 6+ messages in thread
From: Ard Biesheuvel @ 2020-03-06 16:52 UTC (permalink / raw)
  To: Pete Batard
  Cc: Andrei Warkentin, edk2-devel-groups-io, Leif Lindholm,
	Philippe Mathieu-Daudé

On Fri, 6 Mar 2020 at 13:46, Pete Batard <pete@akeo.ie> wrote:
>
> On 2020.03.06 05:53, Andrei Warkentin wrote:
> > This is a required change for the "fix FDT handling for RPi4" patch.
> >
> > It's the same TF-A, but built with different options:
> > - PRELOADED_BL33_BASE=0x20000 (down from 0x30000)
> > - RPI3_PRELOADED_DTB_BASE=0x1f0000 (up from 0x20000)
> >
> > Signed-off-by: Andrei Warkentin <andrey.warkentin@gmail.com>
>
> Reviewed-by: Pete Batard <pete@akeo.ie>
> Tested-by: Pete Batard <pete@akeo.ie>
>

Pushed as e8c6d9509de4..17f0712c484b

Thanks all

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2020-03-06 16:52 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-03-06  5:53 [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: fix FDT handling for RPi4 Andrei Warkentin
2020-03-06  5:53 ` [edk2-non-osi][PATCH 1/1] Platform/RaspberryPi/RPi4/TrustedFirmware: rev RPi4 TF-A for DTB fix Andrei Warkentin
2020-03-06 12:46   ` Pete Batard
2020-03-06 16:52     ` Ard Biesheuvel
2020-03-06 12:46 ` [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: fix FDT handling for RPi4 Pete Batard
2020-03-06 16:48   ` Ard Biesheuvel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox