1#ifndef _MACHINE_BUS_DMA_H_
  2#define	_MACHINE_BUS_DMA_H_
  3
  4#define WANT_INLINE_DMAMAP
  5#include <sys/bus_dma.h>
  6
  7#include <machine/bus_dma_impl.h>
  8
  9/*
 10 * Allocate a handle for mapping from kva/uva/physical
 11 * address space into bus device space.
 12 */
 13static inline int
 14bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp)
 15{
 16	struct bus_dma_tag_common *tc;
 17
 18	tc = (struct bus_dma_tag_common *)dmat;
 19	return (tc->impl->map_create(dmat, flags, mapp));
 20}
 21
 22/*
 23 * Destroy a handle for mapping from kva/uva/physical
 24 * address space into bus device space.
 25 */
 26static inline int
 27bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map)
 28{
 29	struct bus_dma_tag_common *tc;
 30
 31	tc = (struct bus_dma_tag_common *)dmat;
 32	return (tc->impl->map_destroy(dmat, map));
 33}
 34
 35/*
 36 * Allocate a piece of memory that can be efficiently mapped into
 37 * bus device space based on the constraints listed in the dma tag.
 38 * A dmamap to for use with dmamap_load is also allocated.
 39 */
 40static inline int
 41bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags,
 42    bus_dmamap_t *mapp)
 43{
 44	struct bus_dma_tag_common *tc;
 45
 46	tc = (struct bus_dma_tag_common *)dmat;
 47	return (tc->impl->mem_alloc(dmat, vaddr, flags, mapp));
 48}
 49
 50/*
 51 * Free a piece of memory and it's allociated dmamap, that was allocated
 52 * via bus_dmamem_alloc.  Make the same choice for free/contigfree.
 53 */
 54static inline void
 55bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map)
 56{
 57	struct bus_dma_tag_common *tc;
 58
 59	tc = (struct bus_dma_tag_common *)dmat;
 60	tc->impl->mem_free(dmat, vaddr, map);
 61}
 62
 63/*
 64 * Release the mapping held by map.
 65 */
 66static inline void
 67bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map)
 68{
 69	struct bus_dma_tag_common *tc;
 70
 71	tc = (struct bus_dma_tag_common *)dmat;
 72	tc->impl->map_unload(dmat, map);
 73}
 74
 75static inline void
 76bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op)
 77{
 78	struct bus_dma_tag_common *tc;
 79
 80	tc = (struct bus_dma_tag_common *)dmat;
 81	tc->impl->map_sync(dmat, map, op);
 82}
 83
 84static inline int
 85_bus_dmamap_load_phys(bus_dma_tag_t dmat, bus_dmamap_t map, vm_paddr_t buf,
 86    bus_size_t buflen, int flags, bus_dma_segment_t *segs, int *segp)
 87{
 88	struct bus_dma_tag_common *tc;
 89
 90	tc = (struct bus_dma_tag_common *)dmat;
 91	return (tc->impl->load_phys(dmat, map, buf, buflen, flags, segs,
 92	    segp));
 93}
 94
 95static inline int
 96_bus_dmamap_load_ma(bus_dma_tag_t dmat, bus_dmamap_t map, struct vm_page **ma,
 97    bus_size_t tlen, int ma_offs, int flags, bus_dma_segment_t *segs,
 98    int *segp)
 99{
100	struct bus_dma_tag_common *tc;
101
102	tc = (struct bus_dma_tag_common *)dmat;
103	return (tc->impl->load_ma(dmat, map, ma, tlen, ma_offs, flags,
104	    segs, segp));
105}
106
107static inline int
108_bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
109    bus_size_t buflen, struct pmap *pmap, int flags, bus_dma_segment_t *segs,
110    int *segp)
111{
112	struct bus_dma_tag_common *tc;
113
114	tc = (struct bus_dma_tag_common *)dmat;
115	return (tc->impl->load_buffer(dmat, map, buf, buflen, pmap, flags, segs,
116	    segp));
117}
118
119static inline void
120_bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map,
121    struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg)
122{
123	struct bus_dma_tag_common *tc;
124
125	tc = (struct bus_dma_tag_common *)dmat;
126	tc->impl->map_waitok(dmat, map, mem, callback, callback_arg);
127}
128
129static inline bus_dma_segment_t *
130_bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map,
131    bus_dma_segment_t *segs, int nsegs, int error)
132{
133	struct bus_dma_tag_common *tc;
134
135	tc = (struct bus_dma_tag_common *)dmat;
136	return (tc->impl->map_complete(dmat, map, segs, nsegs, error));
137}
138
139#endif /* !_MACHINE_BUS_DMA_H_ */