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