]> git.hungrycats.org Git - linux/commitdiff
ia64: Merge Alex Williamson's sba_iommu patch.
authorDavid Mosberger <davidm@tiger.hpl.hp.com>
Fri, 11 Apr 2003 11:18:46 +0000 (04:18 -0700)
committerDavid Mosberger <davidm@tiger.hpl.hp.com>
Fri, 11 Apr 2003 11:18:46 +0000 (04:18 -0700)
Various small 2.5.67 fixes.

arch/ia64/kernel/iosapic.c
arch/ia64/kernel/mca.c
arch/ia64/kernel/mca_asm.S
arch/ia64/kernel/process.c
arch/ia64/kernel/smpboot.c
arch/ia64/lib/io.c
include/asm-ia64/pal.h

index 8ace5ae8e66f370444f5558652fba2c0a86a0a26..a82c372dcea8f11cbe8176b8159f90e427a200bb 100644 (file)
@@ -581,9 +581,8 @@ iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi,
        register_intr(gsi, vector, IOSAPIC_LOWEST_PRIORITY, polarity, trigger);
 
        DBG("ISA: IRQ %u -> GSI 0x%x (%s,%s) -> CPU 0x%04x vector %d\n",
-           isa_irq, gsi,
-           polarity == IOSAPIC_POL_HIGH ? "high" : "low", trigger == IOSAPIC_EDGE ? "edge" : "level",
-           dest, vector);
+           isa_irq, gsi, polarity == IOSAPIC_POL_HIGH ? "high" : "low",
+           trigger == IOSAPIC_EDGE ? "edge" : "level", dest, vector);
 
        /* program the IOSAPIC routing table */
        set_rte(vector, dest);
