Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/arm/broadcom Add a coherent bus dma tag which marks...



details:   https://anonhg.NetBSD.org/src/rev/731eaa81e59d
branches:  trunk
changeset: 782130:731eaa81e59d
user:      matt <matt%NetBSD.org@localhost>
date:      Wed Oct 17 20:18:55 2012 +0000

description:
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.

diffstat:

 sys/arch/arm/broadcom/bcm53xx_board.c |  25 +++++++++++++++++++++++--
 sys/arch/arm/broadcom/bcm53xx_eth.c   |  28 ++++------------------------
 sys/arch/arm/broadcom/bcm53xx_pax.c   |   5 +++--
 sys/arch/arm/broadcom/bcm53xx_var.h   |   4 ++--
 4 files changed, 32 insertions(+), 30 deletions(-)

diffs (153 lines):

diff -r 694ec7ca2f2e -r 731eaa81e59d sys/arch/arm/broadcom/bcm53xx_board.c
--- a/sys/arch/arm/broadcom/bcm53xx_board.c     Wed Oct 17 20:17:18 2012 +0000
+++ b/sys/arch/arm/broadcom/bcm53xx_board.c     Wed Oct 17 20:18:55 2012 +0000
@@ -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 @@
        _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_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;
        }
 }
 
diff -r 694ec7ca2f2e -r 731eaa81e59d sys/arch/arm/broadcom/bcm53xx_eth.c
--- a/sys/arch/arm/broadcom/bcm53xx_eth.c       Wed Oct 17 20:17:18 2012 +0000
+++ b/sys/arch/arm/broadcom/bcm53xx_eth.c       Wed Oct 17 20:18:55 2012 +0000
@@ -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 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 @@
            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_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),
diff -r 694ec7ca2f2e -r 731eaa81e59d sys/arch/arm/broadcom/bcm53xx_pax.c
--- a/sys/arch/arm/broadcom/bcm53xx_pax.c       Wed Oct 17 20:17:18 2012 +0000
+++ b/sys/arch/arm/broadcom/bcm53xx_pax.c       Wed Oct 17 20:18:55 2012 +0000
@@ -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 @@
        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]),
diff -r 694ec7ca2f2e -r 731eaa81e59d sys/arch/arm/broadcom/bcm53xx_var.h
--- a/sys/arch/arm/broadcom/bcm53xx_var.h       Wed Oct 17 20:17:18 2012 +0000
+++ b/sys/arch/arm/broadcom/bcm53xx_var.h       Wed Oct 17 20:18:55 2012 +0000
@@ -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 @@
 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;



Home | Main Index | Thread Index | Old Index