Merge with Paulus
[powerpc.git] / arch / powerpc / platforms / pseries / setup.c
index 0c84a44..65bee93 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/arch/ppc/kernel/setup.c
+ *  64-bit pSeries and RS/6000 setup code.
  *
  *  Copyright (C) 1995  Linus Torvalds
  *  Adapted from 'alpha' version by Gary Thomas
@@ -58,8 +58,7 @@
 #include <asm/irq.h>
 #include <asm/time.h>
 #include <asm/nvram.h>
-#include <asm/plpar_wrappers.h>
-#include <asm/xics.h>
+#include "xics.h"
 #include <asm/firmware.h>
 #include <asm/pmc.h>
 #include <asm/mpic.h>
@@ -67,6 +66,8 @@
 #include <asm/i8259.h>
 #include <asm/udbg.h>
 
+#include "plpar_wrappers.h"
+
 #ifdef DEBUG
 #define DBG(fmt...) udbg_printf(fmt)
 #else
@@ -87,10 +88,9 @@ extern int pSeries_machine_check_exception(struct pt_regs *regs);
 static void pseries_shared_idle(void);
 static void pseries_dedicated_idle(void);
 
-static volatile void __iomem * chrp_int_ack_special;
 struct mpic *pSeries_mpic;
 
-void pSeries_get_cpuinfo(struct seq_file *m)
+void pSeries_show_cpuinfo(struct seq_file *m)
 {
        struct device_node *root;
        const char *model = "";
@@ -119,19 +119,11 @@ static void __init fwnmi_init(void)
                fwnmi_active = 1;
 }
 
-static int pSeries_irq_cascade(struct pt_regs *regs, void *data)
-{
-       if (chrp_int_ack_special)
-               return readb(chrp_int_ack_special);
-       else
-               return i8259_irq(regs);
-}
-
 static void __init pSeries_init_mpic(void)
 {
         unsigned int *addrp;
        struct device_node *np;
-        int i;
+       unsigned long intack = 0;
 
        /* All ISUs are setup, complete initialization */
        mpic_init(pSeries_mpic);
@@ -142,16 +134,14 @@ static void __init pSeries_init_mpic(void)
                  get_property(np, "8259-interrupt-acknowledge", NULL)))
                 printk(KERN_ERR "Cannot find pci to get ack address\n");
         else
-               chrp_int_ack_special = ioremap(addrp[prom_n_addr_cells(np)-1], 1);
+               intack = addrp[prom_n_addr_cells(np)-1];
        of_node_put(np);
 
        /* Setup the legacy interrupts & controller */
-        for (i = 0; i < NUM_ISA_INTERRUPTS; i++)
-                irq_desc[i].handler = &i8259_pic;
-       i8259_init(0);
+       i8259_init(intack, 0);
 
        /* Hook cascade to mpic */
-       mpic_setup_cascade(NUM_ISA_INTERRUPTS, pSeries_irq_cascade, NULL);
+       mpic_setup_cascade(NUM_ISA_INTERRUPTS, i8259_irq_cascade, NULL);
 }
 
 static void __init pSeries_setup_mpic(void)
@@ -241,10 +231,6 @@ static void __init pSeries_setup_arch(void)
        find_and_init_phbs();
        eeh_init();
 
-#ifdef CONFIG_DUMMY_CONSOLE
-       conswitchp = &dummy_con;
-#endif
-
        pSeries_nvram_init();
 
        /* Choose an idle loop */
@@ -365,6 +351,16 @@ static void pSeries_mach_cpu_die(void)
        for(;;);
 }
 
+static int pseries_set_dabr(unsigned long dabr)
+{
+       if (firmware_has_feature(FW_FEATURE_XDABR)) {
+               /* We want to catch accesses from kernel and userspace */
+               return plpar_set_xdabr(dabr, H_DABRX_KERNEL | H_DABRX_USER);
+       }
+
+       return plpar_set_dabr(dabr);
+}
+
 
 /*
  * Early initialization.  Relocation is on but do not reference unbolted pages
@@ -400,6 +396,8 @@ static void __init pSeries_init_early(void)
                DBG("Hello World !\n");
        }
 
+       if (firmware_has_feature(FW_FEATURE_XDABR | FW_FEATURE_DABR))
+               ppc_md.set_dabr = pseries_set_dabr;
 
        iommu_init_early_pSeries();
 
@@ -599,7 +597,7 @@ struct machdep_calls __initdata pSeries_md = {
        .probe                  = pSeries_probe,
        .setup_arch             = pSeries_setup_arch,
        .init_early             = pSeries_init_early,
-       .get_cpuinfo            = pSeries_get_cpuinfo,
+       .show_cpuinfo           = pSeries_show_cpuinfo,
        .log_error              = pSeries_log_error,
        .pcibios_fixup          = pSeries_final_fixup,
        .pci_probe_mode         = pSeries_pci_probe_mode,