Module Name:    src
Committed By:   cliff
Date:           Fri May 21 23:35:42 UTC 2010

Modified Files:
        src/sys/arch/mips/rmi [matt-nb5-mips64]: rmixl_intr.c rmixl_intr.h

Log Message:
- rename IRT based interrupts to "pic int ..."
- rename rmixl_vecnames_common to "vec ..."
- move ipl_eimr_map table print into rmixl_ipl_eimr_map_print()
- consolidate debug print funcs at the end of the file
- 'irq' -- being somewhat ambiguous -- renamed to 'irt' throughout
  to reflect use as IRT index
- IRT-based interrupts are moved to EIRR/EIMR vectors (bits) 32..63
  to avoid all opverlap with EIRR/EIMR bits 0..7 which are CAUSE[8..15].
  To date this has been a non-issue since we aren't using the
  watchdog or timers there.  non-IRT interrupts (FMN and IPI) are moved
  to unused portion vectors 8, 9
- in rmixl_intr_init_cpu, instead of writing 0 to EIRR, ack with bits read
  (excluding CAUSE[8..15] bits) as defense against possible stale
  interrupts inherited from firmware (paranoid -- we aren't seeing any).
- rmixl_irt_establish gets a 'vec' arg for use in IRTENTRYC1 reg
  (no longer assume vec = irt)
- set/clear irq bits in ipl_eimr_map[] during interrupt establish/disestablish
- in evbmips_iointr(), mask off ints enabled at higher ipl; we only
  dispatch interrupts at highest enabling ipl.


To generate a diff of this commit:
cvs rdiff -u -r1.1.2.19 -r1.1.2.20 src/sys/arch/mips/rmi/rmixl_intr.c
cvs rdiff -u -r1.1.2.3 -r1.1.2.4 src/sys/arch/mips/rmi/rmixl_intr.h

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/rmi/rmixl_intr.c
diff -u src/sys/arch/mips/rmi/rmixl_intr.c:1.1.2.19 src/sys/arch/mips/rmi/rmixl_intr.c:1.1.2.20
--- src/sys/arch/mips/rmi/rmixl_intr.c:1.1.2.19	Thu May  6 20:48:39 2010
+++ src/sys/arch/mips/rmi/rmixl_intr.c	Fri May 21 23:35:42 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: rmixl_intr.c,v 1.1.2.19 2010/05/06 20:48:39 cliff Exp $	*/
+/*	$NetBSD: rmixl_intr.c,v 1.1.2.20 2010/05/21 23:35:42 cliff Exp $	*/
 
 /*-
  * Copyright (c) 2007 Ruslan Ermilov and Vsevolod Lobko.
@@ -64,7 +64,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rmixl_intr.c,v 1.1.2.19 2010/05/06 20:48:39 cliff Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rmixl_intr.c,v 1.1.2.20 2010/05/21 23:35:42 cliff Exp $");
 
 #include "opt_ddb.h"
 #define	__INTR_PRIVATE
@@ -116,7 +116,7 @@
 /*
  * IRT assignments depends on the RMI chip family
  * (XLS1xx vs. XLS2xx vs. XLS3xx vs. XLS6xx)
- * use the right irq (and display string table) for the CPU that's running.
+ * use the right display string table for the CPU that's running.
  */
 
 /*
@@ -124,38 +124,38 @@
  * - use for XLRxxx
  */
 static const char * const rmixl_irtnames_xlrxxx[NIRTS] = {
-	"int 0 (watchdog)",	/*  0 */
-	"int 1 (timer0)",	/*  1 */
-	"int 2 (timer1)",	/*  2 */
-	"int 3 (timer2)",	/*  3 */
-	"int 4 (timer3)",	/*  4 */
-	"int 5 (timer4)",	/*  5 */
-	"int 6 (timer5)",	/*  6 */
-	"int 7 (timer6)",	/*  7 */
-	"int 8 (timer7)",	/*  8 */
-	"int 9 (uart0)",	/*  9 */
-	"int 10 (uart1)",	/* 10 */
-	"int 11 (i2c0)",	/* 11 */
-	"int 12 (i2c1)",	/* 12 */
-	"int 13 (pcmcia)",	/* 13 */
-	"int 14 (gpio)",	/* 14 */
-	"int 15 (hyper)",	/* 15 */
-	"int 16 (pcix)",	/* 16 */
-	"int 17 (gmac0)",	/* 17 */
-	"int 18 (gmac1)",	/* 18 */
-	"int 19 (gmac2)",	/* 19 */
-	"int 20 (gmac3)",	/* 20 */
-	"int 21 (xgs0)",	/* 21 */
-	"int 22 (xgs1)",	/* 22 */
-	"int 23 (irq23)",	/* 23 */
-	"int 24 (hyper_fatal)",	/* 24 */
-	"int 25 (bridge_aerr)",	/* 25 */
-	"int 26 (bridge_berr)",	/* 26 */
-	"int 27 (bridge_tb)",	/* 27 */
-	"int 28 (bridge_nmi)",	/* 28 */
-	"int 29 (bridge_sram_derr)",	/* 29 */
-	"int 30 (gpio_fatal)",	/* 30 */
-	"int 31 (reserved)",	/* 31 */
+	"pic int 0 (watchdog)",		/*  0 */
+	"pic int 1 (timer0)",		/*  1 */
+	"pic int 2 (timer1)",		/*  2 */
+	"pic int 3 (timer2)",		/*  3 */
+	"pic int 4 (timer3)",		/*  4 */
+	"pic int 5 (timer4)",		/*  5 */
+	"pic int 6 (timer5)",		/*  6 */
+	"pic int 7 (timer6)",		/*  7 */
+	"pic int 8 (timer7)",		/*  8 */
+	"pic int 9 (uart0)",		/*  9 */
+	"pic int 10 (uart1)",		/* 10 */
+	"pic int 11 (i2c0)",		/* 11 */
+	"pic int 12 (i2c1)",		/* 12 */
+	"pic int 13 (pcmcia)",		/* 13 */
+	"pic int 14 (gpio)",		/* 14 */
+	"pic int 15 (hyper)",		/* 15 */
+	"pic int 16 (pcix)",		/* 16 */
+	"pic int 17 (gmac0)",		/* 17 */
+	"pic int 18 (gmac1)",		/* 18 */
+	"pic int 19 (gmac2)",		/* 19 */
+	"pic int 20 (gmac3)",		/* 20 */
+	"pic int 21 (xgs0)",		/* 21 */
+	"pic int 22 (xgs1)",		/* 22 */
+	"pic int 23 (irq23)",		/* 23 */
+	"pic int 24 (hyper_fatal)",	/* 24 */
+	"pic int 25 (bridge_aerr)",	/* 25 */
+	"pic int 26 (bridge_berr)",	/* 26 */
+	"pic int 27 (bridge_tb)",	/* 27 */
+	"pic int 28 (bridge_nmi)",	/* 28 */
+	"pic int 29 (bridge_sram_derr)",/* 29 */
+	"pic int 30 (gpio_fatal)",	/* 30 */
+	"pic int 31 (reserved)",	/* 31 */
 };
 
 /*
@@ -163,38 +163,38 @@
  * - use for XLS2xx
  */
 static const char * const rmixl_irtnames_xls2xx[NIRTS] = {
-	"int 0 (watchdog)",	/*  0 */
-	"int 1 (timer0)",	/*  1 */
-	"int 2 (timer1)",	/*  2 */
-	"int 3 (timer2)",	/*  3 */
-	"int 4 (timer3)",	/*  4 */
-	"int 5 (timer4)",	/*  5 */
-	"int 6 (timer5)",	/*  6 */
-	"int 7 (timer6)",	/*  7 */
-	"int 8 (timer7)",	/*  8 */
-	"int 9 (uart0)",	/*  9 */
-	"int 10 (uart1)",	/* 10 */
-	"int 11 (i2c0)",	/* 11 */
-	"int 12 (i2c1)",	/* 12 */
-	"int 13 (pcmcia)",	/* 13 */
-	"int 14 (gpio_a)",	/* 14 */
-	"int 15 (irq15)",	/* 15 */
-	"int 16 (bridge_tb)",	/* 16 */
-	"int 17 (gmac0)",	/* 17 */
-	"int 18 (gmac1)",	/* 18 */
-	"int 19 (gmac2)",	/* 19 */
-	"int 20 (gmac3)",	/* 20 */
-	"int 21 (irq21)",	/* 21 */
-	"int 22 (irq22)",	/* 22 */
-	"int 23 (pcie_link2)",	/* 23 */
-	"int 24 (pcie_link3)",	/* 24 */
-	"int 25 (bridge_err)",	/* 25 */
-	"int 26 (pcie_link0)",	/* 26 */
-	"int 27 (pcie_link1)",	/* 27 */
-	"int 28 (irq28)",	/* 28 */
-	"int 29 (pcie_err)",	/* 29 */
-	"int 30 (gpio_b)",	/* 30 */
-	"int 31 (usb)",		/* 31 */
+	"pic int 0 (watchdog)",		/*  0 */
+	"pic int 1 (timer0)",		/*  1 */
+	"pic int 2 (timer1)",		/*  2 */
+	"pic int 3 (timer2)",		/*  3 */
+	"pic int 4 (timer3)",		/*  4 */
+	"pic int 5 (timer4)",		/*  5 */
+	"pic int 6 (timer5)",		/*  6 */
+	"pic int 7 (timer6)",		/*  7 */
+	"pic int 8 (timer7)",		/*  8 */
+	"pic int 9 (uart0)",		/*  9 */
+	"pic int 10 (uart1)",		/* 10 */
+	"pic int 11 (i2c0)",		/* 11 */
+	"pic int 12 (i2c1)",		/* 12 */
+	"pic int 13 (pcmcia)",		/* 13 */
+	"pic int 14 (gpio_a)",		/* 14 */
+	"pic int 15 (irq15)",		/* 15 */
+	"pic int 16 (bridge_tb)",	/* 16 */
+	"pic int 17 (gmac0)",		/* 17 */
+	"pic int 18 (gmac1)",		/* 18 */
+	"pic int 19 (gmac2)",		/* 19 */
+	"pic int 20 (gmac3)",		/* 20 */
+	"pic int 21 (irq21)",		/* 21 */
+	"pic int 22 (irq22)",		/* 22 */
+	"pic int 23 (pcie_link2)",	/* 23 */
+	"pic int 24 (pcie_link3)",	/* 24 */
+	"pic int 25 (bridge_err)",	/* 25 */
+	"pic int 26 (pcie_link0)",	/* 26 */
+	"pic int 27 (pcie_link1)",	/* 27 */
+	"pic int 28 (irq28)",		/* 28 */
+	"pic int 29 (pcie_err)",	/* 29 */
+	"pic int 30 (gpio_b)",		/* 30 */
+	"pic int 31 (usb)",		/* 31 */
 };
 
 /*
@@ -202,38 +202,38 @@
  * - use for XLS1xx, XLS4xx-Lite
  */
 static const char * const rmixl_irtnames_xls1xx[NIRTS] = {
-	"int 0 (watchdog)",	/*  0 */
-	"int 1 (timer0)",	/*  1 */
-	"int 2 (timer1)",	/*  2 */
-	"int 3 (timer2)",	/*  3 */
-	"int 4 (timer3)",	/*  4 */
-	"int 5 (timer4)",	/*  5 */
-	"int 6 (timer5)",	/*  6 */
-	"int 7 (timer6)",	/*  7 */
-	"int 8 (timer7)",	/*  8 */
-	"int 9 (uart0)",	/*  9 */
-	"int 10 (uart1)",	/* 10 */
-	"int 11 (i2c0)",	/* 11 */
-	"int 12 (i2c1)",	/* 12 */
-	"int 13 (pcmcia)",	/* 13 */
-	"int 14 (gpio_a)",	/* 14 */
-	"int 15 (irq15)",	/* 15 */
-	"int 16 (bridge_tb)",	/* 16 */
-	"int 17 (gmac0)",	/* 17 */
-	"int 18 (gmac1)",	/* 18 */
-	"int 19 (gmac2)",	/* 19 */
-	"int 20 (gmac3)",	/* 20 */
-	"int 21 (irq21)",	/* 21 */
-	"int 22 (irq22)",	/* 22 */
-	"int 23 (irq23)",	/* 23 */
-	"int 24 (irq24)",	/* 24 */
-	"int 25 (bridge_err)",	/* 25 */
-	"int 26 (pcie_link0)",	/* 26 */
-	"int 27 (pcie_link1)",	/* 27 */
-	"int 28 (irq28)",	/* 28 */
-	"int 29 (pcie_err)",	/* 29 */
-	"int 30 (gpio_b)",	/* 30 */
-	"int 31 (usb)",		/* 31 */
+	"pic int 0 (watchdog)",		/*  0 */
+	"pic int 1 (timer0)",		/*  1 */
+	"pic int 2 (timer1)",		/*  2 */
+	"pic int 3 (timer2)",		/*  3 */
+	"pic int 4 (timer3)",		/*  4 */
+	"pic int 5 (timer4)",		/*  5 */
+	"pic int 6 (timer5)",		/*  6 */
+	"pic int 7 (timer6)",		/*  7 */
+	"pic int 8 (timer7)",		/*  8 */
+	"pic int 9 (uart0)",		/*  9 */
+	"pic int 10 (uart1)",		/* 10 */
+	"pic int 11 (i2c0)",		/* 11 */
+	"pic int 12 (i2c1)",		/* 12 */
+	"pic int 13 (pcmcia)",		/* 13 */
+	"pic int 14 (gpio_a)",		/* 14 */
+	"pic int 15 (irq15)",		/* 15 */
+	"pic int 16 (bridge_tb)",	/* 16 */
+	"pic int 17 (gmac0)",		/* 17 */
+	"pic int 18 (gmac1)",		/* 18 */
+	"pic int 19 (gmac2)",		/* 19 */
+	"pic int 20 (gmac3)",		/* 20 */
+	"pic int 21 (irq21)",		/* 21 */
+	"pic int 22 (irq22)",		/* 22 */
+	"pic int 23 (irq23)",		/* 23 */
+	"pic int 24 (irq24)",		/* 24 */
+	"pic int 25 (bridge_err)",	/* 25 */
+	"pic int 26 (pcie_link0)",	/* 26 */
+	"pic int 27 (pcie_link1)",	/* 27 */
+	"pic int 28 (irq28)",		/* 28 */
+	"pic int 29 (pcie_err)",	/* 29 */
+	"pic int 30 (gpio_b)",		/* 30 */
+	"pic int 31 (usb)",		/* 31 */
 };
 
 /*
@@ -241,38 +241,38 @@
  * - use for XLS4xx, XLS6xx
  */
 static const char * const rmixl_irtnames_xls4xx[NIRTS] = {
-	"int 0 (watchdog)",	/*  0 */
-	"int 1 (timer0)",	/*  1 */
-	"int 2 (timer1)",	/*  2 */
-	"int 3 (timer2)",	/*  3 */
-	"int 4 (timer3)",	/*  4 */
-	"int 5 (timer4)",	/*  5 */
-	"int 6 (timer5)",	/*  6 */
-	"int 7 (timer6)",	/*  7 */
-	"int 8 (timer7)",	/*  8 */
-	"int 9 (uart0)",	/*  9 */
-	"int 10 (uart1)",	/* 10 */
-	"int 11 (i2c0)",	/* 11 */
-	"int 12 (i2c1)",	/* 12 */
-	"int 13 (pcmcia)",	/* 13 */
-	"int 14 (gpio_a)",	/* 14 */
-	"int 15 (irq15)",	/* 15 */
-	"int 16 (bridge_tb)",	/* 16 */
-	"int 17 (gmac0)",	/* 17 */
-	"int 18 (gmac1)",	/* 18 */
-	"int 19 (gmac2)",	/* 19 */
-	"int 20 (gmac3)",	/* 20 */
-	"int 21 (irq21)",	/* 21 */
-	"int 22 (irq22)",	/* 22 */
-	"int 23 (irq23)",	/* 23 */
-	"int 24 (irq24)",	/* 24 */
-	"int 25 (bridge_err)",	/* 25 */
-	"int 26 (pcie_link0)",	/* 26 */
-	"int 27 (pcie_link1)",	/* 27 */
-	"int 28 (pcie_link2)",	/* 28 */
-	"int 29 (pcie_link3)",	/* 29 */
-	"int 30 (gpio_b)",	/* 30 */
-	"int 31 (usb)",		/* 31 */
+	"pic int 0 (watchdog)",		/*  0 */
+	"pic int 1 (timer0)",		/*  1 */
+	"pic int 2 (timer1)",		/*  2 */
+	"pic int 3 (timer2)",		/*  3 */
+	"pic int 4 (timer3)",		/*  4 */
+	"pic int 5 (timer4)",		/*  5 */
+	"pic int 6 (timer5)",		/*  6 */
+	"pic int 7 (timer6)",		/*  7 */
+	"pic int 8 (timer7)",		/*  8 */
+	"pic int 9 (uart0)",		/*  9 */
+	"pic int 10 (uart1)",		/* 10 */
+	"pic int 11 (i2c0)",		/* 11 */
+	"pic int 12 (i2c1)",		/* 12 */
+	"pic int 13 (pcmcia)",		/* 13 */
+	"pic int 14 (gpio_a)",		/* 14 */
+	"pic int 15 (irq15)",		/* 15 */
+	"pic int 16 (bridge_tb)",	/* 16 */
+	"pic int 17 (gmac0)",		/* 17 */
+	"pic int 18 (gmac1)",		/* 18 */
+	"pic int 19 (gmac2)",		/* 19 */
+	"pic int 20 (gmac3)",		/* 20 */
+	"pic int 21 (irq21)",		/* 21 */
+	"pic int 22 (irq22)",		/* 22 */
+	"pic int 23 (irq23)",		/* 23 */
+	"pic int 24 (irq24)",		/* 24 */
+	"pic int 25 (bridge_err)",	/* 25 */
+	"pic int 26 (pcie_link0)",	/* 26 */
+	"pic int 27 (pcie_link1)",	/* 27 */
+	"pic int 28 (pcie_link2)",	/* 28 */
+	"pic int 29 (pcie_link3)",	/* 29 */
+	"pic int 30 (gpio_b)",		/* 30 */
+	"pic int 31 (usb)",		/* 31 */
 };
 
 /*
@@ -281,70 +281,70 @@
  * - covers all vectors, not just IRT intrs
  */
 static const char * const rmixl_vecnames_common[NINTRVECS] = {
-	"int 0",	/*  0 */
-	"int 1",	/*  1 */
-	"int 2",	/*  2 */
-	"int 3",	/*  3 */
-	"int 4",	/*  4 */
-	"int 5",	/*  5 */
-	"int 6",	/*  6 */
-	"int 7",	/*  7 */
-	"int 8",	/*  8 */
-	"int 9",	/*  9 */
-	"int 10",	/* 10 */
-	"int 11",	/* 11 */
-	"int 12",	/* 12 */
-	"int 13",	/* 13 */
-	"int 14",	/* 14 */
-	"int 15",	/* 15 */
-	"int 16",	/* 16 */
-	"int 17",	/* 17 */
-	"int 18",	/* 18 */
-	"int 19",	/* 19 */
-	"int 20",	/* 20 */
-	"int 21",	/* 21 */
-	"int 22",	/* 22 */
-	"int 23",	/* 23 */
-	"int 24",	/* 24 */
-	"int 25",	/* 25 */
-	"int 26",	/* 26 */
-	"int 27",	/* 27 */
-	"int 28",	/* 28 */
-	"int 29",	/* 29 */
-	"int 30",	/* 30 */
-	"int 31",	/* 31 */
-	"int 32 (ipi)",	/* 32 */
-	"int 33 (fmn)",	/* 33 */
-	"int 34",	/* 34 */
-	"int 35",	/* 35 */
-	"int 36",	/* 36 */
-	"int 37",	/* 37 */
-	"int 38",	/* 38 */
-	"int 39",	/* 39 */
-	"int 40",	/* 40 */
-	"int 41",	/* 41 */
-	"int 42",	/* 42 */
-	"int 43",	/* 43 */
-	"int 44",	/* 44 */
-	"int 45",	/* 45 */
-	"int 46",	/* 46 */
-	"int 47",	/* 47 */
-	"int 48",	/* 48 */
-	"int 49",	/* 49 */
-	"int 50",	/* 50 */
-	"int 51",	/* 51 */
-	"int 52",	/* 52 */
-	"int 53",	/* 53 */
-	"int 54",	/* 54 */
-	"int 55",	/* 55 */
-	"int 56",	/* 56 */
-	"int 57",	/* 57 */
-	"int 58",	/* 58 */
-	"int 59",	/* 59 */
-	"int 60",	/* 60 */
-	"int 61",	/* 61 */
-	"int 62",	/* 63 */
-	"int 63",	/* 63 */
+	"vec 0",		/*  0 */
+	"vec 1",		/*  1 */
+	"vec 2",		/*  2 */
+	"vec 3",		/*  3 */
+	"vec 4",		/*  4 */
+	"vec 5",		/*  5 */
+	"vec 6",		/*  6 */
+	"vec 7",		/*  7 */
+	"vec 8 (ipi)",		/*  8 */
+	"vec 9 (fmn)",		/*  9 */
+	"vec 10",		/* 10 */
+	"vec 11",		/* 11 */
+	"vec 12",		/* 12 */
+	"vec 13",		/* 13 */
+	"vec 14",		/* 14 */
+	"vec 15",		/* 15 */
+	"vec 16",		/* 16 */
+	"vec 17",		/* 17 */
+	"vec 18",		/* 18 */
+	"vec 19",		/* 19 */
+	"vec 20",		/* 20 */
+	"vec 21",		/* 21 */
+	"vec 22",		/* 22 */
+	"vec 23",		/* 23 */
+	"vec 24",		/* 24 */
+	"vec 25",		/* 25 */
+	"vec 26",		/* 26 */
+	"vec 27",		/* 27 */
+	"vec 28",		/* 28 */
+	"vec 29",		/* 29 */
+	"vec 30",		/* 30 */
+	"vec 31",		/* 31 */
+	"vec 32",		/* 32 */
+	"vec 33",		/* 33 */
+	"vec 34",		/* 34 */
+	"vec 35",		/* 35 */
+	"vec 36",		/* 36 */
+	"vec 37",		/* 37 */
+	"vec 38",		/* 38 */
+	"vec 39",		/* 39 */
+	"vec 40",		/* 40 */
+	"vec 41",		/* 41 */
+	"vec 42",		/* 42 */
+	"vec 43",		/* 43 */
+	"vec 44",		/* 44 */
+	"vec 45",		/* 45 */
+	"vec 46",		/* 46 */
+	"vec 47",		/* 47 */
+	"vec 48",		/* 48 */
+	"vec 49",		/* 49 */
+	"vec 50",		/* 50 */
+	"vec 51",		/* 51 */
+	"vec 52",		/* 52 */
+	"vec 53",		/* 53 */
+	"vec 54",		/* 54 */
+	"vec 55",		/* 55 */
+	"vec 56",		/* 56 */
+	"vec 57",		/* 57 */
+	"vec 58",		/* 58 */
+	"vec 59",		/* 59 */
+	"vec 60",		/* 60 */
+	"vec 61",		/* 61 */
+	"vec 62",		/* 63 */
+	"vec 63",		/* 63 */
 };
 
 /*
@@ -365,7 +365,7 @@
 static uint32_t rmixl_irt_thread_mask(int);
 static void rmixl_irt_init(int);
 static void rmixl_irt_disestablish(int);
-static void rmixl_irt_establish(int, int,
+static void rmixl_irt_establish(int, int, int,
 		rmixl_intr_trigger_t, rmixl_intr_polarity_t);
 
 #ifdef MULTIPROCESSOR
@@ -374,9 +374,10 @@
 #endif
 
 #if defined(IOINTR_DEBUG) || defined(DIAGNOSTIC)
-int rmixl_intrhand_print_subr(int);
-int rmixl_intrhand_print(void);
-int rmixl_irt_print(void);
+int  rmixl_intrhand_print_subr(int);
+int  rmixl_intrhand_print(void);
+int  rmixl_irt_print(void);
+void rmixl_ipl_eimr_map_print(void);
 #endif
 
 
@@ -391,20 +392,6 @@
 	return nlz;
 }
 
-static inline void
-rmixl_irt_entry_print(u_int irq)
-{
-#if defined(IOINTR_DEBUG) || defined(DDB)
-	uint32_t c0, c1;
-
-	if ((irq < 0) || (irq > NIRTS))
-		return;
-	c0 = RMIXL_PICREG_READ(RMIXL_PIC_IRTENTRYC0(irq));
-	c1 = RMIXL_PICREG_READ(RMIXL_PIC_IRTENTRYC1(irq));
-	printf("irt[%d]: %#x, %#x\n", irq, c0, c1);
-#endif
-}
-
 void
 evbmips_intr_init(void)
 {
@@ -413,20 +400,6 @@
 	KASSERT(cpu_rmixlr(mips_options.mips_cpu)
 	     || cpu_rmixls(mips_options.mips_cpu));
 
-#ifdef IOINTR_DEBUG
-	printf("IPL_NONE=%d, mask %#"PRIx64"\n",
-		IPL_NONE, ipl_eimr_map[IPL_NONE]);
-	printf("IPL_SOFTCLOCK=%d, mask %#"PRIx64"\n",
-		IPL_SOFTCLOCK, ipl_eimr_map[IPL_SOFTCLOCK]);
-	printf("IPL_SOFTNET=%d, mask %#"PRIx64"\n",
-		IPL_SOFTNET, ipl_eimr_map[IPL_SOFTNET]);
-	printf("IPL_VM=%d, mask %#"PRIx64"\n",
-		IPL_VM, ipl_eimr_map[IPL_VM]);
-	printf("IPL_SCHED=%d, mask %#"PRIx64"\n",
-		IPL_SCHED, ipl_eimr_map[IPL_HIGH]);
-	printf("IPL_HIGH=%d, mask %#"PRIx64"\n",
-		IPL_HIGH, ipl_eimr_map[IPL_NONE]);
-#endif
 
 #ifdef DIAGNOSTIC
 	if (rmixl_pic_init_done != 0)
@@ -503,8 +476,10 @@
 	struct rmixl_cpu_softc *sc = (void *)ci->ci_softc;
 	KASSERT(sc != NULL);
 
-	/* zero the EIRR ? */
-	uint64_t eirr = 0;
+	/* ack any pending in the EIRR, zeroing CAUSE[8..15] */
+	uint64_t eirr;
+	asm volatile("dmfc0 %0, $9, 6;" : "=r"(eirr));
+	eirr &= ~0xff;
 	asm volatile("dmtc0 %0, $9, 6;" :: "r"(eirr));
 
 	for (int vec=0; vec < NINTRVECS; vec++)
@@ -521,20 +496,23 @@
  * rmixl_intr_string - return pointer to display name of a PIC-based interrupt
  */
 const char *
-rmixl_intr_string(int irq)
+rmixl_intr_string(int vec)
 {
-	if (irq < 0 || irq >= NINTRVECS)
-		panic("%s: irq index %d out of range, max %d",
-			__func__, irq, NIRTS - 1);
+	int irt;
+
+	if (vec < 0 || vec >= NINTRVECS)
+		panic("%s: vec index %d out of range, max %d",
+			__func__, vec, NINTRVECS - 1);
 
-	if (irq >= NIRTS)
-		return rmixl_vecnames_common[irq];
+	if (! RMIXL_VECTOR_IS_IRT(vec))
+		return rmixl_vecnames_common[vec];
 
+	irt = RMIXL_VECTOR_IRT(vec);
 	switch(cpu_rmixl_chip_type(mips_options.mips_cpu)) {
 	case CIDFL_RMI_TYPE_XLR:
-		return rmixl_intr_string_xlr(irq);
+		return rmixl_intr_string_xlr(irt);
 	case CIDFL_RMI_TYPE_XLS:
-		return rmixl_intr_string_xls(irq);
+		return rmixl_intr_string_xls(irt);
 	case CIDFL_RMI_TYPE_XLP:
 		panic("%s: RMI XLP not yet supported", __func__);
 	}
@@ -543,13 +521,13 @@
 }
 
 static const char *
-rmixl_intr_string_xlr(int irq)
+rmixl_intr_string_xlr(int irt)
 {
-	return rmixl_irtnames_xlrxxx[irq];
+	return rmixl_irtnames_xlrxxx[irt];
 }
 
 static const char *
-rmixl_intr_string_xls(int irq)
+rmixl_intr_string_xls(int irt)
 {
 	const char *name;
 
@@ -558,21 +536,21 @@
 	case MIPS_XLS108:
 	case MIPS_XLS404LITE:
 	case MIPS_XLS408LITE:
-		name = rmixl_irtnames_xls1xx[irq];
+		name = rmixl_irtnames_xls1xx[irt];
 		break;
 	case MIPS_XLS204:
 	case MIPS_XLS208:
-		name = rmixl_irtnames_xls2xx[irq];
+		name = rmixl_irtnames_xls2xx[irt];
 		break;
 	case MIPS_XLS404:
 	case MIPS_XLS408:
 	case MIPS_XLS416:
 	case MIPS_XLS608:
 	case MIPS_XLS616:
-		name = rmixl_irtnames_xls4xx[irq];
+		name = rmixl_irtnames_xls4xx[irt];
 		break;
 	default:
-		name = rmixl_vecnames_common[irq];
+		name = rmixl_vecnames_common[RMIXL_IRT_VECTOR(irt)];
 		break;
 	}
 
@@ -632,39 +610,45 @@
 
 /*
  * rmixl_irt_init
- * - invalidate IRT Entry for irq
+ * - initialize IRT Entry for given index
  * - unmask Thread#0 in low word (assume we only have 1 thread)
  */
 static void
-rmixl_irt_init(int irq)
+rmixl_irt_init(int irt)
 {
-	RMIXL_PICREG_WRITE(RMIXL_PIC_IRTENTRYC1(irq), 0);	/* high word */
-	RMIXL_PICREG_WRITE(RMIXL_PIC_IRTENTRYC0(irq), 0);	/* low  word */
+	KASSERT(irt < NIRTS);
+	RMIXL_PICREG_WRITE(RMIXL_PIC_IRTENTRYC1(irt), 0);	/* high word */
+	RMIXL_PICREG_WRITE(RMIXL_PIC_IRTENTRYC0(irt), 0);	/* low  word */
 }
 
 /*
  * rmixl_irt_disestablish
- * - invalidate IRT Entry for irq
- * - writes to IRTENTRYC1 only; leave IRTENTRYC0 as-is
+ * - invalidate IRT Entry for given index
  */
 static void
-rmixl_irt_disestablish(int irq)
+rmixl_irt_disestablish(int irt)
 {
-	DPRINTF(("%s: irq %d, irtc1 %#x\n", __func__, irq, 0));
-	rmixl_irt_init(irq);
+	DPRINTF(("%s: irt %d, irtc1 %#x\n", __func__, irt, 0));
+	rmixl_irt_init(irt);
 }
 
 /*
  * rmixl_irt_establish
- * - construct an IRT Entry for irq and write to PIC
+ * - construct an IRT Entry for irt and write to PIC
  */
 static void
-rmixl_irt_establish(int irq, int cpumask, rmixl_intr_trigger_t trigger,
+rmixl_irt_establish(int irt, int vec, int cpumask, rmixl_intr_trigger_t trigger,
 	rmixl_intr_polarity_t polarity)
 {
 	uint32_t irtc1;
 	uint32_t irtc0;
 
+	if (irt >= NIRTS)
+		panic("%s: bad irt %d\n", __func__, irt);
+
+	if (! RMIXL_VECTOR_IS_IRT(vec))
+		panic("%s: bad vec %d\n", __func__, vec);
+
 	switch (trigger) {
 	case RMIXL_TRIG_EDGE:
 	case RMIXL_TRIG_LEVEL:
@@ -686,8 +670,8 @@
 	/*
 	 * XXX IRT entries are not shared
 	 */
-	KASSERT(RMIXL_PICREG_READ(RMIXL_PIC_IRTENTRYC0(irq)) == 0);
-	KASSERT(RMIXL_PICREG_READ(RMIXL_PIC_IRTENTRYC1(irq)) == 0);
+	KASSERT(RMIXL_PICREG_READ(RMIXL_PIC_IRTENTRYC0(irt)) == 0);
+	KASSERT(RMIXL_PICREG_READ(RMIXL_PIC_IRTENTRYC1(irt)) == 0);
 
 	irtc0 = rmixl_irt_thread_mask(cpumask);
 
@@ -700,15 +684,15 @@
 	if ((polarity == RMIXL_POLR_FALLING) || (polarity == RMIXL_POLR_LOW))
 		irtc1 |= RMIXL_PIC_IRTENTRYC1_P;
 
-	irtc1 |= irq;	/* route to vector 'irq' */
+	irtc1 |= vec;			/* vector in EIRR */
 
 	/*
 	 * write IRT Entry to PIC
 	 */
-	DPRINTF(("%s: irq %d, irtc0 %#x, irtc1 %#x\n",
-		__func__, irq, irtc0, irtc1));
-	RMIXL_PICREG_WRITE(RMIXL_PIC_IRTENTRYC0(irq), irtc0);	/* low  word */
-	RMIXL_PICREG_WRITE(RMIXL_PIC_IRTENTRYC1(irq), irtc1);	/* high word */
+	DPRINTF(("%s: irt %d, irtc0 %#x, irtc1 %#x\n",
+		__func__, irt, irtc0, irtc1));
+	RMIXL_PICREG_WRITE(RMIXL_PIC_IRTENTRYC0(irt), irtc0);	/* low  word */
+	RMIXL_PICREG_WRITE(RMIXL_PIC_IRTENTRYC1(irt), irtc1);	/* high word */
 }
 
 void *
@@ -716,11 +700,11 @@
 	int (*func)(void *), void *arg, bool mpsafe)
 {
 	rmixl_intrhand_t *ih;
+	uint64_t eimr_bit;
 	int s;
 
-	DPRINTF(("%s: vec %d, cpumask %#x, ipl %d, func %p, arg %p, "
-		"vec %d\n",
-			__func__, vec, cpumask, ipl, func, arg, vec));
+	DPRINTF(("%s: vec %d, cpumask %#x, ipl %d, func %p, arg %p\n"
+			__func__, vec, cpumask, ipl, func, arg));
 #ifdef DIAGNOSTIC
 	if (rmixl_pic_init_done == 0)
 		panic("%s: called before evbmips_intr_init", __func__);
@@ -739,25 +723,43 @@
 	s = splhigh();
 
 	ih = &rmixl_intrhand[vec];
+	if (ih->ih_func != NULL) {
+#ifdef DIAGNOSTIC
+		printf("%s: intrhand[%d] busy\n", __func__, vec);
+#endif
+		splx(s);
+		return NULL;
+	}
 
 	ih->ih_func = func;
 	ih->ih_arg = arg;
 	ih->ih_mpsafe = mpsafe;
-	ih->ih_irq = vec;
+	ih->ih_vec = vec;
 	ih->ih_ipl = ipl;
 	ih->ih_cpumask = cpumask;
 
+	eimr_bit = (uint64_t)1 << vec;
+	for (int i=ih->ih_ipl; --i >= 0; ) {
+		KASSERT((ipl_eimr_map[i] & eimr_bit) == 0);
+		ipl_eimr_map[i] |= eimr_bit;
+	}
+
 	splx(s);
 
 	return ih;
 }
 
+/*
+ * rmixl_intr_establish
+ * - used to establish an IRT-based interrupt only
+ */
 void *
-rmixl_intr_establish(int irq, int cpumask, int ipl,
+rmixl_intr_establish(int irt, int cpumask, int ipl,
 	rmixl_intr_trigger_t trigger, rmixl_intr_polarity_t polarity,
 	int (*func)(void *), void *arg, bool mpsafe)
 {
 	rmixl_intrhand_t *ih;
+	int vec;
 	int s;
 
 #ifdef DIAGNOSTIC
@@ -768,27 +770,28 @@
 	/*
 	 * check args
 	 */
-	if (irq < 0 || irq >= NINTRVECS)
-		panic("%s: irq %d out of range, max %d",
-			__func__, irq, NIRTS - 1);
+	if (irt < 0 || irt >= NIRTS)
+		panic("%s: irt %d out of range, max %d",
+			__func__, irt, NIRTS - 1);
 	if (ipl <= 0 || ipl >= _IPL_N)
 		panic("%s: ipl %d out of range, min %d, max %d",
 			__func__, ipl, 1, _IPL_N - 1);
 
-	DPRINTF(("%s: irq %d, ipl %d\n", __func__, irq, ipl));
+	vec = RMIXL_IRT_VECTOR(irt);
+
+	DPRINTF(("%s: irt %d, vec %d, ipl %d\n", __func__, irt, vec, ipl));
 
 	s = splhigh();
 
 	/*
 	 * establish vector
 	 */
-	ih = rmixl_vec_establish(irq, cpumask, ipl, func, arg, mpsafe);
+	ih = rmixl_vec_establish(vec, cpumask, ipl, func, arg, mpsafe);
 
 	/*
 	 * establish IRT Entry
 	 */
-	if (irq < 32)
-		rmixl_irt_establish(irq, cpumask, trigger, polarity);
+	rmixl_irt_establish(irt, vec, cpumask, trigger, polarity);
 
 	splx(s);
 
@@ -799,13 +802,21 @@
 rmixl_vec_disestablish(void *cookie)
 {
 	rmixl_intrhand_t *ih = cookie;
+	uint64_t eimr_bit;
 	int s;
 
-	KASSERT(ih = &rmixl_intrhand[ih->ih_irq]);
+	KASSERT(ih->ih_vec < NINTRVECS);
+	KASSERT(ih == &rmixl_intrhand[ih->ih_vec]);
 
 	s = splhigh();
 
-	ih->ih_func = NULL;	/* XXX race */
+	ih->ih_func = NULL;
+
+	eimr_bit = (uint64_t)1 << ih->ih_vec;
+	for (int i=ih->ih_ipl; --i >= 0; ) {
+		KASSERT((ipl_eimr_map[i] & eimr_bit) != 0);
+		ipl_eimr_map[i] ^= eimr_bit;
+	}
 
 	splx(s);
 }
@@ -817,16 +828,17 @@
 	int vec;
 	int s;
 
-	vec = ih->ih_irq;
+	vec = ih->ih_vec;
 
-	KASSERT(ih = &rmixl_intrhand[vec]);
+	KASSERT(vec < NINTRVECS);
+	KASSERT(ih == &rmixl_intrhand[vec]);
 
 	s = splhigh();
 
 	/*
 	 * disable/invalidate the IRT Entry if needed
 	 */
-	if (vec < 32)
+	if (RMIXL_VECTOR_IS_IRT(vec))
 		rmixl_irt_disestablish(vec);
 
 	/*
@@ -867,12 +879,14 @@
 #endif	/* IOINTR_DEBUG */
 
 		eirr &= ipl_eimr_map[ipl-1];
+		eirr &= ~ipl_eimr_map[ipl];		/* mask off higher ints */
 		eirr &= ~(MIPS_SOFT_INT_MASK >> 8);	/* mask off soft ints */
 		if (eirr == 0)
 			break;
 
 		vec = 63 - dclz(eirr);
 		ih = &rmixl_intrhand[vec];
+		KASSERT (ih->ih_ipl == ipl);
 
 		asm volatile("dmfc0 %0, $9, 7;" : "=r"(eimr));
 		asm volatile("dmtc0 $0, $9, 7;");
@@ -885,9 +899,9 @@
 		asm volatile("dmtc0 %0, $9, 6;" :: "r"(eirr));
 		asm volatile("dmtc0 %0, $9, 7;" :: "r"(eimr));
 
-		if (vec < 32)
+		if (RMIXL_VECTOR_IS_IRT(vec))
 			RMIXL_PICREG_WRITE(RMIXL_PIC_INTRACK,
-				(uint32_t)vecbit);
+				1 << RMIXL_VECTOR_IRT(vec));
 
 		if (ih->ih_func != NULL) {
 #ifdef MULTIPROCESSOR
@@ -902,7 +916,6 @@
 			(void)(*ih->ih_func)(ih->ih_arg);
 #endif /* MULTIPROCESSOR */
 		}
-
 		sc->sc_vec_evcnts[vec].ev_count++;
 	}
 }
@@ -950,13 +963,13 @@
 }
 #endif	/* MULTIPROCESSOR */
 
