Merge tag 'omap-for-v5.6/fixes-rc7-signed' of git://git.kernel.org/pub/scm/linux...
[linux-2.6-microblaze.git] / arch / powerpc / kernel / prom_init.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Procedures for interfacing to Open Firmware.
4  *
5  * Paul Mackerras       August 1996.
6  * Copyright (C) 1996-2005 Paul Mackerras.
7  * 
8  *  Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner.
9  *    {engebret|bergner}@us.ibm.com 
10  */
11
12 #undef DEBUG_PROM
13
14 /* we cannot use FORTIFY as it brings in new symbols */
15 #define __NO_FORTIFY
16
17 #include <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 <asm/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[12];
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(0xffffffff), /* all 3.00-compliant */
978                         .val  = cpu_to_be32(0x0f000005),
979                 },
980                 {
981                         .mask = cpu_to_be32(0xffffffff), /* all 2.07-compliant */
982                         .val  = cpu_to_be32(0x0f000004),
983                 },
984                 {
985                         .mask = cpu_to_be32(0xffffffff), /* all 2.06-compliant */
986                         .val  = cpu_to_be32(0x0f000003),
987                 },
988                 {
989                         .mask = cpu_to_be32(0xffffffff), /* all 2.05-compliant */
990                         .val  = cpu_to_be32(0x0f000002),
991                 },
992                 {
993                         .mask = cpu_to_be32(0xfffffffe), /* all 2.04-compliant and earlier */
994                         .val  = cpu_to_be32(0x0f000001),
995                 },
996         },
997
998         .num_vectors = NUM_VECTORS(6),
999
1000         .vec1_len = VECTOR_LENGTH(sizeof(struct option_vector1)),
1001         .vec1 = {
1002                 .byte1 = 0,
1003                 .arch_versions = OV1_PPC_2_00 | OV1_PPC_2_01 | OV1_PPC_2_02 | OV1_PPC_2_03 |
1004                                  OV1_PPC_2_04 | OV1_PPC_2_05 | OV1_PPC_2_06 | OV1_PPC_2_07,
1005                 .arch_versions3 = OV1_PPC_3_00,
1006         },
1007
1008         .vec2_len = VECTOR_LENGTH(sizeof(struct option_vector2)),
1009         /* option vector 2: Open Firmware options supported */
1010         .vec2 = {
1011                 .byte1 = OV2_REAL_MODE,
1012                 .reserved = 0,
1013                 .real_base = cpu_to_be32(0xffffffff),
1014                 .real_size = cpu_to_be32(0xffffffff),
1015                 .virt_base = cpu_to_be32(0xffffffff),
1016                 .virt_size = cpu_to_be32(0xffffffff),
1017                 .load_base = cpu_to_be32(0xffffffff),
1018                 .min_rma = cpu_to_be32(512),            /* 512MB min RMA */
1019                 .min_load = cpu_to_be32(0xffffffff),    /* full client load */
1020                 .min_rma_percent = 0,   /* min RMA percentage of total RAM */
1021                 .max_pft_size = 48,     /* max log_2(hash table size) */
1022         },
1023
1024         .vec3_len = VECTOR_LENGTH(sizeof(struct option_vector3)),
1025         /* option vector 3: processor options supported */
1026         .vec3 = {
1027                 .byte1 = 0,                     /* don't ignore, don't halt */
1028                 .byte2 = OV3_FP | OV3_VMX | OV3_DFP,
1029         },
1030
1031         .vec4_len = VECTOR_LENGTH(sizeof(struct option_vector4)),
1032         /* option vector 4: IBM PAPR implementation */
1033         .vec4 = {
1034                 .byte1 = 0,                     /* don't halt */
1035                 .min_vp_cap = OV4_MIN_ENT_CAP,  /* minimum VP entitled capacity */
1036         },
1037
1038         .vec5_len = VECTOR_LENGTH(sizeof(struct option_vector5)),
1039         /* option vector 5: PAPR/OF options */
1040         .vec5 = {
1041                 .byte1 = 0,                             /* don't ignore, don't halt */
1042                 .byte2 = OV5_FEAT(OV5_LPAR) | OV5_FEAT(OV5_SPLPAR) | OV5_FEAT(OV5_LARGE_PAGES) |
1043                 OV5_FEAT(OV5_DRCONF_MEMORY) | OV5_FEAT(OV5_DONATE_DEDICATE_CPU) |
1044 #ifdef CONFIG_PCI_MSI
1045                 /* PCIe/MSI support.  Without MSI full PCIe is not supported */
1046                 OV5_FEAT(OV5_MSI),
1047 #else
1048                 0,
1049 #endif
1050                 .byte3 = 0,
1051                 .cmo =
1052 #ifdef CONFIG_PPC_SMLPAR
1053                 OV5_FEAT(OV5_CMO) | OV5_FEAT(OV5_XCMO),
1054 #else
1055                 0,
1056 #endif
1057                 .associativity = OV5_FEAT(OV5_TYPE1_AFFINITY) | OV5_FEAT(OV5_PRRN),
1058                 .bin_opts = OV5_FEAT(OV5_RESIZE_HPT) | OV5_FEAT(OV5_HP_EVT),
1059                 .micro_checkpoint = 0,
1060                 .reserved0 = 0,
1061                 .max_cpus = cpu_to_be32(NR_CPUS),       /* number of cores supported */
1062                 .papr_level = 0,
1063                 .reserved1 = 0,
1064                 .platform_facilities = OV5_FEAT(OV5_PFO_HW_RNG) | OV5_FEAT(OV5_PFO_HW_ENCR) | OV5_FEAT(OV5_PFO_HW_842),
1065                 .reserved2 = 0,
1066                 .reserved3 = 0,
1067                 .subprocessors = 1,
1068                 .byte22 = OV5_FEAT(OV5_DRMEM_V2) | OV5_FEAT(OV5_DRC_INFO),
1069                 .intarch = 0,
1070                 .mmu = 0,
1071                 .hash_ext = 0,
1072                 .radix_ext = 0,
1073         },
1074
1075         /* option vector 6: IBM PAPR hints */
1076         .vec6_len = VECTOR_LENGTH(sizeof(struct option_vector6)),
1077         .vec6 = {
1078                 .reserved = 0,
1079                 .secondary_pteg = 0,
1080                 .os_name = OV6_LINUX,
1081         },
1082 };
1083
1084 static struct ibm_arch_vec __prombss ibm_architecture_vec  ____cacheline_aligned;
1085
1086 /* Old method - ELF header with PT_NOTE sections only works on BE */
1087 #ifdef __BIG_ENDIAN__
1088 static const struct fake_elf {
1089         Elf32_Ehdr      elfhdr;
1090         Elf32_Phdr      phdr[2];
1091         struct chrpnote {
1092                 u32     namesz;
1093                 u32     descsz;
1094                 u32     type;
1095                 char    name[8];        /* "PowerPC" */
1096                 struct chrpdesc {
1097                         u32     real_mode;
1098                         u32     real_base;
1099                         u32     real_size;
1100                         u32     virt_base;
1101                         u32     virt_size;
1102                         u32     load_base;
1103                 } chrpdesc;
1104         } chrpnote;
1105         struct rpanote {
1106                 u32     namesz;
1107                 u32     descsz;
1108                 u32     type;
1109                 char    name[24];       /* "IBM,RPA-Client-Config" */
1110                 struct rpadesc {
1111                         u32     lpar_affinity;
1112                         u32     min_rmo_size;
1113                         u32     min_rmo_percent;
1114                         u32     max_pft_size;
1115                         u32     splpar;
1116                         u32     min_load;
1117                         u32     new_mem_def;
1118                         u32     ignore_me;
1119                 } rpadesc;
1120         } rpanote;
1121 } fake_elf __initconst = {
1122         .elfhdr = {
1123                 .e_ident = { 0x7f, 'E', 'L', 'F',
1124                              ELFCLASS32, ELFDATA2MSB, EV_CURRENT },
1125                 .e_type = ET_EXEC,      /* yeah right */
1126                 .e_machine = EM_PPC,
1127                 .e_version = EV_CURRENT,
1128                 .e_phoff = offsetof(struct fake_elf, phdr),
1129                 .e_phentsize = sizeof(Elf32_Phdr),
1130                 .e_phnum = 2
1131         },
1132         .phdr = {
1133                 [0] = {
1134                         .p_type = PT_NOTE,
1135                         .p_offset = offsetof(struct fake_elf, chrpnote),
1136                         .p_filesz = sizeof(struct chrpnote)
1137                 }, [1] = {
1138                         .p_type = PT_NOTE,
1139                         .p_offset = offsetof(struct fake_elf, rpanote),
1140                         .p_filesz = sizeof(struct rpanote)
1141                 }
1142         },
1143         .chrpnote = {
1144                 .namesz = sizeof("PowerPC"),
1145                 .descsz = sizeof(struct chrpdesc),
1146                 .type = 0x1275,
1147                 .name = "PowerPC",
1148                 .chrpdesc = {
1149                         .real_mode = ~0U,       /* ~0 means "don't care" */
1150                         .real_base = ~0U,
1151                         .real_size = ~0U,
1152                         .virt_base = ~0U,
1153                         .virt_size = ~0U,
1154                         .load_base = ~0U
1155                 },
1156         },
1157         .rpanote = {
1158                 .namesz = sizeof("IBM,RPA-Client-Config"),
1159                 .descsz = sizeof(struct rpadesc),
1160                 .type = 0x12759999,
1161                 .name = "IBM,RPA-Client-Config",
1162                 .rpadesc = {
1163                         .lpar_affinity = 0,
1164                         .min_rmo_size = 64,     /* in megabytes */
1165                         .min_rmo_percent = 0,
1166                         .max_pft_size = 48,     /* 2^48 bytes max PFT size */
1167                         .splpar = 1,
1168                         .min_load = ~0U,
1169                         .new_mem_def = 0
1170                 }
1171         }
1172 };
1173 #endif /* __BIG_ENDIAN__ */
1174
1175 static int __init prom_count_smt_threads(void)
1176 {
1177         phandle node;
1178         char type[64];
1179         unsigned int plen;
1180
1181         /* Pick up th first CPU node we can find */
1182         for (node = 0; prom_next_node(&node); ) {
1183                 type[0] = 0;
1184                 prom_getprop(node, "device_type", type, sizeof(type));
1185
1186                 if (prom_strcmp(type, "cpu"))
1187                         continue;
1188                 /*
1189                  * There is an entry for each smt thread, each entry being
1190                  * 4 bytes long.  All cpus should have the same number of
1191                  * smt threads, so return after finding the first.
1192                  */
1193                 plen = prom_getproplen(node, "ibm,ppc-interrupt-server#s");
1194                 if (plen == PROM_ERROR)
1195                         break;
1196                 plen >>= 2;
1197                 prom_debug("Found %lu smt threads per core\n", (unsigned long)plen);
1198
1199                 /* Sanity check */
1200                 if (plen < 1 || plen > 64) {
1201                         prom_printf("Threads per core %lu out of bounds, assuming 1\n",
1202                                     (unsigned long)plen);
1203                         return 1;
1204                 }
1205                 return plen;
1206         }
1207         prom_debug("No threads found, assuming 1 per core\n");
1208
1209         return 1;
1210
1211 }
1212
1213 static void __init prom_parse_mmu_model(u8 val,
1214                                         struct platform_support *support)
1215 {
1216         switch (val) {
1217         case OV5_FEAT(OV5_MMU_DYNAMIC):
1218         case OV5_FEAT(OV5_MMU_EITHER): /* Either Available */
1219                 prom_debug("MMU - either supported\n");
1220                 support->radix_mmu = !prom_radix_disable;
1221                 support->hash_mmu = true;
1222                 break;
1223         case OV5_FEAT(OV5_MMU_RADIX): /* Only Radix */
1224                 prom_debug("MMU - radix only\n");
1225                 if (prom_radix_disable) {
1226                         /*
1227                          * If we __have__ to do radix, we're better off ignoring
1228                          * the command line rather than not booting.
1229                          */
1230                         prom_printf("WARNING: Ignoring cmdline option disable_radix\n");
1231                 }
1232                 support->radix_mmu = true;
1233                 break;
1234         case OV5_FEAT(OV5_MMU_HASH):
1235                 prom_debug("MMU - hash only\n");
1236                 support->hash_mmu = true;
1237                 break;
1238         default:
1239                 prom_debug("Unknown mmu support option: 0x%x\n", val);
1240                 break;
1241         }
1242 }
1243
1244 static void __init prom_parse_xive_model(u8 val,
1245                                          struct platform_support *support)
1246 {
1247         switch (val) {
1248         case OV5_FEAT(OV5_XIVE_EITHER): /* Either Available */
1249                 prom_debug("XIVE - either mode supported\n");
1250                 support->xive = !prom_xive_disable;
1251                 break;
1252         case OV5_FEAT(OV5_XIVE_EXPLOIT): /* Only Exploitation mode */
1253                 prom_debug("XIVE - exploitation mode supported\n");
1254                 if (prom_xive_disable) {
1255                         /*
1256                          * If we __have__ to do XIVE, we're better off ignoring
1257                          * the command line rather than not booting.
1258                          */
1259                         prom_printf("WARNING: Ignoring cmdline option xive=off\n");
1260                 }
1261                 support->xive = true;
1262                 break;
1263         case OV5_FEAT(OV5_XIVE_LEGACY): /* Only Legacy mode */
1264                 prom_debug("XIVE - legacy mode supported\n");
1265                 break;
1266         default:
1267                 prom_debug("Unknown xive support option: 0x%x\n", val);
1268                 break;
1269         }
1270 }
1271
1272 static void __init prom_parse_platform_support(u8 index, u8 val,
1273                                                struct platform_support *support)
1274 {
1275         switch (index) {
1276         case OV5_INDX(OV5_MMU_SUPPORT): /* MMU Model */
1277                 prom_parse_mmu_model(val & OV5_FEAT(OV5_MMU_SUPPORT), support);
1278                 break;
1279         case OV5_INDX(OV5_RADIX_GTSE): /* Radix Extensions */
1280                 if (val & OV5_FEAT(OV5_RADIX_GTSE)) {
1281                         prom_debug("Radix - GTSE supported\n");
1282                         support->radix_gtse = true;
1283                 }
1284                 break;
1285         case OV5_INDX(OV5_XIVE_SUPPORT): /* Interrupt mode */
1286                 prom_parse_xive_model(val & OV5_FEAT(OV5_XIVE_SUPPORT),
1287                                       support);
1288                 break;
1289         }
1290 }
1291
1292 static void __init prom_check_platform_support(void)
1293 {
1294         struct platform_support supported = {
1295                 .hash_mmu = false,
1296                 .radix_mmu = false,
1297                 .radix_gtse = false,
1298                 .xive = false
1299         };
1300         int prop_len = prom_getproplen(prom.chosen,
1301                                        "ibm,arch-vec-5-platform-support");
1302
1303         /*
1304          * First copy the architecture vec template
1305          *
1306          * use memcpy() instead of *vec = *vec_template so that GCC replaces it
1307          * by __memcpy() when KASAN is active
1308          */
1309         memcpy(&ibm_architecture_vec, &ibm_architecture_vec_template,
1310                sizeof(ibm_architecture_vec));
1311
1312         if (prop_len > 1) {
1313                 int i;
1314                 u8 vec[8];
1315                 prom_debug("Found ibm,arch-vec-5-platform-support, len: %d\n",
1316                            prop_len);
1317                 if (prop_len > sizeof(vec))
1318                         prom_printf("WARNING: ibm,arch-vec-5-platform-support longer than expected (len: %d)\n",
1319                                     prop_len);
1320                 prom_getprop(prom.chosen, "ibm,arch-vec-5-platform-support",
1321                              &vec, sizeof(vec));
1322                 for (i = 0; i < sizeof(vec); i += 2) {
1323                         prom_debug("%d: index = 0x%x val = 0x%x\n", i / 2
1324                                                                   , vec[i]
1325                                                                   , vec[i + 1]);
1326                         prom_parse_platform_support(vec[i], vec[i + 1],
1327                                                     &supported);
1328                 }
1329         }
1330
1331         if (supported.radix_mmu && supported.radix_gtse &&
1332             IS_ENABLED(CONFIG_PPC_RADIX_MMU)) {
1333                 /* Radix preferred - but we require GTSE for now */
1334                 prom_debug("Asking for radix with GTSE\n");
1335                 ibm_architecture_vec.vec5.mmu = OV5_FEAT(OV5_MMU_RADIX);
1336                 ibm_architecture_vec.vec5.radix_ext = OV5_FEAT(OV5_RADIX_GTSE);
1337         } else if (supported.hash_mmu) {
1338                 /* Default to hash mmu (if we can) */
1339                 prom_debug("Asking for hash\n");
1340                 ibm_architecture_vec.vec5.mmu = OV5_FEAT(OV5_MMU_HASH);
1341         } else {
1342                 /* We're probably on a legacy hypervisor */
1343                 prom_debug("Assuming legacy hash support\n");
1344         }
1345
1346         if (supported.xive) {
1347                 prom_debug("Asking for XIVE\n");
1348                 ibm_architecture_vec.vec5.intarch = OV5_FEAT(OV5_XIVE_EXPLOIT);
1349         }
1350 }
1351
1352 static void __init prom_send_capabilities(void)
1353 {
1354         ihandle root;
1355         prom_arg_t ret;
1356         u32 cores;
1357
1358         /* Check ibm,arch-vec-5-platform-support and fixup vec5 if required */
1359         prom_check_platform_support();
1360
1361         root = call_prom("open", 1, 1, ADDR("/"));
1362         if (root != 0) {
1363                 /* We need to tell the FW about the number of cores we support.
1364                  *
1365                  * To do that, we count the number of threads on the first core
1366                  * (we assume this is the same for all cores) and use it to
1367                  * divide NR_CPUS.
1368                  */
1369
1370                 cores = DIV_ROUND_UP(NR_CPUS, prom_count_smt_threads());
1371                 prom_printf("Max number of cores passed to firmware: %u (NR_CPUS = %d)\n",
1372                             cores, NR_CPUS);
1373
1374                 ibm_architecture_vec.vec5.max_cpus = cpu_to_be32(cores);
1375
1376                 /* try calling the ibm,client-architecture-support method */
1377                 prom_printf("Calling ibm,client-architecture-support...");
1378                 if (call_prom_ret("call-method", 3, 2, &ret,
1379                                   ADDR("ibm,client-architecture-support"),
1380                                   root,
1381                                   ADDR(&ibm_architecture_vec)) == 0) {
1382                         /* the call exists... */
1383                         if (ret)
1384                                 prom_printf("\nWARNING: ibm,client-architecture"
1385                                             "-support call FAILED!\n");
1386                         call_prom("close", 1, 0, root);
1387                         prom_printf(" done\n");
1388                         return;
1389                 }
1390                 call_prom("close", 1, 0, root);
1391                 prom_printf(" not implemented\n");
1392         }
1393
1394 #ifdef __BIG_ENDIAN__
1395         {
1396                 ihandle elfloader;
1397
1398                 /* no ibm,client-architecture-support call, try the old way */
1399                 elfloader = call_prom("open", 1, 1,
1400                                       ADDR("/packages/elf-loader"));
1401                 if (elfloader == 0) {
1402                         prom_printf("couldn't open /packages/elf-loader\n");
1403                         return;
1404                 }
1405                 call_prom("call-method", 3, 1, ADDR("process-elf-header"),
1406                           elfloader, ADDR(&fake_elf));
1407                 call_prom("close", 1, 0, elfloader);
1408         }
1409 #endif /* __BIG_ENDIAN__ */
1410 }
1411 #endif /* CONFIG_PPC_PSERIES */
1412
1413 /*
1414  * Memory allocation strategy... our layout is normally:
1415  *
1416  *  at 14Mb or more we have vmlinux, then a gap and initrd.  In some
1417  *  rare cases, initrd might end up being before the kernel though.
1418  *  We assume this won't override the final kernel at 0, we have no
1419  *  provision to handle that in this version, but it should hopefully
1420  *  never happen.
1421  *
1422  *  alloc_top is set to the top of RMO, eventually shrink down if the
1423  *  TCEs overlap
1424  *
1425  *  alloc_bottom is set to the top of kernel/initrd
1426  *
1427  *  from there, allocations are done this way : rtas is allocated
1428  *  topmost, and the device-tree is allocated from the bottom. We try
1429  *  to grow the device-tree allocation as we progress. If we can't,
1430  *  then we fail, we don't currently have a facility to restart
1431  *  elsewhere, but that shouldn't be necessary.
1432  *
1433  *  Note that calls to reserve_mem have to be done explicitly, memory
1434  *  allocated with either alloc_up or alloc_down isn't automatically
1435  *  reserved.
1436  */
1437
1438
1439 /*
1440  * Allocates memory in the RMO upward from the kernel/initrd
1441  *
1442  * When align is 0, this is a special case, it means to allocate in place
1443  * at the current location of alloc_bottom or fail (that is basically
1444  * extending the previous allocation). Used for the device-tree flattening
1445  */
1446 static unsigned long __init alloc_up(unsigned long size, unsigned long align)
1447 {
1448         unsigned long base = alloc_bottom;
1449         unsigned long addr = 0;
1450
1451         if (align)
1452                 base = _ALIGN_UP(base, align);
1453         prom_debug("%s(%lx, %lx)\n", __func__, size, align);
1454         if (ram_top == 0)
1455                 prom_panic("alloc_up() called with mem not initialized\n");
1456
1457         if (align)
1458                 base = _ALIGN_UP(alloc_bottom, align);
1459         else
1460                 base = alloc_bottom;
1461
1462         for(; (base + size) <= alloc_top; 
1463             base = _ALIGN_UP(base + 0x100000, align)) {
1464                 prom_debug("    trying: 0x%lx\n\r", base);
1465                 addr = (unsigned long)prom_claim(base, size, 0);
1466                 if (addr != PROM_ERROR && addr != 0)
1467                         break;
1468                 addr = 0;
1469                 if (align == 0)
1470                         break;
1471         }
1472         if (addr == 0)
1473                 return 0;
1474         alloc_bottom = addr + size;
1475
1476         prom_debug(" -> %lx\n", addr);
1477         prom_debug("  alloc_bottom : %lx\n", alloc_bottom);
1478         prom_debug("  alloc_top    : %lx\n", alloc_top);
1479         prom_debug("  alloc_top_hi : %lx\n", alloc_top_high);
1480         prom_debug("  rmo_top      : %lx\n", rmo_top);
1481         prom_debug("  ram_top      : %lx\n", ram_top);
1482
1483         return addr;
1484 }
1485
1486 /*
1487  * Allocates memory downward, either from top of RMO, or if highmem
1488  * is set, from the top of RAM.  Note that this one doesn't handle
1489  * failures.  It does claim memory if highmem is not set.
1490  */
1491 static unsigned long __init alloc_down(unsigned long size, unsigned long align,
1492                                        int highmem)
1493 {
1494         unsigned long base, addr = 0;
1495
1496         prom_debug("%s(%lx, %lx, %s)\n", __func__, size, align,
1497                    highmem ? "(high)" : "(low)");
1498         if (ram_top == 0)
1499                 prom_panic("alloc_down() called with mem not initialized\n");
1500
1501         if (highmem) {
1502                 /* Carve out storage for the TCE table. */
1503                 addr = _ALIGN_DOWN(alloc_top_high - size, align);
1504                 if (addr <= alloc_bottom)
1505                         return 0;
1506                 /* Will we bump into the RMO ? If yes, check out that we
1507                  * didn't overlap existing allocations there, if we did,
1508                  * we are dead, we must be the first in town !
1509                  */
1510                 if (addr < rmo_top) {
1511                         /* Good, we are first */
1512                         if (alloc_top == rmo_top)
1513                                 alloc_top = rmo_top = addr;
1514                         else
1515                                 return 0;
1516                 }
1517                 alloc_top_high = addr;
1518                 goto bail;
1519         }
1520
1521         base = _ALIGN_DOWN(alloc_top - size, align);
1522         for (; base > alloc_bottom;
1523              base = _ALIGN_DOWN(base - 0x100000, align))  {
1524                 prom_debug("    trying: 0x%lx\n\r", base);
1525                 addr = (unsigned long)prom_claim(base, size, 0);
1526                 if (addr != PROM_ERROR && addr != 0)
1527                         break;
1528                 addr = 0;
1529         }
1530         if (addr == 0)
1531                 return 0;
1532         alloc_top = addr;
1533
1534  bail:
1535         prom_debug(" -> %lx\n", addr);
1536         prom_debug("  alloc_bottom : %lx\n", alloc_bottom);
1537         prom_debug("  alloc_top    : %lx\n", alloc_top);
1538         prom_debug("  alloc_top_hi : %lx\n", alloc_top_high);
1539         prom_debug("  rmo_top      : %lx\n", rmo_top);
1540         prom_debug("  ram_top      : %lx\n", ram_top);
1541
1542         return addr;
1543 }
1544
1545 /*
1546  * Parse a "reg" cell
1547  */
1548 static unsigned long __init prom_next_cell(int s, cell_t **cellp)
1549 {
1550         cell_t *p = *cellp;
1551         unsigned long r = 0;
1552
1553         /* Ignore more than 2 cells */
1554         while (s > sizeof(unsigned long) / 4) {
1555                 p++;
1556                 s--;
1557         }
1558         r = be32_to_cpu(*p++);
1559 #ifdef CONFIG_PPC64
1560         if (s > 1) {
1561                 r <<= 32;
1562                 r |= be32_to_cpu(*(p++));
1563         }
1564 #endif
1565         *cellp = p;
1566         return r;
1567 }
1568
1569 /*
1570  * Very dumb function for adding to the memory reserve list, but
1571  * we don't need anything smarter at this point
1572  *
1573  * XXX Eventually check for collisions.  They should NEVER happen.
1574  * If problems seem to show up, it would be a good start to track
1575  * them down.
1576  */
1577 static void __init reserve_mem(u64 base, u64 size)
1578 {
1579         u64 top = base + size;
1580         unsigned long cnt = mem_reserve_cnt;
1581
1582         if (size == 0)
1583                 return;
1584
1585         /* We need to always keep one empty entry so that we
1586          * have our terminator with "size" set to 0 since we are
1587          * dumb and just copy this entire array to the boot params
1588          */
1589         base = _ALIGN_DOWN(base, PAGE_SIZE);
1590         top = _ALIGN_UP(top, PAGE_SIZE);
1591         size = top - base;
1592
1593         if (cnt >= (MEM_RESERVE_MAP_SIZE - 1))
1594                 prom_panic("Memory reserve map exhausted !\n");
1595         mem_reserve_map[cnt].base = cpu_to_be64(base);
1596         mem_reserve_map[cnt].size = cpu_to_be64(size);
1597         mem_reserve_cnt = cnt + 1;
1598 }
1599
1600 /*
1601  * Initialize memory allocation mechanism, parse "memory" nodes and
1602  * obtain that way the top of memory and RMO to setup out local allocator
1603  */
1604 static void __init prom_init_mem(void)
1605 {
1606         phandle node;
1607         char type[64];
1608         unsigned int plen;
1609         cell_t *p, *endp;
1610         __be32 val;
1611         u32 rac, rsc;
1612
1613         /*
1614          * We iterate the memory nodes to find
1615          * 1) top of RMO (first node)
1616          * 2) top of memory
1617          */
1618         val = cpu_to_be32(2);
1619         prom_getprop(prom.root, "#address-cells", &val, sizeof(val));
1620         rac = be32_to_cpu(val);
1621         val = cpu_to_be32(1);
1622         prom_getprop(prom.root, "#size-cells", &val, sizeof(rsc));
1623         rsc = be32_to_cpu(val);
1624         prom_debug("root_addr_cells: %x\n", rac);
1625         prom_debug("root_size_cells: %x\n", rsc);
1626
1627         prom_debug("scanning memory:\n");
1628
1629         for (node = 0; prom_next_node(&node); ) {
1630                 type[0] = 0;
1631                 prom_getprop(node, "device_type", type, sizeof(type));
1632
1633                 if (type[0] == 0) {
1634                         /*
1635                          * CHRP Longtrail machines have no device_type
1636                          * on the memory node, so check the name instead...
1637                          */
1638                         prom_getprop(node, "name", type, sizeof(type));
1639                 }
1640                 if (prom_strcmp(type, "memory"))
1641                         continue;
1642
1643                 plen = prom_getprop(node, "reg", regbuf, sizeof(regbuf));
1644                 if (plen > sizeof(regbuf)) {
1645                         prom_printf("memory node too large for buffer !\n");
1646                         plen = sizeof(regbuf);
1647                 }
1648                 p = regbuf;
1649                 endp = p + (plen / sizeof(cell_t));
1650
1651 #ifdef DEBUG_PROM
1652                 memset(prom_scratch, 0, sizeof(prom_scratch));
1653                 call_prom("package-to-path", 3, 1, node, prom_scratch,
1654                           sizeof(prom_scratch) - 1);
1655                 prom_debug("  node %s :\n", prom_scratch);
1656 #endif /* DEBUG_PROM */
1657
1658                 while ((endp - p) >= (rac + rsc)) {
1659                         unsigned long base, size;
1660
1661                         base = prom_next_cell(rac, &p);
1662                         size = prom_next_cell(rsc, &p);
1663
1664                         if (size == 0)
1665                                 continue;
1666                         prom_debug("    %lx %lx\n", base, size);
1667                         if (base == 0 && (of_platform & PLATFORM_LPAR))
1668                                 rmo_top = size;
1669                         if ((base + size) > ram_top)
1670                                 ram_top = base + size;
1671                 }
1672         }
1673
1674         alloc_bottom = PAGE_ALIGN((unsigned long)&_end + 0x4000);
1675
1676         /*
1677          * If prom_memory_limit is set we reduce the upper limits *except* for
1678          * alloc_top_high. This must be the real top of RAM so we can put
1679          * TCE's up there.
1680          */
1681
1682         alloc_top_high = ram_top;
1683
1684         if (prom_memory_limit) {
1685                 if (prom_memory_limit <= alloc_bottom) {
1686                         prom_printf("Ignoring mem=%lx <= alloc_bottom.\n",
1687                                     prom_memory_limit);
1688                         prom_memory_limit = 0;
1689                 } else if (prom_memory_limit >= ram_top) {
1690                         prom_printf("Ignoring mem=%lx >= ram_top.\n",
1691                                     prom_memory_limit);
1692                         prom_memory_limit = 0;
1693                 } else {
1694                         ram_top = prom_memory_limit;
1695                         rmo_top = min(rmo_top, prom_memory_limit);
1696                 }
1697         }
1698
1699         /*
1700          * Setup our top alloc point, that is top of RMO or top of
1701          * segment 0 when running non-LPAR.
1702          * Some RS64 machines have buggy firmware where claims up at
1703          * 1GB fail.  Cap at 768MB as a workaround.
1704          * Since 768MB is plenty of room, and we need to cap to something
1705          * reasonable on 32-bit, cap at 768MB on all machines.
1706          */
1707         if (!rmo_top)
1708                 rmo_top = ram_top;
1709         rmo_top = min(0x30000000ul, rmo_top);
1710         alloc_top = rmo_top;
1711         alloc_top_high = ram_top;
1712
1713         /*
1714          * Check if we have an initrd after the kernel but still inside
1715          * the RMO.  If we do move our bottom point to after it.
1716          */
1717         if (prom_initrd_start &&
1718             prom_initrd_start < rmo_top &&
1719             prom_initrd_end > alloc_bottom)
1720                 alloc_bottom = PAGE_ALIGN(prom_initrd_end);
1721
1722         prom_printf("memory layout at init:\n");
1723         prom_printf("  memory_limit : %lx (16 MB aligned)\n",
1724                     prom_memory_limit);
1725         prom_printf("  alloc_bottom : %lx\n", alloc_bottom);
1726         prom_printf("  alloc_top    : %lx\n", alloc_top);
1727         prom_printf("  alloc_top_hi : %lx\n", alloc_top_high);
1728         prom_printf("  rmo_top      : %lx\n", rmo_top);
1729         prom_printf("  ram_top      : %lx\n", ram_top);
1730 }
1731
1732 static void __init prom_close_stdin(void)
1733 {
1734         __be32 val;
1735         ihandle stdin;
1736
1737         if (prom_getprop(prom.chosen, "stdin", &val, sizeof(val)) > 0) {
1738                 stdin = be32_to_cpu(val);
1739                 call_prom("close", 1, 0, stdin);
1740         }
1741 }
1742
1743 #ifdef CONFIG_PPC_SVM
1744 static int prom_rtas_hcall(uint64_t args)
1745 {
1746         register uint64_t arg1 asm("r3") = H_RTAS;
1747         register uint64_t arg2 asm("r4") = args;
1748
1749         asm volatile("sc 1\n" : "=r" (arg1) :
1750                         "r" (arg1),
1751                         "r" (arg2) :);
1752         return arg1;
1753 }
1754
1755 static struct rtas_args __prombss os_term_args;
1756
1757 static void __init prom_rtas_os_term(char *str)
1758 {
1759         phandle rtas_node;
1760         __be32 val;
1761         u32 token;
1762
1763         prom_debug("%s: start...\n", __func__);
1764         rtas_node = call_prom("finddevice", 1, 1, ADDR("/rtas"));
1765         prom_debug("rtas_node: %x\n", rtas_node);
1766         if (!PHANDLE_VALID(rtas_node))
1767                 return;
1768
1769         val = 0;
1770         prom_getprop(rtas_node, "ibm,os-term", &val, sizeof(val));
1771         token = be32_to_cpu(val);
1772         prom_debug("ibm,os-term: %x\n", token);
1773         if (token == 0)
1774                 prom_panic("Could not get token for ibm,os-term\n");
1775         os_term_args.token = cpu_to_be32(token);
1776         os_term_args.nargs = cpu_to_be32(1);
1777         os_term_args.nret = cpu_to_be32(1);
1778         os_term_args.args[0] = cpu_to_be32(__pa(str));
1779         prom_rtas_hcall((uint64_t)&os_term_args);
1780 }
1781 #endif /* CONFIG_PPC_SVM */
1782
1783 /*
1784  * Allocate room for and instantiate RTAS
1785  */
1786 static void __init prom_instantiate_rtas(void)
1787 {
1788         phandle rtas_node;
1789         ihandle rtas_inst;
1790         u32 base, entry = 0;
1791         __be32 val;
1792         u32 size = 0;
1793
1794         prom_debug("prom_instantiate_rtas: start...\n");
1795
1796         rtas_node = call_prom("finddevice", 1, 1, ADDR("/rtas"));
1797         prom_debug("rtas_node: %x\n", rtas_node);
1798         if (!PHANDLE_VALID(rtas_node))
1799                 return;
1800
1801         val = 0;
1802         prom_getprop(rtas_node, "rtas-size", &val, sizeof(size));
1803         size = be32_to_cpu(val);
1804         if (size == 0)
1805                 return;
1806
1807         base = alloc_down(size, PAGE_SIZE, 0);
1808         if (base == 0)
1809                 prom_panic("Could not allocate memory for RTAS\n");
1810
1811         rtas_inst = call_prom("open", 1, 1, ADDR("/rtas"));
1812         if (!IHANDLE_VALID(rtas_inst)) {
1813                 prom_printf("opening rtas package failed (%x)\n", rtas_inst);
1814                 return;
1815         }
1816
1817         prom_printf("instantiating rtas at 0x%x...", base);
1818
1819         if (call_prom_ret("call-method", 3, 2, &entry,
1820                           ADDR("instantiate-rtas"),
1821                           rtas_inst, base) != 0
1822             || entry == 0) {
1823                 prom_printf(" failed\n");
1824                 return;
1825         }
1826         prom_printf(" done\n");
1827
1828         reserve_mem(base, size);
1829
1830         val = cpu_to_be32(base);
1831         prom_setprop(rtas_node, "/rtas", "linux,rtas-base",
1832                      &val, sizeof(val));
1833         val = cpu_to_be32(entry);
1834         prom_setprop(rtas_node, "/rtas", "linux,rtas-entry",
1835                      &val, sizeof(val));
1836
1837         /* Check if it supports "query-cpu-stopped-state" */
1838         if (prom_getprop(rtas_node, "query-cpu-stopped-state",
1839                          &val, sizeof(val)) != PROM_ERROR)
1840                 rtas_has_query_cpu_stopped = true;
1841
1842         prom_debug("rtas base     = 0x%x\n", base);
1843         prom_debug("rtas entry    = 0x%x\n", entry);
1844         prom_debug("rtas size     = 0x%x\n", size);
1845
1846         prom_debug("prom_instantiate_rtas: end...\n");
1847 }
1848
1849 #ifdef CONFIG_PPC64
1850 /*
1851  * Allocate room for and instantiate Stored Measurement Log (SML)
1852  */
1853 static void __init prom_instantiate_sml(void)
1854 {
1855         phandle ibmvtpm_node;
1856         ihandle ibmvtpm_inst;
1857         u32 entry = 0, size = 0, succ = 0;
1858         u64 base;
1859         __be32 val;
1860
1861         prom_debug("prom_instantiate_sml: start...\n");
1862
1863         ibmvtpm_node = call_prom("finddevice", 1, 1, ADDR("/vdevice/vtpm"));
1864         prom_debug("ibmvtpm_node: %x\n", ibmvtpm_node);
1865         if (!PHANDLE_VALID(ibmvtpm_node))
1866                 return;
1867
1868         ibmvtpm_inst = call_prom("open", 1, 1, ADDR("/vdevice/vtpm"));
1869         if (!IHANDLE_VALID(ibmvtpm_inst)) {
1870                 prom_printf("opening vtpm package failed (%x)\n", ibmvtpm_inst);
1871                 return;
1872         }
1873
1874         if (prom_getprop(ibmvtpm_node, "ibm,sml-efi-reformat-supported",
1875                          &val, sizeof(val)) != PROM_ERROR) {
1876                 if (call_prom_ret("call-method", 2, 2, &succ,
1877                                   ADDR("reformat-sml-to-efi-alignment"),
1878                                   ibmvtpm_inst) != 0 || succ == 0) {
1879                         prom_printf("Reformat SML to EFI alignment failed\n");
1880                         return;
1881                 }
1882
1883                 if (call_prom_ret("call-method", 2, 2, &size,
1884                                   ADDR("sml-get-allocated-size"),
1885                                   ibmvtpm_inst) != 0 || size == 0) {
1886                         prom_printf("SML get allocated size failed\n");
1887                         return;
1888                 }
1889         } else {
1890                 if (call_prom_ret("call-method", 2, 2, &size,
1891                                   ADDR("sml-get-handover-size"),
1892                                   ibmvtpm_inst) != 0 || size == 0) {
1893                         prom_printf("SML get handover size failed\n");
1894                         return;
1895                 }
1896         }
1897
1898         base = alloc_down(size, PAGE_SIZE, 0);
1899         if (base == 0)
1900                 prom_panic("Could not allocate memory for sml\n");
1901
1902         prom_printf("instantiating sml at 0x%llx...", base);
1903
1904         memset((void *)base, 0, size);
1905
1906         if (call_prom_ret("call-method", 4, 2, &entry,
1907                           ADDR("sml-handover"),
1908                           ibmvtpm_inst, size, base) != 0 || entry == 0) {
1909                 prom_printf("SML handover failed\n");
1910                 return;
1911         }
1912         prom_printf(" done\n");
1913
1914         reserve_mem(base, size);
1915
1916         prom_setprop(ibmvtpm_node, "/vdevice/vtpm", "linux,sml-base",
1917                      &base, sizeof(base));
1918         prom_setprop(ibmvtpm_node, "/vdevice/vtpm", "linux,sml-size",
1919                      &size, sizeof(size));
1920
1921         prom_debug("sml base     = 0x%llx\n", base);
1922         prom_debug("sml size     = 0x%x\n", size);
1923
1924         prom_debug("prom_instantiate_sml: end...\n");
1925 }
1926
1927 /*
1928  * Allocate room for and initialize TCE tables
1929  */
1930 #ifdef __BIG_ENDIAN__
1931 static void __init prom_initialize_tce_table(void)
1932 {
1933         phandle node;
1934         ihandle phb_node;
1935         char compatible[64], type[64], model[64];
1936         char *path = prom_scratch;
1937         u64 base, align;
1938         u32 minalign, minsize;
1939         u64 tce_entry, *tce_entryp;
1940         u64 local_alloc_top, local_alloc_bottom;
1941         u64 i;
1942
1943         if (prom_iommu_off)
1944                 return;
1945
1946         prom_debug("starting prom_initialize_tce_table\n");
1947
1948         /* Cache current top of allocs so we reserve a single block */
1949         local_alloc_top = alloc_top_high;
1950         local_alloc_bottom = local_alloc_top;
1951
1952         /* Search all nodes looking for PHBs. */
1953         for (node = 0; prom_next_node(&node); ) {
1954                 compatible[0] = 0;
1955                 type[0] = 0;
1956                 model[0] = 0;
1957                 prom_getprop(node, "compatible",
1958                              compatible, sizeof(compatible));
1959                 prom_getprop(node, "device_type", type, sizeof(type));
1960                 prom_getprop(node, "model", model, sizeof(model));
1961
1962                 if ((type[0] == 0) || (prom_strstr(type, "pci") == NULL))
1963                         continue;
1964
1965                 /* Keep the old logic intact to avoid regression. */
1966                 if (compatible[0] != 0) {
1967                         if ((prom_strstr(compatible, "python") == NULL) &&
1968                             (prom_strstr(compatible, "Speedwagon") == NULL) &&
1969                             (prom_strstr(compatible, "Winnipeg") == NULL))
1970                                 continue;
1971                 } else if (model[0] != 0) {
1972                         if ((prom_strstr(model, "ython") == NULL) &&
1973                             (prom_strstr(model, "peedwagon") == NULL) &&
1974                             (prom_strstr(model, "innipeg") == NULL))
1975                                 continue;
1976                 }
1977
1978                 if (prom_getprop(node, "tce-table-minalign", &minalign,
1979                                  sizeof(minalign)) == PROM_ERROR)
1980                         minalign = 0;
1981                 if (prom_getprop(node, "tce-table-minsize", &minsize,
1982                                  sizeof(minsize)) == PROM_ERROR)
1983                         minsize = 4UL << 20;
1984
1985                 /*
1986                  * Even though we read what OF wants, we just set the table
1987                  * size to 4 MB.  This is enough to map 2GB of PCI DMA space.
1988                  * By doing this, we avoid the pitfalls of trying to DMA to
1989                  * MMIO space and the DMA alias hole.
1990                  */
1991                 minsize = 4UL << 20;
1992
1993                 /* Align to the greater of the align or size */
1994                 align = max(minalign, minsize);
1995                 base = alloc_down(minsize, align, 1);
1996                 if (base == 0)
1997                         prom_panic("ERROR, cannot find space for TCE table.\n");
1998                 if (base < local_alloc_bottom)
1999                         local_alloc_bottom = base;
2000
2001                 /* It seems OF doesn't null-terminate the path :-( */
2002                 memset(path, 0, sizeof(prom_scratch));
2003                 /* Call OF to setup the TCE hardware */
2004                 if (call_prom("package-to-path", 3, 1, node,
2005                               path, sizeof(prom_scratch) - 1) == PROM_ERROR) {
2006                         prom_printf("package-to-path failed\n");
2007                 }
2008
2009                 /* Save away the TCE table attributes for later use. */
2010                 prom_setprop(node, path, "linux,tce-base", &base, sizeof(base));
2011                 prom_setprop(node, path, "linux,tce-size", &minsize, sizeof(minsize));
2012
2013                 prom_debug("TCE table: %s\n", path);
2014                 prom_debug("\tnode = 0x%x\n", node);
2015                 prom_debug("\tbase = 0x%llx\n", base);
2016                 prom_debug("\tsize = 0x%x\n", minsize);
2017
2018                 /* Initialize the table to have a one-to-one mapping
2019                  * over the allocated size.
2020                  */
2021                 tce_entryp = (u64 *)base;
2022                 for (i = 0; i < (minsize >> 3) ;tce_entryp++, i++) {
2023                         tce_entry = (i << PAGE_SHIFT);
2024                         tce_entry |= 0x3;
2025                         *tce_entryp = tce_entry;
2026                 }
2027
2028                 prom_printf("opening PHB %s", path);
2029                 phb_node = call_prom("open", 1, 1, path);
2030                 if (phb_node == 0)
2031                         prom_printf("... failed\n");
2032                 else
2033                         prom_printf("... done\n");
2034
2035                 call_prom("call-method", 6, 0, ADDR("set-64-bit-addressing"),
2036                           phb_node, -1, minsize,
2037                           (u32) base, (u32) (base >> 32));
2038                 call_prom("close", 1, 0, phb_node);
2039         }
2040
2041         reserve_mem(local_alloc_bottom, local_alloc_top - local_alloc_bottom);
2042
2043         /* These are only really needed if there is a memory limit in
2044          * effect, but we don't know so export them always. */
2045         prom_tce_alloc_start = local_alloc_bottom;
2046         prom_tce_alloc_end = local_alloc_top;
2047
2048         /* Flag the first invalid entry */
2049         prom_debug("ending prom_initialize_tce_table\n");
2050 }
2051 #endif /* __BIG_ENDIAN__ */
2052 #endif /* CONFIG_PPC64 */
2053
2054 /*
2055  * With CHRP SMP we need to use the OF to start the other processors.
2056  * We can't wait until smp_boot_cpus (the OF is trashed by then)
2057  * so we have to put the processors into a holding pattern controlled
2058  * by the kernel (not OF) before we destroy the OF.
2059  *
2060  * This uses a chunk of low memory, puts some holding pattern
2061  * code there and sends the other processors off to there until
2062  * smp_boot_cpus tells them to do something.  The holding pattern
2063  * checks that address until its cpu # is there, when it is that
2064  * cpu jumps to __secondary_start().  smp_boot_cpus() takes care
2065  * of setting those values.
2066  *
2067  * We also use physical address 0x4 here to tell when a cpu
2068  * is in its holding pattern code.
2069  *
2070  * -- Cort
2071  */
2072 /*
2073  * We want to reference the copy of __secondary_hold_* in the
2074  * 0 - 0x100 address range
2075  */
2076 #define LOW_ADDR(x)     (((unsigned long) &(x)) & 0xff)
2077
2078 static void __init prom_hold_cpus(void)
2079 {
2080         unsigned long i;
2081         phandle node;
2082         char type[64];
2083         unsigned long *spinloop
2084                 = (void *) LOW_ADDR(__secondary_hold_spinloop);
2085         unsigned long *acknowledge
2086                 = (void *) LOW_ADDR(__secondary_hold_acknowledge);
2087         unsigned long secondary_hold = LOW_ADDR(__secondary_hold);
2088
2089         /*
2090          * On pseries, if RTAS supports "query-cpu-stopped-state",
2091          * we skip this stage, the CPUs will be started by the
2092          * kernel using RTAS.
2093          */
2094         if ((of_platform == PLATFORM_PSERIES ||
2095              of_platform == PLATFORM_PSERIES_LPAR) &&
2096             rtas_has_query_cpu_stopped) {
2097                 prom_printf("prom_hold_cpus: skipped\n");
2098                 return;
2099         }
2100
2101         prom_debug("prom_hold_cpus: start...\n");
2102         prom_debug("    1) spinloop       = 0x%lx\n", (unsigned long)spinloop);
2103         prom_debug("    1) *spinloop      = 0x%lx\n", *spinloop);
2104         prom_debug("    1) acknowledge    = 0x%lx\n",
2105                    (unsigned long)acknowledge);
2106         prom_debug("    1) *acknowledge   = 0x%lx\n", *acknowledge);
2107         prom_debug("    1) secondary_hold = 0x%lx\n", secondary_hold);
2108
2109         /* Set the common spinloop variable, so all of the secondary cpus
2110          * will block when they are awakened from their OF spinloop.
2111          * This must occur for both SMP and non SMP kernels, since OF will
2112          * be trashed when we move the kernel.
2113          */
2114         *spinloop = 0;
2115
2116         /* look for cpus */
2117         for (node = 0; prom_next_node(&node); ) {
2118                 unsigned int cpu_no;
2119                 __be32 reg;
2120
2121                 type[0] = 0;
2122                 prom_getprop(node, "device_type", type, sizeof(type));
2123                 if (prom_strcmp(type, "cpu") != 0)
2124                         continue;
2125
2126                 /* Skip non-configured cpus. */
2127                 if (prom_getprop(node, "status", type, sizeof(type)) > 0)
2128                         if (prom_strcmp(type, "okay") != 0)
2129                                 continue;
2130
2131                 reg = cpu_to_be32(-1); /* make sparse happy */
2132                 prom_getprop(node, "reg", &reg, sizeof(reg));
2133                 cpu_no = be32_to_cpu(reg);
2134
2135                 prom_debug("cpu hw idx   = %u\n", cpu_no);
2136
2137                 /* Init the acknowledge var which will be reset by
2138                  * the secondary cpu when it awakens from its OF
2139                  * spinloop.
2140                  */
2141                 *acknowledge = (unsigned long)-1;
2142
2143                 if (cpu_no != prom.cpu) {
2144                         /* Primary Thread of non-boot cpu or any thread */
2145                         prom_printf("starting cpu hw idx %u... ", cpu_no);
2146                         call_prom("start-cpu", 3, 0, node,
2147                                   secondary_hold, cpu_no);
2148
2149                         for (i = 0; (i < 100000000) && 
2150                              (*acknowledge == ((unsigned long)-1)); i++ )
2151                                 mb();
2152
2153                         if (*acknowledge == cpu_no)
2154                                 prom_printf("done\n");
2155                         else
2156                                 prom_printf("failed: %lx\n", *acknowledge);
2157                 }
2158 #ifdef CONFIG_SMP
2159                 else
2160                         prom_printf("boot cpu hw idx %u\n", cpu_no);
2161 #endif /* CONFIG_SMP */
2162         }
2163
2164         prom_debug("prom_hold_cpus: end...\n");
2165 }
2166
2167
2168 static void __init prom_init_client_services(unsigned long pp)
2169 {
2170         /* Get a handle to the prom entry point before anything else */
2171         prom_entry = pp;
2172
2173         /* get a handle for the stdout device */
2174         prom.chosen = call_prom("finddevice", 1, 1, ADDR("/chosen"));
2175         if (!PHANDLE_VALID(prom.chosen))
2176                 prom_panic("cannot find chosen"); /* msg won't be printed :( */
2177
2178         /* get device tree root */
2179         prom.root = call_prom("finddevice", 1, 1, ADDR("/"));
2180         if (!PHANDLE_VALID(prom.root))
2181                 prom_panic("cannot find device tree root"); /* msg won't be printed :( */
2182
2183         prom.mmumap = 0;
2184 }
2185
2186 #ifdef CONFIG_PPC32
2187 /*
2188  * For really old powermacs, we need to map things we claim.
2189  * For that, we need the ihandle of the mmu.
2190  * Also, on the longtrail, we need to work around other bugs.
2191  */
2192 static void __init prom_find_mmu(void)
2193 {
2194         phandle oprom;
2195         char version[64];
2196
2197         oprom = call_prom("finddevice", 1, 1, ADDR("/openprom"));
2198         if (!PHANDLE_VALID(oprom))
2199                 return;
2200         if (prom_getprop(oprom, "model", version, sizeof(version)) <= 0)
2201                 return;
2202         version[sizeof(version) - 1] = 0;
2203         /* XXX might need to add other versions here */
2204         if (prom_strcmp(version, "Open Firmware, 1.0.5") == 0)
2205                 of_workarounds = OF_WA_CLAIM;
2206         else if (prom_strncmp(version, "FirmWorks,3.", 12) == 0) {
2207                 of_workarounds = OF_WA_CLAIM | OF_WA_LONGTRAIL;
2208                 call_prom("interpret", 1, 1, "dev /memory 0 to allow-reclaim");
2209         } else
2210                 return;
2211         prom.memory = call_prom("open", 1, 1, ADDR("/memory"));
2212         prom_getprop(prom.chosen, "mmu", &prom.mmumap,
2213                      sizeof(prom.mmumap));
2214         prom.mmumap = be32_to_cpu(prom.mmumap);
2215         if (!IHANDLE_VALID(prom.memory) || !IHANDLE_VALID(prom.mmumap))
2216                 of_workarounds &= ~OF_WA_CLAIM;         /* hmmm */
2217 }
2218 #else
2219 #define prom_find_mmu()
2220 #endif
2221
2222 static void __init prom_init_stdout(void)
2223 {
2224         char *path = of_stdout_device;
2225         char type[16];
2226         phandle stdout_node;
2227         __be32 val;
2228
2229         if (prom_getprop(prom.chosen, "stdout", &val, sizeof(val)) <= 0)
2230                 prom_panic("cannot find stdout");
2231
2232         prom.stdout = be32_to_cpu(val);
2233
2234         /* Get the full OF pathname of the stdout device */
2235         memset(path, 0, 256);
2236         call_prom("instance-to-path", 3, 1, prom.stdout, path, 255);
2237         prom_printf("OF stdout device is: %s\n", of_stdout_device);
2238         prom_setprop(prom.chosen, "/chosen", "linux,stdout-path",
2239                      path, prom_strlen(path) + 1);
2240
2241         /* instance-to-package fails on PA-Semi */
2242         stdout_node = call_prom("instance-to-package", 1, 1, prom.stdout);
2243         if (stdout_node != PROM_ERROR) {
2244                 val = cpu_to_be32(stdout_node);
2245
2246                 /* If it's a display, note it */
2247                 memset(type, 0, sizeof(type));
2248                 prom_getprop(stdout_node, "device_type", type, sizeof(type));
2249                 if (prom_strcmp(type, "display") == 0)
2250                         prom_setprop(stdout_node, path, "linux,boot-display", NULL, 0);
2251         }
2252 }
2253
2254 static int __init prom_find_machine_type(void)
2255 {
2256         char compat[256];
2257         int len, i = 0;
2258 #ifdef CONFIG_PPC64
2259         phandle rtas;
2260         int x;
2261 #endif
2262
2263         /* Look for a PowerMac or a Cell */
2264         len = prom_getprop(prom.root, "compatible",
2265                            compat, sizeof(compat)-1);
2266         if (len > 0) {
2267                 compat[len] = 0;
2268                 while (i < len) {
2269                         char *p = &compat[i];
2270                         int sl = prom_strlen(p);
2271                         if (sl == 0)
2272                                 break;
2273                         if (prom_strstr(p, "Power Macintosh") ||
2274                             prom_strstr(p, "MacRISC"))
2275                                 return PLATFORM_POWERMAC;
2276 #ifdef CONFIG_PPC64
2277                         /* We must make sure we don't detect the IBM Cell
2278                          * blades as pSeries due to some firmware issues,
2279                          * so we do it here.
2280                          */
2281                         if (prom_strstr(p, "IBM,CBEA") ||
2282                             prom_strstr(p, "IBM,CPBW-1.0"))
2283                                 return PLATFORM_GENERIC;
2284 #endif /* CONFIG_PPC64 */
2285                         i += sl + 1;
2286                 }
2287         }
2288 #ifdef CONFIG_PPC64
2289         /* Try to figure out if it's an IBM pSeries or any other
2290          * PAPR compliant platform. We assume it is if :
2291          *  - /device_type is "chrp" (please, do NOT use that for future
2292          *    non-IBM designs !
2293          *  - it has /rtas
2294          */
2295         len = prom_getprop(prom.root, "device_type",
2296                            compat, sizeof(compat)-1);
2297         if (len <= 0)
2298                 return PLATFORM_GENERIC;
2299         if (prom_strcmp(compat, "chrp"))
2300                 return PLATFORM_GENERIC;
2301
2302         /* Default to pSeries. We need to know if we are running LPAR */
2303         rtas = call_prom("finddevice", 1, 1, ADDR("/rtas"));
2304         if (!PHANDLE_VALID(rtas))
2305                 return PLATFORM_GENERIC;
2306         x = prom_getproplen(rtas, "ibm,hypertas-functions");
2307         if (x != PROM_ERROR) {
2308                 prom_debug("Hypertas detected, assuming LPAR !\n");
2309                 return PLATFORM_PSERIES_LPAR;
2310         }
2311         return PLATFORM_PSERIES;
2312 #else
2313         return PLATFORM_GENERIC;
2314 #endif
2315 }
2316
2317 static int __init prom_set_color(ihandle ih, int i, int r, int g, int b)
2318 {
2319         return call_prom("call-method", 6, 1, ADDR("color!"), ih, i, b, g, r);
2320 }
2321
2322 /*
2323  * If we have a display that we don't know how to drive,
2324  * we will want to try to execute OF's open method for it
2325  * later.  However, OF will probably fall over if we do that
2326  * we've taken over the MMU.
2327  * So we check whether we will need to open the display,
2328  * and if so, open it now.
2329  */
2330 static void __init prom_check_displays(void)
2331 {
2332         char type[16], *path;
2333         phandle node;
2334         ihandle ih;
2335         int i;
2336
2337         static const unsigned char default_colors[] __initconst = {
2338                 0x00, 0x00, 0x00,
2339                 0x00, 0x00, 0xaa,
2340                 0x00, 0xaa, 0x00,
2341                 0x00, 0xaa, 0xaa,
2342                 0xaa, 0x00, 0x00,
2343                 0xaa, 0x00, 0xaa,
2344                 0xaa, 0xaa, 0x00,
2345                 0xaa, 0xaa, 0xaa,
2346                 0x55, 0x55, 0x55,
2347                 0x55, 0x55, 0xff,
2348                 0x55, 0xff, 0x55,
2349                 0x55, 0xff, 0xff,
2350                 0xff, 0x55, 0x55,
2351                 0xff, 0x55, 0xff,
2352                 0xff, 0xff, 0x55,
2353                 0xff, 0xff, 0xff
2354         };
2355         const unsigned char *clut;
2356
2357         prom_debug("Looking for displays\n");
2358         for (node = 0; prom_next_node(&node); ) {
2359                 memset(type, 0, sizeof(type));
2360                 prom_getprop(node, "device_type", type, sizeof(type));
2361                 if (prom_strcmp(type, "display") != 0)
2362                         continue;
2363
2364                 /* It seems OF doesn't null-terminate the path :-( */
2365                 path = prom_scratch;
2366                 memset(path, 0, sizeof(prom_scratch));
2367
2368                 /*
2369                  * leave some room at the end of the path for appending extra
2370                  * arguments
2371                  */
2372                 if (call_prom("package-to-path", 3, 1, node, path,
2373                               sizeof(prom_scratch) - 10) == PROM_ERROR)
2374                         continue;
2375                 prom_printf("found display   : %s, opening... ", path);
2376                 
2377                 ih = call_prom("open", 1, 1, path);
2378                 if (ih == 0) {
2379                         prom_printf("failed\n");
2380                         continue;
2381                 }
2382
2383                 /* Success */
2384                 prom_printf("done\n");
2385                 prom_setprop(node, path, "linux,opened", NULL, 0);
2386
2387                 /* Setup a usable color table when the appropriate
2388                  * method is available. Should update this to set-colors */
2389                 clut = default_colors;
2390                 for (i = 0; i < 16; i++, clut += 3)
2391                         if (prom_set_color(ih, i, clut[0], clut[1],
2392                                            clut[2]) != 0)
2393                                 break;
2394
2395 #ifdef CONFIG_LOGO_LINUX_CLUT224
2396                 clut = PTRRELOC(logo_linux_clut224.clut);
2397                 for (i = 0; i < logo_linux_clut224.clutsize; i++, clut += 3)
2398                         if (prom_set_color(ih, i + 32, clut[0], clut[1],
2399                                            clut[2]) != 0)
2400                                 break;
2401 #endif /* CONFIG_LOGO_LINUX_CLUT224 */
2402
2403 #ifdef CONFIG_PPC_EARLY_DEBUG_BOOTX
2404                 if (prom_getprop(node, "linux,boot-display", NULL, 0) !=
2405                     PROM_ERROR) {
2406                         u32 width, height, pitch, addr;
2407
2408                         prom_printf("Setting btext !\n");
2409                         prom_getprop(node, "width", &width, 4);
2410                         prom_getprop(node, "height", &height, 4);
2411                         prom_getprop(node, "linebytes", &pitch, 4);
2412                         prom_getprop(node, "address", &addr, 4);
2413                         prom_printf("W=%d H=%d LB=%d addr=0x%x\n",
2414                                     width, height, pitch, addr);
2415                         btext_setup_display(width, height, 8, pitch, addr);
2416                         btext_prepare_BAT();
2417                 }
2418 #endif /* CONFIG_PPC_EARLY_DEBUG_BOOTX */
2419         }
2420 }
2421
2422
2423 /* Return (relocated) pointer to this much memory: moves initrd if reqd. */
2424 static void __init *make_room(unsigned long *mem_start, unsigned long *mem_end,
2425                               unsigned long needed, unsigned long align)
2426 {
2427         void *ret;
2428
2429         *mem_start = _ALIGN(*mem_start, align);
2430         while ((*mem_start + needed) > *mem_end) {
2431                 unsigned long room, chunk;
2432
2433                 prom_debug("Chunk exhausted, claiming more at %lx...\n",
2434                            alloc_bottom);
2435                 room = alloc_top - alloc_bottom;
2436                 if (room > DEVTREE_CHUNK_SIZE)
2437                         room = DEVTREE_CHUNK_SIZE;
2438                 if (room < PAGE_SIZE)
2439                         prom_panic("No memory for flatten_device_tree "
2440                                    "(no room)\n");
2441                 chunk = alloc_up(room, 0);
2442                 if (chunk == 0)
2443                         prom_panic("No memory for flatten_device_tree "
2444                                    "(claim failed)\n");
2445                 *mem_end = chunk + room;
2446         }
2447
2448         ret = (void *)*mem_start;
2449         *mem_start += needed;
2450
2451         return ret;
2452 }
2453
2454 #define dt_push_token(token, mem_start, mem_end) do {                   \
2455                 void *room = make_room(mem_start, mem_end, 4, 4);       \
2456                 *(__be32 *)room = cpu_to_be32(token);                   \
2457         } while(0)
2458
2459 static unsigned long __init dt_find_string(char *str)
2460 {
2461         char *s, *os;
2462
2463         s = os = (char *)dt_string_start;
2464         s += 4;
2465         while (s <  (char *)dt_string_end) {
2466                 if (prom_strcmp(s, str) == 0)
2467                         return s - os;
2468                 s += prom_strlen(s) + 1;
2469         }
2470         return 0;
2471 }
2472
2473 /*
2474  * The Open Firmware 1275 specification states properties must be 31 bytes or
2475  * less, however not all firmwares obey this. Make it 64 bytes to be safe.
2476  */
2477 #define MAX_PROPERTY_NAME 64
2478
2479 static void __init scan_dt_build_strings(phandle node,
2480                                          unsigned long *mem_start,
2481                                          unsigned long *mem_end)
2482 {
2483         char *prev_name, *namep, *sstart;
2484         unsigned long soff;
2485         phandle child;
2486
2487         sstart =  (char *)dt_string_start;
2488
2489         /* get and store all property names */
2490         prev_name = "";
2491         for (;;) {
2492                 /* 64 is max len of name including nul. */
2493                 namep = make_room(mem_start, mem_end, MAX_PROPERTY_NAME, 1);
2494                 if (call_prom("nextprop", 3, 1, node, prev_name, namep) != 1) {
2495                         /* No more nodes: unwind alloc */
2496                         *mem_start = (unsigned long)namep;
2497                         break;
2498                 }
2499
2500                 /* skip "name" */
2501                 if (prom_strcmp(namep, "name") == 0) {
2502                         *mem_start = (unsigned long)namep;
2503                         prev_name = "name";
2504                         continue;
2505                 }
2506                 /* get/create string entry */
2507                 soff = dt_find_string(namep);
2508                 if (soff != 0) {
2509                         *mem_start = (unsigned long)namep;
2510                         namep = sstart + soff;
2511                 } else {
2512                         /* Trim off some if we can */
2513                         *mem_start = (unsigned long)namep + prom_strlen(namep) + 1;
2514                         dt_string_end = *mem_start;
2515                 }
2516                 prev_name = namep;
2517         }
2518
2519         /* do all our children */
2520         child = call_prom("child", 1, 1, node);
2521         while (child != 0) {
2522                 scan_dt_build_strings(child, mem_start, mem_end);
2523                 child = call_prom("peer", 1, 1, child);
2524         }
2525 }
2526
2527 static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
2528                                         unsigned long *mem_end)
2529 {
2530         phandle child;
2531         char *namep, *prev_name, *sstart, *p, *ep, *lp, *path;
2532         unsigned long soff;
2533         unsigned char *valp;
2534         static char pname[MAX_PROPERTY_NAME] __prombss;
2535         int l, room, has_phandle = 0;
2536
2537         dt_push_token(OF_DT_BEGIN_NODE, mem_start, mem_end);
2538
2539         /* get the node's full name */
2540         namep = (char *)*mem_start;
2541         room = *mem_end - *mem_start;
2542         if (room > 255)
2543                 room = 255;
2544         l = call_prom("package-to-path", 3, 1, node, namep, room);
2545         if (l >= 0) {
2546                 /* Didn't fit?  Get more room. */
2547                 if (l >= room) {
2548                         if (l >= *mem_end - *mem_start)
2549                                 namep = make_room(mem_start, mem_end, l+1, 1);
2550                         call_prom("package-to-path", 3, 1, node, namep, l);
2551                 }
2552                 namep[l] = '\0';
2553
2554                 /* Fixup an Apple bug where they have bogus \0 chars in the
2555                  * middle of the path in some properties, and extract
2556                  * the unit name (everything after the last '/').
2557                  */
2558                 for (lp = p = namep, ep = namep + l; p < ep; p++) {
2559                         if (*p == '/')
2560                                 lp = namep;
2561                         else if (*p != 0)
2562                                 *lp++ = *p;
2563                 }
2564                 *lp = 0;
2565                 *mem_start = _ALIGN((unsigned long)lp + 1, 4);
2566         }
2567
2568         /* get it again for debugging */
2569         path = prom_scratch;
2570         memset(path, 0, sizeof(prom_scratch));
2571         call_prom("package-to-path", 3, 1, node, path, sizeof(prom_scratch) - 1);
2572
2573         /* get and store all properties */
2574         prev_name = "";
2575         sstart = (char *)dt_string_start;
2576         for (;;) {
2577                 if (call_prom("nextprop", 3, 1, node, prev_name,
2578                               pname) != 1)
2579                         break;
2580
2581                 /* skip "name" */
2582                 if (prom_strcmp(pname, "name") == 0) {
2583                         prev_name = "name";
2584                         continue;
2585                 }
2586
2587                 /* find string offset */
2588                 soff = dt_find_string(pname);
2589                 if (soff == 0) {
2590                         prom_printf("WARNING: Can't find string index for"
2591                                     " <%s>, node %s\n", pname, path);
2592                         break;
2593                 }
2594                 prev_name = sstart + soff;
2595
2596                 /* get length */
2597                 l = call_prom("getproplen", 2, 1, node, pname);
2598
2599                 /* sanity checks */
2600                 if (l == PROM_ERROR)
2601                         continue;
2602
2603                 /* push property head */
2604                 dt_push_token(OF_DT_PROP, mem_start, mem_end);
2605                 dt_push_token(l, mem_start, mem_end);
2606                 dt_push_token(soff, mem_start, mem_end);
2607
2608                 /* push property content */
2609                 valp = make_room(mem_start, mem_end, l, 4);
2610                 call_prom("getprop", 4, 1, node, pname, valp, l);
2611                 *mem_start = _ALIGN(*mem_start, 4);
2612
2613                 if (!prom_strcmp(pname, "phandle"))
2614                         has_phandle = 1;
2615         }
2616
2617         /* Add a "phandle" property if none already exist */
2618         if (!has_phandle) {
2619                 soff = dt_find_string("phandle");
2620                 if (soff == 0)
2621                         prom_printf("WARNING: Can't find string index for <phandle> node %s\n", path);
2622                 else {
2623                         dt_push_token(OF_DT_PROP, mem_start, mem_end);
2624                         dt_push_token(4, mem_start, mem_end);
2625                         dt_push_token(soff, mem_start, mem_end);
2626                         valp = make_room(mem_start, mem_end, 4, 4);
2627                         *(__be32 *)valp = cpu_to_be32(node);
2628                 }
2629         }
2630
2631         /* do all our children */
2632         child = call_prom("child", 1, 1, node);
2633         while (child != 0) {
2634                 scan_dt_build_struct(child, mem_start, mem_end);
2635                 child = call_prom("peer", 1, 1, child);
2636         }
2637
2638         dt_push_token(OF_DT_END_NODE, mem_start, mem_end);
2639 }
2640
2641 static void __init flatten_device_tree(void)
2642 {
2643         phandle root;
2644         unsigned long mem_start, mem_end, room;
2645         struct boot_param_header *hdr;
2646         char *namep;
2647         u64 *rsvmap;
2648
2649         /*
2650          * Check how much room we have between alloc top & bottom (+/- a
2651          * few pages), crop to 1MB, as this is our "chunk" size
2652          */
2653         room = alloc_top - alloc_bottom - 0x4000;
2654         if (room > DEVTREE_CHUNK_SIZE)
2655                 room = DEVTREE_CHUNK_SIZE;
2656         prom_debug("starting device tree allocs at %lx\n", alloc_bottom);
2657
2658         /* Now try to claim that */
2659         mem_start = (unsigned long)alloc_up(room, PAGE_SIZE);
2660         if (mem_start == 0)
2661                 prom_panic("Can't allocate initial device-tree chunk\n");
2662         mem_end = mem_start + room;
2663
2664         /* Get root of tree */
2665         root = call_prom("peer", 1, 1, (phandle)0);
2666         if (root == (phandle)0)
2667                 prom_panic ("couldn't get device tree root\n");
2668
2669         /* Build header and make room for mem rsv map */ 
2670         mem_start = _ALIGN(mem_start, 4);
2671         hdr = make_room(&mem_start, &mem_end,
2672                         sizeof(struct boot_param_header), 4);
2673         dt_header_start = (unsigned long)hdr;
2674         rsvmap = make_room(&mem_start, &mem_end, sizeof(mem_reserve_map), 8);
2675
2676         /* Start of strings */
2677         mem_start = PAGE_ALIGN(mem_start);
2678         dt_string_start = mem_start;
2679         mem_start += 4; /* hole */
2680
2681         /* Add "phandle" in there, we'll need it */
2682         namep = make_room(&mem_start, &mem_end, 16, 1);
2683         prom_strcpy(namep, "phandle");
2684         mem_start = (unsigned long)namep + prom_strlen(namep) + 1;
2685
2686         /* Build string array */
2687         prom_printf("Building dt strings...\n"); 
2688         scan_dt_build_strings(root, &mem_start, &mem_end);
2689         dt_string_end = mem_start;
2690
2691         /* Build structure */
2692         mem_start = PAGE_ALIGN(mem_start);
2693         dt_struct_start = mem_start;
2694         prom_printf("Building dt structure...\n"); 
2695         scan_dt_build_struct(root, &mem_start, &mem_end);
2696         dt_push_token(OF_DT_END, &mem_start, &mem_end);
2697         dt_struct_end = PAGE_ALIGN(mem_start);
2698
2699         /* Finish header */
2700         hdr->boot_cpuid_phys = cpu_to_be32(prom.cpu);
2701         hdr->magic = cpu_to_be32(OF_DT_HEADER);
2702         hdr->totalsize = cpu_to_be32(dt_struct_end - dt_header_start);
2703         hdr->off_dt_struct = cpu_to_be32(dt_struct_start - dt_header_start);
2704         hdr->off_dt_strings = cpu_to_be32(dt_string_start - dt_header_start);
2705         hdr->dt_strings_size = cpu_to_be32(dt_string_end - dt_string_start);
2706         hdr->off_mem_rsvmap = cpu_to_be32(((unsigned long)rsvmap) - dt_header_start);
2707         hdr->version = cpu_to_be32(OF_DT_VERSION);
2708         /* Version 16 is not backward compatible */
2709         hdr->last_comp_version = cpu_to_be32(0x10);
2710
2711         /* Copy the reserve map in */
2712         memcpy(rsvmap, mem_reserve_map, sizeof(mem_reserve_map));
2713
2714 #ifdef DEBUG_PROM
2715         {
2716                 int i;
2717                 prom_printf("reserved memory map:\n");
2718                 for (i = 0; i < mem_reserve_cnt; i++)
2719                         prom_printf("  %llx - %llx\n",
2720                                     be64_to_cpu(mem_reserve_map[i].base),
2721                                     be64_to_cpu(mem_reserve_map[i].size));
2722         }
2723 #endif
2724         /* Bump mem_reserve_cnt to cause further reservations to fail
2725          * since it's too late.
2726          */
2727         mem_reserve_cnt = MEM_RESERVE_MAP_SIZE;
2728
2729         prom_printf("Device tree strings 0x%lx -> 0x%lx\n",
2730                     dt_string_start, dt_string_end);
2731         prom_printf("Device tree struct  0x%lx -> 0x%lx\n",
2732                     dt_struct_start, dt_struct_end);
2733 }
2734
2735 #ifdef CONFIG_PPC_MAPLE
2736 /* PIBS Version 1.05.0000 04/26/2005 has an incorrect /ht/isa/ranges property.
2737  * The values are bad, and it doesn't even have the right number of cells. */
2738 static void __init fixup_device_tree_maple(void)
2739 {
2740         phandle isa;
2741         u32 rloc = 0x01002000; /* IO space; PCI device = 4 */
2742         u32 isa_ranges[6];
2743         char *name;
2744
2745         name = "/ht@0/isa@4";
2746         isa = call_prom("finddevice", 1, 1, ADDR(name));
2747         if (!PHANDLE_VALID(isa)) {
2748                 name = "/ht@0/isa@6";
2749                 isa = call_prom("finddevice", 1, 1, ADDR(name));
2750                 rloc = 0x01003000; /* IO space; PCI device = 6 */
2751         }
2752         if (!PHANDLE_VALID(isa))
2753                 return;
2754
2755         if (prom_getproplen(isa, "ranges") != 12)
2756                 return;
2757         if (prom_getprop(isa, "ranges", isa_ranges, sizeof(isa_ranges))
2758                 == PROM_ERROR)
2759                 return;
2760
2761         if (isa_ranges[0] != 0x1 ||
2762                 isa_ranges[1] != 0xf4000000 ||
2763                 isa_ranges[2] != 0x00010000)
2764                 return;
2765
2766         prom_printf("Fixing up bogus ISA range on Maple/Apache...\n");
2767
2768         isa_ranges[0] = 0x1;
2769         isa_ranges[1] = 0x0;
2770         isa_ranges[2] = rloc;
2771         isa_ranges[3] = 0x0;
2772         isa_ranges[4] = 0x0;
2773         isa_ranges[5] = 0x00010000;
2774         prom_setprop(isa, name, "ranges",
2775                         isa_ranges, sizeof(isa_ranges));
2776 }
2777
2778 #define CPC925_MC_START         0xf8000000
2779 #define CPC925_MC_LENGTH        0x1000000
2780 /* The values for memory-controller don't have right number of cells */
2781 static void __init fixup_device_tree_maple_memory_controller(void)
2782 {
2783         phandle mc;
2784         u32 mc_reg[4];
2785         char *name = "/hostbridge@f8000000";
2786         u32 ac, sc;
2787
2788         mc = call_prom("finddevice", 1, 1, ADDR(name));
2789         if (!PHANDLE_VALID(mc))
2790                 return;
2791
2792         if (prom_getproplen(mc, "reg") != 8)
2793                 return;
2794
2795         prom_getprop(prom.root, "#address-cells", &ac, sizeof(ac));
2796         prom_getprop(prom.root, "#size-cells", &sc, sizeof(sc));
2797         if ((ac != 2) || (sc != 2))
2798                 return;
2799
2800         if (prom_getprop(mc, "reg", mc_reg, sizeof(mc_reg)) == PROM_ERROR)
2801                 return;
2802
2803         if (mc_reg[0] != CPC925_MC_START || mc_reg[1] != CPC925_MC_LENGTH)
2804                 return;
2805
2806         prom_printf("Fixing up bogus hostbridge on Maple...\n");
2807
2808         mc_reg[0] = 0x0;
2809         mc_reg[1] = CPC925_MC_START;
2810         mc_reg[2] = 0x0;
2811         mc_reg[3] = CPC925_MC_LENGTH;
2812         prom_setprop(mc, name, "reg", mc_reg, sizeof(mc_reg));
2813 }
2814 #else
2815 #define fixup_device_tree_maple()
2816 #define fixup_device_tree_maple_memory_controller()
2817 #endif
2818
2819 #ifdef CONFIG_PPC_CHRP
2820 /*
2821  * Pegasos and BriQ lacks the "ranges" property in the isa node
2822  * Pegasos needs decimal IRQ 14/15, not hexadecimal
2823  * Pegasos has the IDE configured in legacy mode, but advertised as native
2824  */
2825 static void __init fixup_device_tree_chrp(void)
2826 {
2827         phandle ph;
2828         u32 prop[6];
2829         u32 rloc = 0x01006000; /* IO space; PCI device = 12 */
2830         char *name;
2831         int rc;
2832
2833         name = "/pci@80000000/isa@c";
2834         ph = call_prom("finddevice", 1, 1, ADDR(name));
2835         if (!PHANDLE_VALID(ph)) {
2836                 name = "/pci@ff500000/isa@6";
2837                 ph = call_prom("finddevice", 1, 1, ADDR(name));
2838                 rloc = 0x01003000; /* IO space; PCI device = 6 */
2839         }
2840         if (PHANDLE_VALID(ph)) {
2841                 rc = prom_getproplen(ph, "ranges");
2842                 if (rc == 0 || rc == PROM_ERROR) {
2843                         prom_printf("Fixing up missing ISA range on Pegasos...\n");
2844
2845                         prop[0] = 0x1;
2846                         prop[1] = 0x0;
2847                         prop[2] = rloc;
2848                         prop[3] = 0x0;
2849                         prop[4] = 0x0;
2850                         prop[5] = 0x00010000;
2851                         prom_setprop(ph, name, "ranges", prop, sizeof(prop));
2852                 }
2853         }
2854
2855         name = "/pci@80000000/ide@C,1";
2856         ph = call_prom("finddevice", 1, 1, ADDR(name));
2857         if (PHANDLE_VALID(ph)) {
2858                 prom_printf("Fixing up IDE interrupt on Pegasos...\n");
2859                 prop[0] = 14;
2860                 prop[1] = 0x0;
2861                 prom_setprop(ph, name, "interrupts", prop, 2*sizeof(u32));
2862                 prom_printf("Fixing up IDE class-code on Pegasos...\n");
2863                 rc = prom_getprop(ph, "class-code", prop, sizeof(u32));
2864                 if (rc == sizeof(u32)) {
2865                         prop[0] &= ~0x5;
2866                         prom_setprop(ph, name, "class-code", prop, sizeof(u32));
2867                 }
2868         }
2869 }
2870 #else
2871 #define fixup_device_tree_chrp()
2872 #endif
2873
2874 #if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC)
2875 static void __init fixup_device_tree_pmac(void)
2876 {
2877         phandle u3, i2c, mpic;
2878         u32 u3_rev;
2879         u32 interrupts[2];
2880         u32 parent;
2881
2882         /* Some G5s have a missing interrupt definition, fix it up here */
2883         u3 = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000"));
2884         if (!PHANDLE_VALID(u3))
2885                 return;
2886         i2c = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/i2c@f8001000"));
2887         if (!PHANDLE_VALID(i2c))
2888                 return;
2889         mpic = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/mpic@f8040000"));
2890         if (!PHANDLE_VALID(mpic))
2891                 return;
2892
2893         /* check if proper rev of u3 */
2894         if (prom_getprop(u3, "device-rev", &u3_rev, sizeof(u3_rev))
2895             == PROM_ERROR)
2896                 return;
2897         if (u3_rev < 0x35 || u3_rev > 0x39)
2898                 return;
2899         /* does it need fixup ? */
2900         if (prom_getproplen(i2c, "interrupts") > 0)
2901                 return;
2902
2903         prom_printf("fixing up bogus interrupts for u3 i2c...\n");
2904
2905         /* interrupt on this revision of u3 is number 0 and level */
2906         interrupts[0] = 0;
2907         interrupts[1] = 1;
2908         prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupts",
2909                      &interrupts, sizeof(interrupts));
2910         parent = (u32)mpic;
2911         prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupt-parent",
2912                      &parent, sizeof(parent));
2913 }
2914 #else
2915 #define fixup_device_tree_pmac()
2916 #endif
2917
2918 #ifdef CONFIG_PPC_EFIKA
2919 /*
2920  * The MPC5200 FEC driver requires an phy-handle property to tell it how
2921  * to talk to the phy.  If the phy-handle property is missing, then this
2922  * function is called to add the appropriate nodes and link it to the
2923  * ethernet node.
2924  */
2925 static void __init fixup_device_tree_efika_add_phy(void)
2926 {
2927         u32 node;
2928         char prop[64];
2929         int rv;
2930
2931         /* Check if /builtin/ethernet exists - bail if it doesn't */
2932         node = call_prom("finddevice", 1, 1, ADDR("/builtin/ethernet"));
2933         if (!PHANDLE_VALID(node))
2934                 return;
2935
2936         /* Check if the phy-handle property exists - bail if it does */
2937         rv = prom_getprop(node, "phy-handle", prop, sizeof(prop));
2938         if (!rv)
2939                 return;
2940
2941         /*
2942          * At this point the ethernet device doesn't have a phy described.
2943          * Now we need to add the missing phy node and linkage
2944          */
2945
2946         /* Check for an MDIO bus node - if missing then create one */
2947         node = call_prom("finddevice", 1, 1, ADDR("/builtin/mdio"));
2948         if (!PHANDLE_VALID(node)) {
2949                 prom_printf("Adding Ethernet MDIO node\n");
2950                 call_prom("interpret", 1, 1,
2951                         " s\" /builtin\" find-device"
2952                         " new-device"
2953                                 " 1 encode-int s\" #address-cells\" property"
2954                                 " 0 encode-int s\" #size-cells\" property"
2955                                 " s\" mdio\" device-name"
2956                                 " s\" fsl,mpc5200b-mdio\" encode-string"
2957                                 " s\" compatible\" property"
2958                                 " 0xf0003000 0x400 reg"
2959                                 " 0x2 encode-int"
2960                                 " 0x5 encode-int encode+"
2961                                 " 0x3 encode-int encode+"
2962                                 " s\" interrupts\" property"
2963                         " finish-device");
2964         };
2965
2966         /* Check for a PHY device node - if missing then create one and
2967          * give it's phandle to the ethernet node */
2968         node = call_prom("finddevice", 1, 1,
2969                          ADDR("/builtin/mdio/ethernet-phy"));
2970         if (!PHANDLE_VALID(node)) {
2971                 prom_printf("Adding Ethernet PHY node\n");
2972                 call_prom("interpret", 1, 1,
2973                         " s\" /builtin/mdio\" find-device"
2974                         " new-device"
2975                                 " s\" ethernet-phy\" device-name"
2976                                 " 0x10 encode-int s\" reg\" property"
2977                                 " my-self"
2978                                 " ihandle>phandle"
2979                         " finish-device"
2980                         " s\" /builtin/ethernet\" find-device"
2981                                 " encode-int"
2982                                 " s\" phy-handle\" property"
2983                         " device-end");
2984         }
2985 }
2986
2987 static void __init fixup_device_tree_efika(void)
2988 {
2989         int sound_irq[3] = { 2, 2, 0 };
2990         int bcomm_irq[3*16] = { 3,0,0, 3,1,0, 3,2,0, 3,3,0,
2991                                 3,4,0, 3,5,0, 3,6,0, 3,7,0,
2992                                 3,8,0, 3,9,0, 3,10,0, 3,11,0,
2993                                 3,12,0, 3,13,0, 3,14,0, 3,15,0 };
2994         u32 node;
2995         char prop[64];
2996         int rv, len;
2997
2998         /* Check if we're really running on a EFIKA */
2999         node = call_prom("finddevice", 1, 1, ADDR("/"));
3000         if (!PHANDLE_VALID(node))
3001                 return;
3002
3003         rv = prom_getprop(node, "model", prop, sizeof(prop));
3004         if (rv == PROM_ERROR)
3005                 return;
3006         if (prom_strcmp(prop, "EFIKA5K2"))
3007                 return;
3008
3009         prom_printf("Applying EFIKA device tree fixups\n");
3010
3011         /* Claiming to be 'chrp' is death */
3012         node = call_prom("finddevice", 1, 1, ADDR("/"));
3013         rv = prom_getprop(node, "device_type", prop, sizeof(prop));
3014         if (rv != PROM_ERROR && (prom_strcmp(prop, "chrp") == 0))
3015                 prom_setprop(node, "/", "device_type", "efika", sizeof("efika"));
3016
3017         /* CODEGEN,description is exposed in /proc/cpuinfo so
3018            fix that too */
3019         rv = prom_getprop(node, "CODEGEN,description", prop, sizeof(prop));
3020         if (rv != PROM_ERROR && (prom_strstr(prop, "CHRP")))
3021                 prom_setprop(node, "/", "CODEGEN,description",
3022                              "Efika 5200B PowerPC System",
3023                              sizeof("Efika 5200B PowerPC System"));
3024
3025         /* Fixup bestcomm interrupts property */
3026         node = call_prom("finddevice", 1, 1, ADDR("/builtin/bestcomm"));
3027         if (PHANDLE_VALID(node)) {
3028                 len = prom_getproplen(node, "interrupts");
3029                 if (len == 12) {
3030                         prom_printf("Fixing bestcomm interrupts property\n");
3031                         prom_setprop(node, "/builtin/bestcom", "interrupts",
3032                                      bcomm_irq, sizeof(bcomm_irq));
3033                 }
3034         }
3035
3036         /* Fixup sound interrupts property */
3037         node = call_prom("finddevice", 1, 1, ADDR("/builtin/sound"));
3038         if (PHANDLE_VALID(node)) {
3039                 rv = prom_getprop(node, "interrupts", prop, sizeof(prop));
3040                 if (rv == PROM_ERROR) {
3041                         prom_printf("Adding sound interrupts property\n");
3042                         prom_setprop(node, "/builtin/sound", "interrupts",
3043                                      sound_irq, sizeof(sound_irq));
3044                 }
3045         }
3046
3047         /* Make sure ethernet phy-handle property exists */
3048         fixup_device_tree_efika_add_phy();
3049 }
3050 #else
3051 #define fixup_device_tree_efika()
3052 #endif
3053
3054 #ifdef CONFIG_PPC_PASEMI_NEMO
3055 /*
3056  * CFE supplied on Nemo is broken in several ways, biggest
3057  * problem is that it reassigns ISA interrupts to unused mpic ints.
3058  * Add an interrupt-controller property for the io-bridge to use
3059  * and correct the ints so we can attach them to an irq_domain
3060  */
3061 static void __init fixup_device_tree_pasemi(void)
3062 {
3063         u32 interrupts[2], parent, rval, val = 0;
3064         char *name, *pci_name;
3065         phandle iob, node;
3066
3067         /* Find the root pci node */
3068         name = "/pxp@0,e0000000";
3069         iob = call_prom("finddevice", 1, 1, ADDR(name));
3070         if (!PHANDLE_VALID(iob))
3071                 return;
3072
3073         /* check if interrupt-controller node set yet */
3074         if (prom_getproplen(iob, "interrupt-controller") !=PROM_ERROR)
3075                 return;
3076
3077         prom_printf("adding interrupt-controller property for SB600...\n");
3078
3079         prom_setprop(iob, name, "interrupt-controller", &val, 0);
3080
3081         pci_name = "/pxp@0,e0000000/pci@11";
3082         node = call_prom("finddevice", 1, 1, ADDR(pci_name));
3083         parent = ADDR(iob);
3084
3085         for( ; prom_next_node(&node); ) {
3086                 /* scan each node for one with an interrupt */
3087                 if (!PHANDLE_VALID(node))
3088                         continue;
3089
3090                 rval = prom_getproplen(node, "interrupts");
3091                 if (rval == 0 || rval == PROM_ERROR)
3092                         continue;
3093
3094                 prom_getprop(node, "interrupts", &interrupts, sizeof(interrupts));
3095                 if ((interrupts[0] < 212) || (interrupts[0] > 222))
3096                         continue;
3097
3098                 /* found a node, update both interrupts and interrupt-parent */
3099                 if ((interrupts[0] >= 212) && (interrupts[0] <= 215))
3100                         interrupts[0] -= 203;
3101                 if ((interrupts[0] >= 216) && (interrupts[0] <= 220))
3102                         interrupts[0] -= 213;
3103                 if (interrupts[0] == 221)
3104                         interrupts[0] = 14;
3105                 if (interrupts[0] == 222)
3106                         interrupts[0] = 8;
3107
3108                 prom_setprop(node, pci_name, "interrupts", interrupts,
3109                                         sizeof(interrupts));
3110                 prom_setprop(node, pci_name, "interrupt-parent", &parent,
3111                                         sizeof(parent));
3112         }
3113
3114         /*
3115          * The io-bridge has device_type set to 'io-bridge' change it to 'isa'
3116          * so that generic isa-bridge code can add the SB600 and its on-board
3117          * peripherals.
3118          */
3119         name = "/pxp@0,e0000000/io-bridge@0";
3120         iob = call_prom("finddevice", 1, 1, ADDR(name));
3121         if (!PHANDLE_VALID(iob))
3122                 return;
3123
3124         /* device_type is already set, just change it. */
3125
3126         prom_printf("Changing device_type of SB600 node...\n");
3127
3128         prom_setprop(iob, name, "device_type", "isa", sizeof("isa"));
3129 }
3130 #else   /* !CONFIG_PPC_PASEMI_NEMO */
3131 static inline void fixup_device_tree_pasemi(void) { }
3132 #endif
3133
3134 static void __init fixup_device_tree(void)
3135 {
3136         fixup_device_tree_maple();
3137         fixup_device_tree_maple_memory_controller();
3138         fixup_device_tree_chrp();
3139         fixup_device_tree_pmac();
3140         fixup_device_tree_efika();
3141         fixup_device_tree_pasemi();
3142 }
3143
3144 static void __init prom_find_boot_cpu(void)
3145 {
3146         __be32 rval;
3147         ihandle prom_cpu;
3148         phandle cpu_pkg;
3149
3150         rval = 0;
3151         if (prom_getprop(prom.chosen, "cpu", &rval, sizeof(rval)) <= 0)
3152                 return;
3153         prom_cpu = be32_to_cpu(rval);
3154
3155         cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu);
3156
3157         if (!PHANDLE_VALID(cpu_pkg))
3158                 return;
3159
3160         prom_getprop(cpu_pkg, "reg", &rval, sizeof(rval));
3161         prom.cpu = be32_to_cpu(rval);
3162
3163         prom_debug("Booting CPU hw index = %d\n", prom.cpu);
3164 }
3165
3166 static void __init prom_check_initrd(unsigned long r3, unsigned long r4)
3167 {
3168 #ifdef CONFIG_BLK_DEV_INITRD
3169         if (r3 && r4 && r4 != 0xdeadbeef) {
3170                 __be64 val;
3171
3172                 prom_initrd_start = is_kernel_addr(r3) ? __pa(r3) : r3;
3173                 prom_initrd_end = prom_initrd_start + r4;
3174
3175                 val = cpu_to_be64(prom_initrd_start);
3176                 prom_setprop(prom.chosen, "/chosen", "linux,initrd-start",
3177                              &val, sizeof(val));
3178                 val = cpu_to_be64(prom_initrd_end);
3179                 prom_setprop(prom.chosen, "/chosen", "linux,initrd-end",
3180                              &val, sizeof(val));
3181
3182                 reserve_mem(prom_initrd_start,
3183                             prom_initrd_end - prom_initrd_start);
3184
3185                 prom_debug("initrd_start=0x%lx\n", prom_initrd_start);
3186                 prom_debug("initrd_end=0x%lx\n", prom_initrd_end);
3187         }
3188 #endif /* CONFIG_BLK_DEV_INITRD */
3189 }
3190
3191 #ifdef CONFIG_PPC64
3192 #ifdef CONFIG_RELOCATABLE
3193 static void reloc_toc(void)
3194 {
3195 }
3196
3197 static void unreloc_toc(void)
3198 {
3199 }
3200 #else
3201 static void __reloc_toc(unsigned long offset, unsigned long nr_entries)
3202 {
3203         unsigned long i;
3204         unsigned long *toc_entry;
3205
3206         /* Get the start of the TOC by using r2 directly. */
3207         asm volatile("addi %0,2,-0x8000" : "=b" (toc_entry));
3208
3209         for (i = 0; i < nr_entries; i++) {
3210                 *toc_entry = *toc_entry + offset;
3211                 toc_entry++;
3212         }
3213 }
3214
3215 static void reloc_toc(void)
3216 {
3217         unsigned long offset = reloc_offset();
3218         unsigned long nr_entries =
3219                 (__prom_init_toc_end - __prom_init_toc_start) / sizeof(long);
3220
3221         __reloc_toc(offset, nr_entries);
3222
3223         mb();
3224 }
3225
3226 static void unreloc_toc(void)
3227 {
3228         unsigned long offset = reloc_offset();
3229         unsigned long nr_entries =
3230                 (__prom_init_toc_end - __prom_init_toc_start) / sizeof(long);
3231
3232         mb();
3233
3234         __reloc_toc(-offset, nr_entries);
3235 }
3236 #endif
3237 #endif
3238
3239 #ifdef CONFIG_PPC_SVM
3240 /*
3241  * Perform the Enter Secure Mode ultracall.
3242  */
3243 static int enter_secure_mode(unsigned long kbase, unsigned long fdt)
3244 {
3245         register unsigned long r3 asm("r3") = UV_ESM;
3246         register unsigned long r4 asm("r4") = kbase;
3247         register unsigned long r5 asm("r5") = fdt;
3248
3249         asm volatile("sc 2" : "+r"(r3) : "r"(r4), "r"(r5));
3250
3251         return r3;
3252 }
3253
3254 /*
3255  * Call the Ultravisor to transfer us to secure memory if we have an ESM blob.
3256  */
3257 static void setup_secure_guest(unsigned long kbase, unsigned long fdt)
3258 {
3259         int ret;
3260
3261         if (!prom_svm_enable)
3262                 return;
3263
3264         /* Switch to secure mode. */
3265         prom_printf("Switching to secure mode.\n");
3266
3267         /*
3268          * The ultravisor will do an integrity check of the kernel image but we
3269          * relocated it so the check will fail. Restore the original image by
3270          * relocating it back to the kernel virtual base address.
3271          */
3272         if (IS_ENABLED(CONFIG_RELOCATABLE))
3273                 relocate(KERNELBASE);
3274
3275         ret = enter_secure_mode(kbase, fdt);
3276
3277         /* Relocate the kernel again. */
3278         if (IS_ENABLED(CONFIG_RELOCATABLE))
3279                 relocate(kbase);
3280
3281         if (ret != U_SUCCESS) {
3282                 prom_printf("Returned %d from switching to secure mode.\n", ret);
3283                 prom_rtas_os_term("Switch to secure mode failed.\n");
3284         }
3285 }
3286 #else
3287 static void setup_secure_guest(unsigned long kbase, unsigned long fdt)
3288 {
3289 }
3290 #endif /* CONFIG_PPC_SVM */
3291
3292 /*
3293  * We enter here early on, when the Open Firmware prom is still
3294  * handling exceptions and the MMU hash table for us.
3295  */
3296
3297 unsigned long __init prom_init(unsigned long r3, unsigned long r4,
3298                                unsigned long pp,
3299                                unsigned long r6, unsigned long r7,
3300                                unsigned long kbase)
3301 {       
3302         unsigned long hdr;
3303
3304 #ifdef CONFIG_PPC32
3305         unsigned long offset = reloc_offset();
3306         reloc_got2(offset);
3307 #else
3308         reloc_toc();
3309 #endif
3310
3311         /*
3312          * First zero the BSS
3313          */
3314         memset(&__bss_start, 0, __bss_stop - __bss_start);
3315
3316         /*
3317          * Init interface to Open Firmware, get some node references,
3318          * like /chosen
3319          */
3320         prom_init_client_services(pp);
3321
3322         /*
3323          * See if this OF is old enough that we need to do explicit maps
3324          * and other workarounds
3325          */
3326         prom_find_mmu();
3327
3328         /*
3329          * Init prom stdout device
3330          */
3331         prom_init_stdout();
3332
3333         prom_printf("Preparing to boot %s", linux_banner);
3334
3335         /*
3336          * Get default machine type. At this point, we do not differentiate
3337          * between pSeries SMP and pSeries LPAR
3338          */
3339         of_platform = prom_find_machine_type();
3340         prom_printf("Detected machine type: %x\n", of_platform);
3341
3342 #ifndef CONFIG_NONSTATIC_KERNEL
3343         /* Bail if this is a kdump kernel. */
3344         if (PHYSICAL_START > 0)
3345                 prom_panic("Error: You can't boot a kdump kernel from OF!\n");
3346 #endif
3347
3348         /*
3349          * Check for an initrd
3350          */
3351         prom_check_initrd(r3, r4);
3352
3353         /*
3354          * Do early parsing of command line
3355          */
3356         early_cmdline_parse();
3357
3358 #ifdef CONFIG_PPC_PSERIES
3359         /*
3360          * On pSeries, inform the firmware about our capabilities
3361          */
3362         if (of_platform == PLATFORM_PSERIES ||
3363             of_platform == PLATFORM_PSERIES_LPAR)
3364                 prom_send_capabilities();
3365 #endif
3366
3367         /*
3368          * Copy the CPU hold code
3369          */
3370         if (of_platform != PLATFORM_POWERMAC)
3371                 copy_and_flush(0, kbase, 0x100, 0);
3372
3373         /*
3374          * Initialize memory management within prom_init
3375          */
3376         prom_init_mem();
3377
3378         /*
3379          * Determine which cpu is actually running right _now_
3380          */
3381         prom_find_boot_cpu();
3382
3383         /* 
3384          * Initialize display devices
3385          */
3386         prom_check_displays();
3387
3388 #if defined(CONFIG_PPC64) && defined(__BIG_ENDIAN__)
3389         /*
3390          * Initialize IOMMU (TCE tables) on pSeries. Do that before anything else
3391          * that uses the allocator, we need to make sure we get the top of memory
3392          * available for us here...
3393          */
3394         if (of_platform == PLATFORM_PSERIES)
3395                 prom_initialize_tce_table();
3396 #endif
3397
3398         /*
3399          * On non-powermacs, try to instantiate RTAS. PowerMacs don't
3400          * have a usable RTAS implementation.
3401          */
3402         if (of_platform != PLATFORM_POWERMAC)
3403                 prom_instantiate_rtas();
3404
3405 #ifdef CONFIG_PPC64
3406         /* instantiate sml */
3407         prom_instantiate_sml();
3408 #endif
3409
3410         /*
3411          * On non-powermacs, put all CPUs in spin-loops.
3412          *
3413          * PowerMacs use a different mechanism to spin CPUs
3414          *
3415          * (This must be done after instanciating RTAS)
3416          */
3417         if (of_platform != PLATFORM_POWERMAC)
3418                 prom_hold_cpus();
3419
3420         /*
3421          * Fill in some infos for use by the kernel later on
3422          */
3423         if (prom_memory_limit) {
3424                 __be64 val = cpu_to_be64(prom_memory_limit);
3425                 prom_setprop(prom.chosen, "/chosen", "linux,memory-limit",
3426                              &val, sizeof(val));
3427         }
3428 #ifdef CONFIG_PPC64
3429         if (prom_iommu_off)
3430                 prom_setprop(prom.chosen, "/chosen", "linux,iommu-off",
3431                              NULL, 0);
3432
3433         if (prom_iommu_force_on)
3434                 prom_setprop(prom.chosen, "/chosen", "linux,iommu-force-on",
3435                              NULL, 0);
3436
3437         if (prom_tce_alloc_start) {
3438                 prom_setprop(prom.chosen, "/chosen", "linux,tce-alloc-start",
3439                              &prom_tce_alloc_start,
3440                              sizeof(prom_tce_alloc_start));
3441                 prom_setprop(prom.chosen, "/chosen", "linux,tce-alloc-end",
3442                              &prom_tce_alloc_end,
3443                              sizeof(prom_tce_alloc_end));
3444         }
3445 #endif
3446
3447         /*
3448          * Fixup any known bugs in the device-tree
3449          */
3450         fixup_device_tree();
3451
3452         /*
3453          * Now finally create the flattened device-tree
3454          */
3455         prom_printf("copying OF device tree...\n");
3456         flatten_device_tree();
3457
3458         /*
3459          * in case stdin is USB and still active on IBM machines...
3460          * Unfortunately quiesce crashes on some powermacs if we have
3461          * closed stdin already (in particular the powerbook 101).
3462          */
3463         if (of_platform != PLATFORM_POWERMAC)
3464                 prom_close_stdin();
3465
3466         /*
3467          * Call OF "quiesce" method to shut down pending DMA's from
3468          * devices etc...
3469          */
3470         prom_printf("Quiescing Open Firmware ...\n");
3471         call_prom("quiesce", 0, 0);
3472
3473         /*
3474          * And finally, call the kernel passing it the flattened device
3475          * tree and NULL as r5, thus triggering the new entry point which
3476          * is common to us and kexec
3477          */
3478         hdr = dt_header_start;
3479
3480         prom_printf("Booting Linux via __start() @ 0x%lx ...\n", kbase);
3481         prom_debug("->dt_header_start=0x%lx\n", hdr);
3482
3483 #ifdef CONFIG_PPC32
3484         reloc_got2(-offset);
3485 #else
3486         unreloc_toc();
3487 #endif
3488
3489         /* Move to secure memory if we're supposed to be secure guests. */
3490         setup_secure_guest(kbase, hdr);
3491
3492         __start(hdr, kbase, 0, 0, 0, 0, 0);
3493
3494         return 0;
3495 }