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