xref: /freebsd/sys/arm/freescale/vybrid/vf_edma.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
1f3a72e40SRuslan Bukin /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3af3dc4a7SPedro F. Giffuni  *
4f3a72e40SRuslan Bukin  * Copyright (c) 2014 Ruslan Bukin <br@bsdpad.com>
5f3a72e40SRuslan Bukin  * All rights reserved.
6f3a72e40SRuslan Bukin  *
7f3a72e40SRuslan Bukin  * Redistribution and use in source and binary forms, with or without
8f3a72e40SRuslan Bukin  * modification, are permitted provided that the following conditions
9f3a72e40SRuslan Bukin  * are met:
10f3a72e40SRuslan Bukin  * 1. Redistributions of source code must retain the above copyright
11f3a72e40SRuslan Bukin  *    notice, this list of conditions and the following disclaimer.
12f3a72e40SRuslan Bukin  * 2. Redistributions in binary form must reproduce the above copyright
13f3a72e40SRuslan Bukin  *    notice, this list of conditions and the following disclaimer in the
14f3a72e40SRuslan Bukin  *    documentation and/or other materials provided with the distribution.
15f3a72e40SRuslan Bukin  *
16f3a72e40SRuslan Bukin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17f3a72e40SRuslan Bukin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18f3a72e40SRuslan Bukin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19f3a72e40SRuslan Bukin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20f3a72e40SRuslan Bukin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21f3a72e40SRuslan Bukin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22f3a72e40SRuslan Bukin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23f3a72e40SRuslan Bukin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24f3a72e40SRuslan Bukin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25f3a72e40SRuslan Bukin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26f3a72e40SRuslan Bukin  * SUCH DAMAGE.
27f3a72e40SRuslan Bukin  */
28f3a72e40SRuslan Bukin 
29f3a72e40SRuslan Bukin #define	DMA_CR		0x000	/* Control */
30f3a72e40SRuslan Bukin #define	DMA_ES		0x004	/* Error Status */
31f3a72e40SRuslan Bukin #define	DMA_ERQ		0x00C	/* Enable Request */
32f3a72e40SRuslan Bukin #define	DMA_EEI		0x014	/* Enable Error Interrupt */
33f3a72e40SRuslan Bukin #define	DMA_CEEI	0x018	/* Clear Enable Error Interrupt */
34f3a72e40SRuslan Bukin #define	DMA_SEEI	0x019	/* Set Enable Error Interrupt */
35f3a72e40SRuslan Bukin #define	DMA_CERQ	0x01A	/* Clear Enable Request */
36f3a72e40SRuslan Bukin #define	DMA_SERQ	0x01B	/* Set Enable Request */
37f3a72e40SRuslan Bukin #define	DMA_CDNE	0x01C	/* Clear DONE Status Bit */
38f3a72e40SRuslan Bukin #define	DMA_SSRT	0x01D	/* Set START Bit */
39f3a72e40SRuslan Bukin #define	DMA_CERR	0x01E	/* Clear Error */
40f3a72e40SRuslan Bukin #define	 CERR_CAEI	(1 << 6) /* Clear All Error Indicators */
41f3a72e40SRuslan Bukin #define	DMA_CINT	0x01F	/* Clear Interrupt Request */
42f3a72e40SRuslan Bukin #define	 CINT_CAIR	(1 << 6) /* Clear All Interrupt Requests */
43f3a72e40SRuslan Bukin #define	DMA_INT		0x024	/* Interrupt Request */
44f3a72e40SRuslan Bukin #define	DMA_ERR		0x02C	/* Error */
45f3a72e40SRuslan Bukin #define	DMA_HRS		0x034	/* Hardware Request Status */
46f3a72e40SRuslan Bukin #define	DMA_EARS	0x044	/* Enable Asynchronous Request in Stop */
47f3a72e40SRuslan Bukin #define	DMA_DCHPRI3	0x100	/* Channel n Priority */
48f3a72e40SRuslan Bukin #define	DMA_DCHPRI2	0x101	/* Channel n Priority */
49f3a72e40SRuslan Bukin #define	DMA_DCHPRI1	0x102	/* Channel n Priority */
50f3a72e40SRuslan Bukin #define	DMA_DCHPRI0	0x103	/* Channel n Priority */
51f3a72e40SRuslan Bukin #define	DMA_DCHPRI7	0x104	/* Channel n Priority */
52f3a72e40SRuslan Bukin #define	DMA_DCHPRI6	0x105	/* Channel n Priority */
53f3a72e40SRuslan Bukin #define	DMA_DCHPRI5	0x106	/* Channel n Priority */
54f3a72e40SRuslan Bukin #define	DMA_DCHPRI4	0x107	/* Channel n Priority */
55f3a72e40SRuslan Bukin #define	DMA_DCHPRI11	0x108	/* Channel n Priority */
56f3a72e40SRuslan Bukin #define	DMA_DCHPRI10	0x109	/* Channel n Priority */
57f3a72e40SRuslan Bukin #define	DMA_DCHPRI9	0x10A	/* Channel n Priority */
58f3a72e40SRuslan Bukin #define	DMA_DCHPRI8	0x10B	/* Channel n Priority */
59f3a72e40SRuslan Bukin #define	DMA_DCHPRI15	0x10C	/* Channel n Priority */
60f3a72e40SRuslan Bukin #define	DMA_DCHPRI14	0x10D	/* Channel n Priority */
61f3a72e40SRuslan Bukin #define	DMA_DCHPRI13	0x10E	/* Channel n Priority */
62f3a72e40SRuslan Bukin #define	DMA_DCHPRI12	0x10F	/* Channel n Priority */
63f3a72e40SRuslan Bukin #define	DMA_DCHPRI19	0x110	/* Channel n Priority */
64f3a72e40SRuslan Bukin #define	DMA_DCHPRI18	0x111	/* Channel n Priority */
65f3a72e40SRuslan Bukin #define	DMA_DCHPRI17	0x112	/* Channel n Priority */
66f3a72e40SRuslan Bukin #define	DMA_DCHPRI16	0x113	/* Channel n Priority */
67f3a72e40SRuslan Bukin #define	DMA_DCHPRI23	0x114	/* Channel n Priority */
68f3a72e40SRuslan Bukin #define	DMA_DCHPRI22	0x115	/* Channel n Priority */
69f3a72e40SRuslan Bukin #define	DMA_DCHPRI21	0x116	/* Channel n Priority */
70f3a72e40SRuslan Bukin #define	DMA_DCHPRI20	0x117	/* Channel n Priority */
71f3a72e40SRuslan Bukin #define	DMA_DCHPRI27	0x118	/* Channel n Priority */
72f3a72e40SRuslan Bukin #define	DMA_DCHPRI26	0x119	/* Channel n Priority */
73f3a72e40SRuslan Bukin #define	DMA_DCHPRI25	0x11A	/* Channel n Priority */
74f3a72e40SRuslan Bukin #define	DMA_DCHPRI24	0x11B	/* Channel n Priority */
75f3a72e40SRuslan Bukin #define	DMA_DCHPRI31	0x11C	/* Channel n Priority */
76f3a72e40SRuslan Bukin #define	DMA_DCHPRI30	0x11D	/* Channel n Priority */
77f3a72e40SRuslan Bukin #define	DMA_DCHPRI29	0x11E	/* Channel n Priority */
78f3a72e40SRuslan Bukin #define	DMA_DCHPRI28	0x11F	/* Channel n Priority */
79f3a72e40SRuslan Bukin 
80f3a72e40SRuslan Bukin #define	DMA_TCDn_SADDR(n)		(0x00 + 0x20 * n)	/* Source Address */
81f3a72e40SRuslan Bukin #define	DMA_TCDn_SOFF(n)		(0x04 + 0x20 * n)	/* Signed Source Address Offset */
82f3a72e40SRuslan Bukin #define	DMA_TCDn_ATTR(n)		(0x06 + 0x20 * n)	/* Transfer Attributes */
83f3a72e40SRuslan Bukin #define	DMA_TCDn_NBYTES_MLNO(n)		(0x08 + 0x20 * n)	/* Minor Byte Count */
84f3a72e40SRuslan Bukin #define	DMA_TCDn_NBYTES_MLOFFNO(n)	(0x08 + 0x20 * n)	/* Signed Minor Loop Offset */
85f3a72e40SRuslan Bukin #define	DMA_TCDn_NBYTES_MLOFFYES(n)	(0x08 + 0x20 * n)	/* Signed Minor Loop Offset */
86f3a72e40SRuslan Bukin #define	DMA_TCDn_SLAST(n)		(0x0C + 0x20 * n)	/* Last Source Address Adjustment */
87f3a72e40SRuslan Bukin #define	DMA_TCDn_DADDR(n)		(0x10 + 0x20 * n)	/* Destination Address */
88f3a72e40SRuslan Bukin #define	DMA_TCDn_DOFF(n)		(0x14 + 0x20 * n)	/* Signed Destination Address Offset */
89f3a72e40SRuslan Bukin #define	DMA_TCDn_CITER_ELINKYES(n)	(0x16 + 0x20 * n)	/* Current Minor Loop Link, Major Loop Count */
90f3a72e40SRuslan Bukin #define	DMA_TCDn_CITER_ELINKNO(n)	(0x16 + 0x20 * n)
91f3a72e40SRuslan Bukin #define	DMA_TCDn_DLASTSGA(n)		(0x18 + 0x20 * n)	/* Last Dst Addr Adjustment/Scatter Gather Address */
92f3a72e40SRuslan Bukin #define	DMA_TCDn_CSR(n)			(0x1C + 0x20 * n)	/* Control and Status */
93f3a72e40SRuslan Bukin #define	DMA_TCDn_BITER_ELINKYES(n)	(0x1E + 0x20 * n)	/* Beginning Minor Loop Link, Major Loop Count */
94f3a72e40SRuslan Bukin #define	DMA_TCDn_BITER_ELINKNO(n)	(0x1E + 0x20 * n)	/* Beginning Minor Loop Link, Major Loop Count */
95f3a72e40SRuslan Bukin 
96f3a72e40SRuslan Bukin #define TCD_CSR_START			(1 << 0)
97f3a72e40SRuslan Bukin #define	TCD_CSR_INTMAJOR		(1 << 1)
98f3a72e40SRuslan Bukin #define	TCD_CSR_INTHALF			(1 << 2)
99f3a72e40SRuslan Bukin #define	TCD_CSR_DREQ			(1 << 3)
100f3a72e40SRuslan Bukin #define	TCD_CSR_ESG			(1 << 4)
101f3a72e40SRuslan Bukin #define	TCD_CSR_MAJORELINK		(1 << 5)
102f3a72e40SRuslan Bukin #define	TCD_CSR_ACTIVE			(1 << 6)
103f3a72e40SRuslan Bukin #define	TCD_CSR_DONE			(1 << 7)
104f3a72e40SRuslan Bukin #define	TCD_CSR_MAJORELINKCH_SHIFT	8
105f3a72e40SRuslan Bukin 
106f3a72e40SRuslan Bukin #define	TCD_ATTR_SMOD_SHIFT		11	/* Source Address Modulo */
107f3a72e40SRuslan Bukin #define	TCD_ATTR_SSIZE_SHIFT		8	/* Source Data Transfer Size */
108f3a72e40SRuslan Bukin #define	TCD_ATTR_DMOD_SHIFT		3	/* Dst Address Modulo */
109f3a72e40SRuslan Bukin #define	TCD_ATTR_DSIZE_SHIFT		0	/* Dst Data Transfer Size */
110f3a72e40SRuslan Bukin 
111f3a72e40SRuslan Bukin #define	TCD_READ4(_sc, _reg)		\
112f3a72e40SRuslan Bukin 	bus_space_read_4(_sc->bst_tcd, _sc->bsh_tcd, _reg)
113f3a72e40SRuslan Bukin #define	TCD_WRITE4(_sc, _reg, _val)	\
114f3a72e40SRuslan Bukin 	bus_space_write_4(_sc->bst_tcd, _sc->bsh_tcd, _reg, _val)
115f3a72e40SRuslan Bukin #define	TCD_READ2(_sc, _reg)		\
116f3a72e40SRuslan Bukin 	bus_space_read_2(_sc->bst_tcd, _sc->bsh_tcd, _reg)
117f3a72e40SRuslan Bukin #define	TCD_WRITE2(_sc, _reg, _val)	\
118f3a72e40SRuslan Bukin 	bus_space_write_2(_sc->bst_tcd, _sc->bsh_tcd, _reg, _val)
119f3a72e40SRuslan Bukin #define	TCD_READ1(_sc, _reg)		\
120f3a72e40SRuslan Bukin 	bus_space_read_1(_sc->bst_tcd, _sc->bsh_tcd, _reg)
121f3a72e40SRuslan Bukin #define	TCD_WRITE1(_sc, _reg, _val)	\
122f3a72e40SRuslan Bukin 	bus_space_write_1(_sc->bst_tcd, _sc->bsh_tcd, _reg, _val)
123f3a72e40SRuslan Bukin 
124f3a72e40SRuslan Bukin #define	EDMA_NUM_DEVICES	2
125f3a72e40SRuslan Bukin #define	EDMA_NUM_CHANNELS	32
126f3a72e40SRuslan Bukin #define	NCHAN_PER_MUX		16
127f3a72e40SRuslan Bukin 
128f3a72e40SRuslan Bukin struct tcd_conf {
129f3a72e40SRuslan Bukin 	bus_addr_t	saddr;
130f3a72e40SRuslan Bukin 	bus_addr_t	daddr;
131f3a72e40SRuslan Bukin 	uint32_t	nbytes;
132f3a72e40SRuslan Bukin 	uint32_t	nmajor;
133f3a72e40SRuslan Bukin 	uint32_t	majorelink;
134f3a72e40SRuslan Bukin 	uint32_t	majorelinkch;
135f3a72e40SRuslan Bukin 	uint32_t	esg;
136f3a72e40SRuslan Bukin 	uint32_t	smod;
137f3a72e40SRuslan Bukin 	uint32_t	dmod;
138f3a72e40SRuslan Bukin 	uint32_t	soff;
139f3a72e40SRuslan Bukin 	uint32_t	doff;
140f3a72e40SRuslan Bukin 	uint32_t	ssize;
141f3a72e40SRuslan Bukin 	uint32_t	dsize;
142f3a72e40SRuslan Bukin 	uint32_t	slast;
143f3a72e40SRuslan Bukin 	uint32_t	dlast_sga;
144f3a72e40SRuslan Bukin 	uint32_t	channel;
145f3a72e40SRuslan Bukin 	uint32_t	(*ih)(void *, int);
146f3a72e40SRuslan Bukin 	void		*ih_user;
147f3a72e40SRuslan Bukin };
148f3a72e40SRuslan Bukin 
149f3a72e40SRuslan Bukin /*
150f3a72e40SRuslan Bukin  * TCD struct is described at
151f3a72e40SRuslan Bukin  * Vybrid Reference Manual, Rev. 5, 07/2013
152f3a72e40SRuslan Bukin  *
153f3a72e40SRuslan Bukin  * Should be used for Scatter/Gathering feature.
154f3a72e40SRuslan Bukin  */
155f3a72e40SRuslan Bukin 
156f3a72e40SRuslan Bukin struct TCD {
157f3a72e40SRuslan Bukin 	uint32_t	saddr;
158f3a72e40SRuslan Bukin 	uint16_t	attr;
159f3a72e40SRuslan Bukin 	uint16_t	soff;
160f3a72e40SRuslan Bukin 	uint32_t	nbytes;
161f3a72e40SRuslan Bukin 	uint32_t	slast;
162f3a72e40SRuslan Bukin 	uint32_t	daddr;
163f3a72e40SRuslan Bukin 	uint16_t	citer;
164f3a72e40SRuslan Bukin 	uint16_t	doff;
165f3a72e40SRuslan Bukin 	uint32_t	dlast_sga;
166f3a72e40SRuslan Bukin 	uint16_t	biter;
167f3a72e40SRuslan Bukin 	uint16_t	csr;
168f3a72e40SRuslan Bukin } __packed;
169f3a72e40SRuslan Bukin 
170f3a72e40SRuslan Bukin struct edma_softc {
171f3a72e40SRuslan Bukin 	device_t		dev;
172f3a72e40SRuslan Bukin 	struct resource		*res[4];
173f3a72e40SRuslan Bukin 	bus_space_tag_t		bst;
174f3a72e40SRuslan Bukin 	bus_space_handle_t	bsh;
175f3a72e40SRuslan Bukin 	bus_space_tag_t		bst_tcd;
176f3a72e40SRuslan Bukin 	bus_space_handle_t	bsh_tcd;
177f3a72e40SRuslan Bukin 	void			*tc_ih;
178f3a72e40SRuslan Bukin 	void			*err_ih;
179f3a72e40SRuslan Bukin 	uint32_t		device_id;
180f3a72e40SRuslan Bukin 
181f3a72e40SRuslan Bukin 	int	(*channel_configure) (struct edma_softc *, int, int);
182f3a72e40SRuslan Bukin 	int	(*channel_free) (struct edma_softc *, int);
183f3a72e40SRuslan Bukin 	int	(*dma_request) (struct edma_softc *, int);
184f3a72e40SRuslan Bukin 	int	(*dma_setup) (struct edma_softc *, struct tcd_conf *);
185f3a72e40SRuslan Bukin 	int	(*dma_stop) (struct edma_softc *, int);
186f3a72e40SRuslan Bukin };
187