Module Name:    src
Committed By:   matt
Date:           Wed Oct 17 20:18:55 UTC 2012

Modified Files:
        src/sys/arch/arm/broadcom: bcm53xx_board.c bcm53xx_eth.c bcm53xx_pax.c
            bcm53xx_var.h

Log Message:
Add a coherent bus dma tag which marks the first 256MB as having coherent
dma (but only for PCIe and ethernet).  Make the ethernet and PCIe attachments
use this tag instead of the default non-coherent one.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/broadcom/bcm53xx_board.c
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/arm/broadcom/bcm53xx_eth.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/arm/broadcom/bcm53xx_pax.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/broadcom/bcm53xx_var.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/broadcom/bcm53xx_board.c
diff -u src/sys/arch/arm/broadcom/bcm53xx_board.c:1.5 src/sys/arch/arm/broadcom/bcm53xx_board.c:1.6
--- src/sys/arch/arm/broadcom/bcm53xx_board.c:1.5	Sun Oct  7 19:16:39 2012
+++ src/sys/arch/arm/broadcom/bcm53xx_board.c	Wed Oct 17 20:18:55 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: bcm53xx_board.c,v 1.5 2012/10/07 19:16:39 matt Exp $	*/
+/*	$NetBSD: bcm53xx_board.c,v 1.6 2012/10/17 20:18:55 matt Exp $	*/
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -34,7 +34,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: bcm53xx_board.c,v 1.5 2012/10/07 19:16:39 matt Exp $");
+__KERNEL_RCSID(1, "$NetBSD: bcm53xx_board.c,v 1.6 2012/10/17 20:18:55 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -75,6 +75,14 @@ struct arm32_bus_dma_tag bcm53xx_dma_tag
 	_BUS_DMATAG_FUNCS,
 };
 
+struct arm32_dma_range bcm53xx_coherent_dma_ranges[2];
+
+struct arm32_bus_dma_tag bcm53xx_coherent_dma_tag = {
+	_BUS_DMAMAP_FUNCS,
+	_BUS_DMAMEM_FUNCS,
+	_BUS_DMATAG_FUNCS,
+};
+
 #ifdef BCM53XX_CONSOLE_EARLY
 #include <dev/ic/ns16550reg.h>
 #include <dev/ic/comreg.h>
@@ -504,6 +512,19 @@ bcm53xx_dma_bootstrap(psize_t memsize)
 		bcm53xx_dma_ranges[1].dr_len = memsize - 0x10000000;
 		bcm53xx_dma_tag._ranges = bcm53xx_dma_ranges;
 		bcm53xx_dma_tag._nranges = __arraycount(bcm53xx_dma_ranges);
+		bcm53xx_coherent_dma_ranges[0] = bcm53xx_dma_ranges[0];
+		bcm53xx_coherent_dma_ranges[0].dr_flags = _BUS_DMAMAP_COHERENT;
+		bcm53xx_coherent_dma_ranges[1] = bcm53xx_dma_ranges[1];
+		bcm53xx_coherent_dma_tag._ranges = bcm53xx_coherent_dma_ranges;
+		bcm53xx_coherent_dma_tag._nranges =
+		    __arraycount(bcm53xx_coherent_dma_ranges);
+	} else {
+		bcm53xx_coherent_dma_ranges[0].dr_sysbase = 0x80000000;
+		bcm53xx_coherent_dma_ranges[0].dr_busbase = 0x80000000;
+		bcm53xx_coherent_dma_ranges[0].dr_len = memsize;
+		bcm53xx_coherent_dma_ranges[0].dr_flags = _BUS_DMAMAP_COHERENT;
+		bcm53xx_coherent_dma_tag._ranges = bcm53xx_coherent_dma_ranges;
+		bcm53xx_coherent_dma_tag._nranges = 1;
 	}
 }
 

