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