Date: Mon, 6 Aug 2012 23:15:46 +0000 (UTC) From: Jakub Wojciech Klama <jceel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r239114 - in user/jceel/soc2012_armv6/sys/arm: arm include ti/omap4 Message-ID: <201208062315.q76NFkET094023@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jceel Date: Mon Aug 6 23:15:46 2012 New Revision: 239114 URL: http://svn.freebsd.org/changeset/base/239114 Log: Initial IPI support in intrng. Modified: user/jceel/soc2012_armv6/sys/arm/arm/gic.c user/jceel/soc2012_armv6/sys/arm/arm/intrng.c user/jceel/soc2012_armv6/sys/arm/arm/pic_if.m user/jceel/soc2012_armv6/sys/arm/include/intr.h user/jceel/soc2012_armv6/sys/arm/ti/omap4/omap4_mp.c Modified: user/jceel/soc2012_armv6/sys/arm/arm/gic.c ============================================================================== --- user/jceel/soc2012_armv6/sys/arm/arm/gic.c Mon Aug 6 23:05:32 2012 (r239113) +++ user/jceel/soc2012_armv6/sys/arm/arm/gic.c Mon Aug 6 23:15:46 2012 (r239114) @@ -112,6 +112,7 @@ static void arm_gic_config(device_t, int static void arm_gic_eoi(device_t, int); static void arm_gic_mask(device_t, int); static void arm_gic_unmask(device_t, int); +static void arm_gic_ipi(device_t, cpuset_t, int); #define gic_c_read_4(_sc, _reg) \ bus_space_read_4((_sc)->gic_c_bst, (_sc)->gic_c_bsh, (_reg)) @@ -288,6 +289,19 @@ arm_gic_unmask(device_t dev, int irq) gic_d_write_4(sc, GICD_ISENABLER(irq >> 5), (1UL << (irq & 0x1F))); } +static void +arm_gic_ipi(device_t dev, cpuset_t cpus, int ipi) +{ + struct arm_gic_softc *sc = device_get_softc(dev); + uint32_t val = 0, i; + + for (i = 0; i < MAXCPU; i++) + if (CPU_ISSET(i, &cpus)) + val |= 1 << (16 + i); + + gic_d_write_4(sc, GICD_SGIR(0), val | ipi); +} + static device_method_t arm_gic_methods[] = { /* Device interface */ DEVMETHOD(device_probe, arm_gic_probe), @@ -298,6 +312,7 @@ static device_method_t arm_gic_methods[] DEVMETHOD(pic_mask, arm_gic_mask), DEVMETHOD(pic_unmask, arm_gic_unmask), DEVMETHOD(pic_eoi, arm_gic_eoi), + DEVMETHOD(pic_ipi, arm_gic_ipi), { 0, 0 } }; @@ -312,18 +327,6 @@ static devclass_t arm_gic_devclass; DRIVER_MODULE(gic, simplebus, arm_gic_driver, arm_gic_devclass, 0, 0); #ifdef SMP -void -pic_ipi_send(cpuset_t cpus, u_int ipi) -{ - uint32_t val = 0, i; - - for (i = 0; i < MAXCPU; i++) - if (CPU_ISSET(i, &cpus)) - val |= 1 << (16 + i); - gic_d_write_4(arm_gic_sc, GICD_SGIR(0), val | ipi); - -} - int pic_ipi_get(int i) { Modified: user/jceel/soc2012_armv6/sys/arm/arm/intrng.c ============================================================================== --- user/jceel/soc2012_armv6/sys/arm/arm/intrng.c Mon Aug 6 23:05:32 2012 (r239113) +++ user/jceel/soc2012_armv6/sys/arm/arm/intrng.c Mon Aug 6 23:15:46 2012 (r239114) @@ -54,8 +54,6 @@ __FBSDID("$FreeBSD$"); #define IRQ_PIC_IDX(_irq) ((_irq >> 8) & 0xff) #define IRQ_VECTOR_IDX(_irq) ((_irq) & 0xff) #define IRQ_GEN(_pic, _irq) (((_pic) << 8) | ((_irq) & 0xff)) -#define CORE_PIC_IDX (0) -#define CORE_PIC_NODE (0xffffffff) #ifdef DEBUG #define debugf(fmt, args...) do { printf("%s(): ", __func__); \ Modified: user/jceel/soc2012_armv6/sys/arm/arm/pic_if.m ============================================================================== --- user/jceel/soc2012_armv6/sys/arm/arm/pic_if.m Mon Aug 6 23:05:32 2012 (r239113) +++ user/jceel/soc2012_armv6/sys/arm/arm/pic_if.m Mon Aug 6 23:15:46 2012 (r239114) @@ -27,9 +27,17 @@ # #include <sys/bus.h> +#include <sys/cpuset.h> INTERFACE pic; +CODE { + static void null_pic_ipi(device_t dev, cpuset_t cpus, int ipi) + { + return; + } +}; + METHOD void config { device_t dev; int irq; @@ -52,3 +60,8 @@ METHOD void unmask { int irq; }; +METHOD void ipi { + device_t dev; + cpuset_t cpus; + int ipi; +} DEFAULT null_pic_ipi; Modified: user/jceel/soc2012_armv6/sys/arm/include/intr.h ============================================================================== --- user/jceel/soc2012_armv6/sys/arm/include/intr.h Mon Aug 6 23:05:32 2012 (r239113) +++ user/jceel/soc2012_armv6/sys/arm/include/intr.h Mon Aug 6 23:15:46 2012 (r239114) @@ -50,6 +50,8 @@ #define NIRQ 255 #define NPIC 16 #define INTR_CONTROLLER INTR_MD1 +#define CORE_PIC_IDX (0) +#define CORE_PIC_NODE (0xffffffff) int arm_fdt_map_irq(phandle_t ic, int irq); void arm_register_pic(device_t dev); Modified: user/jceel/soc2012_armv6/sys/arm/ti/omap4/omap4_mp.c ============================================================================== --- user/jceel/soc2012_armv6/sys/arm/ti/omap4/omap4_mp.c Mon Aug 6 23:05:32 2012 (r239113) +++ user/jceel/soc2012_armv6/sys/arm/ti/omap4/omap4_mp.c Mon Aug 6 23:15:46 2012 (r239114) @@ -83,5 +83,9 @@ platform_mp_start_ap(void) void platform_ipi_send(cpuset_t cpus, u_int ipi) { - pic_ipi_send(cpus, ipi); + device_t gic = devclass_get_device(devclass_find("gic"), 0); + if (gic == NULL) + panic("no interrupt controler to send IPI"); + + pic_ipi_send(gic, cpus, ipi); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201208062315.q76NFkET094023>