svn commit: r336894 - head/sys/arm/arm

Andrew Turner andrew at FreeBSD.org
Mon Jul 30 10:55:04 UTC 2018


Author: andrew
Date: Mon Jul 30 10:55:02 2018
New Revision: 336894
URL: https://svnweb.freebsd.org/changeset/base/336894

Log:
  Remove teh non-INTRNG code from the ARM GIC interrupt controller driver.
  
  We don't build for the non-INTRNG case and it was makeing the code harder
  to read.

Modified:
  head/sys/arm/arm/gic.c
  head/sys/arm/arm/gic.h
  head/sys/arm/arm/gic_fdt.c

Modified: head/sys/arm/arm/gic.c
==============================================================================
--- head/sys/arm/arm/gic.c	Mon Jul 30 10:23:29 2018	(r336893)
+++ head/sys/arm/arm/gic.c	Mon Jul 30 10:55:02 2018	(r336894)
@@ -53,9 +53,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/lock.h>
 #include <sys/mutex.h>
 #include <sys/smp.h>
-#ifdef INTRNG
 #include <sys/sched.h>
-#endif
 
 #include <vm/vm.h>
 #include <vm/pmap.h>
@@ -77,10 +75,8 @@ __FBSDID("$FreeBSD$");
 #include <arm/arm/gic.h>
 #include <arm/arm/gic_common.h>
 
-#ifdef INTRNG
 #include "pic_if.h"
 #include "msi_if.h"
-#endif
 
 /* We are using GICv2 register naming */
 
@@ -107,7 +103,6 @@ __FBSDID("$FreeBSD$");
 #define	GIC_DEFAULT_ICFGR_INIT	0x00000000
 #endif
 
-#ifdef INTRNG
 struct gic_irqsrc {
 	struct intr_irqsrc	gi_isrc;
 	uint32_t		gi_irq;
@@ -130,26 +125,11 @@ static u_int sgi_first_unused = GIC_FIRST_SGI;
 #endif
 
 #define GIC_INTR_ISRC(sc, irq)	(&sc->gic_irqs[irq].gi_isrc)
-#else /* !INTRNG */
-static struct ofw_compat_data compat_data[] = {
-	{"arm,gic",		true},	/* Non-standard, used in FreeBSD dts. */
-	{"arm,gic-400",		true},
-	{"arm,cortex-a15-gic",	true},
-	{"arm,cortex-a9-gic",	true},
-	{"arm,cortex-a7-gic",	true},
-	{"arm,arm11mp-gic",	true},
-	{"brcm,brahma-b15-gic",	true},
-	{"qcom,msm-qgic2",	true},
-	{NULL,			false}
-};
-#endif
 
 static struct resource_spec arm_gic_spec[] = {
 	{ SYS_RES_MEMORY,	0,	RF_ACTIVE },	/* Distributor registers */
 	{ SYS_RES_MEMORY,	1,	RF_ACTIVE },	/* CPU Interrupt Intf. registers */
-#ifdef INTRNG
 	{ SYS_RES_IRQ,	  0, RF_ACTIVE | RF_OPTIONAL }, /* Parent interrupt */
-#endif
 	{ -1, 0 }
 };
 
@@ -176,13 +156,6 @@ static struct arm_gic_softc *gic_sc = NULL;
 #define	gic_d_write_4(_sc, _reg, _val)		\
     bus_space_write_4((_sc)->gic_d_bst, (_sc)->gic_d_bsh, (_reg), (_val))
 
-#ifndef INTRNG
-static int gic_config_irq(int irq, enum intr_trigger trig,
-    enum intr_polarity pol);
-static void gic_post_filter(void *);
-#endif
-
-#ifdef INTRNG
 static inline void
 gic_irq_unmask(struct arm_gic_softc *sc, u_int irq)
 {
@@ -196,7 +169,6 @@ gic_irq_mask(struct arm_gic_softc *sc, u_int irq)
 
 	gic_d_write_4(sc, GICD_ICENABLER(irq), GICD_I_MASK(irq));
 }
-#endif
 
 static uint8_t
 gic_cpu_mask(struct arm_gic_softc *sc)
@@ -222,7 +194,6 @@ gic_cpu_mask(struct arm_gic_softc *sc)
 }
 
 #ifdef SMP
