svn commit: r301031 - in head/sys: arm64/cavium dev/pci

Andrew Turner andrew at FreeBSD.org
Tue May 31 09:15:23 UTC 2016


Author: andrew
Date: Tue May 31 09:15:21 2016
New Revision: 301031
URL: https://svnweb.freebsd.org/changeset/base/301031

Log:
  Mark the ThunderX and generic PCI drivers as cache-coherent when we know
  this to be the case. This will mean we don't try and handle the cache in
  bus_dmamap_sync when it is not needed.
  
  Obtained from:	ABT Systems Ltd
  Sponsored by:	The FreeBSD Foundation
  Differential Revision:	https://reviews.freebsd.org/D6605

Modified:
  head/sys/arm64/cavium/thunder_pcie_fdt.c
  head/sys/arm64/cavium/thunder_pcie_pem.c
  head/sys/arm64/cavium/thunder_pcie_pem.h
  head/sys/dev/pci/pci_host_generic.c
  head/sys/dev/pci/pci_host_generic.h

Modified: head/sys/arm64/cavium/thunder_pcie_fdt.c
==============================================================================
--- head/sys/arm64/cavium/thunder_pcie_fdt.c	Tue May 31 08:38:24 2016	(r301030)
+++ head/sys/arm64/cavium/thunder_pcie_fdt.c	Tue May 31 09:15:21 2016	(r301031)
@@ -119,6 +119,7 @@ thunder_pcie_fdt_attach(device_t dev)
 
 	sc = device_get_softc(dev);
 	thunder_pcie_identify_ecam(dev, &sc->ecam);
+	sc->coherent = 1;
 
 	return (pci_host_generic_attach(dev));
 }