@@ -635,7 +634,6 @@ iosapic_init (unsigned long phys_addr, unsigned int gsi_base)
               (ver & 0xf0) >> 4, (ver & 0x0f), phys_addr, gsi_base, gsi_base + num_rte - 1);
 
        if ((gsi_base == 0) && pcat_compat) {
-
                /*
                 * Map the legacy ISA devices into the IOSAPIC data.  Some of these may
                 * get reprogrammed later on with data from the ACPI Interrupt Source
index 580879803f9cdfbf6e2608f24899a837e6e413f6..7da0cd77c6b268e94136cf9b3f1e74006f9358d5 100644 (file)
@@ -39,6 +39,7 @@
 #include <linux/sched.h>
 #include <linux/interrupt.h>
 #include <linux/irq.h>
+#include <linux/kallsyms.h>
 #include <linux/smp_lock.h>
 #include <linux/bootmem.h>
 #include <linux/acpi.h>
@@ -47,6 +48,7 @@
 #include <linux/kernel.h>
 #include <linux/smp.h>
 
+#include <asm/delay.h>
 #include <asm/machvec.h>
 #include <asm/page.h>
 #include <asm/ptrace.h>
@@ -139,7 +141,7 @@ ia64_mca_log_sal_error_record(int sal_info_type, int called_from_init)
 
        /* Get the MCA error record */
        if (!ia64_log_get(sal_info_type, (prfunc_t)printk))
-               return platform_err;                 // no record retrieved
+               return platform_err;            /* no record retrieved */
 
        /* TODO:
         * 1. analyze error logs to determine recoverability
@@ -176,18 +178,90 @@ ia64_mca_cpe_int_handler (int cpe_irq, void *arg, struct pt_regs *ptregs)
        ia64_mca_log_sal_error_record(SAL_INFO_TYPE_CPE, 0);
 }
 
+static void
+show_min_state (pal_min_state_area_t *minstate)
+{
+       u64 iip = minstate->pmsa_iip + ((struct ia64_psr *)(&minstate->pmsa_ipsr))->ri;
+       u64 xip = minstate->pmsa_xip + ((struct ia64_psr *)(&minstate->pmsa_xpsr))->ri;
+
+       printk("NaT bits\t%016lx\n", minstate->pmsa_nat_bits);
+       printk("pr\t\t%016lx\n", minstate->pmsa_pr);
+       printk("b0\t\t%016lx ", minstate->pmsa_br0); print_symbol("%s\n", minstate->pmsa_br0);
+       printk("ar.rsc\t\t%016lx\n", minstate->pmsa_rsc);
+       printk("cr.iip\t\t%016lx ", iip); print_symbol("%s\n", iip);
+       printk("cr.ipsr\t\t%016lx\n", minstate->pmsa_ipsr);
+       printk("cr.ifs\t\t%016lx\n", minstate->pmsa_ifs);
+       printk("xip\t\t%016lx ", xip); print_symbol("%s\n", xip);
+       printk("xpsr\t\t%016lx\n", minstate->pmsa_xpsr);
+       printk("xfs\t\t%016lx\n", minstate->pmsa_xfs);
+       printk("b1\t\t%016lx ", minstate->pmsa_br1);
+       print_symbol("%s\n", minstate->pmsa_br1);
+
+       printk("\nstatic registers r0-r15:\n");
+       printk(" r0- 3 %016lx %016lx %016lx %016lx\n",
+              0UL, minstate->pmsa_gr[0], minstate->pmsa_gr[1], minstate->pmsa_gr[2]);
+       printk(" r4- 7 %016lx %016lx %016lx %016lx\n",
+              minstate->pmsa_gr[3], minstate->pmsa_gr[4],
+              minstate->pmsa_gr[5], minstate->pmsa_gr[6]);
+       printk(" r8-11 %016lx %016lx %016lx %016lx\n",
+              minstate->pmsa_gr[7], minstate->pmsa_gr[8],
+              minstate->pmsa_gr[9], minstate->pmsa_gr[10]);
+       printk("r11-15 %016lx %016lx %016lx %016lx\n",
+              minstate->pmsa_gr[11], minstate->pmsa_gr[12],
+              minstate->pmsa_gr[13], minstate->pmsa_gr[14]);
+
+       printk("\nbank 0:\n");
+       printk("r16-19 %016lx %016lx %016lx %016lx\n",
+              minstate->pmsa_bank0_gr[0], minstate->pmsa_bank0_gr[1],
+              minstate->pmsa_bank0_gr[2], minstate->pmsa_bank0_gr[3]);
+       printk("r20-23 %016lx %016lx %016lx %016lx\n",
+              minstate->pmsa_bank0_gr[4], minstate->pmsa_bank0_gr[5],
+              minstate->pmsa_bank0_gr[6], minstate->pmsa_bank0_gr[7]);
+       printk("r24-27 %016lx %016lx %016lx %016lx\n",
+              minstate->pmsa_bank0_gr[8], minstate->pmsa_bank0_gr[9],
+              minstate->pmsa_bank0_gr[10], minstate->pmsa_bank0_gr[11]);
+       printk("r28-31 %016lx %016lx %016lx %016lx\n",
+              minstate->pmsa_bank0_gr[12], minstate->pmsa_bank0_gr[13],
+              minstate->pmsa_bank0_gr[14], minstate->pmsa_bank0_gr[15]);
+
+       printk("\nbank 1:\n");
+       printk("r16-19 %016lx %016lx %016lx %016lx\n",
+              minstate->pmsa_bank1_gr[0], minstate->pmsa_bank1_gr[1],
+              minstate->pmsa_bank1_gr[2], minstate->pmsa_bank1_gr[3]);
+       printk("r20-23 %016lx %016lx %016lx %016lx\n",
+              minstate->pmsa_bank1_gr[4], minstate->pmsa_bank1_gr[5],
+              minstate->pmsa_bank1_gr[6], minstate->pmsa_bank1_gr[7]);
+       printk("r24-27 %016lx %016lx %016lx %016lx\n",
+              minstate->pmsa_bank1_gr[8], minstate->pmsa_bank1_gr[9],
+              minstate->pmsa_bank1_gr[10], minstate->pmsa_bank1_gr[11]);
+       printk("r28-31 %016lx %016lx %016lx %016lx\n",
+              minstate->pmsa_bank1_gr[12], minstate->pmsa_bank1_gr[13],
+              minstate->pmsa_bank1_gr[14], minstate->pmsa_bank1_gr[15]);
+}
+
 /*
  * This routine will be used to deal with platform specific handling
  * of the init, i.e. drop into the kernel debugger on server machine,
  * or if the processor is part of some parallel machine without a
  * console, then we would call the appropriate debug hooks here.
  */
+unsigned long tr_val[32], tr_idx;
+
 void
-init_handler_platform (struct pt_regs *regs)
+init_handler_platform (sal_log_processor_info_t *proc_ptr, struct pt_regs *regs)
 {
        /* if a kernel debugger is available call it here else just dump the registers */
 
-       show_regs(regs);                /* dump the state info */
+       /*
+        * Wait for a bit.  On some machines (e.g., HP's zx2000 and zx6000, INIT can be
+        * generated via the BMC's command-line interface, but since the console is on the
+        * same serial line, the user will need some time to switch out of the BMC before
+        * the dump begins.
+        */
+       printk("Delaying for 5 seconds...\n");
+       udelay(5*1000000);
+       show_min_state(&SAL_LPI_PSI_INFO(proc_ptr)->min_state_area);
+
        while (1);                      /* hang city if no debugger */
 }
 
@@ -263,7 +337,6 @@ ia64_mca_register_cpev (int cpev)
 /*
  * routine to process and prepare to dump min_state_save
  * information for debugging purposes.
- *
  */
 void
 ia64_process_min_state_save (pal_min_state_area_t *pmss)
@@ -272,8 +345,6 @@ ia64_process_min_state_save (pal_min_state_area_t *pmss)
        u64 *tpmss_ptr = (u64 *)pmss;
        u64 *return_min_state_ptr = ia64_mca_min_state_save_info;
 
-       /* dump out the min_state_area information */
-
        for (i=0;i<max;i++) {
 
                /* copy min-state register info for eventual return to PAL */
@@ -1089,7 +1160,7 @@ ia64_init_handler (struct pt_regs *regs)
        /* Clear the INIT SAL logs now that they have been saved in the OS buffer */
        ia64_sal_clear_state_info(SAL_INFO_TYPE_INIT);
 
-       init_handler_platform(regs);              /* call platform specific routines */
+       init_handler_platform(proc_ptr, regs);          /* call platform specific routines */
 }
 
 /*
index 8565c0cc8bd4227e8a4dc7e8dd833c1093016c02..3394421c3a5d6c24706c7aa4654a92723d470642 100644 (file)
@@ -766,8 +766,6 @@ GLOBAL_ENTRY(ia64_monarch_init_handler)
        // stash the information the SAL passed to os
        SAL_TO_OS_MCA_HANDOFF_STATE_SAVE(r2)
        ;;
-
-// now we want to save information so we can dump registers
        SAVE_MIN_WITH_COVER
        ;;
        mov r8=cr.ifa
index 132a4a643fa75a2aa934ed19668c9d600d0ccfd4..9394d48605565056a21fb42cf0287903a71df486 100644 (file)
@@ -135,7 +135,7 @@ show_regs (struct pt_regs *regs)
                               ((i == sof - 1) || (i % 3) == 2) ? "\n" : " ");
                }
        } else
-               show_stack(0);
+               show_stack(NULL);
 }
 
 void
index dfd8ffdcbd529495d555fdcd0f5a35bd0a8a04e9..1af85979e2fcba4bb583c169356f3de86ed41c6a 100644 (file)
@@ -279,15 +279,6 @@ smp_callin (void)
 
        smp_setup_percpu_timer();
 
-       if (!(sal_platform_features & IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT)) {
-               /*
-                * Synchronize the ITC with the BP
-                */
-               Dprintk("Going to syncup ITC with BP.\n");
-
-               ia64_sync_itc(0);
-       }
-
        /*
         * Get our bogomips.
         */
