bootm: introduce bootm_load_devicetree helper
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
76ccd96f4a
commit
a1aca01d62
|
@ -123,6 +123,67 @@ int bootm_load_initrd(struct image_data *data, unsigned long load_address)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* bootm_load_devicetree() - load devicetree
|
||||||
|
*
|
||||||
|
* @data: image data context
|
||||||
|
* @load_address: The address where the devicetree should be loaded to
|
||||||
|
*
|
||||||
|
* This loads the devicetree to a RAM location. load_address must be a valid
|
||||||
|
* address. The resulting devicetree will be found at data->oftree.
|
||||||
|
*
|
||||||
|
* Return: 0 on success, negative error code otherwise
|
||||||
|
*/
|
||||||
|
int bootm_load_devicetree(struct image_data *data, unsigned long load_address)
|
||||||
|
{
|
||||||
|
int fdt_size;
|
||||||
|
struct fdt_header *oftree;
|
||||||
|
|
||||||
|
if (data->oftree)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!IS_ENABLED(CONFIG_OFTREE))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!data->of_root_node)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (data->initrd_res) {
|
||||||
|
of_add_initrd(data->of_root_node, data->initrd_res->start,
|
||||||
|
data->initrd_res->end);
|
||||||
|
of_add_reserve_entry(data->initrd_res->start, data->initrd_res->end);
|
||||||
|
}
|
||||||
|
|
||||||
|
oftree = of_get_fixed_tree(data->of_root_node);
|
||||||
|
if (!oftree)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
fdt_size = be32_to_cpu(oftree->totalsize);
|
||||||
|
|
||||||
|
data->oftree_res = request_sdram_region("oftree", load_address,
|
||||||
|
fdt_size);
|
||||||
|
if (!data->oftree_res) {
|
||||||
|
free(oftree);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy((void *)data->oftree_res->start, oftree, fdt_size);
|
||||||
|
|
||||||
|
free(oftree);
|
||||||
|
|
||||||
|
oftree = (void *)data->oftree_res->start;
|
||||||
|
|
||||||
|
fdt_add_reserve_map(oftree);
|
||||||
|
|
||||||
|
of_print_cmdline(data->of_root_node);
|
||||||
|
if (bootm_verbose(data) > 1)
|
||||||
|
of_print_nodes(data->of_root_node, 0);
|
||||||
|
|
||||||
|
data->oftree = oftree;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int bootm_open_os_uimage(struct image_data *data)
|
static int bootm_open_os_uimage(struct image_data *data)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -412,6 +473,8 @@ err_out:
|
||||||
release_sdram_region(data->os_res);
|
release_sdram_region(data->os_res);
|
||||||
if (data->initrd_res)
|
if (data->initrd_res)
|
||||||
release_sdram_region(data->initrd_res);
|
release_sdram_region(data->initrd_res);
|
||||||
|
if (data->oftree_res)
|
||||||
|
release_sdram_region(data->oftree_res);
|
||||||
if (data->initrd && data->initrd != data->os)
|
if (data->initrd && data->initrd != data->os)
|
||||||
uimage_close(data->initrd);
|
uimage_close(data->initrd);
|
||||||
if (data->os)
|
if (data->os)
|
||||||
|
|
|
@ -61,6 +61,7 @@ struct image_data {
|
||||||
|
|
||||||
struct device_node *of_root_node;
|
struct device_node *of_root_node;
|
||||||
struct fdt_header *oftree;
|
struct fdt_header *oftree;
|
||||||
|
struct resource *oftree_res;
|
||||||
|
|
||||||
int verify;
|
int verify;
|
||||||
int verbose;
|
int verbose;
|
||||||
|
@ -110,6 +111,7 @@ static inline int linux_bootargs_overwrite(const char *bootargs)
|
||||||
|
|
||||||
int bootm_load_os(struct image_data *data, unsigned long load_address);
|
int bootm_load_os(struct image_data *data, unsigned long load_address);
|
||||||
int bootm_load_initrd(struct image_data *data, unsigned long load_address);
|
int bootm_load_initrd(struct image_data *data, unsigned long load_address);
|
||||||
|
int bootm_load_devicetree(struct image_data *data, unsigned long load_address);
|
||||||
|
|
||||||
#define UIMAGE_SOME_ADDRESS (UIMAGE_INVALID_ADDRESS - 1)
|
#define UIMAGE_SOME_ADDRESS (UIMAGE_INVALID_ADDRESS - 1)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue