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