[NETLINK]: w1_int.c: fix default netlink group
[linux-2.6/verdex.git] / arch / ppc64 / kernel / prom_init.c
blobdbbe6c79d8dac4f1b5a370380635aa36a7b57912
1 /*
2 *
4 * Procedures for interfacing to Open Firmware.
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
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.
18 #undef DEBUG_PROM
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>
54 #ifdef CONFIG_LOGO_LINUX_CLUT224
55 #include <linux/linux_logo.h>
56 extern const struct linux_logo logo_linux_clut224;
57 #endif
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.
65 #define MAX_PROPERTY_LENGTH (1UL * 1024 * 1024)
68 * Eventually bump that one up
70 #define DEVTREE_CHUNK_SIZE 0x100000
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
79 #define MEM_RESERVE_MAP_SIZE 8
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.)
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.
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.
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)
109 #ifdef DEBUG_PROM
110 #define prom_debug(x...) prom_printf(x)
111 #else
112 #define prom_debug(x...)
113 #endif
116 typedef u32 prom_arg_t;
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]. */
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;
139 struct pci_reg_property {
140 struct pci_address addr;
141 u32 size_hi;
142 u32 size_lo;
145 struct mem_map_entry {
146 u64 base;
147 u64 size;
150 typedef u32 cell_t;
152 extern void __start(unsigned long r3, unsigned long r4, unsigned long r5);
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);
158 extern unsigned long klimit;
160 /* prom structure */
161 static struct prom_t __initdata prom;
163 #define PROM_SCRATCH_SIZE 256
165 static char __initdata of_stdout_device[256];
166 static char __initdata prom_scratch[PROM_SCRATCH_SIZE];
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;
172 static unsigned long __initdata prom_initrd_start, prom_initrd_end;
174 static int __initdata iommu_force_on;
175 static int __initdata ppc64_iommu_off;
176 static int __initdata of_platform;
178 static char __initdata prom_cmd_line[COMMAND_LINE_SIZE];
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;
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;
190 static struct mem_map_entry __initdata mem_reserve_map[MEM_RESERVE_MAP_SIZE];
191 static int __initdata mem_reserve_cnt;
193 static cell_t __initdata regbuf[1024];
196 #define MAX_CPU_THREADS 2
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 */
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).
212 #define ADDR(x) (u32) ((unsigned long)(x) - offset)
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
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)
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.
231 static int __init call_prom(const char *service, int nargs, int nret, ...)
233 int i;
234 unsigned long offset = reloc_offset();
235 struct prom_t *_prom = PTRRELOC(&prom);
236 va_list list;
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]);
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);
248 for (i=0; i < nret ;i++)
249 _prom->args.rets[i] = 0;
251 enter_prom(&_prom->args, _prom->entry);
253 return (nret > 0) ? _prom->args.rets[0] : 0;
257 static unsigned int __init prom_claim(unsigned long virt, unsigned long size,
258 unsigned long align)
260 return (unsigned int)call_prom("claim", 3, 1,
261 (prom_arg_t)virt, (prom_arg_t)size,
262 (prom_arg_t)align);
265 static void __init prom_print(const char *msg)
267 const char *p, *q;
268 unsigned long offset = reloc_offset();
269 struct prom_t *_prom = PTRRELOC(&prom);
271 if (_prom->stdout == 0)
272 return;
274 for (p = msg; *p != 0; p = q) {
275 for (q = p; *q != 0 && *q != '\n'; ++q)
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);
287 static void __init prom_print_hex(unsigned long val)
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);
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;
300 buf[nibbles] = '\0';
301 call_prom("write", 3, 1, _prom->stdout, buf, nibbles);
305 static void __init prom_printf(const char *format, ...)
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);
313 va_start(args, format);
314 for (p = PTRRELOC(format); *p != 0; p = q) {
315 for (q = p; *q != 0 && *q != '\n' && *q != '%'; ++q)
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;
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;
346 static void __init __attribute__((noreturn)) prom_panic(const char *reason)
348 unsigned long offset = reloc_offset();
350 prom_print(PTRRELOC(reason));
351 /* ToDo: should put up an SRC here */
352 call_prom("exit", 0, 0);
354 for (;;) /* should never get here */
359 static int __init prom_next_node(phandle *nodep)
361 phandle node;
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;
376 static int __init prom_getprop(phandle node, const char *pname,
377 void *value, size_t valuelen)
379 unsigned long offset = reloc_offset();
381 return call_prom("getprop", 4, 1, node, ADDR(pname),
382 (u32)(unsigned long) value, (u32) valuelen);
385 static int __init prom_getproplen(phandle node, const char *pname)
387 unsigned long offset = reloc_offset();
389 return call_prom("getproplen", 2, 1, node, ADDR(pname));
392 static int __init prom_setprop(phandle node, const char *pname,
393 void *value, size_t valuelen)
395 unsigned long offset = reloc_offset();
397 return call_prom("setprop", 4, 1, node, ADDR(pname),
398 (u32)(unsigned long) value, (u32) valuelen);
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'))
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))
410 unsigned long prom_strtoul(const char *cp, const char **endp)
412 unsigned long result = 0, base = 10, value;
414 if (*cp == '0') {
415 base = 8;
416 cp++;
417 if (toupper(*cp) == 'X') {
418 cp++;
419 base = 16;
423 while (isxdigit(*cp) &&
424 (value = isdigit(*cp) ? *cp - '0' : toupper(*cp) - 'A' + 10) < base) {
425 result = result * base + value;
426 cp++;
429 if (endp)
430 *endp = cp;
432 return result;
435 unsigned long prom_memparse(const char *ptr, const char **retptr)
437 unsigned long ret = prom_strtoul(ptr, retptr);
438 int shift = 0;
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.
445 if ('G' == **retptr || 'g' == **retptr)
446 shift = 30;
448 if ('M' == **retptr || 'm' == **retptr)
449 shift = 20;
451 if ('K' == **retptr || 'k' == **retptr)
452 shift = 10;
454 if (shift) {
455 ret <<= shift;
456 (*retptr)++;
459 return ret;
463 * Early parsing of the command line passed to the kernel, used for
464 * "mem=x" and the options that affect the iommu
466 static void __init early_cmdline_parse(void)
468 unsigned long offset = reloc_offset();
469 struct prom_t *_prom = PTRRELOC(&prom);
470 char *opt, *p;
471 int l = 0;
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));
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;
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);
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.
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
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)
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
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
596 static void __init prom_send_capabilities(void)
598 unsigned long offset = reloc_offset();
599 ihandle elfloader;
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;
606 call_prom("call-method", 3, 1, ADDR("process-elf-header"),
607 elfloader, ADDR(&fake_elf));
608 call_prom("close", 1, 0, elfloader);
612 * Memory allocation strategy... our layout is normally:
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.
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
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
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.
633 * Allocates memory in the RMO upward from the kernel/initrd
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
639 static unsigned long __init alloc_up(unsigned long size, unsigned long align)
641 unsigned long offset = reloc_offset();
642 unsigned long base = _ALIGN_UP(RELOC(alloc_bottom), align);
643 unsigned long addr = 0;
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");
649 if (align)
650 base = _ALIGN_UP(RELOC(alloc_bottom), align);
651 else
652 base = RELOC(alloc_bottom);
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;
664 if (addr == 0)
665 return 0;
666 RELOC(alloc_bottom) = addr;
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));
675 return addr;
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.
683 static unsigned long __init alloc_down(unsigned long size, unsigned long align,
684 int highmem)
686 unsigned long offset = reloc_offset();
687 unsigned long base, addr = 0;
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");
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 !
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;
711 RELOC(alloc_top_high) = addr;
713 goto bail;
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;
724 if (addr == 0)
725 return 0;
726 RELOC(alloc_top) = addr;
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));
736 return addr;
740 * Parse a "reg" cell
742 static unsigned long __init prom_next_cell(int s, cell_t **cellp)
744 cell_t *p = *cellp;
745 unsigned long r = 0;
747 /* Ignore more than 2 cells */
748 while (s > 2) {
749 p++;
750 s--;
752 while (s) {
753 r <<= 32;
754 r |= *(p++);
755 s--;
758 *cellp = p;
759 return r;
763 * Very dumb function for adding to the memory reserve list, but
764 * we don't need anything smarter at this point
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.
770 static void reserve_mem(unsigned long base, unsigned long size)
772 unsigned long offset = reloc_offset();
773 unsigned long top = base + size;
774 unsigned long cnt = RELOC(mem_reserve_cnt);
776 if (size == 0)
777 return;
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
783 base = _ALIGN_DOWN(base, PAGE_SIZE);
784 top = _ALIGN_UP(top, PAGE_SIZE);
785 size = top - base;
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;
795 * Initialize memory allocation mecanism, parse "memory" nodes and
796 * obtain that way the top of memory and RMO to setup out local allocator
798 static void __init prom_init_mem(void)
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);
808 * We iterate the memory nodes to find
809 * 1) top of RMO (first node)
810 * 2) top of memory
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);
815 prom_debug("scanning memory:\n");
816 path = RELOC(prom_scratch);
818 for (node = 0; prom_next_node(&node); ) {
819 type[0] = 0;
820 prom_getprop(node, "device_type", type, sizeof(type));
822 if (strcmp(type, RELOC("memory")))
823 continue;
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);
830 p = RELOC(regbuf);
831 endp = p + (plen / sizeof(cell_t));
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 */
839 while ((endp - p) >= (_prom->root_addr_cells + _prom->root_size_cells)) {
840 unsigned long base, size;
842 base = prom_next_cell(_prom->root_addr_cells, &p);
843 size = prom_next_cell(_prom->root_size_cells, &p);
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;
855 RELOC(alloc_bottom) = PAGE_ALIGN(RELOC(klimit) - offset + 0x4000);
857 /* Check if we have an initrd after the kernel, if we do move our bottom
858 * point to after it
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));
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.
871 RELOC(alloc_top_high) = RELOC(ram_top);
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));
889 * Setup our top alloc point, that is top of RMO or top of
890 * segment 0 when running non-LPAR.
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));
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));
908 * Allocate room for and instanciate RTAS
910 static void __init prom_instantiate_rtas(void)
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;
919 prom_debug("prom_instantiate_rtas: start...\n");
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;
926 prom_getprop(rtas_node, "rtas-size", &size, sizeof(size));
927 if (size == 0)
928 return;
930 base = alloc_down(size, PAGE_SIZE, 0);
931 if (base == 0) {
932 prom_printf("RTAS allocation failed !\n");
933 return;
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;
942 prom_printf("instantiating rtas at 0x%x ...", base);
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];
949 if (entry == 0) {
950 prom_printf(" failed\n");
951 return;
953 prom_printf(" done\n");
955 reserve_mem(base, size);
957 prom_setprop(rtas_node, "linux,rtas-base", &base, sizeof(base));
958 prom_setprop(rtas_node, "linux,rtas-entry", &entry, sizeof(entry));
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);
964 prom_debug("prom_instantiate_rtas: end...\n");
969 * Allocate room for and initialize TCE tables
971 static void __init prom_initialize_tce_table(void)
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;
984 if (RELOC(ppc64_iommu_off))
985 return;
987 prom_debug("starting prom_initialize_tce_table\n");
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;
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));
1003 if ((type[0] == 0) || (strstr(type, RELOC("pci")) == NULL))
1004 continue;
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;
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;
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.
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
1037 if (__is_processor(PV_POWER4) || __is_processor(PV_POWER4p))
1038 minsize = 8UL << 20;
1039 else
1040 minsize = 4UL << 20;
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;
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));
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");
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);
1067 /* Initialize the table to have a one-to-one mapping
1068 * over the allocated size.
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;
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");
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);
1090 reserve_mem(local_alloc_bottom, local_alloc_top - local_alloc_bottom);
1092 if (RELOC(prom_memory_limit)) {
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.
1098 RELOC(prom_tce_alloc_start) = _ALIGN_DOWN(local_alloc_bottom, 0x1000000);
1099 RELOC(prom_tce_alloc_end) = local_alloc_top;
1102 /* Flag the first invalid entry */
1103 prom_debug("ending prom_initialize_tce_table\n");
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.
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.
1120 * We also use physical address 0x4 here to tell when a cpu
1121 * is in its holding pattern code.
1123 * Fixup comment... DRENG / PPPBBB - Peter
1125 * -- Cort
1127 static void __init prom_hold_cpus(void)
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);
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);
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.
1162 *spinloop = 0;
1164 #ifdef CONFIG_HMT
1165 for (i=0; i < NR_CPUS; i++) {
1166 RELOC(hmt_thread_data)[i].pir = 0xdeadbeef;
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;
1176 /* Skip non-configured cpus. */
1177 if (prom_getprop(node, "status", type, sizeof(type)) > 0)
1178 if (strcmp(type, RELOC("okay")) != 0)
1179 continue;
1181 reg = -1;
1182 prom_getprop(node, "reg", &reg, sizeof(reg));
1184 prom_debug("\ncpuid = 0x%x\n", cpuid);
1185 prom_debug("cpu hw idx = 0x%x\n", reg);
1187 /* Init the acknowledge var which will be reset by
1188 * the secondary cpu when it awakens from its OF
1189 * spinloop.
1191 *acknowledge = (unsigned long)-1;
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? */
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);
1218 for ( i = 0 ; (i < 100000000) &&
1219 (*acknowledge == ((unsigned long)-1)); i++ )
1220 mb();
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);
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;
1244 #endif /* CONFIG_SMP */
1245 cpuid++;
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");
1254 for (i = 0; i < NR_CPUS; i += 2) {
1255 if (!cpu_online(i))
1256 continue;
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;
1269 } else {
1270 prom_printf("Processor is not HMT capable\n");
1272 #endif
1274 if (cpuid > NR_CPUS)
1275 prom_printf("WARNING: maximum CPUs (" __stringify(NR_CPUS)
1276 ") exceeded: ignoring extras\n");
1278 prom_debug("prom_hold_cpus: end...\n");
1282 static void __init prom_init_client_services(unsigned long pp)
1284 unsigned long offset = reloc_offset();
1285 struct prom_t *_prom = PTRRELOC(&prom);
1287 /* Get a handle to the prom entry point before anything else */
1288 _prom->entry = pp;
1290 /* Init default value for phys size */
1291 _prom->root_size_cells = 1;
1292 _prom->root_addr_cells = 2;
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 :( */
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 :( */
1305 static void __init prom_init_stdout(void)
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;
1313 if (prom_getprop(_prom->chosen, "stdout", &val, sizeof(val)) <= 0)
1314 prom_panic("cannot find stdout");
1316 _prom->stdout = val;
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);
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);
1336 static void __init prom_close_stdin(void)
1338 unsigned long offset = reloc_offset();
1339 struct prom_t *_prom = PTRRELOC(&prom);
1340 ihandle val;
1342 if (prom_getprop(_prom->chosen, "stdin", &val, sizeof(val)) > 0)
1343 call_prom("close", 1, 0, val);
1346 static int __init prom_find_machine_type(void)
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;
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;
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;
1380 return PLATFORM_PSERIES;
1383 static int __init prom_set_color(ihandle ih, int i, int r, int g, int b)
1385 unsigned long offset = reloc_offset();
1387 return call_prom("call-method", 6, 1, ADDR("color!"), ih, i, b, g, r);
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.
1398 static void __init prom_check_displays(void)
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;
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
1425 const unsigned char *clut;
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;
1434 /* It seems OF doesn't null-terminate the path :-( */
1435 path = RELOC(prom_scratch);
1436 memset(path, 0, PROM_SCRATCH_SIZE);
1439 * leave some room at the end of the path for appending extra
1440 * arguments
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);
1447 ih = call_prom("open", 1, 1, path);
1448 if (ih == 0) {
1449 prom_printf("failed\n");
1450 continue;
1453 /* Success */
1454 prom_printf("done\n");
1455 prom_setprop(node, "linux,opened", NULL, 0);
1458 * stdout wasn't a display node, pick the first we can find
1459 * for btext
1461 if (_prom->disp_node == 0)
1462 _prom->disp_node = node;
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;
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 */
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)
1487 unsigned long offset = reloc_offset();
1488 void *ret;
1490 *mem_start = _ALIGN(*mem_start, align);
1491 while ((*mem_start + needed) > *mem_end) {
1492 unsigned long room, chunk;
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);
1507 ret = (void *)*mem_start;
1508 *mem_start += needed;
1510 return ret;
1513 #define dt_push_token(token, mem_start, mem_end) \
1514 do { *((u32 *)make_room(mem_start, mem_end, 4, 4)) = token; } while(0)
1516 static unsigned long __init dt_find_string(char *str)
1518 unsigned long offset = reloc_offset();
1519 char *s, *os;
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;
1528 return 0;
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.
1535 #define MAX_PROPERTY_NAME 64
1537 static void __init scan_dt_build_strings(phandle node, unsigned long *mem_start,
1538 unsigned long *mem_end)
1540 unsigned long offset = reloc_offset();
1541 char *prev_name, *namep, *sstart;
1542 unsigned long soff;
1543 phandle child;
1545 sstart = (char *)RELOC(dt_string_start);
1547 /* get and store all property names */
1548 prev_name = RELOC("");
1549 for (;;) {
1550 int rc;
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;
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;
1569 prev_name = namep;
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);
1580 static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
1581 unsigned long *mem_end)
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;
1592 path = RELOC(prom_scratch);
1594 dt_push_token(OF_DT_BEGIN_NODE, mem_start, mem_end);
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);
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
1610 for (p = namep, ep = namep + l; p < ep; p++)
1611 if (*p == '\0') {
1612 memmove(p, p+1, ep - p);
1613 ep--; l--;
1615 *mem_start = _ALIGN(((unsigned long) namep) + strlen(namep) + 1, 4);
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);
1622 /* get and store all properties */
1623 prev_name = RELOC("");
1624 sstart = (char *)RELOC(dt_string_start);
1625 for (;;) {
1626 int rc;
1628 rc = call_prom("nextprop", 3, 1, node, prev_name, pname);
1629 if (rc != 1)
1630 break;
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;
1639 prev_name = sstart + soff;
1641 /* get length */
1642 l = call_prom("getproplen", 2, 1, node, pname);
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;
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);
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);
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;
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);
1687 dt_push_token(OF_DT_END_NODE, mem_start, mem_end);
1690 static void __init flatten_device_tree(void)
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;
1700 * Check how much room we have between alloc top & bottom (+/- a
1701 * few pages), crop to 4Mb, as this is our "chuck" size
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));
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);
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");
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);
1725 /* Start of strings */
1726 mem_start = PAGE_ALIGN(mem_start);
1727 RELOC(dt_string_start) = mem_start;
1728 mem_start += 4; /* hole */
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;
1736 /* Build string array */
1737 prom_printf("Building dt strings...\n");
1738 scan_dt_build_strings(root, &mem_start, &mem_end);
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);
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;
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.
1761 reserve_mem(RELOC(dt_header_start), hdr->totalsize);
1762 memcpy(rsvmap, RELOC(mem_reserve_map), sizeof(mem_reserve_map));
1764 #ifdef DEBUG_PROM
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);
1772 #endif
1773 RELOC(mem_reserve_cnt) = MEM_RESERVE_MAP_SIZE;
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));
1783 static void __init fixup_device_tree(void)
1785 unsigned long offset = reloc_offset();
1786 phandle u3, i2c, mpic;
1787 u32 u3_rev;
1788 u32 interrupts[2];
1789 u32 parent;
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;
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 && u3_rev != 0x37)
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));
1820 static void __init prom_find_boot_cpu(void)
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;
1828 if (prom_getprop(_prom->chosen, "cpu", &prom_cpu, sizeof(prom_cpu)) <= 0)
1829 prom_panic("cannot find boot cpu");
1831 cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu);
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;
1837 prom_debug("Booting CPU hw index = 0x%x\n", _prom->cpu);
1840 static void __init prom_check_initrd(unsigned long r3, unsigned long r4)
1842 #ifdef CONFIG_BLK_DEV_INITRD
1843 unsigned long offset = reloc_offset();
1844 struct prom_t *_prom = PTRRELOC(&prom);
1846 if ( r3 && r4 && r4 != 0xdeadbeef) {
1847 u64 val;
1849 RELOC(prom_initrd_start) = (r3 >= KERNELBASE) ? __pa(r3) : r3;
1850 RELOC(prom_initrd_end) = RELOC(prom_initrd_start) + r4;
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));
1857 reserve_mem(RELOC(prom_initrd_start),
1858 RELOC(prom_initrd_end) - RELOC(prom_initrd_start));
1860 prom_debug("initrd_start=0x%x\n", RELOC(prom_initrd_start));
1861 prom_debug("initrd_end=0x%x\n", RELOC(prom_initrd_end));
1863 #endif /* CONFIG_BLK_DEV_INITRD */
1867 * We enter here early on, when the Open Firmware prom is still
1868 * handling exceptions and the MMU hash table for us.
1871 unsigned long __init prom_init(unsigned long r3, unsigned long r4, unsigned long pp,
1872 unsigned long r6, unsigned long r7)
1874 unsigned long offset = reloc_offset();
1875 struct prom_t *_prom = PTRRELOC(&prom);
1876 unsigned long phys = KERNELBASE - offset;
1877 u32 getprop_rval;
1880 * First zero the BSS
1882 memset(PTRRELOC(&__bss_start), 0, __bss_stop - __bss_start);
1885 * Init interface to Open Firmware, get some node references,
1886 * like /chosen
1888 prom_init_client_services(pp);
1891 * Init prom stdout device
1893 prom_init_stdout();
1894 prom_debug("klimit=0x%x\n", RELOC(klimit));
1895 prom_debug("offset=0x%x\n", offset);
1898 * Check for an initrd
1900 prom_check_initrd(r3, r4);
1903 * Get default machine type. At this point, we do not differenciate
1904 * between pSeries SMP and pSeries LPAR
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));
1912 * On pSeries, inform the firmware about our capabilities
1914 if (RELOC(of_platform) & PLATFORM_PSERIES)
1915 prom_send_capabilities();
1918 * On pSeries and BPA, copy the CPU hold code
1920 if (RELOC(of_platform) & (PLATFORM_PSERIES | PLATFORM_BPA))
1921 copy_and_flush(0, KERNELBASE - offset, 0x100, 0);
1924 * Get memory cells format
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;
1936 * Do early parsing of command line
1938 early_cmdline_parse();
1941 * Initialize memory management within prom_init
1943 prom_init_mem();
1946 * Determine which cpu is actually running right _now_
1948 prom_find_boot_cpu();
1951 * Initialize display devices
1953 prom_check_displays();
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...
1960 if (RELOC(of_platform) == PLATFORM_PSERIES)
1961 prom_initialize_tce_table();
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
1968 if (RELOC(of_platform) != PLATFORM_POWERMAC) {
1969 prom_instantiate_rtas();
1970 prom_hold_cpus();
1974 * Fill in some infos for use by the kernel later on
1976 if (RELOC(ppc64_iommu_off))
1977 prom_setprop(_prom->chosen, "linux,iommu-off", NULL, 0);
1979 if (RELOC(iommu_force_on))
1980 prom_setprop(_prom->chosen, "linux,iommu-force-on", NULL, 0);
1982 if (RELOC(prom_memory_limit))
1983 prom_setprop(_prom->chosen, "linux,memory-limit",
1984 PTRRELOC(&prom_memory_limit), sizeof(RELOC(prom_memory_limit)));
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)));
1994 * Fixup any known bugs in the device-tree
1996 fixup_device_tree();
1999 * Now finally create the flattened device-tree
2001 prom_printf("copying OF device tree ...\n");
2002 flatten_device_tree();
2004 /* in case stdin is USB and still active on IBM machines... */
2005 prom_close_stdin();
2008 * Call OF "quiesce" method to shut down pending DMA's from
2009 * devices etc...
2011 prom_printf("Calling quiesce ...\n");
2012 call_prom("quiesce", 0, 0);
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
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);
2023 __start(RELOC(dt_header_start), phys, 0);
2025 return 0;