summaryrefslogtreecommitdiff
path: root/sound/pci/lx6464es/lx_defs.h
blob: eca5367ba561c74c49c6226fc6bfe68f866d829a (plain)
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
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* -*- linux-c -*- *
 *
 * ALSA driver for the digigram lx6464es interface
 * adapted upstream headers
 *
 * Copyright (c) 2009 Tim Blechmann <tim@klingt.org>
 */

#ifndef LX_DEFS_H
#define LX_DEFS_H

/* code adapted from ethersound.h */
#define	XES_FREQ_COUNT8_MASK    0x00001FFF /* compteur 25MHz entre 8 ech. */
#define	XES_FREQ_COUNT8_44_MIN  0x00001288 /* 25M /
					    * [ 44k - ( 44.1k + 48k ) / 2 ]
					    * * 8 */
#define	XES_FREQ_COUNT8_44_MAX	0x000010F0 /* 25M / [ ( 44.1k + 48k ) / 2 ]
					    * * 8 */
#define	XES_FREQ_COUNT8_48_MAX	0x00000F08 /* 25M /
					    * [ 48k + ( 44.1k + 48k ) / 2 ]
					    * * 8 */

/* code adapted from LXES_registers.h */

#define IOCR_OUTPUTS_OFFSET 0	/* (rw) offset for the number of OUTs in the
				 * ConfES register. */
#define IOCR_INPUTS_OFFSET  8	/* (rw) offset for the number of INs in the
				 * ConfES register. */
#define FREQ_RATIO_OFFSET  19	/* (rw) offset for frequency ratio in the
				 * ConfES register. */
#define	FREQ_RATIO_SINGLE_MODE 0x01 /* value for single mode frequency ratio:
				     * sample rate = frequency rate. */

#define CONFES_READ_PART_MASK	0x00070000
#define CONFES_WRITE_PART_MASK	0x00F80000

/* code adapted from if_drv_mb.h */

#define MASK_SYS_STATUS_ERROR	(1L << 31) /* events that lead to a PCI irq if
					    * not yet pending */
#define MASK_SYS_STATUS_URUN	(1L << 30)
#define MASK_SYS_STATUS_ORUN	(1L << 29)
#define MASK_SYS_STATUS_EOBO	(1L << 28)
#define MASK_SYS_STATUS_EOBI	(1L << 27)
#define MASK_SYS_STATUS_FREQ	(1L << 26)
#define MASK_SYS_STATUS_ESA	(1L << 25) /* reserved, this is set by the
					    * XES */
#define MASK_SYS_STATUS_TIMER	(1L << 24)

#define MASK_SYS_ASYNC_EVENTS	(MASK_SYS_STATUS_ERROR |		\
				 MASK_SYS_STATUS_URUN  |		\
				 MASK_SYS_STATUS_ORUN  |		\
				 MASK_SYS_STATUS_EOBO  |		\
				 MASK_SYS_STATUS_EOBI  |		\
				 MASK_SYS_STATUS_FREQ  |		\
				 MASK_SYS_STATUS_ESA)

#define MASK_SYS_PCI_EVENTS		(MASK_SYS_ASYNC_EVENTS |	\
					 MASK_SYS_STATUS_TIMER)

#define MASK_SYS_TIMER_COUNT	0x0000FFFF

#define MASK_SYS_STATUS_EOT_PLX		(1L << 22) /* event that remains
						    * internal: reserved fo end
						    * of plx dma */
#define MASK_SYS_STATUS_XES		(1L << 21) /* event that remains
						    * internal: pending XES
						    * IRQ */
#define MASK_SYS_STATUS_CMD_DONE	(1L << 20) /* alternate command
						    * management: notify driver
						    * instead of polling */


#define MAX_STREAM_BUFFER 5	/* max amount of stream buffers. */

#define MICROBLAZE_IBL_MIN		 32
#define MICROBLAZE_IBL_DEFAULT	        128
#define MICROBLAZE_IBL_MAX		512
/* #define MASK_GRANULARITY		(2*MICROBLAZE_IBL_MAX-1) */



/* command opcodes, see reference for details */

/*
 the capture bit position in the object_id field in driver commands
 depends upon the number of managed channels. For now, 64 IN + 64 OUT are
 supported. HOwever, the communication protocol forsees 1024 channels, hence
 bit 10 indicates a capture (input) object).
*/
#define ID_IS_CAPTURE (1L << 10)
#define ID_OFFSET	13	/* object ID is at the 13th bit in the
				 * 1st command word.*/
#define ID_CH_MASK    0x3F
#define OPCODE_OFFSET	24	/* offset of the command opcode in the first
				 * command word.*/

enum cmd_mb_opcodes {
	CMD_00_INFO_DEBUG	        = 0x00,
	CMD_01_GET_SYS_CFG		= 0x01,
	CMD_02_SET_GRANULARITY		= 0x02,
	CMD_03_SET_TIMER_IRQ		= 0x03,
	CMD_04_GET_EVENT		= 0x04,
	CMD_05_GET_PIPES		= 0x05,

	CMD_06_ALLOCATE_PIPE            = 0x06,
	CMD_07_RELEASE_PIPE		= 0x07,
	CMD_08_ASK_BUFFERS		= 0x08,
	CMD_09_STOP_PIPE		= 0x09,
	CMD_0A_GET_PIPE_SPL_COUNT	= 0x0a,
	CMD_0B_TOGGLE_PIPE_STATE	= 0x0b,

	CMD_0C_DEF_STREAM		= 0x0c,
	CMD_0D_SET_MUTE			= 0x0d,
	CMD_0E_GET_STREAM_SPL_COUNT     = 0x0e,
	CMD_0F_UPDATE_BUFFER		= 0x0f,
	CMD_10_GET_BUFFER		= 0x10,
	CMD_11_CANCEL_BUFFER		= 0x11,
	CMD_12_GET_PEAK			= 0x12,
	CMD_13_SET_STREAM_STATE		= 0x13,
	CMD_14_INVALID			= 0x14,
};

/* pipe states */
enum pipe_state_t {
	PSTATE_IDLE	= 0,	/* the pipe is not processed in the XES_IRQ
				 * (free or stopped, or paused). */
	PSTATE_RUN	= 1,	/* sustained play/record state. */
	PSTATE_PURGE	= 2,	/* the ES channels are now off, render pipes do
				 * not DMA, record pipe do a last DMA. */
	PSTATE_ACQUIRE	= 3,	/* the ES channels are now on, render pipes do
				 * not yet increase their sample count, record
				 * pipes do not DMA. */
	PSTATE_CLOSING	= 4,	/* the pipe is releasing, and may not yet
				 * receive an "alloc" command. */
};

/* stream states */
enum stream_state_t {
	SSTATE_STOP	=  0x00,       /* setting to stop resets the stream spl
					* count.*/
	SSTATE_RUN	= (0x01 << 0), /* start DMA and spl count handling. */
	SSTATE_PAUSE	= (0x01 << 1), /* pause DMA and spl count handling. */
};

/* buffer flags */
enum buffer_flags {
	BF_VALID	= 0x80,	/* set if the buffer is valid, clear if free.*/
	BF_CURRENT	= 0x40,	/* set if this is the current buffer (there is
				 * always a current buffer).*/
	BF_NOTIFY_EOB	= 0x20,	/* set if this buffer must cause a PCI event
				 * when finished.*/
	BF_CIRCULAR	= 0x10,	/* set if buffer[1] must be copied to buffer[0]
				 * by the end of this buffer.*/
	BF_64BITS_ADR	= 0x08,	/* set if the hi part of the address is valid.*/
	BF_xx		= 0x04,	/* future extension.*/
	BF_EOB		= 0x02,	/* set if finished, but not yet free.*/
	BF_PAUSE	= 0x01,	/* pause stream at buffer end.*/
	BF_ZERO		= 0x00,	/* no flags (init).*/
};

