linux/arch/powerpc/kernel/prom_init.c
<<
>>
Prefs
   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
  89static 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
 108typedef u32 prom_arg_t;
 109
 110struct prom_args {
 111        __be32 service;
 112        __be32 nargs;
 113        __be32 nret;
 114        __be32 args[10];
 115};
 116
 117struct prom_t {
 118        ihandle root;
 119        phandle chosen;
 120        int cpu;
 121        ihandle stdout;
 122        ihandle mmumap;
 123        ihandle memory;
 124};
 125
 126struct mem_map_entry {
 127        __be64  base;
 128        __be64  size;
 129};
 130
 131typedef __be32 cell_t;
 132
 133extern 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
 138extern int enter_prom(struct prom_args *args, unsigned long entry);
 139#else
 140static inline int enter_prom(struct prom_args *args, unsigned long entry)
 141{
 142        return ((int (*)(struct prom_args *))entry)(args);
 143}
 144#endif
 145
 146extern void copy_and_flush(unsigned long dest, unsigned long src,
 147                           unsigned long size, unsigned long offset);
 148
 149/* prom structure */
 150static struct prom_t __prombss prom;
 151
 152static unsigned long __prombss prom_entry;
 153
 154static char __prombss of_stdout_device[256];
 155static char __prombss prom_scratch[256];
 156
 157static unsigned long __prombss dt_header_start;
 158static unsigned long __prombss dt_struct_start, dt_struct_end;
 159static unsigned long __prombss dt_string_start, dt_string_end;
 160
 161static unsigned long __prombss prom_initrd_start, prom_initrd_end;
 162
 163#ifdef CONFIG_PPC64
 164static int __prombss prom_iommu_force_on;
 165static int __prombss prom_iommu_off;
 166static unsigned long __prombss prom_tce_alloc_start;
 167static unsigned long __prombss prom_tce_alloc_end;
 168#endif
 169
 170#ifdef CONFIG_PPC_PSERIES
 171static bool __prombss prom_radix_disable;
 172static bool __prombss prom_xive_disable;
 173#endif
 174
 175#ifdef CONFIG_PPC_SVM
 176static bool __prombss prom_svm_enable;
 177#endif
 178
 179struct 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
 196static int __prombss of_platform;
 197
 198static char __prombss prom_cmd_line[COMMAND_LINE_SIZE];
 199
 200static unsigned long __prombss prom_memory_limit;
 201
 202static unsigned long __prombss alloc_top;
 203static unsigned long __prombss alloc_top_high;
 204static unsigned long __prombss alloc_bottom;
 205static unsigned long __prombss rmo_top;
 206static unsigned long __prombss ram_top;
 207
 208static struct mem_map_entry __prombss mem_reserve_map[MEM_RESERVE_MAP_SIZE];
 209static int __prombss mem_reserve_cnt;
 210
 211static cell_t __prombss regbuf[1024];
 212
 213static 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
 229static 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
 244static 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
 253static 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
 269static 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
 278static 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
 289static 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
 306static 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
 319static 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
 361static 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
 385static 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
 415static 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 */
 439static 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
 456static 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)
 473static 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
 566static 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
 600static 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
 616static 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
 633static 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
 640static inline int __init prom_getproplen(phandle node, const char *pname)
 641{
 642        return call_prom("getproplen", 2, 1, node, ADDR(pname));
 643}
 644
 645static 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
 655static 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
 671static 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
 702static 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
 727static 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 */
 758static 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
 851struct option_vector1 {
 852        u8 byte1;
 853        u8 arch_versions;
 854        u8 arch_versions3;
 855} __packed;
 856
 857struct 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
 871struct option_vector3 {
 872        u8 byte1;
 873        u8 byte2;
 874} __packed;
 875
 876struct option_vector4 {
 877        u8 byte1;
 878        u8 min_vp_cap;
 879} __packed;
 880
 881struct 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
 904struct option_vector6 {
 905        u8 reserved;
 906        u8 secondary_pteg;
 907        u8 os_name;
 908} __packed;
 909
 910struct 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
 934static 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),
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
1072static 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__
1076static 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
1163static 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
1201static 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
1232static 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
1260static 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
1280static 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
1340static 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 */
1434static 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 */
1479static 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 */
1536static 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 */
1565static 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 */
1592static 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
1720static 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
1732static 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
1743static struct rtas_args __prombss os_term_args;
1744
1745static 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        prom_rtas_hcall((uint64_t)&os_term_args);
1765}
1766#endif /* CONFIG_PPC_SVM */
1767
1768/*
1769 * Allocate room for and instantiate RTAS
1770 */
1771static void __init prom_instantiate_rtas(void)
1772{
1773        phandle rtas_node;
1774        ihandle rtas_inst;
1775        u32 base, entry = 0;
1776        __be32 val;
1777        u32 size = 0;
1778
1779        prom_debug("prom_instantiate_rtas: start...\n");
1780
1781        rtas_node = call_prom("finddevice", 1, 1, ADDR("/rtas"));
1782        prom_debug("rtas_node: %x\n", rtas_node);
1783        if (!PHANDLE_VALID(rtas_node))
1784                return;
1785
1786        val = 0;
1787        prom_getprop(rtas_node, "rtas-size", &val, sizeof(size));
1788        size = be32_to_cpu(val);
1789        if (size == 0)
1790                return;
1791
1792        base = alloc_down(size, PAGE_SIZE, 0);
1793        if (base == 0)
1794                prom_panic("Could not allocate memory for RTAS\n");
1795
1796        rtas_inst = call_prom("open", 1, 1, ADDR("/rtas"));
1797        if (!IHANDLE_VALID(rtas_inst)) {
1798                prom_printf("opening rtas package failed (%x)\n", rtas_inst);
1799                return;
1800        }
1801
1802        prom_printf("instantiating rtas at 0x%x...", base);
1803
1804        if (call_prom_ret("call-method", 3, 2, &entry,
1805                          ADDR("instantiate-rtas"),
1806                          rtas_inst, base) != 0
1807            || entry == 0) {
1808                prom_printf(" failed\n");
1809                return;
1810        }
1811        prom_printf(" done\n");
1812
1813        reserve_mem(base, size);
1814
1815        val = cpu_to_be32(base);
1816        prom_setprop(rtas_node, "/rtas", "linux,rtas-base",
1817                     &val, sizeof(val));
1818        val = cpu_to_be32(entry);
1819        prom_setprop(rtas_node, "/rtas", "linux,rtas-entry",
1820                     &val, sizeof(val));
1821
1822        /* Check if it supports "query-cpu-stopped-state" */
1823        if (prom_getprop(rtas_node, "query-cpu-stopped-state",
1824                         &val, sizeof(val)) != PROM_ERROR)
1825                rtas_has_query_cpu_stopped = true;
1826
1827        prom_debug("rtas base     = 0x%x\n", base);
1828        prom_debug("rtas entry    = 0x%x\n", entry);
1829        prom_debug("rtas size     = 0x%x\n", size);
1830
1831        prom_debug("prom_instantiate_rtas: end...\n");
1832}
1833
1834#ifdef CONFIG_PPC64
1835/*
1836 * Allocate room for and instantiate Stored Measurement Log (SML)
1837 */
1838static void __init prom_instantiate_sml(void)
1839{
1840        phandle ibmvtpm_node;
1841        ihandle ibmvtpm_inst;
1842        u32 entry = 0, size = 0, succ = 0;
1843        u64 base;
1844        __be32 val;
1845
1846        prom_debug("prom_instantiate_sml: start...\n");
1847
1848        ibmvtpm_node = call_prom("finddevice", 1, 1, ADDR("/vdevice/vtpm"));
1849        prom_debug("ibmvtpm_node: %x\n", ibmvtpm_node);
1850        if (!PHANDLE_VALID(ibmvtpm_node))
1851                return;
1852
1853        ibmvtpm_inst = call_prom("open", 1, 1, ADDR("/vdevice/vtpm"));
1854        if (!IHANDLE_VALID(ibmvtpm_inst)) {
1855                prom_printf("opening vtpm package failed (%x)\n", ibmvtpm_inst);
1856                return;
1857        }
1858
1859        if (prom_getprop(ibmvtpm_node, "ibm,sml-efi-reformat-supported",
1860                         &val, sizeof(val)) != PROM_ERROR) {
1861                if (call_prom_ret("call-method", 2, 2, &succ,
1862                                  ADDR("reformat-sml-to-efi-alignment"),
1863                                  ibmvtpm_inst) != 0 || succ == 0) {
1864                        prom_printf("Reformat SML to EFI alignment failed\n");
1865                        return;
1866                }
1867
1868                if (call_prom_ret("call-method", 2, 2, &size,
1869                                  ADDR("sml-get-allocated-size"),
1870                                  ibmvtpm_inst) != 0 || size == 0) {
1871                        prom_printf("SML get allocated size failed\n");
1872                        return;
1873                }
1874        } else {
1875                if (call_prom_ret("call-method", 2, 2, &size,
1876                                  ADDR("sml-get-handover-size"),
1877                                  ibmvtpm_inst) != 0 || size == 0) {
1878                        prom_printf("SML get handover size failed\n");
1879                        return;
1880                }
1881        }
1882
1883        base = alloc_down(size, PAGE_SIZE, 0);
1884        if (base == 0)
1885                prom_panic("Could not allocate memory for sml\n");
1886
1887        prom_printf("instantiating sml at 0x%llx...", base);
1888
1889        memset((void *)base, 0, size);
1890
1891        if (call_prom_ret("call-method", 4, 2, &entry,
1892                          ADDR("sml-handover"),
1893                          ibmvtpm_inst, size, base) != 0 || entry == 0) {
1894                prom_printf("SML handover failed\n");
1895                return;
1896        }
1897        prom_printf(" done\n");
1898
1899        reserve_mem(base, size);
1900
1901        prom_setprop(ibmvtpm_node, "/vdevice/vtpm", "linux,sml-base",
1902                     &base, sizeof(base));
1903        prom_setprop(ibmvtpm_node, "/vdevice/vtpm", "linux,sml-size",
1904                     &size, sizeof(size));
1905
1906        prom_debug("sml base     = 0x%llx\n", base);
1907        prom_debug("sml size     = 0x%x\n", size);
1908
1909        prom_debug("prom_instantiate_sml: end...\n");
1910}
1911
1912/*
1913 * Allocate room for and initialize TCE tables
1914 */
1915#ifdef __BIG_ENDIAN__
1916static void __init prom_initialize_tce_table(void)
1917{
1918        phandle node;
1919        ihandle phb_node;
1920        char compatible[64], type[64], model[64];
1921        char *path = prom_scratch;
1922        u64 base, align;
1923        u32 minalign, minsize;
1924        u64 tce_entry, *tce_entryp;
1925        u64 local_alloc_top, local_alloc_bottom;
1926        u64 i;
1927
1928        if (prom_iommu_off)
1929                return;
1930
1931        prom_debug("starting prom_initialize_tce_table\n");
1932
1933        /* Cache current top of allocs so we reserve a single block */
1934        local_alloc_top = alloc_top_high;
1935        local_alloc_bottom = local_alloc_top;
1936
1937        /* Search all nodes looking for PHBs. */
1938        for (node = 0; prom_next_node(&node); ) {
1939                compatible[0] = 0;
1940                type[0] = 0;
1941                model[0] = 0;
1942                prom_getprop(node, "compatible",
1943                             compatible, sizeof(compatible));
1944                prom_getprop(node, "device_type", type, sizeof(type));
1945                prom_getprop(node, "model", model, sizeof(model));
1946
1947                if ((type[0] == 0) || (prom_strstr(type, "pci") == NULL))
1948                        continue;
1949
1950                /* Keep the old logic intact to avoid regression. */
1951                if (compatible[0] != 0) {
1952                        if ((prom_strstr(compatible, "python") == NULL) &&
1953                            (prom_strstr(compatible, "Speedwagon") == NULL) &&
1954                            (prom_strstr(compatible, "Winnipeg") == NULL))
1955                                continue;
1956                } else if (model[0] != 0) {
1957                        if ((prom_strstr(model, "ython") == NULL) &&
1958                            (prom_strstr(model, "peedwagon") == NULL) &&
1959                            (prom_strstr(model, "innipeg") == NULL))
1960                                continue;
1961                }
1962
1963                if (prom_getprop(node, "tce-table-minalign", &minalign,
1964                                 sizeof(minalign)) == PROM_ERROR)
1965                        minalign = 0;
1966                if (prom_getprop(node, "tce-table-minsize", &minsize,
1967                                 sizeof(minsize)) == PROM_ERROR)
1968                        minsize = 4UL << 20;
1969
1970                /*
1971                 * Even though we read what OF wants, we just set the table
1972                 * size to 4 MB.  This is enough to map 2GB of PCI DMA space.
1973                 * By doing this, we avoid the pitfalls of trying to DMA to
1974                 * MMIO space and the DMA alias hole.
1975                 */
1976                minsize = 4UL << 20;
1977
1978                /* Align to the greater of the align or size */
1979                align = max(minalign, minsize);
1980                base = alloc_down(minsize, align, 1);
1981                if (base == 0)
1982                        prom_panic("ERROR, cannot find space for TCE table.\n");
1983                if (base < local_alloc_bottom)
1984                        local_alloc_bottom = base;
1985
1986                /* It seems OF doesn't null-terminate the path :-( */
1987                memset(path, 0, sizeof(prom_scratch));
1988                /* Call OF to setup the TCE hardware */
1989                if (call_prom("package-to-path", 3, 1, node,
1990                              path, sizeof(prom_scratch) - 1) == PROM_ERROR) {
1991                        prom_printf("package-to-path failed\n");
1992                }
1993
1994                /* Save away the TCE table attributes for later use. */
1995                prom_setprop(node, path, "linux,tce-base", &base, sizeof(base));
1996                prom_setprop(node, path, "linux,tce-size", &minsize, sizeof(minsize));
1997
1998                prom_debug("TCE table: %s\n", path);
1999                prom_debug("\tnode = 0x%x\n", node);
2000                prom_debug("\tbase = 0x%llx\n", base);
2001                prom_debug("\tsize = 0x%x\n", minsize);
2002
2003                /* Initialize the table to have a one-to-one mapping
2004                 * over the allocated size.
2005                 */
2006                tce_entryp = (u64 *)base;
2007                for (i = 0; i < (minsize >> 3) ;tce_entryp++, i++) {
2008                        tce_entry = (i << PAGE_SHIFT);
2009                        tce_entry |= 0x3;
2010                        *tce_entryp = tce_entry;
2011                }
2012
2013                prom_printf("opening PHB %s", path);
2014                phb_node = call_prom("open", 1, 1, path);
2015                if (phb_node == 0)
2016                        prom_printf("... failed\n");
2017                else
2018                        prom_printf("... done\n");
2019
2020                call_prom("call-method", 6, 0, ADDR("set-64-bit-addressing"),
2021                          phb_node, -1, minsize,
2022                          (u32) base, (u32) (base >> 32));
2023                call_prom("close", 1, 0, phb_node);
2024        }
2025
2026        reserve_mem(local_alloc_bottom, local_alloc_top - local_alloc_bottom);
2027
2028        /* These are only really needed if there is a memory limit in
2029         * effect, but we don't know so export them always. */
2030        prom_tce_alloc_start = local_alloc_bottom;
2031        prom_tce_alloc_end = local_alloc_top;
2032
2033        /* Flag the first invalid entry */
2034        prom_debug("ending prom_initialize_tce_table\n");
2035}
2036#endif /* __BIG_ENDIAN__ */
2037#endif /* CONFIG_PPC64 */
2038
2039/*
2040 * With CHRP SMP we need to use the OF to start the other processors.
2041 * We can't wait until smp_boot_cpus (the OF is trashed by then)
2042 * so we have to put the processors into a holding pattern controlled
2043 * by the kernel (not OF) before we destroy the OF.
2044 *
2045 * This uses a chunk of low memory, puts some holding pattern
2046 * code there and sends the other processors off to there until
2047 * smp_boot_cpus tells them to do something.  The holding pattern
2048 * checks that address until its cpu # is there, when it is that
2049 * cpu jumps to __secondary_start().  smp_boot_cpus() takes care
2050 * of setting those values.
2051 *
2052 * We also use physical address 0x4 here to tell when a cpu
2053 * is in its holding pattern code.
2054 *
2055 * -- Cort
2056 */
2057/*
2058 * We want to reference the copy of __secondary_hold_* in the
2059 * 0 - 0x100 address range
2060 */
2061#define LOW_ADDR(x)     (((unsigned long) &(x)) & 0xff)
2062
2063static void __init prom_hold_cpus(void)
2064{
2065        unsigned long i;
2066        phandle node;
2067        char type[64];
2068        unsigned long *spinloop
2069                = (void *) LOW_ADDR(__secondary_hold_spinloop);
2070        unsigned long *acknowledge
2071                = (void *) LOW_ADDR(__secondary_hold_acknowledge);
2072        unsigned long secondary_hold = LOW_ADDR(__secondary_hold);
2073
2074        /*
2075         * On pseries, if RTAS supports "query-cpu-stopped-state",
2076         * we skip this stage, the CPUs will be started by the
2077         * kernel using RTAS.
2078         */
2079        if ((of_platform == PLATFORM_PSERIES ||
2080             of_platform == PLATFORM_PSERIES_LPAR) &&
2081            rtas_has_query_cpu_stopped) {
2082                prom_printf("prom_hold_cpus: skipped\n");
2083                return;
2084        }
2085
2086        prom_debug("prom_hold_cpus: start...\n");
2087        prom_debug("    1) spinloop       = 0x%lx\n", (unsigned long)spinloop);
2088        prom_debug("    1) *spinloop      = 0x%lx\n", *spinloop);
2089        prom_debug("    1) acknowledge    = 0x%lx\n",
2090                   (unsigned long)acknowledge);
2091        prom_debug("    1) *acknowledge   = 0x%lx\n", *acknowledge);
2092        prom_debug("    1) secondary_hold = 0x%lx\n", secondary_hold);
2093
2094        /* Set the common spinloop variable, so all of the secondary cpus
2095         * will block when they are awakened from their OF spinloop.
2096         * This must occur for both SMP and non SMP kernels, since OF will
2097         * be trashed when we move the kernel.
2098         */
2099        *spinloop = 0;
2100
2101        /* look for cpus */
2102        for (node = 0; prom_next_node(&node); ) {
2103                unsigned int cpu_no;
2104                __be32 reg;
2105
2106                type[0] = 0;
2107                prom_getprop(node, "device_type", type, sizeof(type));
2108                if (prom_strcmp(type, "cpu") != 0)
2109                        continue;
2110
2111                /* Skip non-configured cpus. */
2112                if (prom_getprop(node, "status", type, sizeof(type)) > 0)
2113                        if (prom_strcmp(type, "okay") != 0)
2114                                continue;
2115
2116                reg = cpu_to_be32(-1); /* make sparse happy */
2117                prom_getprop(node, "reg", &reg, sizeof(reg));
2118                cpu_no = be32_to_cpu(reg);
2119
2120                prom_debug("cpu hw idx   = %u\n", cpu_no);
2121
2122                /* Init the acknowledge var which will be reset by
2123                 * the secondary cpu when it awakens from its OF
2124                 * spinloop.
2125                 */
2126                *acknowledge = (unsigned long)-1;
2127
2128                if (cpu_no != prom.cpu) {
2129                        /* Primary Thread of non-boot cpu or any thread */
2130                        prom_printf("starting cpu hw idx %u... ", cpu_no);
2131                        call_prom("start-cpu", 3, 0, node,
2132                                  secondary_hold, cpu_no);
2133
2134                        for (i = 0; (i < 100000000) && 
2135                             (*acknowledge == ((unsigned long)-1)); i++ )
2136                                mb();
2137
2138                        if (*acknowledge == cpu_no)
2139                                prom_printf("done\n");
2140                        else
2141                                prom_printf("failed: %lx\n", *acknowledge);
2142                }
2143#ifdef CONFIG_SMP
2144                else
2145                        prom_printf("boot cpu hw idx %u\n", cpu_no);
2146#endif /* CONFIG_SMP */
2147        }
2148
2149        prom_debug("prom_hold_cpus: end...\n");
2150}
2151
2152
2153static void __init prom_init_client_services(unsigned long pp)
2154{
2155        /* Get a handle to the prom entry point before anything else */
2156        prom_entry = pp;
2157
2158        /* get a handle for the stdout device */
2159        prom.chosen = call_prom("finddevice", 1, 1, ADDR("/chosen"));
2160        if (!PHANDLE_VALID(prom.chosen))
2161                prom_panic("cannot find chosen"); /* msg won't be printed :( */
2162
2163        /* get device tree root */
2164        prom.root = call_prom("finddevice", 1, 1, ADDR("/"));
2165        if (!PHANDLE_VALID(prom.root))
2166                prom_panic("cannot find device tree root"); /* msg won't be printed :( */
2167
2168        prom.mmumap = 0;
2169}
2170
2171#ifdef CONFIG_PPC32
2172/*
2173 * For really old powermacs, we need to map things we claim.
2174 * For that, we need the ihandle of the mmu.
2175 * Also, on the longtrail, we need to work around other bugs.
2176 */
2177static void __init prom_find_mmu(void)
2178{
2179        phandle oprom;
2180        char version[64];
2181
2182        oprom = call_prom("finddevice", 1, 1, ADDR("/openprom"));
2183        if (!PHANDLE_VALID(oprom))
2184                return;
2185        if (prom_getprop(oprom, "model", version, sizeof(version)) <= 0)
2186                return;
2187        version[sizeof(version) - 1] = 0;
2188        /* XXX might need to add other versions here */
2189        if (prom_strcmp(version, "Open Firmware, 1.0.5") == 0)
2190                of_workarounds = OF_WA_CLAIM;
2191        else if (prom_strncmp(version, "FirmWorks,3.", 12) == 0) {
2192                of_workarounds = OF_WA_CLAIM | OF_WA_LONGTRAIL;
2193                call_prom("interpret", 1, 1, "dev /memory 0 to allow-reclaim");
2194        } else
2195                return;
2196        prom.memory = call_prom("open", 1, 1, ADDR("/memory"));
2197        prom_getprop(prom.chosen, "mmu", &prom.mmumap,
2198                     sizeof(prom.mmumap));
2199        prom.mmumap = be32_to_cpu(prom.mmumap);
2200        if (!IHANDLE_VALID(prom.memory) || !IHANDLE_VALID(prom.mmumap))
2201                of_workarounds &= ~OF_WA_CLAIM;         /* hmmm */
2202}
2203#else
2204#define prom_find_mmu()
2205#endif
2206
2207static void __init prom_init_stdout(void)
2208{
2209        char *path = of_stdout_device;
2210        char type[16];
2211        phandle stdout_node;
2212        __be32 val;
2213
2214        if (prom_getprop(prom.chosen, "stdout", &val, sizeof(val)) <= 0)
2215                prom_panic("cannot find stdout");
2216
2217        prom.stdout = be32_to_cpu(val);
2218
2219        /* Get the full OF pathname of the stdout device */
2220        memset(path, 0, 256);
2221        call_prom("instance-to-path", 3, 1, prom.stdout, path, 255);
2222        prom_printf("OF stdout device is: %s\n", of_stdout_device);
2223        prom_setprop(prom.chosen, "/chosen", "linux,stdout-path",
2224                     path, prom_strlen(path) + 1);
2225
2226        /* instance-to-package fails on PA-Semi */
2227        stdout_node = call_prom("instance-to-package", 1, 1, prom.stdout);
2228        if (stdout_node != PROM_ERROR) {
2229                val = cpu_to_be32(stdout_node);
2230
2231                /* If it's a display, note it */
2232                memset(type, 0, sizeof(type));
2233                prom_getprop(stdout_node, "device_type", type, sizeof(type));
2234                if (prom_strcmp(type, "display") == 0)
2235                        prom_setprop(stdout_node, path, "linux,boot-display", NULL, 0);
2236        }
2237}
2238
2239static int __init prom_find_machine_type(void)
2240{
2241        char compat[256];
2242        int len, i = 0;
2243#ifdef CONFIG_PPC64
2244        phandle rtas;
2245        int x;
2246#endif
2247
2248        /* Look for a PowerMac or a Cell */
2249        len = prom_getprop(prom.root, "compatible",
2250                           compat, sizeof(compat)-1);
2251        if (len > 0) {
2252                compat[len] = 0;
2253                while (i < len) {
2254                        char *p = &compat[i];
2255                        int sl = prom_strlen(p);
2256                        if (sl == 0)
2257                                break;
2258                        if (prom_strstr(p, "Power Macintosh") ||
2259                            prom_strstr(p, "MacRISC"))
2260                                return PLATFORM_POWERMAC;
2261#ifdef CONFIG_PPC64
2262                        /* We must make sure we don't detect the IBM Cell
2263                         * blades as pSeries due to some firmware issues,
2264                         * so we do it here.
2265                         */
2266                        if (prom_strstr(p, "IBM,CBEA") ||
2267                            prom_strstr(p, "IBM,CPBW-1.0"))
2268                                return PLATFORM_GENERIC;
2269#endif /* CONFIG_PPC64 */
2270                        i += sl + 1;
2271                }
2272        }
2273#ifdef CONFIG_PPC64
2274        /* Try to figure out if it's an IBM pSeries or any other
2275         * PAPR compliant platform. We assume it is if :
2276         *  - /device_type is "chrp" (please, do NOT use that for future
2277         *    non-IBM designs !
2278         *  - it has /rtas
2279         */
2280        len = prom_getprop(prom.root, "device_type",
2281                           compat, sizeof(compat)-1);
2282        if (len <= 0)
2283                return PLATFORM_GENERIC;
2284        if (prom_strcmp(compat, "chrp"))
2285                return PLATFORM_GENERIC;
2286
2287        /* Default to pSeries. We need to know if we are running LPAR */
2288        rtas = call_prom("finddevice", 1, 1, ADDR("/rtas"));
2289        if (!PHANDLE_VALID(rtas))
2290                return PLATFORM_GENERIC;
2291        x = prom_getproplen(rtas, "ibm,hypertas-functions");
2292        if (x != PROM_ERROR) {
2293                prom_debug("Hypertas detected, assuming LPAR !\n");
2294                return PLATFORM_PSERIES_LPAR;
2295        }
2296        return PLATFORM_PSERIES;
2297#else
2298        return PLATFORM_GENERIC;
2299#endif
2300}
2301
2302static int __init prom_set_color(ihandle ih, int i, int r, int g, int b)
2303{
2304        return call_prom("call-method", 6, 1, ADDR("color!"), ih, i, b, g, r);
2305}
2306
2307/*
2308 * If we have a display that we don't know how to drive,
2309 * we will want to try to execute OF's open method for it
2310 * later.  However, OF will probably fall over if we do that
2311 * we've taken over the MMU.
2312 * So we check whether we will need to open the display,
2313 * and if so, open it now.
2314 */
2315static void __init prom_check_displays(void)
2316{
2317        char type[16], *path;
2318        phandle node;
2319        ihandle ih;
2320        int i;
2321
2322        static const unsigned char default_colors[] __initconst = {
2323                0x00, 0x00, 0x00,
2324                0x00, 0x00, 0xaa,
2325                0x00, 0xaa, 0x00,
2326                0x00, 0xaa, 0xaa,
2327                0xaa, 0x00, 0x00,
2328                0xaa, 0x00, 0xaa,
2329                0xaa, 0xaa, 0x00,
2330                0xaa, 0xaa, 0xaa,
2331                0x55, 0x55, 0x55,
2332                0x55, 0x55, 0xff,
2333                0x55, 0xff, 0x55,
2334                0x55, 0xff, 0xff,
2335                0xff, 0x55, 0x55,
2336                0xff, 0x55, 0xff,
2337                0xff, 0xff, 0x55,
2338                0xff, 0xff, 0xff
2339        };
2340        const unsigned char *clut;
2341
2342        prom_debug("Looking for displays\n");
2343        for (node = 0; prom_next_node(&node); ) {
2344                memset(type, 0, sizeof(type));
2345                prom_getprop(node, "device_type", type, sizeof(type));
2346                if (prom_strcmp(type, "display") != 0)
2347                        continue;
2348
2349                /* It seems OF doesn't null-terminate the path :-( */
2350                path = prom_scratch;
2351                memset(path, 0, sizeof(prom_scratch));
2352
2353                /*
2354                 * leave some room at the end of the path for appending extra
2355                 * arguments
2356                 */
2357                if (call_prom("package-to-path", 3, 1, node, path,
2358                              sizeof(prom_scratch) - 10) == PROM_ERROR)
2359                        continue;
2360                prom_printf("found display   : %s, opening... ", path);
2361                
2362                ih = call_prom("open", 1, 1, path);
2363                if (ih == 0) {
2364                        prom_printf("failed\n");
2365                        continue;
2366                }
2367
2368                /* Success */
2369                prom_printf("done\n");
2370                prom_setprop(node, path, "linux,opened", NULL, 0);
2371
2372                /* Setup a usable color table when the appropriate
2373                 * method is available. Should update this to set-colors */
2374                clut = default_colors;
2375                for (i = 0; i < 16; i++, clut += 3)
2376                        if (prom_set_color(ih, i, clut[0], clut[1],
2377                                           clut[2]) != 0)
2378                                break;
2379
2380#ifdef CONFIG_LOGO_LINUX_CLUT224
2381                clut = PTRRELOC(logo_linux_clut224.clut);
2382                for (i = 0; i < logo_linux_clut224.clutsize; i++, clut += 3)
2383                        if (prom_set_color(ih, i + 32, clut[0], clut[1],
2384                                           clut[2]) != 0)
2385                                break;
2386#endif /* CONFIG_LOGO_LINUX_CLUT224 */
2387
2388#ifdef CONFIG_PPC_EARLY_DEBUG_BOOTX
2389                if (prom_getprop(node, "linux,boot-display", NULL, 0) !=
2390                    PROM_ERROR) {
2391                        u32 width, height, pitch, addr;
2392
2393                        prom_printf("Setting btext !\n");
2394                        prom_getprop(node, "width", &width, 4);
2395                        prom_getprop(node, "height", &height, 4);
2396                        prom_getprop(node, "linebytes", &pitch, 4);
2397                        prom_getprop(node, "address", &addr, 4);
2398                        prom_printf("W=%d H=%d LB=%d addr=0x%x\n",
2399                                    width, height, pitch, addr);
2400                        btext_setup_display(width, height, 8, pitch, addr);
2401                        btext_prepare_BAT();
2402                }
2403#endif /* CONFIG_PPC_EARLY_DEBUG_BOOTX */
2404        }
2405}
2406
2407
2408/* Return (relocated) pointer to this much memory: moves initrd if reqd. */
2409static void __init *make_room(unsigned long *mem_start, unsigned long *mem_end,
2410                              unsigned long needed, unsigned long align)
2411{
2412        void *ret;
2413
2414        *mem_start = _ALIGN(*mem_start, align);
2415        while ((*mem_start + needed) > *mem_end) {
2416                unsigned long room, chunk;
2417
2418                prom_debug("Chunk exhausted, claiming more at %lx...\n",
2419                           alloc_bottom);
2420                room = alloc_top - alloc_bottom;
2421                if (room > DEVTREE_CHUNK_SIZE)
2422                        room = DEVTREE_CHUNK_SIZE;
2423                if (room < PAGE_SIZE)
2424                        prom_panic("No memory for flatten_device_tree "
2425                                   "(no room)\n");
2426                chunk = alloc_up(room, 0);
2427                if (chunk == 0)
2428                        prom_panic("No memory for flatten_device_tree "
2429                                   "(claim failed)\n");
2430                *mem_end = chunk + room;
2431        }
2432
2433        ret = (void *)*mem_start;
2434        *mem_start += needed;
2435
2436        return ret;
2437}
2438
2439#define dt_push_token(token, mem_start, mem_end) do {                   \
2440                void *room = make_room(mem_start, mem_end, 4, 4);       \
2441                *(__be32 *)room = cpu_to_be32(token);                   \
2442        } while(0)
2443
2444static unsigned long __init dt_find_string(char *str)
2445{
2446        char *s, *os;
2447
2448        s = os = (char *)dt_string_start;
2449        s += 4;
2450        while (s <  (char *)dt_string_end) {
2451                if (prom_strcmp(s, str) == 0)
2452                        return s - os;
2453                s += prom_strlen(s) + 1;
2454        }
2455        return 0;
2456}
2457
2458/*
2459 * The Open Firmware 1275 specification states properties must be 31 bytes or
2460 * less, however not all firmwares obey this. Make it 64 bytes to be safe.
2461 */
2462#define MAX_PROPERTY_NAME 64
2463
2464static void __init scan_dt_build_strings(phandle node,
2465                                         unsigned long *mem_start,
2466                                         unsigned long *mem_end)
2467{
2468        char *prev_name, *namep, *sstart;
2469        unsigned long soff;
2470        phandle child;
2471
2472        sstart =  (char *)dt_string_start;
2473
2474        /* get and store all property names */
2475        prev_name = "";
2476        for (;;) {
2477                /* 64 is max len of name including nul. */
2478                namep = make_room(mem_start, mem_end, MAX_PROPERTY_NAME, 1);
2479                if (call_prom("nextprop", 3, 1, node, prev_name, namep) != 1) {
2480                        /* No more nodes: unwind alloc */
2481                        *mem_start = (unsigned long)namep;
2482                        break;
2483                }
2484
2485                /* skip "name" */
2486                if (prom_strcmp(namep, "name") == 0) {
2487                        *mem_start = (unsigned long)namep;
2488                        prev_name = "name";
2489                        continue;
2490                }
2491                /* get/create string entry */
2492                soff = dt_find_string(namep);
2493                if (soff != 0) {
2494                        *mem_start = (unsigned long)namep;
2495                        namep = sstart + soff;
2496                } else {
2497                        /* Trim off some if we can */
2498                        *mem_start = (unsigned long)namep + prom_strlen(namep) + 1;
2499                        dt_string_end = *mem_start;
2500                }
2501                prev_name = namep;
2502        }
2503
2504        /* do all our children */
2505        child = call_prom("child", 1, 1, node);
2506        while (child != 0) {
2507                scan_dt_build_strings(child, mem_start, mem_end);
2508                child = call_prom("peer", 1, 1, child);
2509        }
2510}
2511
2512static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
2513                                        unsigned long *mem_end)
2514{
2515        phandle child;
2516        char *namep, *prev_name, *sstart, *p, *ep, *lp, *path;
2517        unsigned long soff;
2518        unsigned char *valp;
2519        static char pname[MAX_PROPERTY_NAME] __prombss;
2520        int l, room, has_phandle = 0;
2521
2522        dt_push_token(OF_DT_BEGIN_NODE, mem_start, mem_end);
2523
2524        /* get the node's full name */
2525        namep = (char *)*mem_start;
2526        room = *mem_end - *mem_start;
2527        if (room > 255)
2528                room = 255;
2529        l = call_prom("package-to-path", 3, 1, node, namep, room);
2530        if (l >= 0) {
2531                /* Didn't fit?  Get more room. */
2532                if (l >= room) {
2533                        if (l >= *mem_end - *mem_start)
2534                                namep = make_room(mem_start, mem_end, l+1, 1);
2535                        call_prom("package-to-path", 3, 1, node, namep, l);
2536                }
2537                namep[l] = '\0';
2538
2539                /* Fixup an Apple bug where they have bogus \0 chars in the
2540                 * middle of the path in some properties, and extract
2541                 * the unit name (everything after the last '/').
2542                 */
2543                for (lp = p = namep, ep = namep + l; p < ep; p++) {
2544                        if (*p == '/')
2545                                lp = namep;
2546                        else if (*p != 0)
2547                                *lp++ = *p;
2548                }
2549                *lp = 0;
2550                *mem_start = _ALIGN((unsigned long)lp + 1, 4);
2551        }
2552
2553        /* get it again for debugging */
2554        path = prom_scratch;
2555        memset(path, 0, sizeof(prom_scratch));
2556        call_prom("package-to-path", 3, 1, node, path, sizeof(prom_scratch) - 1);
2557
2558        /* get and store all properties */
2559        prev_name = "";
2560        sstart = (char *)dt_string_start;
2561        for (;;) {
2562                if (call_prom("nextprop", 3, 1, node, prev_name,
2563                              pname) != 1)
2564                        break;
2565
2566                /* skip "name" */
2567                if (prom_strcmp(pname, "name") == 0) {
2568                        prev_name = "name";
2569                        continue;
2570                }
2571
2572                /* find string offset */
2573                soff = dt_find_string(pname);
2574                if (soff == 0) {
2575                        prom_printf("WARNING: Can't find string index for"
2576                                    " <%s>, node %s\n", pname, path);
2577                        break;
2578                }
2579                prev_name = sstart + soff;
2580
2581                /* get length */
2582                l = call_prom("getproplen", 2, 1, node, pname);
2583
2584                /* sanity checks */
2585                if (l == PROM_ERROR)
2586                        continue;
2587
2588                /* push property head */
2589                dt_push_token(OF_DT_PROP, mem_start, mem_end);
2590                dt_push_token(l, mem_start, mem_end);
2591                dt_push_token(soff, mem_start, mem_end);
2592
2593                /* push property content */
2594                valp = make_room(mem_start, mem_end, l, 4);
2595                call_prom("getprop", 4, 1, node, pname, valp, l);
2596                *mem_start = _ALIGN(*mem_start, 4);
2597
2598                if (!prom_strcmp(pname, "phandle"))
2599                        has_phandle = 1;
2600        }
2601
2602        /* Add a "phandle" property if none already exist */
2603        if (!has_phandle) {
2604                soff = dt_find_string("phandle");
2605                if (soff == 0)
2606                        prom_printf("WARNING: Can't find string index for <phandle> node %s\n", path);
2607                else {
2608                        dt_push_token(OF_DT_PROP, mem_start, mem_end);
2609                        dt_push_token(4, mem_start, mem_end);
2610                        dt_push_token(soff, mem_start, mem_end);
2611                        valp = make_room(mem_start, mem_end, 4, 4);
2612                        *(__be32 *)valp = cpu_to_be32(node);
2613                }
2614        }
2615
2616        /* do all our children */
2617        child = call_prom("child", 1, 1, node);
2618        while (child != 0) {
2619                scan_dt_build_struct(child, mem_start, mem_end);
2620                child = call_prom("peer", 1, 1, child);
2621        }
2622
2623        dt_push_token(OF_DT_END_NODE, mem_start, mem_end);
2624}
2625
2626static void __init flatten_device_tree(void)
2627{
2628        phandle root;
2629        unsigned long mem_start, mem_end, room;
2630        struct boot_param_header *hdr;
2631        char *namep;
2632        u64 *rsvmap;
2633
2634        /*
2635         * Check how much room we have between alloc top & bottom (+/- a
2636         * few pages), crop to 1MB, as this is our "chunk" size
2637         */
2638        room = alloc_top - alloc_bottom - 0x4000;
2639        if (room > DEVTREE_CHUNK_SIZE)
2640                room = DEVTREE_CHUNK_SIZE;
2641        prom_debug("starting device tree allocs at %lx\n", alloc_bottom);
2642
2643        /* Now try to claim that */
2644        mem_start = (unsigned long)alloc_up(room, PAGE_SIZE);
2645        if (mem_start == 0)
2646                prom_panic("Can't allocate initial device-tree chunk\n");
2647        mem_end = mem_start + room;
2648
2649        /* Get root of tree */
2650        root = call_prom("peer", 1, 1, (phandle)0);
2651        if (root == (phandle)0)
2652                prom_panic ("couldn't get device tree root\n");
2653
2654        /* Build header and make room for mem rsv map */ 
2655        mem_start = _ALIGN(mem_start, 4);
2656        hdr = make_room(&mem_start, &mem_end,
2657                        sizeof(struct boot_param_header), 4);
2658        dt_header_start = (unsigned long)hdr;
2659        rsvmap = make_room(&mem_start, &mem_end, sizeof(mem_reserve_map), 8);
2660
2661        /* Start of strings */
2662        mem_start = PAGE_ALIGN(mem_start);
2663        dt_string_start = mem_start;
2664        mem_start += 4; /* hole */
2665
2666        /* Add "phandle" in there, we'll need it */
2667        namep = make_room(&mem_start, &mem_end, 16, 1);
2668        prom_strcpy(namep, "phandle");
2669        mem_start = (unsigned long)namep + prom_strlen(namep) + 1;
2670
2671        /* Build string array */
2672        prom_printf("Building dt strings...\n"); 
2673        scan_dt_build_strings(root, &mem_start, &mem_end);
2674        dt_string_end = mem_start;
2675
2676        /* Build structure */
2677        mem_start = PAGE_ALIGN(mem_start);
2678        dt_struct_start = mem_start;
2679        prom_printf("Building dt structure...\n"); 
2680        scan_dt_build_struct(root, &mem_start, &mem_end);
2681        dt_push_token(OF_DT_END, &mem_start, &mem_end);
2682        dt_struct_end = PAGE_ALIGN(mem_start);
2683
2684        /* Finish header */
2685        hdr->boot_cpuid_phys = cpu_to_be32(prom.cpu);
2686        hdr->magic = cpu_to_be32(OF_DT_HEADER);
2687        hdr->totalsize = cpu_to_be32(dt_struct_end - dt_header_start);
2688        hdr->off_dt_struct = cpu_to_be32(dt_struct_start - dt_header_start);
2689        hdr->off_dt_strings = cpu_to_be32(dt_string_start - dt_header_start);
2690        hdr->dt_strings_size = cpu_to_be32(dt_string_end - dt_string_start);
2691        hdr->off_mem_rsvmap = cpu_to_be32(((unsigned long)rsvmap) - dt_header_start);
2692        hdr->version = cpu_to_be32(OF_DT_VERSION);
2693        /* Version 16 is not backward compatible */
2694        hdr->last_comp_version = cpu_to_be32(0x10);
2695
2696        /* Copy the reserve map in */
2697        memcpy(rsvmap, mem_reserve_map, sizeof(mem_reserve_map));
2698
2699#ifdef DEBUG_PROM
2700        {
2701                int i;
2702                prom_printf("reserved memory map:\n");
2703                for (i = 0; i < mem_reserve_cnt; i++)
2704                        prom_printf("  %llx - %llx\n",
2705                                    be64_to_cpu(mem_reserve_map[i].base),
2706                                    be64_to_cpu(mem_reserve_map[i].size));
2707        }
2708#endif
2709        /* Bump mem_reserve_cnt to cause further reservations to fail
2710         * since it's too late.
2711         */
2712        mem_reserve_cnt = MEM_RESERVE_MAP_SIZE;
2713
2714        prom_printf("Device tree strings 0x%lx -> 0x%lx\n",
2715                    dt_string_start, dt_string_end);
2716        prom_printf("Device tree struct  0x%lx -> 0x%lx\n",
2717                    dt_struct_start, dt_struct_end);
2718}
2719
2720#ifdef CONFIG_PPC_MAPLE
2721/* PIBS Version 1.05.0000 04/26/2005 has an incorrect /ht/isa/ranges property.
2722 * The values are bad, and it doesn't even have the right number of cells. */
2723static void __init fixup_device_tree_maple(void)
2724{
2725        phandle isa;
2726        u32 rloc = 0x01002000; /* IO space; PCI device = 4 */
2727        u32 isa_ranges[6];
2728        char *name;
2729
2730        name = "/ht@0/isa@4";
2731        isa = call_prom("finddevice", 1, 1, ADDR(name));
2732        if (!PHANDLE_VALID(isa)) {
2733                name = "/ht@0/isa@6";
2734                isa = call_prom("finddevice", 1, 1, ADDR(name));
2735                rloc = 0x01003000; /* IO space; PCI device = 6 */
2736        }
2737        if (!PHANDLE_VALID(isa))
2738                return;
2739
2740        if (prom_getproplen(isa, "ranges") != 12)
2741                return;
2742        if (prom_getprop(isa, "ranges", isa_ranges, sizeof(isa_ranges))
2743                == PROM_ERROR)
2744                return;
2745
2746        if (isa_ranges[0] != 0x1 ||
2747                isa_ranges[1] != 0xf4000000 ||
2748                isa_ranges[2] != 0x00010000)
2749                return;
2750
2751        prom_printf("Fixing up bogus ISA range on Maple/Apache...\n");
2752
2753        isa_ranges[0] = 0x1;
2754        isa_ranges[1] = 0x0;
2755        isa_ranges[2] = rloc;
2756        isa_ranges[3] = 0x0;
2757        isa_ranges[4] = 0x0;
2758        isa_ranges[5] = 0x00010000;
2759        prom_setprop(isa, name, "ranges",
2760                        isa_ranges, sizeof(isa_ranges));
2761}
2762
2763#define CPC925_MC_START         0xf8000000
2764#define CPC925_MC_LENGTH        0x1000000
2765/* The values for memory-controller don't have right number of cells */
2766static void __init fixup_device_tree_maple_memory_controller(void)
2767{
2768        phandle mc;
2769        u32 mc_reg[4];
2770        char *name = "/hostbridge@f8000000";
2771        u32 ac, sc;
2772
2773        mc = call_prom("finddevice", 1, 1, ADDR(name));
2774        if (!PHANDLE_VALID(mc))
2775                return;
2776
2777        if (prom_getproplen(mc, "reg") != 8)
2778                return;
2779
2780        prom_getprop(prom.root, "#address-cells", &ac, sizeof(ac));
2781        prom_getprop(prom.root, "#size-cells", &sc, sizeof(sc));
2782        if ((ac != 2) || (sc != 2))
2783                return;
2784
2785        if (prom_getprop(mc, "reg", mc_reg, sizeof(mc_reg)) == PROM_ERROR)
2786                return;
2787
2788        if (mc_reg[0] != CPC925_MC_START || mc_reg[1] != CPC925_MC_LENGTH)
2789                return;
2790
2791        prom_printf("Fixing up bogus hostbridge on Maple...\n");
2792
2793        mc_reg[0] = 0x0;
2794        mc_reg[1] = CPC925_MC_START;
2795        mc_reg[2] = 0x0;
2796        mc_reg[3] = CPC925_MC_LENGTH;
2797        prom_setprop(mc, name, "reg", mc_reg, sizeof(mc_reg));
2798}
2799#else
2800#define fixup_device_tree_maple()
2801#define fixup_device_tree_maple_memory_controller()
2802#endif
2803
2804#ifdef CONFIG_PPC_CHRP
2805/*
2806 * Pegasos and BriQ lacks the "ranges" property in the isa node
2807 * Pegasos needs decimal IRQ 14/15, not hexadecimal
2808 * Pegasos has the IDE configured in legacy mode, but advertised as native
2809 */
2810static void __init fixup_device_tree_chrp(void)
2811{
2812        phandle ph;
2813        u32 prop[6];
2814        u32 rloc = 0x01006000; /* IO space; PCI device = 12 */
2815        char *name;
2816        int rc;
2817
2818        name = "/pci@80000000/isa@c";
2819        ph = call_prom("finddevice", 1, 1, ADDR(name));
2820        if (!PHANDLE_VALID(ph)) {
2821                name = "/pci@ff500000/isa@6";
2822                ph = call_prom("finddevice", 1, 1, ADDR(name));
2823                rloc = 0x01003000; /* IO space; PCI device = 6 */
2824        }
2825        if (PHANDLE_VALID(ph)) {
2826                rc = prom_getproplen(ph, "ranges");
2827                if (rc == 0 || rc == PROM_ERROR) {
2828                        prom_printf("Fixing up missing ISA range on Pegasos...\n");
2829
2830                        prop[0] = 0x1;
2831                        prop[1] = 0x0;
2832                        prop[2] = rloc;
2833                        prop[3] = 0x0;
2834                        prop[4] = 0x0;
2835                        prop[5] = 0x00010000;
2836                        prom_setprop(ph, name, "ranges", prop, sizeof(prop));
2837                }
2838        }
2839
2840        name = "/pci@80000000/ide@C,1";
2841        ph = call_prom("finddevice", 1, 1, ADDR(name));
2842        if (PHANDLE_VALID(ph)) {
2843                prom_printf("Fixing up IDE interrupt on Pegasos...\n");
2844                prop[0] = 14;
2845                prop[1] = 0x0;
2846                prom_setprop(ph, name, "interrupts", prop, 2*sizeof(u32));
2847                prom_printf("Fixing up IDE class-code on Pegasos...\n");
2848                rc = prom_getprop(ph, "class-code", prop, sizeof(u32));
2849                if (rc == sizeof(u32)) {
2850                        prop[0] &= ~0x5;
2851                        prom_setprop(ph, name, "class-code", prop, sizeof(u32));
2852                }
2853        }
2854}
2855#else
2856#define fixup_device_tree_chrp()
2857#endif
2858
2859#if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC)
2860static void __init fixup_device_tree_pmac(void)
2861{
2862        phandle u3, i2c, mpic;
2863        u32 u3_rev;
2864        u32 interrupts[2];
2865        u32 parent;
2866
2867        /* Some G5s have a missing interrupt definition, fix it up here */
2868        u3 = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000"));
2869        if (!PHANDLE_VALID(u3))
2870                return;
2871        i2c = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/i2c@f8001000"));
2872        if (!PHANDLE_VALID(i2c))
2873                return;
2874        mpic = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/mpic@f8040000"));
2875        if (!PHANDLE_VALID(mpic))
2876                return;
2877
2878        /* check if proper rev of u3 */
2879        if (prom_getprop(u3, "device-rev", &u3_rev, sizeof(u3_rev))
2880            == PROM_ERROR)
2881                return;
2882        if (u3_rev < 0x35 || u3_rev > 0x39)
2883                return;
2884        /* does it need fixup ? */
2885        if (prom_getproplen(i2c, "interrupts") > 0)
2886                return;
2887
2888        prom_printf("fixing up bogus interrupts for u3 i2c...\n");
2889
2890        /* interrupt on this revision of u3 is number 0 and level */
2891        interrupts[0] = 0;
2892        interrupts[1] = 1;
2893        prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupts",
2894                     &interrupts, sizeof(interrupts));
2895        parent = (u32)mpic;
2896        prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupt-parent",
2897                     &parent, sizeof(parent));
2898}
2899#else
2900#define fixup_device_tree_pmac()
2901#endif
2902
2903#ifdef CONFIG_PPC_EFIKA
2904/*
2905 * The MPC5200 FEC driver requires an phy-handle property to tell it how
2906 * to talk to the phy.  If the phy-handle property is missing, then this
2907 * function is called to add the appropriate nodes and link it to the
2908 * ethernet node.
2909 */
2910static void __init fixup_device_tree_efika_add_phy(void)
2911{
2912        u32 node;
2913        char prop[64];
2914        int rv;
2915
2916        /* Check if /builtin/ethernet exists - bail if it doesn't */
2917        node = call_prom("finddevice", 1, 1, ADDR("/builtin/ethernet"));
2918        if (!PHANDLE_VALID(node))
2919                return;
2920
2921        /* Check if the phy-handle property exists - bail if it does */
2922        rv = prom_getprop(node, "phy-handle", prop, sizeof(prop));
2923        if (!rv)
2924                return;
2925
2926        /*
2927         * At this point the ethernet device doesn't have a phy described.
2928         * Now we need to add the missing phy node and linkage
2929         */
2930
2931        /* Check for an MDIO bus node - if missing then create one */
2932        node = call_prom("finddevice", 1, 1, ADDR("/builtin/mdio"));
2933        if (!PHANDLE_VALID(node)) {
2934                prom_printf("Adding Ethernet MDIO node\n");
2935                call_prom("interpret", 1, 1,
2936                        " s\" /builtin\" find-device"
2937                        " new-device"
2938                                " 1 encode-int s\" #address-cells\" property"
2939                                " 0 encode-int s\" #size-cells\" property"
2940                                " s\" mdio\" device-name"
2941                                " s\" fsl,mpc5200b-mdio\" encode-string"
2942                                " s\" compatible\" property"
2943                                " 0xf0003000 0x400 reg"
2944                                " 0x2 encode-int"
2945                                " 0x5 encode-int encode+"
2946                                " 0x3 encode-int encode+"
2947                                " s\" interrupts\" property"
2948                        " finish-device");
2949        };
2950
2951        /* Check for a PHY device node - if missing then create one and
2952         * give it's phandle to the ethernet node */
2953        node = call_prom("finddevice", 1, 1,
2954                         ADDR("/builtin/mdio/ethernet-phy"));
2955        if (!PHANDLE_VALID(node)) {
2956                prom_printf("Adding Ethernet PHY node\n");
2957                call_prom("interpret", 1, 1,
2958                        " s\" /builtin/mdio\" find-device"
2959                        " new-device"
2960                                " s\" ethernet-phy\" device-name"
2961                                " 0x10 encode-int s\" reg\" property"
2962                                " my-self"
2963                                " ihandle>phandle"
2964                        " finish-device"
2965                        " s\" /builtin/ethernet\" find-device"
2966                                " encode-int"
2967                                " s\" phy-handle\" property"
2968                        " device-end");
2969        }
2970}
2971
2972static void __init fixup_device_tree_efika(void)
2973{
2974        int sound_irq[3] = { 2, 2, 0 };
2975        int bcomm_irq[3*16] = { 3,0,0, 3,1,0, 3,2,0, 3,3,0,
2976                                3,4,0, 3,5,0, 3,6,0, 3,7,0,
2977                                3,8,0, 3,9,0, 3,10,0, 3,11,0,
2978                                3,12,0, 3,13,0, 3,14,0, 3,15,0 };
2979        u32 node;
2980        char prop[64];
2981        int rv, len;
2982
2983        /* Check if we're really running on a EFIKA */
2984        node = call_prom("finddevice", 1, 1, ADDR("/"));
2985        if (!PHANDLE_VALID(node))
2986                return;
2987
2988        rv = prom_getprop(node, "model", prop, sizeof(prop));
2989        if (rv == PROM_ERROR)
2990                return;
2991        if (prom_strcmp(prop, "EFIKA5K2"))
2992                return;
2993
2994        prom_printf("Applying EFIKA device tree fixups\n");
2995
2996        /* Claiming to be 'chrp' is death */
2997        node = call_prom("finddevice", 1, 1, ADDR("/"));
2998        rv = prom_getprop(node, "device_type", prop, sizeof(prop));
2999        if (rv != PROM_ERROR && (prom_strcmp(prop, "chrp") == 0))
3000                prom_setprop(node, "/", "device_type", "efika", sizeof("efika"));
3001
3002        /* CODEGEN,description is exposed in /proc/cpuinfo so
3003           fix that too */
3004        rv = prom_getprop(node, "CODEGEN,description", prop, sizeof(prop));
3005        if (rv != PROM_ERROR && (prom_strstr(prop, "CHRP")))
3006                prom_setprop(node, "/", "CODEGEN,description",
3007                             "Efika 5200B PowerPC System",
3008                             sizeof("Efika 5200B PowerPC System"));
3009
3010        /* Fixup bestcomm interrupts property */
3011        node = call_prom("finddevice", 1, 1, ADDR("/builtin/bestcomm"));
3012        if (PHANDLE_VALID(node)) {
3013                len = prom_getproplen(node, "interrupts");
3014                if (len == 12) {
3015                        prom_printf("Fixing bestcomm interrupts property\n");
3016                        prom_setprop(node, "/builtin/bestcom", "interrupts",
3017                                     bcomm_irq, sizeof(bcomm_irq));
3018                }
3019        }
3020
3021        /* Fixup sound interrupts property */
3022        node = call_prom("finddevice", 1, 1, ADDR("/builtin/sound"));
3023        if (PHANDLE_VALID(node)) {
3024                rv = prom_getprop(node, "interrupts", prop, sizeof(prop));
3025                if (rv == PROM_ERROR) {
3026                        prom_printf("Adding sound interrupts property\n");
3027                        prom_setprop(node, "/builtin/sound", "interrupts",
3028                                     sound_irq, sizeof(sound_irq));
3029                }
3030        }
3031
3032        /* Make sure ethernet phy-handle property exists */
3033        fixup_device_tree_efika_add_phy();
3034}
3035#else
3036#define fixup_device_tree_efika()
3037#endif
3038
3039#ifdef CONFIG_PPC_PASEMI_NEMO
3040/*
3041 * CFE supplied on Nemo is broken in several ways, biggest
3042 * problem is that it reassigns ISA interrupts to unused mpic ints.
3043 * Add an interrupt-controller property for the io-bridge to use
3044 * and correct the ints so we can attach them to an irq_domain
3045 */
3046static void __init fixup_device_tree_pasemi(void)
3047{
3048        u32 interrupts[2], parent, rval, val = 0;
3049        char *name, *pci_name;
3050        phandle iob, node;
3051
3052        /* Find the root pci node */
3053        name = "/pxp@0,e0000000";
3054        iob = call_prom("finddevice", 1, 1, ADDR(name));
3055        if (!PHANDLE_VALID(iob))
3056                return;
3057
3058        /* check if interrupt-controller node set yet */
3059        if (prom_getproplen(iob, "interrupt-controller") !=PROM_ERROR)
3060                return;
3061
3062        prom_printf("adding interrupt-controller property for SB600...\n");
3063
3064        prom_setprop(iob, name, "interrupt-controller", &val, 0);
3065
3066        pci_name = "/pxp@0,e0000000/pci@11";
3067        node = call_prom("finddevice", 1, 1, ADDR(pci_name));
3068        parent = ADDR(iob);
3069
3070        for( ; prom_next_node(&node); ) {
3071                /* scan each node for one with an interrupt */
3072                if (!PHANDLE_VALID(node))
3073                        continue;
3074
3075                rval = prom_getproplen(node, "interrupts");
3076                if (rval == 0 || rval == PROM_ERROR)
3077                        continue;
3078
3079                prom_getprop(node, "interrupts", &interrupts, sizeof(interrupts));
3080                if ((interrupts[0] < 212) || (interrupts[0] > 222))
3081                        continue;
3082
3083                /* found a node, update both interrupts and interrupt-parent */
3084                if ((interrupts[0] >= 212) && (interrupts[0] <= 215))
3085                        interrupts[0] -= 203;
3086                if ((interrupts[0] >= 216) && (interrupts[0] <= 220))
3087                        interrupts[0] -= 213;
3088                if (interrupts[0] == 221)
3089                        interrupts[0] = 14;
3090                if (interrupts[0] == 222)
3091                        interrupts[0] = 8;
3092
3093                prom_setprop(node, pci_name, "interrupts", interrupts,
3094                                        sizeof(interrupts));
3095                prom_setprop(node, pci_name, "interrupt-parent", &parent,
3096                                        sizeof(parent));
3097        }
3098
3099        /*
3100         * The io-bridge has device_type set to 'io-bridge' change it to 'isa'
3101         * so that generic isa-bridge code can add the SB600 and its on-board
3102         * peripherals.
3103         */
3104        name = "/pxp@0,e0000000/io-bridge@0";
3105        iob = call_prom("finddevice", 1, 1, ADDR(name));
3106        if (!PHANDLE_VALID(iob))
3107                return;
3108
3109        /* device_type is already set, just change it. */
3110
3111        prom_printf("Changing device_type of SB600 node...\n");
3112
3113        prom_setprop(iob, name, "device_type", "isa", sizeof("isa"));
3114}
3115#else   /* !CONFIG_PPC_PASEMI_NEMO */
3116static inline void fixup_device_tree_pasemi(void) { }
3117#endif
3118
3119static void __init fixup_device_tree(void)
3120{
3121        fixup_device_tree_maple();
3122        fixup_device_tree_maple_memory_controller();
3123        fixup_device_tree_chrp();
3124        fixup_device_tree_pmac();
3125        fixup_device_tree_efika();
3126        fixup_device_tree_pasemi();
3127}
3128
3129static void __init prom_find_boot_cpu(void)
3130{
3131        __be32 rval;
3132        ihandle prom_cpu;
3133        phandle cpu_pkg;
3134
3135        rval = 0;
3136        if (prom_getprop(prom.chosen, "cpu", &rval, sizeof(rval)) <= 0)
3137                return;
3138        prom_cpu = be32_to_cpu(rval);
3139
3140        cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu);
3141
3142        if (!PHANDLE_VALID(cpu_pkg))
3143                return;
3144
3145        prom_getprop(cpu_pkg, "reg", &rval, sizeof(rval));
3146        prom.cpu = be32_to_cpu(rval);
3147
3148        prom_debug("Booting CPU hw index = %d\n", prom.cpu);
3149}
3150
3151static void __init prom_check_initrd(unsigned long r3, unsigned long r4)
3152{
3153#ifdef CONFIG_BLK_DEV_INITRD
3154        if (r3 && r4 && r4 != 0xdeadbeef) {
3155                __be64 val;
3156
3157                prom_initrd_start = is_kernel_addr(r3) ? __pa(r3) : r3;
3158                prom_initrd_end = prom_initrd_start + r4;
3159
3160                val = cpu_to_be64(prom_initrd_start);
3161                prom_setprop(prom.chosen, "/chosen", "linux,initrd-start",
3162                             &val, sizeof(val));
3163                val = cpu_to_be64(prom_initrd_end);
3164                prom_setprop(prom.chosen, "/chosen", "linux,initrd-end",
3165                             &val, sizeof(val));
3166
3167                reserve_mem(prom_initrd_start,
3168                            prom_initrd_end - prom_initrd_start);
3169
3170                prom_debug("initrd_start=0x%lx\n", prom_initrd_start);
3171                prom_debug("initrd_end=0x%lx\n", prom_initrd_end);
3172        }
3173#endif /* CONFIG_BLK_DEV_INITRD */
3174}
3175
3176#ifdef CONFIG_PPC64
3177#ifdef CONFIG_RELOCATABLE
3178static void reloc_toc(void)
3179{
3180}
3181
3182static void unreloc_toc(void)
3183{
3184}
3185#else
3186static void __reloc_toc(unsigned long offset, unsigned long nr_entries)
3187{
3188        unsigned long i;
3189        unsigned long *toc_entry;
3190
3191        /* Get the start of the TOC by using r2 directly. */
3192        asm volatile("addi %0,2,-0x8000" : "=b" (toc_entry));
3193
3194        for (i = 0; i < nr_entries; i++) {
3195                *toc_entry = *toc_entry + offset;
3196                toc_entry++;
3197        }
3198}
3199
3200static void reloc_toc(void)
3201{
3202        unsigned long offset = reloc_offset();
3203        unsigned long nr_entries =
3204                (__prom_init_toc_end - __prom_init_toc_start) / sizeof(long);
3205
3206        __reloc_toc(offset, nr_entries);
3207
3208        mb();
3209}
3210
3211static void unreloc_toc(void)
3212{
3213        unsigned long offset = reloc_offset();
3214        unsigned long nr_entries =
3215                (__prom_init_toc_end - __prom_init_toc_start) / sizeof(long);
3216
3217        mb();
3218
3219        __reloc_toc(-offset, nr_entries);
3220}
3221#endif
3222#endif
3223
3224#ifdef CONFIG_PPC_SVM
3225/*
3226 * Perform the Enter Secure Mode ultracall.
3227 */
3228static int enter_secure_mode(unsigned long kbase, unsigned long fdt)
3229{
3230        register unsigned long r3 asm("r3") = UV_ESM;
3231        register unsigned long r4 asm("r4") = kbase;
3232        register unsigned long r5 asm("r5") = fdt;
3233
3234        asm volatile("sc 2" : "+r"(r3) : "r"(r4), "r"(r5));
3235
3236        return r3;
3237}
3238
3239/*
3240 * Call the Ultravisor to transfer us to secure memory if we have an ESM blob.
3241 */
3242static void setup_secure_guest(unsigned long kbase, unsigned long fdt)
3243{
3244        int ret;
3245
3246        if (!prom_svm_enable)
3247                return;
3248
3249        /* Switch to secure mode. */
3250        prom_printf("Switching to secure mode.\n");
3251
3252        /*
3253         * The ultravisor will do an integrity check of the kernel image but we
3254         * relocated it so the check will fail. Restore the original image by
3255         * relocating it back to the kernel virtual base address.
3256         */
3257        if (IS_ENABLED(CONFIG_RELOCATABLE))
3258                relocate(KERNELBASE);
3259
3260        ret = enter_secure_mode(kbase, fdt);
3261
3262        /* Relocate the kernel again. */
3263        if (IS_ENABLED(CONFIG_RELOCATABLE))
3264                relocate(kbase);
3265
3266        if (ret != U_SUCCESS) {
3267                prom_printf("Returned %d from switching to secure mode.\n", ret);
3268                prom_rtas_os_term("Switch to secure mode failed.\n");
3269        }
3270}
3271#else
3272static void setup_secure_guest(unsigned long kbase, unsigned long fdt)
3273{
3274}
3275#endif /* CONFIG_PPC_SVM */
3276
3277/*
3278 * We enter here early on, when the Open Firmware prom is still
3279 * handling exceptions and the MMU hash table for us.
3280 */
3281
3282unsigned long __init prom_init(unsigned long r3, unsigned long r4,
3283                               unsigned long pp,
3284                               unsigned long r6, unsigned long r7,
3285                               unsigned long kbase)
3286{       
3287        unsigned long hdr;
3288
3289#ifdef CONFIG_PPC32
3290        unsigned long offset = reloc_offset();
3291        reloc_got2(offset);
3292#else
3293        reloc_toc();
3294#endif
3295
3296        /*
3297         * First zero the BSS
3298         */
3299        memset(&__bss_start, 0, __bss_stop - __bss_start);
3300
3301        /*
3302         * Init interface to Open Firmware, get some node references,
3303         * like /chosen
3304         */
3305        prom_init_client_services(pp);
3306
3307        /*
3308         * See if this OF is old enough that we need to do explicit maps
3309         * and other workarounds
3310         */
3311        prom_find_mmu();
3312
3313        /*
3314         * Init prom stdout device
3315         */
3316        prom_init_stdout();
3317
3318        prom_printf("Preparing to boot %s", linux_banner);
3319
3320        /*
3321         * Get default machine type. At this point, we do not differentiate
3322         * between pSeries SMP and pSeries LPAR
3323         */
3324        of_platform = prom_find_machine_type();
3325        prom_printf("Detected machine type: %x\n", of_platform);
3326
3327#ifndef CONFIG_NONSTATIC_KERNEL
3328        /* Bail if this is a kdump kernel. */
3329        if (PHYSICAL_START > 0)
3330                prom_panic("Error: You can't boot a kdump kernel from OF!\n");
3331#endif
3332
3333        /*
3334         * Check for an initrd
3335         */
3336        prom_check_initrd(r3, r4);
3337
3338        /*
3339         * Do early parsing of command line
3340         */
3341        early_cmdline_parse();
3342
3343#ifdef CONFIG_PPC_PSERIES
3344        /*
3345         * On pSeries, inform the firmware about our capabilities
3346         */
3347        if (of_platform == PLATFORM_PSERIES ||
3348            of_platform == PLATFORM_PSERIES_LPAR)
3349                prom_send_capabilities();
3350#endif
3351
3352        /*
3353         * Copy the CPU hold code
3354         */
3355        if (of_platform != PLATFORM_POWERMAC)
3356                copy_and_flush(0, kbase, 0x100, 0);
3357
3358        /*
3359         * Initialize memory management within prom_init
3360         */
3361        prom_init_mem();
3362
3363        /*
3364         * Determine which cpu is actually running right _now_
3365         */
3366        prom_find_boot_cpu();
3367
3368        /* 
3369         * Initialize display devices
3370         */
3371        prom_check_displays();
3372
3373#if defined(CONFIG_PPC64) && defined(__BIG_ENDIAN__)
3374        /*
3375         * Initialize IOMMU (TCE tables) on pSeries. Do that before anything else
3376         * that uses the allocator, we need to make sure we get the top of memory
3377         * available for us here...
3378         */
3379        if (of_platform == PLATFORM_PSERIES)
3380                prom_initialize_tce_table();
3381#endif
3382
3383        /*
3384         * On non-powermacs, try to instantiate RTAS. PowerMacs don't
3385         * have a usable RTAS implementation.
3386         */
3387        if (of_platform != PLATFORM_POWERMAC)
3388                prom_instantiate_rtas();
3389
3390#ifdef CONFIG_PPC64
3391        /* instantiate sml */
3392        prom_instantiate_sml();
3393#endif
3394
3395        /*
3396         * On non-powermacs, put all CPUs in spin-loops.
3397         *
3398         * PowerMacs use a different mechanism to spin CPUs
3399         *
3400         * (This must be done after instanciating RTAS)
3401         */
3402        if (of_platform != PLATFORM_POWERMAC)
3403                prom_hold_cpus();
3404
3405        /*
3406         * Fill in some infos for use by the kernel later on
3407         */
3408        if (prom_memory_limit) {
3409                __be64 val = cpu_to_be64(prom_memory_limit);
3410                prom_setprop(prom.chosen, "/chosen", "linux,memory-limit",
3411                             &val, sizeof(val));
3412        }
3413#ifdef CONFIG_PPC64
3414        if (prom_iommu_off)
3415                prom_setprop(prom.chosen, "/chosen", "linux,iommu-off",
3416                             NULL, 0);
3417
3418        if (prom_iommu_force_on)
3419                prom_setprop(prom.chosen, "/chosen", "linux,iommu-force-on",
3420                             NULL, 0);
3421
3422        if (prom_tce_alloc_start) {
3423                prom_setprop(prom.chosen, "/chosen", "linux,tce-alloc-start",
3424                             &prom_tce_alloc_start,
3425                             sizeof(prom_tce_alloc_start));
3426                prom_setprop(prom.chosen, "/chosen", "linux,tce-alloc-end",
3427                             &prom_tce_alloc_end,
3428                             sizeof(prom_tce_alloc_end));
3429        }
3430#endif
3431
3432        /*
3433         * Fixup any known bugs in the device-tree
3434         */
3435        fixup_device_tree();
3436
3437        /*
3438         * Now finally create the flattened device-tree
3439         */
3440        prom_printf("copying OF device tree...\n");
3441        flatten_device_tree();
3442
3443        /*
3444         * in case stdin is USB and still active on IBM machines...
3445         * Unfortunately quiesce crashes on some powermacs if we have
3446         * closed stdin already (in particular the powerbook 101).
3447         */
3448        if (of_platform != PLATFORM_POWERMAC)
3449                prom_close_stdin();
3450
3451        /*
3452         * Call OF "quiesce" method to shut down pending DMA's from
3453         * devices etc...
3454         */
3455        prom_printf("Quiescing Open Firmware ...\n");
3456        call_prom("quiesce", 0, 0);
3457
3458        /*
3459         * And finally, call the kernel passing it the flattened device
3460         * tree and NULL as r5, thus triggering the new entry point which
3461         * is common to us and kexec
3462         */
3463        hdr = dt_header_start;
3464
3465        /* Don't print anything after quiesce under OPAL, it crashes OFW */
3466        prom_printf("Booting Linux via __start() @ 0x%lx ...\n", kbase);
3467        prom_debug("->dt_header_start=0x%lx\n", hdr);
3468
3469#ifdef CONFIG_PPC32
3470        reloc_got2(-offset);
3471#else
3472        unreloc_toc();
3473#endif
3474
3475        /* Move to secure memory if we're supposed to be secure guests. */
3476        setup_secure_guest(kbase, hdr);
3477
3478        __start(hdr, kbase, 0, 0, 0, 0, 0);
3479
3480        return 0;
3481}
3482