xref: /openbmc/linux/arch/powerpc/kernel/prom_init.c (revision 384740dc)
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/kernel.h>
20 #include <linux/string.h>
21 #include <linux/init.h>
22 #include <linux/threads.h>
23 #include <linux/spinlock.h>
24 #include <linux/types.h>
25 #include <linux/pci.h>
26 #include <linux/proc_fs.h>
27 #include <linux/stringify.h>
28 #include <linux/delay.h>
29 #include <linux/initrd.h>
30 #include <linux/bitops.h>
31 #include <asm/prom.h>
32 #include <asm/rtas.h>
33 #include <asm/page.h>
34 #include <asm/processor.h>
35 #include <asm/irq.h>
36 #include <asm/io.h>
37 #include <asm/smp.h>
38 #include <asm/system.h>
39 #include <asm/mmu.h>
40 #include <asm/pgtable.h>
41 #include <asm/pci.h>
42 #include <asm/iommu.h>
43 #include <asm/btext.h>
44 #include <asm/sections.h>
45 #include <asm/machdep.h>
46 
47 #ifdef CONFIG_LOGO_LINUX_CLUT224
48 #include <linux/linux_logo.h>
49 extern const struct linux_logo logo_linux_clut224;
50 #endif
51 
52 /*
53  * Properties whose value is longer than this get excluded from our
54  * copy of the device tree. This value does need to be big enough to
55  * ensure that we don't lose things like the interrupt-map property
56  * on a PCI-PCI bridge.
57  */
58 #define MAX_PROPERTY_LENGTH	(1UL * 1024 * 1024)
59 
60 /*
61  * Eventually bump that one up
62  */
63 #define DEVTREE_CHUNK_SIZE	0x100000
64 
65 /*
66  * This is the size of the local memory reserve map that gets copied
67  * into the boot params passed to the kernel. That size is totally
68  * flexible as the kernel just reads the list until it encounters an
69  * entry with size 0, so it can be changed without breaking binary
70  * compatibility
71  */
72 #define MEM_RESERVE_MAP_SIZE	8
73 
74 /*
75  * prom_init() is called very early on, before the kernel text
76  * and data have been mapped to KERNELBASE.  At this point the code
77  * is running at whatever address it has been loaded at.
78  * On ppc32 we compile with -mrelocatable, which means that references
79  * to extern and static variables get relocated automatically.
80  * On ppc64 we have to relocate the references explicitly with
81  * RELOC.  (Note that strings count as static variables.)
82  *
83  * Because OF may have mapped I/O devices into the area starting at
84  * KERNELBASE, particularly on CHRP machines, we can't safely call
85  * OF once the kernel has been mapped to KERNELBASE.  Therefore all
86  * OF calls must be done within prom_init().
87  *
88  * ADDR is used in calls to call_prom.  The 4th and following
89  * arguments to call_prom should be 32-bit values.
90  * On ppc64, 64 bit values are truncated to 32 bits (and
91  * fortunately don't get interpreted as two arguments).
92  */
93 #ifdef CONFIG_PPC64
94 #define RELOC(x)        (*PTRRELOC(&(x)))
95 #define ADDR(x)		(u32) add_reloc_offset((unsigned long)(x))
96 #define OF_WORKAROUNDS	0
97 #else
98 #define RELOC(x)	(x)
99 #define ADDR(x)		(u32) (x)
100 #define OF_WORKAROUNDS	of_workarounds
101 int of_workarounds;
102 #endif
103 
104 #define OF_WA_CLAIM	1	/* do phys/virt claim separately, then map */
105 #define OF_WA_LONGTRAIL	2	/* work around longtrail bugs */
106 
107 #define PROM_BUG() do {						\
108         prom_printf("kernel BUG at %s line 0x%x!\n",		\
109 		    RELOC(__FILE__), __LINE__);			\
110         __asm__ __volatile__(".long " BUG_ILLEGAL_INSTR);	\
111 } while (0)
112 
113 #ifdef DEBUG_PROM
114 #define prom_debug(x...)	prom_printf(x)
115 #else
116 #define prom_debug(x...)
117 #endif
118 
119 
120 typedef u32 prom_arg_t;
121 
122 struct prom_args {
123         u32 service;
124         u32 nargs;
125         u32 nret;
126         prom_arg_t args[10];
127 };
128 
129 struct prom_t {
130 	ihandle root;
131 	phandle chosen;
132 	int cpu;
133 	ihandle stdout;
134 	ihandle mmumap;
135 	ihandle memory;
136 };
137 
138 struct mem_map_entry {
139 	u64	base;
140 	u64	size;
141 };
142 
143 typedef u32 cell_t;
144 
145 extern void __start(unsigned long r3, unsigned long r4, unsigned long r5);
146 
147 #ifdef CONFIG_PPC64
148 extern int enter_prom(struct prom_args *args, unsigned long entry);
149 #else
150 static inline int enter_prom(struct prom_args *args, unsigned long entry)
151 {
152 	return ((int (*)(struct prom_args *))entry)(args);
153 }
154 #endif
155 
156 extern void copy_and_flush(unsigned long dest, unsigned long src,
157 			   unsigned long size, unsigned long offset);
158 
159 /* prom structure */
160 static struct prom_t __initdata prom;
161 
162 static unsigned long prom_entry __initdata;
163 
164 #define PROM_SCRATCH_SIZE 256
165 
166 static char __initdata of_stdout_device[256];
167 static char __initdata prom_scratch[PROM_SCRATCH_SIZE];
168 
169 static unsigned long __initdata dt_header_start;
170 static unsigned long __initdata dt_struct_start, dt_struct_end;
171 static unsigned long __initdata dt_string_start, dt_string_end;
172 
173 static unsigned long __initdata prom_initrd_start, prom_initrd_end;
174 
175 #ifdef CONFIG_PPC64
176 static int __initdata prom_iommu_force_on;
177 static int __initdata prom_iommu_off;
178 static unsigned long __initdata prom_tce_alloc_start;
179 static unsigned long __initdata prom_tce_alloc_end;
180 #endif
181 
182 /* Platforms codes are now obsolete in the kernel. Now only used within this
183  * file and ultimately gone too. Feel free to change them if you need, they
184  * are not shared with anything outside of this file anymore
185  */
186 #define PLATFORM_PSERIES	0x0100
187 #define PLATFORM_PSERIES_LPAR	0x0101
188 #define PLATFORM_LPAR		0x0001
189 #define PLATFORM_POWERMAC	0x0400
190 #define PLATFORM_GENERIC	0x0500
191 
192 static int __initdata of_platform;
193 
194 static char __initdata prom_cmd_line[COMMAND_LINE_SIZE];
195 
196 static unsigned long __initdata alloc_top;
197 static unsigned long __initdata alloc_top_high;
198 static unsigned long __initdata alloc_bottom;
199 static unsigned long __initdata rmo_top;
200 static unsigned long __initdata ram_top;
201 
202 static struct mem_map_entry __initdata mem_reserve_map[MEM_RESERVE_MAP_SIZE];
203 static int __initdata mem_reserve_cnt;
204 
205 static cell_t __initdata regbuf[1024];
206 
207 
208 /*
209  * Error results ... some OF calls will return "-1" on error, some
210  * will return 0, some will return either. To simplify, here are
211  * macros to use with any ihandle or phandle return value to check if
212  * it is valid
213  */
214 
215 #define PROM_ERROR		(-1u)
216 #define PHANDLE_VALID(p)	((p) != 0 && (p) != PROM_ERROR)
217 #define IHANDLE_VALID(i)	((i) != 0 && (i) != PROM_ERROR)
218 
219 
220 /* This is the one and *ONLY* place where we actually call open
221  * firmware.
222  */
223 
224 static int __init call_prom(const char *service, int nargs, int nret, ...)
225 {
226 	int i;
227 	struct prom_args args;
228 	va_list list;
229 
230 	args.service = ADDR(service);
231 	args.nargs = nargs;
232 	args.nret = nret;
233 
234 	va_start(list, nret);
235 	for (i = 0; i < nargs; i++)
236 		args.args[i] = va_arg(list, prom_arg_t);
237 	va_end(list);
238 
239 	for (i = 0; i < nret; i++)
240 		args.args[nargs+i] = 0;
241 
242 	if (enter_prom(&args, RELOC(prom_entry)) < 0)
243 		return PROM_ERROR;
244 
245 	return (nret > 0) ? args.args[nargs] : 0;
246 }
247 
248 static 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 		args.args[nargs+i] = 0;
266 
267 	if (enter_prom(&args, RELOC(prom_entry)) < 0)
268 		return PROM_ERROR;
269 
270 	if (rets != NULL)
271 		for (i = 1; i < nret; ++i)
272 			rets[i-1] = args.args[nargs+i];
273 
274 	return (nret > 0) ? args.args[nargs] : 0;
275 }
276 
277 
278 static 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 
299 static 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 
316 static 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 
359 static unsigned int __init prom_claim(unsigned long virt, unsigned long size,
360 				unsigned long align)
361 {
362 	struct prom_t *_prom = &RELOC(prom);
363 
364 	if (align == 0 && (OF_WORKAROUNDS & OF_WA_CLAIM)) {
365 		/*
366 		 * Old OF requires we claim physical and virtual separately
367 		 * and then map explicitly (assuming virtual mode)
368 		 */
369 		int ret;
370 		prom_arg_t result;
371 
372 		ret = call_prom_ret("call-method", 5, 2, &result,
373 				    ADDR("claim"), _prom->memory,
374 				    align, size, virt);
375 		if (ret != 0 || result == -1)
376 			return -1;
377 		ret = call_prom_ret("call-method", 5, 2, &result,
378 				    ADDR("claim"), _prom->mmumap,
379 				    align, size, virt);
380 		if (ret != 0) {
381 			call_prom("call-method", 4, 1, ADDR("release"),
382 				  _prom->memory, size, virt);
383 			return -1;
384 		}
385 		/* the 0x12 is M (coherence) + PP == read/write */
386 		call_prom("call-method", 6, 1,
387 			  ADDR("map"), _prom->mmumap, 0x12, size, virt, virt);
388 		return virt;
389 	}
390 	return call_prom("claim", 3, 1, (prom_arg_t)virt, (prom_arg_t)size,
391 			 (prom_arg_t)align);
392 }
393 
394 static void __init __attribute__((noreturn)) prom_panic(const char *reason)
395 {
396 #ifdef CONFIG_PPC64
397 	reason = PTRRELOC(reason);
398 #endif
399 	prom_print(reason);
400 	/* Do not call exit because it clears the screen on pmac
401 	 * it also causes some sort of double-fault on early pmacs */
402 	if (RELOC(of_platform) == PLATFORM_POWERMAC)
403 		asm("trap\n");
404 
405 	/* ToDo: should put up an SRC here on p/iSeries */
406 	call_prom("exit", 0, 0);
407 
408 	for (;;)			/* should never get here */
409 		;
410 }
411 
412 
413 static int __init prom_next_node(phandle *nodep)
414 {
415 	phandle node;
416 
417 	if ((node = *nodep) != 0
418 	    && (*nodep = call_prom("child", 1, 1, node)) != 0)
419 		return 1;
420 	if ((*nodep = call_prom("peer", 1, 1, node)) != 0)
421 		return 1;
422 	for (;;) {
423 		if ((node = call_prom("parent", 1, 1, node)) == 0)
424 			return 0;
425 		if ((*nodep = call_prom("peer", 1, 1, node)) != 0)
426 			return 1;
427 	}
428 }
429 
430 static int inline prom_getprop(phandle node, const char *pname,
431 			       void *value, size_t valuelen)
432 {
433 	return call_prom("getprop", 4, 1, node, ADDR(pname),
434 			 (u32)(unsigned long) value, (u32) valuelen);
435 }
436 
437 static int inline prom_getproplen(phandle node, const char *pname)
438 {
439 	return call_prom("getproplen", 2, 1, node, ADDR(pname));
440 }
441 
442 static void add_string(char **str, const char *q)
443 {
444 	char *p = *str;
445 
446 	while (*q)
447 		*p++ = *q++;
448 	*p++ = ' ';
449 	*str = p;
450 }
451 
452 static char *tohex(unsigned int x)
453 {
454 	static char digits[] = "0123456789abcdef";
455 	static char result[9];
456 	int i;
457 
458 	result[8] = 0;
459 	i = 8;
460 	do {
461 		--i;
462 		result[i] = digits[x & 0xf];
463 		x >>= 4;
464 	} while (x != 0 && i > 0);
465 	return &result[i];
466 }
467 
468 static int __init prom_setprop(phandle node, const char *nodename,
469 			       const char *pname, void *value, size_t valuelen)
470 {
471 	char cmd[256], *p;
472 
473 	if (!(OF_WORKAROUNDS & OF_WA_LONGTRAIL))
474 		return call_prom("setprop", 4, 1, node, ADDR(pname),
475 				 (u32)(unsigned long) value, (u32) valuelen);
476 
477 	/* gah... setprop doesn't work on longtrail, have to use interpret */
478 	p = cmd;
479 	add_string(&p, "dev");
480 	add_string(&p, nodename);
481 	add_string(&p, tohex((u32)(unsigned long) value));
482 	add_string(&p, tohex(valuelen));
483 	add_string(&p, tohex(ADDR(pname)));
484 	add_string(&p, tohex(strlen(RELOC(pname))));
485 	add_string(&p, "property");
486 	*p = 0;
487 	return call_prom("interpret", 1, 1, (u32)(unsigned long) cmd);
488 }
489 
490 /* We can't use the standard versions because of RELOC headaches. */
491 #define isxdigit(c)	(('0' <= (c) && (c) <= '9') \
492 			 || ('a' <= (c) && (c) <= 'f') \
493 			 || ('A' <= (c) && (c) <= 'F'))
494 
495 #define isdigit(c)	('0' <= (c) && (c) <= '9')
496 #define islower(c)	('a' <= (c) && (c) <= 'z')
497 #define toupper(c)	(islower(c) ? ((c) - 'a' + 'A') : (c))
498 
499 unsigned long prom_strtoul(const char *cp, const char **endp)
500 {
501 	unsigned long result = 0, base = 10, value;
502 
503 	if (*cp == '0') {
504 		base = 8;
505 		cp++;
506 		if (toupper(*cp) == 'X') {
507 			cp++;
508 			base = 16;
509 		}
510 	}
511 
512 	while (isxdigit(*cp) &&
513 	       (value = isdigit(*cp) ? *cp - '0' : toupper(*cp) - 'A' + 10) < base) {
514 		result = result * base + value;
515 		cp++;
516 	}
517 
518 	if (endp)
519 		*endp = cp;
520 
521 	return result;
522 }
523 
524 unsigned long prom_memparse(const char *ptr, const char **retptr)
525 {
526 	unsigned long ret = prom_strtoul(ptr, retptr);
527 	int shift = 0;
528 
529 	/*
530 	 * We can't use a switch here because GCC *may* generate a
531 	 * jump table which won't work, because we're not running at
532 	 * the address we're linked at.
533 	 */
534 	if ('G' == **retptr || 'g' == **retptr)
535 		shift = 30;
536 
537 	if ('M' == **retptr || 'm' == **retptr)
538 		shift = 20;
539 
540 	if ('K' == **retptr || 'k' == **retptr)
541 		shift = 10;
542 
543 	if (shift) {
544 		ret <<= shift;
545 		(*retptr)++;
546 	}
547 
548 	return ret;
549 }
550 
551 /*
552  * Early parsing of the command line passed to the kernel, used for
553  * "mem=x" and the options that affect the iommu
554  */
555 static void __init early_cmdline_parse(void)
556 {
557 	struct prom_t *_prom = &RELOC(prom);
558 #ifdef CONFIG_PPC64
559 	const char *opt;
560 #endif
561 	char *p;
562 	int l = 0;
563 
564 	RELOC(prom_cmd_line[0]) = 0;
565 	p = RELOC(prom_cmd_line);
566 	if ((long)_prom->chosen > 0)
567 		l = prom_getprop(_prom->chosen, "bootargs", p, COMMAND_LINE_SIZE-1);
568 #ifdef CONFIG_CMDLINE
569 	if (l <= 0 || p[0] == '\0') /* dbl check */
570 		strlcpy(RELOC(prom_cmd_line),
571 			RELOC(CONFIG_CMDLINE), sizeof(prom_cmd_line));
572 #endif /* CONFIG_CMDLINE */
573 	prom_printf("command line: %s\n", RELOC(prom_cmd_line));
574 
575 #ifdef CONFIG_PPC64
576 	opt = strstr(RELOC(prom_cmd_line), RELOC("iommu="));
577 	if (opt) {
578 		prom_printf("iommu opt is: %s\n", opt);
579 		opt += 6;
580 		while (*opt && *opt == ' ')
581 			opt++;
582 		if (!strncmp(opt, RELOC("off"), 3))
583 			RELOC(prom_iommu_off) = 1;
584 		else if (!strncmp(opt, RELOC("force"), 5))
585 			RELOC(prom_iommu_force_on) = 1;
586 	}
587 #endif
588 }
589 
590 #ifdef CONFIG_PPC_PSERIES
591 /*
592  * There are two methods for telling firmware what our capabilities are.
593  * Newer machines have an "ibm,client-architecture-support" method on the
594  * root node.  For older machines, we have to call the "process-elf-header"
595  * method in the /packages/elf-loader node, passing it a fake 32-bit
596  * ELF header containing a couple of PT_NOTE sections that contain
597  * structures that contain various information.
598  */
599 
600 /*
601  * New method - extensible architecture description vector.
602  *
603  * Because the description vector contains a mix of byte and word
604  * values, we declare it as an unsigned char array, and use this
605  * macro to put word values in.
606  */
607 #define W(x)	((x) >> 24) & 0xff, ((x) >> 16) & 0xff, \
608 		((x) >> 8) & 0xff, (x) & 0xff
609 
610 /* Option vector bits - generic bits in byte 1 */
611 #define OV_IGNORE		0x80	/* ignore this vector */
612 #define OV_CESSATION_POLICY	0x40	/* halt if unsupported option present*/
613 
614 /* Option vector 1: processor architectures supported */
615 #define OV1_PPC_2_00		0x80	/* set if we support PowerPC 2.00 */
616 #define OV1_PPC_2_01		0x40	/* set if we support PowerPC 2.01 */
617 #define OV1_PPC_2_02		0x20	/* set if we support PowerPC 2.02 */
618 #define OV1_PPC_2_03		0x10	/* set if we support PowerPC 2.03 */
619 #define OV1_PPC_2_04		0x08	/* set if we support PowerPC 2.04 */
620 #define OV1_PPC_2_05		0x04	/* set if we support PowerPC 2.05 */
621 #define OV1_PPC_2_06		0x02	/* set if we support PowerPC 2.06 */
622 
623 /* Option vector 2: Open Firmware options supported */
624 #define OV2_REAL_MODE		0x20	/* set if we want OF in real mode */
625 
626 /* Option vector 3: processor options supported */
627 #define OV3_FP			0x80	/* floating point */
628 #define OV3_VMX			0x40	/* VMX/Altivec */
629 #define OV3_DFP			0x20	/* decimal FP */
630 
631 /* Option vector 5: PAPR/OF options supported */
632 #define OV5_LPAR		0x80	/* logical partitioning supported */
633 #define OV5_SPLPAR		0x40	/* shared-processor LPAR supported */
634 /* ibm,dynamic-reconfiguration-memory property supported */
635 #define OV5_DRCONF_MEMORY	0x20
636 #define OV5_LARGE_PAGES		0x10	/* large pages supported */
637 #define OV5_DONATE_DEDICATE_CPU 0x02	/* donate dedicated CPU support */
638 /* PCIe/MSI support.  Without MSI full PCIe is not supported */
639 #ifdef CONFIG_PCI_MSI
640 #define OV5_MSI			0x01	/* PCIe/MSI support */
641 #else
642 #define OV5_MSI			0x00
643 #endif /* CONFIG_PCI_MSI */
644 #ifdef CONFIG_PPC_SMLPAR
645 #define OV5_CMO			0x80	/* Cooperative Memory Overcommitment */
646 #else
647 #define OV5_CMO			0x00
648 #endif
649 
650 /*
651  * The architecture vector has an array of PVR mask/value pairs,
652  * followed by # option vectors - 1, followed by the option vectors.
653  */
654 static unsigned char ibm_architecture_vec[] = {
655 	W(0xfffe0000), W(0x003a0000),	/* POWER5/POWER5+ */
656 	W(0xffff0000), W(0x003e0000),	/* POWER6 */
657 	W(0xffff0000), W(0x003f0000),	/* POWER7 */
658 	W(0xffffffff), W(0x0f000003),	/* all 2.06-compliant */
659 	W(0xffffffff), W(0x0f000002),	/* all 2.05-compliant */
660 	W(0xfffffffe), W(0x0f000001),	/* all 2.04-compliant and earlier */
661 	5 - 1,				/* 5 option vectors */
662 
663 	/* option vector 1: processor architectures supported */
664 	3 - 2,				/* length */
665 	0,				/* don't ignore, don't halt */
666 	OV1_PPC_2_00 | OV1_PPC_2_01 | OV1_PPC_2_02 | OV1_PPC_2_03 |
667 	OV1_PPC_2_04 | OV1_PPC_2_05 | OV1_PPC_2_06,
668 
669 	/* option vector 2: Open Firmware options supported */
670 	34 - 2,				/* length */
671 	OV2_REAL_MODE,
672 	0, 0,
673 	W(0xffffffff),			/* real_base */
674 	W(0xffffffff),			/* real_size */
675 	W(0xffffffff),			/* virt_base */
676 	W(0xffffffff),			/* virt_size */
677 	W(0xffffffff),			/* load_base */
678 	W(64),				/* 128MB min RMA */
679 	W(0xffffffff),			/* full client load */
680 	0,				/* min RMA percentage of total RAM */
681 	48,				/* max log_2(hash table size) */
682 
683 	/* option vector 3: processor options supported */
684 	3 - 2,				/* length */
685 	0,				/* don't ignore, don't halt */
686 	OV3_FP | OV3_VMX | OV3_DFP,
687 
688 	/* option vector 4: IBM PAPR implementation */
689 	2 - 2,				/* length */
690 	0,				/* don't halt */
691 
692 	/* option vector 5: PAPR/OF options */
693 	5 - 2,				/* length */
694 	0,				/* don't ignore, don't halt */
695 	OV5_LPAR | OV5_SPLPAR | OV5_LARGE_PAGES | OV5_DRCONF_MEMORY |
696 	OV5_DONATE_DEDICATE_CPU | OV5_MSI,
697 	0,
698 	OV5_CMO,
699 };
700 
701 /* Old method - ELF header with PT_NOTE sections */
702 static struct fake_elf {
703 	Elf32_Ehdr	elfhdr;
704 	Elf32_Phdr	phdr[2];
705 	struct chrpnote {
706 		u32	namesz;
707 		u32	descsz;
708 		u32	type;
709 		char	name[8];	/* "PowerPC" */
710 		struct chrpdesc {
711 			u32	real_mode;
712 			u32	real_base;
713 			u32	real_size;
714 			u32	virt_base;
715 			u32	virt_size;
716 			u32	load_base;
717 		} chrpdesc;
718 	} chrpnote;
719 	struct rpanote {
720 		u32	namesz;
721 		u32	descsz;
722 		u32	type;
723 		char	name[24];	/* "IBM,RPA-Client-Config" */
724 		struct rpadesc {
725 			u32	lpar_affinity;
726 			u32	min_rmo_size;
727 			u32	min_rmo_percent;
728 			u32	max_pft_size;
729 			u32	splpar;
730 			u32	min_load;
731 			u32	new_mem_def;
732 			u32	ignore_me;
733 		} rpadesc;
734 	} rpanote;
735 } fake_elf = {
736 	.elfhdr = {
737 		.e_ident = { 0x7f, 'E', 'L', 'F',
738 			     ELFCLASS32, ELFDATA2MSB, EV_CURRENT },
739 		.e_type = ET_EXEC,	/* yeah right */
740 		.e_machine = EM_PPC,
741 		.e_version = EV_CURRENT,
742 		.e_phoff = offsetof(struct fake_elf, phdr),
743 		.e_phentsize = sizeof(Elf32_Phdr),
744 		.e_phnum = 2
745 	},
746 	.phdr = {
747 		[0] = {
748 			.p_type = PT_NOTE,
749 			.p_offset = offsetof(struct fake_elf, chrpnote),
750 			.p_filesz = sizeof(struct chrpnote)
751 		}, [1] = {
752 			.p_type = PT_NOTE,
753 			.p_offset = offsetof(struct fake_elf, rpanote),
754 			.p_filesz = sizeof(struct rpanote)
755 		}
756 	},
757 	.chrpnote = {
758 		.namesz = sizeof("PowerPC"),
759 		.descsz = sizeof(struct chrpdesc),
760 		.type = 0x1275,
761 		.name = "PowerPC",
762 		.chrpdesc = {
763 			.real_mode = ~0U,	/* ~0 means "don't care" */
764 			.real_base = ~0U,
765 			.real_size = ~0U,
766 			.virt_base = ~0U,
767 			.virt_size = ~0U,
768 			.load_base = ~0U
769 		},
770 	},
771 	.rpanote = {
772 		.namesz = sizeof("IBM,RPA-Client-Config"),
773 		.descsz = sizeof(struct rpadesc),
774 		.type = 0x12759999,
775 		.name = "IBM,RPA-Client-Config",
776 		.rpadesc = {
777 			.lpar_affinity = 0,
778 			.min_rmo_size = 64,	/* in megabytes */
779 			.min_rmo_percent = 0,
780 			.max_pft_size = 48,	/* 2^48 bytes max PFT size */
781 			.splpar = 1,
782 			.min_load = ~0U,
783 			.new_mem_def = 0
784 		}
785 	}
786 };
787 
788 static void __init prom_send_capabilities(void)
789 {
790 	ihandle elfloader, root;
791 	prom_arg_t ret;
792 
793 	root = call_prom("open", 1, 1, ADDR("/"));
794 	if (root != 0) {
795 		/* try calling the ibm,client-architecture-support method */
796 		if (call_prom_ret("call-method", 3, 2, &ret,
797 				  ADDR("ibm,client-architecture-support"),
798 				  root,
799 				  ADDR(ibm_architecture_vec)) == 0) {
800 			/* the call exists... */
801 			if (ret)
802 				prom_printf("WARNING: ibm,client-architecture"
803 					    "-support call FAILED!\n");
804 			call_prom("close", 1, 0, root);
805 			return;
806 		}
807 		call_prom("close", 1, 0, root);
808 	}
809 
810 	/* no ibm,client-architecture-support call, try the old way */
811 	elfloader = call_prom("open", 1, 1, ADDR("/packages/elf-loader"));
812 	if (elfloader == 0) {
813 		prom_printf("couldn't open /packages/elf-loader\n");
814 		return;
815 	}
816 	call_prom("call-method", 3, 1, ADDR("process-elf-header"),
817 			elfloader, ADDR(&fake_elf));
818 	call_prom("close", 1, 0, elfloader);
819 }
820 #endif
821 
822 /*
823  * Memory allocation strategy... our layout is normally:
824  *
825  *  at 14Mb or more we have vmlinux, then a gap and initrd.  In some
826  *  rare cases, initrd might end up being before the kernel though.
827  *  We assume this won't override the final kernel at 0, we have no
828  *  provision to handle that in this version, but it should hopefully
829  *  never happen.
830  *
831  *  alloc_top is set to the top of RMO, eventually shrink down if the
832  *  TCEs overlap
833  *
834  *  alloc_bottom is set to the top of kernel/initrd
835  *
836  *  from there, allocations are done this way : rtas is allocated
837  *  topmost, and the device-tree is allocated from the bottom. We try
838  *  to grow the device-tree allocation as we progress. If we can't,
839  *  then we fail, we don't currently have a facility to restart
840  *  elsewhere, but that shouldn't be necessary.
841  *
842  *  Note that calls to reserve_mem have to be done explicitly, memory
843  *  allocated with either alloc_up or alloc_down isn't automatically
844  *  reserved.
845  */
846 
847 
848 /*
849  * Allocates memory in the RMO upward from the kernel/initrd
850  *
851  * When align is 0, this is a special case, it means to allocate in place
852  * at the current location of alloc_bottom or fail (that is basically
853  * extending the previous allocation). Used for the device-tree flattening
854  */
855 static unsigned long __init alloc_up(unsigned long size, unsigned long align)
856 {
857 	unsigned long base = RELOC(alloc_bottom);
858 	unsigned long addr = 0;
859 
860 	if (align)
861 		base = _ALIGN_UP(base, align);
862 	prom_debug("alloc_up(%x, %x)\n", size, align);
863 	if (RELOC(ram_top) == 0)
864 		prom_panic("alloc_up() called with mem not initialized\n");
865 
866 	if (align)
867 		base = _ALIGN_UP(RELOC(alloc_bottom), align);
868 	else
869 		base = RELOC(alloc_bottom);
870 
871 	for(; (base + size) <= RELOC(alloc_top);
872 	    base = _ALIGN_UP(base + 0x100000, align)) {
873 		prom_debug("    trying: 0x%x\n\r", base);
874 		addr = (unsigned long)prom_claim(base, size, 0);
875 		if (addr != PROM_ERROR && addr != 0)
876 			break;
877 		addr = 0;
878 		if (align == 0)
879 			break;
880 	}
881 	if (addr == 0)
882 		return 0;
883 	RELOC(alloc_bottom) = addr;
884 
885 	prom_debug(" -> %x\n", addr);
886 	prom_debug("  alloc_bottom : %x\n", RELOC(alloc_bottom));
887 	prom_debug("  alloc_top    : %x\n", RELOC(alloc_top));
888 	prom_debug("  alloc_top_hi : %x\n", RELOC(alloc_top_high));
889 	prom_debug("  rmo_top      : %x\n", RELOC(rmo_top));
890 	prom_debug("  ram_top      : %x\n", RELOC(ram_top));
891 
892 	return addr;
893 }
894 
895 /*
896  * Allocates memory downward, either from top of RMO, or if highmem
897  * is set, from the top of RAM.  Note that this one doesn't handle
898  * failures.  It does claim memory if highmem is not set.
899  */
900 static unsigned long __init alloc_down(unsigned long size, unsigned long align,
901 				       int highmem)
902 {
903 	unsigned long base, addr = 0;
904 
905 	prom_debug("alloc_down(%x, %x, %s)\n", size, align,
906 		   highmem ? RELOC("(high)") : RELOC("(low)"));
907 	if (RELOC(ram_top) == 0)
908 		prom_panic("alloc_down() called with mem not initialized\n");
909 
910 	if (highmem) {
911 		/* Carve out storage for the TCE table. */
912 		addr = _ALIGN_DOWN(RELOC(alloc_top_high) - size, align);
913 		if (addr <= RELOC(alloc_bottom))
914 			return 0;
915 		/* Will we bump into the RMO ? If yes, check out that we
916 		 * didn't overlap existing allocations there, if we did,
917 		 * we are dead, we must be the first in town !
918 		 */
919 		if (addr < RELOC(rmo_top)) {
920 			/* Good, we are first */
921 			if (RELOC(alloc_top) == RELOC(rmo_top))
922 				RELOC(alloc_top) = RELOC(rmo_top) = addr;
923 			else
924 				return 0;
925 		}
926 		RELOC(alloc_top_high) = addr;
927 		goto bail;
928 	}
929 
930 	base = _ALIGN_DOWN(RELOC(alloc_top) - size, align);
931 	for (; base > RELOC(alloc_bottom);
932 	     base = _ALIGN_DOWN(base - 0x100000, align))  {
933 		prom_debug("    trying: 0x%x\n\r", base);
934 		addr = (unsigned long)prom_claim(base, size, 0);
935 		if (addr != PROM_ERROR && addr != 0)
936 			break;
937 		addr = 0;
938 	}
939 	if (addr == 0)
940 		return 0;
941 	RELOC(alloc_top) = addr;
942 
943  bail:
944 	prom_debug(" -> %x\n", addr);
945 	prom_debug("  alloc_bottom : %x\n", RELOC(alloc_bottom));
946 	prom_debug("  alloc_top    : %x\n", RELOC(alloc_top));
947 	prom_debug("  alloc_top_hi : %x\n", RELOC(alloc_top_high));
948 	prom_debug("  rmo_top      : %x\n", RELOC(rmo_top));
949 	prom_debug("  ram_top      : %x\n", RELOC(ram_top));
950 
951 	return addr;
952 }
953 
954 /*
955  * Parse a "reg" cell
956  */
957 static unsigned long __init prom_next_cell(int s, cell_t **cellp)
958 {
959 	cell_t *p = *cellp;
960 	unsigned long r = 0;
961 
962 	/* Ignore more than 2 cells */
963 	while (s > sizeof(unsigned long) / 4) {
964 		p++;
965 		s--;
966 	}
967 	r = *p++;
968 #ifdef CONFIG_PPC64
969 	if (s > 1) {
970 		r <<= 32;
971 		r |= *(p++);
972 	}
973 #endif
974 	*cellp = p;
975 	return r;
976 }
977 
978 /*
979  * Very dumb function for adding to the memory reserve list, but
980  * we don't need anything smarter at this point
981  *
982  * XXX Eventually check for collisions.  They should NEVER happen.
983  * If problems seem to show up, it would be a good start to track
984  * them down.
985  */
986 static void __init reserve_mem(u64 base, u64 size)
987 {
988 	u64 top = base + size;
989 	unsigned long cnt = RELOC(mem_reserve_cnt);
990 
991 	if (size == 0)
992 		return;
993 
994 	/* We need to always keep one empty entry so that we
995 	 * have our terminator with "size" set to 0 since we are
996 	 * dumb and just copy this entire array to the boot params
997 	 */
998 	base = _ALIGN_DOWN(base, PAGE_SIZE);
999 	top = _ALIGN_UP(top, PAGE_SIZE);
1000 	size = top - base;
1001 
1002 	if (cnt >= (MEM_RESERVE_MAP_SIZE - 1))
1003 		prom_panic("Memory reserve map exhausted !\n");
1004 	RELOC(mem_reserve_map)[cnt].base = base;
1005 	RELOC(mem_reserve_map)[cnt].size = size;
1006 	RELOC(mem_reserve_cnt) = cnt + 1;
1007 }
1008 
1009 /*
1010  * Initialize memory allocation mechanism, parse "memory" nodes and
1011  * obtain that way the top of memory and RMO to setup out local allocator
1012  */
1013 static void __init prom_init_mem(void)
1014 {
1015 	phandle node;
1016 	char *path, type[64];
1017 	unsigned int plen;
1018 	cell_t *p, *endp;
1019 	struct prom_t *_prom = &RELOC(prom);
1020 	u32 rac, rsc;
1021 
1022 	/*
1023 	 * We iterate the memory nodes to find
1024 	 * 1) top of RMO (first node)
1025 	 * 2) top of memory
1026 	 */
1027 	rac = 2;
1028 	prom_getprop(_prom->root, "#address-cells", &rac, sizeof(rac));
1029 	rsc = 1;
1030 	prom_getprop(_prom->root, "#size-cells", &rsc, sizeof(rsc));
1031 	prom_debug("root_addr_cells: %x\n", (unsigned long) rac);
1032 	prom_debug("root_size_cells: %x\n", (unsigned long) rsc);
1033 
1034 	prom_debug("scanning memory:\n");
1035 	path = RELOC(prom_scratch);
1036 
1037 	for (node = 0; prom_next_node(&node); ) {
1038 		type[0] = 0;
1039 		prom_getprop(node, "device_type", type, sizeof(type));
1040 
1041 		if (type[0] == 0) {
1042 			/*
1043 			 * CHRP Longtrail machines have no device_type
1044 			 * on the memory node, so check the name instead...
1045 			 */
1046 			prom_getprop(node, "name", type, sizeof(type));
1047 		}
1048 		if (strcmp(type, RELOC("memory")))
1049 			continue;
1050 
1051 		plen = prom_getprop(node, "reg", RELOC(regbuf), sizeof(regbuf));
1052 		if (plen > sizeof(regbuf)) {
1053 			prom_printf("memory node too large for buffer !\n");
1054 			plen = sizeof(regbuf);
1055 		}
1056 		p = RELOC(regbuf);
1057 		endp = p + (plen / sizeof(cell_t));
1058 
1059 #ifdef DEBUG_PROM
1060 		memset(path, 0, PROM_SCRATCH_SIZE);
1061 		call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1);
1062 		prom_debug("  node %s :\n", path);
1063 #endif /* DEBUG_PROM */
1064 
1065 		while ((endp - p) >= (rac + rsc)) {
1066 			unsigned long base, size;
1067 
1068 			base = prom_next_cell(rac, &p);
1069 			size = prom_next_cell(rsc, &p);
1070 
1071 			if (size == 0)
1072 				continue;
1073 			prom_debug("    %x %x\n", base, size);
1074 			if (base == 0 && (RELOC(of_platform) & PLATFORM_LPAR))
1075 				RELOC(rmo_top) = size;
1076 			if ((base + size) > RELOC(ram_top))
1077 				RELOC(ram_top) = base + size;
1078 		}
1079 	}
1080 
1081 	RELOC(alloc_bottom) = PAGE_ALIGN((unsigned long)&RELOC(_end) + 0x4000);
1082 
1083 	/* Check if we have an initrd after the kernel, if we do move our bottom
1084 	 * point to after it
1085 	 */
1086 	if (RELOC(prom_initrd_start)) {
1087 		if (RELOC(prom_initrd_end) > RELOC(alloc_bottom))
1088 			RELOC(alloc_bottom) = PAGE_ALIGN(RELOC(prom_initrd_end));
1089 	}
1090 
1091 	/*
1092 	 * Setup our top alloc point, that is top of RMO or top of
1093 	 * segment 0 when running non-LPAR.
1094 	 * Some RS64 machines have buggy firmware where claims up at
1095 	 * 1GB fail.  Cap at 768MB as a workaround.
1096 	 * Since 768MB is plenty of room, and we need to cap to something
1097 	 * reasonable on 32-bit, cap at 768MB on all machines.
1098 	 */
1099 	if (!RELOC(rmo_top))
1100 		RELOC(rmo_top) = RELOC(ram_top);
1101 	RELOC(rmo_top) = min(0x30000000ul, RELOC(rmo_top));
1102 	RELOC(alloc_top) = RELOC(rmo_top);
1103 	RELOC(alloc_top_high) = RELOC(ram_top);
1104 
1105 	prom_printf("memory layout at init:\n");
1106 	prom_printf("  alloc_bottom : %x\n", RELOC(alloc_bottom));
1107 	prom_printf("  alloc_top    : %x\n", RELOC(alloc_top));
1108 	prom_printf("  alloc_top_hi : %x\n", RELOC(alloc_top_high));
1109 	prom_printf("  rmo_top      : %x\n", RELOC(rmo_top));
1110 	prom_printf("  ram_top      : %x\n", RELOC(ram_top));
1111 }
1112 
1113 
1114 /*
1115  * Allocate room for and instantiate RTAS
1116  */
1117 static void __init prom_instantiate_rtas(void)
1118 {
1119 	phandle rtas_node;
1120 	ihandle rtas_inst;
1121 	u32 base, entry = 0;
1122 	u32 size = 0;
1123 
1124 	prom_debug("prom_instantiate_rtas: start...\n");
1125 
1126 	rtas_node = call_prom("finddevice", 1, 1, ADDR("/rtas"));
1127 	prom_debug("rtas_node: %x\n", rtas_node);
1128 	if (!PHANDLE_VALID(rtas_node))
1129 		return;
1130 
1131 	prom_getprop(rtas_node, "rtas-size", &size, sizeof(size));
1132 	if (size == 0)
1133 		return;
1134 
1135 	base = alloc_down(size, PAGE_SIZE, 0);
1136 	if (base == 0) {
1137 		prom_printf("RTAS allocation failed !\n");
1138 		return;
1139 	}
1140 
1141 	rtas_inst = call_prom("open", 1, 1, ADDR("/rtas"));
1142 	if (!IHANDLE_VALID(rtas_inst)) {
1143 		prom_printf("opening rtas package failed (%x)\n", rtas_inst);
1144 		return;
1145 	}
1146 
1147 	prom_printf("instantiating rtas at 0x%x ...", base);
1148 
1149 	if (call_prom_ret("call-method", 3, 2, &entry,
1150 			  ADDR("instantiate-rtas"),
1151 			  rtas_inst, base) != 0
1152 	    || entry == 0) {
1153 		prom_printf(" failed\n");
1154 		return;
1155 	}
1156 	prom_printf(" done\n");
1157 
1158 	reserve_mem(base, size);
1159 
1160 	prom_setprop(rtas_node, "/rtas", "linux,rtas-base",
1161 		     &base, sizeof(base));
1162 	prom_setprop(rtas_node, "/rtas", "linux,rtas-entry",
1163 		     &entry, sizeof(entry));
1164 
1165 	prom_debug("rtas base     = 0x%x\n", base);
1166 	prom_debug("rtas entry    = 0x%x\n", entry);
1167 	prom_debug("rtas size     = 0x%x\n", (long)size);
1168 
1169 	prom_debug("prom_instantiate_rtas: end...\n");
1170 }
1171 
1172 #ifdef CONFIG_PPC64
1173 /*
1174  * Allocate room for and initialize TCE tables
1175  */
1176 static void __init prom_initialize_tce_table(void)
1177 {
1178 	phandle node;
1179 	ihandle phb_node;
1180 	char compatible[64], type[64], model[64];
1181 	char *path = RELOC(prom_scratch);
1182 	u64 base, align;
1183 	u32 minalign, minsize;
1184 	u64 tce_entry, *tce_entryp;
1185 	u64 local_alloc_top, local_alloc_bottom;
1186 	u64 i;
1187 
1188 	if (RELOC(prom_iommu_off))
1189 		return;
1190 
1191 	prom_debug("starting prom_initialize_tce_table\n");
1192 
1193 	/* Cache current top of allocs so we reserve a single block */
1194 	local_alloc_top = RELOC(alloc_top_high);
1195 	local_alloc_bottom = local_alloc_top;
1196 
1197 	/* Search all nodes looking for PHBs. */
1198 	for (node = 0; prom_next_node(&node); ) {
1199 		compatible[0] = 0;
1200 		type[0] = 0;
1201 		model[0] = 0;
1202 		prom_getprop(node, "compatible",
1203 			     compatible, sizeof(compatible));
1204 		prom_getprop(node, "device_type", type, sizeof(type));
1205 		prom_getprop(node, "model", model, sizeof(model));
1206 
1207 		if ((type[0] == 0) || (strstr(type, RELOC("pci")) == NULL))
1208 			continue;
1209 
1210 		/* Keep the old logic intact to avoid regression. */
1211 		if (compatible[0] != 0) {
1212 			if ((strstr(compatible, RELOC("python")) == NULL) &&
1213 			    (strstr(compatible, RELOC("Speedwagon")) == NULL) &&
1214 			    (strstr(compatible, RELOC("Winnipeg")) == NULL))
1215 				continue;
1216 		} else if (model[0] != 0) {
1217 			if ((strstr(model, RELOC("ython")) == NULL) &&
1218 			    (strstr(model, RELOC("peedwagon")) == NULL) &&
1219 			    (strstr(model, RELOC("innipeg")) == NULL))
1220 				continue;
1221 		}
1222 
1223 		if (prom_getprop(node, "tce-table-minalign", &minalign,
1224 				 sizeof(minalign)) == PROM_ERROR)
1225 			minalign = 0;
1226 		if (prom_getprop(node, "tce-table-minsize", &minsize,
1227 				 sizeof(minsize)) == PROM_ERROR)
1228 			minsize = 4UL << 20;
1229 
1230 		/*
1231 		 * Even though we read what OF wants, we just set the table
1232 		 * size to 4 MB.  This is enough to map 2GB of PCI DMA space.
1233 		 * By doing this, we avoid the pitfalls of trying to DMA to
1234 		 * MMIO space and the DMA alias hole.
1235 		 *
1236 		 * On POWER4, firmware sets the TCE region by assuming
1237 		 * each TCE table is 8MB. Using this memory for anything
1238 		 * else will impact performance, so we always allocate 8MB.
1239 		 * Anton
1240 		 */
1241 		if (__is_processor(PV_POWER4) || __is_processor(PV_POWER4p))
1242 			minsize = 8UL << 20;
1243 		else
1244 			minsize = 4UL << 20;
1245 
1246 		/* Align to the greater of the align or size */
1247 		align = max(minalign, minsize);
1248 		base = alloc_down(minsize, align, 1);
1249 		if (base == 0)
1250 			prom_panic("ERROR, cannot find space for TCE table.\n");
1251 		if (base < local_alloc_bottom)
1252 			local_alloc_bottom = base;
1253 
1254 		/* It seems OF doesn't null-terminate the path :-( */
1255 		memset(path, 0, PROM_SCRATCH_SIZE);
1256 		/* Call OF to setup the TCE hardware */
1257 		if (call_prom("package-to-path", 3, 1, node,
1258 			      path, PROM_SCRATCH_SIZE-1) == PROM_ERROR) {
1259 			prom_printf("package-to-path failed\n");
1260 		}
1261 
1262 		/* Save away the TCE table attributes for later use. */
1263 		prom_setprop(node, path, "linux,tce-base", &base, sizeof(base));
1264 		prom_setprop(node, path, "linux,tce-size", &minsize, sizeof(minsize));
1265 
1266 		prom_debug("TCE table: %s\n", path);
1267 		prom_debug("\tnode = 0x%x\n", node);
1268 		prom_debug("\tbase = 0x%x\n", base);
1269 		prom_debug("\tsize = 0x%x\n", minsize);
1270 
1271 		/* Initialize the table to have a one-to-one mapping
1272 		 * over the allocated size.
1273 		 */
1274 		tce_entryp = (unsigned long *)base;
1275 		for (i = 0; i < (minsize >> 3) ;tce_entryp++, i++) {
1276 			tce_entry = (i << PAGE_SHIFT);
1277 			tce_entry |= 0x3;
1278 			*tce_entryp = tce_entry;
1279 		}
1280 
1281 		prom_printf("opening PHB %s", path);
1282 		phb_node = call_prom("open", 1, 1, path);
1283 		if (phb_node == 0)
1284 			prom_printf("... failed\n");
1285 		else
1286 			prom_printf("... done\n");
1287 
1288 		call_prom("call-method", 6, 0, ADDR("set-64-bit-addressing"),
1289 			  phb_node, -1, minsize,
1290 			  (u32) base, (u32) (base >> 32));
1291 		call_prom("close", 1, 0, phb_node);
1292 	}
1293 
1294 	reserve_mem(local_alloc_bottom, local_alloc_top - local_alloc_bottom);
1295 
1296 	/* These are only really needed if there is a memory limit in
1297 	 * effect, but we don't know so export them always. */
1298 	RELOC(prom_tce_alloc_start) = local_alloc_bottom;
1299 	RELOC(prom_tce_alloc_end) = local_alloc_top;
1300 
1301 	/* Flag the first invalid entry */
1302 	prom_debug("ending prom_initialize_tce_table\n");
1303 }
1304 #endif
1305 
1306 /*
1307  * With CHRP SMP we need to use the OF to start the other processors.
1308  * We can't wait until smp_boot_cpus (the OF is trashed by then)
1309  * so we have to put the processors into a holding pattern controlled
1310  * by the kernel (not OF) before we destroy the OF.
1311  *
1312  * This uses a chunk of low memory, puts some holding pattern
1313  * code there and sends the other processors off to there until
1314  * smp_boot_cpus tells them to do something.  The holding pattern
1315  * checks that address until its cpu # is there, when it is that
1316  * cpu jumps to __secondary_start().  smp_boot_cpus() takes care
1317  * of setting those values.
1318  *
1319  * We also use physical address 0x4 here to tell when a cpu
1320  * is in its holding pattern code.
1321  *
1322  * -- Cort
1323  */
1324 extern void __secondary_hold(void);
1325 extern unsigned long __secondary_hold_spinloop;
1326 extern unsigned long __secondary_hold_acknowledge;
1327 
1328 /*
1329  * We want to reference the copy of __secondary_hold_* in the
1330  * 0 - 0x100 address range
1331  */
1332 #define LOW_ADDR(x)	(((unsigned long) &(x)) & 0xff)
1333 
1334 static void __init prom_hold_cpus(void)
1335 {
1336 	unsigned long i;
1337 	unsigned int reg;
1338 	phandle node;
1339 	char type[64];
1340 	struct prom_t *_prom = &RELOC(prom);
1341 	unsigned long *spinloop
1342 		= (void *) LOW_ADDR(__secondary_hold_spinloop);
1343 	unsigned long *acknowledge
1344 		= (void *) LOW_ADDR(__secondary_hold_acknowledge);
1345 #ifdef CONFIG_PPC64
1346 	/* __secondary_hold is actually a descriptor, not the text address */
1347 	unsigned long secondary_hold
1348 		= __pa(*PTRRELOC((unsigned long *)__secondary_hold));
1349 #else
1350 	unsigned long secondary_hold = LOW_ADDR(__secondary_hold);
1351 #endif
1352 
1353 	prom_debug("prom_hold_cpus: start...\n");
1354 	prom_debug("    1) spinloop       = 0x%x\n", (unsigned long)spinloop);
1355 	prom_debug("    1) *spinloop      = 0x%x\n", *spinloop);
1356 	prom_debug("    1) acknowledge    = 0x%x\n",
1357 		   (unsigned long)acknowledge);
1358 	prom_debug("    1) *acknowledge   = 0x%x\n", *acknowledge);
1359 	prom_debug("    1) secondary_hold = 0x%x\n", secondary_hold);
1360 
1361 	/* Set the common spinloop variable, so all of the secondary cpus
1362 	 * will block when they are awakened from their OF spinloop.
1363 	 * This must occur for both SMP and non SMP kernels, since OF will
1364 	 * be trashed when we move the kernel.
1365 	 */
1366 	*spinloop = 0;
1367 
1368 	/* look for cpus */
1369 	for (node = 0; prom_next_node(&node); ) {
1370 		type[0] = 0;
1371 		prom_getprop(node, "device_type", type, sizeof(type));
1372 		if (strcmp(type, RELOC("cpu")) != 0)
1373 			continue;
1374 
1375 		/* Skip non-configured cpus. */
1376 		if (prom_getprop(node, "status", type, sizeof(type)) > 0)
1377 			if (strcmp(type, RELOC("okay")) != 0)
1378 				continue;
1379 
1380 		reg = -1;
1381 		prom_getprop(node, "reg", &reg, sizeof(reg));
1382 
1383 		prom_debug("cpu hw idx   = 0x%x\n", reg);
1384 
1385 		/* Init the acknowledge var which will be reset by
1386 		 * the secondary cpu when it awakens from its OF
1387 		 * spinloop.
1388 		 */
1389 		*acknowledge = (unsigned long)-1;
1390 
1391 		if (reg != _prom->cpu) {
1392 			/* Primary Thread of non-boot cpu */
1393 			prom_printf("starting cpu hw idx %x... ", reg);
1394 			call_prom("start-cpu", 3, 0, node,
1395 				  secondary_hold, reg);
1396 
1397 			for (i = 0; (i < 100000000) &&
1398 			     (*acknowledge == ((unsigned long)-1)); i++ )
1399 				mb();
1400 
1401 			if (*acknowledge == reg)
1402 				prom_printf("done\n");
1403 			else
1404 				prom_printf("failed: %x\n", *acknowledge);
1405 		}
1406 #ifdef CONFIG_SMP
1407 		else
1408 			prom_printf("boot cpu hw idx %x\n", reg);
1409 #endif /* CONFIG_SMP */
1410 	}
1411 
1412 	prom_debug("prom_hold_cpus: end...\n");
1413 }
1414 
1415 
1416 static void __init prom_init_client_services(unsigned long pp)
1417 {
1418 	struct prom_t *_prom = &RELOC(prom);
1419 
1420 	/* Get a handle to the prom entry point before anything else */
1421 	RELOC(prom_entry) = pp;
1422 
1423 	/* get a handle for the stdout device */
1424 	_prom->chosen = call_prom("finddevice", 1, 1, ADDR("/chosen"));
1425 	if (!PHANDLE_VALID(_prom->chosen))
1426 		prom_panic("cannot find chosen"); /* msg won't be printed :( */
1427 
1428 	/* get device tree root */
1429 	_prom->root = call_prom("finddevice", 1, 1, ADDR("/"));
1430 	if (!PHANDLE_VALID(_prom->root))
1431 		prom_panic("cannot find device tree root"); /* msg won't be printed :( */
1432 
1433 	_prom->mmumap = 0;
1434 }
1435 
1436 #ifdef CONFIG_PPC32
1437 /*
1438  * For really old powermacs, we need to map things we claim.
1439  * For that, we need the ihandle of the mmu.
1440  * Also, on the longtrail, we need to work around other bugs.
1441  */
1442 static void __init prom_find_mmu(void)
1443 {
1444 	struct prom_t *_prom = &RELOC(prom);
1445 	phandle oprom;
1446 	char version[64];
1447 
1448 	oprom = call_prom("finddevice", 1, 1, ADDR("/openprom"));
1449 	if (!PHANDLE_VALID(oprom))
1450 		return;
1451 	if (prom_getprop(oprom, "model", version, sizeof(version)) <= 0)
1452 		return;
1453 	version[sizeof(version) - 1] = 0;
1454 	/* XXX might need to add other versions here */
1455 	if (strcmp(version, "Open Firmware, 1.0.5") == 0)
1456 		of_workarounds = OF_WA_CLAIM;
1457 	else if (strncmp(version, "FirmWorks,3.", 12) == 0) {
1458 		of_workarounds = OF_WA_CLAIM | OF_WA_LONGTRAIL;
1459 		call_prom("interpret", 1, 1, "dev /memory 0 to allow-reclaim");
1460 	} else
1461 		return;
1462 	_prom->memory = call_prom("open", 1, 1, ADDR("/memory"));
1463 	prom_getprop(_prom->chosen, "mmu", &_prom->mmumap,
1464 		     sizeof(_prom->mmumap));
1465 	if (!IHANDLE_VALID(_prom->memory) || !IHANDLE_VALID(_prom->mmumap))
1466 		of_workarounds &= ~OF_WA_CLAIM;		/* hmmm */
1467 }
1468 #else
1469 #define prom_find_mmu()
1470 #endif
1471 
1472 static void __init prom_init_stdout(void)
1473 {
1474 	struct prom_t *_prom = &RELOC(prom);
1475 	char *path = RELOC(of_stdout_device);
1476 	char type[16];
1477 	u32 val;
1478 
1479 	if (prom_getprop(_prom->chosen, "stdout", &val, sizeof(val)) <= 0)
1480 		prom_panic("cannot find stdout");
1481 
1482 	_prom->stdout = val;
1483 
1484 	/* Get the full OF pathname of the stdout device */
1485 	memset(path, 0, 256);
1486 	call_prom("instance-to-path", 3, 1, _prom->stdout, path, 255);
1487 	val = call_prom("instance-to-package", 1, 1, _prom->stdout);
1488 	prom_setprop(_prom->chosen, "/chosen", "linux,stdout-package",
1489 		     &val, sizeof(val));
1490 	prom_printf("OF stdout device is: %s\n", RELOC(of_stdout_device));
1491 	prom_setprop(_prom->chosen, "/chosen", "linux,stdout-path",
1492 		     path, strlen(path) + 1);
1493 
1494 	/* If it's a display, note it */
1495 	memset(type, 0, sizeof(type));
1496 	prom_getprop(val, "device_type", type, sizeof(type));
1497 	if (strcmp(type, RELOC("display")) == 0)
1498 		prom_setprop(val, path, "linux,boot-display", NULL, 0);
1499 }
1500 
1501 static void __init prom_close_stdin(void)
1502 {
1503 	struct prom_t *_prom = &RELOC(prom);
1504 	ihandle val;
1505 
1506 	if (prom_getprop(_prom->chosen, "stdin", &val, sizeof(val)) > 0)
1507 		call_prom("close", 1, 0, val);
1508 }
1509 
1510 static int __init prom_find_machine_type(void)
1511 {
1512 	struct prom_t *_prom = &RELOC(prom);
1513 	char compat[256];
1514 	int len, i = 0;
1515 #ifdef CONFIG_PPC64
1516 	phandle rtas;
1517 	int x;
1518 #endif
1519 
1520 	/* Look for a PowerMac */
1521 	len = prom_getprop(_prom->root, "compatible",
1522 			   compat, sizeof(compat)-1);
1523 	if (len > 0) {
1524 		compat[len] = 0;
1525 		while (i < len) {
1526 			char *p = &compat[i];
1527 			int sl = strlen(p);
1528 			if (sl == 0)
1529 				break;
1530 			if (strstr(p, RELOC("Power Macintosh")) ||
1531 			    strstr(p, RELOC("MacRISC")))
1532 				return PLATFORM_POWERMAC;
1533 #ifdef CONFIG_PPC64
1534 			/* We must make sure we don't detect the IBM Cell
1535 			 * blades as pSeries due to some firmware issues,
1536 			 * so we do it here.
1537 			 */
1538 			if (strstr(p, RELOC("IBM,CBEA")) ||
1539 			    strstr(p, RELOC("IBM,CPBW-1.0")))
1540 				return PLATFORM_GENERIC;
1541 #endif /* CONFIG_PPC64 */
1542 			i += sl + 1;
1543 		}
1544 	}
1545 #ifdef CONFIG_PPC64
1546 	/* If not a mac, try to figure out if it's an IBM pSeries or any other
1547 	 * PAPR compliant platform. We assume it is if :
1548 	 *  - /device_type is "chrp" (please, do NOT use that for future
1549 	 *    non-IBM designs !
1550 	 *  - it has /rtas
1551 	 */
1552 	len = prom_getprop(_prom->root, "device_type",
1553 			   compat, sizeof(compat)-1);
1554 	if (len <= 0)
1555 		return PLATFORM_GENERIC;
1556 	if (strcmp(compat, RELOC("chrp")))
1557 		return PLATFORM_GENERIC;
1558 
1559 	/* Default to pSeries. We need to know if we are running LPAR */
1560 	rtas = call_prom("finddevice", 1, 1, ADDR("/rtas"));
1561 	if (!PHANDLE_VALID(rtas))
1562 		return PLATFORM_GENERIC;
1563 	x = prom_getproplen(rtas, "ibm,hypertas-functions");
1564 	if (x != PROM_ERROR) {
1565 		prom_printf("Hypertas detected, assuming LPAR !\n");
1566 		return PLATFORM_PSERIES_LPAR;
1567 	}
1568 	return PLATFORM_PSERIES;
1569 #else
1570 	return PLATFORM_GENERIC;
1571 #endif
1572 }
1573 
1574 static int __init prom_set_color(ihandle ih, int i, int r, int g, int b)
1575 {
1576 	return call_prom("call-method", 6, 1, ADDR("color!"), ih, i, b, g, r);
1577 }
1578 
1579 /*
1580  * If we have a display that we don't know how to drive,
1581  * we will want to try to execute OF's open method for it
1582  * later.  However, OF will probably fall over if we do that
1583  * we've taken over the MMU.
1584  * So we check whether we will need to open the display,
1585  * and if so, open it now.
1586  */
1587 static void __init prom_check_displays(void)
1588 {
1589 	char type[16], *path;
1590 	phandle node;
1591 	ihandle ih;
1592 	int i;
1593 
1594 	static unsigned char default_colors[] = {
1595 		0x00, 0x00, 0x00,
1596 		0x00, 0x00, 0xaa,
1597 		0x00, 0xaa, 0x00,
1598 		0x00, 0xaa, 0xaa,
1599 		0xaa, 0x00, 0x00,
1600 		0xaa, 0x00, 0xaa,
1601 		0xaa, 0xaa, 0x00,
1602 		0xaa, 0xaa, 0xaa,
1603 		0x55, 0x55, 0x55,
1604 		0x55, 0x55, 0xff,
1605 		0x55, 0xff, 0x55,
1606 		0x55, 0xff, 0xff,
1607 		0xff, 0x55, 0x55,
1608 		0xff, 0x55, 0xff,
1609 		0xff, 0xff, 0x55,
1610 		0xff, 0xff, 0xff
1611 	};
1612 	const unsigned char *clut;
1613 
1614 	prom_printf("Looking for displays\n");
1615 	for (node = 0; prom_next_node(&node); ) {
1616 		memset(type, 0, sizeof(type));
1617 		prom_getprop(node, "device_type", type, sizeof(type));
1618 		if (strcmp(type, RELOC("display")) != 0)
1619 			continue;
1620 
1621 		/* It seems OF doesn't null-terminate the path :-( */
1622 		path = RELOC(prom_scratch);
1623 		memset(path, 0, PROM_SCRATCH_SIZE);
1624 
1625 		/*
1626 		 * leave some room at the end of the path for appending extra
1627 		 * arguments
1628 		 */
1629 		if (call_prom("package-to-path", 3, 1, node, path,
1630 			      PROM_SCRATCH_SIZE-10) == PROM_ERROR)
1631 			continue;
1632 		prom_printf("found display   : %s, opening ... ", path);
1633 
1634 		ih = call_prom("open", 1, 1, path);
1635 		if (ih == 0) {
1636 			prom_printf("failed\n");
1637 			continue;
1638 		}
1639 
1640 		/* Success */
1641 		prom_printf("done\n");
1642 		prom_setprop(node, path, "linux,opened", NULL, 0);
1643 
1644 		/* Setup a usable color table when the appropriate
1645 		 * method is available. Should update this to set-colors */
1646 		clut = RELOC(default_colors);
1647 		for (i = 0; i < 32; i++, clut += 3)
1648 			if (prom_set_color(ih, i, clut[0], clut[1],
1649 					   clut[2]) != 0)
1650 				break;
1651 
1652 #ifdef CONFIG_LOGO_LINUX_CLUT224
1653 		clut = PTRRELOC(RELOC(logo_linux_clut224.clut));
1654 		for (i = 0; i < RELOC(logo_linux_clut224.clutsize); i++, clut += 3)
1655 			if (prom_set_color(ih, i + 32, clut[0], clut[1],
1656 					   clut[2]) != 0)
1657 				break;
1658 #endif /* CONFIG_LOGO_LINUX_CLUT224 */
1659 	}
1660 }
1661 
1662 
1663 /* Return (relocated) pointer to this much memory: moves initrd if reqd. */
1664 static void __init *make_room(unsigned long *mem_start, unsigned long *mem_end,
1665 			      unsigned long needed, unsigned long align)
1666 {
1667 	void *ret;
1668 
1669 	*mem_start = _ALIGN(*mem_start, align);
1670 	while ((*mem_start + needed) > *mem_end) {
1671 		unsigned long room, chunk;
1672 
1673 		prom_debug("Chunk exhausted, claiming more at %x...\n",
1674 			   RELOC(alloc_bottom));
1675 		room = RELOC(alloc_top) - RELOC(alloc_bottom);
1676 		if (room > DEVTREE_CHUNK_SIZE)
1677 			room = DEVTREE_CHUNK_SIZE;
1678 		if (room < PAGE_SIZE)
1679 			prom_panic("No memory for flatten_device_tree (no room)");
1680 		chunk = alloc_up(room, 0);
1681 		if (chunk == 0)
1682 			prom_panic("No memory for flatten_device_tree (claim failed)");
1683 		*mem_end = RELOC(alloc_top);
1684 	}
1685 
1686 	ret = (void *)*mem_start;
1687 	*mem_start += needed;
1688 
1689 	return ret;
1690 }
1691 
1692 #define dt_push_token(token, mem_start, mem_end) \
1693 	do { *((u32 *)make_room(mem_start, mem_end, 4, 4)) = token; } while(0)
1694 
1695 static unsigned long __init dt_find_string(char *str)
1696 {
1697 	char *s, *os;
1698 
1699 	s = os = (char *)RELOC(dt_string_start);
1700 	s += 4;
1701 	while (s <  (char *)RELOC(dt_string_end)) {
1702 		if (strcmp(s, str) == 0)
1703 			return s - os;
1704 		s += strlen(s) + 1;
1705 	}
1706 	return 0;
1707 }
1708 
1709 /*
1710  * The Open Firmware 1275 specification states properties must be 31 bytes or
1711  * less, however not all firmwares obey this. Make it 64 bytes to be safe.
1712  */
1713 #define MAX_PROPERTY_NAME 64
1714 
1715 static void __init scan_dt_build_strings(phandle node,
1716 					 unsigned long *mem_start,
1717 					 unsigned long *mem_end)
1718 {
1719 	char *prev_name, *namep, *sstart;
1720 	unsigned long soff;
1721 	phandle child;
1722 
1723 	sstart =  (char *)RELOC(dt_string_start);
1724 
1725 	/* get and store all property names */
1726 	prev_name = RELOC("");
1727 	for (;;) {
1728 		/* 64 is max len of name including nul. */
1729 		namep = make_room(mem_start, mem_end, MAX_PROPERTY_NAME, 1);
1730 		if (call_prom("nextprop", 3, 1, node, prev_name, namep) != 1) {
1731 			/* No more nodes: unwind alloc */
1732 			*mem_start = (unsigned long)namep;
1733 			break;
1734 		}
1735 
1736  		/* skip "name" */
1737  		if (strcmp(namep, RELOC("name")) == 0) {
1738  			*mem_start = (unsigned long)namep;
1739  			prev_name = RELOC("name");
1740  			continue;
1741  		}
1742 		/* get/create string entry */
1743 		soff = dt_find_string(namep);
1744 		if (soff != 0) {
1745 			*mem_start = (unsigned long)namep;
1746 			namep = sstart + soff;
1747 		} else {
1748 			/* Trim off some if we can */
1749 			*mem_start = (unsigned long)namep + strlen(namep) + 1;
1750 			RELOC(dt_string_end) = *mem_start;
1751 		}
1752 		prev_name = namep;
1753 	}
1754 
1755 	/* do all our children */
1756 	child = call_prom("child", 1, 1, node);
1757 	while (child != 0) {
1758 		scan_dt_build_strings(child, mem_start, mem_end);
1759 		child = call_prom("peer", 1, 1, child);
1760 	}
1761 }
1762 
1763 static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
1764 					unsigned long *mem_end)
1765 {
1766 	phandle child;
1767 	char *namep, *prev_name, *sstart, *p, *ep, *lp, *path;
1768 	unsigned long soff;
1769 	unsigned char *valp;
1770 	static char pname[MAX_PROPERTY_NAME];
1771 	int l, room;
1772 
1773 	dt_push_token(OF_DT_BEGIN_NODE, mem_start, mem_end);
1774 
1775 	/* get the node's full name */
1776 	namep = (char *)*mem_start;
1777 	room = *mem_end - *mem_start;
1778 	if (room > 255)
1779 		room = 255;
1780 	l = call_prom("package-to-path", 3, 1, node, namep, room);
1781 	if (l >= 0) {
1782 		/* Didn't fit?  Get more room. */
1783 		if (l >= room) {
1784 			if (l >= *mem_end - *mem_start)
1785 				namep = make_room(mem_start, mem_end, l+1, 1);
1786 			call_prom("package-to-path", 3, 1, node, namep, l);
1787 		}
1788 		namep[l] = '\0';
1789 
1790 		/* Fixup an Apple bug where they have bogus \0 chars in the
1791 		 * middle of the path in some properties, and extract
1792 		 * the unit name (everything after the last '/').
1793 		 */
1794 		for (lp = p = namep, ep = namep + l; p < ep; p++) {
1795 			if (*p == '/')
1796 				lp = namep;
1797 			else if (*p != 0)
1798 				*lp++ = *p;
1799 		}
1800 		*lp = 0;
1801 		*mem_start = _ALIGN((unsigned long)lp + 1, 4);
1802 	}
1803 
1804 	/* get it again for debugging */
1805 	path = RELOC(prom_scratch);
1806 	memset(path, 0, PROM_SCRATCH_SIZE);
1807 	call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1);
1808 
1809 	/* get and store all properties */
1810 	prev_name = RELOC("");
1811 	sstart = (char *)RELOC(dt_string_start);
1812 	for (;;) {
1813 		if (call_prom("nextprop", 3, 1, node, prev_name,
1814 			      RELOC(pname)) != 1)
1815 			break;
1816 
1817  		/* skip "name" */
1818  		if (strcmp(RELOC(pname), RELOC("name")) == 0) {
1819  			prev_name = RELOC("name");
1820  			continue;
1821  		}
1822 
1823 		/* find string offset */
1824 		soff = dt_find_string(RELOC(pname));
1825 		if (soff == 0) {
1826 			prom_printf("WARNING: Can't find string index for"
1827 				    " <%s>, node %s\n", RELOC(pname), path);
1828 			break;
1829 		}
1830 		prev_name = sstart + soff;
1831 
1832 		/* get length */
1833 		l = call_prom("getproplen", 2, 1, node, RELOC(pname));
1834 
1835 		/* sanity checks */
1836 		if (l == PROM_ERROR)
1837 			continue;
1838 		if (l > MAX_PROPERTY_LENGTH) {
1839 			prom_printf("WARNING: ignoring large property ");
1840 			/* It seems OF doesn't null-terminate the path :-( */
1841 			prom_printf("[%s] ", path);
1842 			prom_printf("%s length 0x%x\n", RELOC(pname), l);
1843 			continue;
1844 		}
1845 
1846 		/* push property head */
1847 		dt_push_token(OF_DT_PROP, mem_start, mem_end);
1848 		dt_push_token(l, mem_start, mem_end);
1849 		dt_push_token(soff, mem_start, mem_end);
1850 
1851 		/* push property content */
1852 		valp = make_room(mem_start, mem_end, l, 4);
1853 		call_prom("getprop", 4, 1, node, RELOC(pname), valp, l);
1854 		*mem_start = _ALIGN(*mem_start, 4);
1855 	}
1856 
1857 	/* Add a "linux,phandle" property. */
1858 	soff = dt_find_string(RELOC("linux,phandle"));
1859 	if (soff == 0)
1860 		prom_printf("WARNING: Can't find string index for"
1861 			    " <linux-phandle> node %s\n", path);
1862 	else {
1863 		dt_push_token(OF_DT_PROP, mem_start, mem_end);
1864 		dt_push_token(4, mem_start, mem_end);
1865 		dt_push_token(soff, mem_start, mem_end);
1866 		valp = make_room(mem_start, mem_end, 4, 4);
1867 		*(u32 *)valp = node;
1868 	}
1869 
1870 	/* do all our children */
1871 	child = call_prom("child", 1, 1, node);
1872 	while (child != 0) {
1873 		scan_dt_build_struct(child, mem_start, mem_end);
1874 		child = call_prom("peer", 1, 1, child);
1875 	}
1876 
1877 	dt_push_token(OF_DT_END_NODE, mem_start, mem_end);
1878 }
1879 
1880 static void __init flatten_device_tree(void)
1881 {
1882 	phandle root;
1883 	unsigned long mem_start, mem_end, room;
1884 	struct boot_param_header *hdr;
1885 	struct prom_t *_prom = &RELOC(prom);
1886 	char *namep;
1887 	u64 *rsvmap;
1888 
1889 	/*
1890 	 * Check how much room we have between alloc top & bottom (+/- a
1891 	 * few pages), crop to 4Mb, as this is our "chuck" size
1892 	 */
1893 	room = RELOC(alloc_top) - RELOC(alloc_bottom) - 0x4000;
1894 	if (room > DEVTREE_CHUNK_SIZE)
1895 		room = DEVTREE_CHUNK_SIZE;
1896 	prom_debug("starting device tree allocs at %x\n", RELOC(alloc_bottom));
1897 
1898 	/* Now try to claim that */
1899 	mem_start = (unsigned long)alloc_up(room, PAGE_SIZE);
1900 	if (mem_start == 0)
1901 		prom_panic("Can't allocate initial device-tree chunk\n");
1902 	mem_end = RELOC(alloc_top);
1903 
1904 	/* Get root of tree */
1905 	root = call_prom("peer", 1, 1, (phandle)0);
1906 	if (root == (phandle)0)
1907 		prom_panic ("couldn't get device tree root\n");
1908 
1909 	/* Build header and make room for mem rsv map */
1910 	mem_start = _ALIGN(mem_start, 4);
1911 	hdr = make_room(&mem_start, &mem_end,
1912 			sizeof(struct boot_param_header), 4);
1913 	RELOC(dt_header_start) = (unsigned long)hdr;
1914 	rsvmap = make_room(&mem_start, &mem_end, sizeof(mem_reserve_map), 8);
1915 
1916 	/* Start of strings */
1917 	mem_start = PAGE_ALIGN(mem_start);
1918 	RELOC(dt_string_start) = mem_start;
1919 	mem_start += 4; /* hole */
1920 
1921 	/* Add "linux,phandle" in there, we'll need it */
1922 	namep = make_room(&mem_start, &mem_end, 16, 1);
1923 	strcpy(namep, RELOC("linux,phandle"));
1924 	mem_start = (unsigned long)namep + strlen(namep) + 1;
1925 
1926 	/* Build string array */
1927 	prom_printf("Building dt strings...\n");
1928 	scan_dt_build_strings(root, &mem_start, &mem_end);
1929 	RELOC(dt_string_end) = mem_start;
1930 
1931 	/* Build structure */
1932 	mem_start = PAGE_ALIGN(mem_start);
1933 	RELOC(dt_struct_start) = mem_start;
1934 	prom_printf("Building dt structure...\n");
1935 	scan_dt_build_struct(root, &mem_start, &mem_end);
1936 	dt_push_token(OF_DT_END, &mem_start, &mem_end);
1937 	RELOC(dt_struct_end) = PAGE_ALIGN(mem_start);
1938 
1939 	/* Finish header */
1940 	hdr->boot_cpuid_phys = _prom->cpu;
1941 	hdr->magic = OF_DT_HEADER;
1942 	hdr->totalsize = RELOC(dt_struct_end) - RELOC(dt_header_start);
1943 	hdr->off_dt_struct = RELOC(dt_struct_start) - RELOC(dt_header_start);
1944 	hdr->off_dt_strings = RELOC(dt_string_start) - RELOC(dt_header_start);
1945 	hdr->dt_strings_size = RELOC(dt_string_end) - RELOC(dt_string_start);
1946 	hdr->off_mem_rsvmap = ((unsigned long)rsvmap) - RELOC(dt_header_start);
1947 	hdr->version = OF_DT_VERSION;
1948 	/* Version 16 is not backward compatible */
1949 	hdr->last_comp_version = 0x10;
1950 
1951 	/* Copy the reserve map in */
1952 	memcpy(rsvmap, RELOC(mem_reserve_map), sizeof(mem_reserve_map));
1953 
1954 #ifdef DEBUG_PROM
1955 	{
1956 		int i;
1957 		prom_printf("reserved memory map:\n");
1958 		for (i = 0; i < RELOC(mem_reserve_cnt); i++)
1959 			prom_printf("  %x - %x\n",
1960 				    RELOC(mem_reserve_map)[i].base,
1961 				    RELOC(mem_reserve_map)[i].size);
1962 	}
1963 #endif
1964 	/* Bump mem_reserve_cnt to cause further reservations to fail
1965 	 * since it's too late.
1966 	 */
1967 	RELOC(mem_reserve_cnt) = MEM_RESERVE_MAP_SIZE;
1968 
1969 	prom_printf("Device tree strings 0x%x -> 0x%x\n",
1970 		    RELOC(dt_string_start), RELOC(dt_string_end));
1971 	prom_printf("Device tree struct  0x%x -> 0x%x\n",
1972 		    RELOC(dt_struct_start), RELOC(dt_struct_end));
1973 
1974 }
1975 
1976 #ifdef CONFIG_PPC_MAPLE
1977 /* PIBS Version 1.05.0000 04/26/2005 has an incorrect /ht/isa/ranges property.
1978  * The values are bad, and it doesn't even have the right number of cells. */
1979 static void __init fixup_device_tree_maple(void)
1980 {
1981 	phandle isa;
1982 	u32 rloc = 0x01002000; /* IO space; PCI device = 4 */
1983 	u32 isa_ranges[6];
1984 	char *name;
1985 
1986 	name = "/ht@0/isa@4";
1987 	isa = call_prom("finddevice", 1, 1, ADDR(name));
1988 	if (!PHANDLE_VALID(isa)) {
1989 		name = "/ht@0/isa@6";
1990 		isa = call_prom("finddevice", 1, 1, ADDR(name));
1991 		rloc = 0x01003000; /* IO space; PCI device = 6 */
1992 	}
1993 	if (!PHANDLE_VALID(isa))
1994 		return;
1995 
1996 	if (prom_getproplen(isa, "ranges") != 12)
1997 		return;
1998 	if (prom_getprop(isa, "ranges", isa_ranges, sizeof(isa_ranges))
1999 		== PROM_ERROR)
2000 		return;
2001 
2002 	if (isa_ranges[0] != 0x1 ||
2003 		isa_ranges[1] != 0xf4000000 ||
2004 		isa_ranges[2] != 0x00010000)
2005 		return;
2006 
2007 	prom_printf("Fixing up bogus ISA range on Maple/Apache...\n");
2008 
2009 	isa_ranges[0] = 0x1;
2010 	isa_ranges[1] = 0x0;
2011 	isa_ranges[2] = rloc;
2012 	isa_ranges[3] = 0x0;
2013 	isa_ranges[4] = 0x0;
2014 	isa_ranges[5] = 0x00010000;
2015 	prom_setprop(isa, name, "ranges",
2016 			isa_ranges, sizeof(isa_ranges));
2017 }
2018 #else
2019 #define fixup_device_tree_maple()
2020 #endif
2021 
2022 #ifdef CONFIG_PPC_CHRP
2023 /*
2024  * Pegasos and BriQ lacks the "ranges" property in the isa node
2025  * Pegasos needs decimal IRQ 14/15, not hexadecimal
2026  * Pegasos has the IDE configured in legacy mode, but advertised as native
2027  */
2028 static void __init fixup_device_tree_chrp(void)
2029 {
2030 	phandle ph;
2031 	u32 prop[6];
2032 	u32 rloc = 0x01006000; /* IO space; PCI device = 12 */
2033 	char *name;
2034 	int rc;
2035 
2036 	name = "/pci@80000000/isa@c";
2037 	ph = call_prom("finddevice", 1, 1, ADDR(name));
2038 	if (!PHANDLE_VALID(ph)) {
2039 		name = "/pci@ff500000/isa@6";
2040 		ph = call_prom("finddevice", 1, 1, ADDR(name));
2041 		rloc = 0x01003000; /* IO space; PCI device = 6 */
2042 	}
2043 	if (PHANDLE_VALID(ph)) {
2044 		rc = prom_getproplen(ph, "ranges");
2045 		if (rc == 0 || rc == PROM_ERROR) {
2046 			prom_printf("Fixing up missing ISA range on Pegasos...\n");
2047 
2048 			prop[0] = 0x1;
2049 			prop[1] = 0x0;
2050 			prop[2] = rloc;
2051 			prop[3] = 0x0;
2052 			prop[4] = 0x0;
2053 			prop[5] = 0x00010000;
2054 			prom_setprop(ph, name, "ranges", prop, sizeof(prop));
2055 		}
2056 	}
2057 
2058 	name = "/pci@80000000/ide@C,1";
2059 	ph = call_prom("finddevice", 1, 1, ADDR(name));
2060 	if (PHANDLE_VALID(ph)) {
2061 		prom_printf("Fixing up IDE interrupt on Pegasos...\n");
2062 		prop[0] = 14;
2063 		prop[1] = 0x0;
2064 		prom_setprop(ph, name, "interrupts", prop, 2*sizeof(u32));
2065 		prom_printf("Fixing up IDE class-code on Pegasos...\n");
2066 		rc = prom_getprop(ph, "class-code", prop, sizeof(u32));
2067 		if (rc == sizeof(u32)) {
2068 			prop[0] &= ~0x5;
2069 			prom_setprop(ph, name, "class-code", prop, sizeof(u32));
2070 		}
2071 	}
2072 }
2073 #else
2074 #define fixup_device_tree_chrp()
2075 #endif
2076 
2077 #if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC)
2078 static void __init fixup_device_tree_pmac(void)
2079 {
2080 	phandle u3, i2c, mpic;
2081 	u32 u3_rev;
2082 	u32 interrupts[2];
2083 	u32 parent;
2084 
2085 	/* Some G5s have a missing interrupt definition, fix it up here */
2086 	u3 = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000"));
2087 	if (!PHANDLE_VALID(u3))
2088 		return;
2089 	i2c = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/i2c@f8001000"));
2090 	if (!PHANDLE_VALID(i2c))
2091 		return;
2092 	mpic = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/mpic@f8040000"));
2093 	if (!PHANDLE_VALID(mpic))
2094 		return;
2095 
2096 	/* check if proper rev of u3 */
2097 	if (prom_getprop(u3, "device-rev", &u3_rev, sizeof(u3_rev))
2098 	    == PROM_ERROR)
2099 		return;
2100 	if (u3_rev < 0x35 || u3_rev > 0x39)
2101 		return;
2102 	/* does it need fixup ? */
2103 	if (prom_getproplen(i2c, "interrupts") > 0)
2104 		return;
2105 
2106 	prom_printf("fixing up bogus interrupts for u3 i2c...\n");
2107 
2108 	/* interrupt on this revision of u3 is number 0 and level */
2109 	interrupts[0] = 0;
2110 	interrupts[1] = 1;
2111 	prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupts",
2112 		     &interrupts, sizeof(interrupts));
2113 	parent = (u32)mpic;
2114 	prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupt-parent",
2115 		     &parent, sizeof(parent));
2116 }
2117 #else
2118 #define fixup_device_tree_pmac()
2119 #endif
2120 
2121 #ifdef CONFIG_PPC_EFIKA
2122 /*
2123  * The MPC5200 FEC driver requires an phy-handle property to tell it how
2124  * to talk to the phy.  If the phy-handle property is missing, then this
2125  * function is called to add the appropriate nodes and link it to the
2126  * ethernet node.
2127  */
2128 static void __init fixup_device_tree_efika_add_phy(void)
2129 {
2130 	u32 node;
2131 	char prop[64];
2132 	int rv;
2133 
2134 	/* Check if /builtin/ethernet exists - bail if it doesn't */
2135 	node = call_prom("finddevice", 1, 1, ADDR("/builtin/ethernet"));
2136 	if (!PHANDLE_VALID(node))
2137 		return;
2138 
2139 	/* Check if the phy-handle property exists - bail if it does */
2140 	rv = prom_getprop(node, "phy-handle", prop, sizeof(prop));
2141 	if (!rv)
2142 		return;
2143 
2144 	/*
2145 	 * At this point the ethernet device doesn't have a phy described.
2146 	 * Now we need to add the missing phy node and linkage
2147 	 */
2148 
2149 	/* Check for an MDIO bus node - if missing then create one */
2150 	node = call_prom("finddevice", 1, 1, ADDR("/builtin/mdio"));
2151 	if (!PHANDLE_VALID(node)) {
2152 		prom_printf("Adding Ethernet MDIO node\n");
2153 		call_prom("interpret", 1, 1,
2154 			" s\" /builtin\" find-device"
2155 			" new-device"
2156 				" 1 encode-int s\" #address-cells\" property"
2157 				" 0 encode-int s\" #size-cells\" property"
2158 				" s\" mdio\" device-name"
2159 				" s\" fsl,mpc5200b-mdio\" encode-string"
2160 				" s\" compatible\" property"
2161 				" 0xf0003000 0x400 reg"
2162 				" 0x2 encode-int"
2163 				" 0x5 encode-int encode+"
2164 				" 0x3 encode-int encode+"
2165 				" s\" interrupts\" property"
2166 			" finish-device");
2167 	};
2168 
2169 	/* Check for a PHY device node - if missing then create one and
2170 	 * give it's phandle to the ethernet node */
2171 	node = call_prom("finddevice", 1, 1,
2172 			 ADDR("/builtin/mdio/ethernet-phy"));
2173 	if (!PHANDLE_VALID(node)) {
2174 		prom_printf("Adding Ethernet PHY node\n");
2175 		call_prom("interpret", 1, 1,
2176 			" s\" /builtin/mdio\" find-device"
2177 			" new-device"
2178 				" s\" ethernet-phy\" device-name"
2179 				" 0x10 encode-int s\" reg\" property"
2180 				" my-self"
2181 				" ihandle>phandle"
2182 			" finish-device"
2183 			" s\" /builtin/ethernet\" find-device"
2184 				" encode-int"
2185 				" s\" phy-handle\" property"
2186 			" device-end");
2187 	}
2188 }
2189 
2190 static void __init fixup_device_tree_efika(void)
2191 {
2192 	int sound_irq[3] = { 2, 2, 0 };
2193 	int bcomm_irq[3*16] = { 3,0,0, 3,1,0, 3,2,0, 3,3,0,
2194 				3,4,0, 3,5,0, 3,6,0, 3,7,0,
2195 				3,8,0, 3,9,0, 3,10,0, 3,11,0,
2196 				3,12,0, 3,13,0, 3,14,0, 3,15,0 };
2197 	u32 node;
2198 	char prop[64];
2199 	int rv, len;
2200 
2201 	/* Check if we're really running on a EFIKA */
2202 	node = call_prom("finddevice", 1, 1, ADDR("/"));
2203 	if (!PHANDLE_VALID(node))
2204 		return;
2205 
2206 	rv = prom_getprop(node, "model", prop, sizeof(prop));
2207 	if (rv == PROM_ERROR)
2208 		return;
2209 	if (strcmp(prop, "EFIKA5K2"))
2210 		return;
2211 
2212 	prom_printf("Applying EFIKA device tree fixups\n");
2213 
2214 	/* Claiming to be 'chrp' is death */
2215 	node = call_prom("finddevice", 1, 1, ADDR("/"));
2216 	rv = prom_getprop(node, "device_type", prop, sizeof(prop));
2217 	if (rv != PROM_ERROR && (strcmp(prop, "chrp") == 0))
2218 		prom_setprop(node, "/", "device_type", "efika", sizeof("efika"));
2219 
2220 	/* CODEGEN,description is exposed in /proc/cpuinfo so
2221 	   fix that too */
2222 	rv = prom_getprop(node, "CODEGEN,description", prop, sizeof(prop));
2223 	if (rv != PROM_ERROR && (strstr(prop, "CHRP")))
2224 		prom_setprop(node, "/", "CODEGEN,description",
2225 			     "Efika 5200B PowerPC System",
2226 			     sizeof("Efika 5200B PowerPC System"));
2227 
2228 	/* Fixup bestcomm interrupts property */
2229 	node = call_prom("finddevice", 1, 1, ADDR("/builtin/bestcomm"));
2230 	if (PHANDLE_VALID(node)) {
2231 		len = prom_getproplen(node, "interrupts");
2232 		if (len == 12) {
2233 			prom_printf("Fixing bestcomm interrupts property\n");
2234 			prom_setprop(node, "/builtin/bestcom", "interrupts",
2235 				     bcomm_irq, sizeof(bcomm_irq));
2236 		}
2237 	}
2238 
2239 	/* Fixup sound interrupts property */
2240 	node = call_prom("finddevice", 1, 1, ADDR("/builtin/sound"));
2241 	if (PHANDLE_VALID(node)) {
2242 		rv = prom_getprop(node, "interrupts", prop, sizeof(prop));
2243 		if (rv == PROM_ERROR) {
2244 			prom_printf("Adding sound interrupts property\n");
2245 			prom_setprop(node, "/builtin/sound", "interrupts",
2246 				     sound_irq, sizeof(sound_irq));
2247 		}
2248 	}
2249 
2250 	/* Make sure ethernet phy-handle property exists */
2251 	fixup_device_tree_efika_add_phy();
2252 }
2253 #else
2254 #define fixup_device_tree_efika()
2255 #endif
2256 
2257 static void __init fixup_device_tree(void)
2258 {
2259 	fixup_device_tree_maple();
2260 	fixup_device_tree_chrp();
2261 	fixup_device_tree_pmac();
2262 	fixup_device_tree_efika();
2263 }
2264 
2265 static void __init prom_find_boot_cpu(void)
2266 {
2267 	struct prom_t *_prom = &RELOC(prom);
2268 	u32 getprop_rval;
2269 	ihandle prom_cpu;
2270 	phandle cpu_pkg;
2271 
2272 	_prom->cpu = 0;
2273 	if (prom_getprop(_prom->chosen, "cpu", &prom_cpu, sizeof(prom_cpu)) <= 0)
2274 		return;
2275 
2276 	cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu);
2277 
2278 	prom_getprop(cpu_pkg, "reg", &getprop_rval, sizeof(getprop_rval));
2279 	_prom->cpu = getprop_rval;
2280 
2281 	prom_debug("Booting CPU hw index = 0x%x\n", _prom->cpu);
2282 }
2283 
2284 static void __init prom_check_initrd(unsigned long r3, unsigned long r4)
2285 {
2286 #ifdef CONFIG_BLK_DEV_INITRD
2287 	struct prom_t *_prom = &RELOC(prom);
2288 
2289 	if (r3 && r4 && r4 != 0xdeadbeef) {
2290 		unsigned long val;
2291 
2292 		RELOC(prom_initrd_start) = is_kernel_addr(r3) ? __pa(r3) : r3;
2293 		RELOC(prom_initrd_end) = RELOC(prom_initrd_start) + r4;
2294 
2295 		val = RELOC(prom_initrd_start);
2296 		prom_setprop(_prom->chosen, "/chosen", "linux,initrd-start",
2297 			     &val, sizeof(val));
2298 		val = RELOC(prom_initrd_end);
2299 		prom_setprop(_prom->chosen, "/chosen", "linux,initrd-end",
2300 			     &val, sizeof(val));
2301 
2302 		reserve_mem(RELOC(prom_initrd_start),
2303 			    RELOC(prom_initrd_end) - RELOC(prom_initrd_start));
2304 
2305 		prom_debug("initrd_start=0x%x\n", RELOC(prom_initrd_start));
2306 		prom_debug("initrd_end=0x%x\n", RELOC(prom_initrd_end));
2307 	}
2308 #endif /* CONFIG_BLK_DEV_INITRD */
2309 }
2310 
2311 /*
2312  * We enter here early on, when the Open Firmware prom is still
2313  * handling exceptions and the MMU hash table for us.
2314  */
2315 
2316 unsigned long __init prom_init(unsigned long r3, unsigned long r4,
2317 			       unsigned long pp,
2318 			       unsigned long r6, unsigned long r7)
2319 {
2320 	struct prom_t *_prom;
2321 	unsigned long hdr;
2322 	unsigned long offset = reloc_offset();
2323 
2324 #ifdef CONFIG_PPC32
2325 	reloc_got2(offset);
2326 #endif
2327 
2328 	_prom = &RELOC(prom);
2329 
2330 	/*
2331 	 * First zero the BSS
2332 	 */
2333 	memset(&RELOC(__bss_start), 0, __bss_stop - __bss_start);
2334 
2335 	/*
2336 	 * Init interface to Open Firmware, get some node references,
2337 	 * like /chosen
2338 	 */
2339 	prom_init_client_services(pp);
2340 
2341 	/*
2342 	 * See if this OF is old enough that we need to do explicit maps
2343 	 * and other workarounds
2344 	 */
2345 	prom_find_mmu();
2346 
2347 	/*
2348 	 * Init prom stdout device
2349 	 */
2350 	prom_init_stdout();
2351 
2352 	/*
2353 	 * Get default machine type. At this point, we do not differentiate
2354 	 * between pSeries SMP and pSeries LPAR
2355 	 */
2356 	RELOC(of_platform) = prom_find_machine_type();
2357 
2358 	/* Bail if this is a kdump kernel. */
2359 	if (PHYSICAL_START > 0)
2360 		prom_panic("Error: You can't boot a kdump kernel from OF!\n");
2361 
2362 	/*
2363 	 * Check for an initrd
2364 	 */
2365 	prom_check_initrd(r3, r4);
2366 
2367 #ifdef CONFIG_PPC_PSERIES
2368 	/*
2369 	 * On pSeries, inform the firmware about our capabilities
2370 	 */
2371 	if (RELOC(of_platform) == PLATFORM_PSERIES ||
2372 	    RELOC(of_platform) == PLATFORM_PSERIES_LPAR)
2373 		prom_send_capabilities();
2374 #endif
2375 
2376 	/*
2377 	 * Copy the CPU hold code
2378 	 */
2379 	if (RELOC(of_platform) != PLATFORM_POWERMAC)
2380 		copy_and_flush(0, KERNELBASE + offset, 0x100, 0);
2381 
2382 	/*
2383 	 * Do early parsing of command line
2384 	 */
2385 	early_cmdline_parse();
2386 
2387 	/*
2388 	 * Initialize memory management within prom_init
2389 	 */
2390 	prom_init_mem();
2391 
2392 	/*
2393 	 * Determine which cpu is actually running right _now_
2394 	 */
2395 	prom_find_boot_cpu();
2396 
2397 	/*
2398 	 * Initialize display devices
2399 	 */
2400 	prom_check_displays();
2401 
2402 #ifdef CONFIG_PPC64
2403 	/*
2404 	 * Initialize IOMMU (TCE tables) on pSeries. Do that before anything else
2405 	 * that uses the allocator, we need to make sure we get the top of memory
2406 	 * available for us here...
2407 	 */
2408 	if (RELOC(of_platform) == PLATFORM_PSERIES)
2409 		prom_initialize_tce_table();
2410 #endif
2411 
2412 	/*
2413 	 * On non-powermacs, try to instantiate RTAS and puts all CPUs
2414 	 * in spin-loops. PowerMacs don't have a working RTAS and use
2415 	 * a different way to spin CPUs
2416 	 */
2417 	if (RELOC(of_platform) != PLATFORM_POWERMAC) {
2418 		prom_instantiate_rtas();
2419 		prom_hold_cpus();
2420 	}
2421 
2422 	/*
2423 	 * Fill in some infos for use by the kernel later on
2424 	 */
2425 #ifdef CONFIG_PPC64
2426 	if (RELOC(prom_iommu_off))
2427 		prom_setprop(_prom->chosen, "/chosen", "linux,iommu-off",
2428 			     NULL, 0);
2429 
2430 	if (RELOC(prom_iommu_force_on))
2431 		prom_setprop(_prom->chosen, "/chosen", "linux,iommu-force-on",
2432 			     NULL, 0);
2433 
2434 	if (RELOC(prom_tce_alloc_start)) {
2435 		prom_setprop(_prom->chosen, "/chosen", "linux,tce-alloc-start",
2436 			     &RELOC(prom_tce_alloc_start),
2437 			     sizeof(prom_tce_alloc_start));
2438 		prom_setprop(_prom->chosen, "/chosen", "linux,tce-alloc-end",
2439 			     &RELOC(prom_tce_alloc_end),
2440 			     sizeof(prom_tce_alloc_end));
2441 	}
2442 #endif
2443 
2444 	/*
2445 	 * Fixup any known bugs in the device-tree
2446 	 */
2447 	fixup_device_tree();
2448 
2449 	/*
2450 	 * Now finally create the flattened device-tree
2451 	 */
2452 	prom_printf("copying OF device tree ...\n");
2453 	flatten_device_tree();
2454 
2455 	/*
2456 	 * in case stdin is USB and still active on IBM machines...
2457 	 * Unfortunately quiesce crashes on some powermacs if we have
2458 	 * closed stdin already (in particular the powerbook 101).
2459 	 */
2460 	if (RELOC(of_platform) != PLATFORM_POWERMAC)
2461 		prom_close_stdin();
2462 
2463 	/*
2464 	 * Call OF "quiesce" method to shut down pending DMA's from
2465 	 * devices etc...
2466 	 */
2467 	prom_printf("Calling quiesce ...\n");
2468 	call_prom("quiesce", 0, 0);
2469 
2470 	/*
2471 	 * And finally, call the kernel passing it the flattened device
2472 	 * tree and NULL as r5, thus triggering the new entry point which
2473 	 * is common to us and kexec
2474 	 */
2475 	hdr = RELOC(dt_header_start);
2476 	prom_printf("returning from prom_init\n");
2477 	prom_debug("->dt_header_start=0x%x\n", hdr);
2478 
2479 #ifdef CONFIG_PPC32
2480 	reloc_got2(-offset);
2481 #endif
2482 
2483 	__start(hdr, KERNELBASE + offset, 0);
2484 
2485 	return 0;
2486 }
2487