Module Name:    src
Committed By:   matt
Date:           Fri Jun 17 23:36:18 UTC 2011

Modified Files:
        src/sys/arch/amigappc/include: intr.h
        src/sys/arch/bebox/include: intr.h
        src/sys/arch/evbppc/include: pmppc_intr.h
        src/sys/arch/ibmnws/include: intr.h
        src/sys/arch/macppc/include: intr.h
        src/sys/arch/mvmeppc/include: intr.h
        src/sys/arch/ofppc/include: intr.h
        src/sys/arch/powerpc/include: intr.h
        src/sys/arch/powerpc/pic: files.pic intr.c
        src/sys/arch/prep/include: intr.h
        src/sys/arch/prep/pnpbus: if_we_pnpbus.c
        src/sys/arch/rs6000/include: intr.h
        src/sys/arch/sandpoint/include: intr.h
Removed Files:
        src/sys/arch/powerpc/pic: pic_subr.c

Log Message:
intr.h must not include cpu due to deadly embrace with SOFTINT_COUNT.
Cleanup intr.h so MD definitions can overload common definitions.
Rototill pic/intr.c.  Virtual IRQs can now be reclaimed.  separate virq
from hwirq from picirq.  Redo intr mask calculations.
tested on pmppc and macppc (MP).


To generate a diff of this commit:
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/amigappc/include/intr.h
cvs rdiff -u -r1.29 -r1.30 src/sys/arch/bebox/include/intr.h
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/evbppc/include/pmppc_intr.h
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/ibmnws/include/intr.h
cvs rdiff -u -r1.29 -r1.30 src/sys/arch/macppc/include/intr.h
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/mvmeppc/include/intr.h
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/ofppc/include/intr.h
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/powerpc/include/intr.h
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/powerpc/pic/files.pic
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/powerpc/pic/intr.c
cvs rdiff -u -r1.1 -r0 src/sys/arch/powerpc/pic/pic_subr.c
cvs rdiff -u -r1.33 -r1.34 src/sys/arch/prep/include/intr.h
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/prep/pnpbus/if_we_pnpbus.c
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/rs6000/include/intr.h
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/sandpoint/include/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/amigappc/include/intr.h
diff -u src/sys/arch/amigappc/include/intr.h:1.24 src/sys/arch/amigappc/include/intr.h:1.25
--- src/sys/arch/amigappc/include/intr.h:1.24	Sat Nov 13 13:34:00 2010
+++ src/sys/arch/amigappc/include/intr.h	Fri Jun 17 23:36:17 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.h,v 1.24 2010/11/13 13:34:00 uebayasi Exp $	*/
+/*	$NetBSD: intr.h,v 1.25 2011/06/17 23:36:17 matt Exp $	*/
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -44,8 +44,4 @@
 #endif
 #include <powerpc/intr.h>
 
-#ifndef _LOCORE
-#include <machine/cpu.h>
-#endif /* _LOCORE */
-
 #endif /* !_AMIGAPPC_INTR_H_ */

Index: src/sys/arch/bebox/include/intr.h
diff -u src/sys/arch/bebox/include/intr.h:1.29 src/sys/arch/bebox/include/intr.h:1.30
--- src/sys/arch/bebox/include/intr.h:1.29	Sat Apr 24 09:39:56 2010
+++ src/sys/arch/bebox/include/intr.h	Fri Jun 17 23:36:17 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.h,v 1.29 2010/04/24 09:39:56 kiyohara Exp $	*/
+/*	$NetBSD: intr.h,v 1.30 2011/06/17 23:36:17 matt Exp $	*/
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -42,12 +42,12 @@
 
 extern paddr_t bebox_mb_reg;
 
-#define ICU_LEN		32
-#define IRQ_SLAVE	2
-#define LEGAL_IRQ(x)	((x) >= 0 && (x) < ICU_LEN && (x) != IRQ_SLAVE)
+#define ICU_LEN			32
+#define IRQ_SLAVE		2
+#define LEGAL_HWIRQ_P(x)	((u_int)(x) < ICU_LEN && (x) != IRQ_SLAVE)
 
-#define BEBOX_INTR_REG	0x7ffff000
-#define INTR_VECTOR_REG	0xff0
+#define BEBOX_INTR_REG		0x7ffff000
+#define INTR_VECTOR_REG		0xff0
 
 #endif /* !_LOCORE */
 

Index: src/sys/arch/evbppc/include/pmppc_intr.h
diff -u src/sys/arch/evbppc/include/pmppc_intr.h:1.3 src/sys/arch/evbppc/include/pmppc_intr.h:1.4
--- src/sys/arch/evbppc/include/pmppc_intr.h:1.3	Mon Apr 28 20:23:17 2008
+++ src/sys/arch/evbppc/include/pmppc_intr.h	Fri Jun 17 23:36:17 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmppc_intr.h,v 1.3 2008/04/28 20:23:17 martin Exp $	*/
+/*	$NetBSD: pmppc_intr.h,v 1.4 2011/06/17 23:36:17 matt Exp $	*/
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -44,7 +44,7 @@
 #define	ICU_LEN		32
 #define	ICU_MASK	0x1f000fc0
 
