Module Name:    src
Committed By:   skrll
Date:           Sat Jul 25 08:43:41 UTC 2015

Modified Files:
        src/sys/arch/arm/broadcom: bcm2835_intr.c

Log Message:
IPIs should be IPL_HIGH according to rmind@

Fix bcm2836mp_pic_{un,}block_irqs to handle timer AND mailbox interrupts
if they're both passed.  Thanks to nat@ for finding this.

Sprinkle some KASSERTs


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/arm/broadcom/bcm2835_intr.c

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/arm/broadcom/bcm2835_intr.c
diff -u src/sys/arch/arm/broadcom/bcm2835_intr.c:1.9 src/sys/arch/arm/broadcom/bcm2835_intr.c:1.10
--- src/sys/arch/arm/broadcom/bcm2835_intr.c:1.9	Sun Apr 12 23:25:57 2015
+++ src/sys/arch/arm/broadcom/bcm2835_intr.c	Sat Jul 25 08:43:41 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: bcm2835_intr.c,v 1.9 2015/04/12 23:25:57 jmcneill Exp $	*/
+/*	$NetBSD: bcm2835_intr.c,v 1.10 2015/07/25 08:43:41 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2012, 2015 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bcm2835_intr.c,v 1.9 2015/04/12 23:25:57 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bcm2835_intr.c,v 1.10 2015/07/25 08:43:41 skrll Exp $");
 
 #define _INTR_PRIVATE
 
@@ -361,7 +361,8 @@ bcm2836mp_pic_unblock_irqs(struct pic_so
 		    BCM2836_LOCAL_TIMER_IRQ_CONTROL_BASE,
 		    BCM2836_LOCAL_TIMER_IRQ_CONTROL_SIZE,
 		    BUS_SPACE_BARRIER_READ|BUS_SPACE_BARRIER_WRITE);
-	} else if (irq_mask & BCM2836MP_MAILBOX_IRQS) {
+	}
+	if (irq_mask & BCM2836MP_MAILBOX_IRQS) {
 		uint32_t mask = __SHIFTOUT(irq_mask, BCM2836MP_MAILBOX_IRQS);
 		uint32_t val = bus_space_read_4(al_iot, al_ioh,
 		    BCM2836_LOCAL_MAILBOX_IRQ_CONTROLN(cpuid));
@@ -396,7 +397,8 @@ bcm2836mp_pic_block_irqs(struct pic_soft
 		bus_space_write_4(al_iot, al_ioh,
 		    BCM2836_LOCAL_TIMER_IRQ_CONTROLN(cpuid),
 		    val);
-	} else if (irq_mask & BCM2836MP_MAILBOX_IRQS) {
+	}
+	if (irq_mask & BCM2836MP_MAILBOX_IRQS) {
 		uint32_t mask = __SHIFTOUT(irq_mask, BCM2836MP_MAILBOX_IRQS);
 		uint32_t val = bus_space_read_4(al_iot, al_ioh,
 		    BCM2836_LOCAL_MAILBOX_IRQ_CONTROLN(cpuid));
@@ -464,6 +466,10 @@ static void bcm2836mp_cpu_init(struct pi
 static void
 bcm2836mp_send_ipi(struct pic_softc *pic, const kcpuset_t *kcp, u_long ipi)
 {
+	KASSERT(pic != NULL);
+	KASSERT(pic != &bcm2835_pic);
+	KASSERT(pic->pic_cpus != NULL);
+
 	const cpuid_t cpuid = pic - &bcm2836mp_pic[0];
 
 	bus_space_write_4(al_iot, al_ioh,
@@ -522,7 +528,7 @@ bcm2836mp_intr_init(struct cpu_info *ci)
 	pic->pic_cpus = ci->ci_kcpuset;
 	pic_add(pic, BCM2836_INT_BASECPUN(cpuid));
 
-	intr_establish(BCM2836_INT_MAILBOX0_CPUN(cpuid), IPL_VM,
+	intr_establish(BCM2836_INT_MAILBOX0_CPUN(cpuid), IPL_HIGH,
 	    IST_LEVEL | IST_MPSAFE, bcm2836mp_ipi_handler, NULL);
 
 	/* clock interrupt will attach with gtmr */

Reply via email to