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