powerpc/pci: Delay populating pdn
[cascardo/linux.git] / arch / powerpc / platforms / pseries / setup.c
index 6e944fc..e61e9b9 100644 (file)
@@ -57,7 +57,6 @@
 #include <asm/time.h>
 #include <asm/nvram.h>
 #include <asm/pmc.h>
-#include <asm/mpic.h>
 #include <asm/xics.h>
 #include <asm/ppc-pci.h>
 #include <asm/i8259.h>
@@ -77,8 +76,6 @@ EXPORT_SYMBOL(CMO_PageSize);
 
 int fwnmi_active;  /* TRUE if an FWNMI handler is present */
 
-static struct device_node *pSeries_mpic_node;
-
 static void pSeries_show_cpuinfo(struct seq_file *m)
 {
        struct device_node *root;
@@ -172,48 +169,7 @@ static void __init pseries_setup_i8259_cascade(void)
        irq_set_chained_handler(cascade, pseries_8259_cascade);
 }
 
-static void __init pseries_mpic_init_IRQ(void)
-{
-       struct device_node *np;
-       const unsigned int *opprop;
-       unsigned long openpic_addr = 0;
-       int naddr, n, i, opplen;
-       struct mpic *mpic;
-
-       np = of_find_node_by_path("/");
-       naddr = of_n_addr_cells(np);
-       opprop = of_get_property(np, "platform-open-pic", &opplen);
-       if (opprop != NULL) {
-               openpic_addr = of_read_number(opprop, naddr);
-               printk(KERN_DEBUG "OpenPIC addr: %lx\n", openpic_addr);
-       }
-       of_node_put(np);
-
-       BUG_ON(openpic_addr == 0);
-
-       /* Setup the openpic driver */
-       mpic = mpic_alloc(pSeries_mpic_node, openpic_addr,
-                       MPIC_NO_RESET, 16, 0, " MPIC     ");
-       BUG_ON(mpic == NULL);
-
-       /* Add ISUs */
-       opplen /= sizeof(u32);
-       for (n = 0, i = naddr; i < opplen; i += naddr, n++) {
-               unsigned long isuaddr = of_read_number(opprop + i, naddr);
-               mpic_assign_isu(mpic, n, isuaddr);
-       }
-
-       /* Setup top-level get_irq */
-       ppc_md.get_irq = mpic_get_irq;
-
-       /* All ISUs are setup, complete initialization */
-       mpic_init(mpic);
-
-       /* Look for cascade */
-       pseries_setup_i8259_cascade();
-}
-
-static void __init pseries_xics_init_IRQ(void)
+static void __init pseries_init_irq(void)
 {
        xics_init();
        pseries_setup_i8259_cascade();
@@ -228,30 +184,6 @@ static void pseries_lpar_enable_pmcs(void)
        plpar_hcall_norets(H_PERFMON, set, reset);
 }
 
-static void __init pseries_discover_pic(void)
-{
-       struct device_node *np;
-       const char *typep;
-
-       for_each_node_by_name(np, "interrupt-controller") {
-               typep = of_get_property(np, "compatible", NULL);
-               if (strstr(typep, "open-pic")) {
-                       pSeries_mpic_node = of_node_get(np);
-                       ppc_md.init_IRQ       = pseries_mpic_init_IRQ;
-                       setup_kexec_cpu_down_mpic();
-                       smp_init_pseries_mpic();
-                       return;
-               } else if (strstr(typep, "ppc-xicp")) {
-                       ppc_md.init_IRQ       = pseries_xics_init_IRQ;
-                       setup_kexec_cpu_down_xics();
-                       smp_init_pseries_xics();
-                       return;
-               }
-       }
-       printk(KERN_ERR "pSeries_discover_pic: failed to recognize"
-              " interrupt-controller\n");
-}
-
 static int pci_dn_reconfig_notifier(struct notifier_block *nb, unsigned long action, void *data)
 {
        struct of_reconfig_data *rd = data;
@@ -263,11 +195,8 @@ static int pci_dn_reconfig_notifier(struct notifier_block *nb, unsigned long act
        case OF_RECONFIG_ATTACH_NODE:
                parent = of_get_parent(np);
                pdn = parent ? PCI_DN(parent) : NULL;
-               if (pdn) {
-                       /* Create pdn and EEH device */
-                       update_dn_pci_info(np, pdn->phb);
-                       eeh_dev_init(PCI_DN(np), pdn->phb);
-               }
+               if (pdn)
+                       pci_add_device_node_info(pdn->phb, np);
 
                of_node_put(parent);
                break;
@@ -365,7 +294,7 @@ static void pseries_lpar_idle(void)
 {
        /*
         * Default handler to go into low thread priority and possibly
-        * low power mode by cedeing processor to hypervisor
+        * low power mode by ceding processor to hypervisor
         */
 
        /* Indicate to hypervisor that we are idle. */
@@ -490,7 +419,6 @@ static void __init find_and_init_phbs(void)
        }
 
        of_node_put(root);
-       pci_devs_phb_init();
 
        /*
         * PCI_PROBE_ONLY and PCI_REASSIGN_ALL_BUS can be set via properties
@@ -504,7 +432,8 @@ static void __init pSeries_setup_arch(void)
        set_arch_panic_timeout(10, ARCH_PANIC_TIMEOUT);
 
        /* Discover PIC type and setup ppc_md accordingly */
-       pseries_discover_pic();
+       smp_init_pseries();
+
 
        /* openpic global configuration register (64-bit format). */
        /* openpic Interrupt Source Unit pointer (64-bit format). */
@@ -836,6 +765,7 @@ define_machine(pseries) {
        .probe                  = pSeries_probe,
        .setup_arch             = pSeries_setup_arch,
        .init_early             = pSeries_init_early,
+       .init_IRQ               = pseries_init_irq,
        .show_cpuinfo           = pSeries_show_cpuinfo,
        .log_error              = pSeries_log_error,
        .pcibios_fixup          = pSeries_final_fixup,
@@ -851,6 +781,7 @@ define_machine(pseries) {
        .machine_check_exception = pSeries_machine_check_exception,
 #ifdef CONFIG_KEXEC
        .machine_kexec          = pSeries_machine_kexec,
+       .kexec_cpu_down         = pseries_kexec_cpu_down,
 #endif
 #ifdef CONFIG_MEMORY_HOTPLUG_SPARSE
        .memory_block_size      = pseries_memory_block_size,