1 /*
2 * SH-X3 Prototype Setup
3 *
4 * Copyright (C) 2007 - 2010 Paul Mundt
5 *
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file "COPYING" in the main directory of this archive
8 * for more details.
9 */
10 #include <linux/platform_device.h>
11 #include <linux/init.h>
12 #include <linux/serial.h>
13 #include <linux/serial_sci.h>
14 #include <linux/io.h>
15 #include <linux/gpio.h>
16 #include <linux/sh_timer.h>
17 #include <linux/sh_intc.h>
18 #include <cpu/shx3.h>
19 #include <asm/mmzone.h>
20
21 /*
22 * This intentionally only registers SCIF ports 0, 1, and 3. SCIF 2
23 * INTEVT values overlap with the FPU EXPEVT ones, requiring special
24 * demuxing in the exception dispatch path.
25 *
26 * As this overlap is something that never should have made it in to
27 * silicon in the first place, we just refuse to deal with the port at
28 * all rather than adding infrastructure to hack around it.
29 */
30 static struct plat_sci_port scif0_platform_data = {
31 .mapbase = 0xffc30000,
32 .flags = UPF_BOOT_AUTOCONF,
33 .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
34 .scbrr_algo_id = SCBRR_ALGO_2,
35 .type = PORT_SCIF,
36 .irqs = { evt2irq(0x700),
37 evt2irq(0x720),
38 evt2irq(0x760),
39 evt2irq(0x740) },
40 };
41
42 static struct platform_device scif0_device = {
43 .name = "sh-sci",
44 .id = 0,
45 .dev = {
46 .platform_data = &scif0_platform_data,
47 },
48 };
49
50 static struct plat_sci_port scif1_platform_data = {
51 .mapbase = 0xffc40000,
52 .flags = UPF_BOOT_AUTOCONF,
53 .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
54 .scbrr_algo_id = SCBRR_ALGO_2,
55 .type = PORT_SCIF,
56 .irqs = { evt2irq(0x780),
57 evt2irq(0x7a0),
58 evt2irq(0x7e0),
59 evt2irq(0x7c0) },
60 };
61
62 static struct platform_device scif1_device = {
63 .name = "sh-sci",
64 .id = 1,
65 .dev = {
66 .platform_data = &scif1_platform_data,
67 },
68 };
69
70 static struct plat_sci_port scif2_platform_data = {
71 .mapbase = 0xffc60000,
72 .flags = UPF_BOOT_AUTOCONF,
73 .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
74 .scbrr_algo_id = SCBRR_ALGO_2,
75 .type = PORT_SCIF,
76 .irqs = { evt2irq(0x880),
77 evt2irq(0x8a0),
78 evt2irq(0x8e0),
79 evt2irq(0x8c0) },
80 };
81
82 static struct platform_device scif2_device = {
83 .name = "sh-sci",
84 .id = 2,
85 .dev = {
86 .platform_data = &scif2_platform_data,
87 },
88 };
89
90 static struct sh_timer_config tmu0_platform_data = {
91 .channel_offset = 0x04,
92 .timer_bit = 0,
93 .clockevent_rating = 200,
94 };
95
96 static struct resource tmu0_resources[] = {
97 [0] = {
98 .start = 0xffc10008,
99 .end = 0xffc10013,
100 .flags = IORESOURCE_MEM,
101 },
102 [1] = {
103 .start = evt2irq(0x400),
104 .flags = IORESOURCE_IRQ,
105 },
106 };
107
108 static struct platform_device tmu0_device = {
109 .name = "sh_tmu",
110 .id = 0,
111 .dev = {
112 .platform_data = &tmu0_platform_data,
113 },
114 .resource = tmu0_resources,
115 .num_resources = ARRAY_SIZE(tmu0_resources),
116 };
117
118 static struct sh_timer_config tmu1_platform_data = {
119 .channel_offset = 0x10,
120 .timer_bit = 1,
121 .clocksource_rating = 200,
122 };
123
124 static struct resource tmu1_resources[] = {
125 [0] = {
126 .start = 0xffc10014,
127 .end = 0xffc1001f,
128 .flags = IORESOURCE_MEM,
129 },
130 [1] = {
131 .start = evt2irq(0x420),
132 .flags = IORESOURCE_IRQ,
133 },
134 };
135
136 static struct platform_device tmu1_device = {
137 .name = "sh_tmu",
138 .id = 1,
139 .dev = {
140 .platform_data = &tmu1_platform_data,
141 },
142 .resource = tmu1_resources,
143 .num_resources = ARRAY_SIZE(tmu1_resources),
144 };
145
146 static struct sh_timer_config tmu2_platform_data = {
147 .channel_offset = 0x1c,
148 .timer_bit = 2,
149 };
150
151 static struct resource tmu2_resources[] = {
152 [0] = {
153 .start = 0xffc10020,
154 .end = 0xffc1002f,
155 .flags = IORESOURCE_MEM,
156 },
157 [1] = {
158 .start = evt2irq(0x440),
159 .flags = IORESOURCE_IRQ,
160 },
161 };
162
163 static struct platform_device tmu2_device = {
164 .name = "sh_tmu",
165 .id = 2,
166 .dev = {
167 .platform_data = &tmu2_platform_data,
168 },
169 .resource = tmu2_resources,
170 .num_resources = ARRAY_SIZE(tmu2_resources),
171 };
172
173 static struct sh_timer_config tmu3_platform_data = {
174 .channel_offset = 0x04,
175 .timer_bit = 0,
176 };
177
178 static struct resource tmu3_resources[] = {
179 [0] = {
180 .start = 0xffc20008,
181 .end = 0xffc20013,
182 .flags = IORESOURCE_MEM,
183 },
184 [1] = {
185 .start = evt2irq(0x460),
186 .flags = IORESOURCE_IRQ,
187 },
188 };
189
190 static struct platform_device tmu3_device = {
191 .name = "sh_tmu",
192 .id = 3,
193 .dev = {
194 .platform_data = &tmu3_platform_data,
195 },
196 .resource = tmu3_resources,
197 .num_resources = ARRAY_SIZE(tmu3_resources),
198 };
199
200 static struct sh_timer_config tmu4_platform_data = {
201 .channel_offset = 0x10,
202 .timer_bit = 1,
203 };
204
205 static struct resource tmu4_resources[] = {
206 [0] = {
207 .start = 0xffc20014,
208 .end = 0xffc2001f,
209 .flags = IORESOURCE_MEM,
210 },
211 [1] = {
212 .start = evt2irq(0x480),
213 .flags = IORESOURCE_IRQ,
214 },
215 };
216
217 static struct platform_device tmu4_device = {
218 .name = "sh_tmu",
219 .id = 4,
220 .dev = {
221 .platform_data = &tmu4_platform_data,
222 },
223 .resource = tmu4_resources,
224 .num_resources = ARRAY_SIZE(tmu4_resources),
225 };
226
227 static struct sh_timer_config tmu5_platform_data = {
228 .channel_offset = 0x1c,
229 .timer_bit = 2,
230 };
231
232 static struct resource tmu5_resources[] = {
233 [0] = {
234 .start = 0xffc20020,
235 .end = 0xffc2002b,
236 .flags = IORESOURCE_MEM,
237 },
238 [1] = {
239 .start = evt2irq(0x4a0),
240 .flags = IORESOURCE_IRQ,
241 },
242 };
243
244 static struct platform_device tmu5_device = {
245 .name = "sh_tmu",
246 .id = 5,
247 .dev = {
248 .platform_data = &tmu5_platform_data,
249 },
250 .resource = tmu5_resources,
251 .num_resources = ARRAY_SIZE(tmu5_resources),
252 };
253
254 static struct platform_device *shx3_early_devices[] __initdata = {
255 &scif0_device,
256 &scif1_device,
257 &scif2_device,
258 &tmu0_device,
259 &tmu1_device,
260 &tmu2_device,
261 &tmu3_device,
262 &tmu4_device,
263 &tmu5_device,
264 };
265
shx3_devices_setup(void)266 static int __init shx3_devices_setup(void)
267 {
268 return platform_add_devices(shx3_early_devices,
269 ARRAY_SIZE(shx3_early_devices));
270 }
271 arch_initcall(shx3_devices_setup);
272
plat_early_device_setup(void)273 void __init plat_early_device_setup(void)
274 {
275 early_platform_add_devices(shx3_early_devices,
276 ARRAY_SIZE(shx3_early_devices));
277 }
278
279 enum {
280 UNUSED = 0,
281
282 /* interrupt sources */
283 IRL_LLLL, IRL_LLLH, IRL_LLHL, IRL_LLHH,
284 IRL_LHLL, IRL_LHLH, IRL_LHHL, IRL_LHHH,
285 IRL_HLLL, IRL_HLLH, IRL_HLHL, IRL_HLHH,
286 IRL_HHLL, IRL_HHLH, IRL_HHHL,
287 IRQ0, IRQ1, IRQ2, IRQ3,
288 HUDII,
289 TMU0, TMU1, TMU2, TMU3, TMU4, TMU5,
290 PCII0, PCII1, PCII2, PCII3, PCII4,
291 PCII5, PCII6, PCII7, PCII8, PCII9,
292 SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI,
293 SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI,
294 SCIF2_ERI, SCIF2_RXI, SCIF2_BRI, SCIF2_TXI,
295 SCIF3_ERI, SCIF3_RXI, SCIF3_BRI, SCIF3_TXI,
296 DMAC0_DMINT0, DMAC0_DMINT1, DMAC0_DMINT2, DMAC0_DMINT3,
297 DMAC0_DMINT4, DMAC0_DMINT5, DMAC0_DMAE,
298 DU,
299 DMAC1_DMINT6, DMAC1_DMINT7, DMAC1_DMINT8, DMAC1_DMINT9,
300 DMAC1_DMINT10, DMAC1_DMINT11, DMAC1_DMAE,
301 IIC, VIN0, VIN1, VCORE0, ATAPI,
302 DTU0, DTU1, DTU2, DTU3,
303 FE0, FE1,
304 GPIO0, GPIO1, GPIO2, GPIO3,
305 PAM, IRM,
306 INTICI0, INTICI1, INTICI2, INTICI3,
307 INTICI4, INTICI5, INTICI6, INTICI7,
308
309 /* interrupt groups */
310 IRL, PCII56789, SCIF0, SCIF1, SCIF2, SCIF3,
311 DMAC0, DMAC1,
312 };
313
314 static struct intc_vect vectors[] __initdata = {
315 INTC_VECT(HUDII, 0x3e0),
316 INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420),
317 INTC_VECT(TMU2, 0x440), INTC_VECT(TMU3, 0x460),
318 INTC_VECT(TMU4, 0x480), INTC_VECT(TMU5, 0x4a0),
319 INTC_VECT(PCII0, 0x500), INTC_VECT(PCII1, 0x520),
320 INTC_VECT(PCII2, 0x540), INTC_VECT(PCII3, 0x560),
321 INTC_VECT(PCII4, 0x580), INTC_VECT(PCII5, 0x5a0),
322 INTC_VECT(PCII6, 0x5c0), INTC_VECT(PCII7, 0x5e0),
323 INTC_VECT(PCII8, 0x600), INTC_VECT(PCII9, 0x620),
324 INTC_VECT(SCIF0_ERI, 0x700), INTC_VECT(SCIF0_RXI, 0x720),
325 INTC_VECT(SCIF0_BRI, 0x740), INTC_VECT(SCIF0_TXI, 0x760),
326 INTC_VECT(SCIF1_ERI, 0x780), INTC_VECT(SCIF1_RXI, 0x7a0),
327 INTC_VECT(SCIF1_BRI, 0x7c0), INTC_VECT(SCIF1_TXI, 0x7e0),
328 INTC_VECT(SCIF3_ERI, 0x880), INTC_VECT(SCIF3_RXI, 0x8a0),
329 INTC_VECT(SCIF3_BRI, 0x8c0), INTC_VECT(SCIF3_TXI, 0x8e0),
330 INTC_VECT(DMAC0_DMINT0, 0x900), INTC_VECT(DMAC0_DMINT1, 0x920),
331 INTC_VECT(DMAC0_DMINT2, 0x940), INTC_VECT(DMAC0_DMINT3, 0x960),
332 INTC_VECT(DMAC0_DMINT4, 0x980), INTC_VECT(DMAC0_DMINT5, 0x9a0),
333 INTC_VECT(DMAC0_DMAE, 0x9c0),
334 INTC_VECT(DU, 0x9e0),
335 INTC_VECT(DMAC1_DMINT6, 0xa00), INTC_VECT(DMAC1_DMINT7, 0xa20),
336 INTC_VECT(DMAC1_DMINT8, 0xa40), INTC_VECT(DMAC1_DMINT9, 0xa60),
337 INTC_VECT(DMAC1_DMINT10, 0xa80), INTC_VECT(DMAC1_DMINT11, 0xaa0),
338 INTC_VECT(DMAC1_DMAE, 0xac0),
339 INTC_VECT(IIC, 0xae0),
340 INTC_VECT(VIN0, 0xb00), INTC_VECT(VIN1, 0xb20),
341 INTC_VECT(VCORE0, 0xb00), INTC_VECT(ATAPI, 0xb60),
342 INTC_VECT(DTU0, 0xc00), INTC_VECT(DTU0, 0xc20),
343 INTC_VECT(DTU0, 0xc40),
344 INTC_VECT(DTU1, 0xc60), INTC_VECT(DTU1, 0xc80),
345 INTC_VECT(DTU1, 0xca0),
346 INTC_VECT(DTU2, 0xcc0), INTC_VECT(DTU2, 0xce0),
347 INTC_VECT(DTU2, 0xd00),
348 INTC_VECT(DTU3, 0xd20), INTC_VECT(DTU3, 0xd40),
349 INTC_VECT(DTU3, 0xd60),
350 INTC_VECT(FE0, 0xe00), INTC_VECT(FE1, 0xe20),
351 INTC_VECT(GPIO0, 0xe40), INTC_VECT(GPIO1, 0xe60),
352 INTC_VECT(GPIO2, 0xe80), INTC_VECT(GPIO3, 0xea0),
353 INTC_VECT(PAM, 0xec0), INTC_VECT(IRM, 0xee0),
354 INTC_VECT(INTICI0, 0xf00), INTC_VECT(INTICI1, 0xf20),
355 INTC_VECT(INTICI2, 0xf40), INTC_VECT(INTICI3, 0xf60),
356 INTC_VECT(INTICI4, 0xf80), INTC_VECT(INTICI5, 0xfa0),
357 INTC_VECT(INTICI6, 0xfc0), INTC_VECT(INTICI7, 0xfe0),
358 };
359
360 static struct intc_group groups[] __initdata = {
361 INTC_GROUP(IRL, IRL_LLLL, IRL_LLLH, IRL_LLHL, IRL_LLHH,
362 IRL_LHLL, IRL_LHLH, IRL_LHHL, IRL_LHHH,
363 IRL_HLLL, IRL_HLLH, IRL_HLHL, IRL_HLHH,
364 IRL_HHLL, IRL_HHLH, IRL_HHHL),
365 INTC_GROUP(PCII56789, PCII5, PCII6, PCII7, PCII8, PCII9),
366 INTC_GROUP(SCIF0, SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI),
367 INTC_GROUP(SCIF1, SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI),
368 INTC_GROUP(SCIF3, SCIF3_ERI, SCIF3_RXI, SCIF3_BRI, SCIF3_TXI),
369 INTC_GROUP(DMAC0, DMAC0_DMINT0, DMAC0_DMINT1, DMAC0_DMINT2,
370 DMAC0_DMINT3, DMAC0_DMINT4, DMAC0_DMINT5, DMAC0_DMAE),
371 INTC_GROUP(DMAC1, DMAC1_DMINT6, DMAC1_DMINT7, DMAC1_DMINT8,
372 DMAC1_DMINT9, DMAC1_DMINT10, DMAC1_DMINT11),
373 };
374
375 #define INT2DISTCR0 0xfe4108a0
376 #define INT2DISTCR1 0xfe4108a4
377 #define INT2DISTCR2 0xfe4108a8
378
379 static struct intc_mask_reg mask_registers[] __initdata = {
380 { 0xfe410030, 0xfe410050, 32, /* CnINTMSK0 / CnINTMSKCLR0 */
381 { IRQ0, IRQ1, IRQ2, IRQ3 } },
382 { 0xfe410040, 0xfe410060, 32, /* CnINTMSK1 / CnINTMSKCLR1 */
383 { IRL } },
384 { 0xfe410820, 0xfe410850, 32, /* CnINT2MSK0 / CnINT2MSKCLR0 */
385 { FE1, FE0, 0, ATAPI, VCORE0, VIN1, VIN0, IIC,
386 DU, GPIO3, GPIO2, GPIO1, GPIO0, PAM, 0, 0,
387 0, 0, 0, 0, 0, 0, 0, 0, /* HUDI bits ignored */
388 0, TMU5, TMU4, TMU3, TMU2, TMU1, TMU0, 0, },
389 INTC_SMP_BALANCING(INT2DISTCR0) },
390 { 0xfe410830, 0xfe410860, 32, /* CnINT2MSK1 / CnINT2MSKCLR1 */
391 { 0, 0, 0, 0, DTU3, DTU2, DTU1, DTU0, /* IRM bits ignored */
392 PCII9, PCII8, PCII7, PCII6, PCII5, PCII4, PCII3, PCII2,
393 PCII1, PCII0, DMAC1_DMAE, DMAC1_DMINT11,
394 DMAC1_DMINT10, DMAC1_DMINT9, DMAC1_DMINT8, DMAC1_DMINT7,
395 DMAC1_DMINT6, DMAC0_DMAE, DMAC0_DMINT5, DMAC0_DMINT4,
396 DMAC0_DMINT3, DMAC0_DMINT2, DMAC0_DMINT1, DMAC0_DMINT0 },
397 INTC_SMP_BALANCING(INT2DISTCR1) },
398 { 0xfe410840, 0xfe410870, 32, /* CnINT2MSK2 / CnINT2MSKCLR2 */
399 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
400 SCIF3_TXI, SCIF3_BRI, SCIF3_RXI, SCIF3_ERI,
401 SCIF2_TXI, SCIF2_BRI, SCIF2_RXI, SCIF2_ERI,
402 SCIF1_TXI, SCIF1_BRI, SCIF1_RXI, SCIF1_ERI,
403 SCIF0_TXI, SCIF0_BRI, SCIF0_RXI, SCIF0_ERI },
404 INTC_SMP_BALANCING(INT2DISTCR2) },
405 };
406
407 static struct intc_prio_reg prio_registers[] __initdata = {
408 { 0xfe410010, 0, 32, 4, /* INTPRI */ { IRQ0, IRQ1, IRQ2, IRQ3 } },
409
410 { 0xfe410800, 0, 32, 4, /* INT2PRI0 */ { 0, HUDII, TMU5, TMU4,
411 TMU3, TMU2, TMU1, TMU0 } },
412 { 0xfe410804, 0, 32, 4, /* INT2PRI1 */ { DTU3, DTU2, DTU1, DTU0,
413 SCIF3, SCIF2,
414 SCIF1, SCIF0 } },
415 { 0xfe410808, 0, 32, 4, /* INT2PRI2 */ { DMAC1, DMAC0,
416 PCII56789, PCII4,
417 PCII3, PCII2,
418 PCII1, PCII0 } },
419 { 0xfe41080c, 0, 32, 4, /* INT2PRI3 */ { FE1, FE0, ATAPI, VCORE0,
420 VIN1, VIN0, IIC, DU} },
421 { 0xfe410810, 0, 32, 4, /* INT2PRI4 */ { 0, 0, PAM, GPIO3,
422 GPIO2, GPIO1, GPIO0, IRM } },
423 { 0xfe410090, 0xfe4100a0, 32, 4, /* CnICIPRI / CnICIPRICLR */
424 { INTICI7, INTICI6, INTICI5, INTICI4,
425 INTICI3, INTICI2, INTICI1, INTICI0 }, INTC_SMP(4, 4) },
426 };
427
428 static DECLARE_INTC_DESC(intc_desc, "shx3", vectors, groups,
429 mask_registers, prio_registers, NULL);
430
431 /* Support for external interrupt pins in IRQ mode */
432 static struct intc_vect vectors_irq[] __initdata = {
433 INTC_VECT(IRQ0, 0x240), INTC_VECT(IRQ1, 0x280),
434 INTC_VECT(IRQ2, 0x2c0), INTC_VECT(IRQ3, 0x300),
435 };
436
437 static struct intc_sense_reg sense_registers[] __initdata = {
438 { 0xfe41001c, 32, 2, /* ICR1 */ { IRQ0, IRQ1, IRQ2, IRQ3 } },
439 };
440
441 static DECLARE_INTC_DESC(intc_desc_irq, "shx3-irq", vectors_irq, groups,
442 mask_registers, prio_registers, sense_registers);
443
444 /* External interrupt pins in IRL mode */
445 static struct intc_vect vectors_irl[] __initdata = {
446 INTC_VECT(IRL_LLLL, 0x200), INTC_VECT(IRL_LLLH, 0x220),
447 INTC_VECT(IRL_LLHL, 0x240), INTC_VECT(IRL_LLHH, 0x260),
448 INTC_VECT(IRL_LHLL, 0x280), INTC_VECT(IRL_LHLH, 0x2a0),
449 INTC_VECT(IRL_LHHL, 0x2c0), INTC_VECT(IRL_LHHH, 0x2e0),
450 INTC_VECT(IRL_HLLL, 0x300), INTC_VECT(IRL_HLLH, 0x320),
451 INTC_VECT(IRL_HLHL, 0x340), INTC_VECT(IRL_HLHH, 0x360),
452 INTC_VECT(IRL_HHLL, 0x380), INTC_VECT(IRL_HHLH, 0x3a0),
453 INTC_VECT(IRL_HHHL, 0x3c0),
454 };
455
456 static DECLARE_INTC_DESC(intc_desc_irl, "shx3-irl", vectors_irl, groups,
457 mask_registers, prio_registers, NULL);
458
plat_irq_setup_pins(int mode)459 void __init plat_irq_setup_pins(int mode)
460 {
461 int ret = 0;
462
463 switch (mode) {
464 case IRQ_MODE_IRQ:
465 ret |= gpio_request(GPIO_FN_IRQ3, intc_desc_irq.name);
466 ret |= gpio_request(GPIO_FN_IRQ2, intc_desc_irq.name);
467 ret |= gpio_request(GPIO_FN_IRQ1, intc_desc_irq.name);
468 ret |= gpio_request(GPIO_FN_IRQ0, intc_desc_irq.name);
469
470 if (unlikely(ret)) {
471 pr_err("Failed to set IRQ mode\n");
472 return;
473 }
474
475 register_intc_controller(&intc_desc_irq);
476 break;
477 case IRQ_MODE_IRL3210:
478 ret |= gpio_request(GPIO_FN_IRL3, intc_desc_irl.name);
479 ret |= gpio_request(GPIO_FN_IRL2, intc_desc_irl.name);
480 ret |= gpio_request(GPIO_FN_IRL1, intc_desc_irl.name);
481 ret |= gpio_request(GPIO_FN_IRL0, intc_desc_irl.name);
482
483 if (unlikely(ret)) {
484 pr_err("Failed to set IRL mode\n");
485 return;
486 }
487
488 register_intc_controller(&intc_desc_irl);
489 break;
490 default:
491 BUG();
492 }
493 }
494
plat_irq_setup(void)495 void __init plat_irq_setup(void)
496 {
497 register_intc_controller(&intc_desc);
498 }
499
plat_mem_setup(void)500 void __init plat_mem_setup(void)
501 {
502 unsigned int nid = 1;
503
504 /* Register CPU#0 URAM space as Node 1 */
505 setup_bootmem_node(nid++, 0x145f0000, 0x14610000); /* CPU0 */
506
507 #if 0
508 /* XXX: Not yet.. */
509 setup_bootmem_node(nid++, 0x14df0000, 0x14e10000); /* CPU1 */
510 setup_bootmem_node(nid++, 0x155f0000, 0x15610000); /* CPU2 */
511 setup_bootmem_node(nid++, 0x15df0000, 0x15e10000); /* CPU3 */
512 #endif
513
514 setup_bootmem_node(nid++, 0x16000000, 0x16020000); /* CSM */
515 }
516