Merge remote-tracking branches 'asoc/topic/fsl-spdif', 'asoc/topic/hdmi', 'asoc/topic...
[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>
9b6b563c
PM
38#include <asm/mmu.h>
39#include <asm/pgtable.h>
9b6b563c 40#include <asm/iommu.h>
9b6b563c
PM
41#include <asm/btext.h>
42#include <asm/sections.h>
43#include <asm/machdep.h>
27f44888 44#include <asm/opal.h>
9b6b563c 45
9b6b563c 46#include <linux/linux_logo.h>
9b6b563c 47
9b6b563c
PM
48/*
49 * Eventually bump that one up
50 */
51#define DEVTREE_CHUNK_SIZE 0x100000
52
53/*
54 * This is the size of the local memory reserve map that gets copied
55 * into the boot params passed to the kernel. That size is totally
56 * flexible as the kernel just reads the list until it encounters an
57 * entry with size 0, so it can be changed without breaking binary
58 * compatibility
59 */
60#define MEM_RESERVE_MAP_SIZE 8
61
62/*
63 * prom_init() is called very early on, before the kernel text
64 * and data have been mapped to KERNELBASE. At this point the code
65 * is running at whatever address it has been loaded at.
66 * On ppc32 we compile with -mrelocatable, which means that references
67 * to extern and static variables get relocated automatically.
5ac47f7a
AB
68 * ppc64 objects are always relocatable, we just need to relocate the
69 * TOC.
9b6b563c
PM
70 *
71 * Because OF may have mapped I/O devices into the area starting at
72 * KERNELBASE, particularly on CHRP machines, we can't safely call
73 * OF once the kernel has been mapped to KERNELBASE. Therefore all
74 * OF calls must be done within prom_init().
75 *
76 * ADDR is used in calls to call_prom. The 4th and following
77 * arguments to call_prom should be 32-bit values.
78 * On ppc64, 64 bit values are truncated to 32 bits (and
79 * fortunately don't get interpreted as two arguments).
80 */
5ac47f7a
AB
81#define ADDR(x) (u32)(unsigned long)(x)
82
9b6b563c 83#ifdef CONFIG_PPC64
a23414be 84#define OF_WORKAROUNDS 0
9b6b563c 85#else
a23414be
PM
86#define OF_WORKAROUNDS of_workarounds
87int of_workarounds;
9b6b563c
PM
88#endif
89
a23414be
PM
90#define OF_WA_CLAIM 1 /* do phys/virt claim separately, then map */
91#define OF_WA_LONGTRAIL 2 /* work around longtrail bugs */
92
9b6b563c
PM
93#define PROM_BUG() do { \
94 prom_printf("kernel BUG at %s line 0x%x!\n", \
5827d416 95 __FILE__, __LINE__); \
9b6b563c
PM
96 __asm__ __volatile__(".long " BUG_ILLEGAL_INSTR); \
97} while (0)
98
99#ifdef DEBUG_PROM
100#define prom_debug(x...) prom_printf(x)
101#else
102#define prom_debug(x...)
103#endif
104
9b6b563c
PM
105
106typedef u32 prom_arg_t;
107
108struct prom_args {
493adffc
BH
109 __be32 service;
110 __be32 nargs;
111 __be32 nret;
112 __be32 args[10];
9b6b563c
PM
113};
114
115struct prom_t {
116 ihandle root;
a23414be 117 phandle chosen;
9b6b563c
PM
118 int cpu;
119 ihandle stdout;
a575b807 120 ihandle mmumap;
a23414be 121 ihandle memory;
9b6b563c
PM
122};
123
124struct mem_map_entry {
493adffc
BH
125 __be64 base;
126 __be64 size;
9b6b563c
PM
127};
128
493adffc 129typedef __be32 cell_t;
9b6b563c 130
6e35d5da
BH
131extern void __start(unsigned long r3, unsigned long r4, unsigned long r5,
132 unsigned long r6, unsigned long r7, unsigned long r8,
133 unsigned long r9);
9b6b563c
PM
134
135#ifdef CONFIG_PPC64
c4988820 136extern int enter_prom(struct prom_args *args, unsigned long entry);
9b6b563c 137#else
c4988820 138static inline int enter_prom(struct prom_args *args, unsigned long entry)
9b6b563c 139{
c4988820 140 return ((int (*)(struct prom_args *))entry)(args);
9b6b563c
PM
141}
142#endif
143
144extern void copy_and_flush(unsigned long dest, unsigned long src,
145 unsigned long size, unsigned long offset);
146
147/* prom structure */
148static struct prom_t __initdata prom;
149
150static unsigned long prom_entry __initdata;
151
152#define PROM_SCRATCH_SIZE 256
153
154static char __initdata of_stdout_device[256];
155static char __initdata prom_scratch[PROM_SCRATCH_SIZE];
156
157static unsigned long __initdata dt_header_start;
158static unsigned long __initdata dt_struct_start, dt_struct_end;
159static unsigned long __initdata dt_string_start, dt_string_end;
160
161static unsigned long __initdata prom_initrd_start, prom_initrd_end;
162
163#ifdef CONFIG_PPC64
165785e5
JK
164static int __initdata prom_iommu_force_on;
165static int __initdata prom_iommu_off;
9b6b563c
PM
166static unsigned long __initdata prom_tce_alloc_start;
167static unsigned long __initdata prom_tce_alloc_end;
168#endif
169
e8222502
BH
170/* Platforms codes are now obsolete in the kernel. Now only used within this
171 * file and ultimately gone too. Feel free to change them if you need, they
172 * are not shared with anything outside of this file anymore
173 */
174#define PLATFORM_PSERIES 0x0100
175#define PLATFORM_PSERIES_LPAR 0x0101
176#define PLATFORM_LPAR 0x0001
177#define PLATFORM_POWERMAC 0x0400
178#define PLATFORM_GENERIC 0x0500
27f44888 179#define PLATFORM_OPAL 0x0600
e8222502 180
9b6b563c
PM
181static int __initdata of_platform;
182
183static char __initdata prom_cmd_line[COMMAND_LINE_SIZE];
184
cf68787b
BK
185static unsigned long __initdata prom_memory_limit;
186
9b6b563c
PM
187static unsigned long __initdata alloc_top;
188static unsigned long __initdata alloc_top_high;
189static unsigned long __initdata alloc_bottom;
190static unsigned long __initdata rmo_top;
191static unsigned long __initdata ram_top;
192
193static struct mem_map_entry __initdata mem_reserve_map[MEM_RESERVE_MAP_SIZE];
194static int __initdata mem_reserve_cnt;
195
196static cell_t __initdata regbuf[1024];
197
dbe78b40
BH
198static bool rtas_has_query_cpu_stopped;
199
9b6b563c 200
9b6b563c
PM
201/*
202 * Error results ... some OF calls will return "-1" on error, some
203 * will return 0, some will return either. To simplify, here are
204 * macros to use with any ihandle or phandle return value to check if
205 * it is valid
206 */
207
208#define PROM_ERROR (-1u)
209#define PHANDLE_VALID(p) ((p) != 0 && (p) != PROM_ERROR)
210#define IHANDLE_VALID(i) ((i) != 0 && (i) != PROM_ERROR)
211
212
213/* This is the one and *ONLY* place where we actually call open
214 * firmware.
215 */
216
217static int __init call_prom(const char *service, int nargs, int nret, ...)
218{
219 int i;
220 struct prom_args args;
221 va_list list;
222
493adffc
BH
223 args.service = cpu_to_be32(ADDR(service));
224 args.nargs = cpu_to_be32(nargs);
225 args.nret = cpu_to_be32(nret);
9b6b563c
PM
226
227 va_start(list, nret);
228 for (i = 0; i < nargs; i++)
493adffc 229 args.args[i] = cpu_to_be32(va_arg(list, prom_arg_t));
9b6b563c
PM
230 va_end(list);
231
232 for (i = 0; i < nret; i++)
233 args.args[nargs+i] = 0;
234
5827d416 235 if (enter_prom(&args, prom_entry) < 0)
c4988820 236 return PROM_ERROR;
9b6b563c 237
493adffc 238 return (nret > 0) ? be32_to_cpu(args.args[nargs]) : 0;
9b6b563c
PM
239}
240
241static int __init call_prom_ret(const char *service, int nargs, int nret,
242 prom_arg_t *rets, ...)
243{
244 int i;
245 struct prom_args args;
246 va_list list;
247
493adffc
BH
248 args.service = cpu_to_be32(ADDR(service));
249 args.nargs = cpu_to_be32(nargs);
250 args.nret = cpu_to_be32(nret);
9b6b563c
PM
251
252 va_start(list, rets);
253 for (i = 0; i < nargs; i++)
493adffc 254 args.args[i] = cpu_to_be32(va_arg(list, prom_arg_t));
9b6b563c
PM
255 va_end(list);
256
257 for (i = 0; i < nret; i++)
ed1189b7 258 args.args[nargs+i] = 0;
9b6b563c 259
5827d416 260 if (enter_prom(&args, prom_entry) < 0)
c4988820 261 return PROM_ERROR;
9b6b563c
PM
262
263 if (rets != NULL)
264 for (i = 1; i < nret; ++i)
493adffc 265 rets[i-1] = be32_to_cpu(args.args[nargs+i]);
9b6b563c 266
493adffc 267 return (nret > 0) ? be32_to_cpu(args.args[nargs]) : 0;
9b6b563c
PM
268}
269
270
9b6b563c
PM
271static void __init prom_print(const char *msg)
272{
273 const char *p, *q;
9b6b563c 274
5827d416 275 if (prom.stdout == 0)
9b6b563c
PM
276 return;
277
278 for (p = msg; *p != 0; p = q) {
279 for (q = p; *q != 0 && *q != '\n'; ++q)
280 ;
281 if (q > p)
5827d416 282 call_prom("write", 3, 1, prom.stdout, p, q - p);
9b6b563c
PM
283 if (*q == 0)
284 break;
285 ++q;
5827d416 286 call_prom("write", 3, 1, prom.stdout, ADDR("\r\n"), 2);
9b6b563c
PM
287 }
288}
289
290
291static void __init prom_print_hex(unsigned long val)
292{
293 int i, nibbles = sizeof(val)*2;
294 char buf[sizeof(val)*2+1];
9b6b563c
PM
295
296 for (i = nibbles-1; i >= 0; i--) {
297 buf[i] = (val & 0xf) + '0';
298 if (buf[i] > '9')
299 buf[i] += ('a'-'0'-10);
300 val >>= 4;
301 }
302 buf[nibbles] = '\0';
5827d416 303 call_prom("write", 3, 1, prom.stdout, buf, nibbles);
9b6b563c
PM
304}
305
2c48a7d6
MN
306/* max number of decimal digits in an unsigned long */
307#define UL_DIGITS 21
308static void __init prom_print_dec(unsigned long val)
309{
310 int i, size;
311 char buf[UL_DIGITS+1];
2c48a7d6
MN
312
313 for (i = UL_DIGITS-1; i >= 0; i--) {
314 buf[i] = (val % 10) + '0';
315 val = val/10;
316 if (val == 0)
317 break;
318 }
319 /* shift stuff down */
320 size = UL_DIGITS - i;
5827d416 321 call_prom("write", 3, 1, prom.stdout, buf+i, size);
2c48a7d6 322}
9b6b563c
PM
323
324static void __init prom_printf(const char *format, ...)
325{
326 const char *p, *q, *s;
327 va_list args;
328 unsigned long v;
af277149 329 long vs;
9b6b563c
PM
330
331 va_start(args, format);
9b6b563c
PM
332 for (p = format; *p != 0; p = q) {
333 for (q = p; *q != 0 && *q != '\n' && *q != '%'; ++q)
334 ;
335 if (q > p)
5827d416 336 call_prom("write", 3, 1, prom.stdout, p, q - p);
9b6b563c
PM
337 if (*q == 0)
338 break;
339 if (*q == '\n') {
340 ++q;
5827d416 341 call_prom("write", 3, 1, prom.stdout,
9b6b563c
PM
342 ADDR("\r\n"), 2);
343 continue;
344 }
345 ++q;
346 if (*q == 0)
347 break;
348 switch (*q) {
349 case 's':
350 ++q;
351 s = va_arg(args, const char *);
352 prom_print(s);
353 break;
354 case 'x':
355 ++q;
356 v = va_arg(args, unsigned long);
357 prom_print_hex(v);
358 break;
af277149
BH
359 case 'd':
360 ++q;
361 vs = va_arg(args, int);
362 if (vs < 0) {
5827d416 363 prom_print("-");
af277149
BH
364 vs = -vs;
365 }
366 prom_print_dec(vs);
367 break;
2c48a7d6
MN
368 case 'l':
369 ++q;
af277149
BH
370 if (*q == 0)
371 break;
372 else if (*q == 'x') {
373 ++q;
374 v = va_arg(args, unsigned long);
375 prom_print_hex(v);
376 } else if (*q == 'u') { /* '%lu' */
2c48a7d6
MN
377 ++q;
378 v = va_arg(args, unsigned long);
379 prom_print_dec(v);
af277149
BH
380 } else if (*q == 'd') { /* %ld */
381 ++q;
382 vs = va_arg(args, long);
383 if (vs < 0) {
5827d416 384 prom_print("-");
af277149
BH
385 vs = -vs;
386 }
387 prom_print_dec(vs);
2c48a7d6
MN
388 }
389 break;
9b6b563c
PM
390 }
391 }
1b855e16 392 va_end(args);
9b6b563c
PM
393}
394
395
a575b807
PM
396static unsigned int __init prom_claim(unsigned long virt, unsigned long size,
397 unsigned long align)
398{
a575b807 399
a23414be
PM
400 if (align == 0 && (OF_WORKAROUNDS & OF_WA_CLAIM)) {
401 /*
402 * Old OF requires we claim physical and virtual separately
403 * and then map explicitly (assuming virtual mode)
404 */
405 int ret;
406 prom_arg_t result;
407
408 ret = call_prom_ret("call-method", 5, 2, &result,
5827d416 409 ADDR("claim"), prom.memory,
a23414be
PM
410 align, size, virt);
411 if (ret != 0 || result == -1)
412 return -1;
413 ret = call_prom_ret("call-method", 5, 2, &result,
5827d416 414 ADDR("claim"), prom.mmumap,
a23414be
PM
415 align, size, virt);
416 if (ret != 0) {
417 call_prom("call-method", 4, 1, ADDR("release"),
5827d416 418 prom.memory, size, virt);
a23414be
PM
419 return -1;
420 }
421 /* the 0x12 is M (coherence) + PP == read/write */
a575b807 422 call_prom("call-method", 6, 1,
5827d416 423 ADDR("map"), prom.mmumap, 0x12, size, virt, virt);
a23414be
PM
424 return virt;
425 }
426 return call_prom("claim", 3, 1, (prom_arg_t)virt, (prom_arg_t)size,
427 (prom_arg_t)align);
a575b807
PM
428}
429
9b6b563c
PM
430static void __init __attribute__((noreturn)) prom_panic(const char *reason)
431{
9b6b563c 432 prom_print(reason);
add60ef3
OH
433 /* Do not call exit because it clears the screen on pmac
434 * it also causes some sort of double-fault on early pmacs */
5827d416 435 if (of_platform == PLATFORM_POWERMAC)
add60ef3
OH
436 asm("trap\n");
437
1d9a4731 438 /* ToDo: should put up an SRC here on pSeries */
9b6b563c
PM
439 call_prom("exit", 0, 0);
440
441 for (;;) /* should never get here */
442 ;
443}
444
445
446static int __init prom_next_node(phandle *nodep)
447{
448 phandle node;
449
450 if ((node = *nodep) != 0
451 && (*nodep = call_prom("child", 1, 1, node)) != 0)
452 return 1;
453 if ((*nodep = call_prom("peer", 1, 1, node)) != 0)
454 return 1;
455 for (;;) {
456 if ((node = call_prom("parent", 1, 1, node)) == 0)
457 return 0;
458 if ((*nodep = call_prom("peer", 1, 1, node)) != 0)
459 return 1;
460 }
461}
462
21fe3301 463static int inline prom_getprop(phandle node, const char *pname,
9b6b563c
PM
464 void *value, size_t valuelen)
465{
466 return call_prom("getprop", 4, 1, node, ADDR(pname),
467 (u32)(unsigned long) value, (u32) valuelen);
468}
469
21fe3301 470static int inline prom_getproplen(phandle node, const char *pname)
9b6b563c
PM
471{
472 return call_prom("getproplen", 2, 1, node, ADDR(pname));
473}
474
a23414be 475static void add_string(char **str, const char *q)
9b6b563c 476{
a23414be
PM
477 char *p = *str;
478
479 while (*q)
480 *p++ = *q++;
481 *p++ = ' ';
482 *str = p;
483}
484
485static char *tohex(unsigned int x)
486{
487 static char digits[] = "0123456789abcdef";
488 static char result[9];
489 int i;
490
491 result[8] = 0;
492 i = 8;
493 do {
494 --i;
495 result[i] = digits[x & 0xf];
496 x >>= 4;
497 } while (x != 0 && i > 0);
498 return &result[i];
499}
500
501static int __init prom_setprop(phandle node, const char *nodename,
502 const char *pname, void *value, size_t valuelen)
503{
504 char cmd[256], *p;
505
506 if (!(OF_WORKAROUNDS & OF_WA_LONGTRAIL))
507 return call_prom("setprop", 4, 1, node, ADDR(pname),
508 (u32)(unsigned long) value, (u32) valuelen);
509
510 /* gah... setprop doesn't work on longtrail, have to use interpret */
511 p = cmd;
512 add_string(&p, "dev");
513 add_string(&p, nodename);
514 add_string(&p, tohex((u32)(unsigned long) value));
515 add_string(&p, tohex(valuelen));
516 add_string(&p, tohex(ADDR(pname)));
5827d416 517 add_string(&p, tohex(strlen(pname)));
a23414be
PM
518 add_string(&p, "property");
519 *p = 0;
520 return call_prom("interpret", 1, 1, (u32)(unsigned long) cmd);
9b6b563c
PM
521}
522
5827d416 523/* We can't use the standard versions because of relocation headaches. */
cf68787b
BK
524#define isxdigit(c) (('0' <= (c) && (c) <= '9') \
525 || ('a' <= (c) && (c) <= 'f') \
526 || ('A' <= (c) && (c) <= 'F'))
527
528#define isdigit(c) ('0' <= (c) && (c) <= '9')
529#define islower(c) ('a' <= (c) && (c) <= 'z')
530#define toupper(c) (islower(c) ? ((c) - 'a' + 'A') : (c))
531
493adffc 532static unsigned long prom_strtoul(const char *cp, const char **endp)
cf68787b
BK
533{
534 unsigned long result = 0, base = 10, value;
535
536 if (*cp == '0') {
537 base = 8;
538 cp++;
539 if (toupper(*cp) == 'X') {
540 cp++;
541 base = 16;
542 }
543 }
544
545 while (isxdigit(*cp) &&
546 (value = isdigit(*cp) ? *cp - '0' : toupper(*cp) - 'A' + 10) < base) {
547 result = result * base + value;
548 cp++;
549 }
550
551 if (endp)
552 *endp = cp;
553
554 return result;
555}
556
493adffc 557static unsigned long prom_memparse(const char *ptr, const char **retptr)
cf68787b
BK
558{
559 unsigned long ret = prom_strtoul(ptr, retptr);
560 int shift = 0;
561
562 /*
563 * We can't use a switch here because GCC *may* generate a
564 * jump table which won't work, because we're not running at
565 * the address we're linked at.
566 */
567 if ('G' == **retptr || 'g' == **retptr)
568 shift = 30;
569
570 if ('M' == **retptr || 'm' == **retptr)
571 shift = 20;
572
573 if ('K' == **retptr || 'k' == **retptr)
574 shift = 10;
575
576 if (shift) {
577 ret <<= shift;
578 (*retptr)++;
579 }
580
581 return ret;
582}
583
9b6b563c
PM
584/*
585 * Early parsing of the command line passed to the kernel, used for
586 * "mem=x" and the options that affect the iommu
587 */
588static void __init early_cmdline_parse(void)
589{
cc5d0189 590 const char *opt;
cf68787b 591
cc5d0189 592 char *p;
9b6b563c
PM
593 int l = 0;
594
5827d416
AB
595 prom_cmd_line[0] = 0;
596 p = prom_cmd_line;
597 if ((long)prom.chosen > 0)
598 l = prom_getprop(prom.chosen, "bootargs", p, COMMAND_LINE_SIZE-1);
9b6b563c 599#ifdef CONFIG_CMDLINE
0e4aa9c2 600 if (l <= 0 || p[0] == '\0') /* dbl check */
5827d416
AB
601 strlcpy(prom_cmd_line,
602 CONFIG_CMDLINE, sizeof(prom_cmd_line));
9b6b563c 603#endif /* CONFIG_CMDLINE */
5827d416 604 prom_printf("command line: %s\n", prom_cmd_line);
9b6b563c
PM
605
606#ifdef CONFIG_PPC64
5827d416 607 opt = strstr(prom_cmd_line, "iommu=");
9b6b563c
PM
608 if (opt) {
609 prom_printf("iommu opt is: %s\n", opt);
610 opt += 6;
611 while (*opt && *opt == ' ')
612 opt++;
5827d416
AB
613 if (!strncmp(opt, "off", 3))
614 prom_iommu_off = 1;
615 else if (!strncmp(opt, "force", 5))
616 prom_iommu_force_on = 1;
9b6b563c
PM
617 }
618#endif
5827d416 619 opt = strstr(prom_cmd_line, "mem=");
cf68787b
BK
620 if (opt) {
621 opt += 4;
5827d416 622 prom_memory_limit = prom_memparse(opt, (const char **)&opt);
cf68787b
BK
623#ifdef CONFIG_PPC64
624 /* Align to 16 MB == size of ppc64 large page */
5827d416 625 prom_memory_limit = ALIGN(prom_memory_limit, 0x1000000);
cf68787b
BK
626#endif
627 }
9b6b563c
PM
628}
629
27f44888 630#if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV)
9b6b563c 631/*
530b5e14
NF
632 * The architecture vector has an array of PVR mask/value pairs,
633 * followed by # option vectors - 1, followed by the option vectors.
634 *
635 * See prom.h for the definition of the bits specified in the
636 * architecture vector.
f709bfac
PM
637 *
638 * Because the description vector contains a mix of byte and word
639 * values, we declare it as an unsigned char array, and use this
640 * macro to put word values in.
641 */
642#define W(x) ((x) >> 24) & 0xff, ((x) >> 16) & 0xff, \
643 ((x) >> 8) & 0xff, (x) & 0xff
644
e8a4fd0a
ME
645/* Firmware expects the value to be n - 1, where n is the # of vectors */
646#define NUM_VECTORS(n) ((n) - 1)
647
648/*
649 * Firmware expects 1 + n - 2, where n is the length of the option vector in
650 * bytes. The 1 accounts for the length byte itself, the - 2 .. ?
651 */
652#define VECTOR_LENGTH(n) (1 + (n) - 2)
653
530b5e14 654unsigned char ibm_architecture_vec[] = {
f709bfac 655 W(0xfffe0000), W(0x003a0000), /* POWER5/POWER5+ */
03054d51 656 W(0xffff0000), W(0x003e0000), /* POWER6 */
e952e6c4 657 W(0xffff0000), W(0x003f0000), /* POWER7 */
33959f88 658 W(0xffff0000), W(0x004b0000), /* POWER8E */
7cc85103 659 W(0xffff0000), W(0x004c0000), /* POWER8NVL */
33959f88 660 W(0xffff0000), W(0x004d0000), /* POWER8 */
df77c799 661 W(0xffffffff), W(0x0f000004), /* all 2.07-compliant */
0cb99013 662 W(0xffffffff), W(0x0f000003), /* all 2.06-compliant */
0efbc18a 663 W(0xffffffff), W(0x0f000002), /* all 2.05-compliant */
f709bfac 664 W(0xfffffffe), W(0x0f000001), /* all 2.04-compliant and earlier */
e8a4fd0a 665 NUM_VECTORS(6), /* 6 option vectors */
f709bfac
PM
666
667 /* option vector 1: processor architectures supported */
e8a4fd0a 668 VECTOR_LENGTH(2), /* length */
f709bfac
PM
669 0, /* don't ignore, don't halt */
670 OV1_PPC_2_00 | OV1_PPC_2_01 | OV1_PPC_2_02 | OV1_PPC_2_03 |
df77c799 671 OV1_PPC_2_04 | OV1_PPC_2_05 | OV1_PPC_2_06 | OV1_PPC_2_07,
f709bfac
PM
672
673 /* option vector 2: Open Firmware options supported */
e8a4fd0a 674 VECTOR_LENGTH(33), /* length */
f709bfac
PM
675 OV2_REAL_MODE,
676 0, 0,
677 W(0xffffffff), /* real_base */
678 W(0xffffffff), /* real_size */
679 W(0xffffffff), /* virt_base */
680 W(0xffffffff), /* virt_size */
681 W(0xffffffff), /* load_base */
33392640 682 W(256), /* 256MB min RMA */
f709bfac
PM
683 W(0xffffffff), /* full client load */
684 0, /* min RMA percentage of total RAM */
685 48, /* max log_2(hash table size) */
686
687 /* option vector 3: processor options supported */
e8a4fd0a 688 VECTOR_LENGTH(2), /* length */
f709bfac 689 0, /* don't ignore, don't halt */
974a76f5 690 OV3_FP | OV3_VMX | OV3_DFP,
f709bfac
PM
691
692 /* option vector 4: IBM PAPR implementation */
e8a4fd0a 693 VECTOR_LENGTH(2), /* length */
f709bfac 694 0, /* don't halt */
404e32e4 695 OV4_MIN_ENT_CAP, /* minimum VP entitled capacity */
f709bfac
PM
696
697 /* option vector 5: PAPR/OF options */
e8a4fd0a 698 VECTOR_LENGTH(18), /* length */
f709bfac 699 0, /* don't ignore, don't halt */
f0ff7eb4
NF
700 OV5_FEAT(OV5_LPAR) | OV5_FEAT(OV5_SPLPAR) | OV5_FEAT(OV5_LARGE_PAGES) |
701 OV5_FEAT(OV5_DRCONF_MEMORY) | OV5_FEAT(OV5_DONATE_DEDICATE_CPU) |
702#ifdef CONFIG_PCI_MSI
703 /* PCIe/MSI support. Without MSI full PCIe is not supported */
704 OV5_FEAT(OV5_MSI),
705#else
706 0,
707#endif
8391e42a 708 0,
f0ff7eb4
NF
709#ifdef CONFIG_PPC_SMLPAR
710 OV5_FEAT(OV5_CMO) | OV5_FEAT(OV5_XCMO),
711#else
712 0,
713#endif
1b1218d3 714 OV5_FEAT(OV5_TYPE1_AFFINITY) | OV5_FEAT(OV5_PRRN),
28bb9ee1 715 0,
716 0,
717 0,
efec959f
BH
718 /* WARNING: The offset of the "number of cores" field below
719 * must match by the macro below. Update the definition if
720 * the structure layout changes.
721 */
2c2a63e3 722#define IBM_ARCH_VEC_NRCORES_OFFSET 133
efec959f 723 W(NR_CPUS), /* number of cores supported */
828d2b59
KY
724 0,
725 0,
726 0,
727 0,
f0ff7eb4
NF
728 OV5_FEAT(OV5_PFO_HW_RNG) | OV5_FEAT(OV5_PFO_HW_ENCR) |
729 OV5_FEAT(OV5_PFO_HW_842),
730 OV5_FEAT(OV5_SUB_PROCESSORS),
e8a4fd0a 731
28bb9ee1 732 /* option vector 6: IBM PAPR hints */
e8a4fd0a 733 VECTOR_LENGTH(3), /* length */
28bb9ee1 734 0,
735 0,
736 OV6_LINUX,
f709bfac
PM
737};
738
493adffc
BH
739/* Old method - ELF header with PT_NOTE sections only works on BE */
740#ifdef __BIG_ENDIAN__
9b6b563c
PM
741static struct fake_elf {
742 Elf32_Ehdr elfhdr;
743 Elf32_Phdr phdr[2];
744 struct chrpnote {
745 u32 namesz;
746 u32 descsz;
747 u32 type;
748 char name[8]; /* "PowerPC" */
749 struct chrpdesc {
750 u32 real_mode;
751 u32 real_base;
752 u32 real_size;
753 u32 virt_base;
754 u32 virt_size;
755 u32 load_base;
756 } chrpdesc;
757 } chrpnote;
758 struct rpanote {
759 u32 namesz;
760 u32 descsz;
761 u32 type;
762 char name[24]; /* "IBM,RPA-Client-Config" */
763 struct rpadesc {
764 u32 lpar_affinity;
765 u32 min_rmo_size;
766 u32 min_rmo_percent;
767 u32 max_pft_size;
768 u32 splpar;
769 u32 min_load;
770 u32 new_mem_def;
771 u32 ignore_me;
772 } rpadesc;
773 } rpanote;
5663a123 774} fake_elf = {
9b6b563c
PM
775 .elfhdr = {
776 .e_ident = { 0x7f, 'E', 'L', 'F',
777 ELFCLASS32, ELFDATA2MSB, EV_CURRENT },
778 .e_type = ET_EXEC, /* yeah right */
779 .e_machine = EM_PPC,
780 .e_version = EV_CURRENT,
781 .e_phoff = offsetof(struct fake_elf, phdr),
782 .e_phentsize = sizeof(Elf32_Phdr),
783 .e_phnum = 2
784 },
785 .phdr = {
786 [0] = {
787 .p_type = PT_NOTE,
788 .p_offset = offsetof(struct fake_elf, chrpnote),
789 .p_filesz = sizeof(struct chrpnote)
790 }, [1] = {
791 .p_type = PT_NOTE,
792 .p_offset = offsetof(struct fake_elf, rpanote),
793 .p_filesz = sizeof(struct rpanote)
794 }
795 },
796 .chrpnote = {
797 .namesz = sizeof("PowerPC"),
798 .descsz = sizeof(struct chrpdesc),
799 .type = 0x1275,
800 .name = "PowerPC",
801 .chrpdesc = {
802 .real_mode = ~0U, /* ~0 means "don't care" */
803 .real_base = ~0U,
804 .real_size = ~0U,
805 .virt_base = ~0U,
806 .virt_size = ~0U,
807 .load_base = ~0U
808 },
809 },
810 .rpanote = {
811 .namesz = sizeof("IBM,RPA-Client-Config"),
812 .descsz = sizeof(struct rpadesc),
813 .type = 0x12759999,
814 .name = "IBM,RPA-Client-Config",
815 .rpadesc = {
5663a123
PM
816 .lpar_affinity = 0,
817 .min_rmo_size = 64, /* in megabytes */
9b6b563c 818 .min_rmo_percent = 0,
5663a123 819 .max_pft_size = 48, /* 2^48 bytes max PFT size */
9b6b563c
PM
820 .splpar = 1,
821 .min_load = ~0U,
5663a123 822 .new_mem_def = 0
9b6b563c
PM
823 }
824 }
825};
493adffc 826#endif /* __BIG_ENDIAN__ */
9b6b563c 827
efec959f
BH
828static int __init prom_count_smt_threads(void)
829{
830 phandle node;
831 char type[64];
832 unsigned int plen;
833
834 /* Pick up th first CPU node we can find */
835 for (node = 0; prom_next_node(&node); ) {
836 type[0] = 0;
837 prom_getprop(node, "device_type", type, sizeof(type));
838
5827d416 839 if (strcmp(type, "cpu"))
efec959f
BH
840 continue;
841 /*
842 * There is an entry for each smt thread, each entry being
843 * 4 bytes long. All cpus should have the same number of
844 * smt threads, so return after finding the first.
845 */
846 plen = prom_getproplen(node, "ibm,ppc-interrupt-server#s");
847 if (plen == PROM_ERROR)
848 break;
849 plen >>= 2;
2c48a7d6 850 prom_debug("Found %lu smt threads per core\n", (unsigned long)plen);
efec959f
BH
851
852 /* Sanity check */
853 if (plen < 1 || plen > 64) {
2c48a7d6 854 prom_printf("Threads per core %lu out of bounds, assuming 1\n",
efec959f
BH
855 (unsigned long)plen);
856 return 1;
857 }
858 return plen;
859 }
860 prom_debug("No threads found, assuming 1 per core\n");
861
862 return 1;
863
864}
865
866
9b6b563c
PM
867static void __init prom_send_capabilities(void)
868{
493adffc 869 ihandle root;
f709bfac 870 prom_arg_t ret;
dbd0c5d5
LD
871 u32 cores;
872 unsigned char *ptcores;
f709bfac
PM
873
874 root = call_prom("open", 1, 1, ADDR("/"));
875 if (root != 0) {
efec959f
BH
876 /* We need to tell the FW about the number of cores we support.
877 *
878 * To do that, we count the number of threads on the first core
879 * (we assume this is the same for all cores) and use it to
880 * divide NR_CPUS.
881 */
dbd0c5d5
LD
882
883 /* The core value may start at an odd address. If such a word
884 * access is made at a cache line boundary, this leads to an
885 * exception which may not be handled at this time.
886 * Forcing a per byte access to avoid exception.
887 */
888 ptcores = &ibm_architecture_vec[IBM_ARCH_VEC_NRCORES_OFFSET];
889 cores = 0;
890 cores |= ptcores[0] << 24;
891 cores |= ptcores[1] << 16;
892 cores |= ptcores[2] << 8;
893 cores |= ptcores[3];
894 if (cores != NR_CPUS) {
efec959f 895 prom_printf("WARNING ! "
2c48a7d6 896 "ibm_architecture_vec structure inconsistent: %lu!\n",
dbd0c5d5 897 cores);
efec959f 898 } else {
dbd0c5d5 899 cores = DIV_ROUND_UP(NR_CPUS, prom_count_smt_threads());
2c48a7d6 900 prom_printf("Max number of cores passed to firmware: %lu (NR_CPUS = %lu)\n",
dbd0c5d5
LD
901 cores, NR_CPUS);
902 ptcores[0] = (cores >> 24) & 0xff;
903 ptcores[1] = (cores >> 16) & 0xff;
904 ptcores[2] = (cores >> 8) & 0xff;
905 ptcores[3] = cores & 0xff;
efec959f
BH
906 }
907
f709bfac 908 /* try calling the ibm,client-architecture-support method */
049d0497 909 prom_printf("Calling ibm,client-architecture-support...");
f709bfac
PM
910 if (call_prom_ret("call-method", 3, 2, &ret,
911 ADDR("ibm,client-architecture-support"),
33b74977 912 root,
f709bfac
PM
913 ADDR(ibm_architecture_vec)) == 0) {
914 /* the call exists... */
915 if (ret)
4da727ae 916 prom_printf("\nWARNING: ibm,client-architecture"
f709bfac
PM
917 "-support call FAILED!\n");
918 call_prom("close", 1, 0, root);
4da727ae 919 prom_printf(" done\n");
f709bfac
PM
920 return;
921 }
922 call_prom("close", 1, 0, root);
049d0497 923 prom_printf(" not implemented\n");
f709bfac 924 }
9b6b563c 925
493adffc
BH
926#ifdef __BIG_ENDIAN__
927 {
928 ihandle elfloader;
929
930 /* no ibm,client-architecture-support call, try the old way */
931 elfloader = call_prom("open", 1, 1,
932 ADDR("/packages/elf-loader"));
933 if (elfloader == 0) {
934 prom_printf("couldn't open /packages/elf-loader\n");
935 return;
936 }
937 call_prom("call-method", 3, 1, ADDR("process-elf-header"),
938 elfloader, ADDR(&fake_elf));
939 call_prom("close", 1, 0, elfloader);
9b6b563c 940 }
493adffc 941#endif /* __BIG_ENDIAN__ */
9b6b563c 942}
493adffc 943#endif /* #if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) */
9b6b563c
PM
944
945/*
946 * Memory allocation strategy... our layout is normally:
947 *
948 * at 14Mb or more we have vmlinux, then a gap and initrd. In some
949 * rare cases, initrd might end up being before the kernel though.
950 * We assume this won't override the final kernel at 0, we have no
951 * provision to handle that in this version, but it should hopefully
952 * never happen.
953 *
954 * alloc_top is set to the top of RMO, eventually shrink down if the
955 * TCEs overlap
956 *
957 * alloc_bottom is set to the top of kernel/initrd
958 *
959 * from there, allocations are done this way : rtas is allocated
960 * topmost, and the device-tree is allocated from the bottom. We try
961 * to grow the device-tree allocation as we progress. If we can't,
962 * then we fail, we don't currently have a facility to restart
963 * elsewhere, but that shouldn't be necessary.
964 *
965 * Note that calls to reserve_mem have to be done explicitly, memory
966 * allocated with either alloc_up or alloc_down isn't automatically
967 * reserved.
968 */
969
970
971/*
972 * Allocates memory in the RMO upward from the kernel/initrd
973 *
974 * When align is 0, this is a special case, it means to allocate in place
975 * at the current location of alloc_bottom or fail (that is basically
976 * extending the previous allocation). Used for the device-tree flattening
977 */
978static unsigned long __init alloc_up(unsigned long size, unsigned long align)
979{
5827d416 980 unsigned long base = alloc_bottom;
9b6b563c
PM
981 unsigned long addr = 0;
982
c4988820
PM
983 if (align)
984 base = _ALIGN_UP(base, align);
9b6b563c 985 prom_debug("alloc_up(%x, %x)\n", size, align);
5827d416 986 if (ram_top == 0)
9b6b563c
PM
987 prom_panic("alloc_up() called with mem not initialized\n");
988
989 if (align)
5827d416 990 base = _ALIGN_UP(alloc_bottom, align);
9b6b563c 991 else
5827d416 992 base = alloc_bottom;
9b6b563c 993
5827d416 994 for(; (base + size) <= alloc_top;
9b6b563c
PM
995 base = _ALIGN_UP(base + 0x100000, align)) {
996 prom_debug(" trying: 0x%x\n\r", base);
997 addr = (unsigned long)prom_claim(base, size, 0);
c4988820 998 if (addr != PROM_ERROR && addr != 0)
9b6b563c
PM
999 break;
1000 addr = 0;
1001 if (align == 0)
1002 break;
1003 }
1004 if (addr == 0)
1005 return 0;
5827d416 1006 alloc_bottom = addr + size;
9b6b563c
PM
1007
1008 prom_debug(" -> %x\n", addr);
5827d416
AB
1009 prom_debug(" alloc_bottom : %x\n", alloc_bottom);
1010 prom_debug(" alloc_top : %x\n", alloc_top);
1011 prom_debug(" alloc_top_hi : %x\n", alloc_top_high);
1012 prom_debug(" rmo_top : %x\n", rmo_top);
1013 prom_debug(" ram_top : %x\n", ram_top);
9b6b563c
PM
1014
1015 return addr;
1016}
1017
1018/*
1019 * Allocates memory downward, either from top of RMO, or if highmem
1020 * is set, from the top of RAM. Note that this one doesn't handle
1021 * failures. It does claim memory if highmem is not set.
1022 */
1023static unsigned long __init alloc_down(unsigned long size, unsigned long align,
1024 int highmem)
1025{
1026 unsigned long base, addr = 0;
1027
1028 prom_debug("alloc_down(%x, %x, %s)\n", size, align,
5827d416
AB
1029 highmem ? "(high)" : "(low)");
1030 if (ram_top == 0)
9b6b563c
PM
1031 prom_panic("alloc_down() called with mem not initialized\n");
1032
1033 if (highmem) {
1034 /* Carve out storage for the TCE table. */
5827d416
AB
1035 addr = _ALIGN_DOWN(alloc_top_high - size, align);
1036 if (addr <= alloc_bottom)
9b6b563c
PM
1037 return 0;
1038 /* Will we bump into the RMO ? If yes, check out that we
1039 * didn't overlap existing allocations there, if we did,
1040 * we are dead, we must be the first in town !
1041 */
5827d416 1042 if (addr < rmo_top) {
9b6b563c 1043 /* Good, we are first */
5827d416
AB
1044 if (alloc_top == rmo_top)
1045 alloc_top = rmo_top = addr;
9b6b563c
PM
1046 else
1047 return 0;
1048 }
5827d416 1049 alloc_top_high = addr;
9b6b563c
PM
1050 goto bail;
1051 }
1052
5827d416
AB
1053 base = _ALIGN_DOWN(alloc_top - size, align);
1054 for (; base > alloc_bottom;
9b6b563c
PM
1055 base = _ALIGN_DOWN(base - 0x100000, align)) {
1056 prom_debug(" trying: 0x%x\n\r", base);
1057 addr = (unsigned long)prom_claim(base, size, 0);
c4988820 1058 if (addr != PROM_ERROR && addr != 0)
9b6b563c
PM
1059 break;
1060 addr = 0;
1061 }
1062 if (addr == 0)
1063 return 0;
5827d416 1064 alloc_top = addr;
9b6b563c
PM
1065
1066 bail:
1067 prom_debug(" -> %x\n", addr);
5827d416
AB
1068 prom_debug(" alloc_bottom : %x\n", alloc_bottom);
1069 prom_debug(" alloc_top : %x\n", alloc_top);
1070 prom_debug(" alloc_top_hi : %x\n", alloc_top_high);
1071 prom_debug(" rmo_top : %x\n", rmo_top);
1072 prom_debug(" ram_top : %x\n", ram_top);
9b6b563c
PM
1073
1074 return addr;
1075}
1076
1077/*
1078 * Parse a "reg" cell
1079 */
1080static unsigned long __init prom_next_cell(int s, cell_t **cellp)
1081{
1082 cell_t *p = *cellp;
1083 unsigned long r = 0;
1084
1085 /* Ignore more than 2 cells */
1086 while (s > sizeof(unsigned long) / 4) {
1087 p++;
1088 s--;
1089 }
493adffc 1090 r = be32_to_cpu(*p++);
9b6b563c 1091#ifdef CONFIG_PPC64
35499c01 1092 if (s > 1) {
9b6b563c 1093 r <<= 32;
493adffc 1094 r |= be32_to_cpu(*(p++));
9b6b563c
PM
1095 }
1096#endif
1097 *cellp = p;
1098 return r;
1099}
1100
1101/*
1102 * Very dumb function for adding to the memory reserve list, but
1103 * we don't need anything smarter at this point
1104 *
1105 * XXX Eventually check for collisions. They should NEVER happen.
1106 * If problems seem to show up, it would be a good start to track
1107 * them down.
1108 */
0108d3fe 1109static void __init reserve_mem(u64 base, u64 size)
9b6b563c 1110{
cbbcf340 1111 u64 top = base + size;
5827d416 1112 unsigned long cnt = mem_reserve_cnt;
9b6b563c
PM
1113
1114 if (size == 0)
1115 return;
1116
1117 /* We need to always keep one empty entry so that we
1118 * have our terminator with "size" set to 0 since we are
1119 * dumb and just copy this entire array to the boot params
1120 */
1121 base = _ALIGN_DOWN(base, PAGE_SIZE);
1122 top = _ALIGN_UP(top, PAGE_SIZE);
1123 size = top - base;
1124
1125 if (cnt >= (MEM_RESERVE_MAP_SIZE - 1))
1126 prom_panic("Memory reserve map exhausted !\n");
493adffc
BH
1127 mem_reserve_map[cnt].base = cpu_to_be64(base);
1128 mem_reserve_map[cnt].size = cpu_to_be64(size);
5827d416 1129 mem_reserve_cnt = cnt + 1;
9b6b563c
PM
1130}
1131
1132/*
b3c2ffd5 1133 * Initialize memory allocation mechanism, parse "memory" nodes and
9b6b563c
PM
1134 * obtain that way the top of memory and RMO to setup out local allocator
1135 */
1136static void __init prom_init_mem(void)
1137{
1138 phandle node;
1139 char *path, type[64];
1140 unsigned int plen;
1141 cell_t *p, *endp;
493adffc 1142 __be32 val;
9b6b563c
PM
1143 u32 rac, rsc;
1144
1145 /*
1146 * We iterate the memory nodes to find
1147 * 1) top of RMO (first node)
1148 * 2) top of memory
1149 */
493adffc
BH
1150 val = cpu_to_be32(2);
1151 prom_getprop(prom.root, "#address-cells", &val, sizeof(val));
1152 rac = be32_to_cpu(val);
1153 val = cpu_to_be32(1);
1154 prom_getprop(prom.root, "#size-cells", &val, sizeof(rsc));
1155 rsc = be32_to_cpu(val);
1156 prom_debug("root_addr_cells: %x\n", rac);
1157 prom_debug("root_size_cells: %x\n", rsc);
9b6b563c
PM
1158
1159 prom_debug("scanning memory:\n");
5827d416 1160 path = prom_scratch;
9b6b563c
PM
1161
1162 for (node = 0; prom_next_node(&node); ) {
1163 type[0] = 0;
1164 prom_getprop(node, "device_type", type, sizeof(type));
1165
c4988820
PM
1166 if (type[0] == 0) {
1167 /*
1168 * CHRP Longtrail machines have no device_type
1169 * on the memory node, so check the name instead...
1170 */
1171 prom_getprop(node, "name", type, sizeof(type));
1172 }
5827d416 1173 if (strcmp(type, "memory"))
9b6b563c 1174 continue;
c4988820 1175
5827d416 1176 plen = prom_getprop(node, "reg", regbuf, sizeof(regbuf));
9b6b563c
PM
1177 if (plen > sizeof(regbuf)) {
1178 prom_printf("memory node too large for buffer !\n");
1179 plen = sizeof(regbuf);
1180 }
5827d416 1181 p = regbuf;
9b6b563c
PM
1182 endp = p + (plen / sizeof(cell_t));
1183
1184#ifdef DEBUG_PROM
1185 memset(path, 0, PROM_SCRATCH_SIZE);
1186 call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1);
1187 prom_debug(" node %s :\n", path);
1188#endif /* DEBUG_PROM */
1189
1190 while ((endp - p) >= (rac + rsc)) {
1191 unsigned long base, size;
1192
1193 base = prom_next_cell(rac, &p);
1194 size = prom_next_cell(rsc, &p);
1195
1196 if (size == 0)
1197 continue;
1198 prom_debug(" %x %x\n", base, size);
5827d416
AB
1199 if (base == 0 && (of_platform & PLATFORM_LPAR))
1200 rmo_top = size;
1201 if ((base + size) > ram_top)
1202 ram_top = base + size;
9b6b563c
PM
1203 }
1204 }
1205
5827d416 1206 alloc_bottom = PAGE_ALIGN((unsigned long)&_end + 0x4000);
9b6b563c 1207
cf68787b
BK
1208 /*
1209 * If prom_memory_limit is set we reduce the upper limits *except* for
1210 * alloc_top_high. This must be the real top of RAM so we can put
1211 * TCE's up there.
1212 */
1213
5827d416 1214 alloc_top_high = ram_top;
cf68787b 1215
5827d416
AB
1216 if (prom_memory_limit) {
1217 if (prom_memory_limit <= alloc_bottom) {
cf68787b 1218 prom_printf("Ignoring mem=%x <= alloc_bottom.\n",
5827d416
AB
1219 prom_memory_limit);
1220 prom_memory_limit = 0;
1221 } else if (prom_memory_limit >= ram_top) {
cf68787b 1222 prom_printf("Ignoring mem=%x >= ram_top.\n",
5827d416
AB
1223 prom_memory_limit);
1224 prom_memory_limit = 0;
cf68787b 1225 } else {
5827d416
AB
1226 ram_top = prom_memory_limit;
1227 rmo_top = min(rmo_top, prom_memory_limit);
cf68787b
BK
1228 }
1229 }
1230
9b6b563c
PM
1231 /*
1232 * Setup our top alloc point, that is top of RMO or top of
1233 * segment 0 when running non-LPAR.
1234 * Some RS64 machines have buggy firmware where claims up at
1235 * 1GB fail. Cap at 768MB as a workaround.
1236 * Since 768MB is plenty of room, and we need to cap to something
1237 * reasonable on 32-bit, cap at 768MB on all machines.
1238 */
5827d416
AB
1239 if (!rmo_top)
1240 rmo_top = ram_top;
1241 rmo_top = min(0x30000000ul, rmo_top);
1242 alloc_top = rmo_top;
1243 alloc_top_high = ram_top;
9b6b563c 1244
64968f60
PM
1245 /*
1246 * Check if we have an initrd after the kernel but still inside
1247 * the RMO. If we do move our bottom point to after it.
1248 */
5827d416
AB
1249 if (prom_initrd_start &&
1250 prom_initrd_start < rmo_top &&
1251 prom_initrd_end > alloc_bottom)
1252 alloc_bottom = PAGE_ALIGN(prom_initrd_end);
64968f60 1253
9b6b563c 1254 prom_printf("memory layout at init:\n");
5827d416
AB
1255 prom_printf(" memory_limit : %x (16 MB aligned)\n", prom_memory_limit);
1256 prom_printf(" alloc_bottom : %x\n", alloc_bottom);
1257 prom_printf(" alloc_top : %x\n", alloc_top);
1258 prom_printf(" alloc_top_hi : %x\n", alloc_top_high);
1259 prom_printf(" rmo_top : %x\n", rmo_top);
1260 prom_printf(" ram_top : %x\n", ram_top);
9b6b563c
PM
1261}
1262
27f44888
BH
1263static void __init prom_close_stdin(void)
1264{
493adffc
BH
1265 __be32 val;
1266 ihandle stdin;
27f44888 1267
493adffc
BH
1268 if (prom_getprop(prom.chosen, "stdin", &val, sizeof(val)) > 0) {
1269 stdin = be32_to_cpu(val);
1270 call_prom("close", 1, 0, stdin);
1271 }
27f44888
BH
1272}
1273
1274#ifdef CONFIG_PPC_POWERNV
1275
6e35d5da
BH
1276#ifdef CONFIG_PPC_EARLY_DEBUG_OPAL
1277static u64 __initdata prom_opal_base;
1278static u64 __initdata prom_opal_entry;
1279#endif
1280
6e35d5da
BH
1281/*
1282 * Allocate room for and instantiate OPAL
1283 */
1284static void __init prom_instantiate_opal(void)
1285{
1286 phandle opal_node;
1287 ihandle opal_inst;
1288 u64 base, entry;
1289 u64 size = 0, align = 0x10000;
493adffc 1290 __be64 val64;
6e35d5da
BH
1291 u32 rets[2];
1292
1293 prom_debug("prom_instantiate_opal: start...\n");
1294
1295 opal_node = call_prom("finddevice", 1, 1, ADDR("/ibm,opal"));
1296 prom_debug("opal_node: %x\n", opal_node);
1297 if (!PHANDLE_VALID(opal_node))
1298 return;
1299
493adffc
BH
1300 val64 = 0;
1301 prom_getprop(opal_node, "opal-runtime-size", &val64, sizeof(val64));
1302 size = be64_to_cpu(val64);
6e35d5da
BH
1303 if (size == 0)
1304 return;
493adffc
BH
1305 val64 = 0;
1306 prom_getprop(opal_node, "opal-runtime-alignment", &val64,sizeof(val64));
1307 align = be64_to_cpu(val64);
6e35d5da
BH
1308
1309 base = alloc_down(size, align, 0);
1310 if (base == 0) {
1311 prom_printf("OPAL allocation failed !\n");
1312 return;
1313 }
1314
1315 opal_inst = call_prom("open", 1, 1, ADDR("/ibm,opal"));
1316 if (!IHANDLE_VALID(opal_inst)) {
1317 prom_printf("opening opal package failed (%x)\n", opal_inst);
1318 return;
1319 }
1320
1321 prom_printf("instantiating opal at 0x%x...", base);
1322
1323 if (call_prom_ret("call-method", 4, 3, rets,
1324 ADDR("load-opal-runtime"),
1325 opal_inst,
1326 base >> 32, base & 0xffffffff) != 0
1327 || (rets[0] == 0 && rets[1] == 0)) {
1328 prom_printf(" failed\n");
1329 return;
1330 }
1331 entry = (((u64)rets[0]) << 32) | rets[1];
1332
1333 prom_printf(" done\n");
1334
1335 reserve_mem(base, size);
1336
1337 prom_debug("opal base = 0x%x\n", base);
1338 prom_debug("opal align = 0x%x\n", align);
1339 prom_debug("opal entry = 0x%x\n", entry);
1340 prom_debug("opal size = 0x%x\n", (long)size);
1341
1342 prom_setprop(opal_node, "/ibm,opal", "opal-base-address",
1343 &base, sizeof(base));
1344 prom_setprop(opal_node, "/ibm,opal", "opal-entry-address",
1345 &entry, sizeof(entry));
1346
1347#ifdef CONFIG_PPC_EARLY_DEBUG_OPAL
5827d416
AB
1348 prom_opal_base = base;
1349 prom_opal_entry = entry;
6e35d5da
BH
1350#endif
1351 prom_debug("prom_instantiate_opal: end...\n");
1352}
1353
27f44888 1354#endif /* CONFIG_PPC_POWERNV */
9b6b563c
PM
1355
1356/*
1357 * Allocate room for and instantiate RTAS
1358 */
1359static void __init prom_instantiate_rtas(void)
1360{
1361 phandle rtas_node;
1362 ihandle rtas_inst;
1363 u32 base, entry = 0;
493adffc 1364 __be32 val;
9b6b563c
PM
1365 u32 size = 0;
1366
1367 prom_debug("prom_instantiate_rtas: start...\n");
1368
1369 rtas_node = call_prom("finddevice", 1, 1, ADDR("/rtas"));
1370 prom_debug("rtas_node: %x\n", rtas_node);
1371 if (!PHANDLE_VALID(rtas_node))
1372 return;
1373
493adffc
BH
1374 val = 0;
1375 prom_getprop(rtas_node, "rtas-size", &val, sizeof(size));
1376 size = be32_to_cpu(val);
9b6b563c
PM
1377 if (size == 0)
1378 return;
1379
1380 base = alloc_down(size, PAGE_SIZE, 0);
6d1e2c6c
AB
1381 if (base == 0)
1382 prom_panic("Could not allocate memory for RTAS\n");
9b6b563c
PM
1383
1384 rtas_inst = call_prom("open", 1, 1, ADDR("/rtas"));
1385 if (!IHANDLE_VALID(rtas_inst)) {
a23414be 1386 prom_printf("opening rtas package failed (%x)\n", rtas_inst);
9b6b563c
PM
1387 return;
1388 }
1389
1f8737aa 1390 prom_printf("instantiating rtas at 0x%x...", base);
9b6b563c
PM
1391
1392 if (call_prom_ret("call-method", 3, 2, &entry,
1393 ADDR("instantiate-rtas"),
a23414be 1394 rtas_inst, base) != 0
9b6b563c
PM
1395 || entry == 0) {
1396 prom_printf(" failed\n");
1397 return;
1398 }
1399 prom_printf(" done\n");
1400
1401 reserve_mem(base, size);
1402
493adffc 1403 val = cpu_to_be32(base);
a23414be 1404 prom_setprop(rtas_node, "/rtas", "linux,rtas-base",
493adffc
BH
1405 &val, sizeof(val));
1406 val = cpu_to_be32(entry);
a23414be 1407 prom_setprop(rtas_node, "/rtas", "linux,rtas-entry",
493adffc 1408 &val, sizeof(val));
9b6b563c 1409
dbe78b40
BH
1410 /* Check if it supports "query-cpu-stopped-state" */
1411 if (prom_getprop(rtas_node, "query-cpu-stopped-state",
1412 &val, sizeof(val)) != PROM_ERROR)
1413 rtas_has_query_cpu_stopped = true;
1414
9b6b563c
PM
1415 prom_debug("rtas base = 0x%x\n", base);
1416 prom_debug("rtas entry = 0x%x\n", entry);
1417 prom_debug("rtas size = 0x%x\n", (long)size);
1418
1419 prom_debug("prom_instantiate_rtas: end...\n");
1420}
1421
1422#ifdef CONFIG_PPC64
4a727429
AL
1423/*
1424 * Allocate room for and instantiate Stored Measurement Log (SML)
1425 */
1426static void __init prom_instantiate_sml(void)
1427{
1428 phandle ibmvtpm_node;
1429 ihandle ibmvtpm_inst;
b4ed0469 1430 u32 entry = 0, size = 0, succ = 0;
4a727429 1431 u64 base;
b4ed0469 1432 __be32 val;
4a727429
AL
1433
1434 prom_debug("prom_instantiate_sml: start...\n");
1435
2f82e982 1436 ibmvtpm_node = call_prom("finddevice", 1, 1, ADDR("/vdevice/vtpm"));
4a727429
AL
1437 prom_debug("ibmvtpm_node: %x\n", ibmvtpm_node);
1438 if (!PHANDLE_VALID(ibmvtpm_node))
1439 return;
1440
2f82e982 1441 ibmvtpm_inst = call_prom("open", 1, 1, ADDR("/vdevice/vtpm"));
4a727429
AL
1442 if (!IHANDLE_VALID(ibmvtpm_inst)) {
1443 prom_printf("opening vtpm package failed (%x)\n", ibmvtpm_inst);
1444 return;
1445 }
1446
b4ed0469
HCVL
1447 if (prom_getprop(ibmvtpm_node, "ibm,sml-efi-reformat-supported",
1448 &val, sizeof(val)) != PROM_ERROR) {
1449 if (call_prom_ret("call-method", 2, 2, &succ,
1450 ADDR("reformat-sml-to-efi-alignment"),
1451 ibmvtpm_inst) != 0 || succ == 0) {
1452 prom_printf("Reformat SML to EFI alignment failed\n");
1453 return;
1454 }
b4ed0469 1455
9e5d4af4
HCVL
1456 if (call_prom_ret("call-method", 2, 2, &size,
1457 ADDR("sml-get-allocated-size"),
1458 ibmvtpm_inst) != 0 || size == 0) {
1459 prom_printf("SML get allocated size failed\n");
1460 return;
1461 }
1462 } else {
1463 if (call_prom_ret("call-method", 2, 2, &size,
1464 ADDR("sml-get-handover-size"),
1465 ibmvtpm_inst) != 0 || size == 0) {
1466 prom_printf("SML get handover size failed\n");
1467 return;
1468 }
4a727429
AL
1469 }
1470
1471 base = alloc_down(size, PAGE_SIZE, 0);
1472 if (base == 0)
1473 prom_panic("Could not allocate memory for sml\n");
1474
1475 prom_printf("instantiating sml at 0x%x...", base);
1476
9e5d4af4
HCVL
1477 memset((void *)base, 0, size);
1478
4a727429
AL
1479 if (call_prom_ret("call-method", 4, 2, &entry,
1480 ADDR("sml-handover"),
1481 ibmvtpm_inst, size, base) != 0 || entry == 0) {
1482 prom_printf("SML handover failed\n");
1483 return;
1484 }
1485 prom_printf(" done\n");
1486
1487 reserve_mem(base, size);
1488
2f82e982 1489 prom_setprop(ibmvtpm_node, "/vdevice/vtpm", "linux,sml-base",
4a727429 1490 &base, sizeof(base));
2f82e982 1491 prom_setprop(ibmvtpm_node, "/vdevice/vtpm", "linux,sml-size",
4a727429
AL
1492 &size, sizeof(size));
1493
1494 prom_debug("sml base = 0x%x\n", base);
1495 prom_debug("sml size = 0x%x\n", (long)size);
1496
1497 prom_debug("prom_instantiate_sml: end...\n");
1498}
1499
9b6b563c
PM
1500/*
1501 * Allocate room for and initialize TCE tables
1502 */
493adffc 1503#ifdef __BIG_ENDIAN__
9b6b563c
PM
1504static void __init prom_initialize_tce_table(void)
1505{
1506 phandle node;
1507 ihandle phb_node;
1508 char compatible[64], type[64], model[64];
5827d416 1509 char *path = prom_scratch;
9b6b563c
PM
1510 u64 base, align;
1511 u32 minalign, minsize;
1512 u64 tce_entry, *tce_entryp;
1513 u64 local_alloc_top, local_alloc_bottom;
1514 u64 i;
1515
5827d416 1516 if (prom_iommu_off)
9b6b563c
PM
1517 return;
1518
1519 prom_debug("starting prom_initialize_tce_table\n");
1520
1521 /* Cache current top of allocs so we reserve a single block */
5827d416 1522 local_alloc_top = alloc_top_high;
9b6b563c
PM
1523 local_alloc_bottom = local_alloc_top;
1524
1525 /* Search all nodes looking for PHBs. */
1526 for (node = 0; prom_next_node(&node); ) {
1527 compatible[0] = 0;
1528 type[0] = 0;
1529 model[0] = 0;
1530 prom_getprop(node, "compatible",
1531 compatible, sizeof(compatible));
1532 prom_getprop(node, "device_type", type, sizeof(type));
1533 prom_getprop(node, "model", model, sizeof(model));
1534
5827d416 1535 if ((type[0] == 0) || (strstr(type, "pci") == NULL))
9b6b563c
PM
1536 continue;
1537
e788ff13 1538 /* Keep the old logic intact to avoid regression. */
9b6b563c 1539 if (compatible[0] != 0) {
5827d416
AB
1540 if ((strstr(compatible, "python") == NULL) &&
1541 (strstr(compatible, "Speedwagon") == NULL) &&
1542 (strstr(compatible, "Winnipeg") == NULL))
9b6b563c
PM
1543 continue;
1544 } else if (model[0] != 0) {
5827d416
AB
1545 if ((strstr(model, "ython") == NULL) &&
1546 (strstr(model, "peedwagon") == NULL) &&
1547 (strstr(model, "innipeg") == NULL))
9b6b563c
PM
1548 continue;
1549 }
1550
1551 if (prom_getprop(node, "tce-table-minalign", &minalign,
1552 sizeof(minalign)) == PROM_ERROR)
1553 minalign = 0;
1554 if (prom_getprop(node, "tce-table-minsize", &minsize,
1555 sizeof(minsize)) == PROM_ERROR)
1556 minsize = 4UL << 20;
1557
1558 /*
1559 * Even though we read what OF wants, we just set the table
1560 * size to 4 MB. This is enough to map 2GB of PCI DMA space.
1561 * By doing this, we avoid the pitfalls of trying to DMA to
1562 * MMIO space and the DMA alias hole.
1563 *
1564 * On POWER4, firmware sets the TCE region by assuming
1565 * each TCE table is 8MB. Using this memory for anything
1566 * else will impact performance, so we always allocate 8MB.
1567 * Anton
1568 */
d3dbeef6 1569 if (pvr_version_is(PVR_POWER4) || pvr_version_is(PVR_POWER4p))
9b6b563c
PM
1570 minsize = 8UL << 20;
1571 else
1572 minsize = 4UL << 20;
1573
1574 /* Align to the greater of the align or size */
1575 align = max(minalign, minsize);
1576 base = alloc_down(minsize, align, 1);
1577 if (base == 0)
1578 prom_panic("ERROR, cannot find space for TCE table.\n");
1579 if (base < local_alloc_bottom)
1580 local_alloc_bottom = base;
1581
9b6b563c 1582 /* It seems OF doesn't null-terminate the path :-( */
aca71ef8 1583 memset(path, 0, PROM_SCRATCH_SIZE);
9b6b563c
PM
1584 /* Call OF to setup the TCE hardware */
1585 if (call_prom("package-to-path", 3, 1, node,
1586 path, PROM_SCRATCH_SIZE-1) == PROM_ERROR) {
1587 prom_printf("package-to-path failed\n");
1588 }
1589
a23414be
PM
1590 /* Save away the TCE table attributes for later use. */
1591 prom_setprop(node, path, "linux,tce-base", &base, sizeof(base));
1592 prom_setprop(node, path, "linux,tce-size", &minsize, sizeof(minsize));
1593
9b6b563c
PM
1594 prom_debug("TCE table: %s\n", path);
1595 prom_debug("\tnode = 0x%x\n", node);
1596 prom_debug("\tbase = 0x%x\n", base);
1597 prom_debug("\tsize = 0x%x\n", minsize);
1598
1599 /* Initialize the table to have a one-to-one mapping
1600 * over the allocated size.
1601 */
2b931fb6 1602 tce_entryp = (u64 *)base;
9b6b563c
PM
1603 for (i = 0; i < (minsize >> 3) ;tce_entryp++, i++) {
1604 tce_entry = (i << PAGE_SHIFT);
1605 tce_entry |= 0x3;
1606 *tce_entryp = tce_entry;
1607 }
1608
1609 prom_printf("opening PHB %s", path);
1610 phb_node = call_prom("open", 1, 1, path);
1611 if (phb_node == 0)
1612 prom_printf("... failed\n");
1613 else
1614 prom_printf("... done\n");
1615
1616 call_prom("call-method", 6, 0, ADDR("set-64-bit-addressing"),
1617 phb_node, -1, minsize,
1618 (u32) base, (u32) (base >> 32));
1619 call_prom("close", 1, 0, phb_node);
1620 }
1621
1622 reserve_mem(local_alloc_bottom, local_alloc_top - local_alloc_bottom);
1623
2babf5c2
ME
1624 /* These are only really needed if there is a memory limit in
1625 * effect, but we don't know so export them always. */
5827d416
AB
1626 prom_tce_alloc_start = local_alloc_bottom;
1627 prom_tce_alloc_end = local_alloc_top;
9b6b563c
PM
1628
1629 /* Flag the first invalid entry */
1630 prom_debug("ending prom_initialize_tce_table\n");
1631}
493adffc
BH
1632#endif /* __BIG_ENDIAN__ */
1633#endif /* CONFIG_PPC64 */
9b6b563c
PM
1634
1635/*
1636 * With CHRP SMP we need to use the OF to start the other processors.
1637 * We can't wait until smp_boot_cpus (the OF is trashed by then)
1638 * so we have to put the processors into a holding pattern controlled
1639 * by the kernel (not OF) before we destroy the OF.
1640 *
1641 * This uses a chunk of low memory, puts some holding pattern
1642 * code there and sends the other processors off to there until
1643 * smp_boot_cpus tells them to do something. The holding pattern
1644 * checks that address until its cpu # is there, when it is that
1645 * cpu jumps to __secondary_start(). smp_boot_cpus() takes care
1646 * of setting those values.
1647 *
1648 * We also use physical address 0x4 here to tell when a cpu
1649 * is in its holding pattern code.
1650 *
1651 * -- Cort
1652 */
bbd0abda
PM
1653/*
1654 * We want to reference the copy of __secondary_hold_* in the
1655 * 0 - 0x100 address range
1656 */
1657#define LOW_ADDR(x) (((unsigned long) &(x)) & 0xff)
1658
9b6b563c
PM
1659static void __init prom_hold_cpus(void)
1660{
9b6b563c 1661 unsigned long i;
9b6b563c
PM
1662 phandle node;
1663 char type[64];
9b6b563c 1664 unsigned long *spinloop
bbd0abda 1665 = (void *) LOW_ADDR(__secondary_hold_spinloop);
9b6b563c 1666 unsigned long *acknowledge
bbd0abda 1667 = (void *) LOW_ADDR(__secondary_hold_acknowledge);
bbd0abda 1668 unsigned long secondary_hold = LOW_ADDR(__secondary_hold);
9b6b563c 1669
dbe78b40
BH
1670 /*
1671 * On pseries, if RTAS supports "query-cpu-stopped-state",
1672 * we skip this stage, the CPUs will be started by the
1673 * kernel using RTAS.
1674 */
1675 if ((of_platform == PLATFORM_PSERIES ||
1676 of_platform == PLATFORM_PSERIES_LPAR) &&
1677 rtas_has_query_cpu_stopped) {
1678 prom_printf("prom_hold_cpus: skipped\n");
1679 return;
1680 }
1681
9b6b563c
PM
1682 prom_debug("prom_hold_cpus: start...\n");
1683 prom_debug(" 1) spinloop = 0x%x\n", (unsigned long)spinloop);
1684 prom_debug(" 1) *spinloop = 0x%x\n", *spinloop);
1685 prom_debug(" 1) acknowledge = 0x%x\n",
1686 (unsigned long)acknowledge);
1687 prom_debug(" 1) *acknowledge = 0x%x\n", *acknowledge);
1688 prom_debug(" 1) secondary_hold = 0x%x\n", secondary_hold);
1689
1690 /* Set the common spinloop variable, so all of the secondary cpus
1691 * will block when they are awakened from their OF spinloop.
1692 * This must occur for both SMP and non SMP kernels, since OF will
1693 * be trashed when we move the kernel.
1694 */
1695 *spinloop = 0;
1696
9b6b563c
PM
1697 /* look for cpus */
1698 for (node = 0; prom_next_node(&node); ) {
493adffc
BH
1699 unsigned int cpu_no;
1700 __be32 reg;
1701
9b6b563c
PM
1702 type[0] = 0;
1703 prom_getprop(node, "device_type", type, sizeof(type));
5827d416 1704 if (strcmp(type, "cpu") != 0)
9b6b563c
PM
1705 continue;
1706
1707 /* Skip non-configured cpus. */
1708 if (prom_getprop(node, "status", type, sizeof(type)) > 0)
5827d416 1709 if (strcmp(type, "okay") != 0)
9b6b563c
PM
1710 continue;
1711
493adffc 1712 reg = cpu_to_be32(-1); /* make sparse happy */
9b6b563c 1713 prom_getprop(node, "reg", &reg, sizeof(reg));
493adffc 1714 cpu_no = be32_to_cpu(reg);
9b6b563c 1715
493adffc 1716 prom_debug("cpu hw idx = %lu\n", cpu_no);
9b6b563c
PM
1717
1718 /* Init the acknowledge var which will be reset by
1719 * the secondary cpu when it awakens from its OF
1720 * spinloop.
1721 */
1722 *acknowledge = (unsigned long)-1;
1723
493adffc 1724 if (cpu_no != prom.cpu) {
27f44888 1725 /* Primary Thread of non-boot cpu or any thread */
493adffc 1726 prom_printf("starting cpu hw idx %lu... ", cpu_no);
9b6b563c 1727 call_prom("start-cpu", 3, 0, node,
493adffc 1728 secondary_hold, cpu_no);
9b6b563c 1729
bbd0abda
PM
1730 for (i = 0; (i < 100000000) &&
1731 (*acknowledge == ((unsigned long)-1)); i++ )
9b6b563c
PM
1732 mb();
1733
493adffc 1734 if (*acknowledge == cpu_no)
9b6b563c 1735 prom_printf("done\n");
bbd0abda 1736 else
9b6b563c 1737 prom_printf("failed: %x\n", *acknowledge);
9b6b563c
PM
1738 }
1739#ifdef CONFIG_SMP
1740 else
493adffc 1741 prom_printf("boot cpu hw idx %lu\n", cpu_no);
9b6b563c 1742#endif /* CONFIG_SMP */
9b6b563c 1743 }
9b6b563c 1744
9b6b563c 1745 prom_debug("prom_hold_cpus: end...\n");
9b6b563c
PM
1746}
1747
1748
1749static void __init prom_init_client_services(unsigned long pp)
1750{
9b6b563c 1751 /* Get a handle to the prom entry point before anything else */
5827d416 1752 prom_entry = pp;
9b6b563c
PM
1753
1754 /* get a handle for the stdout device */
5827d416
AB
1755 prom.chosen = call_prom("finddevice", 1, 1, ADDR("/chosen"));
1756 if (!PHANDLE_VALID(prom.chosen))
9b6b563c
PM
1757 prom_panic("cannot find chosen"); /* msg won't be printed :( */
1758
1759 /* get device tree root */
5827d416
AB
1760 prom.root = call_prom("finddevice", 1, 1, ADDR("/"));
1761 if (!PHANDLE_VALID(prom.root))
9b6b563c 1762 prom_panic("cannot find device tree root"); /* msg won't be printed :( */
a575b807 1763
5827d416 1764 prom.mmumap = 0;
a575b807
PM
1765}
1766
1767#ifdef CONFIG_PPC32
1768/*
1769 * For really old powermacs, we need to map things we claim.
1770 * For that, we need the ihandle of the mmu.
a23414be 1771 * Also, on the longtrail, we need to work around other bugs.
a575b807
PM
1772 */
1773static void __init prom_find_mmu(void)
1774{
a575b807
PM
1775 phandle oprom;
1776 char version[64];
1777
1778 oprom = call_prom("finddevice", 1, 1, ADDR("/openprom"));
1779 if (!PHANDLE_VALID(oprom))
1780 return;
1781 if (prom_getprop(oprom, "model", version, sizeof(version)) <= 0)
1782 return;
1783 version[sizeof(version) - 1] = 0;
a575b807 1784 /* XXX might need to add other versions here */
a23414be
PM
1785 if (strcmp(version, "Open Firmware, 1.0.5") == 0)
1786 of_workarounds = OF_WA_CLAIM;
1787 else if (strncmp(version, "FirmWorks,3.", 12) == 0) {
1788 of_workarounds = OF_WA_CLAIM | OF_WA_LONGTRAIL;
1789 call_prom("interpret", 1, 1, "dev /memory 0 to allow-reclaim");
1790 } else
a575b807 1791 return;
5827d416
AB
1792 prom.memory = call_prom("open", 1, 1, ADDR("/memory"));
1793 prom_getprop(prom.chosen, "mmu", &prom.mmumap,
1794 sizeof(prom.mmumap));
493adffc 1795 prom.mmumap = be32_to_cpu(prom.mmumap);
5827d416 1796 if (!IHANDLE_VALID(prom.memory) || !IHANDLE_VALID(prom.mmumap))
a23414be 1797 of_workarounds &= ~OF_WA_CLAIM; /* hmmm */
9b6b563c 1798}
a575b807
PM
1799#else
1800#define prom_find_mmu()
1801#endif
9b6b563c
PM
1802
1803static void __init prom_init_stdout(void)
1804{
5827d416 1805 char *path = of_stdout_device;
9b6b563c 1806 char type[16];
493adffc
BH
1807 phandle stdout_node;
1808 __be32 val;
9b6b563c 1809
5827d416 1810 if (prom_getprop(prom.chosen, "stdout", &val, sizeof(val)) <= 0)
9b6b563c
PM
1811 prom_panic("cannot find stdout");
1812
493adffc 1813 prom.stdout = be32_to_cpu(val);
9b6b563c
PM
1814
1815 /* Get the full OF pathname of the stdout device */
1816 memset(path, 0, 256);
5827d416 1817 call_prom("instance-to-path", 3, 1, prom.stdout, path, 255);
5827d416
AB
1818 prom_printf("OF stdout device is: %s\n", of_stdout_device);
1819 prom_setprop(prom.chosen, "/chosen", "linux,stdout-path",
a23414be 1820 path, strlen(path) + 1);
9b6b563c 1821
10348f59
BH
1822 /* instance-to-package fails on PA-Semi */
1823 stdout_node = call_prom("instance-to-package", 1, 1, prom.stdout);
1824 if (stdout_node != PROM_ERROR) {
1825 val = cpu_to_be32(stdout_node);
1826 prom_setprop(prom.chosen, "/chosen", "linux,stdout-package",
1827 &val, sizeof(val));
1828
1829 /* If it's a display, note it */
1830 memset(type, 0, sizeof(type));
1831 prom_getprop(stdout_node, "device_type", type, sizeof(type));
1832 if (strcmp(type, "display") == 0)
1833 prom_setprop(stdout_node, path, "linux,boot-display", NULL, 0);
1834 }
9b6b563c
PM
1835}
1836
9b6b563c
PM
1837static int __init prom_find_machine_type(void)
1838{
9b6b563c
PM
1839 char compat[256];
1840 int len, i = 0;
21fe3301 1841#ifdef CONFIG_PPC64
9b6b563c 1842 phandle rtas;
e8222502 1843 int x;
21fe3301 1844#endif
e8222502 1845
6e35d5da 1846 /* Look for a PowerMac or a Cell */
5827d416 1847 len = prom_getprop(prom.root, "compatible",
9b6b563c
PM
1848 compat, sizeof(compat)-1);
1849 if (len > 0) {
1850 compat[len] = 0;
1851 while (i < len) {
1852 char *p = &compat[i];
1853 int sl = strlen(p);
1854 if (sl == 0)
1855 break;
5827d416
AB
1856 if (strstr(p, "Power Macintosh") ||
1857 strstr(p, "MacRISC"))
9b6b563c 1858 return PLATFORM_POWERMAC;
133dda1e
AB
1859#ifdef CONFIG_PPC64
1860 /* We must make sure we don't detect the IBM Cell
1861 * blades as pSeries due to some firmware issues,
1862 * so we do it here.
1863 */
5827d416
AB
1864 if (strstr(p, "IBM,CBEA") ||
1865 strstr(p, "IBM,CPBW-1.0"))
133dda1e
AB
1866 return PLATFORM_GENERIC;
1867#endif /* CONFIG_PPC64 */
9b6b563c
PM
1868 i += sl + 1;
1869 }
1870 }
1871#ifdef CONFIG_PPC64
6e35d5da
BH
1872 /* Try to detect OPAL */
1873 if (PHANDLE_VALID(call_prom("finddevice", 1, 1, ADDR("/ibm,opal"))))
1874 return PLATFORM_OPAL;
1875
1876 /* Try to figure out if it's an IBM pSeries or any other
e8222502
BH
1877 * PAPR compliant platform. We assume it is if :
1878 * - /device_type is "chrp" (please, do NOT use that for future
1879 * non-IBM designs !
1880 * - it has /rtas
1881 */
5827d416 1882 len = prom_getprop(prom.root, "device_type",
e8222502
BH
1883 compat, sizeof(compat)-1);
1884 if (len <= 0)
1885 return PLATFORM_GENERIC;
5827d416 1886 if (strcmp(compat, "chrp"))
e8222502
BH
1887 return PLATFORM_GENERIC;
1888
9b6b563c
PM
1889 /* Default to pSeries. We need to know if we are running LPAR */
1890 rtas = call_prom("finddevice", 1, 1, ADDR("/rtas"));
e8222502
BH
1891 if (!PHANDLE_VALID(rtas))
1892 return PLATFORM_GENERIC;
1893 x = prom_getproplen(rtas, "ibm,hypertas-functions");
1894 if (x != PROM_ERROR) {
4da727ae 1895 prom_debug("Hypertas detected, assuming LPAR !\n");
e8222502 1896 return PLATFORM_PSERIES_LPAR;
9b6b563c
PM
1897 }
1898 return PLATFORM_PSERIES;
1899#else
e8222502 1900 return PLATFORM_GENERIC;
9b6b563c
PM
1901#endif
1902}
1903
9b6b563c
PM
1904static int __init prom_set_color(ihandle ih, int i, int r, int g, int b)
1905{
1906 return call_prom("call-method", 6, 1, ADDR("color!"), ih, i, b, g, r);
1907}
1908
1909/*
1910 * If we have a display that we don't know how to drive,
1911 * we will want to try to execute OF's open method for it
1912 * later. However, OF will probably fall over if we do that
1913 * we've taken over the MMU.
1914 * So we check whether we will need to open the display,
1915 * and if so, open it now.
1916 */
1917static void __init prom_check_displays(void)
1918{
1919 char type[16], *path;
1920 phandle node;
1921 ihandle ih;
1922 int i;
9b6b563c
PM
1923
1924 static unsigned char default_colors[] = {
1925 0x00, 0x00, 0x00,
1926 0x00, 0x00, 0xaa,
1927 0x00, 0xaa, 0x00,
1928 0x00, 0xaa, 0xaa,
1929 0xaa, 0x00, 0x00,
1930 0xaa, 0x00, 0xaa,
1931 0xaa, 0xaa, 0x00,
1932 0xaa, 0xaa, 0xaa,
1933 0x55, 0x55, 0x55,
1934 0x55, 0x55, 0xff,
1935 0x55, 0xff, 0x55,
1936 0x55, 0xff, 0xff,
1937 0xff, 0x55, 0x55,
1938 0xff, 0x55, 0xff,
1939 0xff, 0xff, 0x55,
1940 0xff, 0xff, 0xff
1941 };
1942 const unsigned char *clut;
1943
4da727ae 1944 prom_debug("Looking for displays\n");
9b6b563c
PM
1945 for (node = 0; prom_next_node(&node); ) {
1946 memset(type, 0, sizeof(type));
1947 prom_getprop(node, "device_type", type, sizeof(type));
5827d416 1948 if (strcmp(type, "display") != 0)
9b6b563c
PM
1949 continue;
1950
1951 /* It seems OF doesn't null-terminate the path :-( */
5827d416 1952 path = prom_scratch;
9b6b563c
PM
1953 memset(path, 0, PROM_SCRATCH_SIZE);
1954
1955 /*
1956 * leave some room at the end of the path for appending extra
1957 * arguments
1958 */
1959 if (call_prom("package-to-path", 3, 1, node, path,
1960 PROM_SCRATCH_SIZE-10) == PROM_ERROR)
1961 continue;
1f8737aa 1962 prom_printf("found display : %s, opening... ", path);
9b6b563c
PM
1963
1964 ih = call_prom("open", 1, 1, path);
1965 if (ih == 0) {
1966 prom_printf("failed\n");
1967 continue;
1968 }
1969
1970 /* Success */
1971 prom_printf("done\n");
a23414be 1972 prom_setprop(node, path, "linux,opened", NULL, 0);
9b6b563c
PM
1973
1974 /* Setup a usable color table when the appropriate
1975 * method is available. Should update this to set-colors */
5827d416 1976 clut = default_colors;
3f53638c 1977 for (i = 0; i < 16; i++, clut += 3)
9b6b563c
PM
1978 if (prom_set_color(ih, i, clut[0], clut[1],
1979 clut[2]) != 0)
1980 break;
1981
1982#ifdef CONFIG_LOGO_LINUX_CLUT224
5827d416
AB
1983 clut = PTRRELOC(logo_linux_clut224.clut);
1984 for (i = 0; i < logo_linux_clut224.clutsize; i++, clut += 3)
9b6b563c
PM
1985 if (prom_set_color(ih, i + 32, clut[0], clut[1],
1986 clut[2]) != 0)
1987 break;
1988#endif /* CONFIG_LOGO_LINUX_CLUT224 */
7191b615
BH
1989
1990#ifdef CONFIG_PPC_EARLY_DEBUG_BOOTX
1991 if (prom_getprop(node, "linux,boot-display", NULL, 0) !=
1992 PROM_ERROR) {
1993 u32 width, height, pitch, addr;
1994
1995 prom_printf("Setting btext !\n");
1996 prom_getprop(node, "width", &width, 4);
1997 prom_getprop(node, "height", &height, 4);
1998 prom_getprop(node, "linebytes", &pitch, 4);
1999 prom_getprop(node, "address", &addr, 4);
2000 prom_printf("W=%d H=%d LB=%d addr=0x%x\n",
2001 width, height, pitch, addr);
2002 btext_setup_display(width, height, 8, pitch, addr);
2003 }
2004#endif /* CONFIG_PPC_EARLY_DEBUG_BOOTX */
9b6b563c
PM
2005 }
2006}
2007
2008
2009/* Return (relocated) pointer to this much memory: moves initrd if reqd. */
2010static void __init *make_room(unsigned long *mem_start, unsigned long *mem_end,
2011 unsigned long needed, unsigned long align)
2012{
2013 void *ret;
2014
2015 *mem_start = _ALIGN(*mem_start, align);
2016 while ((*mem_start + needed) > *mem_end) {
2017 unsigned long room, chunk;
2018
2019 prom_debug("Chunk exhausted, claiming more at %x...\n",
5827d416
AB
2020 alloc_bottom);
2021 room = alloc_top - alloc_bottom;
9b6b563c
PM
2022 if (room > DEVTREE_CHUNK_SIZE)
2023 room = DEVTREE_CHUNK_SIZE;
2024 if (room < PAGE_SIZE)
fbafd728
AB
2025 prom_panic("No memory for flatten_device_tree "
2026 "(no room)\n");
9b6b563c
PM
2027 chunk = alloc_up(room, 0);
2028 if (chunk == 0)
fbafd728
AB
2029 prom_panic("No memory for flatten_device_tree "
2030 "(claim failed)\n");
966728dd 2031 *mem_end = chunk + room;
9b6b563c
PM
2032 }
2033
2034 ret = (void *)*mem_start;
2035 *mem_start += needed;
2036
2037 return ret;
2038}
2039
493adffc
BH
2040#define dt_push_token(token, mem_start, mem_end) do { \
2041 void *room = make_room(mem_start, mem_end, 4, 4); \
2042 *(__be32 *)room = cpu_to_be32(token); \
2043 } while(0)
9b6b563c
PM
2044
2045static unsigned long __init dt_find_string(char *str)
2046{
2047 char *s, *os;
2048
5827d416 2049 s = os = (char *)dt_string_start;
9b6b563c 2050 s += 4;
5827d416 2051 while (s < (char *)dt_string_end) {
9b6b563c
PM
2052 if (strcmp(s, str) == 0)
2053 return s - os;
2054 s += strlen(s) + 1;
2055 }
2056 return 0;
2057}
2058
2059/*
2060 * The Open Firmware 1275 specification states properties must be 31 bytes or
2061 * less, however not all firmwares obey this. Make it 64 bytes to be safe.
2062 */
2063#define MAX_PROPERTY_NAME 64
2064
2065static void __init scan_dt_build_strings(phandle node,
2066 unsigned long *mem_start,
2067 unsigned long *mem_end)
2068{
2069 char *prev_name, *namep, *sstart;
2070 unsigned long soff;
2071 phandle child;
2072
5827d416 2073 sstart = (char *)dt_string_start;
9b6b563c
PM
2074
2075 /* get and store all property names */
5827d416 2076 prev_name = "";
9b6b563c
PM
2077 for (;;) {
2078 /* 64 is max len of name including nul. */
2079 namep = make_room(mem_start, mem_end, MAX_PROPERTY_NAME, 1);
2080 if (call_prom("nextprop", 3, 1, node, prev_name, namep) != 1) {
2081 /* No more nodes: unwind alloc */
2082 *mem_start = (unsigned long)namep;
2083 break;
2084 }
2085
2086 /* skip "name" */
5827d416 2087 if (strcmp(namep, "name") == 0) {
9b6b563c 2088 *mem_start = (unsigned long)namep;
5827d416 2089 prev_name = "name";
9b6b563c
PM
2090 continue;
2091 }
2092 /* get/create string entry */
2093 soff = dt_find_string(namep);
2094 if (soff != 0) {
2095 *mem_start = (unsigned long)namep;
2096 namep = sstart + soff;
2097 } else {
2098 /* Trim off some if we can */
2099 *mem_start = (unsigned long)namep + strlen(namep) + 1;
5827d416 2100 dt_string_end = *mem_start;
9b6b563c
PM
2101 }
2102 prev_name = namep;
2103 }
2104
2105 /* do all our children */
2106 child = call_prom("child", 1, 1, node);
2107 while (child != 0) {
2108 scan_dt_build_strings(child, mem_start, mem_end);
2109 child = call_prom("peer", 1, 1, child);
2110 }
2111}
2112
2113static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
2114 unsigned long *mem_end)
2115{
2116 phandle child;
2117 char *namep, *prev_name, *sstart, *p, *ep, *lp, *path;
2118 unsigned long soff;
2119 unsigned char *valp;
2120 static char pname[MAX_PROPERTY_NAME];
6e35d5da 2121 int l, room, has_phandle = 0;
9b6b563c
PM
2122
2123 dt_push_token(OF_DT_BEGIN_NODE, mem_start, mem_end);
2124
2125 /* get the node's full name */
2126 namep = (char *)*mem_start;
c4988820
PM
2127 room = *mem_end - *mem_start;
2128 if (room > 255)
2129 room = 255;
2130 l = call_prom("package-to-path", 3, 1, node, namep, room);
9b6b563c
PM
2131 if (l >= 0) {
2132 /* Didn't fit? Get more room. */
c4988820
PM
2133 if (l >= room) {
2134 if (l >= *mem_end - *mem_start)
2135 namep = make_room(mem_start, mem_end, l+1, 1);
9b6b563c
PM
2136 call_prom("package-to-path", 3, 1, node, namep, l);
2137 }
2138 namep[l] = '\0';
2139
2140 /* Fixup an Apple bug where they have bogus \0 chars in the
a575b807
PM
2141 * middle of the path in some properties, and extract
2142 * the unit name (everything after the last '/').
9b6b563c 2143 */
a575b807 2144 for (lp = p = namep, ep = namep + l; p < ep; p++) {
9b6b563c 2145 if (*p == '/')
a575b807
PM
2146 lp = namep;
2147 else if (*p != 0)
2148 *lp++ = *p;
2149 }
2150 *lp = 0;
2151 *mem_start = _ALIGN((unsigned long)lp + 1, 4);
9b6b563c
PM
2152 }
2153
2154 /* get it again for debugging */
5827d416 2155 path = prom_scratch;
9b6b563c
PM
2156 memset(path, 0, PROM_SCRATCH_SIZE);
2157 call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1);
2158
2159 /* get and store all properties */
5827d416
AB
2160 prev_name = "";
2161 sstart = (char *)dt_string_start;
9b6b563c
PM
2162 for (;;) {
2163 if (call_prom("nextprop", 3, 1, node, prev_name,
5827d416 2164 pname) != 1)
9b6b563c
PM
2165 break;
2166
2167 /* skip "name" */
5827d416
AB
2168 if (strcmp(pname, "name") == 0) {
2169 prev_name = "name";
9b6b563c
PM
2170 continue;
2171 }
2172
2173 /* find string offset */
5827d416 2174 soff = dt_find_string(pname);
9b6b563c
PM
2175 if (soff == 0) {
2176 prom_printf("WARNING: Can't find string index for"
5827d416 2177 " <%s>, node %s\n", pname, path);
9b6b563c
PM
2178 break;
2179 }
2180 prev_name = sstart + soff;
2181
2182 /* get length */
5827d416 2183 l = call_prom("getproplen", 2, 1, node, pname);
9b6b563c
PM
2184
2185 /* sanity checks */
2186 if (l == PROM_ERROR)
2187 continue;
9b6b563c
PM
2188
2189 /* push property head */
2190 dt_push_token(OF_DT_PROP, mem_start, mem_end);
2191 dt_push_token(l, mem_start, mem_end);
2192 dt_push_token(soff, mem_start, mem_end);
2193
2194 /* push property content */
2195 valp = make_room(mem_start, mem_end, l, 4);
5827d416 2196 call_prom("getprop", 4, 1, node, pname, valp, l);
9b6b563c 2197 *mem_start = _ALIGN(*mem_start, 4);
6e35d5da 2198
5827d416 2199 if (!strcmp(pname, "phandle"))
6e35d5da 2200 has_phandle = 1;
9b6b563c
PM
2201 }
2202
6e35d5da
BH
2203 /* Add a "linux,phandle" property if no "phandle" property already
2204 * existed (can happen with OPAL)
2205 */
2206 if (!has_phandle) {
5827d416 2207 soff = dt_find_string("linux,phandle");
6e35d5da
BH
2208 if (soff == 0)
2209 prom_printf("WARNING: Can't find string index for"
2210 " <linux-phandle> node %s\n", path);
2211 else {
2212 dt_push_token(OF_DT_PROP, mem_start, mem_end);
2213 dt_push_token(4, mem_start, mem_end);
2214 dt_push_token(soff, mem_start, mem_end);
2215 valp = make_room(mem_start, mem_end, 4, 4);
493adffc 2216 *(__be32 *)valp = cpu_to_be32(node);
6e35d5da 2217 }
9b6b563c
PM
2218 }
2219
2220 /* do all our children */
2221 child = call_prom("child", 1, 1, node);
2222 while (child != 0) {
2223 scan_dt_build_struct(child, mem_start, mem_end);
2224 child = call_prom("peer", 1, 1, child);
2225 }
2226
2227 dt_push_token(OF_DT_END_NODE, mem_start, mem_end);
2228}
2229
2230static void __init flatten_device_tree(void)
2231{
2232 phandle root;
2233 unsigned long mem_start, mem_end, room;
2234 struct boot_param_header *hdr;
9b6b563c
PM
2235 char *namep;
2236 u64 *rsvmap;
2237
2238 /*
2239 * Check how much room we have between alloc top & bottom (+/- a
fbafd728 2240 * few pages), crop to 1MB, as this is our "chunk" size
9b6b563c 2241 */
5827d416 2242 room = alloc_top - alloc_bottom - 0x4000;
9b6b563c
PM
2243 if (room > DEVTREE_CHUNK_SIZE)
2244 room = DEVTREE_CHUNK_SIZE;
5827d416 2245 prom_debug("starting device tree allocs at %x\n", alloc_bottom);
9b6b563c
PM
2246
2247 /* Now try to claim that */
2248 mem_start = (unsigned long)alloc_up(room, PAGE_SIZE);
2249 if (mem_start == 0)
2250 prom_panic("Can't allocate initial device-tree chunk\n");
966728dd 2251 mem_end = mem_start + room;
9b6b563c
PM
2252
2253 /* Get root of tree */
2254 root = call_prom("peer", 1, 1, (phandle)0);
2255 if (root == (phandle)0)
2256 prom_panic ("couldn't get device tree root\n");
2257
2258 /* Build header and make room for mem rsv map */
2259 mem_start = _ALIGN(mem_start, 4);
2260 hdr = make_room(&mem_start, &mem_end,
2261 sizeof(struct boot_param_header), 4);
5827d416 2262 dt_header_start = (unsigned long)hdr;
9b6b563c
PM
2263 rsvmap = make_room(&mem_start, &mem_end, sizeof(mem_reserve_map), 8);
2264
2265 /* Start of strings */
2266 mem_start = PAGE_ALIGN(mem_start);
5827d416 2267 dt_string_start = mem_start;
9b6b563c
PM
2268 mem_start += 4; /* hole */
2269
2270 /* Add "linux,phandle" in there, we'll need it */
2271 namep = make_room(&mem_start, &mem_end, 16, 1);
5827d416 2272 strcpy(namep, "linux,phandle");
9b6b563c
PM
2273 mem_start = (unsigned long)namep + strlen(namep) + 1;
2274
2275 /* Build string array */
2276 prom_printf("Building dt strings...\n");
2277 scan_dt_build_strings(root, &mem_start, &mem_end);
5827d416 2278 dt_string_end = mem_start;
9b6b563c
PM
2279
2280 /* Build structure */
2281 mem_start = PAGE_ALIGN(mem_start);
5827d416 2282 dt_struct_start = mem_start;
9b6b563c
PM
2283 prom_printf("Building dt structure...\n");
2284 scan_dt_build_struct(root, &mem_start, &mem_end);
2285 dt_push_token(OF_DT_END, &mem_start, &mem_end);
5827d416 2286 dt_struct_end = PAGE_ALIGN(mem_start);
9b6b563c
PM
2287
2288 /* Finish header */
493adffc
BH
2289 hdr->boot_cpuid_phys = cpu_to_be32(prom.cpu);
2290 hdr->magic = cpu_to_be32(OF_DT_HEADER);
2291 hdr->totalsize = cpu_to_be32(dt_struct_end - dt_header_start);
2292 hdr->off_dt_struct = cpu_to_be32(dt_struct_start - dt_header_start);
2293 hdr->off_dt_strings = cpu_to_be32(dt_string_start - dt_header_start);
2294 hdr->dt_strings_size = cpu_to_be32(dt_string_end - dt_string_start);
2295 hdr->off_mem_rsvmap = cpu_to_be32(((unsigned long)rsvmap) - dt_header_start);
2296 hdr->version = cpu_to_be32(OF_DT_VERSION);
9b6b563c 2297 /* Version 16 is not backward compatible */
493adffc 2298 hdr->last_comp_version = cpu_to_be32(0x10);
9b6b563c 2299
4d1f3f25 2300 /* Copy the reserve map in */
5827d416 2301 memcpy(rsvmap, mem_reserve_map, sizeof(mem_reserve_map));
9b6b563c
PM
2302
2303#ifdef DEBUG_PROM
2304 {
2305 int i;
2306 prom_printf("reserved memory map:\n");
5827d416 2307 for (i = 0; i < mem_reserve_cnt; i++)
9b6b563c 2308 prom_printf(" %x - %x\n",
493adffc
BH
2309 be64_to_cpu(mem_reserve_map[i].base),
2310 be64_to_cpu(mem_reserve_map[i].size));
9b6b563c
PM
2311 }
2312#endif
4d1f3f25
JX
2313 /* Bump mem_reserve_cnt to cause further reservations to fail
2314 * since it's too late.
2315 */
5827d416 2316 mem_reserve_cnt = MEM_RESERVE_MAP_SIZE;
9b6b563c
PM
2317
2318 prom_printf("Device tree strings 0x%x -> 0x%x\n",
5827d416 2319 dt_string_start, dt_string_end);
9b6b563c 2320 prom_printf("Device tree struct 0x%x -> 0x%x\n",
5827d416 2321 dt_struct_start, dt_struct_end);
9b6b563c
PM
2322}
2323
54f4ee18
HB
2324#ifdef CONFIG_PPC_MAPLE
2325/* PIBS Version 1.05.0000 04/26/2005 has an incorrect /ht/isa/ranges property.
2326 * The values are bad, and it doesn't even have the right number of cells. */
2327static void __init fixup_device_tree_maple(void)
9b6b563c 2328{
54f4ee18 2329 phandle isa;
980a6513 2330 u32 rloc = 0x01002000; /* IO space; PCI device = 4 */
54f4ee18 2331 u32 isa_ranges[6];
980a6513
BH
2332 char *name;
2333
2334 name = "/ht@0/isa@4";
2335 isa = call_prom("finddevice", 1, 1, ADDR(name));
2336 if (!PHANDLE_VALID(isa)) {
2337 name = "/ht@0/isa@6";
2338 isa = call_prom("finddevice", 1, 1, ADDR(name));
2339 rloc = 0x01003000; /* IO space; PCI device = 6 */
2340 }
54f4ee18
HB
2341 if (!PHANDLE_VALID(isa))
2342 return;
2343
980a6513
BH
2344 if (prom_getproplen(isa, "ranges") != 12)
2345 return;
54f4ee18
HB
2346 if (prom_getprop(isa, "ranges", isa_ranges, sizeof(isa_ranges))
2347 == PROM_ERROR)
2348 return;
2349
2350 if (isa_ranges[0] != 0x1 ||
2351 isa_ranges[1] != 0xf4000000 ||
2352 isa_ranges[2] != 0x00010000)
2353 return;
2354
980a6513 2355 prom_printf("Fixing up bogus ISA range on Maple/Apache...\n");
54f4ee18
HB
2356
2357 isa_ranges[0] = 0x1;
2358 isa_ranges[1] = 0x0;
980a6513 2359 isa_ranges[2] = rloc;
54f4ee18
HB
2360 isa_ranges[3] = 0x0;
2361 isa_ranges[4] = 0x0;
2362 isa_ranges[5] = 0x00010000;
980a6513 2363 prom_setprop(isa, name, "ranges",
54f4ee18
HB
2364 isa_ranges, sizeof(isa_ranges));
2365}
8f101a05
HC
2366
2367#define CPC925_MC_START 0xf8000000
2368#define CPC925_MC_LENGTH 0x1000000
2369/* The values for memory-controller don't have right number of cells */
2370static void __init fixup_device_tree_maple_memory_controller(void)
2371{
2372 phandle mc;
2373 u32 mc_reg[4];
2374 char *name = "/hostbridge@f8000000";
8f101a05
HC
2375 u32 ac, sc;
2376
2377 mc = call_prom("finddevice", 1, 1, ADDR(name));
2378 if (!PHANDLE_VALID(mc))
2379 return;
2380
2381 if (prom_getproplen(mc, "reg") != 8)
2382 return;
2383
5827d416
AB
2384 prom_getprop(prom.root, "#address-cells", &ac, sizeof(ac));
2385 prom_getprop(prom.root, "#size-cells", &sc, sizeof(sc));
8f101a05
HC
2386 if ((ac != 2) || (sc != 2))
2387 return;
2388
2389 if (prom_getprop(mc, "reg", mc_reg, sizeof(mc_reg)) == PROM_ERROR)
2390 return;
2391
2392 if (mc_reg[0] != CPC925_MC_START || mc_reg[1] != CPC925_MC_LENGTH)
2393 return;
2394
2395 prom_printf("Fixing up bogus hostbridge on Maple...\n");
2396
2397 mc_reg[0] = 0x0;
2398 mc_reg[1] = CPC925_MC_START;
2399 mc_reg[2] = 0x0;
2400 mc_reg[3] = CPC925_MC_LENGTH;
2401 prom_setprop(mc, name, "reg", mc_reg, sizeof(mc_reg));
2402}
54f4ee18
HB
2403#else
2404#define fixup_device_tree_maple()
8f101a05 2405#define fixup_device_tree_maple_memory_controller()
54f4ee18
HB
2406#endif
2407
e8c0acf9 2408#ifdef CONFIG_PPC_CHRP
e4805922
OH
2409/*
2410 * Pegasos and BriQ lacks the "ranges" property in the isa node
2411 * Pegasos needs decimal IRQ 14/15, not hexadecimal
556ecf9b 2412 * Pegasos has the IDE configured in legacy mode, but advertised as native
e4805922 2413 */
e8c0acf9
BH
2414static void __init fixup_device_tree_chrp(void)
2415{
e4805922
OH
2416 phandle ph;
2417 u32 prop[6];
26c5032e 2418 u32 rloc = 0x01006000; /* IO space; PCI device = 12 */
e8c0acf9
BH
2419 char *name;
2420 int rc;
2421
2422 name = "/pci@80000000/isa@c";
e4805922
OH
2423 ph = call_prom("finddevice", 1, 1, ADDR(name));
2424 if (!PHANDLE_VALID(ph)) {
26c5032e 2425 name = "/pci@ff500000/isa@6";
e4805922 2426 ph = call_prom("finddevice", 1, 1, ADDR(name));
26c5032e
BH
2427 rloc = 0x01003000; /* IO space; PCI device = 6 */
2428 }
e4805922
OH
2429 if (PHANDLE_VALID(ph)) {
2430 rc = prom_getproplen(ph, "ranges");
2431 if (rc == 0 || rc == PROM_ERROR) {
2432 prom_printf("Fixing up missing ISA range on Pegasos...\n");
2433
2434 prop[0] = 0x1;
2435 prop[1] = 0x0;
2436 prop[2] = rloc;
2437 prop[3] = 0x0;
2438 prop[4] = 0x0;
2439 prop[5] = 0x00010000;
2440 prom_setprop(ph, name, "ranges", prop, sizeof(prop));
2441 }
2442 }
e8c0acf9 2443
e4805922
OH
2444 name = "/pci@80000000/ide@C,1";
2445 ph = call_prom("finddevice", 1, 1, ADDR(name));
2446 if (PHANDLE_VALID(ph)) {
2447 prom_printf("Fixing up IDE interrupt on Pegasos...\n");
2448 prop[0] = 14;
2449 prop[1] = 0x0;
556ecf9b
OH
2450 prom_setprop(ph, name, "interrupts", prop, 2*sizeof(u32));
2451 prom_printf("Fixing up IDE class-code on Pegasos...\n");
2452 rc = prom_getprop(ph, "class-code", prop, sizeof(u32));
2453 if (rc == sizeof(u32)) {
2454 prop[0] &= ~0x5;
2455 prom_setprop(ph, name, "class-code", prop, sizeof(u32));
2456 }
e4805922 2457 }
e8c0acf9
BH
2458}
2459#else
2460#define fixup_device_tree_chrp()
2461#endif
2462
9b6b563c 2463#if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC)
54f4ee18
HB
2464static void __init fixup_device_tree_pmac(void)
2465{
9b6b563c
PM
2466 phandle u3, i2c, mpic;
2467 u32 u3_rev;
2468 u32 interrupts[2];
2469 u32 parent;
2470
2471 /* Some G5s have a missing interrupt definition, fix it up here */
2472 u3 = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000"));
2473 if (!PHANDLE_VALID(u3))
2474 return;
2475 i2c = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/i2c@f8001000"));
2476 if (!PHANDLE_VALID(i2c))
2477 return;
2478 mpic = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/mpic@f8040000"));
2479 if (!PHANDLE_VALID(mpic))
2480 return;
2481
2482 /* check if proper rev of u3 */
2483 if (prom_getprop(u3, "device-rev", &u3_rev, sizeof(u3_rev))
2484 == PROM_ERROR)
2485 return;
7d49697e 2486 if (u3_rev < 0x35 || u3_rev > 0x39)
9b6b563c
PM
2487 return;
2488 /* does it need fixup ? */
2489 if (prom_getproplen(i2c, "interrupts") > 0)
2490 return;
2491
2492 prom_printf("fixing up bogus interrupts for u3 i2c...\n");
2493
2494 /* interrupt on this revision of u3 is number 0 and level */
2495 interrupts[0] = 0;
2496 interrupts[1] = 1;
a23414be
PM
2497 prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupts",
2498 &interrupts, sizeof(interrupts));
9b6b563c 2499 parent = (u32)mpic;
a23414be
PM
2500 prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupt-parent",
2501 &parent, sizeof(parent));
9b6b563c 2502}
54f4ee18
HB
2503#else
2504#define fixup_device_tree_pmac()
2505#endif
9b6b563c 2506
88fd2a9d 2507#ifdef CONFIG_PPC_EFIKA
94d2dde7
GL
2508/*
2509 * The MPC5200 FEC driver requires an phy-handle property to tell it how
2510 * to talk to the phy. If the phy-handle property is missing, then this
2511 * function is called to add the appropriate nodes and link it to the
2512 * ethernet node.
2513 */
2514static void __init fixup_device_tree_efika_add_phy(void)
88fd2a9d 2515{
88fd2a9d
SM
2516 u32 node;
2517 char prop[64];
94d2dde7 2518 int rv;
88fd2a9d 2519
94d2dde7
GL
2520 /* Check if /builtin/ethernet exists - bail if it doesn't */
2521 node = call_prom("finddevice", 1, 1, ADDR("/builtin/ethernet"));
88fd2a9d
SM
2522 if (!PHANDLE_VALID(node))
2523 return;
2524
94d2dde7
GL
2525 /* Check if the phy-handle property exists - bail if it does */
2526 rv = prom_getprop(node, "phy-handle", prop, sizeof(prop));
2527 if (!rv)
88fd2a9d
SM
2528 return;
2529
94d2dde7
GL
2530 /*
2531 * At this point the ethernet device doesn't have a phy described.
2532 * Now we need to add the missing phy node and linkage
2533 */
6f4347c9 2534
94d2dde7 2535 /* Check for an MDIO bus node - if missing then create one */
6f4347c9
OH
2536 node = call_prom("finddevice", 1, 1, ADDR("/builtin/mdio"));
2537 if (!PHANDLE_VALID(node)) {
2538 prom_printf("Adding Ethernet MDIO node\n");
2539 call_prom("interpret", 1, 1,
2540 " s\" /builtin\" find-device"
2541 " new-device"
2542 " 1 encode-int s\" #address-cells\" property"
2543 " 0 encode-int s\" #size-cells\" property"
94d2dde7
GL
2544 " s\" mdio\" device-name"
2545 " s\" fsl,mpc5200b-mdio\" encode-string"
6f4347c9
OH
2546 " s\" compatible\" property"
2547 " 0xf0003000 0x400 reg"
2548 " 0x2 encode-int"
2549 " 0x5 encode-int encode+"
2550 " 0x3 encode-int encode+"
2551 " s\" interrupts\" property"
2552 " finish-device");
2553 };
2554
94d2dde7
GL
2555 /* Check for a PHY device node - if missing then create one and
2556 * give it's phandle to the ethernet node */
2557 node = call_prom("finddevice", 1, 1,
2558 ADDR("/builtin/mdio/ethernet-phy"));
6f4347c9
OH
2559 if (!PHANDLE_VALID(node)) {
2560 prom_printf("Adding Ethernet PHY node\n");
2561 call_prom("interpret", 1, 1,
2562 " s\" /builtin/mdio\" find-device"
2563 " new-device"
2564 " s\" ethernet-phy\" device-name"
2565 " 0x10 encode-int s\" reg\" property"
2566 " my-self"
2567 " ihandle>phandle"
2568 " finish-device"
2569 " s\" /builtin/ethernet\" find-device"
2570 " encode-int"
2571 " s\" phy-handle\" property"
2572 " device-end");
2573 }
94d2dde7
GL
2574}
2575
2576static void __init fixup_device_tree_efika(void)
2577{
2578 int sound_irq[3] = { 2, 2, 0 };
2579 int bcomm_irq[3*16] = { 3,0,0, 3,1,0, 3,2,0, 3,3,0,
2580 3,4,0, 3,5,0, 3,6,0, 3,7,0,
2581 3,8,0, 3,9,0, 3,10,0, 3,11,0,
2582 3,12,0, 3,13,0, 3,14,0, 3,15,0 };
2583 u32 node;
2584 char prop[64];
2585 int rv, len;
2586
2587 /* Check if we're really running on a EFIKA */
2588 node = call_prom("finddevice", 1, 1, ADDR("/"));
2589 if (!PHANDLE_VALID(node))
2590 return;
2591
2592 rv = prom_getprop(node, "model", prop, sizeof(prop));
2593 if (rv == PROM_ERROR)
2594 return;
2595 if (strcmp(prop, "EFIKA5K2"))
2596 return;
2597
2598 prom_printf("Applying EFIKA device tree fixups\n");
2599
2600 /* Claiming to be 'chrp' is death */
2601 node = call_prom("finddevice", 1, 1, ADDR("/"));
2602 rv = prom_getprop(node, "device_type", prop, sizeof(prop));
2603 if (rv != PROM_ERROR && (strcmp(prop, "chrp") == 0))
2604 prom_setprop(node, "/", "device_type", "efika", sizeof("efika"));
2605
7f4392cd
DW
2606 /* CODEGEN,description is exposed in /proc/cpuinfo so
2607 fix that too */
2608 rv = prom_getprop(node, "CODEGEN,description", prop, sizeof(prop));
2609 if (rv != PROM_ERROR && (strstr(prop, "CHRP")))
2610 prom_setprop(node, "/", "CODEGEN,description",
2611 "Efika 5200B PowerPC System",
2612 sizeof("Efika 5200B PowerPC System"));
2613
94d2dde7
GL
2614 /* Fixup bestcomm interrupts property */
2615 node = call_prom("finddevice", 1, 1, ADDR("/builtin/bestcomm"));
2616 if (PHANDLE_VALID(node)) {
2617 len = prom_getproplen(node, "interrupts");
2618 if (len == 12) {
2619 prom_printf("Fixing bestcomm interrupts property\n");
2620 prom_setprop(node, "/builtin/bestcom", "interrupts",
2621 bcomm_irq, sizeof(bcomm_irq));
2622 }
2623 }
2624
2625 /* Fixup sound interrupts property */
2626 node = call_prom("finddevice", 1, 1, ADDR("/builtin/sound"));
2627 if (PHANDLE_VALID(node)) {
2628 rv = prom_getprop(node, "interrupts", prop, sizeof(prop));
2629 if (rv == PROM_ERROR) {
2630 prom_printf("Adding sound interrupts property\n");
2631 prom_setprop(node, "/builtin/sound", "interrupts",
2632 sound_irq, sizeof(sound_irq));
2633 }
2634 }
6f4347c9 2635
94d2dde7
GL
2636 /* Make sure ethernet phy-handle property exists */
2637 fixup_device_tree_efika_add_phy();
88fd2a9d
SM
2638}
2639#else
2640#define fixup_device_tree_efika()
2641#endif
2642
54f4ee18
HB
2643static void __init fixup_device_tree(void)
2644{
2645 fixup_device_tree_maple();
8f101a05 2646 fixup_device_tree_maple_memory_controller();
e8c0acf9 2647 fixup_device_tree_chrp();
54f4ee18 2648 fixup_device_tree_pmac();
88fd2a9d 2649 fixup_device_tree_efika();
54f4ee18 2650}
9b6b563c
PM
2651
2652static void __init prom_find_boot_cpu(void)
2653{
493adffc 2654 __be32 rval;
9b6b563c
PM
2655 ihandle prom_cpu;
2656 phandle cpu_pkg;
2657
493adffc
BH
2658 rval = 0;
2659 if (prom_getprop(prom.chosen, "cpu", &rval, sizeof(rval)) <= 0)
a575b807 2660 return;
493adffc 2661 prom_cpu = be32_to_cpu(rval);
9b6b563c
PM
2662
2663 cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu);
2664
493adffc
BH
2665 prom_getprop(cpu_pkg, "reg", &rval, sizeof(rval));
2666 prom.cpu = be32_to_cpu(rval);
9b6b563c 2667
5827d416 2668 prom_debug("Booting CPU hw index = %lu\n", prom.cpu);
9b6b563c
PM
2669}
2670
2671static void __init prom_check_initrd(unsigned long r3, unsigned long r4)
2672{
2673#ifdef CONFIG_BLK_DEV_INITRD
9b6b563c 2674 if (r3 && r4 && r4 != 0xdeadbeef) {
493adffc 2675 __be64 val;
9b6b563c 2676
5827d416
AB
2677 prom_initrd_start = is_kernel_addr(r3) ? __pa(r3) : r3;
2678 prom_initrd_end = prom_initrd_start + r4;
9b6b563c 2679
493adffc 2680 val = cpu_to_be64(prom_initrd_start);
5827d416 2681 prom_setprop(prom.chosen, "/chosen", "linux,initrd-start",
a23414be 2682 &val, sizeof(val));
493adffc 2683 val = cpu_to_be64(prom_initrd_end);
5827d416 2684 prom_setprop(prom.chosen, "/chosen", "linux,initrd-end",
a23414be 2685 &val, sizeof(val));
9b6b563c 2686
5827d416
AB
2687 reserve_mem(prom_initrd_start,
2688 prom_initrd_end - prom_initrd_start);
9b6b563c 2689
5827d416
AB
2690 prom_debug("initrd_start=0x%x\n", prom_initrd_start);
2691 prom_debug("initrd_end=0x%x\n", prom_initrd_end);
9b6b563c
PM
2692 }
2693#endif /* CONFIG_BLK_DEV_INITRD */
2694}
2695
5ac47f7a
AB
2696#ifdef CONFIG_PPC64
2697#ifdef CONFIG_RELOCATABLE
2698static void reloc_toc(void)
2699{
2700}
2701
2702static void unreloc_toc(void)
2703{
2704}
2705#else
1674400a 2706static void __reloc_toc(unsigned long offset, unsigned long nr_entries)
5ac47f7a
AB
2707{
2708 unsigned long i;
1674400a
AB
2709 unsigned long *toc_entry;
2710
2711 /* Get the start of the TOC by using r2 directly. */
2712 asm volatile("addi %0,2,-0x8000" : "=b" (toc_entry));
5ac47f7a
AB
2713
2714 for (i = 0; i < nr_entries; i++) {
2715 *toc_entry = *toc_entry + offset;
2716 toc_entry++;
2717 }
2718}
2719
2720static void reloc_toc(void)
2721{
2722 unsigned long offset = reloc_offset();
2723 unsigned long nr_entries =
2724 (__prom_init_toc_end - __prom_init_toc_start) / sizeof(long);
2725
1674400a 2726 __reloc_toc(offset, nr_entries);
5ac47f7a
AB
2727
2728 mb();
2729}
2730
2731static void unreloc_toc(void)
2732{
2733 unsigned long offset = reloc_offset();
2734 unsigned long nr_entries =
2735 (__prom_init_toc_end - __prom_init_toc_start) / sizeof(long);
2736
2737 mb();
2738
1674400a 2739 __reloc_toc(-offset, nr_entries);
5ac47f7a
AB
2740}
2741#endif
2742#endif
27f44888 2743
9b6b563c
PM
2744/*
2745 * We enter here early on, when the Open Firmware prom is still
2746 * handling exceptions and the MMU hash table for us.
2747 */
2748
2749unsigned long __init prom_init(unsigned long r3, unsigned long r4,
2750 unsigned long pp,
549e8152
PM
2751 unsigned long r6, unsigned long r7,
2752 unsigned long kbase)
9b6b563c 2753{
9b6b563c 2754 unsigned long hdr;
9b6b563c
PM
2755
2756#ifdef CONFIG_PPC32
549e8152 2757 unsigned long offset = reloc_offset();
9b6b563c 2758 reloc_got2(offset);
5ac47f7a
AB
2759#else
2760 reloc_toc();
9b6b563c
PM
2761#endif
2762
9b6b563c
PM
2763 /*
2764 * First zero the BSS
2765 */
5827d416 2766 memset(&__bss_start, 0, __bss_stop - __bss_start);
9b6b563c
PM
2767
2768 /*
2769 * Init interface to Open Firmware, get some node references,
2770 * like /chosen
2771 */
2772 prom_init_client_services(pp);
2773
2774 /*
a23414be
PM
2775 * See if this OF is old enough that we need to do explicit maps
2776 * and other workarounds
9b6b563c 2777 */
a23414be 2778 prom_find_mmu();
9b6b563c 2779
a575b807 2780 /*
a23414be 2781 * Init prom stdout device
a575b807 2782 */
a23414be 2783 prom_init_stdout();
a575b807 2784
5827d416 2785 prom_printf("Preparing to boot %s", linux_banner);
e7943fbb 2786
9b6b563c
PM
2787 /*
2788 * Get default machine type. At this point, we do not differentiate
2789 * between pSeries SMP and pSeries LPAR
2790 */
5827d416
AB
2791 of_platform = prom_find_machine_type();
2792 prom_printf("Detected machine type: %x\n", of_platform);
9b6b563c 2793
0f890c8d 2794#ifndef CONFIG_NONSTATIC_KERNEL
add60ef3
OH
2795 /* Bail if this is a kdump kernel. */
2796 if (PHYSICAL_START > 0)
2797 prom_panic("Error: You can't boot a kdump kernel from OF!\n");
549e8152 2798#endif
add60ef3
OH
2799
2800 /*
2801 * Check for an initrd
2802 */
2803 prom_check_initrd(r3, r4);
2804
27f44888 2805#if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV)
9b6b563c
PM
2806 /*
2807 * On pSeries, inform the firmware about our capabilities
2808 */
5827d416
AB
2809 if (of_platform == PLATFORM_PSERIES ||
2810 of_platform == PLATFORM_PSERIES_LPAR)
9b6b563c
PM
2811 prom_send_capabilities();
2812#endif
2813
9b6b563c 2814 /*
f3f66f59 2815 * Copy the CPU hold code
9b6b563c 2816 */
5827d416 2817 if (of_platform != PLATFORM_POWERMAC)
549e8152 2818 copy_and_flush(0, kbase, 0x100, 0);
9b6b563c
PM
2819
2820 /*
2821 * Do early parsing of command line
2822 */
2823 early_cmdline_parse();
2824
2825 /*
2826 * Initialize memory management within prom_init
2827 */
2828 prom_init_mem();
2829
2830 /*
2831 * Determine which cpu is actually running right _now_
2832 */
2833 prom_find_boot_cpu();
2834
2835 /*
2836 * Initialize display devices
2837 */
2838 prom_check_displays();
2839
493adffc 2840#if defined(CONFIG_PPC64) && defined(__BIG_ENDIAN__)
9b6b563c
PM
2841 /*
2842 * Initialize IOMMU (TCE tables) on pSeries. Do that before anything else
2843 * that uses the allocator, we need to make sure we get the top of memory
2844 * available for us here...
2845 */
5827d416 2846 if (of_platform == PLATFORM_PSERIES)
9b6b563c
PM
2847 prom_initialize_tce_table();
2848#endif
2849
2850 /*
27f44888
BH
2851 * On non-powermacs, try to instantiate RTAS. PowerMacs don't
2852 * have a usable RTAS implementation.
9b6b563c 2853 */
5827d416
AB
2854 if (of_platform != PLATFORM_POWERMAC &&
2855 of_platform != PLATFORM_OPAL)
9b6b563c 2856 prom_instantiate_rtas();
27f44888
BH
2857
2858#ifdef CONFIG_PPC_POWERNV
493adffc 2859 if (of_platform == PLATFORM_OPAL)
6e35d5da 2860 prom_instantiate_opal();
493adffc 2861#endif /* CONFIG_PPC_POWERNV */
27f44888 2862
4a727429
AL
2863#ifdef CONFIG_PPC64
2864 /* instantiate sml */
2865 prom_instantiate_sml();
2866#endif
2867
27f44888
BH
2868 /*
2869 * On non-powermacs, put all CPUs in spin-loops.
2870 *
2871 * PowerMacs use a different mechanism to spin CPUs
dbe78b40
BH
2872 *
2873 * (This must be done after instanciating RTAS)
27f44888 2874 */
5827d416
AB
2875 if (of_platform != PLATFORM_POWERMAC &&
2876 of_platform != PLATFORM_OPAL)
27f44888 2877 prom_hold_cpus();
9b6b563c
PM
2878
2879 /*
2880 * Fill in some infos for use by the kernel later on
2881 */
493adffc
BH
2882 if (prom_memory_limit) {
2883 __be64 val = cpu_to_be64(prom_memory_limit);
5827d416 2884 prom_setprop(prom.chosen, "/chosen", "linux,memory-limit",
493adffc
BH
2885 &val, sizeof(val));
2886 }
9b6b563c 2887#ifdef CONFIG_PPC64
5827d416
AB
2888 if (prom_iommu_off)
2889 prom_setprop(prom.chosen, "/chosen", "linux,iommu-off",
a23414be 2890 NULL, 0);
9b6b563c 2891
5827d416
AB
2892 if (prom_iommu_force_on)
2893 prom_setprop(prom.chosen, "/chosen", "linux,iommu-force-on",
a23414be 2894 NULL, 0);
9b6b563c 2895
5827d416
AB
2896 if (prom_tce_alloc_start) {
2897 prom_setprop(prom.chosen, "/chosen", "linux,tce-alloc-start",
2898 &prom_tce_alloc_start,
9b6b563c 2899 sizeof(prom_tce_alloc_start));
5827d416
AB
2900 prom_setprop(prom.chosen, "/chosen", "linux,tce-alloc-end",
2901 &prom_tce_alloc_end,
9b6b563c
PM
2902 sizeof(prom_tce_alloc_end));
2903 }
2904#endif
2905
2906 /*
2907 * Fixup any known bugs in the device-tree
2908 */
2909 fixup_device_tree();
2910
2911 /*
2912 * Now finally create the flattened device-tree
2913 */
1f8737aa 2914 prom_printf("copying OF device tree...\n");
9b6b563c
PM
2915 flatten_device_tree();
2916
3825ac0e
PM
2917 /*
2918 * in case stdin is USB and still active on IBM machines...
2919 * Unfortunately quiesce crashes on some powermacs if we have
40dfef66
BH
2920 * closed stdin already (in particular the powerbook 101). It
2921 * appears that the OPAL version of OFW doesn't like it either.
3825ac0e 2922 */
5827d416
AB
2923 if (of_platform != PLATFORM_POWERMAC &&
2924 of_platform != PLATFORM_OPAL)
3825ac0e 2925 prom_close_stdin();
9b6b563c
PM
2926
2927 /*
2928 * Call OF "quiesce" method to shut down pending DMA's from
2929 * devices etc...
2930 */
7e862d7e 2931 prom_printf("Quiescing Open Firmware ...\n");
9b6b563c
PM
2932 call_prom("quiesce", 0, 0);
2933
2934 /*
2935 * And finally, call the kernel passing it the flattened device
2936 * tree and NULL as r5, thus triggering the new entry point which
2937 * is common to us and kexec
2938 */
5827d416 2939 hdr = dt_header_start;
40dfef66
BH
2940
2941 /* Don't print anything after quiesce under OPAL, it crashes OFW */
5827d416 2942 if (of_platform != PLATFORM_OPAL) {
7e862d7e 2943 prom_printf("Booting Linux via __start() ...\n");
40dfef66
BH
2944 prom_debug("->dt_header_start=0x%x\n", hdr);
2945 }
9b6b563c
PM
2946
2947#ifdef CONFIG_PPC32
2948 reloc_got2(-offset);
5ac47f7a
AB
2949#else
2950 unreloc_toc();
9b6b563c
PM
2951#endif
2952
6e35d5da
BH
2953#ifdef CONFIG_PPC_EARLY_DEBUG_OPAL
2954 /* OPAL early debug gets the OPAL base & entry in r8 and r9 */
2955 __start(hdr, kbase, 0, 0, 0,
5827d416 2956 prom_opal_base, prom_opal_entry);
6e35d5da
BH
2957#else
2958 __start(hdr, kbase, 0, 0, 0, 0, 0);
2959#endif
9b6b563c
PM
2960
2961 return 0;
2962}