xref: /freebsd/sys/riscv/include/bus_dma.h (revision d1bdc2821fcd416ab9b238580386eb605a6128d0)
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