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