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 e2d6363..e7f8092 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 f2d8744..c3c4669 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