xref: /freebsd/sys/arm/freescale/imx/imx6_sdma.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
1f0583578SRuslan Bukin /*-
2f0583578SRuslan Bukin  * Copyright (c) 2015 Ruslan Bukin <br@bsdpad.com>
3f0583578SRuslan Bukin  * All rights reserved.
4f0583578SRuslan Bukin  *
5f0583578SRuslan Bukin  * Redistribution and use in source and binary forms, with or without
6f0583578SRuslan Bukin  * modification, are permitted provided that the following conditions
7f0583578SRuslan Bukin  * are met:
8f0583578SRuslan Bukin  * 1. Redistributions of source code must retain the above copyright
9f0583578SRuslan Bukin  *    notice, this list of conditions and the following disclaimer.
10f0583578SRuslan Bukin  * 2. Redistributions in binary form must reproduce the above copyright
11f0583578SRuslan Bukin  *    notice, this list of conditions and the following disclaimer in the
12f0583578SRuslan Bukin  *    documentation and/or other materials provided with the distribution.
13f0583578SRuslan Bukin  *
14f0583578SRuslan Bukin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15f0583578SRuslan Bukin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16f0583578SRuslan Bukin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17f0583578SRuslan Bukin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18f0583578SRuslan Bukin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19f0583578SRuslan Bukin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20f0583578SRuslan Bukin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21f0583578SRuslan Bukin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22f0583578SRuslan Bukin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23f0583578SRuslan Bukin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24f0583578SRuslan Bukin  * SUCH DAMAGE.
25f0583578SRuslan Bukin  */
26f0583578SRuslan Bukin 
27f0583578SRuslan Bukin #define	SDMAARM_MC0PTR		0x00	/* ARM platform Channel 0 Pointer */
28f0583578SRuslan Bukin #define	SDMAARM_INTR		0x04	/* Channel Interrupts */
29f0583578SRuslan Bukin #define	SDMAARM_STOP_STAT	0x08	/* Channel Stop/Channel Status */
30f0583578SRuslan Bukin #define	SDMAARM_HSTART		0x0C	/* Channel Start */
31f0583578SRuslan Bukin #define	SDMAARM_EVTOVR		0x10	/* Channel Event Override */
32f0583578SRuslan Bukin #define	SDMAARM_DSPOVR		0x14	/* Channel BP Override */
33f0583578SRuslan Bukin #define	SDMAARM_HOSTOVR		0x18	/* Channel ARM platform Override */
34f0583578SRuslan Bukin #define	SDMAARM_EVTPEND		0x1C	/* Channel Event Pending */
35f0583578SRuslan Bukin #define	SDMAARM_RESET		0x24	/* Reset Register */
36f0583578SRuslan Bukin #define	SDMAARM_EVTERR		0x28	/* DMA Request Error Register */
37f0583578SRuslan Bukin #define	SDMAARM_INTRMASK	0x2C	/* Channel ARM platform Interrupt Mask */
38f0583578SRuslan Bukin #define	SDMAARM_PSW		0x30	/* Schedule Status */
39f0583578SRuslan Bukin #define	SDMAARM_EVTERRDBG	0x34	/* DMA Request Error Register */
40f0583578SRuslan Bukin #define	SDMAARM_CONFIG		0x38	/* Configuration Register */
41f0583578SRuslan Bukin #define	 CONFIG_CSM		0x3
42f0583578SRuslan Bukin #define	SDMAARM_SDMA_LOCK	0x3C	/* SDMA LOCK */
43f0583578SRuslan Bukin #define	SDMAARM_ONCE_ENB	0x40	/* OnCE Enable */
44f0583578SRuslan Bukin #define	SDMAARM_ONCE_DATA	0x44	/* OnCE Data Register */
45f0583578SRuslan Bukin #define	SDMAARM_ONCE_INSTR	0x48	/* OnCE Instruction Register */
46f0583578SRuslan Bukin #define	SDMAARM_ONCE_STAT	0x4C	/* OnCE Status Register */
47f0583578SRuslan Bukin #define	SDMAARM_ONCE_CMD	0x50	/* OnCE Command Register */
48f0583578SRuslan Bukin #define	SDMAARM_ILLINSTADDR	0x58	/* Illegal Instruction Trap Address */
49f0583578SRuslan Bukin #define	SDMAARM_CHN0ADDR	0x5C	/* Channel 0 Boot Address */
50f0583578SRuslan Bukin #define	SDMAARM_EVT_MIRROR	0x60	/* DMA Requests */
51f0583578SRuslan Bukin #define	SDMAARM_EVT_MIRROR2	0x64	/* DMA Requests 2 */
52f0583578SRuslan Bukin #define	SDMAARM_XTRIG_CONF1	0x70	/* Cross-Trigger Events Configuration Register 1 */
53f0583578SRuslan Bukin #define	SDMAARM_XTRIG_CONF2	0x74	/* Cross-Trigger Events Configuration Register 2 */
54f0583578SRuslan Bukin #define	SDMAARM_SDMA_CHNPRI(n)	(0x100 + 0x4 * n)	/* Channel Priority Registers */
55f0583578SRuslan Bukin #define	SDMAARM_CHNENBL(n)	(0x200 + 0x4 * n)	/* Channel Enable RAM */
56f0583578SRuslan Bukin 
57f0583578SRuslan Bukin /* SDMA Event Mappings */
58f0583578SRuslan Bukin #define	SSI1_RX_1	35
59f0583578SRuslan Bukin #define	SSI1_TX_1	36
60f0583578SRuslan Bukin #define	SSI1_RX_0	37
61f0583578SRuslan Bukin #define	SSI1_TX_0	38
62f0583578SRuslan Bukin #define	SSI2_RX_1	39
63f0583578SRuslan Bukin #define	SSI2_TX_1	40
64f0583578SRuslan Bukin #define	SSI2_RX_0	41
65f0583578SRuslan Bukin #define	SSI2_TX_0	42
66f0583578SRuslan Bukin #define	SSI3_RX_1	43
67f0583578SRuslan Bukin #define	SSI3_TX_1	44
68f0583578SRuslan Bukin #define	SSI3_RX_0	45
69f0583578SRuslan Bukin #define	SSI3_TX_0	46
70f0583578SRuslan Bukin 
71f0583578SRuslan Bukin #define	C0_ADDR		0x01
72f0583578SRuslan Bukin #define	C0_LOAD		0x02
73f0583578SRuslan Bukin #define	C0_DUMP		0x03
74f0583578SRuslan Bukin #define	C0_SETCTX	0x07
75f0583578SRuslan Bukin #define	C0_GETCTX	0x03
76f0583578SRuslan Bukin #define	C0_SETDM	0x01
77f0583578SRuslan Bukin #define	C0_SETPM	0x04
78f0583578SRuslan Bukin #define	C0_GETDM	0x02
79f0583578SRuslan Bukin #define	C0_GETPM	0x08
80f0583578SRuslan Bukin 
81f0583578SRuslan Bukin #define	BD_DONE		0x01
82f0583578SRuslan Bukin #define	BD_WRAP		0x02
83f0583578SRuslan Bukin #define	BD_CONT		0x04
84f0583578SRuslan Bukin #define	BD_INTR		0x08
85f0583578SRuslan Bukin #define	BD_RROR		0x10
86f0583578SRuslan Bukin #define	BD_LAST		0x20
87f0583578SRuslan Bukin #define	BD_EXTD		0x80
88f0583578SRuslan Bukin 
89f0583578SRuslan Bukin /* sDMA data transfer length */
90f0583578SRuslan Bukin #define	CMD_4BYTES	0
91f0583578SRuslan Bukin #define	CMD_3BYTES	3
92f0583578SRuslan Bukin #define	CMD_2BYTES	2
93f0583578SRuslan Bukin #define	CMD_1BYTES	1
94f0583578SRuslan Bukin 
95f0583578SRuslan Bukin struct sdma_firmware_header {
96f0583578SRuslan Bukin 	uint32_t	magic;
97f0583578SRuslan Bukin 	uint32_t	version_major;
98f0583578SRuslan Bukin 	uint32_t	version_minor;
99f0583578SRuslan Bukin 	uint32_t	script_addrs_start;
100f0583578SRuslan Bukin 	uint32_t	num_script_addrs;
101f0583578SRuslan Bukin 	uint32_t	ram_code_start;
102f0583578SRuslan Bukin 	uint32_t	ram_code_size;
103f0583578SRuslan Bukin };
104f0583578SRuslan Bukin 
105f0583578SRuslan Bukin struct sdma_mode_count {
106f0583578SRuslan Bukin 	uint16_t count;
107f0583578SRuslan Bukin 	uint8_t status;
108f0583578SRuslan Bukin 	uint8_t command;
109f0583578SRuslan Bukin };
110f0583578SRuslan Bukin 
111f0583578SRuslan Bukin struct sdma_buffer_descriptor {
112f0583578SRuslan Bukin 	struct sdma_mode_count	mode;
113f0583578SRuslan Bukin 	uint32_t		buffer_addr;
114f0583578SRuslan Bukin 	uint32_t		ext_buffer_addr;
115f0583578SRuslan Bukin } __packed;
116f0583578SRuslan Bukin 
117f0583578SRuslan Bukin struct sdma_channel_control {
118f0583578SRuslan Bukin 	uint32_t	current_bd_ptr;
119f0583578SRuslan Bukin 	uint32_t	base_bd_ptr;
120f0583578SRuslan Bukin 	uint32_t	unused[2];
121f0583578SRuslan Bukin } __packed;
122f0583578SRuslan Bukin 
123f0583578SRuslan Bukin struct sdma_state_registers {
124f0583578SRuslan Bukin 	uint32_t	pc     :14;
125f0583578SRuslan Bukin 	uint32_t	unused1: 1;
126f0583578SRuslan Bukin 	uint32_t	t      : 1;
127f0583578SRuslan Bukin 	uint32_t	rpc    :14;
128f0583578SRuslan Bukin 	uint32_t	unused0: 1;
129f0583578SRuslan Bukin 	uint32_t	sf     : 1;
130f0583578SRuslan Bukin 	uint32_t	spc    :14;
131f0583578SRuslan Bukin 	uint32_t	unused2: 1;
132f0583578SRuslan Bukin 	uint32_t	df     : 1;
133f0583578SRuslan Bukin 	uint32_t	epc    :14;
134f0583578SRuslan Bukin 	uint32_t	lm     : 2;
135f0583578SRuslan Bukin } __packed;
136f0583578SRuslan Bukin 
137f0583578SRuslan Bukin struct sdma_context_data {
138f0583578SRuslan Bukin 	struct sdma_state_registers	channel_state;
139f0583578SRuslan Bukin 	uint32_t	gReg[8];
140f0583578SRuslan Bukin 	uint32_t	mda;
141f0583578SRuslan Bukin 	uint32_t	msa;
142f0583578SRuslan Bukin 	uint32_t	ms;
143f0583578SRuslan Bukin 	uint32_t	md;
144f0583578SRuslan Bukin 	uint32_t	pda;
145f0583578SRuslan Bukin 	uint32_t	psa;
146f0583578SRuslan Bukin 	uint32_t	ps;
147f0583578SRuslan Bukin 	uint32_t	pd;
148f0583578SRuslan Bukin 	uint32_t	ca;
149f0583578SRuslan Bukin 	uint32_t	cs;
150f0583578SRuslan Bukin 	uint32_t	dda;
151f0583578SRuslan Bukin 	uint32_t	dsa;
152f0583578SRuslan Bukin 	uint32_t	ds;
153f0583578SRuslan Bukin 	uint32_t	dd;
154f0583578SRuslan Bukin 	uint32_t	unused[8];
155f0583578SRuslan Bukin } __packed;
156f0583578SRuslan Bukin 
157f0583578SRuslan Bukin /* SDMA firmware script pointers */
158f0583578SRuslan Bukin struct sdma_script_start_addrs {
159f0583578SRuslan Bukin 	int32_t	ap_2_ap_addr;
160f0583578SRuslan Bukin 	int32_t	ap_2_bp_addr;
161f0583578SRuslan Bukin 	int32_t	ap_2_ap_fixed_addr;
162f0583578SRuslan Bukin 	int32_t	bp_2_ap_addr;
163f0583578SRuslan Bukin 	int32_t	loopback_on_dsp_side_addr;
164f0583578SRuslan Bukin 	int32_t	mcu_interrupt_only_addr;
165f0583578SRuslan Bukin 	int32_t	firi_2_per_addr;
166f0583578SRuslan Bukin 	int32_t	firi_2_mcu_addr;
167f0583578SRuslan Bukin 	int32_t	per_2_firi_addr;
168f0583578SRuslan Bukin 	int32_t	mcu_2_firi_addr;
169f0583578SRuslan Bukin 	int32_t	uart_2_per_addr;
170f0583578SRuslan Bukin 	int32_t	uart_2_mcu_addr;
171f0583578SRuslan Bukin 	int32_t	per_2_app_addr;
172f0583578SRuslan Bukin 	int32_t	mcu_2_app_addr;
173f0583578SRuslan Bukin 	int32_t	per_2_per_addr;
174f0583578SRuslan Bukin 	int32_t	uartsh_2_per_addr;
175f0583578SRuslan Bukin 	int32_t	uartsh_2_mcu_addr;
176f0583578SRuslan Bukin 	int32_t	per_2_shp_addr;
177f0583578SRuslan Bukin 	int32_t	mcu_2_shp_addr;
178f0583578SRuslan Bukin 	int32_t	ata_2_mcu_addr;
179f0583578SRuslan Bukin 	int32_t	mcu_2_ata_addr;
180f0583578SRuslan Bukin 	int32_t	app_2_per_addr;
181f0583578SRuslan Bukin 	int32_t	app_2_mcu_addr;
182f0583578SRuslan Bukin 	int32_t	shp_2_per_addr;
183f0583578SRuslan Bukin 	int32_t	shp_2_mcu_addr;
184f0583578SRuslan Bukin 	int32_t	mshc_2_mcu_addr;
185f0583578SRuslan Bukin 	int32_t	mcu_2_mshc_addr;
186f0583578SRuslan Bukin 	int32_t	spdif_2_mcu_addr;
187f0583578SRuslan Bukin 	int32_t	mcu_2_spdif_addr;
188f0583578SRuslan Bukin 	int32_t	asrc_2_mcu_addr;
189f0583578SRuslan Bukin 	int32_t	ext_mem_2_ipu_addr;
190f0583578SRuslan Bukin 	int32_t	descrambler_addr;
191f0583578SRuslan Bukin 	int32_t	dptc_dvfs_addr;
192f0583578SRuslan Bukin 	int32_t	utra_addr;
193f0583578SRuslan Bukin 	int32_t	ram_code_start_addr;
194f0583578SRuslan Bukin 	int32_t	mcu_2_ssish_addr;
195f0583578SRuslan Bukin 	int32_t	ssish_2_mcu_addr;
196f0583578SRuslan Bukin 	int32_t	hdmi_dma_addr;
197f0583578SRuslan Bukin };
198f0583578SRuslan Bukin 
199f0583578SRuslan Bukin #define	SDMA_N_CHANNELS 32
200f0583578SRuslan Bukin #define	SDMA_N_EVENTS	48
201f0583578SRuslan Bukin #define	FW_HEADER_MAGIC	0x414d4453
202f0583578SRuslan Bukin 
203f0583578SRuslan Bukin struct sdma_channel {
204f0583578SRuslan Bukin 	struct sdma_conf		*conf;
205f0583578SRuslan Bukin 	struct sdma_buffer_descriptor	*bd;
206f0583578SRuslan Bukin 	uint8_t 			in_use;
207f0583578SRuslan Bukin };
208f0583578SRuslan Bukin 
209f0583578SRuslan Bukin struct sdma_softc {
210f0583578SRuslan Bukin 	struct resource			*res[2];
211f0583578SRuslan Bukin 	bus_space_tag_t			bst;
212f0583578SRuslan Bukin 	bus_space_handle_t		bsh;
213f0583578SRuslan Bukin 	device_t			dev;
214f0583578SRuslan Bukin 	void				*ih;
215f0583578SRuslan Bukin 	struct sdma_channel_control	*ccb;
216f0583578SRuslan Bukin 	struct sdma_buffer_descriptor	*bd0;
217f0583578SRuslan Bukin 	struct sdma_context_data	*context;
218f0583578SRuslan Bukin 	struct sdma_channel		channel[SDMA_N_CHANNELS];
219f0583578SRuslan Bukin 	uint32_t			num_bd;
220f0583578SRuslan Bukin 	uint32_t			ccb_phys;
221f0583578SRuslan Bukin 	uint32_t			context_phys;
222*8ad55e04SOleksandr Tymoshenko 	const struct sdma_firmware_header	*fw_header;
223*8ad55e04SOleksandr Tymoshenko 	const struct sdma_script_start_addrs	*fw_scripts;
224f0583578SRuslan Bukin };
225f0583578SRuslan Bukin 
226f0583578SRuslan Bukin struct sdma_conf {
227f0583578SRuslan Bukin 	bus_addr_t	saddr;
228f0583578SRuslan Bukin 	bus_addr_t	daddr;
229f0583578SRuslan Bukin 	uint32_t	word_length;
230f0583578SRuslan Bukin 	uint32_t	nbits;
231f0583578SRuslan Bukin 	uint32_t	command;
232f0583578SRuslan Bukin 	uint32_t	num_bd;
233f0583578SRuslan Bukin 	uint32_t	event;
234f0583578SRuslan Bukin 	uint32_t	period;
235f0583578SRuslan Bukin 	uint32_t	(*ih)(void *, int);
236f0583578SRuslan Bukin 	void		*ih_user;
237f0583578SRuslan Bukin };
238f0583578SRuslan Bukin 
239f0583578SRuslan Bukin int sdma_configure(int, struct sdma_conf *);
240f0583578SRuslan Bukin int sdma_start(int);
241f0583578SRuslan Bukin int sdma_stop(int);
242f0583578SRuslan Bukin int sdma_alloc(void);
243f0583578SRuslan Bukin int sdma_free(int);
244