patch-2.2.11 linux/arch/alpha/kernel/core_mcpcia.c
Next file: linux/arch/alpha/kernel/core_pyxis.c
Previous file: linux/arch/alpha/kernel/core_cia.c
Back to the patch index
Back to the overall index
- Lines: 158
- Date:
Mon Aug 9 12:05:05 1999
- Orig file:
v2.2.10/linux/arch/alpha/kernel/core_mcpcia.c
- Orig date:
Sun Sep 6 10:34:33 1998
diff -u --recursive --new-file v2.2.10/linux/arch/alpha/kernel/core_mcpcia.c linux/arch/alpha/kernel/core_mcpcia.c
@@ -18,7 +18,6 @@
#include <asm/system.h>
#include <asm/pci.h>
#include <asm/hwrpb.h>
-#include <asm/mmu_context.h>
#define __EXTERN_INLINE inline
#include <asm/io.h>
@@ -46,17 +45,11 @@
# define DBG_CFG(args)
#endif
-
-#define DEBUG_MCHECK
-
-#ifdef DEBUG_MCHECK
-# define DBG_MCK(args) printk args
-#else
-# define DBG_MCK(args)
-#endif
+#define DEBUG_MCHECK 0 /* 0 = minimal, 1 = debug, 2 = dump */
static volatile unsigned int MCPCIA_mcheck_expected[NR_CPUS];
static volatile unsigned int MCPCIA_mcheck_taken[NR_CPUS];
+static volatile unsigned int MCPCIA_mcheck_hose[NR_CPUS];
static unsigned int MCPCIA_jd[NR_CPUS];
#define MCPCIA_MAX_HOSES 2
@@ -129,6 +122,7 @@
draina();
MCPCIA_mcheck_expected[cpu] = 1;
MCPCIA_mcheck_taken[cpu] = 0;
+ MCPCIA_mcheck_hose[cpu] = hoseno;
mb();
/* Access configuration space. */
@@ -170,6 +164,7 @@
draina();
MCPCIA_mcheck_expected[cpu] = 1;
+ MCPCIA_mcheck_hose[cpu] = hoseno;
mb();
/* Access configuration space. */
@@ -555,19 +550,12 @@
}
}
-static int
-mcpcia_pci_clr_err(int h)
+static void
+mcpcia_pci_clr_err(int cpu, int hose)
{
- unsigned int cpu = smp_processor_id();
-
- MCPCIA_jd[cpu] = *(vuip)MCPCIA_CAP_ERR(h);
-#if 0
- DBG_MCK(("MCPCIA_pci_clr_err: MCPCIA CAP_ERR(%d) after read 0x%x\n",
- h, MCPCIA_jd[cpu]));
-#endif
- *(vuip)MCPCIA_CAP_ERR(h) = 0xffffffff; mb(); /* clear them all */
- MCPCIA_jd[cpu] = *(vuip)MCPCIA_CAP_ERR(h);
- return 0;
+ MCPCIA_jd[cpu] = *(vuip)MCPCIA_CAP_ERR(hose);
+ *(vuip)MCPCIA_CAP_ERR(hose) = 0xffffffff; mb(); /* clear them all */
+ MCPCIA_jd[cpu] = *(vuip)MCPCIA_CAP_ERR(hose); /* read to force write */
}
static void
@@ -643,70 +631,36 @@
}
void
-mcpcia_machine_check(unsigned long type, unsigned long la_ptr,
+mcpcia_machine_check(unsigned long vector, unsigned long la_ptr,
struct pt_regs * regs)
{
-#if 0
- printk("mcpcia machine check ignored\n") ;
-#else
struct el_common *mchk_header;
struct el_MCPCIA_uncorrected_frame_mcheck *mchk_logout;
unsigned int cpu = smp_processor_id();
- int h = 0;
mchk_header = (struct el_common *)la_ptr;
mchk_logout = (struct el_MCPCIA_uncorrected_frame_mcheck *)la_ptr;
-#if 0
- DBG_MCK(("mcpcia_machine_check: type=0x%lx la_ptr=0x%lx\n",
- type, la_ptr));
- DBG_MCK(("\t\t pc=0x%lx size=0x%x procoffset=0x%x sysoffset 0x%x\n",
- regs->pc, mchk_header->size, mchk_header->proc_offset,
- mchk_header->sys_offset));
-#endif
- /*
- * Check if machine check is due to a badaddr() and if so,
- * ignore the machine check.
- */
mb();
mb(); /* magic */
- if (MCPCIA_mcheck_expected[cpu]) {
-#if 0
- DBG_MCK(("MCPCIA machine check expected\n"));
-#endif
- MCPCIA_mcheck_expected[cpu] = 0;
- MCPCIA_mcheck_taken[cpu] = 1;
- mb();
- mb(); /* magic */
- draina();
- mcpcia_pci_clr_err(h);
- wrmces(0x7);
- mb();
- }
-#if 1
+ draina();
+ if (MCPCIA_mcheck_expected[cpu])
+ mcpcia_pci_clr_err(cpu, MCPCIA_mcheck_hose[cpu]);
else {
- printk("MCPCIA machine check NOT expected on CPU %d\n", cpu);
- DBG_MCK(("mcpcia_machine_check: type=0x%lx pc=0x%lx"
- " code=0x%lx\n",
- type, regs->pc, mchk_header->code));
+ /* FIXME: how do we figure out which hose the error was on? */
+ mcpcia_pci_clr_err(cpu, 0);
+ mcpcia_pci_clr_err(cpu, 1);
+ }
+ wrmces(0x7);
+ mb();
- MCPCIA_mcheck_expected[cpu] = 0;
- MCPCIA_mcheck_taken[cpu] = 1;
- mb();
- mb(); /* magic */
- draina();
- mcpcia_pci_clr_err(h);
- wrmces(0x7);
- mb();
-#ifdef DEBUG_MCHECK_DUMP
- if (type == 0x620)
- printk("MCPCIA machine check: system CORRECTABLE!\n");
- else if (type == 0x630)
- printk("MCPCIA machine check: processor CORRECTABLE!\n");
- else
-#endif /* DEBUG_MCHECK_DUMP */
- mcpcia_print_uncorrectable(mchk_logout);
+ process_mcheck_info(vector, la_ptr, regs, "MCPCIA",
+ DEBUG_MCHECK, MCPCIA_mcheck_expected[cpu]);
+
+ if (vector != 0x620 && vector != 0x630) {
+ mcpcia_print_uncorrectable(mchk_logout);
}
-#endif
-#endif
+
+ MCPCIA_mcheck_expected[cpu] = 0;
+ MCPCIA_mcheck_taken[cpu] = 1;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)