Modified: head/sys/arm64/cavium/thunder_pcie_pem.c
==============================================================================
--- head/sys/arm64/cavium/thunder_pcie_pem.c	Tue May 31 08:38:24 2016	(r301030)
+++ head/sys/arm64/cavium/thunder_pcie_pem.c	Tue May 31 09:15:21 2016	(r301031)
@@ -137,6 +137,7 @@ static int thunder_pem_get_id(device_t, 
 static int thunder_pem_attach(device_t);
 static int thunder_pem_deactivate_resource(device_t, device_t, int, int,
     struct resource *);
+static bus_dma_tag_t thunder_pem_get_dma_tag(device_t, device_t);
 static int thunder_pem_detach(device_t);
 static uint64_t thunder_pem_config_reg_read(struct thunder_pem_softc *, int);
 static int thunder_pem_link_init(struct thunder_pem_softc *);
@@ -176,6 +177,8 @@ static device_method_t thunder_pem_metho
 	DEVMETHOD(bus_setup_intr,		bus_generic_setup_intr),
 	DEVMETHOD(bus_teardown_intr,		bus_generic_teardown_intr),
 
+	DEVMETHOD(bus_get_dma_tag,		thunder_pem_get_dma_tag),
+
 	/* pcib interface */
 	DEVMETHOD(pcib_maxslots,		thunder_pem_maxslots),
 	DEVMETHOD(pcib_read_config,		thunder_pem_read_config),
@@ -331,6 +334,15 @@ thunder_pem_adjust_resource(device_t dev
 	return (rman_adjust_resource(res, start, end));
 }
 
+static bus_dma_tag_t
+thunder_pem_get_dma_tag(device_t dev, device_t child)
+{
+	struct thunder_pem_softc *sc;
+
+	sc = device_get_softc(dev);
+	return (sc->dmat);
+}
+
 static int
 thunder_pem_alloc_msi(device_t pci, device_t child, int count, int maxcount,
     int *irqs)
@@ -766,6 +778,21 @@ thunder_pem_attach(device_t dev)
 	sc->reg_bst = rman_get_bustag(sc->reg);
 	sc->reg_bsh = rman_get_bushandle(sc->reg);
 
+	/* Create the parent DMA tag to pass down the coherent flag */
+	error = bus_dma_tag_create(bus_get_dma_tag(dev), /* parent */
+	    1, 0,			/* alignment, bounds */
+	    BUS_SPACE_MAXADDR,		/* lowaddr */
+	    BUS_SPACE_MAXADDR,		/* highaddr */
+	    NULL, NULL,			/* filter, filterarg */
+	    BUS_SPACE_MAXSIZE,		/* maxsize */
+	    BUS_SPACE_UNRESTRICTED,	/* nsegments */
+	    BUS_SPACE_MAXSIZE,		/* maxsegsize */
+	    BUS_DMA_COHERENT,		/* flags */
+	    NULL, NULL,			/* lockfunc, lockarg */
+	    &sc->dmat);
+	if (error != 0)
+		return (error);
+
 	/* Map SLI, do it only once */
 	if (!sli0_s2m_regx_base) {
 		bus_space_map(sc->reg_bst, SLIX_S2M_REGX_ACC,

Modified: head/sys/arm64/cavium/thunder_pcie_pem.h
==============================================================================
--- head/sys/arm64/cavium/thunder_pcie_pem.h	Tue May 31 08:38:24 2016	(r301030)
+++ head/sys/arm64/cavium/thunder_pcie_pem.h	Tue May 31 09:15:21 2016	(r301031)
@@ -39,6 +39,7 @@ struct thunder_pem_softc {
 	struct resource		*reg;
 	bus_space_tag_t		reg_bst;
 	bus_space_handle_t	reg_bsh;
+	bus_dma_tag_t		dmat;
 	struct pcie_range	ranges[MAX_RANGES_TUPLES];
 	struct rman		mem_rman;
 	struct rman		io_rman;

Modified: head/sys/dev/pci/pci_host_generic.c
==============================================================================
--- head/sys/dev/pci/pci_host_generic.c	Tue May 31 08:38:24 2016	(r301030)
+++ head/sys/dev/pci/pci_host_generic.c	Tue May 31 09:15:21 2016	(r301031)
@@ -181,6 +181,29 @@ pci_host_generic_attach(device_t dev)
 	if (generic_pcie_ofw_bus_attach(dev) != 0)
 		return (ENXIO);
 
+	node = ofw_bus_get_node(dev);
+	if (sc->coherent == 0) {
+		sc->coherent = OF_hasprop(node, "dma-coherent");
+	}
+	//if (bootverbose)
+		device_printf(dev, "Bus is%s cache-coherent\n",
+		    sc->coherent ? "" : " not");
+
+	/* Create the parent DMA tag to pass down the coherent flag */
+	error = bus_dma_tag_create(bus_get_dma_tag(dev), /* parent */
+	    1, 0,				/* alignment, bounds */
+	    BUS_SPACE_MAXADDR,			/* lowaddr */
+	    BUS_SPACE_MAXADDR,			/* highaddr */
+	    NULL, NULL,				/* filter, filterarg */
+	    BUS_SPACE_MAXSIZE,			/* maxsize */
+	    BUS_SPACE_UNRESTRICTED,		/* nsegments */
+	    BUS_SPACE_MAXSIZE,			/* maxsegsize */
+	    sc->coherent ? BUS_DMA_COHERENT : 0, /* flags */
+	    NULL, NULL,				/* lockfunc, lockarg */
+	    &sc->dmat);
+	if (error != 0)
+		return (error);
+
 	rid = 0;
 	sc->res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE);
 	if (sc->res == NULL) {
@@ -232,7 +255,6 @@ pci_host_generic_attach(device_t dev)
 		}
 	}
 
-	node = ofw_bus_get_node(dev);
 	ofw_bus_setup_iinfo(node, &sc->pci_iinfo, sizeof(cell_t));
 
 	device_add_child(dev, "pci", -1);
@@ -682,6 +704,15 @@ generic_pcie_deactivate_resource(device_
 	return (res);
 }
 
+static bus_dma_tag_t
+generic_pcie_get_dma_tag(device_t dev, device_t child)
+{
+	struct generic_pcie_softc *sc;
+
+	sc = device_get_softc(dev);
+	return (sc->dmat);
+}
+
 static int
 generic_pcie_alloc_msi(device_t pci, device_t child, int count, int maxcount,
     int *irqs)
@@ -798,6 +829,8 @@ static device_method_t generic_pcie_meth
 	DEVMETHOD(bus_setup_intr,		bus_generic_setup_intr),
 	DEVMETHOD(bus_teardown_intr,		bus_generic_teardown_intr),
 
+	DEVMETHOD(bus_get_dma_tag,		generic_pcie_get_dma_tag),
+
 	/* pcib interface */
 	DEVMETHOD(pcib_maxslots,		generic_pcie_maxslots),
 	DEVMETHOD(pcib_route_interrupt,		generic_pcie_route_interrupt),

Modified: head/sys/dev/pci/pci_host_generic.h
==============================================================================
--- head/sys/dev/pci/pci_host_generic.h	Tue May 31 08:38:24 2016	(r301030)
+++ head/sys/dev/pci/pci_host_generic.h	Tue May 31 09:15:21 2016	(r301031)
@@ -49,6 +49,7 @@ struct pcie_range {
 struct generic_pcie_softc {
 	struct pcie_range	ranges[MAX_RANGES_TUPLES];
 	int			nranges;
+	int			coherent;
 	struct rman		mem_rman;
 	struct rman		io_rman;
 	struct resource		*res;
@@ -58,6 +59,7 @@ struct generic_pcie_softc {
 	bus_space_handle_t	bsh;
 	device_t		dev;
 	bus_space_handle_t	ioh;
+	bus_dma_tag_t		dmat;
 #ifdef FDT
 	struct ofw_bus_iinfo	pci_iinfo;
 #endif


More information about the svn-src-all mailing list