spl: fit: implement fdt_record_loadable
authorPhilipp Tomsich <philipp.tomsich@theobroma-systems.com>
Wed, 13 Sep 2017 19:29:33 +0000 (21:29 +0200)
committerPhilipp Tomsich <philipp.tomsich@theobroma-systems.com>
Sat, 25 Nov 2017 23:39:07 +0000 (00:39 +0100)
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>
common/fdt_support.c
include/fdt_support.h

index f4f9543..6896dcb 100644 (file)
@@ -410,6 +410,45 @@ static int fdt_pack_reg(const void *fdt, void *buf, u64 *address, u64 *size,
        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
 #define MEMORY_BANKS_MAX CONFIG_NR_DRAM_BANKS
 #else
index 2bca4d7..afaf0e7 100644 (file)
@@ -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) {}
 #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
 #include <pci.h>
 int fdt_pci_dma_ranges(void *blob, int phb_off, struct pci_controller *hose);