-#define	LEGAL_IRQ(x)	((x) >= 0 && (x) <= 31 && (ICU_MASK & (0x80000000 >> (x))))
+#define	LEGAL_HWIRQ_P(x) ((u_int)(x) < ICU_LEN && (ICU_MASK & (0x80000000 >> (x))))
 
 #endif /* !_LOCORE */
 

Index: src/sys/arch/ibmnws/include/intr.h
diff -u src/sys/arch/ibmnws/include/intr.h:1.14 src/sys/arch/ibmnws/include/intr.h:1.15
--- src/sys/arch/ibmnws/include/intr.h:1.14	Sat Nov 13 14:07:07 2010
+++ src/sys/arch/ibmnws/include/intr.h	Fri Jun 17 23:36:17 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.h,v 1.14 2010/11/13 14:07:07 uebayasi Exp $	*/
+/*	$NetBSD: intr.h,v 1.15 2011/06/17 23:36:17 matt Exp $	*/
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -32,11 +32,7 @@
 #ifndef _IBMNWS_INTR_H_
 #define _IBMNWS_INTR_H_
 
-#include <powerpc/intr.h>
-
 #ifndef _LOCORE
-#include <machine/cpu.h>
-
 void init_intr_ivr(void);
 void init_intr_openpic(void);
 void openpic_init(unsigned char *);
@@ -49,7 +45,7 @@
 #define	ICU_LEN			32
 
 #define	IRQ_SLAVE		2
-#define	LEGAL_IRQ(x)		((x) >= 0 && (x) < ICU_LEN && (x) != IRQ_SLAVE)
+#define	LEGAL_HWIRQ_P(x)	((u_int)(x) < ICU_LEN && (x) != IRQ_SLAVE)
 #define	I8259_INTR_NUM		16
 
 #define	PREP_INTR_REG	0xbffff000
@@ -57,4 +53,6 @@
 
 #endif /* !_LOCORE */
 
+#include <powerpc/intr.h>
+
 #endif /* !_IBMNWS_INTR_H_ */

Index: src/sys/arch/macppc/include/intr.h
diff -u src/sys/arch/macppc/include/intr.h:1.29 src/sys/arch/macppc/include/intr.h:1.30
--- src/sys/arch/macppc/include/intr.h:1.29	Fri Jun 17 05:18:10 2011
+++ src/sys/arch/macppc/include/intr.h	Fri Jun 17 23:36:17 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.h,v 1.29 2011/06/17 05:18:10 matt Exp $	*/
+/*	$NetBSD: intr.h,v 1.30 2011/06/17 23:36:17 matt Exp $	*/
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -32,8 +32,6 @@
 #ifndef _MACPPC_INTR_H_
 #define _MACPPC_INTR_H_
 
-#include <powerpc/intr.h>
-
 #ifdef _KERNEL_OPT
 #include "opt_multiprocessor.h"
 #endif
@@ -59,4 +57,6 @@
 #endif
 #endif /* _LOCORE */
 
+#include <powerpc/intr.h>
+
 #endif /* _MACPPC_INTR_H_ */

Index: src/sys/arch/mvmeppc/include/intr.h
diff -u src/sys/arch/mvmeppc/include/intr.h:1.14 src/sys/arch/mvmeppc/include/intr.h:1.15
--- src/sys/arch/mvmeppc/include/intr.h:1.14	Sat Apr 24 09:39:57 2010
+++ src/sys/arch/mvmeppc/include/intr.h	Fri Jun 17 23:36:17 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.h,v 1.14 2010/04/24 09:39:57 kiyohara Exp $	*/
+/*	$NetBSD: intr.h,v 1.15 2011/06/17 23:36:17 matt Exp $	*/
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -32,8 +32,6 @@
 #ifndef _MVMEPPC_INTR_H_
 #define _MVMEPPC_INTR_H_
 
-#include <powerpc/intr.h>
-
 #ifndef _LOCORE
 
 void enable_intr(void);
@@ -41,13 +39,15 @@
 
 extern vaddr_t mvmeppc_intr_reg;
 
-#define	ICU_LEN		32
-#define	IRQ_SLAVE	2
-#define	LEGAL_IRQ(x)	((x) >= 0 && (x) < ICU_LEN && (x) != IRQ_SLAVE)
+#define	ICU_LEN			32
+#define	IRQ_SLAVE		2
+#define	LEGAL_HWIRQ_P(x)	((u_int)(x) < ICU_LEN && (x) != IRQ_SLAVE)
 
 #define	MVMEPPC_INTR_REG	0xbffff000
-#define	INTR_VECTOR_REG	0xff0
+#define	INTR_VECTOR_REG		0xff0
 
 #endif /* !_LOCORE */
 
+#include <powerpc/intr.h>
+
 #endif /* !_MVMEPPC_INTR_H_ */

