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