-#if defined(DIAGNOSTIC) || defined(IOINTR_DEBUG)
+#if defined(DIAGNOSTIC) || defined(IOINTR_DEBUG) || defined(DDB)
 int
 rmixl_intrhand_print_subr(int vec)
 {
 	rmixl_intrhand_t *ih = &rmixl_intrhand[vec];
-	printf("vec %d: func %p, arg %p, irq %d, ipl %d, mask %#x\n",
-		vec, ih->ih_func, ih->ih_arg, ih->ih_irq, ih->ih_ipl,
+	printf("vec %d: func %p, arg %p, vec %d, ipl %d, mask %#x\n",
+		vec, ih->ih_func, ih->ih_arg, ih->ih_vec, ih->ih_ipl,
 		ih->ih_cpumask);
 	return 0;
 }
@@ -967,6 +980,19 @@
 		rmixl_intrhand_print_subr(vec);
 	return 0;
 }
+
+static inline void
+rmixl_irt_entry_print(u_int irt)
+{
+	uint32_t c0, c1;
+
+	if ((irt < 0) || (irt > NIRTS))
+		return;
+	c0 = RMIXL_PICREG_READ(RMIXL_PIC_IRTENTRYC0(irt));
+	c1 = RMIXL_PICREG_READ(RMIXL_PIC_IRTENTRYC1(irt));
+	printf("irt[%d]: %#x, %#x\n", irt, c0, c1);
+}
+
 int
 rmixl_irt_print(void)
 {
@@ -975,4 +1001,24 @@
 		rmixl_irt_entry_print(irt);
 	return 0;
 }
