Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/hpcmips/tx Mechanically adapt to new interrupt/spl ...



details:   https://anonhg.NetBSD.org/src/rev/9506f48636f9
branches:  trunk
changeset: 762725:9506f48636f9
user:      tsutsui <tsutsui%NetBSD.org@localhost>
date:      Sat Feb 26 12:54:41 2011 +0000

description:
Mechanically adapt to new interrupt/spl framework. Untested.

diffstat:

 sys/arch/hpcmips/tx/tx39icu.c |  213 ++++++++++++++++++++---------------------
 1 files changed, 103 insertions(+), 110 deletions(-)

diffs (truncated from 334 to 300 lines):

diff -r 76fee34119e2 -r 9506f48636f9 sys/arch/hpcmips/tx/tx39icu.c
--- a/sys/arch/hpcmips/tx/tx39icu.c     Sat Feb 26 12:09:34 2011 +0000
+++ b/sys/arch/hpcmips/tx/tx39icu.c     Sat Feb 26 12:54:41 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: tx39icu.c,v 1.29 2011/02/26 12:09:34 tsutsui Exp $ */
+/*     $NetBSD: tx39icu.c,v 1.30 2011/02/26 12:54:41 tsutsui Exp $ */
 
 /*-
  * Copyright (c) 1999-2001 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tx39icu.c,v 1.29 2011/02/26 12:09:34 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tx39icu.c,v 1.30 2011/02/26 12:54:41 tsutsui Exp $");
 
 #include "opt_vr41xx.h"
 #include "opt_tx39xx.h"
@@ -39,6 +39,8 @@
 #include "opt_tx39icu_debug.h"
 #include "opt_tx39_watchdogtimer.h"
 
+#define        __INTR_PRIVATE
+
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
@@ -49,8 +51,8 @@
 #include <uvm/uvm_extern.h>
 
 #include <mips/cpuregs.h>
-#include <mips/locore.h>
 #include <machine/bus.h>
+#include <machine/intr.h>
 
 #include <hpcmips/tx/tx39var.h>
 #include <hpcmips/tx/tx39icureg.h>
@@ -66,7 +68,7 @@
 #else
 #define        TX_INTR cpu_intr        /* locore_mips3 directly call this */
 #endif
