diff options
author | marcel <marcel@FreeBSD.org> | 2015-06-10 22:33:56 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2015-06-10 22:33:56 +0000 |
commit | 433b5407122ff2007cfcda12ab364b0ec65cc2f2 (patch) | |
tree | 2367c00a74027c375af510e4e54f080deeeb98d7 | |
parent | 582bfe6ed02cc87cd3b190b486c6fd368e39fea8 (diff) | |
download | FreeBSD-src-433b5407122ff2007cfcda12ab364b0ec65cc2f2.zip FreeBSD-src-433b5407122ff2007cfcda12ab364b0ec65cc2f2.tar.gz |
Load the allocated memory and return both the physical
address and the bus address to the application.
-rw-r--r-- | sys/dev/proto/proto_busdma.c | 22 | ||||
-rw-r--r-- | sys/dev/proto/proto_dev.h | 6 |
2 files changed, 24 insertions, 4 deletions
diff --git a/sys/dev/proto/proto_busdma.c b/sys/dev/proto/proto_busdma.c index ced4eed..e01e76f 100644 --- a/sys/dev/proto/proto_busdma.c +++ b/sys/dev/proto/proto_busdma.c @@ -129,6 +129,16 @@ proto_busdma_tag_lookup(struct proto_busdma *busdma, u_long key) 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_busdma *busdma, struct proto_tag *tag, 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); } diff --git a/sys/dev/proto/proto_dev.h b/sys/dev/proto/proto_dev.h index 0050f0b..88a61a7 100644 --- a/sys/dev/proto/proto_dev.h +++ b/sys/dev/proto/proto_dev.h @@ -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; |