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