svn commit: r239114 - in user/jceel/soc2012_armv6/sys/arm: arm
include ti/omap4
Jakub Wojciech Klama
jceel at FreeBSD.org
Mon Aug 6 23:15:46 UTC 2012
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);
}
More information about the svn-src-user
mailing list