Index: src/sys/arch/arm/broadcom/bcm53xx_eth.c
diff -u src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.10 src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.11
--- src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.10	Fri Oct 12 23:25:15 2012
+++ src/sys/arch/arm/broadcom/bcm53xx_eth.c	Wed Oct 17 20:18:55 2012
@@ -34,7 +34,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: bcm53xx_eth.c,v 1.10 2012/10/12 23:25:15 matt Exp $");
+__KERNEL_RCSID(1, "$NetBSD: bcm53xx_eth.c,v 1.11 2012/10/17 20:18:55 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -210,13 +210,6 @@ static void bcmeth_worker(struct work *,
 static int bcmeth_mediachange(struct ifnet *);
 static void bcmeth_mediastatus(struct ifnet *, struct ifmediareq *);
 
-static struct arm32_dma_range bcmeth_dma_ranges[2];
-static struct arm32_bus_dma_tag bcmeth_dma_tag = {
-	_BUS_DMAMAP_FUNCS,
-	_BUS_DMAMEM_FUNCS,
-	_BUS_DMATAG_FUNCS,
-};
-
 static inline uint32_t
 bcmeth_read_4(struct bcmeth_softc *sc, bus_size_t o)
 {
@@ -267,23 +260,9 @@ bcmeth_ccb_attach(device_t parent, devic
 	    loc->loc_offset, loc->loc_size, &sc->sc_bsh);
 
 	/*
-	 * Initialize a bus_dma_tag to prefer memory over 256MB.
+	 * We need to use the coherent dma tag for the GMAC.
 	 */
-	if (bcmeth_dma_tag._nranges != sc->sc_dmat->_nranges) {
-		KASSERT(sc->sc_dmat->_nranges == 2);
-		bcmeth_dma_ranges[0] = sc->sc_dmat->_ranges[1];
-		bcmeth_dma_ranges[1] = sc->sc_dmat->_ranges[0];
-		bcmeth_dma_tag._ranges = bcmeth_dma_ranges;
-		bcmeth_dma_tag._nranges = sc->sc_dmat->_nranges;
-	}
-
-	/*
-	 * If we initialized our dma tag, then use it.
-	 */
-	if (bcmeth_dma_tag._nranges > 0) {
-		sc->sc_dmat = &bcmeth_dma_tag;
-		KASSERT(sc->sc_dmat->_ranges[0].dr_busbase - sc->sc_dmat->_ranges[1].dr_busbase == 0x10000000);
-	}
+	sc->sc_dmat = &bcm53xx_coherent_dma_tag;
 
 	prop_data_t eaprop = prop_dictionary_get(dict, "mac-address");
         if (eaprop == NULL) {
@@ -861,6 +840,7 @@ bcmeth_rx_buf_alloc(
 		bcmeth_mapcache_put(sc, sc->sc_rx_mapcache, map);
 		return NULL;
 	}
+	KASSERT(map->_dm_flags & _BUS_DMAMAP_COHERENT);
 	KASSERT(map->dm_mapsize == MCLBYTES);
 	*mtod(m, uint32_t *) = BCMETH_RCVMAGIC;
 	bus_dmamap_sync(sc->sc_dmat, map, 0, sizeof(uint32_t),

Index: src/sys/arch/arm/broadcom/bcm53xx_pax.c
diff -u src/sys/arch/arm/broadcom/bcm53xx_pax.c:1.6 src/sys/arch/arm/broadcom/bcm53xx_pax.c:1.7
--- src/sys/arch/arm/broadcom/bcm53xx_pax.c:1.6	Fri Oct 12 17:18:02 2012
+++ src/sys/arch/arm/broadcom/bcm53xx_pax.c	Wed Oct 17 20:18:55 2012
@@ -34,7 +34,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: bcm53xx_pax.c,v 1.6 2012/10/12 17:18:02 matt Exp $");
+__KERNEL_RCSID(1, "$NetBSD: bcm53xx_pax.c,v 1.7 2012/10/17 20:18:55 matt Exp $");
 
 #include <sys/bus.h>
 #include <sys/device.h>
@@ -201,7 +201,8 @@ bcmpax_ccb_attach(device_t parent, devic
 	const char * const xname = device_xname(self);
 
 	sc->sc_dev = self;
-	sc->sc_dmat = ccbaa->ccbaa_dmat;
+	//sc->sc_dmat = ccbaa->ccbaa_dmat;
+	sc->sc_dmat = &bcm53xx_coherent_dma_tag;
 
 	for (u_int i = 0; i < 4; i++) {
 		snprintf(sc->sc_intrstring[i], sizeof(sc->sc_intrstring[i]),

Index: src/sys/arch/arm/broadcom/bcm53xx_var.h
diff -u src/sys/arch/arm/broadcom/bcm53xx_var.h:1.3 src/sys/arch/arm/broadcom/bcm53xx_var.h:1.4
--- src/sys/arch/arm/broadcom/bcm53xx_var.h:1.3	Sun Oct  7 19:16:39 2012
+++ src/sys/arch/arm/broadcom/bcm53xx_var.h	Wed Oct 17 20:18:55 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: bcm53xx_var.h,v 1.3 2012/10/07 19:16:39 matt Exp $	*/
+/*	$NetBSD: bcm53xx_var.h,v 1.4 2012/10/17 20:18:55 matt Exp $	*/
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -114,7 +114,7 @@ uint32_t	bcm53xx_srab_read_4(u_int);
 uint64_t	bcm53xx_srab_read_8(u_int);
 void	bcm53xx_srab_write_4(u_int, uint32_t);
 void	bcm53xx_srab_write_8(u_int, uint64_t);
-extern struct arm32_bus_dma_tag bcm53xx_dma_tag;
+extern struct arm32_bus_dma_tag bcm53xx_dma_tag, bcm53xx_coherent_dma_tag;
 extern struct bus_space bcmgen_bs_tag;
 extern bus_space_tag_t bcm53xx_ioreg_bst;
 extern bus_space_handle_t bcm53xx_ioreg_bsh;

Reply via email to