/*
*	Stream Flags definitions
*/
enum stream_flags {
	SF_ZERO		= 0x00000000, /* no flags (stream invalid). */
	SF_VALID	= 0x10000000, /* the stream has a valid DMA_conf
				       * info (setstreamformat). */
	SF_XRUN		= 0x20000000, /* the stream is un x-run state. */
	SF_START	= 0x40000000, /* the DMA is running.*/
	SF_ASIO		= 0x80000000, /* ASIO.*/
};


#define MASK_SPL_COUNT_HI 0x00FFFFFF /* 4 MSBits are status bits */
#define PSTATE_OFFSET             28 /* 4 MSBits are status bits */


#define MASK_STREAM_HAS_MAPPING	(1L << 12)
#define MASK_STREAM_IS_ASIO	(1L <<  9)
#define STREAM_FMT_OFFSET	10   /* the stream fmt bits start at the 10th
				      * bit in the command word. */

#define STREAM_FMT_16b          0x02
#define STREAM_FMT_intel        0x01

#define FREQ_FIELD_OFFSET	15  /* offset of the freq field in the response
				     * word */

#define BUFF_FLAGS_OFFSET	  24 /*  offset of the buffer flags in the
				      *  response word. */
#define MASK_DATA_SIZE	  0x00FFFFFF /* this must match the field size of
				      * datasize in the buffer_t structure. */

#define MASK_BUFFER_ID	        0xFF /* the cancel command awaits a buffer ID,
				      * may be 0xFF for "current". */


/* code adapted from PcxErr_e.h */

/* Bits masks */

#define ERROR_MASK              0x8000

#define SOURCE_MASK             0x7800

#define E_SOURCE_BOARD          0x4000 /* 8 >> 1 */
#define E_SOURCE_DRV            0x2000 /* 4 >> 1 */
#define E_SOURCE_API            0x1000 /* 2 >> 1 */
/* Error tools */
#define E_SOURCE_TOOLS          0x0800 /* 1 >> 1 */
/* Error pcxaudio */
#define E_SOURCE_AUDIO          0x1800 /* 3 >> 1 */
/* Error virtual pcx */
#define E_SOURCE_VPCX           0x2800 /* 5 >> 1 */
/* Error dispatcher */
#define E_SOURCE_DISPATCHER     0x3000 /* 6 >> 1 */
/* Error from CobraNet firmware */
#define E_SOURCE_COBRANET       0x3800 /* 7 >> 1 */

#define E_SOURCE_USER           0x7800

#define CLASS_MASK              0x0700

#define CODE_MASK               0x00FF

/* Bits values */

/* Values for the error/warning bit */
#define ERROR_VALUE             0x8000
#define WARNING_VALUE           0x0000

/* Class values */
#define E_CLASS_GENERAL                  0x0000
#define E_CLASS_INVALID_CMD              0x0100
#define E_CLASS_INVALID_STD_OBJECT       0x0200
#define E_CLASS_RSRC_IMPOSSIBLE          0x0300
#define E_CLASS_WRONG_CONTEXT            0x0400
#define E_CLASS_BAD_SPECIFIC_PARAMETER   0x0500
#define E_CLASS_REAL_TIME_ERROR          0x0600
#define E_CLASS_DIRECTSHOW               0x0700
#define E_CLASS_FREE                     0x0700