Index: src/sys/arch/ofppc/include/intr.h
diff -u src/sys/arch/ofppc/include/intr.h:1.15 src/sys/arch/ofppc/include/intr.h:1.16
--- src/sys/arch/ofppc/include/intr.h:1.15	Sun Jun  5 16:52:24 2011
+++ src/sys/arch/ofppc/include/intr.h	Fri Jun 17 23:36:17 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.h,v 1.15 2011/06/05 16:52:24 matt Exp $	*/
+/*	$NetBSD: intr.h,v 1.16 2011/06/17 23:36:17 matt Exp $	*/
 
 /*-
  * Copyright (c) 2007 The NetBSD Foundation, Inc.
@@ -32,21 +32,19 @@
 #ifndef	_OFPPC_INTR_H_
 #define	_OFPPC_INTR_H_
 
+#ifndef _LOCORE
 #ifdef _KERNEL_OPT
 #include "opt_multiprocessor.h"
 #endif
-
-#include <powerpc/intr.h>
-
-#ifndef _LOCORE
 #ifdef MULTIPROCESSOR
 #include <powerpc/pic/ipivar.h>
 #endif
-#include <machine/cpu.h>
 
 #define ICU_LEN		32
 #define IRQ_SLAVE	2
 
 #endif
 
+#include <powerpc/intr.h>
+
 #endif	/* _OFPPC_INTR_H_ */

Index: src/sys/arch/powerpc/include/intr.h
diff -u src/sys/arch/powerpc/include/intr.h:1.7 src/sys/arch/powerpc/include/intr.h:1.8
--- src/sys/arch/powerpc/include/intr.h:1.7	Fri Jun 17 05:15:22 2011
+++ src/sys/arch/powerpc/include/intr.h	Fri Jun 17 23:36:17 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.h,v 1.7 2011/06/17 05:15:22 matt Exp $ */
+/*	$NetBSD: intr.h,v 1.8 2011/06/17 23:36:17 matt Exp $ */
 
 /*-
  * Copyright (c) 2007 Michael Lorenz
@@ -28,7 +28,7 @@
 
 #ifndef _LOCORE
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intr.h,v 1.7 2011/06/17 05:15:22 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intr.h,v 1.8 2011/06/17 23:36:17 matt Exp $");
 #endif
 
 #ifndef POWERPC_INTR_MACHDEP_H
@@ -60,10 +60,6 @@
 #define	IST_EDGE	2	/* edge-triggered */
 #define	IST_LEVEL	3	/* level-triggered */
 
-#ifdef _LOCORE
-#define splhigh __splhigh
-#endif
-
 #ifndef _LOCORE
 /*
  * Interrupt handler chains.  intr_establish() inserts a handler into
@@ -74,7 +70,7 @@
 	void	*ih_arg;
 	struct	intrhand *ih_next;
 	int	ih_ipl;
-	int	ih_irq;
+	int	ih_virq;
 };
 
 int splraise(int);
@@ -86,16 +82,24 @@
 #define softint_init_md	powerpc_softint_init_md
 #define softint_trigger		powerpc_softint_trigger
 
-typedef u_int imask_t;
+#ifdef __IMASK_T
+typedef __IMASK_T imask_t;
+#else
+typedef uint32_t imask_t;
+#endif
+
 extern imask_t imask[];
 
-#define NVIRQ		32	/* 32 virtual IRQs */
+#define NVIRQ		(sizeof(imask_t)*8)	/* 32 virtual IRQs */
+#ifndef NIRQ
 #define NIRQ		128	/* up to 128 HW IRQs */
+#endif
 
-#define HWIRQ_MAX       (NVIRQ - 5 - 1)
-#define HWIRQ_MASK      0x07ffffff
+#define HWIRQ_MAX       (NVIRQ - 1)
+#define HWIRQ_MASK     	(~(imask_t)0 >> 1)
 
-#define MS_PENDING(p)	(31 - cntlzw(p))
+#define	PIC_VIRQ_TO_MASK(v)	__BIT(HWIRQ_MAX - (v))
+#define PIC_VIRQ_MS_PENDING(p)	__builtin_clz(p)
 
 #define spl0()		spllower(0)
 

Index: src/sys/arch/powerpc/pic/files.pic
diff -u src/sys/arch/powerpc/pic/files.pic:1.6 src/sys/arch/powerpc/pic/files.pic:1.7
--- src/sys/arch/powerpc/pic/files.pic:1.6	Thu Jun 16 02:43:43 2011
+++ src/sys/arch/powerpc/pic/files.pic	Fri Jun 17 23:36:18 2011
@@ -1,10 +1,9 @@
 # 
-#	$NetBSD: files.pic,v 1.6 2011/06/16 02:43:43 macallan Exp $
+#	$NetBSD: files.pic,v 1.7 2011/06/17 23:36:18 matt Exp $
 #
 # generic PIC abstraction
 
 file arch/powerpc/pic/intr.c
-file arch/powerpc/pic/pic_subr.c
 
 defflag opt_pic.h PIC_DEBUG
 

Index: src/sys/arch/powerpc/pic/intr.c
diff -u src/sys/arch/powerpc/pic/intr.c:1.14 src/sys/arch/powerpc/pic/intr.c:1.15
--- src/sys/arch/powerpc/pic/intr.c:1.14	Fri Jun 17 05:15:23 2011
+++ src/sys/arch/powerpc/pic/intr.c	Fri Jun 17 23:36:18 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.c,v 1.14 2011/06/17 05:15:23 matt Exp $ */
+/*	$NetBSD: intr.c,v 1.15 2011/06/17 23:36:18 matt Exp $ */
 
 /*-
  * Copyright (c) 2007 Michael Lorenz
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.14 2011/06/17 05:15:23 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.15 2011/06/17 23:36:18 matt Exp $");
 
 #include "opt_multiprocessor.h"
 
@@ -55,29 +55,27 @@
 
 #define MAX_PICS	8	/* 8 PICs ought to be enough for everyone */
 
