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 */