[POWERPC] Make cell use direct DMA ops
[linux-2.6-block.git] / arch / powerpc / kernel / prom_init.c
CommitLineData
9b6b563c
PM
1/*
2 * Procedures for interfacing to Open Firmware.
3 *
4 * Paul Mackerras August 1996.
5 * Copyright (C) 1996-2005 Paul Mackerras.
6 *
7 * Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner.
8 * {engebret|bergner}@us.ibm.com
9 *
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version
13 * 2 of the License, or (at your option) any later version.
14 */
15
16#undef DEBUG_PROM
17
18#include <stdarg.h>
9b6b563c
PM
19#include <linux/kernel.h>
20#include <linux/string.h>
21#include <linux/init.h>
22#include <linux/threads.h>
23#include <linux/spinlock.h>
24#include <linux/types.h>
25#include <linux/pci.h>
26#include <linux/proc_fs.h>
27#include <linux/stringify.h>
28#include <linux/delay.h>
29#include <linux/initrd.h>
30#include <linux/bitops.h>
31#include <asm/prom.h>
32#include <asm/rtas.h>
33#include <asm/page.h>
34#include <asm/processor.h>
35#include <asm/irq.h>
36#include <asm/io.h>
37#include <asm/smp.h>
38#include <asm/system.h>
39#include <asm/mmu.h>
40#include <asm/pgtable.h>
41#include <asm/pci.h>
42#include <asm/iommu.h>
9b6b563c
PM
43#include <asm/btext.h>
44#include <asm/sections.h>
45#include <asm/machdep.h>
46
47#ifdef CONFIG_LOGO_LINUX_CLUT224
48#include <linux/linux_logo.h>
49extern const struct linux_logo logo_linux_clut224;
50#endif
51
52/*
53 * Properties whose value is longer than this get excluded from our
54 * copy of the device tree. This value does need to be big enough to
55 * ensure that we don't lose things like the interrupt-map property
56 * on a PCI-PCI bridge.
57 */
58#define MAX_PROPERTY_LENGTH (1UL * 1024 * 1024)
59
60/*
61 * Eventually bump that one up
62 */
63#define DEVTREE_CHUNK_SIZE 0x100000
64
65/*
66 * This is the size of the local memory reserve map that gets copied
67 * into the boot params passed to the kernel. That size is totally
68 * flexible as the kernel just reads the list until it encounters an
69 * entry with size 0, so it can be changed without breaking binary
70 * compatibility
71 */
72#define MEM_RESERVE_MAP_SIZE 8
73
74/*
75 * prom_init() is called very early on, before the kernel text
76 * and data have been mapped to KERNELBASE. At this point the code
77 * is running at whatever address it has been loaded at.
78 * On ppc32 we compile with -mrelocatable, which means that references
79 * to extern and static variables get relocated automatically.
80 * On ppc64 we have to relocate the references explicitly with
81 * RELOC. (Note that strings count as static variables.)
82 *
83 * Because OF may have mapped I/O devices into the area starting at
84 * KERNELBASE, particularly on CHRP machines, we can't safely call
85 * OF once the kernel has been mapped to KERNELBASE. Therefore all
86 * OF calls must be done within prom_init().
87 *
88 * ADDR is used in calls to call_prom. The 4th and following
89 * arguments to call_prom should be 32-bit values.
90 * On ppc64, 64 bit values are truncated to 32 bits (and
91 * fortunately don't get interpreted as two arguments).
92 */
93#ifdef CONFIG_PPC64
94#define RELOC(x) (*PTRRELOC(&(x)))
95#define ADDR(x) (u32) add_reloc_offset((unsigned long)(x))
a23414be 96#define OF_WORKAROUNDS 0
9b6b563c
PM
97#else
98#define RELOC(x) (x)
99#define ADDR(x) (u32) (x)
a23414be
PM
100#define OF_WORKAROUNDS of_workarounds
101int of_workarounds;
9b6b563c
PM
102#endif
103
a23414be
PM
104#define OF_WA_CLAIM 1 /* do phys/virt claim separately, then map */
105#define OF_WA_LONGTRAIL 2 /* work around longtrail bugs */
106
9b6b563c
PM
107#define PROM_BUG() do { \
108 prom_printf("kernel BUG at %s line 0x%x!\n", \
109 RELOC(__FILE__), __LINE__); \
110 __asm__ __volatile__(".long " BUG_ILLEGAL_INSTR); \
111} while (0)
112
113#ifdef DEBUG_PROM
114#define prom_debug(x...) prom_printf(x)
115#else
116#define prom_debug(x...)
117#endif
118
9b6b563c
PM
119
120typedef u32 prom_arg_t;
121
122struct prom_args {
123 u32 service;
124 u32 nargs;
125 u32 nret;
126 prom_arg_t args[10];
127};
128
129struct prom_t {
130 ihandle root;
a23414be 131 phandle chosen;
9b6b563c
PM
132 int cpu;
133 ihandle stdout;
a575b807 134 ihandle mmumap;
a23414be 135 ihandle memory;
9b6b563c
PM
136};
137
138struct mem_map_entry {
cbbcf340
KG
139 u64 base;
140 u64 size;
9b6b563c
PM
141};
142
143typedef u32 cell_t;
144
145extern void __start(unsigned long r3, unsigned long r4, unsigned long r5);
146
147#ifdef CONFIG_PPC64
c4988820 148extern int enter_prom(struct prom_args *args, unsigned long entry);
9b6b563c 149#else
c4988820 150static inline int enter_prom(struct prom_args *args, unsigned long entry)
9b6b563c 151{
c4988820 152 return ((int (*)(struct prom_args *))entry)(args);
9b6b563c
PM
153}
154#endif
155
156extern void copy_and_flush(unsigned long dest, unsigned long src,
157 unsigned long size, unsigned long offset);
158
159/* prom structure */
160static struct prom_t __initdata prom;
161
162static unsigned long prom_entry __initdata;
163
164#define PROM_SCRATCH_SIZE 256
165
166static char __initdata of_stdout_device[256];
167static char __initdata prom_scratch[PROM_SCRATCH_SIZE];
168
169static unsigned long __initdata dt_header_start;
170static unsigned long __initdata dt_struct_start, dt_struct_end;
171static unsigned long __initdata dt_string_start, dt_string_end;
172
173static unsigned long __initdata prom_initrd_start, prom_initrd_end;
174
175#ifdef CONFIG_PPC64
176static int __initdata iommu_force_on;
177static int __initdata ppc64_iommu_off;
178static unsigned long __initdata prom_tce_alloc_start;
179static unsigned long __initdata prom_tce_alloc_end;
180#endif
181
e8222502
BH
182/* Platforms codes are now obsolete in the kernel. Now only used within this
183 * file and ultimately gone too. Feel free to change them if you need, they
184 * are not shared with anything outside of this file anymore
185 */
186#define PLATFORM_PSERIES 0x0100
187#define PLATFORM_PSERIES_LPAR 0x0101
188#define PLATFORM_LPAR 0x0001
189#define PLATFORM_POWERMAC 0x0400
190#define PLATFORM_GENERIC 0x0500
191
9b6b563c
PM
192static int __initdata of_platform;
193
194static char __initdata prom_cmd_line[COMMAND_LINE_SIZE];
195
9b6b563c
PM
196static unsigned long __initdata alloc_top;
197static unsigned long __initdata alloc_top_high;
198static unsigned long __initdata alloc_bottom;
199static unsigned long __initdata rmo_top;
200static unsigned long __initdata ram_top;
201
202static struct mem_map_entry __initdata mem_reserve_map[MEM_RESERVE_MAP_SIZE];
203static int __initdata mem_reserve_cnt;
204
205static cell_t __initdata regbuf[1024];
206
207
208#define MAX_CPU_THREADS 2
209
9b6b563c
PM
210/*
211 * Error results ... some OF calls will return "-1" on error, some
212 * will return 0, some will return either. To simplify, here are
213 * macros to use with any ihandle or phandle return value to check if
214 * it is valid
215 */
216
217#define PROM_ERROR (-1u)
218#define PHANDLE_VALID(p) ((p) != 0 && (p) != PROM_ERROR)
219#define IHANDLE_VALID(i) ((i) != 0 && (i) != PROM_ERROR)
220
221
222/* This is the one and *ONLY* place where we actually call open
223 * firmware.
224 */
225
226static int __init call_prom(const char *service, int nargs, int nret, ...)
227{
228 int i;
229 struct prom_args args;
230 va_list list;
231
232 args.service = ADDR(service);
233 args.nargs = nargs;
234 args.nret = nret;
235
236 va_start(list, nret);
237 for (i = 0; i < nargs; i++)
238 args.args[i] = va_arg(list, prom_arg_t);
239 va_end(list);
240
241 for (i = 0; i < nret; i++)
242 args.args[nargs+i] = 0;
243
c4988820
PM
244 if (enter_prom(&args, RELOC(prom_entry)) < 0)
245 return PROM_ERROR;
9b6b563c
PM
246
247 return (nret > 0) ? args.args[nargs] : 0;
248}
249
250static int __init call_prom_ret(const char *service, int nargs, int nret,
251 prom_arg_t *rets, ...)
252{
253 int i;
254 struct prom_args args;
255 va_list list;
256
257 args.service = ADDR(service);
258 args.nargs = nargs;
259 args.nret = nret;
260
261 va_start(list, rets);
262 for (i = 0; i < nargs; i++)
263 args.args[i] = va_arg(list, prom_arg_t);
264 va_end(list);
265
266 for (i = 0; i < nret; i++)
ed1189b7 267 args.args[nargs+i] = 0;
9b6b563c 268
c4988820
PM
269 if (enter_prom(&args, RELOC(prom_entry)) < 0)
270 return PROM_ERROR;
9b6b563c
PM
271
272 if (rets != NULL)
273 for (i = 1; i < nret; ++i)
c5200c90 274 rets[i-1] = args.args[nargs+i];
9b6b563c
PM
275
276 return (nret > 0) ? args.args[nargs] : 0;
277}
278
279
9b6b563c
PM
280static void __init prom_print(const char *msg)
281{
282 const char *p, *q;
283 struct prom_t *_prom = &RELOC(prom);
284
285 if (_prom->stdout == 0)
286 return;
287
288 for (p = msg; *p != 0; p = q) {
289 for (q = p; *q != 0 && *q != '\n'; ++q)
290 ;
291 if (q > p)
292 call_prom("write", 3, 1, _prom->stdout, p, q - p);
293 if (*q == 0)
294 break;
295 ++q;
296 call_prom("write", 3, 1, _prom->stdout, ADDR("\r\n"), 2);
297 }
298}
299
300
301static void __init prom_print_hex(unsigned long val)
302{
303 int i, nibbles = sizeof(val)*2;
304 char buf[sizeof(val)*2+1];
305 struct prom_t *_prom = &RELOC(prom);
306
307 for (i = nibbles-1; i >= 0; i--) {
308 buf[i] = (val & 0xf) + '0';
309 if (buf[i] > '9')
310 buf[i] += ('a'-'0'-10);
311 val >>= 4;
312 }
313 buf[nibbles] = '\0';
314 call_prom("write", 3, 1, _prom->stdout, buf, nibbles);
315}
316
317
318static void __init prom_printf(const char *format, ...)
319{
320 const char *p, *q, *s;
321 va_list args;
322 unsigned long v;
323 struct prom_t *_prom = &RELOC(prom);
324
325 va_start(args, format);
326#ifdef CONFIG_PPC64
327 format = PTRRELOC(format);
328#endif
329 for (p = format; *p != 0; p = q) {
330 for (q = p; *q != 0 && *q != '\n' && *q != '%'; ++q)
331 ;
332 if (q > p)
333 call_prom("write", 3, 1, _prom->stdout, p, q - p);
334 if (*q == 0)
335 break;
336 if (*q == '\n') {
337 ++q;
338 call_prom("write", 3, 1, _prom->stdout,
339 ADDR("\r\n"), 2);
340 continue;
341 }
342 ++q;
343 if (*q == 0)
344 break;
345 switch (*q) {
346 case 's':
347 ++q;
348 s = va_arg(args, const char *);
349 prom_print(s);
350 break;
351 case 'x':
352 ++q;
353 v = va_arg(args, unsigned long);
354 prom_print_hex(v);
355 break;
356 }
357 }
358}
359
360
a575b807
PM
361static unsigned int __init prom_claim(unsigned long virt, unsigned long size,
362 unsigned long align)
363{
a575b807
PM
364 struct prom_t *_prom = &RELOC(prom);
365
a23414be
PM
366 if (align == 0 && (OF_WORKAROUNDS & OF_WA_CLAIM)) {
367 /*
368 * Old OF requires we claim physical and virtual separately
369 * and then map explicitly (assuming virtual mode)
370 */
371 int ret;
372 prom_arg_t result;
373
374 ret = call_prom_ret("call-method", 5, 2, &result,
375 ADDR("claim"), _prom->memory,
376 align, size, virt);
377 if (ret != 0 || result == -1)
378 return -1;
379 ret = call_prom_ret("call-method", 5, 2, &result,
380 ADDR("claim"), _prom->mmumap,
381 align, size, virt);
382 if (ret != 0) {
383 call_prom("call-method", 4, 1, ADDR("release"),
384 _prom->memory, size, virt);
385 return -1;
386 }
387 /* the 0x12 is M (coherence) + PP == read/write */
a575b807 388 call_prom("call-method", 6, 1,
a23414be
PM
389 ADDR("map"), _prom->mmumap, 0x12, size, virt, virt);
390 return virt;
391 }
392 return call_prom("claim", 3, 1, (prom_arg_t)virt, (prom_arg_t)size,
393 (prom_arg_t)align);
a575b807
PM
394}
395
9b6b563c
PM
396static void __init __attribute__((noreturn)) prom_panic(const char *reason)
397{
398#ifdef CONFIG_PPC64
399 reason = PTRRELOC(reason);
400#endif
401 prom_print(reason);
add60ef3
OH
402 /* Do not call exit because it clears the screen on pmac
403 * it also causes some sort of double-fault on early pmacs */
404 if (RELOC(of_platform) == PLATFORM_POWERMAC)
405 asm("trap\n");
406
9b6b563c
PM
407 /* ToDo: should put up an SRC here on p/iSeries */
408 call_prom("exit", 0, 0);
409
410 for (;;) /* should never get here */
411 ;
412}
413
414
415static int __init prom_next_node(phandle *nodep)
416{
417 phandle node;
418
419 if ((node = *nodep) != 0
420 && (*nodep = call_prom("child", 1, 1, node)) != 0)
421 return 1;
422 if ((*nodep = call_prom("peer", 1, 1, node)) != 0)
423 return 1;
424 for (;;) {
425 if ((node = call_prom("parent", 1, 1, node)) == 0)
426 return 0;
427 if ((*nodep = call_prom("peer", 1, 1, node)) != 0)
428 return 1;
429 }
430}
431
21fe3301 432static int inline prom_getprop(phandle node, const char *pname,
9b6b563c
PM
433 void *value, size_t valuelen)
434{
435 return call_prom("getprop", 4, 1, node, ADDR(pname),
436 (u32)(unsigned long) value, (u32) valuelen);
437}
438
21fe3301 439static int inline prom_getproplen(phandle node, const char *pname)
9b6b563c
PM
440{
441 return call_prom("getproplen", 2, 1, node, ADDR(pname));
442}
443
a23414be 444static void add_string(char **str, const char *q)
9b6b563c 445{
a23414be
PM
446 char *p = *str;
447
448 while (*q)
449 *p++ = *q++;
450 *p++ = ' ';
451 *str = p;
452}
453
454static char *tohex(unsigned int x)
455{
456 static char digits[] = "0123456789abcdef";
457 static char result[9];
458 int i;
459
460 result[8] = 0;
461 i = 8;
462 do {
463 --i;
464 result[i] = digits[x & 0xf];
465 x >>= 4;
466 } while (x != 0 && i > 0);
467 return &result[i];
468}
469
470static int __init prom_setprop(phandle node, const char *nodename,
471 const char *pname, void *value, size_t valuelen)
472{
473 char cmd[256], *p;
474
475 if (!(OF_WORKAROUNDS & OF_WA_LONGTRAIL))
476 return call_prom("setprop", 4, 1, node, ADDR(pname),
477 (u32)(unsigned long) value, (u32) valuelen);
478
479 /* gah... setprop doesn't work on longtrail, have to use interpret */
480 p = cmd;
481 add_string(&p, "dev");
482 add_string(&p, nodename);
483 add_string(&p, tohex((u32)(unsigned long) value));
484 add_string(&p, tohex(valuelen));
485 add_string(&p, tohex(ADDR(pname)));
486 add_string(&p, tohex(strlen(RELOC(pname))));
487 add_string(&p, "property");
488 *p = 0;
489 return call_prom("interpret", 1, 1, (u32)(unsigned long) cmd);
9b6b563c
PM
490}
491
492/* We can't use the standard versions because of RELOC headaches. */
493#define isxdigit(c) (('0' <= (c) && (c) <= '9') \
494 || ('a' <= (c) && (c) <= 'f') \
495 || ('A' <= (c) && (c) <= 'F'))
496
497#define isdigit(c) ('0' <= (c) && (c) <= '9')
498#define islower(c) ('a' <= (c) && (c) <= 'z')
499#define toupper(c) (islower(c) ? ((c) - 'a' + 'A') : (c))
500
501unsigned long prom_strtoul(const char *cp, const char **endp)
502{
503 unsigned long result = 0, base = 10, value;
504
505 if (*cp == '0') {
506 base = 8;
507 cp++;
508 if (toupper(*cp) == 'X') {
509 cp++;
510 base = 16;
511 }
512 }
513
514 while (isxdigit(*cp) &&
515 (value = isdigit(*cp) ? *cp - '0' : toupper(*cp) - 'A' + 10) < base) {
516 result = result * base + value;
517 cp++;
518 }
519
520 if (endp)
521 *endp = cp;
522
523 return result;
524}
525
526unsigned long prom_memparse(const char *ptr, const char **retptr)
527{
528 unsigned long ret = prom_strtoul(ptr, retptr);
529 int shift = 0;
530
531 /*
532 * We can't use a switch here because GCC *may* generate a
533 * jump table which won't work, because we're not running at
534 * the address we're linked at.
535 */
536 if ('G' == **retptr || 'g' == **retptr)
537 shift = 30;
538
539 if ('M' == **retptr || 'm' == **retptr)
540 shift = 20;
541
542 if ('K' == **retptr || 'k' == **retptr)
543 shift = 10;
544
545 if (shift) {
546 ret <<= shift;
547 (*retptr)++;
548 }
549
550 return ret;
551}
552
553/*
554 * Early parsing of the command line passed to the kernel, used for
555 * "mem=x" and the options that affect the iommu
556 */
557static void __init early_cmdline_parse(void)
558{
559 struct prom_t *_prom = &RELOC(prom);
470407a8 560#ifdef CONFIG_PPC64
cc5d0189 561 const char *opt;
470407a8 562#endif
cc5d0189 563 char *p;
9b6b563c
PM
564 int l = 0;
565
566 RELOC(prom_cmd_line[0]) = 0;
567 p = RELOC(prom_cmd_line);
568 if ((long)_prom->chosen > 0)
569 l = prom_getprop(_prom->chosen, "bootargs", p, COMMAND_LINE_SIZE-1);
570#ifdef CONFIG_CMDLINE
0e4aa9c2 571 if (l <= 0 || p[0] == '\0') /* dbl check */
9b6b563c
PM
572 strlcpy(RELOC(prom_cmd_line),
573 RELOC(CONFIG_CMDLINE), sizeof(prom_cmd_line));
574#endif /* CONFIG_CMDLINE */
575 prom_printf("command line: %s\n", RELOC(prom_cmd_line));
576
577#ifdef CONFIG_PPC64
578 opt = strstr(RELOC(prom_cmd_line), RELOC("iommu="));
579 if (opt) {
580 prom_printf("iommu opt is: %s\n", opt);
581 opt += 6;
582 while (*opt && *opt == ' ')
583 opt++;
584 if (!strncmp(opt, RELOC("off"), 3))
585 RELOC(ppc64_iommu_off) = 1;
586 else if (!strncmp(opt, RELOC("force"), 5))
587 RELOC(iommu_force_on) = 1;
588 }
589#endif
9b6b563c
PM
590}
591
592#ifdef CONFIG_PPC_PSERIES
593/*
f709bfac
PM
594 * There are two methods for telling firmware what our capabilities are.
595 * Newer machines have an "ibm,client-architecture-support" method on the
596 * root node. For older machines, we have to call the "process-elf-header"
597 * method in the /packages/elf-loader node, passing it a fake 32-bit
598 * ELF header containing a couple of PT_NOTE sections that contain
599 * structures that contain various information.
9b6b563c 600 */
f709bfac
PM
601
602/*
603 * New method - extensible architecture description vector.
604 *
605 * Because the description vector contains a mix of byte and word
606 * values, we declare it as an unsigned char array, and use this
607 * macro to put word values in.
608 */
609#define W(x) ((x) >> 24) & 0xff, ((x) >> 16) & 0xff, \
610 ((x) >> 8) & 0xff, (x) & 0xff
611
612/* Option vector bits - generic bits in byte 1 */
613#define OV_IGNORE 0x80 /* ignore this vector */
614#define OV_CESSATION_POLICY 0x40 /* halt if unsupported option present*/
615
616/* Option vector 1: processor architectures supported */
617#define OV1_PPC_2_00 0x80 /* set if we support PowerPC 2.00 */
618#define OV1_PPC_2_01 0x40 /* set if we support PowerPC 2.01 */
619#define OV1_PPC_2_02 0x20 /* set if we support PowerPC 2.02 */
620#define OV1_PPC_2_03 0x10 /* set if we support PowerPC 2.03 */
621#define OV1_PPC_2_04 0x08 /* set if we support PowerPC 2.04 */
622#define OV1_PPC_2_05 0x04 /* set if we support PowerPC 2.05 */
623
624/* Option vector 2: Open Firmware options supported */
625#define OV2_REAL_MODE 0x20 /* set if we want OF in real mode */
626
627/* Option vector 3: processor options supported */
628#define OV3_FP 0x80 /* floating point */
629#define OV3_VMX 0x40 /* VMX/Altivec */
630
631/* Option vector 5: PAPR/OF options supported */
632#define OV5_LPAR 0x80 /* logical partitioning supported */
633#define OV5_SPLPAR 0x40 /* shared-processor LPAR supported */
634/* ibm,dynamic-reconfiguration-memory property supported */
635#define OV5_DRCONF_MEMORY 0x20
636#define OV5_LARGE_PAGES 0x10 /* large pages supported */
637
638/*
639 * The architecture vector has an array of PVR mask/value pairs,
640 * followed by # option vectors - 1, followed by the option vectors.
641 */
642static unsigned char ibm_architecture_vec[] = {
643 W(0xfffe0000), W(0x003a0000), /* POWER5/POWER5+ */
03054d51 644 W(0xffff0000), W(0x003e0000), /* POWER6 */
f709bfac
PM
645 W(0xfffffffe), W(0x0f000001), /* all 2.04-compliant and earlier */
646 5 - 1, /* 5 option vectors */
647
648 /* option vector 1: processor architectures supported */
11e9ed43 649 3 - 2, /* length */
f709bfac
PM
650 0, /* don't ignore, don't halt */
651 OV1_PPC_2_00 | OV1_PPC_2_01 | OV1_PPC_2_02 | OV1_PPC_2_03 |
652 OV1_PPC_2_04 | OV1_PPC_2_05,
653
654 /* option vector 2: Open Firmware options supported */
11e9ed43 655 34 - 2, /* length */
f709bfac
PM
656 OV2_REAL_MODE,
657 0, 0,
658 W(0xffffffff), /* real_base */
659 W(0xffffffff), /* real_size */
660 W(0xffffffff), /* virt_base */
661 W(0xffffffff), /* virt_size */
662 W(0xffffffff), /* load_base */
663 W(64), /* 128MB min RMA */
664 W(0xffffffff), /* full client load */
665 0, /* min RMA percentage of total RAM */
666 48, /* max log_2(hash table size) */
667
668 /* option vector 3: processor options supported */
11e9ed43 669 3 - 2, /* length */
f709bfac
PM
670 0, /* don't ignore, don't halt */
671 OV3_FP | OV3_VMX,
672
673 /* option vector 4: IBM PAPR implementation */
11e9ed43 674 2 - 2, /* length */
f709bfac
PM
675 0, /* don't halt */
676
677 /* option vector 5: PAPR/OF options */
11e9ed43 678 3 - 2, /* length */
f709bfac
PM
679 0, /* don't ignore, don't halt */
680 OV5_LPAR | OV5_SPLPAR | OV5_LARGE_PAGES,
681};
682
683/* Old method - ELF header with PT_NOTE sections */
9b6b563c
PM
684static struct fake_elf {
685 Elf32_Ehdr elfhdr;
686 Elf32_Phdr phdr[2];
687 struct chrpnote {
688 u32 namesz;
689 u32 descsz;
690 u32 type;
691 char name[8]; /* "PowerPC" */
692 struct chrpdesc {
693 u32 real_mode;
694 u32 real_base;
695 u32 real_size;
696 u32 virt_base;
697 u32 virt_size;
698 u32 load_base;
699 } chrpdesc;
700 } chrpnote;
701 struct rpanote {
702 u32 namesz;
703 u32 descsz;
704 u32 type;
705 char name[24]; /* "IBM,RPA-Client-Config" */
706 struct rpadesc {
707 u32 lpar_affinity;
708 u32 min_rmo_size;
709 u32 min_rmo_percent;
710 u32 max_pft_size;
711 u32 splpar;
712 u32 min_load;
713 u32 new_mem_def;
714 u32 ignore_me;
715 } rpadesc;
716 } rpanote;
717} fake_elf = {
718 .elfhdr = {
719 .e_ident = { 0x7f, 'E', 'L', 'F',
720 ELFCLASS32, ELFDATA2MSB, EV_CURRENT },
721 .e_type = ET_EXEC, /* yeah right */
722 .e_machine = EM_PPC,
723 .e_version = EV_CURRENT,
724 .e_phoff = offsetof(struct fake_elf, phdr),
725 .e_phentsize = sizeof(Elf32_Phdr),
726 .e_phnum = 2
727 },
728 .phdr = {
729 [0] = {
730 .p_type = PT_NOTE,
731 .p_offset = offsetof(struct fake_elf, chrpnote),
732 .p_filesz = sizeof(struct chrpnote)
733 }, [1] = {
734 .p_type = PT_NOTE,
735 .p_offset = offsetof(struct fake_elf, rpanote),
736 .p_filesz = sizeof(struct rpanote)
737 }
738 },
739 .chrpnote = {
740 .namesz = sizeof("PowerPC"),
741 .descsz = sizeof(struct chrpdesc),
742 .type = 0x1275,
743 .name = "PowerPC",
744 .chrpdesc = {
745 .real_mode = ~0U, /* ~0 means "don't care" */
746 .real_base = ~0U,
747 .real_size = ~0U,
748 .virt_base = ~0U,
749 .virt_size = ~0U,
750 .load_base = ~0U
751 },
752 },
753 .rpanote = {
754 .namesz = sizeof("IBM,RPA-Client-Config"),
755 .descsz = sizeof(struct rpadesc),
756 .type = 0x12759999,
757 .name = "IBM,RPA-Client-Config",
758 .rpadesc = {
759 .lpar_affinity = 0,
760 .min_rmo_size = 64, /* in megabytes */
761 .min_rmo_percent = 0,
762 .max_pft_size = 48, /* 2^48 bytes max PFT size */
763 .splpar = 1,
764 .min_load = ~0U,
765 .new_mem_def = 0
766 }
767 }
768};
769
770static void __init prom_send_capabilities(void)
771{
f709bfac
PM
772 ihandle elfloader, root;
773 prom_arg_t ret;
774
775 root = call_prom("open", 1, 1, ADDR("/"));
776 if (root != 0) {
777 /* try calling the ibm,client-architecture-support method */
778 if (call_prom_ret("call-method", 3, 2, &ret,
779 ADDR("ibm,client-architecture-support"),
33b74977 780 root,
f709bfac
PM
781 ADDR(ibm_architecture_vec)) == 0) {
782 /* the call exists... */
783 if (ret)
784 prom_printf("WARNING: ibm,client-architecture"
785 "-support call FAILED!\n");
786 call_prom("close", 1, 0, root);
787 return;
788 }
789 call_prom("close", 1, 0, root);
790 }
9b6b563c 791
f709bfac 792 /* no ibm,client-architecture-support call, try the old way */
9b6b563c
PM
793 elfloader = call_prom("open", 1, 1, ADDR("/packages/elf-loader"));
794 if (elfloader == 0) {
795 prom_printf("couldn't open /packages/elf-loader\n");
796 return;
797 }
798 call_prom("call-method", 3, 1, ADDR("process-elf-header"),
799 elfloader, ADDR(&fake_elf));
800 call_prom("close", 1, 0, elfloader);
801}
802#endif
803
804/*
805 * Memory allocation strategy... our layout is normally:
806 *
807 * at 14Mb or more we have vmlinux, then a gap and initrd. In some
808 * rare cases, initrd might end up being before the kernel though.
809 * We assume this won't override the final kernel at 0, we have no
810 * provision to handle that in this version, but it should hopefully
811 * never happen.
812 *
813 * alloc_top is set to the top of RMO, eventually shrink down if the
814 * TCEs overlap
815 *
816 * alloc_bottom is set to the top of kernel/initrd
817 *
818 * from there, allocations are done this way : rtas is allocated
819 * topmost, and the device-tree is allocated from the bottom. We try
820 * to grow the device-tree allocation as we progress. If we can't,
821 * then we fail, we don't currently have a facility to restart
822 * elsewhere, but that shouldn't be necessary.
823 *
824 * Note that calls to reserve_mem have to be done explicitly, memory
825 * allocated with either alloc_up or alloc_down isn't automatically
826 * reserved.
827 */
828
829
830/*
831 * Allocates memory in the RMO upward from the kernel/initrd
832 *
833 * When align is 0, this is a special case, it means to allocate in place
834 * at the current location of alloc_bottom or fail (that is basically
835 * extending the previous allocation). Used for the device-tree flattening
836 */
837static unsigned long __init alloc_up(unsigned long size, unsigned long align)
838{
c4988820 839 unsigned long base = RELOC(alloc_bottom);
9b6b563c
PM
840 unsigned long addr = 0;
841
c4988820
PM
842 if (align)
843 base = _ALIGN_UP(base, align);
9b6b563c
PM
844 prom_debug("alloc_up(%x, %x)\n", size, align);
845 if (RELOC(ram_top) == 0)
846 prom_panic("alloc_up() called with mem not initialized\n");
847
848 if (align)
849 base = _ALIGN_UP(RELOC(alloc_bottom), align);
850 else
851 base = RELOC(alloc_bottom);
852
853 for(; (base + size) <= RELOC(alloc_top);
854 base = _ALIGN_UP(base + 0x100000, align)) {
855 prom_debug(" trying: 0x%x\n\r", base);
856 addr = (unsigned long)prom_claim(base, size, 0);
c4988820 857 if (addr != PROM_ERROR && addr != 0)
9b6b563c
PM
858 break;
859 addr = 0;
860 if (align == 0)
861 break;
862 }
863 if (addr == 0)
864 return 0;
865 RELOC(alloc_bottom) = addr;
866
867 prom_debug(" -> %x\n", addr);
868 prom_debug(" alloc_bottom : %x\n", RELOC(alloc_bottom));
869 prom_debug(" alloc_top : %x\n", RELOC(alloc_top));
870 prom_debug(" alloc_top_hi : %x\n", RELOC(alloc_top_high));
871 prom_debug(" rmo_top : %x\n", RELOC(rmo_top));
872 prom_debug(" ram_top : %x\n", RELOC(ram_top));
873
874 return addr;
875}
876
877/*
878 * Allocates memory downward, either from top of RMO, or if highmem
879 * is set, from the top of RAM. Note that this one doesn't handle
880 * failures. It does claim memory if highmem is not set.
881 */
882static unsigned long __init alloc_down(unsigned long size, unsigned long align,
883 int highmem)
884{
885 unsigned long base, addr = 0;
886
887 prom_debug("alloc_down(%x, %x, %s)\n", size, align,
888 highmem ? RELOC("(high)") : RELOC("(low)"));
889 if (RELOC(ram_top) == 0)
890 prom_panic("alloc_down() called with mem not initialized\n");
891
892 if (highmem) {
893 /* Carve out storage for the TCE table. */
894 addr = _ALIGN_DOWN(RELOC(alloc_top_high) - size, align);
895 if (addr <= RELOC(alloc_bottom))
896 return 0;
897 /* Will we bump into the RMO ? If yes, check out that we
898 * didn't overlap existing allocations there, if we did,
899 * we are dead, we must be the first in town !
900 */
901 if (addr < RELOC(rmo_top)) {
902 /* Good, we are first */
903 if (RELOC(alloc_top) == RELOC(rmo_top))
904 RELOC(alloc_top) = RELOC(rmo_top) = addr;
905 else
906 return 0;
907 }
908 RELOC(alloc_top_high) = addr;
909 goto bail;
910 }
911
912 base = _ALIGN_DOWN(RELOC(alloc_top) - size, align);
913 for (; base > RELOC(alloc_bottom);
914 base = _ALIGN_DOWN(base - 0x100000, align)) {
915 prom_debug(" trying: 0x%x\n\r", base);
916 addr = (unsigned long)prom_claim(base, size, 0);
c4988820 917 if (addr != PROM_ERROR && addr != 0)
9b6b563c
PM
918 break;
919 addr = 0;
920 }
921 if (addr == 0)
922 return 0;
923 RELOC(alloc_top) = addr;
924
925 bail:
926 prom_debug(" -> %x\n", addr);
927 prom_debug(" alloc_bottom : %x\n", RELOC(alloc_bottom));
928 prom_debug(" alloc_top : %x\n", RELOC(alloc_top));
929 prom_debug(" alloc_top_hi : %x\n", RELOC(alloc_top_high));
930 prom_debug(" rmo_top : %x\n", RELOC(rmo_top));
931 prom_debug(" ram_top : %x\n", RELOC(ram_top));
932
933 return addr;
934}
935
936/*
937 * Parse a "reg" cell
938 */
939static unsigned long __init prom_next_cell(int s, cell_t **cellp)
940{
941 cell_t *p = *cellp;
942 unsigned long r = 0;
943
944 /* Ignore more than 2 cells */
945 while (s > sizeof(unsigned long) / 4) {
946 p++;
947 s--;
948 }
949 r = *p++;
950#ifdef CONFIG_PPC64
35499c01 951 if (s > 1) {
9b6b563c
PM
952 r <<= 32;
953 r |= *(p++);
954 }
955#endif
956 *cellp = p;
957 return r;
958}
959
960/*
961 * Very dumb function for adding to the memory reserve list, but
962 * we don't need anything smarter at this point
963 *
964 * XXX Eventually check for collisions. They should NEVER happen.
965 * If problems seem to show up, it would be a good start to track
966 * them down.
967 */
cbbcf340 968static void reserve_mem(u64 base, u64 size)
9b6b563c 969{
cbbcf340 970 u64 top = base + size;
9b6b563c
PM
971 unsigned long cnt = RELOC(mem_reserve_cnt);
972
973 if (size == 0)
974 return;
975
976 /* We need to always keep one empty entry so that we
977 * have our terminator with "size" set to 0 since we are
978 * dumb and just copy this entire array to the boot params
979 */
980 base = _ALIGN_DOWN(base, PAGE_SIZE);
981 top = _ALIGN_UP(top, PAGE_SIZE);
982 size = top - base;
983
984 if (cnt >= (MEM_RESERVE_MAP_SIZE - 1))
985 prom_panic("Memory reserve map exhausted !\n");
986 RELOC(mem_reserve_map)[cnt].base = base;
987 RELOC(mem_reserve_map)[cnt].size = size;
988 RELOC(mem_reserve_cnt) = cnt + 1;
989}
990
991/*
b3c2ffd5 992 * Initialize memory allocation mechanism, parse "memory" nodes and
9b6b563c
PM
993 * obtain that way the top of memory and RMO to setup out local allocator
994 */
995static void __init prom_init_mem(void)
996{
997 phandle node;
998 char *path, type[64];
999 unsigned int plen;
1000 cell_t *p, *endp;
1001 struct prom_t *_prom = &RELOC(prom);
1002 u32 rac, rsc;
1003
1004 /*
1005 * We iterate the memory nodes to find
1006 * 1) top of RMO (first node)
1007 * 2) top of memory
1008 */
1009 rac = 2;
1010 prom_getprop(_prom->root, "#address-cells", &rac, sizeof(rac));
1011 rsc = 1;
1012 prom_getprop(_prom->root, "#size-cells", &rsc, sizeof(rsc));
1013 prom_debug("root_addr_cells: %x\n", (unsigned long) rac);
1014 prom_debug("root_size_cells: %x\n", (unsigned long) rsc);
1015
1016 prom_debug("scanning memory:\n");
1017 path = RELOC(prom_scratch);
1018
1019 for (node = 0; prom_next_node(&node); ) {
1020 type[0] = 0;
1021 prom_getprop(node, "device_type", type, sizeof(type));
1022
c4988820
PM
1023 if (type[0] == 0) {
1024 /*
1025 * CHRP Longtrail machines have no device_type
1026 * on the memory node, so check the name instead...
1027 */
1028 prom_getprop(node, "name", type, sizeof(type));
1029 }
9b6b563c
PM
1030 if (strcmp(type, RELOC("memory")))
1031 continue;
c4988820 1032
9b6b563c
PM
1033 plen = prom_getprop(node, "reg", RELOC(regbuf), sizeof(regbuf));
1034 if (plen > sizeof(regbuf)) {
1035 prom_printf("memory node too large for buffer !\n");
1036 plen = sizeof(regbuf);
1037 }
1038 p = RELOC(regbuf);
1039 endp = p + (plen / sizeof(cell_t));
1040
1041#ifdef DEBUG_PROM
1042 memset(path, 0, PROM_SCRATCH_SIZE);
1043 call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1);
1044 prom_debug(" node %s :\n", path);
1045#endif /* DEBUG_PROM */
1046
1047 while ((endp - p) >= (rac + rsc)) {
1048 unsigned long base, size;
1049
1050 base = prom_next_cell(rac, &p);
1051 size = prom_next_cell(rsc, &p);
1052
1053 if (size == 0)
1054 continue;
1055 prom_debug(" %x %x\n", base, size);
ab1b55e2 1056 if (base == 0 && (RELOC(of_platform) & PLATFORM_LPAR))
9b6b563c
PM
1057 RELOC(rmo_top) = size;
1058 if ((base + size) > RELOC(ram_top))
1059 RELOC(ram_top) = base + size;
1060 }
1061 }
1062
1063 RELOC(alloc_bottom) = PAGE_ALIGN((unsigned long)&RELOC(_end) + 0x4000);
1064
1065 /* Check if we have an initrd after the kernel, if we do move our bottom
1066 * point to after it
1067 */
1068 if (RELOC(prom_initrd_start)) {
1069 if (RELOC(prom_initrd_end) > RELOC(alloc_bottom))
1070 RELOC(alloc_bottom) = PAGE_ALIGN(RELOC(prom_initrd_end));
1071 }
1072
9b6b563c
PM
1073 /*
1074 * Setup our top alloc point, that is top of RMO or top of
1075 * segment 0 when running non-LPAR.
1076 * Some RS64 machines have buggy firmware where claims up at
1077 * 1GB fail. Cap at 768MB as a workaround.
1078 * Since 768MB is plenty of room, and we need to cap to something
1079 * reasonable on 32-bit, cap at 768MB on all machines.
1080 */
1081 if (!RELOC(rmo_top))
1082 RELOC(rmo_top) = RELOC(ram_top);
1083 RELOC(rmo_top) = min(0x30000000ul, RELOC(rmo_top));
1084 RELOC(alloc_top) = RELOC(rmo_top);
2babf5c2 1085 RELOC(alloc_top_high) = RELOC(ram_top);
9b6b563c
PM
1086
1087 prom_printf("memory layout at init:\n");
9b6b563c
PM
1088 prom_printf(" alloc_bottom : %x\n", RELOC(alloc_bottom));
1089 prom_printf(" alloc_top : %x\n", RELOC(alloc_top));
1090 prom_printf(" alloc_top_hi : %x\n", RELOC(alloc_top_high));
1091 prom_printf(" rmo_top : %x\n", RELOC(rmo_top));
1092 prom_printf(" ram_top : %x\n", RELOC(ram_top));
1093}
1094
1095
1096/*
1097 * Allocate room for and instantiate RTAS
1098 */
1099static void __init prom_instantiate_rtas(void)
1100{
1101 phandle rtas_node;
1102 ihandle rtas_inst;
1103 u32 base, entry = 0;
1104 u32 size = 0;
1105
1106 prom_debug("prom_instantiate_rtas: start...\n");
1107
1108 rtas_node = call_prom("finddevice", 1, 1, ADDR("/rtas"));
1109 prom_debug("rtas_node: %x\n", rtas_node);
1110 if (!PHANDLE_VALID(rtas_node))
1111 return;
1112
1113 prom_getprop(rtas_node, "rtas-size", &size, sizeof(size));
1114 if (size == 0)
1115 return;
1116
1117 base = alloc_down(size, PAGE_SIZE, 0);
1118 if (base == 0) {
1119 prom_printf("RTAS allocation failed !\n");
1120 return;
1121 }
1122
1123 rtas_inst = call_prom("open", 1, 1, ADDR("/rtas"));
1124 if (!IHANDLE_VALID(rtas_inst)) {
a23414be 1125 prom_printf("opening rtas package failed (%x)\n", rtas_inst);
9b6b563c
PM
1126 return;
1127 }
1128
1129 prom_printf("instantiating rtas at 0x%x ...", base);
1130
1131 if (call_prom_ret("call-method", 3, 2, &entry,
1132 ADDR("instantiate-rtas"),
a23414be 1133 rtas_inst, base) != 0
9b6b563c
PM
1134 || entry == 0) {
1135 prom_printf(" failed\n");
1136 return;
1137 }
1138 prom_printf(" done\n");
1139
1140 reserve_mem(base, size);
1141
a23414be
PM
1142 prom_setprop(rtas_node, "/rtas", "linux,rtas-base",
1143 &base, sizeof(base));
1144 prom_setprop(rtas_node, "/rtas", "linux,rtas-entry",
1145 &entry, sizeof(entry));
9b6b563c
PM
1146
1147 prom_debug("rtas base = 0x%x\n", base);
1148 prom_debug("rtas entry = 0x%x\n", entry);
1149 prom_debug("rtas size = 0x%x\n", (long)size);
1150
1151 prom_debug("prom_instantiate_rtas: end...\n");
1152}
1153
1154#ifdef CONFIG_PPC64
1155/*
1156 * Allocate room for and initialize TCE tables
1157 */
1158static void __init prom_initialize_tce_table(void)
1159{
1160 phandle node;
1161 ihandle phb_node;
1162 char compatible[64], type[64], model[64];
1163 char *path = RELOC(prom_scratch);
1164 u64 base, align;
1165 u32 minalign, minsize;
1166 u64 tce_entry, *tce_entryp;
1167 u64 local_alloc_top, local_alloc_bottom;
1168 u64 i;
1169
1170 if (RELOC(ppc64_iommu_off))
1171 return;
1172
1173 prom_debug("starting prom_initialize_tce_table\n");
1174
1175 /* Cache current top of allocs so we reserve a single block */
1176 local_alloc_top = RELOC(alloc_top_high);
1177 local_alloc_bottom = local_alloc_top;
1178
1179 /* Search all nodes looking for PHBs. */
1180 for (node = 0; prom_next_node(&node); ) {
1181 compatible[0] = 0;
1182 type[0] = 0;
1183 model[0] = 0;
1184 prom_getprop(node, "compatible",
1185 compatible, sizeof(compatible));
1186 prom_getprop(node, "device_type", type, sizeof(type));
1187 prom_getprop(node, "model", model, sizeof(model));
1188
1189 if ((type[0] == 0) || (strstr(type, RELOC("pci")) == NULL))
1190 continue;
1191
1192 /* Keep the old logic in tack to avoid regression. */
1193 if (compatible[0] != 0) {
1194 if ((strstr(compatible, RELOC("python")) == NULL) &&
1195 (strstr(compatible, RELOC("Speedwagon")) == NULL) &&
1196 (strstr(compatible, RELOC("Winnipeg")) == NULL))
1197 continue;
1198 } else if (model[0] != 0) {
1199 if ((strstr(model, RELOC("ython")) == NULL) &&
1200 (strstr(model, RELOC("peedwagon")) == NULL) &&
1201 (strstr(model, RELOC("innipeg")) == NULL))
1202 continue;
1203 }
1204
1205 if (prom_getprop(node, "tce-table-minalign", &minalign,
1206 sizeof(minalign)) == PROM_ERROR)
1207 minalign = 0;
1208 if (prom_getprop(node, "tce-table-minsize", &minsize,
1209 sizeof(minsize)) == PROM_ERROR)
1210 minsize = 4UL << 20;
1211
1212 /*
1213 * Even though we read what OF wants, we just set the table
1214 * size to 4 MB. This is enough to map 2GB of PCI DMA space.
1215 * By doing this, we avoid the pitfalls of trying to DMA to
1216 * MMIO space and the DMA alias hole.
1217 *
1218 * On POWER4, firmware sets the TCE region by assuming
1219 * each TCE table is 8MB. Using this memory for anything
1220 * else will impact performance, so we always allocate 8MB.
1221 * Anton
1222 */
1223 if (__is_processor(PV_POWER4) || __is_processor(PV_POWER4p))
1224 minsize = 8UL << 20;
1225 else
1226 minsize = 4UL << 20;
1227
1228 /* Align to the greater of the align or size */
1229 align = max(minalign, minsize);
1230 base = alloc_down(minsize, align, 1);
1231 if (base == 0)
1232 prom_panic("ERROR, cannot find space for TCE table.\n");
1233 if (base < local_alloc_bottom)
1234 local_alloc_bottom = base;
1235
9b6b563c
PM
1236 /* It seems OF doesn't null-terminate the path :-( */
1237 memset(path, 0, sizeof(path));
1238 /* Call OF to setup the TCE hardware */
1239 if (call_prom("package-to-path", 3, 1, node,
1240 path, PROM_SCRATCH_SIZE-1) == PROM_ERROR) {
1241 prom_printf("package-to-path failed\n");
1242 }
1243
a23414be
PM
1244 /* Save away the TCE table attributes for later use. */
1245 prom_setprop(node, path, "linux,tce-base", &base, sizeof(base));
1246 prom_setprop(node, path, "linux,tce-size", &minsize, sizeof(minsize));
1247
9b6b563c
PM
1248 prom_debug("TCE table: %s\n", path);
1249 prom_debug("\tnode = 0x%x\n", node);
1250 prom_debug("\tbase = 0x%x\n", base);
1251 prom_debug("\tsize = 0x%x\n", minsize);
1252
1253 /* Initialize the table to have a one-to-one mapping
1254 * over the allocated size.
1255 */
1256 tce_entryp = (unsigned long *)base;
1257 for (i = 0; i < (minsize >> 3) ;tce_entryp++, i++) {
1258 tce_entry = (i << PAGE_SHIFT);
1259 tce_entry |= 0x3;
1260 *tce_entryp = tce_entry;
1261 }
1262
1263 prom_printf("opening PHB %s", path);
1264 phb_node = call_prom("open", 1, 1, path);
1265 if (phb_node == 0)
1266 prom_printf("... failed\n");
1267 else
1268 prom_printf("... done\n");
1269
1270 call_prom("call-method", 6, 0, ADDR("set-64-bit-addressing"),
1271 phb_node, -1, minsize,
1272 (u32) base, (u32) (base >> 32));
1273 call_prom("close", 1, 0, phb_node);
1274 }
1275
1276 reserve_mem(local_alloc_bottom, local_alloc_top - local_alloc_bottom);
1277
2babf5c2
ME
1278 /* These are only really needed if there is a memory limit in
1279 * effect, but we don't know so export them always. */
1280 RELOC(prom_tce_alloc_start) = local_alloc_bottom;
1281 RELOC(prom_tce_alloc_end) = local_alloc_top;
9b6b563c
PM
1282
1283 /* Flag the first invalid entry */
1284 prom_debug("ending prom_initialize_tce_table\n");
1285}
1286#endif
1287
1288/*
1289 * With CHRP SMP we need to use the OF to start the other processors.
1290 * We can't wait until smp_boot_cpus (the OF is trashed by then)
1291 * so we have to put the processors into a holding pattern controlled
1292 * by the kernel (not OF) before we destroy the OF.
1293 *
1294 * This uses a chunk of low memory, puts some holding pattern
1295 * code there and sends the other processors off to there until
1296 * smp_boot_cpus tells them to do something. The holding pattern
1297 * checks that address until its cpu # is there, when it is that
1298 * cpu jumps to __secondary_start(). smp_boot_cpus() takes care
1299 * of setting those values.
1300 *
1301 * We also use physical address 0x4 here to tell when a cpu
1302 * is in its holding pattern code.
1303 *
1304 * -- Cort
1305 */
bbd0abda
PM
1306extern void __secondary_hold(void);
1307extern unsigned long __secondary_hold_spinloop;
1308extern unsigned long __secondary_hold_acknowledge;
1309
1310/*
1311 * We want to reference the copy of __secondary_hold_* in the
1312 * 0 - 0x100 address range
1313 */
1314#define LOW_ADDR(x) (((unsigned long) &(x)) & 0xff)
1315
9b6b563c
PM
1316static void __init prom_hold_cpus(void)
1317{
9b6b563c
PM
1318 unsigned long i;
1319 unsigned int reg;
1320 phandle node;
1321 char type[64];
1322 int cpuid = 0;
1323 unsigned int interrupt_server[MAX_CPU_THREADS];
1324 unsigned int cpu_threads, hw_cpu_num;
1325 int propsize;
bbd0abda 1326 struct prom_t *_prom = &RELOC(prom);
9b6b563c 1327 unsigned long *spinloop
bbd0abda 1328 = (void *) LOW_ADDR(__secondary_hold_spinloop);
9b6b563c 1329 unsigned long *acknowledge
bbd0abda 1330 = (void *) LOW_ADDR(__secondary_hold_acknowledge);
9b6b563c 1331#ifdef CONFIG_PPC64
bbd0abda 1332 /* __secondary_hold is actually a descriptor, not the text address */
9b6b563c
PM
1333 unsigned long secondary_hold
1334 = __pa(*PTRRELOC((unsigned long *)__secondary_hold));
1335#else
bbd0abda 1336 unsigned long secondary_hold = LOW_ADDR(__secondary_hold);
9b6b563c 1337#endif
9b6b563c
PM
1338
1339 prom_debug("prom_hold_cpus: start...\n");
1340 prom_debug(" 1) spinloop = 0x%x\n", (unsigned long)spinloop);
1341 prom_debug(" 1) *spinloop = 0x%x\n", *spinloop);
1342 prom_debug(" 1) acknowledge = 0x%x\n",
1343 (unsigned long)acknowledge);
1344 prom_debug(" 1) *acknowledge = 0x%x\n", *acknowledge);
1345 prom_debug(" 1) secondary_hold = 0x%x\n", secondary_hold);
1346
1347 /* Set the common spinloop variable, so all of the secondary cpus
1348 * will block when they are awakened from their OF spinloop.
1349 * This must occur for both SMP and non SMP kernels, since OF will
1350 * be trashed when we move the kernel.
1351 */
1352 *spinloop = 0;
1353
9b6b563c
PM
1354 /* look for cpus */
1355 for (node = 0; prom_next_node(&node); ) {
1356 type[0] = 0;
1357 prom_getprop(node, "device_type", type, sizeof(type));
1358 if (strcmp(type, RELOC("cpu")) != 0)
1359 continue;
1360
1361 /* Skip non-configured cpus. */
1362 if (prom_getprop(node, "status", type, sizeof(type)) > 0)
1363 if (strcmp(type, RELOC("okay")) != 0)
1364 continue;
1365
1366 reg = -1;
1367 prom_getprop(node, "reg", &reg, sizeof(reg));
1368
1369 prom_debug("\ncpuid = 0x%x\n", cpuid);
1370 prom_debug("cpu hw idx = 0x%x\n", reg);
1371
1372 /* Init the acknowledge var which will be reset by
1373 * the secondary cpu when it awakens from its OF
1374 * spinloop.
1375 */
1376 *acknowledge = (unsigned long)-1;
1377
1378 propsize = prom_getprop(node, "ibm,ppc-interrupt-server#s",
1379 &interrupt_server,
1380 sizeof(interrupt_server));
1381 if (propsize < 0) {
1382 /* no property. old hardware has no SMT */
1383 cpu_threads = 1;
1384 interrupt_server[0] = reg; /* fake it with phys id */
1385 } else {
1386 /* We have a threaded processor */
1387 cpu_threads = propsize / sizeof(u32);
1388 if (cpu_threads > MAX_CPU_THREADS) {
1389 prom_printf("SMT: too many threads!\n"
1390 "SMT: found %x, max is %x\n",
1391 cpu_threads, MAX_CPU_THREADS);
1392 cpu_threads = 1; /* ToDo: panic? */
1393 }
1394 }
1395
1396 hw_cpu_num = interrupt_server[0];
1397 if (hw_cpu_num != _prom->cpu) {
1398 /* Primary Thread of non-boot cpu */
1399 prom_printf("%x : starting cpu hw idx %x... ", cpuid, reg);
1400 call_prom("start-cpu", 3, 0, node,
1401 secondary_hold, reg);
1402
bbd0abda
PM
1403 for (i = 0; (i < 100000000) &&
1404 (*acknowledge == ((unsigned long)-1)); i++ )
9b6b563c
PM
1405 mb();
1406
bbd0abda 1407 if (*acknowledge == reg)
9b6b563c 1408 prom_printf("done\n");
bbd0abda 1409 else
9b6b563c 1410 prom_printf("failed: %x\n", *acknowledge);
9b6b563c
PM
1411 }
1412#ifdef CONFIG_SMP
1413 else
1414 prom_printf("%x : boot cpu %x\n", cpuid, reg);
9b6b563c 1415#endif /* CONFIG_SMP */
bbd0abda
PM
1416
1417 /* Reserve cpu #s for secondary threads. They start later. */
1418 cpuid += cpu_threads;
9b6b563c 1419 }
9b6b563c
PM
1420
1421 if (cpuid > NR_CPUS)
1422 prom_printf("WARNING: maximum CPUs (" __stringify(NR_CPUS)
1423 ") exceeded: ignoring extras\n");
1424
1425 prom_debug("prom_hold_cpus: end...\n");
9b6b563c
PM
1426}
1427
1428
1429static void __init prom_init_client_services(unsigned long pp)
1430{
1431 struct prom_t *_prom = &RELOC(prom);
1432
1433 /* Get a handle to the prom entry point before anything else */
1434 RELOC(prom_entry) = pp;
1435
1436 /* get a handle for the stdout device */
1437 _prom->chosen = call_prom("finddevice", 1, 1, ADDR("/chosen"));
1438 if (!PHANDLE_VALID(_prom->chosen))
1439 prom_panic("cannot find chosen"); /* msg won't be printed :( */
1440
1441 /* get device tree root */
1442 _prom->root = call_prom("finddevice", 1, 1, ADDR("/"));
1443 if (!PHANDLE_VALID(_prom->root))
1444 prom_panic("cannot find device tree root"); /* msg won't be printed :( */
a575b807
PM
1445
1446 _prom->mmumap = 0;
1447}
1448
1449#ifdef CONFIG_PPC32
1450/*
1451 * For really old powermacs, we need to map things we claim.
1452 * For that, we need the ihandle of the mmu.
a23414be 1453 * Also, on the longtrail, we need to work around other bugs.
a575b807
PM
1454 */
1455static void __init prom_find_mmu(void)
1456{
1457 struct prom_t *_prom = &RELOC(prom);
1458 phandle oprom;
1459 char version[64];
1460
1461 oprom = call_prom("finddevice", 1, 1, ADDR("/openprom"));
1462 if (!PHANDLE_VALID(oprom))
1463 return;
1464 if (prom_getprop(oprom, "model", version, sizeof(version)) <= 0)
1465 return;
1466 version[sizeof(version) - 1] = 0;
a575b807 1467 /* XXX might need to add other versions here */
a23414be
PM
1468 if (strcmp(version, "Open Firmware, 1.0.5") == 0)
1469 of_workarounds = OF_WA_CLAIM;
1470 else if (strncmp(version, "FirmWorks,3.", 12) == 0) {
1471 of_workarounds = OF_WA_CLAIM | OF_WA_LONGTRAIL;
1472 call_prom("interpret", 1, 1, "dev /memory 0 to allow-reclaim");
1473 } else
a575b807 1474 return;
a23414be 1475 _prom->memory = call_prom("open", 1, 1, ADDR("/memory"));
a575b807
PM
1476 prom_getprop(_prom->chosen, "mmu", &_prom->mmumap,
1477 sizeof(_prom->mmumap));
a23414be
PM
1478 if (!IHANDLE_VALID(_prom->memory) || !IHANDLE_VALID(_prom->mmumap))
1479 of_workarounds &= ~OF_WA_CLAIM; /* hmmm */
9b6b563c 1480}
a575b807
PM
1481#else
1482#define prom_find_mmu()
1483#endif
9b6b563c
PM
1484
1485static void __init prom_init_stdout(void)
1486{
1487 struct prom_t *_prom = &RELOC(prom);
1488 char *path = RELOC(of_stdout_device);
1489 char type[16];
1490 u32 val;
1491
1492 if (prom_getprop(_prom->chosen, "stdout", &val, sizeof(val)) <= 0)
1493 prom_panic("cannot find stdout");
1494
1495 _prom->stdout = val;
1496
1497 /* Get the full OF pathname of the stdout device */
1498 memset(path, 0, 256);
1499 call_prom("instance-to-path", 3, 1, _prom->stdout, path, 255);
1500 val = call_prom("instance-to-package", 1, 1, _prom->stdout);
a23414be
PM
1501 prom_setprop(_prom->chosen, "/chosen", "linux,stdout-package",
1502 &val, sizeof(val));
9b6b563c 1503 prom_printf("OF stdout device is: %s\n", RELOC(of_stdout_device));
a23414be
PM
1504 prom_setprop(_prom->chosen, "/chosen", "linux,stdout-path",
1505 path, strlen(path) + 1);
9b6b563c
PM
1506
1507 /* If it's a display, note it */
1508 memset(type, 0, sizeof(type));
1509 prom_getprop(val, "device_type", type, sizeof(type));
1510 if (strcmp(type, RELOC("display")) == 0)
a23414be 1511 prom_setprop(val, path, "linux,boot-display", NULL, 0);
9b6b563c
PM
1512}
1513
1514static void __init prom_close_stdin(void)
1515{
1516 struct prom_t *_prom = &RELOC(prom);
1517 ihandle val;
1518
1519 if (prom_getprop(_prom->chosen, "stdin", &val, sizeof(val)) > 0)
1520 call_prom("close", 1, 0, val);
1521}
1522
1523static int __init prom_find_machine_type(void)
1524{
1525 struct prom_t *_prom = &RELOC(prom);
1526 char compat[256];
1527 int len, i = 0;
21fe3301 1528#ifdef CONFIG_PPC64
9b6b563c 1529 phandle rtas;
e8222502 1530 int x;
21fe3301 1531#endif
e8222502
BH
1532
1533 /* Look for a PowerMac */
9b6b563c
PM
1534 len = prom_getprop(_prom->root, "compatible",
1535 compat, sizeof(compat)-1);
1536 if (len > 0) {
1537 compat[len] = 0;
1538 while (i < len) {
1539 char *p = &compat[i];
1540 int sl = strlen(p);
1541 if (sl == 0)
1542 break;
1543 if (strstr(p, RELOC("Power Macintosh")) ||
a575b807 1544 strstr(p, RELOC("MacRISC")))
9b6b563c 1545 return PLATFORM_POWERMAC;
133dda1e
AB
1546#ifdef CONFIG_PPC64
1547 /* We must make sure we don't detect the IBM Cell
1548 * blades as pSeries due to some firmware issues,
1549 * so we do it here.
1550 */
1551 if (strstr(p, RELOC("IBM,CBEA")) ||
1552 strstr(p, RELOC("IBM,CPBW-1.0")))
1553 return PLATFORM_GENERIC;
1554#endif /* CONFIG_PPC64 */
9b6b563c
PM
1555 i += sl + 1;
1556 }
1557 }
1558#ifdef CONFIG_PPC64
e8222502
BH
1559 /* If not a mac, try to figure out if it's an IBM pSeries or any other
1560 * PAPR compliant platform. We assume it is if :
1561 * - /device_type is "chrp" (please, do NOT use that for future
1562 * non-IBM designs !
1563 * - it has /rtas
1564 */
6f806cee 1565 len = prom_getprop(_prom->root, "device_type",
e8222502
BH
1566 compat, sizeof(compat)-1);
1567 if (len <= 0)
1568 return PLATFORM_GENERIC;
cb6b2eb9 1569 if (strcmp(compat, RELOC("chrp")))
e8222502
BH
1570 return PLATFORM_GENERIC;
1571
9b6b563c
PM
1572 /* Default to pSeries. We need to know if we are running LPAR */
1573 rtas = call_prom("finddevice", 1, 1, ADDR("/rtas"));
e8222502
BH
1574 if (!PHANDLE_VALID(rtas))
1575 return PLATFORM_GENERIC;
1576 x = prom_getproplen(rtas, "ibm,hypertas-functions");
1577 if (x != PROM_ERROR) {
1578 prom_printf("Hypertas detected, assuming LPAR !\n");
1579 return PLATFORM_PSERIES_LPAR;
9b6b563c
PM
1580 }
1581 return PLATFORM_PSERIES;
1582#else
e8222502 1583 return PLATFORM_GENERIC;
9b6b563c
PM
1584#endif
1585}
1586
9b6b563c
PM
1587static int __init prom_set_color(ihandle ih, int i, int r, int g, int b)
1588{
1589 return call_prom("call-method", 6, 1, ADDR("color!"), ih, i, b, g, r);
1590}
1591
1592/*
1593 * If we have a display that we don't know how to drive,
1594 * we will want to try to execute OF's open method for it
1595 * later. However, OF will probably fall over if we do that
1596 * we've taken over the MMU.
1597 * So we check whether we will need to open the display,
1598 * and if so, open it now.
1599 */
1600static void __init prom_check_displays(void)
1601{
1602 char type[16], *path;
1603 phandle node;
1604 ihandle ih;
1605 int i;
9b6b563c
PM
1606
1607 static unsigned char default_colors[] = {
1608 0x00, 0x00, 0x00,
1609 0x00, 0x00, 0xaa,
1610 0x00, 0xaa, 0x00,
1611 0x00, 0xaa, 0xaa,
1612 0xaa, 0x00, 0x00,
1613 0xaa, 0x00, 0xaa,
1614 0xaa, 0xaa, 0x00,
1615 0xaa, 0xaa, 0xaa,
1616 0x55, 0x55, 0x55,
1617 0x55, 0x55, 0xff,
1618 0x55, 0xff, 0x55,
1619 0x55, 0xff, 0xff,
1620 0xff, 0x55, 0x55,
1621 0xff, 0x55, 0xff,
1622 0xff, 0xff, 0x55,
1623 0xff, 0xff, 0xff
1624 };
1625 const unsigned char *clut;
1626
1627 prom_printf("Looking for displays\n");
1628 for (node = 0; prom_next_node(&node); ) {
1629 memset(type, 0, sizeof(type));
1630 prom_getprop(node, "device_type", type, sizeof(type));
1631 if (strcmp(type, RELOC("display")) != 0)
1632 continue;
1633
1634 /* It seems OF doesn't null-terminate the path :-( */
1635 path = RELOC(prom_scratch);
1636 memset(path, 0, PROM_SCRATCH_SIZE);
1637
1638 /*
1639 * leave some room at the end of the path for appending extra
1640 * arguments
1641 */
1642 if (call_prom("package-to-path", 3, 1, node, path,
1643 PROM_SCRATCH_SIZE-10) == PROM_ERROR)
1644 continue;
1645 prom_printf("found display : %s, opening ... ", path);
1646
1647 ih = call_prom("open", 1, 1, path);
1648 if (ih == 0) {
1649 prom_printf("failed\n");
1650 continue;
1651 }
1652
1653 /* Success */
1654 prom_printf("done\n");
a23414be 1655 prom_setprop(node, path, "linux,opened", NULL, 0);
9b6b563c
PM
1656
1657 /* Setup a usable color table when the appropriate
1658 * method is available. Should update this to set-colors */
1659 clut = RELOC(default_colors);
1660 for (i = 0; i < 32; i++, clut += 3)
1661 if (prom_set_color(ih, i, clut[0], clut[1],
1662 clut[2]) != 0)
1663 break;
1664
1665#ifdef CONFIG_LOGO_LINUX_CLUT224
1666 clut = PTRRELOC(RELOC(logo_linux_clut224.clut));
1667 for (i = 0; i < RELOC(logo_linux_clut224.clutsize); i++, clut += 3)
1668 if (prom_set_color(ih, i + 32, clut[0], clut[1],
1669 clut[2]) != 0)
1670 break;
1671#endif /* CONFIG_LOGO_LINUX_CLUT224 */
9b6b563c
PM
1672 }
1673}
1674
1675
1676/* Return (relocated) pointer to this much memory: moves initrd if reqd. */
1677static void __init *make_room(unsigned long *mem_start, unsigned long *mem_end,
1678 unsigned long needed, unsigned long align)
1679{
1680 void *ret;
1681
1682 *mem_start = _ALIGN(*mem_start, align);
1683 while ((*mem_start + needed) > *mem_end) {
1684 unsigned long room, chunk;
1685
1686 prom_debug("Chunk exhausted, claiming more at %x...\n",
1687 RELOC(alloc_bottom));
1688 room = RELOC(alloc_top) - RELOC(alloc_bottom);
1689 if (room > DEVTREE_CHUNK_SIZE)
1690 room = DEVTREE_CHUNK_SIZE;
1691 if (room < PAGE_SIZE)
1692 prom_panic("No memory for flatten_device_tree (no room)");
1693 chunk = alloc_up(room, 0);
1694 if (chunk == 0)
1695 prom_panic("No memory for flatten_device_tree (claim failed)");
1696 *mem_end = RELOC(alloc_top);
1697 }
1698
1699 ret = (void *)*mem_start;
1700 *mem_start += needed;
1701
1702 return ret;
1703}
1704
1705#define dt_push_token(token, mem_start, mem_end) \
1706 do { *((u32 *)make_room(mem_start, mem_end, 4, 4)) = token; } while(0)
1707
1708static unsigned long __init dt_find_string(char *str)
1709{
1710 char *s, *os;
1711
1712 s = os = (char *)RELOC(dt_string_start);
1713 s += 4;
1714 while (s < (char *)RELOC(dt_string_end)) {
1715 if (strcmp(s, str) == 0)
1716 return s - os;
1717 s += strlen(s) + 1;
1718 }
1719 return 0;
1720}
1721
1722/*
1723 * The Open Firmware 1275 specification states properties must be 31 bytes or
1724 * less, however not all firmwares obey this. Make it 64 bytes to be safe.
1725 */
1726#define MAX_PROPERTY_NAME 64
1727
1728static void __init scan_dt_build_strings(phandle node,
1729 unsigned long *mem_start,
1730 unsigned long *mem_end)
1731{
1732 char *prev_name, *namep, *sstart;
1733 unsigned long soff;
1734 phandle child;
1735
1736 sstart = (char *)RELOC(dt_string_start);
1737
1738 /* get and store all property names */
1739 prev_name = RELOC("");
1740 for (;;) {
1741 /* 64 is max len of name including nul. */
1742 namep = make_room(mem_start, mem_end, MAX_PROPERTY_NAME, 1);
1743 if (call_prom("nextprop", 3, 1, node, prev_name, namep) != 1) {
1744 /* No more nodes: unwind alloc */
1745 *mem_start = (unsigned long)namep;
1746 break;
1747 }
1748
1749 /* skip "name" */
1750 if (strcmp(namep, RELOC("name")) == 0) {
1751 *mem_start = (unsigned long)namep;
1752 prev_name = RELOC("name");
1753 continue;
1754 }
1755 /* get/create string entry */
1756 soff = dt_find_string(namep);
1757 if (soff != 0) {
1758 *mem_start = (unsigned long)namep;
1759 namep = sstart + soff;
1760 } else {
1761 /* Trim off some if we can */
1762 *mem_start = (unsigned long)namep + strlen(namep) + 1;
1763 RELOC(dt_string_end) = *mem_start;
1764 }
1765 prev_name = namep;
1766 }
1767
1768 /* do all our children */
1769 child = call_prom("child", 1, 1, node);
1770 while (child != 0) {
1771 scan_dt_build_strings(child, mem_start, mem_end);
1772 child = call_prom("peer", 1, 1, child);
1773 }
1774}
1775
1776static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
1777 unsigned long *mem_end)
1778{
1779 phandle child;
1780 char *namep, *prev_name, *sstart, *p, *ep, *lp, *path;
1781 unsigned long soff;
1782 unsigned char *valp;
1783 static char pname[MAX_PROPERTY_NAME];
c4988820 1784 int l, room;
9b6b563c
PM
1785
1786 dt_push_token(OF_DT_BEGIN_NODE, mem_start, mem_end);
1787
1788 /* get the node's full name */
1789 namep = (char *)*mem_start;
c4988820
PM
1790 room = *mem_end - *mem_start;
1791 if (room > 255)
1792 room = 255;
1793 l = call_prom("package-to-path", 3, 1, node, namep, room);
9b6b563c
PM
1794 if (l >= 0) {
1795 /* Didn't fit? Get more room. */
c4988820
PM
1796 if (l >= room) {
1797 if (l >= *mem_end - *mem_start)
1798 namep = make_room(mem_start, mem_end, l+1, 1);
9b6b563c
PM
1799 call_prom("package-to-path", 3, 1, node, namep, l);
1800 }
1801 namep[l] = '\0';
1802
1803 /* Fixup an Apple bug where they have bogus \0 chars in the
a575b807
PM
1804 * middle of the path in some properties, and extract
1805 * the unit name (everything after the last '/').
9b6b563c 1806 */
a575b807 1807 for (lp = p = namep, ep = namep + l; p < ep; p++) {
9b6b563c 1808 if (*p == '/')
a575b807
PM
1809 lp = namep;
1810 else if (*p != 0)
1811 *lp++ = *p;
1812 }
1813 *lp = 0;
1814 *mem_start = _ALIGN((unsigned long)lp + 1, 4);
9b6b563c
PM
1815 }
1816
1817 /* get it again for debugging */
1818 path = RELOC(prom_scratch);
1819 memset(path, 0, PROM_SCRATCH_SIZE);
1820 call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1);
1821
1822 /* get and store all properties */
1823 prev_name = RELOC("");
1824 sstart = (char *)RELOC(dt_string_start);
1825 for (;;) {
1826 if (call_prom("nextprop", 3, 1, node, prev_name,
1827 RELOC(pname)) != 1)
1828 break;
1829
1830 /* skip "name" */
1831 if (strcmp(RELOC(pname), RELOC("name")) == 0) {
1832 prev_name = RELOC("name");
1833 continue;
1834 }
1835
1836 /* find string offset */
1837 soff = dt_find_string(RELOC(pname));
1838 if (soff == 0) {
1839 prom_printf("WARNING: Can't find string index for"
1840 " <%s>, node %s\n", RELOC(pname), path);
1841 break;
1842 }
1843 prev_name = sstart + soff;
1844
1845 /* get length */
1846 l = call_prom("getproplen", 2, 1, node, RELOC(pname));
1847
1848 /* sanity checks */
1849 if (l == PROM_ERROR)
1850 continue;
1851 if (l > MAX_PROPERTY_LENGTH) {
1852 prom_printf("WARNING: ignoring large property ");
1853 /* It seems OF doesn't null-terminate the path :-( */
1854 prom_printf("[%s] ", path);
1855 prom_printf("%s length 0x%x\n", RELOC(pname), l);
1856 continue;
1857 }
1858
1859 /* push property head */
1860 dt_push_token(OF_DT_PROP, mem_start, mem_end);
1861 dt_push_token(l, mem_start, mem_end);
1862 dt_push_token(soff, mem_start, mem_end);
1863
1864 /* push property content */
1865 valp = make_room(mem_start, mem_end, l, 4);
1866 call_prom("getprop", 4, 1, node, RELOC(pname), valp, l);
1867 *mem_start = _ALIGN(*mem_start, 4);
1868 }
1869
1870 /* Add a "linux,phandle" property. */
1871 soff = dt_find_string(RELOC("linux,phandle"));
1872 if (soff == 0)
1873 prom_printf("WARNING: Can't find string index for"
1874 " <linux-phandle> node %s\n", path);
1875 else {
1876 dt_push_token(OF_DT_PROP, mem_start, mem_end);
1877 dt_push_token(4, mem_start, mem_end);
1878 dt_push_token(soff, mem_start, mem_end);
1879 valp = make_room(mem_start, mem_end, 4, 4);
1880 *(u32 *)valp = node;
1881 }
1882
1883 /* do all our children */
1884 child = call_prom("child", 1, 1, node);
1885 while (child != 0) {
1886 scan_dt_build_struct(child, mem_start, mem_end);
1887 child = call_prom("peer", 1, 1, child);
1888 }
1889
1890 dt_push_token(OF_DT_END_NODE, mem_start, mem_end);
1891}
1892
1893static void __init flatten_device_tree(void)
1894{
1895 phandle root;
1896 unsigned long mem_start, mem_end, room;
1897 struct boot_param_header *hdr;
1898 struct prom_t *_prom = &RELOC(prom);
1899 char *namep;
1900 u64 *rsvmap;
1901
1902 /*
1903 * Check how much room we have between alloc top & bottom (+/- a
1904 * few pages), crop to 4Mb, as this is our "chuck" size
1905 */
1906 room = RELOC(alloc_top) - RELOC(alloc_bottom) - 0x4000;
1907 if (room > DEVTREE_CHUNK_SIZE)
1908 room = DEVTREE_CHUNK_SIZE;
1909 prom_debug("starting device tree allocs at %x\n", RELOC(alloc_bottom));
1910
1911 /* Now try to claim that */
1912 mem_start = (unsigned long)alloc_up(room, PAGE_SIZE);
1913 if (mem_start == 0)
1914 prom_panic("Can't allocate initial device-tree chunk\n");
1915 mem_end = RELOC(alloc_top);
1916
1917 /* Get root of tree */
1918 root = call_prom("peer", 1, 1, (phandle)0);
1919 if (root == (phandle)0)
1920 prom_panic ("couldn't get device tree root\n");
1921
1922 /* Build header and make room for mem rsv map */
1923 mem_start = _ALIGN(mem_start, 4);
1924 hdr = make_room(&mem_start, &mem_end,
1925 sizeof(struct boot_param_header), 4);
1926 RELOC(dt_header_start) = (unsigned long)hdr;
1927 rsvmap = make_room(&mem_start, &mem_end, sizeof(mem_reserve_map), 8);
1928
1929 /* Start of strings */
1930 mem_start = PAGE_ALIGN(mem_start);
1931 RELOC(dt_string_start) = mem_start;
1932 mem_start += 4; /* hole */
1933
1934 /* Add "linux,phandle" in there, we'll need it */
1935 namep = make_room(&mem_start, &mem_end, 16, 1);
1936 strcpy(namep, RELOC("linux,phandle"));
1937 mem_start = (unsigned long)namep + strlen(namep) + 1;
1938
1939 /* Build string array */
1940 prom_printf("Building dt strings...\n");
1941 scan_dt_build_strings(root, &mem_start, &mem_end);
1942 RELOC(dt_string_end) = mem_start;
1943
1944 /* Build structure */
1945 mem_start = PAGE_ALIGN(mem_start);
1946 RELOC(dt_struct_start) = mem_start;
1947 prom_printf("Building dt structure...\n");
1948 scan_dt_build_struct(root, &mem_start, &mem_end);
1949 dt_push_token(OF_DT_END, &mem_start, &mem_end);
1950 RELOC(dt_struct_end) = PAGE_ALIGN(mem_start);
1951
1952 /* Finish header */
1953 hdr->boot_cpuid_phys = _prom->cpu;
1954 hdr->magic = OF_DT_HEADER;
1955 hdr->totalsize = RELOC(dt_struct_end) - RELOC(dt_header_start);
1956 hdr->off_dt_struct = RELOC(dt_struct_start) - RELOC(dt_header_start);
1957 hdr->off_dt_strings = RELOC(dt_string_start) - RELOC(dt_header_start);
1958 hdr->dt_strings_size = RELOC(dt_string_end) - RELOC(dt_string_start);
1959 hdr->off_mem_rsvmap = ((unsigned long)rsvmap) - RELOC(dt_header_start);
1960 hdr->version = OF_DT_VERSION;
1961 /* Version 16 is not backward compatible */
1962 hdr->last_comp_version = 0x10;
1963
4d1f3f25 1964 /* Copy the reserve map in */
9b6b563c
PM
1965 memcpy(rsvmap, RELOC(mem_reserve_map), sizeof(mem_reserve_map));
1966
1967#ifdef DEBUG_PROM
1968 {
1969 int i;
1970 prom_printf("reserved memory map:\n");
1971 for (i = 0; i < RELOC(mem_reserve_cnt); i++)
1972 prom_printf(" %x - %x\n",
1973 RELOC(mem_reserve_map)[i].base,
1974 RELOC(mem_reserve_map)[i].size);
1975 }
1976#endif
4d1f3f25
JX
1977 /* Bump mem_reserve_cnt to cause further reservations to fail
1978 * since it's too late.
1979 */
9b6b563c
PM
1980 RELOC(mem_reserve_cnt) = MEM_RESERVE_MAP_SIZE;
1981
1982 prom_printf("Device tree strings 0x%x -> 0x%x\n",
1983 RELOC(dt_string_start), RELOC(dt_string_end));
1984 prom_printf("Device tree struct 0x%x -> 0x%x\n",
1985 RELOC(dt_struct_start), RELOC(dt_struct_end));
1986
1987}
1988
54f4ee18
HB
1989#ifdef CONFIG_PPC_MAPLE
1990/* PIBS Version 1.05.0000 04/26/2005 has an incorrect /ht/isa/ranges property.
1991 * The values are bad, and it doesn't even have the right number of cells. */
1992static void __init fixup_device_tree_maple(void)
9b6b563c 1993{
54f4ee18 1994 phandle isa;
980a6513 1995 u32 rloc = 0x01002000; /* IO space; PCI device = 4 */
54f4ee18 1996 u32 isa_ranges[6];
980a6513
BH
1997 char *name;
1998
1999 name = "/ht@0/isa@4";
2000 isa = call_prom("finddevice", 1, 1, ADDR(name));
2001 if (!PHANDLE_VALID(isa)) {
2002 name = "/ht@0/isa@6";
2003 isa = call_prom("finddevice", 1, 1, ADDR(name));
2004 rloc = 0x01003000; /* IO space; PCI device = 6 */
2005 }
54f4ee18
HB
2006 if (!PHANDLE_VALID(isa))
2007 return;
2008
980a6513
BH
2009 if (prom_getproplen(isa, "ranges") != 12)
2010 return;
54f4ee18
HB
2011 if (prom_getprop(isa, "ranges", isa_ranges, sizeof(isa_ranges))
2012 == PROM_ERROR)
2013 return;
2014
2015 if (isa_ranges[0] != 0x1 ||
2016 isa_ranges[1] != 0xf4000000 ||
2017 isa_ranges[2] != 0x00010000)
2018 return;
2019
980a6513 2020 prom_printf("Fixing up bogus ISA range on Maple/Apache...\n");
54f4ee18
HB
2021
2022 isa_ranges[0] = 0x1;
2023 isa_ranges[1] = 0x0;
980a6513 2024 isa_ranges[2] = rloc;
54f4ee18
HB
2025 isa_ranges[3] = 0x0;
2026 isa_ranges[4] = 0x0;
2027 isa_ranges[5] = 0x00010000;
980a6513 2028 prom_setprop(isa, name, "ranges",
54f4ee18
HB
2029 isa_ranges, sizeof(isa_ranges));
2030}
2031#else
2032#define fixup_device_tree_maple()
2033#endif
2034
e8c0acf9 2035#ifdef CONFIG_PPC_CHRP
26c5032e 2036/* Pegasos and BriQ lacks the "ranges" property in the isa node */
e8c0acf9
BH
2037static void __init fixup_device_tree_chrp(void)
2038{
2039 phandle isa;
2040 u32 isa_ranges[6];
26c5032e 2041 u32 rloc = 0x01006000; /* IO space; PCI device = 12 */
e8c0acf9
BH
2042 char *name;
2043 int rc;
2044
2045 name = "/pci@80000000/isa@c";
2046 isa = call_prom("finddevice", 1, 1, ADDR(name));
26c5032e
BH
2047 if (!PHANDLE_VALID(isa)) {
2048 name = "/pci@ff500000/isa@6";
2049 isa = call_prom("finddevice", 1, 1, ADDR(name));
2050 rloc = 0x01003000; /* IO space; PCI device = 6 */
2051 }
e8c0acf9
BH
2052 if (!PHANDLE_VALID(isa))
2053 return;
2054
2055 rc = prom_getproplen(isa, "ranges");
2056 if (rc != 0 && rc != PROM_ERROR)
2057 return;
2058
2059 prom_printf("Fixing up missing ISA range on Pegasos...\n");
2060
2061 isa_ranges[0] = 0x1;
2062 isa_ranges[1] = 0x0;
26c5032e 2063 isa_ranges[2] = rloc;
e8c0acf9
BH
2064 isa_ranges[3] = 0x0;
2065 isa_ranges[4] = 0x0;
2066 isa_ranges[5] = 0x00010000;
2067 prom_setprop(isa, name, "ranges",
2068 isa_ranges, sizeof(isa_ranges));
2069}
2070#else
2071#define fixup_device_tree_chrp()
2072#endif
2073
9b6b563c 2074#if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC)
54f4ee18
HB
2075static void __init fixup_device_tree_pmac(void)
2076{
9b6b563c
PM
2077 phandle u3, i2c, mpic;
2078 u32 u3_rev;
2079 u32 interrupts[2];
2080 u32 parent;
2081
2082 /* Some G5s have a missing interrupt definition, fix it up here */
2083 u3 = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000"));
2084 if (!PHANDLE_VALID(u3))
2085 return;
2086 i2c = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/i2c@f8001000"));
2087 if (!PHANDLE_VALID(i2c))
2088 return;
2089 mpic = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/mpic@f8040000"));
2090 if (!PHANDLE_VALID(mpic))
2091 return;
2092
2093 /* check if proper rev of u3 */
2094 if (prom_getprop(u3, "device-rev", &u3_rev, sizeof(u3_rev))
2095 == PROM_ERROR)
2096 return;
7d49697e 2097 if (u3_rev < 0x35 || u3_rev > 0x39)
9b6b563c
PM
2098 return;
2099 /* does it need fixup ? */
2100 if (prom_getproplen(i2c, "interrupts") > 0)
2101 return;
2102
2103 prom_printf("fixing up bogus interrupts for u3 i2c...\n");
2104
2105 /* interrupt on this revision of u3 is number 0 and level */
2106 interrupts[0] = 0;
2107 interrupts[1] = 1;
a23414be
PM
2108 prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupts",
2109 &interrupts, sizeof(interrupts));
9b6b563c 2110 parent = (u32)mpic;
a23414be
PM
2111 prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupt-parent",
2112 &parent, sizeof(parent));
9b6b563c 2113}
54f4ee18
HB
2114#else
2115#define fixup_device_tree_pmac()
2116#endif
9b6b563c 2117
54f4ee18
HB
2118static void __init fixup_device_tree(void)
2119{
2120 fixup_device_tree_maple();
e8c0acf9 2121 fixup_device_tree_chrp();
54f4ee18
HB
2122 fixup_device_tree_pmac();
2123}
9b6b563c
PM
2124
2125static void __init prom_find_boot_cpu(void)
2126{
2127 struct prom_t *_prom = &RELOC(prom);
2128 u32 getprop_rval;
2129 ihandle prom_cpu;
2130 phandle cpu_pkg;
2131
a575b807 2132 _prom->cpu = 0;
9b6b563c 2133 if (prom_getprop(_prom->chosen, "cpu", &prom_cpu, sizeof(prom_cpu)) <= 0)
a575b807 2134 return;
9b6b563c
PM
2135
2136 cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu);
2137
2138 prom_getprop(cpu_pkg, "reg", &getprop_rval, sizeof(getprop_rval));
2139 _prom->cpu = getprop_rval;
2140
2141 prom_debug("Booting CPU hw index = 0x%x\n", _prom->cpu);
2142}
2143
2144static void __init prom_check_initrd(unsigned long r3, unsigned long r4)
2145{
2146#ifdef CONFIG_BLK_DEV_INITRD
2147 struct prom_t *_prom = &RELOC(prom);
2148
2149 if (r3 && r4 && r4 != 0xdeadbeef) {
2150 unsigned long val;
2151
51fae6de 2152 RELOC(prom_initrd_start) = is_kernel_addr(r3) ? __pa(r3) : r3;
9b6b563c
PM
2153 RELOC(prom_initrd_end) = RELOC(prom_initrd_start) + r4;
2154
2155 val = RELOC(prom_initrd_start);
a23414be
PM
2156 prom_setprop(_prom->chosen, "/chosen", "linux,initrd-start",
2157 &val, sizeof(val));
9b6b563c 2158 val = RELOC(prom_initrd_end);
a23414be
PM
2159 prom_setprop(_prom->chosen, "/chosen", "linux,initrd-end",
2160 &val, sizeof(val));
9b6b563c
PM
2161
2162 reserve_mem(RELOC(prom_initrd_start),
2163 RELOC(prom_initrd_end) - RELOC(prom_initrd_start));
2164
2165 prom_debug("initrd_start=0x%x\n", RELOC(prom_initrd_start));
2166 prom_debug("initrd_end=0x%x\n", RELOC(prom_initrd_end));
2167 }
2168#endif /* CONFIG_BLK_DEV_INITRD */
2169}
2170
2171/*
2172 * We enter here early on, when the Open Firmware prom is still
2173 * handling exceptions and the MMU hash table for us.
2174 */
2175
2176unsigned long __init prom_init(unsigned long r3, unsigned long r4,
2177 unsigned long pp,
2178 unsigned long r6, unsigned long r7)
2179{
2180 struct prom_t *_prom;
9b6b563c 2181 unsigned long hdr;
b42b6617 2182 unsigned long offset = reloc_offset();
9b6b563c
PM
2183
2184#ifdef CONFIG_PPC32
9b6b563c
PM
2185 reloc_got2(offset);
2186#endif
2187
2188 _prom = &RELOC(prom);
2189
2190 /*
2191 * First zero the BSS
2192 */
2193 memset(&RELOC(__bss_start), 0, __bss_stop - __bss_start);
2194
2195 /*
2196 * Init interface to Open Firmware, get some node references,
2197 * like /chosen
2198 */
2199 prom_init_client_services(pp);
2200
2201 /*
a23414be
PM
2202 * See if this OF is old enough that we need to do explicit maps
2203 * and other workarounds
9b6b563c 2204 */
a23414be 2205 prom_find_mmu();
9b6b563c 2206
a575b807 2207 /*
a23414be 2208 * Init prom stdout device
a575b807 2209 */
a23414be 2210 prom_init_stdout();
a575b807 2211
9b6b563c
PM
2212 /*
2213 * Get default machine type. At this point, we do not differentiate
2214 * between pSeries SMP and pSeries LPAR
2215 */
2216 RELOC(of_platform) = prom_find_machine_type();
9b6b563c 2217
add60ef3
OH
2218 /* Bail if this is a kdump kernel. */
2219 if (PHYSICAL_START > 0)
2220 prom_panic("Error: You can't boot a kdump kernel from OF!\n");
2221
2222 /*
2223 * Check for an initrd
2224 */
2225 prom_check_initrd(r3, r4);
2226
9b6b563c
PM
2227#ifdef CONFIG_PPC_PSERIES
2228 /*
2229 * On pSeries, inform the firmware about our capabilities
2230 */
799d6046
PM
2231 if (RELOC(of_platform) == PLATFORM_PSERIES ||
2232 RELOC(of_platform) == PLATFORM_PSERIES_LPAR)
9b6b563c
PM
2233 prom_send_capabilities();
2234#endif
2235
9b6b563c 2236 /*
f3f66f59 2237 * Copy the CPU hold code
9b6b563c 2238 */
55d36339 2239 if (RELOC(of_platform) != PLATFORM_POWERMAC)
5a408329 2240 copy_and_flush(0, KERNELBASE + offset, 0x100, 0);
9b6b563c
PM
2241
2242 /*
2243 * Do early parsing of command line
2244 */
2245 early_cmdline_parse();
2246
2247 /*
2248 * Initialize memory management within prom_init
2249 */
2250 prom_init_mem();
2251
2252 /*
2253 * Determine which cpu is actually running right _now_
2254 */
2255 prom_find_boot_cpu();
2256
2257 /*
2258 * Initialize display devices
2259 */
2260 prom_check_displays();
2261
2262#ifdef CONFIG_PPC64
2263 /*
2264 * Initialize IOMMU (TCE tables) on pSeries. Do that before anything else
2265 * that uses the allocator, we need to make sure we get the top of memory
2266 * available for us here...
2267 */
2268 if (RELOC(of_platform) == PLATFORM_PSERIES)
2269 prom_initialize_tce_table();
2270#endif
2271
2272 /*
2273 * On non-powermacs, try to instantiate RTAS and puts all CPUs
2274 * in spin-loops. PowerMacs don't have a working RTAS and use
2275 * a different way to spin CPUs
2276 */
2277 if (RELOC(of_platform) != PLATFORM_POWERMAC) {
2278 prom_instantiate_rtas();
2279 prom_hold_cpus();
2280 }
2281
2282 /*
2283 * Fill in some infos for use by the kernel later on
2284 */
9b6b563c
PM
2285#ifdef CONFIG_PPC64
2286 if (RELOC(ppc64_iommu_off))
a23414be
PM
2287 prom_setprop(_prom->chosen, "/chosen", "linux,iommu-off",
2288 NULL, 0);
9b6b563c
PM
2289
2290 if (RELOC(iommu_force_on))
a23414be
PM
2291 prom_setprop(_prom->chosen, "/chosen", "linux,iommu-force-on",
2292 NULL, 0);
9b6b563c
PM
2293
2294 if (RELOC(prom_tce_alloc_start)) {
a23414be 2295 prom_setprop(_prom->chosen, "/chosen", "linux,tce-alloc-start",
9b6b563c
PM
2296 &RELOC(prom_tce_alloc_start),
2297 sizeof(prom_tce_alloc_start));
a23414be 2298 prom_setprop(_prom->chosen, "/chosen", "linux,tce-alloc-end",
9b6b563c
PM
2299 &RELOC(prom_tce_alloc_end),
2300 sizeof(prom_tce_alloc_end));
2301 }
2302#endif
2303
2304 /*
2305 * Fixup any known bugs in the device-tree
2306 */
2307 fixup_device_tree();
2308
2309 /*
2310 * Now finally create the flattened device-tree
2311 */
2312 prom_printf("copying OF device tree ...\n");
2313 flatten_device_tree();
2314
3825ac0e
PM
2315 /*
2316 * in case stdin is USB and still active on IBM machines...
2317 * Unfortunately quiesce crashes on some powermacs if we have
2318 * closed stdin already (in particular the powerbook 101).
2319 */
2320 if (RELOC(of_platform) != PLATFORM_POWERMAC)
2321 prom_close_stdin();
9b6b563c
PM
2322
2323 /*
2324 * Call OF "quiesce" method to shut down pending DMA's from
2325 * devices etc...
2326 */
2327 prom_printf("Calling quiesce ...\n");
2328 call_prom("quiesce", 0, 0);
2329
2330 /*
2331 * And finally, call the kernel passing it the flattened device
2332 * tree and NULL as r5, thus triggering the new entry point which
2333 * is common to us and kexec
2334 */
2335 hdr = RELOC(dt_header_start);
2336 prom_printf("returning from prom_init\n");
2337 prom_debug("->dt_header_start=0x%x\n", hdr);
2338
2339#ifdef CONFIG_PPC32
2340 reloc_got2(-offset);
2341#endif
2342
35499c01 2343 __start(hdr, KERNELBASE + offset, 0);
9b6b563c
PM
2344
2345 return 0;
2346}