[PATCH] powerpc: avoid timer interrupt replay effect when onlining cpu
[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 static int __initdata of_platform;
184
185 static char __initdata prom_cmd_line[COMMAND_LINE_SIZE];
186
187 static unsigned long __initdata prom_memory_limit;
188
189 static unsigned long __initdata alloc_top;
190 static unsigned long __initdata alloc_top_high;
191 static unsigned long __initdata alloc_bottom;
192 static unsigned long __initdata rmo_top;
193 static unsigned long __initdata ram_top;
194
195 #ifdef CONFIG_KEXEC
196 static unsigned long __initdata prom_crashk_base;
197 static unsigned long __initdata prom_crashk_size;
198 #endif
199
200 static struct mem_map_entry __initdata mem_reserve_map[MEM_RESERVE_MAP_SIZE];
201 static int __initdata mem_reserve_cnt;
202
203 static cell_t __initdata regbuf[1024];
204
205
206 #define MAX_CPU_THREADS 2
207
208 /* TO GO */
209 #ifdef CONFIG_HMT
210 struct {
211         unsigned int pir;
212         unsigned int threadid;
213 } hmt_thread_data[NR_CPUS];
214 #endif /* CONFIG_HMT */
215
216 /*
217  * Error results ... some OF calls will return "-1" on error, some
218  * will return 0, some will return either. To simplify, here are
219  * macros to use with any ihandle or phandle return value to check if
220  * it is valid
221  */
222
223 #define PROM_ERROR              (-1u)
224 #define PHANDLE_VALID(p)        ((p) != 0 && (p) != PROM_ERROR)
225 #define IHANDLE_VALID(i)        ((i) != 0 && (i) != PROM_ERROR)
226
227
228 /* This is the one and *ONLY* place where we actually call open
229  * firmware.
230  */
231
232 static int __init call_prom(const char *service, int nargs, int nret, ...)
233 {
234         int i;
235         struct prom_args args;
236         va_list list;
237
238         args.service = ADDR(service);
239         args.nargs = nargs;
240         args.nret = nret;
241
242         va_start(list, nret);
243         for (i = 0; i < nargs; i++)
244                 args.args[i] = va_arg(list, prom_arg_t);
245         va_end(list);
246
247         for (i = 0; i < nret; i++)
248                 args.args[nargs+i] = 0;
249
250         if (enter_prom(&args, RELOC(prom_entry)) < 0)
251                 return PROM_ERROR;
252
253         return (nret > 0) ? args.args[nargs] : 0;
254 }
255
256 static int __init call_prom_ret(const char *service, int nargs, int nret,
257                                 prom_arg_t *rets, ...)
258 {
259         int i;
260         struct prom_args args;
261         va_list list;
262
263         args.service = ADDR(service);
264         args.nargs = nargs;
265         args.nret = nret;
266
267         va_start(list, rets);
268         for (i = 0; i < nargs; i++)
269                 args.args[i] = va_arg(list, prom_arg_t);
270         va_end(list);
271
272         for (i = 0; i < nret; i++)
273                 args.args[nargs+i] = 0;
274
275         if (enter_prom(&args, RELOC(prom_entry)) < 0)
276                 return PROM_ERROR;
277
278         if (rets != NULL)
279                 for (i = 1; i < nret; ++i)
280                         rets[i-1] = args.args[nargs+i];
281
282         return (nret > 0) ? args.args[nargs] : 0;
283 }
284
285
286 static void __init prom_print(const char *msg)
287 {
288         const char *p, *q;
289         struct prom_t *_prom = &RELOC(prom);
290
291         if (_prom->stdout == 0)
292                 return;
293
294         for (p = msg; *p != 0; p = q) {
295                 for (q = p; *q != 0 && *q != '\n'; ++q)
296                         ;
297                 if (q > p)
298                         call_prom("write", 3, 1, _prom->stdout, p, q - p);
299                 if (*q == 0)
300                         break;
301                 ++q;
302                 call_prom("write", 3, 1, _prom->stdout, ADDR("\r\n"), 2);
303         }
304 }
305
306
307 static void __init prom_print_hex(unsigned long val)
308 {
309         int i, nibbles = sizeof(val)*2;
310         char buf[sizeof(val)*2+1];
311         struct prom_t *_prom = &RELOC(prom);
312
313         for (i = nibbles-1;  i >= 0;  i--) {
314                 buf[i] = (val & 0xf) + '0';
315                 if (buf[i] > '9')
316                         buf[i] += ('a'-'0'-10);
317                 val >>= 4;
318         }
319         buf[nibbles] = '\0';
320         call_prom("write", 3, 1, _prom->stdout, buf, nibbles);
321 }
322
323
324 static void __init prom_printf(const char *format, ...)
325 {
326         const char *p, *q, *s;
327         va_list args;
328         unsigned long v;
329         struct prom_t *_prom = &RELOC(prom);
330
331         va_start(args, format);
332 #ifdef CONFIG_PPC64
333         format = PTRRELOC(format);
334 #endif
335         for (p = format; *p != 0; p = q) {
336                 for (q = p; *q != 0 && *q != '\n' && *q != '%'; ++q)
337                         ;
338                 if (q > p)
339                         call_prom("write", 3, 1, _prom->stdout, p, q - p);
340                 if (*q == 0)
341                         break;
342                 if (*q == '\n') {
343                         ++q;
344                         call_prom("write", 3, 1, _prom->stdout,
345                                   ADDR("\r\n"), 2);
346                         continue;
347                 }
348                 ++q;
349                 if (*q == 0)
350                         break;
351                 switch (*q) {
352                 case 's':
353                         ++q;
354                         s = va_arg(args, const char *);
355                         prom_print(s);
356                         break;
357                 case 'x':
358                         ++q;
359                         v = va_arg(args, unsigned long);
360                         prom_print_hex(v);
361                         break;
362                 }
363         }
364 }
365
366
367 static unsigned int __init prom_claim(unsigned long virt, unsigned long size,
368                                 unsigned long align)
369 {
370         struct prom_t *_prom = &RELOC(prom);
371
372         if (align == 0 && (OF_WORKAROUNDS & OF_WA_CLAIM)) {
373                 /*
374                  * Old OF requires we claim physical and virtual separately
375                  * and then map explicitly (assuming virtual mode)
376                  */
377                 int ret;
378                 prom_arg_t result;
379
380                 ret = call_prom_ret("call-method", 5, 2, &result,
381                                     ADDR("claim"), _prom->memory,
382                                     align, size, virt);
383                 if (ret != 0 || result == -1)
384                         return -1;
385                 ret = call_prom_ret("call-method", 5, 2, &result,
386                                     ADDR("claim"), _prom->mmumap,
387                                     align, size, virt);
388                 if (ret != 0) {
389                         call_prom("call-method", 4, 1, ADDR("release"),
390                                   _prom->memory, size, virt);
391                         return -1;
392                 }
393                 /* the 0x12 is M (coherence) + PP == read/write */
394                 call_prom("call-method", 6, 1,
395                           ADDR("map"), _prom->mmumap, 0x12, size, virt, virt);
396                 return virt;
397         }
398         return call_prom("claim", 3, 1, (prom_arg_t)virt, (prom_arg_t)size,
399                          (prom_arg_t)align);
400 }
401
402 static void __init __attribute__((noreturn)) prom_panic(const char *reason)
403 {
404 #ifdef CONFIG_PPC64
405         reason = PTRRELOC(reason);
406 #endif
407         prom_print(reason);
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         opt = strstr(RELOC(prom_cmd_line), RELOC("mem="));
591         if (opt) {
592                 opt += 4;
593                 RELOC(prom_memory_limit) = prom_memparse(opt, (const char **)&opt);
594 #ifdef CONFIG_PPC64
595                 /* Align to 16 MB == size of ppc64 large page */
596                 RELOC(prom_memory_limit) = ALIGN(RELOC(prom_memory_limit), 0x1000000);
597 #endif
598         }
599
600 #ifdef CONFIG_KEXEC
601         /*
602          * crashkernel=size@addr specifies the location to reserve for
603          * crash kernel.
604          */
605         opt = strstr(RELOC(prom_cmd_line), RELOC("crashkernel="));
606         if (opt) {
607                 opt += 12;
608                 RELOC(prom_crashk_size) = 
609                         prom_memparse(opt, (const char **)&opt);
610
611                 if (ALIGN(RELOC(prom_crashk_size), 0x1000000) !=
612                         RELOC(prom_crashk_size)) {
613                         prom_printf("Warning: crashkernel size is not "
614                                         "aligned to 16MB\n");
615                 }
616
617                 /*
618                  * At present, the crash kernel always run at 32MB.
619                  * Just ignore whatever user passed.
620                  */
621                 RELOC(prom_crashk_base) = 0x2000000;
622                 if (*opt == '@') {
623                         prom_printf("Warning: PPC64 kdump kernel always runs "
624                                         "at 32 MB\n");
625                 }
626         }
627 #endif
628 }
629
630 #ifdef CONFIG_PPC_PSERIES
631 /*
632  * To tell the firmware what our capabilities are, we have to pass
633  * it a fake 32-bit ELF header containing a couple of PT_NOTE sections
634  * that contain structures that contain the actual values.
635  */
636 static struct fake_elf {
637         Elf32_Ehdr      elfhdr;
638         Elf32_Phdr      phdr[2];
639         struct chrpnote {
640                 u32     namesz;
641                 u32     descsz;
642                 u32     type;
643                 char    name[8];        /* "PowerPC" */
644                 struct chrpdesc {
645                         u32     real_mode;
646                         u32     real_base;
647                         u32     real_size;
648                         u32     virt_base;
649                         u32     virt_size;
650                         u32     load_base;
651                 } chrpdesc;
652         } chrpnote;
653         struct rpanote {
654                 u32     namesz;
655                 u32     descsz;
656                 u32     type;
657                 char    name[24];       /* "IBM,RPA-Client-Config" */
658                 struct rpadesc {
659                         u32     lpar_affinity;
660                         u32     min_rmo_size;
661                         u32     min_rmo_percent;
662                         u32     max_pft_size;
663                         u32     splpar;
664                         u32     min_load;
665                         u32     new_mem_def;
666                         u32     ignore_me;
667                 } rpadesc;
668         } rpanote;
669 } fake_elf = {
670         .elfhdr = {
671                 .e_ident = { 0x7f, 'E', 'L', 'F',
672                              ELFCLASS32, ELFDATA2MSB, EV_CURRENT },
673                 .e_type = ET_EXEC,      /* yeah right */
674                 .e_machine = EM_PPC,
675                 .e_version = EV_CURRENT,
676                 .e_phoff = offsetof(struct fake_elf, phdr),
677                 .e_phentsize = sizeof(Elf32_Phdr),
678                 .e_phnum = 2
679         },
680         .phdr = {
681                 [0] = {
682                         .p_type = PT_NOTE,
683                         .p_offset = offsetof(struct fake_elf, chrpnote),
684                         .p_filesz = sizeof(struct chrpnote)
685                 }, [1] = {
686                         .p_type = PT_NOTE,
687                         .p_offset = offsetof(struct fake_elf, rpanote),
688                         .p_filesz = sizeof(struct rpanote)
689                 }
690         },
691         .chrpnote = {
692                 .namesz = sizeof("PowerPC"),
693                 .descsz = sizeof(struct chrpdesc),
694                 .type = 0x1275,
695                 .name = "PowerPC",
696                 .chrpdesc = {
697                         .real_mode = ~0U,       /* ~0 means "don't care" */
698                         .real_base = ~0U,
699                         .real_size = ~0U,
700                         .virt_base = ~0U,
701                         .virt_size = ~0U,
702                         .load_base = ~0U
703                 },
704         },
705         .rpanote = {
706                 .namesz = sizeof("IBM,RPA-Client-Config"),
707                 .descsz = sizeof(struct rpadesc),
708                 .type = 0x12759999,
709                 .name = "IBM,RPA-Client-Config",
710                 .rpadesc = {
711                         .lpar_affinity = 0,
712                         .min_rmo_size = 64,     /* in megabytes */
713                         .min_rmo_percent = 0,
714                         .max_pft_size = 48,     /* 2^48 bytes max PFT size */
715                         .splpar = 1,
716                         .min_load = ~0U,
717                         .new_mem_def = 0
718                 }
719         }
720 };
721
722 static void __init prom_send_capabilities(void)
723 {
724         ihandle elfloader;
725
726         elfloader = call_prom("open", 1, 1, ADDR("/packages/elf-loader"));
727         if (elfloader == 0) {
728                 prom_printf("couldn't open /packages/elf-loader\n");
729                 return;
730         }
731         call_prom("call-method", 3, 1, ADDR("process-elf-header"),
732                         elfloader, ADDR(&fake_elf));
733         call_prom("close", 1, 0, elfloader);
734 }
735 #endif
736
737 /*
738  * Memory allocation strategy... our layout is normally:
739  *
740  *  at 14Mb or more we have vmlinux, then a gap and initrd.  In some
741  *  rare cases, initrd might end up being before the kernel though.
742  *  We assume this won't override the final kernel at 0, we have no
743  *  provision to handle that in this version, but it should hopefully
744  *  never happen.
745  *
746  *  alloc_top is set to the top of RMO, eventually shrink down if the
747  *  TCEs overlap
748  *
749  *  alloc_bottom is set to the top of kernel/initrd
750  *
751  *  from there, allocations are done this way : rtas is allocated
752  *  topmost, and the device-tree is allocated from the bottom. We try
753  *  to grow the device-tree allocation as we progress. If we can't,
754  *  then we fail, we don't currently have a facility to restart
755  *  elsewhere, but that shouldn't be necessary.
756  *
757  *  Note that calls to reserve_mem have to be done explicitly, memory
758  *  allocated with either alloc_up or alloc_down isn't automatically
759  *  reserved.
760  */
761
762
763 /*
764  * Allocates memory in the RMO upward from the kernel/initrd
765  *
766  * When align is 0, this is a special case, it means to allocate in place
767  * at the current location of alloc_bottom or fail (that is basically
768  * extending the previous allocation). Used for the device-tree flattening
769  */
770 static unsigned long __init alloc_up(unsigned long size, unsigned long align)
771 {
772         unsigned long base = RELOC(alloc_bottom);
773         unsigned long addr = 0;
774
775         if (align)
776                 base = _ALIGN_UP(base, align);
777         prom_debug("alloc_up(%x, %x)\n", size, align);
778         if (RELOC(ram_top) == 0)
779                 prom_panic("alloc_up() called with mem not initialized\n");
780
781         if (align)
782                 base = _ALIGN_UP(RELOC(alloc_bottom), align);
783         else
784                 base = RELOC(alloc_bottom);
785
786         for(; (base + size) <= RELOC(alloc_top); 
787             base = _ALIGN_UP(base + 0x100000, align)) {
788                 prom_debug("    trying: 0x%x\n\r", base);
789                 addr = (unsigned long)prom_claim(base, size, 0);
790                 if (addr != PROM_ERROR && addr != 0)
791                         break;
792                 addr = 0;
793                 if (align == 0)
794                         break;
795         }
796         if (addr == 0)
797                 return 0;
798         RELOC(alloc_bottom) = addr;
799
800         prom_debug(" -> %x\n", addr);
801         prom_debug("  alloc_bottom : %x\n", RELOC(alloc_bottom));
802         prom_debug("  alloc_top    : %x\n", RELOC(alloc_top));
803         prom_debug("  alloc_top_hi : %x\n", RELOC(alloc_top_high));
804         prom_debug("  rmo_top      : %x\n", RELOC(rmo_top));
805         prom_debug("  ram_top      : %x\n", RELOC(ram_top));
806
807         return addr;
808 }
809
810 /*
811  * Allocates memory downward, either from top of RMO, or if highmem
812  * is set, from the top of RAM.  Note that this one doesn't handle
813  * failures.  It does claim memory if highmem is not set.
814  */
815 static unsigned long __init alloc_down(unsigned long size, unsigned long align,
816                                        int highmem)
817 {
818         unsigned long base, addr = 0;
819
820         prom_debug("alloc_down(%x, %x, %s)\n", size, align,
821                    highmem ? RELOC("(high)") : RELOC("(low)"));
822         if (RELOC(ram_top) == 0)
823                 prom_panic("alloc_down() called with mem not initialized\n");
824
825         if (highmem) {
826                 /* Carve out storage for the TCE table. */
827                 addr = _ALIGN_DOWN(RELOC(alloc_top_high) - size, align);
828                 if (addr <= RELOC(alloc_bottom))
829                         return 0;
830                 /* Will we bump into the RMO ? If yes, check out that we
831                  * didn't overlap existing allocations there, if we did,
832                  * we are dead, we must be the first in town !
833                  */
834                 if (addr < RELOC(rmo_top)) {
835                         /* Good, we are first */
836                         if (RELOC(alloc_top) == RELOC(rmo_top))
837                                 RELOC(alloc_top) = RELOC(rmo_top) = addr;
838                         else
839                                 return 0;
840                 }
841                 RELOC(alloc_top_high) = addr;
842                 goto bail;
843         }
844
845         base = _ALIGN_DOWN(RELOC(alloc_top) - size, align);
846         for (; base > RELOC(alloc_bottom);
847              base = _ALIGN_DOWN(base - 0x100000, align))  {
848                 prom_debug("    trying: 0x%x\n\r", base);
849                 addr = (unsigned long)prom_claim(base, size, 0);
850                 if (addr != PROM_ERROR && addr != 0)
851                         break;
852                 addr = 0;
853         }
854         if (addr == 0)
855                 return 0;
856         RELOC(alloc_top) = addr;
857
858  bail:
859         prom_debug(" -> %x\n", addr);
860         prom_debug("  alloc_bottom : %x\n", RELOC(alloc_bottom));
861         prom_debug("  alloc_top    : %x\n", RELOC(alloc_top));
862         prom_debug("  alloc_top_hi : %x\n", RELOC(alloc_top_high));
863         prom_debug("  rmo_top      : %x\n", RELOC(rmo_top));
864         prom_debug("  ram_top      : %x\n", RELOC(ram_top));
865
866         return addr;
867 }
868
869 /*
870  * Parse a "reg" cell
871  */
872 static unsigned long __init prom_next_cell(int s, cell_t **cellp)
873 {
874         cell_t *p = *cellp;
875         unsigned long r = 0;
876
877         /* Ignore more than 2 cells */
878         while (s > sizeof(unsigned long) / 4) {
879                 p++;
880                 s--;
881         }
882         r = *p++;
883 #ifdef CONFIG_PPC64
884         if (s > 1) {
885                 r <<= 32;
886                 r |= *(p++);
887         }
888 #endif
889         *cellp = p;
890         return r;
891 }
892
893 /*
894  * Very dumb function for adding to the memory reserve list, but
895  * we don't need anything smarter at this point
896  *
897  * XXX Eventually check for collisions.  They should NEVER happen.
898  * If problems seem to show up, it would be a good start to track
899  * them down.
900  */
901 static void reserve_mem(u64 base, u64 size)
902 {
903         u64 top = base + size;
904         unsigned long cnt = RELOC(mem_reserve_cnt);
905
906         if (size == 0)
907                 return;
908
909         /* We need to always keep one empty entry so that we
910          * have our terminator with "size" set to 0 since we are
911          * dumb and just copy this entire array to the boot params
912          */
913         base = _ALIGN_DOWN(base, PAGE_SIZE);
914         top = _ALIGN_UP(top, PAGE_SIZE);
915         size = top - base;
916
917         if (cnt >= (MEM_RESERVE_MAP_SIZE - 1))
918                 prom_panic("Memory reserve map exhausted !\n");
919         RELOC(mem_reserve_map)[cnt].base = base;
920         RELOC(mem_reserve_map)[cnt].size = size;
921         RELOC(mem_reserve_cnt) = cnt + 1;
922 }
923
924 /*
925  * Initialize memory allocation mecanism, parse "memory" nodes and
926  * obtain that way the top of memory and RMO to setup out local allocator
927  */
928 static void __init prom_init_mem(void)
929 {
930         phandle node;
931         char *path, type[64];
932         unsigned int plen;
933         cell_t *p, *endp;
934         struct prom_t *_prom = &RELOC(prom);
935         u32 rac, rsc;
936
937         /*
938          * We iterate the memory nodes to find
939          * 1) top of RMO (first node)
940          * 2) top of memory
941          */
942         rac = 2;
943         prom_getprop(_prom->root, "#address-cells", &rac, sizeof(rac));
944         rsc = 1;
945         prom_getprop(_prom->root, "#size-cells", &rsc, sizeof(rsc));
946         prom_debug("root_addr_cells: %x\n", (unsigned long) rac);
947         prom_debug("root_size_cells: %x\n", (unsigned long) rsc);
948
949         prom_debug("scanning memory:\n");
950         path = RELOC(prom_scratch);
951
952         for (node = 0; prom_next_node(&node); ) {
953                 type[0] = 0;
954                 prom_getprop(node, "device_type", type, sizeof(type));
955
956                 if (type[0] == 0) {
957                         /*
958                          * CHRP Longtrail machines have no device_type
959                          * on the memory node, so check the name instead...
960                          */
961                         prom_getprop(node, "name", type, sizeof(type));
962                 }
963                 if (strcmp(type, RELOC("memory")))
964                         continue;
965
966                 plen = prom_getprop(node, "reg", RELOC(regbuf), sizeof(regbuf));
967                 if (plen > sizeof(regbuf)) {
968                         prom_printf("memory node too large for buffer !\n");
969                         plen = sizeof(regbuf);
970                 }
971                 p = RELOC(regbuf);
972                 endp = p + (plen / sizeof(cell_t));
973
974 #ifdef DEBUG_PROM
975                 memset(path, 0, PROM_SCRATCH_SIZE);
976                 call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1);
977                 prom_debug("  node %s :\n", path);
978 #endif /* DEBUG_PROM */
979
980                 while ((endp - p) >= (rac + rsc)) {
981                         unsigned long base, size;
982
983                         base = prom_next_cell(rac, &p);
984                         size = prom_next_cell(rsc, &p);
985
986                         if (size == 0)
987                                 continue;
988                         prom_debug("    %x %x\n", base, size);
989                         if (base == 0)
990                                 RELOC(rmo_top) = size;
991                         if ((base + size) > RELOC(ram_top))
992                                 RELOC(ram_top) = base + size;
993                 }
994         }
995
996         RELOC(alloc_bottom) = PAGE_ALIGN((unsigned long)&RELOC(_end) + 0x4000);
997
998         /* Check if we have an initrd after the kernel, if we do move our bottom
999          * point to after it
1000          */
1001         if (RELOC(prom_initrd_start)) {
1002                 if (RELOC(prom_initrd_end) > RELOC(alloc_bottom))
1003                         RELOC(alloc_bottom) = PAGE_ALIGN(RELOC(prom_initrd_end));
1004         }
1005
1006         /*
1007          * If prom_memory_limit is set we reduce the upper limits *except* for
1008          * alloc_top_high. This must be the real top of RAM so we can put
1009          * TCE's up there.
1010          */
1011
1012         RELOC(alloc_top_high) = RELOC(ram_top);
1013
1014         if (RELOC(prom_memory_limit)) {
1015                 if (RELOC(prom_memory_limit) <= RELOC(alloc_bottom)) {
1016                         prom_printf("Ignoring mem=%x <= alloc_bottom.\n",
1017                                 RELOC(prom_memory_limit));
1018                         RELOC(prom_memory_limit) = 0;
1019                 } else if (RELOC(prom_memory_limit) >= RELOC(ram_top)) {
1020                         prom_printf("Ignoring mem=%x >= ram_top.\n",
1021                                 RELOC(prom_memory_limit));
1022                         RELOC(prom_memory_limit) = 0;
1023                 } else {
1024                         RELOC(ram_top) = RELOC(prom_memory_limit);
1025                         RELOC(rmo_top) = min(RELOC(rmo_top), RELOC(prom_memory_limit));
1026                 }
1027         }
1028
1029         /*
1030          * Setup our top alloc point, that is top of RMO or top of
1031          * segment 0 when running non-LPAR.
1032          * Some RS64 machines have buggy firmware where claims up at
1033          * 1GB fail.  Cap at 768MB as a workaround.
1034          * Since 768MB is plenty of room, and we need to cap to something
1035          * reasonable on 32-bit, cap at 768MB on all machines.
1036          */
1037         if (!RELOC(rmo_top))
1038                 RELOC(rmo_top) = RELOC(ram_top);
1039         RELOC(rmo_top) = min(0x30000000ul, RELOC(rmo_top));
1040         RELOC(alloc_top) = RELOC(rmo_top);
1041
1042         prom_printf("memory layout at init:\n");
1043         prom_printf("  memory_limit : %x (16 MB aligned)\n", RELOC(prom_memory_limit));
1044         prom_printf("  alloc_bottom : %x\n", RELOC(alloc_bottom));
1045         prom_printf("  alloc_top    : %x\n", RELOC(alloc_top));
1046         prom_printf("  alloc_top_hi : %x\n", RELOC(alloc_top_high));
1047         prom_printf("  rmo_top      : %x\n", RELOC(rmo_top));
1048         prom_printf("  ram_top      : %x\n", RELOC(ram_top));
1049 #ifdef CONFIG_KEXEC
1050         if (RELOC(prom_crashk_base)) {
1051                 prom_printf("  crashk_base  : %x\n",  RELOC(prom_crashk_base));
1052                 prom_printf("  crashk_size  : %x\n", RELOC(prom_crashk_size));
1053         }
1054 #endif
1055 }
1056
1057
1058 /*
1059  * Allocate room for and instantiate RTAS
1060  */
1061 static void __init prom_instantiate_rtas(void)
1062 {
1063         phandle rtas_node;
1064         ihandle rtas_inst;
1065         u32 base, entry = 0;
1066         u32 size = 0;
1067
1068         prom_debug("prom_instantiate_rtas: start...\n");
1069
1070         rtas_node = call_prom("finddevice", 1, 1, ADDR("/rtas"));
1071         prom_debug("rtas_node: %x\n", rtas_node);
1072         if (!PHANDLE_VALID(rtas_node))
1073                 return;
1074
1075         prom_getprop(rtas_node, "rtas-size", &size, sizeof(size));
1076         if (size == 0)
1077                 return;
1078
1079         base = alloc_down(size, PAGE_SIZE, 0);
1080         if (base == 0) {
1081                 prom_printf("RTAS allocation failed !\n");
1082                 return;
1083         }
1084
1085         rtas_inst = call_prom("open", 1, 1, ADDR("/rtas"));
1086         if (!IHANDLE_VALID(rtas_inst)) {
1087                 prom_printf("opening rtas package failed (%x)\n", rtas_inst);
1088                 return;
1089         }
1090
1091         prom_printf("instantiating rtas at 0x%x ...", base);
1092
1093         if (call_prom_ret("call-method", 3, 2, &entry,
1094                           ADDR("instantiate-rtas"),
1095                           rtas_inst, base) != 0
1096             || entry == 0) {
1097                 prom_printf(" failed\n");
1098                 return;
1099         }
1100         prom_printf(" done\n");
1101
1102         reserve_mem(base, size);
1103
1104         prom_setprop(rtas_node, "/rtas", "linux,rtas-base",
1105                      &base, sizeof(base));
1106         prom_setprop(rtas_node, "/rtas", "linux,rtas-entry",
1107                      &entry, sizeof(entry));
1108
1109         prom_debug("rtas base     = 0x%x\n", base);
1110         prom_debug("rtas entry    = 0x%x\n", entry);
1111         prom_debug("rtas size     = 0x%x\n", (long)size);
1112
1113         prom_debug("prom_instantiate_rtas: end...\n");
1114 }
1115
1116 #ifdef CONFIG_PPC64
1117 /*
1118  * Allocate room for and initialize TCE tables
1119  */
1120 static void __init prom_initialize_tce_table(void)
1121 {
1122         phandle node;
1123         ihandle phb_node;
1124         char compatible[64], type[64], model[64];
1125         char *path = RELOC(prom_scratch);
1126         u64 base, align;
1127         u32 minalign, minsize;
1128         u64 tce_entry, *tce_entryp;
1129         u64 local_alloc_top, local_alloc_bottom;
1130         u64 i;
1131
1132         if (RELOC(ppc64_iommu_off))
1133                 return;
1134
1135         prom_debug("starting prom_initialize_tce_table\n");
1136
1137         /* Cache current top of allocs so we reserve a single block */
1138         local_alloc_top = RELOC(alloc_top_high);
1139         local_alloc_bottom = local_alloc_top;
1140
1141         /* Search all nodes looking for PHBs. */
1142         for (node = 0; prom_next_node(&node); ) {
1143                 compatible[0] = 0;
1144                 type[0] = 0;
1145                 model[0] = 0;
1146                 prom_getprop(node, "compatible",
1147                              compatible, sizeof(compatible));
1148                 prom_getprop(node, "device_type", type, sizeof(type));
1149                 prom_getprop(node, "model", model, sizeof(model));
1150
1151                 if ((type[0] == 0) || (strstr(type, RELOC("pci")) == NULL))
1152                         continue;
1153
1154                 /* Keep the old logic in tack to avoid regression. */
1155                 if (compatible[0] != 0) {
1156                         if ((strstr(compatible, RELOC("python")) == NULL) &&
1157                             (strstr(compatible, RELOC("Speedwagon")) == NULL) &&
1158                             (strstr(compatible, RELOC("Winnipeg")) == NULL))
1159                                 continue;
1160                 } else if (model[0] != 0) {
1161                         if ((strstr(model, RELOC("ython")) == NULL) &&
1162                             (strstr(model, RELOC("peedwagon")) == NULL) &&
1163                             (strstr(model, RELOC("innipeg")) == NULL))
1164                                 continue;
1165                 }
1166
1167                 if (prom_getprop(node, "tce-table-minalign", &minalign,
1168                                  sizeof(minalign)) == PROM_ERROR)
1169                         minalign = 0;
1170                 if (prom_getprop(node, "tce-table-minsize", &minsize,
1171                                  sizeof(minsize)) == PROM_ERROR)
1172                         minsize = 4UL << 20;
1173
1174                 /*
1175                  * Even though we read what OF wants, we just set the table
1176                  * size to 4 MB.  This is enough to map 2GB of PCI DMA space.
1177                  * By doing this, we avoid the pitfalls of trying to DMA to
1178                  * MMIO space and the DMA alias hole.
1179                  *
1180                  * On POWER4, firmware sets the TCE region by assuming
1181                  * each TCE table is 8MB. Using this memory for anything
1182                  * else will impact performance, so we always allocate 8MB.
1183                  * Anton
1184                  */
1185                 if (__is_processor(PV_POWER4) || __is_processor(PV_POWER4p))
1186                         minsize = 8UL << 20;
1187                 else
1188                         minsize = 4UL << 20;
1189
1190                 /* Align to the greater of the align or size */
1191                 align = max(minalign, minsize);
1192                 base = alloc_down(minsize, align, 1);
1193                 if (base == 0)
1194                         prom_panic("ERROR, cannot find space for TCE table.\n");
1195                 if (base < local_alloc_bottom)
1196                         local_alloc_bottom = base;
1197
1198                 /* It seems OF doesn't null-terminate the path :-( */
1199                 memset(path, 0, sizeof(path));
1200                 /* Call OF to setup the TCE hardware */
1201                 if (call_prom("package-to-path", 3, 1, node,
1202                               path, PROM_SCRATCH_SIZE-1) == PROM_ERROR) {
1203                         prom_printf("package-to-path failed\n");
1204                 }
1205
1206                 /* Save away the TCE table attributes for later use. */
1207                 prom_setprop(node, path, "linux,tce-base", &base, sizeof(base));
1208                 prom_setprop(node, path, "linux,tce-size", &minsize, sizeof(minsize));
1209
1210                 prom_debug("TCE table: %s\n", path);
1211                 prom_debug("\tnode = 0x%x\n", node);
1212                 prom_debug("\tbase = 0x%x\n", base);
1213                 prom_debug("\tsize = 0x%x\n", minsize);
1214
1215                 /* Initialize the table to have a one-to-one mapping
1216                  * over the allocated size.
1217                  */
1218                 tce_entryp = (unsigned long *)base;
1219                 for (i = 0; i < (minsize >> 3) ;tce_entryp++, i++) {
1220                         tce_entry = (i << PAGE_SHIFT);
1221                         tce_entry |= 0x3;
1222                         *tce_entryp = tce_entry;
1223                 }
1224
1225                 prom_printf("opening PHB %s", path);
1226                 phb_node = call_prom("open", 1, 1, path);
1227                 if (phb_node == 0)
1228                         prom_printf("... failed\n");
1229                 else
1230                         prom_printf("... done\n");
1231
1232                 call_prom("call-method", 6, 0, ADDR("set-64-bit-addressing"),
1233                           phb_node, -1, minsize,
1234                           (u32) base, (u32) (base >> 32));
1235                 call_prom("close", 1, 0, phb_node);
1236         }
1237
1238         reserve_mem(local_alloc_bottom, local_alloc_top - local_alloc_bottom);
1239
1240         if (RELOC(prom_memory_limit)) {
1241                 /*
1242                  * We align the start to a 16MB boundary so we can map
1243                  * the TCE area using large pages if possible.
1244                  * The end should be the top of RAM so no need to align it.
1245                  */
1246                 RELOC(prom_tce_alloc_start) = _ALIGN_DOWN(local_alloc_bottom,
1247                                                           0x1000000);
1248                 RELOC(prom_tce_alloc_end) = local_alloc_top;
1249         }
1250
1251         /* Flag the first invalid entry */
1252         prom_debug("ending prom_initialize_tce_table\n");
1253 }
1254 #endif
1255
1256 /*
1257  * With CHRP SMP we need to use the OF to start the other processors.
1258  * We can't wait until smp_boot_cpus (the OF is trashed by then)
1259  * so we have to put the processors into a holding pattern controlled
1260  * by the kernel (not OF) before we destroy the OF.
1261  *
1262  * This uses a chunk of low memory, puts some holding pattern
1263  * code there and sends the other processors off to there until
1264  * smp_boot_cpus tells them to do something.  The holding pattern
1265  * checks that address until its cpu # is there, when it is that
1266  * cpu jumps to __secondary_start().  smp_boot_cpus() takes care
1267  * of setting those values.
1268  *
1269  * We also use physical address 0x4 here to tell when a cpu
1270  * is in its holding pattern code.
1271  *
1272  * -- Cort
1273  */
1274 extern void __secondary_hold(void);
1275 extern unsigned long __secondary_hold_spinloop;
1276 extern unsigned long __secondary_hold_acknowledge;
1277
1278 /*
1279  * We want to reference the copy of __secondary_hold_* in the
1280  * 0 - 0x100 address range
1281  */
1282 #define LOW_ADDR(x)     (((unsigned long) &(x)) & 0xff)
1283
1284 static void __init prom_hold_cpus(void)
1285 {
1286         unsigned long i;
1287         unsigned int reg;
1288         phandle node;
1289         char type[64];
1290         int cpuid = 0;
1291         unsigned int interrupt_server[MAX_CPU_THREADS];
1292         unsigned int cpu_threads, hw_cpu_num;
1293         int propsize;
1294         struct prom_t *_prom = &RELOC(prom);
1295         unsigned long *spinloop
1296                 = (void *) LOW_ADDR(__secondary_hold_spinloop);
1297         unsigned long *acknowledge
1298                 = (void *) LOW_ADDR(__secondary_hold_acknowledge);
1299 #ifdef CONFIG_PPC64
1300         /* __secondary_hold is actually a descriptor, not the text address */
1301         unsigned long secondary_hold
1302                 = __pa(*PTRRELOC((unsigned long *)__secondary_hold));
1303 #else
1304         unsigned long secondary_hold = LOW_ADDR(__secondary_hold);
1305 #endif
1306
1307         prom_debug("prom_hold_cpus: start...\n");
1308         prom_debug("    1) spinloop       = 0x%x\n", (unsigned long)spinloop);
1309         prom_debug("    1) *spinloop      = 0x%x\n", *spinloop);
1310         prom_debug("    1) acknowledge    = 0x%x\n",
1311                    (unsigned long)acknowledge);
1312         prom_debug("    1) *acknowledge   = 0x%x\n", *acknowledge);
1313         prom_debug("    1) secondary_hold = 0x%x\n", secondary_hold);
1314
1315         /* Set the common spinloop variable, so all of the secondary cpus
1316          * will block when they are awakened from their OF spinloop.
1317          * This must occur for both SMP and non SMP kernels, since OF will
1318          * be trashed when we move the kernel.
1319          */
1320         *spinloop = 0;
1321
1322 #ifdef CONFIG_HMT
1323         for (i = 0; i < NR_CPUS; i++)
1324                 RELOC(hmt_thread_data)[i].pir = 0xdeadbeef;
1325 #endif
1326         /* look for cpus */
1327         for (node = 0; prom_next_node(&node); ) {
1328                 type[0] = 0;
1329                 prom_getprop(node, "device_type", type, sizeof(type));
1330                 if (strcmp(type, RELOC("cpu")) != 0)
1331                         continue;
1332
1333                 /* Skip non-configured cpus. */
1334                 if (prom_getprop(node, "status", type, sizeof(type)) > 0)
1335                         if (strcmp(type, RELOC("okay")) != 0)
1336                                 continue;
1337
1338                 reg = -1;
1339                 prom_getprop(node, "reg", &reg, sizeof(reg));
1340
1341                 prom_debug("\ncpuid        = 0x%x\n", cpuid);
1342                 prom_debug("cpu hw idx   = 0x%x\n", reg);
1343
1344                 /* Init the acknowledge var which will be reset by
1345                  * the secondary cpu when it awakens from its OF
1346                  * spinloop.
1347                  */
1348                 *acknowledge = (unsigned long)-1;
1349
1350                 propsize = prom_getprop(node, "ibm,ppc-interrupt-server#s",
1351                                         &interrupt_server,
1352                                         sizeof(interrupt_server));
1353                 if (propsize < 0) {
1354                         /* no property.  old hardware has no SMT */
1355                         cpu_threads = 1;
1356                         interrupt_server[0] = reg; /* fake it with phys id */
1357                 } else {
1358                         /* We have a threaded processor */
1359                         cpu_threads = propsize / sizeof(u32);
1360                         if (cpu_threads > MAX_CPU_THREADS) {
1361                                 prom_printf("SMT: too many threads!\n"
1362                                             "SMT: found %x, max is %x\n",
1363                                             cpu_threads, MAX_CPU_THREADS);
1364                                 cpu_threads = 1; /* ToDo: panic? */
1365                         }
1366                 }
1367
1368                 hw_cpu_num = interrupt_server[0];
1369                 if (hw_cpu_num != _prom->cpu) {
1370                         /* Primary Thread of non-boot cpu */
1371                         prom_printf("%x : starting cpu hw idx %x... ", cpuid, reg);
1372                         call_prom("start-cpu", 3, 0, node,
1373                                   secondary_hold, reg);
1374
1375                         for (i = 0; (i < 100000000) && 
1376                              (*acknowledge == ((unsigned long)-1)); i++ )
1377                                 mb();
1378
1379                         if (*acknowledge == reg)
1380                                 prom_printf("done\n");
1381                         else
1382                                 prom_printf("failed: %x\n", *acknowledge);
1383                 }
1384 #ifdef CONFIG_SMP
1385                 else
1386                         prom_printf("%x : boot cpu     %x\n", cpuid, reg);
1387 #endif /* CONFIG_SMP */
1388
1389                 /* Reserve cpu #s for secondary threads.   They start later. */
1390                 cpuid += cpu_threads;
1391         }
1392 #ifdef CONFIG_HMT
1393         /* Only enable HMT on processors that provide support. */
1394         if (__is_processor(PV_PULSAR) || 
1395             __is_processor(PV_ICESTAR) ||
1396             __is_processor(PV_SSTAR)) {
1397                 prom_printf("    starting secondary threads\n");
1398
1399                 for (i = 0; i < NR_CPUS; i += 2) {
1400                         if (!cpu_online(i))
1401                                 continue;
1402
1403                         if (i == 0) {
1404                                 unsigned long pir = mfspr(SPRN_PIR);
1405                                 if (__is_processor(PV_PULSAR)) {
1406                                         RELOC(hmt_thread_data)[i].pir = 
1407                                                 pir & 0x1f;
1408                                 } else {
1409                                         RELOC(hmt_thread_data)[i].pir = 
1410                                                 pir & 0x3ff;
1411                                 }
1412                         }
1413                 }
1414         } else {
1415                 prom_printf("Processor is not HMT capable\n");
1416         }
1417 #endif
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 #endif
1529         len = prom_getprop(_prom->root, "compatible",
1530                            compat, sizeof(compat)-1);
1531         if (len > 0) {
1532                 compat[len] = 0;
1533                 while (i < len) {
1534                         char *p = &compat[i];
1535                         int sl = strlen(p);
1536                         if (sl == 0)
1537                                 break;
1538                         if (strstr(p, RELOC("Power Macintosh")) ||
1539                             strstr(p, RELOC("MacRISC")))
1540                                 return PLATFORM_POWERMAC;
1541 #ifdef CONFIG_PPC64
1542                         if (strstr(p, RELOC("Momentum,Maple")))
1543                                 return PLATFORM_MAPLE;
1544                         if (strstr(p, RELOC("IBM,CPB")))
1545                                 return PLATFORM_CELL;
1546 #endif
1547                         i += sl + 1;
1548                 }
1549         }
1550 #ifdef CONFIG_PPC64
1551         /* Default to pSeries. We need to know if we are running LPAR */
1552         rtas = call_prom("finddevice", 1, 1, ADDR("/rtas"));
1553         if (PHANDLE_VALID(rtas)) {
1554                 int x = prom_getproplen(rtas, "ibm,hypertas-functions");
1555                 if (x != PROM_ERROR) {
1556                         prom_printf("Hypertas detected, assuming LPAR !\n");
1557                         return PLATFORM_PSERIES_LPAR;
1558                 }
1559         }
1560         return PLATFORM_PSERIES;
1561 #else
1562         return PLATFORM_CHRP;
1563 #endif
1564 }
1565
1566 static int __init prom_set_color(ihandle ih, int i, int r, int g, int b)
1567 {
1568         return call_prom("call-method", 6, 1, ADDR("color!"), ih, i, b, g, r);
1569 }
1570
1571 /*
1572  * If we have a display that we don't know how to drive,
1573  * we will want to try to execute OF's open method for it
1574  * later.  However, OF will probably fall over if we do that
1575  * we've taken over the MMU.
1576  * So we check whether we will need to open the display,
1577  * and if so, open it now.
1578  */
1579 static void __init prom_check_displays(void)
1580 {
1581         char type[16], *path;
1582         phandle node;
1583         ihandle ih;
1584         int i;
1585
1586         static unsigned char default_colors[] = {
1587                 0x00, 0x00, 0x00,
1588                 0x00, 0x00, 0xaa,
1589                 0x00, 0xaa, 0x00,
1590                 0x00, 0xaa, 0xaa,
1591                 0xaa, 0x00, 0x00,
1592                 0xaa, 0x00, 0xaa,
1593                 0xaa, 0xaa, 0x00,
1594                 0xaa, 0xaa, 0xaa,
1595                 0x55, 0x55, 0x55,
1596                 0x55, 0x55, 0xff,
1597                 0x55, 0xff, 0x55,
1598                 0x55, 0xff, 0xff,
1599                 0xff, 0x55, 0x55,
1600                 0xff, 0x55, 0xff,
1601                 0xff, 0xff, 0x55,
1602                 0xff, 0xff, 0xff
1603         };
1604         const unsigned char *clut;
1605
1606         prom_printf("Looking for displays\n");
1607         for (node = 0; prom_next_node(&node); ) {
1608                 memset(type, 0, sizeof(type));
1609                 prom_getprop(node, "device_type", type, sizeof(type));
1610                 if (strcmp(type, RELOC("display")) != 0)
1611                         continue;
1612
1613                 /* It seems OF doesn't null-terminate the path :-( */
1614                 path = RELOC(prom_scratch);
1615                 memset(path, 0, PROM_SCRATCH_SIZE);
1616
1617                 /*
1618                  * leave some room at the end of the path for appending extra
1619                  * arguments
1620                  */
1621                 if (call_prom("package-to-path", 3, 1, node, path,
1622                               PROM_SCRATCH_SIZE-10) == PROM_ERROR)
1623                         continue;
1624                 prom_printf("found display   : %s, opening ... ", path);
1625                 
1626                 ih = call_prom("open", 1, 1, path);
1627                 if (ih == 0) {
1628                         prom_printf("failed\n");
1629                         continue;
1630                 }
1631
1632                 /* Success */
1633                 prom_printf("done\n");
1634                 prom_setprop(node, path, "linux,opened", NULL, 0);
1635
1636                 /* Setup a usable color table when the appropriate
1637                  * method is available. Should update this to set-colors */
1638                 clut = RELOC(default_colors);
1639                 for (i = 0; i < 32; i++, clut += 3)
1640                         if (prom_set_color(ih, i, clut[0], clut[1],
1641                                            clut[2]) != 0)
1642                                 break;
1643
1644 #ifdef CONFIG_LOGO_LINUX_CLUT224
1645                 clut = PTRRELOC(RELOC(logo_linux_clut224.clut));
1646                 for (i = 0; i < RELOC(logo_linux_clut224.clutsize); i++, clut += 3)
1647                         if (prom_set_color(ih, i + 32, clut[0], clut[1],
1648                                            clut[2]) != 0)
1649                                 break;
1650 #endif /* CONFIG_LOGO_LINUX_CLUT224 */
1651         }
1652 }
1653
1654
1655 /* Return (relocated) pointer to this much memory: moves initrd if reqd. */
1656 static void __init *make_room(unsigned long *mem_start, unsigned long *mem_end,
1657                               unsigned long needed, unsigned long align)
1658 {
1659         void *ret;
1660
1661         *mem_start = _ALIGN(*mem_start, align);
1662         while ((*mem_start + needed) > *mem_end) {
1663                 unsigned long room, chunk;
1664
1665                 prom_debug("Chunk exhausted, claiming more at %x...\n",
1666                            RELOC(alloc_bottom));
1667                 room = RELOC(alloc_top) - RELOC(alloc_bottom);
1668                 if (room > DEVTREE_CHUNK_SIZE)
1669                         room = DEVTREE_CHUNK_SIZE;
1670                 if (room < PAGE_SIZE)
1671                         prom_panic("No memory for flatten_device_tree (no room)");
1672                 chunk = alloc_up(room, 0);
1673                 if (chunk == 0)
1674                         prom_panic("No memory for flatten_device_tree (claim failed)");
1675                 *mem_end = RELOC(alloc_top);
1676         }
1677
1678         ret = (void *)*mem_start;
1679         *mem_start += needed;
1680
1681         return ret;
1682 }
1683
1684 #define dt_push_token(token, mem_start, mem_end) \
1685         do { *((u32 *)make_room(mem_start, mem_end, 4, 4)) = token; } while(0)
1686
1687 static unsigned long __init dt_find_string(char *str)
1688 {
1689         char *s, *os;
1690
1691         s = os = (char *)RELOC(dt_string_start);
1692         s += 4;
1693         while (s <  (char *)RELOC(dt_string_end)) {
1694                 if (strcmp(s, str) == 0)
1695                         return s - os;
1696                 s += strlen(s) + 1;
1697         }
1698         return 0;
1699 }
1700
1701 /*
1702  * The Open Firmware 1275 specification states properties must be 31 bytes or
1703  * less, however not all firmwares obey this. Make it 64 bytes to be safe.
1704  */
1705 #define MAX_PROPERTY_NAME 64
1706
1707 static void __init scan_dt_build_strings(phandle node,
1708                                          unsigned long *mem_start,
1709                                          unsigned long *mem_end)
1710 {
1711         char *prev_name, *namep, *sstart;
1712         unsigned long soff;
1713         phandle child;
1714
1715         sstart =  (char *)RELOC(dt_string_start);
1716
1717         /* get and store all property names */
1718         prev_name = RELOC("");
1719         for (;;) {
1720                 /* 64 is max len of name including nul. */
1721                 namep = make_room(mem_start, mem_end, MAX_PROPERTY_NAME, 1);
1722                 if (call_prom("nextprop", 3, 1, node, prev_name, namep) != 1) {
1723                         /* No more nodes: unwind alloc */
1724                         *mem_start = (unsigned long)namep;
1725                         break;
1726                 }
1727
1728                 /* skip "name" */
1729                 if (strcmp(namep, RELOC("name")) == 0) {
1730                         *mem_start = (unsigned long)namep;
1731                         prev_name = RELOC("name");
1732                         continue;
1733                 }
1734                 /* get/create string entry */
1735                 soff = dt_find_string(namep);
1736                 if (soff != 0) {
1737                         *mem_start = (unsigned long)namep;
1738                         namep = sstart + soff;
1739                 } else {
1740                         /* Trim off some if we can */
1741                         *mem_start = (unsigned long)namep + strlen(namep) + 1;
1742                         RELOC(dt_string_end) = *mem_start;
1743                 }
1744                 prev_name = namep;
1745         }
1746
1747         /* do all our children */
1748         child = call_prom("child", 1, 1, node);
1749         while (child != 0) {
1750                 scan_dt_build_strings(child, mem_start, mem_end);
1751                 child = call_prom("peer", 1, 1, child);
1752         }
1753 }
1754
1755 static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
1756                                         unsigned long *mem_end)
1757 {
1758         phandle child;
1759         char *namep, *prev_name, *sstart, *p, *ep, *lp, *path;
1760         unsigned long soff;
1761         unsigned char *valp;
1762         static char pname[MAX_PROPERTY_NAME];
1763         int l, room;
1764
1765         dt_push_token(OF_DT_BEGIN_NODE, mem_start, mem_end);
1766
1767         /* get the node's full name */
1768         namep = (char *)*mem_start;
1769         room = *mem_end - *mem_start;
1770         if (room > 255)
1771                 room = 255;
1772         l = call_prom("package-to-path", 3, 1, node, namep, room);
1773         if (l >= 0) {
1774                 /* Didn't fit?  Get more room. */
1775                 if (l >= room) {
1776                         if (l >= *mem_end - *mem_start)
1777                                 namep = make_room(mem_start, mem_end, l+1, 1);
1778                         call_prom("package-to-path", 3, 1, node, namep, l);
1779                 }
1780                 namep[l] = '\0';
1781
1782                 /* Fixup an Apple bug where they have bogus \0 chars in the
1783                  * middle of the path in some properties, and extract
1784                  * the unit name (everything after the last '/').
1785                  */
1786                 for (lp = p = namep, ep = namep + l; p < ep; p++) {
1787                         if (*p == '/')
1788                                 lp = namep;
1789                         else if (*p != 0)
1790                                 *lp++ = *p;
1791                 }
1792                 *lp = 0;
1793                 *mem_start = _ALIGN((unsigned long)lp + 1, 4);
1794         }
1795
1796         /* get it again for debugging */
1797         path = RELOC(prom_scratch);
1798         memset(path, 0, PROM_SCRATCH_SIZE);
1799         call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1);
1800
1801         /* get and store all properties */
1802         prev_name = RELOC("");
1803         sstart = (char *)RELOC(dt_string_start);
1804         for (;;) {
1805                 if (call_prom("nextprop", 3, 1, node, prev_name,
1806                               RELOC(pname)) != 1)
1807                         break;
1808
1809                 /* skip "name" */
1810                 if (strcmp(RELOC(pname), RELOC("name")) == 0) {
1811                         prev_name = RELOC("name");
1812                         continue;
1813                 }
1814
1815                 /* find string offset */
1816                 soff = dt_find_string(RELOC(pname));
1817                 if (soff == 0) {
1818                         prom_printf("WARNING: Can't find string index for"
1819                                     " <%s>, node %s\n", RELOC(pname), path);
1820                         break;
1821                 }
1822                 prev_name = sstart + soff;
1823
1824                 /* get length */
1825                 l = call_prom("getproplen", 2, 1, node, RELOC(pname));
1826
1827                 /* sanity checks */
1828                 if (l == PROM_ERROR)
1829                         continue;
1830                 if (l > MAX_PROPERTY_LENGTH) {
1831                         prom_printf("WARNING: ignoring large property ");
1832                         /* It seems OF doesn't null-terminate the path :-( */
1833                         prom_printf("[%s] ", path);
1834                         prom_printf("%s length 0x%x\n", RELOC(pname), l);
1835                         continue;
1836                 }
1837
1838                 /* push property head */
1839                 dt_push_token(OF_DT_PROP, mem_start, mem_end);
1840                 dt_push_token(l, mem_start, mem_end);
1841                 dt_push_token(soff, mem_start, mem_end);
1842
1843                 /* push property content */
1844                 valp = make_room(mem_start, mem_end, l, 4);
1845                 call_prom("getprop", 4, 1, node, RELOC(pname), valp, l);
1846                 *mem_start = _ALIGN(*mem_start, 4);
1847         }
1848
1849         /* Add a "linux,phandle" property. */
1850         soff = dt_find_string(RELOC("linux,phandle"));
1851         if (soff == 0)
1852                 prom_printf("WARNING: Can't find string index for"
1853                             " <linux-phandle> node %s\n", path);
1854         else {
1855                 dt_push_token(OF_DT_PROP, mem_start, mem_end);
1856                 dt_push_token(4, mem_start, mem_end);
1857                 dt_push_token(soff, mem_start, mem_end);
1858                 valp = make_room(mem_start, mem_end, 4, 4);
1859                 *(u32 *)valp = node;
1860         }
1861
1862         /* do all our children */
1863         child = call_prom("child", 1, 1, node);
1864         while (child != 0) {
1865                 scan_dt_build_struct(child, mem_start, mem_end);
1866                 child = call_prom("peer", 1, 1, child);
1867         }
1868
1869         dt_push_token(OF_DT_END_NODE, mem_start, mem_end);
1870 }
1871
1872 static void __init flatten_device_tree(void)
1873 {
1874         phandle root;
1875         unsigned long mem_start, mem_end, room;
1876         struct boot_param_header *hdr;
1877         struct prom_t *_prom = &RELOC(prom);
1878         char *namep;
1879         u64 *rsvmap;
1880
1881         /*
1882          * Check how much room we have between alloc top & bottom (+/- a
1883          * few pages), crop to 4Mb, as this is our "chuck" size
1884          */
1885         room = RELOC(alloc_top) - RELOC(alloc_bottom) - 0x4000;
1886         if (room > DEVTREE_CHUNK_SIZE)
1887                 room = DEVTREE_CHUNK_SIZE;
1888         prom_debug("starting device tree allocs at %x\n", RELOC(alloc_bottom));
1889
1890         /* Now try to claim that */
1891         mem_start = (unsigned long)alloc_up(room, PAGE_SIZE);
1892         if (mem_start == 0)
1893                 prom_panic("Can't allocate initial device-tree chunk\n");
1894         mem_end = RELOC(alloc_top);
1895
1896         /* Get root of tree */
1897         root = call_prom("peer", 1, 1, (phandle)0);
1898         if (root == (phandle)0)
1899                 prom_panic ("couldn't get device tree root\n");
1900
1901         /* Build header and make room for mem rsv map */ 
1902         mem_start = _ALIGN(mem_start, 4);
1903         hdr = make_room(&mem_start, &mem_end,
1904                         sizeof(struct boot_param_header), 4);
1905         RELOC(dt_header_start) = (unsigned long)hdr;
1906         rsvmap = make_room(&mem_start, &mem_end, sizeof(mem_reserve_map), 8);
1907
1908         /* Start of strings */
1909         mem_start = PAGE_ALIGN(mem_start);
1910         RELOC(dt_string_start) = mem_start;
1911         mem_start += 4; /* hole */
1912
1913         /* Add "linux,phandle" in there, we'll need it */
1914         namep = make_room(&mem_start, &mem_end, 16, 1);
1915         strcpy(namep, RELOC("linux,phandle"));
1916         mem_start = (unsigned long)namep + strlen(namep) + 1;
1917
1918         /* Build string array */
1919         prom_printf("Building dt strings...\n"); 
1920         scan_dt_build_strings(root, &mem_start, &mem_end);
1921         RELOC(dt_string_end) = mem_start;
1922
1923         /* Build structure */
1924         mem_start = PAGE_ALIGN(mem_start);
1925         RELOC(dt_struct_start) = mem_start;
1926         prom_printf("Building dt structure...\n"); 
1927         scan_dt_build_struct(root, &mem_start, &mem_end);
1928         dt_push_token(OF_DT_END, &mem_start, &mem_end);
1929         RELOC(dt_struct_end) = PAGE_ALIGN(mem_start);
1930
1931         /* Finish header */
1932         hdr->boot_cpuid_phys = _prom->cpu;
1933         hdr->magic = OF_DT_HEADER;
1934         hdr->totalsize = RELOC(dt_struct_end) - RELOC(dt_header_start);
1935         hdr->off_dt_struct = RELOC(dt_struct_start) - RELOC(dt_header_start);
1936         hdr->off_dt_strings = RELOC(dt_string_start) - RELOC(dt_header_start);
1937         hdr->dt_strings_size = RELOC(dt_string_end) - RELOC(dt_string_start);
1938         hdr->off_mem_rsvmap = ((unsigned long)rsvmap) - RELOC(dt_header_start);
1939         hdr->version = OF_DT_VERSION;
1940         /* Version 16 is not backward compatible */
1941         hdr->last_comp_version = 0x10;
1942
1943         /* Reserve the whole thing and copy the reserve map in, we
1944          * also bump mem_reserve_cnt to cause further reservations to
1945          * fail since it's too late.
1946          */
1947         reserve_mem(RELOC(dt_header_start), hdr->totalsize);
1948         memcpy(rsvmap, RELOC(mem_reserve_map), sizeof(mem_reserve_map));
1949
1950 #ifdef DEBUG_PROM
1951         {
1952                 int i;
1953                 prom_printf("reserved memory map:\n");
1954                 for (i = 0; i < RELOC(mem_reserve_cnt); i++)
1955                         prom_printf("  %x - %x\n",
1956                                     RELOC(mem_reserve_map)[i].base,
1957                                     RELOC(mem_reserve_map)[i].size);
1958         }
1959 #endif
1960         RELOC(mem_reserve_cnt) = MEM_RESERVE_MAP_SIZE;
1961
1962         prom_printf("Device tree strings 0x%x -> 0x%x\n",
1963                     RELOC(dt_string_start), RELOC(dt_string_end)); 
1964         prom_printf("Device tree struct  0x%x -> 0x%x\n",
1965                     RELOC(dt_struct_start), RELOC(dt_struct_end));
1966
1967 }
1968
1969
1970 static void __init fixup_device_tree(void)
1971 {
1972 #if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC)
1973         phandle u3, i2c, mpic;
1974         u32 u3_rev;
1975         u32 interrupts[2];
1976         u32 parent;
1977
1978         /* Some G5s have a missing interrupt definition, fix it up here */
1979         u3 = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000"));
1980         if (!PHANDLE_VALID(u3))
1981                 return;
1982         i2c = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/i2c@f8001000"));
1983         if (!PHANDLE_VALID(i2c))
1984                 return;
1985         mpic = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/mpic@f8040000"));
1986         if (!PHANDLE_VALID(mpic))
1987                 return;
1988
1989         /* check if proper rev of u3 */
1990         if (prom_getprop(u3, "device-rev", &u3_rev, sizeof(u3_rev))
1991             == PROM_ERROR)
1992                 return;
1993         if (u3_rev < 0x35 || u3_rev > 0x39)
1994                 return;
1995         /* does it need fixup ? */
1996         if (prom_getproplen(i2c, "interrupts") > 0)
1997                 return;
1998
1999         prom_printf("fixing up bogus interrupts for u3 i2c...\n");
2000
2001         /* interrupt on this revision of u3 is number 0 and level */
2002         interrupts[0] = 0;
2003         interrupts[1] = 1;
2004         prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupts",
2005                      &interrupts, sizeof(interrupts));
2006         parent = (u32)mpic;
2007         prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupt-parent",
2008                      &parent, sizeof(parent));
2009 #endif
2010 }
2011
2012
2013 static void __init prom_find_boot_cpu(void)
2014 {
2015         struct prom_t *_prom = &RELOC(prom);
2016         u32 getprop_rval;
2017         ihandle prom_cpu;
2018         phandle cpu_pkg;
2019
2020         _prom->cpu = 0;
2021         if (prom_getprop(_prom->chosen, "cpu", &prom_cpu, sizeof(prom_cpu)) <= 0)
2022                 return;
2023
2024         cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu);
2025
2026         prom_getprop(cpu_pkg, "reg", &getprop_rval, sizeof(getprop_rval));
2027         _prom->cpu = getprop_rval;
2028
2029         prom_debug("Booting CPU hw index = 0x%x\n", _prom->cpu);
2030 }
2031
2032 static void __init prom_check_initrd(unsigned long r3, unsigned long r4)
2033 {
2034 #ifdef CONFIG_BLK_DEV_INITRD
2035         struct prom_t *_prom = &RELOC(prom);
2036
2037         if (r3 && r4 && r4 != 0xdeadbeef) {
2038                 unsigned long val;
2039
2040                 RELOC(prom_initrd_start) = is_kernel_addr(r3) ? __pa(r3) : r3;
2041                 RELOC(prom_initrd_end) = RELOC(prom_initrd_start) + r4;
2042
2043                 val = RELOC(prom_initrd_start);
2044                 prom_setprop(_prom->chosen, "/chosen", "linux,initrd-start",
2045                              &val, sizeof(val));
2046                 val = RELOC(prom_initrd_end);
2047                 prom_setprop(_prom->chosen, "/chosen", "linux,initrd-end",
2048                              &val, sizeof(val));
2049
2050                 reserve_mem(RELOC(prom_initrd_start),
2051                             RELOC(prom_initrd_end) - RELOC(prom_initrd_start));
2052
2053                 prom_debug("initrd_start=0x%x\n", RELOC(prom_initrd_start));
2054                 prom_debug("initrd_end=0x%x\n", RELOC(prom_initrd_end));
2055         }
2056 #endif /* CONFIG_BLK_DEV_INITRD */
2057 }
2058
2059 /*
2060  * We enter here early on, when the Open Firmware prom is still
2061  * handling exceptions and the MMU hash table for us.
2062  */
2063
2064 unsigned long __init prom_init(unsigned long r3, unsigned long r4,
2065                                unsigned long pp,
2066                                unsigned long r6, unsigned long r7)
2067 {       
2068         struct prom_t *_prom;
2069         unsigned long hdr;
2070         u32 getprop_rval;
2071         unsigned long offset = reloc_offset();
2072
2073 #ifdef CONFIG_PPC32
2074         reloc_got2(offset);
2075 #endif
2076
2077         _prom = &RELOC(prom);
2078
2079         /*
2080          * First zero the BSS
2081          */
2082         memset(&RELOC(__bss_start), 0, __bss_stop - __bss_start);
2083
2084         /*
2085          * Init interface to Open Firmware, get some node references,
2086          * like /chosen
2087          */
2088         prom_init_client_services(pp);
2089
2090         /*
2091          * See if this OF is old enough that we need to do explicit maps
2092          * and other workarounds
2093          */
2094         prom_find_mmu();
2095
2096         /*
2097          * Init prom stdout device
2098          */
2099         prom_init_stdout();
2100
2101         /* Bail if this is a kdump kernel. */
2102         if (PHYSICAL_START > 0)
2103                 prom_panic("Error: You can't boot a kdump kernel from OF!\n");
2104
2105         /*
2106          * Check for an initrd
2107          */
2108         prom_check_initrd(r3, r4);
2109
2110         /*
2111          * Get default machine type. At this point, we do not differentiate
2112          * between pSeries SMP and pSeries LPAR
2113          */
2114         RELOC(of_platform) = prom_find_machine_type();
2115         getprop_rval = RELOC(of_platform);
2116         prom_setprop(_prom->chosen, "/chosen", "linux,platform",
2117                      &getprop_rval, sizeof(getprop_rval));
2118
2119 #ifdef CONFIG_PPC_PSERIES
2120         /*
2121          * On pSeries, inform the firmware about our capabilities
2122          */
2123         if (RELOC(of_platform) == PLATFORM_PSERIES ||
2124             RELOC(of_platform) == PLATFORM_PSERIES_LPAR)
2125                 prom_send_capabilities();
2126 #endif
2127
2128         /*
2129          * Copy the CPU hold code
2130          */
2131         if (RELOC(of_platform) != PLATFORM_POWERMAC)
2132                 copy_and_flush(0, KERNELBASE + offset, 0x100, 0);
2133
2134         /*
2135          * Do early parsing of command line
2136          */
2137         early_cmdline_parse();
2138
2139         /*
2140          * Initialize memory management within prom_init
2141          */
2142         prom_init_mem();
2143
2144 #ifdef CONFIG_KEXEC
2145         if (RELOC(prom_crashk_base))
2146                 reserve_mem(RELOC(prom_crashk_base), RELOC(prom_crashk_size));
2147 #endif
2148         /*
2149          * Determine which cpu is actually running right _now_
2150          */
2151         prom_find_boot_cpu();
2152
2153         /* 
2154          * Initialize display devices
2155          */
2156         prom_check_displays();
2157
2158 #ifdef CONFIG_PPC64
2159         /*
2160          * Initialize IOMMU (TCE tables) on pSeries. Do that before anything else
2161          * that uses the allocator, we need to make sure we get the top of memory
2162          * available for us here...
2163          */
2164         if (RELOC(of_platform) == PLATFORM_PSERIES)
2165                 prom_initialize_tce_table();
2166 #endif
2167
2168         /*
2169          * On non-powermacs, try to instantiate RTAS and puts all CPUs
2170          * in spin-loops. PowerMacs don't have a working RTAS and use
2171          * a different way to spin CPUs
2172          */
2173         if (RELOC(of_platform) != PLATFORM_POWERMAC) {
2174                 prom_instantiate_rtas();
2175                 prom_hold_cpus();
2176         }
2177
2178         /*
2179          * Fill in some infos for use by the kernel later on
2180          */
2181         if (RELOC(prom_memory_limit))
2182                 prom_setprop(_prom->chosen, "/chosen", "linux,memory-limit",
2183                              &RELOC(prom_memory_limit),
2184                              sizeof(prom_memory_limit));
2185 #ifdef CONFIG_PPC64
2186         if (RELOC(ppc64_iommu_off))
2187                 prom_setprop(_prom->chosen, "/chosen", "linux,iommu-off",
2188                              NULL, 0);
2189
2190         if (RELOC(iommu_force_on))
2191                 prom_setprop(_prom->chosen, "/chosen", "linux,iommu-force-on",
2192                              NULL, 0);
2193
2194         if (RELOC(prom_tce_alloc_start)) {
2195                 prom_setprop(_prom->chosen, "/chosen", "linux,tce-alloc-start",
2196                              &RELOC(prom_tce_alloc_start),
2197                              sizeof(prom_tce_alloc_start));
2198                 prom_setprop(_prom->chosen, "/chosen", "linux,tce-alloc-end",
2199                              &RELOC(prom_tce_alloc_end),
2200                              sizeof(prom_tce_alloc_end));
2201         }
2202 #endif
2203
2204 #ifdef CONFIG_KEXEC
2205         if (RELOC(prom_crashk_base)) {
2206                 prom_setprop(_prom->chosen, "/chosen", "linux,crashkernel-base",
2207                         PTRRELOC(&prom_crashk_base),
2208                         sizeof(RELOC(prom_crashk_base)));
2209                 prom_setprop(_prom->chosen, "/chosen", "linux,crashkernel-size",
2210                         PTRRELOC(&prom_crashk_size),
2211                         sizeof(RELOC(prom_crashk_size)));
2212         }
2213 #endif
2214         /*
2215          * Fixup any known bugs in the device-tree
2216          */
2217         fixup_device_tree();
2218
2219         /*
2220          * Now finally create the flattened device-tree
2221          */
2222         prom_printf("copying OF device tree ...\n");
2223         flatten_device_tree();
2224
2225         /*
2226          * in case stdin is USB and still active on IBM machines...
2227          * Unfortunately quiesce crashes on some powermacs if we have
2228          * closed stdin already (in particular the powerbook 101).
2229          */
2230         if (RELOC(of_platform) != PLATFORM_POWERMAC)
2231                 prom_close_stdin();
2232
2233         /*
2234          * Call OF "quiesce" method to shut down pending DMA's from
2235          * devices etc...
2236          */
2237         prom_printf("Calling quiesce ...\n");
2238         call_prom("quiesce", 0, 0);
2239
2240         /*
2241          * And finally, call the kernel passing it the flattened device
2242          * tree and NULL as r5, thus triggering the new entry point which
2243          * is common to us and kexec
2244          */
2245         hdr = RELOC(dt_header_start);
2246         prom_printf("returning from prom_init\n");
2247         prom_debug("->dt_header_start=0x%x\n", hdr);
2248
2249 #ifdef CONFIG_PPC32
2250         reloc_got2(-offset);
2251 #endif
2252
2253         __start(hdr, KERNELBASE + offset, 0);
2254
2255         return 0;
2256 }