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