Author: marcel
Date: Wed Jun 10 22:33:56 2015
New Revision: 284246
URL: https://svnweb.freebsd.org/changeset/base/284246

Log:
  Load the allocated memory and return both the physical
  address and the bus address to the application.

Modified:
  head/sys/dev/proto/proto_busdma.c
  head/sys/dev/proto/proto_dev.h

Modified: head/sys/dev/proto/proto_busdma.c
==============================================================================
--- head/sys/dev/proto/proto_busdma.c   Wed Jun 10 20:43:07 2015        
(r284245)
+++ head/sys/dev/proto/proto_busdma.c   Wed Jun 10 22:33:56 2015        
(r284246)
@@ -129,6 +129,16 @@ proto_busdma_tag_lookup(struct proto_bus
        return (NULL);
 }
 
+static void
+proto_busdma_mem_alloc_callback(void *arg, bus_dma_segment_t *segs, int        
nseg,
+    int error)
+{
+       struct proto_ioc_busdma *ioc = arg;
+
+       ioc->u.mem.bus_nsegs = nseg;
+       ioc->u.mem.bus_addr = segs[0].ds_addr;
+}
+
 static int
 proto_busdma_mem_alloc(struct proto_busdma *busdma, struct proto_tag *tag,
     struct proto_ioc_busdma *ioc)
@@ -153,10 +163,18 @@ proto_busdma_mem_alloc(struct proto_busd
                return (error);
        }
        md->physaddr = pmap_kextract((uintptr_t)(md->virtaddr));
+       error = bus_dmamap_load(md->bd_tag, md->bd_map, md->virtaddr,
+           tag->maxsz, proto_busdma_mem_alloc_callback, ioc, BUS_DMA_NOWAIT);
+       if (error) {
+               bus_dmamem_free(md->bd_tag, md->virtaddr, md->bd_map);
+               bus_dma_tag_destroy(md->bd_tag);
+               free(md, M_PROTO_BUSDMA);
+               return (error);
+       }
        LIST_INSERT_HEAD(&tag->mds, md, peers);
        LIST_INSERT_HEAD(&busdma->mds, md, mds);
-       ioc->u.mem.nsegs = 1;
-       ioc->u.mem.physaddr = md->physaddr;
+       ioc->u.mem.phys_nsegs = 1;
+       ioc->u.mem.phys_addr = md->physaddr;
        ioc->result = (uintptr_t)(void *)md;
        return (0);
 }

Modified: head/sys/dev/proto/proto_dev.h
==============================================================================
--- head/sys/dev/proto/proto_dev.h      Wed Jun 10 20:43:07 2015        
(r284245)
+++ head/sys/dev/proto/proto_dev.h      Wed Jun 10 22:33:56 2015        
(r284246)
@@ -62,8 +62,10 @@ struct proto_ioc_busdma {
                struct {
                        unsigned long   tag;
                        unsigned int    flags;
-                       unsigned int    nsegs;
-                       unsigned long   physaddr;
+                       unsigned int    phys_nsegs;
+                       unsigned long   phys_addr;
+                       unsigned long   bus_addr;
+                       unsigned int    bus_nsegs;
                } mem;
        } u;
        unsigned long   result;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to