Merge git://git.denx.de/u-boot-fsl-qoriq
[oweals/u-boot.git] / board / freescale / common / fsl_chain_of_trust.c
index 290536db154d3539dcf947e9bcdbaa4273e44ecd..dea231b866fe73b1d74b7d5f0bd2bb4c7201e6a6 100644 (file)
 #include <fsl_sfp.h>
 #include <dm/root.h>
 
+#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_FRAMEWORK)
+#include <spl.h>
+#endif
+
 #ifdef CONFIG_ADDR_MAP
 #include <asm/mmu.h>
 #endif
@@ -115,7 +119,7 @@ void spl_validate_uboot(uint32_t hdr_addr, uintptr_t img_addr)
  * do not use common SPL framework, so need to call this function here.
  */
 #if defined(CONFIG_SPL_DM) && (!defined(CONFIG_SPL_FRAMEWORK))
-       dm_init_and_scan(false);
+       dm_init_and_scan(true);
 #endif
        res = fsl_secboot_validate(hdr_addr, CONFIG_SPL_UBOOT_KEY_HASH,
                                   &img_addr);
@@ -123,4 +127,32 @@ void spl_validate_uboot(uint32_t hdr_addr, uintptr_t img_addr)
        if (res == 0)
                printf("SPL: Validation of U-boot successful\n");
 }
+
+#ifdef CONFIG_SPL_FRAMEWORK
+/* Override weak funtion defined in SPL framework to enable validation
+ * of main u-boot image before jumping to u-boot image.
+ */
+void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
+{
+       typedef void __noreturn (*image_entry_noargs_t)(void);
+       uint32_t hdr_addr;
+
+       image_entry_noargs_t image_entry =
+               (image_entry_noargs_t)(unsigned long)spl_image->entry_point;
+
+       hdr_addr = (spl_image->entry_point + spl_image->size -
+                       CONFIG_U_BOOT_HDR_SIZE);
+       spl_validate_uboot(hdr_addr, (uintptr_t)spl_image->entry_point);
+       /*
+        * In case of failure in validation, spl_validate_uboot would
+        * not return back in case of Production environment with ITS=1.
+        * Thus U-Boot will not start.
+        * In Development environment (ITS=0 and SB_EN=1), the function
+        * may return back in case of non-fatal failures.
+        */
+
+       debug("image entry point: 0x%X\n", spl_image->entry_point);
+       image_entry();
+}
+#endif /* ifdef CONFIG_SPL_FRAMEWORK */
 #endif /* ifdef CONFIG_SPL_BUILD */