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