1*2874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
23ad7a42dSMatt Porter /*
33ad7a42dSMatt Porter  *  TI EDMA definitions
43ad7a42dSMatt Porter  *
53ad7a42dSMatt Porter  *  Copyright (C) 2006-2013 Texas Instruments.
63ad7a42dSMatt Porter  */
73ad7a42dSMatt Porter 
83ad7a42dSMatt Porter /*
93ad7a42dSMatt Porter  * This EDMA3 programming framework exposes two basic kinds of resource:
103ad7a42dSMatt Porter  *
113ad7a42dSMatt Porter  *  Channel	Triggers transfers, usually from a hardware event but
123ad7a42dSMatt Porter  *		also manually or by "chaining" from DMA completions.
133ad7a42dSMatt Porter  *		Each channel is coupled to a Parameter RAM (PaRAM) slot.
143ad7a42dSMatt Porter  *
153ad7a42dSMatt Porter  *  Slot	Each PaRAM slot holds a DMA transfer descriptor (PaRAM
163ad7a42dSMatt Porter  *		"set"), source and destination addresses, a link to a
173ad7a42dSMatt Porter  *		next PaRAM slot (if any), options for the transfer, and
183ad7a42dSMatt Porter  *		instructions for updating those addresses.  There are
193ad7a42dSMatt Porter  *		more than twice as many slots as event channels.
203ad7a42dSMatt Porter  *
213ad7a42dSMatt Porter  * Each PaRAM set describes a sequence of transfers, either for one large
223ad7a42dSMatt Porter  * buffer or for several discontiguous smaller buffers.  An EDMA transfer
233ad7a42dSMatt Porter  * is driven only from a channel, which performs the transfers specified
243ad7a42dSMatt Porter  * in its PaRAM slot until there are no more transfers.  When that last
253ad7a42dSMatt Porter  * transfer completes, the "link" field may be used to reload the channel's
263ad7a42dSMatt Porter  * PaRAM slot with a new transfer descriptor.
273ad7a42dSMatt Porter  *
283ad7a42dSMatt Porter  * The EDMA Channel Controller (CC) maps requests from channels into physical
293ad7a42dSMatt Porter  * Transfer Controller (TC) requests when the channel triggers (by hardware
303ad7a42dSMatt Porter  * or software events, or by chaining).  The two physical DMA channels provided
313ad7a42dSMatt Porter  * by the TCs are thus shared by many logical channels.
323ad7a42dSMatt Porter  *
333ad7a42dSMatt Porter  * DaVinci hardware also has a "QDMA" mechanism which is not currently
343ad7a42dSMatt Porter  * supported through this interface.  (DSP firmware uses it though.)
353ad7a42dSMatt Porter  */
363ad7a42dSMatt Porter 
373ad7a42dSMatt Porter #ifndef EDMA_H_
383ad7a42dSMatt Porter #define EDMA_H_
393ad7a42dSMatt Porter 
403ad7a42dSMatt Porter enum dma_event_q {
413ad7a42dSMatt Porter 	EVENTQ_0 = 0,
423ad7a42dSMatt Porter 	EVENTQ_1 = 1,
433ad7a42dSMatt Porter 	EVENTQ_2 = 2,
443ad7a42dSMatt Porter 	EVENTQ_3 = 3,
453ad7a42dSMatt Porter 	EVENTQ_DEFAULT = -1
463ad7a42dSMatt Porter };
473ad7a42dSMatt Porter 
483ad7a42dSMatt Porter #define EDMA_CTLR_CHAN(ctlr, chan)	(((ctlr) << 16) | (chan))
493ad7a42dSMatt Porter #define EDMA_CTLR(i)			((i) >> 16)
503ad7a42dSMatt Porter #define EDMA_CHAN_SLOT(i)		((i) & 0xffff)
513ad7a42dSMatt Porter 
5223e6723cSPeter Ujfalusi #define EDMA_FILTER_PARAM(ctlr, chan)	((int[]) { EDMA_CTLR_CHAN(ctlr, chan) })
5323e6723cSPeter Ujfalusi 
543ad7a42dSMatt Porter struct edma_rsv_info {
553ad7a42dSMatt Porter 
563ad7a42dSMatt Porter 	const s16	(*rsv_chans)[2];
573ad7a42dSMatt Porter 	const s16	(*rsv_slots)[2];
583ad7a42dSMatt Porter };
593ad7a42dSMatt Porter 
6023e6723cSPeter Ujfalusi struct dma_slave_map;
6123e6723cSPeter Ujfalusi 
623ad7a42dSMatt Porter /* platform_data for EDMA driver */
633ad7a42dSMatt Porter struct edma_soc_info {
643ad7a42dSMatt Porter 	/*
653ad7a42dSMatt Porter 	 * Default queue is expected to be a low-priority queue.
663ad7a42dSMatt Porter 	 * This way, long transfers on the default queue started
673ad7a42dSMatt Porter 	 * by the codec engine will not cause audio defects.
683ad7a42dSMatt Porter 	 */
693ad7a42dSMatt Porter 	enum dma_event_q	default_queue;
703ad7a42dSMatt Porter 
713ad7a42dSMatt Porter 	/* Resource reservation for other cores */
723ad7a42dSMatt Porter 	struct edma_rsv_info	*rsv;
733ad7a42dSMatt Porter 
741be5336bSPeter Ujfalusi 	/* List of channels allocated for memcpy, terminated with -1 */
75ecb7deceSPeter Ujfalusi 	s32			*memcpy_channels;
761be5336bSPeter Ujfalusi 
776cba4355SMatt Porter 	s8	(*queue_priority_mapping)[2];
782646a0e5SMatt Porter 	const s16	(*xbar_chans)[2];
7923e6723cSPeter Ujfalusi 
8023e6723cSPeter Ujfalusi 	const struct dma_slave_map *slave_map;
8123e6723cSPeter Ujfalusi 	int slavecnt;
823ad7a42dSMatt Porter };
833ad7a42dSMatt Porter 
843ad7a42dSMatt Porter #endif
85