SPL uses the image header to detect the boot device and to find the
offset of U-Boot proper. Since this information is stored differently in
eGON and TOC0 image headers, add code to find the correct value based on
the image type currently in use.

Signed-off-by: Samuel Holland <sam...@sholland.org>
---
 arch/arm/include/asm/arch-sunxi/spl.h |  2 --
 arch/arm/mach-sunxi/board.c           | 20 ++++++++++++++------
 include/sunxi_image.h                 | 14 ++++++++++++++
 3 files changed, 28 insertions(+), 8 deletions(-)

diff --git a/arch/arm/include/asm/arch-sunxi/spl.h 
b/arch/arm/include/asm/arch-sunxi/spl.h
index 58cdf806d9a..157b11e4897 100644
--- a/arch/arm/include/asm/arch-sunxi/spl.h
+++ b/arch/arm/include/asm/arch-sunxi/spl.h
@@ -19,8 +19,6 @@
 #define SUNXI_BOOTED_FROM_MMC0_HIGH    0x10
 #define SUNXI_BOOTED_FROM_MMC2_HIGH    0x12
 
-#define is_boot0_magic(addr)   (memcmp((void *)(addr), BOOT0_MAGIC, 8) == 0)
-
 uint32_t sunxi_get_boot_device(void);
 
 #endif
diff --git a/arch/arm/mach-sunxi/board.c b/arch/arm/mach-sunxi/board.c
index 9b84132eda6..8147f250f87 100644
--- a/arch/arm/mach-sunxi/board.c
+++ b/arch/arm/mach-sunxi/board.c
@@ -237,10 +237,13 @@ void s_init(void)
 
 static int sunxi_get_boot_source(void)
 {
-       if (!is_boot0_magic(SPL_ADDR + 4)) /* eGON.BT0 */
-               return SUNXI_INVALID_BOOT_SOURCE;
+       if (is_egon_image((void *)SPL_ADDR))
+               return ((struct boot_file_head *)SPL_ADDR)->boot_media;
+       if (is_toc0_image((void *)SPL_ADDR))
+               return ((struct toc0_main_info *)SPL_ADDR)->platform[0];
 
-       return readb(SPL_ADDR + 0x28);
+       /* Not a valid BROM image, so we must have been booted via FEL. */
+       return SUNXI_INVALID_BOOT_SOURCE;
 }
 
 /* The sunxi internal brom will try to loader external bootloader
@@ -285,13 +288,18 @@ uint32_t sunxi_get_boot_device(void)
        return -1;              /* Never reached */
 }
 
+#define is_toc0_magic(foo) true
+
 #ifdef CONFIG_SPL_BUILD
 static u32 sunxi_get_spl_size(void)
 {
-       if (!is_boot0_magic(SPL_ADDR + 4)) /* eGON.BT0 */
-               return 0;
+       if (is_egon_image((void *)SPL_ADDR))
+               return ((struct boot_file_head *)SPL_ADDR)->length;
+       if (is_toc0_image((void *)SPL_ADDR))
+               return ((struct toc0_main_info *)SPL_ADDR)->length;
 
-       return readl(SPL_ADDR + 0x10);
+       /* Unknown size, so fall back to the default offset. */
+       return 0;
 }
 
 /*
diff --git a/include/sunxi_image.h b/include/sunxi_image.h
index bdf80ec0e0a..b0424b6b7f1 100644
--- a/include/sunxi_image.h
+++ b/include/sunxi_image.h
@@ -270,4 +270,18 @@ struct toc0_key_item {
                sizeof(struct toc0_key_item),                             \
        32)
 
+static inline bool is_egon_image(void *addr)
+{
+       struct boot_file_head *head = addr;
+
+       return memcmp(head->magic, BOOT0_MAGIC, 8) == 0;
+}
+
+static inline bool is_toc0_image(void *addr)
+{
+       struct toc0_main_info *main = addr;
+
+       return memcmp(main->name, TOC0_MAIN_INFO_NAME, 8) == 0;
+}
+
 #endif
-- 
2.31.1

Reply via email to