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