-void TX_INTR(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
+void TX_INTR(int, vaddr_t, uint32_t);
 
 #ifdef TX39ICU_DEBUG
 #define DPRINTF_ENABLE
@@ -74,29 +76,26 @@
 #endif
 #include <machine/debug.h>
 
-u_int32_t tx39intrvec;
+uint32_t tx39intrvec;
 
 /*
  * This is a mask of bits to clear in the SR when we go to a
  * given interrupt priority level.
  */
-const u_int32_t __ipl_sr_bits_tx[_IPL_N] = {
-       0,                                      /* IPL_NONE */
-
-       MIPS_SOFT_INT_MASK_0,                   /* IPL_SOFTCLOCK */
-
-       MIPS_SOFT_INT_MASK_0|
-               MIPS_SOFT_INT_MASK_1,           /* IPL_SOFTNET */
-
-       MIPS_SOFT_INT_MASK_0|
-               MIPS_SOFT_INT_MASK_1|
-               MIPS_INT_MASK_2|
-               MIPS_INT_MASK_4,                /* IPL_VM */
-
-       MIPS_SOFT_INT_MASK_0|
-               MIPS_SOFT_INT_MASK_1|
-               MIPS_INT_MASK_2|
-               MIPS_INT_MASK_4,                /* IPL_SCHED */
+const struct ipl_sr_map __ipl_sr_map_tx = {
+    .sr_bits = {
+       [IPL_NONE] =            0,
+       [IPL_SOFTCLOCK] =       MIPS_SOFT_INT_MASK_0,
+       [IPL_SOFTNET] =         MIPS_SOFT_INT_MASK,
+       [IPL_VM] =              MIPS_SOFT_INT_MASK
+                               | MIPS_INT_MASK_2
+                               | MIPS_INT_MASK_4,
+       [IPL_SCHED] =           MIPS_SOFT_INT_MASK
+                               | MIPS_INT_MASK_2
+                               | MIPS_INT_MASK_4,
+       [IPL_DDB] =             MIPS_INT_MASK,
+       [IPL_HIGH] =            MIPS_INT_MASK,
+       },
 };
 
 /* IRQHIGH lines list */
@@ -201,14 +200,13 @@
 
 int    tx39icu_match(struct device *, struct cfdata *, void *);
 void   tx39icu_attach(struct device *, struct device *, void *);
-int    tx39icu_intr(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
 
 void   tx39_intr_dump(struct tx39icu_softc *);
 void   tx39_intr_decode(int, int *, int *);
 void   tx39_irqhigh_disestablish(tx_chipset_tag_t, int, int, int);
 void   tx39_irqhigh_establish(tx_chipset_tag_t, int, int, int, 
            int (*)(void *), void *);
-void   tx39_irqhigh_intr(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
+void   tx39_irqhigh_intr(uint32_t, uint32_t, uint32_t);
 int    tx39_irqhigh(int, int);
 
 CFATTACH_DECL(tx39icu, sizeof(struct tx39icu_softc),
@@ -306,23 +304,15 @@
 }
 
 void
-TX_INTR(u_int32_t status, u_int32_t cause, vaddr_t pc, u_int32_t ipending)
+TX_INTR(int ppl, vaddr_t pc, uint32_t status)
 {
+       uint32_t ipending;
+       int ipl;
        struct tx39icu_softc *sc;
        tx_chipset_tag_t tc;
-       struct cpu_info *ci;
        txreg_t reg, pend, *regs;
        int i, j;
 
-       ci = curcpu();
-       ci->ci_idepth++;
-       ci->ci_data.cpu_nintr++;
-
-#ifdef __HAVE_FAST_SOFTINTS
-       if ((ipending & MIPS_HARD_INT_MASK) == 0)
-               goto softintr;
-#endif
-
        tc = tx_conf_get_tag();
        sc = tc->tc_intrt;
        /*
@@ -340,89 +330,92 @@
        regs[8] = tx_conf_read(tc, TX39_INTRSTATUS8_REG);
 #endif
 
+       while (ppl < (ipl = splintr(&ipending))) {
 #ifdef TX39ICU_DEBUG
-       if (!(ipending & MIPS_INT_MASK_4) && !(ipending & MIPS_INT_MASK_2)) {
-               dbg_bit_print(ipending);
-               panic("bogus HwInt");
-       }
-       if (tx39icu_debug > 1) {
-               tx39_intr_dump(sc);
-       }
+               if (!(ipending & MIPS_INT_MASK_4) &&
+                   !(ipending & MIPS_INT_MASK_2)) {
+                       dbg_bit_print(ipending);
+                       panic("bogus HwInt");
+               }
+               if (tx39icu_debug > 1) {
+                       tx39_intr_dump(sc);
+               }
 #endif /* TX39ICU_DEBUG */
 
-       /* IRQHIGH */
-       if (ipending & MIPS_INT_MASK_4) {
-               tx39_irqhigh_intr(ipending, pc, status, cause);
+               /* IRQHIGH */
+               if (ipending & MIPS_INT_MASK_4) {
+                       tx39_irqhigh_intr(ipending, pc, status);
+               }
+
+               /* IRQLOW */
+               if (ipending & MIPS_INT_MASK_2) {
+                       for (i = 1; i <= TX39_INTRSET_MAX; i++) {
+                               int ofs;
+#ifdef TX392X
+                               if (i == 6)
+                                       continue;
+#endif /* TX392X */
+                               ofs = TX39_INTRSTATUS_REG(i);
+                               pend = sc->sc_regs[i];
+                               reg = sc->sc_le_mask[i] & pend;
+                               /* Clear interrupts */
+                               tx_conf_write(tc, ofs, reg);
+                               /* Dispatch handler */
+                               for (j = 0 ; j < 32; j++) {
+                                       if ((reg & (1 << j)) &&
+                                           sc->sc_le_fun[i][j]) {
+#ifdef TX39ICU_DEBUG
+                                               if (tx39icu_debug > 1) {
+                                                       tx39intrvec =
+                                                           (i << 16) | j;
+                                                       DPRINTF("IRQLOW "
+                                                           "%d:%d\n", i, j);
+                                               }
+#endif /* TX39ICU_DEBUG */
+                                               (*sc->sc_le_fun[i][j])
+                                                   (sc->sc_le_arg[i][j]);
 
-#ifdef __HAVE_FAST_SOFTINTS
-               goto softintr;
+                                       }
+                               }
+#ifdef TX39ICU_DEBUG_PRINT_PENDING_INTERRUPT
+                               pend &= ~reg;
+                               if (pend) {
+                                       printf("%d pending:", i);
+                                       dbg_bit_print(pend);
+                               }
+#endif
+
+                       }
+               }
+#ifdef TX39_WATCHDOGTIMER
+               {
+                       extern int      tx39biu_intr(void *);
+                       /* Bus error (If watch dog timer is enabled)*/
+                       if (ipending & MIPS_INT_MASK_1) {
+                               tx39biu_intr(0); /* Clear bus error */
+                       }
+               }
+               /*
+                * Read regsiter again
+                */
+               regs[0] = tx_conf_read(tc, TX39_INTRSTATUS6_REG);
+               regs[1] = tx_conf_read(tc, TX39_INTRSTATUS1_REG);
+               regs[2] = tx_conf_read(tc, TX39_INTRSTATUS2_REG);
+               regs[3] = tx_conf_read(tc, TX39_INTRSTATUS3_REG);
+               regs[4] = tx_conf_read(tc, TX39_INTRSTATUS4_REG);
+               regs[5] = tx_conf_read(tc, TX39_INTRSTATUS5_REG);
+#ifdef TX392X
+               regs[7] = tx_conf_read(tc, TX39_INTRSTATUS7_REG);
+               regs[8] = tx_conf_read(tc, TX39_INTRSTATUS8_REG);
+#endif
 #endif
        }
-
-       /* IRQLOW */
-       if (ipending & MIPS_INT_MASK_2) {
-               for (i = 1; i <= TX39_INTRSET_MAX; i++) {
-                       int ofs;
-#ifdef TX392X
-                       if (i == 6)
-                               continue;
-#endif /* TX392X */
-                       ofs = TX39_INTRSTATUS_REG(i);
-                       pend = sc->sc_regs[i];
-                       reg = sc->sc_le_mask[i] & pend;
-                       /* Clear interrupts */
-                       tx_conf_write(tc, ofs, reg);
-                       /* Dispatch handler */
-                       for (j = 0 ; j < 32; j++) {
-                               if ((reg & (1 << j)) &&
-                                   sc->sc_le_fun[i][j]) {
-#ifdef TX39ICU_DEBUG
-                                       if (tx39icu_debug > 1) {
-                                               tx39intrvec = (i << 16) | j;
-                                               DPRINTF("IRQLOW %d:%d\n", i, j);
-                                       }
-#endif /* TX39ICU_DEBUG */
-                                       (*sc->sc_le_fun[i][j])
-                                           (sc->sc_le_arg[i][j]);
-
-                               }
-                       }
-#ifdef TX39ICU_DEBUG_PRINT_PENDING_INTERRUPT
-                       pend &= ~reg;
-                       if (pend) {
-                               printf("%d pending:", i);
-                               dbg_bit_print(pend);
-                       }
-#endif
-
-               }
-       }
-#ifdef TX39_WATCHDOGTIMER
-       {
-               extern int      tx39biu_intr(void *);
-               /* Bus error (If watch dog timer is enabled)*/
-               if (ipending & MIPS_INT_MASK_1) {
-                       tx39biu_intr(0); /* Clear bus error */
-               }
-       }
-#endif
 #if 0
        /* reset priority mask */
        reg = tx_conf_read(tc, TX39_INTRENABLE6_REG);
        reg = TX39_INTRENABLE6_PRIORITYMASK_SET(reg, 0xffff);
        tx_conf_write(tc, TX39_INTRENABLE6_REG, reg);
 #endif
-
-#ifdef __HAVE_FAST_SOFTINTS
- softintr:
-#endif
-       ci->ci_idepth--;
-#ifdef __HAVE_FAST_SOFTINTS
-       ipending &= MIPS_SOFT_INT_MASK;
-       if (ipending == 0)
-               return;
-       softint_process(ipending);
-#endif
 }
 
 int
@@ -441,8 +434,7 @@
 }



Home | Main Index | Thread Index | Old Index