Module Name: src
Committed By: matt
Date: Sat May 15 06:22:38 UTC 2010
Modified Files:
src/sys/arch/mips/sibyte/dev [matt-nb5-mips64]: sbwdog.c
src/sys/arch/sbmips/sbmips [matt-nb5-mips64]: sb1250_icu.c
Log Message:
Make the sibyte watchdog establish an interrupt, and if taken, drop into DDB.
Make sure these interrupt are not blocked by IPL_HIGH.
To generate a diff of this commit:
cvs rdiff -u -r1.7.94.1 -r1.7.94.2 src/sys/arch/mips/sibyte/dev/sbwdog.c
cvs rdiff -u -r1.9.36.12 -r1.9.36.13 src/sys/arch/sbmips/sbmips/sb1250_icu.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/mips/sibyte/dev/sbwdog.c
diff -u src/sys/arch/mips/sibyte/dev/sbwdog.c:1.7.94.1 src/sys/arch/mips/sibyte/dev/sbwdog.c:1.7.94.2
--- src/sys/arch/mips/sibyte/dev/sbwdog.c:1.7.94.1 Mon Nov 23 18:28:47 2009
+++ src/sys/arch/mips/sibyte/dev/sbwdog.c Sat May 15 06:22:38 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: sbwdog.c,v 1.7.94.1 2009/11/23 18:28:47 matt Exp $ */
+/* $NetBSD: sbwdog.c,v 1.7.94.2 2010/05/15 06:22:38 matt Exp $ */
/*
* Copyright (c) 2002 Wasabi Systems, Inc.
@@ -40,8 +40,9 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sbwdog.c,v 1.7.94.1 2009/11/23 18:28:47 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sbwdog.c,v 1.7.94.2 2010/05/15 06:22:38 matt Exp $");
+#include "locators.h"
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/device.h>
@@ -58,7 +59,7 @@
#define SBWDOG_DEFAULT_PERIOD 5 /* Default to 5 seconds. */
struct sbwdog_softc {
- struct device sc_dev;
+ device_t sc_dev;
struct sysmon_wdog sc_smw;
u_long sc_addr;
int sc_wdog_armed;
@@ -69,8 +70,9 @@
static void sbwdog_attach(struct device *, struct device *, void *);
static int sbwdog_tickle(struct sysmon_wdog *);
static int sbwdog_setmode(struct sysmon_wdog *);
+static void sbwdog_intr(void *, uint32_t, vaddr_t);
-CFATTACH_DECL(sbwdog, sizeof(struct sbwdog_softc),
+CFATTACH_DECL_NEW(sbwdog, sizeof(struct sbwdog_softc),
sbwdog_match, sbwdog_attach, NULL, NULL);
#define READ_REG(rp) (mips3_ld((volatile uint64_t *)(rp)))
@@ -90,23 +92,27 @@
static void
sbwdog_attach(struct device *parent, struct device *self, void *aux)
{
- struct sbwdog_softc *sc = (void *)self;
+ struct sbwdog_softc *sc = device_private(self);
struct sbscd_attach_args *sa = aux;
+ sc->sc_dev = self;
sc->sc_wdog_period = SBWDOG_DEFAULT_PERIOD;
sc->sc_addr = MIPS_PHYS_TO_KSEG1(sa->sa_base + sa->sa_locs.sa_offset);
- printf(": %d second period\n", sc->sc_wdog_period);
+ aprint_normal(": %d second period\n", sc->sc_wdog_period);
- sc->sc_smw.smw_name = sc->sc_dev.dv_xname;
+ sc->sc_smw.smw_name = device_xname(sc->sc_dev);
sc->sc_smw.smw_cookie = sc;
sc->sc_smw.smw_setmode = sbwdog_setmode;
sc->sc_smw.smw_tickle = sbwdog_tickle;
sc->sc_smw.smw_period = sc->sc_wdog_period;
if (sysmon_wdog_register(&sc->sc_smw) != 0)
- printf("%s: unable to register with sysmon\n",
- sc->sc_dev.dv_xname);
+ aprint_error_dev(self, "unable to register with sysmon\n");
+
+ if (sa->sa_locs.sa_intr[0] != SBOBIOCF_INTR_DEFAULT)
+ cpu_intr_establish(sa->sa_locs.sa_intr[0], IPL_HIGH,
+ sbwdog_intr, sc);
}
static int
@@ -118,6 +124,20 @@
return (0);
}
+static void
+sbwdog_intr(void *v, uint32_t cause, vaddr_t pc)
+{
+ struct sbwdog_softc *sc = v;
+
+ WRITE_REG(sc->sc_addr + R_SCD_WDOG_CFG, M_SCD_WDOG_ENABLE);
+ WRITE_REG(sc->sc_addr + R_SCD_WDOG_CFG, 0);
+ cpu_Debugger();
+ WRITE_REG(sc->sc_addr + R_SCD_WDOG_INIT,
+ sc->sc_wdog_period * V_SCD_WDOG_FREQ);
+ WRITE_REG(sc->sc_addr + R_SCD_WDOG_CFG, M_SCD_WDOG_ENABLE);
+}
+
+
static int
sbwdog_setmode(struct sysmon_wdog *smw)
{
Index: src/sys/arch/sbmips/sbmips/sb1250_icu.c
diff -u src/sys/arch/sbmips/sbmips/sb1250_icu.c:1.9.36.12 src/sys/arch/sbmips/sbmips/sb1250_icu.c:1.9.36.13
--- src/sys/arch/sbmips/sbmips/sb1250_icu.c:1.9.36.12 Wed May 12 19:11:33 2010
+++ src/sys/arch/sbmips/sbmips/sb1250_icu.c Sat May 15 06:22:38 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: sb1250_icu.c,v 1.9.36.12 2010/05/12 19:11:33 matt Exp $ */
+/* $NetBSD: sb1250_icu.c,v 1.9.36.13 2010/05/15 06:22:38 matt Exp $ */
/*
* Copyright 2000, 2001
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sb1250_icu.c,v 1.9.36.12 2010/05/12 19:11:33 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sb1250_icu.c,v 1.9.36.13 2010/05/15 06:22:38 matt Exp $");
#define __INTR_PRIVATE
@@ -62,13 +62,15 @@
[IPL_SOFTNET] = MIPS_SOFT_INT_MASK,
[IPL_SOFTSERIAL] = MIPS_SOFT_INT_MASK,
[IPL_VM] = MIPS_SOFT_INT_MASK | MIPS_INT_MASK_0,
-#if IPL_SCHED == IPL_HIGH
- [IPL_SCHED] = MIPS_INT_MASK,
-#else
+#if IPL_SCHED < IPL_HIGH
[IPL_SCHED] = MIPS_SOFT_INT_MASK | MIPS_INT_MASK_0
| MIPS_INT_MASK_1 | MIPS_INT_MASK_5,
#endif
+ [IPL_HIGH] = MIPS_SOFT_INT_MASK | MIPS_INT_MASK_0
+ | MIPS_INT_MASK_1 | MIPS_INT_MASK_5,
+#if 0
[IPL_HIGH] = MIPS_INT_MASK,
+#endif
},
};
@@ -218,8 +220,10 @@
evcnt_attach_dynamic(evcnts, EVCNT_TYPE_INTR, NULL,
xname, sb1250_intr_names[i]);
}
+#if 0
WRITE_REG(cpu->sb1cpu_imr_base + SB1250_I_MAP(K_INT_WATCHDOG_TIMER_0), K_INT_MAP_NMI);
WRITE_REG(cpu->sb1cpu_imr_base + SB1250_I_MAP(K_INT_WATCHDOG_TIMER_1), K_INT_MAP_NMI);
+#endif
WRITE_REG(cpu->sb1cpu_imr_base + R_IMR_INTERRUPT_MASK, cpu->sb1cpu_imr_all);
#ifdef MULTIPROCESSOR
@@ -341,7 +345,9 @@
ih->ih_arg = arg;
ih->ih_ipl = ipl;
- if (ipl > IPL_VM)
+ if (num <= K_INT_WATCHDOG_TIMER_1)
+ WRITE_REG(cpu->sb1cpu_imr_base + SB1250_I_MAP(num), K_INT_MAP_I4);
+ else if (ipl > IPL_VM)
WRITE_REG(cpu->sb1cpu_imr_base + SB1250_I_MAP(num), K_INT_MAP_I1);
WRITE_REG(cpu->sb1cpu_imr_base + R_IMR_INTERRUPT_MASK, cpu->sb1cpu_imr_all);