Date: Tue, 27 Apr 2010 23:22:12 +0000 (UTC) From: Juli Mallett <jmallett@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r207302 - user/jmallett/octeon/sys/mips/cavium Message-ID: <201004272322.o3RNMCiV052620@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jmallett Date: Tue Apr 27 23:22:12 2010 New Revision: 207302 URL: http://svn.freebsd.org/changeset/base/207302 Log: Make CIU_IRQ_ENx_END the last IRQ rather than one past it since that's what rman actually wants. Add interrupt counters for CIU interrupts. Modified: user/jmallett/octeon/sys/mips/cavium/ciu.c Modified: user/jmallett/octeon/sys/mips/cavium/ciu.c ============================================================================== --- user/jmallett/octeon/sys/mips/cavium/ciu.c Tue Apr 27 22:50:45 2010 (r207301) +++ user/jmallett/octeon/sys/mips/cavium/ciu.c Tue Apr 27 23:22:12 2010 (r207302) @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD: user/jmallett/octeon #include <sys/malloc.h> #include <machine/bus.h> +#include <machine/intr_machdep.h> #include <contrib/octeon-sdk/cvmx.h> #include <contrib/octeon-sdk/cvmx-interrupt.h> @@ -52,18 +53,23 @@ __FBSDID("$FreeBSD: user/jmallett/octeon #define CIU_IRQ_HARD (0) #define CIU_IRQ_EN0_BEGIN CVMX_IRQ_WORKQ0 -#define CIU_IRQ_EN0_END (CVMX_IRQ_BOOTDMA + 1) +#define CIU_IRQ_EN0_END CVMX_IRQ_BOOTDMA +#define CIU_IRQ_EN0_COUNT ((CIU_IRQ_EN0_END - CIU_IRQ_EN0_BEGIN) + 1) #define CIU_IRQ_EN1_BEGIN CVMX_IRQ_WDOG0 -#define CIU_IRQ_EN1_END (CVMX_IRQ_WDOG15 + 1) +#define CIU_IRQ_EN1_END CVMX_IRQ_WDOG15 +#define CIU_IRQ_EN1_COUNT ((CIU_IRQ_EN1_END - CIU_IRQ_EN1_BEGIN) + 1) struct ciu_softc { struct rman irq_rman; struct resource *ciu_irq; }; -static struct intr_event *ciu_en0_intr_events[CIU_IRQ_EN0_END - CIU_IRQ_EN0_BEGIN]; -static struct intr_event *ciu_en1_intr_events[CIU_IRQ_EN1_END - CIU_IRQ_EN1_BEGIN]; +static mips_intrcnt_t ciu_en0_intrcnt[CIU_IRQ_EN0_COUNT]; +static mips_intrcnt_t ciu_en1_intrcnt[CIU_IRQ_EN1_COUNT]; + +static struct intr_event *ciu_en0_intr_events[CIU_IRQ_EN0_COUNT]; +static struct intr_event *ciu_en1_intr_events[CIU_IRQ_EN1_COUNT]; static int ciu_probe(device_t); static int ciu_attach(device_t); @@ -95,7 +101,9 @@ ciu_probe(device_t dev) static int ciu_attach(device_t dev) { + char name[MAXCOMLEN + 1]; struct ciu_softc *sc; + unsigned i; int error; int rid; @@ -131,6 +139,16 @@ ciu_attach(device_t dev) if (error != 0) return (error); + for (i = 0; i < CIU_IRQ_EN0_COUNT; i++) { + snprintf(name, sizeof name, "int%d:", i + CIU_IRQ_EN0_BEGIN); + ciu_en0_intrcnt[i] = mips_intrcnt_create(name); + } + + for (i = 0; i < CIU_IRQ_EN1_COUNT; i++) { + snprintf(name, sizeof name, "int%d:", i + CIU_IRQ_EN1_BEGIN); + ciu_en1_intrcnt[i] = mips_intrcnt_create(name); + } + bus_generic_probe(dev); bus_generic_attach(dev); @@ -176,16 +194,19 @@ ciu_setup_intr(device_t bus, device_t ch struct intr_event *event, **eventp; void (*mask_func)(void *); void (*unmask_func)(void *); + mips_intrcnt_t intrcnt; int error; int irq; irq = rman_get_start(res); - if (irq < CIU_IRQ_EN0_END) { + if (irq <= CIU_IRQ_EN0_END) { eventp = &ciu_en0_intr_events[irq - CIU_IRQ_EN0_BEGIN]; + intrcnt = ciu_en0_intrcnt[irq - CIU_IRQ_EN0_BEGIN]; mask_func = ciu_en0_intr_mask; unmask_func = ciu_en0_intr_unmask; } else { eventp = &ciu_en1_intr_events[irq - CIU_IRQ_EN1_BEGIN]; + intrcnt = ciu_en1_intrcnt[irq - CIU_IRQ_EN1_BEGIN]; mask_func = ciu_en1_intr_mask; unmask_func = ciu_en1_intr_unmask; } @@ -204,6 +225,8 @@ ciu_setup_intr(device_t bus, device_t ch intr_event_add_handler(event, device_get_nameunit(child), filter, intr, arg, intr_priority(flags), flags, cookiep); + mips_intrcnt_setname(intrcnt, event->ie_fullname); + return (0); } @@ -290,6 +313,8 @@ ciu_intr(void *arg) if ((en0_sum & 1) == 0) continue; + mips_intrcnt_inc(ciu_en0_intrcnt[irq_index]); + error = intr_event_handle(ciu_en0_intr_events[irq_index], NULL); if (error != 0) printf("%s: stray en0 irq%d\n", __func__, irq_index); @@ -300,6 +325,8 @@ ciu_intr(void *arg) if ((en1_sum & 1) == 0) continue; + mips_intrcnt_inc(ciu_en1_intrcnt[irq_index]); + error = intr_event_handle(ciu_en1_intr_events[irq_index], NULL); if (error != 0) printf("%s: stray en1 irq%d\n", __func__, irq_index);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201004272322.o3RNMCiV052620>