xref: /linux/arch/powerpc/kernel/prom_init.c (revision b7019ac550eb3916f34d79db583e9b7ea2524afa)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Procedures for interfacing to Open Firmware.
4  *
5  * Paul Mackerras	August 1996.
6  * Copyright (C) 1996-2005 Paul Mackerras.
7  *
8  *  Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner.
9  *    {engebret|bergner}@us.ibm.com
10  */
11 
12 #undef DEBUG_PROM
13 
14 /* we cannot use FORTIFY as it brings in new symbols */
15 #define __NO_FORTIFY
16 
17 #include <stdarg.h>
18 #include <linux/kernel.h>
19 #include <linux/string.h>
20 #include <linux/init.h>
21 #include <linux/threads.h>
22 #include <linux/spinlock.h>
23 #include <linux/types.h>
24 #include <linux/pci.h>
25 #include <linux/proc_fs.h>
26 #include <linux/delay.h>
27 #include <linux/initrd.h>
28 #include <linux/bitops.h>
29 #include <asm/prom.h>
30 #include <asm/rtas.h>
31 #include <asm/page.h>
32 #include <asm/processor.h>
33 #include <asm/irq.h>
34 #include <asm/io.h>
35 #include <asm/smp.h>
36 #include <asm/mmu.h>
37 #include <asm/pgtable.h>
38 #include <asm/iommu.h>
39 #include <asm/btext.h>
40 #include <asm/sections.h>
41 #include <asm/machdep.h>
42 #include <asm/asm-prototypes.h>
43 
44 #include <linux/linux_logo.h>
45 
46 /* All of prom_init bss lives here */
47 #define __prombss __section(.bss.prominit)
48 
49 /*
50  * Eventually bump that one up
51  */
52 #define DEVTREE_CHUNK_SIZE	0x100000
53 
54 /*
55  * This is the size of the local memory reserve map that gets copied
56  * into the boot params passed to the kernel. That size is totally
57  * flexible as the kernel just reads the list until it encounters an
58  * entry with size 0, so it can be changed without breaking binary
59  * compatibility
60  */
61 #define MEM_RESERVE_MAP_SIZE	8
62 
63 /*
64  * prom_init() is called very early on, before the kernel text
65  * and data have been mapped to KERNELBASE.  At this point the code
66  * is running at whatever address it has been loaded at.
67  * On ppc32 we compile with -mrelocatable, which means that references
68  * to extern and static variables get relocated automatically.
69  * ppc64 objects are always relocatable, we just need to relocate the
70  * TOC.
71  *
72  * Because OF may have mapped I/O devices into the area starting at
73  * KERNELBASE, particularly on CHRP machines, we can't safely call
74  * OF once the kernel has been mapped to KERNELBASE.  Therefore all
75  * OF calls must be done within prom_init().
76  *
77  * ADDR is used in calls to call_prom.  The 4th and following
78  * arguments to call_prom should be 32-bit values.
79  * On ppc64, 64 bit values are truncated to 32 bits (and
80  * fortunately don't get interpreted as two arguments).
81  */
82 #define ADDR(x)		(u32)(unsigned long)(x)
83 
84 #ifdef CONFIG_PPC64
85 #define OF_WORKAROUNDS	0
86 #else
87 #define OF_WORKAROUNDS	of_workarounds
88 static int of_workarounds __prombss;
89 #endif
90 
91 #define OF_WA_CLAIM	1	/* do phys/virt claim separately, then map */
92 #define OF_WA_LONGTRAIL	2	/* work around longtrail bugs */
93 
94 #define PROM_BUG() do {						\
95         prom_printf("kernel BUG at %s line 0x%x!\n",		\
96 		    __FILE__, __LINE__);			\
97         __asm__ __volatile__(".long " BUG_ILLEGAL_INSTR);	\
98 } while (0)
99 
100 #ifdef DEBUG_PROM
101 #define prom_debug(x...)	prom_printf(x)
102 #else
103 #define prom_debug(x...)	do { } while (0)
104 #endif
105 
106 
107 typedef u32 prom_arg_t;
108 
109 struct prom_args {
110         __be32 service;
111         __be32 nargs;
112         __be32 nret;
113         __be32 args[10];
114 };
115 
116 struct prom_t {
117 	ihandle root;
118 	phandle chosen;
119 	int cpu;
120 	ihandle stdout;
121 	ihandle mmumap;
122 	ihandle memory;
123 };
124 
125 struct mem_map_entry {
126 	__be64	base;
127 	__be64	size;
128 };
129 
130 typedef __be32 cell_t;
131 
132 extern void __start(unsigned long r3, unsigned long r4, unsigned long r5,
133 		    unsigned long r6, unsigned long r7, unsigned long r8,
134 		    unsigned long r9);
135 
136 #ifdef CONFIG_PPC64
137 extern int enter_prom(struct prom_args *args, unsigned long entry);
138 #else
139 static inline int enter_prom(struct prom_args *args, unsigned long entry)
140 {
141 	return ((int (*)(struct prom_args *))entry)(args);
142 }
143 #endif
144 
145 extern void copy_and_flush(unsigned long dest, unsigned long src,
146 			   unsigned long size, unsigned long offset);
147 
148 /* prom structure */
149 static struct prom_t __prombss prom;
150 
151 static unsigned long __prombss prom_entry;
152 
153 static char __prombss of_stdout_device[256];
154 static char __prombss prom_scratch[256];
155 
156 static unsigned long __prombss dt_header_start;
157 static unsigned long __prombss dt_struct_start, dt_struct_end;
158 static unsigned long __prombss dt_string_start, dt_string_end;
159 
160 static unsigned long __prombss prom_initrd_start, prom_initrd_end;
161 
162 #ifdef CONFIG_PPC64
163 static int __prombss prom_iommu_force_on;
164 static int __prombss prom_iommu_off;
165 static unsigned long __prombss prom_tce_alloc_start;
166 static unsigned long __prombss prom_tce_alloc_end;
167 #endif
168 
169 #ifdef CONFIG_PPC_PSERIES
170 static bool __prombss prom_radix_disable;
171 #endif
172 
173 struct platform_support {
174 	bool hash_mmu;
175 	bool radix_mmu;
176 	bool radix_gtse;
177 	bool xive;
178 };
179 
180 /* Platforms codes are now obsolete in the kernel. Now only used within this
181  * file and ultimately gone too. Feel free to change them if you need, they
182  * are not shared with anything outside of this file anymore
183  */
184 #define PLATFORM_PSERIES	0x0100
185 #define PLATFORM_PSERIES_LPAR	0x0101
186 #define PLATFORM_LPAR		0x0001
187 #define PLATFORM_POWERMAC	0x0400
188 #define PLATFORM_GENERIC	0x0500
189 
190 static int __prombss of_platform;
191 
192 static char __prombss prom_cmd_line[COMMAND_LINE_SIZE];
193 
194 static unsigned long __prombss prom_memory_limit;
195 
196 static unsigned long __prombss alloc_top;
197 static unsigned long __prombss alloc_top_high;
198 static unsigned long __prombss alloc_bottom;
199 static unsigned long __prombss rmo_top;
200 static unsigned long __prombss ram_top;
201 
202 static struct mem_map_entry __prombss mem_reserve_map[MEM_RESERVE_MAP_SIZE];
203 static int __prombss mem_reserve_cnt;
204 
205 static cell_t __prombss regbuf[1024];
206 
207 static bool  __prombss rtas_has_query_cpu_stopped;
208 
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 /* Copied from lib/string.c and lib/kstrtox.c */
222 
223 static int __init prom_strcmp(const char *cs, const char *ct)
224 {
225 	unsigned char c1, c2;
226 
227 	while (1) {
228 		c1 = *cs++;
229 		c2 = *ct++;
230 		if (c1 != c2)
231 			return c1 < c2 ? -1 : 1;
232 		if (!c1)
233 			break;
234 	}
235 	return 0;
236 }
237 
238 static char __init *prom_strcpy(char *dest, const char *src)
239 {
240 	char *tmp = dest;
241 
242 	while ((*dest++ = *src++) != '\0')
243 		/* nothing */;
244 	return tmp;
245 }
246 
247 static int __init prom_strncmp(const char *cs, const char *ct, size_t count)
248 {
249 	unsigned char c1, c2;
250 
251 	while (count) {
252 		c1 = *cs++;
253 		c2 = *ct++;
254 		if (c1 != c2)
255 			return c1 < c2 ? -1 : 1;
256 		if (!c1)
257 			break;
258 		count--;
259 	}
260 	return 0;
261 }
262 
263 static size_t __init prom_strlen(const char *s)
264 {
265 	const char *sc;
266 
267 	for (sc = s; *sc != '\0'; ++sc)
268 		/* nothing */;
269 	return sc - s;
270 }
271 
272 static int __init prom_memcmp(const void *cs, const void *ct, size_t count)
273 {
274 	const unsigned char *su1, *su2;
275 	int res = 0;
276 
277 	for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
278 		if ((res = *su1 - *su2) != 0)
279 			break;
280 	return res;
281 }
282 
283 static char __init *prom_strstr(const char *s1, const char *s2)
284 {
285 	size_t l1, l2;
286 
287 	l2 = prom_strlen(s2);
288 	if (!l2)
289 		return (char *)s1;
290 	l1 = prom_strlen(s1);
291 	while (l1 >= l2) {
292 		l1--;
293 		if (!prom_memcmp(s1, s2, l2))
294 			return (char *)s1;
295 		s1++;
296 	}
297 	return NULL;
298 }
299 
300 static size_t __init prom_strlcpy(char *dest, const char *src, size_t size)
301 {
302 	size_t ret = prom_strlen(src);
303 
304 	if (size) {
305 		size_t len = (ret >= size) ? size - 1 : ret;
306 		memcpy(dest, src, len);
307 		dest[len] = '\0';
308 	}
309 	return ret;
310 }
311 
312 #ifdef CONFIG_PPC_PSERIES
313 static int __init prom_strtobool(const char *s, bool *res)
314 {
315 	if (!s)
316 		return -EINVAL;
317 
318 	switch (s[0]) {
319 	case 'y':
320 	case 'Y':
321 	case '1':
322 		*res = true;
323 		return 0;
324 	case 'n':
325 	case 'N':
326 	case '0':
327 		*res = false;
328 		return 0;
329 	case 'o':
330 	case 'O':
331 		switch (s[1]) {
332 		case 'n':
333 		case 'N':
334 			*res = true;
335 			return 0;
336 		case 'f':
337 		case 'F':
338 			*res = false;
339 			return 0;
340 		default:
341 			break;
342 		}
343 	default:
344 		break;
345 	}
346 
347 	return -EINVAL;
348 }
349 #endif
350 
351 /* This is the one and *ONLY* place where we actually call open
352  * firmware.
353  */
354 
355 static int __init call_prom(const char *service, int nargs, int nret, ...)
356 {
357 	int i;
358 	struct prom_args args;
359 	va_list list;
360 
361 	args.service = cpu_to_be32(ADDR(service));
362 	args.nargs = cpu_to_be32(nargs);
363 	args.nret = cpu_to_be32(nret);
364 
365 	va_start(list, nret);
366 	for (i = 0; i < nargs; i++)
367 		args.args[i] = cpu_to_be32(va_arg(list, prom_arg_t));
368 	va_end(list);
369 
370 	for (i = 0; i < nret; i++)
371 		args.args[nargs+i] = 0;
372 
373 	if (enter_prom(&args, prom_entry) < 0)
374 		return PROM_ERROR;
375 
376 	return (nret > 0) ? be32_to_cpu(args.args[nargs]) : 0;
377 }
378 
379 static int __init call_prom_ret(const char *service, int nargs, int nret,
380 				prom_arg_t *rets, ...)
381 {
382 	int i;
383 	struct prom_args args;
384 	va_list list;
385 
386 	args.service = cpu_to_be32(ADDR(service));
387 	args.nargs = cpu_to_be32(nargs);
388 	args.nret = cpu_to_be32(nret);
389 
390 	va_start(list, rets);
391 	for (i = 0; i < nargs; i++)
392 		args.args[i] = cpu_to_be32(va_arg(list, prom_arg_t));
393 	va_end(list);
394 
395 	for (i = 0; i < nret; i++)
396 		args.args[nargs+i] = 0;
397 
398 	if (enter_prom(&args, prom_entry) < 0)
399 		return PROM_ERROR;
400 
401 	if (rets != NULL)
402 		for (i = 1; i < nret; ++i)
403 			rets[i-1] = be32_to_cpu(args.args[nargs+i]);
404 
405 	return (nret > 0) ? be32_to_cpu(args.args[nargs]) : 0;
406 }
407 
408 
409 static void __init prom_print(const char *msg)
410 {
411 	const char *p, *q;
412 
413 	if (prom.stdout == 0)
414 		return;
415 
416 	for (p = msg; *p != 0; p = q) {
417 		for (q = p; *q != 0 && *q != '\n'; ++q)
418 			;
419 		if (q > p)
420 			call_prom("write", 3, 1, prom.stdout, p, q - p);
421 		if (*q == 0)
422 			break;
423 		++q;
424 		call_prom("write", 3, 1, prom.stdout, ADDR("\r\n"), 2);
425 	}
426 }
427 
428 
429 /*
430  * Both prom_print_hex & prom_print_dec takes an unsigned long as input so that
431  * we do not need __udivdi3 or __umoddi3 on 32bits.
432  */
433 static void __init prom_print_hex(unsigned long val)
434 {
435 	int i, nibbles = sizeof(val)*2;
436 	char buf[sizeof(val)*2+1];
437 
438 	for (i = nibbles-1;  i >= 0;  i--) {
439 		buf[i] = (val & 0xf) + '0';
440 		if (buf[i] > '9')
441 			buf[i] += ('a'-'0'-10);
442 		val >>= 4;
443 	}
444 	buf[nibbles] = '\0';
445 	call_prom("write", 3, 1, prom.stdout, buf, nibbles);
446 }
447 
448 /* max number of decimal digits in an unsigned long */
449 #define UL_DIGITS 21
450 static void __init prom_print_dec(unsigned long val)
451 {
452 	int i, size;
453 	char buf[UL_DIGITS+1];
454 
455 	for (i = UL_DIGITS-1; i >= 0;  i--) {
456 		buf[i] = (val % 10) + '0';
457 		val = val/10;
458 		if (val == 0)
459 			break;
460 	}
461 	/* shift stuff down */
462 	size = UL_DIGITS - i;
463 	call_prom("write", 3, 1, prom.stdout, buf+i, size);
464 }
465 
466 __printf(1, 2)
467 static void __init prom_printf(const char *format, ...)
468 {
469 	const char *p, *q, *s;
470 	va_list args;
471 	unsigned long v;
472 	long vs;
473 	int n = 0;
474 
475 	va_start(args, format);
476 	for (p = format; *p != 0; p = q) {
477 		for (q = p; *q != 0 && *q != '\n' && *q != '%'; ++q)
478 			;
479 		if (q > p)
480 			call_prom("write", 3, 1, prom.stdout, p, q - p);
481 		if (*q == 0)
482 			break;
483 		if (*q == '\n') {
484 			++q;
485 			call_prom("write", 3, 1, prom.stdout,
486 				  ADDR("\r\n"), 2);
487 			continue;
488 		}
489 		++q;
490 		if (*q == 0)
491 			break;
492 		while (*q == 'l') {
493 			++q;
494 			++n;
495 		}
496 		switch (*q) {
497 		case 's':
498 			++q;
499 			s = va_arg(args, const char *);
500 			prom_print(s);
501 			break;
502 		case 'x':
503 			++q;
504 			switch (n) {
505 			case 0:
506 				v = va_arg(args, unsigned int);
507 				break;
508 			case 1:
509 				v = va_arg(args, unsigned long);
510 				break;
511 			case 2:
512 			default:
513 				v = va_arg(args, unsigned long long);
514 				break;
515 			}
516 			prom_print_hex(v);
517 			break;
518 		case 'u':
519 			++q;
520 			switch (n) {
521 			case 0:
522 				v = va_arg(args, unsigned int);
523 				break;
524 			case 1:
525 				v = va_arg(args, unsigned long);
526 				break;
527 			case 2:
528 			default:
529 				v = va_arg(args, unsigned long long);
530 				break;
531 			}
532 			prom_print_dec(v);
533 			break;
534 		case 'd':
535 			++q;
536 			switch (n) {
537 			case 0:
538 				vs = va_arg(args, int);
539 				break;
540 			case 1:
541 				vs = va_arg(args, long);
542 				break;
543 			case 2:
544 			default:
545 				vs = va_arg(args, long long);
546 				break;
547 			}
548 			if (vs < 0) {
549 				prom_print("-");
550 				vs = -vs;
551 			}
552 			prom_print_dec(vs);
553 			break;
554 		}
555 	}
556 	va_end(args);
557 }
558 
559 
560 static unsigned int __init prom_claim(unsigned long virt, unsigned long size,
561 				unsigned long align)
562 {
563 
564 	if (align == 0 && (OF_WORKAROUNDS & OF_WA_CLAIM)) {
565 		/*
566 		 * Old OF requires we claim physical and virtual separately
567 		 * and then map explicitly (assuming virtual mode)
568 		 */
569 		int ret;
570 		prom_arg_t result;
571 
572 		ret = call_prom_ret("call-method", 5, 2, &result,
573 				    ADDR("claim"), prom.memory,
574 				    align, size, virt);
575 		if (ret != 0 || result == -1)
576 			return -1;
577 		ret = call_prom_ret("call-method", 5, 2, &result,
578 				    ADDR("claim"), prom.mmumap,
579 				    align, size, virt);
580 		if (ret != 0) {
581 			call_prom("call-method", 4, 1, ADDR("release"),
582 				  prom.memory, size, virt);
583 			return -1;
584 		}
585 		/* the 0x12 is M (coherence) + PP == read/write */
586 		call_prom("call-method", 6, 1,
587 			  ADDR("map"), prom.mmumap, 0x12, size, virt, virt);
588 		return virt;
589 	}
590 	return call_prom("claim", 3, 1, (prom_arg_t)virt, (prom_arg_t)size,
591 			 (prom_arg_t)align);
592 }
593 
594 static void __init __attribute__((noreturn)) prom_panic(const char *reason)
595 {
596 	prom_print(reason);
597 	/* Do not call exit because it clears the screen on pmac
598 	 * it also causes some sort of double-fault on early pmacs */
599 	if (of_platform == PLATFORM_POWERMAC)
600 		asm("trap\n");
601 
602 	/* ToDo: should put up an SRC here on pSeries */
603 	call_prom("exit", 0, 0);
604 
605 	for (;;)			/* should never get here */
606 		;
607 }
608 
609 
610 static int __init prom_next_node(phandle *nodep)
611 {
612 	phandle node;
613 
614 	if ((node = *nodep) != 0
615 	    && (*nodep = call_prom("child", 1, 1, node)) != 0)
616 		return 1;
617 	if ((*nodep = call_prom("peer", 1, 1, node)) != 0)
618 		return 1;
619 	for (;;) {
620 		if ((node = call_prom("parent", 1, 1, node)) == 0)
621 			return 0;
622 		if ((*nodep = call_prom("peer", 1, 1, node)) != 0)
623 			return 1;
624 	}
625 }
626 
627 static inline int __init prom_getprop(phandle node, const char *pname,
628 				      void *value, size_t valuelen)
629 {
630 	return call_prom("getprop", 4, 1, node, ADDR(pname),
631 			 (u32)(unsigned long) value, (u32) valuelen);
632 }
633 
634 static inline int __init prom_getproplen(phandle node, const char *pname)
635 {
636 	return call_prom("getproplen", 2, 1, node, ADDR(pname));
637 }
638 
639 static void add_string(char **str, const char *q)
640 {
641 	char *p = *str;
642 
643 	while (*q)
644 		*p++ = *q++;
645 	*p++ = ' ';
646 	*str = p;
647 }
648 
649 static char *tohex(unsigned int x)
650 {
651 	static const char digits[] __initconst = "0123456789abcdef";
652 	static char result[9] __prombss;
653 	int i;
654 
655 	result[8] = 0;
656 	i = 8;
657 	do {
658 		--i;
659 		result[i] = digits[x & 0xf];
660 		x >>= 4;
661 	} while (x != 0 && i > 0);
662 	return &result[i];
663 }
664 
665 static int __init prom_setprop(phandle node, const char *nodename,
666 			       const char *pname, void *value, size_t valuelen)
667 {
668 	char cmd[256], *p;
669 
670 	if (!(OF_WORKAROUNDS & OF_WA_LONGTRAIL))
671 		return call_prom("setprop", 4, 1, node, ADDR(pname),
672 				 (u32)(unsigned long) value, (u32) valuelen);
673 
674 	/* gah... setprop doesn't work on longtrail, have to use interpret */
675 	p = cmd;
676 	add_string(&p, "dev");
677 	add_string(&p, nodename);
678 	add_string(&p, tohex((u32)(unsigned long) value));
679 	add_string(&p, tohex(valuelen));
680 	add_string(&p, tohex(ADDR(pname)));
681 	add_string(&p, tohex(prom_strlen(pname)));
682 	add_string(&p, "property");
683 	*p = 0;
684 	return call_prom("interpret", 1, 1, (u32)(unsigned long) cmd);
685 }
686 
687 /* We can't use the standard versions because of relocation headaches. */
688 #define isxdigit(c)	(('0' <= (c) && (c) <= '9') \
689 			 || ('a' <= (c) && (c) <= 'f') \
690 			 || ('A' <= (c) && (c) <= 'F'))
691 
692 #define isdigit(c)	('0' <= (c) && (c) <= '9')
693 #define islower(c)	('a' <= (c) && (c) <= 'z')
694 #define toupper(c)	(islower(c) ? ((c) - 'a' + 'A') : (c))
695 
696 static unsigned long prom_strtoul(const char *cp, const char **endp)
697 {
698 	unsigned long result = 0, base = 10, value;
699 
700 	if (*cp == '0') {
701 		base = 8;
702 		cp++;
703 		if (toupper(*cp) == 'X') {
704 			cp++;
705 			base = 16;
706 		}
707 	}
708 
709 	while (isxdigit(*cp) &&
710 	       (value = isdigit(*cp) ? *cp - '0' : toupper(*cp) - 'A' + 10) < base) {
711 		result = result * base + value;
712 		cp++;
713 	}
714 
715 	if (endp)
716 		*endp = cp;
717 
718 	return result;
719 }
720 
721 static unsigned long prom_memparse(const char *ptr, const char **retptr)
722 {
723 	unsigned long ret = prom_strtoul(ptr, retptr);
724 	int shift = 0;
725 
726 	/*
727 	 * We can't use a switch here because GCC *may* generate a
728 	 * jump table which won't work, because we're not running at
729 	 * the address we're linked at.
730 	 */
731 	if ('G' == **retptr || 'g' == **retptr)
732 		shift = 30;
733 
734 	if ('M' == **retptr || 'm' == **retptr)
735 		shift = 20;
736 
737 	if ('K' == **retptr || 'k' == **retptr)
738 		shift = 10;
739 
740 	if (shift) {
741 		ret <<= shift;
742 		(*retptr)++;
743 	}
744 
745 	return ret;
746 }
747 
748 /*
749  * Early parsing of the command line passed to the kernel, used for
750  * "mem=x" and the options that affect the iommu
751  */
752 static void __init early_cmdline_parse(void)
753 {
754 	const char *opt;
755 
756 	char *p;
757 	int l = 0;
758 
759 	prom_cmd_line[0] = 0;
760 	p = prom_cmd_line;
761 	if ((long)prom.chosen > 0)
762 		l = prom_getprop(prom.chosen, "bootargs", p, COMMAND_LINE_SIZE-1);
763 	if (IS_ENABLED(CONFIG_CMDLINE_BOOL) && (l <= 0 || p[0] == '\0')) /* dbl check */
764 		prom_strlcpy(prom_cmd_line, CONFIG_CMDLINE, sizeof(prom_cmd_line));
765 	prom_printf("command line: %s\n", prom_cmd_line);
766 
767 #ifdef CONFIG_PPC64
768 	opt = prom_strstr(prom_cmd_line, "iommu=");
769 	if (opt) {
770 		prom_printf("iommu opt is: %s\n", opt);
771 		opt += 6;
772 		while (*opt && *opt == ' ')
773 			opt++;
774 		if (!prom_strncmp(opt, "off", 3))
775 			prom_iommu_off = 1;
776 		else if (!prom_strncmp(opt, "force", 5))
777 			prom_iommu_force_on = 1;
778 	}
779 #endif
780 	opt = prom_strstr(prom_cmd_line, "mem=");
781 	if (opt) {
782 		opt += 4;
783 		prom_memory_limit = prom_memparse(opt, (const char **)&opt);
784 #ifdef CONFIG_PPC64
785 		/* Align to 16 MB == size of ppc64 large page */
786 		prom_memory_limit = ALIGN(prom_memory_limit, 0x1000000);
787 #endif
788 	}
789 
790 #ifdef CONFIG_PPC_PSERIES
791 	prom_radix_disable = !IS_ENABLED(CONFIG_PPC_RADIX_MMU_DEFAULT);
792 	opt = prom_strstr(prom_cmd_line, "disable_radix");
793 	if (opt) {
794 		opt += 13;
795 		if (*opt && *opt == '=') {
796 			bool val;
797 
798 			if (prom_strtobool(++opt, &val))
799 				prom_radix_disable = false;
800 			else
801 				prom_radix_disable = val;
802 		} else
803 			prom_radix_disable = true;
804 	}
805 	if (prom_radix_disable)
806 		prom_debug("Radix disabled from cmdline\n");
807 #endif /* CONFIG_PPC_PSERIES */
808 }
809 
810 #ifdef CONFIG_PPC_PSERIES
811 /*
812  * The architecture vector has an array of PVR mask/value pairs,
813  * followed by # option vectors - 1, followed by the option vectors.
814  *
815  * See prom.h for the definition of the bits specified in the
816  * architecture vector.
817  */
818 
819 /* Firmware expects the value to be n - 1, where n is the # of vectors */
820 #define NUM_VECTORS(n)		((n) - 1)
821 
822 /*
823  * Firmware expects 1 + n - 2, where n is the length of the option vector in
824  * bytes. The 1 accounts for the length byte itself, the - 2 .. ?
825  */
826 #define VECTOR_LENGTH(n)	(1 + (n) - 2)
827 
828 struct option_vector1 {
829 	u8 byte1;
830 	u8 arch_versions;
831 	u8 arch_versions3;
832 } __packed;
833 
834 struct option_vector2 {
835 	u8 byte1;
836 	__be16 reserved;
837 	__be32 real_base;
838 	__be32 real_size;
839 	__be32 virt_base;
840 	__be32 virt_size;
841 	__be32 load_base;
842 	__be32 min_rma;
843 	__be32 min_load;
844 	u8 min_rma_percent;
845 	u8 max_pft_size;
846 } __packed;
847 
848 struct option_vector3 {
849 	u8 byte1;
850 	u8 byte2;
851 } __packed;
852 
853 struct option_vector4 {
854 	u8 byte1;
855 	u8 min_vp_cap;
856 } __packed;
857 
858 struct option_vector5 {
859 	u8 byte1;
860 	u8 byte2;
861 	u8 byte3;
862 	u8 cmo;
863 	u8 associativity;
864 	u8 bin_opts;
865 	u8 micro_checkpoint;
866 	u8 reserved0;
867 	__be32 max_cpus;
868 	__be16 papr_level;
869 	__be16 reserved1;
870 	u8 platform_facilities;
871 	u8 reserved2;
872 	__be16 reserved3;
873 	u8 subprocessors;
874 	u8 byte22;
875 	u8 intarch;
876 	u8 mmu;
877 	u8 hash_ext;
878 	u8 radix_ext;
879 } __packed;
880 
881 struct option_vector6 {
882 	u8 reserved;
883 	u8 secondary_pteg;
884 	u8 os_name;
885 } __packed;
886 
887 struct ibm_arch_vec {
888 	struct { u32 mask, val; } pvrs[12];
889 
890 	u8 num_vectors;
891 
892 	u8 vec1_len;
893 	struct option_vector1 vec1;
894 
895 	u8 vec2_len;
896 	struct option_vector2 vec2;
897 
898 	u8 vec3_len;
899 	struct option_vector3 vec3;
900 
901 	u8 vec4_len;
902 	struct option_vector4 vec4;
903 
904 	u8 vec5_len;
905 	struct option_vector5 vec5;
906 
907 	u8 vec6_len;
908 	struct option_vector6 vec6;
909 } __packed;
910 
911 static const struct ibm_arch_vec ibm_architecture_vec_template __initconst = {
912 	.pvrs = {
913 		{
914 			.mask = cpu_to_be32(0xfffe0000), /* POWER5/POWER5+ */
915 			.val  = cpu_to_be32(0x003a0000),
916 		},
917 		{
918 			.mask = cpu_to_be32(0xffff0000), /* POWER6 */
919 			.val  = cpu_to_be32(0x003e0000),
920 		},
921 		{
922 			.mask = cpu_to_be32(0xffff0000), /* POWER7 */
923 			.val  = cpu_to_be32(0x003f0000),
924 		},
925 		{
926 			.mask = cpu_to_be32(0xffff0000), /* POWER8E */
927 			.val  = cpu_to_be32(0x004b0000),
928 		},
929 		{
930 			.mask = cpu_to_be32(0xffff0000), /* POWER8NVL */
931 			.val  = cpu_to_be32(0x004c0000),
932 		},
933 		{
934 			.mask = cpu_to_be32(0xffff0000), /* POWER8 */
935 			.val  = cpu_to_be32(0x004d0000),
936 		},
937 		{
938 			.mask = cpu_to_be32(0xffff0000), /* POWER9 */
939 			.val  = cpu_to_be32(0x004e0000),
940 		},
941 		{
942 			.mask = cpu_to_be32(0xffffffff), /* all 3.00-compliant */
943 			.val  = cpu_to_be32(0x0f000005),
944 		},
945 		{
946 			.mask = cpu_to_be32(0xffffffff), /* all 2.07-compliant */
947 			.val  = cpu_to_be32(0x0f000004),
948 		},
949 		{
950 			.mask = cpu_to_be32(0xffffffff), /* all 2.06-compliant */
951 			.val  = cpu_to_be32(0x0f000003),
952 		},
953 		{
954 			.mask = cpu_to_be32(0xffffffff), /* all 2.05-compliant */
955 			.val  = cpu_to_be32(0x0f000002),
956 		},
957 		{
958 			.mask = cpu_to_be32(0xfffffffe), /* all 2.04-compliant and earlier */
959 			.val  = cpu_to_be32(0x0f000001),
960 		},
961 	},
962 
963 	.num_vectors = NUM_VECTORS(6),
964 
965 	.vec1_len = VECTOR_LENGTH(sizeof(struct option_vector1)),
966 	.vec1 = {
967 		.byte1 = 0,
968 		.arch_versions = OV1_PPC_2_00 | OV1_PPC_2_01 | OV1_PPC_2_02 | OV1_PPC_2_03 |
969 				 OV1_PPC_2_04 | OV1_PPC_2_05 | OV1_PPC_2_06 | OV1_PPC_2_07,
970 		.arch_versions3 = OV1_PPC_3_00,
971 	},
972 
973 	.vec2_len = VECTOR_LENGTH(sizeof(struct option_vector2)),
974 	/* option vector 2: Open Firmware options supported */
975 	.vec2 = {
976 		.byte1 = OV2_REAL_MODE,
977 		.reserved = 0,
978 		.real_base = cpu_to_be32(0xffffffff),
979 		.real_size = cpu_to_be32(0xffffffff),
980 		.virt_base = cpu_to_be32(0xffffffff),
981 		.virt_size = cpu_to_be32(0xffffffff),
982 		.load_base = cpu_to_be32(0xffffffff),
983 		.min_rma = cpu_to_be32(512),		/* 512MB min RMA */
984 		.min_load = cpu_to_be32(0xffffffff),	/* full client load */
985 		.min_rma_percent = 0,	/* min RMA percentage of total RAM */
986 		.max_pft_size = 48,	/* max log_2(hash table size) */
987 	},
988 
989 	.vec3_len = VECTOR_LENGTH(sizeof(struct option_vector3)),
990 	/* option vector 3: processor options supported */
991 	.vec3 = {
992 		.byte1 = 0,			/* don't ignore, don't halt */
993 		.byte2 = OV3_FP | OV3_VMX | OV3_DFP,
994 	},
995 
996 	.vec4_len = VECTOR_LENGTH(sizeof(struct option_vector4)),
997 	/* option vector 4: IBM PAPR implementation */
998 	.vec4 = {
999 		.byte1 = 0,			/* don't halt */
1000 		.min_vp_cap = OV4_MIN_ENT_CAP,	/* minimum VP entitled capacity */
1001 	},
1002 
1003 	.vec5_len = VECTOR_LENGTH(sizeof(struct option_vector5)),
1004 	/* option vector 5: PAPR/OF options */
1005 	.vec5 = {
1006 		.byte1 = 0,				/* don't ignore, don't halt */
1007 		.byte2 = OV5_FEAT(OV5_LPAR) | OV5_FEAT(OV5_SPLPAR) | OV5_FEAT(OV5_LARGE_PAGES) |
1008 		OV5_FEAT(OV5_DRCONF_MEMORY) | OV5_FEAT(OV5_DONATE_DEDICATE_CPU) |
1009 #ifdef CONFIG_PCI_MSI
1010 		/* PCIe/MSI support.  Without MSI full PCIe is not supported */
1011 		OV5_FEAT(OV5_MSI),
1012 #else
1013 		0,
1014 #endif
1015 		.byte3 = 0,
1016 		.cmo =
1017 #ifdef CONFIG_PPC_SMLPAR
1018 		OV5_FEAT(OV5_CMO) | OV5_FEAT(OV5_XCMO),
1019 #else
1020 		0,
1021 #endif
1022 		.associativity = OV5_FEAT(OV5_TYPE1_AFFINITY) | OV5_FEAT(OV5_PRRN),
1023 		.bin_opts = OV5_FEAT(OV5_RESIZE_HPT) | OV5_FEAT(OV5_HP_EVT),
1024 		.micro_checkpoint = 0,
1025 		.reserved0 = 0,
1026 		.max_cpus = cpu_to_be32(NR_CPUS),	/* number of cores supported */
1027 		.papr_level = 0,
1028 		.reserved1 = 0,
1029 		.platform_facilities = OV5_FEAT(OV5_PFO_HW_RNG) | OV5_FEAT(OV5_PFO_HW_ENCR) | OV5_FEAT(OV5_PFO_HW_842),
1030 		.reserved2 = 0,
1031 		.reserved3 = 0,
1032 		.subprocessors = 1,
1033 		.byte22 = OV5_FEAT(OV5_DRMEM_V2),
1034 		.intarch = 0,
1035 		.mmu = 0,
1036 		.hash_ext = 0,
1037 		.radix_ext = 0,
1038 	},
1039 
1040 	/* option vector 6: IBM PAPR hints */
1041 	.vec6_len = VECTOR_LENGTH(sizeof(struct option_vector6)),
1042 	.vec6 = {
1043 		.reserved = 0,
1044 		.secondary_pteg = 0,
1045 		.os_name = OV6_LINUX,
1046 	},
1047 };
1048 
1049 static struct ibm_arch_vec __prombss ibm_architecture_vec  ____cacheline_aligned;
1050 
1051 /* Old method - ELF header with PT_NOTE sections only works on BE */
1052 #ifdef __BIG_ENDIAN__
1053 static const struct fake_elf {
1054 	Elf32_Ehdr	elfhdr;
1055 	Elf32_Phdr	phdr[2];
1056 	struct chrpnote {
1057 		u32	namesz;
1058 		u32	descsz;
1059 		u32	type;
1060 		char	name[8];	/* "PowerPC" */
1061 		struct chrpdesc {
1062 			u32	real_mode;
1063 			u32	real_base;
1064 			u32	real_size;
1065 			u32	virt_base;
1066 			u32	virt_size;
1067 			u32	load_base;
1068 		} chrpdesc;
1069 	} chrpnote;
1070 	struct rpanote {
1071 		u32	namesz;
1072 		u32	descsz;
1073 		u32	type;
1074 		char	name[24];	/* "IBM,RPA-Client-Config" */
1075 		struct rpadesc {
1076 			u32	lpar_affinity;
1077 			u32	min_rmo_size;
1078 			u32	min_rmo_percent;
1079 			u32	max_pft_size;
1080 			u32	splpar;
1081 			u32	min_load;
1082 			u32	new_mem_def;
1083 			u32	ignore_me;
1084 		} rpadesc;
1085 	} rpanote;
1086 } fake_elf __initconst = {
1087 	.elfhdr = {
1088 		.e_ident = { 0x7f, 'E', 'L', 'F',
1089 			     ELFCLASS32, ELFDATA2MSB, EV_CURRENT },
1090 		.e_type = ET_EXEC,	/* yeah right */
1091 		.e_machine = EM_PPC,
1092 		.e_version = EV_CURRENT,
1093 		.e_phoff = offsetof(struct fake_elf, phdr),
1094 		.e_phentsize = sizeof(Elf32_Phdr),
1095 		.e_phnum = 2
1096 	},
1097 	.phdr = {
1098 		[0] = {
1099 			.p_type = PT_NOTE,
1100 			.p_offset = offsetof(struct fake_elf, chrpnote),
1101 			.p_filesz = sizeof(struct chrpnote)
1102 		}, [1] = {
1103 			.p_type = PT_NOTE,
1104 			.p_offset = offsetof(struct fake_elf, rpanote),
1105 			.p_filesz = sizeof(struct rpanote)
1106 		}
1107 	},
1108 	.chrpnote = {
1109 		.namesz = sizeof("PowerPC"),
1110 		.descsz = sizeof(struct chrpdesc),
1111 		.type = 0x1275,
1112 		.name = "PowerPC",
1113 		.chrpdesc = {
1114 			.real_mode = ~0U,	/* ~0 means "don't care" */
1115 			.real_base = ~0U,
1116 			.real_size = ~0U,
1117 			.virt_base = ~0U,
1118 			.virt_size = ~0U,
1119 			.load_base = ~0U
1120 		},
1121 	},
1122 	.rpanote = {
1123 		.namesz = sizeof("IBM,RPA-Client-Config"),
1124 		.descsz = sizeof(struct rpadesc),
1125 		.type = 0x12759999,
1126 		.name = "IBM,RPA-Client-Config",
1127 		.rpadesc = {
1128 			.lpar_affinity = 0,
1129 			.min_rmo_size = 64,	/* in megabytes */
1130 			.min_rmo_percent = 0,
1131 			.max_pft_size = 48,	/* 2^48 bytes max PFT size */
1132 			.splpar = 1,
1133 			.min_load = ~0U,
1134 			.new_mem_def = 0
1135 		}
1136 	}
1137 };
1138 #endif /* __BIG_ENDIAN__ */
1139 
1140 static int __init prom_count_smt_threads(void)
1141 {
1142 	phandle node;
1143 	char type[64];
1144 	unsigned int plen;
1145 
1146 	/* Pick up th first CPU node we can find */
1147 	for (node = 0; prom_next_node(&node); ) {
1148 		type[0] = 0;
1149 		prom_getprop(node, "device_type", type, sizeof(type));
1150 
1151 		if (prom_strcmp(type, "cpu"))
1152 			continue;
1153 		/*
1154 		 * There is an entry for each smt thread, each entry being
1155 		 * 4 bytes long.  All cpus should have the same number of
1156 		 * smt threads, so return after finding the first.
1157 		 */
1158 		plen = prom_getproplen(node, "ibm,ppc-interrupt-server#s");
1159 		if (plen == PROM_ERROR)
1160 			break;
1161 		plen >>= 2;
1162 		prom_debug("Found %lu smt threads per core\n", (unsigned long)plen);
1163 
1164 		/* Sanity check */
1165 		if (plen < 1 || plen > 64) {
1166 			prom_printf("Threads per core %lu out of bounds, assuming 1\n",
1167 				    (unsigned long)plen);
1168 			return 1;
1169 		}
1170 		return plen;
1171 	}
1172 	prom_debug("No threads found, assuming 1 per core\n");
1173 
1174 	return 1;
1175 
1176 }
1177 
1178 static void __init prom_parse_mmu_model(u8 val,
1179 					struct platform_support *support)
1180 {
1181 	switch (val) {
1182 	case OV5_FEAT(OV5_MMU_DYNAMIC):
1183 	case OV5_FEAT(OV5_MMU_EITHER): /* Either Available */
1184 		prom_debug("MMU - either supported\n");
1185 		support->radix_mmu = !prom_radix_disable;
1186 		support->hash_mmu = true;
1187 		break;
1188 	case OV5_FEAT(OV5_MMU_RADIX): /* Only Radix */
1189 		prom_debug("MMU - radix only\n");
1190 		if (prom_radix_disable) {
1191 			/*
1192 			 * If we __have__ to do radix, we're better off ignoring
1193 			 * the command line rather than not booting.
1194 			 */
1195 			prom_printf("WARNING: Ignoring cmdline option disable_radix\n");
1196 		}
1197 		support->radix_mmu = true;
1198 		break;
1199 	case OV5_FEAT(OV5_MMU_HASH):
1200 		prom_debug("MMU - hash only\n");
1201 		support->hash_mmu = true;
1202 		break;
1203 	default:
1204 		prom_debug("Unknown mmu support option: 0x%x\n", val);
1205 		break;
1206 	}
1207 }
1208 
1209 static void __init prom_parse_xive_model(u8 val,
1210 					 struct platform_support *support)
1211 {
1212 	switch (val) {
1213 	case OV5_FEAT(OV5_XIVE_EITHER): /* Either Available */
1214 		prom_debug("XIVE - either mode supported\n");
1215 		support->xive = true;
1216 		break;
1217 	case OV5_FEAT(OV5_XIVE_EXPLOIT): /* Only Exploitation mode */
1218 		prom_debug("XIVE - exploitation mode supported\n");
1219 		support->xive = true;
1220 		break;
1221 	case OV5_FEAT(OV5_XIVE_LEGACY): /* Only Legacy mode */
1222 		prom_debug("XIVE - legacy mode supported\n");
1223 		break;
1224 	default:
1225 		prom_debug("Unknown xive support option: 0x%x\n", val);
1226 		break;
1227 	}
1228 }
1229 
1230 static void __init prom_parse_platform_support(u8 index, u8 val,
1231 					       struct platform_support *support)
1232 {
1233 	switch (index) {
1234 	case OV5_INDX(OV5_MMU_SUPPORT): /* MMU Model */
1235 		prom_parse_mmu_model(val & OV5_FEAT(OV5_MMU_SUPPORT), support);
1236 		break;
1237 	case OV5_INDX(OV5_RADIX_GTSE): /* Radix Extensions */
1238 		if (val & OV5_FEAT(OV5_RADIX_GTSE)) {
1239 			prom_debug("Radix - GTSE supported\n");
1240 			support->radix_gtse = true;
1241 		}
1242 		break;
1243 	case OV5_INDX(OV5_XIVE_SUPPORT): /* Interrupt mode */
1244 		prom_parse_xive_model(val & OV5_FEAT(OV5_XIVE_SUPPORT),
1245 				      support);
1246 		break;
1247 	}
1248 }
1249 
1250 static void __init prom_check_platform_support(void)
1251 {
1252 	struct platform_support supported = {
1253 		.hash_mmu = false,
1254 		.radix_mmu = false,
1255 		.radix_gtse = false,
1256 		.xive = false
1257 	};
1258 	int prop_len = prom_getproplen(prom.chosen,
1259 				       "ibm,arch-vec-5-platform-support");
1260 
1261 	/*
1262 	 * First copy the architecture vec template
1263 	 *
1264 	 * use memcpy() instead of *vec = *vec_template so that GCC replaces it
1265 	 * by __memcpy() when KASAN is active
1266 	 */
1267 	memcpy(&ibm_architecture_vec, &ibm_architecture_vec_template,
1268 	       sizeof(ibm_architecture_vec));
1269 
1270 	if (prop_len > 1) {
1271 		int i;
1272 		u8 vec[8];
1273 		prom_debug("Found ibm,arch-vec-5-platform-support, len: %d\n",
1274 			   prop_len);
1275 		if (prop_len > sizeof(vec))
1276 			prom_printf("WARNING: ibm,arch-vec-5-platform-support longer than expected (len: %d)\n",
1277 				    prop_len);
1278 		prom_getprop(prom.chosen, "ibm,arch-vec-5-platform-support",
1279 			     &vec, sizeof(vec));
1280 		for (i = 0; i < sizeof(vec); i += 2) {
1281 			prom_debug("%d: index = 0x%x val = 0x%x\n", i / 2
1282 								  , vec[i]
1283 								  , vec[i + 1]);
1284 			prom_parse_platform_support(vec[i], vec[i + 1],
1285 						    &supported);
1286 		}
1287 	}
1288 
1289 	if (supported.radix_mmu && supported.radix_gtse &&
1290 	    IS_ENABLED(CONFIG_PPC_RADIX_MMU)) {
1291 		/* Radix preferred - but we require GTSE for now */
1292 		prom_debug("Asking for radix with GTSE\n");
1293 		ibm_architecture_vec.vec5.mmu = OV5_FEAT(OV5_MMU_RADIX);
1294 		ibm_architecture_vec.vec5.radix_ext = OV5_FEAT(OV5_RADIX_GTSE);
1295 	} else if (supported.hash_mmu) {
1296 		/* Default to hash mmu (if we can) */
1297 		prom_debug("Asking for hash\n");
1298 		ibm_architecture_vec.vec5.mmu = OV5_FEAT(OV5_MMU_HASH);
1299 	} else {
1300 		/* We're probably on a legacy hypervisor */
1301 		prom_debug("Assuming legacy hash support\n");
1302 	}
1303 
1304 	if (supported.xive) {
1305 		prom_debug("Asking for XIVE\n");
1306 		ibm_architecture_vec.vec5.intarch = OV5_FEAT(OV5_XIVE_EXPLOIT);
1307 	}
1308 }
1309 
1310 static void __init prom_send_capabilities(void)
1311 {
1312 	ihandle root;
1313 	prom_arg_t ret;
1314 	u32 cores;
1315 
1316 	/* Check ibm,arch-vec-5-platform-support and fixup vec5 if required */
1317 	prom_check_platform_support();
1318 
1319 	root = call_prom("open", 1, 1, ADDR("/"));
1320 	if (root != 0) {
1321 		/* We need to tell the FW about the number of cores we support.
1322 		 *
1323 		 * To do that, we count the number of threads on the first core
1324 		 * (we assume this is the same for all cores) and use it to
1325 		 * divide NR_CPUS.
1326 		 */
1327 
1328 		cores = DIV_ROUND_UP(NR_CPUS, prom_count_smt_threads());
1329 		prom_printf("Max number of cores passed to firmware: %u (NR_CPUS = %d)\n",
1330 			    cores, NR_CPUS);
1331 
1332 		ibm_architecture_vec.vec5.max_cpus = cpu_to_be32(cores);
1333 
1334 		/* try calling the ibm,client-architecture-support method */
1335 		prom_printf("Calling ibm,client-architecture-support...");
1336 		if (call_prom_ret("call-method", 3, 2, &ret,
1337 				  ADDR("ibm,client-architecture-support"),
1338 				  root,
1339 				  ADDR(&ibm_architecture_vec)) == 0) {
1340 			/* the call exists... */
1341 			if (ret)
1342 				prom_printf("\nWARNING: ibm,client-architecture"
1343 					    "-support call FAILED!\n");
1344 			call_prom("close", 1, 0, root);
1345 			prom_printf(" done\n");
1346 			return;
1347 		}
1348 		call_prom("close", 1, 0, root);
1349 		prom_printf(" not implemented\n");
1350 	}
1351 
1352 #ifdef __BIG_ENDIAN__
1353 	{
1354 		ihandle elfloader;
1355 
1356 		/* no ibm,client-architecture-support call, try the old way */
1357 		elfloader = call_prom("open", 1, 1,
1358 				      ADDR("/packages/elf-loader"));
1359 		if (elfloader == 0) {
1360 			prom_printf("couldn't open /packages/elf-loader\n");
1361 			return;
1362 		}
1363 		call_prom("call-method", 3, 1, ADDR("process-elf-header"),
1364 			  elfloader, ADDR(&fake_elf));
1365 		call_prom("close", 1, 0, elfloader);
1366 	}
1367 #endif /* __BIG_ENDIAN__ */
1368 }
1369 #endif /* CONFIG_PPC_PSERIES */
1370 
1371 /*
1372  * Memory allocation strategy... our layout is normally:
1373  *
1374  *  at 14Mb or more we have vmlinux, then a gap and initrd.  In some
1375  *  rare cases, initrd might end up being before the kernel though.
1376  *  We assume this won't override the final kernel at 0, we have no
1377  *  provision to handle that in this version, but it should hopefully
1378  *  never happen.
1379  *
1380  *  alloc_top is set to the top of RMO, eventually shrink down if the
1381  *  TCEs overlap
1382  *
1383  *  alloc_bottom is set to the top of kernel/initrd
1384  *
1385  *  from there, allocations are done this way : rtas is allocated
1386  *  topmost, and the device-tree is allocated from the bottom. We try
1387  *  to grow the device-tree allocation as we progress. If we can't,
1388  *  then we fail, we don't currently have a facility to restart
1389  *  elsewhere, but that shouldn't be necessary.
1390  *
1391  *  Note that calls to reserve_mem have to be done explicitly, memory
1392  *  allocated with either alloc_up or alloc_down isn't automatically
1393  *  reserved.
1394  */
1395 
1396 
1397 /*
1398  * Allocates memory in the RMO upward from the kernel/initrd
1399  *
1400  * When align is 0, this is a special case, it means to allocate in place
1401  * at the current location of alloc_bottom or fail (that is basically
1402  * extending the previous allocation). Used for the device-tree flattening
1403  */
1404 static unsigned long __init alloc_up(unsigned long size, unsigned long align)
1405 {
1406 	unsigned long base = alloc_bottom;
1407 	unsigned long addr = 0;
1408 
1409 	if (align)
1410 		base = _ALIGN_UP(base, align);
1411 	prom_debug("%s(%lx, %lx)\n", __func__, size, align);
1412 	if (ram_top == 0)
1413 		prom_panic("alloc_up() called with mem not initialized\n");
1414 
1415 	if (align)
1416 		base = _ALIGN_UP(alloc_bottom, align);
1417 	else
1418 		base = alloc_bottom;
1419 
1420 	for(; (base + size) <= alloc_top;
1421 	    base = _ALIGN_UP(base + 0x100000, align)) {
1422 		prom_debug("    trying: 0x%lx\n\r", base);
1423 		addr = (unsigned long)prom_claim(base, size, 0);
1424 		if (addr != PROM_ERROR && addr != 0)
1425 			break;
1426 		addr = 0;
1427 		if (align == 0)
1428 			break;
1429 	}
1430 	if (addr == 0)
1431 		return 0;
1432 	alloc_bottom = addr + size;
1433 
1434 	prom_debug(" -> %lx\n", addr);
1435 	prom_debug("  alloc_bottom : %lx\n", alloc_bottom);
1436 	prom_debug("  alloc_top    : %lx\n", alloc_top);
1437 	prom_debug("  alloc_top_hi : %lx\n", alloc_top_high);
1438 	prom_debug("  rmo_top      : %lx\n", rmo_top);
1439 	prom_debug("  ram_top      : %lx\n", ram_top);
1440 
1441 	return addr;
1442 }
1443 
1444 /*
1445  * Allocates memory downward, either from top of RMO, or if highmem
1446  * is set, from the top of RAM.  Note that this one doesn't handle
1447  * failures.  It does claim memory if highmem is not set.
1448  */
1449 static unsigned long __init alloc_down(unsigned long size, unsigned long align,
1450 				       int highmem)
1451 {
1452 	unsigned long base, addr = 0;
1453 
1454 	prom_debug("%s(%lx, %lx, %s)\n", __func__, size, align,
1455 		   highmem ? "(high)" : "(low)");
1456 	if (ram_top == 0)
1457 		prom_panic("alloc_down() called with mem not initialized\n");
1458 
1459 	if (highmem) {
1460 		/* Carve out storage for the TCE table. */
1461 		addr = _ALIGN_DOWN(alloc_top_high - size, align);
1462 		if (addr <= alloc_bottom)
1463 			return 0;
1464 		/* Will we bump into the RMO ? If yes, check out that we
1465 		 * didn't overlap existing allocations there, if we did,
1466 		 * we are dead, we must be the first in town !
1467 		 */
1468 		if (addr < rmo_top) {
1469 			/* Good, we are first */
1470 			if (alloc_top == rmo_top)
1471 				alloc_top = rmo_top = addr;
1472 			else
1473 				return 0;
1474 		}
1475 		alloc_top_high = addr;
1476 		goto bail;
1477 	}
1478 
1479 	base = _ALIGN_DOWN(alloc_top - size, align);
1480 	for (; base > alloc_bottom;
1481 	     base = _ALIGN_DOWN(base - 0x100000, align))  {
1482 		prom_debug("    trying: 0x%lx\n\r", base);
1483 		addr = (unsigned long)prom_claim(base, size, 0);
1484 		if (addr != PROM_ERROR && addr != 0)
1485 			break;
1486 		addr = 0;
1487 	}
1488 	if (addr == 0)
1489 		return 0;
1490 	alloc_top = addr;
1491 
1492  bail:
1493 	prom_debug(" -> %lx\n", addr);
1494 	prom_debug("  alloc_bottom : %lx\n", alloc_bottom);
1495 	prom_debug("  alloc_top    : %lx\n", alloc_top);
1496 	prom_debug("  alloc_top_hi : %lx\n", alloc_top_high);
1497 	prom_debug("  rmo_top      : %lx\n", rmo_top);
1498 	prom_debug("  ram_top      : %lx\n", ram_top);
1499 
1500 	return addr;
1501 }
1502 
1503 /*
1504  * Parse a "reg" cell
1505  */
1506 static unsigned long __init prom_next_cell(int s, cell_t **cellp)
1507 {
1508 	cell_t *p = *cellp;
1509 	unsigned long r = 0;
1510 
1511 	/* Ignore more than 2 cells */
1512 	while (s > sizeof(unsigned long) / 4) {
1513 		p++;
1514 		s--;
1515 	}
1516 	r = be32_to_cpu(*p++);
1517 #ifdef CONFIG_PPC64
1518 	if (s > 1) {
1519 		r <<= 32;
1520 		r |= be32_to_cpu(*(p++));
1521 	}
1522 #endif
1523 	*cellp = p;
1524 	return r;
1525 }
1526 
1527 /*
1528  * Very dumb function for adding to the memory reserve list, but
1529  * we don't need anything smarter at this point
1530  *
1531  * XXX Eventually check for collisions.  They should NEVER happen.
1532  * If problems seem to show up, it would be a good start to track
1533  * them down.
1534  */
1535 static void __init reserve_mem(u64 base, u64 size)
1536 {
1537 	u64 top = base + size;
1538 	unsigned long cnt = mem_reserve_cnt;
1539 
1540 	if (size == 0)
1541 		return;
1542 
1543 	/* We need to always keep one empty entry so that we
1544 	 * have our terminator with "size" set to 0 since we are
1545 	 * dumb and just copy this entire array to the boot params
1546 	 */
1547 	base = _ALIGN_DOWN(base, PAGE_SIZE);
1548 	top = _ALIGN_UP(top, PAGE_SIZE);
1549 	size = top - base;
1550 
1551 	if (cnt >= (MEM_RESERVE_MAP_SIZE - 1))
1552 		prom_panic("Memory reserve map exhausted !\n");
1553 	mem_reserve_map[cnt].base = cpu_to_be64(base);
1554 	mem_reserve_map[cnt].size = cpu_to_be64(size);
1555 	mem_reserve_cnt = cnt + 1;
1556 }
1557 
1558 /*
1559  * Initialize memory allocation mechanism, parse "memory" nodes and
1560  * obtain that way the top of memory and RMO to setup out local allocator
1561  */
1562 static void __init prom_init_mem(void)
1563 {
1564 	phandle node;
1565 #ifdef DEBUG_PROM
1566 	char *path;
1567 #endif
1568 	char type[64];
1569 	unsigned int plen;
1570 	cell_t *p, *endp;
1571 	__be32 val;
1572 	u32 rac, rsc;
1573 
1574 	/*
1575 	 * We iterate the memory nodes to find
1576 	 * 1) top of RMO (first node)
1577 	 * 2) top of memory
1578 	 */
1579 	val = cpu_to_be32(2);
1580 	prom_getprop(prom.root, "#address-cells", &val, sizeof(val));
1581 	rac = be32_to_cpu(val);
1582 	val = cpu_to_be32(1);
1583 	prom_getprop(prom.root, "#size-cells", &val, sizeof(rsc));
1584 	rsc = be32_to_cpu(val);
1585 	prom_debug("root_addr_cells: %x\n", rac);
1586 	prom_debug("root_size_cells: %x\n", rsc);
1587 
1588 	prom_debug("scanning memory:\n");
1589 #ifdef DEBUG_PROM
1590 	path = prom_scratch;
1591 #endif
1592 
1593 	for (node = 0; prom_next_node(&node); ) {
1594 		type[0] = 0;
1595 		prom_getprop(node, "device_type", type, sizeof(type));
1596 
1597 		if (type[0] == 0) {
1598 			/*
1599 			 * CHRP Longtrail machines have no device_type
1600 			 * on the memory node, so check the name instead...
1601 			 */
1602 			prom_getprop(node, "name", type, sizeof(type));
1603 		}
1604 		if (prom_strcmp(type, "memory"))
1605 			continue;
1606 
1607 		plen = prom_getprop(node, "reg", regbuf, sizeof(regbuf));
1608 		if (plen > sizeof(regbuf)) {
1609 			prom_printf("memory node too large for buffer !\n");
1610 			plen = sizeof(regbuf);
1611 		}
1612 		p = regbuf;
1613 		endp = p + (plen / sizeof(cell_t));
1614 
1615 #ifdef DEBUG_PROM
1616 		memset(path, 0, sizeof(prom_scratch));
1617 		call_prom("package-to-path", 3, 1, node, path, sizeof(prom_scratch) - 1);
1618 		prom_debug("  node %s :\n", path);
1619 #endif /* DEBUG_PROM */
1620 
1621 		while ((endp - p) >= (rac + rsc)) {
1622 			unsigned long base, size;
1623 
1624 			base = prom_next_cell(rac, &p);
1625 			size = prom_next_cell(rsc, &p);
1626 
1627 			if (size == 0)
1628 				continue;
1629 			prom_debug("    %lx %lx\n", base, size);
1630 			if (base == 0 && (of_platform & PLATFORM_LPAR))
1631 				rmo_top = size;
1632 			if ((base + size) > ram_top)
1633 				ram_top = base + size;
1634 		}
1635 	}
1636 
1637 	alloc_bottom = PAGE_ALIGN((unsigned long)&_end + 0x4000);
1638 
1639 	/*
1640 	 * If prom_memory_limit is set we reduce the upper limits *except* for
1641 	 * alloc_top_high. This must be the real top of RAM so we can put
1642 	 * TCE's up there.
1643 	 */
1644 
1645 	alloc_top_high = ram_top;
1646 
1647 	if (prom_memory_limit) {
1648 		if (prom_memory_limit <= alloc_bottom) {
1649 			prom_printf("Ignoring mem=%lx <= alloc_bottom.\n",
1650 				    prom_memory_limit);
1651 			prom_memory_limit = 0;
1652 		} else if (prom_memory_limit >= ram_top) {
1653 			prom_printf("Ignoring mem=%lx >= ram_top.\n",
1654 				    prom_memory_limit);
1655 			prom_memory_limit = 0;
1656 		} else {
1657 			ram_top = prom_memory_limit;
1658 			rmo_top = min(rmo_top, prom_memory_limit);
1659 		}
1660 	}
1661 
1662 	/*
1663 	 * Setup our top alloc point, that is top of RMO or top of
1664 	 * segment 0 when running non-LPAR.
1665 	 * Some RS64 machines have buggy firmware where claims up at
1666 	 * 1GB fail.  Cap at 768MB as a workaround.
1667 	 * Since 768MB is plenty of room, and we need to cap to something
1668 	 * reasonable on 32-bit, cap at 768MB on all machines.
1669 	 */
1670 	if (!rmo_top)
1671 		rmo_top = ram_top;
1672 	rmo_top = min(0x30000000ul, rmo_top);
1673 	alloc_top = rmo_top;
1674 	alloc_top_high = ram_top;
1675 
1676 	/*
1677 	 * Check if we have an initrd after the kernel but still inside
1678 	 * the RMO.  If we do move our bottom point to after it.
1679 	 */
1680 	if (prom_initrd_start &&
1681 	    prom_initrd_start < rmo_top &&
1682 	    prom_initrd_end > alloc_bottom)
1683 		alloc_bottom = PAGE_ALIGN(prom_initrd_end);
1684 
1685 	prom_printf("memory layout at init:\n");
1686 	prom_printf("  memory_limit : %lx (16 MB aligned)\n",
1687 		    prom_memory_limit);
1688 	prom_printf("  alloc_bottom : %lx\n", alloc_bottom);
1689 	prom_printf("  alloc_top    : %lx\n", alloc_top);
1690 	prom_printf("  alloc_top_hi : %lx\n", alloc_top_high);
1691 	prom_printf("  rmo_top      : %lx\n", rmo_top);
1692 	prom_printf("  ram_top      : %lx\n", ram_top);
1693 }
1694 
1695 static void __init prom_close_stdin(void)
1696 {
1697 	__be32 val;
1698 	ihandle stdin;
1699 
1700 	if (prom_getprop(prom.chosen, "stdin", &val, sizeof(val)) > 0) {
1701 		stdin = be32_to_cpu(val);
1702 		call_prom("close", 1, 0, stdin);
1703 	}
1704 }
1705 
1706 /*
1707  * Allocate room for and instantiate RTAS
1708  */
1709 static void __init prom_instantiate_rtas(void)
1710 {
1711 	phandle rtas_node;
1712 	ihandle rtas_inst;
1713 	u32 base, entry = 0;
1714 	__be32 val;
1715 	u32 size = 0;
1716 
1717 	prom_debug("prom_instantiate_rtas: start...\n");
1718 
1719 	rtas_node = call_prom("finddevice", 1, 1, ADDR("/rtas"));
1720 	prom_debug("rtas_node: %x\n", rtas_node);
1721 	if (!PHANDLE_VALID(rtas_node))
1722 		return;
1723 
1724 	val = 0;
1725 	prom_getprop(rtas_node, "rtas-size", &val, sizeof(size));
1726 	size = be32_to_cpu(val);
1727 	if (size == 0)
1728 		return;
1729 
1730 	base = alloc_down(size, PAGE_SIZE, 0);
1731 	if (base == 0)
1732 		prom_panic("Could not allocate memory for RTAS\n");
1733 
1734 	rtas_inst = call_prom("open", 1, 1, ADDR("/rtas"));
1735 	if (!IHANDLE_VALID(rtas_inst)) {
1736 		prom_printf("opening rtas package failed (%x)\n", rtas_inst);
1737 		return;
1738 	}
1739 
1740 	prom_printf("instantiating rtas at 0x%x...", base);
1741 
1742 	if (call_prom_ret("call-method", 3, 2, &entry,
1743 			  ADDR("instantiate-rtas"),
1744 			  rtas_inst, base) != 0
1745 	    || entry == 0) {
1746 		prom_printf(" failed\n");
1747 		return;
1748 	}
1749 	prom_printf(" done\n");
1750 
1751 	reserve_mem(base, size);
1752 
1753 	val = cpu_to_be32(base);
1754 	prom_setprop(rtas_node, "/rtas", "linux,rtas-base",
1755 		     &val, sizeof(val));
1756 	val = cpu_to_be32(entry);
1757 	prom_setprop(rtas_node, "/rtas", "linux,rtas-entry",
1758 		     &val, sizeof(val));
1759 
1760 	/* Check if it supports "query-cpu-stopped-state" */
1761 	if (prom_getprop(rtas_node, "query-cpu-stopped-state",
1762 			 &val, sizeof(val)) != PROM_ERROR)
1763 		rtas_has_query_cpu_stopped = true;
1764 
1765 	prom_debug("rtas base     = 0x%x\n", base);
1766 	prom_debug("rtas entry    = 0x%x\n", entry);
1767 	prom_debug("rtas size     = 0x%x\n", size);
1768 
1769 	prom_debug("prom_instantiate_rtas: end...\n");
1770 }
1771 
1772 #ifdef CONFIG_PPC64
1773 /*
1774  * Allocate room for and instantiate Stored Measurement Log (SML)
1775  */
1776 static void __init prom_instantiate_sml(void)
1777 {
1778 	phandle ibmvtpm_node;
1779 	ihandle ibmvtpm_inst;
1780 	u32 entry = 0, size = 0, succ = 0;
1781 	u64 base;
1782 	__be32 val;
1783 
1784 	prom_debug("prom_instantiate_sml: start...\n");
1785 
1786 	ibmvtpm_node = call_prom("finddevice", 1, 1, ADDR("/vdevice/vtpm"));
1787 	prom_debug("ibmvtpm_node: %x\n", ibmvtpm_node);
1788 	if (!PHANDLE_VALID(ibmvtpm_node))
1789 		return;
1790 
1791 	ibmvtpm_inst = call_prom("open", 1, 1, ADDR("/vdevice/vtpm"));
1792 	if (!IHANDLE_VALID(ibmvtpm_inst)) {
1793 		prom_printf("opening vtpm package failed (%x)\n", ibmvtpm_inst);
1794 		return;
1795 	}
1796 
1797 	if (prom_getprop(ibmvtpm_node, "ibm,sml-efi-reformat-supported",
1798 			 &val, sizeof(val)) != PROM_ERROR) {
1799 		if (call_prom_ret("call-method", 2, 2, &succ,
1800 				  ADDR("reformat-sml-to-efi-alignment"),
1801 				  ibmvtpm_inst) != 0 || succ == 0) {
1802 			prom_printf("Reformat SML to EFI alignment failed\n");
1803 			return;
1804 		}
1805 
1806 		if (call_prom_ret("call-method", 2, 2, &size,
1807 				  ADDR("sml-get-allocated-size"),
1808 				  ibmvtpm_inst) != 0 || size == 0) {
1809 			prom_printf("SML get allocated size failed\n");
1810 			return;
1811 		}
1812 	} else {
1813 		if (call_prom_ret("call-method", 2, 2, &size,
1814 				  ADDR("sml-get-handover-size"),
1815 				  ibmvtpm_inst) != 0 || size == 0) {
1816 			prom_printf("SML get handover size failed\n");
1817 			return;
1818 		}
1819 	}
1820 
1821 	base = alloc_down(size, PAGE_SIZE, 0);
1822 	if (base == 0)
1823 		prom_panic("Could not allocate memory for sml\n");
1824 
1825 	prom_printf("instantiating sml at 0x%llx...", base);
1826 
1827 	memset((void *)base, 0, size);
1828 
1829 	if (call_prom_ret("call-method", 4, 2, &entry,
1830 			  ADDR("sml-handover"),
1831 			  ibmvtpm_inst, size, base) != 0 || entry == 0) {
1832 		prom_printf("SML handover failed\n");
1833 		return;
1834 	}
1835 	prom_printf(" done\n");
1836 
1837 	reserve_mem(base, size);
1838 
1839 	prom_setprop(ibmvtpm_node, "/vdevice/vtpm", "linux,sml-base",
1840 		     &base, sizeof(base));
1841 	prom_setprop(ibmvtpm_node, "/vdevice/vtpm", "linux,sml-size",
1842 		     &size, sizeof(size));
1843 
1844 	prom_debug("sml base     = 0x%llx\n", base);
1845 	prom_debug("sml size     = 0x%x\n", size);
1846 
1847 	prom_debug("prom_instantiate_sml: end...\n");
1848 }
1849 
1850 /*
1851  * Allocate room for and initialize TCE tables
1852  */
1853 #ifdef __BIG_ENDIAN__
1854 static void __init prom_initialize_tce_table(void)
1855 {
1856 	phandle node;
1857 	ihandle phb_node;
1858 	char compatible[64], type[64], model[64];
1859 	char *path = prom_scratch;
1860 	u64 base, align;
1861 	u32 minalign, minsize;
1862 	u64 tce_entry, *tce_entryp;
1863 	u64 local_alloc_top, local_alloc_bottom;
1864 	u64 i;
1865 
1866 	if (prom_iommu_off)
1867 		return;
1868 
1869 	prom_debug("starting prom_initialize_tce_table\n");
1870 
1871 	/* Cache current top of allocs so we reserve a single block */
1872 	local_alloc_top = alloc_top_high;
1873 	local_alloc_bottom = local_alloc_top;
1874 
1875 	/* Search all nodes looking for PHBs. */
1876 	for (node = 0; prom_next_node(&node); ) {
1877 		compatible[0] = 0;
1878 		type[0] = 0;
1879 		model[0] = 0;
1880 		prom_getprop(node, "compatible",
1881 			     compatible, sizeof(compatible));
1882 		prom_getprop(node, "device_type", type, sizeof(type));
1883 		prom_getprop(node, "model", model, sizeof(model));
1884 
1885 		if ((type[0] == 0) || (prom_strstr(type, "pci") == NULL))
1886 			continue;
1887 
1888 		/* Keep the old logic intact to avoid regression. */
1889 		if (compatible[0] != 0) {
1890 			if ((prom_strstr(compatible, "python") == NULL) &&
1891 			    (prom_strstr(compatible, "Speedwagon") == NULL) &&
1892 			    (prom_strstr(compatible, "Winnipeg") == NULL))
1893 				continue;
1894 		} else if (model[0] != 0) {
1895 			if ((prom_strstr(model, "ython") == NULL) &&
1896 			    (prom_strstr(model, "peedwagon") == NULL) &&
1897 			    (prom_strstr(model, "innipeg") == NULL))
1898 				continue;
1899 		}
1900 
1901 		if (prom_getprop(node, "tce-table-minalign", &minalign,
1902 				 sizeof(minalign)) == PROM_ERROR)
1903 			minalign = 0;
1904 		if (prom_getprop(node, "tce-table-minsize", &minsize,
1905 				 sizeof(minsize)) == PROM_ERROR)
1906 			minsize = 4UL << 20;
1907 
1908 		/*
1909 		 * Even though we read what OF wants, we just set the table
1910 		 * size to 4 MB.  This is enough to map 2GB of PCI DMA space.
1911 		 * By doing this, we avoid the pitfalls of trying to DMA to
1912 		 * MMIO space and the DMA alias hole.
1913 		 */
1914 		minsize = 4UL << 20;
1915 
1916 		/* Align to the greater of the align or size */
1917 		align = max(minalign, minsize);
1918 		base = alloc_down(minsize, align, 1);
1919 		if (base == 0)
1920 			prom_panic("ERROR, cannot find space for TCE table.\n");
1921 		if (base < local_alloc_bottom)
1922 			local_alloc_bottom = base;
1923 
1924 		/* It seems OF doesn't null-terminate the path :-( */
1925 		memset(path, 0, sizeof(prom_scratch));
1926 		/* Call OF to setup the TCE hardware */
1927 		if (call_prom("package-to-path", 3, 1, node,
1928 			      path, sizeof(prom_scratch) - 1) == PROM_ERROR) {
1929 			prom_printf("package-to-path failed\n");
1930 		}
1931 
1932 		/* Save away the TCE table attributes for later use. */
1933 		prom_setprop(node, path, "linux,tce-base", &base, sizeof(base));
1934 		prom_setprop(node, path, "linux,tce-size", &minsize, sizeof(minsize));
1935 
1936 		prom_debug("TCE table: %s\n", path);
1937 		prom_debug("\tnode = 0x%x\n", node);
1938 		prom_debug("\tbase = 0x%llx\n", base);
1939 		prom_debug("\tsize = 0x%x\n", minsize);
1940 
1941 		/* Initialize the table to have a one-to-one mapping
1942 		 * over the allocated size.
1943 		 */
1944 		tce_entryp = (u64 *)base;
1945 		for (i = 0; i < (minsize >> 3) ;tce_entryp++, i++) {
1946 			tce_entry = (i << PAGE_SHIFT);
1947 			tce_entry |= 0x3;
1948 			*tce_entryp = tce_entry;
1949 		}
1950 
1951 		prom_printf("opening PHB %s", path);
1952 		phb_node = call_prom("open", 1, 1, path);
1953 		if (phb_node == 0)
1954 			prom_printf("... failed\n");
1955 		else
1956 			prom_printf("... done\n");
1957 
1958 		call_prom("call-method", 6, 0, ADDR("set-64-bit-addressing"),
1959 			  phb_node, -1, minsize,
1960 			  (u32) base, (u32) (base >> 32));
1961 		call_prom("close", 1, 0, phb_node);
1962 	}
1963 
1964 	reserve_mem(local_alloc_bottom, local_alloc_top - local_alloc_bottom);
1965 
1966 	/* These are only really needed if there is a memory limit in
1967 	 * effect, but we don't know so export them always. */
1968 	prom_tce_alloc_start = local_alloc_bottom;
1969 	prom_tce_alloc_end = local_alloc_top;
1970 
1971 	/* Flag the first invalid entry */
1972 	prom_debug("ending prom_initialize_tce_table\n");
1973 }
1974 #endif /* __BIG_ENDIAN__ */
1975 #endif /* CONFIG_PPC64 */
1976 
1977 /*
1978  * With CHRP SMP we need to use the OF to start the other processors.
1979  * We can't wait until smp_boot_cpus (the OF is trashed by then)
1980  * so we have to put the processors into a holding pattern controlled
1981  * by the kernel (not OF) before we destroy the OF.
1982  *
1983  * This uses a chunk of low memory, puts some holding pattern
1984  * code there and sends the other processors off to there until
1985  * smp_boot_cpus tells them to do something.  The holding pattern
1986  * checks that address until its cpu # is there, when it is that
1987  * cpu jumps to __secondary_start().  smp_boot_cpus() takes care
1988  * of setting those values.
1989  *
1990  * We also use physical address 0x4 here to tell when a cpu
1991  * is in its holding pattern code.
1992  *
1993  * -- Cort
1994  */
1995 /*
1996  * We want to reference the copy of __secondary_hold_* in the
1997  * 0 - 0x100 address range
1998  */
1999 #define LOW_ADDR(x)	(((unsigned long) &(x)) & 0xff)
2000 
2001 static void __init prom_hold_cpus(void)
2002 {
2003 	unsigned long i;
2004 	phandle node;
2005 	char type[64];
2006 	unsigned long *spinloop
2007 		= (void *) LOW_ADDR(__secondary_hold_spinloop);
2008 	unsigned long *acknowledge
2009 		= (void *) LOW_ADDR(__secondary_hold_acknowledge);
2010 	unsigned long secondary_hold = LOW_ADDR(__secondary_hold);
2011 
2012 	/*
2013 	 * On pseries, if RTAS supports "query-cpu-stopped-state",
2014 	 * we skip this stage, the CPUs will be started by the
2015 	 * kernel using RTAS.
2016 	 */
2017 	if ((of_platform == PLATFORM_PSERIES ||
2018 	     of_platform == PLATFORM_PSERIES_LPAR) &&
2019 	    rtas_has_query_cpu_stopped) {
2020 		prom_printf("prom_hold_cpus: skipped\n");
2021 		return;
2022 	}
2023 
2024 	prom_debug("prom_hold_cpus: start...\n");
2025 	prom_debug("    1) spinloop       = 0x%lx\n", (unsigned long)spinloop);
2026 	prom_debug("    1) *spinloop      = 0x%lx\n", *spinloop);
2027 	prom_debug("    1) acknowledge    = 0x%lx\n",
2028 		   (unsigned long)acknowledge);
2029 	prom_debug("    1) *acknowledge   = 0x%lx\n", *acknowledge);
2030 	prom_debug("    1) secondary_hold = 0x%lx\n", secondary_hold);
2031 
2032 	/* Set the common spinloop variable, so all of the secondary cpus
2033 	 * will block when they are awakened from their OF spinloop.
2034 	 * This must occur for both SMP and non SMP kernels, since OF will
2035 	 * be trashed when we move the kernel.
2036 	 */
2037 	*spinloop = 0;
2038 
2039 	/* look for cpus */
2040 	for (node = 0; prom_next_node(&node); ) {
2041 		unsigned int cpu_no;
2042 		__be32 reg;
2043 
2044 		type[0] = 0;
2045 		prom_getprop(node, "device_type", type, sizeof(type));
2046 		if (prom_strcmp(type, "cpu") != 0)
2047 			continue;
2048 
2049 		/* Skip non-configured cpus. */
2050 		if (prom_getprop(node, "status", type, sizeof(type)) > 0)
2051 			if (prom_strcmp(type, "okay") != 0)
2052 				continue;
2053 
2054 		reg = cpu_to_be32(-1); /* make sparse happy */
2055 		prom_getprop(node, "reg", &reg, sizeof(reg));
2056 		cpu_no = be32_to_cpu(reg);
2057 
2058 		prom_debug("cpu hw idx   = %u\n", cpu_no);
2059 
2060 		/* Init the acknowledge var which will be reset by
2061 		 * the secondary cpu when it awakens from its OF
2062 		 * spinloop.
2063 		 */
2064 		*acknowledge = (unsigned long)-1;
2065 
2066 		if (cpu_no != prom.cpu) {
2067 			/* Primary Thread of non-boot cpu or any thread */
2068 			prom_printf("starting cpu hw idx %u... ", cpu_no);
2069 			call_prom("start-cpu", 3, 0, node,
2070 				  secondary_hold, cpu_no);
2071 
2072 			for (i = 0; (i < 100000000) &&
2073 			     (*acknowledge == ((unsigned long)-1)); i++ )
2074 				mb();
2075 
2076 			if (*acknowledge == cpu_no)
2077 				prom_printf("done\n");
2078 			else
2079 				prom_printf("failed: %lx\n", *acknowledge);
2080 		}
2081 #ifdef CONFIG_SMP
2082 		else
2083 			prom_printf("boot cpu hw idx %u\n", cpu_no);
2084 #endif /* CONFIG_SMP */
2085 	}
2086 
2087 	prom_debug("prom_hold_cpus: end...\n");
2088 }
2089 
2090 
2091 static void __init prom_init_client_services(unsigned long pp)
2092 {
2093 	/* Get a handle to the prom entry point before anything else */
2094 	prom_entry = pp;
2095 
2096 	/* get a handle for the stdout device */
2097 	prom.chosen = call_prom("finddevice", 1, 1, ADDR("/chosen"));
2098 	if (!PHANDLE_VALID(prom.chosen))
2099 		prom_panic("cannot find chosen"); /* msg won't be printed :( */
2100 
2101 	/* get device tree root */
2102 	prom.root = call_prom("finddevice", 1, 1, ADDR("/"));
2103 	if (!PHANDLE_VALID(prom.root))
2104 		prom_panic("cannot find device tree root"); /* msg won't be printed :( */
2105 
2106 	prom.mmumap = 0;
2107 }
2108 
2109 #ifdef CONFIG_PPC32
2110 /*
2111  * For really old powermacs, we need to map things we claim.
2112  * For that, we need the ihandle of the mmu.
2113  * Also, on the longtrail, we need to work around other bugs.
2114  */
2115 static void __init prom_find_mmu(void)
2116 {
2117 	phandle oprom;
2118 	char version[64];
2119 
2120 	oprom = call_prom("finddevice", 1, 1, ADDR("/openprom"));
2121 	if (!PHANDLE_VALID(oprom))
2122 		return;
2123 	if (prom_getprop(oprom, "model", version, sizeof(version)) <= 0)
2124 		return;
2125 	version[sizeof(version) - 1] = 0;
2126 	/* XXX might need to add other versions here */
2127 	if (prom_strcmp(version, "Open Firmware, 1.0.5") == 0)
2128 		of_workarounds = OF_WA_CLAIM;
2129 	else if (prom_strncmp(version, "FirmWorks,3.", 12) == 0) {
2130 		of_workarounds = OF_WA_CLAIM | OF_WA_LONGTRAIL;
2131 		call_prom("interpret", 1, 1, "dev /memory 0 to allow-reclaim");
2132 	} else
2133 		return;
2134 	prom.memory = call_prom("open", 1, 1, ADDR("/memory"));
2135 	prom_getprop(prom.chosen, "mmu", &prom.mmumap,
2136 		     sizeof(prom.mmumap));
2137 	prom.mmumap = be32_to_cpu(prom.mmumap);
2138 	if (!IHANDLE_VALID(prom.memory) || !IHANDLE_VALID(prom.mmumap))
2139 		of_workarounds &= ~OF_WA_CLAIM;		/* hmmm */
2140 }
2141 #else
2142 #define prom_find_mmu()
2143 #endif
2144 
2145 static void __init prom_init_stdout(void)
2146 {
2147 	char *path = of_stdout_device;
2148 	char type[16];
2149 	phandle stdout_node;
2150 	__be32 val;
2151 
2152 	if (prom_getprop(prom.chosen, "stdout", &val, sizeof(val)) <= 0)
2153 		prom_panic("cannot find stdout");
2154 
2155 	prom.stdout = be32_to_cpu(val);
2156 
2157 	/* Get the full OF pathname of the stdout device */
2158 	memset(path, 0, 256);
2159 	call_prom("instance-to-path", 3, 1, prom.stdout, path, 255);
2160 	prom_printf("OF stdout device is: %s\n", of_stdout_device);
2161 	prom_setprop(prom.chosen, "/chosen", "linux,stdout-path",
2162 		     path, prom_strlen(path) + 1);
2163 
2164 	/* instance-to-package fails on PA-Semi */
2165 	stdout_node = call_prom("instance-to-package", 1, 1, prom.stdout);
2166 	if (stdout_node != PROM_ERROR) {
2167 		val = cpu_to_be32(stdout_node);
2168 
2169 		/* If it's a display, note it */
2170 		memset(type, 0, sizeof(type));
2171 		prom_getprop(stdout_node, "device_type", type, sizeof(type));
2172 		if (prom_strcmp(type, "display") == 0)
2173 			prom_setprop(stdout_node, path, "linux,boot-display", NULL, 0);
2174 	}
2175 }
2176 
2177 static int __init prom_find_machine_type(void)
2178 {
2179 	char compat[256];
2180 	int len, i = 0;
2181 #ifdef CONFIG_PPC64
2182 	phandle rtas;
2183 	int x;
2184 #endif
2185 
2186 	/* Look for a PowerMac or a Cell */
2187 	len = prom_getprop(prom.root, "compatible",
2188 			   compat, sizeof(compat)-1);
2189 	if (len > 0) {
2190 		compat[len] = 0;
2191 		while (i < len) {
2192 			char *p = &compat[i];
2193 			int sl = prom_strlen(p);
2194 			if (sl == 0)
2195 				break;
2196 			if (prom_strstr(p, "Power Macintosh") ||
2197 			    prom_strstr(p, "MacRISC"))
2198 				return PLATFORM_POWERMAC;
2199 #ifdef CONFIG_PPC64
2200 			/* We must make sure we don't detect the IBM Cell
2201 			 * blades as pSeries due to some firmware issues,
2202 			 * so we do it here.
2203 			 */
2204 			if (prom_strstr(p, "IBM,CBEA") ||
2205 			    prom_strstr(p, "IBM,CPBW-1.0"))
2206 				return PLATFORM_GENERIC;
2207 #endif /* CONFIG_PPC64 */
2208 			i += sl + 1;
2209 		}
2210 	}
2211 #ifdef CONFIG_PPC64
2212 	/* Try to figure out if it's an IBM pSeries or any other
2213 	 * PAPR compliant platform. We assume it is if :
2214 	 *  - /device_type is "chrp" (please, do NOT use that for future
2215 	 *    non-IBM designs !
2216 	 *  - it has /rtas
2217 	 */
2218 	len = prom_getprop(prom.root, "device_type",
2219 			   compat, sizeof(compat)-1);
2220 	if (len <= 0)
2221 		return PLATFORM_GENERIC;
2222 	if (prom_strcmp(compat, "chrp"))
2223 		return PLATFORM_GENERIC;
2224 
2225 	/* Default to pSeries. We need to know if we are running LPAR */
2226 	rtas = call_prom("finddevice", 1, 1, ADDR("/rtas"));
2227 	if (!PHANDLE_VALID(rtas))
2228 		return PLATFORM_GENERIC;
2229 	x = prom_getproplen(rtas, "ibm,hypertas-functions");
2230 	if (x != PROM_ERROR) {
2231 		prom_debug("Hypertas detected, assuming LPAR !\n");
2232 		return PLATFORM_PSERIES_LPAR;
2233 	}
2234 	return PLATFORM_PSERIES;
2235 #else
2236 	return PLATFORM_GENERIC;
2237 #endif
2238 }
2239 
2240 static int __init prom_set_color(ihandle ih, int i, int r, int g, int b)
2241 {
2242 	return call_prom("call-method", 6, 1, ADDR("color!"), ih, i, b, g, r);
2243 }
2244 
2245 /*
2246  * If we have a display that we don't know how to drive,
2247  * we will want to try to execute OF's open method for it
2248  * later.  However, OF will probably fall over if we do that
2249  * we've taken over the MMU.
2250  * So we check whether we will need to open the display,
2251  * and if so, open it now.
2252  */
2253 static void __init prom_check_displays(void)
2254 {
2255 	char type[16], *path;
2256 	phandle node;
2257 	ihandle ih;
2258 	int i;
2259 
2260 	static const unsigned char default_colors[] __initconst = {
2261 		0x00, 0x00, 0x00,
2262 		0x00, 0x00, 0xaa,
2263 		0x00, 0xaa, 0x00,
2264 		0x00, 0xaa, 0xaa,
2265 		0xaa, 0x00, 0x00,
2266 		0xaa, 0x00, 0xaa,
2267 		0xaa, 0xaa, 0x00,
2268 		0xaa, 0xaa, 0xaa,
2269 		0x55, 0x55, 0x55,
2270 		0x55, 0x55, 0xff,
2271 		0x55, 0xff, 0x55,
2272 		0x55, 0xff, 0xff,
2273 		0xff, 0x55, 0x55,
2274 		0xff, 0x55, 0xff,
2275 		0xff, 0xff, 0x55,
2276 		0xff, 0xff, 0xff
2277 	};
2278 	const unsigned char *clut;
2279 
2280 	prom_debug("Looking for displays\n");
2281 	for (node = 0; prom_next_node(&node); ) {
2282 		memset(type, 0, sizeof(type));
2283 		prom_getprop(node, "device_type", type, sizeof(type));
2284 		if (prom_strcmp(type, "display") != 0)
2285 			continue;
2286 
2287 		/* It seems OF doesn't null-terminate the path :-( */
2288 		path = prom_scratch;
2289 		memset(path, 0, sizeof(prom_scratch));
2290 
2291 		/*
2292 		 * leave some room at the end of the path for appending extra
2293 		 * arguments
2294 		 */
2295 		if (call_prom("package-to-path", 3, 1, node, path,
2296 			      sizeof(prom_scratch) - 10) == PROM_ERROR)
2297 			continue;
2298 		prom_printf("found display   : %s, opening... ", path);
2299 
2300 		ih = call_prom("open", 1, 1, path);
2301 		if (ih == 0) {
2302 			prom_printf("failed\n");
2303 			continue;
2304 		}
2305 
2306 		/* Success */
2307 		prom_printf("done\n");
2308 		prom_setprop(node, path, "linux,opened", NULL, 0);
2309 
2310 		/* Setup a usable color table when the appropriate
2311 		 * method is available. Should update this to set-colors */
2312 		clut = default_colors;
2313 		for (i = 0; i < 16; i++, clut += 3)
2314 			if (prom_set_color(ih, i, clut[0], clut[1],
2315 					   clut[2]) != 0)
2316 				break;
2317 
2318 #ifdef CONFIG_LOGO_LINUX_CLUT224
2319 		clut = PTRRELOC(logo_linux_clut224.clut);
2320 		for (i = 0; i < logo_linux_clut224.clutsize; i++, clut += 3)
2321 			if (prom_set_color(ih, i + 32, clut[0], clut[1],
2322 					   clut[2]) != 0)
2323 				break;
2324 #endif /* CONFIG_LOGO_LINUX_CLUT224 */
2325 
2326 #ifdef CONFIG_PPC_EARLY_DEBUG_BOOTX
2327 		if (prom_getprop(node, "linux,boot-display", NULL, 0) !=
2328 		    PROM_ERROR) {
2329 			u32 width, height, pitch, addr;
2330 
2331 			prom_printf("Setting btext !\n");
2332 			prom_getprop(node, "width", &width, 4);
2333 			prom_getprop(node, "height", &height, 4);
2334 			prom_getprop(node, "linebytes", &pitch, 4);
2335 			prom_getprop(node, "address", &addr, 4);
2336 			prom_printf("W=%d H=%d LB=%d addr=0x%x\n",
2337 				    width, height, pitch, addr);
2338 			btext_setup_display(width, height, 8, pitch, addr);
2339 			btext_prepare_BAT();
2340 		}
2341 #endif /* CONFIG_PPC_EARLY_DEBUG_BOOTX */
2342 	}
2343 }
2344 
2345 
2346 /* Return (relocated) pointer to this much memory: moves initrd if reqd. */
2347 static void __init *make_room(unsigned long *mem_start, unsigned long *mem_end,
2348 			      unsigned long needed, unsigned long align)
2349 {
2350 	void *ret;
2351 
2352 	*mem_start = _ALIGN(*mem_start, align);
2353 	while ((*mem_start + needed) > *mem_end) {
2354 		unsigned long room, chunk;
2355 
2356 		prom_debug("Chunk exhausted, claiming more at %lx...\n",
2357 			   alloc_bottom);
2358 		room = alloc_top - alloc_bottom;
2359 		if (room > DEVTREE_CHUNK_SIZE)
2360 			room = DEVTREE_CHUNK_SIZE;
2361 		if (room < PAGE_SIZE)
2362 			prom_panic("No memory for flatten_device_tree "
2363 				   "(no room)\n");
2364 		chunk = alloc_up(room, 0);
2365 		if (chunk == 0)
2366 			prom_panic("No memory for flatten_device_tree "
2367 				   "(claim failed)\n");
2368 		*mem_end = chunk + room;
2369 	}
2370 
2371 	ret = (void *)*mem_start;
2372 	*mem_start += needed;
2373 
2374 	return ret;
2375 }
2376 
2377 #define dt_push_token(token, mem_start, mem_end) do { 			\
2378 		void *room = make_room(mem_start, mem_end, 4, 4);	\
2379 		*(__be32 *)room = cpu_to_be32(token);			\
2380 	} while(0)
2381 
2382 static unsigned long __init dt_find_string(char *str)
2383 {
2384 	char *s, *os;
2385 
2386 	s = os = (char *)dt_string_start;
2387 	s += 4;
2388 	while (s <  (char *)dt_string_end) {
2389 		if (prom_strcmp(s, str) == 0)
2390 			return s - os;
2391 		s += prom_strlen(s) + 1;
2392 	}
2393 	return 0;
2394 }
2395 
2396 /*
2397  * The Open Firmware 1275 specification states properties must be 31 bytes or
2398  * less, however not all firmwares obey this. Make it 64 bytes to be safe.
2399  */
2400 #define MAX_PROPERTY_NAME 64
2401 
2402 static void __init scan_dt_build_strings(phandle node,
2403 					 unsigned long *mem_start,
2404 					 unsigned long *mem_end)
2405 {
2406 	char *prev_name, *namep, *sstart;
2407 	unsigned long soff;
2408 	phandle child;
2409 
2410 	sstart =  (char *)dt_string_start;
2411 
2412 	/* get and store all property names */
2413 	prev_name = "";
2414 	for (;;) {
2415 		/* 64 is max len of name including nul. */
2416 		namep = make_room(mem_start, mem_end, MAX_PROPERTY_NAME, 1);
2417 		if (call_prom("nextprop", 3, 1, node, prev_name, namep) != 1) {
2418 			/* No more nodes: unwind alloc */
2419 			*mem_start = (unsigned long)namep;
2420 			break;
2421 		}
2422 
2423  		/* skip "name" */
2424 		if (prom_strcmp(namep, "name") == 0) {
2425  			*mem_start = (unsigned long)namep;
2426  			prev_name = "name";
2427  			continue;
2428  		}
2429 		/* get/create string entry */
2430 		soff = dt_find_string(namep);
2431 		if (soff != 0) {
2432 			*mem_start = (unsigned long)namep;
2433 			namep = sstart + soff;
2434 		} else {
2435 			/* Trim off some if we can */
2436 			*mem_start = (unsigned long)namep + prom_strlen(namep) + 1;
2437 			dt_string_end = *mem_start;
2438 		}
2439 		prev_name = namep;
2440 	}
2441 
2442 	/* do all our children */
2443 	child = call_prom("child", 1, 1, node);
2444 	while (child != 0) {
2445 		scan_dt_build_strings(child, mem_start, mem_end);
2446 		child = call_prom("peer", 1, 1, child);
2447 	}
2448 }
2449 
2450 static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
2451 					unsigned long *mem_end)
2452 {
2453 	phandle child;
2454 	char *namep, *prev_name, *sstart, *p, *ep, *lp, *path;
2455 	unsigned long soff;
2456 	unsigned char *valp;
2457 	static char pname[MAX_PROPERTY_NAME] __prombss;
2458 	int l, room, has_phandle = 0;
2459 
2460 	dt_push_token(OF_DT_BEGIN_NODE, mem_start, mem_end);
2461 
2462 	/* get the node's full name */
2463 	namep = (char *)*mem_start;
2464 	room = *mem_end - *mem_start;
2465 	if (room > 255)
2466 		room = 255;
2467 	l = call_prom("package-to-path", 3, 1, node, namep, room);
2468 	if (l >= 0) {
2469 		/* Didn't fit?  Get more room. */
2470 		if (l >= room) {
2471 			if (l >= *mem_end - *mem_start)
2472 				namep = make_room(mem_start, mem_end, l+1, 1);
2473 			call_prom("package-to-path", 3, 1, node, namep, l);
2474 		}
2475 		namep[l] = '\0';
2476 
2477 		/* Fixup an Apple bug where they have bogus \0 chars in the
2478 		 * middle of the path in some properties, and extract
2479 		 * the unit name (everything after the last '/').
2480 		 */
2481 		for (lp = p = namep, ep = namep + l; p < ep; p++) {
2482 			if (*p == '/')
2483 				lp = namep;
2484 			else if (*p != 0)
2485 				*lp++ = *p;
2486 		}
2487 		*lp = 0;
2488 		*mem_start = _ALIGN((unsigned long)lp + 1, 4);
2489 	}
2490 
2491 	/* get it again for debugging */
2492 	path = prom_scratch;
2493 	memset(path, 0, sizeof(prom_scratch));
2494 	call_prom("package-to-path", 3, 1, node, path, sizeof(prom_scratch) - 1);
2495 
2496 	/* get and store all properties */
2497 	prev_name = "";
2498 	sstart = (char *)dt_string_start;
2499 	for (;;) {
2500 		if (call_prom("nextprop", 3, 1, node, prev_name,
2501 			      pname) != 1)
2502 			break;
2503 
2504  		/* skip "name" */
2505 		if (prom_strcmp(pname, "name") == 0) {
2506  			prev_name = "name";
2507  			continue;
2508  		}
2509 
2510 		/* find string offset */
2511 		soff = dt_find_string(pname);
2512 		if (soff == 0) {
2513 			prom_printf("WARNING: Can't find string index for"
2514 				    " <%s>, node %s\n", pname, path);
2515 			break;
2516 		}
2517 		prev_name = sstart + soff;
2518 
2519 		/* get length */
2520 		l = call_prom("getproplen", 2, 1, node, pname);
2521 
2522 		/* sanity checks */
2523 		if (l == PROM_ERROR)
2524 			continue;
2525 
2526 		/* push property head */
2527 		dt_push_token(OF_DT_PROP, mem_start, mem_end);
2528 		dt_push_token(l, mem_start, mem_end);
2529 		dt_push_token(soff, mem_start, mem_end);
2530 
2531 		/* push property content */
2532 		valp = make_room(mem_start, mem_end, l, 4);
2533 		call_prom("getprop", 4, 1, node, pname, valp, l);
2534 		*mem_start = _ALIGN(*mem_start, 4);
2535 
2536 		if (!prom_strcmp(pname, "phandle"))
2537 			has_phandle = 1;
2538 	}
2539 
2540 	/* Add a "phandle" property if none already exist */
2541 	if (!has_phandle) {
2542 		soff = dt_find_string("phandle");
2543 		if (soff == 0)
2544 			prom_printf("WARNING: Can't find string index for <phandle> node %s\n", path);
2545 		else {
2546 			dt_push_token(OF_DT_PROP, mem_start, mem_end);
2547 			dt_push_token(4, mem_start, mem_end);
2548 			dt_push_token(soff, mem_start, mem_end);
2549 			valp = make_room(mem_start, mem_end, 4, 4);
2550 			*(__be32 *)valp = cpu_to_be32(node);
2551 		}
2552 	}
2553 
2554 	/* do all our children */
2555 	child = call_prom("child", 1, 1, node);
2556 	while (child != 0) {
2557 		scan_dt_build_struct(child, mem_start, mem_end);
2558 		child = call_prom("peer", 1, 1, child);
2559 	}
2560 
2561 	dt_push_token(OF_DT_END_NODE, mem_start, mem_end);
2562 }
2563 
2564 static void __init flatten_device_tree(void)
2565 {
2566 	phandle root;
2567 	unsigned long mem_start, mem_end, room;
2568 	struct boot_param_header *hdr;
2569 	char *namep;
2570 	u64 *rsvmap;
2571 
2572 	/*
2573 	 * Check how much room we have between alloc top & bottom (+/- a
2574 	 * few pages), crop to 1MB, as this is our "chunk" size
2575 	 */
2576 	room = alloc_top - alloc_bottom - 0x4000;
2577 	if (room > DEVTREE_CHUNK_SIZE)
2578 		room = DEVTREE_CHUNK_SIZE;
2579 	prom_debug("starting device tree allocs at %lx\n", alloc_bottom);
2580 
2581 	/* Now try to claim that */
2582 	mem_start = (unsigned long)alloc_up(room, PAGE_SIZE);
2583 	if (mem_start == 0)
2584 		prom_panic("Can't allocate initial device-tree chunk\n");
2585 	mem_end = mem_start + room;
2586 
2587 	/* Get root of tree */
2588 	root = call_prom("peer", 1, 1, (phandle)0);
2589 	if (root == (phandle)0)
2590 		prom_panic ("couldn't get device tree root\n");
2591 
2592 	/* Build header and make room for mem rsv map */
2593 	mem_start = _ALIGN(mem_start, 4);
2594 	hdr = make_room(&mem_start, &mem_end,
2595 			sizeof(struct boot_param_header), 4);
2596 	dt_header_start = (unsigned long)hdr;
2597 	rsvmap = make_room(&mem_start, &mem_end, sizeof(mem_reserve_map), 8);
2598 
2599 	/* Start of strings */
2600 	mem_start = PAGE_ALIGN(mem_start);
2601 	dt_string_start = mem_start;
2602 	mem_start += 4; /* hole */
2603 
2604 	/* Add "phandle" in there, we'll need it */
2605 	namep = make_room(&mem_start, &mem_end, 16, 1);
2606 	prom_strcpy(namep, "phandle");
2607 	mem_start = (unsigned long)namep + prom_strlen(namep) + 1;
2608 
2609 	/* Build string array */
2610 	prom_printf("Building dt strings...\n");
2611 	scan_dt_build_strings(root, &mem_start, &mem_end);
2612 	dt_string_end = mem_start;
2613 
2614 	/* Build structure */
2615 	mem_start = PAGE_ALIGN(mem_start);
2616 	dt_struct_start = mem_start;
2617 	prom_printf("Building dt structure...\n");
2618 	scan_dt_build_struct(root, &mem_start, &mem_end);
2619 	dt_push_token(OF_DT_END, &mem_start, &mem_end);
2620 	dt_struct_end = PAGE_ALIGN(mem_start);
2621 
2622 	/* Finish header */
2623 	hdr->boot_cpuid_phys = cpu_to_be32(prom.cpu);
2624 	hdr->magic = cpu_to_be32(OF_DT_HEADER);
2625 	hdr->totalsize = cpu_to_be32(dt_struct_end - dt_header_start);
2626 	hdr->off_dt_struct = cpu_to_be32(dt_struct_start - dt_header_start);
2627 	hdr->off_dt_strings = cpu_to_be32(dt_string_start - dt_header_start);
2628 	hdr->dt_strings_size = cpu_to_be32(dt_string_end - dt_string_start);
2629 	hdr->off_mem_rsvmap = cpu_to_be32(((unsigned long)rsvmap) - dt_header_start);
2630 	hdr->version = cpu_to_be32(OF_DT_VERSION);
2631 	/* Version 16 is not backward compatible */
2632 	hdr->last_comp_version = cpu_to_be32(0x10);
2633 
2634 	/* Copy the reserve map in */
2635 	memcpy(rsvmap, mem_reserve_map, sizeof(mem_reserve_map));
2636 
2637 #ifdef DEBUG_PROM
2638 	{
2639 		int i;
2640 		prom_printf("reserved memory map:\n");
2641 		for (i = 0; i < mem_reserve_cnt; i++)
2642 			prom_printf("  %llx - %llx\n",
2643 				    be64_to_cpu(mem_reserve_map[i].base),
2644 				    be64_to_cpu(mem_reserve_map[i].size));
2645 	}
2646 #endif
2647 	/* Bump mem_reserve_cnt to cause further reservations to fail
2648 	 * since it's too late.
2649 	 */
2650 	mem_reserve_cnt = MEM_RESERVE_MAP_SIZE;
2651 
2652 	prom_printf("Device tree strings 0x%lx -> 0x%lx\n",
2653 		    dt_string_start, dt_string_end);
2654 	prom_printf("Device tree struct  0x%lx -> 0x%lx\n",
2655 		    dt_struct_start, dt_struct_end);
2656 }
2657 
2658 #ifdef CONFIG_PPC_MAPLE
2659 /* PIBS Version 1.05.0000 04/26/2005 has an incorrect /ht/isa/ranges property.
2660  * The values are bad, and it doesn't even have the right number of cells. */
2661 static void __init fixup_device_tree_maple(void)
2662 {
2663 	phandle isa;
2664 	u32 rloc = 0x01002000; /* IO space; PCI device = 4 */
2665 	u32 isa_ranges[6];
2666 	char *name;
2667 
2668 	name = "/ht@0/isa@4";
2669 	isa = call_prom("finddevice", 1, 1, ADDR(name));
2670 	if (!PHANDLE_VALID(isa)) {
2671 		name = "/ht@0/isa@6";
2672 		isa = call_prom("finddevice", 1, 1, ADDR(name));
2673 		rloc = 0x01003000; /* IO space; PCI device = 6 */
2674 	}
2675 	if (!PHANDLE_VALID(isa))
2676 		return;
2677 
2678 	if (prom_getproplen(isa, "ranges") != 12)
2679 		return;
2680 	if (prom_getprop(isa, "ranges", isa_ranges, sizeof(isa_ranges))
2681 		== PROM_ERROR)
2682 		return;
2683 
2684 	if (isa_ranges[0] != 0x1 ||
2685 		isa_ranges[1] != 0xf4000000 ||
2686 		isa_ranges[2] != 0x00010000)
2687 		return;
2688 
2689 	prom_printf("Fixing up bogus ISA range on Maple/Apache...\n");
2690 
2691 	isa_ranges[0] = 0x1;
2692 	isa_ranges[1] = 0x0;
2693 	isa_ranges[2] = rloc;
2694 	isa_ranges[3] = 0x0;
2695 	isa_ranges[4] = 0x0;
2696 	isa_ranges[5] = 0x00010000;
2697 	prom_setprop(isa, name, "ranges",
2698 			isa_ranges, sizeof(isa_ranges));
2699 }
2700 
2701 #define CPC925_MC_START		0xf8000000
2702 #define CPC925_MC_LENGTH	0x1000000
2703 /* The values for memory-controller don't have right number of cells */
2704 static void __init fixup_device_tree_maple_memory_controller(void)
2705 {
2706 	phandle mc;
2707 	u32 mc_reg[4];
2708 	char *name = "/hostbridge@f8000000";
2709 	u32 ac, sc;
2710 
2711 	mc = call_prom("finddevice", 1, 1, ADDR(name));
2712 	if (!PHANDLE_VALID(mc))
2713 		return;
2714 
2715 	if (prom_getproplen(mc, "reg") != 8)
2716 		return;
2717 
2718 	prom_getprop(prom.root, "#address-cells", &ac, sizeof(ac));
2719 	prom_getprop(prom.root, "#size-cells", &sc, sizeof(sc));
2720 	if ((ac != 2) || (sc != 2))
2721 		return;
2722 
2723 	if (prom_getprop(mc, "reg", mc_reg, sizeof(mc_reg)) == PROM_ERROR)
2724 		return;
2725 
2726 	if (mc_reg[0] != CPC925_MC_START || mc_reg[1] != CPC925_MC_LENGTH)
2727 		return;
2728 
2729 	prom_printf("Fixing up bogus hostbridge on Maple...\n");
2730 
2731 	mc_reg[0] = 0x0;
2732 	mc_reg[1] = CPC925_MC_START;
2733 	mc_reg[2] = 0x0;
2734 	mc_reg[3] = CPC925_MC_LENGTH;
2735 	prom_setprop(mc, name, "reg", mc_reg, sizeof(mc_reg));
2736 }
2737 #else
2738 #define fixup_device_tree_maple()
2739 #define fixup_device_tree_maple_memory_controller()
2740 #endif
2741 
2742 #ifdef CONFIG_PPC_CHRP
2743 /*
2744  * Pegasos and BriQ lacks the "ranges" property in the isa node
2745  * Pegasos needs decimal IRQ 14/15, not hexadecimal
2746  * Pegasos has the IDE configured in legacy mode, but advertised as native
2747  */
2748 static void __init fixup_device_tree_chrp(void)
2749 {
2750 	phandle ph;
2751 	u32 prop[6];
2752 	u32 rloc = 0x01006000; /* IO space; PCI device = 12 */
2753 	char *name;
2754 	int rc;
2755 
2756 	name = "/pci@80000000/isa@c";
2757 	ph = call_prom("finddevice", 1, 1, ADDR(name));
2758 	if (!PHANDLE_VALID(ph)) {
2759 		name = "/pci@ff500000/isa@6";
2760 		ph = call_prom("finddevice", 1, 1, ADDR(name));
2761 		rloc = 0x01003000; /* IO space; PCI device = 6 */
2762 	}
2763 	if (PHANDLE_VALID(ph)) {
2764 		rc = prom_getproplen(ph, "ranges");
2765 		if (rc == 0 || rc == PROM_ERROR) {
2766 			prom_printf("Fixing up missing ISA range on Pegasos...\n");
2767 
2768 			prop[0] = 0x1;
2769 			prop[1] = 0x0;
2770 			prop[2] = rloc;
2771 			prop[3] = 0x0;
2772 			prop[4] = 0x0;
2773 			prop[5] = 0x00010000;
2774 			prom_setprop(ph, name, "ranges", prop, sizeof(prop));
2775 		}
2776 	}
2777 
2778 	name = "/pci@80000000/ide@C,1";
2779 	ph = call_prom("finddevice", 1, 1, ADDR(name));
2780 	if (PHANDLE_VALID(ph)) {
2781 		prom_printf("Fixing up IDE interrupt on Pegasos...\n");
2782 		prop[0] = 14;
2783 		prop[1] = 0x0;
2784 		prom_setprop(ph, name, "interrupts", prop, 2*sizeof(u32));
2785 		prom_printf("Fixing up IDE class-code on Pegasos...\n");
2786 		rc = prom_getprop(ph, "class-code", prop, sizeof(u32));
2787 		if (rc == sizeof(u32)) {
2788 			prop[0] &= ~0x5;
2789 			prom_setprop(ph, name, "class-code", prop, sizeof(u32));
2790 		}
2791 	}
2792 }
2793 #else
2794 #define fixup_device_tree_chrp()
2795 #endif
2796 
2797 #if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC)
2798 static void __init fixup_device_tree_pmac(void)
2799 {
2800 	phandle u3, i2c, mpic;
2801 	u32 u3_rev;
2802 	u32 interrupts[2];
2803 	u32 parent;
2804 
2805 	/* Some G5s have a missing interrupt definition, fix it up here */
2806 	u3 = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000"));
2807 	if (!PHANDLE_VALID(u3))
2808 		return;
2809 	i2c = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/i2c@f8001000"));
2810 	if (!PHANDLE_VALID(i2c))
2811 		return;
2812 	mpic = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/mpic@f8040000"));
2813 	if (!PHANDLE_VALID(mpic))
2814 		return;
2815 
2816 	/* check if proper rev of u3 */
2817 	if (prom_getprop(u3, "device-rev", &u3_rev, sizeof(u3_rev))
2818 	    == PROM_ERROR)
2819 		return;
2820 	if (u3_rev < 0x35 || u3_rev > 0x39)
2821 		return;
2822 	/* does it need fixup ? */
2823 	if (prom_getproplen(i2c, "interrupts") > 0)
2824 		return;
2825 
2826 	prom_printf("fixing up bogus interrupts for u3 i2c...\n");
2827 
2828 	/* interrupt on this revision of u3 is number 0 and level */
2829 	interrupts[0] = 0;
2830 	interrupts[1] = 1;
2831 	prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupts",
2832 		     &interrupts, sizeof(interrupts));
2833 	parent = (u32)mpic;
2834 	prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupt-parent",
2835 		     &parent, sizeof(parent));
2836 }
2837 #else
2838 #define fixup_device_tree_pmac()
2839 #endif
2840 
2841 #ifdef CONFIG_PPC_EFIKA
2842 /*
2843  * The MPC5200 FEC driver requires an phy-handle property to tell it how
2844  * to talk to the phy.  If the phy-handle property is missing, then this
2845  * function is called to add the appropriate nodes and link it to the
2846  * ethernet node.
2847  */
2848 static void __init fixup_device_tree_efika_add_phy(void)
2849 {
2850 	u32 node;
2851 	char prop[64];
2852 	int rv;
2853 
2854 	/* Check if /builtin/ethernet exists - bail if it doesn't */
2855 	node = call_prom("finddevice", 1, 1, ADDR("/builtin/ethernet"));
2856 	if (!PHANDLE_VALID(node))
2857 		return;
2858 
2859 	/* Check if the phy-handle property exists - bail if it does */
2860 	rv = prom_getprop(node, "phy-handle", prop, sizeof(prop));
2861 	if (!rv)
2862 		return;
2863 
2864 	/*
2865 	 * At this point the ethernet device doesn't have a phy described.
2866 	 * Now we need to add the missing phy node and linkage
2867 	 */
2868 
2869 	/* Check for an MDIO bus node - if missing then create one */
2870 	node = call_prom("finddevice", 1, 1, ADDR("/builtin/mdio"));
2871 	if (!PHANDLE_VALID(node)) {
2872 		prom_printf("Adding Ethernet MDIO node\n");
2873 		call_prom("interpret", 1, 1,
2874 			" s\" /builtin\" find-device"
2875 			" new-device"
2876 				" 1 encode-int s\" #address-cells\" property"
2877 				" 0 encode-int s\" #size-cells\" property"
2878 				" s\" mdio\" device-name"
2879 				" s\" fsl,mpc5200b-mdio\" encode-string"
2880 				" s\" compatible\" property"
2881 				" 0xf0003000 0x400 reg"
2882 				" 0x2 encode-int"
2883 				" 0x5 encode-int encode+"
2884 				" 0x3 encode-int encode+"
2885 				" s\" interrupts\" property"
2886 			" finish-device");
2887 	};
2888 
2889 	/* Check for a PHY device node - if missing then create one and
2890 	 * give it's phandle to the ethernet node */
2891 	node = call_prom("finddevice", 1, 1,
2892 			 ADDR("/builtin/mdio/ethernet-phy"));
2893 	if (!PHANDLE_VALID(node)) {
2894 		prom_printf("Adding Ethernet PHY node\n");
2895 		call_prom("interpret", 1, 1,
2896 			" s\" /builtin/mdio\" find-device"
2897 			" new-device"
2898 				" s\" ethernet-phy\" device-name"
2899 				" 0x10 encode-int s\" reg\" property"
2900 				" my-self"
2901 				" ihandle>phandle"
2902 			" finish-device"
2903 			" s\" /builtin/ethernet\" find-device"
2904 				" encode-int"
2905 				" s\" phy-handle\" property"
2906 			" device-end");
2907 	}
2908 }
2909 
2910 static void __init fixup_device_tree_efika(void)
2911 {
2912 	int sound_irq[3] = { 2, 2, 0 };
2913 	int bcomm_irq[3*16] = { 3,0,0, 3,1,0, 3,2,0, 3,3,0,
2914 				3,4,0, 3,5,0, 3,6,0, 3,7,0,
2915 				3,8,0, 3,9,0, 3,10,0, 3,11,0,
2916 				3,12,0, 3,13,0, 3,14,0, 3,15,0 };
2917 	u32 node;
2918 	char prop[64];
2919 	int rv, len;
2920 
2921 	/* Check if we're really running on a EFIKA */
2922 	node = call_prom("finddevice", 1, 1, ADDR("/"));
2923 	if (!PHANDLE_VALID(node))
2924 		return;
2925 
2926 	rv = prom_getprop(node, "model", prop, sizeof(prop));
2927 	if (rv == PROM_ERROR)
2928 		return;
2929 	if (prom_strcmp(prop, "EFIKA5K2"))
2930 		return;
2931 
2932 	prom_printf("Applying EFIKA device tree fixups\n");
2933 
2934 	/* Claiming to be 'chrp' is death */
2935 	node = call_prom("finddevice", 1, 1, ADDR("/"));
2936 	rv = prom_getprop(node, "device_type", prop, sizeof(prop));
2937 	if (rv != PROM_ERROR && (prom_strcmp(prop, "chrp") == 0))
2938 		prom_setprop(node, "/", "device_type", "efika", sizeof("efika"));
2939 
2940 	/* CODEGEN,description is exposed in /proc/cpuinfo so
2941 	   fix that too */
2942 	rv = prom_getprop(node, "CODEGEN,description", prop, sizeof(prop));
2943 	if (rv != PROM_ERROR && (prom_strstr(prop, "CHRP")))
2944 		prom_setprop(node, "/", "CODEGEN,description",
2945 			     "Efika 5200B PowerPC System",
2946 			     sizeof("Efika 5200B PowerPC System"));
2947 
2948 	/* Fixup bestcomm interrupts property */
2949 	node = call_prom("finddevice", 1, 1, ADDR("/builtin/bestcomm"));
2950 	if (PHANDLE_VALID(node)) {
2951 		len = prom_getproplen(node, "interrupts");
2952 		if (len == 12) {
2953 			prom_printf("Fixing bestcomm interrupts property\n");
2954 			prom_setprop(node, "/builtin/bestcom", "interrupts",
2955 				     bcomm_irq, sizeof(bcomm_irq));
2956 		}
2957 	}
2958 
2959 	/* Fixup sound interrupts property */
2960 	node = call_prom("finddevice", 1, 1, ADDR("/builtin/sound"));
2961 	if (PHANDLE_VALID(node)) {
2962 		rv = prom_getprop(node, "interrupts", prop, sizeof(prop));
2963 		if (rv == PROM_ERROR) {
2964 			prom_printf("Adding sound interrupts property\n");
2965 			prom_setprop(node, "/builtin/sound", "interrupts",
2966 				     sound_irq, sizeof(sound_irq));
2967 		}
2968 	}
2969 
2970 	/* Make sure ethernet phy-handle property exists */
2971 	fixup_device_tree_efika_add_phy();
2972 }
2973 #else
2974 #define fixup_device_tree_efika()
2975 #endif
2976 
2977 #ifdef CONFIG_PPC_PASEMI_NEMO
2978 /*
2979  * CFE supplied on Nemo is broken in several ways, biggest
2980  * problem is that it reassigns ISA interrupts to unused mpic ints.
2981  * Add an interrupt-controller property for the io-bridge to use
2982  * and correct the ints so we can attach them to an irq_domain
2983  */
2984 static void __init fixup_device_tree_pasemi(void)
2985 {
2986 	u32 interrupts[2], parent, rval, val = 0;
2987 	char *name, *pci_name;
2988 	phandle iob, node;
2989 
2990 	/* Find the root pci node */
2991 	name = "/pxp@0,e0000000";
2992 	iob = call_prom("finddevice", 1, 1, ADDR(name));
2993 	if (!PHANDLE_VALID(iob))
2994 		return;
2995 
2996 	/* check if interrupt-controller node set yet */
2997 	if (prom_getproplen(iob, "interrupt-controller") !=PROM_ERROR)
2998 		return;
2999 
3000 	prom_printf("adding interrupt-controller property for SB600...\n");
3001 
3002 	prom_setprop(iob, name, "interrupt-controller", &val, 0);
3003 
3004 	pci_name = "/pxp@0,e0000000/pci@11";
3005 	node = call_prom("finddevice", 1, 1, ADDR(pci_name));
3006 	parent = ADDR(iob);
3007 
3008 	for( ; prom_next_node(&node); ) {
3009 		/* scan each node for one with an interrupt */
3010 		if (!PHANDLE_VALID(node))
3011 			continue;
3012 
3013 		rval = prom_getproplen(node, "interrupts");
3014 		if (rval == 0 || rval == PROM_ERROR)
3015 			continue;
3016 
3017 		prom_getprop(node, "interrupts", &interrupts, sizeof(interrupts));
3018 		if ((interrupts[0] < 212) || (interrupts[0] > 222))
3019 			continue;
3020 
3021 		/* found a node, update both interrupts and interrupt-parent */
3022 		if ((interrupts[0] >= 212) && (interrupts[0] <= 215))
3023 			interrupts[0] -= 203;
3024 		if ((interrupts[0] >= 216) && (interrupts[0] <= 220))
3025 			interrupts[0] -= 213;
3026 		if (interrupts[0] == 221)
3027 			interrupts[0] = 14;
3028 		if (interrupts[0] == 222)
3029 			interrupts[0] = 8;
3030 
3031 		prom_setprop(node, pci_name, "interrupts", interrupts,
3032 					sizeof(interrupts));
3033 		prom_setprop(node, pci_name, "interrupt-parent", &parent,
3034 					sizeof(parent));
3035 	}
3036 
3037 	/*
3038 	 * The io-bridge has device_type set to 'io-bridge' change it to 'isa'
3039 	 * so that generic isa-bridge code can add the SB600 and its on-board
3040 	 * peripherals.
3041 	 */
3042 	name = "/pxp@0,e0000000/io-bridge@0";
3043 	iob = call_prom("finddevice", 1, 1, ADDR(name));
3044 	if (!PHANDLE_VALID(iob))
3045 		return;
3046 
3047 	/* device_type is already set, just change it. */
3048 
3049 	prom_printf("Changing device_type of SB600 node...\n");
3050 
3051 	prom_setprop(iob, name, "device_type", "isa", sizeof("isa"));
3052 }
3053 #else	/* !CONFIG_PPC_PASEMI_NEMO */
3054 static inline void fixup_device_tree_pasemi(void) { }
3055 #endif
3056 
3057 static void __init fixup_device_tree(void)
3058 {
3059 	fixup_device_tree_maple();
3060 	fixup_device_tree_maple_memory_controller();
3061 	fixup_device_tree_chrp();
3062 	fixup_device_tree_pmac();
3063 	fixup_device_tree_efika();
3064 	fixup_device_tree_pasemi();
3065 }
3066 
3067 static void __init prom_find_boot_cpu(void)
3068 {
3069 	__be32 rval;
3070 	ihandle prom_cpu;
3071 	phandle cpu_pkg;
3072 
3073 	rval = 0;
3074 	if (prom_getprop(prom.chosen, "cpu", &rval, sizeof(rval)) <= 0)
3075 		return;
3076 	prom_cpu = be32_to_cpu(rval);
3077 
3078 	cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu);
3079 
3080 	if (!PHANDLE_VALID(cpu_pkg))
3081 		return;
3082 
3083 	prom_getprop(cpu_pkg, "reg", &rval, sizeof(rval));
3084 	prom.cpu = be32_to_cpu(rval);
3085 
3086 	prom_debug("Booting CPU hw index = %d\n", prom.cpu);
3087 }
3088 
3089 static void __init prom_check_initrd(unsigned long r3, unsigned long r4)
3090 {
3091 #ifdef CONFIG_BLK_DEV_INITRD
3092 	if (r3 && r4 && r4 != 0xdeadbeef) {
3093 		__be64 val;
3094 
3095 		prom_initrd_start = is_kernel_addr(r3) ? __pa(r3) : r3;
3096 		prom_initrd_end = prom_initrd_start + r4;
3097 
3098 		val = cpu_to_be64(prom_initrd_start);
3099 		prom_setprop(prom.chosen, "/chosen", "linux,initrd-start",
3100 			     &val, sizeof(val));
3101 		val = cpu_to_be64(prom_initrd_end);
3102 		prom_setprop(prom.chosen, "/chosen", "linux,initrd-end",
3103 			     &val, sizeof(val));
3104 
3105 		reserve_mem(prom_initrd_start,
3106 			    prom_initrd_end - prom_initrd_start);
3107 
3108 		prom_debug("initrd_start=0x%lx\n", prom_initrd_start);
3109 		prom_debug("initrd_end=0x%lx\n", prom_initrd_end);
3110 	}
3111 #endif /* CONFIG_BLK_DEV_INITRD */
3112 }
3113 
3114 #ifdef CONFIG_PPC64
3115 #ifdef CONFIG_RELOCATABLE
3116 static void reloc_toc(void)
3117 {
3118 }
3119 
3120 static void unreloc_toc(void)
3121 {
3122 }
3123 #else
3124 static void __reloc_toc(unsigned long offset, unsigned long nr_entries)
3125 {
3126 	unsigned long i;
3127 	unsigned long *toc_entry;
3128 
3129 	/* Get the start of the TOC by using r2 directly. */
3130 	asm volatile("addi %0,2,-0x8000" : "=b" (toc_entry));
3131 
3132 	for (i = 0; i < nr_entries; i++) {
3133 		*toc_entry = *toc_entry + offset;
3134 		toc_entry++;
3135 	}
3136 }
3137 
3138 static void reloc_toc(void)
3139 {
3140 	unsigned long offset = reloc_offset();
3141 	unsigned long nr_entries =
3142 		(__prom_init_toc_end - __prom_init_toc_start) / sizeof(long);
3143 
3144 	__reloc_toc(offset, nr_entries);
3145 
3146 	mb();
3147 }
3148 
3149 static void unreloc_toc(void)
3150 {
3151 	unsigned long offset = reloc_offset();
3152 	unsigned long nr_entries =
3153 		(__prom_init_toc_end - __prom_init_toc_start) / sizeof(long);
3154 
3155 	mb();
3156 
3157 	__reloc_toc(-offset, nr_entries);
3158 }
3159 #endif
3160 #endif
3161 
3162 /*
3163  * We enter here early on, when the Open Firmware prom is still
3164  * handling exceptions and the MMU hash table for us.
3165  */
3166 
3167 unsigned long __init prom_init(unsigned long r3, unsigned long r4,
3168 			       unsigned long pp,
3169 			       unsigned long r6, unsigned long r7,
3170 			       unsigned long kbase)
3171 {
3172 	unsigned long hdr;
3173 
3174 #ifdef CONFIG_PPC32
3175 	unsigned long offset = reloc_offset();
3176 	reloc_got2(offset);
3177 #else
3178 	reloc_toc();
3179 #endif
3180 
3181 	/*
3182 	 * First zero the BSS
3183 	 */
3184 	memset(&__bss_start, 0, __bss_stop - __bss_start);
3185 
3186 	/*
3187 	 * Init interface to Open Firmware, get some node references,
3188 	 * like /chosen
3189 	 */
3190 	prom_init_client_services(pp);
3191 
3192 	/*
3193 	 * See if this OF is old enough that we need to do explicit maps
3194 	 * and other workarounds
3195 	 */
3196 	prom_find_mmu();
3197 
3198 	/*
3199 	 * Init prom stdout device
3200 	 */
3201 	prom_init_stdout();
3202 
3203 	prom_printf("Preparing to boot %s", linux_banner);
3204 
3205 	/*
3206 	 * Get default machine type. At this point, we do not differentiate
3207 	 * between pSeries SMP and pSeries LPAR
3208 	 */
3209 	of_platform = prom_find_machine_type();
3210 	prom_printf("Detected machine type: %x\n", of_platform);
3211 
3212 #ifndef CONFIG_NONSTATIC_KERNEL
3213 	/* Bail if this is a kdump kernel. */
3214 	if (PHYSICAL_START > 0)
3215 		prom_panic("Error: You can't boot a kdump kernel from OF!\n");
3216 #endif
3217 
3218 	/*
3219 	 * Check for an initrd
3220 	 */
3221 	prom_check_initrd(r3, r4);
3222 
3223 	/*
3224 	 * Do early parsing of command line
3225 	 */
3226 	early_cmdline_parse();
3227 
3228 #ifdef CONFIG_PPC_PSERIES
3229 	/*
3230 	 * On pSeries, inform the firmware about our capabilities
3231 	 */
3232 	if (of_platform == PLATFORM_PSERIES ||
3233 	    of_platform == PLATFORM_PSERIES_LPAR)
3234 		prom_send_capabilities();
3235 #endif
3236 
3237 	/*
3238 	 * Copy the CPU hold code
3239 	 */
3240 	if (of_platform != PLATFORM_POWERMAC)
3241 		copy_and_flush(0, kbase, 0x100, 0);
3242 
3243 	/*
3244 	 * Initialize memory management within prom_init
3245 	 */
3246 	prom_init_mem();
3247 
3248 	/*
3249 	 * Determine which cpu is actually running right _now_
3250 	 */
3251 	prom_find_boot_cpu();
3252 
3253 	/*
3254 	 * Initialize display devices
3255 	 */
3256 	prom_check_displays();
3257 
3258 #if defined(CONFIG_PPC64) && defined(__BIG_ENDIAN__)
3259 	/*
3260 	 * Initialize IOMMU (TCE tables) on pSeries. Do that before anything else
3261 	 * that uses the allocator, we need to make sure we get the top of memory
3262 	 * available for us here...
3263 	 */
3264 	if (of_platform == PLATFORM_PSERIES)
3265 		prom_initialize_tce_table();
3266 #endif
3267 
3268 	/*
3269 	 * On non-powermacs, try to instantiate RTAS. PowerMacs don't
3270 	 * have a usable RTAS implementation.
3271 	 */
3272 	if (of_platform != PLATFORM_POWERMAC)
3273 		prom_instantiate_rtas();
3274 
3275 #ifdef CONFIG_PPC64
3276 	/* instantiate sml */
3277 	prom_instantiate_sml();
3278 #endif
3279 
3280 	/*
3281 	 * On non-powermacs, put all CPUs in spin-loops.
3282 	 *
3283 	 * PowerMacs use a different mechanism to spin CPUs
3284 	 *
3285 	 * (This must be done after instanciating RTAS)
3286 	 */
3287 	if (of_platform != PLATFORM_POWERMAC)
3288 		prom_hold_cpus();
3289 
3290 	/*
3291 	 * Fill in some infos for use by the kernel later on
3292 	 */
3293 	if (prom_memory_limit) {
3294 		__be64 val = cpu_to_be64(prom_memory_limit);
3295 		prom_setprop(prom.chosen, "/chosen", "linux,memory-limit",
3296 			     &val, sizeof(val));
3297 	}
3298 #ifdef CONFIG_PPC64
3299 	if (prom_iommu_off)
3300 		prom_setprop(prom.chosen, "/chosen", "linux,iommu-off",
3301 			     NULL, 0);
3302 
3303 	if (prom_iommu_force_on)
3304 		prom_setprop(prom.chosen, "/chosen", "linux,iommu-force-on",
3305 			     NULL, 0);
3306 
3307 	if (prom_tce_alloc_start) {
3308 		prom_setprop(prom.chosen, "/chosen", "linux,tce-alloc-start",
3309 			     &prom_tce_alloc_start,
3310 			     sizeof(prom_tce_alloc_start));
3311 		prom_setprop(prom.chosen, "/chosen", "linux,tce-alloc-end",
3312 			     &prom_tce_alloc_end,
3313 			     sizeof(prom_tce_alloc_end));
3314 	}
3315 #endif
3316 
3317 	/*
3318 	 * Fixup any known bugs in the device-tree
3319 	 */
3320 	fixup_device_tree();
3321 
3322 	/*
3323 	 * Now finally create the flattened device-tree
3324 	 */
3325 	prom_printf("copying OF device tree...\n");
3326 	flatten_device_tree();
3327 
3328 	/*
3329 	 * in case stdin is USB and still active on IBM machines...
3330 	 * Unfortunately quiesce crashes on some powermacs if we have
3331 	 * closed stdin already (in particular the powerbook 101).
3332 	 */
3333 	if (of_platform != PLATFORM_POWERMAC)
3334 		prom_close_stdin();
3335 
3336 	/*
3337 	 * Call OF "quiesce" method to shut down pending DMA's from
3338 	 * devices etc...
3339 	 */
3340 	prom_printf("Quiescing Open Firmware ...\n");
3341 	call_prom("quiesce", 0, 0);
3342 
3343 	/*
3344 	 * And finally, call the kernel passing it the flattened device
3345 	 * tree and NULL as r5, thus triggering the new entry point which
3346 	 * is common to us and kexec
3347 	 */
3348 	hdr = dt_header_start;
3349 
3350 	/* Don't print anything after quiesce under OPAL, it crashes OFW */
3351 	prom_printf("Booting Linux via __start() @ 0x%lx ...\n", kbase);
3352 	prom_debug("->dt_header_start=0x%lx\n", hdr);
3353 
3354 #ifdef CONFIG_PPC32
3355 	reloc_got2(-offset);
3356 #else
3357 	unreloc_toc();
3358 #endif
3359 
3360 	__start(hdr, kbase, 0, 0, 0, 0, 0);
3361 
3362 	return 0;
3363 }
3364