Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 10 Jun 2015 22:33:56 +0000 (UTC)
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r284246 - head/sys/dev/proto
Message-ID:  <201506102233.t5AMXucv017119@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201506102233.t5AMXucv017119>