Merge remote-tracking branch 'lightnvm/for-next'
[deliverable/linux.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 */
66443efa 698 VECTOR_LENGTH(21), /* 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 728 OV5_FEAT(OV5_PFO_HW_RNG) | OV5_FEAT(OV5_PFO_HW_ENCR) |
66443efa
ME
729 OV5_FEAT(OV5_PFO_HW_842), /* Byte 17 */
730 0, /* Byte 18 */
731 0, /* Byte 19 */
732 0, /* Byte 20 */
733 OV5_FEAT(OV5_SUB_PROCESSORS), /* Byte 21 */
e8a4fd0a 734
28bb9ee1 735 /* option vector 6: IBM PAPR hints */
e8a4fd0a 736 VECTOR_LENGTH(3), /* length */
28bb9ee1 737 0,
738 0,
739 OV6_LINUX,
f709bfac
PM
740};
741
493adffc
BH
742/* Old method - ELF header with PT_NOTE sections only works on BE */
743#ifdef __BIG_ENDIAN__
9b6b563c
PM
744static struct fake_elf {
745 Elf32_Ehdr elfhdr;
746 Elf32_Phdr phdr[2];
747 struct chrpnote {
748 u32 namesz;
749 u32 descsz;
750 u32 type;
751 char name[8]; /* "PowerPC" */
752 struct chrpdesc {
753 u32 real_mode;
754 u32 real_base;
755 u32 real_size;
756 u32 virt_base;
757 u32 virt_size;
758 u32 load_base;
759 } chrpdesc;
760 } chrpnote;
761 struct rpanote {
762 u32 namesz;
763 u32 descsz;
764 u32 type;
765 char name[24]; /* "IBM,RPA-Client-Config" */
766 struct rpadesc {
767 u32 lpar_affinity;
768 u32 min_rmo_size;
769 u32 min_rmo_percent;
770 u32 max_pft_size;
771 u32 splpar;
772 u32 min_load;
773 u32 new_mem_def;
774 u32 ignore_me;
775 } rpadesc;
776 } rpanote;
5663a123 777} fake_elf = {
9b6b563c
PM
778 .elfhdr = {
779 .e_ident = { 0x7f, 'E', 'L', 'F',
780 ELFCLASS32, ELFDATA2MSB, EV_CURRENT },
781 .e_type = ET_EXEC, /* yeah right */
782 .e_machine = EM_PPC,
783 .e_version = EV_CURRENT,
784 .e_phoff = offsetof(struct fake_elf, phdr),
785 .e_phentsize = sizeof(Elf32_Phdr),
786 .e_phnum = 2
787 },
788 .phdr = {
789 [0] = {
790 .p_type = PT_NOTE,
791 .p_offset = offsetof(struct fake_elf, chrpnote),
792 .p_filesz = sizeof(struct chrpnote)
793 }, [1] = {
794 .p_type = PT_NOTE,
795 .p_offset = offsetof(struct fake_elf, rpanote),
796 .p_filesz = sizeof(struct rpanote)
797 }
798 },
799 .chrpnote = {
800 .namesz = sizeof("PowerPC"),
801 .descsz = sizeof(struct chrpdesc),
802 .type = 0x1275,
803 .name = "PowerPC",
804 .chrpdesc = {
805 .real_mode = ~0U, /* ~0 means "don't care" */
806 .real_base = ~0U,
807 .real_size = ~0U,
808 .virt_base = ~0U,
809 .virt_size = ~0U,
810 .load_base = ~0U
811 },
812 },
813 .rpanote = {
814 .namesz = sizeof("IBM,RPA-Client-Config"),
815 .descsz = sizeof(struct rpadesc),
816 .type = 0x12759999,
817 .name = "IBM,RPA-Client-Config",
818 .rpadesc = {
5663a123
PM
819 .lpar_affinity = 0,
820 .min_rmo_size = 64, /* in megabytes */
9b6b563c 821 .min_rmo_percent = 0,
5663a123 822 .max_pft_size = 48, /* 2^48 bytes max PFT size */
9b6b563c
PM
823 .splpar = 1,
824 .min_load = ~0U,
5663a123 825 .new_mem_def = 0
9b6b563c
PM
826 }
827 }
828};
493adffc 829#endif /* __BIG_ENDIAN__ */
9b6b563c 830
efec959f
BH
831static int __init prom_count_smt_threads(void)
832{
833 phandle node;
834 char type[64];
835 unsigned int plen;
836
837 /* Pick up th first CPU node we can find */
838 for (node = 0; prom_next_node(&node); ) {
839 type[0] = 0;
840 prom_getprop(node, "device_type", type, sizeof(type));
841
5827d416 842 if (strcmp(type, "cpu"))
efec959f
BH
843 continue;
844 /*
845 * There is an entry for each smt thread, each entry being
846 * 4 bytes long. All cpus should have the same number of
847 * smt threads, so return after finding the first.
848 */
849 plen = prom_getproplen(node, "ibm,ppc-interrupt-server#s");
850 if (plen == PROM_ERROR)
851 break;
852 plen >>= 2;
2c48a7d6 853 prom_debug("Found %lu smt threads per core\n", (unsigned long)plen);
efec959f
BH
854
855 /* Sanity check */
856 if (plen < 1 || plen > 64) {
2c48a7d6 857 prom_printf("Threads per core %lu out of bounds, assuming 1\n",
efec959f
BH
858 (unsigned long)plen);
859 return 1;
860 }
861 return plen;
862 }
863 prom_debug("No threads found, assuming 1 per core\n");
864
865 return 1;
866
867}
868
869
9b6b563c
PM
870static void __init prom_send_capabilities(void)
871{
493adffc 872 ihandle root;
f709bfac 873 prom_arg_t ret;
dbd0c5d5
LD
874 u32 cores;
875 unsigned char *ptcores;
f709bfac
PM
876
877 root = call_prom("open", 1, 1, ADDR("/"));
878 if (root != 0) {
efec959f
BH
879 /* We need to tell the FW about the number of cores we support.
880 *
881 * To do that, we count the number of threads on the first core
882 * (we assume this is the same for all cores) and use it to
883 * divide NR_CPUS.
884 */
dbd0c5d5
LD
885
886 /* The core value may start at an odd address. If such a word
887 * access is made at a cache line boundary, this leads to an
888 * exception which may not be handled at this time.
889 * Forcing a per byte access to avoid exception.
890 */
891 ptcores = &ibm_architecture_vec[IBM_ARCH_VEC_NRCORES_OFFSET];
892 cores = 0;
893 cores |= ptcores[0] << 24;
894 cores |= ptcores[1] << 16;
895 cores |= ptcores[2] << 8;
896 cores |= ptcores[3];
897 if (cores != NR_CPUS) {
efec959f 898 prom_printf("WARNING ! "
2c48a7d6 899 "ibm_architecture_vec structure inconsistent: %lu!\n",
dbd0c5d5 900 cores);
efec959f 901 } else {
dbd0c5d5 902 cores = DIV_ROUND_UP(NR_CPUS, prom_count_smt_threads());
2c48a7d6 903 prom_printf("Max number of cores passed to firmware: %lu (NR_CPUS = %lu)\n",
dbd0c5d5
LD
904 cores, NR_CPUS);
905 ptcores[0] = (cores >> 24) & 0xff;
906 ptcores[1] = (cores >> 16) & 0xff;
907 ptcores[2] = (cores >> 8) & 0xff;
908 ptcores[3] = cores & 0xff;
efec959f
BH
909 }
910
f709bfac 911 /* try calling the ibm,client-architecture-support method */
049d0497 912 prom_printf("Calling ibm,client-architecture-support...");
f709bfac
PM
913 if (call_prom_ret("call-method", 3, 2, &ret,
914 ADDR("ibm,client-architecture-support"),
33b74977 915 root,
f709bfac
PM
916 ADDR(ibm_architecture_vec)) == 0) {
917 /* the call exists... */
918 if (ret)
4da727ae 919 prom_printf("\nWARNING: ibm,client-architecture"
f709bfac
PM
920 "-support call FAILED!\n");
921 call_prom("close", 1, 0, root);
4da727ae 922 prom_printf(" done\n");
f709bfac
PM
923 return;
924 }
925 call_prom("close", 1, 0, root);
049d0497 926 prom_printf(" not implemented\n");
f709bfac 927 }
9b6b563c 928
493adffc
BH
929#ifdef __BIG_ENDIAN__
930 {
931 ihandle elfloader;
932
933 /* no ibm,client-architecture-support call, try the old way */
934 elfloader = call_prom("open", 1, 1,
935 ADDR("/packages/elf-loader"));
936 if (elfloader == 0) {
937 prom_printf("couldn't open /packages/elf-loader\n");
938 return;
939 }
940 call_prom("call-method", 3, 1, ADDR("process-elf-header"),
941 elfloader, ADDR(&fake_elf));
942 call_prom("close", 1, 0, elfloader);
9b6b563c 943 }
493adffc 944#endif /* __BIG_ENDIAN__ */
9b6b563c 945}
493adffc 946#endif /* #if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) */
9b6b563c
PM
947
948/*
949 * Memory allocation strategy... our layout is normally:
950 *
951 * at 14Mb or more we have vmlinux, then a gap and initrd. In some
952 * rare cases, initrd might end up being before the kernel though.
953 * We assume this won't override the final kernel at 0, we have no
954 * provision to handle that in this version, but it should hopefully
955 * never happen.
956 *
957 * alloc_top is set to the top of RMO, eventually shrink down if the
958 * TCEs overlap
959 *
960 * alloc_bottom is set to the top of kernel/initrd
961 *
962 * from there, allocations are done this way : rtas is allocated
963 * topmost, and the device-tree is allocated from the bottom. We try
964 * to grow the device-tree allocation as we progress. If we can't,
965 * then we fail, we don't currently have a facility to restart
966 * elsewhere, but that shouldn't be necessary.
967 *
968 * Note that calls to reserve_mem have to be done explicitly, memory
969 * allocated with either alloc_up or alloc_down isn't automatically
970 * reserved.
971 */
972
973
974/*
975 * Allocates memory in the RMO upward from the kernel/initrd
976 *
977 * When align is 0, this is a special case, it means to allocate in place
978 * at the current location of alloc_bottom or fail (that is basically
979 * extending the previous allocation). Used for the device-tree flattening
980 */
981static unsigned long __init alloc_up(unsigned long size, unsigned long align)
982{
5827d416 983 unsigned long base = alloc_bottom;
9b6b563c
PM
984 unsigned long addr = 0;
985
c4988820
PM
986 if (align)
987 base = _ALIGN_UP(base, align);
9b6b563c 988 prom_debug("alloc_up(%x, %x)\n", size, align);
5827d416 989 if (ram_top == 0)
9b6b563c
PM
990 prom_panic("alloc_up() called with mem not initialized\n");
991
992 if (align)
5827d416 993 base = _ALIGN_UP(alloc_bottom, align);
9b6b563c 994 else
5827d416 995 base = alloc_bottom;
9b6b563c 996
5827d416 997 for(; (base + size) <= alloc_top;
9b6b563c
PM
998 base = _ALIGN_UP(base + 0x100000, align)) {
999 prom_debug(" trying: 0x%x\n\r", base);
1000 addr = (unsigned long)prom_claim(base, size, 0);
c4988820 1001 if (addr != PROM_ERROR && addr != 0)
9b6b563c
PM
1002 break;
1003 addr = 0;
1004 if (align == 0)
1005 break;
1006 }
1007 if (addr == 0)
1008 return 0;
5827d416 1009 alloc_bottom = addr + size;
9b6b563c
PM
1010
1011 prom_debug(" -> %x\n", addr);
5827d416
AB
1012 prom_debug(" alloc_bottom : %x\n", alloc_bottom);
1013 prom_debug(" alloc_top : %x\n", alloc_top);
1014 prom_debug(" alloc_top_hi : %x\n", alloc_top_high);
1015 prom_debug(" rmo_top : %x\n", rmo_top);
1016 prom_debug(" ram_top : %x\n", ram_top);
9b6b563c
PM
1017
1018 return addr;
1019}
1020
1021/*
1022 * Allocates memory downward, either from top of RMO, or if highmem
1023 * is set, from the top of RAM. Note that this one doesn't handle
1024 * failures. It does claim memory if highmem is not set.
1025 */
1026static unsigned long __init alloc_down(unsigned long size, unsigned long align,
1027 int highmem)
1028{
1029 unsigned long base, addr = 0;
1030
1031 prom_debug("alloc_down(%x, %x, %s)\n", size, align,
5827d416
AB
1032 highmem ? "(high)" : "(low)");
1033 if (ram_top == 0)
9b6b563c
PM
1034 prom_panic("alloc_down() called with mem not initialized\n");
1035
1036 if (highmem) {
1037 /* Carve out storage for the TCE table. */
5827d416
AB
1038 addr = _ALIGN_DOWN(alloc_top_high - size, align);
1039 if (addr <= alloc_bottom)
9b6b563c
PM
1040 return 0;
1041 /* Will we bump into the RMO ? If yes, check out that we
1042 * didn't overlap existing allocations there, if we did,
1043 * we are dead, we must be the first in town !
1044 */
5827d416 1045 if (addr < rmo_top) {
9b6b563c 1046 /* Good, we are first */
5827d416
AB
1047 if (alloc_top == rmo_top)
1048 alloc_top = rmo_top = addr;
9b6b563c
PM
1049 else
1050 return 0;
1051 }
5827d416 1052 alloc_top_high = addr;
9b6b563c
PM
1053 goto bail;
1054 }
1055
5827d416
AB
1056 base = _ALIGN_DOWN(alloc_top - size, align);
1057 for (; base > alloc_bottom;
9b6b563c
PM
1058 base = _ALIGN_DOWN(base - 0x100000, align)) {
1059 prom_debug(" trying: 0x%x\n\r", base);
1060 addr = (unsigned long)prom_claim(base, size, 0);
c4988820 1061 if (addr != PROM_ERROR && addr != 0)
9b6b563c
PM
1062 break;
1063 addr = 0;
1064 }
1065 if (addr == 0)
1066 return 0;
5827d416 1067 alloc_top = addr;
9b6b563c
PM
1068
1069 bail:
1070 prom_debug(" -> %x\n", addr);
5827d416
AB
1071 prom_debug(" alloc_bottom : %x\n", alloc_bottom);
1072 prom_debug(" alloc_top : %x\n", alloc_top);
1073 prom_debug(" alloc_top_hi : %x\n", alloc_top_high);
1074 prom_debug(" rmo_top : %x\n", rmo_top);
1075 prom_debug(" ram_top : %x\n", ram_top);
9b6b563c
PM
1076
1077 return addr;
1078}
1079
1080/*
1081 * Parse a "reg" cell
1082 */
1083static unsigned long __init prom_next_cell(int s, cell_t **cellp)
1084{
1085 cell_t *p = *cellp;
1086 unsigned long r = 0;
1087
1088 /* Ignore more than 2 cells */
1089 while (s > sizeof(unsigned long) / 4) {
1090 p++;
1091 s--;
1092 }
493adffc 1093 r = be32_to_cpu(*p++);
9b6b563c 1094#ifdef CONFIG_PPC64
35499c01 1095 if (s > 1) {
9b6b563c 1096 r <<= 32;
493adffc 1097 r |= be32_to_cpu(*(p++));
9b6b563c
PM
1098 }
1099#endif
1100 *cellp = p;
1101 return r;
1102}
1103
1104/*
1105 * Very dumb function for adding to the memory reserve list, but
1106 * we don't need anything smarter at this point
1107 *
1108 * XXX Eventually check for collisions. They should NEVER happen.
1109 * If problems seem to show up, it would be a good start to track
1110 * them down.
1111 */
0108d3fe 1112static void __init reserve_mem(u64 base, u64 size)
9b6b563c 1113{
cbbcf340 1114 u64 top = base + size;
5827d416 1115 unsigned long cnt = mem_reserve_cnt;
9b6b563c
PM
1116
1117 if (size == 0)
1118 return;
1119
1120 /* We need to always keep one empty entry so that we
1121 * have our terminator with "size" set to 0 since we are
1122 * dumb and just copy this entire array to the boot params
1123 */
1124 base = _ALIGN_DOWN(base, PAGE_SIZE);
1125 top = _ALIGN_UP(top, PAGE_SIZE);
1126 size = top - base;
1127
1128 if (cnt >= (MEM_RESERVE_MAP_SIZE - 1))
1129 prom_panic("Memory reserve map exhausted !\n");
493adffc
BH
1130 mem_reserve_map[cnt].base = cpu_to_be64(base);
1131 mem_reserve_map[cnt].size = cpu_to_be64(size);
5827d416 1132 mem_reserve_cnt = cnt + 1;
9b6b563c
PM
1133}
1134
1135/*
b3c2ffd5 1136 * Initialize memory allocation mechanism, parse "memory" nodes and
9b6b563c
PM
1137 * obtain that way the top of memory and RMO to setup out local allocator
1138 */
1139static void __init prom_init_mem(void)
1140{
1141 phandle node;
1142 char *path, type[64];
1143 unsigned int plen;
1144 cell_t *p, *endp;
493adffc 1145 __be32 val;
9b6b563c
PM
1146 u32 rac, rsc;
1147
1148 /*
1149 * We iterate the memory nodes to find
1150 * 1) top of RMO (first node)
1151 * 2) top of memory
1152 */
493adffc
BH
1153 val = cpu_to_be32(2);
1154 prom_getprop(prom.root, "#address-cells", &val, sizeof(val));
1155 rac = be32_to_cpu(val);
1156 val = cpu_to_be32(1);
1157 prom_getprop(prom.root, "#size-cells", &val, sizeof(rsc));
1158 rsc = be32_to_cpu(val);
1159 prom_debug("root_addr_cells: %x\n", rac);
1160 prom_debug("root_size_cells: %x\n", rsc);
9b6b563c
PM
1161
1162 prom_debug("scanning memory:\n");
5827d416 1163 path = prom_scratch;
9b6b563c
PM
1164
1165 for (node = 0; prom_next_node(&node); ) {
1166 type[0] = 0;
1167 prom_getprop(node, "device_type", type, sizeof(type));
1168
c4988820
PM
1169 if (type[0] == 0) {
1170 /*
1171 * CHRP Longtrail machines have no device_type
1172 * on the memory node, so check the name instead...
1173 */
1174 prom_getprop(node, "name", type, sizeof(type));
1175 }
5827d416 1176 if (strcmp(type, "memory"))
9b6b563c 1177 continue;
c4988820 1178
5827d416 1179 plen = prom_getprop(node, "reg", regbuf, sizeof(regbuf));
9b6b563c
PM
1180 if (plen > sizeof(regbuf)) {
1181 prom_printf("memory node too large for buffer !\n");
1182 plen = sizeof(regbuf);
1183 }
5827d416 1184 p = regbuf;
9b6b563c
PM
1185 endp = p + (plen / sizeof(cell_t));
1186
1187#ifdef DEBUG_PROM
1188 memset(path, 0, PROM_SCRATCH_SIZE);
1189 call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1);
1190 prom_debug(" node %s :\n", path);
1191#endif /* DEBUG_PROM */
1192
1193 while ((endp - p) >= (rac + rsc)) {
1194 unsigned long base, size;
1195
1196 base = prom_next_cell(rac, &p);
1197 size = prom_next_cell(rsc, &p);
1198
1199 if (size == 0)
1200 continue;
1201 prom_debug(" %x %x\n", base, size);
5827d416
AB
1202 if (base == 0 && (of_platform & PLATFORM_LPAR))
1203 rmo_top = size;
1204 if ((base + size) > ram_top)
1205 ram_top = base + size;
9b6b563c
PM
1206 }
1207 }
1208
5827d416 1209 alloc_bottom = PAGE_ALIGN((unsigned long)&_end + 0x4000);
9b6b563c 1210
cf68787b
BK
1211 /*
1212 * If prom_memory_limit is set we reduce the upper limits *except* for
1213 * alloc_top_high. This must be the real top of RAM so we can put
1214 * TCE's up there.
1215 */
1216
5827d416 1217 alloc_top_high = ram_top;
cf68787b 1218
5827d416
AB
1219 if (prom_memory_limit) {
1220 if (prom_memory_limit <= alloc_bottom) {
cf68787b 1221 prom_printf("Ignoring mem=%x <= alloc_bottom.\n",
5827d416
AB
1222 prom_memory_limit);
1223 prom_memory_limit = 0;
1224 } else if (prom_memory_limit >= ram_top) {
cf68787b 1225 prom_printf("Ignoring mem=%x >= ram_top.\n",
5827d416
AB
1226 prom_memory_limit);
1227 prom_memory_limit = 0;
cf68787b 1228 } else {
5827d416
AB
1229 ram_top = prom_memory_limit;
1230 rmo_top = min(rmo_top, prom_memory_limit);
cf68787b
BK
1231 }
1232 }
1233
9b6b563c
PM
1234 /*
1235 * Setup our top alloc point, that is top of RMO or top of
1236 * segment 0 when running non-LPAR.
1237 * Some RS64 machines have buggy firmware where claims up at
1238 * 1GB fail. Cap at 768MB as a workaround.
1239 * Since 768MB is plenty of room, and we need to cap to something
1240 * reasonable on 32-bit, cap at 768MB on all machines.
1241 */
5827d416
AB
1242 if (!rmo_top)
1243 rmo_top = ram_top;
1244 rmo_top = min(0x30000000ul, rmo_top);
1245 alloc_top = rmo_top;
1246 alloc_top_high = ram_top;
9b6b563c 1247
64968f60
PM
1248 /*
1249 * Check if we have an initrd after the kernel but still inside
1250 * the RMO. If we do move our bottom point to after it.
1251 */
5827d416
AB
1252 if (prom_initrd_start &&
1253 prom_initrd_start < rmo_top &&
1254 prom_initrd_end > alloc_bottom)
1255 alloc_bottom = PAGE_ALIGN(prom_initrd_end);
64968f60 1256
9b6b563c 1257 prom_printf("memory layout at init:\n");
5827d416
AB
1258 prom_printf(" memory_limit : %x (16 MB aligned)\n", prom_memory_limit);
1259 prom_printf(" alloc_bottom : %x\n", alloc_bottom);
1260 prom_printf(" alloc_top : %x\n", alloc_top);
1261 prom_printf(" alloc_top_hi : %x\n", alloc_top_high);
1262 prom_printf(" rmo_top : %x\n", rmo_top);
1263 prom_printf(" ram_top : %x\n", ram_top);
9b6b563c
PM
1264}
1265
27f44888
BH
1266static void __init prom_close_stdin(void)
1267{
493adffc
BH
1268 __be32 val;
1269 ihandle stdin;
27f44888 1270
493adffc
BH
1271 if (prom_getprop(prom.chosen, "stdin", &val, sizeof(val)) > 0) {
1272 stdin = be32_to_cpu(val);
1273 call_prom("close", 1, 0, stdin);
1274 }
27f44888
BH
1275}
1276
1277#ifdef CONFIG_PPC_POWERNV
1278
6e35d5da
BH
1279#ifdef CONFIG_PPC_EARLY_DEBUG_OPAL
1280static u64 __initdata prom_opal_base;
1281static u64 __initdata prom_opal_entry;
1282#endif
1283
6e35d5da
BH
1284/*
1285 * Allocate room for and instantiate OPAL
1286 */
1287static void __init prom_instantiate_opal(void)
1288{
1289 phandle opal_node;
1290 ihandle opal_inst;
1291 u64 base, entry;
1292 u64 size = 0, align = 0x10000;
493adffc 1293 __be64 val64;
6e35d5da
BH
1294 u32 rets[2];
1295
1296 prom_debug("prom_instantiate_opal: start...\n");
1297
1298 opal_node = call_prom("finddevice", 1, 1, ADDR("/ibm,opal"));
1299 prom_debug("opal_node: %x\n", opal_node);
1300 if (!PHANDLE_VALID(opal_node))
1301 return;
1302
493adffc
BH
1303 val64 = 0;
1304 prom_getprop(opal_node, "opal-runtime-size", &val64, sizeof(val64));
1305 size = be64_to_cpu(val64);
6e35d5da
BH
1306 if (size == 0)
1307 return;
493adffc
BH
1308 val64 = 0;
1309 prom_getprop(opal_node, "opal-runtime-alignment", &val64,sizeof(val64));
1310 align = be64_to_cpu(val64);
6e35d5da
BH
1311
1312 base = alloc_down(size, align, 0);
1313 if (base == 0) {
1314 prom_printf("OPAL allocation failed !\n");
1315 return;
1316 }
1317
1318 opal_inst = call_prom("open", 1, 1, ADDR("/ibm,opal"));
1319 if (!IHANDLE_VALID(opal_inst)) {
1320 prom_printf("opening opal package failed (%x)\n", opal_inst);
1321 return;
1322 }
1323
1324 prom_printf("instantiating opal at 0x%x...", base);
1325
1326 if (call_prom_ret("call-method", 4, 3, rets,
1327 ADDR("load-opal-runtime"),
1328 opal_inst,
1329 base >> 32, base & 0xffffffff) != 0
1330 || (rets[0] == 0 && rets[1] == 0)) {
1331 prom_printf(" failed\n");
1332 return;
1333 }
1334 entry = (((u64)rets[0]) << 32) | rets[1];
1335
1336 prom_printf(" done\n");
1337
1338 reserve_mem(base, size);
1339
1340 prom_debug("opal base = 0x%x\n", base);
1341 prom_debug("opal align = 0x%x\n", align);
1342 prom_debug("opal entry = 0x%x\n", entry);
1343 prom_debug("opal size = 0x%x\n", (long)size);
1344
1345 prom_setprop(opal_node, "/ibm,opal", "opal-base-address",
1346 &base, sizeof(base));
1347 prom_setprop(opal_node, "/ibm,opal", "opal-entry-address",
1348 &entry, sizeof(entry));
1349
1350#ifdef CONFIG_PPC_EARLY_DEBUG_OPAL
5827d416
AB
1351 prom_opal_base = base;
1352 prom_opal_entry = entry;
6e35d5da
BH
1353#endif
1354 prom_debug("prom_instantiate_opal: end...\n");
1355}
1356
27f44888 1357#endif /* CONFIG_PPC_POWERNV */
9b6b563c
PM
1358
1359/*
1360 * Allocate room for and instantiate RTAS
1361 */
1362static void __init prom_instantiate_rtas(void)
1363{
1364 phandle rtas_node;
1365 ihandle rtas_inst;
1366 u32 base, entry = 0;
493adffc 1367 __be32 val;
9b6b563c
PM
1368 u32 size = 0;
1369
1370 prom_debug("prom_instantiate_rtas: start...\n");
1371
1372 rtas_node = call_prom("finddevice", 1, 1, ADDR("/rtas"));
1373 prom_debug("rtas_node: %x\n", rtas_node);
1374 if (!PHANDLE_VALID(rtas_node))
1375 return;
1376
493adffc
BH
1377 val = 0;
1378 prom_getprop(rtas_node, "rtas-size", &val, sizeof(size));
1379 size = be32_to_cpu(val);
9b6b563c
PM
1380 if (size == 0)
1381 return;
1382
1383 base = alloc_down(size, PAGE_SIZE, 0);
6d1e2c6c
AB
1384 if (base == 0)
1385 prom_panic("Could not allocate memory for RTAS\n");
9b6b563c
PM
1386
1387 rtas_inst = call_prom("open", 1, 1, ADDR("/rtas"));
1388 if (!IHANDLE_VALID(rtas_inst)) {
a23414be 1389 prom_printf("opening rtas package failed (%x)\n", rtas_inst);
9b6b563c
PM
1390 return;
1391 }
1392
1f8737aa 1393 prom_printf("instantiating rtas at 0x%x...", base);
9b6b563c
PM
1394
1395 if (call_prom_ret("call-method", 3, 2, &entry,
1396 ADDR("instantiate-rtas"),
a23414be 1397 rtas_inst, base) != 0
9b6b563c
PM
1398 || entry == 0) {
1399 prom_printf(" failed\n");
1400 return;
1401 }
1402 prom_printf(" done\n");
1403
1404 reserve_mem(base, size);
1405
493adffc 1406 val = cpu_to_be32(base);
a23414be 1407 prom_setprop(rtas_node, "/rtas", "linux,rtas-base",
493adffc
BH
1408 &val, sizeof(val));
1409 val = cpu_to_be32(entry);
a23414be 1410 prom_setprop(rtas_node, "/rtas", "linux,rtas-entry",
493adffc 1411 &val, sizeof(val));
9b6b563c 1412
dbe78b40
BH
1413 /* Check if it supports "query-cpu-stopped-state" */
1414 if (prom_getprop(rtas_node, "query-cpu-stopped-state",
1415 &val, sizeof(val)) != PROM_ERROR)
1416 rtas_has_query_cpu_stopped = true;
1417
9b6b563c
PM
1418 prom_debug("rtas base = 0x%x\n", base);
1419 prom_debug("rtas entry = 0x%x\n", entry);
1420 prom_debug("rtas size = 0x%x\n", (long)size);
1421
1422 prom_debug("prom_instantiate_rtas: end...\n");
1423}
1424
1425#ifdef CONFIG_PPC64
4a727429
AL
1426/*
1427 * Allocate room for and instantiate Stored Measurement Log (SML)
1428 */
1429static void __init prom_instantiate_sml(void)
1430{
1431 phandle ibmvtpm_node;
1432 ihandle ibmvtpm_inst;
b4ed0469 1433 u32 entry = 0, size = 0, succ = 0;
4a727429 1434 u64 base;
b4ed0469 1435 __be32 val;
4a727429
AL
1436
1437 prom_debug("prom_instantiate_sml: start...\n");
1438
2f82e982 1439 ibmvtpm_node = call_prom("finddevice", 1, 1, ADDR("/vdevice/vtpm"));
4a727429
AL
1440 prom_debug("ibmvtpm_node: %x\n", ibmvtpm_node);
1441 if (!PHANDLE_VALID(ibmvtpm_node))
1442 return;
1443
2f82e982 1444 ibmvtpm_inst = call_prom("open", 1, 1, ADDR("/vdevice/vtpm"));
4a727429
AL
1445 if (!IHANDLE_VALID(ibmvtpm_inst)) {
1446 prom_printf("opening vtpm package failed (%x)\n", ibmvtpm_inst);
1447 return;
1448 }
1449
b4ed0469
HCVL
1450 if (prom_getprop(ibmvtpm_node, "ibm,sml-efi-reformat-supported",
1451 &val, sizeof(val)) != PROM_ERROR) {
1452 if (call_prom_ret("call-method", 2, 2, &succ,
1453 ADDR("reformat-sml-to-efi-alignment"),
1454 ibmvtpm_inst) != 0 || succ == 0) {
1455 prom_printf("Reformat SML to EFI alignment failed\n");
1456 return;
1457 }
b4ed0469 1458
9e5d4af4
HCVL
1459 if (call_prom_ret("call-method", 2, 2, &size,
1460 ADDR("sml-get-allocated-size"),
1461 ibmvtpm_inst) != 0 || size == 0) {
1462 prom_printf("SML get allocated size failed\n");
1463 return;
1464 }
1465 } else {
1466 if (call_prom_ret("call-method", 2, 2, &size,
1467 ADDR("sml-get-handover-size"),
1468 ibmvtpm_inst) != 0 || size == 0) {
1469 prom_printf("SML get handover size failed\n");
1470 return;
1471 }
4a727429
AL
1472 }
1473
1474 base = alloc_down(size, PAGE_SIZE, 0);
1475 if (base == 0)
1476 prom_panic("Could not allocate memory for sml\n");
1477
1478 prom_printf("instantiating sml at 0x%x...", base);
1479
9e5d4af4
HCVL
1480 memset((void *)base, 0, size);
1481
4a727429
AL
1482 if (call_prom_ret("call-method", 4, 2, &entry,
1483 ADDR("sml-handover"),
1484 ibmvtpm_inst, size, base) != 0 || entry == 0) {
1485 prom_printf("SML handover failed\n");
1486 return;
1487 }
1488 prom_printf(" done\n");
1489
1490 reserve_mem(base, size);
1491
2f82e982 1492 prom_setprop(ibmvtpm_node, "/vdevice/vtpm", "linux,sml-base",
4a727429 1493 &base, sizeof(base));
2f82e982 1494 prom_setprop(ibmvtpm_node, "/vdevice/vtpm", "linux,sml-size",
4a727429
AL
1495 &size, sizeof(size));
1496
1497 prom_debug("sml base = 0x%x\n", base);
1498 prom_debug("sml size = 0x%x\n", (long)size);
1499
1500 prom_debug("prom_instantiate_sml: end...\n");
1501}
1502
9b6b563c
PM
1503/*
1504 * Allocate room for and initialize TCE tables
1505 */
493adffc 1506#ifdef __BIG_ENDIAN__
9b6b563c
PM
1507static void __init prom_initialize_tce_table(void)
1508{
1509 phandle node;
1510 ihandle phb_node;
1511 char compatible[64], type[64], model[64];
5827d416 1512 char *path = prom_scratch;
9b6b563c
PM
1513 u64 base, align;
1514 u32 minalign, minsize;
1515 u64 tce_entry, *tce_entryp;
1516 u64 local_alloc_top, local_alloc_bottom;
1517 u64 i;
1518
5827d416 1519 if (prom_iommu_off)
9b6b563c
PM
1520 return;
1521
1522 prom_debug("starting prom_initialize_tce_table\n");
1523
1524 /* Cache current top of allocs so we reserve a single block */
5827d416 1525 local_alloc_top = alloc_top_high;
9b6b563c
PM
1526 local_alloc_bottom = local_alloc_top;
1527
1528 /* Search all nodes looking for PHBs. */
1529 for (node = 0; prom_next_node(&node); ) {
1530 compatible[0] = 0;
1531 type[0] = 0;
1532 model[0] = 0;
1533 prom_getprop(node, "compatible",
1534 compatible, sizeof(compatible));
1535 prom_getprop(node, "device_type", type, sizeof(type));
1536 prom_getprop(node, "model", model, sizeof(model));
1537
5827d416 1538 if ((type[0] == 0) || (strstr(type, "pci") == NULL))
9b6b563c
PM
1539 continue;
1540
e788ff13 1541 /* Keep the old logic intact to avoid regression. */
9b6b563c 1542 if (compatible[0] != 0) {
5827d416
AB
1543 if ((strstr(compatible, "python") == NULL) &&
1544 (strstr(compatible, "Speedwagon") == NULL) &&
1545 (strstr(compatible, "Winnipeg") == NULL))
9b6b563c
PM
1546 continue;
1547 } else if (model[0] != 0) {
5827d416
AB
1548 if ((strstr(model, "ython") == NULL) &&
1549 (strstr(model, "peedwagon") == NULL) &&
1550 (strstr(model, "innipeg") == NULL))
9b6b563c
PM
1551 continue;
1552 }
1553
1554 if (prom_getprop(node, "tce-table-minalign", &minalign,
1555 sizeof(minalign)) == PROM_ERROR)
1556 minalign = 0;
1557 if (prom_getprop(node, "tce-table-minsize", &minsize,
1558 sizeof(minsize)) == PROM_ERROR)
1559 minsize = 4UL << 20;
1560
1561 /*
1562 * Even though we read what OF wants, we just set the table
1563 * size to 4 MB. This is enough to map 2GB of PCI DMA space.
1564 * By doing this, we avoid the pitfalls of trying to DMA to
1565 * MMIO space and the DMA alias hole.
1566 *
1567 * On POWER4, firmware sets the TCE region by assuming
1568 * each TCE table is 8MB. Using this memory for anything
1569 * else will impact performance, so we always allocate 8MB.
1570 * Anton
1571 */
d3dbeef6 1572 if (pvr_version_is(PVR_POWER4) || pvr_version_is(PVR_POWER4p))
9b6b563c
PM
1573 minsize = 8UL << 20;
1574 else
1575 minsize = 4UL << 20;
1576
1577 /* Align to the greater of the align or size */
1578 align = max(minalign, minsize);
1579 base = alloc_down(minsize, align, 1);
1580 if (base == 0)
1581 prom_panic("ERROR, cannot find space for TCE table.\n");
1582 if (base < local_alloc_bottom)
1583 local_alloc_bottom = base;
1584
9b6b563c 1585 /* It seems OF doesn't null-terminate the path :-( */
aca71ef8 1586 memset(path, 0, PROM_SCRATCH_SIZE);
9b6b563c
PM
1587 /* Call OF to setup the TCE hardware */
1588 if (call_prom("package-to-path", 3, 1, node,
1589 path, PROM_SCRATCH_SIZE-1) == PROM_ERROR) {
1590 prom_printf("package-to-path failed\n");
1591 }
1592
a23414be
PM
1593 /* Save away the TCE table attributes for later use. */
1594 prom_setprop(node, path, "linux,tce-base", &base, sizeof(base));
1595 prom_setprop(node, path, "linux,tce-size", &minsize, sizeof(minsize));
1596
9b6b563c
PM
1597 prom_debug("TCE table: %s\n", path);
1598 prom_debug("\tnode = 0x%x\n", node);
1599 prom_debug("\tbase = 0x%x\n", base);
1600 prom_debug("\tsize = 0x%x\n", minsize);
1601
1602 /* Initialize the table to have a one-to-one mapping
1603 * over the allocated size.
1604 */
2b931fb6 1605 tce_entryp = (u64 *)base;
9b6b563c
PM
1606 for (i = 0; i < (minsize >> 3) ;tce_entryp++, i++) {
1607 tce_entry = (i << PAGE_SHIFT);
1608 tce_entry |= 0x3;
1609 *tce_entryp = tce_entry;
1610 }
1611
1612 prom_printf("opening PHB %s", path);
1613 phb_node = call_prom("open", 1, 1, path);
1614 if (phb_node == 0)
1615 prom_printf("... failed\n");
1616 else
1617 prom_printf("... done\n");
1618
1619 call_prom("call-method", 6, 0, ADDR("set-64-bit-addressing"),
1620 phb_node, -1, minsize,
1621 (u32) base, (u32) (base >> 32));
1622 call_prom("close", 1, 0, phb_node);
1623 }
1624
1625 reserve_mem(local_alloc_bottom, local_alloc_top - local_alloc_bottom);
1626
2babf5c2
ME
1627 /* These are only really needed if there is a memory limit in
1628 * effect, but we don't know so export them always. */
5827d416
AB
1629 prom_tce_alloc_start = local_alloc_bottom;
1630 prom_tce_alloc_end = local_alloc_top;
9b6b563c
PM
1631
1632 /* Flag the first invalid entry */
1633 prom_debug("ending prom_initialize_tce_table\n");
1634}
493adffc
BH
1635#endif /* __BIG_ENDIAN__ */
1636#endif /* CONFIG_PPC64 */
9b6b563c
PM
1637
1638/*
1639 * With CHRP SMP we need to use the OF to start the other processors.
1640 * We can't wait until smp_boot_cpus (the OF is trashed by then)
1641 * so we have to put the processors into a holding pattern controlled
1642 * by the kernel (not OF) before we destroy the OF.
1643 *
1644 * This uses a chunk of low memory, puts some holding pattern
1645 * code there and sends the other processors off to there until
1646 * smp_boot_cpus tells them to do something. The holding pattern
1647 * checks that address until its cpu # is there, when it is that
1648 * cpu jumps to __secondary_start(). smp_boot_cpus() takes care
1649 * of setting those values.
1650 *
1651 * We also use physical address 0x4 here to tell when a cpu
1652 * is in its holding pattern code.
1653 *
1654 * -- Cort
1655 */
bbd0abda
PM
1656/*
1657 * We want to reference the copy of __secondary_hold_* in the
1658 * 0 - 0x100 address range
1659 */
1660#define LOW_ADDR(x) (((unsigned long) &(x)) & 0xff)
1661
9b6b563c
PM
1662static void __init prom_hold_cpus(void)
1663{
9b6b563c 1664 unsigned long i;
9b6b563c
PM
1665 phandle node;
1666 char type[64];
9b6b563c 1667 unsigned long *spinloop
bbd0abda 1668 = (void *) LOW_ADDR(__secondary_hold_spinloop);
9b6b563c 1669 unsigned long *acknowledge
bbd0abda 1670 = (void *) LOW_ADDR(__secondary_hold_acknowledge);
bbd0abda 1671 unsigned long secondary_hold = LOW_ADDR(__secondary_hold);
9b6b563c 1672
dbe78b40
BH
1673 /*
1674 * On pseries, if RTAS supports "query-cpu-stopped-state",
1675 * we skip this stage, the CPUs will be started by the
1676 * kernel using RTAS.
1677 */
1678 if ((of_platform == PLATFORM_PSERIES ||
1679 of_platform == PLATFORM_PSERIES_LPAR) &&
1680 rtas_has_query_cpu_stopped) {
1681 prom_printf("prom_hold_cpus: skipped\n");
1682 return;
1683 }
1684
9b6b563c
PM
1685 prom_debug("prom_hold_cpus: start...\n");
1686 prom_debug(" 1) spinloop = 0x%x\n", (unsigned long)spinloop);
1687 prom_debug(" 1) *spinloop = 0x%x\n", *spinloop);
1688 prom_debug(" 1) acknowledge = 0x%x\n",
1689 (unsigned long)acknowledge);
1690 prom_debug(" 1) *acknowledge = 0x%x\n", *acknowledge);
1691 prom_debug(" 1) secondary_hold = 0x%x\n", secondary_hold);
1692
1693 /* Set the common spinloop variable, so all of the secondary cpus
1694 * will block when they are awakened from their OF spinloop.
1695 * This must occur for both SMP and non SMP kernels, since OF will
1696 * be trashed when we move the kernel.
1697 */
1698 *spinloop = 0;
1699
9b6b563c
PM
1700 /* look for cpus */
1701 for (node = 0; prom_next_node(&node); ) {
493adffc
BH
1702 unsigned int cpu_no;
1703 __be32 reg;
1704
9b6b563c
PM
1705 type[0] = 0;
1706 prom_getprop(node, "device_type", type, sizeof(type));
5827d416 1707 if (strcmp(type, "cpu") != 0)
9b6b563c
PM
1708 continue;
1709
1710 /* Skip non-configured cpus. */
1711 if (prom_getprop(node, "status", type, sizeof(type)) > 0)
5827d416 1712 if (strcmp(type, "okay") != 0)
9b6b563c
PM
1713 continue;
1714
493adffc 1715 reg = cpu_to_be32(-1); /* make sparse happy */
9b6b563c 1716 prom_getprop(node, "reg", &reg, sizeof(reg));
493adffc 1717 cpu_no = be32_to_cpu(reg);
9b6b563c 1718
493adffc 1719 prom_debug("cpu hw idx = %lu\n", cpu_no);
9b6b563c
PM
1720
1721 /* Init the acknowledge var which will be reset by
1722 * the secondary cpu when it awakens from its OF
1723 * spinloop.
1724 */
1725 *acknowledge = (unsigned long)-1;
1726
493adffc 1727 if (cpu_no != prom.cpu) {
27f44888 1728 /* Primary Thread of non-boot cpu or any thread */
493adffc 1729 prom_printf("starting cpu hw idx %lu... ", cpu_no);
9b6b563c 1730 call_prom("start-cpu", 3, 0, node,
493adffc 1731 secondary_hold, cpu_no);
9b6b563c 1732
bbd0abda
PM
1733 for (i = 0; (i < 100000000) &&
1734 (*acknowledge == ((unsigned long)-1)); i++ )
9b6b563c
PM
1735 mb();
1736
493adffc 1737 if (*acknowledge == cpu_no)
9b6b563c 1738 prom_printf("done\n");
bbd0abda 1739 else
9b6b563c 1740 prom_printf("failed: %x\n", *acknowledge);
9b6b563c
PM
1741 }
1742#ifdef CONFIG_SMP
1743 else
493adffc 1744 prom_printf("boot cpu hw idx %lu\n", cpu_no);
9b6b563c 1745#endif /* CONFIG_SMP */
9b6b563c 1746 }
9b6b563c 1747
9b6b563c 1748 prom_debug("prom_hold_cpus: end...\n");
9b6b563c
PM
1749}
1750
1751
1752static void __init prom_init_client_services(unsigned long pp)
1753{
9b6b563c 1754 /* Get a handle to the prom entry point before anything else */
5827d416 1755 prom_entry = pp;
9b6b563c
PM
1756
1757 /* get a handle for the stdout device */
5827d416
AB
1758 prom.chosen = call_prom("finddevice", 1, 1, ADDR("/chosen"));
1759 if (!PHANDLE_VALID(prom.chosen))
9b6b563c
PM
1760 prom_panic("cannot find chosen"); /* msg won't be printed :( */
1761
1762 /* get device tree root */
5827d416
AB
1763 prom.root = call_prom("finddevice", 1, 1, ADDR("/"));
1764 if (!PHANDLE_VALID(prom.root))
9b6b563c 1765 prom_panic("cannot find device tree root"); /* msg won't be printed :( */
a575b807 1766
5827d416 1767 prom.mmumap = 0;
a575b807
PM
1768}
1769
1770#ifdef CONFIG_PPC32
1771/*
1772 * For really old powermacs, we need to map things we claim.
1773 * For that, we need the ihandle of the mmu.
a23414be 1774 * Also, on the longtrail, we need to work around other bugs.
a575b807
PM
1775 */
1776static void __init prom_find_mmu(void)
1777{
a575b807
PM
1778 phandle oprom;
1779 char version[64];
1780
1781 oprom = call_prom("finddevice", 1, 1, ADDR("/openprom"));
1782 if (!PHANDLE_VALID(oprom))
1783 return;
1784 if (prom_getprop(oprom, "model", version, sizeof(version)) <= 0)
1785 return;
1786 version[sizeof(version) - 1] = 0;
a575b807 1787 /* XXX might need to add other versions here */
a23414be
PM
1788 if (strcmp(version, "Open Firmware, 1.0.5") == 0)
1789 of_workarounds = OF_WA_CLAIM;
1790 else if (strncmp(version, "FirmWorks,3.", 12) == 0) {
1791 of_workarounds = OF_WA_CLAIM | OF_WA_LONGTRAIL;
1792 call_prom("interpret", 1, 1, "dev /memory 0 to allow-reclaim");
1793 } else
a575b807 1794 return;
5827d416
AB
1795 prom.memory = call_prom("open", 1, 1, ADDR("/memory"));
1796 prom_getprop(prom.chosen, "mmu", &prom.mmumap,
1797 sizeof(prom.mmumap));
493adffc 1798 prom.mmumap = be32_to_cpu(prom.mmumap);
5827d416 1799 if (!IHANDLE_VALID(prom.memory) || !IHANDLE_VALID(prom.mmumap))
a23414be 1800 of_workarounds &= ~OF_WA_CLAIM; /* hmmm */
9b6b563c 1801}
a575b807
PM
1802#else
1803#define prom_find_mmu()
1804#endif
9b6b563c
PM
1805
1806static void __init prom_init_stdout(void)
1807{
5827d416 1808 char *path = of_stdout_device;
9b6b563c 1809 char type[16];
493adffc
BH
1810 phandle stdout_node;
1811 __be32 val;
9b6b563c 1812
5827d416 1813 if (prom_getprop(prom.chosen, "stdout", &val, sizeof(val)) <= 0)
9b6b563c
PM
1814 prom_panic("cannot find stdout");
1815
493adffc 1816 prom.stdout = be32_to_cpu(val);
9b6b563c
PM
1817
1818 /* Get the full OF pathname of the stdout device */
1819 memset(path, 0, 256);
5827d416 1820 call_prom("instance-to-path", 3, 1, prom.stdout, path, 255);
5827d416
AB
1821 prom_printf("OF stdout device is: %s\n", of_stdout_device);
1822 prom_setprop(prom.chosen, "/chosen", "linux,stdout-path",
a23414be 1823 path, strlen(path) + 1);
9b6b563c 1824
10348f59
BH
1825 /* instance-to-package fails on PA-Semi */
1826 stdout_node = call_prom("instance-to-package", 1, 1, prom.stdout);
1827 if (stdout_node != PROM_ERROR) {
1828 val = cpu_to_be32(stdout_node);
1829 prom_setprop(prom.chosen, "/chosen", "linux,stdout-package",
1830 &val, sizeof(val));
1831
1832 /* If it's a display, note it */
1833 memset(type, 0, sizeof(type));
1834 prom_getprop(stdout_node, "device_type", type, sizeof(type));
1835 if (strcmp(type, "display") == 0)
1836 prom_setprop(stdout_node, path, "linux,boot-display", NULL, 0);
1837 }
9b6b563c
PM
1838}
1839
9b6b563c
PM
1840static int __init prom_find_machine_type(void)
1841{
9b6b563c
PM
1842 char compat[256];
1843 int len, i = 0;
21fe3301 1844#ifdef CONFIG_PPC64
9b6b563c 1845 phandle rtas;
e8222502 1846 int x;
21fe3301 1847#endif
e8222502 1848
6e35d5da 1849 /* Look for a PowerMac or a Cell */
5827d416 1850 len = prom_getprop(prom.root, "compatible",
9b6b563c
PM
1851 compat, sizeof(compat)-1);
1852 if (len > 0) {
1853 compat[len] = 0;
1854 while (i < len) {
1855 char *p = &compat[i];
1856 int sl = strlen(p);
1857 if (sl == 0)
1858 break;
5827d416
AB
1859 if (strstr(p, "Power Macintosh") ||
1860 strstr(p, "MacRISC"))
9b6b563c 1861 return PLATFORM_POWERMAC;
133dda1e
AB
1862#ifdef CONFIG_PPC64
1863 /* We must make sure we don't detect the IBM Cell
1864 * blades as pSeries due to some firmware issues,
1865 * so we do it here.
1866 */
5827d416
AB
1867 if (strstr(p, "IBM,CBEA") ||
1868 strstr(p, "IBM,CPBW-1.0"))
133dda1e
AB
1869 return PLATFORM_GENERIC;
1870#endif /* CONFIG_PPC64 */
9b6b563c
PM
1871 i += sl + 1;
1872 }
1873 }
1874#ifdef CONFIG_PPC64
6e35d5da
BH
1875 /* Try to detect OPAL */
1876 if (PHANDLE_VALID(call_prom("finddevice", 1, 1, ADDR("/ibm,opal"))))
1877 return PLATFORM_OPAL;
1878
1879 /* Try to figure out if it's an IBM pSeries or any other
e8222502
BH
1880 * PAPR compliant platform. We assume it is if :
1881 * - /device_type is "chrp" (please, do NOT use that for future
1882 * non-IBM designs !
1883 * - it has /rtas
1884 */
5827d416 1885 len = prom_getprop(prom.root, "device_type",
e8222502
BH
1886 compat, sizeof(compat)-1);
1887 if (len <= 0)
1888 return PLATFORM_GENERIC;
5827d416 1889 if (strcmp(compat, "chrp"))
e8222502
BH
1890 return PLATFORM_GENERIC;
1891
9b6b563c
PM
1892 /* Default to pSeries. We need to know if we are running LPAR */
1893 rtas = call_prom("finddevice", 1, 1, ADDR("/rtas"));
e8222502
BH
1894 if (!PHANDLE_VALID(rtas))
1895 return PLATFORM_GENERIC;
1896 x = prom_getproplen(rtas, "ibm,hypertas-functions");
1897 if (x != PROM_ERROR) {
4da727ae 1898 prom_debug("Hypertas detected, assuming LPAR !\n");
e8222502 1899 return PLATFORM_PSERIES_LPAR;
9b6b563c
PM
1900 }
1901 return PLATFORM_PSERIES;
1902#else
e8222502 1903 return PLATFORM_GENERIC;
9b6b563c
PM
1904#endif
1905}
1906
9b6b563c
PM
1907static int __init prom_set_color(ihandle ih, int i, int r, int g, int b)
1908{
1909 return call_prom("call-method", 6, 1, ADDR("color!"), ih, i, b, g, r);
1910}
1911
1912/*
1913 * If we have a display that we don't know how to drive,
1914 * we will want to try to execute OF's open method for it
1915 * later. However, OF will probably fall over if we do that
1916 * we've taken over the MMU.
1917 * So we check whether we will need to open the display,
1918 * and if so, open it now.
1919 */
1920static void __init prom_check_displays(void)
1921{
1922 char type[16], *path;
1923 phandle node;
1924 ihandle ih;
1925 int i;
9b6b563c
PM
1926
1927 static unsigned char default_colors[] = {
1928 0x00, 0x00, 0x00,
1929 0x00, 0x00, 0xaa,
1930 0x00, 0xaa, 0x00,
1931 0x00, 0xaa, 0xaa,
1932 0xaa, 0x00, 0x00,
1933 0xaa, 0x00, 0xaa,
1934 0xaa, 0xaa, 0x00,
1935 0xaa, 0xaa, 0xaa,
1936 0x55, 0x55, 0x55,
1937 0x55, 0x55, 0xff,
1938 0x55, 0xff, 0x55,
1939 0x55, 0xff, 0xff,
1940 0xff, 0x55, 0x55,
1941 0xff, 0x55, 0xff,
1942 0xff, 0xff, 0x55,
1943 0xff, 0xff, 0xff
1944 };
1945 const unsigned char *clut;
1946
4da727ae 1947 prom_debug("Looking for displays\n");
9b6b563c
PM
1948 for (node = 0; prom_next_node(&node); ) {
1949 memset(type, 0, sizeof(type));
1950 prom_getprop(node, "device_type", type, sizeof(type));
5827d416 1951 if (strcmp(type, "display") != 0)
9b6b563c
PM
1952 continue;
1953
1954 /* It seems OF doesn't null-terminate the path :-( */
5827d416 1955 path = prom_scratch;
9b6b563c
PM
1956 memset(path, 0, PROM_SCRATCH_SIZE);
1957
1958 /*
1959 * leave some room at the end of the path for appending extra
1960 * arguments
1961 */
1962 if (call_prom("package-to-path", 3, 1, node, path,
1963 PROM_SCRATCH_SIZE-10) == PROM_ERROR)
1964 continue;
1f8737aa 1965 prom_printf("found display : %s, opening... ", path);
9b6b563c
PM
1966
1967 ih = call_prom("open", 1, 1, path);
1968 if (ih == 0) {
1969 prom_printf("failed\n");
1970 continue;
1971 }
1972
1973 /* Success */
1974 prom_printf("done\n");
a23414be 1975 prom_setprop(node, path, "linux,opened", NULL, 0);
9b6b563c
PM
1976
1977 /* Setup a usable color table when the appropriate
1978 * method is available. Should update this to set-colors */
5827d416 1979 clut = default_colors;
3f53638c 1980 for (i = 0; i < 16; i++, clut += 3)
9b6b563c
PM
1981 if (prom_set_color(ih, i, clut[0], clut[1],
1982 clut[2]) != 0)
1983 break;
1984
1985#ifdef CONFIG_LOGO_LINUX_CLUT224
5827d416
AB
1986 clut = PTRRELOC(logo_linux_clut224.clut);
1987 for (i = 0; i < logo_linux_clut224.clutsize; i++, clut += 3)
9b6b563c
PM
1988 if (prom_set_color(ih, i + 32, clut[0], clut[1],
1989 clut[2]) != 0)
1990 break;
1991#endif /* CONFIG_LOGO_LINUX_CLUT224 */
7191b615
BH
1992
1993#ifdef CONFIG_PPC_EARLY_DEBUG_BOOTX
1994 if (prom_getprop(node, "linux,boot-display", NULL, 0) !=
1995 PROM_ERROR) {
1996 u32 width, height, pitch, addr;
1997
1998 prom_printf("Setting btext !\n");
1999 prom_getprop(node, "width", &width, 4);
2000 prom_getprop(node, "height", &height, 4);
2001 prom_getprop(node, "linebytes", &pitch, 4);
2002 prom_getprop(node, "address", &addr, 4);
2003 prom_printf("W=%d H=%d LB=%d addr=0x%x\n",
2004 width, height, pitch, addr);
2005 btext_setup_display(width, height, 8, pitch, addr);
2006 }
2007#endif /* CONFIG_PPC_EARLY_DEBUG_BOOTX */
9b6b563c
PM
2008 }
2009}
2010
2011
2012/* Return (relocated) pointer to this much memory: moves initrd if reqd. */
2013static void __init *make_room(unsigned long *mem_start, unsigned long *mem_end,
2014 unsigned long needed, unsigned long align)
2015{
2016 void *ret;
2017
2018 *mem_start = _ALIGN(*mem_start, align);
2019 while ((*mem_start + needed) > *mem_end) {
2020 unsigned long room, chunk;
2021
2022 prom_debug("Chunk exhausted, claiming more at %x...\n",
5827d416
AB
2023 alloc_bottom);
2024 room = alloc_top - alloc_bottom;
9b6b563c
PM
2025 if (room > DEVTREE_CHUNK_SIZE)
2026 room = DEVTREE_CHUNK_SIZE;
2027 if (room < PAGE_SIZE)
fbafd728
AB
2028 prom_panic("No memory for flatten_device_tree "
2029 "(no room)\n");
9b6b563c
PM
2030 chunk = alloc_up(room, 0);
2031 if (chunk == 0)
fbafd728
AB
2032 prom_panic("No memory for flatten_device_tree "
2033 "(claim failed)\n");
966728dd 2034 *mem_end = chunk + room;
9b6b563c
PM
2035 }
2036
2037 ret = (void *)*mem_start;
2038 *mem_start += needed;
2039
2040 return ret;
2041}
2042
493adffc
BH
2043#define dt_push_token(token, mem_start, mem_end) do { \
2044 void *room = make_room(mem_start, mem_end, 4, 4); \
2045 *(__be32 *)room = cpu_to_be32(token); \
2046 } while(0)
9b6b563c
PM
2047
2048static unsigned long __init dt_find_string(char *str)
2049{
2050 char *s, *os;
2051
5827d416 2052 s = os = (char *)dt_string_start;
9b6b563c 2053 s += 4;
5827d416 2054 while (s < (char *)dt_string_end) {
9b6b563c
PM
2055 if (strcmp(s, str) == 0)
2056 return s - os;
2057 s += strlen(s) + 1;
2058 }
2059 return 0;
2060}
2061
2062/*
2063 * The Open Firmware 1275 specification states properties must be 31 bytes or
2064 * less, however not all firmwares obey this. Make it 64 bytes to be safe.
2065 */
2066#define MAX_PROPERTY_NAME 64
2067
2068static void __init scan_dt_build_strings(phandle node,
2069 unsigned long *mem_start,
2070 unsigned long *mem_end)
2071{
2072 char *prev_name, *namep, *sstart;
2073 unsigned long soff;
2074 phandle child;
2075
5827d416 2076 sstart = (char *)dt_string_start;
9b6b563c
PM
2077
2078 /* get and store all property names */
5827d416 2079 prev_name = "";
9b6b563c
PM
2080 for (;;) {
2081 /* 64 is max len of name including nul. */
2082 namep = make_room(mem_start, mem_end, MAX_PROPERTY_NAME, 1);
2083 if (call_prom("nextprop", 3, 1, node, prev_name, namep) != 1) {
2084 /* No more nodes: unwind alloc */
2085 *mem_start = (unsigned long)namep;
2086 break;
2087 }
2088
2089 /* skip "name" */
5827d416 2090 if (strcmp(namep, "name") == 0) {
9b6b563c 2091 *mem_start = (unsigned long)namep;
5827d416 2092 prev_name = "name";
9b6b563c
PM
2093 continue;
2094 }
2095 /* get/create string entry */
2096 soff = dt_find_string(namep);
2097 if (soff != 0) {
2098 *mem_start = (unsigned long)namep;
2099 namep = sstart + soff;
2100 } else {
2101 /* Trim off some if we can */
2102 *mem_start = (unsigned long)namep + strlen(namep) + 1;
5827d416 2103 dt_string_end = *mem_start;
9b6b563c
PM
2104 }
2105 prev_name = namep;
2106 }
2107
2108 /* do all our children */
2109 child = call_prom("child", 1, 1, node);
2110 while (child != 0) {
2111 scan_dt_build_strings(child, mem_start, mem_end);
2112 child = call_prom("peer", 1, 1, child);
2113 }
2114}
2115
2116static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
2117 unsigned long *mem_end)
2118{
2119 phandle child;
2120 char *namep, *prev_name, *sstart, *p, *ep, *lp, *path;
2121 unsigned long soff;
2122 unsigned char *valp;
2123 static char pname[MAX_PROPERTY_NAME];
6e35d5da 2124 int l, room, has_phandle = 0;
9b6b563c
PM
2125
2126 dt_push_token(OF_DT_BEGIN_NODE, mem_start, mem_end);
2127
2128 /* get the node's full name */
2129 namep = (char *)*mem_start;
c4988820
PM
2130 room = *mem_end - *mem_start;
2131 if (room > 255)
2132 room = 255;
2133 l = call_prom("package-to-path", 3, 1, node, namep, room);
9b6b563c
PM
2134 if (l >= 0) {
2135 /* Didn't fit? Get more room. */
c4988820
PM
2136 if (l >= room) {
2137 if (l >= *mem_end - *mem_start)
2138 namep = make_room(mem_start, mem_end, l+1, 1);
9b6b563c
PM
2139 call_prom("package-to-path", 3, 1, node, namep, l);
2140 }
2141 namep[l] = '\0';
2142
2143 /* Fixup an Apple bug where they have bogus \0 chars in the
a575b807
PM
2144 * middle of the path in some properties, and extract
2145 * the unit name (everything after the last '/').
9b6b563c 2146 */
a575b807 2147 for (lp = p = namep, ep = namep + l; p < ep; p++) {
9b6b563c 2148 if (*p == '/')
a575b807
PM
2149 lp = namep;
2150 else if (*p != 0)
2151 *lp++ = *p;
2152 }
2153 *lp = 0;
2154 *mem_start = _ALIGN((unsigned long)lp + 1, 4);
9b6b563c
PM
2155 }
2156
2157 /* get it again for debugging */
5827d416 2158 path = prom_scratch;
9b6b563c
PM
2159 memset(path, 0, PROM_SCRATCH_SIZE);
2160 call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1);
2161
2162 /* get and store all properties */
5827d416
AB
2163 prev_name = "";
2164 sstart = (char *)dt_string_start;
9b6b563c
PM
2165 for (;;) {
2166 if (call_prom("nextprop", 3, 1, node, prev_name,
5827d416 2167 pname) != 1)
9b6b563c
PM
2168 break;
2169
2170 /* skip "name" */
5827d416
AB
2171 if (strcmp(pname, "name") == 0) {
2172 prev_name = "name";
9b6b563c
PM
2173 continue;
2174 }
2175
2176 /* find string offset */
5827d416 2177 soff = dt_find_string(pname);
9b6b563c
PM
2178 if (soff == 0) {
2179 prom_printf("WARNING: Can't find string index for"
5827d416 2180 " <%s>, node %s\n", pname, path);
9b6b563c
PM
2181 break;
2182 }
2183 prev_name = sstart + soff;
2184
2185 /* get length */
5827d416 2186 l = call_prom("getproplen", 2, 1, node, pname);
9b6b563c
PM
2187
2188 /* sanity checks */
2189 if (l == PROM_ERROR)
2190 continue;
9b6b563c
PM
2191
2192 /* push property head */
2193 dt_push_token(OF_DT_PROP, mem_start, mem_end);
2194 dt_push_token(l, mem_start, mem_end);
2195 dt_push_token(soff, mem_start, mem_end);
2196
2197 /* push property content */
2198 valp = make_room(mem_start, mem_end, l, 4);
5827d416 2199 call_prom("getprop", 4, 1, node, pname, valp, l);
9b6b563c 2200 *mem_start = _ALIGN(*mem_start, 4);
6e35d5da 2201
5827d416 2202 if (!strcmp(pname, "phandle"))
6e35d5da 2203 has_phandle = 1;
9b6b563c
PM
2204 }
2205
6e35d5da
BH
2206 /* Add a "linux,phandle" property if no "phandle" property already
2207 * existed (can happen with OPAL)
2208 */
2209 if (!has_phandle) {
5827d416 2210 soff = dt_find_string("linux,phandle");
6e35d5da
BH
2211 if (soff == 0)
2212 prom_printf("WARNING: Can't find string index for"
2213 " <linux-phandle> node %s\n", path);
2214 else {
2215 dt_push_token(OF_DT_PROP, mem_start, mem_end);
2216 dt_push_token(4, mem_start, mem_end);
2217 dt_push_token(soff, mem_start, mem_end);
2218 valp = make_room(mem_start, mem_end, 4, 4);
493adffc 2219 *(__be32 *)valp = cpu_to_be32(node);
6e35d5da 2220 }
9b6b563c
PM
2221 }
2222
2223 /* do all our children */
2224 child = call_prom("child", 1, 1, node);
2225 while (child != 0) {
2226 scan_dt_build_struct(child, mem_start, mem_end);
2227 child = call_prom("peer", 1, 1, child);
2228 }
2229
2230 dt_push_token(OF_DT_END_NODE, mem_start, mem_end);
2231}
2232
2233static void __init flatten_device_tree(void)
2234{
2235 phandle root;
2236 unsigned long mem_start, mem_end, room;
2237 struct boot_param_header *hdr;
9b6b563c
PM
2238 char *namep;
2239 u64 *rsvmap;
2240
2241 /*
2242 * Check how much room we have between alloc top & bottom (+/- a
fbafd728 2243 * few pages), crop to 1MB, as this is our "chunk" size
9b6b563c 2244 */
5827d416 2245 room = alloc_top - alloc_bottom - 0x4000;
9b6b563c
PM
2246 if (room > DEVTREE_CHUNK_SIZE)
2247 room = DEVTREE_CHUNK_SIZE;
5827d416 2248 prom_debug("starting device tree allocs at %x\n", alloc_bottom);
9b6b563c
PM
2249
2250 /* Now try to claim that */
2251 mem_start = (unsigned long)alloc_up(room, PAGE_SIZE);
2252 if (mem_start == 0)
2253 prom_panic("Can't allocate initial device-tree chunk\n");
966728dd 2254 mem_end = mem_start + room;
9b6b563c
PM
2255
2256 /* Get root of tree */
2257 root = call_prom("peer", 1, 1, (phandle)0);
2258 if (root == (phandle)0)
2259 prom_panic ("couldn't get device tree root\n");
2260
2261 /* Build header and make room for mem rsv map */
2262 mem_start = _ALIGN(mem_start, 4);
2263 hdr = make_room(&mem_start, &mem_end,
2264 sizeof(struct boot_param_header), 4);
5827d416 2265 dt_header_start = (unsigned long)hdr;
9b6b563c
PM
2266 rsvmap = make_room(&mem_start, &mem_end, sizeof(mem_reserve_map), 8);
2267
2268 /* Start of strings */
2269 mem_start = PAGE_ALIGN(mem_start);
5827d416 2270 dt_string_start = mem_start;
9b6b563c
PM
2271 mem_start += 4; /* hole */
2272
2273 /* Add "linux,phandle" in there, we'll need it */
2274 namep = make_room(&mem_start, &mem_end, 16, 1);
5827d416 2275 strcpy(namep, "linux,phandle");
9b6b563c
PM
2276 mem_start = (unsigned long)namep + strlen(namep) + 1;
2277
2278 /* Build string array */
2279 prom_printf("Building dt strings...\n");
2280 scan_dt_build_strings(root, &mem_start, &mem_end);
5827d416 2281 dt_string_end = mem_start;
9b6b563c
PM
2282
2283 /* Build structure */
2284 mem_start = PAGE_ALIGN(mem_start);
5827d416 2285 dt_struct_start = mem_start;
9b6b563c
PM
2286 prom_printf("Building dt structure...\n");
2287 scan_dt_build_struct(root, &mem_start, &mem_end);
2288 dt_push_token(OF_DT_END, &mem_start, &mem_end);
5827d416 2289 dt_struct_end = PAGE_ALIGN(mem_start);
9b6b563c
PM
2290
2291 /* Finish header */
493adffc
BH
2292 hdr->boot_cpuid_phys = cpu_to_be32(prom.cpu);
2293 hdr->magic = cpu_to_be32(OF_DT_HEADER);
2294 hdr->totalsize = cpu_to_be32(dt_struct_end - dt_header_start);
2295 hdr->off_dt_struct = cpu_to_be32(dt_struct_start - dt_header_start);
2296 hdr->off_dt_strings = cpu_to_be32(dt_string_start - dt_header_start);
2297 hdr->dt_strings_size = cpu_to_be32(dt_string_end - dt_string_start);
2298 hdr->off_mem_rsvmap = cpu_to_be32(((unsigned long)rsvmap) - dt_header_start);
2299 hdr->version = cpu_to_be32(OF_DT_VERSION);
9b6b563c 2300 /* Version 16 is not backward compatible */
493adffc 2301 hdr->last_comp_version = cpu_to_be32(0x10);
9b6b563c 2302
4d1f3f25 2303 /* Copy the reserve map in */
5827d416 2304 memcpy(rsvmap, mem_reserve_map, sizeof(mem_reserve_map));
9b6b563c
PM
2305
2306#ifdef DEBUG_PROM
2307 {
2308 int i;
2309 prom_printf("reserved memory map:\n");
5827d416 2310 for (i = 0; i < mem_reserve_cnt; i++)
9b6b563c 2311 prom_printf(" %x - %x\n",
493adffc
BH
2312 be64_to_cpu(mem_reserve_map[i].base),
2313 be64_to_cpu(mem_reserve_map[i].size));
9b6b563c
PM
2314 }
2315#endif
4d1f3f25
JX
2316 /* Bump mem_reserve_cnt to cause further reservations to fail
2317 * since it's too late.
2318 */
5827d416 2319 mem_reserve_cnt = MEM_RESERVE_MAP_SIZE;
9b6b563c
PM
2320
2321 prom_printf("Device tree strings 0x%x -> 0x%x\n",
5827d416 2322 dt_string_start, dt_string_end);
9b6b563c 2323 prom_printf("Device tree struct 0x%x -> 0x%x\n",
5827d416 2324 dt_struct_start, dt_struct_end);
9b6b563c
PM
2325}
2326
54f4ee18
HB
2327#ifdef CONFIG_PPC_MAPLE
2328/* PIBS Version 1.05.0000 04/26/2005 has an incorrect /ht/isa/ranges property.
2329 * The values are bad, and it doesn't even have the right number of cells. */
2330static void __init fixup_device_tree_maple(void)
9b6b563c 2331{
54f4ee18 2332 phandle isa;
980a6513 2333 u32 rloc = 0x01002000; /* IO space; PCI device = 4 */
54f4ee18 2334 u32 isa_ranges[6];
980a6513
BH
2335 char *name;
2336
2337 name = "/ht@0/isa@4";
2338 isa = call_prom("finddevice", 1, 1, ADDR(name));
2339 if (!PHANDLE_VALID(isa)) {
2340 name = "/ht@0/isa@6";
2341 isa = call_prom("finddevice", 1, 1, ADDR(name));
2342 rloc = 0x01003000; /* IO space; PCI device = 6 */
2343 }
54f4ee18
HB
2344 if (!PHANDLE_VALID(isa))
2345 return;
2346
980a6513
BH
2347 if (prom_getproplen(isa, "ranges") != 12)
2348 return;
54f4ee18
HB
2349 if (prom_getprop(isa, "ranges", isa_ranges, sizeof(isa_ranges))
2350 == PROM_ERROR)
2351 return;
2352
2353 if (isa_ranges[0] != 0x1 ||
2354 isa_ranges[1] != 0xf4000000 ||
2355 isa_ranges[2] != 0x00010000)
2356 return;
2357
980a6513 2358 prom_printf("Fixing up bogus ISA range on Maple/Apache...\n");
54f4ee18
HB
2359
2360 isa_ranges[0] = 0x1;
2361 isa_ranges[1] = 0x0;
980a6513 2362 isa_ranges[2] = rloc;
54f4ee18
HB
2363 isa_ranges[3] = 0x0;
2364 isa_ranges[4] = 0x0;
2365 isa_ranges[5] = 0x00010000;
980a6513 2366 prom_setprop(isa, name, "ranges",
54f4ee18
HB
2367 isa_ranges, sizeof(isa_ranges));
2368}
8f101a05
HC
2369
2370#define CPC925_MC_START 0xf8000000
2371#define CPC925_MC_LENGTH 0x1000000
2372/* The values for memory-controller don't have right number of cells */
2373static void __init fixup_device_tree_maple_memory_controller(void)
2374{
2375 phandle mc;
2376 u32 mc_reg[4];
2377 char *name = "/hostbridge@f8000000";
8f101a05
HC
2378 u32 ac, sc;
2379
2380 mc = call_prom("finddevice", 1, 1, ADDR(name));
2381 if (!PHANDLE_VALID(mc))
2382 return;
2383
2384 if (prom_getproplen(mc, "reg") != 8)
2385 return;
2386
5827d416
AB
2387 prom_getprop(prom.root, "#address-cells", &ac, sizeof(ac));
2388 prom_getprop(prom.root, "#size-cells", &sc, sizeof(sc));
8f101a05
HC
2389 if ((ac != 2) || (sc != 2))
2390 return;
2391
2392 if (prom_getprop(mc, "reg", mc_reg, sizeof(mc_reg)) == PROM_ERROR)
2393 return;
2394
2395 if (mc_reg[0] != CPC925_MC_START || mc_reg[1] != CPC925_MC_LENGTH)
2396 return;
2397
2398 prom_printf("Fixing up bogus hostbridge on Maple...\n");
2399
2400 mc_reg[0] = 0x0;
2401 mc_reg[1] = CPC925_MC_START;
2402 mc_reg[2] = 0x0;
2403 mc_reg[3] = CPC925_MC_LENGTH;
2404 prom_setprop(mc, name, "reg", mc_reg, sizeof(mc_reg));
2405}
54f4ee18
HB
2406#else
2407#define fixup_device_tree_maple()
8f101a05 2408#define fixup_device_tree_maple_memory_controller()
54f4ee18
HB
2409#endif
2410
e8c0acf9 2411#ifdef CONFIG_PPC_CHRP
e4805922
OH
2412/*
2413 * Pegasos and BriQ lacks the "ranges" property in the isa node
2414 * Pegasos needs decimal IRQ 14/15, not hexadecimal
556ecf9b 2415 * Pegasos has the IDE configured in legacy mode, but advertised as native
e4805922 2416 */
e8c0acf9
BH
2417static void __init fixup_device_tree_chrp(void)
2418{
e4805922
OH
2419 phandle ph;
2420 u32 prop[6];
26c5032e 2421 u32 rloc = 0x01006000; /* IO space; PCI device = 12 */
e8c0acf9
BH
2422 char *name;
2423 int rc;
2424
2425 name = "/pci@80000000/isa@c";
e4805922
OH
2426 ph = call_prom("finddevice", 1, 1, ADDR(name));
2427 if (!PHANDLE_VALID(ph)) {
26c5032e 2428 name = "/pci@ff500000/isa@6";
e4805922 2429 ph = call_prom("finddevice", 1, 1, ADDR(name));
26c5032e
BH
2430 rloc = 0x01003000; /* IO space; PCI device = 6 */
2431 }
e4805922
OH
2432 if (PHANDLE_VALID(ph)) {
2433 rc = prom_getproplen(ph, "ranges");
2434 if (rc == 0 || rc == PROM_ERROR) {
2435 prom_printf("Fixing up missing ISA range on Pegasos...\n");
2436
2437 prop[0] = 0x1;
2438 prop[1] = 0x0;
2439 prop[2] = rloc;
2440 prop[3] = 0x0;
2441 prop[4] = 0x0;
2442 prop[5] = 0x00010000;
2443 prom_setprop(ph, name, "ranges", prop, sizeof(prop));
2444 }
2445 }
e8c0acf9 2446
e4805922
OH
2447 name = "/pci@80000000/ide@C,1";
2448 ph = call_prom("finddevice", 1, 1, ADDR(name));
2449 if (PHANDLE_VALID(ph)) {
2450 prom_printf("Fixing up IDE interrupt on Pegasos...\n");
2451 prop[0] = 14;
2452 prop[1] = 0x0;
556ecf9b
OH
2453 prom_setprop(ph, name, "interrupts", prop, 2*sizeof(u32));
2454 prom_printf("Fixing up IDE class-code on Pegasos...\n");
2455 rc = prom_getprop(ph, "class-code", prop, sizeof(u32));
2456 if (rc == sizeof(u32)) {
2457 prop[0] &= ~0x5;
2458 prom_setprop(ph, name, "class-code", prop, sizeof(u32));
2459 }
e4805922 2460 }
e8c0acf9
BH
2461}
2462#else
2463#define fixup_device_tree_chrp()
2464#endif
2465
9b6b563c 2466#if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC)
54f4ee18
HB
2467static void __init fixup_device_tree_pmac(void)
2468{
9b6b563c
PM
2469 phandle u3, i2c, mpic;
2470 u32 u3_rev;
2471 u32 interrupts[2];
2472 u32 parent;
2473
2474 /* Some G5s have a missing interrupt definition, fix it up here */
2475 u3 = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000"));
2476 if (!PHANDLE_VALID(u3))
2477 return;
2478 i2c = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/i2c@f8001000"));
2479 if (!PHANDLE_VALID(i2c))
2480 return;
2481 mpic = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/mpic@f8040000"));
2482 if (!PHANDLE_VALID(mpic))
2483 return;
2484
2485 /* check if proper rev of u3 */
2486 if (prom_getprop(u3, "device-rev", &u3_rev, sizeof(u3_rev))
2487 == PROM_ERROR)
2488 return;
7d49697e 2489 if (u3_rev < 0x35 || u3_rev > 0x39)
9b6b563c
PM
2490 return;
2491 /* does it need fixup ? */
2492 if (prom_getproplen(i2c, "interrupts") > 0)
2493 return;
2494
2495 prom_printf("fixing up bogus interrupts for u3 i2c...\n");
2496
2497 /* interrupt on this revision of u3 is number 0 and level */
2498 interrupts[0] = 0;
2499 interrupts[1] = 1;
a23414be
PM
2500 prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupts",
2501 &interrupts, sizeof(interrupts));
9b6b563c 2502 parent = (u32)mpic;
a23414be
PM
2503 prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupt-parent",
2504 &parent, sizeof(parent));
9b6b563c 2505}
54f4ee18
HB
2506#else
2507#define fixup_device_tree_pmac()
2508#endif
9b6b563c 2509
88fd2a9d 2510#ifdef CONFIG_PPC_EFIKA
94d2dde7
GL
2511/*
2512 * The MPC5200 FEC driver requires an phy-handle property to tell it how
2513 * to talk to the phy. If the phy-handle property is missing, then this
2514 * function is called to add the appropriate nodes and link it to the
2515 * ethernet node.
2516 */
2517static void __init fixup_device_tree_efika_add_phy(void)
88fd2a9d 2518{
88fd2a9d
SM
2519 u32 node;
2520 char prop[64];
94d2dde7 2521 int rv;
88fd2a9d 2522
94d2dde7
GL
2523 /* Check if /builtin/ethernet exists - bail if it doesn't */
2524 node = call_prom("finddevice", 1, 1, ADDR("/builtin/ethernet"));
88fd2a9d
SM
2525 if (!PHANDLE_VALID(node))
2526 return;
2527
94d2dde7
GL
2528 /* Check if the phy-handle property exists - bail if it does */
2529 rv = prom_getprop(node, "phy-handle", prop, sizeof(prop));
2530 if (!rv)
88fd2a9d
SM
2531 return;
2532
94d2dde7
GL
2533 /*
2534 * At this point the ethernet device doesn't have a phy described.
2535 * Now we need to add the missing phy node and linkage
2536 */
6f4347c9 2537
94d2dde7 2538 /* Check for an MDIO bus node - if missing then create one */
6f4347c9
OH
2539 node = call_prom("finddevice", 1, 1, ADDR("/builtin/mdio"));
2540 if (!PHANDLE_VALID(node)) {
2541 prom_printf("Adding Ethernet MDIO node\n");
2542 call_prom("interpret", 1, 1,
2543 " s\" /builtin\" find-device"
2544 " new-device"
2545 " 1 encode-int s\" #address-cells\" property"
2546 " 0 encode-int s\" #size-cells\" property"
94d2dde7
GL
2547 " s\" mdio\" device-name"
2548 " s\" fsl,mpc5200b-mdio\" encode-string"
6f4347c9
OH
2549 " s\" compatible\" property"
2550 " 0xf0003000 0x400 reg"
2551 " 0x2 encode-int"
2552 " 0x5 encode-int encode+"
2553 " 0x3 encode-int encode+"
2554 " s\" interrupts\" property"
2555 " finish-device");
2556 };
2557
94d2dde7
GL
2558 /* Check for a PHY device node - if missing then create one and
2559 * give it's phandle to the ethernet node */
2560 node = call_prom("finddevice", 1, 1,
2561 ADDR("/builtin/mdio/ethernet-phy"));
6f4347c9
OH
2562 if (!PHANDLE_VALID(node)) {
2563 prom_printf("Adding Ethernet PHY node\n");
2564 call_prom("interpret", 1, 1,
2565 " s\" /builtin/mdio\" find-device"
2566 " new-device"
2567 " s\" ethernet-phy\" device-name"
2568 " 0x10 encode-int s\" reg\" property"
2569 " my-self"
2570 " ihandle>phandle"
2571 " finish-device"
2572 " s\" /builtin/ethernet\" find-device"
2573 " encode-int"
2574 " s\" phy-handle\" property"
2575 " device-end");
2576 }
94d2dde7
GL
2577}
2578
2579static void __init fixup_device_tree_efika(void)
2580{
2581 int sound_irq[3] = { 2, 2, 0 };
2582 int bcomm_irq[3*16] = { 3,0,0, 3,1,0, 3,2,0, 3,3,0,
2583 3,4,0, 3,5,0, 3,6,0, 3,7,0,
2584 3,8,0, 3,9,0, 3,10,0, 3,11,0,
2585 3,12,0, 3,13,0, 3,14,0, 3,15,0 };
2586 u32 node;
2587 char prop[64];
2588 int rv, len;
2589
2590 /* Check if we're really running on a EFIKA */
2591 node = call_prom("finddevice", 1, 1, ADDR("/"));
2592 if (!PHANDLE_VALID(node))
2593 return;
2594
2595 rv = prom_getprop(node, "model", prop, sizeof(prop));
2596 if (rv == PROM_ERROR)
2597 return;
2598 if (strcmp(prop, "EFIKA5K2"))
2599 return;
2600
2601 prom_printf("Applying EFIKA device tree fixups\n");
2602
2603 /* Claiming to be 'chrp' is death */
2604 node = call_prom("finddevice", 1, 1, ADDR("/"));
2605 rv = prom_getprop(node, "device_type", prop, sizeof(prop));
2606 if (rv != PROM_ERROR && (strcmp(prop, "chrp") == 0))
2607 prom_setprop(node, "/", "device_type", "efika", sizeof("efika"));
2608
7f4392cd
DW
2609 /* CODEGEN,description is exposed in /proc/cpuinfo so
2610 fix that too */
2611 rv = prom_getprop(node, "CODEGEN,description", prop, sizeof(prop));
2612 if (rv != PROM_ERROR && (strstr(prop, "CHRP")))
2613 prom_setprop(node, "/", "CODEGEN,description",
2614 "Efika 5200B PowerPC System",
2615 sizeof("Efika 5200B PowerPC System"));
2616
94d2dde7
GL
2617 /* Fixup bestcomm interrupts property */
2618 node = call_prom("finddevice", 1, 1, ADDR("/builtin/bestcomm"));
2619 if (PHANDLE_VALID(node)) {
2620 len = prom_getproplen(node, "interrupts");
2621 if (len == 12) {
2622 prom_printf("Fixing bestcomm interrupts property\n");
2623 prom_setprop(node, "/builtin/bestcom", "interrupts",
2624 bcomm_irq, sizeof(bcomm_irq));
2625 }
2626 }
2627
2628 /* Fixup sound interrupts property */
2629 node = call_prom("finddevice", 1, 1, ADDR("/builtin/sound"));
2630 if (PHANDLE_VALID(node)) {
2631 rv = prom_getprop(node, "interrupts", prop, sizeof(prop));
2632 if (rv == PROM_ERROR) {
2633 prom_printf("Adding sound interrupts property\n");
2634 prom_setprop(node, "/builtin/sound", "interrupts",
2635 sound_irq, sizeof(sound_irq));
2636 }
2637 }
6f4347c9 2638
94d2dde7
GL
2639 /* Make sure ethernet phy-handle property exists */
2640 fixup_device_tree_efika_add_phy();
88fd2a9d
SM
2641}
2642#else
2643#define fixup_device_tree_efika()
2644#endif
2645
54f4ee18
HB
2646static void __init fixup_device_tree(void)
2647{
2648 fixup_device_tree_maple();
8f101a05 2649 fixup_device_tree_maple_memory_controller();
e8c0acf9 2650 fixup_device_tree_chrp();
54f4ee18 2651 fixup_device_tree_pmac();
88fd2a9d 2652 fixup_device_tree_efika();
54f4ee18 2653}
9b6b563c
PM
2654
2655static void __init prom_find_boot_cpu(void)
2656{
493adffc 2657 __be32 rval;
9b6b563c
PM
2658 ihandle prom_cpu;
2659 phandle cpu_pkg;
2660
493adffc
BH
2661 rval = 0;
2662 if (prom_getprop(prom.chosen, "cpu", &rval, sizeof(rval)) <= 0)
a575b807 2663 return;
493adffc 2664 prom_cpu = be32_to_cpu(rval);
9b6b563c
PM
2665
2666 cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu);
2667
493adffc
BH
2668 prom_getprop(cpu_pkg, "reg", &rval, sizeof(rval));
2669 prom.cpu = be32_to_cpu(rval);
9b6b563c 2670
5827d416 2671 prom_debug("Booting CPU hw index = %lu\n", prom.cpu);
9b6b563c
PM
2672}
2673
2674static void __init prom_check_initrd(unsigned long r3, unsigned long r4)
2675{
2676#ifdef CONFIG_BLK_DEV_INITRD
9b6b563c 2677 if (r3 && r4 && r4 != 0xdeadbeef) {
493adffc 2678 __be64 val;
9b6b563c 2679
5827d416
AB
2680 prom_initrd_start = is_kernel_addr(r3) ? __pa(r3) : r3;
2681 prom_initrd_end = prom_initrd_start + r4;
9b6b563c 2682
493adffc 2683 val = cpu_to_be64(prom_initrd_start);
5827d416 2684 prom_setprop(prom.chosen, "/chosen", "linux,initrd-start",
a23414be 2685 &val, sizeof(val));
493adffc 2686 val = cpu_to_be64(prom_initrd_end);
5827d416 2687 prom_setprop(prom.chosen, "/chosen", "linux,initrd-end",
a23414be 2688 &val, sizeof(val));
9b6b563c 2689
5827d416
AB
2690 reserve_mem(prom_initrd_start,
2691 prom_initrd_end - prom_initrd_start);
9b6b563c 2692
5827d416
AB
2693 prom_debug("initrd_start=0x%x\n", prom_initrd_start);
2694 prom_debug("initrd_end=0x%x\n", prom_initrd_end);
9b6b563c
PM
2695 }
2696#endif /* CONFIG_BLK_DEV_INITRD */
2697}
2698
5ac47f7a
AB
2699#ifdef CONFIG_PPC64
2700#ifdef CONFIG_RELOCATABLE
2701static void reloc_toc(void)
2702{
2703}
2704
2705static void unreloc_toc(void)
2706{
2707}
2708#else
1674400a 2709static void __reloc_toc(unsigned long offset, unsigned long nr_entries)
5ac47f7a
AB
2710{
2711 unsigned long i;
1674400a
AB
2712 unsigned long *toc_entry;
2713
2714 /* Get the start of the TOC by using r2 directly. */
2715 asm volatile("addi %0,2,-0x8000" : "=b" (toc_entry));
5ac47f7a
AB
2716
2717 for (i = 0; i < nr_entries; i++) {
2718 *toc_entry = *toc_entry + offset;
2719 toc_entry++;
2720 }
2721}
2722
2723static void reloc_toc(void)
2724{
2725 unsigned long offset = reloc_offset();
2726 unsigned long nr_entries =
2727 (__prom_init_toc_end - __prom_init_toc_start) / sizeof(long);
2728
1674400a 2729 __reloc_toc(offset, nr_entries);
5ac47f7a
AB
2730
2731 mb();
2732}
2733
2734static void unreloc_toc(void)
2735{
2736 unsigned long offset = reloc_offset();
2737 unsigned long nr_entries =
2738 (__prom_init_toc_end - __prom_init_toc_start) / sizeof(long);
2739
2740 mb();
2741
1674400a 2742 __reloc_toc(-offset, nr_entries);
5ac47f7a
AB
2743}
2744#endif
2745#endif
27f44888 2746
9b6b563c
PM
2747/*
2748 * We enter here early on, when the Open Firmware prom is still
2749 * handling exceptions and the MMU hash table for us.
2750 */
2751
2752unsigned long __init prom_init(unsigned long r3, unsigned long r4,
2753 unsigned long pp,
549e8152
PM
2754 unsigned long r6, unsigned long r7,
2755 unsigned long kbase)
9b6b563c 2756{
9b6b563c 2757 unsigned long hdr;
9b6b563c
PM
2758
2759#ifdef CONFIG_PPC32
549e8152 2760 unsigned long offset = reloc_offset();
9b6b563c 2761 reloc_got2(offset);
5ac47f7a
AB
2762#else
2763 reloc_toc();
9b6b563c
PM
2764#endif
2765
9b6b563c
PM
2766 /*
2767 * First zero the BSS
2768 */
5827d416 2769 memset(&__bss_start, 0, __bss_stop - __bss_start);
9b6b563c
PM
2770
2771 /*
2772 * Init interface to Open Firmware, get some node references,
2773 * like /chosen
2774 */
2775 prom_init_client_services(pp);
2776
2777 /*
a23414be
PM
2778 * See if this OF is old enough that we need to do explicit maps
2779 * and other workarounds
9b6b563c 2780 */
a23414be 2781 prom_find_mmu();
9b6b563c 2782
a575b807 2783 /*
a23414be 2784 * Init prom stdout device
a575b807 2785 */
a23414be 2786 prom_init_stdout();
a575b807 2787
5827d416 2788 prom_printf("Preparing to boot %s", linux_banner);
e7943fbb 2789
9b6b563c
PM
2790 /*
2791 * Get default machine type. At this point, we do not differentiate
2792 * between pSeries SMP and pSeries LPAR
2793 */
5827d416
AB
2794 of_platform = prom_find_machine_type();
2795 prom_printf("Detected machine type: %x\n", of_platform);
9b6b563c 2796
0f890c8d 2797#ifndef CONFIG_NONSTATIC_KERNEL
add60ef3
OH
2798 /* Bail if this is a kdump kernel. */
2799 if (PHYSICAL_START > 0)
2800 prom_panic("Error: You can't boot a kdump kernel from OF!\n");
549e8152 2801#endif
add60ef3
OH
2802
2803 /*
2804 * Check for an initrd
2805 */
2806 prom_check_initrd(r3, r4);
2807
27f44888 2808#if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV)
9b6b563c
PM
2809 /*
2810 * On pSeries, inform the firmware about our capabilities
2811 */
5827d416
AB
2812 if (of_platform == PLATFORM_PSERIES ||
2813 of_platform == PLATFORM_PSERIES_LPAR)
9b6b563c
PM
2814 prom_send_capabilities();
2815#endif
2816
9b6b563c 2817 /*
f3f66f59 2818 * Copy the CPU hold code
9b6b563c 2819 */
5827d416 2820 if (of_platform != PLATFORM_POWERMAC)
549e8152 2821 copy_and_flush(0, kbase, 0x100, 0);
9b6b563c
PM
2822
2823 /*
2824 * Do early parsing of command line
2825 */
2826 early_cmdline_parse();
2827
2828 /*
2829 * Initialize memory management within prom_init
2830 */
2831 prom_init_mem();
2832
2833 /*
2834 * Determine which cpu is actually running right _now_
2835 */
2836 prom_find_boot_cpu();
2837
2838 /*
2839 * Initialize display devices
2840 */
2841 prom_check_displays();
2842
493adffc 2843#if defined(CONFIG_PPC64) && defined(__BIG_ENDIAN__)
9b6b563c
PM
2844 /*
2845 * Initialize IOMMU (TCE tables) on pSeries. Do that before anything else
2846 * that uses the allocator, we need to make sure we get the top of memory
2847 * available for us here...
2848 */
5827d416 2849 if (of_platform == PLATFORM_PSERIES)
9b6b563c
PM
2850 prom_initialize_tce_table();
2851#endif
2852
2853 /*
27f44888
BH
2854 * On non-powermacs, try to instantiate RTAS. PowerMacs don't
2855 * have a usable RTAS implementation.
9b6b563c 2856 */
5827d416
AB
2857 if (of_platform != PLATFORM_POWERMAC &&
2858 of_platform != PLATFORM_OPAL)
9b6b563c 2859 prom_instantiate_rtas();
27f44888
BH
2860
2861#ifdef CONFIG_PPC_POWERNV
493adffc 2862 if (of_platform == PLATFORM_OPAL)
6e35d5da 2863 prom_instantiate_opal();
493adffc 2864#endif /* CONFIG_PPC_POWERNV */
27f44888 2865
4a727429
AL
2866#ifdef CONFIG_PPC64
2867 /* instantiate sml */
2868 prom_instantiate_sml();
2869#endif
2870
27f44888
BH
2871 /*
2872 * On non-powermacs, put all CPUs in spin-loops.
2873 *
2874 * PowerMacs use a different mechanism to spin CPUs
dbe78b40
BH
2875 *
2876 * (This must be done after instanciating RTAS)
27f44888 2877 */
5827d416
AB
2878 if (of_platform != PLATFORM_POWERMAC &&
2879 of_platform != PLATFORM_OPAL)
27f44888 2880 prom_hold_cpus();
9b6b563c
PM
2881
2882 /*
2883 * Fill in some infos for use by the kernel later on
2884 */
493adffc
BH
2885 if (prom_memory_limit) {
2886 __be64 val = cpu_to_be64(prom_memory_limit);
5827d416 2887 prom_setprop(prom.chosen, "/chosen", "linux,memory-limit",
493adffc
BH
2888 &val, sizeof(val));
2889 }
9b6b563c 2890#ifdef CONFIG_PPC64
5827d416
AB
2891 if (prom_iommu_off)
2892 prom_setprop(prom.chosen, "/chosen", "linux,iommu-off",
a23414be 2893 NULL, 0);
9b6b563c 2894
5827d416
AB
2895 if (prom_iommu_force_on)
2896 prom_setprop(prom.chosen, "/chosen", "linux,iommu-force-on",
a23414be 2897 NULL, 0);
9b6b563c 2898
5827d416
AB
2899 if (prom_tce_alloc_start) {
2900 prom_setprop(prom.chosen, "/chosen", "linux,tce-alloc-start",
2901 &prom_tce_alloc_start,
9b6b563c 2902 sizeof(prom_tce_alloc_start));
5827d416
AB
2903 prom_setprop(prom.chosen, "/chosen", "linux,tce-alloc-end",
2904 &prom_tce_alloc_end,
9b6b563c
PM
2905 sizeof(prom_tce_alloc_end));
2906 }
2907#endif
2908
2909 /*
2910 * Fixup any known bugs in the device-tree
2911 */
2912 fixup_device_tree();
2913
2914 /*
2915 * Now finally create the flattened device-tree
2916 */
1f8737aa 2917 prom_printf("copying OF device tree...\n");
9b6b563c
PM
2918 flatten_device_tree();
2919
3825ac0e
PM
2920 /*
2921 * in case stdin is USB and still active on IBM machines...
2922 * Unfortunately quiesce crashes on some powermacs if we have
40dfef66
BH
2923 * closed stdin already (in particular the powerbook 101). It
2924 * appears that the OPAL version of OFW doesn't like it either.
3825ac0e 2925 */
5827d416
AB
2926 if (of_platform != PLATFORM_POWERMAC &&
2927 of_platform != PLATFORM_OPAL)
3825ac0e 2928 prom_close_stdin();
9b6b563c
PM
2929
2930 /*
2931 * Call OF "quiesce" method to shut down pending DMA's from
2932 * devices etc...
2933 */
7e862d7e 2934 prom_printf("Quiescing Open Firmware ...\n");
9b6b563c
PM
2935 call_prom("quiesce", 0, 0);
2936
2937 /*
2938 * And finally, call the kernel passing it the flattened device
2939 * tree and NULL as r5, thus triggering the new entry point which
2940 * is common to us and kexec
2941 */
5827d416 2942 hdr = dt_header_start;
40dfef66
BH
2943
2944 /* Don't print anything after quiesce under OPAL, it crashes OFW */
5827d416 2945 if (of_platform != PLATFORM_OPAL) {
7d70c63c 2946 prom_printf("Booting Linux via __start() @ 0x%lx ...\n", kbase);
40dfef66
BH
2947 prom_debug("->dt_header_start=0x%x\n", hdr);
2948 }
9b6b563c
PM
2949
2950#ifdef CONFIG_PPC32
2951 reloc_got2(-offset);
5ac47f7a
AB
2952#else
2953 unreloc_toc();
9b6b563c
PM
2954#endif
2955
6e35d5da
BH
2956#ifdef CONFIG_PPC_EARLY_DEBUG_OPAL
2957 /* OPAL early debug gets the OPAL base & entry in r8 and r9 */
2958 __start(hdr, kbase, 0, 0, 0,
5827d416 2959 prom_opal_base, prom_opal_entry);
6e35d5da
BH
2960#else
2961 __start(hdr, kbase, 0, 0, 0, 0, 0);
2962#endif
9b6b563c
PM
2963
2964 return 0;
2965}
This page took 0.809445 seconds and 5 git commands to generate.