linux/arch/powerpc/platforms/pseries/setup.c
<<
>>
Prefs
   1/*
   2 *  64-bit pSeries and RS/6000 setup code.
   3 *
   4 *  Copyright (C) 1995  Linus Torvalds
   5 *  Adapted from 'alpha' version by Gary Thomas
   6 *  Modified by Cort Dougan (cort@cs.nmt.edu)
   7 *  Modified by PPC64 Team, IBM Corp
   8 *
   9 * This program is free software; you can redistribute it and/or
  10 * modify it under the terms of the GNU General Public License
  11 * as published by the Free Software Foundation; either version
  12 * 2 of the License, or (at your option) any later version.
  13 */
  14
  15/*
  16 * bootup setup stuff..
  17 */
  18
  19#include <linux/cpu.h>
  20#include <linux/errno.h>
  21#include <linux/sched.h>
  22#include <linux/kernel.h>
  23#include <linux/mm.h>
  24#include <linux/stddef.h>
  25#include <linux/unistd.h>
  26#include <linux/user.h>
  27#include <linux/tty.h>
  28#include <linux/major.h>
  29#include <linux/interrupt.h>
  30#include <linux/reboot.h>
  31#include <linux/init.h>
  32#include <linux/ioport.h>
  33#include <linux/console.h>
  34#include <linux/pci.h>
  35#include <linux/utsname.h>
  36#include <linux/adb.h>
  37#include <linux/export.h>
  38#include <linux/delay.h>
  39#include <linux/irq.h>
  40#include <linux/seq_file.h>
  41#include <linux/root_dev.h>
  42#include <linux/of.h>
  43#include <linux/kexec.h>
  44
  45#include <asm/mmu.h>
  46#include <asm/processor.h>
  47#include <asm/io.h>
  48#include <asm/pgtable.h>
  49#include <asm/prom.h>
  50#include <asm/rtas.h>
  51#include <asm/pci-bridge.h>
  52#include <asm/iommu.h>
  53#include <asm/dma.h>
  54#include <asm/machdep.h>
  55#include <asm/irq.h>
  56#include <asm/time.h>
  57#include <asm/nvram.h>
  58#include <asm/pmc.h>
  59#include <asm/mpic.h>
  60#include <asm/xics.h>
  61#include <asm/ppc-pci.h>
  62#include <asm/i8259.h>
  63#include <asm/udbg.h>
  64#include <asm/smp.h>
  65#include <asm/firmware.h>
  66#include <asm/eeh.h>
  67#include <asm/reg.h>
  68#include <asm/plpar_wrappers.h>
  69
  70#include "pseries.h"
  71
  72int CMO_PrPSP = -1;
  73int CMO_SecPSP = -1;
  74unsigned long CMO_PageSize = (ASM_CONST(1) << IOMMU_PAGE_SHIFT_4K);
  75EXPORT_SYMBOL(CMO_PageSize);
  76
  77int fwnmi_active;  /* TRUE if an FWNMI handler is present */
  78
  79static struct device_node *pSeries_mpic_node;
  80
  81static void pSeries_show_cpuinfo(struct seq_file *m)
  82{
  83        struct device_node *root;
  84        const char *model = "";
  85
  86        root = of_find_node_by_path("/");
  87        if (root)
  88                model = of_get_property(root, "model", NULL);
  89        seq_printf(m, "machine\t\t: CHRP %s\n", model);
  90        of_node_put(root);
  91}
  92
  93/* Initialize firmware assisted non-maskable interrupts if
  94 * the firmware supports this feature.
  95 */
  96static void __init fwnmi_init(void)
  97{
  98        unsigned long system_reset_addr, machine_check_addr;
  99
 100        int ibm_nmi_register = rtas_token("ibm,nmi-register");
 101        if (ibm_nmi_register == RTAS_UNKNOWN_SERVICE)
 102                return;
 103
 104        /* If the kernel's not linked at zero we point the firmware at low
 105         * addresses anyway, and use a trampoline to get to the real code. */
 106        system_reset_addr  = __pa(system_reset_fwnmi) - PHYSICAL_START;
 107        machine_check_addr = __pa(machine_check_fwnmi) - PHYSICAL_START;
 108
 109        if (0 == rtas_call(ibm_nmi_register, 2, 1, NULL, system_reset_addr,
 110                                machine_check_addr))
 111                fwnmi_active = 1;
 112}
 113
 114static void pseries_8259_cascade(unsigned int irq, struct irq_desc *desc)
 115{
 116        struct irq_chip *chip = irq_desc_get_chip(desc);
 117        unsigned int cascade_irq = i8259_irq();
 118
 119        if (cascade_irq != NO_IRQ)
 120                generic_handle_irq(cascade_irq);
 121
 122        chip->irq_eoi(&desc->irq_data);
 123}
 124
 125static void __init pseries_setup_i8259_cascade(void)
 126{
 127        struct device_node *np, *old, *found = NULL;
 128        unsigned int cascade;
 129        const u32 *addrp;
 130        unsigned long intack = 0;
 131        int naddr;
 132
 133        for_each_node_by_type(np, "interrupt-controller") {
 134                if (of_device_is_compatible(np, "chrp,iic")) {
 135                        found = np;
 136                        break;
 137                }
 138        }
 139
 140        if (found == NULL) {
 141                printk(KERN_DEBUG "pic: no ISA interrupt controller\n");
 142                return;
 143        }
 144
 145        cascade = irq_of_parse_and_map(found, 0);
 146        if (cascade == NO_IRQ) {
 147                printk(KERN_ERR "pic: failed to map cascade interrupt");
 148                return;
 149        }
 150        pr_debug("pic: cascade mapped to irq %d\n", cascade);
 151
 152        for (old = of_node_get(found); old != NULL ; old = np) {
 153                np = of_get_parent(old);
 154                of_node_put(old);
 155                if (np == NULL)
 156                        break;
 157                if (strcmp(np->name, "pci") != 0)
 158                        continue;
 159                addrp = of_get_property(np, "8259-interrupt-acknowledge", NULL);
 160                if (addrp == NULL)
 161                        continue;
 162                naddr = of_n_addr_cells(np);
 163                intack = addrp[naddr-1];
 164                if (naddr > 1)
 165                        intack |= ((unsigned long)addrp[naddr-2]) << 32;
 166        }
 167        if (intack)
 168                printk(KERN_DEBUG "pic: PCI 8259 intack at 0x%016lx\n", intack);
 169        i8259_init(found, intack);
 170        of_node_put(found);
 171        irq_set_chained_handler(cascade, pseries_8259_cascade);
 172}
 173
 174static void __init pseries_mpic_init_IRQ(void)
 175{
 176        struct device_node *np;
 177        const unsigned int *opprop;
 178        unsigned long openpic_addr = 0;
 179        int naddr, n, i, opplen;
 180        struct mpic *mpic;
 181
 182        np = of_find_node_by_path("/");
 183        naddr = of_n_addr_cells(np);
 184        opprop = of_get_property(np, "platform-open-pic", &opplen);
 185        if (opprop != NULL) {
 186                openpic_addr = of_read_number(opprop, naddr);
 187                printk(KERN_DEBUG "OpenPIC addr: %lx\n", openpic_addr);
 188        }
 189        of_node_put(np);
 190
 191        BUG_ON(openpic_addr == 0);
 192
 193        /* Setup the openpic driver */
 194        mpic = mpic_alloc(pSeries_mpic_node, openpic_addr,
 195                        MPIC_NO_RESET, 16, 0, " MPIC     ");
 196        BUG_ON(mpic == NULL);
 197
 198        /* Add ISUs */
 199        opplen /= sizeof(u32);
 200        for (n = 0, i = naddr; i < opplen; i += naddr, n++) {
 201                unsigned long isuaddr = of_read_number(opprop + i, naddr);
 202                mpic_assign_isu(mpic, n, isuaddr);
 203        }
 204
 205        /* Setup top-level get_irq */
 206        ppc_md.get_irq = mpic_get_irq;
 207
 208        /* All ISUs are setup, complete initialization */
 209        mpic_init(mpic);
 210
 211        /* Look for cascade */
 212        pseries_setup_i8259_cascade();
 213}
 214
 215static void __init pseries_xics_init_IRQ(void)
 216{
 217        xics_init();
 218        pseries_setup_i8259_cascade();
 219}
 220
 221static void pseries_lpar_enable_pmcs(void)
 222{
 223        unsigned long set, reset;
 224
 225        set = 1UL << 63;
 226        reset = 0;
 227        plpar_hcall_norets(H_PERFMON, set, reset);
 228}
 229
 230static void __init pseries_discover_pic(void)
 231{
 232        struct device_node *np;
 233        const char *typep;
 234
 235        for_each_node_by_name(np, "interrupt-controller") {
 236                typep = of_get_property(np, "compatible", NULL);
 237                if (strstr(typep, "open-pic")) {
 238                        pSeries_mpic_node = of_node_get(np);
 239                        ppc_md.init_IRQ       = pseries_mpic_init_IRQ;
 240                        setup_kexec_cpu_down_mpic();
 241                        smp_init_pseries_mpic();
 242                        return;
 243                } else if (strstr(typep, "ppc-xicp")) {
 244                        ppc_md.init_IRQ       = pseries_xics_init_IRQ;
 245                        setup_kexec_cpu_down_xics();
 246                        smp_init_pseries_xics();
 247                        return;
 248                }
 249        }
 250        printk(KERN_ERR "pSeries_discover_pic: failed to recognize"
 251               " interrupt-controller\n");
 252}
 253
 254static int pci_dn_reconfig_notifier(struct notifier_block *nb, unsigned long action, void *data)
 255{
 256        struct of_reconfig_data *rd = data;
 257        struct device_node *np = rd->dn;
 258        struct pci_dn *pci = NULL;
 259        int err = NOTIFY_OK;
 260
 261        switch (action) {
 262        case OF_RECONFIG_ATTACH_NODE:
 263                pci = np->parent->data;
 264                if (pci) {
 265                        update_dn_pci_info(np, pci->phb);
 266
 267                        /* Create EEH device for the OF node */
 268                        eeh_dev_init(np, pci->phb);
 269                }
 270                break;
 271        default:
 272                err = NOTIFY_DONE;
 273                break;
 274        }
 275        return err;
 276}
 277
 278static struct notifier_block pci_dn_reconfig_nb = {
 279        .notifier_call = pci_dn_reconfig_notifier,
 280};
 281
 282struct kmem_cache *dtl_cache;
 283
 284#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
 285/*
 286 * Allocate space for the dispatch trace log for all possible cpus
 287 * and register the buffers with the hypervisor.  This is used for
 288 * computing time stolen by the hypervisor.
 289 */
 290static int alloc_dispatch_logs(void)
 291{
 292        int cpu, ret;
 293        struct paca_struct *pp;
 294        struct dtl_entry *dtl;
 295
 296        if (!firmware_has_feature(FW_FEATURE_SPLPAR))
 297                return 0;
 298
 299        if (!dtl_cache)
 300                return 0;
 301
 302        for_each_possible_cpu(cpu) {
 303                pp = &paca[cpu];
 304                dtl = kmem_cache_alloc(dtl_cache, GFP_KERNEL);
 305                if (!dtl) {
 306                        pr_warn("Failed to allocate dispatch trace log for cpu %d\n",
 307                                cpu);
 308                        pr_warn("Stolen time statistics will be unreliable\n");
 309                        break;
 310                }
 311
 312                pp->dtl_ridx = 0;
 313                pp->dispatch_log = dtl;
 314                pp->dispatch_log_end = dtl + N_DISPATCH_LOG;
 315                pp->dtl_curr = dtl;
 316        }
 317
 318        /* Register the DTL for the current (boot) cpu */
 319        dtl = get_paca()->dispatch_log;
 320        get_paca()->dtl_ridx = 0;
 321        get_paca()->dtl_curr = dtl;
 322        get_paca()->lppaca_ptr->dtl_idx = 0;
 323
 324        /* hypervisor reads buffer length from this field */
 325        dtl->enqueue_to_dispatch_time = cpu_to_be32(DISPATCH_LOG_BYTES);
 326        ret = register_dtl(hard_smp_processor_id(), __pa(dtl));
 327        if (ret)
 328                pr_err("WARNING: DTL registration of cpu %d (hw %d) failed "
 329                       "with %d\n", smp_processor_id(),
 330                       hard_smp_processor_id(), ret);
 331        get_paca()->lppaca_ptr->dtl_enable_mask = 2;
 332
 333        return 0;
 334}
 335#else /* !CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */
 336static inline int alloc_dispatch_logs(void)
 337{
 338        return 0;
 339}
 340#endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */
 341
 342static int alloc_dispatch_log_kmem_cache(void)
 343{
 344        dtl_cache = kmem_cache_create("dtl", DISPATCH_LOG_BYTES,
 345                                                DISPATCH_LOG_BYTES, 0, NULL);
 346        if (!dtl_cache) {
 347                pr_warn("Failed to create dispatch trace log buffer cache\n");
 348                pr_warn("Stolen time statistics will be unreliable\n");
 349                return 0;
 350        }
 351
 352        return alloc_dispatch_logs();
 353}
 354machine_early_initcall(pseries, alloc_dispatch_log_kmem_cache);
 355
 356static void pseries_lpar_idle(void)
 357{
 358        /*
 359         * Default handler to go into low thread priority and possibly
 360         * low power mode by cedeing processor to hypervisor
 361         */
 362
 363        /* Indicate to hypervisor that we are idle. */
 364        get_lppaca()->idle = 1;
 365
 366        /*
 367         * Yield the processor to the hypervisor.  We return if
 368         * an external interrupt occurs (which are driven prior
 369         * to returning here) or if a prod occurs from another
 370         * processor. When returning here, external interrupts
 371         * are enabled.
 372         */
 373        cede_processor();
 374
 375        get_lppaca()->idle = 0;
 376}
 377
 378/*
 379 * Enable relocation on during exceptions. This has partition wide scope and
 380 * may take a while to complete, if it takes longer than one second we will
 381 * just give up rather than wasting any more time on this - if that turns out
 382 * to ever be a problem in practice we can move this into a kernel thread to
 383 * finish off the process later in boot.
 384 */
 385long pSeries_enable_reloc_on_exc(void)
 386{
 387        long rc;
 388        unsigned int delay, total_delay = 0;
 389
 390        while (1) {
 391                rc = enable_reloc_on_exceptions();
 392                if (!H_IS_LONG_BUSY(rc))
 393                        return rc;
 394
 395                delay = get_longbusy_msecs(rc);
 396                total_delay += delay;
 397                if (total_delay > 1000) {
 398                        pr_warn("Warning: Giving up waiting to enable "
 399                                "relocation on exceptions (%u msec)!\n",
 400                                total_delay);
 401                        return rc;
 402                }
 403
 404                mdelay(delay);
 405        }
 406}
 407EXPORT_SYMBOL(pSeries_enable_reloc_on_exc);
 408
 409long pSeries_disable_reloc_on_exc(void)
 410{
 411        long rc;
 412
 413        while (1) {
 414                rc = disable_reloc_on_exceptions();
 415                if (!H_IS_LONG_BUSY(rc))
 416                        return rc;
 417                mdelay(get_longbusy_msecs(rc));
 418        }
 419}
 420EXPORT_SYMBOL(pSeries_disable_reloc_on_exc);
 421
 422#ifdef CONFIG_KEXEC
 423static void pSeries_machine_kexec(struct kimage *image)
 424{
 425        long rc;
 426
 427        if (firmware_has_feature(FW_FEATURE_SET_MODE)) {
 428                rc = pSeries_disable_reloc_on_exc();
 429                if (rc != H_SUCCESS)
 430                        pr_warning("Warning: Failed to disable relocation on "
 431                                   "exceptions: %ld\n", rc);
 432        }
 433
 434        default_machine_kexec(image);
 435}
 436#endif
 437
 438#ifdef __LITTLE_ENDIAN__
 439long pseries_big_endian_exceptions(void)
 440{
 441        long rc;
 442
 443        while (1) {
 444                rc = enable_big_endian_exceptions();
 445                if (!H_IS_LONG_BUSY(rc))
 446                        return rc;
 447                mdelay(get_longbusy_msecs(rc));
 448        }
 449}
 450
 451static long pseries_little_endian_exceptions(void)
 452{
 453        long rc;
 454
 455        while (1) {
 456                rc = enable_little_endian_exceptions();
 457                if (!H_IS_LONG_BUSY(rc))
 458                        return rc;
 459                mdelay(get_longbusy_msecs(rc));
 460        }
 461}
 462#endif
 463
 464static void __init pSeries_setup_arch(void)
 465{
 466        set_arch_panic_timeout(10, ARCH_PANIC_TIMEOUT);
 467
 468        /* Discover PIC type and setup ppc_md accordingly */
 469        pseries_discover_pic();
 470
 471        /* openpic global configuration register (64-bit format). */
 472        /* openpic Interrupt Source Unit pointer (64-bit format). */
 473        /* python0 facility area (mmio) (64-bit format) REAL address. */
 474
 475        /* init to some ~sane value until calibrate_delay() runs */
 476        loops_per_jiffy = 50000000;
 477
 478        fwnmi_init();
 479
 480        /* By default, only probe PCI (can be overriden by rtas_pci) */
 481        pci_add_flags(PCI_PROBE_ONLY);
 482
 483        /* Find and initialize PCI host bridges */
 484        init_pci_config_tokens();
 485        find_and_init_phbs();
 486        of_reconfig_notifier_register(&pci_dn_reconfig_nb);
 487
 488        pSeries_nvram_init();
 489
 490        if (firmware_has_feature(FW_FEATURE_LPAR)) {
 491                vpa_init(boot_cpuid);
 492                ppc_md.power_save = pseries_lpar_idle;
 493                ppc_md.enable_pmcs = pseries_lpar_enable_pmcs;
 494        } else {
 495                /* No special idle routine */
 496                ppc_md.enable_pmcs = power4_enable_pmcs;
 497        }
 498
 499        ppc_md.pcibios_root_bridge_prepare = pseries_root_bridge_prepare;
 500
 501        if (firmware_has_feature(FW_FEATURE_SET_MODE)) {
 502                long rc;
 503
 504                rc = pSeries_enable_reloc_on_exc();
 505                if (rc == H_P2) {
 506                        pr_info("Relocation on exceptions not supported\n");
 507                } else if (rc != H_SUCCESS) {
 508                        pr_warn("Unable to enable relocation on exceptions: "
 509                                "%ld\n", rc);
 510                }
 511        }
 512}
 513
 514static int __init pSeries_init_panel(void)
 515{
 516        /* Manually leave the kernel version on the panel. */
 517#ifdef __BIG_ENDIAN__
 518        ppc_md.progress("Linux ppc64\n", 0);
 519#else
 520        ppc_md.progress("Linux ppc64le\n", 0);
 521#endif
 522        ppc_md.progress(init_utsname()->version, 0);
 523
 524        return 0;
 525}
 526machine_arch_initcall(pseries, pSeries_init_panel);
 527
 528static int pseries_set_dabr(unsigned long dabr, unsigned long dabrx)
 529{
 530        return plpar_hcall_norets(H_SET_DABR, dabr);
 531}
 532
 533static int pseries_set_xdabr(unsigned long dabr, unsigned long dabrx)
 534{
 535        /* Have to set at least one bit in the DABRX according to PAPR */
 536        if (dabrx == 0 && dabr == 0)
 537                dabrx = DABRX_USER;
 538        /* PAPR says we can only set kernel and user bits */
 539        dabrx &= DABRX_KERNEL | DABRX_USER;
 540
 541        return plpar_hcall_norets(H_SET_XDABR, dabr, dabrx);
 542}
 543
 544static int pseries_set_dawr(unsigned long dawr, unsigned long dawrx)
 545{
 546        /* PAPR says we can't set HYP */
 547        dawrx &= ~DAWRX_HYP;
 548
 549        return  plapr_set_watchpoint0(dawr, dawrx);
 550}
 551
 552#define CMO_CHARACTERISTICS_TOKEN 44
 553#define CMO_MAXLENGTH 1026
 554
 555void pSeries_coalesce_init(void)
 556{
 557        struct hvcall_mpp_x_data mpp_x_data;
 558
 559        if (firmware_has_feature(FW_FEATURE_CMO) && !h_get_mpp_x(&mpp_x_data))
 560                powerpc_firmware_features |= FW_FEATURE_XCMO;
 561        else
 562                powerpc_firmware_features &= ~FW_FEATURE_XCMO;
 563}
 564
 565/**
 566 * fw_cmo_feature_init - FW_FEATURE_CMO is not stored in ibm,hypertas-functions,
 567 * handle that here. (Stolen from parse_system_parameter_string)
 568 */
 569static void pSeries_cmo_feature_init(void)
 570{
 571        char *ptr, *key, *value, *end;
 572        int call_status;
 573        int page_order = IOMMU_PAGE_SHIFT_4K;
 574
 575        pr_debug(" -> fw_cmo_feature_init()\n");
 576        spin_lock(&rtas_data_buf_lock);
 577        memset(rtas_data_buf, 0, RTAS_DATA_BUF_SIZE);
 578        call_status = rtas_call(rtas_token("ibm,get-system-parameter"), 3, 1,
 579                                NULL,
 580                                CMO_CHARACTERISTICS_TOKEN,
 581                                __pa(rtas_data_buf),
 582                                RTAS_DATA_BUF_SIZE);
 583
 584        if (call_status != 0) {
 585                spin_unlock(&rtas_data_buf_lock);
 586                pr_debug("CMO not available\n");
 587                pr_debug(" <- fw_cmo_feature_init()\n");
 588                return;
 589        }
 590
 591        end = rtas_data_buf + CMO_MAXLENGTH - 2;
 592        ptr = rtas_data_buf + 2;        /* step over strlen value */
 593        key = value = ptr;
 594
 595        while (*ptr && (ptr <= end)) {
 596                /* Separate the key and value by replacing '=' with '\0' and
 597                 * point the value at the string after the '='
 598                 */
 599                if (ptr[0] == '=') {
 600                        ptr[0] = '\0';
 601                        value = ptr + 1;
 602                } else if (ptr[0] == '\0' || ptr[0] == ',') {
 603                        /* Terminate the string containing the key/value pair */
 604                        ptr[0] = '\0';
 605
 606                        if (key == value) {
 607                                pr_debug("Malformed key/value pair\n");
 608                                /* Never found a '=', end processing */
 609                                break;
 610                        }
 611
 612                        if (0 == strcmp(key, "CMOPageSize"))
 613                                page_order = simple_strtol(value, NULL, 10);
 614                        else if (0 == strcmp(key, "PrPSP"))
 615                                CMO_PrPSP = simple_strtol(value, NULL, 10);
 616                        else if (0 == strcmp(key, "SecPSP"))
 617                                CMO_SecPSP = simple_strtol(value, NULL, 10);
 618                        value = key = ptr + 1;
 619                }
 620                ptr++;
 621        }
 622
 623        /* Page size is returned as the power of 2 of the page size,
 624         * convert to the page size in bytes before returning
 625         */
 626        CMO_PageSize = 1 << page_order;
 627        pr_debug("CMO_PageSize = %lu\n", CMO_PageSize);
 628
 629        if (CMO_PrPSP != -1 || CMO_SecPSP != -1) {
 630                pr_info("CMO enabled\n");
 631                pr_debug("CMO enabled, PrPSP=%d, SecPSP=%d\n", CMO_PrPSP,
 632                         CMO_SecPSP);
 633                powerpc_firmware_features |= FW_FEATURE_CMO;
 634                pSeries_coalesce_init();
 635        } else
 636                pr_debug("CMO not enabled, PrPSP=%d, SecPSP=%d\n", CMO_PrPSP,
 637                         CMO_SecPSP);
 638        spin_unlock(&rtas_data_buf_lock);
 639        pr_debug(" <- fw_cmo_feature_init()\n");
 640}
 641
 642/*
 643 * Early initialization.  Relocation is on but do not reference unbolted pages
 644 */
 645static void __init pSeries_init_early(void)
 646{
 647        pr_debug(" -> pSeries_init_early()\n");
 648
 649#ifdef CONFIG_HVC_CONSOLE
 650        if (firmware_has_feature(FW_FEATURE_LPAR))
 651                hvc_vio_init_early();
 652#endif
 653        if (firmware_has_feature(FW_FEATURE_XDABR))
 654                ppc_md.set_dabr = pseries_set_xdabr;
 655        else if (firmware_has_feature(FW_FEATURE_DABR))
 656                ppc_md.set_dabr = pseries_set_dabr;
 657
 658        if (firmware_has_feature(FW_FEATURE_SET_MODE))
 659                ppc_md.set_dawr = pseries_set_dawr;
 660
 661        pSeries_cmo_feature_init();
 662        iommu_init_early_pSeries();
 663
 664        pr_debug(" <- pSeries_init_early()\n");
 665}
 666
 667/**
 668 * pseries_power_off - tell firmware about how to power off the system.
 669 *
 670 * This function calls either the power-off rtas token in normal cases
 671 * or the ibm,power-off-ups token (if present & requested) in case of
 672 * a power failure. If power-off token is used, power on will only be
 673 * possible with power button press. If ibm,power-off-ups token is used
 674 * it will allow auto poweron after power is restored.
 675 */
 676static void pseries_power_off(void)
 677{
 678        int rc;
 679        int rtas_poweroff_ups_token = rtas_token("ibm,power-off-ups");
 680
 681        if (rtas_flash_term_hook)
 682                rtas_flash_term_hook(SYS_POWER_OFF);
 683
 684        if (rtas_poweron_auto == 0 ||
 685                rtas_poweroff_ups_token == RTAS_UNKNOWN_SERVICE) {
 686                rc = rtas_call(rtas_token("power-off"), 2, 1, NULL, -1, -1);
 687                printk(KERN_INFO "RTAS power-off returned %d\n", rc);
 688        } else {
 689                rc = rtas_call(rtas_poweroff_ups_token, 0, 1, NULL);
 690                printk(KERN_INFO "RTAS ibm,power-off-ups returned %d\n", rc);
 691        }
 692        for (;;);
 693}
 694
 695/*
 696 * Called very early, MMU is off, device-tree isn't unflattened
 697 */
 698
 699static int __init pseries_probe_fw_features(unsigned long node,
 700                                            const char *uname, int depth,
 701                                            void *data)
 702{
 703        const char *prop;
 704        int len;
 705        static int hypertas_found;
 706        static int vec5_found;
 707
 708        if (depth != 1)
 709                return 0;
 710
 711        if (!strcmp(uname, "rtas") || !strcmp(uname, "rtas@0")) {
 712                prop = of_get_flat_dt_prop(node, "ibm,hypertas-functions",
 713                                           &len);
 714                if (prop) {
 715                        powerpc_firmware_features |= FW_FEATURE_LPAR;
 716                        fw_hypertas_feature_init(prop, len);
 717                }
 718
 719                hypertas_found = 1;
 720        }
 721
 722        if (!strcmp(uname, "chosen")) {
 723                prop = of_get_flat_dt_prop(node, "ibm,architecture-vec-5",
 724                                           &len);
 725                if (prop)
 726                        fw_vec5_feature_init(prop, len);
 727
 728                vec5_found = 1;
 729        }
 730
 731        return hypertas_found && vec5_found;
 732}
 733
 734static int __init pSeries_probe(void)
 735{
 736        unsigned long root = of_get_flat_dt_root();
 737        const char *dtype = of_get_flat_dt_prop(root, "device_type", NULL);
 738
 739        if (dtype == NULL)
 740                return 0;
 741        if (strcmp(dtype, "chrp"))
 742                return 0;
 743
 744        /* Cell blades firmware claims to be chrp while it's not. Until this
 745         * is fixed, we need to avoid those here.
 746         */
 747        if (of_flat_dt_is_compatible(root, "IBM,CPBW-1.0") ||
 748            of_flat_dt_is_compatible(root, "IBM,CBEA"))
 749                return 0;
 750
 751        pr_debug("pSeries detected, looking for LPAR capability...\n");
 752
 753        /* Now try to figure out if we are running on LPAR */
 754        of_scan_flat_dt(pseries_probe_fw_features, NULL);
 755
 756#ifdef __LITTLE_ENDIAN__
 757        if (firmware_has_feature(FW_FEATURE_SET_MODE)) {
 758                long rc;
 759                /*
 760                 * Tell the hypervisor that we want our exceptions to
 761                 * be taken in little endian mode. If this fails we don't
 762                 * want to use BUG() because it will trigger an exception.
 763                 */
 764                rc = pseries_little_endian_exceptions();
 765                if (rc) {
 766                        ppc_md.progress("H_SET_MODE LE exception fail", 0);
 767                        panic("Could not enable little endian exceptions");
 768                }
 769        }
 770#endif
 771
 772        if (firmware_has_feature(FW_FEATURE_LPAR))
 773                hpte_init_lpar();
 774        else
 775                hpte_init_native();
 776
 777        pm_power_off = pseries_power_off;
 778
 779        pr_debug("Machine is%s LPAR !\n",
 780                 (powerpc_firmware_features & FW_FEATURE_LPAR) ? "" : " not");
 781
 782        return 1;
 783}
 784
 785static int pSeries_pci_probe_mode(struct pci_bus *bus)
 786{
 787        if (firmware_has_feature(FW_FEATURE_LPAR))
 788                return PCI_PROBE_DEVTREE;
 789        return PCI_PROBE_NORMAL;
 790}
 791
 792#ifndef CONFIG_PCI
 793void pSeries_final_fixup(void) { }
 794#endif
 795
 796define_machine(pseries) {
 797        .name                   = "pSeries",
 798        .probe                  = pSeries_probe,
 799        .setup_arch             = pSeries_setup_arch,
 800        .init_early             = pSeries_init_early,
 801        .show_cpuinfo           = pSeries_show_cpuinfo,
 802        .log_error              = pSeries_log_error,
 803        .pcibios_fixup          = pSeries_final_fixup,
 804        .pci_probe_mode         = pSeries_pci_probe_mode,
 805        .restart                = rtas_restart,
 806        .halt                   = rtas_halt,
 807        .panic                  = rtas_os_term,
 808        .get_boot_time          = rtas_get_boot_time,
 809        .get_rtc_time           = rtas_get_rtc_time,
 810        .set_rtc_time           = rtas_set_rtc_time,
 811        .calibrate_decr         = generic_calibrate_decr,
 812        .progress               = rtas_progress,
 813        .system_reset_exception = pSeries_system_reset_exception,
 814        .machine_check_exception = pSeries_machine_check_exception,
 815#ifdef CONFIG_KEXEC
 816        .machine_kexec          = pSeries_machine_kexec,
 817#endif
 818#ifdef CONFIG_MEMORY_HOTPLUG_SPARSE
 819        .memory_block_size      = pseries_memory_block_size,
 820#endif
 821};
 822