xref: /netbsd/sys/arch/evbcf/include/bus_dma.h (revision fe1137cb)
1*fe1137cbSmsaitoh /* $NetBSD: bus_dma.h,v 1.3 2021/12/05 04:54:20 msaitoh Exp $	*/
27168dfe8Smatt 
37168dfe8Smatt /*
4*fe1137cbSmsaitoh  * This file was extracted from next68k/include/bus.h
57168dfe8Smatt  * and should probably be resynced when needed.
67168dfe8Smatt  * original cvs id: NetBSD: bus_dma.h,v 1.3 1999/08/05 01:50:59 dbj Exp
77168dfe8Smatt  */
87168dfe8Smatt 
97168dfe8Smatt /*-
107168dfe8Smatt  * Copyright (c) 1997, 1998, 2001 The NetBSD Foundation, Inc.
117168dfe8Smatt  * All rights reserved.
127168dfe8Smatt  *
137168dfe8Smatt  * This code is derived from software contributed to The NetBSD Foundation
147168dfe8Smatt  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
157168dfe8Smatt  * NASA Ames Research Center.
167168dfe8Smatt  *
177168dfe8Smatt  * Redistribution and use in source and binary forms, with or without
187168dfe8Smatt  * modification, are permitted provided that the following conditions
197168dfe8Smatt  * are met:
207168dfe8Smatt  * 1. Redistributions of source code must retain the above copyright
217168dfe8Smatt  *    notice, this list of conditions and the following disclaimer.
227168dfe8Smatt  * 2. Redistributions in binary form must reproduce the above copyright
237168dfe8Smatt  *    notice, this list of conditions and the following disclaimer in the
247168dfe8Smatt  *    documentation and/or other materials provided with the distribution.
257168dfe8Smatt  *
267168dfe8Smatt  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
277168dfe8Smatt  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
287168dfe8Smatt  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
297168dfe8Smatt  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
307168dfe8Smatt  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
317168dfe8Smatt  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
327168dfe8Smatt  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
337168dfe8Smatt  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
347168dfe8Smatt  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
357168dfe8Smatt  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
367168dfe8Smatt  * POSSIBILITY OF SUCH DAMAGE.
377168dfe8Smatt  */
387168dfe8Smatt 
397168dfe8Smatt /*
407168dfe8Smatt  * Copyright (c) 1996 Carnegie-Mellon University.
417168dfe8Smatt  * All rights reserved.
427168dfe8Smatt  *
437168dfe8Smatt  * Author: Chris G. Demetriou
447168dfe8Smatt  *
457168dfe8Smatt  * Permission to use, copy, modify and distribute this software and
467168dfe8Smatt  * its documentation is hereby granted, provided that both the copyright
477168dfe8Smatt  * notice and this permission notice appear in all copies of the
487168dfe8Smatt  * software, derivative works or modified versions, and any portions
497168dfe8Smatt  * thereof, and that both notices appear in supporting documentation.
507168dfe8Smatt  *
517168dfe8Smatt  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
527168dfe8Smatt  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
537168dfe8Smatt  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
547168dfe8Smatt  *
557168dfe8Smatt  * Carnegie Mellon requests users of this software to return to
567168dfe8Smatt  *
577168dfe8Smatt  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
587168dfe8Smatt  *  School of Computer Science
597168dfe8Smatt  *  Carnegie Mellon University
607168dfe8Smatt  *  Pittsburgh PA 15213-3890
617168dfe8Smatt  *
627168dfe8Smatt  * any improvements or extensions that they make and grant Carnegie the
637168dfe8Smatt  * rights to redistribute these changes.
647168dfe8Smatt  */
657168dfe8Smatt 
667168dfe8Smatt #ifndef _MVME68K_BUS_DMA_H_
677168dfe8Smatt #define	_MVME68K_BUS_DMA_H_
687168dfe8Smatt 
697168dfe8Smatt /*
707168dfe8Smatt  * Bus DMA methods.
717168dfe8Smatt  */
727168dfe8Smatt 
737168dfe8Smatt /*
747168dfe8Smatt  * Flags used in various bus DMA methods.
757168dfe8Smatt  */
767168dfe8Smatt #define	BUS_DMA_WAITOK		0x000	/* safe to sleep (pseudo-flag) */
777168dfe8Smatt #define	BUS_DMA_NOWAIT		0x001	/* not safe to sleep */
787168dfe8Smatt #define	BUS_DMA_ALLOCNOW	0x002	/* perform resource allocation now */
797168dfe8Smatt #define	BUS_DMA_COHERENT	0x004	/* hint: map memory DMA coherent */
807168dfe8Smatt #define	BUS_DMA_STREAMING	0x008	/* hint: sequential, unidirectional */
817168dfe8Smatt #define	BUS_DMA_BUS1		0x010	/* placeholders for bus functions... */
827168dfe8Smatt #define	BUS_DMA_BUS2		0x020
837168dfe8Smatt #define	BUS_DMA_BUS3		0x040
847168dfe8Smatt #define	BUS_DMA_BUS4		0x080
857168dfe8Smatt #define	BUS_DMA_READ		0x100	/* mapping is device -> memory only */
867168dfe8Smatt #define	BUS_DMA_WRITE		0x200	/* mapping is memory -> device only */
877168dfe8Smatt #define	BUS_DMA_NOCACHE		0x400	/* hint: map non-cached memory */
887168dfe8Smatt 
897168dfe8Smatt /*
907168dfe8Smatt  * Flags to constrain the physical memory allocated for DMA
917168dfe8Smatt  */
927168dfe8Smatt #define BUS_DMA_ONBOARD_RAM	BUS_DMA_BUS1
937168dfe8Smatt #define BUS_DMA_24BIT		BUS_DMA_BUS2
947168dfe8Smatt 
957168dfe8Smatt /* Forwards needed by prototypes below. */
967168dfe8Smatt struct mbuf;
977168dfe8Smatt struct uio;
987168dfe8Smatt 
997168dfe8Smatt /*
1007168dfe8Smatt  * Operations performed by bus_dmamap_sync().
1017168dfe8Smatt  */
1027168dfe8Smatt #define	BUS_DMASYNC_PREREAD	0x01	/* pre-read synchronization */
1037168dfe8Smatt #define	BUS_DMASYNC_POSTREAD	0x02	/* post-read synchronization */
1047168dfe8Smatt #define	BUS_DMASYNC_PREWRITE	0x04	/* pre-write synchronization */
1057168dfe8Smatt #define	BUS_DMASYNC_POSTWRITE	0x08	/* post-write synchronization */
1067168dfe8Smatt 
1077168dfe8Smatt typedef struct mvme68k_bus_dma_tag *bus_dma_tag_t;
1087168dfe8Smatt typedef struct mvme68k_bus_dmamap *bus_dmamap_t;
1097168dfe8Smatt 
1107168dfe8Smatt /*
1117168dfe8Smatt  *	bus_dma_segment_t
1127168dfe8Smatt  *
1137168dfe8Smatt  *	Describes a single contiguous DMA transaction.  Values
1147168dfe8Smatt  *	are suitable for programming into DMA registers.
1157168dfe8Smatt  */
1167168dfe8Smatt struct mvme68k_bus_dma_segment {
1177168dfe8Smatt 	bus_addr_t	ds_addr;	/* DMA address */
1187168dfe8Smatt 	bus_size_t	ds_len;		/* length of transfer */
1197168dfe8Smatt 
1207168dfe8Smatt 	/* PRIVATE */
1217168dfe8Smatt 	bus_addr_t	_ds_cpuaddr;	/* CPU-relative phys addr of segment */
1227168dfe8Smatt 	int		_ds_flags;
1237168dfe8Smatt };
1247168dfe8Smatt typedef struct mvme68k_bus_dma_segment	bus_dma_segment_t;
1257168dfe8Smatt 
1267168dfe8Smatt /*
1277168dfe8Smatt  *	bus_dma_tag_t
1287168dfe8Smatt  *
1297168dfe8Smatt  *	A machine-dependent opaque type describing the implementation of
1307168dfe8Smatt  *	DMA for a given bus.
1317168dfe8Smatt  */
1327168dfe8Smatt struct mvme68k_bus_dma_tag {
1337168dfe8Smatt 	void	*_cookie;		/* cookie used in the guts */
1347168dfe8Smatt 
1357168dfe8Smatt 	/*
1367168dfe8Smatt 	 * DMA mapping methods.
1377168dfe8Smatt 	 */
1387168dfe8Smatt 	int	(*_dmamap_create)(bus_dma_tag_t, bus_size_t, int,
1397168dfe8Smatt 		    bus_size_t, bus_size_t, int, bus_dmamap_t *);
1407168dfe8Smatt 	void	(*_dmamap_destroy)(bus_dma_tag_t, bus_dmamap_t);
1417168dfe8Smatt 	int	(*_dmamap_load)(bus_dma_tag_t, bus_dmamap_t, void *,
1427168dfe8Smatt 		    bus_size_t, struct proc *, int);
1437168dfe8Smatt 	int	(*_dmamap_load_mbuf)(bus_dma_tag_t, bus_dmamap_t,
1447168dfe8Smatt 		    struct mbuf *, int);
1457168dfe8Smatt 	int	(*_dmamap_load_uio)(bus_dma_tag_t, bus_dmamap_t,
1467168dfe8Smatt 		    struct uio *, int);
1477168dfe8Smatt 	int	(*_dmamap_load_raw)(bus_dma_tag_t, bus_dmamap_t,
1487168dfe8Smatt 		    bus_dma_segment_t *, int, bus_size_t, int);
1497168dfe8Smatt 	void	(*_dmamap_unload)(bus_dma_tag_t, bus_dmamap_t);
1507168dfe8Smatt 	void	(*_dmamap_sync)(bus_dma_tag_t, bus_dmamap_t,
1517168dfe8Smatt 		    bus_addr_t, bus_size_t, int);
1527168dfe8Smatt 
1537168dfe8Smatt 	/*
1547168dfe8Smatt 	 * DMA memory utility functions.
1557168dfe8Smatt 	 */
1567168dfe8Smatt 	int	(*_dmamem_alloc)(bus_dma_tag_t, bus_size_t, bus_size_t,
1577168dfe8Smatt 		    bus_size_t, bus_dma_segment_t *, int, int *, int);
1587168dfe8Smatt 	void	(*_dmamem_free)(bus_dma_tag_t,
1597168dfe8Smatt 		    bus_dma_segment_t *, int);
1607168dfe8Smatt 	int	(*_dmamem_map)(bus_dma_tag_t, bus_dma_segment_t *,
1617168dfe8Smatt 		    int, size_t, void **, int);
1627168dfe8Smatt 	void	(*_dmamem_unmap)(bus_dma_tag_t, void *, size_t);
1637168dfe8Smatt 	paddr_t	(*_dmamem_mmap)(bus_dma_tag_t, bus_dma_segment_t *,
1647168dfe8Smatt 		    int, off_t, int, int);
1657168dfe8Smatt };
1667168dfe8Smatt 
1677168dfe8Smatt #define	bus_dmamap_create(t, s, n, m, b, f, p)			\
1687168dfe8Smatt 	(*(t)->_dmamap_create)((t), (s), (n), (m), (b), (f), (p))
1697168dfe8Smatt #define	bus_dmamap_destroy(t, p)				\
1707168dfe8Smatt 	(*(t)->_dmamap_destroy)((t), (p))
1717168dfe8Smatt #define	bus_dmamap_load(t, m, b, s, p, f)			\
1727168dfe8Smatt 	(*(t)->_dmamap_load)((t), (m), (b), (s), (p), (f))
1737168dfe8Smatt #define	bus_dmamap_load_mbuf(t, m, b, f)			\
1747168dfe8Smatt 	(*(t)->_dmamap_load_mbuf)((t), (m), (b), (f))
1757168dfe8Smatt #define	bus_dmamap_load_uio(t, m, u, f)				\
1767168dfe8Smatt 	(*(t)->_dmamap_load_uio)((t), (m), (u), (f))
1777168dfe8Smatt #define	bus_dmamap_load_raw(t, m, sg, n, s, f)			\
1787168dfe8Smatt 	(*(t)->_dmamap_load_raw)((t), (m), (sg), (n), (s), (f))
1797168dfe8Smatt #define	bus_dmamap_unload(t, p)					\
1807168dfe8Smatt 	(*(t)->_dmamap_unload)((t), (p))
1817168dfe8Smatt #define	bus_dmamap_sync(t, p, o, l, ops)			\
1827168dfe8Smatt 	(*(t)->_dmamap_sync)((t), (p), (o), (l), (ops))
1837168dfe8Smatt #define	bus_dmamem_alloc(t, s, a, b, sg, n, r, f)		\
1847168dfe8Smatt 	(*(t)->_dmamem_alloc)((t), (s), (a), (b), (sg), (n), (r), (f))
1857168dfe8Smatt #define	bus_dmamem_free(t, sg, n)				\
1867168dfe8Smatt 	(*(t)->_dmamem_free)((t), (sg), (n))
1877168dfe8Smatt #define	bus_dmamem_map(t, sg, n, s, k, f)			\
1887168dfe8Smatt 	(*(t)->_dmamem_map)((t), (sg), (n), (s), (k), (f))
1897168dfe8Smatt #define	bus_dmamem_unmap(t, k, s)				\
1907168dfe8Smatt 	(*(t)->_dmamem_unmap)((t), (k), (s))
1917168dfe8Smatt #define	bus_dmamem_mmap(t, sg, n, o, p, f)			\
1927168dfe8Smatt 	(*(t)->_dmamem_mmap)((t), (sg), (n), (o), (p), (f))
1937168dfe8Smatt 
1947168dfe8Smatt /*
1957168dfe8Smatt  *	bus_dmamap_t
1967168dfe8Smatt  *
1977168dfe8Smatt  *	Describes a DMA mapping.
1987168dfe8Smatt  */
1997168dfe8Smatt struct mvme68k_bus_dmamap {
2007168dfe8Smatt 	/*
2017168dfe8Smatt 	 * PRIVATE MEMBERS: not for use by machine-independent code.
2027168dfe8Smatt 	 */
2037168dfe8Smatt 	bus_size_t	_dm_size;	/* largest DMA transfer mappable */
2047168dfe8Smatt 	int		_dm_segcnt;	/* number of segs this map can map */
2057168dfe8Smatt 	bus_size_t	_dm_maxmaxsegsz; /* fixed largest possible segment */
2067168dfe8Smatt 	bus_size_t	_dm_boundary;	/* don't cross this */
2077168dfe8Smatt 	int		_dm_flags;	/* misc. flags */
2087168dfe8Smatt 	void		*_dm_cookie;	/* Bus-specific cookie */
2097168dfe8Smatt 
2107168dfe8Smatt 	/*
2117168dfe8Smatt 	 * PUBLIC MEMBERS: these are used by machine-independent code.
2127168dfe8Smatt 	 */
2137168dfe8Smatt 	bus_size_t	dm_maxsegsz;	/* largest possible segment */
2147168dfe8Smatt 	bus_size_t	dm_mapsize;	/* size of the mapping */
2157168dfe8Smatt 	int		dm_nsegs;	/* # valid segments in mapping */
2167168dfe8Smatt 	bus_dma_segment_t dm_segs[1];	/* segments; variable length */
2177168dfe8Smatt };
2187168dfe8Smatt 
2197168dfe8Smatt #ifdef _MVME68K_BUS_DMA_PRIVATE
2207168dfe8Smatt int	_bus_dmamap_create(bus_dma_tag_t, bus_size_t, int, bus_size_t,
2217168dfe8Smatt 	    bus_size_t, int, bus_dmamap_t *);
2227168dfe8Smatt void	_bus_dmamap_destroy(bus_dma_tag_t, bus_dmamap_t);
2237168dfe8Smatt 
2247168dfe8Smatt int	_bus_dmamap_load_direct(bus_dma_tag_t, bus_dmamap_t,
2257168dfe8Smatt 	    void *, bus_size_t, struct proc *, int);
2267168dfe8Smatt int	_bus_dmamap_load_mbuf_direct(bus_dma_tag_t,
2277168dfe8Smatt 	    bus_dmamap_t, struct mbuf *, int);
2287168dfe8Smatt int	_bus_dmamap_load_uio_direct(bus_dma_tag_t,
2297168dfe8Smatt 	    bus_dmamap_t, struct uio *, int);
2307168dfe8Smatt int	_bus_dmamap_load_raw_direct(bus_dma_tag_t,
2317168dfe8Smatt 	    bus_dmamap_t, bus_dma_segment_t *, int, bus_size_t, int);
2327168dfe8Smatt void	_bus_dmamap_unload(bus_dma_tag_t, bus_dmamap_t);
2337168dfe8Smatt void	_bus_dmamap_sync_030(bus_dma_tag_t, bus_dmamap_t, bus_addr_t,
2347168dfe8Smatt 	    bus_size_t, int);
2357168dfe8Smatt void	_bus_dmamap_sync_0460(bus_dma_tag_t, bus_dmamap_t, bus_addr_t,
2367168dfe8Smatt 	    bus_size_t, int);
2377168dfe8Smatt int	_bus_dmamem_alloc(bus_dma_tag_t tag, bus_size_t size,
2387168dfe8Smatt 	    bus_size_t alignment, bus_size_t boundary,
2397168dfe8Smatt 	    bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags);
2407168dfe8Smatt void	_bus_dmamem_free(bus_dma_tag_t tag, bus_dma_segment_t *segs,
2417168dfe8Smatt 	    int nsegs);
2427168dfe8Smatt int	_bus_dmamem_map(bus_dma_tag_t tag, bus_dma_segment_t *segs,
2437168dfe8Smatt 	    int nsegs, size_t size, void **kvap, int flags);
2447168dfe8Smatt void	_bus_dmamem_unmap(bus_dma_tag_t tag, void *kva, size_t size);
2457168dfe8Smatt paddr_t	_bus_dmamem_mmap(bus_dma_tag_t tag, bus_dma_segment_t *segs,
2467168dfe8Smatt 	    int nsegs, off_t off, int prot, int flags);
2477168dfe8Smatt #endif /* _MVME68K_BUS_DMA_PRIVATE */
2487168dfe8Smatt 
2497168dfe8Smatt /* Needed by mvmebus.c */
2507168dfe8Smatt int	_bus_dmamem_alloc_common(bus_dma_tag_t,
2517168dfe8Smatt 	    bus_addr_t, bus_addr_t, bus_size_t, bus_size_t, bus_size_t,
2527168dfe8Smatt 	    bus_dma_segment_t *, int, int *, int);
2537168dfe8Smatt 
2547168dfe8Smatt #endif /* _MVME68K_BUS_DMA_H_ */
255