-#ifdef INTRNG
 static void
 arm_gic_init_secondary(device_t dev)
 {
@@ -260,105 +231,8 @@ arm_gic_init_secondary(device_t dev)
 		if (intr_isrc_init_on_cpu(GIC_INTR_ISRC(sc, irq), cpu))
 			gic_irq_unmask(sc, irq);
 }
-#else
-static void
-arm_gic_init_secondary(device_t dev)
-{
-	struct arm_gic_softc *sc = device_get_softc(dev);
-	int i;
-
-	/* Set the mask so we can find this CPU to send it IPIs */
-	arm_gic_map[PCPU_GET(cpuid)] = gic_cpu_mask(sc);
-
-	for (i = 0; i < sc->nirqs; i += 4)
-		gic_d_write_4(sc, GICD_IPRIORITYR(i), 0);
-
-	/* Set all the interrupts to be in Group 0 (secure) */
-	for (i = 0; GIC_SUPPORT_SECEXT(sc) && i < sc->nirqs; i += 32) {
-		gic_d_write_4(sc, GICD_IGROUPR(i), 0);
-	}
-
-	/* Enable CPU interface */
-	gic_c_write_4(sc, GICC_CTLR, 1);
-
-	/* Set priority mask register. */
-	gic_c_write_4(sc, GICC_PMR, 0xff);
-
-	/* Enable interrupt distribution */
-	gic_d_write_4(sc, GICD_CTLR, 0x01);
-
-	/*
-	 * Activate the timer interrupts: virtual, secure, and non-secure.
-	 */
-	gic_d_write_4(sc, GICD_ISENABLER(27), GICD_I_MASK(27));
-	gic_d_write_4(sc, GICD_ISENABLER(29), GICD_I_MASK(29));
-	gic_d_write_4(sc, GICD_ISENABLER(30), GICD_I_MASK(30));
-}
-#endif /* INTRNG */
 #endif /* SMP */
 
-#ifndef INTRNG
-int
-gic_decode_fdt(phandle_t iparent, pcell_t *intr, int *interrupt,
-    int *trig, int *pol)
-{
-	static u_int num_intr_cells;
-	static phandle_t self;
-	struct ofw_compat_data *ocd;
-
-	if (self == 0) {
-		for (ocd = compat_data; ocd->ocd_str != NULL; ocd++) {
-			if (ofw_bus_node_is_compatible(iparent, ocd->ocd_str)) {
-				self = iparent;
-				break;
-			}
-		}
-	}
-	if (self != iparent)
-		return (ENXIO);
-
-	if (num_intr_cells == 0) {
-		if (OF_searchencprop(OF_node_from_xref(iparent),
-		    "#interrupt-cells", &num_intr_cells,
-		    sizeof(num_intr_cells)) == -1) {
-			num_intr_cells = 1;
-		}
-	}
-
-	if (num_intr_cells == 1) {
-		*interrupt = fdt32_to_cpu(intr[0]);
-		*trig = INTR_TRIGGER_CONFORM;
-		*pol = INTR_POLARITY_CONFORM;
-	} else {
-		if (fdt32_to_cpu(intr[0]) == 0)
-			*interrupt = fdt32_to_cpu(intr[1]) + GIC_FIRST_SPI;
-		else
-			*interrupt = fdt32_to_cpu(intr[1]) + GIC_FIRST_PPI;
-		/*
-		 * In intr[2], bits[3:0] are trigger type and level flags.
-		 *   1 = low-to-high edge triggered
-		 *   2 = high-to-low edge triggered
-		 *   4 = active high level-sensitive
-		 *   8 = active low level-sensitive
-		 * The hardware only supports active-high-level or rising-edge
-		 * for SPIs
-		 */
-		if (*interrupt >= GIC_FIRST_SPI &&
-		    fdt32_to_cpu(intr[2]) & 0x0a) {
-			printf("unsupported trigger/polarity configuration "
-			    "0x%02x\n", fdt32_to_cpu(intr[2]) & 0x0f);
-		}
-		*pol  = INTR_POLARITY_CONFORM;
-		if (fdt32_to_cpu(intr[2]) & 0x03)
-			*trig = INTR_TRIGGER_EDGE;
-		else
-			*trig = INTR_TRIGGER_LEVEL;
-	}
-	return (0);
-}
-#endif
-
-#ifdef INTRNG
 static int
 arm_gic_register_isrcs(struct arm_gic_softc *sc, uint32_t num)
 {
@@ -425,7 +299,6 @@ arm_gic_reserve_msi_range(device_t dev, u_int start, u
 		sc->gic_irqs[start + i].gi_flags |= GI_FLAG_MSI;
 	}
 }
