cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

prom_init.c (90745B)


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