devicetree at runtime, for example if an earlier bootloader stage creates
it and passes it to U-Boot.
+If CONFIG_BLOBLIST is defined, the devicetree may come from a bloblist passed
+from a previous stage, if present.
+
If CONFIG_SANDBOX is defined, then it will be read from a file on
startup. Use the -d flag to U-Boot to specify the file to read, -D for the
default and -T for the test devicetree, used to run sandbox unit tests.
* U-Boot is packaged as an ELF file, e.g. for debugging purposes
* @FDTSRC_ENV: Provided by the fdtcontroladdr environment variable. This should
* be used for debugging/development only
- * @FDTSRC_NONE: No devicetree at all
+ * @FDTSRC_BLOBLIST: Provided by a bloblist from an earlier phase
*/
enum fdt_source_t {
FDTSRC_SEPARATE,
FDTSRC_BOARD,
FDTSRC_EMBED,
FDTSRC_ENV,
+ FDTSRC_BLOBLIST,
};
/*
*
* The existing devicetree is available at gd->fdt_blob
*
- * @err internal error code if we fail to setup a DTB
+ * @err: 0 on success, -EEXIST if the devicetree is already correct, or other
+ * internal error code if we fail to setup a DTB
* @returns new devicetree blob pointer
*/
void *board_fdt_blob_setup(int *err);
*/
#ifndef USE_HOSTCC
+
+#define LOG_CATEGORY LOGC_DT
+
+#include <bloblist.h>
#include <boot_fit.h>
#include <display_options.h>
#include <dm.h>
[FDTSRC_BOARD] = "board",
[FDTSRC_EMBED] = "embed",
[FDTSRC_ENV] = "env",
+ [FDTSRC_BLOBLIST] = "bloblist",
};
const char *fdtdec_get_srcname(void)
int fdtdec_setup(void)
{
- int ret;
+ int ret = -ENOENT;
+
+ /* If allowing a bloblist, check that first */
+ if (CONFIG_IS_ENABLED(BLOBLIST)) {
+ ret = bloblist_maybe_init();
+ if (!ret) {
+ gd->fdt_blob = bloblist_find(BLOBLISTT_CONTROL_FDT, 0);
+ if (gd->fdt_blob) {
+ gd->fdt_src = FDTSRC_BLOBLIST;
+ log_debug("Devicetree is in bloblist at %p\n",
+ gd->fdt_blob);
+ } else {
+ log_debug("No FDT found in bloblist\n");
+ ret = -ENOENT;
+ }
+ }
+ }
- /* The devicetree is typically appended to U-Boot */
- if (IS_ENABLED(CONFIG_OF_SEPARATE)) {
- gd->fdt_blob = fdt_find_separate();
- gd->fdt_src = FDTSRC_SEPARATE;
- } else { /* embed dtb in ELF file for testing / development */
- gd->fdt_blob = dtb_dt_embedded();
- gd->fdt_src = FDTSRC_EMBED;
+ /* Otherwise, the devicetree is typically appended to U-Boot */
+ if (ret) {
+ if (IS_ENABLED(CONFIG_OF_SEPARATE)) {
+ gd->fdt_blob = fdt_find_separate();
+ gd->fdt_src = FDTSRC_SEPARATE;
+ } else { /* embed dtb in ELF file for testing / development */
+ gd->fdt_blob = dtb_dt_embedded();
+ gd->fdt_src = FDTSRC_EMBED;
+ }
}
/* Allow the board to override the fdt address. */
if (IS_ENABLED(CONFIG_OF_BOARD)) {
gd->fdt_blob = board_fdt_blob_setup(&ret);
- if (ret)
+ if (!ret)
+ gd->fdt_src = FDTSRC_BOARD;
+ else if (ret != -EEXIST)
return ret;
- gd->fdt_src = FDTSRC_BOARD;
}
/* Allow the early environment to override the fdt address */