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