Merge branch 'merge'
[linux-2.6] / arch / powerpc / kernel / prom_init.c
1 /*
2  * Procedures for interfacing to Open Firmware.
3  *
4  * Paul Mackerras       August 1996.
5  * Copyright (C) 1996-2005 Paul Mackerras.
6  * 
7  *  Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner.
8  *    {engebret|bergner}@us.ibm.com 
9  *
10  *      This program is free software; you can redistribute it and/or
11  *      modify it under the terms of the GNU General Public License
12  *      as published by the Free Software Foundation; either version
13  *      2 of the License, or (at your option) any later version.
14  */
15
16 #undef DEBUG_PROM
17
18 #include <stdarg.h>
19 #include <linux/config.h>
20 #include <linux/kernel.h>
21 #include <linux/string.h>
22 #include <linux/init.h>
23 #include <linux/threads.h>
24 #include <linux/spinlock.h>
25 #include <linux/types.h>
26 #include <linux/pci.h>
27 #include <linux/proc_fs.h>
28 #include <linux/stringify.h>
29 #include <linux/delay.h>
30 #include <linux/initrd.h>
31 #include <linux/bitops.h>
32 #include <asm/prom.h>
33 #include <asm/rtas.h>
34 #include <asm/page.h>
35 #include <asm/processor.h>
36 #include <asm/irq.h>
37 #include <asm/io.h>
38 #include <asm/smp.h>
39 #include <asm/system.h>
40 #include <asm/mmu.h>
41 #include <asm/pgtable.h>
42 #include <asm/pci.h>
43 #include <asm/iommu.h>
44 #include <asm/btext.h>
45 #include <asm/sections.h>
46 #include <asm/machdep.h>
47
48 #ifdef CONFIG_LOGO_LINUX_CLUT224
49 #include <linux/linux_logo.h>
50 extern const struct linux_logo logo_linux_clut224;
51 #endif
52
53 /*
54  * Properties whose value is longer than this get excluded from our
55  * copy of the device tree. This value does need to be big enough to
56  * ensure that we don't lose things like the interrupt-map property
57  * on a PCI-PCI bridge.
58  */
59 #define MAX_PROPERTY_LENGTH     (1UL * 1024 * 1024)
60
61 /*
62  * Eventually bump that one up
63  */
64 #define DEVTREE_CHUNK_SIZE      0x100000
65
66 /*
67  * This is the size of the local memory reserve map that gets copied
68  * into the boot params passed to the kernel. That size is totally
69  * flexible as the kernel just reads the list until it encounters an
70  * entry with size 0, so it can be changed without breaking binary
71  * compatibility
72  */
73 #define MEM_RESERVE_MAP_SIZE    8
74
75 /*
76  * prom_init() is called very early on, before the kernel text
77  * and data have been mapped to KERNELBASE.  At this point the code
78  * is running at whatever address it has been loaded at.
79  * On ppc32 we compile with -mrelocatable, which means that references
80  * to extern and static variables get relocated automatically.
81  * On ppc64 we have to relocate the references explicitly with
82  * RELOC.  (Note that strings count as static variables.)
83  *
84  * Because OF may have mapped I/O devices into the area starting at
85  * KERNELBASE, particularly on CHRP machines, we can't safely call
86  * OF once the kernel has been mapped to KERNELBASE.  Therefore all
87  * OF calls must be done within prom_init().
88  *
89  * ADDR is used in calls to call_prom.  The 4th and following
90  * arguments to call_prom should be 32-bit values.
91  * On ppc64, 64 bit values are truncated to 32 bits (and
92  * fortunately don't get interpreted as two arguments).
93  */
94 #ifdef CONFIG_PPC64
95 #define RELOC(x)        (*PTRRELOC(&(x)))
96 #define ADDR(x)         (u32) add_reloc_offset((unsigned long)(x))
97 #define OF_WORKAROUNDS  0
98 #else
99 #define RELOC(x)        (x)
100 #define ADDR(x)         (u32) (x)
101 #define OF_WORKAROUNDS  of_workarounds
102 int of_workarounds;
103 #endif
104
105 #define OF_WA_CLAIM     1       /* do phys/virt claim separately, then map */
106 #define OF_WA_LONGTRAIL 2       /* work around longtrail bugs */
107
108 #define PROM_BUG() do {                                         \
109         prom_printf("kernel BUG at %s line 0x%x!\n",            \
110                     RELOC(__FILE__), __LINE__);                 \
111         __asm__ __volatile__(".long " BUG_ILLEGAL_INSTR);       \
112 } while (0)
113
114 #ifdef DEBUG_PROM
115 #define prom_debug(x...)        prom_printf(x)
116 #else
117 #define prom_debug(x...)
118 #endif
119
120
121 typedef u32 prom_arg_t;
122
123 struct prom_args {
124         u32 service;
125         u32 nargs;
126         u32 nret;
127         prom_arg_t args[10];
128 };
129
130 struct prom_t {
131         ihandle root;
132         phandle chosen;
133         int cpu;
134         ihandle stdout;
135         ihandle mmumap;
136         ihandle memory;
137 };
138
139 struct mem_map_entry {
140         u64     base;
141         u64     size;
142 };
143
144 typedef u32 cell_t;
145
146 extern void __start(unsigned long r3, unsigned long r4, unsigned long r5);
147
148 #ifdef CONFIG_PPC64
149 extern int enter_prom(struct prom_args *args, unsigned long entry);
150 #else
151 static inline int enter_prom(struct prom_args *args, unsigned long entry)
152 {
153         return ((int (*)(struct prom_args *))entry)(args);
154 }
155 #endif
156
157 extern void copy_and_flush(unsigned long dest, unsigned long src,
158                            unsigned long size, unsigned long offset);
159
160 /* prom structure */
161 static struct prom_t __initdata prom;
162
163 static unsigned long prom_entry __initdata;
164
165 #define PROM_SCRATCH_SIZE 256
166
167 static char __initdata of_stdout_device[256];
168 static char __initdata prom_scratch[PROM_SCRATCH_SIZE];
169
170 static unsigned long __initdata dt_header_start;
171 static unsigned long __initdata dt_struct_start, dt_struct_end;
172 static unsigned long __initdata dt_string_start, dt_string_end;
173
174 static unsigned long __initdata prom_initrd_start, prom_initrd_end;
175
176 #ifdef CONFIG_PPC64
177 static int __initdata iommu_force_on;
178 static int __initdata ppc64_iommu_off;
179 static unsigned long __initdata prom_tce_alloc_start;
180 static unsigned long __initdata prom_tce_alloc_end;
181 #endif
182
183 /* Platforms codes are now obsolete in the kernel. Now only used within this
184  * file and ultimately gone too. Feel free to change them if you need, they
185  * are not shared with anything outside of this file anymore
186  */
187 #define PLATFORM_PSERIES        0x0100
188 #define PLATFORM_PSERIES_LPAR   0x0101
189 #define PLATFORM_LPAR           0x0001
190 #define PLATFORM_POWERMAC       0x0400
191 #define PLATFORM_GENERIC        0x0500
192
193 static int __initdata of_platform;
194
195 static char __initdata prom_cmd_line[COMMAND_LINE_SIZE];
196
197 static unsigned long __initdata alloc_top;
198 static unsigned long __initdata alloc_top_high;
199 static unsigned long __initdata alloc_bottom;
200 static unsigned long __initdata rmo_top;
201 static unsigned long __initdata ram_top;
202
203 static struct mem_map_entry __initdata mem_reserve_map[MEM_RESERVE_MAP_SIZE];
204 static int __initdata mem_reserve_cnt;
205
206 static cell_t __initdata regbuf[1024];
207
208
209 #define MAX_CPU_THREADS 2
210
211 /*
212  * Error results ... some OF calls will return "-1" on error, some
213  * will return 0, some will return either. To simplify, here are
214  * macros to use with any ihandle or phandle return value to check if
215  * it is valid
216  */
217
218 #define PROM_ERROR              (-1u)
219 #define PHANDLE_VALID(p)        ((p) != 0 && (p) != PROM_ERROR)
220 #define IHANDLE_VALID(i)        ((i) != 0 && (i) != PROM_ERROR)
221
222
223 /* This is the one and *ONLY* place where we actually call open
224  * firmware.
225  */
226
227 static int __init call_prom(const char *service, int nargs, int nret, ...)
228 {
229         int i;
230         struct prom_args args;
231         va_list list;
232
233         args.service = ADDR(service);
234         args.nargs = nargs;
235         args.nret = nret;
236
237         va_start(list, nret);
238         for (i = 0; i < nargs; i++)
239                 args.args[i] = va_arg(list, prom_arg_t);
240         va_end(list);
241
242         for (i = 0; i < nret; i++)
243                 args.args[nargs+i] = 0;
244
245         if (enter_prom(&args, RELOC(prom_entry)) < 0)
246                 return PROM_ERROR;
247
248         return (nret > 0) ? args.args[nargs] : 0;
249 }
250
251 static int __init call_prom_ret(const char *service, int nargs, int nret,
252                                 prom_arg_t *rets, ...)
253 {
254         int i;
255         struct prom_args args;
256         va_list list;
257
258         args.service = ADDR(service);
259         args.nargs = nargs;
260         args.nret = nret;
261
262         va_start(list, rets);
263         for (i = 0; i < nargs; i++)
264                 args.args[i] = va_arg(list, prom_arg_t);
265         va_end(list);
266
267         for (i = 0; i < nret; i++)
268                 args.args[nargs+i] = 0;
269
270         if (enter_prom(&args, RELOC(prom_entry)) < 0)
271                 return PROM_ERROR;
272
273         if (rets != NULL)
274                 for (i = 1; i < nret; ++i)
275                         rets[i-1] = args.args[nargs+i];
276
277         return (nret > 0) ? args.args[nargs] : 0;
278 }
279
280
281 static void __init prom_print(const char *msg)
282 {
283         const char *p, *q;
284         struct prom_t *_prom = &RELOC(prom);
285
286         if (_prom->stdout == 0)
287                 return;
288
289         for (p = msg; *p != 0; p = q) {
290                 for (q = p; *q != 0 && *q != '\n'; ++q)
291                         ;
292                 if (q > p)
293                         call_prom("write", 3, 1, _prom->stdout, p, q - p);
294                 if (*q == 0)
295                         break;
296                 ++q;
297                 call_prom("write", 3, 1, _prom->stdout, ADDR("\r\n"), 2);
298         }
299 }
300
301
302 static void __init prom_print_hex(unsigned long val)
303 {
304         int i, nibbles = sizeof(val)*2;
305         char buf[sizeof(val)*2+1];
306         struct prom_t *_prom = &RELOC(prom);
307
308         for (i = nibbles-1;  i >= 0;  i--) {
309                 buf[i] = (val & 0xf) + '0';
310                 if (buf[i] > '9')
311                         buf[i] += ('a'-'0'-10);
312                 val >>= 4;
313         }
314         buf[nibbles] = '\0';
315         call_prom("write", 3, 1, _prom->stdout, buf, nibbles);
316 }
317
318
319 static void __init prom_printf(const char *format, ...)
320 {
321         const char *p, *q, *s;
322         va_list args;
323         unsigned long v;
324         struct prom_t *_prom = &RELOC(prom);
325
326         va_start(args, format);
327 #ifdef CONFIG_PPC64
328         format = PTRRELOC(format);
329 #endif
330         for (p = format; *p != 0; p = q) {
331                 for (q = p; *q != 0 && *q != '\n' && *q != '%'; ++q)
332                         ;
333                 if (q > p)
334                         call_prom("write", 3, 1, _prom->stdout, p, q - p);
335                 if (*q == 0)
336                         break;
337                 if (*q == '\n') {
338                         ++q;
339                         call_prom("write", 3, 1, _prom->stdout,
340                                   ADDR("\r\n"), 2);
341                         continue;
342                 }
343                 ++q;
344                 if (*q == 0)
345                         break;
346                 switch (*q) {
347                 case 's':
348                         ++q;
349                         s = va_arg(args, const char *);
350                         prom_print(s);
351                         break;
352                 case 'x':
353                         ++q;
354                         v = va_arg(args, unsigned long);
355                         prom_print_hex(v);
356                         break;
357                 }
358         }
359 }
360
361
362 static unsigned int __init prom_claim(unsigned long virt, unsigned long size,
363                                 unsigned long align)
364 {
365         struct prom_t *_prom = &RELOC(prom);
366
367         if (align == 0 && (OF_WORKAROUNDS & OF_WA_CLAIM)) {
368                 /*
369                  * Old OF requires we claim physical and virtual separately
370                  * and then map explicitly (assuming virtual mode)
371                  */
372                 int ret;
373                 prom_arg_t result;
374
375                 ret = call_prom_ret("call-method", 5, 2, &result,
376                                     ADDR("claim"), _prom->memory,
377                                     align, size, virt);
378                 if (ret != 0 || result == -1)
379                         return -1;
380                 ret = call_prom_ret("call-method", 5, 2, &result,
381                                     ADDR("claim"), _prom->mmumap,
382                                     align, size, virt);
383                 if (ret != 0) {
384                         call_prom("call-method", 4, 1, ADDR("release"),
385                                   _prom->memory, size, virt);
386                         return -1;
387                 }
388                 /* the 0x12 is M (coherence) + PP == read/write */
389                 call_prom("call-method", 6, 1,
390                           ADDR("map"), _prom->mmumap, 0x12, size, virt, virt);
391                 return virt;
392         }
393         return call_prom("claim", 3, 1, (prom_arg_t)virt, (prom_arg_t)size,
394                          (prom_arg_t)align);
395 }
396
397 static void __init __attribute__((noreturn)) prom_panic(const char *reason)
398 {
399 #ifdef CONFIG_PPC64
400         reason = PTRRELOC(reason);
401 #endif
402         prom_print(reason);
403         /* Do not call exit because it clears the screen on pmac
404          * it also causes some sort of double-fault on early pmacs */
405         if (RELOC(of_platform) == PLATFORM_POWERMAC)
406                 asm("trap\n");
407
408         /* ToDo: should put up an SRC here on p/iSeries */
409         call_prom("exit", 0, 0);
410
411         for (;;)                        /* should never get here */
412                 ;
413 }
414
415
416 static int __init prom_next_node(phandle *nodep)
417 {
418         phandle node;
419
420         if ((node = *nodep) != 0
421             && (*nodep = call_prom("child", 1, 1, node)) != 0)
422                 return 1;
423         if ((*nodep = call_prom("peer", 1, 1, node)) != 0)
424                 return 1;
425         for (;;) {
426                 if ((node = call_prom("parent", 1, 1, node)) == 0)
427                         return 0;
428                 if ((*nodep = call_prom("peer", 1, 1, node)) != 0)
429                         return 1;
430         }
431 }
432
433 static int inline prom_getprop(phandle node, const char *pname,
434                                void *value, size_t valuelen)
435 {
436         return call_prom("getprop", 4, 1, node, ADDR(pname),
437                          (u32)(unsigned long) value, (u32) valuelen);
438 }
439
440 static int inline prom_getproplen(phandle node, const char *pname)
441 {
442         return call_prom("getproplen", 2, 1, node, ADDR(pname));
443 }
444
445 static void add_string(char **str, const char *q)
446 {
447         char *p = *str;
448
449         while (*q)
450                 *p++ = *q++;
451         *p++ = ' ';
452         *str = p;
453 }
454
455 static char *tohex(unsigned int x)
456 {
457         static char digits[] = "0123456789abcdef";
458         static char result[9];
459         int i;
460
461         result[8] = 0;
462         i = 8;
463         do {
464                 --i;
465                 result[i] = digits[x & 0xf];
466                 x >>= 4;
467         } while (x != 0 && i > 0);
468         return &result[i];
469 }
470
471 static int __init prom_setprop(phandle node, const char *nodename,
472                                const char *pname, void *value, size_t valuelen)
473 {
474         char cmd[256], *p;
475
476         if (!(OF_WORKAROUNDS & OF_WA_LONGTRAIL))
477                 return call_prom("setprop", 4, 1, node, ADDR(pname),
478                                  (u32)(unsigned long) value, (u32) valuelen);
479
480         /* gah... setprop doesn't work on longtrail, have to use interpret */
481         p = cmd;
482         add_string(&p, "dev");
483         add_string(&p, nodename);
484         add_string(&p, tohex((u32)(unsigned long) value));
485         add_string(&p, tohex(valuelen));
486         add_string(&p, tohex(ADDR(pname)));
487         add_string(&p, tohex(strlen(RELOC(pname))));
488         add_string(&p, "property");
489         *p = 0;
490         return call_prom("interpret", 1, 1, (u32)(unsigned long) cmd);
491 }
492
493 /* We can't use the standard versions because of RELOC headaches. */
494 #define isxdigit(c)     (('0' <= (c) && (c) <= '9') \
495                          || ('a' <= (c) && (c) <= 'f') \
496                          || ('A' <= (c) && (c) <= 'F'))
497
498 #define isdigit(c)      ('0' <= (c) && (c) <= '9')
499 #define islower(c)      ('a' <= (c) && (c) <= 'z')
500 #define toupper(c)      (islower(c) ? ((c) - 'a' + 'A') : (c))
501
502 unsigned long prom_strtoul(const char *cp, const char **endp)
503 {
504         unsigned long result = 0, base = 10, value;
505
506         if (*cp == '0') {
507                 base = 8;
508                 cp++;
509                 if (toupper(*cp) == 'X') {
510                         cp++;
511                         base = 16;
512                 }
513         }
514
515         while (isxdigit(*cp) &&
516                (value = isdigit(*cp) ? *cp - '0' : toupper(*cp) - 'A' + 10) < base) {
517                 result = result * base + value;
518                 cp++;
519         }
520
521         if (endp)
522                 *endp = cp;
523
524         return result;
525 }
526
527 unsigned long prom_memparse(const char *ptr, const char **retptr)
528 {
529         unsigned long ret = prom_strtoul(ptr, retptr);
530         int shift = 0;
531
532         /*
533          * We can't use a switch here because GCC *may* generate a
534          * jump table which won't work, because we're not running at
535          * the address we're linked at.
536          */
537         if ('G' == **retptr || 'g' == **retptr)
538                 shift = 30;
539
540         if ('M' == **retptr || 'm' == **retptr)
541                 shift = 20;
542
543         if ('K' == **retptr || 'k' == **retptr)
544                 shift = 10;
545
546         if (shift) {
547                 ret <<= shift;
548                 (*retptr)++;
549         }
550
551         return ret;
552 }
553
554 /*
555  * Early parsing of the command line passed to the kernel, used for
556  * "mem=x" and the options that affect the iommu
557  */
558 static void __init early_cmdline_parse(void)
559 {
560         struct prom_t *_prom = &RELOC(prom);
561         const char *opt;
562         char *p;
563         int l = 0;
564
565         RELOC(prom_cmd_line[0]) = 0;
566         p = RELOC(prom_cmd_line);
567         if ((long)_prom->chosen > 0)
568                 l = prom_getprop(_prom->chosen, "bootargs", p, COMMAND_LINE_SIZE-1);
569 #ifdef CONFIG_CMDLINE
570         if (l == 0) /* dbl check */
571                 strlcpy(RELOC(prom_cmd_line),
572                         RELOC(CONFIG_CMDLINE), sizeof(prom_cmd_line));
573 #endif /* CONFIG_CMDLINE */
574         prom_printf("command line: %s\n", RELOC(prom_cmd_line));
575
576 #ifdef CONFIG_PPC64
577         opt = strstr(RELOC(prom_cmd_line), RELOC("iommu="));
578         if (opt) {
579                 prom_printf("iommu opt is: %s\n", opt);
580                 opt += 6;
581                 while (*opt && *opt == ' ')
582                         opt++;
583                 if (!strncmp(opt, RELOC("off"), 3))
584                         RELOC(ppc64_iommu_off) = 1;
585                 else if (!strncmp(opt, RELOC("force"), 5))
586                         RELOC(iommu_force_on) = 1;
587         }
588 #endif
589 }
590
591 #ifdef CONFIG_PPC_PSERIES
592 /*
593  * There are two methods for telling firmware what our capabilities are.
594  * Newer machines have an "ibm,client-architecture-support" method on the
595  * root node.  For older machines, we have to call the "process-elf-header"
596  * method in the /packages/elf-loader node, passing it a fake 32-bit
597  * ELF header containing a couple of PT_NOTE sections that contain
598  * structures that contain various information.
599  */
600
601 /*
602  * New method - extensible architecture description vector.
603  *
604  * Because the description vector contains a mix of byte and word
605  * values, we declare it as an unsigned char array, and use this
606  * macro to put word values in.
607  */
608 #define W(x)    ((x) >> 24) & 0xff, ((x) >> 16) & 0xff, \
609                 ((x) >> 8) & 0xff, (x) & 0xff
610
611 /* Option vector bits - generic bits in byte 1 */
612 #define OV_IGNORE               0x80    /* ignore this vector */
613 #define OV_CESSATION_POLICY     0x40    /* halt if unsupported option present*/
614
615 /* Option vector 1: processor architectures supported */
616 #define OV1_PPC_2_00            0x80    /* set if we support PowerPC 2.00 */
617 #define OV1_PPC_2_01            0x40    /* set if we support PowerPC 2.01 */
618 #define OV1_PPC_2_02            0x20    /* set if we support PowerPC 2.02 */
619 #define OV1_PPC_2_03            0x10    /* set if we support PowerPC 2.03 */
620 #define OV1_PPC_2_04            0x08    /* set if we support PowerPC 2.04 */
621 #define OV1_PPC_2_05            0x04    /* set if we support PowerPC 2.05 */
622
623 /* Option vector 2: Open Firmware options supported */
624 #define OV2_REAL_MODE           0x20    /* set if we want OF in real mode */
625
626 /* Option vector 3: processor options supported */
627 #define OV3_FP                  0x80    /* floating point */
628 #define OV3_VMX                 0x40    /* VMX/Altivec */
629
630 /* Option vector 5: PAPR/OF options supported */
631 #define OV5_LPAR                0x80    /* logical partitioning supported */
632 #define OV5_SPLPAR              0x40    /* shared-processor LPAR supported */
633 /* ibm,dynamic-reconfiguration-memory property supported */
634 #define OV5_DRCONF_MEMORY       0x20
635 #define OV5_LARGE_PAGES         0x10    /* large pages supported */
636
637 /*
638  * The architecture vector has an array of PVR mask/value pairs,
639  * followed by # option vectors - 1, followed by the option vectors.
640  */
641 static unsigned char ibm_architecture_vec[] = {
642         W(0xfffe0000), W(0x003a0000),   /* POWER5/POWER5+ */
643         W(0xffff0000), W(0x003e0000),   /* POWER6 */
644         W(0xfffffffe), W(0x0f000001),   /* all 2.04-compliant and earlier */
645         5 - 1,                          /* 5 option vectors */
646
647         /* option vector 1: processor architectures supported */
648         3 - 1,                          /* length */
649         0,                              /* don't ignore, don't halt */
650         OV1_PPC_2_00 | OV1_PPC_2_01 | OV1_PPC_2_02 | OV1_PPC_2_03 |
651         OV1_PPC_2_04 | OV1_PPC_2_05,
652
653         /* option vector 2: Open Firmware options supported */
654         34 - 1,                         /* length */
655         OV2_REAL_MODE,
656         0, 0,
657         W(0xffffffff),                  /* real_base */
658         W(0xffffffff),                  /* real_size */
659         W(0xffffffff),                  /* virt_base */
660         W(0xffffffff),                  /* virt_size */
661         W(0xffffffff),                  /* load_base */
662         W(64),                          /* 128MB min RMA */
663         W(0xffffffff),                  /* full client load */
664         0,                              /* min RMA percentage of total RAM */
665         48,                             /* max log_2(hash table size) */
666
667         /* option vector 3: processor options supported */
668         3 - 1,                          /* length */
669         0,                              /* don't ignore, don't halt */
670         OV3_FP | OV3_VMX,
671
672         /* option vector 4: IBM PAPR implementation */
673         2 - 1,                          /* length */
674         0,                              /* don't halt */
675
676         /* option vector 5: PAPR/OF options */
677         3 - 1,                          /* length */
678         0,                              /* don't ignore, don't halt */
679         OV5_LPAR | OV5_SPLPAR | OV5_LARGE_PAGES,
680 };
681
682 /* Old method - ELF header with PT_NOTE sections */
683 static struct fake_elf {
684         Elf32_Ehdr      elfhdr;
685         Elf32_Phdr      phdr[2];
686         struct chrpnote {
687                 u32     namesz;
688                 u32     descsz;
689                 u32     type;
690                 char    name[8];        /* "PowerPC" */
691                 struct chrpdesc {
692                         u32     real_mode;
693                         u32     real_base;
694                         u32     real_size;
695                         u32     virt_base;
696                         u32     virt_size;
697                         u32     load_base;
698                 } chrpdesc;
699         } chrpnote;
700         struct rpanote {
701                 u32     namesz;
702                 u32     descsz;
703                 u32     type;
704                 char    name[24];       /* "IBM,RPA-Client-Config" */
705                 struct rpadesc {
706                         u32     lpar_affinity;
707                         u32     min_rmo_size;
708                         u32     min_rmo_percent;
709                         u32     max_pft_size;
710                         u32     splpar;
711                         u32     min_load;
712                         u32     new_mem_def;
713                         u32     ignore_me;
714                 } rpadesc;
715         } rpanote;
716 } fake_elf = {
717         .elfhdr = {
718                 .e_ident = { 0x7f, 'E', 'L', 'F',
719                              ELFCLASS32, ELFDATA2MSB, EV_CURRENT },
720                 .e_type = ET_EXEC,      /* yeah right */
721                 .e_machine = EM_PPC,
722                 .e_version = EV_CURRENT,
723                 .e_phoff = offsetof(struct fake_elf, phdr),
724                 .e_phentsize = sizeof(Elf32_Phdr),
725                 .e_phnum = 2
726         },
727         .phdr = {
728                 [0] = {
729                         .p_type = PT_NOTE,
730                         .p_offset = offsetof(struct fake_elf, chrpnote),
731                         .p_filesz = sizeof(struct chrpnote)
732                 }, [1] = {
733                         .p_type = PT_NOTE,
734                         .p_offset = offsetof(struct fake_elf, rpanote),
735                         .p_filesz = sizeof(struct rpanote)
736                 }
737         },
738         .chrpnote = {
739                 .namesz = sizeof("PowerPC"),
740                 .descsz = sizeof(struct chrpdesc),
741                 .type = 0x1275,
742                 .name = "PowerPC",
743                 .chrpdesc = {
744                         .real_mode = ~0U,       /* ~0 means "don't care" */
745                         .real_base = ~0U,
746                         .real_size = ~0U,
747                         .virt_base = ~0U,
748                         .virt_size = ~0U,
749                         .load_base = ~0U
750                 },
751         },
752         .rpanote = {
753                 .namesz = sizeof("IBM,RPA-Client-Config"),
754                 .descsz = sizeof(struct rpadesc),
755                 .type = 0x12759999,
756                 .name = "IBM,RPA-Client-Config",
757                 .rpadesc = {
758                         .lpar_affinity = 0,
759                         .min_rmo_size = 64,     /* in megabytes */
760                         .min_rmo_percent = 0,
761                         .max_pft_size = 48,     /* 2^48 bytes max PFT size */
762                         .splpar = 1,
763                         .min_load = ~0U,
764                         .new_mem_def = 0
765                 }
766         }
767 };
768
769 static void __init prom_send_capabilities(void)
770 {
771         ihandle elfloader, root;
772         prom_arg_t ret;
773
774         root = call_prom("open", 1, 1, ADDR("/"));
775         if (root != 0) {
776                 /* try calling the ibm,client-architecture-support method */
777                 if (call_prom_ret("call-method", 3, 2, &ret,
778                                   ADDR("ibm,client-architecture-support"),
779                                   ADDR(ibm_architecture_vec)) == 0) {
780                         /* the call exists... */
781                         if (ret)
782                                 prom_printf("WARNING: ibm,client-architecture"
783                                             "-support call FAILED!\n");
784                         call_prom("close", 1, 0, root);
785                         return;
786                 }
787                 call_prom("close", 1, 0, root);
788         }
789
790         /* no ibm,client-architecture-support call, try the old way */
791         elfloader = call_prom("open", 1, 1, ADDR("/packages/elf-loader"));
792         if (elfloader == 0) {
793                 prom_printf("couldn't open /packages/elf-loader\n");
794                 return;
795         }
796         call_prom("call-method", 3, 1, ADDR("process-elf-header"),
797                         elfloader, ADDR(&fake_elf));
798         call_prom("close", 1, 0, elfloader);
799 }
800 #endif
801
802 /*
803  * Memory allocation strategy... our layout is normally:
804  *
805  *  at 14Mb or more we have vmlinux, then a gap and initrd.  In some
806  *  rare cases, initrd might end up being before the kernel though.
807  *  We assume this won't override the final kernel at 0, we have no
808  *  provision to handle that in this version, but it should hopefully
809  *  never happen.
810  *
811  *  alloc_top is set to the top of RMO, eventually shrink down if the
812  *  TCEs overlap
813  *
814  *  alloc_bottom is set to the top of kernel/initrd
815  *
816  *  from there, allocations are done this way : rtas is allocated
817  *  topmost, and the device-tree is allocated from the bottom. We try
818  *  to grow the device-tree allocation as we progress. If we can't,
819  *  then we fail, we don't currently have a facility to restart
820  *  elsewhere, but that shouldn't be necessary.
821  *
822  *  Note that calls to reserve_mem have to be done explicitly, memory
823  *  allocated with either alloc_up or alloc_down isn't automatically
824  *  reserved.
825  */
826
827
828 /*
829  * Allocates memory in the RMO upward from the kernel/initrd
830  *
831  * When align is 0, this is a special case, it means to allocate in place
832  * at the current location of alloc_bottom or fail (that is basically
833  * extending the previous allocation). Used for the device-tree flattening
834  */
835 static unsigned long __init alloc_up(unsigned long size, unsigned long align)
836 {
837         unsigned long base = RELOC(alloc_bottom);
838         unsigned long addr = 0;
839
840         if (align)
841                 base = _ALIGN_UP(base, align);
842         prom_debug("alloc_up(%x, %x)\n", size, align);
843         if (RELOC(ram_top) == 0)
844                 prom_panic("alloc_up() called with mem not initialized\n");
845
846         if (align)
847                 base = _ALIGN_UP(RELOC(alloc_bottom), align);
848         else
849                 base = RELOC(alloc_bottom);
850
851         for(; (base + size) <= RELOC(alloc_top); 
852             base = _ALIGN_UP(base + 0x100000, align)) {
853                 prom_debug("    trying: 0x%x\n\r", base);
854                 addr = (unsigned long)prom_claim(base, size, 0);
855                 if (addr != PROM_ERROR && addr != 0)
856                         break;
857                 addr = 0;
858                 if (align == 0)
859                         break;
860         }
861         if (addr == 0)
862                 return 0;
863         RELOC(alloc_bottom) = addr;
864
865         prom_debug(" -> %x\n", addr);
866         prom_debug("  alloc_bottom : %x\n", RELOC(alloc_bottom));
867         prom_debug("  alloc_top    : %x\n", RELOC(alloc_top));
868         prom_debug("  alloc_top_hi : %x\n", RELOC(alloc_top_high));
869         prom_debug("  rmo_top      : %x\n", RELOC(rmo_top));
870         prom_debug("  ram_top      : %x\n", RELOC(ram_top));
871
872         return addr;
873 }
874
875 /*
876  * Allocates memory downward, either from top of RMO, or if highmem
877  * is set, from the top of RAM.  Note that this one doesn't handle
878  * failures.  It does claim memory if highmem is not set.
879  */
880 static unsigned long __init alloc_down(unsigned long size, unsigned long align,
881                                        int highmem)
882 {
883         unsigned long base, addr = 0;
884
885         prom_debug("alloc_down(%x, %x, %s)\n", size, align,
886                    highmem ? RELOC("(high)") : RELOC("(low)"));
887         if (RELOC(ram_top) == 0)
888                 prom_panic("alloc_down() called with mem not initialized\n");
889
890         if (highmem) {
891                 /* Carve out storage for the TCE table. */
892                 addr = _ALIGN_DOWN(RELOC(alloc_top_high) - size, align);
893                 if (addr <= RELOC(alloc_bottom))
894                         return 0;
895                 /* Will we bump into the RMO ? If yes, check out that we
896                  * didn't overlap existing allocations there, if we did,
897                  * we are dead, we must be the first in town !
898                  */
899                 if (addr < RELOC(rmo_top)) {
900                         /* Good, we are first */
901                         if (RELOC(alloc_top) == RELOC(rmo_top))
902                                 RELOC(alloc_top) = RELOC(rmo_top) = addr;
903                         else
904                                 return 0;
905                 }
906                 RELOC(alloc_top_high) = addr;
907                 goto bail;
908         }
909
910         base = _ALIGN_DOWN(RELOC(alloc_top) - size, align);
911         for (; base > RELOC(alloc_bottom);
912              base = _ALIGN_DOWN(base - 0x100000, align))  {
913                 prom_debug("    trying: 0x%x\n\r", base);
914                 addr = (unsigned long)prom_claim(base, size, 0);
915                 if (addr != PROM_ERROR && addr != 0)
916                         break;
917                 addr = 0;
918         }
919         if (addr == 0)
920                 return 0;
921         RELOC(alloc_top) = addr;
922
923  bail:
924         prom_debug(" -> %x\n", addr);
925         prom_debug("  alloc_bottom : %x\n", RELOC(alloc_bottom));
926         prom_debug("  alloc_top    : %x\n", RELOC(alloc_top));
927         prom_debug("  alloc_top_hi : %x\n", RELOC(alloc_top_high));
928         prom_debug("  rmo_top      : %x\n", RELOC(rmo_top));
929         prom_debug("  ram_top      : %x\n", RELOC(ram_top));
930
931         return addr;
932 }
933
934 /*
935  * Parse a "reg" cell
936  */
937 static unsigned long __init prom_next_cell(int s, cell_t **cellp)
938 {
939         cell_t *p = *cellp;
940         unsigned long r = 0;
941
942         /* Ignore more than 2 cells */
943         while (s > sizeof(unsigned long) / 4) {
944                 p++;
945                 s--;
946         }
947         r = *p++;
948 #ifdef CONFIG_PPC64
949         if (s > 1) {
950                 r <<= 32;
951                 r |= *(p++);
952         }
953 #endif
954         *cellp = p;
955         return r;
956 }
957
958 /*
959  * Very dumb function for adding to the memory reserve list, but
960  * we don't need anything smarter at this point
961  *
962  * XXX Eventually check for collisions.  They should NEVER happen.
963  * If problems seem to show up, it would be a good start to track
964  * them down.
965  */
966 static void reserve_mem(u64 base, u64 size)
967 {
968         u64 top = base + size;
969         unsigned long cnt = RELOC(mem_reserve_cnt);
970
971         if (size == 0)
972                 return;
973
974         /* We need to always keep one empty entry so that we
975          * have our terminator with "size" set to 0 since we are
976          * dumb and just copy this entire array to the boot params
977          */
978         base = _ALIGN_DOWN(base, PAGE_SIZE);
979         top = _ALIGN_UP(top, PAGE_SIZE);
980         size = top - base;
981
982         if (cnt >= (MEM_RESERVE_MAP_SIZE - 1))
983                 prom_panic("Memory reserve map exhausted !\n");
984         RELOC(mem_reserve_map)[cnt].base = base;
985         RELOC(mem_reserve_map)[cnt].size = size;
986         RELOC(mem_reserve_cnt) = cnt + 1;
987 }
988
989 /*
990  * Initialize memory allocation mecanism, parse "memory" nodes and
991  * obtain that way the top of memory and RMO to setup out local allocator
992  */
993 static void __init prom_init_mem(void)
994 {
995         phandle node;
996         char *path, type[64];
997         unsigned int plen;
998         cell_t *p, *endp;
999         struct prom_t *_prom = &RELOC(prom);
1000         u32 rac, rsc;
1001
1002         /*
1003          * We iterate the memory nodes to find
1004          * 1) top of RMO (first node)
1005          * 2) top of memory
1006          */
1007         rac = 2;
1008         prom_getprop(_prom->root, "#address-cells", &rac, sizeof(rac));
1009         rsc = 1;
1010         prom_getprop(_prom->root, "#size-cells", &rsc, sizeof(rsc));
1011         prom_debug("root_addr_cells: %x\n", (unsigned long) rac);
1012         prom_debug("root_size_cells: %x\n", (unsigned long) rsc);
1013
1014         prom_debug("scanning memory:\n");
1015         path = RELOC(prom_scratch);
1016
1017         for (node = 0; prom_next_node(&node); ) {
1018                 type[0] = 0;
1019                 prom_getprop(node, "device_type", type, sizeof(type));
1020
1021                 if (type[0] == 0) {
1022                         /*
1023                          * CHRP Longtrail machines have no device_type
1024                          * on the memory node, so check the name instead...
1025                          */
1026                         prom_getprop(node, "name", type, sizeof(type));
1027                 }
1028                 if (strcmp(type, RELOC("memory")))
1029                         continue;
1030
1031                 plen = prom_getprop(node, "reg", RELOC(regbuf), sizeof(regbuf));
1032                 if (plen > sizeof(regbuf)) {
1033                         prom_printf("memory node too large for buffer !\n");
1034                         plen = sizeof(regbuf);
1035                 }
1036                 p = RELOC(regbuf);
1037                 endp = p + (plen / sizeof(cell_t));
1038
1039 #ifdef DEBUG_PROM
1040                 memset(path, 0, PROM_SCRATCH_SIZE);
1041                 call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1);
1042                 prom_debug("  node %s :\n", path);
1043 #endif /* DEBUG_PROM */
1044
1045                 while ((endp - p) >= (rac + rsc)) {
1046                         unsigned long base, size;
1047
1048                         base = prom_next_cell(rac, &p);
1049                         size = prom_next_cell(rsc, &p);
1050
1051                         if (size == 0)
1052                                 continue;
1053                         prom_debug("    %x %x\n", base, size);
1054                         if (base == 0 && (RELOC(of_platform) & PLATFORM_LPAR))
1055                                 RELOC(rmo_top) = size;
1056                         if ((base + size) > RELOC(ram_top))
1057                                 RELOC(ram_top) = base + size;
1058                 }
1059         }
1060
1061         RELOC(alloc_bottom) = PAGE_ALIGN((unsigned long)&RELOC(_end) + 0x4000);
1062
1063         /* Check if we have an initrd after the kernel, if we do move our bottom
1064          * point to after it
1065          */
1066         if (RELOC(prom_initrd_start)) {
1067                 if (RELOC(prom_initrd_end) > RELOC(alloc_bottom))
1068                         RELOC(alloc_bottom) = PAGE_ALIGN(RELOC(prom_initrd_end));
1069         }
1070
1071         /*
1072          * Setup our top alloc point, that is top of RMO or top of
1073          * segment 0 when running non-LPAR.
1074          * Some RS64 machines have buggy firmware where claims up at
1075          * 1GB fail.  Cap at 768MB as a workaround.
1076          * Since 768MB is plenty of room, and we need to cap to something
1077          * reasonable on 32-bit, cap at 768MB on all machines.
1078          */
1079         if (!RELOC(rmo_top))
1080                 RELOC(rmo_top) = RELOC(ram_top);
1081         RELOC(rmo_top) = min(0x30000000ul, RELOC(rmo_top));
1082         RELOC(alloc_top) = RELOC(rmo_top);
1083         RELOC(alloc_top_high) = RELOC(ram_top);
1084
1085         prom_printf("memory layout at init:\n");
1086         prom_printf("  alloc_bottom : %x\n", RELOC(alloc_bottom));
1087         prom_printf("  alloc_top    : %x\n", RELOC(alloc_top));
1088         prom_printf("  alloc_top_hi : %x\n", RELOC(alloc_top_high));
1089         prom_printf("  rmo_top      : %x\n", RELOC(rmo_top));
1090         prom_printf("  ram_top      : %x\n", RELOC(ram_top));
1091 }
1092
1093
1094 /*
1095  * Allocate room for and instantiate RTAS
1096  */
1097 static void __init prom_instantiate_rtas(void)
1098 {
1099         phandle rtas_node;
1100         ihandle rtas_inst;
1101         u32 base, entry = 0;
1102         u32 size = 0;
1103
1104         prom_debug("prom_instantiate_rtas: start...\n");
1105
1106         rtas_node = call_prom("finddevice", 1, 1, ADDR("/rtas"));
1107         prom_debug("rtas_node: %x\n", rtas_node);
1108         if (!PHANDLE_VALID(rtas_node))
1109                 return;
1110
1111         prom_getprop(rtas_node, "rtas-size", &size, sizeof(size));
1112         if (size == 0)
1113                 return;
1114
1115         base = alloc_down(size, PAGE_SIZE, 0);
1116         if (base == 0) {
1117                 prom_printf("RTAS allocation failed !\n");
1118                 return;
1119         }
1120
1121         rtas_inst = call_prom("open", 1, 1, ADDR("/rtas"));
1122         if (!IHANDLE_VALID(rtas_inst)) {
1123                 prom_printf("opening rtas package failed (%x)\n", rtas_inst);
1124                 return;
1125         }
1126
1127         prom_printf("instantiating rtas at 0x%x ...", base);
1128
1129         if (call_prom_ret("call-method", 3, 2, &entry,
1130                           ADDR("instantiate-rtas"),
1131                           rtas_inst, base) != 0
1132             || entry == 0) {
1133                 prom_printf(" failed\n");
1134                 return;
1135         }
1136         prom_printf(" done\n");
1137
1138         reserve_mem(base, size);
1139
1140         prom_setprop(rtas_node, "/rtas", "linux,rtas-base",
1141                      &base, sizeof(base));
1142         prom_setprop(rtas_node, "/rtas", "linux,rtas-entry",
1143                      &entry, sizeof(entry));
1144
1145         prom_debug("rtas base     = 0x%x\n", base);
1146         prom_debug("rtas entry    = 0x%x\n", entry);
1147         prom_debug("rtas size     = 0x%x\n", (long)size);
1148
1149         prom_debug("prom_instantiate_rtas: end...\n");
1150 }
1151
1152 #ifdef CONFIG_PPC64
1153 /*
1154  * Allocate room for and initialize TCE tables
1155  */
1156 static void __init prom_initialize_tce_table(void)
1157 {
1158         phandle node;
1159         ihandle phb_node;
1160         char compatible[64], type[64], model[64];
1161         char *path = RELOC(prom_scratch);
1162         u64 base, align;
1163         u32 minalign, minsize;
1164         u64 tce_entry, *tce_entryp;
1165         u64 local_alloc_top, local_alloc_bottom;
1166         u64 i;
1167
1168         if (RELOC(ppc64_iommu_off))
1169                 return;
1170
1171         prom_debug("starting prom_initialize_tce_table\n");
1172
1173         /* Cache current top of allocs so we reserve a single block */
1174         local_alloc_top = RELOC(alloc_top_high);
1175         local_alloc_bottom = local_alloc_top;
1176
1177         /* Search all nodes looking for PHBs. */
1178         for (node = 0; prom_next_node(&node); ) {
1179                 compatible[0] = 0;
1180                 type[0] = 0;
1181                 model[0] = 0;
1182                 prom_getprop(node, "compatible",
1183                              compatible, sizeof(compatible));
1184                 prom_getprop(node, "device_type", type, sizeof(type));
1185                 prom_getprop(node, "model", model, sizeof(model));
1186
1187                 if ((type[0] == 0) || (strstr(type, RELOC("pci")) == NULL))
1188                         continue;
1189
1190                 /* Keep the old logic in tack to avoid regression. */
1191                 if (compatible[0] != 0) {
1192                         if ((strstr(compatible, RELOC("python")) == NULL) &&
1193                             (strstr(compatible, RELOC("Speedwagon")) == NULL) &&
1194                             (strstr(compatible, RELOC("Winnipeg")) == NULL))
1195                                 continue;
1196                 } else if (model[0] != 0) {
1197                         if ((strstr(model, RELOC("ython")) == NULL) &&
1198                             (strstr(model, RELOC("peedwagon")) == NULL) &&
1199                             (strstr(model, RELOC("innipeg")) == NULL))
1200                                 continue;
1201                 }
1202
1203                 if (prom_getprop(node, "tce-table-minalign", &minalign,
1204                                  sizeof(minalign)) == PROM_ERROR)
1205                         minalign = 0;
1206                 if (prom_getprop(node, "tce-table-minsize", &minsize,
1207                                  sizeof(minsize)) == PROM_ERROR)
1208                         minsize = 4UL << 20;
1209
1210                 /*
1211                  * Even though we read what OF wants, we just set the table
1212                  * size to 4 MB.  This is enough to map 2GB of PCI DMA space.
1213                  * By doing this, we avoid the pitfalls of trying to DMA to
1214                  * MMIO space and the DMA alias hole.
1215                  *
1216                  * On POWER4, firmware sets the TCE region by assuming
1217                  * each TCE table is 8MB. Using this memory for anything
1218                  * else will impact performance, so we always allocate 8MB.
1219                  * Anton
1220                  */
1221                 if (__is_processor(PV_POWER4) || __is_processor(PV_POWER4p))
1222                         minsize = 8UL << 20;
1223                 else
1224                         minsize = 4UL << 20;
1225
1226                 /* Align to the greater of the align or size */
1227                 align = max(minalign, minsize);
1228                 base = alloc_down(minsize, align, 1);
1229                 if (base == 0)
1230                         prom_panic("ERROR, cannot find space for TCE table.\n");
1231                 if (base < local_alloc_bottom)
1232                         local_alloc_bottom = base;
1233
1234                 /* It seems OF doesn't null-terminate the path :-( */
1235                 memset(path, 0, sizeof(path));
1236                 /* Call OF to setup the TCE hardware */
1237                 if (call_prom("package-to-path", 3, 1, node,
1238                               path, PROM_SCRATCH_SIZE-1) == PROM_ERROR) {
1239                         prom_printf("package-to-path failed\n");
1240                 }
1241
1242                 /* Save away the TCE table attributes for later use. */
1243                 prom_setprop(node, path, "linux,tce-base", &base, sizeof(base));
1244                 prom_setprop(node, path, "linux,tce-size", &minsize, sizeof(minsize));
1245
1246                 prom_debug("TCE table: %s\n", path);
1247                 prom_debug("\tnode = 0x%x\n", node);
1248                 prom_debug("\tbase = 0x%x\n", base);
1249                 prom_debug("\tsize = 0x%x\n", minsize);
1250
1251                 /* Initialize the table to have a one-to-one mapping
1252                  * over the allocated size.
1253                  */
1254                 tce_entryp = (unsigned long *)base;
1255                 for (i = 0; i < (minsize >> 3) ;tce_entryp++, i++) {
1256                         tce_entry = (i << PAGE_SHIFT);
1257                         tce_entry |= 0x3;
1258                         *tce_entryp = tce_entry;
1259                 }
1260
1261                 prom_printf("opening PHB %s", path);
1262                 phb_node = call_prom("open", 1, 1, path);
1263                 if (phb_node == 0)
1264                         prom_printf("... failed\n");
1265                 else
1266                         prom_printf("... done\n");
1267
1268                 call_prom("call-method", 6, 0, ADDR("set-64-bit-addressing"),
1269                           phb_node, -1, minsize,
1270                           (u32) base, (u32) (base >> 32));
1271                 call_prom("close", 1, 0, phb_node);
1272         }
1273
1274         reserve_mem(local_alloc_bottom, local_alloc_top - local_alloc_bottom);
1275
1276         /* These are only really needed if there is a memory limit in
1277          * effect, but we don't know so export them always. */
1278         RELOC(prom_tce_alloc_start) = local_alloc_bottom;
1279         RELOC(prom_tce_alloc_end) = local_alloc_top;
1280
1281         /* Flag the first invalid entry */
1282         prom_debug("ending prom_initialize_tce_table\n");
1283 }
1284 #endif
1285
1286 /*
1287  * With CHRP SMP we need to use the OF to start the other processors.
1288  * We can't wait until smp_boot_cpus (the OF is trashed by then)
1289  * so we have to put the processors into a holding pattern controlled
1290  * by the kernel (not OF) before we destroy the OF.
1291  *
1292  * This uses a chunk of low memory, puts some holding pattern
1293  * code there and sends the other processors off to there until
1294  * smp_boot_cpus tells them to do something.  The holding pattern
1295  * checks that address until its cpu # is there, when it is that
1296  * cpu jumps to __secondary_start().  smp_boot_cpus() takes care
1297  * of setting those values.
1298  *
1299  * We also use physical address 0x4 here to tell when a cpu
1300  * is in its holding pattern code.
1301  *
1302  * -- Cort
1303  */
1304 extern void __secondary_hold(void);
1305 extern unsigned long __secondary_hold_spinloop;
1306 extern unsigned long __secondary_hold_acknowledge;
1307
1308 /*
1309  * We want to reference the copy of __secondary_hold_* in the
1310  * 0 - 0x100 address range
1311  */
1312 #define LOW_ADDR(x)     (((unsigned long) &(x)) & 0xff)
1313
1314 static void __init prom_hold_cpus(void)
1315 {
1316         unsigned long i;
1317         unsigned int reg;
1318         phandle node;
1319         char type[64];
1320         int cpuid = 0;
1321         unsigned int interrupt_server[MAX_CPU_THREADS];
1322         unsigned int cpu_threads, hw_cpu_num;
1323         int propsize;
1324         struct prom_t *_prom = &RELOC(prom);
1325         unsigned long *spinloop
1326                 = (void *) LOW_ADDR(__secondary_hold_spinloop);
1327         unsigned long *acknowledge
1328                 = (void *) LOW_ADDR(__secondary_hold_acknowledge);
1329 #ifdef CONFIG_PPC64
1330         /* __secondary_hold is actually a descriptor, not the text address */
1331         unsigned long secondary_hold
1332                 = __pa(*PTRRELOC((unsigned long *)__secondary_hold));
1333 #else
1334         unsigned long secondary_hold = LOW_ADDR(__secondary_hold);
1335 #endif
1336
1337         prom_debug("prom_hold_cpus: start...\n");
1338         prom_debug("    1) spinloop       = 0x%x\n", (unsigned long)spinloop);
1339         prom_debug("    1) *spinloop      = 0x%x\n", *spinloop);
1340         prom_debug("    1) acknowledge    = 0x%x\n",
1341                    (unsigned long)acknowledge);
1342         prom_debug("    1) *acknowledge   = 0x%x\n", *acknowledge);
1343         prom_debug("    1) secondary_hold = 0x%x\n", secondary_hold);
1344
1345         /* Set the common spinloop variable, so all of the secondary cpus
1346          * will block when they are awakened from their OF spinloop.
1347          * This must occur for both SMP and non SMP kernels, since OF will
1348          * be trashed when we move the kernel.
1349          */
1350         *spinloop = 0;
1351
1352         /* look for cpus */
1353         for (node = 0; prom_next_node(&node); ) {
1354                 type[0] = 0;
1355                 prom_getprop(node, "device_type", type, sizeof(type));
1356                 if (strcmp(type, RELOC("cpu")) != 0)
1357                         continue;
1358
1359                 /* Skip non-configured cpus. */
1360                 if (prom_getprop(node, "status", type, sizeof(type)) > 0)
1361                         if (strcmp(type, RELOC("okay")) != 0)
1362                                 continue;
1363
1364                 reg = -1;
1365                 prom_getprop(node, "reg", &reg, sizeof(reg));
1366
1367                 prom_debug("\ncpuid        = 0x%x\n", cpuid);
1368                 prom_debug("cpu hw idx   = 0x%x\n", reg);
1369
1370                 /* Init the acknowledge var which will be reset by
1371                  * the secondary cpu when it awakens from its OF
1372                  * spinloop.
1373                  */
1374                 *acknowledge = (unsigned long)-1;
1375
1376                 propsize = prom_getprop(node, "ibm,ppc-interrupt-server#s",
1377                                         &interrupt_server,
1378                                         sizeof(interrupt_server));
1379                 if (propsize < 0) {
1380                         /* no property.  old hardware has no SMT */
1381                         cpu_threads = 1;
1382                         interrupt_server[0] = reg; /* fake it with phys id */
1383                 } else {
1384                         /* We have a threaded processor */
1385                         cpu_threads = propsize / sizeof(u32);
1386                         if (cpu_threads > MAX_CPU_THREADS) {
1387                                 prom_printf("SMT: too many threads!\n"
1388                                             "SMT: found %x, max is %x\n",
1389                                             cpu_threads, MAX_CPU_THREADS);
1390                                 cpu_threads = 1; /* ToDo: panic? */
1391                         }
1392                 }
1393
1394                 hw_cpu_num = interrupt_server[0];
1395                 if (hw_cpu_num != _prom->cpu) {
1396                         /* Primary Thread of non-boot cpu */
1397                         prom_printf("%x : starting cpu hw idx %x... ", cpuid, reg);
1398                         call_prom("start-cpu", 3, 0, node,
1399                                   secondary_hold, reg);
1400
1401                         for (i = 0; (i < 100000000) && 
1402                              (*acknowledge == ((unsigned long)-1)); i++ )
1403                                 mb();
1404
1405                         if (*acknowledge == reg)
1406                                 prom_printf("done\n");
1407                         else
1408                                 prom_printf("failed: %x\n", *acknowledge);
1409                 }
1410 #ifdef CONFIG_SMP
1411                 else
1412                         prom_printf("%x : boot cpu     %x\n", cpuid, reg);
1413 #endif /* CONFIG_SMP */
1414
1415                 /* Reserve cpu #s for secondary threads.   They start later. */
1416                 cpuid += cpu_threads;
1417         }
1418
1419         if (cpuid > NR_CPUS)
1420                 prom_printf("WARNING: maximum CPUs (" __stringify(NR_CPUS)
1421                             ") exceeded: ignoring extras\n");
1422
1423         prom_debug("prom_hold_cpus: end...\n");
1424 }
1425
1426
1427 static void __init prom_init_client_services(unsigned long pp)
1428 {
1429         struct prom_t *_prom = &RELOC(prom);
1430
1431         /* Get a handle to the prom entry point before anything else */
1432         RELOC(prom_entry) = pp;
1433
1434         /* get a handle for the stdout device */
1435         _prom->chosen = call_prom("finddevice", 1, 1, ADDR("/chosen"));
1436         if (!PHANDLE_VALID(_prom->chosen))
1437                 prom_panic("cannot find chosen"); /* msg won't be printed :( */
1438
1439         /* get device tree root */
1440         _prom->root = call_prom("finddevice", 1, 1, ADDR("/"));
1441         if (!PHANDLE_VALID(_prom->root))
1442                 prom_panic("cannot find device tree root"); /* msg won't be printed :( */
1443
1444         _prom->mmumap = 0;
1445 }
1446
1447 #ifdef CONFIG_PPC32
1448 /*
1449  * For really old powermacs, we need to map things we claim.
1450  * For that, we need the ihandle of the mmu.
1451  * Also, on the longtrail, we need to work around other bugs.
1452  */
1453 static void __init prom_find_mmu(void)
1454 {
1455         struct prom_t *_prom = &RELOC(prom);
1456         phandle oprom;
1457         char version[64];
1458
1459         oprom = call_prom("finddevice", 1, 1, ADDR("/openprom"));
1460         if (!PHANDLE_VALID(oprom))
1461                 return;
1462         if (prom_getprop(oprom, "model", version, sizeof(version)) <= 0)
1463                 return;
1464         version[sizeof(version) - 1] = 0;
1465         /* XXX might need to add other versions here */
1466         if (strcmp(version, "Open Firmware, 1.0.5") == 0)
1467                 of_workarounds = OF_WA_CLAIM;
1468         else if (strncmp(version, "FirmWorks,3.", 12) == 0) {
1469                 of_workarounds = OF_WA_CLAIM | OF_WA_LONGTRAIL;
1470                 call_prom("interpret", 1, 1, "dev /memory 0 to allow-reclaim");
1471         } else
1472                 return;
1473         _prom->memory = call_prom("open", 1, 1, ADDR("/memory"));
1474         prom_getprop(_prom->chosen, "mmu", &_prom->mmumap,
1475                      sizeof(_prom->mmumap));
1476         if (!IHANDLE_VALID(_prom->memory) || !IHANDLE_VALID(_prom->mmumap))
1477                 of_workarounds &= ~OF_WA_CLAIM;         /* hmmm */
1478 }
1479 #else
1480 #define prom_find_mmu()
1481 #endif
1482
1483 static void __init prom_init_stdout(void)
1484 {
1485         struct prom_t *_prom = &RELOC(prom);
1486         char *path = RELOC(of_stdout_device);
1487         char type[16];
1488         u32 val;
1489
1490         if (prom_getprop(_prom->chosen, "stdout", &val, sizeof(val)) <= 0)
1491                 prom_panic("cannot find stdout");
1492
1493         _prom->stdout = val;
1494
1495         /* Get the full OF pathname of the stdout device */
1496         memset(path, 0, 256);
1497         call_prom("instance-to-path", 3, 1, _prom->stdout, path, 255);
1498         val = call_prom("instance-to-package", 1, 1, _prom->stdout);
1499         prom_setprop(_prom->chosen, "/chosen", "linux,stdout-package",
1500                      &val, sizeof(val));
1501         prom_printf("OF stdout device is: %s\n", RELOC(of_stdout_device));
1502         prom_setprop(_prom->chosen, "/chosen", "linux,stdout-path",
1503                      path, strlen(path) + 1);
1504
1505         /* If it's a display, note it */
1506         memset(type, 0, sizeof(type));
1507         prom_getprop(val, "device_type", type, sizeof(type));
1508         if (strcmp(type, RELOC("display")) == 0)
1509                 prom_setprop(val, path, "linux,boot-display", NULL, 0);
1510 }
1511
1512 static void __init prom_close_stdin(void)
1513 {
1514         struct prom_t *_prom = &RELOC(prom);
1515         ihandle val;
1516
1517         if (prom_getprop(_prom->chosen, "stdin", &val, sizeof(val)) > 0)
1518                 call_prom("close", 1, 0, val);
1519 }
1520
1521 static int __init prom_find_machine_type(void)
1522 {
1523         struct prom_t *_prom = &RELOC(prom);
1524         char compat[256];
1525         int len, i = 0;
1526 #ifdef CONFIG_PPC64
1527         phandle rtas;
1528         int x;
1529 #endif
1530
1531         /* Look for a PowerMac */
1532         len = prom_getprop(_prom->root, "compatible",
1533                            compat, sizeof(compat)-1);
1534         if (len > 0) {
1535                 compat[len] = 0;
1536                 while (i < len) {
1537                         char *p = &compat[i];
1538                         int sl = strlen(p);
1539                         if (sl == 0)
1540                                 break;
1541                         if (strstr(p, RELOC("Power Macintosh")) ||
1542                             strstr(p, RELOC("MacRISC")))
1543                                 return PLATFORM_POWERMAC;
1544                         i += sl + 1;
1545                 }
1546         }
1547 #ifdef CONFIG_PPC64
1548         /* If not a mac, try to figure out if it's an IBM pSeries or any other
1549          * PAPR compliant platform. We assume it is if :
1550          *  - /device_type is "chrp" (please, do NOT use that for future
1551          *    non-IBM designs !
1552          *  - it has /rtas
1553          */
1554         len = prom_getprop(_prom->root, "device_type",
1555                            compat, sizeof(compat)-1);
1556         if (len <= 0)
1557                 return PLATFORM_GENERIC;
1558         if (strcmp(compat, RELOC("chrp")))
1559                 return PLATFORM_GENERIC;
1560
1561         /* Default to pSeries. We need to know if we are running LPAR */
1562         rtas = call_prom("finddevice", 1, 1, ADDR("/rtas"));
1563         if (!PHANDLE_VALID(rtas))
1564                 return PLATFORM_GENERIC;
1565         x = prom_getproplen(rtas, "ibm,hypertas-functions");
1566         if (x != PROM_ERROR) {
1567                 prom_printf("Hypertas detected, assuming LPAR !\n");
1568                 return PLATFORM_PSERIES_LPAR;
1569         }
1570         return PLATFORM_PSERIES;
1571 #else
1572         return PLATFORM_GENERIC;
1573 #endif
1574 }
1575
1576 static int __init prom_set_color(ihandle ih, int i, int r, int g, int b)
1577 {
1578         return call_prom("call-method", 6, 1, ADDR("color!"), ih, i, b, g, r);
1579 }
1580
1581 /*
1582  * If we have a display that we don't know how to drive,
1583  * we will want to try to execute OF's open method for it
1584  * later.  However, OF will probably fall over if we do that
1585  * we've taken over the MMU.
1586  * So we check whether we will need to open the display,
1587  * and if so, open it now.
1588  */
1589 static void __init prom_check_displays(void)
1590 {
1591         char type[16], *path;
1592         phandle node;
1593         ihandle ih;
1594         int i;
1595
1596         static unsigned char default_colors[] = {
1597                 0x00, 0x00, 0x00,
1598                 0x00, 0x00, 0xaa,
1599                 0x00, 0xaa, 0x00,
1600                 0x00, 0xaa, 0xaa,
1601                 0xaa, 0x00, 0x00,
1602                 0xaa, 0x00, 0xaa,
1603                 0xaa, 0xaa, 0x00,
1604                 0xaa, 0xaa, 0xaa,
1605                 0x55, 0x55, 0x55,
1606                 0x55, 0x55, 0xff,
1607                 0x55, 0xff, 0x55,
1608                 0x55, 0xff, 0xff,
1609                 0xff, 0x55, 0x55,
1610                 0xff, 0x55, 0xff,
1611                 0xff, 0xff, 0x55,
1612                 0xff, 0xff, 0xff
1613         };
1614         const unsigned char *clut;
1615
1616         prom_printf("Looking for displays\n");
1617         for (node = 0; prom_next_node(&node); ) {
1618                 memset(type, 0, sizeof(type));
1619                 prom_getprop(node, "device_type", type, sizeof(type));
1620                 if (strcmp(type, RELOC("display")) != 0)
1621                         continue;
1622
1623                 /* It seems OF doesn't null-terminate the path :-( */
1624                 path = RELOC(prom_scratch);
1625                 memset(path, 0, PROM_SCRATCH_SIZE);
1626
1627                 /*
1628                  * leave some room at the end of the path for appending extra
1629                  * arguments
1630                  */
1631                 if (call_prom("package-to-path", 3, 1, node, path,
1632                               PROM_SCRATCH_SIZE-10) == PROM_ERROR)
1633                         continue;
1634                 prom_printf("found display   : %s, opening ... ", path);
1635                 
1636                 ih = call_prom("open", 1, 1, path);
1637                 if (ih == 0) {
1638                         prom_printf("failed\n");
1639                         continue;
1640                 }
1641
1642                 /* Success */
1643                 prom_printf("done\n");
1644                 prom_setprop(node, path, "linux,opened", NULL, 0);
1645
1646                 /* Setup a usable color table when the appropriate
1647                  * method is available. Should update this to set-colors */
1648                 clut = RELOC(default_colors);
1649                 for (i = 0; i < 32; i++, clut += 3)
1650                         if (prom_set_color(ih, i, clut[0], clut[1],
1651                                            clut[2]) != 0)
1652                                 break;
1653
1654 #ifdef CONFIG_LOGO_LINUX_CLUT224
1655                 clut = PTRRELOC(RELOC(logo_linux_clut224.clut));
1656                 for (i = 0; i < RELOC(logo_linux_clut224.clutsize); i++, clut += 3)
1657                         if (prom_set_color(ih, i + 32, clut[0], clut[1],
1658                                            clut[2]) != 0)
1659                                 break;
1660 #endif /* CONFIG_LOGO_LINUX_CLUT224 */
1661         }
1662 }
1663
1664
1665 /* Return (relocated) pointer to this much memory: moves initrd if reqd. */
1666 static void __init *make_room(unsigned long *mem_start, unsigned long *mem_end,
1667                               unsigned long needed, unsigned long align)
1668 {
1669         void *ret;
1670
1671         *mem_start = _ALIGN(*mem_start, align);
1672         while ((*mem_start + needed) > *mem_end) {
1673                 unsigned long room, chunk;
1674
1675                 prom_debug("Chunk exhausted, claiming more at %x...\n",
1676                            RELOC(alloc_bottom));
1677                 room = RELOC(alloc_top) - RELOC(alloc_bottom);
1678                 if (room > DEVTREE_CHUNK_SIZE)
1679                         room = DEVTREE_CHUNK_SIZE;
1680                 if (room < PAGE_SIZE)
1681                         prom_panic("No memory for flatten_device_tree (no room)");
1682                 chunk = alloc_up(room, 0);
1683                 if (chunk == 0)
1684                         prom_panic("No memory for flatten_device_tree (claim failed)");
1685                 *mem_end = RELOC(alloc_top);
1686         }
1687
1688         ret = (void *)*mem_start;
1689         *mem_start += needed;
1690
1691         return ret;
1692 }
1693
1694 #define dt_push_token(token, mem_start, mem_end) \
1695         do { *((u32 *)make_room(mem_start, mem_end, 4, 4)) = token; } while(0)
1696
1697 static unsigned long __init dt_find_string(char *str)
1698 {
1699         char *s, *os;
1700
1701         s = os = (char *)RELOC(dt_string_start);
1702         s += 4;
1703         while (s <  (char *)RELOC(dt_string_end)) {
1704                 if (strcmp(s, str) == 0)
1705                         return s - os;
1706                 s += strlen(s) + 1;
1707         }
1708         return 0;
1709 }
1710
1711 /*
1712  * The Open Firmware 1275 specification states properties must be 31 bytes or
1713  * less, however not all firmwares obey this. Make it 64 bytes to be safe.
1714  */
1715 #define MAX_PROPERTY_NAME 64
1716
1717 static void __init scan_dt_build_strings(phandle node,
1718                                          unsigned long *mem_start,
1719                                          unsigned long *mem_end)
1720 {
1721         char *prev_name, *namep, *sstart;
1722         unsigned long soff;
1723         phandle child;
1724
1725         sstart =  (char *)RELOC(dt_string_start);
1726
1727         /* get and store all property names */
1728         prev_name = RELOC("");
1729         for (;;) {
1730                 /* 64 is max len of name including nul. */
1731                 namep = make_room(mem_start, mem_end, MAX_PROPERTY_NAME, 1);
1732                 if (call_prom("nextprop", 3, 1, node, prev_name, namep) != 1) {
1733                         /* No more nodes: unwind alloc */
1734                         *mem_start = (unsigned long)namep;
1735                         break;
1736                 }
1737
1738                 /* skip "name" */
1739                 if (strcmp(namep, RELOC("name")) == 0) {
1740                         *mem_start = (unsigned long)namep;
1741                         prev_name = RELOC("name");
1742                         continue;
1743                 }
1744                 /* get/create string entry */
1745                 soff = dt_find_string(namep);
1746                 if (soff != 0) {
1747                         *mem_start = (unsigned long)namep;
1748                         namep = sstart + soff;
1749                 } else {
1750                         /* Trim off some if we can */
1751                         *mem_start = (unsigned long)namep + strlen(namep) + 1;
1752                         RELOC(dt_string_end) = *mem_start;
1753                 }
1754                 prev_name = namep;
1755         }
1756
1757         /* do all our children */
1758         child = call_prom("child", 1, 1, node);
1759         while (child != 0) {
1760                 scan_dt_build_strings(child, mem_start, mem_end);
1761                 child = call_prom("peer", 1, 1, child);
1762         }
1763 }
1764
1765 static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
1766                                         unsigned long *mem_end)
1767 {
1768         phandle child;
1769         char *namep, *prev_name, *sstart, *p, *ep, *lp, *path;
1770         unsigned long soff;
1771         unsigned char *valp;
1772         static char pname[MAX_PROPERTY_NAME];
1773         int l, room;
1774
1775         dt_push_token(OF_DT_BEGIN_NODE, mem_start, mem_end);
1776
1777         /* get the node's full name */
1778         namep = (char *)*mem_start;
1779         room = *mem_end - *mem_start;
1780         if (room > 255)
1781                 room = 255;
1782         l = call_prom("package-to-path", 3, 1, node, namep, room);
1783         if (l >= 0) {
1784                 /* Didn't fit?  Get more room. */
1785                 if (l >= room) {
1786                         if (l >= *mem_end - *mem_start)
1787                                 namep = make_room(mem_start, mem_end, l+1, 1);
1788                         call_prom("package-to-path", 3, 1, node, namep, l);
1789                 }
1790                 namep[l] = '\0';
1791
1792                 /* Fixup an Apple bug where they have bogus \0 chars in the
1793                  * middle of the path in some properties, and extract
1794                  * the unit name (everything after the last '/').
1795                  */
1796                 for (lp = p = namep, ep = namep + l; p < ep; p++) {
1797                         if (*p == '/')
1798                                 lp = namep;
1799                         else if (*p != 0)
1800                                 *lp++ = *p;
1801                 }
1802                 *lp = 0;
1803                 *mem_start = _ALIGN((unsigned long)lp + 1, 4);
1804         }
1805
1806         /* get it again for debugging */
1807         path = RELOC(prom_scratch);
1808         memset(path, 0, PROM_SCRATCH_SIZE);
1809         call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1);
1810
1811         /* get and store all properties */
1812         prev_name = RELOC("");
1813         sstart = (char *)RELOC(dt_string_start);
1814         for (;;) {
1815                 if (call_prom("nextprop", 3, 1, node, prev_name,
1816                               RELOC(pname)) != 1)
1817                         break;
1818
1819                 /* skip "name" */
1820                 if (strcmp(RELOC(pname), RELOC("name")) == 0) {
1821                         prev_name = RELOC("name");
1822                         continue;
1823                 }
1824
1825                 /* find string offset */
1826                 soff = dt_find_string(RELOC(pname));
1827                 if (soff == 0) {
1828                         prom_printf("WARNING: Can't find string index for"
1829                                     " <%s>, node %s\n", RELOC(pname), path);
1830                         break;
1831                 }
1832                 prev_name = sstart + soff;
1833
1834                 /* get length */
1835                 l = call_prom("getproplen", 2, 1, node, RELOC(pname));
1836
1837                 /* sanity checks */
1838                 if (l == PROM_ERROR)
1839                         continue;
1840                 if (l > MAX_PROPERTY_LENGTH) {
1841                         prom_printf("WARNING: ignoring large property ");
1842                         /* It seems OF doesn't null-terminate the path :-( */
1843                         prom_printf("[%s] ", path);
1844                         prom_printf("%s length 0x%x\n", RELOC(pname), l);
1845                         continue;
1846                 }
1847
1848                 /* push property head */
1849                 dt_push_token(OF_DT_PROP, mem_start, mem_end);
1850                 dt_push_token(l, mem_start, mem_end);
1851                 dt_push_token(soff, mem_start, mem_end);
1852
1853                 /* push property content */
1854                 valp = make_room(mem_start, mem_end, l, 4);
1855                 call_prom("getprop", 4, 1, node, RELOC(pname), valp, l);
1856                 *mem_start = _ALIGN(*mem_start, 4);
1857         }
1858
1859         /* Add a "linux,phandle" property. */
1860         soff = dt_find_string(RELOC("linux,phandle"));
1861         if (soff == 0)
1862                 prom_printf("WARNING: Can't find string index for"
1863                             " <linux-phandle> node %s\n", path);
1864         else {
1865                 dt_push_token(OF_DT_PROP, mem_start, mem_end);
1866                 dt_push_token(4, mem_start, mem_end);
1867                 dt_push_token(soff, mem_start, mem_end);
1868                 valp = make_room(mem_start, mem_end, 4, 4);
1869                 *(u32 *)valp = node;
1870         }
1871
1872         /* do all our children */
1873         child = call_prom("child", 1, 1, node);
1874         while (child != 0) {
1875                 scan_dt_build_struct(child, mem_start, mem_end);
1876                 child = call_prom("peer", 1, 1, child);
1877         }
1878
1879         dt_push_token(OF_DT_END_NODE, mem_start, mem_end);
1880 }
1881
1882 static void __init flatten_device_tree(void)
1883 {
1884         phandle root;
1885         unsigned long mem_start, mem_end, room;
1886         struct boot_param_header *hdr;
1887         struct prom_t *_prom = &RELOC(prom);
1888         char *namep;
1889         u64 *rsvmap;
1890
1891         /*
1892          * Check how much room we have between alloc top & bottom (+/- a
1893          * few pages), crop to 4Mb, as this is our "chuck" size
1894          */
1895         room = RELOC(alloc_top) - RELOC(alloc_bottom) - 0x4000;
1896         if (room > DEVTREE_CHUNK_SIZE)
1897                 room = DEVTREE_CHUNK_SIZE;
1898         prom_debug("starting device tree allocs at %x\n", RELOC(alloc_bottom));
1899
1900         /* Now try to claim that */
1901         mem_start = (unsigned long)alloc_up(room, PAGE_SIZE);
1902         if (mem_start == 0)
1903                 prom_panic("Can't allocate initial device-tree chunk\n");
1904         mem_end = RELOC(alloc_top);
1905
1906         /* Get root of tree */
1907         root = call_prom("peer", 1, 1, (phandle)0);
1908         if (root == (phandle)0)
1909                 prom_panic ("couldn't get device tree root\n");
1910
1911         /* Build header and make room for mem rsv map */ 
1912         mem_start = _ALIGN(mem_start, 4);
1913         hdr = make_room(&mem_start, &mem_end,
1914                         sizeof(struct boot_param_header), 4);
1915         RELOC(dt_header_start) = (unsigned long)hdr;
1916         rsvmap = make_room(&mem_start, &mem_end, sizeof(mem_reserve_map), 8);
1917
1918         /* Start of strings */
1919         mem_start = PAGE_ALIGN(mem_start);
1920         RELOC(dt_string_start) = mem_start;
1921         mem_start += 4; /* hole */
1922
1923         /* Add "linux,phandle" in there, we'll need it */
1924         namep = make_room(&mem_start, &mem_end, 16, 1);
1925         strcpy(namep, RELOC("linux,phandle"));
1926         mem_start = (unsigned long)namep + strlen(namep) + 1;
1927
1928         /* Build string array */
1929         prom_printf("Building dt strings...\n"); 
1930         scan_dt_build_strings(root, &mem_start, &mem_end);
1931         RELOC(dt_string_end) = mem_start;
1932
1933         /* Build structure */
1934         mem_start = PAGE_ALIGN(mem_start);
1935         RELOC(dt_struct_start) = mem_start;
1936         prom_printf("Building dt structure...\n"); 
1937         scan_dt_build_struct(root, &mem_start, &mem_end);
1938         dt_push_token(OF_DT_END, &mem_start, &mem_end);
1939         RELOC(dt_struct_end) = PAGE_ALIGN(mem_start);
1940
1941         /* Finish header */
1942         hdr->boot_cpuid_phys = _prom->cpu;
1943         hdr->magic = OF_DT_HEADER;
1944         hdr->totalsize = RELOC(dt_struct_end) - RELOC(dt_header_start);
1945         hdr->off_dt_struct = RELOC(dt_struct_start) - RELOC(dt_header_start);
1946         hdr->off_dt_strings = RELOC(dt_string_start) - RELOC(dt_header_start);
1947         hdr->dt_strings_size = RELOC(dt_string_end) - RELOC(dt_string_start);
1948         hdr->off_mem_rsvmap = ((unsigned long)rsvmap) - RELOC(dt_header_start);
1949         hdr->version = OF_DT_VERSION;
1950         /* Version 16 is not backward compatible */
1951         hdr->last_comp_version = 0x10;
1952
1953         /* Copy the reserve map in */
1954         memcpy(rsvmap, RELOC(mem_reserve_map), sizeof(mem_reserve_map));
1955
1956 #ifdef DEBUG_PROM
1957         {
1958                 int i;
1959                 prom_printf("reserved memory map:\n");
1960                 for (i = 0; i < RELOC(mem_reserve_cnt); i++)
1961                         prom_printf("  %x - %x\n",
1962                                     RELOC(mem_reserve_map)[i].base,
1963                                     RELOC(mem_reserve_map)[i].size);
1964         }
1965 #endif
1966         /* Bump mem_reserve_cnt to cause further reservations to fail
1967          * since it's too late.
1968          */
1969         RELOC(mem_reserve_cnt) = MEM_RESERVE_MAP_SIZE;
1970
1971         prom_printf("Device tree strings 0x%x -> 0x%x\n",
1972                     RELOC(dt_string_start), RELOC(dt_string_end)); 
1973         prom_printf("Device tree struct  0x%x -> 0x%x\n",
1974                     RELOC(dt_struct_start), RELOC(dt_struct_end));
1975
1976 }
1977
1978 #ifdef CONFIG_PPC_MAPLE
1979 /* PIBS Version 1.05.0000 04/26/2005 has an incorrect /ht/isa/ranges property.
1980  * The values are bad, and it doesn't even have the right number of cells. */
1981 static void __init fixup_device_tree_maple(void)
1982 {
1983         phandle isa;
1984         u32 isa_ranges[6];
1985
1986         isa = call_prom("finddevice", 1, 1, ADDR("/ht@0/isa@4"));
1987         if (!PHANDLE_VALID(isa))
1988                 return;
1989
1990         if (prom_getprop(isa, "ranges", isa_ranges, sizeof(isa_ranges))
1991                 == PROM_ERROR)
1992                 return;
1993
1994         if (isa_ranges[0] != 0x1 ||
1995                 isa_ranges[1] != 0xf4000000 ||
1996                 isa_ranges[2] != 0x00010000)
1997                 return;
1998
1999         prom_printf("fixing up bogus ISA range on Maple...\n");
2000
2001         isa_ranges[0] = 0x1;
2002         isa_ranges[1] = 0x0;
2003         isa_ranges[2] = 0x01002000; /* IO space; PCI device = 4 */
2004         isa_ranges[3] = 0x0;
2005         isa_ranges[4] = 0x0;
2006         isa_ranges[5] = 0x00010000;
2007         prom_setprop(isa, "/ht@0/isa@4", "ranges",
2008                         isa_ranges, sizeof(isa_ranges));
2009 }
2010 #else
2011 #define fixup_device_tree_maple()
2012 #endif
2013
2014 #if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC)
2015 static void __init fixup_device_tree_pmac(void)
2016 {
2017         phandle u3, i2c, mpic;
2018         u32 u3_rev;
2019         u32 interrupts[2];
2020         u32 parent;
2021
2022         /* Some G5s have a missing interrupt definition, fix it up here */
2023         u3 = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000"));
2024         if (!PHANDLE_VALID(u3))
2025                 return;
2026         i2c = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/i2c@f8001000"));
2027         if (!PHANDLE_VALID(i2c))
2028                 return;
2029         mpic = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/mpic@f8040000"));
2030         if (!PHANDLE_VALID(mpic))
2031                 return;
2032
2033         /* check if proper rev of u3 */
2034         if (prom_getprop(u3, "device-rev", &u3_rev, sizeof(u3_rev))
2035             == PROM_ERROR)
2036                 return;
2037         if (u3_rev < 0x35 || u3_rev > 0x39)
2038                 return;
2039         /* does it need fixup ? */
2040         if (prom_getproplen(i2c, "interrupts") > 0)
2041                 return;
2042
2043         prom_printf("fixing up bogus interrupts for u3 i2c...\n");
2044
2045         /* interrupt on this revision of u3 is number 0 and level */
2046         interrupts[0] = 0;
2047         interrupts[1] = 1;
2048         prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupts",
2049                      &interrupts, sizeof(interrupts));
2050         parent = (u32)mpic;
2051         prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupt-parent",
2052                      &parent, sizeof(parent));
2053 }
2054 #else
2055 #define fixup_device_tree_pmac()
2056 #endif
2057
2058 static void __init fixup_device_tree(void)
2059 {
2060         fixup_device_tree_maple();
2061         fixup_device_tree_pmac();
2062 }
2063
2064 static void __init prom_find_boot_cpu(void)
2065 {
2066         struct prom_t *_prom = &RELOC(prom);
2067         u32 getprop_rval;
2068         ihandle prom_cpu;
2069         phandle cpu_pkg;
2070
2071         _prom->cpu = 0;
2072         if (prom_getprop(_prom->chosen, "cpu", &prom_cpu, sizeof(prom_cpu)) <= 0)
2073                 return;
2074
2075         cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu);
2076
2077         prom_getprop(cpu_pkg, "reg", &getprop_rval, sizeof(getprop_rval));
2078         _prom->cpu = getprop_rval;
2079
2080         prom_debug("Booting CPU hw index = 0x%x\n", _prom->cpu);
2081 }
2082
2083 static void __init prom_check_initrd(unsigned long r3, unsigned long r4)
2084 {
2085 #ifdef CONFIG_BLK_DEV_INITRD
2086         struct prom_t *_prom = &RELOC(prom);
2087
2088         if (r3 && r4 && r4 != 0xdeadbeef) {
2089                 unsigned long val;
2090
2091                 RELOC(prom_initrd_start) = is_kernel_addr(r3) ? __pa(r3) : r3;
2092                 RELOC(prom_initrd_end) = RELOC(prom_initrd_start) + r4;
2093
2094                 val = RELOC(prom_initrd_start);
2095                 prom_setprop(_prom->chosen, "/chosen", "linux,initrd-start",
2096                              &val, sizeof(val));
2097                 val = RELOC(prom_initrd_end);
2098                 prom_setprop(_prom->chosen, "/chosen", "linux,initrd-end",
2099                              &val, sizeof(val));
2100
2101                 reserve_mem(RELOC(prom_initrd_start),
2102                             RELOC(prom_initrd_end) - RELOC(prom_initrd_start));
2103
2104                 prom_debug("initrd_start=0x%x\n", RELOC(prom_initrd_start));
2105                 prom_debug("initrd_end=0x%x\n", RELOC(prom_initrd_end));
2106         }
2107 #endif /* CONFIG_BLK_DEV_INITRD */
2108 }
2109
2110 /*
2111  * We enter here early on, when the Open Firmware prom is still
2112  * handling exceptions and the MMU hash table for us.
2113  */
2114
2115 unsigned long __init prom_init(unsigned long r3, unsigned long r4,
2116                                unsigned long pp,
2117                                unsigned long r6, unsigned long r7)
2118 {       
2119         struct prom_t *_prom;
2120         unsigned long hdr;
2121         unsigned long offset = reloc_offset();
2122
2123 #ifdef CONFIG_PPC32
2124         reloc_got2(offset);
2125 #endif
2126
2127         _prom = &RELOC(prom);
2128
2129         /*
2130          * First zero the BSS
2131          */
2132         memset(&RELOC(__bss_start), 0, __bss_stop - __bss_start);
2133
2134         /*
2135          * Init interface to Open Firmware, get some node references,
2136          * like /chosen
2137          */
2138         prom_init_client_services(pp);
2139
2140         /*
2141          * See if this OF is old enough that we need to do explicit maps
2142          * and other workarounds
2143          */
2144         prom_find_mmu();
2145
2146         /*
2147          * Init prom stdout device
2148          */
2149         prom_init_stdout();
2150
2151         /*
2152          * Get default machine type. At this point, we do not differentiate
2153          * between pSeries SMP and pSeries LPAR
2154          */
2155         RELOC(of_platform) = prom_find_machine_type();
2156
2157         /* Bail if this is a kdump kernel. */
2158         if (PHYSICAL_START > 0)
2159                 prom_panic("Error: You can't boot a kdump kernel from OF!\n");
2160
2161         /*
2162          * Check for an initrd
2163          */
2164         prom_check_initrd(r3, r4);
2165
2166 #ifdef CONFIG_PPC_PSERIES
2167         /*
2168          * On pSeries, inform the firmware about our capabilities
2169          */
2170         if (RELOC(of_platform) == PLATFORM_PSERIES ||
2171             RELOC(of_platform) == PLATFORM_PSERIES_LPAR)
2172                 prom_send_capabilities();
2173 #endif
2174
2175         /*
2176          * Copy the CPU hold code
2177          */
2178         if (RELOC(of_platform) != PLATFORM_POWERMAC)
2179                 copy_and_flush(0, KERNELBASE + offset, 0x100, 0);
2180
2181         /*
2182          * Do early parsing of command line
2183          */
2184         early_cmdline_parse();
2185
2186         /*
2187          * Initialize memory management within prom_init
2188          */
2189         prom_init_mem();
2190
2191         /*
2192          * Determine which cpu is actually running right _now_
2193          */
2194         prom_find_boot_cpu();
2195
2196         /* 
2197          * Initialize display devices
2198          */
2199         prom_check_displays();
2200
2201 #ifdef CONFIG_PPC64
2202         /*
2203          * Initialize IOMMU (TCE tables) on pSeries. Do that before anything else
2204          * that uses the allocator, we need to make sure we get the top of memory
2205          * available for us here...
2206          */
2207         if (RELOC(of_platform) == PLATFORM_PSERIES)
2208                 prom_initialize_tce_table();
2209 #endif
2210
2211         /*
2212          * On non-powermacs, try to instantiate RTAS and puts all CPUs
2213          * in spin-loops. PowerMacs don't have a working RTAS and use
2214          * a different way to spin CPUs
2215          */
2216         if (RELOC(of_platform) != PLATFORM_POWERMAC) {
2217                 prom_instantiate_rtas();
2218                 prom_hold_cpus();
2219         }
2220
2221         /*
2222          * Fill in some infos for use by the kernel later on
2223          */
2224 #ifdef CONFIG_PPC64
2225         if (RELOC(ppc64_iommu_off))
2226                 prom_setprop(_prom->chosen, "/chosen", "linux,iommu-off",
2227                              NULL, 0);
2228
2229         if (RELOC(iommu_force_on))
2230                 prom_setprop(_prom->chosen, "/chosen", "linux,iommu-force-on",
2231                              NULL, 0);
2232
2233         if (RELOC(prom_tce_alloc_start)) {
2234                 prom_setprop(_prom->chosen, "/chosen", "linux,tce-alloc-start",
2235                              &RELOC(prom_tce_alloc_start),
2236                              sizeof(prom_tce_alloc_start));
2237                 prom_setprop(_prom->chosen, "/chosen", "linux,tce-alloc-end",
2238                              &RELOC(prom_tce_alloc_end),
2239                              sizeof(prom_tce_alloc_end));
2240         }
2241 #endif
2242
2243         /*
2244          * Fixup any known bugs in the device-tree
2245          */
2246         fixup_device_tree();
2247
2248         /*
2249          * Now finally create the flattened device-tree
2250          */
2251         prom_printf("copying OF device tree ...\n");
2252         flatten_device_tree();
2253
2254         /*
2255          * in case stdin is USB and still active on IBM machines...
2256          * Unfortunately quiesce crashes on some powermacs if we have
2257          * closed stdin already (in particular the powerbook 101).
2258          */
2259         if (RELOC(of_platform) != PLATFORM_POWERMAC)
2260                 prom_close_stdin();
2261
2262         /*
2263          * Call OF "quiesce" method to shut down pending DMA's from
2264          * devices etc...
2265          */
2266         prom_printf("Calling quiesce ...\n");
2267         call_prom("quiesce", 0, 0);
2268
2269         /*
2270          * And finally, call the kernel passing it the flattened device
2271          * tree and NULL as r5, thus triggering the new entry point which
2272          * is common to us and kexec
2273          */
2274         hdr = RELOC(dt_header_start);
2275         prom_printf("returning from prom_init\n");
2276         prom_debug("->dt_header_start=0x%x\n", hdr);
2277
2278 #ifdef CONFIG_PPC32
2279         reloc_got2(-offset);
2280 #endif
2281
2282         __start(hdr, KERNELBASE + offset, 0);
2283
2284         return 0;
2285 }