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