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