spi-topcliff-pch: supports a spi mode setup and bit order setup by IO control
[zen-stable.git] / arch / arm / kernel / relocate_kernel.S
blobd0cdedf4864dc52092355e105f3ba04bba5c5704
1 /*
2  * relocate_kernel.S - put the kernel image in place to boot
3  */
5 #include <asm/kexec.h>
7         .globl relocate_new_kernel
8 relocate_new_kernel:
10         ldr     r0,kexec_indirection_page
11         ldr     r1,kexec_start_address
13         /*
14          * If there is no indirection page (we are doing crashdumps)
15          * skip any relocation.
16          */
17         cmp     r0, #0
18         beq     2f
20 0:      /* top, read another word for the indirection page */
21         ldr     r3, [r0],#4
23         /* Is it a destination page. Put destination address to r4 */
24         tst     r3,#1,0
25         beq     1f
26         bic     r4,r3,#1
27         b       0b
29         /* Is it an indirection page */
30         tst     r3,#2,0
31         beq     1f
32         bic     r0,r3,#2
33         b       0b
36         /* are we done ? */
37         tst     r3,#4,0
38         beq     1f
39         b       2f
42         /* is it source ? */
43         tst     r3,#8,0
44         beq     0b
45         bic r3,r3,#8
46         mov r6,#1024
48         ldr r5,[r3],#4
49         str r5,[r4],#4
50         subs r6,r6,#1
51         bne 9b
52         b 0b
55         /* Jump to relocated kernel */
56         mov lr,r1
57         mov r0,#0
58         ldr r1,kexec_mach_type
59         ldr r2,kexec_boot_atags
60  ARM(   mov pc, lr      )
61  THUMB( bx lr           )
63         .align
65         .globl kexec_start_address
66 kexec_start_address:
67         .long   0x0
69         .globl kexec_indirection_page
70 kexec_indirection_page:
71         .long   0x0
73         .globl kexec_mach_type
74 kexec_mach_type:
75         .long   0x0
77         /* phy addr of the atags for the new kernel */
78         .globl kexec_boot_atags
79 kexec_boot_atags:
80         .long   0x0
82 relocate_new_kernel_end:
84         .globl relocate_new_kernel_size
85 relocate_new_kernel_size:
86         .long relocate_new_kernel_end - relocate_new_kernel