aboutsummaryrefslogtreecommitdiff
path: root/sys/arm/freescale/imx/imx6_sdma.h
blob: 4cd4cebf943522e409aeac94d28eb34a3f1e463b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
/*-
 * Copyright (c) 2015 Ruslan Bukin <br@bsdpad.com>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * $FreeBSD$
 */

#define	SDMAARM_MC0PTR		0x00	/* ARM platform Channel 0 Pointer */
#define	SDMAARM_INTR		0x04	/* Channel Interrupts */
#define	SDMAARM_STOP_STAT	0x08	/* Channel Stop/Channel Status */
#define	SDMAARM_HSTART		0x0C	/* Channel Start */
#define	SDMAARM_EVTOVR		0x10	/* Channel Event Override */
#define	SDMAARM_DSPOVR		0x14	/* Channel BP Override */
#define	SDMAARM_HOSTOVR		0x18	/* Channel ARM platform Override */
#define	SDMAARM_EVTPEND		0x1C	/* Channel Event Pending */
#define	SDMAARM_RESET		0x24	/* Reset Register */
#define	SDMAARM_EVTERR		0x28	/* DMA Request Error Register */
#define	SDMAARM_INTRMASK	0x2C	/* Channel ARM platform Interrupt Mask */
#define	SDMAARM_PSW		0x30	/* Schedule Status */
#define	SDMAARM_EVTERRDBG	0x34	/* DMA Request Error Register */
#define	SDMAARM_CONFIG		0x38	/* Configuration Register */
#define	 CONFIG_CSM		0x3
#define	SDMAARM_SDMA_LOCK	0x3C	/* SDMA LOCK */
#define	SDMAARM_ONCE_ENB	0x40	/* OnCE Enable */
#define	SDMAARM_ONCE_DATA	0x44	/* OnCE Data Register */
#define	SDMAARM_ONCE_INSTR	0x48	/* OnCE Instruction Register */
#define	SDMAARM_ONCE_STAT	0x4C	/* OnCE Status Register */
#define	SDMAARM_ONCE_CMD	0x50	/* OnCE Command Register */
#define	SDMAARM_ILLINSTADDR	0x58	/* Illegal Instruction Trap Address */
#define	SDMAARM_CHN0ADDR	0x5C	/* Channel 0 Boot Address */
#define	SDMAARM_EVT_MIRROR	0x60	/* DMA Requests */
#define	SDMAARM_EVT_MIRROR2	0x64	/* DMA Requests 2 */
#define	SDMAARM_XTRIG_CONF1	0x70	/* Cross-Trigger Events Configuration Register 1 */
#define	SDMAARM_XTRIG_CONF2	0x74	/* Cross-Trigger Events Configuration Register 2 */
#define	SDMAARM_SDMA_CHNPRI(n)	(0x100 + 0x4 * n)	/* Channel Priority Registers */
#define	SDMAARM_CHNENBL(n)	(0x200 + 0x4 * n)	/* Channel Enable RAM */

/* SDMA Event Mappings */
#define	SSI1_RX_1	35
#define	SSI1_TX_1	36
#define	SSI1_RX_0	37
#define	SSI1_TX_0	38
#define	SSI2_RX_1	39
#define	SSI2_TX_1	40
#define	SSI2_RX_0	41
#define	SSI2_TX_0	42
#define	SSI3_RX_1	43
#define	SSI3_TX_1	44
#define	SSI3_RX_0	45
#define	SSI3_TX_0	46

#define	C0_ADDR		0x01
#define	C0_LOAD		0x02
#define	C0_DUMP		0x03
#define	C0_SETCTX	0x07
#define	C0_GETCTX	0x03
#define	C0_SETDM	0x01
#define	C0_SETPM	0x04
#define	C0_GETDM	0x02
#define	C0_GETPM	0x08

#define	BD_DONE		0x01
#define	BD_WRAP		0x02
#define	BD_CONT		0x04
#define	BD_INTR		0x08
#define	BD_RROR		0x10
#define	BD_LAST		0x20
#define	BD_EXTD		0x80

/* sDMA data transfer length */
#define	CMD_4BYTES	0
#define	CMD_3BYTES	3
#define	CMD_2BYTES	2
#define	CMD_1BYTES	1

struct sdma_firmware_header {
	uint32_t	magic;
	uint32_t	version_major;
	uint32_t	version_minor;
	uint32_t	script_addrs_start;
	uint32_t	num_script_addrs;
	uint32_t	ram_code_start;
	uint32_t	ram_code_size;
};

struct sdma_mode_count {
	uint16_t count;
	uint8_t status;
	uint8_t command;
};

