mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-24 04:34:22 +08:00
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>
This commit is contained in:
parent
45a6d231b2
commit
82f766d1d2
8
README
8
README
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
/*
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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");
|
||||
|
Loading…
Reference in New Issue
Block a user