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

Andrew Turner andrew at FreeBSD.org
Wed Nov 30 09:47:30 UTC 2016


Author: andrew
Date: Wed Nov 30 09:47:29 2016
New Revision: 309323
URL: https://svnweb.freebsd.org/changeset/base/309323

Log:
  Move the FDT specific parts of the GIC diver softc to the FDT attachment.
  This allows the driver to be built in a kernel with no FDT support, e.g.
  on arm64 with just ACPI.
  
  Obtained from:	ABT Systems Ltd
  Sponsored by:	The FreeBSD Foundation

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

Modified: head/sys/arm/arm/gic.h
==============================================================================
--- head/sys/arm/arm/gic.h	Wed Nov 30 09:45:18 2016	(r309322)
+++ head/sys/arm/arm/gic.h	Wed Nov 30 09:47:29 2016	(r309323)
@@ -75,9 +75,6 @@ struct arm_gic_softc {
 #endif
 
 #ifdef INTRNG
-	/* FDT child data */
-	pcell_t			addr_cells;
-	pcell_t			size_cells;
 	int			nranges;
 	struct arm_gic_range *	ranges;
 #endif

Modified: head/sys/arm/arm/gic_fdt.c
==============================================================================
--- head/sys/arm/arm/gic_fdt.c	Wed Nov 30 09:45:18 2016	(r309322)
+++ head/sys/arm/arm/gic_fdt.c	Wed Nov 30 09:47:29 2016	(r309323)
@@ -60,6 +60,12 @@ struct arm_gic_devinfo {
 };
 #endif
 
+struct arm_gic_fdt_softc {
+	struct arm_gic_softc	base;
+	pcell_t			addr_cells;
+	pcell_t			size_cells;
+};
+
 static device_probe_t gic_fdt_probe;
 static device_attach_t gic_fdt_attach;
 static ofw_bus_get_devinfo_t gic_ofw_get_devinfo;
@@ -102,7 +108,7 @@ static device_method_t gic_fdt_methods[]
 };
 
 DEFINE_CLASS_1(gic, gic_fdt_driver, gic_fdt_methods,
-    sizeof(struct arm_gic_softc), arm_gic_driver);
+    sizeof(struct arm_gic_fdt_softc), arm_gic_driver);
 
 static devclass_t gic_fdt_devclass;
 
@@ -128,7 +134,7 @@ static int
 gic_fdt_attach(device_t dev)
 {
 #ifdef INTRNG
-	struct arm_gic_softc *sc = device_get_softc(dev);
+	struct arm_gic_fdt_softc *sc = device_get_softc(dev);
 	phandle_t pxref;
 	intptr_t xref;
 #endif
@@ -164,14 +170,14 @@ gic_fdt_attach(device_t dev)
 			goto cleanup;
 		}
 	} else {
-		if (sc->gic_res[2] == NULL) {
+		if (sc->base.gic_res[2] == NULL) {
 			device_printf(dev,
 			    "not root PIC must have defined interrupt\n");
 			intr_pic_deregister(dev, xref);
 			goto cleanup;
 		}
-		if (bus_setup_intr(dev, sc->gic_res[2], INTR_TYPE_CLK,
-		    arm_gic_intr, NULL, sc, &sc->gic_intrhand)) {
+		if (bus_setup_intr(dev, sc->base.gic_res[2], INTR_TYPE_CLK,
+		    arm_gic_intr, NULL, sc, &sc->base.gic_intrhand)) {
 			device_printf(dev, "could not setup irq handler\n");
 			intr_pic_deregister(dev, xref);
 			goto cleanup;
@@ -209,7 +215,7 @@ gic_fdt_get_resource_list(device_t bus, 
 }
 
 static int
-arm_gic_fill_ranges(phandle_t node, struct arm_gic_softc *sc)
+arm_gic_fill_ranges(phandle_t node, struct arm_gic_fdt_softc *sc)
 {
 	pcell_t host_cells;
 	cell_t *base_ranges;
@@ -229,42 +235,42 @@ arm_gic_fill_ranges(phandle_t node, stru
 	nbase_ranges = OF_getproplen(node, "ranges");
 	if (nbase_ranges < 0)
 		return (-1);
-	sc->nranges = nbase_ranges / sizeof(cell_t) /
+	sc->base.nranges = nbase_ranges / sizeof(cell_t) /
 	    (sc->addr_cells + host_cells + sc->size_cells);
-	if (sc->nranges == 0)
+	if (sc->base.nranges == 0)
 		return (0);
 
-	sc->ranges = malloc(sc->nranges * sizeof(sc->ranges[0]),
+	sc->base.ranges = malloc(sc->base.nranges * sizeof(sc->base.ranges[0]),
 	    M_DEVBUF, M_WAITOK);
 	base_ranges = malloc(nbase_ranges, M_DEVBUF, M_WAITOK);
 	OF_getencprop(node, "ranges", base_ranges, nbase_ranges);
 
-	for (i = 0, j = 0; i < sc->nranges; i++) {
-		sc->ranges[i].bus = 0;
+	for (i = 0, j = 0; i < sc->base.nranges; i++) {
+		sc->base.ranges[i].bus = 0;
 		for (k = 0; k < sc->addr_cells; k++) {
-			sc->ranges[i].bus <<= 32;
-			sc->ranges[i].bus |= base_ranges[j++];
+			sc->base.ranges[i].bus <<= 32;
+			sc->base.ranges[i].bus |= base_ranges[j++];
 		}
-		sc->ranges[i].host = 0;
+		sc->base.ranges[i].host = 0;
 		for (k = 0; k < host_cells; k++) {
-			sc->ranges[i].host <<= 32;
-			sc->ranges[i].host |= base_ranges[j++];
+			sc->base.ranges[i].host <<= 32;
+			sc->base.ranges[i].host |= base_ranges[j++];
 		}
-		sc->ranges[i].size = 0;
+		sc->base.ranges[i].size = 0;
 		for (k = 0; k < sc->size_cells; k++) {
-			sc->ranges[i].size <<= 32;
-			sc->ranges[i].size |= base_ranges[j++];
+			sc->base.ranges[i].size <<= 32;
+			sc->base.ranges[i].size |= base_ranges[j++];
 		}
 	}
 
 	free(base_ranges, M_DEVBUF);
-	return (sc->nranges);
+	return (sc->base.nranges);
 }
 
 static bool
 arm_gic_add_children(device_t dev)
 {
-	struct arm_gic_softc *sc;
+	struct arm_gic_fdt_softc *sc;
 	struct arm_gic_devinfo *dinfo;
 	phandle_t child, node;
 	device_t cdev;


More information about the svn-src-all mailing list