xref: /linux/arch/powerpc/kernel/prom_init.c (revision 858259cf7d1c443c836a2022b78cb281f0a9b95e)
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/config.h>
20 #include <linux/kernel.h>
21 #include <linux/string.h>
22 #include <linux/init.h>
23 #include <linux/threads.h>
24 #include <linux/spinlock.h>
25 #include <linux/types.h>
26 #include <linux/pci.h>
27 #include <linux/proc_fs.h>
28 #include <linux/stringify.h>
29 #include <linux/delay.h>
30 #include <linux/initrd.h>
31 #include <linux/bitops.h>
32 #include <asm/prom.h>
33 #include <asm/rtas.h>
34 #include <asm/page.h>
35 #include <asm/processor.h>
36 #include <asm/irq.h>
37 #include <asm/io.h>
38 #include <asm/smp.h>
39 #include <asm/system.h>
40 #include <asm/mmu.h>
41 #include <asm/pgtable.h>
42 #include <asm/pci.h>
43 #include <asm/iommu.h>
44 #include <asm/btext.h>
45 #include <asm/sections.h>
46 #include <asm/machdep.h>
47 
48 #ifdef CONFIG_LOGO_LINUX_CLUT224
49 #include <linux/linux_logo.h>
50 extern const struct linux_logo logo_linux_clut224;
51 #endif
52 
53 /*
54  * Properties whose value is longer than this get excluded from our
55  * copy of the device tree. This value does need to be big enough to
56  * ensure that we don't lose things like the interrupt-map property
57  * on a PCI-PCI bridge.
58  */
59 #define MAX_PROPERTY_LENGTH	(1UL * 1024 * 1024)
60 
61 /*
62  * Eventually bump that one up
63  */
64 #define DEVTREE_CHUNK_SIZE	0x100000
65 
66 /*
67  * This is the size of the local memory reserve map that gets copied
68  * into the boot params passed to the kernel. That size is totally
69  * flexible as the kernel just reads the list until it encounters an
70  * entry with size 0, so it can be changed without breaking binary
71  * compatibility
72  */
73 #define MEM_RESERVE_MAP_SIZE	8
74 
75 /*
76  * prom_init() is called very early on, before the kernel text
77  * and data have been mapped to KERNELBASE.  At this point the code
78  * is running at whatever address it has been loaded at.
79  * On ppc32 we compile with -mrelocatable, which means that references
80  * to extern and static variables get relocated automatically.
81  * On ppc64 we have to relocate the references explicitly with
82  * RELOC.  (Note that strings count as static variables.)
83  *
84  * Because OF may have mapped I/O devices into the area starting at
85  * KERNELBASE, particularly on CHRP machines, we can't safely call
86  * OF once the kernel has been mapped to KERNELBASE.  Therefore all
87  * OF calls must be done within prom_init().
88  *
89  * ADDR is used in calls to call_prom.  The 4th and following
90  * arguments to call_prom should be 32-bit values.
91  * On ppc64, 64 bit values are truncated to 32 bits (and
92  * fortunately don't get interpreted as two arguments).
93  */
94 #ifdef CONFIG_PPC64
95 #define RELOC(x)        (*PTRRELOC(&(x)))
96 #define ADDR(x)		(u32) add_reloc_offset((unsigned long)(x))
97 #else
98 #define RELOC(x)	(x)
99 #define ADDR(x)		(u32) (x)
100 #endif
101 
102 #define PROM_BUG() do {						\
103         prom_printf("kernel BUG at %s line 0x%x!\n",		\
104 		    RELOC(__FILE__), __LINE__);			\
105         __asm__ __volatile__(".long " BUG_ILLEGAL_INSTR);	\
106 } while (0)
107 
108 #ifdef DEBUG_PROM
109 #define prom_debug(x...)	prom_printf(x)
110 #else
111 #define prom_debug(x...)
112 #endif
113 
114 #ifdef CONFIG_PPC32
115 #define PLATFORM_POWERMAC	_MACH_Pmac
116 #define PLATFORM_CHRP		_MACH_chrp
117 #endif
118 
119 
120 typedef u32 prom_arg_t;
121 
122 struct prom_args {
123         u32 service;
124         u32 nargs;
125         u32 nret;
126         prom_arg_t args[10];
127 };
128 
129 struct prom_t {
130 	ihandle root;
131 	ihandle chosen;
132 	int cpu;
133 	ihandle stdout;
134 	ihandle mmumap;
135 };
136 
137 struct mem_map_entry {
138 	unsigned long	base;
139 	unsigned long	size;
140 };
141 
142 typedef u32 cell_t;
143 
144 extern void __start(unsigned long r3, unsigned long r4, unsigned long r5);
145 
146 #ifdef CONFIG_PPC64
147 extern int enter_prom(struct prom_args *args, unsigned long entry);
148 #else
149 static inline int enter_prom(struct prom_args *args, unsigned long entry)
150 {
151 	return ((int (*)(struct prom_args *))entry)(args);
152 }
153 #endif
154 
155 extern void copy_and_flush(unsigned long dest, unsigned long src,
156 			   unsigned long size, unsigned long offset);
157 
158 /* prom structure */
159 static struct prom_t __initdata prom;
160 
161 static unsigned long prom_entry __initdata;
162 
163 #define PROM_SCRATCH_SIZE 256
164 
165 static char __initdata of_stdout_device[256];
166 static char __initdata prom_scratch[PROM_SCRATCH_SIZE];
167 
168 static unsigned long __initdata dt_header_start;
169 static unsigned long __initdata dt_struct_start, dt_struct_end;
170 static unsigned long __initdata dt_string_start, dt_string_end;
171 
172 static unsigned long __initdata prom_initrd_start, prom_initrd_end;
173 
174 #ifdef CONFIG_PPC64
175 static int __initdata iommu_force_on;
176 static int __initdata ppc64_iommu_off;
177 static unsigned long __initdata prom_tce_alloc_start;
178 static unsigned long __initdata prom_tce_alloc_end;
179 #endif
180 
181 static int __initdata of_platform;
182 
183 static char __initdata prom_cmd_line[COMMAND_LINE_SIZE];
184 
185 static unsigned long __initdata prom_memory_limit;
186 
187 static unsigned long __initdata alloc_top;
188 static unsigned long __initdata alloc_top_high;
189 static unsigned long __initdata alloc_bottom;
190 static unsigned long __initdata rmo_top;
191 static unsigned long __initdata ram_top;
192 
193 static struct mem_map_entry __initdata mem_reserve_map[MEM_RESERVE_MAP_SIZE];
194 static int __initdata mem_reserve_cnt;
195 
196 static cell_t __initdata regbuf[1024];
197 
198 
199 #define MAX_CPU_THREADS 2
200 
201 /* TO GO */
202 #ifdef CONFIG_HMT
203 struct {
204 	unsigned int pir;
205 	unsigned int threadid;
206 } hmt_thread_data[NR_CPUS];
207 #endif /* CONFIG_HMT */
208 
209 /*
210  * Error results ... some OF calls will return "-1" on error, some
211  * will return 0, some will return either. To simplify, here are
212  * macros to use with any ihandle or phandle return value to check if
213  * it is valid
214  */
215 
216 #define PROM_ERROR		(-1u)
217 #define PHANDLE_VALID(p)	((p) != 0 && (p) != PROM_ERROR)
218 #define IHANDLE_VALID(i)	((i) != 0 && (i) != PROM_ERROR)
219 
220 
221 /* This is the one and *ONLY* place where we actually call open
222  * firmware.
223  */
224 
225 static int __init call_prom(const char *service, int nargs, int nret, ...)
226 {
227 	int i;
228 	struct prom_args args;
229 	va_list list;
230 
231 	args.service = ADDR(service);
232 	args.nargs = nargs;
233 	args.nret = nret;
234 
235 	va_start(list, nret);
236 	for (i = 0; i < nargs; i++)
237 		args.args[i] = va_arg(list, prom_arg_t);
238 	va_end(list);
239 
240 	for (i = 0; i < nret; i++)
241 		args.args[nargs+i] = 0;
242 
243 	if (enter_prom(&args, RELOC(prom_entry)) < 0)
244 		return PROM_ERROR;
245 
246 	return (nret > 0) ? args.args[nargs] : 0;
247 }
248 
249 static int __init call_prom_ret(const char *service, int nargs, int nret,
250 				prom_arg_t *rets, ...)
251 {
252 	int i;
253 	struct prom_args args;
254 	va_list list;
255 
256 	args.service = ADDR(service);
257 	args.nargs = nargs;
258 	args.nret = nret;
259 
260 	va_start(list, rets);
261 	for (i = 0; i < nargs; i++)
262 		args.args[i] = va_arg(list, prom_arg_t);
263 	va_end(list);
264 
265 	for (i = 0; i < nret; i++)
266 		rets[nargs+i] = 0;
267 
268 	if (enter_prom(&args, RELOC(prom_entry)) < 0)
269 		return PROM_ERROR;
270 
271 	if (rets != NULL)
272 		for (i = 1; i < nret; ++i)
273 			rets[i-1] = args.args[nargs+i];
274 
275 	return (nret > 0) ? args.args[nargs] : 0;
276 }
277 
278 
279 static void __init prom_print(const char *msg)
280 {
281 	const char *p, *q;
282 	struct prom_t *_prom = &RELOC(prom);
283 
284 	if (_prom->stdout == 0)
285 		return;
286 
287 	for (p = msg; *p != 0; p = q) {
288 		for (q = p; *q != 0 && *q != '\n'; ++q)
289 			;
290 		if (q > p)
291 			call_prom("write", 3, 1, _prom->stdout, p, q - p);
292 		if (*q == 0)
293 			break;
294 		++q;
295 		call_prom("write", 3, 1, _prom->stdout, ADDR("\r\n"), 2);
296 	}
297 }
298 
299 
300 static void __init prom_print_hex(unsigned long val)
301 {
302 	int i, nibbles = sizeof(val)*2;
303 	char buf[sizeof(val)*2+1];
304 	struct prom_t *_prom = &RELOC(prom);
305 
306 	for (i = nibbles-1;  i >= 0;  i--) {
307 		buf[i] = (val & 0xf) + '0';
308 		if (buf[i] > '9')
309 			buf[i] += ('a'-'0'-10);
310 		val >>= 4;
311 	}
312 	buf[nibbles] = '\0';
313 	call_prom("write", 3, 1, _prom->stdout, buf, nibbles);
314 }
315 
316 
317 static void __init prom_printf(const char *format, ...)
318 {
319 	const char *p, *q, *s;
320 	va_list args;
321 	unsigned long v;
322 	struct prom_t *_prom = &RELOC(prom);
323 
324 	va_start(args, format);
325 #ifdef CONFIG_PPC64
326 	format = PTRRELOC(format);
327 #endif
328 	for (p = format; *p != 0; p = q) {
329 		for (q = p; *q != 0 && *q != '\n' && *q != '%'; ++q)
330 			;
331 		if (q > p)
332 			call_prom("write", 3, 1, _prom->stdout, p, q - p);
333 		if (*q == 0)
334 			break;
335 		if (*q == '\n') {
336 			++q;
337 			call_prom("write", 3, 1, _prom->stdout,
338 				  ADDR("\r\n"), 2);
339 			continue;
340 		}
341 		++q;
342 		if (*q == 0)
343 			break;
344 		switch (*q) {
345 		case 's':
346 			++q;
347 			s = va_arg(args, const char *);
348 			prom_print(s);
349 			break;
350 		case 'x':
351 			++q;
352 			v = va_arg(args, unsigned long);
353 			prom_print_hex(v);
354 			break;
355 		}
356 	}
357 }
358 
359 
360 static unsigned int __init prom_claim(unsigned long virt, unsigned long size,
361 				unsigned long align)
362 {
363 	int ret;
364 	struct prom_t *_prom = &RELOC(prom);
365 
366 	ret = call_prom("claim", 3, 1, (prom_arg_t)virt, (prom_arg_t)size,
367 			(prom_arg_t)align);
368 	if (ret != -1 && _prom->mmumap != 0)
369 		/* old pmacs need us to map as well */
370 		call_prom("call-method", 6, 1,
371 			  ADDR("map"), _prom->mmumap, 0, size, virt, virt);
372 	return ret;
373 }
374 
375 static void __init __attribute__((noreturn)) prom_panic(const char *reason)
376 {
377 #ifdef CONFIG_PPC64
378 	reason = PTRRELOC(reason);
379 #endif
380 	prom_print(reason);
381 	/* ToDo: should put up an SRC here on p/iSeries */
382 	call_prom("exit", 0, 0);
383 
384 	for (;;)			/* should never get here */
385 		;
386 }
387 
388 
389 static int __init prom_next_node(phandle *nodep)
390 {
391 	phandle node;
392 
393 	if ((node = *nodep) != 0
394 	    && (*nodep = call_prom("child", 1, 1, node)) != 0)
395 		return 1;
396 	if ((*nodep = call_prom("peer", 1, 1, node)) != 0)
397 		return 1;
398 	for (;;) {
399 		if ((node = call_prom("parent", 1, 1, node)) == 0)
400 			return 0;
401 		if ((*nodep = call_prom("peer", 1, 1, node)) != 0)
402 			return 1;
403 	}
404 }
405 
406 static int __init prom_getprop(phandle node, const char *pname,
407 			       void *value, size_t valuelen)
408 {
409 	return call_prom("getprop", 4, 1, node, ADDR(pname),
410 			 (u32)(unsigned long) value, (u32) valuelen);
411 }
412 
413 static int __init prom_getproplen(phandle node, const char *pname)
414 {
415 	return call_prom("getproplen", 2, 1, node, ADDR(pname));
416 }
417 
418 static int __init prom_setprop(phandle node, const char *pname,
419 			       void *value, size_t valuelen)
420 {
421 	return call_prom("setprop", 4, 1, node, ADDR(pname),
422 			 (u32)(unsigned long) value, (u32) valuelen);
423 }
424 
425 /* We can't use the standard versions because of RELOC headaches. */
426 #define isxdigit(c)	(('0' <= (c) && (c) <= '9') \
427 			 || ('a' <= (c) && (c) <= 'f') \
428 			 || ('A' <= (c) && (c) <= 'F'))
429 
430 #define isdigit(c)	('0' <= (c) && (c) <= '9')
431 #define islower(c)	('a' <= (c) && (c) <= 'z')
432 #define toupper(c)	(islower(c) ? ((c) - 'a' + 'A') : (c))
433 
434 unsigned long prom_strtoul(const char *cp, const char **endp)
435 {
436 	unsigned long result = 0, base = 10, value;
437 
438 	if (*cp == '0') {
439 		base = 8;
440 		cp++;
441 		if (toupper(*cp) == 'X') {
442 			cp++;
443 			base = 16;
444 		}
445 	}
446 
447 	while (isxdigit(*cp) &&
448 	       (value = isdigit(*cp) ? *cp - '0' : toupper(*cp) - 'A' + 10) < base) {
449 		result = result * base + value;
450 		cp++;
451 	}
452 
453 	if (endp)
454 		*endp = cp;
455 
456 	return result;
457 }
458 
459 unsigned long prom_memparse(const char *ptr, const char **retptr)
460 {
461 	unsigned long ret = prom_strtoul(ptr, retptr);
462 	int shift = 0;
463 
464 	/*
465 	 * We can't use a switch here because GCC *may* generate a
466 	 * jump table which won't work, because we're not running at
467 	 * the address we're linked at.
468 	 */
469 	if ('G' == **retptr || 'g' == **retptr)
470 		shift = 30;
471 
472 	if ('M' == **retptr || 'm' == **retptr)
473 		shift = 20;
474 
475 	if ('K' == **retptr || 'k' == **retptr)
476 		shift = 10;
477 
478 	if (shift) {
479 		ret <<= shift;
480 		(*retptr)++;
481 	}
482 
483 	return ret;
484 }
485 
486 /*
487  * Early parsing of the command line passed to the kernel, used for
488  * "mem=x" and the options that affect the iommu
489  */
490 static void __init early_cmdline_parse(void)
491 {
492 	struct prom_t *_prom = &RELOC(prom);
493 	char *opt, *p;
494 	int l = 0;
495 
496 	RELOC(prom_cmd_line[0]) = 0;
497 	p = RELOC(prom_cmd_line);
498 	if ((long)_prom->chosen > 0)
499 		l = prom_getprop(_prom->chosen, "bootargs", p, COMMAND_LINE_SIZE-1);
500 #ifdef CONFIG_CMDLINE
501 	if (l == 0) /* dbl check */
502 		strlcpy(RELOC(prom_cmd_line),
503 			RELOC(CONFIG_CMDLINE), sizeof(prom_cmd_line));
504 #endif /* CONFIG_CMDLINE */
505 	prom_printf("command line: %s\n", RELOC(prom_cmd_line));
506 
507 #ifdef CONFIG_PPC64
508 	opt = strstr(RELOC(prom_cmd_line), RELOC("iommu="));
509 	if (opt) {
510 		prom_printf("iommu opt is: %s\n", opt);
511 		opt += 6;
512 		while (*opt && *opt == ' ')
513 			opt++;
514 		if (!strncmp(opt, RELOC("off"), 3))
515 			RELOC(ppc64_iommu_off) = 1;
516 		else if (!strncmp(opt, RELOC("force"), 5))
517 			RELOC(iommu_force_on) = 1;
518 	}
519 #endif
520 
521 	opt = strstr(RELOC(prom_cmd_line), RELOC("mem="));
522 	if (opt) {
523 		opt += 4;
524 		RELOC(prom_memory_limit) = prom_memparse(opt, (const char **)&opt);
525 #ifdef CONFIG_PPC64
526 		/* Align to 16 MB == size of ppc64 large page */
527 		RELOC(prom_memory_limit) = ALIGN(RELOC(prom_memory_limit), 0x1000000);
528 #endif
529 	}
530 }
531 
532 #ifdef CONFIG_PPC_PSERIES
533 /*
534  * To tell the firmware what our capabilities are, we have to pass
535  * it a fake 32-bit ELF header containing a couple of PT_NOTE sections
536  * that contain structures that contain the actual values.
537  */
538 static struct fake_elf {
539 	Elf32_Ehdr	elfhdr;
540 	Elf32_Phdr	phdr[2];
541 	struct chrpnote {
542 		u32	namesz;
543 		u32	descsz;
544 		u32	type;
545 		char	name[8];	/* "PowerPC" */
546 		struct chrpdesc {
547 			u32	real_mode;
548 			u32	real_base;
549 			u32	real_size;
550 			u32	virt_base;
551 			u32	virt_size;
552 			u32	load_base;
553 		} chrpdesc;
554 	} chrpnote;
555 	struct rpanote {
556 		u32	namesz;
557 		u32	descsz;
558 		u32	type;
559 		char	name[24];	/* "IBM,RPA-Client-Config" */
560 		struct rpadesc {
561 			u32	lpar_affinity;
562 			u32	min_rmo_size;
563 			u32	min_rmo_percent;
564 			u32	max_pft_size;
565 			u32	splpar;
566 			u32	min_load;
567 			u32	new_mem_def;
568 			u32	ignore_me;
569 		} rpadesc;
570 	} rpanote;
571 } fake_elf = {
572 	.elfhdr = {
573 		.e_ident = { 0x7f, 'E', 'L', 'F',
574 			     ELFCLASS32, ELFDATA2MSB, EV_CURRENT },
575 		.e_type = ET_EXEC,	/* yeah right */
576 		.e_machine = EM_PPC,
577 		.e_version = EV_CURRENT,
578 		.e_phoff = offsetof(struct fake_elf, phdr),
579 		.e_phentsize = sizeof(Elf32_Phdr),
580 		.e_phnum = 2
581 	},
582 	.phdr = {
583 		[0] = {
584 			.p_type = PT_NOTE,
585 			.p_offset = offsetof(struct fake_elf, chrpnote),
586 			.p_filesz = sizeof(struct chrpnote)
587 		}, [1] = {
588 			.p_type = PT_NOTE,
589 			.p_offset = offsetof(struct fake_elf, rpanote),
590 			.p_filesz = sizeof(struct rpanote)
591 		}
592 	},
593 	.chrpnote = {
594 		.namesz = sizeof("PowerPC"),
595 		.descsz = sizeof(struct chrpdesc),
596 		.type = 0x1275,
597 		.name = "PowerPC",
598 		.chrpdesc = {
599 			.real_mode = ~0U,	/* ~0 means "don't care" */
600 			.real_base = ~0U,
601 			.real_size = ~0U,
602 			.virt_base = ~0U,
603 			.virt_size = ~0U,
604 			.load_base = ~0U
605 		},
606 	},
607 	.rpanote = {
608 		.namesz = sizeof("IBM,RPA-Client-Config"),
609 		.descsz = sizeof(struct rpadesc),
610 		.type = 0x12759999,
611 		.name = "IBM,RPA-Client-Config",
612 		.rpadesc = {
613 			.lpar_affinity = 0,
614 			.min_rmo_size = 64,	/* in megabytes */
615 			.min_rmo_percent = 0,
616 			.max_pft_size = 48,	/* 2^48 bytes max PFT size */
617 			.splpar = 1,
618 			.min_load = ~0U,
619 			.new_mem_def = 0
620 		}
621 	}
622 };
623 
624 static void __init prom_send_capabilities(void)
625 {
626 	ihandle elfloader;
627 
628 	elfloader = call_prom("open", 1, 1, ADDR("/packages/elf-loader"));
629 	if (elfloader == 0) {
630 		prom_printf("couldn't open /packages/elf-loader\n");
631 		return;
632 	}
633 	call_prom("call-method", 3, 1, ADDR("process-elf-header"),
634 			elfloader, ADDR(&fake_elf));
635 	call_prom("close", 1, 0, elfloader);
636 }
637 #endif
638 
639 /*
640  * Memory allocation strategy... our layout is normally:
641  *
642  *  at 14Mb or more we have vmlinux, then a gap and initrd.  In some
643  *  rare cases, initrd might end up being before the kernel though.
644  *  We assume this won't override the final kernel at 0, we have no
645  *  provision to handle that in this version, but it should hopefully
646  *  never happen.
647  *
648  *  alloc_top is set to the top of RMO, eventually shrink down if the
649  *  TCEs overlap
650  *
651  *  alloc_bottom is set to the top of kernel/initrd
652  *
653  *  from there, allocations are done this way : rtas is allocated
654  *  topmost, and the device-tree is allocated from the bottom. We try
655  *  to grow the device-tree allocation as we progress. If we can't,
656  *  then we fail, we don't currently have a facility to restart
657  *  elsewhere, but that shouldn't be necessary.
658  *
659  *  Note that calls to reserve_mem have to be done explicitly, memory
660  *  allocated with either alloc_up or alloc_down isn't automatically
661  *  reserved.
662  */
663 
664 
665 /*
666  * Allocates memory in the RMO upward from the kernel/initrd
667  *
668  * When align is 0, this is a special case, it means to allocate in place
669  * at the current location of alloc_bottom or fail (that is basically
670  * extending the previous allocation). Used for the device-tree flattening
671  */
672 static unsigned long __init alloc_up(unsigned long size, unsigned long align)
673 {
674 	unsigned long base = RELOC(alloc_bottom);
675 	unsigned long addr = 0;
676 
677 	if (align)
678 		base = _ALIGN_UP(base, align);
679 	prom_debug("alloc_up(%x, %x)\n", size, align);
680 	if (RELOC(ram_top) == 0)
681 		prom_panic("alloc_up() called with mem not initialized\n");
682 
683 	if (align)
684 		base = _ALIGN_UP(RELOC(alloc_bottom), align);
685 	else
686 		base = RELOC(alloc_bottom);
687 
688 	for(; (base + size) <= RELOC(alloc_top);
689 	    base = _ALIGN_UP(base + 0x100000, align)) {
690 		prom_debug("    trying: 0x%x\n\r", base);
691 		addr = (unsigned long)prom_claim(base, size, 0);
692 		if (addr != PROM_ERROR && addr != 0)
693 			break;
694 		addr = 0;
695 		if (align == 0)
696 			break;
697 	}
698 	if (addr == 0)
699 		return 0;
700 	RELOC(alloc_bottom) = addr;
701 
702 	prom_debug(" -> %x\n", addr);
703 	prom_debug("  alloc_bottom : %x\n", RELOC(alloc_bottom));
704 	prom_debug("  alloc_top    : %x\n", RELOC(alloc_top));
705 	prom_debug("  alloc_top_hi : %x\n", RELOC(alloc_top_high));
706 	prom_debug("  rmo_top      : %x\n", RELOC(rmo_top));
707 	prom_debug("  ram_top      : %x\n", RELOC(ram_top));
708 
709 	return addr;
710 }
711 
712 /*
713  * Allocates memory downward, either from top of RMO, or if highmem
714  * is set, from the top of RAM.  Note that this one doesn't handle
715  * failures.  It does claim memory if highmem is not set.
716  */
717 static unsigned long __init alloc_down(unsigned long size, unsigned long align,
718 				       int highmem)
719 {
720 	unsigned long base, addr = 0;
721 
722 	prom_debug("alloc_down(%x, %x, %s)\n", size, align,
723 		   highmem ? RELOC("(high)") : RELOC("(low)"));
724 	if (RELOC(ram_top) == 0)
725 		prom_panic("alloc_down() called with mem not initialized\n");
726 
727 	if (highmem) {
728 		/* Carve out storage for the TCE table. */
729 		addr = _ALIGN_DOWN(RELOC(alloc_top_high) - size, align);
730 		if (addr <= RELOC(alloc_bottom))
731 			return 0;
732 		/* Will we bump into the RMO ? If yes, check out that we
733 		 * didn't overlap existing allocations there, if we did,
734 		 * we are dead, we must be the first in town !
735 		 */
736 		if (addr < RELOC(rmo_top)) {
737 			/* Good, we are first */
738 			if (RELOC(alloc_top) == RELOC(rmo_top))
739 				RELOC(alloc_top) = RELOC(rmo_top) = addr;
740 			else
741 				return 0;
742 		}
743 		RELOC(alloc_top_high) = addr;
744 		goto bail;
745 	}
746 
747 	base = _ALIGN_DOWN(RELOC(alloc_top) - size, align);
748 	for (; base > RELOC(alloc_bottom);
749 	     base = _ALIGN_DOWN(base - 0x100000, align))  {
750 		prom_debug("    trying: 0x%x\n\r", base);
751 		addr = (unsigned long)prom_claim(base, size, 0);
752 		if (addr != PROM_ERROR && addr != 0)
753 			break;
754 		addr = 0;
755 	}
756 	if (addr == 0)
757 		return 0;
758 	RELOC(alloc_top) = addr;
759 
760  bail:
761 	prom_debug(" -> %x\n", addr);
762 	prom_debug("  alloc_bottom : %x\n", RELOC(alloc_bottom));
763 	prom_debug("  alloc_top    : %x\n", RELOC(alloc_top));
764 	prom_debug("  alloc_top_hi : %x\n", RELOC(alloc_top_high));
765 	prom_debug("  rmo_top      : %x\n", RELOC(rmo_top));
766 	prom_debug("  ram_top      : %x\n", RELOC(ram_top));
767 
768 	return addr;
769 }
770 
771 /*
772  * Parse a "reg" cell
773  */
774 static unsigned long __init prom_next_cell(int s, cell_t **cellp)
775 {
776 	cell_t *p = *cellp;
777 	unsigned long r = 0;
778 
779 	/* Ignore more than 2 cells */
780 	while (s > sizeof(unsigned long) / 4) {
781 		p++;
782 		s--;
783 	}
784 	r = *p++;
785 #ifdef CONFIG_PPC64
786 	if (s > 1) {
787 		r <<= 32;
788 		r |= *(p++);
789 	}
790 #endif
791 	*cellp = p;
792 	return r;
793 }
794 
795 /*
796  * Very dumb function for adding to the memory reserve list, but
797  * we don't need anything smarter at this point
798  *
799  * XXX Eventually check for collisions.  They should NEVER happen.
800  * If problems seem to show up, it would be a good start to track
801  * them down.
802  */
803 static void reserve_mem(unsigned long base, unsigned long size)
804 {
805 	unsigned long top = base + size;
806 	unsigned long cnt = RELOC(mem_reserve_cnt);
807 
808 	if (size == 0)
809 		return;
810 
811 	/* We need to always keep one empty entry so that we
812 	 * have our terminator with "size" set to 0 since we are
813 	 * dumb and just copy this entire array to the boot params
814 	 */
815 	base = _ALIGN_DOWN(base, PAGE_SIZE);
816 	top = _ALIGN_UP(top, PAGE_SIZE);
817 	size = top - base;
818 
819 	if (cnt >= (MEM_RESERVE_MAP_SIZE - 1))
820 		prom_panic("Memory reserve map exhausted !\n");
821 	RELOC(mem_reserve_map)[cnt].base = base;
822 	RELOC(mem_reserve_map)[cnt].size = size;
823 	RELOC(mem_reserve_cnt) = cnt + 1;
824 }
825 
826 /*
827  * Initialize memory allocation mecanism, parse "memory" nodes and
828  * obtain that way the top of memory and RMO to setup out local allocator
829  */
830 static void __init prom_init_mem(void)
831 {
832 	phandle node;
833 	char *path, type[64];
834 	unsigned int plen;
835 	cell_t *p, *endp;
836 	struct prom_t *_prom = &RELOC(prom);
837 	u32 rac, rsc;
838 
839 	/*
840 	 * We iterate the memory nodes to find
841 	 * 1) top of RMO (first node)
842 	 * 2) top of memory
843 	 */
844 	rac = 2;
845 	prom_getprop(_prom->root, "#address-cells", &rac, sizeof(rac));
846 	rsc = 1;
847 	prom_getprop(_prom->root, "#size-cells", &rsc, sizeof(rsc));
848 	prom_debug("root_addr_cells: %x\n", (unsigned long) rac);
849 	prom_debug("root_size_cells: %x\n", (unsigned long) rsc);
850 
851 	prom_debug("scanning memory:\n");
852 	path = RELOC(prom_scratch);
853 
854 	for (node = 0; prom_next_node(&node); ) {
855 		type[0] = 0;
856 		prom_getprop(node, "device_type", type, sizeof(type));
857 
858 		if (type[0] == 0) {
859 			/*
860 			 * CHRP Longtrail machines have no device_type
861 			 * on the memory node, so check the name instead...
862 			 */
863 			prom_getprop(node, "name", type, sizeof(type));
864 		}
865 		if (strcmp(type, RELOC("memory")))
866 			continue;
867 
868 		plen = prom_getprop(node, "reg", RELOC(regbuf), sizeof(regbuf));
869 		if (plen > sizeof(regbuf)) {
870 			prom_printf("memory node too large for buffer !\n");
871 			plen = sizeof(regbuf);
872 		}
873 		p = RELOC(regbuf);
874 		endp = p + (plen / sizeof(cell_t));
875 
876 #ifdef DEBUG_PROM
877 		memset(path, 0, PROM_SCRATCH_SIZE);
878 		call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1);
879 		prom_debug("  node %s :\n", path);
880 #endif /* DEBUG_PROM */
881 
882 		while ((endp - p) >= (rac + rsc)) {
883 			unsigned long base, size;
884 
885 			base = prom_next_cell(rac, &p);
886 			size = prom_next_cell(rsc, &p);
887 
888 			if (size == 0)
889 				continue;
890 			prom_debug("    %x %x\n", base, size);
891 			if (base == 0)
892 				RELOC(rmo_top) = size;
893 			if ((base + size) > RELOC(ram_top))
894 				RELOC(ram_top) = base + size;
895 		}
896 	}
897 
898 	RELOC(alloc_bottom) = PAGE_ALIGN((unsigned long)&RELOC(_end) + 0x4000);
899 
900 	/* Check if we have an initrd after the kernel, if we do move our bottom
901 	 * point to after it
902 	 */
903 	if (RELOC(prom_initrd_start)) {
904 		if (RELOC(prom_initrd_end) > RELOC(alloc_bottom))
905 			RELOC(alloc_bottom) = PAGE_ALIGN(RELOC(prom_initrd_end));
906 	}
907 
908 	/*
909 	 * If prom_memory_limit is set we reduce the upper limits *except* for
910 	 * alloc_top_high. This must be the real top of RAM so we can put
911 	 * TCE's up there.
912 	 */
913 
914 	RELOC(alloc_top_high) = RELOC(ram_top);
915 
916 	if (RELOC(prom_memory_limit)) {
917 		if (RELOC(prom_memory_limit) <= RELOC(alloc_bottom)) {
918 			prom_printf("Ignoring mem=%x <= alloc_bottom.\n",
919 				RELOC(prom_memory_limit));
920 			RELOC(prom_memory_limit) = 0;
921 		} else if (RELOC(prom_memory_limit) >= RELOC(ram_top)) {
922 			prom_printf("Ignoring mem=%x >= ram_top.\n",
923 				RELOC(prom_memory_limit));
924 			RELOC(prom_memory_limit) = 0;
925 		} else {
926 			RELOC(ram_top) = RELOC(prom_memory_limit);
927 			RELOC(rmo_top) = min(RELOC(rmo_top), RELOC(prom_memory_limit));
928 		}
929 	}
930 
931 	/*
932 	 * Setup our top alloc point, that is top of RMO or top of
933 	 * segment 0 when running non-LPAR.
934 	 * Some RS64 machines have buggy firmware where claims up at
935 	 * 1GB fail.  Cap at 768MB as a workaround.
936 	 * Since 768MB is plenty of room, and we need to cap to something
937 	 * reasonable on 32-bit, cap at 768MB on all machines.
938 	 */
939 	if (!RELOC(rmo_top))
940 		RELOC(rmo_top) = RELOC(ram_top);
941 	RELOC(rmo_top) = min(0x30000000ul, RELOC(rmo_top));
942 	RELOC(alloc_top) = RELOC(rmo_top);
943 
944 	prom_printf("memory layout at init:\n");
945 	prom_printf("  memory_limit : %x (16 MB aligned)\n", RELOC(prom_memory_limit));
946 	prom_printf("  alloc_bottom : %x\n", RELOC(alloc_bottom));
947 	prom_printf("  alloc_top    : %x\n", RELOC(alloc_top));
948 	prom_printf("  alloc_top_hi : %x\n", RELOC(alloc_top_high));
949 	prom_printf("  rmo_top      : %x\n", RELOC(rmo_top));
950 	prom_printf("  ram_top      : %x\n", RELOC(ram_top));
951 }
952 
953 
954 /*
955  * Allocate room for and instantiate RTAS
956  */
957 static void __init prom_instantiate_rtas(void)
958 {
959 	phandle rtas_node;
960 	ihandle rtas_inst;
961 	u32 base, entry = 0;
962 	u32 size = 0;
963 
964 	prom_debug("prom_instantiate_rtas: start...\n");
965 
966 	rtas_node = call_prom("finddevice", 1, 1, ADDR("/rtas"));
967 	prom_debug("rtas_node: %x\n", rtas_node);
968 	if (!PHANDLE_VALID(rtas_node))
969 		return;
970 
971 	prom_getprop(rtas_node, "rtas-size", &size, sizeof(size));
972 	if (size == 0)
973 		return;
974 
975 	base = alloc_down(size, PAGE_SIZE, 0);
976 	if (base == 0) {
977 		prom_printf("RTAS allocation failed !\n");
978 		return;
979 	}
980 
981 	rtas_inst = call_prom("open", 1, 1, ADDR("/rtas"));
982 	if (!IHANDLE_VALID(rtas_inst)) {
983 		prom_printf("opening rtas package failed");
984 		return;
985 	}
986 
987 	prom_printf("instantiating rtas at 0x%x ...", base);
988 
989 	if (call_prom_ret("call-method", 3, 2, &entry,
990 			  ADDR("instantiate-rtas"),
991 			  rtas_inst, base) == PROM_ERROR
992 	    || entry == 0) {
993 		prom_printf(" failed\n");
994 		return;
995 	}
996 	prom_printf(" done\n");
997 
998 	reserve_mem(base, size);
999 
1000 	prom_setprop(rtas_node, "linux,rtas-base", &base, sizeof(base));
1001 	prom_setprop(rtas_node, "linux,rtas-entry", &entry, sizeof(entry));
1002 
1003 	prom_debug("rtas base     = 0x%x\n", base);
1004 	prom_debug("rtas entry    = 0x%x\n", entry);
1005 	prom_debug("rtas size     = 0x%x\n", (long)size);
1006 
1007 	prom_debug("prom_instantiate_rtas: end...\n");
1008 }
1009 
1010 #ifdef CONFIG_PPC64
1011 /*
1012  * Allocate room for and initialize TCE tables
1013  */
1014 static void __init prom_initialize_tce_table(void)
1015 {
1016 	phandle node;
1017 	ihandle phb_node;
1018 	char compatible[64], type[64], model[64];
1019 	char *path = RELOC(prom_scratch);
1020 	u64 base, align;
1021 	u32 minalign, minsize;
1022 	u64 tce_entry, *tce_entryp;
1023 	u64 local_alloc_top, local_alloc_bottom;
1024 	u64 i;
1025 
1026 	if (RELOC(ppc64_iommu_off))
1027 		return;
1028 
1029 	prom_debug("starting prom_initialize_tce_table\n");
1030 
1031 	/* Cache current top of allocs so we reserve a single block */
1032 	local_alloc_top = RELOC(alloc_top_high);
1033 	local_alloc_bottom = local_alloc_top;
1034 
1035 	/* Search all nodes looking for PHBs. */
1036 	for (node = 0; prom_next_node(&node); ) {
1037 		compatible[0] = 0;
1038 		type[0] = 0;
1039 		model[0] = 0;
1040 		prom_getprop(node, "compatible",
1041 			     compatible, sizeof(compatible));
1042 		prom_getprop(node, "device_type", type, sizeof(type));
1043 		prom_getprop(node, "model", model, sizeof(model));
1044 
1045 		if ((type[0] == 0) || (strstr(type, RELOC("pci")) == NULL))
1046 			continue;
1047 
1048 		/* Keep the old logic in tack to avoid regression. */
1049 		if (compatible[0] != 0) {
1050 			if ((strstr(compatible, RELOC("python")) == NULL) &&
1051 			    (strstr(compatible, RELOC("Speedwagon")) == NULL) &&
1052 			    (strstr(compatible, RELOC("Winnipeg")) == NULL))
1053 				continue;
1054 		} else if (model[0] != 0) {
1055 			if ((strstr(model, RELOC("ython")) == NULL) &&
1056 			    (strstr(model, RELOC("peedwagon")) == NULL) &&
1057 			    (strstr(model, RELOC("innipeg")) == NULL))
1058 				continue;
1059 		}
1060 
1061 		if (prom_getprop(node, "tce-table-minalign", &minalign,
1062 				 sizeof(minalign)) == PROM_ERROR)
1063 			minalign = 0;
1064 		if (prom_getprop(node, "tce-table-minsize", &minsize,
1065 				 sizeof(minsize)) == PROM_ERROR)
1066 			minsize = 4UL << 20;
1067 
1068 		/*
1069 		 * Even though we read what OF wants, we just set the table
1070 		 * size to 4 MB.  This is enough to map 2GB of PCI DMA space.
1071 		 * By doing this, we avoid the pitfalls of trying to DMA to
1072 		 * MMIO space and the DMA alias hole.
1073 		 *
1074 		 * On POWER4, firmware sets the TCE region by assuming
1075 		 * each TCE table is 8MB. Using this memory for anything
1076 		 * else will impact performance, so we always allocate 8MB.
1077 		 * Anton
1078 		 */
1079 		if (__is_processor(PV_POWER4) || __is_processor(PV_POWER4p))
1080 			minsize = 8UL << 20;
1081 		else
1082 			minsize = 4UL << 20;
1083 
1084 		/* Align to the greater of the align or size */
1085 		align = max(minalign, minsize);
1086 		base = alloc_down(minsize, align, 1);
1087 		if (base == 0)
1088 			prom_panic("ERROR, cannot find space for TCE table.\n");
1089 		if (base < local_alloc_bottom)
1090 			local_alloc_bottom = base;
1091 
1092 		/* Save away the TCE table attributes for later use. */
1093 		prom_setprop(node, "linux,tce-base", &base, sizeof(base));
1094 		prom_setprop(node, "linux,tce-size", &minsize, sizeof(minsize));
1095 
1096 		/* It seems OF doesn't null-terminate the path :-( */
1097 		memset(path, 0, sizeof(path));
1098 		/* Call OF to setup the TCE hardware */
1099 		if (call_prom("package-to-path", 3, 1, node,
1100 			      path, PROM_SCRATCH_SIZE-1) == PROM_ERROR) {
1101 			prom_printf("package-to-path failed\n");
1102 		}
1103 
1104 		prom_debug("TCE table: %s\n", path);
1105 		prom_debug("\tnode = 0x%x\n", node);
1106 		prom_debug("\tbase = 0x%x\n", base);
1107 		prom_debug("\tsize = 0x%x\n", minsize);
1108 
1109 		/* Initialize the table to have a one-to-one mapping
1110 		 * over the allocated size.
1111 		 */
1112 		tce_entryp = (unsigned long *)base;
1113 		for (i = 0; i < (minsize >> 3) ;tce_entryp++, i++) {
1114 			tce_entry = (i << PAGE_SHIFT);
1115 			tce_entry |= 0x3;
1116 			*tce_entryp = tce_entry;
1117 		}
1118 
1119 		prom_printf("opening PHB %s", path);
1120 		phb_node = call_prom("open", 1, 1, path);
1121 		if (phb_node == 0)
1122 			prom_printf("... failed\n");
1123 		else
1124 			prom_printf("... done\n");
1125 
1126 		call_prom("call-method", 6, 0, ADDR("set-64-bit-addressing"),
1127 			  phb_node, -1, minsize,
1128 			  (u32) base, (u32) (base >> 32));
1129 		call_prom("close", 1, 0, phb_node);
1130 	}
1131 
1132 	reserve_mem(local_alloc_bottom, local_alloc_top - local_alloc_bottom);
1133 
1134 	if (RELOC(prom_memory_limit)) {
1135 		/*
1136 		 * We align the start to a 16MB boundary so we can map
1137 		 * the TCE area using large pages if possible.
1138 		 * The end should be the top of RAM so no need to align it.
1139 		 */
1140 		RELOC(prom_tce_alloc_start) = _ALIGN_DOWN(local_alloc_bottom,
1141 							  0x1000000);
1142 		RELOC(prom_tce_alloc_end) = local_alloc_top;
1143 	}
1144 
1145 	/* Flag the first invalid entry */
1146 	prom_debug("ending prom_initialize_tce_table\n");
1147 }
1148 #endif
1149 
1150 /*
1151  * With CHRP SMP we need to use the OF to start the other processors.
1152  * We can't wait until smp_boot_cpus (the OF is trashed by then)
1153  * so we have to put the processors into a holding pattern controlled
1154  * by the kernel (not OF) before we destroy the OF.
1155  *
1156  * This uses a chunk of low memory, puts some holding pattern
1157  * code there and sends the other processors off to there until
1158  * smp_boot_cpus tells them to do something.  The holding pattern
1159  * checks that address until its cpu # is there, when it is that
1160  * cpu jumps to __secondary_start().  smp_boot_cpus() takes care
1161  * of setting those values.
1162  *
1163  * We also use physical address 0x4 here to tell when a cpu
1164  * is in its holding pattern code.
1165  *
1166  * -- Cort
1167  */
1168 extern void __secondary_hold(void);
1169 extern unsigned long __secondary_hold_spinloop;
1170 extern unsigned long __secondary_hold_acknowledge;
1171 
1172 /*
1173  * We want to reference the copy of __secondary_hold_* in the
1174  * 0 - 0x100 address range
1175  */
1176 #define LOW_ADDR(x)	(((unsigned long) &(x)) & 0xff)
1177 
1178 static void __init prom_hold_cpus(void)
1179 {
1180 	unsigned long i;
1181 	unsigned int reg;
1182 	phandle node;
1183 	char type[64];
1184 	int cpuid = 0;
1185 	unsigned int interrupt_server[MAX_CPU_THREADS];
1186 	unsigned int cpu_threads, hw_cpu_num;
1187 	int propsize;
1188 	struct prom_t *_prom = &RELOC(prom);
1189 	unsigned long *spinloop
1190 		= (void *) LOW_ADDR(__secondary_hold_spinloop);
1191 	unsigned long *acknowledge
1192 		= (void *) LOW_ADDR(__secondary_hold_acknowledge);
1193 #ifdef CONFIG_PPC64
1194 	/* __secondary_hold is actually a descriptor, not the text address */
1195 	unsigned long secondary_hold
1196 		= __pa(*PTRRELOC((unsigned long *)__secondary_hold));
1197 #else
1198 	unsigned long secondary_hold = LOW_ADDR(__secondary_hold);
1199 #endif
1200 
1201 	prom_debug("prom_hold_cpus: start...\n");
1202 	prom_debug("    1) spinloop       = 0x%x\n", (unsigned long)spinloop);
1203 	prom_debug("    1) *spinloop      = 0x%x\n", *spinloop);
1204 	prom_debug("    1) acknowledge    = 0x%x\n",
1205 		   (unsigned long)acknowledge);
1206 	prom_debug("    1) *acknowledge   = 0x%x\n", *acknowledge);
1207 	prom_debug("    1) secondary_hold = 0x%x\n", secondary_hold);
1208 
1209 	/* Set the common spinloop variable, so all of the secondary cpus
1210 	 * will block when they are awakened from their OF spinloop.
1211 	 * This must occur for both SMP and non SMP kernels, since OF will
1212 	 * be trashed when we move the kernel.
1213 	 */
1214 	*spinloop = 0;
1215 
1216 #ifdef CONFIG_HMT
1217 	for (i = 0; i < NR_CPUS; i++)
1218 		RELOC(hmt_thread_data)[i].pir = 0xdeadbeef;
1219 #endif
1220 	/* look for cpus */
1221 	for (node = 0; prom_next_node(&node); ) {
1222 		type[0] = 0;
1223 		prom_getprop(node, "device_type", type, sizeof(type));
1224 		if (strcmp(type, RELOC("cpu")) != 0)
1225 			continue;
1226 
1227 		/* Skip non-configured cpus. */
1228 		if (prom_getprop(node, "status", type, sizeof(type)) > 0)
1229 			if (strcmp(type, RELOC("okay")) != 0)
1230 				continue;
1231 
1232 		reg = -1;
1233 		prom_getprop(node, "reg", &reg, sizeof(reg));
1234 
1235 		prom_debug("\ncpuid        = 0x%x\n", cpuid);
1236 		prom_debug("cpu hw idx   = 0x%x\n", reg);
1237 
1238 		/* Init the acknowledge var which will be reset by
1239 		 * the secondary cpu when it awakens from its OF
1240 		 * spinloop.
1241 		 */
1242 		*acknowledge = (unsigned long)-1;
1243 
1244 		propsize = prom_getprop(node, "ibm,ppc-interrupt-server#s",
1245 					&interrupt_server,
1246 					sizeof(interrupt_server));
1247 		if (propsize < 0) {
1248 			/* no property.  old hardware has no SMT */
1249 			cpu_threads = 1;
1250 			interrupt_server[0] = reg; /* fake it with phys id */
1251 		} else {
1252 			/* We have a threaded processor */
1253 			cpu_threads = propsize / sizeof(u32);
1254 			if (cpu_threads > MAX_CPU_THREADS) {
1255 				prom_printf("SMT: too many threads!\n"
1256 					    "SMT: found %x, max is %x\n",
1257 					    cpu_threads, MAX_CPU_THREADS);
1258 				cpu_threads = 1; /* ToDo: panic? */
1259 			}
1260 		}
1261 
1262 		hw_cpu_num = interrupt_server[0];
1263 		if (hw_cpu_num != _prom->cpu) {
1264 			/* Primary Thread of non-boot cpu */
1265 			prom_printf("%x : starting cpu hw idx %x... ", cpuid, reg);
1266 			call_prom("start-cpu", 3, 0, node,
1267 				  secondary_hold, reg);
1268 
1269 			for (i = 0; (i < 100000000) &&
1270 			     (*acknowledge == ((unsigned long)-1)); i++ )
1271 				mb();
1272 
1273 			if (*acknowledge == reg)
1274 				prom_printf("done\n");
1275 			else
1276 				prom_printf("failed: %x\n", *acknowledge);
1277 		}
1278 #ifdef CONFIG_SMP
1279 		else
1280 			prom_printf("%x : boot cpu     %x\n", cpuid, reg);
1281 #endif /* CONFIG_SMP */
1282 
1283 		/* Reserve cpu #s for secondary threads.   They start later. */
1284 		cpuid += cpu_threads;
1285 	}
1286 #ifdef CONFIG_HMT
1287 	/* Only enable HMT on processors that provide support. */
1288 	if (__is_processor(PV_PULSAR) ||
1289 	    __is_processor(PV_ICESTAR) ||
1290 	    __is_processor(PV_SSTAR)) {
1291 		prom_printf("    starting secondary threads\n");
1292 
1293 		for (i = 0; i < NR_CPUS; i += 2) {
1294 			if (!cpu_online(i))
1295 				continue;
1296 
1297 			if (i == 0) {
1298 				unsigned long pir = mfspr(SPRN_PIR);
1299 				if (__is_processor(PV_PULSAR)) {
1300 					RELOC(hmt_thread_data)[i].pir =
1301 						pir & 0x1f;
1302 				} else {
1303 					RELOC(hmt_thread_data)[i].pir =
1304 						pir & 0x3ff;
1305 				}
1306 			}
1307 		}
1308 	} else {
1309 		prom_printf("Processor is not HMT capable\n");
1310 	}
1311 #endif
1312 
1313 	if (cpuid > NR_CPUS)
1314 		prom_printf("WARNING: maximum CPUs (" __stringify(NR_CPUS)
1315 			    ") exceeded: ignoring extras\n");
1316 
1317 	prom_debug("prom_hold_cpus: end...\n");
1318 }
1319 
1320 
1321 static void __init prom_init_client_services(unsigned long pp)
1322 {
1323 	struct prom_t *_prom = &RELOC(prom);
1324 
1325 	/* Get a handle to the prom entry point before anything else */
1326 	RELOC(prom_entry) = pp;
1327 
1328 	/* get a handle for the stdout device */
1329 	_prom->chosen = call_prom("finddevice", 1, 1, ADDR("/chosen"));
1330 	if (!PHANDLE_VALID(_prom->chosen))
1331 		prom_panic("cannot find chosen"); /* msg won't be printed :( */
1332 
1333 	/* get device tree root */
1334 	_prom->root = call_prom("finddevice", 1, 1, ADDR("/"));
1335 	if (!PHANDLE_VALID(_prom->root))
1336 		prom_panic("cannot find device tree root"); /* msg won't be printed :( */
1337 
1338 	_prom->mmumap = 0;
1339 }
1340 
1341 #ifdef CONFIG_PPC32
1342 /*
1343  * For really old powermacs, we need to map things we claim.
1344  * For that, we need the ihandle of the mmu.
1345  */
1346 static void __init prom_find_mmu(void)
1347 {
1348 	struct prom_t *_prom = &RELOC(prom);
1349 	phandle oprom;
1350 	char version[64];
1351 
1352 	oprom = call_prom("finddevice", 1, 1, ADDR("/openprom"));
1353 	if (!PHANDLE_VALID(oprom))
1354 		return;
1355 	if (prom_getprop(oprom, "model", version, sizeof(version)) <= 0)
1356 		return;
1357 	version[sizeof(version) - 1] = 0;
1358 	prom_printf("OF version is '%s'\n", version);
1359 	/* XXX might need to add other versions here */
1360 	if (strcmp(version, "Open Firmware, 1.0.5") != 0)
1361 		return;
1362 	prom_getprop(_prom->chosen, "mmu", &_prom->mmumap,
1363 		     sizeof(_prom->mmumap));
1364 }
1365 #else
1366 #define prom_find_mmu()
1367 #endif
1368 
1369 static void __init prom_init_stdout(void)
1370 {
1371 	struct prom_t *_prom = &RELOC(prom);
1372 	char *path = RELOC(of_stdout_device);
1373 	char type[16];
1374 	u32 val;
1375 
1376 	if (prom_getprop(_prom->chosen, "stdout", &val, sizeof(val)) <= 0)
1377 		prom_panic("cannot find stdout");
1378 
1379 	_prom->stdout = val;
1380 
1381 	/* Get the full OF pathname of the stdout device */
1382 	memset(path, 0, 256);
1383 	call_prom("instance-to-path", 3, 1, _prom->stdout, path, 255);
1384 	val = call_prom("instance-to-package", 1, 1, _prom->stdout);
1385 	prom_setprop(_prom->chosen, "linux,stdout-package", &val, sizeof(val));
1386 	prom_printf("OF stdout device is: %s\n", RELOC(of_stdout_device));
1387 	prom_setprop(_prom->chosen, "linux,stdout-path",
1388 		     RELOC(of_stdout_device), strlen(RELOC(of_stdout_device))+1);
1389 
1390 	/* If it's a display, note it */
1391 	memset(type, 0, sizeof(type));
1392 	prom_getprop(val, "device_type", type, sizeof(type));
1393 	if (strcmp(type, RELOC("display")) == 0)
1394 		prom_setprop(val, "linux,boot-display", NULL, 0);
1395 }
1396 
1397 static void __init prom_close_stdin(void)
1398 {
1399 	struct prom_t *_prom = &RELOC(prom);
1400 	ihandle val;
1401 
1402 	if (prom_getprop(_prom->chosen, "stdin", &val, sizeof(val)) > 0)
1403 		call_prom("close", 1, 0, val);
1404 }
1405 
1406 static int __init prom_find_machine_type(void)
1407 {
1408 	struct prom_t *_prom = &RELOC(prom);
1409 	char compat[256];
1410 	int len, i = 0;
1411 	phandle rtas;
1412 
1413 	len = prom_getprop(_prom->root, "compatible",
1414 			   compat, sizeof(compat)-1);
1415 	if (len > 0) {
1416 		compat[len] = 0;
1417 		while (i < len) {
1418 			char *p = &compat[i];
1419 			int sl = strlen(p);
1420 			if (sl == 0)
1421 				break;
1422 			if (strstr(p, RELOC("Power Macintosh")) ||
1423 			    strstr(p, RELOC("MacRISC")))
1424 				return PLATFORM_POWERMAC;
1425 #ifdef CONFIG_PPC64
1426 			if (strstr(p, RELOC("Momentum,Maple")))
1427 				return PLATFORM_MAPLE;
1428 #endif
1429 			i += sl + 1;
1430 		}
1431 	}
1432 #ifdef CONFIG_PPC64
1433 	/* Default to pSeries. We need to know if we are running LPAR */
1434 	rtas = call_prom("finddevice", 1, 1, ADDR("/rtas"));
1435 	if (PHANDLE_VALID(rtas)) {
1436 		int x = prom_getproplen(rtas, "ibm,hypertas-functions");
1437 		if (x != PROM_ERROR) {
1438 			prom_printf("Hypertas detected, assuming LPAR !\n");
1439 			return PLATFORM_PSERIES_LPAR;
1440 		}
1441 	}
1442 	return PLATFORM_PSERIES;
1443 #else
1444 	return PLATFORM_CHRP;
1445 #endif
1446 }
1447 
1448 static int __init prom_set_color(ihandle ih, int i, int r, int g, int b)
1449 {
1450 	return call_prom("call-method", 6, 1, ADDR("color!"), ih, i, b, g, r);
1451 }
1452 
1453 /*
1454  * If we have a display that we don't know how to drive,
1455  * we will want to try to execute OF's open method for it
1456  * later.  However, OF will probably fall over if we do that
1457  * we've taken over the MMU.
1458  * So we check whether we will need to open the display,
1459  * and if so, open it now.
1460  */
1461 static void __init prom_check_displays(void)
1462 {
1463 	char type[16], *path;
1464 	phandle node;
1465 	ihandle ih;
1466 	int i;
1467 
1468 	static unsigned char default_colors[] = {
1469 		0x00, 0x00, 0x00,
1470 		0x00, 0x00, 0xaa,
1471 		0x00, 0xaa, 0x00,
1472 		0x00, 0xaa, 0xaa,
1473 		0xaa, 0x00, 0x00,
1474 		0xaa, 0x00, 0xaa,
1475 		0xaa, 0xaa, 0x00,
1476 		0xaa, 0xaa, 0xaa,
1477 		0x55, 0x55, 0x55,
1478 		0x55, 0x55, 0xff,
1479 		0x55, 0xff, 0x55,
1480 		0x55, 0xff, 0xff,
1481 		0xff, 0x55, 0x55,
1482 		0xff, 0x55, 0xff,
1483 		0xff, 0xff, 0x55,
1484 		0xff, 0xff, 0xff
1485 	};
1486 	const unsigned char *clut;
1487 
1488 	prom_printf("Looking for displays\n");
1489 	for (node = 0; prom_next_node(&node); ) {
1490 		memset(type, 0, sizeof(type));
1491 		prom_getprop(node, "device_type", type, sizeof(type));
1492 		if (strcmp(type, RELOC("display")) != 0)
1493 			continue;
1494 
1495 		/* It seems OF doesn't null-terminate the path :-( */
1496 		path = RELOC(prom_scratch);
1497 		memset(path, 0, PROM_SCRATCH_SIZE);
1498 
1499 		/*
1500 		 * leave some room at the end of the path for appending extra
1501 		 * arguments
1502 		 */
1503 		if (call_prom("package-to-path", 3, 1, node, path,
1504 			      PROM_SCRATCH_SIZE-10) == PROM_ERROR)
1505 			continue;
1506 		prom_printf("found display   : %s, opening ... ", path);
1507 
1508 		ih = call_prom("open", 1, 1, path);
1509 		if (ih == 0) {
1510 			prom_printf("failed\n");
1511 			continue;
1512 		}
1513 
1514 		/* Success */
1515 		prom_printf("done\n");
1516 		prom_setprop(node, "linux,opened", NULL, 0);
1517 
1518 		/* Setup a usable color table when the appropriate
1519 		 * method is available. Should update this to set-colors */
1520 		clut = RELOC(default_colors);
1521 		for (i = 0; i < 32; i++, clut += 3)
1522 			if (prom_set_color(ih, i, clut[0], clut[1],
1523 					   clut[2]) != 0)
1524 				break;
1525 
1526 #ifdef CONFIG_LOGO_LINUX_CLUT224
1527 		clut = PTRRELOC(RELOC(logo_linux_clut224.clut));
1528 		for (i = 0; i < RELOC(logo_linux_clut224.clutsize); i++, clut += 3)
1529 			if (prom_set_color(ih, i + 32, clut[0], clut[1],
1530 					   clut[2]) != 0)
1531 				break;
1532 #endif /* CONFIG_LOGO_LINUX_CLUT224 */
1533 	}
1534 }
1535 
1536 
1537 /* Return (relocated) pointer to this much memory: moves initrd if reqd. */
1538 static void __init *make_room(unsigned long *mem_start, unsigned long *mem_end,
1539 			      unsigned long needed, unsigned long align)
1540 {
1541 	void *ret;
1542 
1543 	*mem_start = _ALIGN(*mem_start, align);
1544 	while ((*mem_start + needed) > *mem_end) {
1545 		unsigned long room, chunk;
1546 
1547 		prom_debug("Chunk exhausted, claiming more at %x...\n",
1548 			   RELOC(alloc_bottom));
1549 		room = RELOC(alloc_top) - RELOC(alloc_bottom);
1550 		if (room > DEVTREE_CHUNK_SIZE)
1551 			room = DEVTREE_CHUNK_SIZE;
1552 		if (room < PAGE_SIZE)
1553 			prom_panic("No memory for flatten_device_tree (no room)");
1554 		chunk = alloc_up(room, 0);
1555 		if (chunk == 0)
1556 			prom_panic("No memory for flatten_device_tree (claim failed)");
1557 		*mem_end = RELOC(alloc_top);
1558 	}
1559 
1560 	ret = (void *)*mem_start;
1561 	*mem_start += needed;
1562 
1563 	return ret;
1564 }
1565 
1566 #define dt_push_token(token, mem_start, mem_end) \
1567 	do { *((u32 *)make_room(mem_start, mem_end, 4, 4)) = token; } while(0)
1568 
1569 static unsigned long __init dt_find_string(char *str)
1570 {
1571 	char *s, *os;
1572 
1573 	s = os = (char *)RELOC(dt_string_start);
1574 	s += 4;
1575 	while (s <  (char *)RELOC(dt_string_end)) {
1576 		if (strcmp(s, str) == 0)
1577 			return s - os;
1578 		s += strlen(s) + 1;
1579 	}
1580 	return 0;
1581 }
1582 
1583 /*
1584  * The Open Firmware 1275 specification states properties must be 31 bytes or
1585  * less, however not all firmwares obey this. Make it 64 bytes to be safe.
1586  */
1587 #define MAX_PROPERTY_NAME 64
1588 
1589 static void __init scan_dt_build_strings(phandle node,
1590 					 unsigned long *mem_start,
1591 					 unsigned long *mem_end)
1592 {
1593 	char *prev_name, *namep, *sstart;
1594 	unsigned long soff;
1595 	phandle child;
1596 
1597 	sstart =  (char *)RELOC(dt_string_start);
1598 
1599 	/* get and store all property names */
1600 	prev_name = RELOC("");
1601 	for (;;) {
1602 		/* 64 is max len of name including nul. */
1603 		namep = make_room(mem_start, mem_end, MAX_PROPERTY_NAME, 1);
1604 		if (call_prom("nextprop", 3, 1, node, prev_name, namep) != 1) {
1605 			/* No more nodes: unwind alloc */
1606 			*mem_start = (unsigned long)namep;
1607 			break;
1608 		}
1609 
1610  		/* skip "name" */
1611  		if (strcmp(namep, RELOC("name")) == 0) {
1612  			*mem_start = (unsigned long)namep;
1613  			prev_name = RELOC("name");
1614  			continue;
1615  		}
1616 		/* get/create string entry */
1617 		soff = dt_find_string(namep);
1618 		if (soff != 0) {
1619 			*mem_start = (unsigned long)namep;
1620 			namep = sstart + soff;
1621 		} else {
1622 			/* Trim off some if we can */
1623 			*mem_start = (unsigned long)namep + strlen(namep) + 1;
1624 			RELOC(dt_string_end) = *mem_start;
1625 		}
1626 		prev_name = namep;
1627 	}
1628 
1629 	/* do all our children */
1630 	child = call_prom("child", 1, 1, node);
1631 	while (child != 0) {
1632 		scan_dt_build_strings(child, mem_start, mem_end);
1633 		child = call_prom("peer", 1, 1, child);
1634 	}
1635 }
1636 
1637 static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
1638 					unsigned long *mem_end)
1639 {
1640 	phandle child;
1641 	char *namep, *prev_name, *sstart, *p, *ep, *lp, *path;
1642 	unsigned long soff;
1643 	unsigned char *valp;
1644 	static char pname[MAX_PROPERTY_NAME];
1645 	int l, room;
1646 
1647 	dt_push_token(OF_DT_BEGIN_NODE, mem_start, mem_end);
1648 
1649 	/* get the node's full name */
1650 	namep = (char *)*mem_start;
1651 	room = *mem_end - *mem_start;
1652 	if (room > 255)
1653 		room = 255;
1654 	l = call_prom("package-to-path", 3, 1, node, namep, room);
1655 	if (l >= 0) {
1656 		/* Didn't fit?  Get more room. */
1657 		if (l >= room) {
1658 			if (l >= *mem_end - *mem_start)
1659 				namep = make_room(mem_start, mem_end, l+1, 1);
1660 			call_prom("package-to-path", 3, 1, node, namep, l);
1661 		}
1662 		namep[l] = '\0';
1663 
1664 		/* Fixup an Apple bug where they have bogus \0 chars in the
1665 		 * middle of the path in some properties, and extract
1666 		 * the unit name (everything after the last '/').
1667 		 */
1668 		for (lp = p = namep, ep = namep + l; p < ep; p++) {
1669 			if (*p == '/')
1670 				lp = namep;
1671 			else if (*p != 0)
1672 				*lp++ = *p;
1673 		}
1674 		*lp = 0;
1675 		*mem_start = _ALIGN((unsigned long)lp + 1, 4);
1676 	}
1677 
1678 	/* get it again for debugging */
1679 	path = RELOC(prom_scratch);
1680 	memset(path, 0, PROM_SCRATCH_SIZE);
1681 	call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1);
1682 
1683 	/* get and store all properties */
1684 	prev_name = RELOC("");
1685 	sstart = (char *)RELOC(dt_string_start);
1686 	for (;;) {
1687 		if (call_prom("nextprop", 3, 1, node, prev_name,
1688 			      RELOC(pname)) != 1)
1689 			break;
1690 
1691  		/* skip "name" */
1692  		if (strcmp(RELOC(pname), RELOC("name")) == 0) {
1693  			prev_name = RELOC("name");
1694  			continue;
1695  		}
1696 
1697 		/* find string offset */
1698 		soff = dt_find_string(RELOC(pname));
1699 		if (soff == 0) {
1700 			prom_printf("WARNING: Can't find string index for"
1701 				    " <%s>, node %s\n", RELOC(pname), path);
1702 			break;
1703 		}
1704 		prev_name = sstart + soff;
1705 
1706 		/* get length */
1707 		l = call_prom("getproplen", 2, 1, node, RELOC(pname));
1708 
1709 		/* sanity checks */
1710 		if (l == PROM_ERROR)
1711 			continue;
1712 		if (l > MAX_PROPERTY_LENGTH) {
1713 			prom_printf("WARNING: ignoring large property ");
1714 			/* It seems OF doesn't null-terminate the path :-( */
1715 			prom_printf("[%s] ", path);
1716 			prom_printf("%s length 0x%x\n", RELOC(pname), l);
1717 			continue;
1718 		}
1719 
1720 		/* push property head */
1721 		dt_push_token(OF_DT_PROP, mem_start, mem_end);
1722 		dt_push_token(l, mem_start, mem_end);
1723 		dt_push_token(soff, mem_start, mem_end);
1724 
1725 		/* push property content */
1726 		valp = make_room(mem_start, mem_end, l, 4);
1727 		call_prom("getprop", 4, 1, node, RELOC(pname), valp, l);
1728 		*mem_start = _ALIGN(*mem_start, 4);
1729 	}
1730 
1731 	/* Add a "linux,phandle" property. */
1732 	soff = dt_find_string(RELOC("linux,phandle"));
1733 	if (soff == 0)
1734 		prom_printf("WARNING: Can't find string index for"
1735 			    " <linux-phandle> node %s\n", path);
1736 	else {
1737 		dt_push_token(OF_DT_PROP, mem_start, mem_end);
1738 		dt_push_token(4, mem_start, mem_end);
1739 		dt_push_token(soff, mem_start, mem_end);
1740 		valp = make_room(mem_start, mem_end, 4, 4);
1741 		*(u32 *)valp = node;
1742 	}
1743 
1744 	/* do all our children */
1745 	child = call_prom("child", 1, 1, node);
1746 	while (child != 0) {
1747 		scan_dt_build_struct(child, mem_start, mem_end);
1748 		child = call_prom("peer", 1, 1, child);
1749 	}
1750 
1751 	dt_push_token(OF_DT_END_NODE, mem_start, mem_end);
1752 }
1753 
1754 static void __init flatten_device_tree(void)
1755 {
1756 	phandle root;
1757 	unsigned long mem_start, mem_end, room;
1758 	struct boot_param_header *hdr;
1759 	struct prom_t *_prom = &RELOC(prom);
1760 	char *namep;
1761 	u64 *rsvmap;
1762 
1763 	/*
1764 	 * Check how much room we have between alloc top & bottom (+/- a
1765 	 * few pages), crop to 4Mb, as this is our "chuck" size
1766 	 */
1767 	room = RELOC(alloc_top) - RELOC(alloc_bottom) - 0x4000;
1768 	if (room > DEVTREE_CHUNK_SIZE)
1769 		room = DEVTREE_CHUNK_SIZE;
1770 	prom_debug("starting device tree allocs at %x\n", RELOC(alloc_bottom));
1771 
1772 	/* Now try to claim that */
1773 	mem_start = (unsigned long)alloc_up(room, PAGE_SIZE);
1774 	if (mem_start == 0)
1775 		prom_panic("Can't allocate initial device-tree chunk\n");
1776 	mem_end = RELOC(alloc_top);
1777 
1778 	/* Get root of tree */
1779 	root = call_prom("peer", 1, 1, (phandle)0);
1780 	if (root == (phandle)0)
1781 		prom_panic ("couldn't get device tree root\n");
1782 
1783 	/* Build header and make room for mem rsv map */
1784 	mem_start = _ALIGN(mem_start, 4);
1785 	hdr = make_room(&mem_start, &mem_end,
1786 			sizeof(struct boot_param_header), 4);
1787 	RELOC(dt_header_start) = (unsigned long)hdr;
1788 	rsvmap = make_room(&mem_start, &mem_end, sizeof(mem_reserve_map), 8);
1789 
1790 	/* Start of strings */
1791 	mem_start = PAGE_ALIGN(mem_start);
1792 	RELOC(dt_string_start) = mem_start;
1793 	mem_start += 4; /* hole */
1794 
1795 	/* Add "linux,phandle" in there, we'll need it */
1796 	namep = make_room(&mem_start, &mem_end, 16, 1);
1797 	strcpy(namep, RELOC("linux,phandle"));
1798 	mem_start = (unsigned long)namep + strlen(namep) + 1;
1799 
1800 	/* Build string array */
1801 	prom_printf("Building dt strings...\n");
1802 	scan_dt_build_strings(root, &mem_start, &mem_end);
1803 	RELOC(dt_string_end) = mem_start;
1804 
1805 	/* Build structure */
1806 	mem_start = PAGE_ALIGN(mem_start);
1807 	RELOC(dt_struct_start) = mem_start;
1808 	prom_printf("Building dt structure...\n");
1809 	scan_dt_build_struct(root, &mem_start, &mem_end);
1810 	dt_push_token(OF_DT_END, &mem_start, &mem_end);
1811 	RELOC(dt_struct_end) = PAGE_ALIGN(mem_start);
1812 
1813 	/* Finish header */
1814 	hdr->boot_cpuid_phys = _prom->cpu;
1815 	hdr->magic = OF_DT_HEADER;
1816 	hdr->totalsize = RELOC(dt_struct_end) - RELOC(dt_header_start);
1817 	hdr->off_dt_struct = RELOC(dt_struct_start) - RELOC(dt_header_start);
1818 	hdr->off_dt_strings = RELOC(dt_string_start) - RELOC(dt_header_start);
1819 	hdr->dt_strings_size = RELOC(dt_string_end) - RELOC(dt_string_start);
1820 	hdr->off_mem_rsvmap = ((unsigned long)rsvmap) - RELOC(dt_header_start);
1821 	hdr->version = OF_DT_VERSION;
1822 	/* Version 16 is not backward compatible */
1823 	hdr->last_comp_version = 0x10;
1824 
1825 	/* Reserve the whole thing and copy the reserve map in, we
1826 	 * also bump mem_reserve_cnt to cause further reservations to
1827 	 * fail since it's too late.
1828 	 */
1829 	reserve_mem(RELOC(dt_header_start), hdr->totalsize);
1830 	memcpy(rsvmap, RELOC(mem_reserve_map), sizeof(mem_reserve_map));
1831 
1832 #ifdef DEBUG_PROM
1833 	{
1834 		int i;
1835 		prom_printf("reserved memory map:\n");
1836 		for (i = 0; i < RELOC(mem_reserve_cnt); i++)
1837 			prom_printf("  %x - %x\n",
1838 				    RELOC(mem_reserve_map)[i].base,
1839 				    RELOC(mem_reserve_map)[i].size);
1840 	}
1841 #endif
1842 	RELOC(mem_reserve_cnt) = MEM_RESERVE_MAP_SIZE;
1843 
1844 	prom_printf("Device tree strings 0x%x -> 0x%x\n",
1845 		    RELOC(dt_string_start), RELOC(dt_string_end));
1846 	prom_printf("Device tree struct  0x%x -> 0x%x\n",
1847 		    RELOC(dt_struct_start), RELOC(dt_struct_end));
1848 
1849 }
1850 
1851 
1852 static void __init fixup_device_tree(void)
1853 {
1854 #if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC)
1855 	phandle u3, i2c, mpic;
1856 	u32 u3_rev;
1857 	u32 interrupts[2];
1858 	u32 parent;
1859 
1860 	/* Some G5s have a missing interrupt definition, fix it up here */
1861 	u3 = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000"));
1862 	if (!PHANDLE_VALID(u3))
1863 		return;
1864 	i2c = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/i2c@f8001000"));
1865 	if (!PHANDLE_VALID(i2c))
1866 		return;
1867 	mpic = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/mpic@f8040000"));
1868 	if (!PHANDLE_VALID(mpic))
1869 		return;
1870 
1871 	/* check if proper rev of u3 */
1872 	if (prom_getprop(u3, "device-rev", &u3_rev, sizeof(u3_rev))
1873 	    == PROM_ERROR)
1874 		return;
1875 	if (u3_rev != 0x35 && u3_rev != 0x37)
1876 		return;
1877 	/* does it need fixup ? */
1878 	if (prom_getproplen(i2c, "interrupts") > 0)
1879 		return;
1880 
1881 	prom_printf("fixing up bogus interrupts for u3 i2c...\n");
1882 
1883 	/* interrupt on this revision of u3 is number 0 and level */
1884 	interrupts[0] = 0;
1885 	interrupts[1] = 1;
1886 	prom_setprop(i2c, "interrupts", &interrupts, sizeof(interrupts));
1887 	parent = (u32)mpic;
1888 	prom_setprop(i2c, "interrupt-parent", &parent, sizeof(parent));
1889 #endif
1890 }
1891 
1892 
1893 static void __init prom_find_boot_cpu(void)
1894 {
1895        	struct prom_t *_prom = &RELOC(prom);
1896 	u32 getprop_rval;
1897 	ihandle prom_cpu;
1898 	phandle cpu_pkg;
1899 
1900 	_prom->cpu = 0;
1901 	if (prom_getprop(_prom->chosen, "cpu", &prom_cpu, sizeof(prom_cpu)) <= 0)
1902 		return;
1903 
1904 	cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu);
1905 
1906 	prom_getprop(cpu_pkg, "reg", &getprop_rval, sizeof(getprop_rval));
1907 	_prom->cpu = getprop_rval;
1908 
1909 	prom_debug("Booting CPU hw index = 0x%x\n", _prom->cpu);
1910 }
1911 
1912 static void __init prom_check_initrd(unsigned long r3, unsigned long r4)
1913 {
1914 #ifdef CONFIG_BLK_DEV_INITRD
1915        	struct prom_t *_prom = &RELOC(prom);
1916 
1917 	if (r3 && r4 && r4 != 0xdeadbeef) {
1918 		unsigned long val;
1919 
1920 		RELOC(prom_initrd_start) = (r3 >= KERNELBASE) ? __pa(r3) : r3;
1921 		RELOC(prom_initrd_end) = RELOC(prom_initrd_start) + r4;
1922 
1923 		val = RELOC(prom_initrd_start);
1924 		prom_setprop(_prom->chosen, "linux,initrd-start", &val,
1925 			     sizeof(val));
1926 		val = RELOC(prom_initrd_end);
1927 		prom_setprop(_prom->chosen, "linux,initrd-end", &val,
1928 			     sizeof(val));
1929 
1930 		reserve_mem(RELOC(prom_initrd_start),
1931 			    RELOC(prom_initrd_end) - RELOC(prom_initrd_start));
1932 
1933 		prom_debug("initrd_start=0x%x\n", RELOC(prom_initrd_start));
1934 		prom_debug("initrd_end=0x%x\n", RELOC(prom_initrd_end));
1935 	}
1936 #endif /* CONFIG_BLK_DEV_INITRD */
1937 }
1938 
1939 /*
1940  * We enter here early on, when the Open Firmware prom is still
1941  * handling exceptions and the MMU hash table for us.
1942  */
1943 
1944 unsigned long __init prom_init(unsigned long r3, unsigned long r4,
1945 			       unsigned long pp,
1946 			       unsigned long r6, unsigned long r7)
1947 {
1948        	struct prom_t *_prom;
1949 	unsigned long hdr;
1950 	u32 getprop_rval;
1951 	unsigned long offset = reloc_offset();
1952 
1953 #ifdef CONFIG_PPC32
1954 	reloc_got2(offset);
1955 #endif
1956 
1957 	_prom = &RELOC(prom);
1958 
1959 	/*
1960 	 * First zero the BSS
1961 	 */
1962 	memset(&RELOC(__bss_start), 0, __bss_stop - __bss_start);
1963 
1964 	/*
1965 	 * Init interface to Open Firmware, get some node references,
1966 	 * like /chosen
1967 	 */
1968 	prom_init_client_services(pp);
1969 
1970 	/*
1971 	 * Init prom stdout device
1972 	 */
1973 	prom_init_stdout();
1974 
1975 	/*
1976 	 * See if this OF is old enough that we need to do explicit maps
1977 	 */
1978 	prom_find_mmu();
1979 
1980 	/*
1981 	 * Check for an initrd
1982 	 */
1983 	prom_check_initrd(r3, r4);
1984 
1985 	/*
1986 	 * Get default machine type. At this point, we do not differentiate
1987 	 * between pSeries SMP and pSeries LPAR
1988 	 */
1989 	RELOC(of_platform) = prom_find_machine_type();
1990 	getprop_rval = RELOC(of_platform);
1991 	prom_setprop(_prom->chosen, "linux,platform",
1992 		     &getprop_rval, sizeof(getprop_rval));
1993 
1994 #ifdef CONFIG_PPC_PSERIES
1995 	/*
1996 	 * On pSeries, inform the firmware about our capabilities
1997 	 */
1998 	if (RELOC(of_platform) & PLATFORM_PSERIES)
1999 		prom_send_capabilities();
2000 #endif
2001 
2002 	/*
2003 	 * Copy the CPU hold code
2004 	 */
2005        	if (RELOC(of_platform) != PLATFORM_POWERMAC)
2006        		copy_and_flush(0, KERNELBASE + offset, 0x100, 0);
2007 
2008 	/*
2009 	 * Do early parsing of command line
2010 	 */
2011 	early_cmdline_parse();
2012 
2013 	/*
2014 	 * Initialize memory management within prom_init
2015 	 */
2016 	prom_init_mem();
2017 
2018 	/*
2019 	 * Determine which cpu is actually running right _now_
2020 	 */
2021 	prom_find_boot_cpu();
2022 
2023 	/*
2024 	 * Initialize display devices
2025 	 */
2026 	prom_check_displays();
2027 
2028 #ifdef CONFIG_PPC64
2029 	/*
2030 	 * Initialize IOMMU (TCE tables) on pSeries. Do that before anything else
2031 	 * that uses the allocator, we need to make sure we get the top of memory
2032 	 * available for us here...
2033 	 */
2034 	if (RELOC(of_platform) == PLATFORM_PSERIES)
2035 		prom_initialize_tce_table();
2036 #endif
2037 
2038 	/*
2039 	 * On non-powermacs, try to instantiate RTAS and puts all CPUs
2040 	 * in spin-loops. PowerMacs don't have a working RTAS and use
2041 	 * a different way to spin CPUs
2042 	 */
2043 	if (RELOC(of_platform) != PLATFORM_POWERMAC) {
2044 		prom_instantiate_rtas();
2045 		prom_hold_cpus();
2046 	}
2047 
2048 	/*
2049 	 * Fill in some infos for use by the kernel later on
2050 	 */
2051 	if (RELOC(prom_memory_limit))
2052 		prom_setprop(_prom->chosen, "linux,memory-limit",
2053 			     &RELOC(prom_memory_limit),
2054 			     sizeof(prom_memory_limit));
2055 #ifdef CONFIG_PPC64
2056 	if (RELOC(ppc64_iommu_off))
2057 		prom_setprop(_prom->chosen, "linux,iommu-off", NULL, 0);
2058 
2059 	if (RELOC(iommu_force_on))
2060 		prom_setprop(_prom->chosen, "linux,iommu-force-on", NULL, 0);
2061 
2062 	if (RELOC(prom_tce_alloc_start)) {
2063 		prom_setprop(_prom->chosen, "linux,tce-alloc-start",
2064 			     &RELOC(prom_tce_alloc_start),
2065 			     sizeof(prom_tce_alloc_start));
2066 		prom_setprop(_prom->chosen, "linux,tce-alloc-end",
2067 			     &RELOC(prom_tce_alloc_end),
2068 			     sizeof(prom_tce_alloc_end));
2069 	}
2070 #endif
2071 
2072 	/*
2073 	 * Fixup any known bugs in the device-tree
2074 	 */
2075 	fixup_device_tree();
2076 
2077 	/*
2078 	 * Now finally create the flattened device-tree
2079 	 */
2080 	prom_printf("copying OF device tree ...\n");
2081 	flatten_device_tree();
2082 
2083 	/* in case stdin is USB and still active on IBM machines... */
2084 	prom_close_stdin();
2085 
2086 	/*
2087 	 * Call OF "quiesce" method to shut down pending DMA's from
2088 	 * devices etc...
2089 	 */
2090 	prom_printf("Calling quiesce ...\n");
2091 	call_prom("quiesce", 0, 0);
2092 
2093 	/*
2094 	 * And finally, call the kernel passing it the flattened device
2095 	 * tree and NULL as r5, thus triggering the new entry point which
2096 	 * is common to us and kexec
2097 	 */
2098 	hdr = RELOC(dt_header_start);
2099 	prom_printf("returning from prom_init\n");
2100 	prom_debug("->dt_header_start=0x%x\n", hdr);
2101 
2102 #ifdef CONFIG_PPC32
2103 	reloc_got2(-offset);
2104 #endif
2105 
2106 	__start(hdr, KERNELBASE + offset, 0);
2107 
2108 	return 0;
2109 }
2110