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