struct sdma_buffer_descriptor {
	struct sdma_mode_count	mode;
	uint32_t		buffer_addr;
	uint32_t		ext_buffer_addr;
} __packed;

struct sdma_channel_control {
	uint32_t	current_bd_ptr;
	uint32_t	base_bd_ptr;
	uint32_t	unused[2];
} __packed;

struct sdma_state_registers {
	uint32_t	pc     :14;
	uint32_t	unused1: 1;
	uint32_t	t      : 1;
	uint32_t	rpc    :14;
	uint32_t	unused0: 1;
	uint32_t	sf     : 1;
	uint32_t	spc    :14;
	uint32_t	unused2: 1;
	uint32_t	df     : 1;
	uint32_t	epc    :14;
	uint32_t	lm     : 2;
} __packed;

struct sdma_context_data {
	struct sdma_state_registers	channel_state;
	uint32_t	gReg[8];
	uint32_t	mda;
	uint32_t	msa;
	uint32_t	ms;
	uint32_t	md;
	uint32_t	pda;
	uint32_t	psa;
	uint32_t	ps;
	uint32_t	pd;
	uint32_t	ca;
	uint32_t	cs;
	uint32_t	dda;
	uint32_t	dsa;
	uint32_t	ds;
	uint32_t	dd;
	uint32_t	unused[8];
} __packed;

/* SDMA firmware script pointers */
struct sdma_script_start_addrs {
	int32_t	ap_2_ap_addr;
	int32_t	ap_2_bp_addr;
	int32_t	ap_2_ap_fixed_addr;
	int32_t	bp_2_ap_addr;
	int32_t	loopback_on_dsp_side_addr;
	int32_t	mcu_interrupt_only_addr;
	int32_t	firi_2_per_addr;
	int32_t	firi_2_mcu_addr;
	int32_t	per_2_firi_addr;
	int32_t	mcu_2_firi_addr;
	int32_t	uart_2_per_addr;
	int32_t	uart_2_mcu_addr;
	int32_t	per_2_app_addr;
	int32_t	mcu_2_app_addr;
	int32_t	per_2_per_addr;
	int32_t	uartsh_2_per_addr;
	int32_t	uartsh_2_mcu_addr;
	int32_t	per_2_shp_addr;
	int32_t	mcu_2_shp_addr;
	int32_t	ata_2_mcu_addr;
	int32_t	mcu_2_ata_addr;
	int32_t	app_2_per_addr;
	int32_t	app_2_mcu_addr;
	int32_t	shp_2_per_addr;
	int32_t	shp_2_mcu_addr;
	int32_t	mshc_2_mcu_addr;
	int32_t	mcu_2_mshc_addr;
	int32_t	spdif_2_mcu_addr;
	int32_t	mcu_2_spdif_addr;
	int32_t	asrc_2_mcu_addr;
	int32_t	ext_mem_2_ipu_addr;
	int32_t	descrambler_addr;
	int32_t	dptc_dvfs_addr;
	int32_t	utra_addr;
	int32_t	ram_code_start_addr;
	int32_t	mcu_2_ssish_addr;
	int32_t	ssish_2_mcu_addr;
	int32_t	hdmi_dma_addr;
};

#define	SDMA_N_CHANNELS 32
#define	SDMA_N_EVENTS	48
#define	FW_HEADER_MAGIC	0x414d4453

struct sdma_channel {
	struct sdma_conf		*conf;
	struct sdma_buffer_descriptor	*bd;
	uint8_t 			in_use;
};

struct sdma_softc {
	struct resource			*res[2];
	bus_space_tag_t			bst;
	bus_space_handle_t		bsh;
	device_t			dev;
	void				*ih;
	struct sdma_channel_control	*ccb;
	struct sdma_buffer_descriptor	*bd0;
	struct sdma_context_data	*context;
	struct sdma_channel		channel[SDMA_N_CHANNELS];
	uint32_t			num_bd;
	uint32_t			ccb_phys;
	uint32_t			context_phys;
	const struct sdma_firmware_header	*fw_header;
	const struct sdma_script_start_addrs	*fw_scripts;
};

struct sdma_conf {
	bus_addr_t	saddr;
	bus_addr_t	daddr;
	uint32_t	word_length;
	uint32_t	nbits;
	uint32_t	command;
	uint32_t	num_bd;
	uint32_t	event;
	uint32_t	period;
	uint32_t	(*ih)(void *, int);
	void		*ih_user;
};

int sdma_configure(int, struct sdma_conf *);
int sdma_start(int);
int sdma_stop(int);
int sdma_alloc(void);
int sdma_free(int);