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