-#endif
 
 int
 arm_gic_attach(device_t dev)
@@ -465,27 +338,17 @@ arm_gic_attach(device_t dev)
 	sc->typer = gic_d_read_4(sc, GICD_TYPER);
 	nirqs = GICD_TYPER_I_NUM(sc->typer);
 
-#ifdef INTRNG
 	if (arm_gic_register_isrcs(sc, nirqs)) {
 		device_printf(dev, "could not register irqs\n");
 		goto cleanup;
 	}
-#else
-	sc->nirqs = nirqs;
 
-	/* Set up function pointers */
-	arm_post_filter = gic_post_filter;
-	arm_config_irq = gic_config_irq;
-#endif
-
 	icciidr = gic_c_read_4(sc, GICC_IIDR);
 	device_printf(dev,
 	    "pn 0x%x, arch 0x%x, rev 0x%x, implementer 0x%x irqs %u\n",
 	    GICD_IIDR_PROD(icciidr), GICD_IIDR_VAR(icciidr),
 	    GICD_IIDR_REV(icciidr), GICD_IIDR_IMPL(icciidr), sc->nirqs);
-#ifdef INTRNG
 	sc->gic_iidr = icciidr;
-#endif
 
 	/* Set all global interrupts to be level triggered, active low. */
 	for (i = 32; i < sc->nirqs; i += 16) {
@@ -527,17 +390,14 @@ arm_gic_attach(device_t dev)
 	gic_d_write_4(sc, GICD_CTLR, 0x01);
 	return (0);
 
-#ifdef INTRNG
 cleanup:
 	arm_gic_detach(dev);
 	return(ENXIO);
-#endif
 }
 
 int
 arm_gic_detach(device_t dev)
 {
-#ifdef INTRNG
 	struct arm_gic_softc *sc;
 
 	sc = device_get_softc(dev);
@@ -546,12 +406,10 @@ arm_gic_detach(device_t dev)
 		free(sc->gic_irqs, M_DEVBUF);
 
 	bus_release_resources(dev, arm_gic_spec, sc->gic_res);
-#endif
 
 	return (0);
 }
 
