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