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