fwdma.h revision 139749
117651Speter/*- 2237410Sdelphij * Copyright (C) 2003 3131380Stjr * Hidetoshi Shimokawa. All rights reserved. 417651Speter * 517651Speter * Redistribution and use in source and binary forms, with or without 617651Speter * modification, are permitted provided that the following conditions 717651Speter * are met: 817651Speter * 1. Redistributions of source code must retain the above copyright 917651Speter * notice, this list of conditions and the following disclaimer. 1017651Speter * 2. Redistributions in binary form must reproduce the above copyright 1117651Speter * notice, this list of conditions and the following disclaimer in the 1217651Speter * documentation and/or other materials provided with the distribution. 1317651Speter * 3. All advertising materials mentioning features or use of this software 1417651Speter * must display the following acknowledgement: 1517651Speter * 1617651Speter * This product includes software developed by Hidetoshi Shimokawa. 1717651Speter * 1817651Speter * 4. Neither the name of the author nor the names of its contributors 1917651Speter * may be used to endorse or promote products derived from this software 2017651Speter * without specific prior written permission. 2117651Speter * 2217651Speter * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2317651Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2417651Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2517651Speter * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2617651Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2717651Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2817651Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2917651Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3017651Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3117651Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3217651Speter * SUCH DAMAGE. 3317651Speter * 3417651Speter * $FreeBSD: head/sys/dev/firewire/fwdma.h 139749 2005-01-06 01:43:34Z imp $ 3517651Speter */ 3617651Speter 3717651Speterstruct fwdma_alloc { 3817651Speter bus_dma_tag_t dma_tag; 3933908Ssteve bus_dmamap_t dma_map; 40237410Sdelphij void * v_addr; 4117651Speter bus_addr_t bus_addr; 4217651Speter}; 4317651Speter 4417651Speterstruct fwdma_seg { 4517651Speter bus_dmamap_t dma_map; 4617651Speter void * v_addr; 4717651Speter bus_addr_t bus_addr; 4817651Speter}; 4917651Speter 50146081Skientzlestruct fwdma_alloc_multi { 5117651Speter bus_size_t ssize; 5217651Speter bus_size_t esize; 5317651Speter int nseg; 5433908Ssteve bus_dma_tag_t dma_tag; 55237410Sdelphij struct fwdma_seg seg[0]; 5617651Speter}; 5717651Speter 5817651Speterstatic __inline void * 5917651Speterfwdma_v_addr(struct fwdma_alloc_multi *am, int index) 6017651Speter{ 6117651Speter bus_size_t ssize = am->ssize; 6217651Speter int offset = am->esize * index; 6317651Speter 6417651Speter return ((caddr_t)am->seg[offset / ssize].v_addr + (offset % ssize)); 6517651Speter} 6617651Speter 6717651Speterstatic __inline bus_addr_t 6817651Speterfwdma_bus_addr(struct fwdma_alloc_multi *am, int index) 6917651Speter{ 7017651Speter bus_size_t ssize = am->ssize; 7117651Speter int offset = am->esize * index; 7217651Speter 7317651Speter return (am->seg[offset / ssize].bus_addr + (offset % ssize)); 7417651Speter} 7517651Speter 7617651Speterstatic __inline void 7717651Speterfwdma_sync(struct fwdma_alloc *dma, bus_dmasync_op_t op) 7817651Speter{ 79131380Stjr bus_dmamap_sync(dma->dma_tag, dma->dma_map, op); 8017651Speter} 81131380Stjr 82205471Sdelphijstatic __inline void 83205471Sdelphijfwdma_sync_multiseg(struct fwdma_alloc_multi *am, 8417651Speter int start, int end, bus_dmasync_op_t op) 8517651Speter{ 8617651Speter struct fwdma_seg *seg, *eseg; 8733908Ssteve 8817651Speter seg = &am->seg[am->esize * start / am->ssize]; 8917651Speter eseg = &am->seg[am->esize * end / am->ssize]; 9033908Ssteve for (; seg <= eseg; seg ++) 9133908Ssteve bus_dmamap_sync(am->dma_tag, seg->dma_map, op); 9233908Ssteve} 9317651Speter 9417651Speterstatic __inline void 9517651Speterfwdma_sync_multiseg_all(struct fwdma_alloc_multi *am, bus_dmasync_op_t op) 9617651Speter{ 9717651Speter struct fwdma_seg *seg; 9817651Speter int i; 9917651Speter 10017651Speter seg = &am->seg[0]; 10117651Speter for (i = 0; i < am->nseg; i++, seg++) 10217651Speter bus_dmamap_sync(am->dma_tag, seg->dma_map, op); 10317651Speter} 10417651Speter 10517651Spetervoid *fwdma_malloc(struct firewire_comm *, int, bus_size_t, struct fwdma_alloc *, int); 10617651Spetervoid fwdma_free(struct firewire_comm *, struct fwdma_alloc *); 10717651Spetervoid *fwdma_malloc_size(bus_dma_tag_t, bus_dmamap_t *, bus_size_t, bus_addr_t *, int); 10817651Spetervoid fwdma_free_size(bus_dma_tag_t, bus_dmamap_t, void *, bus_size_t); 10917651Speterstruct fwdma_alloc_multi *fwdma_malloc_multiseg(struct firewire_comm *, 11017651Speter int, int, int, int); 11117651Spetervoid fwdma_free_multiseg(struct fwdma_alloc_multi *); 11217651Speter 11317651Speter