ARM: shmobile: Update romImage to relocate appended DTB
authorMagnus Damm <damm@opensource.se>
Wed, 26 Jun 2013 23:48:07 +0000 (08:48 +0900)
committerSimon Horman <horms+renesas@verge.net.au>
Wed, 17 Jul 2013 01:04:36 +0000 (10:04 +0900)
Instead of relying of MACH_TYPE for board identification,
update the romImage code to relocate an appended DTB to
the beginning of RAM. This implementation is independent
of ARM_APPENDED_DTB, this because it is necessary to copy
the DTB to memory so the kernel can access it.

Without this patch Mackerel does not boot via the Mask ROM
over USB (r_usb_boot) - this since non-DT boot was broken
ages ago in commit:

0ce53cd ARM: mach-shmobile: Use DT_MACHINE for mackerel

Signed-off-by: Magnus Damm <damm@opensource.se>
Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
arch/arm/boot/compressed/head-shmobile.S
arch/arm/mach-shmobile/include/mach/zboot.h

index e2d636336b7c783634747a6433e57eebc56b6d6c..e7f80928949c8da53a13b2bca5ace2928c1ba4c2 100644 (file)
@@ -55,12 +55,47 @@ __tmp_stack:
 __continue:
 #endif /* CONFIG_ZBOOT_ROM_MMC || CONFIG_ZBOOT_ROM_SH_MOBILE_SDHI */
 
-       /* Set board ID necessary for boot */
-       ldr     r7, 1f                          @ Set machine type register
-       mov     r8, #0                          @ pass null pointer as atag
+       adr     r0, dtb_info
+       ldmia   r0, {r1, r3, r4, r5, r7}
+
+       sub     r0, r0, r1              @ calculate the delta offset
+       add     r5, r5, r0              @ _edata
+
+       ldr     lr, [r5, #0]            @ check if valid DTB is present
+       cmp     lr, r3
+       bne     0f
+
+       add     r9, r7, #31             @ rounded up to a multiple
+       bic     r9, r9, #31             @ ... of 32 bytes
+
+       add     r6, r9, r5              @ copy from _edata
+       add     r9, r9, r4              @ to MEMORY_START
+
+1:     ldmdb   r6!, {r0 - r3, r10 - r12, lr}
+       cmp     r6, r5
+       stmdb   r9!, {r0 - r3, r10 - r12, lr}
+       bhi     1b
+
+       /* Success: Zero board ID, pointer to start of memory for atag/dtb */
+       mov     r7, #0
+       mov     r8, r4
        b       2f
 
-1 :    .long MACH_TYPE
+       .align  2
+dtb_info:
+       .word   dtb_info
+#ifndef __ARMEB__
+       .word   0xedfe0dd0              @ sig is 0xd00dfeed big endian
+#else
+       .word   0xd00dfeed
+#endif
+       .word   MEMORY_START
+       .word   _edata
+       .word   0x4000                  @ maximum DTB size
+0:
+       /* Failure: Zero board ID, NULL atag/dtb */
+       mov     r7, #0
+       mov     r8, #0                  @ pass null pointer as atag
 2 :
 
 #endif /* CONFIG_ZBOOT_ROM */
index f2d8744c1f141704da024977da73180321747967..c3c4669a2d722d386e71be713a5a43040e1ca449 100644 (file)
@@ -1,7 +1,6 @@
 #ifndef ZBOOT_H
 #define ZBOOT_H
 
-#include <asm/mach-types.h>
 #include <mach/zboot_macros.h>
 
 /**************************************************
@@ -11,7 +10,6 @@
  **************************************************/
 
 #ifdef CONFIG_MACH_MACKEREL
-#define MACH_TYPE      MACH_TYPE_MACKEREL
 #define MEMORY_START   0x40000000
 #include "mach/head-mackerel.txt"
 #else