18d7e7a98SRuslan Bukin 28d7e7a98SRuslan Bukin #ifndef _MACHINE_BUS_DMA_H_ 38d7e7a98SRuslan Bukin #define _MACHINE_BUS_DMA_H_ 48d7e7a98SRuslan Bukin 575cf8837SRuslan Bukin #define WANT_INLINE_DMAMAP 68d7e7a98SRuslan Bukin #include <sys/bus_dma.h> 775cf8837SRuslan Bukin 875cf8837SRuslan Bukin #include <machine/bus_dma_impl.h> 975cf8837SRuslan Bukin 1075cf8837SRuslan Bukin /* 1175cf8837SRuslan Bukin * Allocate a handle for mapping from kva/uva/physical 1275cf8837SRuslan Bukin * address space into bus device space. 1375cf8837SRuslan Bukin */ 1475cf8837SRuslan Bukin static inline int 1575cf8837SRuslan Bukin bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) 1675cf8837SRuslan Bukin { 1775cf8837SRuslan Bukin struct bus_dma_tag_common *tc; 1875cf8837SRuslan Bukin 1975cf8837SRuslan Bukin tc = (struct bus_dma_tag_common *)dmat; 2075cf8837SRuslan Bukin return (tc->impl->map_create(dmat, flags, mapp)); 2175cf8837SRuslan Bukin } 2275cf8837SRuslan Bukin 2375cf8837SRuslan Bukin /* 2475cf8837SRuslan Bukin * Destroy a handle for mapping from kva/uva/physical 2575cf8837SRuslan Bukin * address space into bus device space. 2675cf8837SRuslan Bukin */ 2775cf8837SRuslan Bukin static inline int 2875cf8837SRuslan Bukin bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map) 2975cf8837SRuslan Bukin { 3075cf8837SRuslan Bukin struct bus_dma_tag_common *tc; 3175cf8837SRuslan Bukin 3275cf8837SRuslan Bukin tc = (struct bus_dma_tag_common *)dmat; 3375cf8837SRuslan Bukin return (tc->impl->map_destroy(dmat, map)); 3475cf8837SRuslan Bukin } 3575cf8837SRuslan Bukin 3675cf8837SRuslan Bukin /* 3775cf8837SRuslan Bukin * Allocate a piece of memory that can be efficiently mapped into 3875cf8837SRuslan Bukin * bus device space based on the constraints listed in the dma tag. 3975cf8837SRuslan Bukin * A dmamap to for use with dmamap_load is also allocated. 4075cf8837SRuslan Bukin */ 4175cf8837SRuslan Bukin static inline int 4275cf8837SRuslan Bukin bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, 4375cf8837SRuslan Bukin bus_dmamap_t *mapp) 4475cf8837SRuslan Bukin { 4575cf8837SRuslan Bukin struct bus_dma_tag_common *tc; 4675cf8837SRuslan Bukin 4775cf8837SRuslan Bukin tc = (struct bus_dma_tag_common *)dmat; 4875cf8837SRuslan Bukin return (tc->impl->mem_alloc(dmat, vaddr, flags, mapp)); 4975cf8837SRuslan Bukin } 5075cf8837SRuslan Bukin 5175cf8837SRuslan Bukin /* 5275cf8837SRuslan Bukin * Free a piece of memory and it's allociated dmamap, that was allocated 53*d1bdc282SBjoern A. Zeeb * via bus_dmamem_alloc. 5475cf8837SRuslan Bukin */ 5575cf8837SRuslan Bukin static inline void 5675cf8837SRuslan Bukin bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) 5775cf8837SRuslan Bukin { 5875cf8837SRuslan Bukin struct bus_dma_tag_common *tc; 5975cf8837SRuslan Bukin 6075cf8837SRuslan Bukin tc = (struct bus_dma_tag_common *)dmat; 6175cf8837SRuslan Bukin tc->impl->mem_free(dmat, vaddr, map); 6275cf8837SRuslan Bukin } 6375cf8837SRuslan Bukin 6475cf8837SRuslan Bukin /* 6575cf8837SRuslan Bukin * Release the mapping held by map. 6675cf8837SRuslan Bukin */ 6775cf8837SRuslan Bukin static inline void 6875cf8837SRuslan Bukin bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) 6975cf8837SRuslan Bukin { 7075cf8837SRuslan Bukin struct bus_dma_tag_common *tc; 7175cf8837SRuslan Bukin 7275cf8837SRuslan Bukin tc = (struct bus_dma_tag_common *)dmat; 7375cf8837SRuslan Bukin tc->impl->map_unload(dmat, map); 7475cf8837SRuslan Bukin } 7575cf8837SRuslan Bukin 7675cf8837SRuslan Bukin static inline void 7775cf8837SRuslan Bukin bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) 7875cf8837SRuslan Bukin { 7975cf8837SRuslan Bukin struct bus_dma_tag_common *tc; 8075cf8837SRuslan Bukin 8175cf8837SRuslan Bukin tc = (struct bus_dma_tag_common *)dmat; 8275cf8837SRuslan Bukin tc->impl->map_sync(dmat, map, op); 8375cf8837SRuslan Bukin } 8475cf8837SRuslan Bukin 8575cf8837SRuslan Bukin static inline int 8675cf8837SRuslan Bukin _bus_dmamap_load_phys(bus_dma_tag_t dmat, bus_dmamap_t map, vm_paddr_t buf, 8775cf8837SRuslan Bukin bus_size_t buflen, int flags, bus_dma_segment_t *segs, int *segp) 8875cf8837SRuslan Bukin { 8975cf8837SRuslan Bukin struct bus_dma_tag_common *tc; 9075cf8837SRuslan Bukin 9175cf8837SRuslan Bukin tc = (struct bus_dma_tag_common *)dmat; 9275cf8837SRuslan Bukin return (tc->impl->load_phys(dmat, map, buf, buflen, flags, segs, 9375cf8837SRuslan Bukin segp)); 9475cf8837SRuslan Bukin } 9575cf8837SRuslan Bukin 9675cf8837SRuslan Bukin static inline int 9775cf8837SRuslan Bukin _bus_dmamap_load_ma(bus_dma_tag_t dmat, bus_dmamap_t map, struct vm_page **ma, 9875cf8837SRuslan Bukin bus_size_t tlen, int ma_offs, int flags, bus_dma_segment_t *segs, 9975cf8837SRuslan Bukin int *segp) 10075cf8837SRuslan Bukin { 10175cf8837SRuslan Bukin struct bus_dma_tag_common *tc; 10275cf8837SRuslan Bukin 10375cf8837SRuslan Bukin tc = (struct bus_dma_tag_common *)dmat; 10475cf8837SRuslan Bukin return (tc->impl->load_ma(dmat, map, ma, tlen, ma_offs, flags, 10575cf8837SRuslan Bukin segs, segp)); 10675cf8837SRuslan Bukin } 10775cf8837SRuslan Bukin 10875cf8837SRuslan Bukin static inline int 10975cf8837SRuslan Bukin _bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, 11075cf8837SRuslan Bukin bus_size_t buflen, struct pmap *pmap, int flags, bus_dma_segment_t *segs, 11175cf8837SRuslan Bukin int *segp) 11275cf8837SRuslan Bukin { 11375cf8837SRuslan Bukin struct bus_dma_tag_common *tc; 11475cf8837SRuslan Bukin 11575cf8837SRuslan Bukin tc = (struct bus_dma_tag_common *)dmat; 11675cf8837SRuslan Bukin return (tc->impl->load_buffer(dmat, map, buf, buflen, pmap, flags, segs, 11775cf8837SRuslan Bukin segp)); 11875cf8837SRuslan Bukin } 11975cf8837SRuslan Bukin 12075cf8837SRuslan Bukin static inline void 12175cf8837SRuslan Bukin _bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, 12275cf8837SRuslan Bukin struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg) 12375cf8837SRuslan Bukin { 12475cf8837SRuslan Bukin struct bus_dma_tag_common *tc; 12575cf8837SRuslan Bukin 12675cf8837SRuslan Bukin tc = (struct bus_dma_tag_common *)dmat; 12775cf8837SRuslan Bukin tc->impl->map_waitok(dmat, map, mem, callback, callback_arg); 12875cf8837SRuslan Bukin } 12975cf8837SRuslan Bukin 13075cf8837SRuslan Bukin static inline bus_dma_segment_t * 13175cf8837SRuslan Bukin _bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map, 13275cf8837SRuslan Bukin bus_dma_segment_t *segs, int nsegs, int error) 13375cf8837SRuslan Bukin { 13475cf8837SRuslan Bukin struct bus_dma_tag_common *tc; 13575cf8837SRuslan Bukin 13675cf8837SRuslan Bukin tc = (struct bus_dma_tag_common *)dmat; 13775cf8837SRuslan Bukin return (tc->impl->map_complete(dmat, map, segs, nsegs, error)); 13875cf8837SRuslan Bukin } 1398d7e7a98SRuslan Bukin 1408d7e7a98SRuslan Bukin #endif /* !_MACHINE_BUS_DMA_H_ */ 141