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