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