diff options
Diffstat (limited to 'arch/ppc/boot/simple/misc-mv64x60.c')
-rw-r--r-- | arch/ppc/boot/simple/misc-mv64x60.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/arch/ppc/boot/simple/misc-mv64x60.c b/arch/ppc/boot/simple/misc-mv64x60.c new file mode 100644 index 000000000000..7e88fc6d207d --- /dev/null +++ b/arch/ppc/boot/simple/misc-mv64x60.c | |||
@@ -0,0 +1,61 @@ | |||
1 | /* | ||
2 | * arch/ppc/boot/simple/misc-mv64x60.c | ||
3 | * | ||
4 | * Relocate bridge's register base and call board specific routine. | ||
5 | * | ||
6 | * Author: Mark A. Greer <source@mvista.com> | ||
7 | * | ||
8 | * 2005 (c) MontaVista Software, Inc. This file is licensed under | ||
9 | * the terms of the GNU General Public License version 2. This program | ||
10 | * is licensed "as is" without any warranty of any kind, whether express | ||
11 | * or implied. | ||
12 | */ | ||
13 | |||
14 | #include <linux/config.h> | ||
15 | #include <linux/types.h> | ||
16 | #include <asm/io.h> | ||
17 | #include <asm/mv64x60_defs.h> | ||
18 | |||
19 | extern struct bi_record *decompress_kernel(unsigned long load_addr, | ||
20 | int num_words, unsigned long cksum); | ||
21 | |||
22 | void | ||
23 | mv64x60_move_base(void __iomem *old_base, void __iomem *new_base) | ||
24 | { | ||
25 | u32 bits, mask, b; | ||
26 | |||
27 | if (old_base != new_base) { | ||
28 | #ifdef CONFIG_GT64260 | ||
29 | bits = 12; | ||
30 | mask = 0x07000000; | ||
31 | #else /* Must be mv64[34]60 */ | ||
32 | bits = 16; | ||
33 | mask = 0x03000000; | ||
34 | #endif | ||
35 | b = in_le32(old_base + MV64x60_INTERNAL_SPACE_DECODE); | ||
36 | b &= mask; | ||
37 | b |= ((u32)new_base >> (32 - bits)); | ||
38 | out_le32(old_base + MV64x60_INTERNAL_SPACE_DECODE, b); | ||
39 | |||
40 | __asm__ __volatile__("sync"); | ||
41 | |||
42 | /* Wait for change to happen (in accordance with the manual) */ | ||
43 | while (in_le32(new_base + MV64x60_INTERNAL_SPACE_DECODE) != b); | ||
44 | } | ||
45 | } | ||
46 | |||
47 | void __attribute__ ((weak)) | ||
48 | mv64x60_board_init(void __iomem *old_base, void __iomem *new_base) | ||
49 | { | ||
50 | } | ||
51 | |||
52 | void * | ||
53 | load_kernel(unsigned long load_addr, int num_words, unsigned long cksum, | ||
54 | void *ign1, void *ign2) | ||
55 | { | ||
56 | mv64x60_move_base((void __iomem *)CONFIG_MV64X60_BASE, | ||
57 | (void __iomem *)CONFIG_MV64X60_NEW_BASE); | ||
58 | mv64x60_board_init((void __iomem *)CONFIG_MV64X60_BASE, | ||
59 | (void __iomem *)CONFIG_MV64X60_NEW_BASE); | ||
60 | return decompress_kernel(load_addr, num_words, cksum); | ||
61 | } | ||