Merge branches 'x86/xen', 'x86/build', 'x86/microcode', 'x86/mm-debug-v2', 'x86/memor...
[linux-2.6] / arch / powerpc / boot / cuboot-warp.c
1 /*
2  * Copyright (c) 2008 PIKA Technologies
3  *   Sean MacLennan <smaclennan@pikatech.com>
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 as published
7  * by the Free Software Foundation.
8  */
9
10 #include "ops.h"
11 #include "4xx.h"
12 #include "cuboot.h"
13 #include "stdio.h"
14
15 #define TARGET_4xx
16 #define TARGET_44x
17 #include "ppcboot.h"
18
19 static bd_t bd;
20
21 static void warp_fixup_one_nor(u32 from, u32 to)
22 {
23         void *devp;
24         char name[50];
25         u32 v[2];
26
27         sprintf(name, "/plb/opb/ebc/nor_flash@0,0/partition@%x", from);
28
29         devp = finddevice(name);
30         if (!devp)
31                 return;
32
33         if (getprop(devp, "reg", v, sizeof(v)) == sizeof(v)) {
34                 v[0] = to;
35                 setprop(devp, "reg", v, sizeof(v));
36
37                 printf("NOR 64M fixup %x -> %x\r\n", from, to);
38         }
39 }
40
41
42 static void warp_fixups(void)
43 {
44         ibm440ep_fixup_clocks(66000000, 11059200, 50000000);
45         ibm4xx_sdram_fixup_memsize();
46         ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
47         dt_fixup_mac_address_by_alias("ethernet0", bd.bi_enetaddr);
48
49         /* Fixup for 64M flash on Rev A boards. */
50         if (bd.bi_flashsize == 0x4000000) {
51                 void *devp;
52                 u32 v[3];
53
54                 devp = finddevice("/plb/opb/ebc/nor_flash@0,0");
55                 if (!devp)
56                         return;
57
58                 /* Fixup the size */
59                 if (getprop(devp, "reg", v, sizeof(v)) == sizeof(v)) {
60                         v[2] = bd.bi_flashsize;
61                         setprop(devp, "reg", v, sizeof(v));
62                 }
63
64                 /* Fixup parition offsets */
65                 warp_fixup_one_nor(0x300000, 0x3f00000);
66                 warp_fixup_one_nor(0x340000, 0x3f40000);
67                 warp_fixup_one_nor(0x380000, 0x3f80000);
68         }
69 }
70
71
72 void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
73                    unsigned long r6, unsigned long r7)
74 {
75         CUBOOT_INIT();
76
77         platform_ops.fixups = warp_fixups;
78         platform_ops.exit = ibm44x_dbcr_reset;
79         fdt_init(_dtb_start);
80         serial_console_init();
81 }