audiohd.h revision 11349:ec23a6889b4d
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25#ifndef _SYS_AUDIOHD_IMPL_H_
26#define	_SYS_AUDIOHD_IMPL_H_
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
32/*
33 * vendor IDs of PCI audio controllers
34 */
35#define	AUDIOHD_VID_ATI		0x1002
36#define	AUDIOHD_VID_CIRRUS	0x1013
37#define	AUDIOHD_VID_NVIDIA	0x10de
38#define	AUDIOHD_VID_REALTEK	0x10ec
39#define	AUDIOHD_VID_IDT		0x111d
40#define	AUDIOHD_VID_ANALOG	0x11d4
41#define	AUDIOHD_VID_CONEXANT	0x14f1
42#define	AUDIOHD_VID_SIGMATEL	0x8384
43#define	AUDIOHD_VID_INTEL	0x8086
44
45/*
46 * specific audiohd controller device id
47 */
48#define	AUDIOHD_CONTROLLER_MCP51	0x10de026c
49
50/*
51 * codec special initial flags
52 */
53#define	NO_GPIO		0x00000001
54#define	NO_MIXER	0x00000002
55#define	NO_SPDIF	0x00000004
56
57#define	AUDIOHD_INTS		50
58#define	AUDIOHD_MAX_INTS	1500
59#define	AUDIOHD_MIN_INTS	32
60
61#define	AUDIOHD_DEV_CONFIG	"onboard1"
62#define	AUDIOHD_DEV_VERSION	"a"
63
64#define	AUDIOHD_FMT_PCM		0x001
65/*
66 * Only for Intel hardware:
67 * PCI Express traffic class select register in PCI configure space
68 */
69#define	AUDIOHD_INTEL_PCI_TCSEL 0x44
70
71/*
72 * Only for ATI SB450:
73 * MISC control register 2
74 */
75#define	AUDIOHD_ATI_PCI_MISC2	0x42
76#define	AUDIOHD_ATI_MISC2_SNOOP	0x02
77#define	AUDIOHDC_NID(x)		x
78#define	AUDIOHDC_NULL_NODE	-1
79#define	AUDIOHD_NULL_CONN	((uint_t)(-1))
80/*
81 * currently, only the format of 48K sample rate, 16-bit
82 * 2-channel is supported.
83 */
84#define	AUDIOHD_FMT_PCMOUT	0x0011
85#define	AUDIOHD_FMT_PCMIN	0x0011
86
87#define	AUDIOHD_EXT_AMP_MASK	0x00010000
88#define	AUDIOHD_EXT_AMP_ENABLE	0x02
89/* NVIDIA snoop */
90#define	AUDIOHD_NVIDIA_SNOOP	0x0f
91
92/* Power On/Off */
93#define	AUDIOHD_PW_OFF		1
94#define	AUDIOHD_PW_ON		0
95#define	AUDIOHD_PW_D0		0
96#define	AUDIOHD_PW_D2		2
97
98#define	AUDIOHD_INTEL_TCS_MASK	0xf8
99#define	AUDIOHD_ATI_MISC2_MASK	0xf8
100
101/* Pin speaker On/Off */
102#define	AUDIOHD_SP_ON		1
103#define	AUDIOHD_SP_OFF		0
104
105#define	AUDIOHD_PORT_MAX	15
106#define	AUDIOHD_CODEC_MAX	16
107#define	AUDIOHD_MEMIO_LEN	0x4000
108
109#define	AUDIOHD_RETRY_TIMES	60
110#define	AUDIOHD_TEST_TIMES	500
111#define	AUDIOHD_OUTSTR_NUM_OFF	12
112#define	AUDIOHD_INSTR_NUM_OFF	8
113
114#define	AUDIOHD_CORB_SIZE_OFF	0x4e
115
116#define	AUDIOHD_URCAP_MASK	0x80
117#define	AUDIOHD_DTCCAP_MASK	0x4
118#define	AUDIOHD_UR_ENABLE_OFF	8
119#define	AUDIOHD_UR_TAG_MASK	0x1f
120
121#define	AUDIOHD_CIS_MASK	0x40000000
122
123#define	AUDIOHD_RIRB_UR_MASK	0x10
124#define	AUDIOHD_RIRB_CODEC_MASK	0xf
125#define	AUDIOHD_RIRB_WID_OFF	27
126#define	AUDIOHD_RIRB_INTRCNT	0x0
127#define	AUDIOHD_RIRB_WPMASK	0xff
128
129#define	AUDIOHD_FORM_MASK	0x0080
130#define	AUDIOHD_LEN_MASK	0x007f
131#define	AUDIOHD_PIN_CAP_MASK	0x00000010
132#define	AUDIOHD_PIN_CONF_MASK	0xc0000000
133#define	AUDIOHD_PIN_CON_MASK	3
134#define	AUDIOHD_PIN_CON_STEP	30
135#define	AUDIOHD_PIN_IO_MASK	0X0018
136#define	AUDIOHD_PIN_SEQ_MASK	0x0000000f
137#define	AUDIOHD_PIN_ASO_MASK	0x000000f0
138#define	AUDIOHD_PIN_ASO_OFF	0x4
139#define	AUDIOHD_PIN_DEV_MASK	0x00f00000
140#define	AUDIOHD_PIN_DEV_OFF	20
141#define	AUDIOHD_PIN_NUMS	6
142#define	AUDIOHD_PIN_NO_CONN	0x40000000
143#define	AUDIOHD_PIN_IN_ENABLE	0x20
144#define	AUDIOHD_PIN_OUT_ENABLE	0x40
145#define	AUDIOHD_PIN_PRES_OFF	0x20
146#define	AUDIOHD_PIN_CONTP_OFF	0x1e
147#define	AUDIOHD_PIN_CON_JACK	0
148#define	AUDIOHD_PIN_CON_FIXED	0x2
149#define	AUDIOHD_PIN_CONTP_MASK	0x3
150#define	AUDIOHD_PIN_VREF_L1	0x20
151#define	AUDIOHD_PIN_VREF_L2	0x10
152#define	AUDIOHD_PIN_VREF_L3	0x04
153#define	AUDIOHD_PIN_VREF_L4	0x02
154#define	AUDIOHD_PIN_VREF_OFF	8
155#define	AUDIOHD_PIN_VREF_MASK	0xff
156#define	AUDIOHD_PIN_CLR_MASK	0xf
157#define	AUDIOHD_PIN_CLR_OFF	12
158
159
160#define	AUDIOHD_VERB_ADDR_OFF	28
161#define	AUDIOHD_VERB_NID_OFF	20
162#define	AUDIOHD_VERB_CMD_OFF	8
163#define	AUDIOHD_VERB_CMD16_OFF	16
164
165#define	AUDIOHD_RING_MAX_SIZE	0x00ff
166#define	AUDIOHD_REC_TAG_OFF	4
167#define	AUDIOHD_PLAY_TAG_OFF	4
168#define	AUDIOHD_PLAY_CTL_OFF	2
169#define	AUDIOHD_REC_CTL_OFF	2
170
171#define	AUDIOHD_SPDIF_ON	1
172#define	AUDIOHD_SPDIF_MASK	0x00ff
173
174#define	AUDIOHD_GAIN_OFF	8
175
176#define	AUDIOHD_CODEC_STR_OFF	16
177#define	AUDIOHD_CODEC_STR_MASK	0x000000ff
178#define	AUDIOHD_CODEC_NUM_MASK	0x000000ff
179#define	AUDIOHD_CODEC_TYPE_MASK	0x000000ff
180
181#define	AUDIOHD_ROUNDUP(x, algn)	(((x) + ((algn) - 1)) & ~((algn) - 1))
182#define	AUDIOHD_FRAGFR_ALIGN	64
183#define	AUDIOHD_BDLE_BUF_ALIGN	128
184#define	AUDIOHD_CMDIO_ENT_MASK	0x00ff	/* 256 entries for CORB/RIRB */
185#define	AUDIOHD_CDBIO_CORB_LEN	1024	/* 256 entries for CORB, 1024B */
186#define	AUDIOHD_CDBIO_RIRB_LEN	2048	/* 256 entries for RIRB, 2048B */
187#define	AUDIOHD_BDLE_NUMS	4	/* 4 entires for record/play BD list */
188
189#define	AUDIOHD_PORT_UNMUTE	(0xffffffff)
190
191/*
192 * Audio registers of high definition
193 */
194#define	AUDIOHD_REG_GCAP		0x00
195#define	AUDIOHDR_GCAP_OUTSTREAMS	0xf000
196#define	AUDIOHDR_GCAP_INSTREAMS		0x0f00
197#define	AUDIOHDR_GCAP_BSTREAMS		0x00f8
198#define	AUDIOHDR_GCAP_NSDO		0x0006
199#define	AUDIOHDR_GCAP_64OK		0x0001
200
201#define	AUDIOHD_REG_VMIN		0x02
202#define	AUDIOHD_REG_VMAJ		0x03
203#define	AUDIOHD_REG_OUTPAY		0x04
204#define	AUDIOHD_REG_INPAY		0x06
205#define	AUDIOHD_REG_GCTL		0x08
206#define	AUDIOHD_REG_WAKEEN		0x0C
207#define	AUDIOHD_REG_STATESTS		0x0E
208#define	AUDIOHD_STATESTS_BIT_SDINS	0x7F
209
210#define	AUDIOHD_REG_GSTS		0x10
211#define	AUDIOHD_REG_INTCTL		0x20
212#define	AUDIOHD_INTCTL_BIT_GIE		0x80000000
213#define	AUDIOHD_INTCTL_BIT_CIE		0x40000000
214#define	AUDIOHD_INTCTL_BIT_SIE		0x3FFFFFFF
215
216
217#define	AUDIOHD_REG_INTSTS		0x24
218#define	AUDIOHD_INTSTS_BIT_GIS		0x80000000
219#define	AUDIOHD_INTSTS_BIT_CIS		0x40000000
220#define	AUDIOHD_INTSTS_BIT_SINTS	(0x3fffffff)
221
222#define	AUDIOHD_REG_WALCLK		0x30
223#define	AUDIOHD_REG_SYNC		0x38
224
225#define	AUDIOHD_REG_CORBLBASE		0x40
226#define	AUDIOHD_REG_CORBUBASE		0x44
227#define	AUDIOHD_REG_CORBWP		0x48
228#define	AUDIOHD_REG_CORBRP		0x4A
229#define	AUDIOHD_REG_CORBCTL		0x4C
230#define	AUDIOHD_REG_CORBST		0x4D
231#define	AUDIOHD_REG_CORBSIZE		0x4E
232
233#define	AUDIOHD_REG_RIRBLBASE		0x50
234#define	AUDIOHD_REG_RIRBUBASE		0x54
235#define	AUDIOHD_REG_RIRBWP		0x58
236#define	AUDIOHD_REG_RINTCNT		0x5A
237#define	AUDIOHD_REG_RIRBCTL		0x5C
238#define	AUDIOHD_REG_RIRBSTS		0x5D
239#define	AUDIOHD_REG_RIRBSIZE		0x5E
240
241#define	AUDIOHD_REG_IC			0x60
242#define	AUDIOHD_REG_IR			0x64
243#define	AUDIOHD_REG_IRS			0x68
244#define	AUDIOHD_REG_DPLBASE		0x70
245#define	AUDIOHD_REG_DPUBASE		0x74
246
247#define	AUDIOHD_REG_SD_BASE		0x80
248#define	AUDIOHD_REG_SD_LEN		0x20
249
250/*
251 * Offset of Stream Descriptor Registers
252 */
253#define	AUDIOHD_SDREG_OFFSET_CTL		0x00
254#define	AUDIOHD_SDREG_OFFSET_STS		0x03
255#define	AUDIOHD_SDREG_OFFSET_LPIB		0x04
256#define	AUDIOHD_SDREG_OFFSET_CBL		0x08
257#define	AUDIOHD_SDREG_OFFSET_LVI		0x0c
258#define	AUDIOHD_SDREG_OFFSET_FIFOW		0x0e
259#define	AUDIOHD_SDREG_OFFSET_FIFOSIZE		0x10
260#define	AUDIOHD_SDREG_OFFSET_FORMAT		0x12
261#define	AUDIOHD_SDREG_OFFSET_BDLPL		0x18
262#define	AUDIOHD_SDREG_OFFSET_BDLPU		0x1c
263
264/* bits for stream descriptor control reg */
265#define	AUDIOHDR_SD_CTL_DEIE		0x000010
266#define	AUDIOHDR_SD_CTL_FEIE		0x000008
267#define	AUDIOHDR_SD_CTL_IOCE		0x000004
268#define	AUDIOHDR_SD_CTL_SRUN		0x000002
269#define	AUDIOHDR_SD_CTL_SRST		0x000001
270#define	AUDIOHDR_SD_CTL_INTS	\
271	(AUDIOHDR_SD_CTL_DEIE |	\
272	AUDIOHDR_SD_CTL_FEIE |	\
273	AUDIOHDR_SD_CTL_IOCE)
274
275
276/* bits for stream descriptor status register */
277#define	AUDIOHDR_SD_STS_BCIS		0x0004
278#define	AUDIOHDR_SD_STS_FIFOE		0x0008
279#define	AUDIOHDR_SD_STS_DESE		0x0010
280#define	AUDIOHDR_SD_STS_FIFORY		0x0020
281#define	AUDIOHDR_SD_STS_INTRS	\
282	(AUDIOHDR_SD_STS_BCIS | \
283	AUDIOHDR_SD_STS_FIFOE |	\
284	AUDIOHDR_SD_STS_DESE)
285
286
287/* bits for GCTL register */
288#define	AUDIOHDR_GCTL_CRST		0x00000001
289#define	AUDIOHDR_GCTL_URESPE		0x00000100
290
291/* bits for CORBRP register */
292#define	AUDIOHDR_CORBRP_RESET		0x8000
293#define	AUDIOHDR_CORBRP_WPTR		0x00ff
294
295/* bits for CORBCTL register */
296#define	AUDIOHDR_CORBCTL_CMEIE		0x01
297#define	AUDIOHDR_CORBCTL_DMARUN		0x02
298
299/* bits for CORB SIZE register */
300#define	AUDIOHDR_CORBSZ_8		0
301#define	AUDIOHDR_CORBSZ_16		1
302#define	AUDIOHDR_CORBSZ_256		2
303
304/* bits for RIRBCTL register */
305#define	AUDIOHDR_RIRBCTL_RINTCTL	0x01
306#define	AUDIOHDR_RIRBCTL_DMARUN		0x02
307#define	AUDIOHDR_RIRBCTL_RIRBOIC	0x04
308#define	AUDIOHDR_RIRBCTL_RSTINT		0xfe
309
310/* bits for RIRBWP register */
311#define	AUDIOHDR_RIRBWP_RESET		0x8000
312#define	AUDIOHDR_RIRBWP_WPTR		0x00ff
313
314/* bits for RIRB SIZE register */
315#define	AUDIOHDR_RIRBSZ_8		0
316#define	AUDIOHDR_RIRBSZ_16		1
317#define	AUDIOHDR_RIRBSZ_256		2
318
319#define	AUDIOHD_BDLE_RIRB_SDI		0x0000000f
320#define	AUDIOHD_BDLE_RIRB_UNSOLICIT	0x00000010
321
322/* HD spec: ID of Root node is 0 */
323#define	AUDIOHDC_NODE_ROOT		0x00
324
325/* HD spec: ID of audio function group is "1" */
326#define	AUDIOHDC_AUDIO_FUNC_GROUP	1
327
328/*
329 * HD audio verbs can be either 12-bit or 4-bit in length.
330 */
331#define	AUDIOHDC_12BIT_VERB_MASK	0xfffff000
332#define	AUDIOHDC_4BIT_VERB_MASK		0xfffffff0
333
334#define	AUDIOHDC_SAMPR48000		48000
335#define	AUDIOHDC_MAX_BEEP_GEN		12000
336#define	AUDIOHDC_MIX_BEEP_GEN		47
337#define	AUDIOHDC_MUTE_BEEP_GEN		0x0
338
339/*
340 * 12-bit verbs
341 */
342#define	AUDIOHDC_VERB_GET_PARAM			0xf00
343
344#define	AUDIOHDC_VERB_GET_CONN_SEL		0xf01
345#define	AUDIOHDC_VERB_SET_CONN_SEL		0x701
346
347#define	AUDIOHDC_VERB_GET_CONN_LIST_ENT		0xf02
348#define	AUDIOHDC_VERB_GET_PROCESS_STATE		0xf03
349#define	AUDIOHDC_VERB_GET_SDI_SEL		0xf04
350
351#define	AUDIOHDC_VERB_GET_POWER_STATE		0xf05
352#define	AUDIOHDC_VERB_SET_POWER_STATE		0x705
353
354#define	AUDIOHDC_VERB_GET_STREAM_CHANN		0xf06
355#define	AUDIOHDC_VERB_SET_STREAM_CHANN		0x706
356
357#define	AUDIOHDC_VERB_GET_PIN_CTRL		0xf07
358#define	AUDIOHDC_VERB_SET_PIN_CTRL		0x707
359
360#define	AUDIOHDC_VERB_GET_UNS_ENABLE		0xf08
361
362#define	AUDIOHDC_VERB_GET_PIN_SENSE		0xf09
363#define	AUDIOHDC_VERB_EXEC_PIN_SENSE		0x709
364
365#define	AUDIOHDC_VERB_GET_BEEP_GEN		0xf0a
366#define	AUDIOHDC_VERB_SET_BEEP_GEN		0x70a
367
368#define	AUDIOHDC_VERB_GET_EAPD			0xf0c
369#define	AUDIOHDC_VERB_SET_EAPD			0x70c
370
371#define	AUDIOHDC_VERB_GET_DEFAULT_CONF		0xf1c
372#define	AUDIOHDC_VERB_GET_SPDIF_CTL		0xf0d
373#define	AUDIOHDC_VERB_SET_SPDIF_LCL		0x70d
374
375#define	AUDIOHDC_VERB_SET_URCTRL		0x708
376#define	AUDIOHDC_VERB_GET_PIN_SENSE		0xf09
377
378#define	AUDIOHDC_VERB_GET_GPIO_MASK		0xf16
379#define	AUDIOHDC_VERB_SET_GPIO_MASK		0x716
380
381#define	AUDIOHDC_VERB_GET_GPIO_DIREC		0xf17
382#define	AUDIOHDC_VERB_SET_GPIO_DIREC		0x717
383
384#define	AUDIOHDC_VERB_GET_GPIO_DATA		0xf15
385#define	AUDIOHDC_VERB_SET_GPIO_DATA		0x715
386
387#define	AUDIOHDC_VERB_GET_GPIO_STCK		0xf1a
388#define	AUDIOHDC_VERB_SET_GPIO_STCK		0x71a
389
390#define	AUDIOHDC_GPIO_ENABLE			0xff
391#define	AUDIOHDC_GPIO_DIRECT			0xf1
392
393#define	AUDIOHDC_GPIO_DATA_CTRL			0xff
394#define	AUDIOHDC_GPIO_STCK_CTRL			0xff
395/*
396 * 4-bit verbs
397 */
398#define	AUDIOHDC_VERB_GET_CONV_FMT		0xa
399#define	AUDIOHDC_VERB_SET_CONV_FMT		0x2
400
401#define	AUDIOHDC_VERB_GET_AMP_MUTE		0xb
402#define	AUDIOHDC_VERB_SET_AMP_MUTE		0x3
403#define	AUDIOHDC_VERB_SET_BEEP_VOL		0x3A0
404
405/*
406 * parameters of nodes
407 */
408#define	AUDIOHDC_PAR_VENDOR_ID			0x00
409#define	AUDIOHDC_PAR_SUBSYS_ID			0x01
410#define	AUDIOHDC_PAR_REV_ID			0x02
411#define	AUDIOHDC_PAR_NODE_COUNT			0x04
412#define	AUDIOHDC_PAR_FUNCTION_TYPE		0x05
413#define	AUDIOHDC_PAR_AUDIO_FG_CAP		0x08
414#define	AUDIOHDC_PAR_AUDIO_WID_CAP		0x09
415#define	AUDIOHDC_PAR_PCM			0x0a
416#define	AUDIOHDC_PAR_STREAM			0x0b
417#define	AUDIOHDC_PAR_PIN_CAP			0x0c
418#define	AUDIOHDC_PAR_INAMP_CAP			0x0d
419#define	AUDIOHDC_PAR_CONNLIST_LEN		0x0e
420#define	AUDIOHDC_PAR_POWER_STATE		0x0f
421#define	AUDIOHDC_PAR_PROC_CAP			0x10
422#define	AUDIOHDC_PAR_GPIO_CAP			0x11
423#define	AUDIOHDC_PAR_OUTAMP_CAP			0x12
424
425/*
426 * bits for get/set amplifier gain/mute
427 */
428#define	AUDIOHDC_AMP_SET_OUTPUT			0x8000
429#define	AUDIOHDC_AMP_SET_INPUT			0x4000
430#define	AUDIOHDC_AMP_SET_LEFT			0x2000
431#define	AUDIOHDC_AMP_SET_RIGHT			0x1000
432#define	AUDIOHDC_AMP_SET_MUTE			0x0080
433#define	AUDIOHDC_AMP_SET_LNR			0x3000
434#define	AUDIOHDC_AMP_SET_LR_INPUT		0x7000
435#define	AUDIOHDC_AMP_SET_LR_OUTPUT		0xb000
436#define	AUDIOHDC_AMP_SET_INDEX_OFFSET		8
437#define	AUDIOHDC_AMP_SET_GAIN_MASK		0x007f
438#define	AUDIOHDC_GAIN_MAX			0x7f
439#define	AUDIOHDC_GAIN_BITS			7
440#define	AUDIOHDC_GAIN_DEFAULT			0x0f
441
442#define	AUDIOHDC_AMP_GET_OUTPUT			0x8000
443#define	AUDIOHDC_AMP_GET_INPUT			0x0000
444
445/* value used to set max volume for left output */
446#define	AUDIOHDC_AMP_LOUT_MAX	\
447	(AUDIOHDC_AMP_SET_OUTPUT | \
448	AUDIOHDC_AMP_SET_LEFT | \
449	AUDIOHDC_GAIN_MAX)
450
451/* value used to set max volume for right output */
452#define	AUDIOHDC_AMP_ROUT_MAX	\
453	(AUDIOHDC_AMP_SET_OUTPUT | \
454	AUDIOHDC_AMP_SET_RIGHT | \
455	AUDIOHDC_GAIN_MAX)
456
457
458/*
459 * Bits for pin widget control verb
460 */
461#define	AUDIOHDC_PIN_CONTROL_HP_ENABLE		0x80
462#define	AUDIOHDC_PIN_CONTROL_OUT_ENABLE		0x40
463#define	AUDIOHDC_PIN_CONTROL_IN_ENABLE		0x20
464
465/*
466 * Bits for Amplifier capabilities
467 */
468#define	AUDIOHDC_AMP_CAP_MUTE_CAP		0x80000000
469#define	AUDIOHDC_AMP_CAP_STEP_SIZE		0x007f0000
470#define	AUDIOHDC_AMP_CAP_STEP_NUMS		0x00007f00
471#define	AUDIOHDC_AMP_CAP_0DB_OFFSET		0x0000007f
472
473
474/*
475 * Bits for Audio Widget Capabilities
476 */
477#define	AUDIOHD_WIDCAP_STEREO		0x00000001
478#define	AUDIOHD_WIDCAP_INAMP		0x00000002
479#define	AUDIOHD_WIDCAP_OUTAMP		0x00000004
480#define	AUDIOHD_WIDCAP_AMP_OVRIDE	0x00000008
481#define	AUDIOHD_WIDCAP_FMT_OVRIDE	0x00000010
482#define	AUDIOHD_WIDCAP_STRIP		0x00000020
483#define	AUDIOHD_WIDCAP_PROC_WID		0x00000040
484#define	AUDIOHD_WIDCAP_UNSOL		0x00000080
485#define	AUDIOHD_WIDCAP_CONNLIST		0x00000100
486#define	AUDIOHD_WIDCAP_DIGIT		0x00000200
487#define	AUDIOHD_WIDCAP_PWRCTRL		0x00000400
488#define	AUDIOHD_WIDCAP_LRSWAP		0x00000800
489#define	AUDIOHD_WIDCAP_TYPE		0x00f00000
490#define	AUDIOHD_WIDCAP_TO_WIDTYPE(wcap)		\
491	((wcap & AUDIOHD_WIDCAP_TYPE) >> 20)
492
493
494#define	AUDIOHD_CODEC_FAILURE	(uint32_t)(-1)
495
496/*
497 * buffer descriptor list entry of stream descriptor
498 */
499typedef struct {
500	uint64_t	sbde_addr;
501	uint32_t	sbde_len;
502	uint32_t
503		sbde_ioc: 1,
504		reserved: 31;
505}sd_bdle_t;
506
507
508#define	AUDIOHD_PLAY_STARTED		0x00000001
509#define	AUDIOHD_PLAY_EMPTY		0x00000002
510#define	AUDIOHD_PLAY_PAUSED		0x00000004
511#define	AUDIOHD_RECORD_STARTED		0x00000008
512
513enum audiohda_widget_type {
514	WTYPE_AUDIO_OUT = 0,
515	WTYPE_AUDIO_IN,
516	WTYPE_AUDIO_MIX,
517	WTYPE_AUDIO_SEL,
518	WTYPE_PIN,
519	WTYPE_POWER,
520	WTYPE_VOL_KNOB,
521	WTYPE_BEEP,
522	WTYPE_VENDOR = 0xf
523};
524
525enum audiohda_device_type {
526	DTYPE_LINEOUT = 0,
527	DTYPE_SPEAKER,
528	DTYPE_HP_OUT,
529	DTYPE_CD,
530	DTYPE_SPDIF_OUT,
531	DTYPE_DIGIT_OUT,
532	DTYPE_MODEM_SIDE,
533	DTYPE_MODEM_HNAD_SIDE,
534	DTYPE_LINE_IN,
535	DTYPE_AUX,
536	DTYPE_MIC_IN,
537	DTYPE_TEL,
538	DTYPE_SPDIF_IN,
539	DTYPE_DIGIT_IN,
540	DTYPE_OTHER = 0x0f,
541};
542
543enum audiohd_pin_color {
544	AUDIOHD_PIN_UNKNOWN = 0,
545	AUDIOHD_PIN_BLACK,
546	AUDIOHD_PIN_GREY,
547	AUDIOHD_PIN_BLUE,
548	AUDIOHD_PIN_GREEN,
549	AUDIOHD_PIN_RED,
550	AUDIOHD_PIN_ORANGE,
551	AUDIOHD_PIN_YELLOW,
552	AUDIOHD_PIN_PURPLE,
553	AUDIOHD_PIN_PINK,
554	AUDIOHD_PIN_WHITE = 0xe,
555	AUDIOHD_PIN_OTHER = 0xf,
556};
557
558#define	CTRL_NUM	16
559
560/* values for audiohd_widget.path_flags */
561#define	AUDIOHD_PATH_DAC	(1 << 0)
562#define	AUDIOHD_PATH_ADC	(1 << 1)
563#define	AUDIOHD_PATH_MON	(1 << 2)
564#define	AUDIOHD_PATH_NOMON	(1 << 3)
565#define	AUDIOHD_PATH_BEEP	(1 << 4)
566
567typedef struct audiohd_path	audiohd_path_t;
568typedef struct audiohd_widget	audiohd_widget_t;
569typedef struct audiohd_state	audiohd_state_t;
570typedef struct audiohd_codec_info	audiohd_codec_info_t;
571typedef struct audiohd_pin	audiohd_pin_t;
572typedef struct hda_codec	hda_codec_t;
573typedef uint32_t	wid_t;		/* id of widget */
574typedef	struct audiohd_entry_prop	audiohd_entry_prop_t;
575typedef	enum audiohda_device_type	audiohda_device_type_t;
576typedef	enum audiohd_pin_color		audiohd_pin_color_t;
577
578#define	AUDIOHD_MAX_WIDGET		128
579#define	AUDIOHD_MAX_CONN		16
580#define	AUDIOHD_MAX_PINS		16
581#define	AUDIOHD_MAX_DEPTH		8
582
583struct audiohd_entry_prop {
584	uint32_t	conn_len;
585	uint32_t	mask_range;
586	uint32_t	mask_wid;
587	wid_t		input_wid;
588	int		conns_per_entry;
589	int		bits_per_conn;
590};
591struct audiohd_widget {
592	wid_t		wid_wid;
593	hda_codec_t	*codec;
594	enum audiohda_widget_type type;
595
596	uint32_t	widget_cap;
597	uint32_t	pcm_format;
598	uint32_t	inamp_cap;
599	uint32_t	outamp_cap;
600
601	uint32_t	path_flags;
602
603	int		out_weight;
604	int		in_weight;
605	int		finish;
606
607	/*
608	 * wid of possible & selected input connections
609	 */
610	wid_t		avail_conn[AUDIOHD_MAX_CONN];
611	wid_t		selconn;
612	/*
613	 * for monitor path
614	 */
615	wid_t		selmon[AUDIOHD_MAX_CONN];
616	uint16_t 	used;
617
618	/*
619	 * available (input) connections. 0 means this widget
620	 * has fixed connection
621	 */
622	int		nconns;
623
624	/*
625	 * pointer to struct depending on widget type:
626	 *	1. DAC	audiohd_ostream_t
627	 *	2. ADC	audiohd_istream_t
628	 *	3. PIN	audiohd_pin_t
629	 */
630	void	*priv;
631};
632
633#define	AUDIOHD_FLAG_LINEOUT		(1 << 0)
634#define	AUDIOHD_FLAG_SPEAKER		(1 << 1)
635#define	AUDIOHD_FLAG_HP			(1 << 2)
636#define	AUDIOHD_FLAG_MONO		(1 << 3)
637
638#define	AUDIOHD_MAX_MIXER		5
639#define	AUDIOHD_MAX_PIN			4
640
641#define	PORT_DAC		0
642#define	PORT_ADC		1
643#define	PORT_MAX		2
644typedef enum {
645	PLAY = 0,
646	RECORD = 1,
647	BEEP = 2,
648} path_type_t;
649
650struct audiohd_path {
651	wid_t			adda_wid;
652	wid_t			beep_wid;
653
654	wid_t			pin_wid[AUDIOHD_MAX_PINS];
655	int			sum_selconn[AUDIOHD_MAX_PINS];
656	int			mon_wid[AUDIOHD_MAX_PIN][AUDIOHD_MAX_MIXER];
657	int			pin_nums;
658	int			maxmixer[AUDIOHD_MAX_PINS];
659
660	path_type_t		path_type;
661
662	wid_t			mute_wid;
663	int			mute_dir;
664	wid_t			gain_wid;
665	int			gain_dir;
666	uint32_t		gain_bits;
667
668	uint32_t		pin_outputs;
669	uint8_t			tag;
670
671	hda_codec_t		*codec;
672
673	wid_t			sum_wid;
674
675	audiohd_state_t		*statep;
676};
677
678typedef struct audiohd_port
679{
680	uint8_t			nchan;
681	int			index;
682	uint16_t		regoff;
683	boolean_t		started;
684	boolean_t		triggered;
685
686	unsigned		fragfr;
687	unsigned		nframes;
688	uint64_t		count;
689	int			curpos;
690	int			intrs;
691
692	uint_t			format;
693	unsigned		sync_dir;
694
695	ddi_dma_handle_t	samp_dmah;
696	ddi_acc_handle_t	samp_acch;
697	size_t			samp_size;
698	caddr_t			samp_kaddr;
699	uint64_t		samp_paddr;
700
701	ddi_dma_handle_t	bdl_dmah;
702	ddi_acc_handle_t	bdl_acch;
703	size_t			bdl_size;
704	caddr_t			bdl_kaddr;
705	uint64_t		bdl_paddr;
706
707	audio_engine_t		*engine;
708	audiohd_state_t		*statep;
709}audiohd_port_t;
710
711typedef struct audiohd_ctrl
712{
713	audiohd_state_t		*statep;
714	audio_ctrl_t		*ctrl;
715	uint32_t		num;
716	uint64_t		val;
717} audiohd_ctrl_t;
718
719struct audiohd_pin {
720	audiohd_pin_t	*next;
721	wid_t		wid;
722	wid_t		mute_wid;	/* node used to mute this pin */
723	int		mute_dir;	/* 1: input, 2: output */
724	wid_t		gain_wid;	/* node for gain control */
725	int		gain_dir;	/* _OUTPUT/_INPUT */
726	uint32_t	gain_bits;
727
728	uint8_t		vrefvalue;	/* value of VRef */
729
730	uint32_t	cap;
731	uint32_t	config;
732	uint32_t	ctrl;
733	uint32_t	assoc;
734	uint32_t	seq;
735	wid_t		adc_dac_wid; /* AD/DA wid which can route to this pin */
736	wid_t		beep_wid;
737	int		no_phys_conn;
738	enum audiohda_device_type	device;
739
740	/*
741	 * mg_dir, mg_gain, mg_wid are used to store the monitor gain control
742	 * widget wid.
743	 */
744	int		mg_dir[AUDIOHD_MAX_CONN];
745	int		mg_gain[AUDIOHD_MAX_CONN];
746	int		mg_wid[AUDIOHD_MAX_CONN];
747	int		num;
748	int		finish;
749
750};
751
752typedef struct {
753	ddi_dma_handle_t	ad_dmahdl;
754	ddi_acc_handle_t	ad_acchdl;
755	caddr_t			ad_vaddr;	/* virtual addr */
756	uint64_t		ad_paddr;	/* physical addr */
757	size_t			ad_req_sz;	/* required size of memory */
758	size_t			ad_real_sz;	/* real size of memory */
759} audiohd_dma_t;
760
761struct hda_codec {
762	uint8_t		index;		/* codec address */
763	uint32_t	vid;		/* vendor id and device id */
764	uint32_t	revid;		/* revision id */
765	wid_t		wid_afg;	/* id of AFG */
766	wid_t		first_wid;	/* wid of 1st subnode of AFG */
767	wid_t		last_wid;	/* wid of the last subnode of AFG */
768	int		nnodes;		/* # of subnodes of AFG */
769	uint8_t		nistream;
770
771	uint32_t	outamp_cap;
772	uint32_t	inamp_cap;
773	uint32_t	stream_format;
774	uint32_t	pcm_format;
775
776	audiohd_state_t		*soft_statep;
777	audiohd_codec_info_t	*codec_info;
778
779	/* use wid as index to the array of widget pointers */
780	audiohd_widget_t	*widget[AUDIOHD_MAX_WIDGET];
781
782	audiohd_port_t		*port[AUDIOHD_PORT_MAX];
783	uint8_t			portnum;
784	audiohd_pin_t		*first_pin;
785};
786
787#define	AUDIOHD_MAX_ASSOC	15
788struct audiohd_state {
789	dev_info_t	*hda_dip;
790	kstat_t		*hda_ksp;
791	kmutex_t	hda_mutex;
792	uint32_t	hda_flags;
793
794	boolean_t	soft_volume;
795
796	caddr_t			hda_reg_base;
797	ddi_acc_handle_t	hda_pci_handle;
798	ddi_acc_handle_t	hda_reg_handle;
799
800	ddi_intr_handle_t 	*htable; 	/* For array of interrupts */
801	boolean_t		intr_added;
802	int			intr_type;	/* What type of interrupt */
803	int			intr_rqst;	/* # of request intrs count */
804	int			intr_cnt;	/* # of intrs count returned */
805	uint_t			intr_pri;	/* Interrupt priority */
806	int			intr_cap;	/* Interrupt capabilities */
807	boolean_t		msi_enable;
808
809	audiohd_dma_t	hda_dma_corb;
810	audiohd_dma_t	hda_dma_rirb;
811
812
813	uint8_t		hda_rirb_rp;		/* read pointer for rirb */
814	uint16_t	hda_codec_mask;
815
816
817	audio_dev_t	*adev;
818	uint32_t	devid;
819
820
821	int		hda_pint_freq;	/* play intr frequence */
822	int		hda_rint_freq;	/* record intr frequence */
823
824	int		hda_input_streams;	/* # of input stream */
825	int		hda_output_streams;	/* # of output stream */
826	int		hda_streams_nums;	/* # of stream */
827
828	uint_t		hda_play_regbase;
829	uint_t		hda_record_regbase;
830
831	uint_t		hda_play_stag;		/* tag of playback stream */
832	uint_t		hda_record_stag;	/* tag of record stream */
833	uint_t		hda_play_lgain;		/* left gain for playback */
834	uint_t		hda_play_rgain;		/* right gain for playback */
835
836	/*
837	 * Now, for the time being, we add some fields
838	 * for parsing codec topology
839	 */
840	hda_codec_t	*codec[AUDIOHD_CODEC_MAX];
841	/*
842	 * Suspend/Resume used fields
843	 */
844	boolean_t	suspended;
845	boolean_t	monitor_unsupported;
846
847	audiohd_path_t	*path[AUDIOHD_PORT_MAX];
848	uint8_t		pathnum;
849	audiohd_port_t	*port[PORT_MAX];
850	uint8_t		pchan;
851	uint8_t		rchan;
852
853	uint64_t	inmask;
854
855	uint_t		hda_out_ports;
856	uint_t		in_port;
857
858	/*
859	 * Controls
860	 */
861	audiohd_ctrl_t		*controls[CTRL_NUM];
862
863	/* for multichannel */
864	uint8_t			chann[AUDIOHD_MAX_ASSOC];
865	uint8_t			assoc;
866
867};
868
869struct audiohd_codec_info {
870	uint32_t	devid;
871	const char	*buf;
872	uint32_t	flags;
873};
874
875/*
876 * Operation for high definition audio control system bus
877 * interface registers
878 */
879#define	AUDIOHD_REG_GET8(reg)	\
880	ddi_get8(statep->hda_reg_handle, \
881	(void *)((char *)statep->hda_reg_base + (reg)))
882
883#define	AUDIOHD_REG_GET16(reg)	\
884	ddi_get16(statep->hda_reg_handle, \
885	(void *)((char *)statep->hda_reg_base + (reg)))
886
887#define	AUDIOHD_REG_GET32(reg)	\
888	ddi_get32(statep->hda_reg_handle, \
889	(void *)((char *)statep->hda_reg_base + (reg)))
890
891#define	AUDIOHD_REG_GET64(reg)	\
892	ddi_get64(statep->hda_reg_handle, \
893	(void *)((char *)statep->hda_reg_base + (reg)))
894
895#define	AUDIOHD_REG_SET8(reg, val)	\
896	ddi_put8(statep->hda_reg_handle, \
897	(void *)((char *)statep->hda_reg_base + (reg)), (val))
898
899#define	AUDIOHD_REG_SET16(reg, val)	\
900	ddi_put16(statep->hda_reg_handle, \
901	(void *)((char *)statep->hda_reg_base + (reg)), (val))
902
903#define	AUDIOHD_REG_SET32(reg, val)	\
904	ddi_put32(statep->hda_reg_handle, \
905	(void *)((char *)statep->hda_reg_base + (reg)), (val))
906
907#define	AUDIOHD_REG_SET64(reg, val)	\
908	ddi_put64(statep->hda_reg_handle, \
909	(void *)((char *)statep->hda_reg_base + (reg)), (val))
910
911
912/*
913 * enable a pin widget to output
914 */
915#define	AUDIOHD_ENABLE_PIN_OUT(statep, caddr, wid) \
916{ \
917	uint32_t	lTmp; \
918\
919	lTmp = audioha_codec_verb_get(statep, caddr, wid, \
920	    AUDIOHDC_VERB_GET_PIN_CTRL, 0); \
921	if (lTmp == AUDIOHD_CODEC_FAILURE) \
922		return (DDI_FAILURE); \
923	lTmp = audioha_codec_verb_get(statep, caddr, wid, \
924	    AUDIOHDC_VERB_SET_PIN_CTRL, \
925	    (lTmp | AUDIOHDC_PIN_CONTROL_OUT_ENABLE | \
926	    AUDIOHDC_PIN_CONTROL_HP_ENABLE)); \
927	if (lTmp == AUDIOHD_CODEC_FAILURE) \
928		return (DDI_FAILURE); \
929}
930
931/*
932 * disable output pin
933 */
934#define	AUDIOHD_DISABLE_PIN_OUT(statep, caddr, wid) \
935{ \
936	uint32_t	lTmp; \
937\
938	lTmp = audioha_codec_verb_get(statep, caddr, wid, \
939	    AUDIOHDC_VERB_GET_PIN_CTRL, 0); \
940	if (lTmp == AUDIOHD_CODEC_FAILURE) \
941		return (DDI_FAILURE); \
942	lTmp = audioha_codec_verb_get(statep, caddr, wid, \
943	    AUDIOHDC_VERB_SET_PIN_CTRL, \
944	    (lTmp & ~AUDIOHDC_PIN_CONTROL_OUT_ENABLE)); \
945	if (lTmp == AUDIOHD_CODEC_FAILURE) \
946		return (DDI_FAILURE); \
947}
948
949/*
950 * enable a pin widget to input
951 */
952#define	AUDIOHD_ENABLE_PIN_IN(statep, caddr, wid) \
953{ \
954	(void) audioha_codec_verb_get(statep, caddr, wid, \
955	    AUDIOHDC_VERB_SET_PIN_CTRL, AUDIOHDC_PIN_CONTROL_IN_ENABLE | 4); \
956}
957
958
959/*
960 * disable input pin
961 */
962#define	AUDIOHD_DISABLE_PIN_IN(statep, caddr, wid) \
963{ \
964	uint32_t	lTmp; \
965\
966	lTmp = audioha_codec_verb_get(statep, caddr, wid, \
967	    AUDIOHDC_VERB_GET_PIN_CTRL, 0); \
968	if (lTmp == AUDIOHD_CODEC_FAILURE) \
969		return (DDI_FAILURE); \
970	lTmp = audioha_codec_verb_get(statep, caddr, wid, \
971	    AUDIOHDC_VERB_SET_PIN_CTRL, \
972	    (lTmp & ~AUDIOHDC_PIN_CONTROL_IN_ENABLE)); \
973	if (lTmp == AUDIOHD_CODEC_FAILURE) \
974		return (DDI_FAILURE); \
975}
976
977/*
978 * unmute an output pin
979 */
980#define	AUDIOHD_NODE_UNMUTE_OUT(statep, caddr, wid) \
981{ \
982	if (audioha_codec_4bit_verb_get(statep, \
983	    caddr, wid, AUDIOHDC_VERB_SET_AMP_MUTE, \
984	    AUDIOHDC_AMP_SET_LR_OUTPUT | AUDIOHDC_GAIN_MAX) == \
985	    AUDIOHD_CODEC_FAILURE) \
986		return (DDI_FAILURE); \
987}
988
989/*
990 * check volume adjust value of 2 channels control
991 */
992#define	AUDIOHD_CHECK_2CHANNELS_VOLUME(value) \
993{ \
994	if ((value) & ~0xffff) \
995		return (EINVAL); \
996	if ((((value) & 0xff00) >> 8) > 100 || \
997	    ((value) & 0xff) > 100) \
998		return (EINVAL); \
999}
1000
1001/*
1002 * check volume adjust value of mono channel control
1003 */
1004#define	AUDIOHD_CHECK_CHANNEL_VOLUME(value) \
1005{ \
1006	if ((value) & ~0xff) \
1007		return (EINVAL); \
1008	if (((value) & 0xff) > 100) \
1009		return (EINVAL); \
1010}
1011
1012#ifdef __cplusplus
1013}
1014#endif
1015
1016#endif	/* _SYS_AUDIOHD_IMPL_H_ */
1017