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);

Reply via email to