/* Complete DRV error code for the general class */
#define ED_GN           (ERROR_VALUE | E_SOURCE_DRV | E_CLASS_GENERAL)
#define ED_CONCURRENCY                  (ED_GN | 0x01)
#define ED_DSP_CRASHED                  (ED_GN | 0x02)
#define ED_UNKNOWN_BOARD                (ED_GN | 0x03)
#define ED_NOT_INSTALLED                (ED_GN | 0x04)
#define ED_CANNOT_OPEN_SVC_MANAGER      (ED_GN | 0x05)
#define ED_CANNOT_READ_REGISTRY         (ED_GN | 0x06)
#define ED_DSP_VERSION_MISMATCH         (ED_GN | 0x07)
#define ED_UNAVAILABLE_FEATURE          (ED_GN | 0x08)
#define ED_CANCELLED                    (ED_GN | 0x09)
#define ED_NO_RESPONSE_AT_IRQA          (ED_GN | 0x10)
#define ED_INVALID_ADDRESS              (ED_GN | 0x11)
#define ED_DSP_CORRUPTED                (ED_GN | 0x12)
#define ED_PENDING_OPERATION            (ED_GN | 0x13)
#define ED_NET_ALLOCATE_MEMORY_IMPOSSIBLE   (ED_GN | 0x14)
#define ED_NET_REGISTER_ERROR               (ED_GN | 0x15)
#define ED_NET_THREAD_ERROR                 (ED_GN | 0x16)
#define ED_NET_OPEN_ERROR                   (ED_GN | 0x17)
#define ED_NET_CLOSE_ERROR                  (ED_GN | 0x18)
#define ED_NET_NO_MORE_PACKET               (ED_GN | 0x19)
#define ED_NET_NO_MORE_BUFFER               (ED_GN | 0x1A)
#define ED_NET_SEND_ERROR                   (ED_GN | 0x1B)
#define ED_NET_RECEIVE_ERROR                (ED_GN | 0x1C)
#define ED_NET_WRONG_MSG_SIZE               (ED_GN | 0x1D)
#define ED_NET_WAIT_ERROR                   (ED_GN | 0x1E)
#define ED_NET_EEPROM_ERROR                 (ED_GN | 0x1F)
#define ED_INVALID_RS232_COM_NUMBER         (ED_GN | 0x20)
#define ED_INVALID_RS232_INIT               (ED_GN | 0x21)
#define ED_FILE_ERROR                       (ED_GN | 0x22)
#define ED_INVALID_GPIO_CMD                 (ED_GN | 0x23)
#define ED_RS232_ALREADY_OPENED             (ED_GN | 0x24)
#define ED_RS232_NOT_OPENED                 (ED_GN | 0x25)
#define ED_GPIO_ALREADY_OPENED              (ED_GN | 0x26)
#define ED_GPIO_NOT_OPENED                  (ED_GN | 0x27)
#define ED_REGISTRY_ERROR                   (ED_GN | 0x28) /* <- NCX */
#define ED_INVALID_SERVICE                  (ED_GN | 0x29) /* <- NCX */

#define ED_READ_FILE_ALREADY_OPENED	    (ED_GN | 0x2a) /* <- Decalage
							    * pour RCX
							    * (old 0x28)
							    * */
#define ED_READ_FILE_INVALID_COMMAND	    (ED_GN | 0x2b) /* ~ */
#define ED_READ_FILE_INVALID_PARAMETER	    (ED_GN | 0x2c) /* ~ */
#define ED_READ_FILE_ALREADY_CLOSED	    (ED_GN | 0x2d) /* ~ */
#define ED_READ_FILE_NO_INFORMATION	    (ED_GN | 0x2e) /* ~ */
#define ED_READ_FILE_INVALID_HANDLE	    (ED_GN | 0x2f) /* ~ */
#define ED_READ_FILE_END_OF_FILE	    (ED_GN | 0x30) /* ~ */
#define ED_READ_FILE_ERROR	            (ED_GN | 0x31) /* ~ */

#define ED_DSP_CRASHED_EXC_DSPSTACK_OVERFLOW (ED_GN | 0x32) /* <- Decalage pour
							     * PCX (old 0x14) */
#define ED_DSP_CRASHED_EXC_SYSSTACK_OVERFLOW (ED_GN | 0x33) /* ~ */
#define ED_DSP_CRASHED_EXC_ILLEGAL           (ED_GN | 0x34) /* ~ */
#define ED_DSP_CRASHED_EXC_TIMER_REENTRY     (ED_GN | 0x35) /* ~ */
#define ED_DSP_CRASHED_EXC_FATAL_ERROR       (ED_GN | 0x36) /* ~ */

#define ED_FLASH_PCCARD_NOT_PRESENT          (ED_GN | 0x37)

#define ED_NO_CURRENT_CLOCK                  (ED_GN | 0x38)

