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