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