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