Module Name: src Committed By: jmcneill Date: Sun Apr 12 23:25:57 UTC 2015
Modified Files: src/sys/arch/arm/broadcom: bcm2835_intr.c Log Message: Use a bit per IPI type in local mailbox 0 registers. Ok matt@ To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 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.8 src/sys/arch/arm/broadcom/bcm2835_intr.c:1.9 --- src/sys/arch/arm/broadcom/bcm2835_intr.c:1.8 Sun Apr 12 17:32:39 2015 +++ src/sys/arch/arm/broadcom/bcm2835_intr.c Sun Apr 12 23:25:57 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: bcm2835_intr.c,v 1.8 2015/04/12 17:32:39 skrll Exp $ */ +/* $NetBSD: bcm2835_intr.c,v 1.9 2015/04/12 23:25:57 jmcneill 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.8 2015/04/12 17:32:39 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bcm2835_intr.c,v 1.9 2015/04/12 23:25:57 jmcneill Exp $"); #define _INTR_PRIVATE @@ -467,7 +467,7 @@ bcm2836mp_send_ipi(struct pic_softc *pic const cpuid_t cpuid = pic - &bcm2836mp_pic[0]; bus_space_write_4(al_iot, al_ioh, - BCM2836_LOCAL_MAILBOX0_SETN(cpuid), ipi); + BCM2836_LOCAL_MAILBOX0_SETN(cpuid), __BIT(ipi)); } int @@ -475,36 +475,39 @@ bcm2836mp_ipi_handler(void *priv) { const struct cpu_info *ci = curcpu(); const cpuid_t cpuid = ci->ci_cpuid; - const uint32_t ipi = bus_space_read_4(al_iot, al_ioh, - BCM2836_LOCAL_MAILBOX0_CLRN(cpuid)); + uint32_t ipimask, bit; + ipimask = bus_space_read_4(al_iot, al_ioh, + BCM2836_LOCAL_MAILBOX0_CLRN(cpuid)); bus_space_write_4(al_iot, al_ioh, BCM2836_LOCAL_MAILBOX0_CLRN(cpuid), - ipi); + ipimask); - switch (ipi) { - case IPI_AST: - case IPI_NOP: - pic_ipi_nop(priv); - break; - case IPI_XCALL: - pic_ipi_xcall(priv); - break; - case IPI_GENERIC: - pic_ipi_generic(priv); - break; - case IPI_SHOOTDOWN: - pic_ipi_shootdown(priv); - break; -#ifdef DDB - case IPI_DDB: - pic_ipi_ddb(priv); - break; -#endif + while ((bit = ffs(ipimask)) > 0) { + const u_int ipi = bit - 1; + switch (ipi) { + case IPI_AST: + case IPI_NOP: #ifdef __HAVE_PREEMPTION - case IPI_KPREEMPT: - pic_ipi_nop(priv); - break; + case IPI_KPREEMPT: +#endif + pic_ipi_nop(priv); + break; + case IPI_XCALL: + pic_ipi_xcall(priv); + break; + case IPI_GENERIC: + pic_ipi_generic(priv); + break; + case IPI_SHOOTDOWN: + pic_ipi_shootdown(priv); + break; +#ifdef DDB + case IPI_DDB: + pic_ipi_ddb(priv); + break; #endif + } + ipimask &= ~__BIT(ipi); } return 1;