Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/sparc64/dev Add support for bus_dma_load_raw() so t...



details:   https://anonhg.NetBSD.org/src/rev/3089bd3cfbbf
branches:  trunk
changeset: 486250:3089bd3cfbbf
user:      eeh <eeh%NetBSD.org@localhost>
date:      Wed May 17 02:31:12 2000 +0000

description:
Add support for bus_dma_load_raw() so the le driver will work again.

diffstat:

 sys/arch/sparc64/dev/iommu.c    |  96 ++++++++++++++++++++++++++++++++++++++++-
 sys/arch/sparc64/dev/iommuvar.h |   4 +-
 sys/arch/sparc64/dev/psycho.c   |  21 ++++++++-
 sys/arch/sparc64/dev/sbus.c     |  20 +++++++-
 4 files changed, 135 insertions(+), 6 deletions(-)

diffs (225 lines):

diff -r 34878321b019 -r 3089bd3cfbbf sys/arch/sparc64/dev/iommu.c
--- a/sys/arch/sparc64/dev/iommu.c      Wed May 17 02:30:25 2000 +0000
+++ b/sys/arch/sparc64/dev/iommu.c      Wed May 17 02:31:12 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: iommu.c,v 1.8 2000/04/25 14:59:38 mrg Exp $    */
+/*     $NetBSD: iommu.c,v 1.9 2000/05/17 02:31:12 eeh Exp $    */
 
 /*
  * Copyright (c) 1999, 2000 Matthew R. Green
@@ -560,6 +560,100 @@
        cache_flush((caddr_t)(u_long)dvmaddr, (u_int)sgsize);   
 }
 
+
+int
+iommu_dvmamap_load_raw(t, is, map, segs, nsegs, size, flags)
+       bus_dma_tag_t t;
+       struct iommu_state *is;
+       bus_dmamap_t map;
+       bus_dma_segment_t *segs;
+       int nsegs;
+       bus_size_t size;
+       int flags;
+{
+       vm_page_t m;
+       int s;
+       int err;
+       bus_size_t sgsize;
+       paddr_t pa;
+       u_long boundary;
+       u_long dvmaddr;
+       struct pglist *mlist;
+       int pagesz = PAGE_SIZE;
+
+       if (map->dm_nsegs) {
+               /* Already in use?? */
+#ifdef DIAGNOSTIC
+               printf("iommu_dvmamap_load_raw: map still in use\n");
+#endif
+               bus_dmamap_unload(t, map);
+       }
+       /*
+        * Make sure that on error condition we return "no valid mappings".
+        */
+       map->dm_nsegs = 0;
+#ifdef DIAGNOSTIC
+       /* XXX - unhelpful since we can't reset these in map_unload() */
+       if (segs[0].ds_addr != 0 || segs[0].ds_len != 0)
+               panic("iommu_dmamap_load_raw: segment already loaded: "
+                       "addr 0x%lx, size 0x%lx",
+                       segs[0].ds_addr, segs[0].ds_len);
+#endif
+       sgsize = round_page(size);
+
+       /*
+        * A boundary presented to bus_dmamem_alloc() takes precedence
+        * over boundary in the map.
+        */
+       if ((boundary = segs[0]._ds_boundary) == 0)
+               boundary = map->_dm_boundary;
+
+       
+       s = splhigh();
+       err = extent_alloc(is->is_dvmamap, sgsize, NBPG, boundary, 
+                          (flags & BUS_DMA_NOWAIT) == 0 ? EX_WAITOK : EX_NOWAIT, 
+                          (u_long *)&dvmaddr);
+       splx(s);
+
+       if (err != 0)
+               return (err);
+
+#ifdef DEBUG
+       if (dvmaddr == (bus_addr_t)-1)  
+       { 
+               printf("iommu_dvmamap_load_raw(): extent_alloc(%d, %x) failed!\n",
+                   sgsize, flags);
+               Debugger();
+       }               
+#endif 
+       if (dvmaddr == (bus_addr_t)-1)
+               return (ENOMEM);
+
+       /*
+        * We always use just one segment.
+        */
+       map->dm_mapsize = size;
+       map->dm_nsegs = 1;
+       map->dm_segs[0].ds_addr = dvmaddr;
+       map->dm_segs[0].ds_len = size;
+
+       mlist = segs[0]._ds_mlist;
+       for (m = TAILQ_FIRST(mlist); m != NULL; m = TAILQ_NEXT(m,pageq)) {
+               if (sgsize == 0)
+                       panic("iommu_dmamap_load_raw: size botch");
+               pa = VM_PAGE_TO_PHYS(m);
+
+               DPRINTF(IDB_DVMA,
+                   ("iommu_dvmamap_load_raw: map %p loading va %lx at pa %lx\n",
+                   map, (long)dvmaddr, (long)(pa)));
+               iommu_enter(is, dvmaddr, pa, flags);
+                       
+               dvmaddr += pagesz;
+               sgsize -= pagesz;
+       }
+       return (0);
+}
+
 void
 iommu_dvmamap_sync(t, is, map, offset, len, ops)
        bus_dma_tag_t t;
