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