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;