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