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