diff -r 34878321b019 -r 3089bd3cfbbf sys/arch/sparc64/dev/iommuvar.h
--- a/sys/arch/sparc64/dev/iommuvar.h   Wed May 17 02:30:25 2000 +0000
+++ b/sys/arch/sparc64/dev/iommuvar.h   Wed May 17 02:31:12 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: iommuvar.h,v 1.3 2000/04/22 17:06:03 mrg Exp $ */
+/*     $NetBSD: iommuvar.h,v 1.4 2000/05/17 02:31:13 eeh Exp $ */
 
 /*
  * Copyright (c) 1999 Matthew R. Green
@@ -63,6 +63,8 @@
            bus_dmamap_t, void *, bus_size_t, struct proc *, int));
 void   iommu_dvmamap_unload __P((bus_dma_tag_t, struct iommu_state *,
            bus_dmamap_t));
+int    iommu_dvmamap_load_raw __P((bus_dma_tag_t, struct iommu_state *,
+           bus_dmamap_t, bus_dma_segment_t *, int, bus_size_t, int));
 void   iommu_dvmamap_sync __P((bus_dma_tag_t, struct iommu_state *,
            bus_dmamap_t, bus_addr_t, bus_size_t, int));
 int    iommu_dvmamem_alloc __P((bus_dma_tag_t, struct iommu_state *,
diff -r 34878321b019 -r 3089bd3cfbbf sys/arch/sparc64/dev/psycho.c
--- a/sys/arch/sparc64/dev/psycho.c     Wed May 17 02:30:25 2000 +0000
+++ b/sys/arch/sparc64/dev/psycho.c     Wed May 17 02:31:12 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: psycho.c,v 1.8 2000/05/06 04:15:35 mrg Exp $   */
+/*     $NetBSD: psycho.c,v 1.9 2000/05/17 02:31:12 eeh Exp $   */
 
 /*
  * Copyright (c) 1999, 2000 Matthew R. Green
@@ -101,6 +101,8 @@
 static int psycho_dmamap_load __P((bus_dma_tag_t, bus_dmamap_t, void *,
                                   bus_size_t, struct proc *, int));
 static void psycho_dmamap_unload __P((bus_dma_tag_t, bus_dmamap_t));
+static int psycho_dmamap_load_raw __P((bus_dma_tag_t, bus_dmamap_t,
+                   bus_dma_segment_t *, int, bus_size_t, int));
 static void psycho_dmamap_sync __P((bus_dma_tag_t, bus_dmamap_t, bus_addr_t,
                                    bus_size_t, int));
 int psycho_dmamem_alloc __P((bus_dma_tag_t, bus_size_t, bus_size_t, bus_size_t,
@@ -682,7 +684,7 @@
        dt->_dmamap_load = psycho_dmamap_load;
        PCOPY(_dmamap_load_mbuf);
        PCOPY(_dmamap_load_uio);
-       PCOPY(_dmamap_load_raw);
+       dt->_dmamap_load_raw = psycho_dmamap_load_raw;
        dt->_dmamap_unload = psycho_dmamap_unload;
        dt->_dmamap_sync = psycho_dmamap_sync;
        dt->_dmamem_alloc = psycho_dmamem_alloc;
@@ -974,6 +976,21 @@
        iommu_dvmamap_unload(t, &sc->sc_is, map);
 }
 
+int
+psycho_dmamap_load_raw(tag, map, segs, nsegs, size, flags)
+       bus_dma_tag_t tag;
+       bus_dmamap_t map;
+       bus_dma_segment_t *segs;
+       int nsegs;
+       bus_size_t size;
+       int flags;
+{
+       struct psycho_pbm *pp = (struct psycho_pbm *)t->_cookie;
+       struct psycho_softc *sc = pp->pp_sc;
+
+       return (iommu_dvmamap_load_raw(tag, &sc->sc_is, segs, nsegs, size, flags));
+}
+
 void
 psycho_dmamap_sync(t, map, offset, len, ops)
        bus_dma_tag_t t;
diff -r 34878321b019 -r 3089bd3cfbbf sys/arch/sparc64/dev/sbus.c
--- a/sys/arch/sparc64/dev/sbus.c       Wed May 17 02:30:25 2000 +0000
+++ b/sys/arch/sparc64/dev/sbus.c       Wed May 17 02:31:12 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: sbus.c,v 1.28 2000/04/22 17:06:05 mrg Exp $ */
+/*     $NetBSD: sbus.c,v 1.29 2000/05/17 02:31:13 eeh Exp $ */
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -179,6 +179,8 @@
 int sbus_dmamap_load __P((bus_dma_tag_t, bus_dmamap_t, void *,
                          bus_size_t, struct proc *, int));
 void sbus_dmamap_unload __P((bus_dma_tag_t, bus_dmamap_t));
