mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-18 21:21:37 +00:00
spl: fit: implement fdt_record_loadable
During the loading of more complex FIT images (e.g. when the invoked next stage needs to find additional firmware for a power-management core... or if there are multiple images for different privilege levels started in parallel), it is helpful to create a record of what images are loaded where: if a FDT is loaded for one of the next stages, it can be used to convey the status and location of loadables. This adds a fdt_record_loadable() function that can be invoked to record the status of each loadable below the /fit-images path. Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
d879616e9e
commit
9f45aeb937
2 changed files with 59 additions and 0 deletions
|
@ -410,6 +410,45 @@ static int fdt_pack_reg(const void *fdt, void *buf, u64 *address, u64 *size,
|
||||||
return p - (char *)buf;
|
return p - (char *)buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int fdt_record_loadable(void *blob, u32 index, const char *name,
|
||||||
|
uintptr_t load_addr, u32 size, uintptr_t entry_point,
|
||||||
|
const char *type, const char *os)
|
||||||
|
{
|
||||||
|
int err, node;
|
||||||
|
|
||||||
|
err = fdt_check_header(blob);
|
||||||
|
if (err < 0) {
|
||||||
|
printf("%s: %s\n", __func__, fdt_strerror(err));
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* find or create "/fit-images" node */
|
||||||
|
node = fdt_find_or_add_subnode(blob, 0, "fit-images");
|
||||||
|
if (node < 0)
|
||||||
|
return node;
|
||||||
|
|
||||||
|
/* find or create "/fit-images/<name>" node */
|
||||||
|
node = fdt_find_or_add_subnode(blob, node, name);
|
||||||
|
if (node < 0)
|
||||||
|
return node;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We record these as 32bit entities, possibly truncating addresses.
|
||||||
|
* However, spl_fit.c is not 64bit safe either: i.e. we should not
|
||||||
|
* have an issue here.
|
||||||
|
*/
|
||||||
|
fdt_setprop_u32(blob, node, "load-addr", load_addr);
|
||||||
|
if (entry_point != -1)
|
||||||
|
fdt_setprop_u32(blob, node, "entry-point", entry_point);
|
||||||
|
fdt_setprop_u32(blob, node, "size", size);
|
||||||
|
if (type)
|
||||||
|
fdt_setprop_string(blob, node, "type", type);
|
||||||
|
if (os)
|
||||||
|
fdt_setprop_string(blob, node, "os", os);
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_NR_DRAM_BANKS
|
#ifdef CONFIG_NR_DRAM_BANKS
|
||||||
#define MEMORY_BANKS_MAX CONFIG_NR_DRAM_BANKS
|
#define MEMORY_BANKS_MAX CONFIG_NR_DRAM_BANKS
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -133,6 +133,26 @@ void fdt_fixup_crypto_node(void *blob, int sec_rev);
|
||||||
static inline void fdt_fixup_crypto_node(void *blob, int sec_rev) {}
|
static inline void fdt_fixup_crypto_node(void *blob, int sec_rev) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_IS_ENABLED(LOAD_FIT)
|
||||||
|
/**
|
||||||
|
* Record information about a processed loadable in /fit-images (creating
|
||||||
|
* /fit-images if necessary).
|
||||||
|
*
|
||||||
|
* @param blob FDT blob to update
|
||||||
|
* @param index index of this loadable
|
||||||
|
* @param name name of the loadable
|
||||||
|
* @param load_addr address the loadable was loaded to
|
||||||
|
* @param size number of bytes loaded
|
||||||
|
* @param entry_point entry point (if specified, otherwise pass -1)
|
||||||
|
* @param type type (if specified, otherwise pass NULL)
|
||||||
|
* @param os os-type (if specified, otherwise pass NULL)
|
||||||
|
* @return 0 if ok, or -1 or -FDT_ERR_... on error
|
||||||
|
*/
|
||||||
|
int fdt_record_loadable(void *blob, u32 index, const char *name,
|
||||||
|
uintptr_t load_addr, u32 size, uintptr_t entry_point,
|
||||||
|
const char *type, const char *os);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_PCI
|
#ifdef CONFIG_PCI
|
||||||
#include <pci.h>
|
#include <pci.h>
|
||||||
int fdt_pci_dma_ranges(void *blob, int phb_off, struct pci_controller *hose);
|
int fdt_pci_dma_ranges(void *blob, int phb_off, struct pci_controller *hose);
|
||||||
|
|
Loading…
Add table
Reference in a new issue