diff options
author | Alex Deymo <deymo@google.com> | 2017-04-02 01:25:20 -0700 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2017-05-09 20:35:06 -0400 |
commit | 82f766d1d2c580a29bed340ea4dd9fa1b8ff05e0 (patch) | |
tree | 81c70f6e469d4431d3852e2d6fe43443fff6ad5a | |
parent | 45a6d231b2f9b891a7df517fc40b8466e12f2b57 (diff) | |
download | u-boot-82f766d1d2c580a29bed340ea4dd9fa1b8ff05e0.tar.gz |
Allow boards to initialize the DT at runtime.
In some boards like the Raspberry Pi the initial bootloader will pass
a DT to the kernel. When using U-Boot as such kernel, the board code in
U-Boot should be able to provide U-Boot with this, already assembled
device tree blob.
This patch introduces a new config option CONFIG_OF_BOARD to use instead
of CONFIG_OF_EMBED or CONFIG_OF_SEPARATE which will initialize the DT
from a board-specific funtion instead of bundling one with U-Boot or as
a separated file. This allows boards like the Raspberry Pi to reuse the
device tree passed from the bootcode.bin and start.elf firmware
files, including the run-time selected device tree overlays.
Signed-off-by: Alex Deymo <deymo@google.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
-rw-r--r-- | README | 8 | ||||
-rw-r--r-- | board/raspberrypi/rpi/rpi.c | 10 | ||||
-rw-r--r-- | doc/README.fdt-control | 4 | ||||
-rw-r--r-- | dts/Kconfig | 8 | ||||
-rw-r--r-- | include/fdtdec.h | 6 | ||||
-rw-r--r-- | lib/fdtdec.c | 3 |
6 files changed, 38 insertions, 1 deletions
@@ -968,7 +968,7 @@ The following options need to be configured: tree is available in the global data as gd->fdt_blob. U-Boot needs to get its device tree from somewhere. This can - be done using one of the two options below: + be done using one of the three options below: CONFIG_OF_EMBED If this variable is defined, U-Boot will embed a device tree @@ -989,6 +989,12 @@ The following options need to be configured: still use the individual files if you need something more exotic. + CONFIG_OF_BOARD + If this variable is defined, U-Boot will use the device tree + provided by the board at runtime instead of embedding one with + the image. Only boards defining board_fdt_blob_setup() support + this option (see include/fdtdec.h file). + - Watchdog: CONFIG_WATCHDOG If this variable is defined, it enables watchdog diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c index 82da9e5a5a..d3c6ba580f 100644 --- a/board/raspberrypi/rpi/rpi.c +++ b/board/raspberrypi/rpi/rpi.c @@ -470,6 +470,16 @@ int board_init(void) return bcm2835_power_on_module(BCM2835_MBOX_POWER_DEVID_USB_HCD); } +/* + * If the firmware passed a device tree use it for U-Boot. + */ +void *board_fdt_blob_setup(void) +{ + if (fdt_magic(fw_dtb_pointer) != FDT_MAGIC) + return NULL; + return (void *)fw_dtb_pointer; +} + int ft_board_setup(void *blob, bd_t *bd) { /* diff --git a/doc/README.fdt-control b/doc/README.fdt-control index c965629905..378b06b108 100644 --- a/doc/README.fdt-control +++ b/doc/README.fdt-control @@ -130,6 +130,10 @@ u-boot-dtb.bin which does the above step for you also. If you are using CONFIG_SPL_FRAMEWORK, then u-boot.img will be built to include the device tree binary. +If CONFIG_OF_BOARD is defined, a board-specific routine will provide the +device tree at runtime, for example if an earlier bootloader stage creates +it and passes it to U-Boot. + If CONFIG_OF_HOSTFILE is defined, then it will be read from a file on startup. This is only useful for sandbox. Use the -d flag to U-Boot to specify the file to read. diff --git a/dts/Kconfig b/dts/Kconfig index 6fe7a5bc08..9a0622154a 100644 --- a/dts/Kconfig +++ b/dts/Kconfig @@ -51,6 +51,14 @@ config OF_EMBED and development only and is not recommended for production devices. Boards in the mainline U-Boot tree should not use it. +config OF_BOARD + bool "Provided by the board at runtime" + depends on !SANDBOX + help + If this option is enabled, the device tree will be provided by + the board at runtime if the board supports it, instead of being + bundled with the image. + config OF_HOSTFILE bool "Host filed DTB for DT control" depends on SANDBOX diff --git a/include/fdtdec.h b/include/fdtdec.h index 2134701c54..b0e5b2767d 100644 --- a/include/fdtdec.h +++ b/include/fdtdec.h @@ -1023,4 +1023,10 @@ int fdtdec_setup_memory_banksize(void); */ int fdtdec_setup(void); +/** + * Board-specific FDT initialization. Returns the address to a device tree blob. + * Called when CONFIG_OF_BOARD is defined. + */ +void *board_fdt_blob_setup(void); + #endif diff --git a/lib/fdtdec.c b/lib/fdtdec.c index 94372cc6cd..c072e54cff 100644 --- a/lib/fdtdec.c +++ b/lib/fdtdec.c @@ -1255,6 +1255,9 @@ int fdtdec_setup(void) /* FDT is at end of image */ gd->fdt_blob = (ulong *)&_end; # endif +# elif defined(CONFIG_OF_BOARD) + /* Allow the board to override the fdt address. */ + gd->fdt_blob = board_fdt_blob_setup(); # elif defined(CONFIG_OF_HOSTFILE) if (sandbox_read_fdt_from_file()) { puts("Failed to read control FDT\n"); |