-#ifdef INTRNG
 static int
 arm_gic_print_child(device_t bus, device_t child)
 {
@@ -1145,217 +1003,8 @@ arm_gic_ipi_setup(device_t dev, u_int ipi, struct intr
 	return (0);
 }
 #endif
-#else
-static int
-arm_gic_next_irq(struct arm_gic_softc *sc, int last_irq)
-{
-	uint32_t active_irq;
 
-	active_irq = gic_c_read_4(sc, GICC_IAR);
-
-	/*
-	 * Immediately EOIR the SGIs, because doing so requires the other
-	 * bits (ie CPU number), not just the IRQ number, and we do not
-	 * have this information later.
-	 */
-	if ((active_irq & 0x3ff) <= GIC_LAST_SGI)
-		gic_c_write_4(sc, GICC_EOIR, active_irq);
-	active_irq &= 0x3FF;
-
-	if (active_irq == 0x3FF) {
-		if (last_irq == -1)
-			device_printf(sc->gic_dev,
-			    "Spurious interrupt detected\n");
-		return -1;
-	}
-
-	return active_irq;
-}
-
-static int
-arm_gic_config(device_t dev, int irq, enum intr_trigger trig,
-    enum intr_polarity pol)
-{
-	struct arm_gic_softc *sc = device_get_softc(dev);
-	uint32_t reg;
-	uint32_t mask;
-
-	/* Function is public-accessible, so validate input arguments */
-	if ((irq < 0) || (irq >= sc->nirqs))
-		goto invalid_args;
-	if ((trig != INTR_TRIGGER_EDGE) && (trig != INTR_TRIGGER_LEVEL) &&
-	    (trig != INTR_TRIGGER_CONFORM))
-		goto invalid_args;
-	if ((pol != INTR_POLARITY_HIGH) && (pol != INTR_POLARITY_LOW) &&
-	    (pol != INTR_POLARITY_CONFORM))
-		goto invalid_args;
-
-	mtx_lock_spin(&sc->mutex);
-
-	reg = gic_d_read_4(sc, GICD_ICFGR(irq));
-	mask = (reg >> 2*(irq % 16)) & 0x3;
-
-	if (pol == INTR_POLARITY_LOW) {
-		mask &= ~GICD_ICFGR_POL_MASK;
-		mask |= GICD_ICFGR_POL_LOW;
-	} else if (pol == INTR_POLARITY_HIGH) {
-		mask &= ~GICD_ICFGR_POL_MASK;
-		mask |= GICD_ICFGR_POL_HIGH;
-	}
-
-	if (trig == INTR_TRIGGER_LEVEL) {
-		mask &= ~GICD_ICFGR_TRIG_MASK;
-		mask |= GICD_ICFGR_TRIG_LVL;
-	} else if (trig == INTR_TRIGGER_EDGE) {
-		mask &= ~GICD_ICFGR_TRIG_MASK;
-		mask |= GICD_ICFGR_TRIG_EDGE;
-	}
-
-	/* Set mask */
-	reg = reg & ~(0x3 << 2*(irq % 16));
-	reg = reg | (mask << 2*(irq % 16));
-	gic_d_write_4(sc, GICD_ICFGR(irq), reg);
-
-	mtx_unlock_spin(&sc->mutex);
-
-	return (0);
-
-invalid_args:
-	device_printf(dev, "gic_config_irg, invalid parameters\n");
-	return (EINVAL);
-}
-
-
-static void
-arm_gic_mask(device_t dev, int irq)
-{
-	struct arm_gic_softc *sc = device_get_softc(dev);
-
-	gic_d_write_4(sc, GICD_ICENABLER(irq), (1UL << (irq & 0x1F)));
-	gic_c_write_4(sc, GICC_EOIR, irq); /* XXX - not allowed */
-}
-
-static void
-arm_gic_unmask(device_t dev, int irq)
-{
-	struct arm_gic_softc *sc = device_get_softc(dev);
-
-	if (irq > GIC_LAST_SGI)
-		arm_irq_memory_barrier(irq);
-
-	gic_d_write_4(sc, GICD_ISENABLER(irq), (1UL << (irq & 0x1F)));
-}
-
-#ifdef SMP
-static void
-arm_gic_ipi_send(device_t dev, cpuset_t cpus, u_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 |= arm_gic_map[i] << GICD_SGI_TARGET_SHIFT;
-
-	gic_d_write_4(sc, GICD_SGIR, val | ipi);
-}
-
-static int
-arm_gic_ipi_read(device_t dev, int i)
-{
-
-	if (i != -1) {
-		/*
-		 * The intr code will automagically give the frame pointer
-		 * if the interrupt argument is 0.
-		 */
-		if ((unsigned int)i > 16)
-			return (0);
-		return (i);
-	}
-
-	return (0x3ff);
-}
-
-static void
-arm_gic_ipi_clear(device_t dev, int ipi)
-{
-	/* no-op */
-}
-#endif
-
-static void
-gic_post_filter(void *arg)
-{
-	struct arm_gic_softc *sc = gic_sc;
-	uintptr_t irq = (uintptr_t) arg;
-
-	if (irq > GIC_LAST_SGI)
-		arm_irq_memory_barrier(irq);
-	gic_c_write_4(sc, GICC_EOIR, irq);
-}
-
-static int
-gic_config_irq(int irq, enum intr_trigger trig, enum intr_polarity pol)
-{
-
-	return (arm_gic_config(gic_sc->gic_dev, irq, trig, pol));
-}
-
-void
-arm_mask_irq(uintptr_t nb)
-{
-
-	arm_gic_mask(gic_sc->gic_dev, nb);
-}
-
-void
-arm_unmask_irq(uintptr_t nb)
-{
-
-	arm_gic_unmask(gic_sc->gic_dev, nb);
-}
-
-int
-arm_get_next_irq(int last_irq)
-{
-
-	return (arm_gic_next_irq(gic_sc, last_irq));
-}
-
-#ifdef SMP
-void
-intr_pic_init_secondary(void)
-{
-
-	arm_gic_init_secondary(gic_sc->gic_dev);
-}
-
-void
-pic_ipi_send(cpuset_t cpus, u_int ipi)
-{
-
-	arm_gic_ipi_send(gic_sc->gic_dev, cpus, ipi);
-}
-
-int
-pic_ipi_read(int i)
-{
-
-	return (arm_gic_ipi_read(gic_sc->gic_dev, i));
-}
-
-void
-pic_ipi_clear(int ipi)
-{
-
-	arm_gic_ipi_clear(gic_sc->gic_dev, ipi);
-}
-#endif
-#endif /* INTRNG */
-
 static device_method_t arm_gic_methods[] = {
-#ifdef INTRNG
 	/* Bus interface */
 	DEVMETHOD(bus_print_child,	arm_gic_print_child),
 	DEVMETHOD(bus_add_child,	bus_generic_add_child),
@@ -1379,14 +1028,12 @@ static device_method_t arm_gic_methods[] = {
 	DEVMETHOD(pic_ipi_send,		arm_gic_ipi_send),
 	DEVMETHOD(pic_ipi_setup,	arm_gic_ipi_setup),
 #endif
-#endif
 	{ 0, 0 }
 };
 
 DEFINE_CLASS_0(gic, arm_gic_driver, arm_gic_methods,
     sizeof(struct arm_gic_softc));
 
-#ifdef INTRNG
 /*
  * GICv2m support -- the GICv2 MSI/MSI-X controller.
  */
@@ -1611,4 +1258,3 @@ static device_method_t arm_gicv2m_methods[] = {
 
 DEFINE_CLASS_0(gicv2m, arm_gicv2m_driver, arm_gicv2m_methods,
     sizeof(struct arm_gicv2m_softc));
-#endif

Modified: head/sys/arm/arm/gic.h
==============================================================================
--- head/sys/arm/arm/gic.h	Mon Jul 30 10:23:29 2018	(r336893)
+++ head/sys/arm/arm/gic.h	Mon Jul 30 10:55:02 2018	(r336894)
@@ -39,20 +39,16 @@
 #ifndef _ARM_GIC_H_
 #define _ARM_GIC_H_
 
-#ifdef INTRNG
 struct arm_gic_range {
 	uint64_t bus;
 	uint64_t host;
 	uint64_t size;
 };
-#endif
 
 struct arm_gic_softc {
 	device_t		gic_dev;
-#ifdef INTRNG
 	void *			gic_intrhand;
 	struct gic_irqsrc *	gic_irqs;
-#endif
 	struct resource *	gic_res[3];
 	bus_space_tag_t		gic_c_bst;
 	bus_space_tag_t		gic_d_bst;
@@ -64,18 +60,15 @@ struct arm_gic_softc {
 	uint32_t		typer;
 	uint32_t		last_irq[MAXCPU];
 
-#ifdef INTRNG
 	uint32_t		gic_iidr;
 	u_int			gic_bus;
 
 	int			nranges;
 	struct arm_gic_range *	ranges;
-#endif
 };
 
 DECLARE_CLASS(arm_gic_driver);
 
-#ifdef INTRNG
 struct arm_gicv2m_softc {
 	struct resource	*sc_mem;
 	struct mtx	sc_mutex;
@@ -86,7 +79,6 @@ struct arm_gicv2m_softc {
 };
 
 DECLARE_CLASS(arm_gicv2m_driver);
-#endif
 
 int arm_gic_attach(device_t);
 int arm_gic_detach(device_t);

Modified: head/sys/arm/arm/gic_fdt.c
==============================================================================
--- head/sys/arm/arm/gic_fdt.c	Mon Jul 30 10:23:29 2018	(r336893)
+++ head/sys/arm/arm/gic_fdt.c	Mon Jul 30 10:55:02 2018	(r336894)
@@ -54,12 +54,10 @@ __FBSDID("$FreeBSD$");
 #include <arm/arm/gic.h>
 #include <arm/arm/gic_common.h>
 
-#ifdef INTRNG
 struct arm_gic_devinfo {
 	struct ofw_bus_devinfo	obdinfo;
 	struct resource_list	rl;
 };
-#endif
 
 struct arm_gic_fdt_softc {
 	struct arm_gic_softc	base;
@@ -70,10 +68,8 @@ struct arm_gic_fdt_softc {
 static device_probe_t gic_fdt_probe;
 static device_attach_t gic_fdt_attach;
 static ofw_bus_get_devinfo_t gic_ofw_get_devinfo;
-#ifdef INTRNG
 static bus_get_resource_list_t gic_fdt_get_resource_list;
 static bool arm_gic_add_children(device_t);
-#endif
 
 static struct ofw_compat_data compat_data[] = {
 	{"arm,gic",		true},	/* Non-standard, used in FreeBSD dts. */
@@ -92,7 +88,6 @@ static device_method_t gic_fdt_methods[] = {
 	DEVMETHOD(device_probe,		gic_fdt_probe),
 	DEVMETHOD(device_attach,	gic_fdt_attach),
 
-#ifdef INTRNG
 	/* Bus interface */
 	DEVMETHOD(bus_get_resource_list,gic_fdt_get_resource_list),
 
@@ -103,7 +98,6 @@ static device_method_t gic_fdt_methods[] = {
 	DEVMETHOD(ofw_bus_get_name,	ofw_bus_gen_get_name),
 	DEVMETHOD(ofw_bus_get_node,	ofw_bus_gen_get_node),
 	DEVMETHOD(ofw_bus_get_type,	ofw_bus_gen_get_type),
-#endif
 
 	DEVMETHOD_END,
 };
@@ -134,22 +128,17 @@ gic_fdt_probe(device_t dev)
 static int
 gic_fdt_attach(device_t dev)
 {
-#ifdef INTRNG
 	struct arm_gic_fdt_softc *sc = device_get_softc(dev);
 	phandle_t pxref;
 	intptr_t xref;
-#endif
 	int err;
 
-#ifdef INTRNG
 	sc->base.gic_bus = GIC_BUS_FDT;
-#endif
 
 	err = arm_gic_attach(dev);
 	if (err != 0)
 		return (err);
 
-#ifdef INTRNG
 	xref = OF_xref_from_node(ofw_bus_get_node(dev));
 
 	/*
@@ -196,18 +185,14 @@ gic_fdt_attach(device_t dev)
 		bus_generic_probe(dev);
 		return (bus_generic_attach(dev));
 	}
-#endif
 
 	return (0);
 
-#ifdef INTRNG
 cleanup:
 	arm_gic_detach(dev);
 	return(ENXIO);
-#endif
 }
 
-#ifdef INTRNG
 static struct resource_list *
 gic_fdt_get_resource_list(device_t bus, device_t child)
 {
@@ -376,4 +361,3 @@ static devclass_t arm_gicv2m_fdt_devclass;
 
 EARLY_DRIVER_MODULE(gicv2m, gic, arm_gicv2m_fdt_driver,
     arm_gicv2m_fdt_devclass, 0, 0, BUS_PASS_INTERRUPT + BUS_PASS_ORDER_MIDDLE);
-#endif


More information about the svn-src-head mailing list