-#define	LEGAL_VIRQ(x)	((x) >= 0 && (x) < NVIRQ)
+#define	PIC_VIRQ_LEGAL_P(x)	((u_int)(x) < NVIRQ)
 
 struct pic_ops *pics[MAX_PICS];
 int num_pics = 0;
 int max_base = 0;
-uint8_t	virq[NIRQ];
-int	virq_max = 0;
+uint8_t	virq_map[NIRQ];
+imask_t virq_mask = HWIRQ_MASK;
 imask_t	imask[NIPL];
 int	primary_pic = 0;
 
 static int	fakeintr(void *);
-static int	mapirq(uint32_t);
+static int	mapirq(int);
 static void	intr_calculatemasks(void);
-static struct pic_ops *find_pic_by_irq(int);
+static struct pic_ops *find_pic_by_hwirq(int);
 
 static struct intr_source intrsources[NVIRQ];
 
 void
 pic_init(void)
 {
-	for (u_int i = 0; i < NIRQ; i++)
-		virq[i] = 0;
-	memset(intrsources, 0, sizeof(intrsources));
+	/* everything is in bss, no reason to zero it. */
 }
 
 int
@@ -98,23 +96,20 @@
 void
 pic_finish_setup(void)
 {
-	struct pic_ops *pic;
-	int i;
-
-	for (i = 0; i < num_pics; i++) {
-		pic = pics[i];
+	for (size_t i = 0; i < num_pics; i++) {
+		struct pic_ops * const pic = pics[i];
 		if (pic->pic_finish_setup != NULL)
 			pic->pic_finish_setup(pic);
 	}
 }
 
 static struct pic_ops *
-find_pic_by_irq(int irq)
+find_pic_by_hwirq(int hwirq)
 {
 	for (u_int base = 0; base < num_pics; base++) {
 		struct pic_ops * const pic = pics[base];
-		if (pic->pic_intrbase <= irq
-		    && irq < pic->pic_intrbase + pic->pic_numintrs) {
+		if (pic->pic_intrbase <= hwirq
+		    && hwirq < pic->pic_intrbase + pic->pic_numintrs) {
 			return pic;
 		}
 	}
@@ -136,37 +131,36 @@
     void *ih_arg)
 {
 	struct intrhand **p, *q, *ih;
-	struct intr_source *is;
 	struct pic_ops *pic;
 	static struct intrhand fakehand;
-	int irq, maxipl = ipl;
+	int maxipl = ipl;
 
 	if (maxipl == IPL_NONE)
 		maxipl = IPL_HIGH;
 
 	if (hwirq >= max_base) {
-
 		panic("%s: bogus IRQ %d, max is %d", __func__, hwirq,
 		    max_base - 1);
 	}
 
-	pic = find_pic_by_irq(hwirq);
+	pic = find_pic_by_hwirq(hwirq);
 	if (pic == NULL) {
 
 		panic("%s: cannot find a pic for IRQ %d", __func__, hwirq);
 	}
 
-	irq = mapirq(hwirq);
+	const int virq = mapirq(hwirq);
 
 	/* no point in sleeping unless someone can free memory. */
 	ih = malloc(sizeof *ih, M_DEVBUF, cold ? M_NOWAIT : M_WAITOK);
 	if (ih == NULL)
 		panic("intr_establish: can't malloc handler info");
 
-	if (!LEGAL_VIRQ(irq) || type == IST_NONE)
-		panic("intr_establish: bogus irq (%d) or type (%d)", irq, type);
+	if (!PIC_VIRQ_LEGAL_P(virq) || type == IST_NONE)
+		panic("intr_establish: bogus irq (%d) or type (%d)",
+		    hwirq, type);
 
-	is = &intrsources[irq];
+	struct intr_source * const is = &intrsources[virq];
 
 	switch (is->is_type) {
 	case IST_NONE:
@@ -176,6 +170,7 @@
 	case IST_LEVEL:
 		if (type == is->is_type)
 			break;
+		/* FALLTHROUGH */
 	case IST_PULSE:
 		if (type != IST_NONE)
 			panic("intr_establish: can't share %s with %s",
@@ -215,7 +210,7 @@
 	ih->ih_arg = ih_arg;
 	ih->ih_next = NULL;
 	ih->ih_ipl = ipl;
-	ih->ih_irq = irq;
+	ih->ih_virq = virq;
 	*p = ih;
 
 	if (pic->pic_establish_irq != NULL)
@@ -249,13 +244,13 @@
 intr_disestablish(void *arg)
 {
 	struct intrhand * const ih = arg;
-	const int irq = ih->ih_irq;
-	struct intr_source * const is = &intrsources[irq];
+	const int virq = ih->ih_virq;
+	struct intr_source * const is = &intrsources[virq];
 	struct intrhand **p, **q;
 	int maxipl = IPL_NONE;
 
-	if (!LEGAL_VIRQ(irq))
-		panic("intr_disestablish: bogus irq %d", irq);
+	if (!PIC_VIRQ_LEGAL_P(virq))
+		panic("intr_disestablish: bogus virq %d", virq);
 
 	/*
 	 * Remove the handler from the chain.
@@ -285,6 +280,11 @@
 	if (is->is_hand == NULL) {
 		is->is_type = IST_NONE;
 		evcnt_detach(&is->is_ev);
+		/*
+		 * Make the virutal IRQ available again.
+		 */
+		virq_map[virq] = 0;
+		virq_mask |= PIC_VIRQ_TO_MASK(virq);
 	}
 }
 
@@ -292,32 +292,34 @@
  * Map max_base irqs into 32 (bits).
  */
 static int
-mapirq(uint32_t irq)
+mapirq(int hwirq)
 {
 	struct pic_ops *pic;
-	int v;
 
-	if (irq >= max_base)
-		panic("invalid irq %d", irq);
+	if (hwirq >= max_base)
+		panic("invalid irq %d", hwirq);
 
-	if ((pic = find_pic_by_irq(irq)) == NULL)
-		panic("%s: cannot find PIC for IRQ %d", __func__, irq);
+	if ((pic = find_pic_by_hwirq(hwirq)) == NULL)
+		panic("%s: cannot find PIC for HWIRQ %d", __func__, hwirq);
 
-	if (virq[irq])
-		return virq[irq];
+	if (virq_map[hwirq])
+		return virq_map[hwirq];
 
-	virq_max++;
-	v = virq_max;
-	if (v > HWIRQ_MAX)
+	if (virq_mask == 0)
 		panic("virq overflow");
 
-	intrsources[v].is_hwirq = irq;
-	intrsources[v].is_pic = pic;
-	virq[irq] = v;
+	const int virq = PIC_VIRQ_MS_PENDING(virq_mask);
+	struct intr_source * const is = intrsources + virq;
+
+	virq_mask &= ~PIC_VIRQ_TO_MASK(virq);
+
+	is->is_hwirq = hwirq;
+	is->is_pic = pic;
+	virq_map[hwirq] = virq;
 #ifdef PIC_DEBUG
-	printf("mapping irq %d to virq %d\n", irq, v);
+	printf("mapping hwirq %d to virq %d\n", irq, virq);
 #endif
-	return v;
+	return virq;
 }
 
 static const char * const intr_typenames[] = {
@@ -354,7 +356,7 @@
 
 	/* First, figure out which ipl each IRQ uses. */
 	for (irq = 0, is = intrsources; irq < NVIRQ; irq++, is++) {
-		newmask[is->is_ipl] |= 1ULL << irq;
+		newmask[is->is_ipl] |= PIC_VIRQ_TO_MASK(irq);
 	}
 
 	/*
@@ -404,150 +406,116 @@
 }
 
 void
-pic_enable_irq(int num)
+pic_enable_irq(int hwirq)
 {
-	struct pic_ops *current;
-	int type;
-
-	current = find_pic_by_irq(num);
-	if (current == NULL)
-		panic("%s: bogus IRQ %d", __func__, num);
-	type = intrsources[virq[num]].is_type;
-	current->pic_enable_irq(current, num - current->pic_intrbase, type);
+	struct pic_ops * const pic = find_pic_by_hwirq(hwirq);
+	if (pic == NULL)
+		panic("%s: bogus IRQ %d", __func__, hwirq);
+	const int type = intrsources[virq_map[hwirq]].is_type;
+	(*pic->pic_enable_irq)(pic, hwirq - pic->pic_intrbase, type);
 }
 
 void
-pic_mark_pending(int irq)
+pic_mark_pending(int hwirq)
 {
 	struct cpu_info * const ci = curcpu();
-	int v, msr;
 
-	v = virq[irq];
-	if (v == 0)
-		printf("IRQ %d maps to 0\n", irq);
+	const int virq = virq_map[hwirq];
+	if (virq == 0)
+		printf("IRQ %d maps to 0\n", hwirq);
 
-	msr = mfmsr();
+	const register_t msr = mfmsr();
 	mtmsr(msr & ~PSL_EE);
-	ci->ci_ipending |= 1ULL << v;
+	ci->ci_ipending |= PIC_VIRQ_TO_MASK(virq);
 	mtmsr(msr);
 }
 
+static void
+intr_deliver(struct intr_source *is, int virq)
+{
+	bool locked = false;
+	for (struct intrhand *ih = is->is_hand; ih != NULL; ih = ih->ih_next) {
+		KASSERTMSG(ih->ih_fun != NULL,
+		    ("%s: irq %d, hwirq %d, is %p ih %p: "
+		     "NULL interrupt handler!\n", __func__,
+		     virq, is->is_hwirq, is, ih));
+		if (ih->ih_ipl == IPL_VM) {
+			if (!locked) {
+				KERNEL_LOCK(1, NULL);
+				locked = true;
+			}
+		} else if (locked) {
+			KERNEL_UNLOCK_ONE(NULL);
+			locked = false;
+		}
+		(*ih->ih_fun)(ih->ih_arg);
+	}
+	if (locked) {
+		KERNEL_UNLOCK_ONE(NULL);
+	}
+	is->is_ev.ev_count++;
+}
+
 void
 pic_do_pending_int(void)
 {
 	struct cpu_info * const ci = curcpu();
-	struct intr_source *is;
-	struct intrhand *ih;
-	struct pic_ops *pic;
-	int irq;
-	int pcpl;
-	imask_t hwpend;
-	int emsr, dmsr;
+	imask_t vpend;
 
 	if (ci->ci_iactive)
 		return;
 
 	ci->ci_iactive = 1;
-	emsr = mfmsr();
+
+	const register_t emsr = mfmsr();
+	const register_t dmsr = emsr & ~PSL_EE;
+
 	KASSERT(emsr & PSL_EE);
-	dmsr = emsr & ~PSL_EE;
 	mtmsr(dmsr);
 
-	pcpl = ci->ci_cpl;
+	const int pcpl = ci->ci_cpl;
 #ifdef __HAVE_FAST_SOFTINTS
-#if 0
 again:
 #endif
-#endif
 
 	/* Do now unmasked pendings */
-	while ((hwpend = (ci->ci_ipending & ~imask[pcpl] & HWIRQ_MASK)) != 0) {
+	while ((vpend = (ci->ci_ipending & ~imask[pcpl])) != 0) {
 		ci->ci_idepth++;
+		KASSERT((PIC_VIRQ_TO_MASK(0) & ci->ci_ipending) == 0);
+
 		/* Get most significant pending bit */
-		irq = MS_PENDING(hwpend);
-		KASSERT(irq <= virq_max);
-		ci->ci_ipending &= ~(1ULL << irq);
-		if (irq == 0) {
-			printf("VIRQ0");
-			continue;
-		}
-		is = &intrsources[irq];
-		pic = is->is_pic;
+		const int virq = PIC_VIRQ_MS_PENDING(vpend);
+		ci->ci_ipending &= ~PIC_VIRQ_TO_MASK(virq);
+
+		struct intr_source * const is = &intrsources[virq];
+		struct pic_ops * const pic = is->is_pic;
 
 		splraise(is->is_ipl);
 		mtmsr(emsr);
-		ih = is->is_hand;
-		while (ih) {
-#ifdef DIAGNOSTIC
-			if (!ih->ih_fun) {
-				printf("NULL interrupt handler!\n");
-				panic("irq %02d, hwirq %02d, is %p\n",
-					irq, is->is_hwirq, is);
-			}
-#endif
-			if (ih->ih_ipl == IPL_VM) {
-				KERNEL_LOCK(1, NULL);
-			}
-			(*ih->ih_fun)(ih->ih_arg);
-			if (ih->ih_ipl == IPL_VM) {
-				KERNEL_UNLOCK_ONE(NULL);
-			}
-			ih = ih->ih_next;
-		}
+		intr_deliver(is, virq);
 		mtmsr(dmsr);
-		ci->ci_cpl = pcpl;
+		ci->ci_cpl = pcpl; /* Don't use splx... we are here already! */
 
-		is->is_ev.ev_count++;
 		pic->pic_reenable_irq(pic, is->is_hwirq - pic->pic_intrbase,
 		    is->is_type);
 		ci->ci_idepth--;
 	}
 
 #ifdef __HAVE_FAST_SOFTINTS
-#if 0
-	if ((ci->ci_ipending & ~pcpl) & (1ULL << SIR_SERIAL)) {
-		ci->ci_ipending &= ~(1ULL << SIR_SERIAL);
-		splsoftserial();
-		mtmsr(emsr);
-		softintr__run(IPL_SOFTSERIAL);
-		mtmsr(dmsr);
-		ci->ci_cpl = pcpl;
-		ci->ci_ev_softserial.ev_count++;
-		goto again;
-	}
-	if ((ci->ci_ipending & ~pcpl) & (1ULL << SIR_NET)) {
-		ci->ci_ipending &= ~(1ULL << SIR_NET);
-		splsoftnet();
-		mtmsr(emsr);
-		softintr__run(IPL_SOFTNET);
-		mtmsr(dmsr);
-		ci->ci_cpl = pcpl;
-		ci->ci_ev_softnet.ev_count++;
-		goto again;
-	}
-	if ((ci->ci_ipending & ~pcpl) & (1ULL << SIR_CLOCK)) {
-		ci->ci_ipending &= ~(1ULL << SIR_CLOCK);
-		splsoftclock();
-		mtmsr(emsr);
-		softintr__run(IPL_SOFTCLOCK);
-		mtmsr(dmsr);
-		ci->ci_cpl = pcpl;
-		ci->ci_ev_softclock.ev_count++;
-		goto again;
-	}
-#else
 	const u_int softints = (ci->ci_data.cpu_softints << pcpl) & IPL_SOFTMASK;
 
 	if (__predict_false(softints != 0)) {
-		splhigh();
+		ci->ci_cpl = IPL_HIGH;
+		mtmsr(emsr);
 		powerpc_softint(ci, pcpl,
 		    (vaddr_t)__builtin_return_address(0));
+		mtmsr(dmsr);
 		ci->ci_cpl = pcpl;
+		if (__predict_false(ci->ci_ipending & ~imask[pcpl]))
+			goto again;
 	}
 #endif
-#endif
 
-	ci->ci_cpl = pcpl;	/* Don't use splx... we are here already! */
 	ci->ci_iactive = 0;
 	mtmsr(emsr);
 }
@@ -557,86 +525,52 @@
 {
 	struct pic_ops *pic = cookie;
 	struct cpu_info *ci = curcpu();
-	struct intr_source *is;
-	struct intrhand *ih;
-	int irq, realirq;
-	int pcpl, msr, bail;
-	imask_t r_imen;
+	int picirq;
 
-	realirq = pic->pic_get_irq(pic, PIC_GET_IRQ);
-	if (realirq == 255)
+	picirq = pic->pic_get_irq(pic, PIC_GET_IRQ);
+	if (picirq == 255)
 		return 0;
 
-	msr = mfmsr();
-	pcpl = ci->ci_cpl;
-
-start:
+	const register_t msr = mfmsr();
+	const int pcpl = ci->ci_cpl;
 
+	do {
 #ifdef MULTIPROCESSOR
-	/* THIS IS WRONG XXX */
-	while (realirq == ipiops.ppc_ipi_vector) {
-		ipi_intr(NULL);
-		pic->pic_ack_irq(pic, realirq);
-		realirq = pic->pic_get_irq(pic, PIC_GET_RECHECK);
-	}
-	if (realirq == 255) {
-		return 0;
-	}
+		/* THIS IS WRONG XXX */
+		if (picirq == ipiops.ppc_ipi_vector) {
+			ci->ci_cpl = IPL_HIGH;
+			ipi_intr(NULL);
+			ci->ci_cpl = pcpl;
+			pic->pic_ack_irq(pic, picirq);
+			continue;
+		}
 #endif
 
-	irq = virq[realirq + pic->pic_intrbase];
-#ifdef PIC_DEBUG
-	if (irq == 0) {
-		printf("%s: %d virq 0\n", pic->pic_name, realirq);
-		goto boo;
-	}
-#endif /* PIC_DEBUG */
-	KASSERT(realirq < pic->pic_numintrs);
-	r_imen = 1ULL << irq;
-	is = &intrsources[irq];
-
-	if ((imask[pcpl] & r_imen) != 0) {
-
-		ci->ci_ipending |= r_imen; /* Masked! Mark this as pending */
-		pic->pic_disable_irq(pic, realirq);
-	} else {
-
-		/* this interrupt is no longer pending */
-		ci->ci_ipending &= ~r_imen;
-		ci->ci_idepth++;
+		const int virq = virq_map[picirq + pic->pic_intrbase];
+		KASSERT(virq != 0);
+		KASSERT(picirq < pic->pic_numintrs);
+		imask_t v_imen = PIC_VIRQ_TO_MASK(virq);
+		struct intr_source * const is = &intrsources[virq];
+
+		if ((imask[pcpl] & v_imen) != 0) {
+			ci->ci_ipending |= v_imen; /* Masked! Mark this as pending */
+			pic->pic_disable_irq(pic, picirq);
+		} else {
+			/* this interrupt is no longer pending */
+			ci->ci_ipending &= ~v_imen;
+			ci->ci_idepth++;
+
+			splraise(is->is_ipl);
+			mtmsr(msr | PSL_EE);
+			intr_deliver(is, virq);
+			mtmsr(msr);
+			ci->ci_cpl = pcpl;
 
-		splraise(is->is_ipl);
-		mtmsr(msr | PSL_EE);
-		ih = is->is_hand;
-		bail = 0;
-		while ((ih != NULL) && (bail < 10)) {
-			if (ih->ih_fun == NULL)
-				panic("bogus handler for IRQ %s %d",
-				    pic->pic_name, realirq);
-			if (ih->ih_ipl == IPL_VM) {
-				KERNEL_LOCK(1, NULL);
-			}
-			(*ih->ih_fun)(ih->ih_arg);
-			if (ih->ih_ipl == IPL_VM) {
-				KERNEL_UNLOCK_ONE(NULL);
-			}
-			ih = ih->ih_next;
-			bail++;
+			ci->ci_data.cpu_nintr++;
+			ci->ci_idepth--;
 		}
-		mtmsr(msr);
-		ci->ci_cpl = pcpl;
-
-		ci->ci_data.cpu_nintr++;
-		is->is_ev.ev_count++;
-		ci->ci_idepth--;
-	}
-#ifdef PIC_DEBUG
-boo:
-#endif /* PIC_DEBUG */
-	pic->pic_ack_irq(pic, realirq);
-	realirq = pic->pic_get_irq(pic, PIC_GET_RECHECK);
-	if (realirq != 255)
-		goto start;
+		pic->pic_ack_irq(pic, picirq);
+	} while ((picirq = pic->pic_get_irq(pic, PIC_GET_RECHECK)) != 255);
 
 	mtmsr(msr | PSL_EE);
 	splx(pcpl);	/* Process pendings. */
@@ -747,7 +681,7 @@
 	     mask >>= 1, irq++) {
 		if ((mask & 1) == 0)
 			continue;
-		vi = virq[irq + pic->pic_intrbase];
+		vi = virq_map[irq + pic->pic_intrbase];
 		if (!vi) {
 			*irq_p = irq;
 			return 0;

Index: src/sys/arch/prep/include/intr.h
diff -u src/sys/arch/prep/include/intr.h:1.33 src/sys/arch/prep/include/intr.h:1.34
--- src/sys/arch/prep/include/intr.h:1.33	Sat Nov 13 14:07:07 2010
+++ src/sys/arch/prep/include/intr.h	Fri Jun 17 23:36:18 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.h,v 1.33 2010/11/13 14:07:07 uebayasi Exp $	*/
+/*	$NetBSD: intr.h,v 1.34 2011/06/17 23:36:18 matt Exp $	*/
 
 /*-
  * Copyright (c) 2007 The NetBSD Foundation, Inc.
@@ -32,10 +32,7 @@
 #ifndef _PREP_INTR_H_
 #define _PREP_INTR_H_
 
-#include <powerpc/intr.h>
-
 #ifndef _LOCORE
-#include <machine/cpu.h>
 
 void init_intr_ivr(void);
 void init_intr_openpic(void);
@@ -49,13 +46,15 @@
 #define	ICU_LEN			32
 
 #define	IRQ_SLAVE		2
-#define	LEGAL_IRQ(x)		((x) >= 0 && (x) < ICU_LEN && (x) != IRQ_SLAVE)
+#define	LEGAL_HWIRQ_P(x)	((u_int)(x) < ICU_LEN && (x) != IRQ_SLAVE)
 #define	I8259_INTR_NUM		16
 #define	OPENPIC_INTR_NUM	((ICU_LEN)-(I8259_INTR_NUM))
 
-#define	PREP_INTR_REG	0xbffff000
-#define	INTR_VECTOR_REG	0xff0
+#define	PREP_INTR_REG		0xbffff000
+#define	INTR_VECTOR_REG		0xff0
 
 #endif /* !_LOCORE */
 
+#include <powerpc/intr.h>
+
 #endif /* !_PREP_INTR_H_ */

Index: src/sys/arch/prep/pnpbus/if_we_pnpbus.c
diff -u src/sys/arch/prep/pnpbus/if_we_pnpbus.c:1.5 src/sys/arch/prep/pnpbus/if_we_pnpbus.c:1.6
--- src/sys/arch/prep/pnpbus/if_we_pnpbus.c:1.5	Sat Mar 14 21:04:14 2009
+++ src/sys/arch/prep/pnpbus/if_we_pnpbus.c	Fri Jun 17 23:36:18 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_we_pnpbus.c,v 1.5 2009/03/14 21:04:14 dsl Exp $	*/
+/*	$NetBSD: if_we_pnpbus.c,v 1.6 2011/06/17 23:36:18 matt Exp $	*/
 
 /*-
  * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
@@ -49,7 +49,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_we_pnpbus.c,v 1.5 2009/03/14 21:04:14 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_we_pnpbus.c,v 1.6 2011/06/17 23:36:18 matt Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -238,7 +238,7 @@
 		/* some cards think they are level.  force them to edge */
 		if (irq->flags & 0x0c)
 			irq->flags = 0x01;
-		if (!LEGAL_IRQ(irqnum))
+		if (!LEGAL_HWIRQ_P(irqnum))
 			continue;
 		if (irqnum < 2)
 			continue;

Index: src/sys/arch/rs6000/include/intr.h
diff -u src/sys/arch/rs6000/include/intr.h:1.4 src/sys/arch/rs6000/include/intr.h:1.5
--- src/sys/arch/rs6000/include/intr.h:1.4	Sat Nov 13 14:07:08 2010
+++ src/sys/arch/rs6000/include/intr.h	Fri Jun 17 23:36:18 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.h,v 1.4 2010/11/13 14:07:08 uebayasi Exp $	*/
+/*	$NetBSD: intr.h,v 1.5 2011/06/17 23:36:18 matt Exp $	*/
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -32,13 +32,12 @@
 #ifndef _RS6000_INTR_H_
 #define _RS6000_INTR_H_
 
-#include <powerpc/intr.h>
-
 #ifndef _LOCORE
-#include <machine/cpu.h>
 
 #define	ICU_LEN			16
 
 #endif /* _LOCORE */
 
+#include <powerpc/intr.h>
+
 #endif /* _RS6000_INTR_H_ */

Index: src/sys/arch/sandpoint/include/intr.h
diff -u src/sys/arch/sandpoint/include/intr.h:1.18 src/sys/arch/sandpoint/include/intr.h:1.19
--- src/sys/arch/sandpoint/include/intr.h:1.18	Sat Nov 13 14:07:08 2010
+++ src/sys/arch/sandpoint/include/intr.h	Fri Jun 17 23:36:18 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.h,v 1.18 2010/11/13 14:07:08 uebayasi Exp $	*/
+/*	$NetBSD: intr.h,v 1.19 2011/06/17 23:36:18 matt Exp $	*/
 
 /*-
  * Copyright (c) 2007 The NetBSD Foundation, Inc.
@@ -35,7 +35,6 @@
 #include <powerpc/intr.h>
 
 #ifndef _LOCORE
-#include <machine/cpu.h>
 
 void enable_intr(void);
 void disable_intr(void);

Reply via email to