
Raspberry firmware used to pass a FDT blob at a fixed address (0x100), but this is not true anymore. The address now depends on both the memory size and the blob size [1].
If one wants to passthrough this FDT blob to the kernel, the most reliable way is to save its address from the r2/x0 register in the U-Boot entry point and expose it in a environment variable for further processing.
This patch just does this: - save the provided address in the global variable fw_dtb_pointer - expose it in ${fdt_addr} if it points to a a valid FDT blob
There are many different ways to use it. One can, for example, use the following script which will extract from the tree the command line built by the firmware, then hand over the blob to a previously loaded kernel:
fdt addr ${fdt_addr} fdt get value bootargs /chosen bootargs bootz ${kernel_addr_r} - ${fdt_addr}
Alternatively, users relying on sysboot/pxe can simply omit any FDT statement in their extlinux.conf file, U-Boot will automagically pick ${fdt_addr} and pass it to the kernel.
[1] https://www.raspberrypi.org/forums//viewtopic.php?f=107&t=134018
Changes in v4: - add save_boot_params hook for ARM1176 to make the passthrough work on ARMv6-based original Pis
Changes in v3: - revert back to assembly for save_boot_params()
Changes in v2: - merge the series in a single patch - convert the save_boot_params() function to C code - add a board_get_usable_ram_top() function to protect the blob during relocation - remove the (obsolete) extern declaration from include/configs/rpi.h - rename the global variable to fw_dtb_pointer - rename the environment variable to ${fdt_addr} - fix 64-bits compatibility issues - document possible uses of ${fdt_addr}
Cédric Schieli (2): arm: add save_boot_params for ARM1176 rpi: passthrough of the firmware provided FDT blob
arch/arm/cpu/arm1176/start.S | 10 ++++++++++ board/raspberrypi/rpi/Makefile | 1 + board/raspberrypi/rpi/lowlevel_init.S | 36 +++++++++++++++++++++++++++++++++++ board/raspberrypi/rpi/rpi.c | 29 ++++++++++++++++++++++++++++ 4 files changed, 76 insertions(+) create mode 100644 board/raspberrypi/rpi/lowlevel_init.S