root/arch/powerpc/kernel/prom_init.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. enter_prom
  2. prom_strcmp
  3. prom_strcpy
  4. prom_strncmp
  5. prom_strlen
  6. prom_memcmp
  7. prom_strstr
  8. prom_strlcpy
  9. prom_strtobool
  10. call_prom
  11. call_prom_ret
  12. prom_print
  13. prom_print_hex
  14. prom_print_dec
  15. __printf
  16. prom_claim
  17. prom_panic
  18. prom_next_node
  19. prom_getprop
  20. prom_getproplen
  21. add_string
  22. tohex
  23. prom_setprop
  24. prom_strtoul
  25. prom_memparse
  26. early_cmdline_parse
  27. prom_count_smt_threads
  28. prom_parse_mmu_model
  29. prom_parse_xive_model
  30. prom_parse_platform_support
  31. prom_check_platform_support
  32. prom_send_capabilities
  33. alloc_up
  34. alloc_down
  35. prom_next_cell
  36. reserve_mem
  37. prom_init_mem
  38. prom_close_stdin
  39. prom_rtas_hcall
  40. prom_rtas_os_term
  41. prom_instantiate_rtas
  42. prom_instantiate_sml
  43. prom_initialize_tce_table
  44. prom_hold_cpus
  45. prom_init_client_services
  46. prom_find_mmu
  47. prom_init_stdout
  48. prom_find_machine_type
  49. prom_set_color
  50. prom_check_displays
  51. make_room
  52. dt_find_string
  53. scan_dt_build_strings
  54. scan_dt_build_struct
  55. flatten_device_tree
  56. fixup_device_tree_maple
  57. fixup_device_tree_maple_memory_controller
  58. fixup_device_tree_chrp
  59. fixup_device_tree_pmac
  60. fixup_device_tree_efika_add_phy
  61. fixup_device_tree_efika
  62. fixup_device_tree_pasemi
  63. fixup_device_tree_pasemi
  64. fixup_device_tree
  65. prom_find_boot_cpu
  66. prom_check_initrd
  67. reloc_toc
  68. unreloc_toc
  69. __reloc_toc
  70. reloc_toc
  71. unreloc_toc
  72. enter_secure_mode
  73. setup_secure_guest
  74. setup_secure_guest
  75. prom_init

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

/* [<][>][^][v][top][bottom][index][help] */