/* Complete DRV error code for real time class */
#define ED_RT           (ERROR_VALUE | E_SOURCE_DRV | E_CLASS_REAL_TIME_ERROR)
#define ED_DSP_TIMED_OUT                (ED_RT | 0x01)
#define ED_DSP_CHK_TIMED_OUT            (ED_RT | 0x02)
#define ED_STREAM_OVERRUN               (ED_RT | 0x03)
#define ED_DSP_BUSY                     (ED_RT | 0x04)
#define ED_DSP_SEMAPHORE_TIME_OUT       (ED_RT | 0x05)
#define ED_BOARD_TIME_OUT               (ED_RT | 0x06)
#define ED_XILINX_ERROR                 (ED_RT | 0x07)
#define ED_COBRANET_ITF_NOT_RESPONDING  (ED_RT | 0x08)

/* Complete BOARD error code for the invaid standard object class */
#define EB_ISO          (ERROR_VALUE | E_SOURCE_BOARD | \
			 E_CLASS_INVALID_STD_OBJECT)
#define EB_INVALID_EFFECT               (EB_ISO | 0x00)
#define EB_INVALID_PIPE                 (EB_ISO | 0x40)
#define EB_INVALID_STREAM               (EB_ISO | 0x80)
#define EB_INVALID_AUDIO                (EB_ISO | 0xC0)

/* Complete BOARD error code for impossible resource allocation class */
#define EB_RI           (ERROR_VALUE | E_SOURCE_BOARD | E_CLASS_RSRC_IMPOSSIBLE)
#define EB_ALLOCATE_ALL_STREAM_TRANSFERT_BUFFERS_IMPOSSIBLE (EB_RI | 0x01)
#define EB_ALLOCATE_PIPE_SAMPLE_BUFFER_IMPOSSIBLE           (EB_RI | 0x02)

#define EB_ALLOCATE_MEM_STREAM_IMPOSSIBLE		\
	EB_ALLOCATE_ALL_STREAM_TRANSFERT_BUFFERS_IMPOSSIBLE
#define EB_ALLOCATE_MEM_PIPE_IMPOSSIBLE			\
	EB_ALLOCATE_PIPE_SAMPLE_BUFFER_IMPOSSIBLE

#define EB_ALLOCATE_DIFFERED_CMD_IMPOSSIBLE     (EB_RI | 0x03)
#define EB_TOO_MANY_DIFFERED_CMD                (EB_RI | 0x04)
#define EB_RBUFFERS_TABLE_OVERFLOW              (EB_RI | 0x05)
#define EB_ALLOCATE_EFFECTS_IMPOSSIBLE          (EB_RI | 0x08)
#define EB_ALLOCATE_EFFECT_POS_IMPOSSIBLE       (EB_RI | 0x09)
#define EB_RBUFFER_NOT_AVAILABLE                (EB_RI | 0x0A)
#define EB_ALLOCATE_CONTEXT_LIII_IMPOSSIBLE     (EB_RI | 0x0B)
#define EB_STATUS_DIALOG_IMPOSSIBLE             (EB_RI | 0x1D)
#define EB_CONTROL_CMD_IMPOSSIBLE               (EB_RI | 0x1E)
#define EB_STATUS_SEND_IMPOSSIBLE               (EB_RI | 0x1F)
#define EB_ALLOCATE_PIPE_IMPOSSIBLE             (EB_RI | 0x40)
#define EB_ALLOCATE_STREAM_IMPOSSIBLE           (EB_RI | 0x80)
#define EB_ALLOCATE_AUDIO_IMPOSSIBLE            (EB_RI | 0xC0)

/* Complete BOARD error code for wrong call context class */
#define EB_WCC          (ERROR_VALUE | E_SOURCE_BOARD | E_CLASS_WRONG_CONTEXT)
#define EB_CMD_REFUSED                  (EB_WCC | 0x00)
#define EB_START_STREAM_REFUSED         (EB_WCC | 0xFC)
#define EB_SPC_REFUSED                  (EB_WCC | 0xFD)
#define EB_CSN_REFUSED                  (EB_WCC | 0xFE)
#define EB_CSE_REFUSED                  (EB_WCC | 0xFF)




#endif /* LX_DEFS_H */