1282655Szbb/*-
2282655Szbb * Copyright (c) 2013 The FreeBSD Foundation
3282655Szbb * All rights reserved.
4282655Szbb *
5282655Szbb * This software was developed by Konstantin Belousov <kib@FreeBSD.org>
6282655Szbb * under sponsorship from the FreeBSD Foundation.
7282655Szbb *
8282655Szbb * Redistribution and use in source and binary forms, with or without
9282655Szbb * modification, are permitted provided that the following conditions
10282655Szbb * are met:
11282655Szbb * 1. Redistributions of source code must retain the above copyright
12282655Szbb *    notice, this list of conditions and the following disclaimer.
13282655Szbb * 2. Redistributions in binary form must reproduce the above copyright
14282655Szbb *    notice, this list of conditions and the following disclaimer in the
15282655Szbb *    documentation and/or other materials provided with the distribution.
16282655Szbb *
17282655Szbb * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18282655Szbb * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19282655Szbb * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20282655Szbb * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21282655Szbb * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22282655Szbb * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23282655Szbb * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24282655Szbb * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25282655Szbb * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26282655Szbb * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27282655Szbb * SUCH DAMAGE.
28282655Szbb *
29282655Szbb * $FreeBSD: releng/11.0/sys/arm64/include/bus_dma_impl.h 282655 2015-05-08 18:47:19Z zbb $
30282655Szbb */
31282655Szbb
32282655Szbb#ifndef _MACHINE_BUS_DMA_IMPL_H_
33282655Szbb#define	_MACHINE_BUS_DMA_IMPL_H_
34282655Szbb
35282655Szbbstruct bus_dma_tag_common {
36282655Szbb	struct bus_dma_impl *impl;
37282655Szbb	struct bus_dma_tag_common *parent;
38282655Szbb	bus_size_t	  alignment;
39282655Szbb	bus_addr_t	  boundary;
40282655Szbb	bus_addr_t	  lowaddr;
41282655Szbb	bus_addr_t	  highaddr;
42282655Szbb	bus_dma_filter_t *filter;
43282655Szbb	void		 *filterarg;
44282655Szbb	bus_size_t	  maxsize;
45282655Szbb	u_int		  nsegments;
46282655Szbb	bus_size_t	  maxsegsz;
47282655Szbb	int		  flags;
48282655Szbb	bus_dma_lock_t	 *lockfunc;
49282655Szbb	void		 *lockfuncarg;
50282655Szbb	int		  ref_count;
51282655Szbb};
52282655Szbb
53282655Szbbstruct bus_dma_impl {
54282655Szbb	int (*tag_create)(bus_dma_tag_t parent,
55282655Szbb	    bus_size_t alignment, bus_addr_t boundary, bus_addr_t lowaddr,
56282655Szbb	    bus_addr_t highaddr, bus_dma_filter_t *filter,
57282655Szbb	    void *filterarg, bus_size_t maxsize, int nsegments,
58282655Szbb	    bus_size_t maxsegsz, int flags, bus_dma_lock_t *lockfunc,
59282655Szbb	    void *lockfuncarg, bus_dma_tag_t *dmat);
60282655Szbb	int (*tag_destroy)(bus_dma_tag_t dmat);
61282655Szbb	int (*map_create)(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp);
62282655Szbb	int (*map_destroy)(bus_dma_tag_t dmat, bus_dmamap_t map);
63282655Szbb	int (*mem_alloc)(bus_dma_tag_t dmat, void** vaddr, int flags,
64282655Szbb	    bus_dmamap_t *mapp);
65282655Szbb	void (*mem_free)(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map);
66282655Szbb	int (*load_ma)(bus_dma_tag_t dmat, bus_dmamap_t map,
67282655Szbb	    struct vm_page **ma, bus_size_t tlen, int ma_offs, int flags,
68282655Szbb	    bus_dma_segment_t *segs, int *segp);
69282655Szbb	int (*load_phys)(bus_dma_tag_t dmat, bus_dmamap_t map,
70282655Szbb	    vm_paddr_t buf, bus_size_t buflen, int flags,
71282655Szbb	    bus_dma_segment_t *segs, int *segp);
72282655Szbb	int (*load_buffer)(bus_dma_tag_t dmat, bus_dmamap_t map,
73282655Szbb	    void *buf, bus_size_t buflen, pmap_t pmap, int flags,
74282655Szbb	    bus_dma_segment_t *segs, int *segp);
75282655Szbb	void (*map_waitok)(bus_dma_tag_t dmat, bus_dmamap_t map,
76282655Szbb	    struct memdesc *mem, bus_dmamap_callback_t *callback,
77282655Szbb	    void *callback_arg);
78282655Szbb	bus_dma_segment_t *(*map_complete)(bus_dma_tag_t dmat, bus_dmamap_t map,
79282655Szbb	    bus_dma_segment_t *segs, int nsegs, int error);
80282655Szbb	void (*map_unload)(bus_dma_tag_t dmat, bus_dmamap_t map);
81282655Szbb	void (*map_sync)(bus_dma_tag_t dmat, bus_dmamap_t map,
82282655Szbb	    bus_dmasync_op_t op);
83282655Szbb};
84282655Szbb
85282655Szbbvoid bus_dma_dflt_lock(void *arg, bus_dma_lock_op_t op);
86282655Szbbint bus_dma_run_filter(struct bus_dma_tag_common *dmat, bus_addr_t paddr);
87282655Szbbint common_bus_dma_tag_create(struct bus_dma_tag_common *parent,
88282655Szbb    bus_size_t alignment,
89282655Szbb    bus_addr_t boundary, bus_addr_t lowaddr, bus_addr_t highaddr,
90282655Szbb    bus_dma_filter_t *filter, void *filterarg, bus_size_t maxsize,
91282655Szbb    int nsegments, bus_size_t maxsegsz, int flags, bus_dma_lock_t *lockfunc,
92282655Szbb    void *lockfuncarg, size_t sz, void **dmat);
93282655Szbb
94282655Szbbextern struct bus_dma_impl bus_dma_bounce_impl;
95282655Szbb
96282655Szbb#endif
97