+int sbus_dmamap_load_raw __P((bus_dma_tag_t, bus_dmamap_t,
+                   bus_dma_segment_t *, int, bus_size_t, int));
 void sbus_dmamap_sync __P((bus_dma_tag_t, bus_dmamap_t, bus_addr_t,
                           bus_size_t, int));
 int sbus_dmamem_alloc __P((bus_dma_tag_t tag, bus_size_t size,
@@ -747,7 +749,7 @@
        sdt->_dmamap_load = sbus_dmamap_load;
        PCOPY(_dmamap_load_mbuf);
        PCOPY(_dmamap_load_uio);
-       PCOPY(_dmamap_load_raw);
+       sdt->_dmamap_load_raw = sbus_dmamap_load_raw;
        sdt->_dmamap_unload = sbus_dmamap_unload;
        sdt->_dmamap_sync = sbus_dmamap_sync;
        sdt->_dmamem_alloc = sbus_dmamem_alloc;
@@ -774,6 +776,20 @@
        return (iommu_dvmamap_load(tag, &sc->sc_is, map, buf, buflen, p, flags));
 }
 
+int
+sbus_dmamap_load_raw(tag, map, segs, nsegs, size, flags)
+       bus_dma_tag_t tag;
+       bus_dmamap_t map;
+       bus_dma_segment_t *segs;
+       int nsegs;
+       bus_size_t size;
+       int flags;
+{
+       struct sbus_softc *sc = (struct sbus_softc *)tag->_cookie;
+
+       return (iommu_dvmamap_load_raw(tag, &sc->sc_is, map, segs, nsegs, size, flags));
+}
+
 void
 sbus_dmamap_unload(tag, map)
        bus_dma_tag_t tag;



Home | Main Index | Thread Index | Old Index