Commit c654b517 authored by Simon Glass's avatar Simon Glass

fdt: Add ft_system_setup() function for system device tree additions

Add an additional function for adding information to the device tree before
booting. This permits additions which are not board-specific.
Signed-off-by: 's avatarSimon Glass <sjg@chromium.org>
Acked-by: 's avatarAnatolij Gustschin <agust@denx.de>
Reviewed-by: 's avatarTom Rini <trini@ti.com>
parent 6f4dbc21
......@@ -669,6 +669,13 @@ The following options need to be configured:
Board code has addition modification that it wants to make
to the flat device tree before handing it off to the kernel
CONFIG_OF_SYSTEM_SETUP
Other code has addition modification that it wants to make
to the flat device tree before handing it off to the kernel.
This causes ft_system_setup() to be called before booting
the kernel.
CONFIG_OF_BOOT_CPU
This define fills in the correct boot CPU in the boot
......@@ -3407,7 +3414,7 @@ FIT uImage format:
to 128 or 256, although it does not have to be power of 2).
default: 4096
CONFIG_MTD_UBI_BEB_LIMIT
This option specifies the maximum bad physical eraseblocks UBI
expects on the MTD device (per 1024 eraseblocks). If the
......
......@@ -575,6 +575,18 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
return CMD_RET_FAILURE;
}
}
#endif
#ifdef CONFIG_OF_SYSTEM_SETUP
/* Call the board-specific fixup routine */
else if (strncmp(argv[1], "sys", 3) == 0) {
int err = ft_system_setup(working_fdt, gd->bd);
if (err) {
printf("Failed to add system information to FDT: %s\n",
fdt_strerror(err));
return CMD_RET_FAILURE;
}
}
#endif
/* Create a chosen node */
else if (strncmp(argv[1], "cho", 3) == 0) {
......@@ -1014,6 +1026,9 @@ static char fdt_help_text[] =
"addr [-c] <addr> [<length>] - Set the [control] fdt location to <addr>\n"
#ifdef CONFIG_OF_BOARD_SETUP
"fdt boardsetup - Do board-specific set up\n"
#endif
#ifdef CONFIG_OF_SYSTEM_SETUP
"fdt systemsetup - Do system-specific set up\n"
#endif
"fdt move <fdt> <newaddr> <length> - Copy the fdt to <addr> and make it active\n"
"fdt resize - Resize fdt to size + padding to 4k addr\n"
......
......@@ -479,6 +479,13 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob,
goto err;
}
}
if (IMAGE_OF_SYSTEM_SETUP) {
if (ft_system_setup(blob, gd->bd)) {
printf("ERROR: system-specific fdt fixup failed: %s\n",
fdt_strerror(fdt_ret));
goto err;
}
}
fdt_fixup_ethernet(blob);
/* Delete the old LMB reservation */
......
......@@ -88,6 +88,18 @@ void ft_board_setup_ex(void *blob, bd_t *bd);
void ft_cpu_setup(void *blob, bd_t *bd);
void ft_pci_setup(void *blob, bd_t *bd);
/**
* Add system-specific data to the FDT before booting the OS.
*
* Use CONFIG_SYS_FDT_PAD to ensure there is sufficient space.
* This function is called if CONFIG_OF_SYSTEM_SETUP is defined
*
* @param blob FDT blob to update
* @param bd_t Pointer to board data
* @return 0 if ok, or -FDT_ERR_... on error
*/
int ft_system_setup(void *blob, bd_t *bd);
void set_working_fdt_addr(void *addr);
int fdt_shrink_to_minimum(void *blob);
int fdt_increase_size(void *fdt, int add_len);
......
......@@ -119,6 +119,12 @@ struct lmb;
# define IMAGE_OF_BOARD_SETUP 0
#endif
#ifdef CONFIG_OF_SYSTEM_SETUP
# define IMAGE_OF_SYSTEM_SETUP 1
#else
# define IMAGE_OF_SYSTEM_SETUP 0
#endif
/*
* Operating System Codes
*/
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment