Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/alpha Add some bus_dma instrumentation.



details:   https://anonhg.NetBSD.org/src/rev/357ea82b211b
branches:  trunk
changeset: 955768:357ea82b211b
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Sun Oct 11 00:33:30 2020 +0000

description:
Add some bus_dma instrumentation.

diffstat:

 sys/arch/alpha/common/bus_dma.c       |  37 ++++++++++++++++++++----
 sys/arch/alpha/common/sgmap_typedep.c |  52 ++++++++++++++++++++++++++++------
 sys/arch/alpha/include/bus_funcs.h    |  11 ++++++-
 sys/arch/alpha/pci/apecs_dma.c        |   6 ++--
 sys/arch/alpha/pci/cia_dma.c          |   6 ++--
 sys/arch/alpha/pci/dwlpx_dma.c        |   6 ++--
 sys/arch/alpha/pci/lca_dma.c          |   6 ++--
 sys/arch/alpha/pci/mcpcia_dma.c       |   6 ++--
 sys/arch/alpha/pci/pci_sgmap_pte32.c  |   5 ++-
 sys/arch/alpha/pci/pci_sgmap_pte64.c  |   5 ++-
 sys/arch/alpha/pci/tsp_dma.c          |   6 ++--
 sys/arch/alpha/pci/ttwoga_dma.c       |   6 ++--
 sys/arch/alpha/tc/tc_dma_3000_500.c   |   6 ++--
 sys/arch/alpha/tc/tc_sgmap.c          |   5 ++-
 14 files changed, 116 insertions(+), 47 deletions(-)

diffs (truncated from 622 to 300 lines):

diff -r 123190706267 -r 357ea82b211b sys/arch/alpha/common/bus_dma.c
--- a/sys/arch/alpha/common/bus_dma.c   Sat Oct 10 21:59:03 2020 +0000
+++ b/sys/arch/alpha/common/bus_dma.c   Sun Oct 11 00:33:30 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: bus_dma.c,v 1.69 2012/10/02 23:54:51 christos Exp $ */
+/* $NetBSD: bus_dma.c,v 1.70 2020/10/11 00:33:30 thorpej Exp $ */
 
 /*-
  * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
 
 #include <sys/cdefs.h>                 /* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.69 2012/10/02 23:54:51 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.70 2020/10/11 00:33:30 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -56,6 +56,9 @@
 
 extern paddr_t avail_start, avail_end; /* from pmap.c */
 
+#define        DMA_COUNT_DECL(cnt)     _DMA_COUNT_DECL(dma_direct, cnt)
+#define        DMA_COUNT(cnt)          _DMA_COUNT(dma_direct, cnt)
+
 /*
  * Common function for DMA map creation.  May be called by bus-specific
  * DMA map creation functions.
@@ -218,6 +221,9 @@
        return (0);
 }
 
+DMA_COUNT_DECL(load);
+DMA_COUNT_DECL(load_next_window);
+
 /*
  * Common function for loading a direct-mapped DMA map with a linear
  * buffer.  Called by bus-specific DMA map load functions with the
@@ -252,6 +258,7 @@
        error = _bus_dmamap_load_buffer_direct(t, map, buf, buflen,
            vm, flags, &lastaddr, &seg, 1);
        if (error == 0) {
+               DMA_COUNT(load);
                map->dm_mapsize = buflen;
                map->dm_nsegs = seg + 1;
                map->_dm_window = t;
@@ -259,12 +266,16 @@
                /*
                 * Give the next window a chance.
                 */
+               DMA_COUNT(load_next_window);
                error = bus_dmamap_load(t->_next_window, map, buf, buflen,
                    p, flags);
        }
        return (error);
 }
 
+DMA_COUNT_DECL(load_mbuf);
+DMA_COUNT_DECL(load_mbuf_next_window);
+
 /*
  * Like _bus_dmamap_load_direct(), but for mbufs.
  */
@@ -341,6 +352,7 @@
                first = 0;
        }
        if (error == 0) {
+               DMA_COUNT(load_mbuf);
                map->dm_mapsize = m0->m_pkthdr.len;
                map->dm_nsegs = seg + 1;
                map->_dm_window = t;
@@ -348,11 +360,15 @@
                /*
                 * Give the next window a chance.
                 */
+               DMA_COUNT(load_mbuf_next_window);
                error = bus_dmamap_load_mbuf(t->_next_window, map, m0, flags);
        }
        return (error);
 }
 
+DMA_COUNT_DECL(load_uio);
+DMA_COUNT_DECL(load_uio_next_window);
+
 /*
  * Like _bus_dmamap_load_direct(), but for uios.
  */
@@ -398,6 +414,7 @@
                resid -= minlen;
        }
        if (error == 0) {
+               DMA_COUNT(load_uio);
                map->dm_mapsize = uio->uio_resid;
                map->dm_nsegs = seg + 1;
                map->_dm_window = t;
@@ -405,6 +422,7 @@
                /*
                 * Give the next window a chance.
                 */
+               DMA_COUNT(load_uio_next_window);
                error = bus_dmamap_load_uio(t->_next_window, map, uio, flags);
        }
        return (error);
@@ -426,7 +444,7 @@
  * chipset-specific DMA map unload functions.
  */
 void
-_bus_dmamap_unload(bus_dma_tag_t t, bus_dmamap_t map)
+_bus_dmamap_unload_common(bus_dma_tag_t t, bus_dmamap_t map)
 {
 
        /*
@@ -440,6 +458,16 @@
        map->_dm_flags &= ~(BUS_DMA_READ|BUS_DMA_WRITE);
 }
 
+DMA_COUNT_DECL(unload);
+
+void
+_bus_dmamap_unload(bus_dma_tag_t t, bus_dmamap_t map)
+{
+       KASSERT(map->_dm_window == t);
+       DMA_COUNT(unload);
+       _bus_dmamap_unload_common(t, map);
+}
+
 /*
  * Common function for DMA map synchronization.  May be called
  * by chipset-specific DMA map synchronization functions.
@@ -449,9 +477,6 @@
     bus_size_t len, int ops)
 {
 
-       /*
-        * Flush the store buffer.
-        */
        alpha_mb();
 }
 
diff -r 123190706267 -r 357ea82b211b sys/arch/alpha/common/sgmap_typedep.c
--- a/sys/arch/alpha/common/sgmap_typedep.c     Sat Oct 10 21:59:03 2020 +0000
+++ b/sys/arch/alpha/common/sgmap_typedep.c     Sun Oct 11 00:33:30 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sgmap_typedep.c,v 1.39 2020/06/17 05:52:13 thorpej Exp $ */
+/* $NetBSD: sgmap_typedep.c,v 1.40 2020/10/11 00:33:30 thorpej Exp $ */
 
 /*-
  * Copyright (c) 1997, 1998, 2001 The NetBSD Foundation, Inc.
@@ -31,21 +31,24 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: sgmap_typedep.c,v 1.39 2020/06/17 05:52:13 thorpej Exp $");
+__KERNEL_RCSID(1, "$NetBSD: sgmap_typedep.c,v 1.40 2020/10/11 00:33:30 thorpej Exp $");
 
 #include "opt_ddb.h"
 
+#include <sys/evcnt.h>
 #include <uvm/uvm_extern.h>
 
+#define        DMA_COUNT_DECL(cnt)     _DMA_COUNT_DECL(dma_sgmap, cnt)
+#define        DMA_COUNT(cnt)          _DMA_COUNT(dma_sgmap, cnt)
+
 #ifdef SGMAP_DEBUG
 int                    __C(SGMAP_TYPE,_debug) = 0;
 #endif
 
 SGMAP_PTE_TYPE         __C(SGMAP_TYPE,_prefetch_spill_page_pte);
 
-int                    __C(SGMAP_TYPE,_load_buffer)(bus_dma_tag_t,
-                           bus_dmamap_t, void *buf, size_t buflen,
-                           struct vmspace *, int, int, struct alpha_sgmap *);
+static void            __C(SGMAP_TYPE,_do_unload)(bus_dma_tag_t, bus_dmamap_t,
+                           struct alpha_sgmap *);
 
 void
 __C(SGMAP_TYPE,_init_spill_page_pte)(void)
@@ -56,7 +59,9 @@
             SGPTE_PGADDR_SHIFT) | SGPTE_VALID;
 }
 
-int
+DMA_COUNT_DECL(spill_page);
+
+static int
 __C(SGMAP_TYPE,_load_buffer)(bus_dma_tag_t t, bus_dmamap_t map, void *buf,
     size_t buflen, struct vmspace *vm, int flags, int seg,
     struct alpha_sgmap *sgmap)
@@ -109,6 +114,7 @@
 
        sgvalen = (endva - va);
        if (spill) {
+               DMA_COUNT(spill_page);
                sgvalen += PAGE_SIZE;
 
                /*
@@ -197,6 +203,9 @@
        return (0);
 }
 
+DMA_COUNT_DECL(load);
+DMA_COUNT_DECL(load_next_window);
+
 int
 __C(SGMAP_TYPE,_load)(bus_dma_tag_t t, bus_dmamap_t map, void *buf,
     bus_size_t buflen, struct proc *p, int flags, struct alpha_sgmap *sgmap)
@@ -236,6 +245,7 @@
 #endif
 
        if (error == 0) {
+               DMA_COUNT(load);
                map->dm_mapsize = buflen;
                map->dm_nsegs = 1;
                map->_dm_window = t;
@@ -243,6 +253,7 @@
                map->_dm_flags &= ~(BUS_DMA_READ|BUS_DMA_WRITE);
                if (t->_next_window != NULL) {
                        /* Give the next window a chance. */
+                       DMA_COUNT(load_next_window);
                        error = bus_dmamap_load(t->_next_window, map, buf,
                            buflen, p, flags);
                }
@@ -250,6 +261,9 @@
        return (error);
 }
 
+DMA_COUNT_DECL(load_mbuf);
+DMA_COUNT_DECL(load_mbuf_next_window);
+
 int
 __C(SGMAP_TYPE,_load_mbuf)(bus_dma_tag_t t, bus_dmamap_t map,
     struct mbuf *m0, int flags, struct alpha_sgmap *sgmap)
@@ -295,16 +309,18 @@
 #endif
 
        if (error == 0) {
+               DMA_COUNT(load_mbuf);
                map->dm_mapsize = m0->m_pkthdr.len;
                map->dm_nsegs = seg;
                map->_dm_window = t;
        } else {
                /* Need to back out what we've done so far. */
                map->dm_nsegs = seg - 1;
-               __C(SGMAP_TYPE,_unload)(t, map, sgmap);
+               __C(SGMAP_TYPE,_do_unload)(t, map, sgmap);
                map->_dm_flags &= ~(BUS_DMA_READ|BUS_DMA_WRITE);
                if (t->_next_window != NULL) {
                        /* Give the next window a chance. */
+                       DMA_COUNT(load_mbuf_next_window);
                        error = bus_dmamap_load_mbuf(t->_next_window, map,
                            m0, flags);
                }
@@ -313,6 +329,9 @@
        return (error);
 }
 
+DMA_COUNT_DECL(load_uio);
+DMA_COUNT_DECL(load_uio_next_window);
+
 int
 __C(SGMAP_TYPE,_load_uio)(bus_dma_tag_t t, bus_dmamap_t map, struct uio *uio,
     int flags, struct alpha_sgmap *sgmap)
@@ -365,16 +384,18 @@
 #endif
 
        if (error == 0) {
+               DMA_COUNT(load_uio);
                map->dm_mapsize = uio->uio_resid;
                map->dm_nsegs = seg;
                map->_dm_window = t;
        } else {
                /* Need to back out what we've done so far. */
                map->dm_nsegs = seg - 1;
-               __C(SGMAP_TYPE,_unload)(t, map, sgmap);
+               __C(SGMAP_TYPE,_do_unload)(t, map, sgmap);
                map->_dm_flags &= ~(BUS_DMA_READ|BUS_DMA_WRITE);
                if (t->_next_window != NULL) {
                        /* Give the next window a chance. */
+                       DMA_COUNT(load_uio_next_window);
                        error = bus_dmamap_load_uio(t->_next_window, map,
                            uio, flags);
                }
@@ -396,8 +417,8 @@
        panic(__S(__C(SGMAP_TYPE,_load_raw)) ": not implemented");
 }
 
-void
-__C(SGMAP_TYPE,_unload)(bus_dma_tag_t t, bus_dmamap_t map,
+static void
+__C(SGMAP_TYPE,_do_unload)(bus_dma_tag_t t, bus_dmamap_t map,
     struct alpha_sgmap *sgmap)
 {
        SGMAP_PTE_TYPE *pte, *page_table = sgmap->aps_pt;
@@ -448,3 +469,14 @@
        map->dm_nsegs = 0;
        map->_dm_window = NULL;
 }
+
+DMA_COUNT_DECL(unload);
+



Home | Main Index | Thread Index | Old Index