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