|
@@ -1275,14 +1275,55 @@ int fdtdec_setup(void)
|
|
|
* If so, pick the most relevant
|
|
|
*/
|
|
|
fdt_blob = locate_dtb_in_fit(gd->fdt_blob);
|
|
|
- if (fdt_blob)
|
|
|
+ if (fdt_blob) {
|
|
|
+ gd->multi_dtb_fit = gd->fdt_blob;
|
|
|
gd->fdt_blob = fdt_blob;
|
|
|
+ }
|
|
|
+
|
|
|
# endif
|
|
|
#endif
|
|
|
|
|
|
return fdtdec_prepare_fdt();
|
|
|
}
|
|
|
|
|
|
+#if CONFIG_IS_ENABLED(MULTI_DTB_FIT)
|
|
|
+int fdtdec_resetup(int *rescan)
|
|
|
+{
|
|
|
+ void *fdt_blob;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If the current DTB is part of a compressed FIT image,
|
|
|
+ * try to locate the best match from the uncompressed
|
|
|
+ * FIT image stillpresent there. Save the time and space
|
|
|
+ * required to uncompress it again.
|
|
|
+ */
|
|
|
+ if (gd->multi_dtb_fit) {
|
|
|
+ fdt_blob = locate_dtb_in_fit(gd->multi_dtb_fit);
|
|
|
+
|
|
|
+ if (fdt_blob == gd->fdt_blob) {
|
|
|
+ /*
|
|
|
+ * The best match did not change. no need to tear down
|
|
|
+ * the DM and rescan the fdt.
|
|
|
+ */
|
|
|
+ *rescan = 0;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ *rescan = 1;
|
|
|
+ gd->fdt_blob = fdt_blob;
|
|
|
+ return fdtdec_prepare_fdt();
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If multi_dtb_fit is NULL, it means that blob appended to u-boot is
|
|
|
+ * not a FIT image containings DTB, but a single DTB. There is no need
|
|
|
+ * to teard down DM and rescan the DT in this case.
|
|
|
+ */
|
|
|
+ *rescan = 0;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
#ifdef CONFIG_NR_DRAM_BANKS
|
|
|
int fdtdec_decode_ram_size(const void *blob, const char *area, int board_id,
|
|
|
phys_addr_t *basep, phys_size_t *sizep, bd_t *bd)
|