[PATCH] Update email address for Kumar
[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         unsigned long   base;
141         unsigned long   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 static struct mem_map_entry __initdata mem_reserve_map[MEM_RESERVE_MAP_SIZE];
196 static int __initdata mem_reserve_cnt;
197
198 static cell_t __initdata regbuf[1024];
199
200
201 #define MAX_CPU_THREADS 2
202
203 /* TO GO */
204 #ifdef CONFIG_HMT
205 struct {
206         unsigned int pir;
207         unsigned int threadid;
208 } hmt_thread_data[NR_CPUS];
209 #endif /* CONFIG_HMT */
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                 rets[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         /* ToDo: should put up an SRC here on p/iSeries */
404         call_prom("exit", 0, 0);
405
406         for (;;)                        /* should never get here */
407                 ;
408 }
409
410
411 static int __init prom_next_node(phandle *nodep)
412 {
413         phandle node;
414
415         if ((node = *nodep) != 0
416             && (*nodep = call_prom("child", 1, 1, node)) != 0)
417                 return 1;
418         if ((*nodep = call_prom("peer", 1, 1, node)) != 0)
419                 return 1;
420         for (;;) {
421                 if ((node = call_prom("parent", 1, 1, node)) == 0)
422                         return 0;
423                 if ((*nodep = call_prom("peer", 1, 1, node)) != 0)
424                         return 1;
425         }
426 }
427
428 static int inline prom_getprop(phandle node, const char *pname,
429                                void *value, size_t valuelen)
430 {
431         return call_prom("getprop", 4, 1, node, ADDR(pname),
432                          (u32)(unsigned long) value, (u32) valuelen);
433 }
434
435 static int inline prom_getproplen(phandle node, const char *pname)
436 {
437         return call_prom("getproplen", 2, 1, node, ADDR(pname));
438 }
439
440 static void add_string(char **str, const char *q)
441 {
442         char *p = *str;
443
444         while (*q)
445                 *p++ = *q++;
446         *p++ = ' ';
447         *str = p;
448 }
449
450 static char *tohex(unsigned int x)
451 {
452         static char digits[] = "0123456789abcdef";
453         static char result[9];
454         int i;
455
456         result[8] = 0;
457         i = 8;
458         do {
459                 --i;
460                 result[i] = digits[x & 0xf];
461                 x >>= 4;
462         } while (x != 0 && i > 0);
463         return &result[i];
464 }
465
466 static int __init prom_setprop(phandle node, const char *nodename,
467                                const char *pname, void *value, size_t valuelen)
468 {
469         char cmd[256], *p;
470
471         if (!(OF_WORKAROUNDS & OF_WA_LONGTRAIL))
472                 return call_prom("setprop", 4, 1, node, ADDR(pname),
473                                  (u32)(unsigned long) value, (u32) valuelen);
474
475         /* gah... setprop doesn't work on longtrail, have to use interpret */
476         p = cmd;
477         add_string(&p, "dev");
478         add_string(&p, nodename);
479         add_string(&p, tohex((u32)(unsigned long) value));
480         add_string(&p, tohex(valuelen));
481         add_string(&p, tohex(ADDR(pname)));
482         add_string(&p, tohex(strlen(RELOC(pname))));
483         add_string(&p, "property");
484         *p = 0;
485         return call_prom("interpret", 1, 1, (u32)(unsigned long) cmd);
486 }
487
488 /* We can't use the standard versions because of RELOC headaches. */
489 #define isxdigit(c)     (('0' <= (c) && (c) <= '9') \
490                          || ('a' <= (c) && (c) <= 'f') \
491                          || ('A' <= (c) && (c) <= 'F'))
492
493 #define isdigit(c)      ('0' <= (c) && (c) <= '9')
494 #define islower(c)      ('a' <= (c) && (c) <= 'z')
495 #define toupper(c)      (islower(c) ? ((c) - 'a' + 'A') : (c))
496
497 unsigned long prom_strtoul(const char *cp, const char **endp)
498 {
499         unsigned long result = 0, base = 10, value;
500
501         if (*cp == '0') {
502                 base = 8;
503                 cp++;
504                 if (toupper(*cp) == 'X') {
505                         cp++;
506                         base = 16;
507                 }
508         }
509
510         while (isxdigit(*cp) &&
511                (value = isdigit(*cp) ? *cp - '0' : toupper(*cp) - 'A' + 10) < base) {
512                 result = result * base + value;
513                 cp++;
514         }
515
516         if (endp)
517                 *endp = cp;
518
519         return result;
520 }
521
522 unsigned long prom_memparse(const char *ptr, const char **retptr)
523 {
524         unsigned long ret = prom_strtoul(ptr, retptr);
525         int shift = 0;
526
527         /*
528          * We can't use a switch here because GCC *may* generate a
529          * jump table which won't work, because we're not running at
530          * the address we're linked at.
531          */
532         if ('G' == **retptr || 'g' == **retptr)
533                 shift = 30;
534
535         if ('M' == **retptr || 'm' == **retptr)
536                 shift = 20;
537
538         if ('K' == **retptr || 'k' == **retptr)
539                 shift = 10;
540
541         if (shift) {
542                 ret <<= shift;
543                 (*retptr)++;
544         }
545
546         return ret;
547 }
548
549 /*
550  * Early parsing of the command line passed to the kernel, used for
551  * "mem=x" and the options that affect the iommu
552  */
553 static void __init early_cmdline_parse(void)
554 {
555         struct prom_t *_prom = &RELOC(prom);
556         char *opt, *p;
557         int l = 0;
558
559         RELOC(prom_cmd_line[0]) = 0;
560         p = RELOC(prom_cmd_line);
561         if ((long)_prom->chosen > 0)
562                 l = prom_getprop(_prom->chosen, "bootargs", p, COMMAND_LINE_SIZE-1);
563 #ifdef CONFIG_CMDLINE
564         if (l == 0) /* dbl check */
565                 strlcpy(RELOC(prom_cmd_line),
566                         RELOC(CONFIG_CMDLINE), sizeof(prom_cmd_line));
567 #endif /* CONFIG_CMDLINE */
568         prom_printf("command line: %s\n", RELOC(prom_cmd_line));
569
570 #ifdef CONFIG_PPC64
571         opt = strstr(RELOC(prom_cmd_line), RELOC("iommu="));
572         if (opt) {
573                 prom_printf("iommu opt is: %s\n", opt);
574                 opt += 6;
575                 while (*opt && *opt == ' ')
576                         opt++;
577                 if (!strncmp(opt, RELOC("off"), 3))
578                         RELOC(ppc64_iommu_off) = 1;
579                 else if (!strncmp(opt, RELOC("force"), 5))
580                         RELOC(iommu_force_on) = 1;
581         }
582 #endif
583
584         opt = strstr(RELOC(prom_cmd_line), RELOC("mem="));
585         if (opt) {
586                 opt += 4;
587                 RELOC(prom_memory_limit) = prom_memparse(opt, (const char **)&opt);
588 #ifdef CONFIG_PPC64
589                 /* Align to 16 MB == size of ppc64 large page */
590                 RELOC(prom_memory_limit) = ALIGN(RELOC(prom_memory_limit), 0x1000000);
591 #endif
592         }
593 }
594
595 #ifdef CONFIG_PPC_PSERIES
596 /*
597  * To tell the firmware what our capabilities are, we have to pass
598  * it a fake 32-bit ELF header containing a couple of PT_NOTE sections
599  * that contain structures that contain the actual values.
600  */
601 static struct fake_elf {
602         Elf32_Ehdr      elfhdr;
603         Elf32_Phdr      phdr[2];
604         struct chrpnote {
605                 u32     namesz;
606                 u32     descsz;
607                 u32     type;
608                 char    name[8];        /* "PowerPC" */
609                 struct chrpdesc {
610                         u32     real_mode;
611                         u32     real_base;
612                         u32     real_size;
613                         u32     virt_base;
614                         u32     virt_size;
615                         u32     load_base;
616                 } chrpdesc;
617         } chrpnote;
618         struct rpanote {
619                 u32     namesz;
620                 u32     descsz;
621                 u32     type;
622                 char    name[24];       /* "IBM,RPA-Client-Config" */
623                 struct rpadesc {
624                         u32     lpar_affinity;
625                         u32     min_rmo_size;
626                         u32     min_rmo_percent;
627                         u32     max_pft_size;
628                         u32     splpar;
629                         u32     min_load;
630                         u32     new_mem_def;
631                         u32     ignore_me;
632                 } rpadesc;
633         } rpanote;
634 } fake_elf = {
635         .elfhdr = {
636                 .e_ident = { 0x7f, 'E', 'L', 'F',
637                              ELFCLASS32, ELFDATA2MSB, EV_CURRENT },
638                 .e_type = ET_EXEC,      /* yeah right */
639                 .e_machine = EM_PPC,
640                 .e_version = EV_CURRENT,
641                 .e_phoff = offsetof(struct fake_elf, phdr),
642                 .e_phentsize = sizeof(Elf32_Phdr),
643                 .e_phnum = 2
644         },
645         .phdr = {
646                 [0] = {
647                         .p_type = PT_NOTE,
648                         .p_offset = offsetof(struct fake_elf, chrpnote),
649                         .p_filesz = sizeof(struct chrpnote)
650                 }, [1] = {
651                         .p_type = PT_NOTE,
652                         .p_offset = offsetof(struct fake_elf, rpanote),
653                         .p_filesz = sizeof(struct rpanote)
654                 }
655         },
656         .chrpnote = {
657                 .namesz = sizeof("PowerPC"),
658                 .descsz = sizeof(struct chrpdesc),
659                 .type = 0x1275,
660                 .name = "PowerPC",
661                 .chrpdesc = {
662                         .real_mode = ~0U,       /* ~0 means "don't care" */
663                         .real_base = ~0U,
664                         .real_size = ~0U,
665                         .virt_base = ~0U,
666                         .virt_size = ~0U,
667                         .load_base = ~0U
668                 },
669         },
670         .rpanote = {
671                 .namesz = sizeof("IBM,RPA-Client-Config"),
672                 .descsz = sizeof(struct rpadesc),
673                 .type = 0x12759999,
674                 .name = "IBM,RPA-Client-Config",
675                 .rpadesc = {
676                         .lpar_affinity = 0,
677                         .min_rmo_size = 64,     /* in megabytes */
678                         .min_rmo_percent = 0,
679                         .max_pft_size = 48,     /* 2^48 bytes max PFT size */
680                         .splpar = 1,
681                         .min_load = ~0U,
682                         .new_mem_def = 0
683                 }
684         }
685 };
686
687 static void __init prom_send_capabilities(void)
688 {
689         ihandle elfloader;
690
691         elfloader = call_prom("open", 1, 1, ADDR("/packages/elf-loader"));
692         if (elfloader == 0) {
693                 prom_printf("couldn't open /packages/elf-loader\n");
694                 return;
695         }
696         call_prom("call-method", 3, 1, ADDR("process-elf-header"),
697                         elfloader, ADDR(&fake_elf));
698         call_prom("close", 1, 0, elfloader);
699 }
700 #endif
701
702 /*
703  * Memory allocation strategy... our layout is normally:
704  *
705  *  at 14Mb or more we have vmlinux, then a gap and initrd.  In some
706  *  rare cases, initrd might end up being before the kernel though.
707  *  We assume this won't override the final kernel at 0, we have no
708  *  provision to handle that in this version, but it should hopefully
709  *  never happen.
710  *
711  *  alloc_top is set to the top of RMO, eventually shrink down if the
712  *  TCEs overlap
713  *
714  *  alloc_bottom is set to the top of kernel/initrd
715  *
716  *  from there, allocations are done this way : rtas is allocated
717  *  topmost, and the device-tree is allocated from the bottom. We try
718  *  to grow the device-tree allocation as we progress. If we can't,
719  *  then we fail, we don't currently have a facility to restart
720  *  elsewhere, but that shouldn't be necessary.
721  *
722  *  Note that calls to reserve_mem have to be done explicitly, memory
723  *  allocated with either alloc_up or alloc_down isn't automatically
724  *  reserved.
725  */
726
727
728 /*
729  * Allocates memory in the RMO upward from the kernel/initrd
730  *
731  * When align is 0, this is a special case, it means to allocate in place
732  * at the current location of alloc_bottom or fail (that is basically
733  * extending the previous allocation). Used for the device-tree flattening
734  */
735 static unsigned long __init alloc_up(unsigned long size, unsigned long align)
736 {
737         unsigned long base = RELOC(alloc_bottom);
738         unsigned long addr = 0;
739
740         if (align)
741                 base = _ALIGN_UP(base, align);
742         prom_debug("alloc_up(%x, %x)\n", size, align);
743         if (RELOC(ram_top) == 0)
744                 prom_panic("alloc_up() called with mem not initialized\n");
745
746         if (align)
747                 base = _ALIGN_UP(RELOC(alloc_bottom), align);
748         else
749                 base = RELOC(alloc_bottom);
750
751         for(; (base + size) <= RELOC(alloc_top); 
752             base = _ALIGN_UP(base + 0x100000, align)) {
753                 prom_debug("    trying: 0x%x\n\r", base);
754                 addr = (unsigned long)prom_claim(base, size, 0);
755                 if (addr != PROM_ERROR && addr != 0)
756                         break;
757                 addr = 0;
758                 if (align == 0)
759                         break;
760         }
761         if (addr == 0)
762                 return 0;
763         RELOC(alloc_bottom) = addr;
764
765         prom_debug(" -> %x\n", addr);
766         prom_debug("  alloc_bottom : %x\n", RELOC(alloc_bottom));
767         prom_debug("  alloc_top    : %x\n", RELOC(alloc_top));
768         prom_debug("  alloc_top_hi : %x\n", RELOC(alloc_top_high));
769         prom_debug("  rmo_top      : %x\n", RELOC(rmo_top));
770         prom_debug("  ram_top      : %x\n", RELOC(ram_top));
771
772         return addr;
773 }
774
775 /*
776  * Allocates memory downward, either from top of RMO, or if highmem
777  * is set, from the top of RAM.  Note that this one doesn't handle
778  * failures.  It does claim memory if highmem is not set.
779  */
780 static unsigned long __init alloc_down(unsigned long size, unsigned long align,
781                                        int highmem)
782 {
783         unsigned long base, addr = 0;
784
785         prom_debug("alloc_down(%x, %x, %s)\n", size, align,
786                    highmem ? RELOC("(high)") : RELOC("(low)"));
787         if (RELOC(ram_top) == 0)
788                 prom_panic("alloc_down() called with mem not initialized\n");
789
790         if (highmem) {
791                 /* Carve out storage for the TCE table. */
792                 addr = _ALIGN_DOWN(RELOC(alloc_top_high) - size, align);
793                 if (addr <= RELOC(alloc_bottom))
794                         return 0;
795                 /* Will we bump into the RMO ? If yes, check out that we
796                  * didn't overlap existing allocations there, if we did,
797                  * we are dead, we must be the first in town !
798                  */
799                 if (addr < RELOC(rmo_top)) {
800                         /* Good, we are first */
801                         if (RELOC(alloc_top) == RELOC(rmo_top))
802                                 RELOC(alloc_top) = RELOC(rmo_top) = addr;
803                         else
804                                 return 0;
805                 }
806                 RELOC(alloc_top_high) = addr;
807                 goto bail;
808         }
809
810         base = _ALIGN_DOWN(RELOC(alloc_top) - size, align);
811         for (; base > RELOC(alloc_bottom);
812              base = _ALIGN_DOWN(base - 0x100000, align))  {
813                 prom_debug("    trying: 0x%x\n\r", base);
814                 addr = (unsigned long)prom_claim(base, size, 0);
815                 if (addr != PROM_ERROR && addr != 0)
816                         break;
817                 addr = 0;
818         }
819         if (addr == 0)
820                 return 0;
821         RELOC(alloc_top) = addr;
822
823  bail:
824         prom_debug(" -> %x\n", addr);
825         prom_debug("  alloc_bottom : %x\n", RELOC(alloc_bottom));
826         prom_debug("  alloc_top    : %x\n", RELOC(alloc_top));
827         prom_debug("  alloc_top_hi : %x\n", RELOC(alloc_top_high));
828         prom_debug("  rmo_top      : %x\n", RELOC(rmo_top));
829         prom_debug("  ram_top      : %x\n", RELOC(ram_top));
830
831         return addr;
832 }
833
834 /*
835  * Parse a "reg" cell
836  */
837 static unsigned long __init prom_next_cell(int s, cell_t **cellp)
838 {
839         cell_t *p = *cellp;
840         unsigned long r = 0;
841
842         /* Ignore more than 2 cells */
843         while (s > sizeof(unsigned long) / 4) {
844                 p++;
845                 s--;
846         }
847         r = *p++;
848 #ifdef CONFIG_PPC64
849         if (s > 1) {
850                 r <<= 32;
851                 r |= *(p++);
852         }
853 #endif
854         *cellp = p;
855         return r;
856 }
857
858 /*
859  * Very dumb function for adding to the memory reserve list, but
860  * we don't need anything smarter at this point
861  *
862  * XXX Eventually check for collisions.  They should NEVER happen.
863  * If problems seem to show up, it would be a good start to track
864  * them down.
865  */
866 static void reserve_mem(unsigned long base, unsigned long size)
867 {
868         unsigned long top = base + size;
869         unsigned long cnt = RELOC(mem_reserve_cnt);
870
871         if (size == 0)
872                 return;
873
874         /* We need to always keep one empty entry so that we
875          * have our terminator with "size" set to 0 since we are
876          * dumb and just copy this entire array to the boot params
877          */
878         base = _ALIGN_DOWN(base, PAGE_SIZE);
879         top = _ALIGN_UP(top, PAGE_SIZE);
880         size = top - base;
881
882         if (cnt >= (MEM_RESERVE_MAP_SIZE - 1))
883                 prom_panic("Memory reserve map exhausted !\n");
884         RELOC(mem_reserve_map)[cnt].base = base;
885         RELOC(mem_reserve_map)[cnt].size = size;
886         RELOC(mem_reserve_cnt) = cnt + 1;
887 }
888
889 /*
890  * Initialize memory allocation mecanism, parse "memory" nodes and
891  * obtain that way the top of memory and RMO to setup out local allocator
892  */
893 static void __init prom_init_mem(void)
894 {
895         phandle node;
896         char *path, type[64];
897         unsigned int plen;
898         cell_t *p, *endp;
899         struct prom_t *_prom = &RELOC(prom);
900         u32 rac, rsc;
901
902         /*
903          * We iterate the memory nodes to find
904          * 1) top of RMO (first node)
905          * 2) top of memory
906          */
907         rac = 2;
908         prom_getprop(_prom->root, "#address-cells", &rac, sizeof(rac));
909         rsc = 1;
910         prom_getprop(_prom->root, "#size-cells", &rsc, sizeof(rsc));
911         prom_debug("root_addr_cells: %x\n", (unsigned long) rac);
912         prom_debug("root_size_cells: %x\n", (unsigned long) rsc);
913
914         prom_debug("scanning memory:\n");
915         path = RELOC(prom_scratch);
916
917         for (node = 0; prom_next_node(&node); ) {
918                 type[0] = 0;
919                 prom_getprop(node, "device_type", type, sizeof(type));
920
921                 if (type[0] == 0) {
922                         /*
923                          * CHRP Longtrail machines have no device_type
924                          * on the memory node, so check the name instead...
925                          */
926                         prom_getprop(node, "name", type, sizeof(type));
927                 }
928                 if (strcmp(type, RELOC("memory")))
929                         continue;
930
931                 plen = prom_getprop(node, "reg", RELOC(regbuf), sizeof(regbuf));
932                 if (plen > sizeof(regbuf)) {
933                         prom_printf("memory node too large for buffer !\n");
934                         plen = sizeof(regbuf);
935                 }
936                 p = RELOC(regbuf);
937                 endp = p + (plen / sizeof(cell_t));
938
939 #ifdef DEBUG_PROM
940                 memset(path, 0, PROM_SCRATCH_SIZE);
941                 call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1);
942                 prom_debug("  node %s :\n", path);
943 #endif /* DEBUG_PROM */
944
945                 while ((endp - p) >= (rac + rsc)) {
946                         unsigned long base, size;
947
948                         base = prom_next_cell(rac, &p);
949                         size = prom_next_cell(rsc, &p);
950
951                         if (size == 0)
952                                 continue;
953                         prom_debug("    %x %x\n", base, size);
954                         if (base == 0)
955                                 RELOC(rmo_top) = size;
956                         if ((base + size) > RELOC(ram_top))
957                                 RELOC(ram_top) = base + size;
958                 }
959         }
960
961         RELOC(alloc_bottom) = PAGE_ALIGN((unsigned long)&RELOC(_end) + 0x4000);
962
963         /* Check if we have an initrd after the kernel, if we do move our bottom
964          * point to after it
965          */
966         if (RELOC(prom_initrd_start)) {
967                 if (RELOC(prom_initrd_end) > RELOC(alloc_bottom))
968                         RELOC(alloc_bottom) = PAGE_ALIGN(RELOC(prom_initrd_end));
969         }
970
971         /*
972          * If prom_memory_limit is set we reduce the upper limits *except* for
973          * alloc_top_high. This must be the real top of RAM so we can put
974          * TCE's up there.
975          */
976
977         RELOC(alloc_top_high) = RELOC(ram_top);
978
979         if (RELOC(prom_memory_limit)) {
980                 if (RELOC(prom_memory_limit) <= RELOC(alloc_bottom)) {
981                         prom_printf("Ignoring mem=%x <= alloc_bottom.\n",
982                                 RELOC(prom_memory_limit));
983                         RELOC(prom_memory_limit) = 0;
984                 } else if (RELOC(prom_memory_limit) >= RELOC(ram_top)) {
985                         prom_printf("Ignoring mem=%x >= ram_top.\n",
986                                 RELOC(prom_memory_limit));
987                         RELOC(prom_memory_limit) = 0;
988                 } else {
989                         RELOC(ram_top) = RELOC(prom_memory_limit);
990                         RELOC(rmo_top) = min(RELOC(rmo_top), RELOC(prom_memory_limit));
991                 }
992         }
993
994         /*
995          * Setup our top alloc point, that is top of RMO or top of
996          * segment 0 when running non-LPAR.
997          * Some RS64 machines have buggy firmware where claims up at
998          * 1GB fail.  Cap at 768MB as a workaround.
999          * Since 768MB is plenty of room, and we need to cap to something
1000          * reasonable on 32-bit, cap at 768MB on all machines.
1001          */
1002         if (!RELOC(rmo_top))
1003                 RELOC(rmo_top) = RELOC(ram_top);
1004         RELOC(rmo_top) = min(0x30000000ul, RELOC(rmo_top));
1005         RELOC(alloc_top) = RELOC(rmo_top);
1006
1007         prom_printf("memory layout at init:\n");
1008         prom_printf("  memory_limit : %x (16 MB aligned)\n", RELOC(prom_memory_limit));
1009         prom_printf("  alloc_bottom : %x\n", RELOC(alloc_bottom));
1010         prom_printf("  alloc_top    : %x\n", RELOC(alloc_top));
1011         prom_printf("  alloc_top_hi : %x\n", RELOC(alloc_top_high));
1012         prom_printf("  rmo_top      : %x\n", RELOC(rmo_top));
1013         prom_printf("  ram_top      : %x\n", RELOC(ram_top));
1014 }
1015
1016
1017 /*
1018  * Allocate room for and instantiate RTAS
1019  */
1020 static void __init prom_instantiate_rtas(void)
1021 {
1022         phandle rtas_node;
1023         ihandle rtas_inst;
1024         u32 base, entry = 0;
1025         u32 size = 0;
1026
1027         prom_debug("prom_instantiate_rtas: start...\n");
1028
1029         rtas_node = call_prom("finddevice", 1, 1, ADDR("/rtas"));
1030         prom_debug("rtas_node: %x\n", rtas_node);
1031         if (!PHANDLE_VALID(rtas_node))
1032                 return;
1033
1034         prom_getprop(rtas_node, "rtas-size", &size, sizeof(size));
1035         if (size == 0)
1036                 return;
1037
1038         base = alloc_down(size, PAGE_SIZE, 0);
1039         if (base == 0) {
1040                 prom_printf("RTAS allocation failed !\n");
1041                 return;
1042         }
1043
1044         rtas_inst = call_prom("open", 1, 1, ADDR("/rtas"));
1045         if (!IHANDLE_VALID(rtas_inst)) {
1046                 prom_printf("opening rtas package failed (%x)\n", rtas_inst);
1047                 return;
1048         }
1049
1050         prom_printf("instantiating rtas at 0x%x ...", base);
1051
1052         if (call_prom_ret("call-method", 3, 2, &entry,
1053                           ADDR("instantiate-rtas"),
1054                           rtas_inst, base) != 0
1055             || entry == 0) {
1056                 prom_printf(" failed\n");
1057                 return;
1058         }
1059         prom_printf(" done\n");
1060
1061         reserve_mem(base, size);
1062
1063         prom_setprop(rtas_node, "/rtas", "linux,rtas-base",
1064                      &base, sizeof(base));
1065         prom_setprop(rtas_node, "/rtas", "linux,rtas-entry",
1066                      &entry, sizeof(entry));
1067
1068         prom_debug("rtas base     = 0x%x\n", base);
1069         prom_debug("rtas entry    = 0x%x\n", entry);
1070         prom_debug("rtas size     = 0x%x\n", (long)size);
1071
1072         prom_debug("prom_instantiate_rtas: end...\n");
1073 }
1074
1075 #ifdef CONFIG_PPC64
1076 /*
1077  * Allocate room for and initialize TCE tables
1078  */
1079 static void __init prom_initialize_tce_table(void)
1080 {
1081         phandle node;
1082         ihandle phb_node;
1083         char compatible[64], type[64], model[64];
1084         char *path = RELOC(prom_scratch);
1085         u64 base, align;
1086         u32 minalign, minsize;
1087         u64 tce_entry, *tce_entryp;
1088         u64 local_alloc_top, local_alloc_bottom;
1089         u64 i;
1090
1091         if (RELOC(ppc64_iommu_off))
1092                 return;
1093
1094         prom_debug("starting prom_initialize_tce_table\n");
1095
1096         /* Cache current top of allocs so we reserve a single block */
1097         local_alloc_top = RELOC(alloc_top_high);
1098         local_alloc_bottom = local_alloc_top;
1099
1100         /* Search all nodes looking for PHBs. */
1101         for (node = 0; prom_next_node(&node); ) {
1102                 compatible[0] = 0;
1103                 type[0] = 0;
1104                 model[0] = 0;
1105                 prom_getprop(node, "compatible",
1106                              compatible, sizeof(compatible));
1107                 prom_getprop(node, "device_type", type, sizeof(type));
1108                 prom_getprop(node, "model", model, sizeof(model));
1109
1110                 if ((type[0] == 0) || (strstr(type, RELOC("pci")) == NULL))
1111                         continue;
1112
1113                 /* Keep the old logic in tack to avoid regression. */
1114                 if (compatible[0] != 0) {
1115                         if ((strstr(compatible, RELOC("python")) == NULL) &&
1116                             (strstr(compatible, RELOC("Speedwagon")) == NULL) &&
1117                             (strstr(compatible, RELOC("Winnipeg")) == NULL))
1118                                 continue;
1119                 } else if (model[0] != 0) {
1120                         if ((strstr(model, RELOC("ython")) == NULL) &&
1121                             (strstr(model, RELOC("peedwagon")) == NULL) &&
1122                             (strstr(model, RELOC("innipeg")) == NULL))
1123                                 continue;
1124                 }
1125
1126                 if (prom_getprop(node, "tce-table-minalign", &minalign,
1127                                  sizeof(minalign)) == PROM_ERROR)
1128                         minalign = 0;
1129                 if (prom_getprop(node, "tce-table-minsize", &minsize,
1130                                  sizeof(minsize)) == PROM_ERROR)
1131                         minsize = 4UL << 20;
1132
1133                 /*
1134                  * Even though we read what OF wants, we just set the table
1135                  * size to 4 MB.  This is enough to map 2GB of PCI DMA space.
1136                  * By doing this, we avoid the pitfalls of trying to DMA to
1137                  * MMIO space and the DMA alias hole.
1138                  *
1139                  * On POWER4, firmware sets the TCE region by assuming
1140                  * each TCE table is 8MB. Using this memory for anything
1141                  * else will impact performance, so we always allocate 8MB.
1142                  * Anton
1143                  */
1144                 if (__is_processor(PV_POWER4) || __is_processor(PV_POWER4p))
1145                         minsize = 8UL << 20;
1146                 else
1147                         minsize = 4UL << 20;
1148
1149                 /* Align to the greater of the align or size */
1150                 align = max(minalign, minsize);
1151                 base = alloc_down(minsize, align, 1);
1152                 if (base == 0)
1153                         prom_panic("ERROR, cannot find space for TCE table.\n");
1154                 if (base < local_alloc_bottom)
1155                         local_alloc_bottom = base;
1156
1157                 /* It seems OF doesn't null-terminate the path :-( */
1158                 memset(path, 0, sizeof(path));
1159                 /* Call OF to setup the TCE hardware */
1160                 if (call_prom("package-to-path", 3, 1, node,
1161                               path, PROM_SCRATCH_SIZE-1) == PROM_ERROR) {
1162                         prom_printf("package-to-path failed\n");
1163                 }
1164
1165                 /* Save away the TCE table attributes for later use. */
1166                 prom_setprop(node, path, "linux,tce-base", &base, sizeof(base));
1167                 prom_setprop(node, path, "linux,tce-size", &minsize, sizeof(minsize));
1168
1169                 prom_debug("TCE table: %s\n", path);
1170                 prom_debug("\tnode = 0x%x\n", node);
1171                 prom_debug("\tbase = 0x%x\n", base);
1172                 prom_debug("\tsize = 0x%x\n", minsize);
1173
1174                 /* Initialize the table to have a one-to-one mapping
1175                  * over the allocated size.
1176                  */
1177                 tce_entryp = (unsigned long *)base;
1178                 for (i = 0; i < (minsize >> 3) ;tce_entryp++, i++) {
1179                         tce_entry = (i << PAGE_SHIFT);
1180                         tce_entry |= 0x3;
1181                         *tce_entryp = tce_entry;
1182                 }
1183
1184                 prom_printf("opening PHB %s", path);
1185                 phb_node = call_prom("open", 1, 1, path);
1186                 if (phb_node == 0)
1187                         prom_printf("... failed\n");
1188                 else
1189                         prom_printf("... done\n");
1190
1191                 call_prom("call-method", 6, 0, ADDR("set-64-bit-addressing"),
1192                           phb_node, -1, minsize,
1193                           (u32) base, (u32) (base >> 32));
1194                 call_prom("close", 1, 0, phb_node);
1195         }
1196
1197         reserve_mem(local_alloc_bottom, local_alloc_top - local_alloc_bottom);
1198
1199         if (RELOC(prom_memory_limit)) {
1200                 /*
1201                  * We align the start to a 16MB boundary so we can map
1202                  * the TCE area using large pages if possible.
1203                  * The end should be the top of RAM so no need to align it.
1204                  */
1205                 RELOC(prom_tce_alloc_start) = _ALIGN_DOWN(local_alloc_bottom,
1206                                                           0x1000000);
1207                 RELOC(prom_tce_alloc_end) = local_alloc_top;
1208         }
1209
1210         /* Flag the first invalid entry */
1211         prom_debug("ending prom_initialize_tce_table\n");
1212 }
1213 #endif
1214
1215 /*
1216  * With CHRP SMP we need to use the OF to start the other processors.
1217  * We can't wait until smp_boot_cpus (the OF is trashed by then)
1218  * so we have to put the processors into a holding pattern controlled
1219  * by the kernel (not OF) before we destroy the OF.
1220  *
1221  * This uses a chunk of low memory, puts some holding pattern
1222  * code there and sends the other processors off to there until
1223  * smp_boot_cpus tells them to do something.  The holding pattern
1224  * checks that address until its cpu # is there, when it is that
1225  * cpu jumps to __secondary_start().  smp_boot_cpus() takes care
1226  * of setting those values.
1227  *
1228  * We also use physical address 0x4 here to tell when a cpu
1229  * is in its holding pattern code.
1230  *
1231  * -- Cort
1232  */
1233 extern void __secondary_hold(void);
1234 extern unsigned long __secondary_hold_spinloop;
1235 extern unsigned long __secondary_hold_acknowledge;
1236
1237 /*
1238  * We want to reference the copy of __secondary_hold_* in the
1239  * 0 - 0x100 address range
1240  */
1241 #define LOW_ADDR(x)     (((unsigned long) &(x)) & 0xff)
1242
1243 static void __init prom_hold_cpus(void)
1244 {
1245         unsigned long i;
1246         unsigned int reg;
1247         phandle node;
1248         char type[64];
1249         int cpuid = 0;
1250         unsigned int interrupt_server[MAX_CPU_THREADS];
1251         unsigned int cpu_threads, hw_cpu_num;
1252         int propsize;
1253         struct prom_t *_prom = &RELOC(prom);
1254         unsigned long *spinloop
1255                 = (void *) LOW_ADDR(__secondary_hold_spinloop);
1256         unsigned long *acknowledge
1257                 = (void *) LOW_ADDR(__secondary_hold_acknowledge);
1258 #ifdef CONFIG_PPC64
1259         /* __secondary_hold is actually a descriptor, not the text address */
1260         unsigned long secondary_hold
1261                 = __pa(*PTRRELOC((unsigned long *)__secondary_hold));
1262 #else
1263         unsigned long secondary_hold = LOW_ADDR(__secondary_hold);
1264 #endif
1265
1266         prom_debug("prom_hold_cpus: start...\n");
1267         prom_debug("    1) spinloop       = 0x%x\n", (unsigned long)spinloop);
1268         prom_debug("    1) *spinloop      = 0x%x\n", *spinloop);
1269         prom_debug("    1) acknowledge    = 0x%x\n",
1270                    (unsigned long)acknowledge);
1271         prom_debug("    1) *acknowledge   = 0x%x\n", *acknowledge);
1272         prom_debug("    1) secondary_hold = 0x%x\n", secondary_hold);
1273
1274         /* Set the common spinloop variable, so all of the secondary cpus
1275          * will block when they are awakened from their OF spinloop.
1276          * This must occur for both SMP and non SMP kernels, since OF will
1277          * be trashed when we move the kernel.
1278          */
1279         *spinloop = 0;
1280
1281 #ifdef CONFIG_HMT
1282         for (i = 0; i < NR_CPUS; i++)
1283                 RELOC(hmt_thread_data)[i].pir = 0xdeadbeef;
1284 #endif
1285         /* look for cpus */
1286         for (node = 0; prom_next_node(&node); ) {
1287                 type[0] = 0;
1288                 prom_getprop(node, "device_type", type, sizeof(type));
1289                 if (strcmp(type, RELOC("cpu")) != 0)
1290                         continue;
1291
1292                 /* Skip non-configured cpus. */
1293                 if (prom_getprop(node, "status", type, sizeof(type)) > 0)
1294                         if (strcmp(type, RELOC("okay")) != 0)
1295                                 continue;
1296
1297                 reg = -1;
1298                 prom_getprop(node, "reg", &reg, sizeof(reg));
1299
1300                 prom_debug("\ncpuid        = 0x%x\n", cpuid);
1301                 prom_debug("cpu hw idx   = 0x%x\n", reg);
1302
1303                 /* Init the acknowledge var which will be reset by
1304                  * the secondary cpu when it awakens from its OF
1305                  * spinloop.
1306                  */
1307                 *acknowledge = (unsigned long)-1;
1308
1309                 propsize = prom_getprop(node, "ibm,ppc-interrupt-server#s",
1310                                         &interrupt_server,
1311                                         sizeof(interrupt_server));
1312                 if (propsize < 0) {
1313                         /* no property.  old hardware has no SMT */
1314                         cpu_threads = 1;
1315                         interrupt_server[0] = reg; /* fake it with phys id */
1316                 } else {
1317                         /* We have a threaded processor */
1318                         cpu_threads = propsize / sizeof(u32);
1319                         if (cpu_threads > MAX_CPU_THREADS) {
1320                                 prom_printf("SMT: too many threads!\n"
1321                                             "SMT: found %x, max is %x\n",
1322                                             cpu_threads, MAX_CPU_THREADS);
1323                                 cpu_threads = 1; /* ToDo: panic? */
1324                         }
1325                 }
1326
1327                 hw_cpu_num = interrupt_server[0];
1328                 if (hw_cpu_num != _prom->cpu) {
1329                         /* Primary Thread of non-boot cpu */
1330                         prom_printf("%x : starting cpu hw idx %x... ", cpuid, reg);
1331                         call_prom("start-cpu", 3, 0, node,
1332                                   secondary_hold, reg);
1333
1334                         for (i = 0; (i < 100000000) && 
1335                              (*acknowledge == ((unsigned long)-1)); i++ )
1336                                 mb();
1337
1338                         if (*acknowledge == reg)
1339                                 prom_printf("done\n");
1340                         else
1341                                 prom_printf("failed: %x\n", *acknowledge);
1342                 }
1343 #ifdef CONFIG_SMP
1344                 else
1345                         prom_printf("%x : boot cpu     %x\n", cpuid, reg);
1346 #endif /* CONFIG_SMP */
1347
1348                 /* Reserve cpu #s for secondary threads.   They start later. */
1349                 cpuid += cpu_threads;
1350         }
1351 #ifdef CONFIG_HMT
1352         /* Only enable HMT on processors that provide support. */
1353         if (__is_processor(PV_PULSAR) || 
1354             __is_processor(PV_ICESTAR) ||
1355             __is_processor(PV_SSTAR)) {
1356                 prom_printf("    starting secondary threads\n");
1357
1358                 for (i = 0; i < NR_CPUS; i += 2) {
1359                         if (!cpu_online(i))
1360                                 continue;
1361
1362                         if (i == 0) {
1363                                 unsigned long pir = mfspr(SPRN_PIR);
1364                                 if (__is_processor(PV_PULSAR)) {
1365                                         RELOC(hmt_thread_data)[i].pir = 
1366                                                 pir & 0x1f;
1367                                 } else {
1368                                         RELOC(hmt_thread_data)[i].pir = 
1369                                                 pir & 0x3ff;
1370                                 }
1371                         }
1372                 }
1373         } else {
1374                 prom_printf("Processor is not HMT capable\n");
1375         }
1376 #endif
1377
1378         if (cpuid > NR_CPUS)
1379                 prom_printf("WARNING: maximum CPUs (" __stringify(NR_CPUS)
1380                             ") exceeded: ignoring extras\n");
1381
1382         prom_debug("prom_hold_cpus: end...\n");
1383 }
1384
1385
1386 static void __init prom_init_client_services(unsigned long pp)
1387 {
1388         struct prom_t *_prom = &RELOC(prom);
1389
1390         /* Get a handle to the prom entry point before anything else */
1391         RELOC(prom_entry) = pp;
1392
1393         /* get a handle for the stdout device */
1394         _prom->chosen = call_prom("finddevice", 1, 1, ADDR("/chosen"));
1395         if (!PHANDLE_VALID(_prom->chosen))
1396                 prom_panic("cannot find chosen"); /* msg won't be printed :( */
1397
1398         /* get device tree root */
1399         _prom->root = call_prom("finddevice", 1, 1, ADDR("/"));
1400         if (!PHANDLE_VALID(_prom->root))
1401                 prom_panic("cannot find device tree root"); /* msg won't be printed :( */
1402
1403         _prom->mmumap = 0;
1404 }
1405
1406 #ifdef CONFIG_PPC32
1407 /*
1408  * For really old powermacs, we need to map things we claim.
1409  * For that, we need the ihandle of the mmu.
1410  * Also, on the longtrail, we need to work around other bugs.
1411  */
1412 static void __init prom_find_mmu(void)
1413 {
1414         struct prom_t *_prom = &RELOC(prom);
1415         phandle oprom;
1416         char version[64];
1417
1418         oprom = call_prom("finddevice", 1, 1, ADDR("/openprom"));
1419         if (!PHANDLE_VALID(oprom))
1420                 return;
1421         if (prom_getprop(oprom, "model", version, sizeof(version)) <= 0)
1422                 return;
1423         version[sizeof(version) - 1] = 0;
1424         /* XXX might need to add other versions here */
1425         if (strcmp(version, "Open Firmware, 1.0.5") == 0)
1426                 of_workarounds = OF_WA_CLAIM;
1427         else if (strncmp(version, "FirmWorks,3.", 12) == 0) {
1428                 of_workarounds = OF_WA_CLAIM | OF_WA_LONGTRAIL;
1429                 call_prom("interpret", 1, 1, "dev /memory 0 to allow-reclaim");
1430         } else
1431                 return;
1432         _prom->memory = call_prom("open", 1, 1, ADDR("/memory"));
1433         prom_getprop(_prom->chosen, "mmu", &_prom->mmumap,
1434                      sizeof(_prom->mmumap));
1435         if (!IHANDLE_VALID(_prom->memory) || !IHANDLE_VALID(_prom->mmumap))
1436                 of_workarounds &= ~OF_WA_CLAIM;         /* hmmm */
1437 }
1438 #else
1439 #define prom_find_mmu()
1440 #endif
1441
1442 static void __init prom_init_stdout(void)
1443 {
1444         struct prom_t *_prom = &RELOC(prom);
1445         char *path = RELOC(of_stdout_device);
1446         char type[16];
1447         u32 val;
1448
1449         if (prom_getprop(_prom->chosen, "stdout", &val, sizeof(val)) <= 0)
1450                 prom_panic("cannot find stdout");
1451
1452         _prom->stdout = val;
1453
1454         /* Get the full OF pathname of the stdout device */
1455         memset(path, 0, 256);
1456         call_prom("instance-to-path", 3, 1, _prom->stdout, path, 255);
1457         val = call_prom("instance-to-package", 1, 1, _prom->stdout);
1458         prom_setprop(_prom->chosen, "/chosen", "linux,stdout-package",
1459                      &val, sizeof(val));
1460         prom_printf("OF stdout device is: %s\n", RELOC(of_stdout_device));
1461         prom_setprop(_prom->chosen, "/chosen", "linux,stdout-path",
1462                      path, strlen(path) + 1);
1463
1464         /* If it's a display, note it */
1465         memset(type, 0, sizeof(type));
1466         prom_getprop(val, "device_type", type, sizeof(type));
1467         if (strcmp(type, RELOC("display")) == 0)
1468                 prom_setprop(val, path, "linux,boot-display", NULL, 0);
1469 }
1470
1471 static void __init prom_close_stdin(void)
1472 {
1473         struct prom_t *_prom = &RELOC(prom);
1474         ihandle val;
1475
1476         if (prom_getprop(_prom->chosen, "stdin", &val, sizeof(val)) > 0)
1477                 call_prom("close", 1, 0, val);
1478 }
1479
1480 static int __init prom_find_machine_type(void)
1481 {
1482         struct prom_t *_prom = &RELOC(prom);
1483         char compat[256];
1484         int len, i = 0;
1485 #ifdef CONFIG_PPC64
1486         phandle rtas;
1487 #endif
1488         len = prom_getprop(_prom->root, "compatible",
1489                            compat, sizeof(compat)-1);
1490         if (len > 0) {
1491                 compat[len] = 0;
1492                 while (i < len) {
1493                         char *p = &compat[i];
1494                         int sl = strlen(p);
1495                         if (sl == 0)
1496                                 break;
1497                         if (strstr(p, RELOC("Power Macintosh")) ||
1498                             strstr(p, RELOC("MacRISC")))
1499                                 return PLATFORM_POWERMAC;
1500 #ifdef CONFIG_PPC64
1501                         if (strstr(p, RELOC("Momentum,Maple")))
1502                                 return PLATFORM_MAPLE;
1503 #endif
1504                         i += sl + 1;
1505                 }
1506         }
1507 #ifdef CONFIG_PPC64
1508         /* Default to pSeries. We need to know if we are running LPAR */
1509         rtas = call_prom("finddevice", 1, 1, ADDR("/rtas"));
1510         if (PHANDLE_VALID(rtas)) {
1511                 int x = prom_getproplen(rtas, "ibm,hypertas-functions");
1512                 if (x != PROM_ERROR) {
1513                         prom_printf("Hypertas detected, assuming LPAR !\n");
1514                         return PLATFORM_PSERIES_LPAR;
1515                 }
1516         }
1517         return PLATFORM_PSERIES;
1518 #else
1519         return PLATFORM_CHRP;
1520 #endif
1521 }
1522
1523 static int __init prom_set_color(ihandle ih, int i, int r, int g, int b)
1524 {
1525         return call_prom("call-method", 6, 1, ADDR("color!"), ih, i, b, g, r);
1526 }
1527
1528 /*
1529  * If we have a display that we don't know how to drive,
1530  * we will want to try to execute OF's open method for it
1531  * later.  However, OF will probably fall over if we do that
1532  * we've taken over the MMU.
1533  * So we check whether we will need to open the display,
1534  * and if so, open it now.
1535  */
1536 static void __init prom_check_displays(void)
1537 {
1538         char type[16], *path;
1539         phandle node;
1540         ihandle ih;
1541         int i;
1542
1543         static unsigned char default_colors[] = {
1544                 0x00, 0x00, 0x00,
1545                 0x00, 0x00, 0xaa,
1546                 0x00, 0xaa, 0x00,
1547                 0x00, 0xaa, 0xaa,
1548                 0xaa, 0x00, 0x00,
1549                 0xaa, 0x00, 0xaa,
1550                 0xaa, 0xaa, 0x00,
1551                 0xaa, 0xaa, 0xaa,
1552                 0x55, 0x55, 0x55,
1553                 0x55, 0x55, 0xff,
1554                 0x55, 0xff, 0x55,
1555                 0x55, 0xff, 0xff,
1556                 0xff, 0x55, 0x55,
1557                 0xff, 0x55, 0xff,
1558                 0xff, 0xff, 0x55,
1559                 0xff, 0xff, 0xff
1560         };
1561         const unsigned char *clut;
1562
1563         prom_printf("Looking for displays\n");
1564         for (node = 0; prom_next_node(&node); ) {
1565                 memset(type, 0, sizeof(type));
1566                 prom_getprop(node, "device_type", type, sizeof(type));
1567                 if (strcmp(type, RELOC("display")) != 0)
1568                         continue;
1569
1570                 /* It seems OF doesn't null-terminate the path :-( */
1571                 path = RELOC(prom_scratch);
1572                 memset(path, 0, PROM_SCRATCH_SIZE);
1573
1574                 /*
1575                  * leave some room at the end of the path for appending extra
1576                  * arguments
1577                  */
1578                 if (call_prom("package-to-path", 3, 1, node, path,
1579                               PROM_SCRATCH_SIZE-10) == PROM_ERROR)
1580                         continue;
1581                 prom_printf("found display   : %s, opening ... ", path);
1582                 
1583                 ih = call_prom("open", 1, 1, path);
1584                 if (ih == 0) {
1585                         prom_printf("failed\n");
1586                         continue;
1587                 }
1588
1589                 /* Success */
1590                 prom_printf("done\n");
1591                 prom_setprop(node, path, "linux,opened", NULL, 0);
1592
1593                 /* Setup a usable color table when the appropriate
1594                  * method is available. Should update this to set-colors */
1595                 clut = RELOC(default_colors);
1596                 for (i = 0; i < 32; i++, clut += 3)
1597                         if (prom_set_color(ih, i, clut[0], clut[1],
1598                                            clut[2]) != 0)
1599                                 break;
1600
1601 #ifdef CONFIG_LOGO_LINUX_CLUT224
1602                 clut = PTRRELOC(RELOC(logo_linux_clut224.clut));
1603                 for (i = 0; i < RELOC(logo_linux_clut224.clutsize); i++, clut += 3)
1604                         if (prom_set_color(ih, i + 32, clut[0], clut[1],
1605                                            clut[2]) != 0)
1606                                 break;
1607 #endif /* CONFIG_LOGO_LINUX_CLUT224 */
1608         }
1609 }
1610
1611
1612 /* Return (relocated) pointer to this much memory: moves initrd if reqd. */
1613 static void __init *make_room(unsigned long *mem_start, unsigned long *mem_end,
1614                               unsigned long needed, unsigned long align)
1615 {
1616         void *ret;
1617
1618         *mem_start = _ALIGN(*mem_start, align);
1619         while ((*mem_start + needed) > *mem_end) {
1620                 unsigned long room, chunk;
1621
1622                 prom_debug("Chunk exhausted, claiming more at %x...\n",
1623                            RELOC(alloc_bottom));
1624                 room = RELOC(alloc_top) - RELOC(alloc_bottom);
1625                 if (room > DEVTREE_CHUNK_SIZE)
1626                         room = DEVTREE_CHUNK_SIZE;
1627                 if (room < PAGE_SIZE)
1628                         prom_panic("No memory for flatten_device_tree (no room)");
1629                 chunk = alloc_up(room, 0);
1630                 if (chunk == 0)
1631                         prom_panic("No memory for flatten_device_tree (claim failed)");
1632                 *mem_end = RELOC(alloc_top);
1633         }
1634
1635         ret = (void *)*mem_start;
1636         *mem_start += needed;
1637
1638         return ret;
1639 }
1640
1641 #define dt_push_token(token, mem_start, mem_end) \
1642         do { *((u32 *)make_room(mem_start, mem_end, 4, 4)) = token; } while(0)
1643
1644 static unsigned long __init dt_find_string(char *str)
1645 {
1646         char *s, *os;
1647
1648         s = os = (char *)RELOC(dt_string_start);
1649         s += 4;
1650         while (s <  (char *)RELOC(dt_string_end)) {
1651                 if (strcmp(s, str) == 0)
1652                         return s - os;
1653                 s += strlen(s) + 1;
1654         }
1655         return 0;
1656 }
1657
1658 /*
1659  * The Open Firmware 1275 specification states properties must be 31 bytes or
1660  * less, however not all firmwares obey this. Make it 64 bytes to be safe.
1661  */
1662 #define MAX_PROPERTY_NAME 64
1663
1664 static void __init scan_dt_build_strings(phandle node,
1665                                          unsigned long *mem_start,
1666                                          unsigned long *mem_end)
1667 {
1668         char *prev_name, *namep, *sstart;
1669         unsigned long soff;
1670         phandle child;
1671
1672         sstart =  (char *)RELOC(dt_string_start);
1673
1674         /* get and store all property names */
1675         prev_name = RELOC("");
1676         for (;;) {
1677                 /* 64 is max len of name including nul. */
1678                 namep = make_room(mem_start, mem_end, MAX_PROPERTY_NAME, 1);
1679                 if (call_prom("nextprop", 3, 1, node, prev_name, namep) != 1) {
1680                         /* No more nodes: unwind alloc */
1681                         *mem_start = (unsigned long)namep;
1682                         break;
1683                 }
1684
1685                 /* skip "name" */
1686                 if (strcmp(namep, RELOC("name")) == 0) {
1687                         *mem_start = (unsigned long)namep;
1688                         prev_name = RELOC("name");
1689                         continue;
1690                 }
1691                 /* get/create string entry */
1692                 soff = dt_find_string(namep);
1693                 if (soff != 0) {
1694                         *mem_start = (unsigned long)namep;
1695                         namep = sstart + soff;
1696                 } else {
1697                         /* Trim off some if we can */
1698                         *mem_start = (unsigned long)namep + strlen(namep) + 1;
1699                         RELOC(dt_string_end) = *mem_start;
1700                 }
1701                 prev_name = namep;
1702         }
1703
1704         /* do all our children */
1705         child = call_prom("child", 1, 1, node);
1706         while (child != 0) {
1707                 scan_dt_build_strings(child, mem_start, mem_end);
1708                 child = call_prom("peer", 1, 1, child);
1709         }
1710 }
1711
1712 static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
1713                                         unsigned long *mem_end)
1714 {
1715         phandle child;
1716         char *namep, *prev_name, *sstart, *p, *ep, *lp, *path;
1717         unsigned long soff;
1718         unsigned char *valp;
1719         static char pname[MAX_PROPERTY_NAME];
1720         int l, room;
1721
1722         dt_push_token(OF_DT_BEGIN_NODE, mem_start, mem_end);
1723
1724         /* get the node's full name */
1725         namep = (char *)*mem_start;
1726         room = *mem_end - *mem_start;
1727         if (room > 255)
1728                 room = 255;
1729         l = call_prom("package-to-path", 3, 1, node, namep, room);
1730         if (l >= 0) {
1731                 /* Didn't fit?  Get more room. */
1732                 if (l >= room) {
1733                         if (l >= *mem_end - *mem_start)
1734                                 namep = make_room(mem_start, mem_end, l+1, 1);
1735                         call_prom("package-to-path", 3, 1, node, namep, l);
1736                 }
1737                 namep[l] = '\0';
1738
1739                 /* Fixup an Apple bug where they have bogus \0 chars in the
1740                  * middle of the path in some properties, and extract
1741                  * the unit name (everything after the last '/').
1742                  */
1743                 for (lp = p = namep, ep = namep + l; p < ep; p++) {
1744                         if (*p == '/')
1745                                 lp = namep;
1746                         else if (*p != 0)
1747                                 *lp++ = *p;
1748                 }
1749                 *lp = 0;
1750                 *mem_start = _ALIGN((unsigned long)lp + 1, 4);
1751         }
1752
1753         /* get it again for debugging */
1754         path = RELOC(prom_scratch);
1755         memset(path, 0, PROM_SCRATCH_SIZE);
1756         call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1);
1757
1758         /* get and store all properties */
1759         prev_name = RELOC("");
1760         sstart = (char *)RELOC(dt_string_start);
1761         for (;;) {
1762                 if (call_prom("nextprop", 3, 1, node, prev_name,
1763                               RELOC(pname)) != 1)
1764                         break;
1765
1766                 /* skip "name" */
1767                 if (strcmp(RELOC(pname), RELOC("name")) == 0) {
1768                         prev_name = RELOC("name");
1769                         continue;
1770                 }
1771
1772                 /* find string offset */
1773                 soff = dt_find_string(RELOC(pname));
1774                 if (soff == 0) {
1775                         prom_printf("WARNING: Can't find string index for"
1776                                     " <%s>, node %s\n", RELOC(pname), path);
1777                         break;
1778                 }
1779                 prev_name = sstart + soff;
1780
1781                 /* get length */
1782                 l = call_prom("getproplen", 2, 1, node, RELOC(pname));
1783
1784                 /* sanity checks */
1785                 if (l == PROM_ERROR)
1786                         continue;
1787                 if (l > MAX_PROPERTY_LENGTH) {
1788                         prom_printf("WARNING: ignoring large property ");
1789                         /* It seems OF doesn't null-terminate the path :-( */
1790                         prom_printf("[%s] ", path);
1791                         prom_printf("%s length 0x%x\n", RELOC(pname), l);
1792                         continue;
1793                 }
1794
1795                 /* push property head */
1796                 dt_push_token(OF_DT_PROP, mem_start, mem_end);
1797                 dt_push_token(l, mem_start, mem_end);
1798                 dt_push_token(soff, mem_start, mem_end);
1799
1800                 /* push property content */
1801                 valp = make_room(mem_start, mem_end, l, 4);
1802                 call_prom("getprop", 4, 1, node, RELOC(pname), valp, l);
1803                 *mem_start = _ALIGN(*mem_start, 4);
1804         }
1805
1806         /* Add a "linux,phandle" property. */
1807         soff = dt_find_string(RELOC("linux,phandle"));
1808         if (soff == 0)
1809                 prom_printf("WARNING: Can't find string index for"
1810                             " <linux-phandle> node %s\n", path);
1811         else {
1812                 dt_push_token(OF_DT_PROP, mem_start, mem_end);
1813                 dt_push_token(4, mem_start, mem_end);
1814                 dt_push_token(soff, mem_start, mem_end);
1815                 valp = make_room(mem_start, mem_end, 4, 4);
1816                 *(u32 *)valp = node;
1817         }
1818
1819         /* do all our children */
1820         child = call_prom("child", 1, 1, node);
1821         while (child != 0) {
1822                 scan_dt_build_struct(child, mem_start, mem_end);
1823                 child = call_prom("peer", 1, 1, child);
1824         }
1825
1826         dt_push_token(OF_DT_END_NODE, mem_start, mem_end);
1827 }
1828
1829 static void __init flatten_device_tree(void)
1830 {
1831         phandle root;
1832         unsigned long mem_start, mem_end, room;
1833         struct boot_param_header *hdr;
1834         struct prom_t *_prom = &RELOC(prom);
1835         char *namep;
1836         u64 *rsvmap;
1837
1838         /*
1839          * Check how much room we have between alloc top & bottom (+/- a
1840          * few pages), crop to 4Mb, as this is our "chuck" size
1841          */
1842         room = RELOC(alloc_top) - RELOC(alloc_bottom) - 0x4000;
1843         if (room > DEVTREE_CHUNK_SIZE)
1844                 room = DEVTREE_CHUNK_SIZE;
1845         prom_debug("starting device tree allocs at %x\n", RELOC(alloc_bottom));
1846
1847         /* Now try to claim that */
1848         mem_start = (unsigned long)alloc_up(room, PAGE_SIZE);
1849         if (mem_start == 0)
1850                 prom_panic("Can't allocate initial device-tree chunk\n");
1851         mem_end = RELOC(alloc_top);
1852
1853         /* Get root of tree */
1854         root = call_prom("peer", 1, 1, (phandle)0);
1855         if (root == (phandle)0)
1856                 prom_panic ("couldn't get device tree root\n");
1857
1858         /* Build header and make room for mem rsv map */ 
1859         mem_start = _ALIGN(mem_start, 4);
1860         hdr = make_room(&mem_start, &mem_end,
1861                         sizeof(struct boot_param_header), 4);
1862         RELOC(dt_header_start) = (unsigned long)hdr;
1863         rsvmap = make_room(&mem_start, &mem_end, sizeof(mem_reserve_map), 8);
1864
1865         /* Start of strings */
1866         mem_start = PAGE_ALIGN(mem_start);
1867         RELOC(dt_string_start) = mem_start;
1868         mem_start += 4; /* hole */
1869
1870         /* Add "linux,phandle" in there, we'll need it */
1871         namep = make_room(&mem_start, &mem_end, 16, 1);
1872         strcpy(namep, RELOC("linux,phandle"));
1873         mem_start = (unsigned long)namep + strlen(namep) + 1;
1874
1875         /* Build string array */
1876         prom_printf("Building dt strings...\n"); 
1877         scan_dt_build_strings(root, &mem_start, &mem_end);
1878         RELOC(dt_string_end) = mem_start;
1879
1880         /* Build structure */
1881         mem_start = PAGE_ALIGN(mem_start);
1882         RELOC(dt_struct_start) = mem_start;
1883         prom_printf("Building dt structure...\n"); 
1884         scan_dt_build_struct(root, &mem_start, &mem_end);
1885         dt_push_token(OF_DT_END, &mem_start, &mem_end);
1886         RELOC(dt_struct_end) = PAGE_ALIGN(mem_start);
1887
1888         /* Finish header */
1889         hdr->boot_cpuid_phys = _prom->cpu;
1890         hdr->magic = OF_DT_HEADER;
1891         hdr->totalsize = RELOC(dt_struct_end) - RELOC(dt_header_start);
1892         hdr->off_dt_struct = RELOC(dt_struct_start) - RELOC(dt_header_start);
1893         hdr->off_dt_strings = RELOC(dt_string_start) - RELOC(dt_header_start);
1894         hdr->dt_strings_size = RELOC(dt_string_end) - RELOC(dt_string_start);
1895         hdr->off_mem_rsvmap = ((unsigned long)rsvmap) - RELOC(dt_header_start);
1896         hdr->version = OF_DT_VERSION;
1897         /* Version 16 is not backward compatible */
1898         hdr->last_comp_version = 0x10;
1899
1900         /* Reserve the whole thing and copy the reserve map in, we
1901          * also bump mem_reserve_cnt to cause further reservations to
1902          * fail since it's too late.
1903          */
1904         reserve_mem(RELOC(dt_header_start), hdr->totalsize);
1905         memcpy(rsvmap, RELOC(mem_reserve_map), sizeof(mem_reserve_map));
1906
1907 #ifdef DEBUG_PROM
1908         {
1909                 int i;
1910                 prom_printf("reserved memory map:\n");
1911                 for (i = 0; i < RELOC(mem_reserve_cnt); i++)
1912                         prom_printf("  %x - %x\n",
1913                                     RELOC(mem_reserve_map)[i].base,
1914                                     RELOC(mem_reserve_map)[i].size);
1915         }
1916 #endif
1917         RELOC(mem_reserve_cnt) = MEM_RESERVE_MAP_SIZE;
1918
1919         prom_printf("Device tree strings 0x%x -> 0x%x\n",
1920                     RELOC(dt_string_start), RELOC(dt_string_end)); 
1921         prom_printf("Device tree struct  0x%x -> 0x%x\n",
1922                     RELOC(dt_struct_start), RELOC(dt_struct_end));
1923
1924 }
1925
1926
1927 static void __init fixup_device_tree(void)
1928 {
1929 #if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC)
1930         phandle u3, i2c, mpic;
1931         u32 u3_rev;
1932         u32 interrupts[2];
1933         u32 parent;
1934
1935         /* Some G5s have a missing interrupt definition, fix it up here */
1936         u3 = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000"));
1937         if (!PHANDLE_VALID(u3))
1938                 return;
1939         i2c = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/i2c@f8001000"));
1940         if (!PHANDLE_VALID(i2c))
1941                 return;
1942         mpic = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/mpic@f8040000"));
1943         if (!PHANDLE_VALID(mpic))
1944                 return;
1945
1946         /* check if proper rev of u3 */
1947         if (prom_getprop(u3, "device-rev", &u3_rev, sizeof(u3_rev))
1948             == PROM_ERROR)
1949                 return;
1950         if (u3_rev < 0x35 || u3_rev > 0x39)
1951                 return;
1952         /* does it need fixup ? */
1953         if (prom_getproplen(i2c, "interrupts") > 0)
1954                 return;
1955
1956         prom_printf("fixing up bogus interrupts for u3 i2c...\n");
1957
1958         /* interrupt on this revision of u3 is number 0 and level */
1959         interrupts[0] = 0;
1960         interrupts[1] = 1;
1961         prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupts",
1962                      &interrupts, sizeof(interrupts));
1963         parent = (u32)mpic;
1964         prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupt-parent",
1965                      &parent, sizeof(parent));
1966 #endif
1967 }
1968
1969
1970 static void __init prom_find_boot_cpu(void)
1971 {
1972         struct prom_t *_prom = &RELOC(prom);
1973         u32 getprop_rval;
1974         ihandle prom_cpu;
1975         phandle cpu_pkg;
1976
1977         _prom->cpu = 0;
1978         if (prom_getprop(_prom->chosen, "cpu", &prom_cpu, sizeof(prom_cpu)) <= 0)
1979                 return;
1980
1981         cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu);
1982
1983         prom_getprop(cpu_pkg, "reg", &getprop_rval, sizeof(getprop_rval));
1984         _prom->cpu = getprop_rval;
1985
1986         prom_debug("Booting CPU hw index = 0x%x\n", _prom->cpu);
1987 }
1988
1989 static void __init prom_check_initrd(unsigned long r3, unsigned long r4)
1990 {
1991 #ifdef CONFIG_BLK_DEV_INITRD
1992         struct prom_t *_prom = &RELOC(prom);
1993
1994         if (r3 && r4 && r4 != 0xdeadbeef) {
1995                 unsigned long val;
1996
1997                 RELOC(prom_initrd_start) = (r3 >= KERNELBASE) ? __pa(r3) : r3;
1998                 RELOC(prom_initrd_end) = RELOC(prom_initrd_start) + r4;
1999
2000                 val = RELOC(prom_initrd_start);
2001                 prom_setprop(_prom->chosen, "/chosen", "linux,initrd-start",
2002                              &val, sizeof(val));
2003                 val = RELOC(prom_initrd_end);
2004                 prom_setprop(_prom->chosen, "/chosen", "linux,initrd-end",
2005                              &val, sizeof(val));
2006
2007                 reserve_mem(RELOC(prom_initrd_start),
2008                             RELOC(prom_initrd_end) - RELOC(prom_initrd_start));
2009
2010                 prom_debug("initrd_start=0x%x\n", RELOC(prom_initrd_start));
2011                 prom_debug("initrd_end=0x%x\n", RELOC(prom_initrd_end));
2012         }
2013 #endif /* CONFIG_BLK_DEV_INITRD */
2014 }
2015
2016 /*
2017  * We enter here early on, when the Open Firmware prom is still
2018  * handling exceptions and the MMU hash table for us.
2019  */
2020
2021 unsigned long __init prom_init(unsigned long r3, unsigned long r4,
2022                                unsigned long pp,
2023                                unsigned long r6, unsigned long r7)
2024 {       
2025         struct prom_t *_prom;
2026         unsigned long hdr;
2027         u32 getprop_rval;
2028         unsigned long offset = reloc_offset();
2029
2030 #ifdef CONFIG_PPC32
2031         reloc_got2(offset);
2032 #endif
2033
2034         _prom = &RELOC(prom);
2035
2036         /*
2037          * First zero the BSS
2038          */
2039         memset(&RELOC(__bss_start), 0, __bss_stop - __bss_start);
2040
2041         /*
2042          * Init interface to Open Firmware, get some node references,
2043          * like /chosen
2044          */
2045         prom_init_client_services(pp);
2046
2047         /*
2048          * See if this OF is old enough that we need to do explicit maps
2049          * and other workarounds
2050          */
2051         prom_find_mmu();
2052
2053         /*
2054          * Init prom stdout device
2055          */
2056         prom_init_stdout();
2057
2058         /*
2059          * Check for an initrd
2060          */
2061         prom_check_initrd(r3, r4);
2062
2063         /*
2064          * Get default machine type. At this point, we do not differentiate
2065          * between pSeries SMP and pSeries LPAR
2066          */
2067         RELOC(of_platform) = prom_find_machine_type();
2068         getprop_rval = RELOC(of_platform);
2069         prom_setprop(_prom->chosen, "/chosen", "linux,platform",
2070                      &getprop_rval, sizeof(getprop_rval));
2071
2072 #ifdef CONFIG_PPC_PSERIES
2073         /*
2074          * On pSeries, inform the firmware about our capabilities
2075          */
2076         if (RELOC(of_platform) == PLATFORM_PSERIES ||
2077             RELOC(of_platform) == PLATFORM_PSERIES_LPAR)
2078                 prom_send_capabilities();
2079 #endif
2080
2081         /*
2082          * Copy the CPU hold code
2083          */
2084         if (RELOC(of_platform) != PLATFORM_POWERMAC)
2085                 copy_and_flush(0, KERNELBASE + offset, 0x100, 0);
2086
2087         /*
2088          * Do early parsing of command line
2089          */
2090         early_cmdline_parse();
2091
2092         /*
2093          * Initialize memory management within prom_init
2094          */
2095         prom_init_mem();
2096
2097         /*
2098          * Determine which cpu is actually running right _now_
2099          */
2100         prom_find_boot_cpu();
2101
2102         /* 
2103          * Initialize display devices
2104          */
2105         prom_check_displays();
2106
2107 #ifdef CONFIG_PPC64
2108         /*
2109          * Initialize IOMMU (TCE tables) on pSeries. Do that before anything else
2110          * that uses the allocator, we need to make sure we get the top of memory
2111          * available for us here...
2112          */
2113         if (RELOC(of_platform) == PLATFORM_PSERIES)
2114                 prom_initialize_tce_table();
2115 #endif
2116
2117         /*
2118          * On non-powermacs, try to instantiate RTAS and puts all CPUs
2119          * in spin-loops. PowerMacs don't have a working RTAS and use
2120          * a different way to spin CPUs
2121          */
2122         if (RELOC(of_platform) != PLATFORM_POWERMAC) {
2123                 prom_instantiate_rtas();
2124                 prom_hold_cpus();
2125         }
2126
2127         /*
2128          * Fill in some infos for use by the kernel later on
2129          */
2130         if (RELOC(prom_memory_limit))
2131                 prom_setprop(_prom->chosen, "/chosen", "linux,memory-limit",
2132                              &RELOC(prom_memory_limit),
2133                              sizeof(prom_memory_limit));
2134 #ifdef CONFIG_PPC64
2135         if (RELOC(ppc64_iommu_off))
2136                 prom_setprop(_prom->chosen, "/chosen", "linux,iommu-off",
2137                              NULL, 0);
2138
2139         if (RELOC(iommu_force_on))
2140                 prom_setprop(_prom->chosen, "/chosen", "linux,iommu-force-on",
2141                              NULL, 0);
2142
2143         if (RELOC(prom_tce_alloc_start)) {
2144                 prom_setprop(_prom->chosen, "/chosen", "linux,tce-alloc-start",
2145                              &RELOC(prom_tce_alloc_start),
2146                              sizeof(prom_tce_alloc_start));
2147                 prom_setprop(_prom->chosen, "/chosen", "linux,tce-alloc-end",
2148                              &RELOC(prom_tce_alloc_end),
2149                              sizeof(prom_tce_alloc_end));
2150         }
2151 #endif
2152
2153         /*
2154          * Fixup any known bugs in the device-tree
2155          */
2156         fixup_device_tree();
2157
2158         /*
2159          * Now finally create the flattened device-tree
2160          */
2161         prom_printf("copying OF device tree ...\n");
2162         flatten_device_tree();
2163
2164         /*
2165          * in case stdin is USB and still active on IBM machines...
2166          * Unfortunately quiesce crashes on some powermacs if we have
2167          * closed stdin already (in particular the powerbook 101).
2168          */
2169         if (RELOC(of_platform) != PLATFORM_POWERMAC)
2170                 prom_close_stdin();
2171
2172         /*
2173          * Call OF "quiesce" method to shut down pending DMA's from
2174          * devices etc...
2175          */
2176         prom_printf("Calling quiesce ...\n");
2177         call_prom("quiesce", 0, 0);
2178
2179         /*
2180          * And finally, call the kernel passing it the flattened device
2181          * tree and NULL as r5, thus triggering the new entry point which
2182          * is common to us and kexec
2183          */
2184         hdr = RELOC(dt_header_start);
2185         prom_printf("returning from prom_init\n");
2186         prom_debug("->dt_header_start=0x%x\n", hdr);
2187
2188 #ifdef CONFIG_PPC32
2189         reloc_got2(-offset);
2190 #endif
2191
2192         __start(hdr, KERNELBASE + offset, 0);
2193
2194         return 0;
2195 }