+
+void
+rmixl_ipl_eimr_map_print(void)
+{
+	printf("IPL_NONE=%d, mask %#"PRIx64"\n",
+		IPL_NONE, ipl_eimr_map[IPL_NONE]);
+	printf("IPL_SOFTCLOCK=%d, mask %#"PRIx64"\n",
+		IPL_SOFTCLOCK, ipl_eimr_map[IPL_SOFTCLOCK]);
+	printf("IPL_SOFTNET=%d, mask %#"PRIx64"\n",
+		IPL_SOFTNET, ipl_eimr_map[IPL_SOFTNET]);
+	printf("IPL_VM=%d, mask %#"PRIx64"\n",
+		IPL_VM, ipl_eimr_map[IPL_VM]);
+	printf("IPL_SCHED=%d, mask %#"PRIx64"\n",
+		IPL_SCHED, ipl_eimr_map[IPL_SCHED]);
+	printf("IPL_DDB=%d, mask %#"PRIx64"\n",
+		IPL_DDB, ipl_eimr_map[IPL_DDB]);
+	printf("IPL_HIGH=%d, mask %#"PRIx64"\n",
+		IPL_HIGH, ipl_eimr_map[IPL_HIGH]);
+}
+
 #endif

Index: src/sys/arch/mips/rmi/rmixl_intr.h
diff -u src/sys/arch/mips/rmi/rmixl_intr.h:1.1.2.3 src/sys/arch/mips/rmi/rmixl_intr.h:1.1.2.4
--- src/sys/arch/mips/rmi/rmixl_intr.h:1.1.2.3	Tue Apr 13 18:15:16 2010
+++ src/sys/arch/mips/rmi/rmixl_intr.h	Fri May 21 23:35:42 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: rmixl_intr.h,v 1.1.2.3 2010/04/13 18:15:16 cliff Exp $	*/
+/*	$NetBSD: rmixl_intr.h,v 1.1.2.4 2010/05/21 23:35:42 cliff Exp $	*/
 /*-
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -32,20 +32,29 @@
 #define _MIPS_RMI_RMIXL_INTR_H_
 
 /*
- * An 'irq' is an EIRR bit numbers or 'vector' as used in the PRM
- * - PIC-based irqs are in the range 0..31 and index into the IRT
- * - IRT entry <n> always routes to vector <n>
- * - non-PIC-based irqs are in the range 32..63
- * - only 1 intrhand_t per irq/vector
+ * A 'vector' is bit number in EIRR/EIMR
+ * - non-IRT-based interrupts use vectors 0..31
+ * - IRT-based interrupts use vectors 32..63 
+ * - RMIXL_VECTOR_IRT(vec) is used to index into the IRT
+ * - IRT entry n always routes to vector RMIXL_IRT_VECTOR(n)
+ * - only 1 intrhand_t per vector
  */
 #define	NINTRVECS	64	/* bit width of the EIRR */
 #define	NIRTS		32	/* #entries in the Interrupt Redirection Table */
 
 /*
- * reserved vectors >=32
+ * mapping between IRT index and vector number
  */
-#define RMIXL_INTRVEC_IPI	32
-#define RMIXL_INTRVEC_FMN	33
+#define RMIXL_VECTOR_IS_IRT(vec)	((vec) >= 32)
+#define RMIXL_IRT_VECTOR(irt)		((irt) + 32)
+#define RMIXL_VECTOR_IRT(vec)		((vec) - 32)
+
+/*
+ * vectors (0 <= vec < 8)  are CAUSE[8..15] (including softintrs and count/compare)
+ * vectors (8 <= vec < 31) are for other non-IRT based interrupts
+ */
+#define RMIXL_INTRVEC_IPI	8
+#define RMIXL_INTRVEC_FMN	9
 
 typedef enum {
 	RMIXL_TRIG_NONE=0,
@@ -69,7 +78,7 @@
         int (*ih_func)(void *);
         void *ih_arg; 
         int ih_mpsafe; 			/* true if does not need kernel lock */
-        int ih_irq;			/* >=32 if not-PIC-based */
+        int ih_vec;			/* vector is bit number in EIRR/EIMR */
         int ih_ipl; 			/* interrupt priority */
         int ih_cpumask; 		/* CPUs which may handle this irpt */
 } rmixl_intrhand_t;

Reply via email to