Commit | Line | Data |
---|---|---|
1da177e4 | 1 | /* |
f30c2269 | 2 | * linux/arch/arm/boot/compressed/head-clps7500.S |
1da177e4 LT |
3 | * |
4 | * Copyright (C) 1999, 2000, 2001 Nexus Electronics Ltd | |
5 | */ | |
6 | ||
1da177e4 LT |
7 | |
8 | /* There are three different ways the kernel can be | |
9 | booted on a 7500 system: from Angel (loaded in RAM), from | |
10 | 16-bit ROM or from 32-bit Flash. Luckily, a single kernel | |
11 | image does for them all. */ | |
12 | /* This branch is taken if the CPU memory width matches the | |
13 | actual device in use. The default at power on is 16 bits | |
14 | so we must be prepared for a mismatch. */ | |
15 | .section ".start", "ax" | |
16 | 2: | |
17 | b 1f | |
18 | .word 0xffff | |
19 | .word 0xb632 @ mov r11, #0x03200000 | |
20 | .word 0xe3a0 | |
21 | .word 0x0000 @ mov r0, #0 | |
22 | .word 0xe3a0 | |
23 | .word 0x0080 @ strb r0, [r11, #0x80] | |
24 | .word 0xe5cb | |
25 | .word 0xf000 @ mov pc, #0 | |
26 | .word 0xe3a0 | |
27 | 1: | |
28 | adr r1, 2b | |
29 | teq r1, #0 | |
30 | bne .Langel | |
31 | /* This is a direct-from-ROM boot. Copy the kernel into | |
32 | RAM and run it there. */ | |
33 | mov r0, #0x30 | |
34 | mcr p15, 0, r0, c1, c0, 0 | |
35 | mov r0, #0x13 | |
36 | msr cpsr_cxsf, r0 | |
37 | mov r12, #0x03000000 @ point to LEDs | |
38 | orr r12, r12, #0x00020000 | |
39 | orr r12, r12, #0xba00 | |
40 | mov r0, #0x5500 | |
41 | str r0, [r12] | |
42 | mov r0, #0x10000000 | |
43 | orr r0, r0, #0x8000 | |
44 | mov r4, r0 | |
45 | ldr r2, =_end | |
46 | 2: | |
47 | ldr r3, [r1], #4 | |
48 | str r3, [r0], #4 | |
49 | teq r0, r2 | |
50 | bne 2b | |
51 | mov r0, #0xff00 | |
52 | str r0, [r12] | |
53 | 1: | |
54 | mov r12, #0x03000000 @ point to LEDs | |
55 | orr r12, r12, #0x00020000 | |
56 | orr r12, r12, #0xba00 | |
57 | mov r0, #0xfe00 | |
58 | str r0, [r12] | |
59 | ||
60 | adr lr, 1f | |
61 | mov r0, #0 | |
62 | mov r1, #14 /* MACH_TYPE_CLPS7500 */ | |
63 | mov pc, lr | |
64 | .Langel: | |
65 | #ifdef CONFIG_ANGELBOOT | |
66 | /* Call Angel to switch into SVC mode. */ | |
67 | mov r0, #0x17 | |
68 | swi 0x123456 | |
69 | #endif | |
70 | /* Ensure all interrupts are off and MMU disabled */ | |
71 | mrs r0, cpsr | |
72 | orr r0, r0, #0xc0 | |
73 | msr cpsr_cxsf, r0 | |
74 | ||
75 | adr lr, 1b | |
76 | orr lr, lr, #0x10000000 | |
77 | mov r0, #0x30 @ MMU off | |
78 | mcr p15, 0, r0, c1, c0, 0 | |
79 | mov r0, r0 | |
80 | mov pc, lr | |
81 | ||
82 | .ltorg | |
83 | ||
84 | 1: | |
85 | /* And the rest */ | |
86 | #include "head.S" |