From owner-svn-src-projects@FreeBSD.ORG Wed Jan 9 05:16:06 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 6D75ADB; Wed, 9 Jan 2013 05:16:06 +0000 (UTC) (envelope-from jeff@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 4F2EF180; Wed, 9 Jan 2013 05:16:06 +0000 (UTC) Received: from svn.freebsd.org (svn.FreeBSD.org [8.8.178.70]) by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id r095G68U047197; Wed, 9 Jan 2013 05:16:06 GMT (envelope-from jeff@svn.freebsd.org) Received: (from jeff@localhost) by svn.freebsd.org (8.14.5/8.14.5/Submit) id r095G30Y047179; Wed, 9 Jan 2013 05:16:03 GMT (envelope-from jeff@svn.freebsd.org) Message-Id: <201301090516.r095G30Y047179@svn.freebsd.org> From: Jeff Roberson Date: Wed, 9 Jan 2013 05:16:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r245216 - in projects/physbio/sys: arm/arm conf ia64/ia64 kern mips/mips powerpc/powerpc sparc64/include sparc64/sparc64 sys x86/x86 X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 09 Jan 2013 05:16:06 -0000 Author: jeff Date: Wed Jan 9 05:16:03 2013 New Revision: 245216 URL: http://svnweb.freebsd.org/changeset/base/245216 Log: - Call bus_dma_memory memdesc instead to make it more generic. Place it in its own header for now. - Move subr_busdma.c to subr_bus_dma.c for marcel. Sponsored by: EMC / Isilon Storage Division Added: projects/physbio/sys/kern/subr_bus_dma.c - copied, changed from r244877, projects/physbio/sys/kern/subr_busdma.c projects/physbio/sys/sys/memdesc.h Deleted: projects/physbio/sys/kern/subr_busdma.c Modified: projects/physbio/sys/arm/arm/busdma_machdep-v6.c projects/physbio/sys/arm/arm/busdma_machdep.c projects/physbio/sys/conf/files projects/physbio/sys/ia64/ia64/busdma_machdep.c projects/physbio/sys/mips/mips/busdma_machdep.c projects/physbio/sys/powerpc/powerpc/busdma_machdep.c projects/physbio/sys/sparc64/include/bus_dma.h projects/physbio/sys/sparc64/sparc64/bus_machdep.c projects/physbio/sys/sparc64/sparc64/iommu.c projects/physbio/sys/sys/bus_dma.h projects/physbio/sys/x86/x86/busdma_machdep.c Modified: projects/physbio/sys/arm/arm/busdma_machdep-v6.c ============================================================================== --- projects/physbio/sys/arm/arm/busdma_machdep-v6.c Wed Jan 9 05:04:13 2013 (r245215) +++ projects/physbio/sys/arm/arm/busdma_machdep-v6.c Wed Jan 9 05:16:03 2013 (r245216) @@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -155,7 +156,7 @@ struct bus_dmamap { int pagesneeded; int pagesreserved; bus_dma_tag_t dmat; - bus_dma_memory_t mem; + struct memdesc mem; pmap_t pmap; bus_dmamap_callback_t *callback; void *callback_arg; @@ -1037,11 +1038,11 @@ cleanup: void __bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dma_memory_t mem, bus_dmamap_callback_t *callback, + struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg) { - map->mem = mem; + map->mem = *mem; map->dmat = dmat; map->callback = callback; map->callback_arg = callback_arg; Modified: projects/physbio/sys/arm/arm/busdma_machdep.c ============================================================================== --- projects/physbio/sys/arm/arm/busdma_machdep.c Wed Jan 9 05:04:13 2013 (r245215) +++ projects/physbio/sys/arm/arm/busdma_machdep.c Wed Jan 9 05:16:03 2013 (r245216) @@ -61,6 +61,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -172,7 +173,7 @@ struct bus_dmamap { int pagesneeded; int pagesreserved; bus_dma_tag_t dmat; - bus_dma_memory_t mem; + struct memdesc mem; int flags; STAILQ_ENTRY(bus_dmamap) links; bus_dmamap_callback_t *callback; @@ -1107,13 +1108,13 @@ cleanup: void __bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dma_memory_t mem, bus_dmamap_callback_t *callback, + struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg) { KASSERT(dmat != NULL, ("dmatag is NULL")); KASSERT(map != NULL, ("dmamap is NULL")); - map->mem = mem; + map->mem = *mem; map->callback = callback; map->callback_arg = callback_arg; } Modified: projects/physbio/sys/conf/files ============================================================================== --- projects/physbio/sys/conf/files Wed Jan 9 05:04:13 2013 (r245215) +++ projects/physbio/sys/conf/files Wed Jan 9 05:16:03 2013 (r245216) @@ -2671,7 +2671,7 @@ kern/subr_acl_posix1e.c optional ufs_ac kern/subr_autoconf.c standard kern/subr_blist.c standard kern/subr_bus.c standard -kern/subr_busdma.c standard +kern/subr_bus_dma.c standard kern/subr_bufring.c standard kern/subr_clock.c standard kern/subr_devstat.c standard Modified: projects/physbio/sys/ia64/ia64/busdma_machdep.c ============================================================================== --- projects/physbio/sys/ia64/ia64/busdma_machdep.c Wed Jan 9 05:04:13 2013 (r245215) +++ projects/physbio/sys/ia64/ia64/busdma_machdep.c Wed Jan 9 05:16:03 2013 (r245216) @@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -107,7 +108,7 @@ struct bus_dmamap { int pagesneeded; int pagesreserved; bus_dma_tag_t dmat; - bus_dma_memory_t mem; + struct memdesc mem; bus_dmamap_callback_t *callback; void *callback_arg; STAILQ_ENTRY(bus_dmamap) links; @@ -728,11 +729,11 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm void __bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dma_memory_t mem, bus_dmamap_callback_t *callback, void *callback_arg) + struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg) { if (map != NULL) { map->dmat = dmat; - map->mem = mem; + map->mem = *mem; map->callback = callback; map->callback_arg = callback_arg; } Copied and modified: projects/physbio/sys/kern/subr_bus_dma.c (from r244877, projects/physbio/sys/kern/subr_busdma.c) ============================================================================== --- projects/physbio/sys/kern/subr_busdma.c Mon Dec 31 01:13:41 2012 (r244877, copy source) +++ projects/physbio/sys/kern/subr_bus_dma.c Wed Jan 9 05:16:03 2013 (r245216) @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -248,12 +249,14 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_ void *callback_arg, int flags) { bus_dma_segment_t *segs; + struct memdesc mem; int error; int nsegs; - if ((flags & BUS_DMA_NOWAIT) == 0) - _bus_dmamap_waitok(dmat, map, dma_mem_vaddr(buf, buflen), - callback, callback_arg); + if ((flags & BUS_DMA_NOWAIT) == 0) { + mem = memdesc_vaddr(buf, buflen); + _bus_dmamap_waitok(dmat, map, &mem, callback, callback_arg); + } nsegs = -1; error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, kernel_pmap, @@ -349,6 +352,7 @@ bus_dmamap_load_ccb(bus_dma_tag_t dmat, { bus_dma_segment_t *segs; struct ccb_hdr *ccb_h; + struct memdesc mem; int error; int nsegs; @@ -357,9 +361,10 @@ bus_dmamap_load_ccb(bus_dma_tag_t dmat, callback(callback_arg, NULL, 0, 0); return (0); } - if ((flags & BUS_DMA_NOWAIT) == 0) - _bus_dmamap_waitok(dmat, map, dma_mem_ccb(ccb), callback, - callback_arg); + if ((flags & BUS_DMA_NOWAIT) == 0) { + mem = memdesc_ccb(ccb); + _bus_dmamap_waitok(dmat, map, &mem, callback, callback_arg); + } nsegs = -1; error = _bus_dmamap_load_ccb(dmat, map, ccb, &nsegs, flags); nsegs++; @@ -383,7 +388,7 @@ bus_dmamap_load_ccb(bus_dma_tag_t dmat, int bus_dmamap_load_mem(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dma_memory_t *mem, bus_dmamap_callback_t *callback, + struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg, int flags) { bus_dma_segment_t *segs; @@ -391,41 +396,41 @@ bus_dmamap_load_mem(bus_dma_tag_t dmat, int nsegs; if ((flags & BUS_DMA_NOWAIT) == 0) - _bus_dmamap_waitok(dmat, map, *mem, callback, callback_arg); + _bus_dmamap_waitok(dmat, map, mem, callback, callback_arg); nsegs = -1; error = 0; - switch (mem->dm_type) { - case BUS_DMAMEM_VADDR: - error = _bus_dmamap_load_buffer(dmat, map, mem->u.dm_vaddr, - mem->dm_opaque, kernel_pmap, flags, NULL, &nsegs); - break; - case BUS_DMAMEM_PADDR: - error = _bus_dmamap_load_phys(dmat, map, mem->u.dm_paddr, - mem->dm_opaque, flags, NULL, &nsegs); - break; - case BUS_DMAMEM_VLIST: - error = _bus_dmamap_load_vlist(dmat, map, mem->u.dm_list, - mem->dm_opaque, kernel_pmap, &nsegs, flags); - break; - case BUS_DMAMEM_PLIST: - error = _bus_dmamap_load_plist(dmat, map, mem->u.dm_list, - mem->dm_opaque, &nsegs, flags); + switch (mem->md_type) { + case MEMDESC_VADDR: + error = _bus_dmamap_load_buffer(dmat, map, mem->u.md_vaddr, + mem->md_opaque, kernel_pmap, flags, NULL, &nsegs); + break; + case MEMDESC_PADDR: + error = _bus_dmamap_load_phys(dmat, map, mem->u.md_paddr, + mem->md_opaque, flags, NULL, &nsegs); + break; + case MEMDESC_VLIST: + error = _bus_dmamap_load_vlist(dmat, map, mem->u.md_list, + mem->md_opaque, kernel_pmap, &nsegs, flags); + break; + case MEMDESC_PLIST: + error = _bus_dmamap_load_plist(dmat, map, mem->u.md_list, + mem->md_opaque, &nsegs, flags); break; - case BUS_DMAMEM_BIO: - error = _bus_dmamap_load_bio(dmat, map, mem->u.dm_bio, + case MEMDESC_BIO: + error = _bus_dmamap_load_bio(dmat, map, mem->u.md_bio, &nsegs, flags); break; - case BUS_DMAMEM_UIO: - error = _bus_dmamap_load_uio(dmat, map, mem->u.dm_uio, + case MEMDESC_UIO: + error = _bus_dmamap_load_uio(dmat, map, mem->u.md_uio, &nsegs, flags); break; - case BUS_DMAMEM_MBUF: - error = _bus_dmamap_load_mbuf_sg(dmat, map, mem->u.dm_mbuf, + case MEMDESC_MBUF: + error = _bus_dmamap_load_mbuf_sg(dmat, map, mem->u.md_mbuf, NULL, &nsegs, flags); break; - case BUS_DMAMEM_CCB: - error = _bus_dmamap_load_ccb(dmat, map, mem->u.dm_ccb, &nsegs, + case MEMDESC_CCB: + error = _bus_dmamap_load_ccb(dmat, map, mem->u.md_ccb, &nsegs, flags); break; } Modified: projects/physbio/sys/mips/mips/busdma_machdep.c ============================================================================== --- projects/physbio/sys/mips/mips/busdma_machdep.c Wed Jan 9 05:04:13 2013 (r245215) +++ projects/physbio/sys/mips/mips/busdma_machdep.c Wed Jan 9 05:16:03 2013 (r245216) @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -137,7 +138,7 @@ struct bus_dmamap { int pagesneeded; int pagesreserved; bus_dma_tag_t dmat; - bus_dma_memory_t mem; + struct memdesc *mem; int flags; void *origbuffer; void *allocbuffer; @@ -965,12 +966,12 @@ cleanup: void __bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dma_memory_t mem, bus_dmamap_callback_t *callback, void *callback_arg) + struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg) { KASSERT(dmat != NULL, ("dmatag is NULL")); KASSERT(map != NULL, ("dmamap is NULL")); - map->mem = mem; + map->mem = *mem; map->callback = callback; map->callback_arg = callback_arg; } Modified: projects/physbio/sys/powerpc/powerpc/busdma_machdep.c ============================================================================== --- projects/physbio/sys/powerpc/powerpc/busdma_machdep.c Wed Jan 9 05:04:13 2013 (r245215) +++ projects/physbio/sys/powerpc/powerpc/busdma_machdep.c Wed Jan 9 05:16:03 2013 (r245216) @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -125,7 +126,7 @@ struct bus_dmamap { int pagesneeded; int pagesreserved; bus_dma_tag_t dmat; - bus_dma_memory_t mem; + struct memdesc *mem; bus_dma_segment_t *segments; int nsegs; bus_dmamap_callback_t *callback; @@ -826,13 +827,13 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm void __bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dma_memory_t mem, bus_dmamap_callback_t *callback, + struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg) { if (dmat->flags & BUS_DMA_COULD_BOUNCE) { map->dmat = dmat; - map->mem = mem; + map->mem = *mem; map->callback = callback; map->callback_arg = callback_arg; } Modified: projects/physbio/sys/sparc64/include/bus_dma.h ============================================================================== --- projects/physbio/sys/sparc64/include/bus_dma.h Wed Jan 9 05:04:13 2013 (r245215) +++ projects/physbio/sys/sparc64/include/bus_dma.h Wed Jan 9 05:16:03 2013 (r245216) @@ -85,7 +85,7 @@ struct bus_dma_methods { void *buf, bus_size_t buflen, struct pmap *pmap, int flags, bus_dma_segment_t *segs, int *segp); void (*dm_dmamap_waitok)(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dma_memory_t mem, bus_dmamap_callback_t *callback, + struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg); bus_dma_segment_t *(*dm_dmamap_complete)(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dma_segment_t *segs, int nsegs, int error); Modified: projects/physbio/sys/sparc64/sparc64/bus_machdep.c ============================================================================== --- projects/physbio/sys/sparc64/sparc64/bus_machdep.c Wed Jan 9 05:04:13 2013 (r245215) +++ projects/physbio/sys/sparc64/sparc64/bus_machdep.c Wed Jan 9 05:16:03 2013 (r245216) @@ -451,7 +451,7 @@ nexus_dmamap_load_buffer(bus_dma_tag_t d static void nexus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dma_memory_t mem, bus_dmamap_callback_t *callback, void *callback_arg) + struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg) { } Modified: projects/physbio/sys/sparc64/sparc64/iommu.c ============================================================================== --- projects/physbio/sys/sparc64/sparc64/iommu.c Wed Jan 9 05:04:13 2013 (r245215) +++ projects/physbio/sys/sparc64/sparc64/iommu.c Wed Jan 9 05:16:03 2013 (r245216) @@ -1087,7 +1087,7 @@ iommu_dvmamap_load_buffer(bus_dma_tag_t static void iommu_dvmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dma_memory_t mem, bus_dmamap_callback_t *callback, void *callback_arg) + struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg) { } Modified: projects/physbio/sys/sys/bus_dma.h ============================================================================== --- projects/physbio/sys/sys/bus_dma.h Wed Jan 9 05:04:13 2013 (r245215) +++ projects/physbio/sys/sys/bus_dma.h Wed Jan 9 05:16:03 2013 (r245216) @@ -110,11 +110,12 @@ #define BUS_DMA_KEEP_PG_OFFSET 0x400 /* Forwards needed by prototypes below. */ -struct pmap; +union ccb; +struct bio; struct mbuf; +struct memdesc; +struct pmap; struct uio; -struct bio; -union ccb; /* * Operations performed by bus_dmamap_sync(). @@ -136,128 +137,6 @@ typedef struct bus_dma_segment { } bus_dma_segment_t; /* - * bus_dma_memory_t - * - * Encapsulates various memory descriptors that devices may DMA - * to or from. - */ - -typedef struct bus_dma_memory { - union { - void *dm_vaddr; - vm_paddr_t dm_paddr; - bus_dma_segment_t *dm_list; - struct bio *dm_bio; - struct uio *dm_uio; - struct mbuf *dm_mbuf; - union ccb *dm_ccb; - } u; - bus_size_t dm_opaque; /* type specific data. */ - uint32_t dm_type; /* Type of memory. */ -} bus_dma_memory_t; - -#define BUS_DMAMEM_VADDR 1 /* Contiguous virtual address. */ -#define BUS_DMAMEM_PADDR 2 /* Contiguous physical address. */ -#define BUS_DMAMEM_VLIST 3 /* sglist of kva. */ -#define BUS_DMAMEM_PLIST 4 /* sglist of physical addresses. */ -#define BUS_DMAMEM_BIO 5 /* Pointer to a bio (block io). */ -#define BUS_DMAMEM_UIO 6 /* Pointer to a uio (any io). */ -#define BUS_DMAMEM_MBUF 7 /* Pointer to a mbuf (network io). */ -#define BUS_DMAMEM_CCB 8 /* Cam control block. (scsi/ata io). */ - -static inline bus_dma_memory_t -dma_mem_vaddr(void *vaddr, bus_size_t len) -{ - bus_dma_memory_t mem; - - mem.u.dm_vaddr = vaddr; - mem.dm_opaque = len; - mem.dm_type = BUS_DMAMEM_VADDR; - - return (mem); -} - -static inline bus_dma_memory_t -dma_mem_paddr(vm_paddr_t paddr, bus_size_t len) -{ - bus_dma_memory_t mem; - - mem.u.dm_paddr = paddr; - mem.dm_opaque = len; - mem.dm_type = BUS_DMAMEM_PADDR; - - return (mem); -} - -static inline bus_dma_memory_t -dma_mem_vlist(bus_dma_segment_t *vlist, int sglist_cnt) -{ - bus_dma_memory_t mem; - - mem.u.dm_list = vlist; - mem.dm_opaque = sglist_cnt; - mem.dm_type = BUS_DMAMEM_VLIST; - - return (mem); -} - -static inline bus_dma_memory_t -dma_mem_plist(bus_dma_segment_t *plist, int sglist_cnt) -{ - bus_dma_memory_t mem; - - mem.u.dm_list = plist; - mem.dm_opaque = sglist_cnt; - mem.dm_type = BUS_DMAMEM_PLIST; - - return (mem); -} - -static inline bus_dma_memory_t -dma_mem_bio(struct bio *bio) -{ - bus_dma_memory_t mem; - - mem.u.dm_bio = bio; - mem.dm_type = BUS_DMAMEM_BIO; - - return (mem); -} - -static inline bus_dma_memory_t -dma_mem_uio(struct uio *uio) -{ - bus_dma_memory_t mem; - - mem.u.dm_uio = uio; - mem.dm_type = BUS_DMAMEM_UIO; - - return (mem); -} - -static inline bus_dma_memory_t -dma_mem_mbuf(struct mbuf *mbuf) -{ - bus_dma_memory_t mem; - - mem.u.dm_mbuf = mbuf; - mem.dm_type = BUS_DMAMEM_MBUF; - - return (mem); -} - -static inline bus_dma_memory_t -dma_mem_ccb(union ccb *ccb) -{ - bus_dma_memory_t mem; - - mem.u.dm_ccb = ccb; - mem.dm_type = BUS_DMAMEM_CCB; - - return (mem); -} - -/* * A function that returns 1 if the address cannot be accessed by * a device and 0 if it can be. */ @@ -355,7 +234,7 @@ int bus_dmamap_load_ccb(bus_dma_tag_t dm * Loads any memory descriptor. */ int bus_dmamap_load_mem(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dma_memory_t *mem, bus_dmamap_callback_t *callback, + struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg, int flags); /* @@ -417,7 +296,7 @@ void _bus_dmamap_unload(bus_dma_tag_t dm * software. */ void __bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dma_memory_t mem, + struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg); Added: projects/physbio/sys/sys/memdesc.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/physbio/sys/sys/memdesc.h Wed Jan 9 05:16:03 2013 (r245216) @@ -0,0 +1,154 @@ +/*- + * Copyright (c) 2012 EMC Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _SYS_MEMDESC_H_ +#define _SYS_MEMDESC_H_ + +struct bio; +struct bus_dma_segment; +struct uio; +struct mbuf; +union ccb; + +/* + * struct memdesc encapsulates various memory descriptors and provides + * abstract access to them. + */ +struct memdesc { + union { + void *md_vaddr; + vm_paddr_t md_paddr; + struct bus_dma_segment *md_list; + struct bio *md_bio; + struct uio *md_uio; + struct mbuf *md_mbuf; + union ccb *md_ccb; + } u; + size_t md_opaque; /* type specific data. */ + uint32_t md_type; /* Type of memory. */ +}; + +#define MEMDESC_VADDR 1 /* Contiguous virtual address. */ +#define MEMDESC_PADDR 2 /* Contiguous physical address. */ +#define MEMDESC_VLIST 3 /* scatter/gather list of kva addresses. */ +#define MEMDESC_PLIST 4 /* scatter/gather list of physical addresses. */ +#define MEMDESC_BIO 5 /* Pointer to a bio (block io). */ +#define MEMDESC_UIO 6 /* Pointer to a uio (any io). */ +#define MEMDESC_MBUF 7 /* Pointer to a mbuf (network io). */ +#define MEMDESC_CCB 8 /* Cam control block. (scsi/ata io). */ + +static inline struct memdesc +memdesc_vaddr(void *vaddr, size_t len) +{ + struct memdesc mem; + + mem.u.md_vaddr = vaddr; + mem.md_opaque = len; + mem.md_type = MEMDESC_VADDR; + + return (mem); +} + +static inline struct memdesc +memdesc_paddr(vm_paddr_t paddr, size_t len) +{ + struct memdesc mem; + + mem.u.md_paddr = paddr; + mem.md_opaque = len; + mem.md_type = MEMDESC_PADDR; + + return (mem); +} + +static inline struct memdesc +memdesc_vlist(struct bus_dma_segment *vlist, int sglist_cnt) +{ + struct memdesc mem; + + mem.u.md_list = vlist; + mem.md_opaque = sglist_cnt; + mem.md_type = MEMDESC_VLIST; + + return (mem); +} + +static inline struct memdesc +memdesc_plist(struct bus_dma_segment *plist, int sglist_cnt) +{ + struct memdesc mem; + + mem.u.md_list = plist; + mem.md_opaque = sglist_cnt; + mem.md_type = MEMDESC_PLIST; + + return (mem); +} + +static inline struct memdesc +memdesc_bio(struct bio *bio) +{ + struct memdesc mem; + + mem.u.md_bio = bio; + mem.md_type = MEMDESC_BIO; + + return (mem); +} + +static inline struct memdesc +memdesc_uio(struct uio *uio) +{ + struct memdesc mem; + + mem.u.md_uio = uio; + mem.md_type = MEMDESC_UIO; + + return (mem); +} + +static inline struct memdesc +memdesc_mbuf(struct mbuf *mbuf) +{ + struct memdesc mem; + + mem.u.md_mbuf = mbuf; + mem.md_type = MEMDESC_MBUF; + + return (mem); +} + +static inline struct memdesc +memdesc_ccb(union ccb *ccb) +{ + struct memdesc mem; + + mem.u.md_ccb = ccb; + mem.md_type = MEMDESC_CCB; + + return (mem); +} +#endif /* _SYS_MEMDESC_H_ */ Modified: projects/physbio/sys/x86/x86/busdma_machdep.c ============================================================================== --- projects/physbio/sys/x86/x86/busdma_machdep.c Wed Jan 9 05:04:13 2013 (r245215) +++ projects/physbio/sys/x86/x86/busdma_machdep.c Wed Jan 9 05:16:03 2013 (r245216) @@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -124,7 +125,7 @@ struct bus_dmamap { int pagesneeded; int pagesreserved; bus_dma_tag_t dmat; - bus_dma_memory_t mem; + struct memdesc mem; bus_dmamap_callback_t *callback; void *callback_arg; STAILQ_ENTRY(bus_dmamap) links; @@ -850,11 +851,11 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm void __bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dma_memory_t mem, bus_dmamap_callback_t *callback, + struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg) { if (map != NULL) { - map->mem = mem; + map->mem = *mem; map->dmat = dmat; map->callback = callback; map->callback_arg = callback_arg;