svn commit: r207302 - user/jmallett/octeon/sys/mips/cavium

Juli Mallett jmallett at FreeBSD.org
Tue Apr 27 23:22:13 UTC 2010


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


More information about the svn-src-user mailing list