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