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