@@ -310,6 +301,18 @@ smp_callin (void)
        local_irq_enable();
        calibrate_delay();
        local_cpu_data->loops_per_jiffy = loops_per_jiffy;
+
+       if (!(sal_platform_features & IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT)) {
+               /*
+                * Synchronize the ITC with the BP.  Need to do this after irqs are
+                * enabled because ia64_sync_itc() calls smp_call_function_single(), which
+                * calls spin_unlock_bh(), which calls spin_unlock_bh(), which calls
+                * local_bh_enable(), which bugs out if irqs are not enabled...
+                */
+               Dprintk("Going to syncup ITC with BP.\n");
+               ia64_sync_itc(0);
+       }
+
        /*
         * Allow the master to continue.
         */
index 2ff57f37a434bf17770bf64ba900b2284b1cb04e..1aef609530dba70120e9e15165888a751a9cd858 100644 (file)
@@ -108,7 +108,7 @@ ia64_readl (void *addr)
 unsigned long
 ia64_readq (void *addr)
 {
-       return __ia64_readq (addr)
+       return __ia64_readq (addr);
 }
 
 
index 840ae4bd55c4a2beb61623e4b46332eb03103673..5640226e8a1595bb3f1253c75dbcac898d9014ef 100644 (file)
@@ -622,7 +622,8 @@ typedef struct pal_min_state_area_s {
        u64     pmsa_xip;               /* previous iip            */
        u64     pmsa_xpsr;              /* previous psr            */
        u64     pmsa_xfs;               /* previous ifs            */
-       u64     pmsa_reserved[71];      /* pal_min_state_area should total to 1KB */
+       u64     pmsa_br1;               /* branch register 1       */
+       u64     pmsa_reserved[70];      /* pal_min_state_area should total to 1KB */
 } pal_min_state_area_t;