xref: /illumos-gate/usr/src/uts/common/io/audio/drv/audiohd/audiohd.h (revision 6a634c9dca3093f3922e4b7ab826d7bdf17bf78e)
188447a05SGarrett D'Amore /*
288447a05SGarrett D'Amore  * CDDL HEADER START
388447a05SGarrett D'Amore  *
488447a05SGarrett D'Amore  * The contents of this file are subject to the terms of the
588447a05SGarrett D'Amore  * Common Development and Distribution License (the "License").
688447a05SGarrett D'Amore  * You may not use this file except in compliance with the License.
788447a05SGarrett D'Amore  *
888447a05SGarrett D'Amore  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
988447a05SGarrett D'Amore  * or http://www.opensolaris.org/os/licensing.
1088447a05SGarrett D'Amore  * See the License for the specific language governing permissions
1188447a05SGarrett D'Amore  * and limitations under the License.
1288447a05SGarrett D'Amore  *
1388447a05SGarrett D'Amore  * When distributing Covered Code, include this CDDL HEADER in each
1488447a05SGarrett D'Amore  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1588447a05SGarrett D'Amore  * If applicable, add the following below this CDDL HEADER, with the
1688447a05SGarrett D'Amore  * fields enclosed by brackets "[]" replaced with your own identifying
1788447a05SGarrett D'Amore  * information: Portions Copyright [yyyy] [name of copyright owner]
1888447a05SGarrett D'Amore  *
1988447a05SGarrett D'Amore  * CDDL HEADER END
2088447a05SGarrett D'Amore  */
2188447a05SGarrett D'Amore /*
22b96a6eceSZhao Edgar Liu - Sun Microsystems  * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
2388447a05SGarrett D'Amore  */
2488447a05SGarrett D'Amore #ifndef _SYS_AUDIOHD_IMPL_H_
2588447a05SGarrett D'Amore #define	_SYS_AUDIOHD_IMPL_H_
2688447a05SGarrett D'Amore 
2788447a05SGarrett D'Amore #ifdef __cplusplus
2888447a05SGarrett D'Amore extern "C" {
2988447a05SGarrett D'Amore #endif
3088447a05SGarrett D'Amore 
3188447a05SGarrett D'Amore /*
3288447a05SGarrett D'Amore  * vendor IDs of PCI audio controllers
3388447a05SGarrett D'Amore  */
3488447a05SGarrett D'Amore #define	AUDIOHD_VID_ATI		0x1002
350c240c64SZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_VID_CIRRUS	0x1013
3688447a05SGarrett D'Amore #define	AUDIOHD_VID_NVIDIA	0x10de
3789e1f902SZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_VID_REALTEK	0x10ec
3870feb41cSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_VID_CREATIVE	0x1102
3926ae4a35SZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_VID_IDT		0x111d
4007bec7ccSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_VID_ANALOG	0x11d4
410c240c64SZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_VID_CONEXANT	0x14f1
4242c41cf8Slipeng sang - Sun Microsystems - Beijing China #define	AUDIOHD_VID_SIGMATEL	0x8384
4326ae4a35SZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_VID_INTEL	0x8086
4488447a05SGarrett D'Amore 
4588447a05SGarrett D'Amore /*
4689e1f902SZhao Edgar Liu - Sun Microsystems  * specific audiohd controller device id
4789e1f902SZhao Edgar Liu - Sun Microsystems  */
4889e1f902SZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_CONTROLLER_MCP51	0x10de026c
4989e1f902SZhao Edgar Liu - Sun Microsystems 
5089e1f902SZhao Edgar Liu - Sun Microsystems /*
51cbe6566fSZhao Edgar Liu - Sun Microsystems  * codec special initial flags
5288447a05SGarrett D'Amore  */
53cbe6566fSZhao Edgar Liu - Sun Microsystems #define	NO_GPIO		0x00000001
54cbe6566fSZhao Edgar Liu - Sun Microsystems #define	NO_MIXER	0x00000002
55cbe6566fSZhao Edgar Liu - Sun Microsystems #define	NO_SPDIF	0x00000004
56ee97b734SZhao Edgar Liu - Sun Microsystems #define	EN_PIN_BEEP	0x00000008
5788447a05SGarrett D'Amore 
5888447a05SGarrett D'Amore #define	AUDIOHD_DEV_CONFIG	"onboard1"
5988447a05SGarrett D'Amore #define	AUDIOHD_DEV_VERSION	"a"
6088447a05SGarrett D'Amore 
6188447a05SGarrett D'Amore /*
6288447a05SGarrett D'Amore  * Only for Intel hardware:
6388447a05SGarrett D'Amore  * PCI Express traffic class select register in PCI configure space
6488447a05SGarrett D'Amore  */
6588447a05SGarrett D'Amore #define	AUDIOHD_INTEL_PCI_TCSEL 0x44
66b96a6eceSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_INTEL_TCS_MASK	0xf8
6788447a05SGarrett D'Amore 
6888447a05SGarrett D'Amore /*
6988447a05SGarrett D'Amore  * Only for ATI SB450:
7088447a05SGarrett D'Amore  * MISC control register 2
7188447a05SGarrett D'Amore  */
7288447a05SGarrett D'Amore #define	AUDIOHD_ATI_PCI_MISC2	0x42
73b96a6eceSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_ATI_MISC2_MASK	0xf8
7488447a05SGarrett D'Amore #define	AUDIOHD_ATI_MISC2_SNOOP	0x02
75b96a6eceSZhao Edgar Liu - Sun Microsystems 
76b96a6eceSZhao Edgar Liu - Sun Microsystems /* NVIDIA snoop */
77b96a6eceSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_NVIDIA_SNOOP	0x0f
78b96a6eceSZhao Edgar Liu - Sun Microsystems 
7988447a05SGarrett D'Amore #define	AUDIOHDC_NID(x)		x
8088447a05SGarrett D'Amore #define	AUDIOHDC_NULL_NODE	-1
8188447a05SGarrett D'Amore #define	AUDIOHD_NULL_CONN	((uint_t)(-1))
8288447a05SGarrett D'Amore 
8388447a05SGarrett D'Amore #define	AUDIOHD_EXT_AMP_MASK	0x00010000
8488447a05SGarrett D'Amore #define	AUDIOHD_EXT_AMP_ENABLE	0x02
8588447a05SGarrett D'Amore 
8688447a05SGarrett D'Amore /* Power On/Off */
8788447a05SGarrett D'Amore #define	AUDIOHD_PW_D0		0
8888447a05SGarrett D'Amore #define	AUDIOHD_PW_D2		2
8988447a05SGarrett D'Amore 
9088447a05SGarrett D'Amore /* Pin speaker On/Off */
9188447a05SGarrett D'Amore #define	AUDIOHD_SP_ON		1
9288447a05SGarrett D'Amore #define	AUDIOHD_SP_OFF		0
9388447a05SGarrett D'Amore 
9488447a05SGarrett D'Amore #define	AUDIOHD_PORT_MAX	15
9588447a05SGarrett D'Amore #define	AUDIOHD_CODEC_MAX	16
9688447a05SGarrett D'Amore #define	AUDIOHD_MEMIO_LEN	0x4000
9788447a05SGarrett D'Amore 
9888447a05SGarrett D'Amore #define	AUDIOHD_RETRY_TIMES	60
9988447a05SGarrett D'Amore #define	AUDIOHD_TEST_TIMES	500
10088447a05SGarrett D'Amore #define	AUDIOHD_OUTSTR_NUM_OFF	12
10188447a05SGarrett D'Amore #define	AUDIOHD_INSTR_NUM_OFF	8
10288447a05SGarrett D'Amore 
10388447a05SGarrett D'Amore #define	AUDIOHD_CORB_SIZE_OFF	0x4e
10488447a05SGarrett D'Amore 
10588447a05SGarrett D'Amore #define	AUDIOHD_URCAP_MASK	0x80
10688447a05SGarrett D'Amore #define	AUDIOHD_DTCCAP_MASK	0x4
10788447a05SGarrett D'Amore #define	AUDIOHD_UR_ENABLE_OFF	8
108989b958fSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_UR_TAG_MASK	0x3f
10988447a05SGarrett D'Amore 
11088447a05SGarrett D'Amore #define	AUDIOHD_CIS_MASK	0x40000000
11188447a05SGarrett D'Amore 
11288447a05SGarrett D'Amore #define	AUDIOHD_RIRB_UR_MASK	0x10
11388447a05SGarrett D'Amore #define	AUDIOHD_RIRB_CODEC_MASK	0xf
11488447a05SGarrett D'Amore #define	AUDIOHD_RIRB_WID_OFF	27
11588447a05SGarrett D'Amore #define	AUDIOHD_RIRB_INTRCNT	0x0
11688447a05SGarrett D'Amore #define	AUDIOHD_RIRB_WPMASK	0xff
11788447a05SGarrett D'Amore 
11888447a05SGarrett D'Amore #define	AUDIOHD_FORM_MASK	0x0080
11988447a05SGarrett D'Amore #define	AUDIOHD_LEN_MASK	0x007f
12088447a05SGarrett D'Amore #define	AUDIOHD_PIN_CAP_MASK	0x00000010
12188447a05SGarrett D'Amore #define	AUDIOHD_PIN_CONF_MASK	0xc0000000
12288447a05SGarrett D'Amore #define	AUDIOHD_PIN_CON_MASK	3
12388447a05SGarrett D'Amore #define	AUDIOHD_PIN_CON_STEP	30
12488447a05SGarrett D'Amore #define	AUDIOHD_PIN_IO_MASK	0X0018
12588447a05SGarrett D'Amore #define	AUDIOHD_PIN_SEQ_MASK	0x0000000f
12688447a05SGarrett D'Amore #define	AUDIOHD_PIN_ASO_MASK	0x000000f0
12788447a05SGarrett D'Amore #define	AUDIOHD_PIN_ASO_OFF	0x4
12888447a05SGarrett D'Amore #define	AUDIOHD_PIN_DEV_MASK	0x00f00000
12988447a05SGarrett D'Amore #define	AUDIOHD_PIN_DEV_OFF	20
13088447a05SGarrett D'Amore #define	AUDIOHD_PIN_NUMS	6
13188447a05SGarrett D'Amore #define	AUDIOHD_PIN_NO_CONN	0x40000000
13288447a05SGarrett D'Amore #define	AUDIOHD_PIN_IN_ENABLE	0x20
13388447a05SGarrett D'Amore #define	AUDIOHD_PIN_OUT_ENABLE	0x40
134989b958fSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_PIN_PRES_MASK	0x80000000
13588447a05SGarrett D'Amore #define	AUDIOHD_PIN_CONTP_OFF	0x1e
13688447a05SGarrett D'Amore #define	AUDIOHD_PIN_CON_JACK	0
13788447a05SGarrett D'Amore #define	AUDIOHD_PIN_CON_FIXED	0x2
13888447a05SGarrett D'Amore #define	AUDIOHD_PIN_CONTP_MASK	0x3
13988447a05SGarrett D'Amore #define	AUDIOHD_PIN_VREF_L1	0x20
14088447a05SGarrett D'Amore #define	AUDIOHD_PIN_VREF_L2	0x10
14188447a05SGarrett D'Amore #define	AUDIOHD_PIN_VREF_L3	0x04
14288447a05SGarrett D'Amore #define	AUDIOHD_PIN_VREF_L4	0x02
14388447a05SGarrett D'Amore #define	AUDIOHD_PIN_VREF_OFF	8
14488447a05SGarrett D'Amore #define	AUDIOHD_PIN_VREF_MASK	0xff
14588447a05SGarrett D'Amore #define	AUDIOHD_PIN_CLR_MASK	0xf
14688447a05SGarrett D'Amore #define	AUDIOHD_PIN_CLR_OFF	12
14788447a05SGarrett D'Amore 
14888447a05SGarrett D'Amore #define	AUDIOHD_VERB_ADDR_OFF	28
14988447a05SGarrett D'Amore #define	AUDIOHD_VERB_NID_OFF	20
15088447a05SGarrett D'Amore #define	AUDIOHD_VERB_CMD_OFF	8
15188447a05SGarrett D'Amore #define	AUDIOHD_VERB_CMD16_OFF	16
15288447a05SGarrett D'Amore 
15388447a05SGarrett D'Amore #define	AUDIOHD_RING_MAX_SIZE	0x00ff
15488447a05SGarrett D'Amore #define	AUDIOHD_REC_TAG_OFF	4
15588447a05SGarrett D'Amore #define	AUDIOHD_PLAY_TAG_OFF	4
15688447a05SGarrett D'Amore #define	AUDIOHD_PLAY_CTL_OFF	2
15788447a05SGarrett D'Amore #define	AUDIOHD_REC_CTL_OFF	2
15888447a05SGarrett D'Amore 
15988447a05SGarrett D'Amore #define	AUDIOHD_SPDIF_ON	1
16088447a05SGarrett D'Amore #define	AUDIOHD_SPDIF_MASK	0x00ff
16188447a05SGarrett D'Amore 
16288447a05SGarrett D'Amore #define	AUDIOHD_GAIN_OFF	8
16388447a05SGarrett D'Amore 
16488447a05SGarrett D'Amore #define	AUDIOHD_CODEC_STR_OFF	16
16588447a05SGarrett D'Amore #define	AUDIOHD_CODEC_STR_MASK	0x000000ff
16688447a05SGarrett D'Amore #define	AUDIOHD_CODEC_NUM_MASK	0x000000ff
16788447a05SGarrett D'Amore #define	AUDIOHD_CODEC_TYPE_MASK	0x000000ff
16888447a05SGarrett D'Amore 
1690c240c64SZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_ROUNDUP(x, algn)	(((x) + ((algn) - 1)) & ~((algn) - 1))
17088447a05SGarrett D'Amore #define	AUDIOHD_BDLE_BUF_ALIGN	128
17188447a05SGarrett D'Amore #define	AUDIOHD_CMDIO_ENT_MASK	0x00ff	/* 256 entries for CORB/RIRB */
17288447a05SGarrett D'Amore #define	AUDIOHD_CDBIO_CORB_LEN	1024	/* 256 entries for CORB, 1024B */
17388447a05SGarrett D'Amore #define	AUDIOHD_CDBIO_RIRB_LEN	2048	/* 256 entries for RIRB, 2048B */
17488447a05SGarrett D'Amore #define	AUDIOHD_BDLE_NUMS	4	/* 4 entires for record/play BD list */
17588447a05SGarrett D'Amore 
17688447a05SGarrett D'Amore #define	AUDIOHD_PORT_UNMUTE	(0xffffffff)
17788447a05SGarrett D'Amore 
17888447a05SGarrett D'Amore /*
17988447a05SGarrett D'Amore  * Audio registers of high definition
18088447a05SGarrett D'Amore  */
18188447a05SGarrett D'Amore #define	AUDIOHD_REG_GCAP		0x00
18288447a05SGarrett D'Amore #define	AUDIOHDR_GCAP_OUTSTREAMS	0xf000
18388447a05SGarrett D'Amore #define	AUDIOHDR_GCAP_INSTREAMS		0x0f00
18488447a05SGarrett D'Amore #define	AUDIOHDR_GCAP_BSTREAMS		0x00f8
18588447a05SGarrett D'Amore #define	AUDIOHDR_GCAP_NSDO		0x0006
18688447a05SGarrett D'Amore #define	AUDIOHDR_GCAP_64OK		0x0001
18788447a05SGarrett D'Amore 
18888447a05SGarrett D'Amore #define	AUDIOHD_REG_VMIN		0x02
18988447a05SGarrett D'Amore #define	AUDIOHD_REG_VMAJ		0x03
19088447a05SGarrett D'Amore #define	AUDIOHD_REG_OUTPAY		0x04
19188447a05SGarrett D'Amore #define	AUDIOHD_REG_INPAY		0x06
19288447a05SGarrett D'Amore #define	AUDIOHD_REG_GCTL		0x08
19388447a05SGarrett D'Amore #define	AUDIOHD_REG_WAKEEN		0x0C
19488447a05SGarrett D'Amore #define	AUDIOHD_REG_STATESTS		0x0E
19588447a05SGarrett D'Amore #define	AUDIOHD_STATESTS_BIT_SDINS	0x7F
19688447a05SGarrett D'Amore 
19788447a05SGarrett D'Amore #define	AUDIOHD_REG_GSTS		0x10
19888447a05SGarrett D'Amore #define	AUDIOHD_REG_INTCTL		0x20
19988447a05SGarrett D'Amore #define	AUDIOHD_INTCTL_BIT_GIE		0x80000000
20088447a05SGarrett D'Amore #define	AUDIOHD_INTCTL_BIT_CIE		0x40000000
20188447a05SGarrett D'Amore #define	AUDIOHD_INTCTL_BIT_SIE		0x3FFFFFFF
20288447a05SGarrett D'Amore 
20388447a05SGarrett D'Amore 
20488447a05SGarrett D'Amore #define	AUDIOHD_REG_INTSTS		0x24
20588447a05SGarrett D'Amore #define	AUDIOHD_INTSTS_BIT_GIS		0x80000000
20688447a05SGarrett D'Amore #define	AUDIOHD_INTSTS_BIT_CIS		0x40000000
20788447a05SGarrett D'Amore #define	AUDIOHD_INTSTS_BIT_SINTS	(0x3fffffff)
20888447a05SGarrett D'Amore 
20988447a05SGarrett D'Amore #define	AUDIOHD_REG_WALCLK		0x30
21088447a05SGarrett D'Amore #define	AUDIOHD_REG_SYNC		0x38
21188447a05SGarrett D'Amore 
21288447a05SGarrett D'Amore #define	AUDIOHD_REG_CORBLBASE		0x40
21388447a05SGarrett D'Amore #define	AUDIOHD_REG_CORBUBASE		0x44
21488447a05SGarrett D'Amore #define	AUDIOHD_REG_CORBWP		0x48
21588447a05SGarrett D'Amore #define	AUDIOHD_REG_CORBRP		0x4A
21688447a05SGarrett D'Amore #define	AUDIOHD_REG_CORBCTL		0x4C
21788447a05SGarrett D'Amore #define	AUDIOHD_REG_CORBST		0x4D
21888447a05SGarrett D'Amore #define	AUDIOHD_REG_CORBSIZE		0x4E
21988447a05SGarrett D'Amore 
22088447a05SGarrett D'Amore #define	AUDIOHD_REG_RIRBLBASE		0x50
22188447a05SGarrett D'Amore #define	AUDIOHD_REG_RIRBUBASE		0x54
22288447a05SGarrett D'Amore #define	AUDIOHD_REG_RIRBWP		0x58
22388447a05SGarrett D'Amore #define	AUDIOHD_REG_RINTCNT		0x5A
22488447a05SGarrett D'Amore #define	AUDIOHD_REG_RIRBCTL		0x5C
22588447a05SGarrett D'Amore #define	AUDIOHD_REG_RIRBSTS		0x5D
22688447a05SGarrett D'Amore #define	AUDIOHD_REG_RIRBSIZE		0x5E
22788447a05SGarrett D'Amore 
22888447a05SGarrett D'Amore #define	AUDIOHD_REG_IC			0x60
22988447a05SGarrett D'Amore #define	AUDIOHD_REG_IR			0x64
23088447a05SGarrett D'Amore #define	AUDIOHD_REG_IRS			0x68
23188447a05SGarrett D'Amore #define	AUDIOHD_REG_DPLBASE		0x70
23288447a05SGarrett D'Amore #define	AUDIOHD_REG_DPUBASE		0x74
23388447a05SGarrett D'Amore 
23488447a05SGarrett D'Amore #define	AUDIOHD_REG_SD_BASE		0x80
23588447a05SGarrett D'Amore #define	AUDIOHD_REG_SD_LEN		0x20
23688447a05SGarrett D'Amore 
23788447a05SGarrett D'Amore /*
23888447a05SGarrett D'Amore  * Offset of Stream Descriptor Registers
23988447a05SGarrett D'Amore  */
24088447a05SGarrett D'Amore #define	AUDIOHD_SDREG_OFFSET_CTL		0x00
24188447a05SGarrett D'Amore #define	AUDIOHD_SDREG_OFFSET_STS		0x03
24288447a05SGarrett D'Amore #define	AUDIOHD_SDREG_OFFSET_LPIB		0x04
24388447a05SGarrett D'Amore #define	AUDIOHD_SDREG_OFFSET_CBL		0x08
24488447a05SGarrett D'Amore #define	AUDIOHD_SDREG_OFFSET_LVI		0x0c
24588447a05SGarrett D'Amore #define	AUDIOHD_SDREG_OFFSET_FIFOW		0x0e
24688447a05SGarrett D'Amore #define	AUDIOHD_SDREG_OFFSET_FIFOSIZE		0x10
24788447a05SGarrett D'Amore #define	AUDIOHD_SDREG_OFFSET_FORMAT		0x12
24888447a05SGarrett D'Amore #define	AUDIOHD_SDREG_OFFSET_BDLPL		0x18
24988447a05SGarrett D'Amore #define	AUDIOHD_SDREG_OFFSET_BDLPU		0x1c
25088447a05SGarrett D'Amore 
25188447a05SGarrett D'Amore /* bits for stream descriptor control reg */
25288447a05SGarrett D'Amore #define	AUDIOHDR_SD_CTL_DEIE		0x000010
25388447a05SGarrett D'Amore #define	AUDIOHDR_SD_CTL_FEIE		0x000008
25488447a05SGarrett D'Amore #define	AUDIOHDR_SD_CTL_IOCE		0x000004
25588447a05SGarrett D'Amore #define	AUDIOHDR_SD_CTL_SRUN		0x000002
25688447a05SGarrett D'Amore #define	AUDIOHDR_SD_CTL_SRST		0x000001
25788447a05SGarrett D'Amore 
25888447a05SGarrett D'Amore /* bits for stream descriptor status register */
25988447a05SGarrett D'Amore #define	AUDIOHDR_SD_STS_BCIS		0x0004
26088447a05SGarrett D'Amore #define	AUDIOHDR_SD_STS_FIFOE		0x0008
26188447a05SGarrett D'Amore #define	AUDIOHDR_SD_STS_DESE		0x0010
26288447a05SGarrett D'Amore #define	AUDIOHDR_SD_STS_FIFORY		0x0020
26388447a05SGarrett D'Amore #define	AUDIOHDR_SD_STS_INTRS	\
26488447a05SGarrett D'Amore 	(AUDIOHDR_SD_STS_BCIS | \
26588447a05SGarrett D'Amore 	AUDIOHDR_SD_STS_FIFOE |	\
26688447a05SGarrett D'Amore 	AUDIOHDR_SD_STS_DESE)
26788447a05SGarrett D'Amore 
26888447a05SGarrett D'Amore /* bits for GCTL register */
26988447a05SGarrett D'Amore #define	AUDIOHDR_GCTL_CRST		0x00000001
27088447a05SGarrett D'Amore #define	AUDIOHDR_GCTL_URESPE		0x00000100
27188447a05SGarrett D'Amore 
27288447a05SGarrett D'Amore /* bits for CORBRP register */
27388447a05SGarrett D'Amore #define	AUDIOHDR_CORBRP_RESET		0x8000
27488447a05SGarrett D'Amore #define	AUDIOHDR_CORBRP_WPTR		0x00ff
27588447a05SGarrett D'Amore 
27688447a05SGarrett D'Amore /* bits for CORBCTL register */
27788447a05SGarrett D'Amore #define	AUDIOHDR_CORBCTL_CMEIE		0x01
27888447a05SGarrett D'Amore #define	AUDIOHDR_CORBCTL_DMARUN		0x02
27988447a05SGarrett D'Amore 
28088447a05SGarrett D'Amore /* bits for CORB SIZE register */
28188447a05SGarrett D'Amore #define	AUDIOHDR_CORBSZ_8		0
28288447a05SGarrett D'Amore #define	AUDIOHDR_CORBSZ_16		1
28388447a05SGarrett D'Amore #define	AUDIOHDR_CORBSZ_256		2
28488447a05SGarrett D'Amore 
28588447a05SGarrett D'Amore /* bits for RIRBCTL register */
28688447a05SGarrett D'Amore #define	AUDIOHDR_RIRBCTL_RINTCTL	0x01
28788447a05SGarrett D'Amore #define	AUDIOHDR_RIRBCTL_DMARUN		0x02
28888447a05SGarrett D'Amore #define	AUDIOHDR_RIRBCTL_RIRBOIC	0x04
28988447a05SGarrett D'Amore #define	AUDIOHDR_RIRBCTL_RSTINT		0xfe
29088447a05SGarrett D'Amore 
29188447a05SGarrett D'Amore /* bits for RIRBWP register */
29288447a05SGarrett D'Amore #define	AUDIOHDR_RIRBWP_RESET		0x8000
29388447a05SGarrett D'Amore #define	AUDIOHDR_RIRBWP_WPTR		0x00ff
29488447a05SGarrett D'Amore 
29588447a05SGarrett D'Amore /* bits for RIRB SIZE register */
29688447a05SGarrett D'Amore #define	AUDIOHDR_RIRBSZ_8		0
29788447a05SGarrett D'Amore #define	AUDIOHDR_RIRBSZ_16		1
29888447a05SGarrett D'Amore #define	AUDIOHDR_RIRBSZ_256		2
29988447a05SGarrett D'Amore 
30088447a05SGarrett D'Amore #define	AUDIOHD_BDLE_RIRB_SDI		0x0000000f
30188447a05SGarrett D'Amore #define	AUDIOHD_BDLE_RIRB_UNSOLICIT	0x00000010
30288447a05SGarrett D'Amore 
30388447a05SGarrett D'Amore /* HD spec: ID of Root node is 0 */
30488447a05SGarrett D'Amore #define	AUDIOHDC_NODE_ROOT		0x00
30588447a05SGarrett D'Amore 
30688447a05SGarrett D'Amore /* HD spec: ID of audio function group is "1" */
30788447a05SGarrett D'Amore #define	AUDIOHDC_AUDIO_FUNC_GROUP	1
30888447a05SGarrett D'Amore 
30988447a05SGarrett D'Amore /*
31088447a05SGarrett D'Amore  * HD audio verbs can be either 12-bit or 4-bit in length.
31188447a05SGarrett D'Amore  */
31288447a05SGarrett D'Amore #define	AUDIOHDC_12BIT_VERB_MASK	0xfffff000
31388447a05SGarrett D'Amore #define	AUDIOHDC_4BIT_VERB_MASK		0xfffffff0
31488447a05SGarrett D'Amore 
31542c41cf8Slipeng sang - Sun Microsystems - Beijing China #define	AUDIOHDC_SAMPR48000		48000
31642c41cf8Slipeng sang - Sun Microsystems - Beijing China #define	AUDIOHDC_MAX_BEEP_GEN		12000
31742c41cf8Slipeng sang - Sun Microsystems - Beijing China #define	AUDIOHDC_MIX_BEEP_GEN		47
31842c41cf8Slipeng sang - Sun Microsystems - Beijing China #define	AUDIOHDC_MUTE_BEEP_GEN		0x0
31942c41cf8Slipeng sang - Sun Microsystems - Beijing China 
32088447a05SGarrett D'Amore /*
32188447a05SGarrett D'Amore  * 12-bit verbs
32288447a05SGarrett D'Amore  */
32388447a05SGarrett D'Amore #define	AUDIOHDC_VERB_GET_PARAM			0xf00
32488447a05SGarrett D'Amore 
32588447a05SGarrett D'Amore #define	AUDIOHDC_VERB_GET_CONN_SEL		0xf01
32688447a05SGarrett D'Amore #define	AUDIOHDC_VERB_SET_CONN_SEL		0x701
32788447a05SGarrett D'Amore 
32888447a05SGarrett D'Amore #define	AUDIOHDC_VERB_GET_CONN_LIST_ENT		0xf02
32988447a05SGarrett D'Amore #define	AUDIOHDC_VERB_GET_PROCESS_STATE		0xf03
33088447a05SGarrett D'Amore #define	AUDIOHDC_VERB_GET_SDI_SEL		0xf04
33188447a05SGarrett D'Amore 
33288447a05SGarrett D'Amore #define	AUDIOHDC_VERB_GET_POWER_STATE		0xf05
33388447a05SGarrett D'Amore #define	AUDIOHDC_VERB_SET_POWER_STATE		0x705
33488447a05SGarrett D'Amore 
33588447a05SGarrett D'Amore #define	AUDIOHDC_VERB_GET_STREAM_CHANN		0xf06
33688447a05SGarrett D'Amore #define	AUDIOHDC_VERB_SET_STREAM_CHANN		0x706
33788447a05SGarrett D'Amore 
33888447a05SGarrett D'Amore #define	AUDIOHDC_VERB_GET_PIN_CTRL		0xf07
33988447a05SGarrett D'Amore #define	AUDIOHDC_VERB_SET_PIN_CTRL		0x707
34088447a05SGarrett D'Amore 
34188447a05SGarrett D'Amore #define	AUDIOHDC_VERB_GET_UNS_ENABLE		0xf08
342989b958fSZhao Edgar Liu - Sun Microsystems #define	AUDIOHDC_VERB_SET_UNS_ENABLE		0x708
34388447a05SGarrett D'Amore 
34488447a05SGarrett D'Amore #define	AUDIOHDC_VERB_GET_PIN_SENSE		0xf09
345989b958fSZhao Edgar Liu - Sun Microsystems #define	AUDIOHDC_VERB_GET_PIN_SENSE		0xf09
34688447a05SGarrett D'Amore #define	AUDIOHDC_VERB_EXEC_PIN_SENSE		0x709
34788447a05SGarrett D'Amore 
34888447a05SGarrett D'Amore #define	AUDIOHDC_VERB_GET_BEEP_GEN		0xf0a
34942c41cf8Slipeng sang - Sun Microsystems - Beijing China #define	AUDIOHDC_VERB_SET_BEEP_GEN		0x70a
35088447a05SGarrett D'Amore 
35188447a05SGarrett D'Amore #define	AUDIOHDC_VERB_GET_EAPD			0xf0c
35288447a05SGarrett D'Amore #define	AUDIOHDC_VERB_SET_EAPD			0x70c
35388447a05SGarrett D'Amore 
35488447a05SGarrett D'Amore #define	AUDIOHDC_VERB_GET_DEFAULT_CONF		0xf1c
35588447a05SGarrett D'Amore #define	AUDIOHDC_VERB_GET_SPDIF_CTL		0xf0d
35688447a05SGarrett D'Amore #define	AUDIOHDC_VERB_SET_SPDIF_LCL		0x70d
35788447a05SGarrett D'Amore 
35888447a05SGarrett D'Amore #define	AUDIOHDC_VERB_GET_GPIO_MASK		0xf16
35988447a05SGarrett D'Amore #define	AUDIOHDC_VERB_SET_GPIO_MASK		0x716
36088447a05SGarrett D'Amore 
361989b958fSZhao Edgar Liu - Sun Microsystems #define	AUDIOHDC_VERB_GET_UNSOL_ENABLE_MASK	0xf19
362989b958fSZhao Edgar Liu - Sun Microsystems #define	AUDIOHDC_VERB_SET_UNSOL_ENABLE_MASK	0x719
363989b958fSZhao Edgar Liu - Sun Microsystems 
36488447a05SGarrett D'Amore #define	AUDIOHDC_VERB_GET_GPIO_DIREC		0xf17
36588447a05SGarrett D'Amore #define	AUDIOHDC_VERB_SET_GPIO_DIREC		0x717
36688447a05SGarrett D'Amore 
36788447a05SGarrett D'Amore #define	AUDIOHDC_VERB_GET_GPIO_DATA		0xf15
36888447a05SGarrett D'Amore #define	AUDIOHDC_VERB_SET_GPIO_DATA		0x715
36988447a05SGarrett D'Amore 
37088447a05SGarrett D'Amore #define	AUDIOHDC_VERB_GET_GPIO_STCK		0xf1a
37188447a05SGarrett D'Amore #define	AUDIOHDC_VERB_SET_GPIO_STCK		0x71a
37288447a05SGarrett D'Amore 
37388447a05SGarrett D'Amore #define	AUDIOHDC_GPIO_ENABLE			0xff
37488447a05SGarrett D'Amore #define	AUDIOHDC_GPIO_DIRECT			0xf1
37588447a05SGarrett D'Amore 
37688447a05SGarrett D'Amore #define	AUDIOHDC_GPIO_DATA_CTRL			0xff
37788447a05SGarrett D'Amore #define	AUDIOHDC_GPIO_STCK_CTRL			0xff
37888447a05SGarrett D'Amore /*
37988447a05SGarrett D'Amore  * 4-bit verbs
38088447a05SGarrett D'Amore  */
38188447a05SGarrett D'Amore #define	AUDIOHDC_VERB_GET_CONV_FMT		0xa
38288447a05SGarrett D'Amore #define	AUDIOHDC_VERB_SET_CONV_FMT		0x2
38388447a05SGarrett D'Amore 
38488447a05SGarrett D'Amore #define	AUDIOHDC_VERB_GET_AMP_MUTE		0xb
38588447a05SGarrett D'Amore #define	AUDIOHDC_VERB_SET_AMP_MUTE		0x3
38642c41cf8Slipeng sang - Sun Microsystems - Beijing China #define	AUDIOHDC_VERB_SET_BEEP_VOL		0x3A0
38788447a05SGarrett D'Amore 
38888447a05SGarrett D'Amore /*
38988447a05SGarrett D'Amore  * parameters of nodes
39088447a05SGarrett D'Amore  */
39188447a05SGarrett D'Amore #define	AUDIOHDC_PAR_VENDOR_ID			0x00
39288447a05SGarrett D'Amore #define	AUDIOHDC_PAR_SUBSYS_ID			0x01
39388447a05SGarrett D'Amore #define	AUDIOHDC_PAR_REV_ID			0x02
39488447a05SGarrett D'Amore #define	AUDIOHDC_PAR_NODE_COUNT			0x04
39588447a05SGarrett D'Amore #define	AUDIOHDC_PAR_FUNCTION_TYPE		0x05
39688447a05SGarrett D'Amore #define	AUDIOHDC_PAR_AUDIO_FG_CAP		0x08
39788447a05SGarrett D'Amore #define	AUDIOHDC_PAR_AUDIO_WID_CAP		0x09
39888447a05SGarrett D'Amore #define	AUDIOHDC_PAR_PCM			0x0a
39988447a05SGarrett D'Amore #define	AUDIOHDC_PAR_STREAM			0x0b
40088447a05SGarrett D'Amore #define	AUDIOHDC_PAR_PIN_CAP			0x0c
40188447a05SGarrett D'Amore #define	AUDIOHDC_PAR_INAMP_CAP			0x0d
40288447a05SGarrett D'Amore #define	AUDIOHDC_PAR_CONNLIST_LEN		0x0e
40388447a05SGarrett D'Amore #define	AUDIOHDC_PAR_POWER_STATE		0x0f
40488447a05SGarrett D'Amore #define	AUDIOHDC_PAR_PROC_CAP			0x10
40588447a05SGarrett D'Amore #define	AUDIOHDC_PAR_GPIO_CAP			0x11
40688447a05SGarrett D'Amore #define	AUDIOHDC_PAR_OUTAMP_CAP			0x12
40788447a05SGarrett D'Amore 
40888447a05SGarrett D'Amore /*
40988447a05SGarrett D'Amore  * bits for get/set amplifier gain/mute
41088447a05SGarrett D'Amore  */
41188447a05SGarrett D'Amore #define	AUDIOHDC_AMP_SET_OUTPUT			0x8000
41288447a05SGarrett D'Amore #define	AUDIOHDC_AMP_SET_INPUT			0x4000
41388447a05SGarrett D'Amore #define	AUDIOHDC_AMP_SET_LEFT			0x2000
41488447a05SGarrett D'Amore #define	AUDIOHDC_AMP_SET_RIGHT			0x1000
41588447a05SGarrett D'Amore #define	AUDIOHDC_AMP_SET_MUTE			0x0080
41688447a05SGarrett D'Amore #define	AUDIOHDC_AMP_SET_LNR			0x3000
41788447a05SGarrett D'Amore #define	AUDIOHDC_AMP_SET_LR_INPUT		0x7000
41888447a05SGarrett D'Amore #define	AUDIOHDC_AMP_SET_LR_OUTPUT		0xb000
41988447a05SGarrett D'Amore #define	AUDIOHDC_AMP_SET_INDEX_OFFSET		8
42088447a05SGarrett D'Amore #define	AUDIOHDC_AMP_SET_GAIN_MASK		0x007f
42188447a05SGarrett D'Amore #define	AUDIOHDC_GAIN_MAX			0x7f
42288447a05SGarrett D'Amore #define	AUDIOHDC_GAIN_BITS			7
42388447a05SGarrett D'Amore #define	AUDIOHDC_GAIN_DEFAULT			0x0f
42488447a05SGarrett D'Amore 
42588447a05SGarrett D'Amore #define	AUDIOHDC_AMP_GET_OUTPUT			0x8000
42688447a05SGarrett D'Amore #define	AUDIOHDC_AMP_GET_INPUT			0x0000
42788447a05SGarrett D'Amore 
42888447a05SGarrett D'Amore /* value used to set max volume for left output */
42988447a05SGarrett D'Amore #define	AUDIOHDC_AMP_LOUT_MAX	\
43088447a05SGarrett D'Amore 	(AUDIOHDC_AMP_SET_OUTPUT | \
43188447a05SGarrett D'Amore 	AUDIOHDC_AMP_SET_LEFT | \
43288447a05SGarrett D'Amore 	AUDIOHDC_GAIN_MAX)
43388447a05SGarrett D'Amore 
43488447a05SGarrett D'Amore /* value used to set max volume for right output */
43588447a05SGarrett D'Amore #define	AUDIOHDC_AMP_ROUT_MAX	\
43688447a05SGarrett D'Amore 	(AUDIOHDC_AMP_SET_OUTPUT | \
43788447a05SGarrett D'Amore 	AUDIOHDC_AMP_SET_RIGHT | \
43888447a05SGarrett D'Amore 	AUDIOHDC_GAIN_MAX)
43988447a05SGarrett D'Amore 
44088447a05SGarrett D'Amore 
44188447a05SGarrett D'Amore /*
44288447a05SGarrett D'Amore  * Bits for pin widget control verb
44388447a05SGarrett D'Amore  */
44488447a05SGarrett D'Amore #define	AUDIOHDC_PIN_CONTROL_HP_ENABLE		0x80
44588447a05SGarrett D'Amore #define	AUDIOHDC_PIN_CONTROL_OUT_ENABLE		0x40
44688447a05SGarrett D'Amore #define	AUDIOHDC_PIN_CONTROL_IN_ENABLE		0x20
44788447a05SGarrett D'Amore 
44888447a05SGarrett D'Amore /*
44988447a05SGarrett D'Amore  * Bits for Amplifier capabilities
45088447a05SGarrett D'Amore  */
45188447a05SGarrett D'Amore #define	AUDIOHDC_AMP_CAP_MUTE_CAP		0x80000000
45288447a05SGarrett D'Amore #define	AUDIOHDC_AMP_CAP_STEP_SIZE		0x007f0000
45388447a05SGarrett D'Amore #define	AUDIOHDC_AMP_CAP_STEP_NUMS		0x00007f00
45488447a05SGarrett D'Amore #define	AUDIOHDC_AMP_CAP_0DB_OFFSET		0x0000007f
45588447a05SGarrett D'Amore 
45688447a05SGarrett D'Amore 
45788447a05SGarrett D'Amore /*
45888447a05SGarrett D'Amore  * Bits for Audio Widget Capabilities
45988447a05SGarrett D'Amore  */
46088447a05SGarrett D'Amore #define	AUDIOHD_WIDCAP_STEREO		0x00000001
46188447a05SGarrett D'Amore #define	AUDIOHD_WIDCAP_INAMP		0x00000002
46288447a05SGarrett D'Amore #define	AUDIOHD_WIDCAP_OUTAMP		0x00000004
46388447a05SGarrett D'Amore #define	AUDIOHD_WIDCAP_AMP_OVRIDE	0x00000008
46488447a05SGarrett D'Amore #define	AUDIOHD_WIDCAP_FMT_OVRIDE	0x00000010
46588447a05SGarrett D'Amore #define	AUDIOHD_WIDCAP_STRIP		0x00000020
46688447a05SGarrett D'Amore #define	AUDIOHD_WIDCAP_PROC_WID		0x00000040
46788447a05SGarrett D'Amore #define	AUDIOHD_WIDCAP_UNSOL		0x00000080
46888447a05SGarrett D'Amore #define	AUDIOHD_WIDCAP_CONNLIST		0x00000100
46988447a05SGarrett D'Amore #define	AUDIOHD_WIDCAP_DIGIT		0x00000200
47088447a05SGarrett D'Amore #define	AUDIOHD_WIDCAP_PWRCTRL		0x00000400
47188447a05SGarrett D'Amore #define	AUDIOHD_WIDCAP_LRSWAP		0x00000800
47288447a05SGarrett D'Amore #define	AUDIOHD_WIDCAP_TYPE		0x00f00000
47388447a05SGarrett D'Amore #define	AUDIOHD_WIDCAP_TO_WIDTYPE(wcap)		\
47488447a05SGarrett D'Amore 	((wcap & AUDIOHD_WIDCAP_TYPE) >> 20)
47588447a05SGarrett D'Amore 
47688447a05SGarrett D'Amore #define	AUDIOHD_CODEC_FAILURE	(uint32_t)(-1)
47788447a05SGarrett D'Amore 
478a33ad26eSZhao Edgar Liu - Sun Microsystems /* Higher sample/bits support */
479a33ad26eSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_BIT_DEPTH16	0x00020000
480a33ad26eSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_BIT_DEPTH24	0x00080000
481a33ad26eSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_SAMP_RATE48	0x00000040
482a33ad26eSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_SAMP_RATE96	0x00000100
483a33ad26eSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_SAMP_RATE192	0x00000400
484a33ad26eSZhao Edgar Liu - Sun Microsystems 
48588447a05SGarrett D'Amore /*
48688447a05SGarrett D'Amore  * buffer descriptor list entry of stream descriptor
48788447a05SGarrett D'Amore  */
48888447a05SGarrett D'Amore typedef struct {
48988447a05SGarrett D'Amore 	uint64_t	sbde_addr;
49088447a05SGarrett D'Amore 	uint32_t	sbde_len;
49188447a05SGarrett D'Amore 	uint32_t
49288447a05SGarrett D'Amore 		sbde_ioc: 1,
49388447a05SGarrett D'Amore 		reserved: 31;
49488447a05SGarrett D'Amore }sd_bdle_t;
49588447a05SGarrett D'Amore 
49688447a05SGarrett D'Amore 
49788447a05SGarrett D'Amore #define	AUDIOHD_PLAY_STARTED		0x00000001
49888447a05SGarrett D'Amore #define	AUDIOHD_PLAY_EMPTY		0x00000002
49988447a05SGarrett D'Amore #define	AUDIOHD_PLAY_PAUSED		0x00000004
50088447a05SGarrett D'Amore #define	AUDIOHD_RECORD_STARTED		0x00000008
50188447a05SGarrett D'Amore 
50288447a05SGarrett D'Amore enum audiohda_widget_type {
50388447a05SGarrett D'Amore 	WTYPE_AUDIO_OUT = 0,
50488447a05SGarrett D'Amore 	WTYPE_AUDIO_IN,
50588447a05SGarrett D'Amore 	WTYPE_AUDIO_MIX,
50688447a05SGarrett D'Amore 	WTYPE_AUDIO_SEL,
50788447a05SGarrett D'Amore 	WTYPE_PIN,
50888447a05SGarrett D'Amore 	WTYPE_POWER,
50988447a05SGarrett D'Amore 	WTYPE_VOL_KNOB,
51088447a05SGarrett D'Amore 	WTYPE_BEEP,
51188447a05SGarrett D'Amore 	WTYPE_VENDOR = 0xf
51288447a05SGarrett D'Amore };
51388447a05SGarrett D'Amore 
51488447a05SGarrett D'Amore enum audiohda_device_type {
51588447a05SGarrett D'Amore 	DTYPE_LINEOUT = 0,
51688447a05SGarrett D'Amore 	DTYPE_SPEAKER,
51788447a05SGarrett D'Amore 	DTYPE_HP_OUT,
51888447a05SGarrett D'Amore 	DTYPE_CD,
51988447a05SGarrett D'Amore 	DTYPE_SPDIF_OUT,
52088447a05SGarrett D'Amore 	DTYPE_DIGIT_OUT,
52188447a05SGarrett D'Amore 	DTYPE_MODEM_SIDE,
52288447a05SGarrett D'Amore 	DTYPE_MODEM_HNAD_SIDE,
52388447a05SGarrett D'Amore 	DTYPE_LINE_IN,
52488447a05SGarrett D'Amore 	DTYPE_AUX,
52588447a05SGarrett D'Amore 	DTYPE_MIC_IN,
52688447a05SGarrett D'Amore 	DTYPE_TEL,
52788447a05SGarrett D'Amore 	DTYPE_SPDIF_IN,
52888447a05SGarrett D'Amore 	DTYPE_DIGIT_IN,
52988447a05SGarrett D'Amore 	DTYPE_OTHER = 0x0f,
53088447a05SGarrett D'Amore };
53188447a05SGarrett D'Amore 
53288447a05SGarrett D'Amore enum audiohd_pin_color {
53388447a05SGarrett D'Amore 	AUDIOHD_PIN_UNKNOWN = 0,
53488447a05SGarrett D'Amore 	AUDIOHD_PIN_BLACK,
53588447a05SGarrett D'Amore 	AUDIOHD_PIN_GREY,
53688447a05SGarrett D'Amore 	AUDIOHD_PIN_BLUE,
53788447a05SGarrett D'Amore 	AUDIOHD_PIN_GREEN,
53888447a05SGarrett D'Amore 	AUDIOHD_PIN_RED,
53988447a05SGarrett D'Amore 	AUDIOHD_PIN_ORANGE,
54088447a05SGarrett D'Amore 	AUDIOHD_PIN_YELLOW,
54188447a05SGarrett D'Amore 	AUDIOHD_PIN_PURPLE,
54288447a05SGarrett D'Amore 	AUDIOHD_PIN_PINK,
54388447a05SGarrett D'Amore 	AUDIOHD_PIN_WHITE = 0xe,
54488447a05SGarrett D'Amore 	AUDIOHD_PIN_OTHER = 0xf,
54588447a05SGarrett D'Amore };
54688447a05SGarrett D'Amore 
54788447a05SGarrett D'Amore /* values for audiohd_widget.path_flags */
54888447a05SGarrett D'Amore #define	AUDIOHD_PATH_DAC	(1 << 0)
54988447a05SGarrett D'Amore #define	AUDIOHD_PATH_ADC	(1 << 1)
55088447a05SGarrett D'Amore #define	AUDIOHD_PATH_MON	(1 << 2)
55188447a05SGarrett D'Amore #define	AUDIOHD_PATH_NOMON	(1 << 3)
55242c41cf8Slipeng sang - Sun Microsystems - Beijing China #define	AUDIOHD_PATH_BEEP	(1 << 4)
553*e7236f70SZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_PATH_LOOPBACK	(1 << 5)
55488447a05SGarrett D'Amore 
55588447a05SGarrett D'Amore typedef struct audiohd_path	audiohd_path_t;
55688447a05SGarrett D'Amore typedef struct audiohd_widget	audiohd_widget_t;
55788447a05SGarrett D'Amore typedef struct audiohd_state	audiohd_state_t;
558cbe6566fSZhao Edgar Liu - Sun Microsystems typedef struct audiohd_codec_info	audiohd_codec_info_t;
55988447a05SGarrett D'Amore typedef struct audiohd_pin	audiohd_pin_t;
56088447a05SGarrett D'Amore typedef struct hda_codec	hda_codec_t;
56188447a05SGarrett D'Amore typedef uint32_t	wid_t;		/* id of widget */
56288447a05SGarrett D'Amore typedef	struct audiohd_entry_prop	audiohd_entry_prop_t;
56388447a05SGarrett D'Amore typedef	enum audiohda_device_type	audiohda_device_type_t;
56488447a05SGarrett D'Amore typedef	enum audiohd_pin_color		audiohd_pin_color_t;
56588447a05SGarrett D'Amore 
56688447a05SGarrett D'Amore #define	AUDIOHD_MAX_WIDGET		128
56788447a05SGarrett D'Amore #define	AUDIOHD_MAX_CONN		16
56888447a05SGarrett D'Amore #define	AUDIOHD_MAX_PINS		16
56988447a05SGarrett D'Amore #define	AUDIOHD_MAX_DEPTH		8
57088447a05SGarrett D'Amore 
57188447a05SGarrett D'Amore struct audiohd_entry_prop {
57288447a05SGarrett D'Amore 	uint32_t	conn_len;
57388447a05SGarrett D'Amore 	uint32_t	mask_range;
57488447a05SGarrett D'Amore 	uint32_t	mask_wid;
57588447a05SGarrett D'Amore 	wid_t		input_wid;
57688447a05SGarrett D'Amore 	int		conns_per_entry;
57788447a05SGarrett D'Amore 	int		bits_per_conn;
57888447a05SGarrett D'Amore };
57988447a05SGarrett D'Amore struct audiohd_widget {
58088447a05SGarrett D'Amore 	wid_t		wid_wid;
58188447a05SGarrett D'Amore 	hda_codec_t	*codec;
58288447a05SGarrett D'Amore 	enum audiohda_widget_type type;
58388447a05SGarrett D'Amore 
58488447a05SGarrett D'Amore 	uint32_t	widget_cap;
58588447a05SGarrett D'Amore 	uint32_t	pcm_format;
58688447a05SGarrett D'Amore 	uint32_t	inamp_cap;
58788447a05SGarrett D'Amore 	uint32_t	outamp_cap;
58888447a05SGarrett D'Amore 
58988447a05SGarrett D'Amore 	uint32_t	path_flags;
59088447a05SGarrett D'Amore 
59188447a05SGarrett D'Amore 	int		out_weight;
59288447a05SGarrett D'Amore 	int		in_weight;
59388447a05SGarrett D'Amore 	int		finish;
59488447a05SGarrett D'Amore 
59588447a05SGarrett D'Amore 	/*
59688447a05SGarrett D'Amore 	 * available (input) connections. 0 means this widget
59788447a05SGarrett D'Amore 	 * has fixed connection
59888447a05SGarrett D'Amore 	 */
59988447a05SGarrett D'Amore 	int		nconns;
60088447a05SGarrett D'Amore 
60188447a05SGarrett D'Amore 	/*
602b96a6eceSZhao Edgar Liu - Sun Microsystems 	 * wid of possible & selected input & output connections
603b96a6eceSZhao Edgar Liu - Sun Microsystems 	 */
604b96a6eceSZhao Edgar Liu - Sun Microsystems 	wid_t		avail_conn[AUDIOHD_MAX_CONN];
605b96a6eceSZhao Edgar Liu - Sun Microsystems 	wid_t		output_path_next;	/* output pin -> DAC */
606b96a6eceSZhao Edgar Liu - Sun Microsystems 	wid_t		input_path_next;	/* ADC -> input pin */
607b96a6eceSZhao Edgar Liu - Sun Microsystems 	wid_t		monitor_path_next[AUDIOHD_MAX_CONN];
608b96a6eceSZhao Edgar Liu - Sun Microsystems 						/* output pin -> input pin */
609b96a6eceSZhao Edgar Liu - Sun Microsystems 	wid_t		beep_path_next;		/* output pin -> beep widget */
610*e7236f70SZhao Edgar Liu - Sun Microsystems 	wid_t		loopback_path_next;	/* ADC -> output pin */
611b96a6eceSZhao Edgar Liu - Sun Microsystems 
612b96a6eceSZhao Edgar Liu - Sun Microsystems 	uint16_t 	used;
613b96a6eceSZhao Edgar Liu - Sun Microsystems 
614b96a6eceSZhao Edgar Liu - Sun Microsystems 	/*
61588447a05SGarrett D'Amore 	 * pointer to struct depending on widget type:
616*e7236f70SZhao Edgar Liu - Sun Microsystems 	 *	1. DAC	audiohd_path_t
617*e7236f70SZhao Edgar Liu - Sun Microsystems 	 *	2. ADC	audiohd_path_t
61888447a05SGarrett D'Amore 	 *	3. PIN	audiohd_pin_t
61988447a05SGarrett D'Amore 	 */
62088447a05SGarrett D'Amore 	void	*priv;
62188447a05SGarrett D'Amore };
62288447a05SGarrett D'Amore 
62388447a05SGarrett D'Amore #define	AUDIOHD_FLAG_LINEOUT		(1 << 0)
62488447a05SGarrett D'Amore #define	AUDIOHD_FLAG_SPEAKER		(1 << 1)
62588447a05SGarrett D'Amore #define	AUDIOHD_FLAG_HP			(1 << 2)
62688447a05SGarrett D'Amore #define	AUDIOHD_FLAG_MONO		(1 << 3)
62788447a05SGarrett D'Amore 
62888447a05SGarrett D'Amore #define	AUDIOHD_MAX_MIXER		5
62988447a05SGarrett D'Amore #define	AUDIOHD_MAX_PIN			4
63088447a05SGarrett D'Amore 
63188447a05SGarrett D'Amore #define	PORT_DAC		0
63288447a05SGarrett D'Amore #define	PORT_ADC		1
63388447a05SGarrett D'Amore #define	PORT_MAX		2
63488447a05SGarrett D'Amore typedef enum {
63588447a05SGarrett D'Amore 	PLAY = 0,
63688447a05SGarrett D'Amore 	RECORD = 1,
63742c41cf8Slipeng sang - Sun Microsystems - Beijing China 	BEEP = 2,
638*e7236f70SZhao Edgar Liu - Sun Microsystems 	LOOPBACK = 3,
63988447a05SGarrett D'Amore } path_type_t;
64088447a05SGarrett D'Amore 
64188447a05SGarrett D'Amore struct audiohd_path {
64288447a05SGarrett D'Amore 	wid_t			adda_wid;
64342c41cf8Slipeng sang - Sun Microsystems - Beijing China 	wid_t			beep_wid;
64488447a05SGarrett D'Amore 
64588447a05SGarrett D'Amore 	wid_t			pin_wid[AUDIOHD_MAX_PINS];
64688447a05SGarrett D'Amore 	int			sum_selconn[AUDIOHD_MAX_PINS];
64788447a05SGarrett D'Amore 	int			mon_wid[AUDIOHD_MAX_PIN][AUDIOHD_MAX_MIXER];
64888447a05SGarrett D'Amore 	int			pin_nums;
64988447a05SGarrett D'Amore 	int			maxmixer[AUDIOHD_MAX_PINS];
65088447a05SGarrett D'Amore 
65188447a05SGarrett D'Amore 	path_type_t		path_type;
65288447a05SGarrett D'Amore 
65388447a05SGarrett D'Amore 	wid_t			mute_wid;
65488447a05SGarrett D'Amore 	int			mute_dir;
65588447a05SGarrett D'Amore 	wid_t			gain_wid;
65688447a05SGarrett D'Amore 	int			gain_dir;
65788447a05SGarrett D'Amore 	uint32_t		gain_bits;
65888447a05SGarrett D'Amore 
65988447a05SGarrett D'Amore 	uint32_t		pin_outputs;
66088447a05SGarrett D'Amore 	uint8_t			tag;
66188447a05SGarrett D'Amore 
66288447a05SGarrett D'Amore 	hda_codec_t		*codec;
66388447a05SGarrett D'Amore 
66488447a05SGarrett D'Amore 	wid_t			sum_wid;
66588447a05SGarrett D'Amore 
66688447a05SGarrett D'Amore 	audiohd_state_t		*statep;
66788447a05SGarrett D'Amore };
66888447a05SGarrett D'Amore 
66988447a05SGarrett D'Amore typedef struct audiohd_port
67088447a05SGarrett D'Amore {
67188447a05SGarrett D'Amore 	uint8_t			nchan;
67288447a05SGarrett D'Amore 	int			index;
67388447a05SGarrett D'Amore 	uint16_t		regoff;
67488447a05SGarrett D'Amore 
67588447a05SGarrett D'Amore 	unsigned		nframes;
67668c47f65SGarrett D'Amore 	size_t			bufsize;
67768c47f65SGarrett D'Amore 	size_t			fragsize;
67888447a05SGarrett D'Amore 	uint64_t		count;
67988447a05SGarrett D'Amore 	int			curpos;
68088447a05SGarrett D'Amore 
68188447a05SGarrett D'Amore 	uint_t			format;
68288447a05SGarrett D'Amore 	unsigned		sync_dir;
68388447a05SGarrett D'Amore 
68488447a05SGarrett D'Amore 	ddi_dma_handle_t	samp_dmah;
68588447a05SGarrett D'Amore 	ddi_acc_handle_t	samp_acch;
68688447a05SGarrett D'Amore 	caddr_t			samp_kaddr;
68788447a05SGarrett D'Amore 	uint64_t		samp_paddr;
68888447a05SGarrett D'Amore 
68988447a05SGarrett D'Amore 	ddi_dma_handle_t	bdl_dmah;
69088447a05SGarrett D'Amore 	ddi_acc_handle_t	bdl_acch;
69188447a05SGarrett D'Amore 	size_t			bdl_size;
69288447a05SGarrett D'Amore 	caddr_t			bdl_kaddr;
69388447a05SGarrett D'Amore 	uint64_t		bdl_paddr;
69488447a05SGarrett D'Amore 
69588447a05SGarrett D'Amore 	audio_engine_t		*engine;
69688447a05SGarrett D'Amore 	audiohd_state_t		*statep;
69788447a05SGarrett D'Amore }audiohd_port_t;
69888447a05SGarrett D'Amore 
699c1cfefcdSZhao Edgar Liu - Sun Microsystems enum {
700c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_VOLUME = 0,
701c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_FRONT,
702c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_SPEAKER,
703c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_HEADPHONE,
704c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_REAR,
705c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_CENTER,
706c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_SURROUND,
707c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_LFE,
708c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_IGAIN,
709c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_LINEIN,
710c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_MIC,
711c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_CD,
712c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_MONGAIN,
713c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_MONSRC,
714c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_RECSRC,
715c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_BEEP,
716*e7236f70SZhao Edgar Liu - Sun Microsystems 	CTL_LOOP,
717c1cfefcdSZhao Edgar Liu - Sun Microsystems 
718c1cfefcdSZhao Edgar Liu - Sun Microsystems 	/* this one must be last */
719c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_MAX
720c1cfefcdSZhao Edgar Liu - Sun Microsystems };
721c1cfefcdSZhao Edgar Liu - Sun Microsystems 
72288447a05SGarrett D'Amore typedef struct audiohd_ctrl
72388447a05SGarrett D'Amore {
72488447a05SGarrett D'Amore 	audiohd_state_t		*statep;
72588447a05SGarrett D'Amore 	audio_ctrl_t		*ctrl;
726c1cfefcdSZhao Edgar Liu - Sun Microsystems 	int			num;
72788447a05SGarrett D'Amore 	uint64_t		val;
72888447a05SGarrett D'Amore } audiohd_ctrl_t;
72988447a05SGarrett D'Amore 
73088447a05SGarrett D'Amore struct audiohd_pin {
73188447a05SGarrett D'Amore 	audiohd_pin_t	*next;
73288447a05SGarrett D'Amore 	wid_t		wid;
73388447a05SGarrett D'Amore 	wid_t		mute_wid;	/* node used to mute this pin */
73488447a05SGarrett D'Amore 	int		mute_dir;	/* 1: input, 2: output */
73588447a05SGarrett D'Amore 	wid_t		gain_wid;	/* node for gain control */
73688447a05SGarrett D'Amore 	int		gain_dir;	/* _OUTPUT/_INPUT */
73788447a05SGarrett D'Amore 	uint32_t	gain_bits;
73888447a05SGarrett D'Amore 
73988447a05SGarrett D'Amore 	uint8_t		vrefvalue;	/* value of VRef */
74088447a05SGarrett D'Amore 
74188447a05SGarrett D'Amore 	uint32_t	cap;
74288447a05SGarrett D'Amore 	uint32_t	config;
74388447a05SGarrett D'Amore 	uint32_t	ctrl;
74488447a05SGarrett D'Amore 	uint32_t	assoc;
74588447a05SGarrett D'Amore 	uint32_t	seq;
746*e7236f70SZhao Edgar Liu - Sun Microsystems 	wid_t		adc_wid;
747*e7236f70SZhao Edgar Liu - Sun Microsystems 	wid_t		dac_wid;
74842c41cf8Slipeng sang - Sun Microsystems - Beijing China 	wid_t		beep_wid;
74988447a05SGarrett D'Amore 	int		no_phys_conn;
75088447a05SGarrett D'Amore 	enum audiohda_device_type	device;
75188447a05SGarrett D'Amore 
75288447a05SGarrett D'Amore 	/*
75388447a05SGarrett D'Amore 	 * mg_dir, mg_gain, mg_wid are used to store the monitor gain control
75488447a05SGarrett D'Amore 	 * widget wid.
75588447a05SGarrett D'Amore 	 */
75688447a05SGarrett D'Amore 	int		mg_dir[AUDIOHD_MAX_CONN];
75788447a05SGarrett D'Amore 	int		mg_gain[AUDIOHD_MAX_CONN];
75888447a05SGarrett D'Amore 	int		mg_wid[AUDIOHD_MAX_CONN];
75988447a05SGarrett D'Amore 	int		num;
76088447a05SGarrett D'Amore 	int		finish;
76188447a05SGarrett D'Amore 
76288447a05SGarrett D'Amore };
76388447a05SGarrett D'Amore 
76488447a05SGarrett D'Amore typedef struct {
76588447a05SGarrett D'Amore 	ddi_dma_handle_t	ad_dmahdl;
76688447a05SGarrett D'Amore 	ddi_acc_handle_t	ad_acchdl;
76788447a05SGarrett D'Amore 	caddr_t			ad_vaddr;	/* virtual addr */
76888447a05SGarrett D'Amore 	uint64_t		ad_paddr;	/* physical addr */
76988447a05SGarrett D'Amore 	size_t			ad_req_sz;	/* required size of memory */
77088447a05SGarrett D'Amore 	size_t			ad_real_sz;	/* real size of memory */
77188447a05SGarrett D'Amore } audiohd_dma_t;
77288447a05SGarrett D'Amore 
77388447a05SGarrett D'Amore struct hda_codec {
77488447a05SGarrett D'Amore 	uint8_t		index;		/* codec address */
77588447a05SGarrett D'Amore 	uint32_t	vid;		/* vendor id and device id */
77688447a05SGarrett D'Amore 	uint32_t	revid;		/* revision id */
77788447a05SGarrett D'Amore 	wid_t		wid_afg;	/* id of AFG */
77888447a05SGarrett D'Amore 	wid_t		first_wid;	/* wid of 1st subnode of AFG */
77988447a05SGarrett D'Amore 	wid_t		last_wid;	/* wid of the last subnode of AFG */
78088447a05SGarrett D'Amore 	int		nnodes;		/* # of subnodes of AFG */
78188447a05SGarrett D'Amore 	uint8_t		nistream;
78288447a05SGarrett D'Amore 
78388447a05SGarrett D'Amore 	uint32_t	outamp_cap;
78488447a05SGarrett D'Amore 	uint32_t	inamp_cap;
78588447a05SGarrett D'Amore 	uint32_t	stream_format;
78688447a05SGarrett D'Amore 	uint32_t	pcm_format;
78788447a05SGarrett D'Amore 
788ea463888SZhao Edgar Liu - Sun Microsystems 	audiohd_state_t		*statep;
789cbe6566fSZhao Edgar Liu - Sun Microsystems 	audiohd_codec_info_t	*codec_info;
79088447a05SGarrett D'Amore 
79188447a05SGarrett D'Amore 	/* use wid as index to the array of widget pointers */
79288447a05SGarrett D'Amore 	audiohd_widget_t	*widget[AUDIOHD_MAX_WIDGET];
79388447a05SGarrett D'Amore 
79488447a05SGarrett D'Amore 	audiohd_port_t		*port[AUDIOHD_PORT_MAX];
79588447a05SGarrett D'Amore 	uint8_t			portnum;
79688447a05SGarrett D'Amore 	audiohd_pin_t		*first_pin;
79788447a05SGarrett D'Amore };
79888447a05SGarrett D'Amore 
79988447a05SGarrett D'Amore #define	AUDIOHD_MAX_ASSOC	15
80088447a05SGarrett D'Amore struct audiohd_state {
80188447a05SGarrett D'Amore 	dev_info_t	*hda_dip;
80288447a05SGarrett D'Amore 	kstat_t		*hda_ksp;
80388447a05SGarrett D'Amore 	kmutex_t	hda_mutex;
80488447a05SGarrett D'Amore 	uint32_t	hda_flags;
80588447a05SGarrett D'Amore 
80688447a05SGarrett D'Amore 	caddr_t			hda_reg_base;
80788447a05SGarrett D'Amore 	ddi_acc_handle_t	hda_pci_handle;
80888447a05SGarrett D'Amore 	ddi_acc_handle_t	hda_reg_handle;
809368517c9SYang-Rong Jerry Zhou 
81088447a05SGarrett D'Amore 	audiohd_dma_t	hda_dma_corb;
81188447a05SGarrett D'Amore 	audiohd_dma_t	hda_dma_rirb;
81288447a05SGarrett D'Amore 
81388447a05SGarrett D'Amore 	uint8_t		hda_rirb_rp;		/* read pointer for rirb */
81488447a05SGarrett D'Amore 	uint16_t	hda_codec_mask;
81588447a05SGarrett D'Amore 
81688447a05SGarrett D'Amore 	audio_dev_t	*adev;
81789e1f902SZhao Edgar Liu - Sun Microsystems 	uint32_t	devid;
81888447a05SGarrett D'Amore 
81988447a05SGarrett D'Amore 	int		hda_input_streams;	/* # of input stream */
82088447a05SGarrett D'Amore 	int		hda_output_streams;	/* # of output stream */
82188447a05SGarrett D'Amore 	int		hda_streams_nums;	/* # of stream */
82288447a05SGarrett D'Amore 
82388447a05SGarrett D'Amore 	uint_t		hda_play_regbase;
82488447a05SGarrett D'Amore 	uint_t		hda_record_regbase;
82588447a05SGarrett D'Amore 
82688447a05SGarrett D'Amore 	uint_t		hda_play_stag;		/* tag of playback stream */
82788447a05SGarrett D'Amore 	uint_t		hda_record_stag;	/* tag of record stream */
82888447a05SGarrett D'Amore 	uint_t		hda_play_lgain;		/* left gain for playback */
82988447a05SGarrett D'Amore 	uint_t		hda_play_rgain;		/* right gain for playback */
83088447a05SGarrett D'Amore 
83188447a05SGarrett D'Amore 	/*
83288447a05SGarrett D'Amore 	 * Now, for the time being, we add some fields
83388447a05SGarrett D'Amore 	 * for parsing codec topology
83488447a05SGarrett D'Amore 	 */
83588447a05SGarrett D'Amore 	hda_codec_t	*codec[AUDIOHD_CODEC_MAX];
836b96a6eceSZhao Edgar Liu - Sun Microsystems 
83788447a05SGarrett D'Amore 	/*
83888447a05SGarrett D'Amore 	 * Suspend/Resume used fields
83988447a05SGarrett D'Amore 	 */
84088447a05SGarrett D'Amore 	boolean_t	suspended;
84188447a05SGarrett D'Amore 
84288447a05SGarrett D'Amore 	audiohd_path_t	*path[AUDIOHD_PORT_MAX];
84388447a05SGarrett D'Amore 	uint8_t		pathnum;
84488447a05SGarrett D'Amore 	audiohd_port_t	*port[PORT_MAX];
84588447a05SGarrett D'Amore 	uint8_t		pchan;
84688447a05SGarrett D'Amore 	uint8_t		rchan;
84788447a05SGarrett D'Amore 
84888447a05SGarrett D'Amore 	uint64_t	inmask;
84988447a05SGarrett D'Amore 
85088447a05SGarrett D'Amore 	uint_t		hda_out_ports;
85188447a05SGarrett D'Amore 	uint_t		in_port;
85288447a05SGarrett D'Amore 
853a33ad26eSZhao Edgar Liu - Sun Microsystems 	/* Higher sample/rate */
854a33ad26eSZhao Edgar Liu - Sun Microsystems 	uint32_t	sample_rate;
855a33ad26eSZhao Edgar Liu - Sun Microsystems 	uint32_t	sample_bit_depth;
856a33ad26eSZhao Edgar Liu - Sun Microsystems 	uint8_t		sample_packed_bytes;
857a33ad26eSZhao Edgar Liu - Sun Microsystems 
85888447a05SGarrett D'Amore 	/*
85988447a05SGarrett D'Amore 	 * Controls
86088447a05SGarrett D'Amore 	 */
861c1cfefcdSZhao Edgar Liu - Sun Microsystems 	audiohd_ctrl_t	ctrls[CTL_MAX];
862*e7236f70SZhao Edgar Liu - Sun Microsystems 	boolean_t	monitor_supported;
863*e7236f70SZhao Edgar Liu - Sun Microsystems 	boolean_t	loopback_supported;
86488447a05SGarrett D'Amore 
86588447a05SGarrett D'Amore 	/* for multichannel */
86688447a05SGarrett D'Amore 	uint8_t			chann[AUDIOHD_MAX_ASSOC];
86788447a05SGarrett D'Amore 	uint8_t			assoc;
86888447a05SGarrett D'Amore 
86988447a05SGarrett D'Amore };
87088447a05SGarrett D'Amore 
871cbe6566fSZhao Edgar Liu - Sun Microsystems struct audiohd_codec_info {
872cbe6566fSZhao Edgar Liu - Sun Microsystems 	uint32_t	devid;
873cbe6566fSZhao Edgar Liu - Sun Microsystems 	const char	*buf;
874cbe6566fSZhao Edgar Liu - Sun Microsystems 	uint32_t	flags;
875cbe6566fSZhao Edgar Liu - Sun Microsystems };
87688447a05SGarrett D'Amore 
87788447a05SGarrett D'Amore /*
87888447a05SGarrett D'Amore  * Operation for high definition audio control system bus
87988447a05SGarrett D'Amore  * interface registers
88088447a05SGarrett D'Amore  */
88188447a05SGarrett D'Amore #define	AUDIOHD_REG_GET8(reg)	\
88288447a05SGarrett D'Amore 	ddi_get8(statep->hda_reg_handle, \
88388447a05SGarrett D'Amore 	(void *)((char *)statep->hda_reg_base + (reg)))
88488447a05SGarrett D'Amore 
88588447a05SGarrett D'Amore #define	AUDIOHD_REG_GET16(reg)	\
88688447a05SGarrett D'Amore 	ddi_get16(statep->hda_reg_handle, \
88788447a05SGarrett D'Amore 	(void *)((char *)statep->hda_reg_base + (reg)))
88888447a05SGarrett D'Amore 
88988447a05SGarrett D'Amore #define	AUDIOHD_REG_GET32(reg)	\
89088447a05SGarrett D'Amore 	ddi_get32(statep->hda_reg_handle, \
89188447a05SGarrett D'Amore 	(void *)((char *)statep->hda_reg_base + (reg)))
89288447a05SGarrett D'Amore 
89388447a05SGarrett D'Amore #define	AUDIOHD_REG_GET64(reg)	\
89488447a05SGarrett D'Amore 	ddi_get64(statep->hda_reg_handle, \
89588447a05SGarrett D'Amore 	(void *)((char *)statep->hda_reg_base + (reg)))
89688447a05SGarrett D'Amore 
89788447a05SGarrett D'Amore #define	AUDIOHD_REG_SET8(reg, val)	\
89888447a05SGarrett D'Amore 	ddi_put8(statep->hda_reg_handle, \
89988447a05SGarrett D'Amore 	(void *)((char *)statep->hda_reg_base + (reg)), (val))
90088447a05SGarrett D'Amore 
90188447a05SGarrett D'Amore #define	AUDIOHD_REG_SET16(reg, val)	\
90288447a05SGarrett D'Amore 	ddi_put16(statep->hda_reg_handle, \
90388447a05SGarrett D'Amore 	(void *)((char *)statep->hda_reg_base + (reg)), (val))
90488447a05SGarrett D'Amore 
90588447a05SGarrett D'Amore #define	AUDIOHD_REG_SET32(reg, val)	\
90688447a05SGarrett D'Amore 	ddi_put32(statep->hda_reg_handle, \
90788447a05SGarrett D'Amore 	(void *)((char *)statep->hda_reg_base + (reg)), (val))
90888447a05SGarrett D'Amore 
90988447a05SGarrett D'Amore #define	AUDIOHD_REG_SET64(reg, val)	\
91088447a05SGarrett D'Amore 	ddi_put64(statep->hda_reg_handle, \
91188447a05SGarrett D'Amore 	(void *)((char *)statep->hda_reg_base + (reg)), (val))
91288447a05SGarrett D'Amore 
91388447a05SGarrett D'Amore 
91488447a05SGarrett D'Amore /*
91588447a05SGarrett D'Amore  * enable a pin widget to input
91688447a05SGarrett D'Amore  */
91788447a05SGarrett D'Amore #define	AUDIOHD_ENABLE_PIN_IN(statep, caddr, wid) \
91888447a05SGarrett D'Amore { \
91988447a05SGarrett D'Amore 	(void) audioha_codec_verb_get(statep, caddr, wid, \
92088447a05SGarrett D'Amore 	    AUDIOHDC_VERB_SET_PIN_CTRL, AUDIOHDC_PIN_CONTROL_IN_ENABLE | 4); \
92188447a05SGarrett D'Amore }
92288447a05SGarrett D'Amore 
92388447a05SGarrett D'Amore /*
92488447a05SGarrett D'Amore  * disable input pin
92588447a05SGarrett D'Amore  */
92688447a05SGarrett D'Amore #define	AUDIOHD_DISABLE_PIN_IN(statep, caddr, wid) \
92788447a05SGarrett D'Amore { \
92888447a05SGarrett D'Amore 	uint32_t	lTmp; \
92988447a05SGarrett D'Amore \
93088447a05SGarrett D'Amore 	lTmp = audioha_codec_verb_get(statep, caddr, wid, \
93188447a05SGarrett D'Amore 	    AUDIOHDC_VERB_GET_PIN_CTRL, 0); \
93288447a05SGarrett D'Amore 	if (lTmp == AUDIOHD_CODEC_FAILURE) \
933c6e681c0SYang-Rong Jerry Zhou 		return (DDI_FAILURE); \
93488447a05SGarrett D'Amore 	lTmp = audioha_codec_verb_get(statep, caddr, wid, \
93588447a05SGarrett D'Amore 	    AUDIOHDC_VERB_SET_PIN_CTRL, \
93688447a05SGarrett D'Amore 	    (lTmp & ~AUDIOHDC_PIN_CONTROL_IN_ENABLE)); \
93788447a05SGarrett D'Amore 	if (lTmp == AUDIOHD_CODEC_FAILURE) \
938c6e681c0SYang-Rong Jerry Zhou 		return (DDI_FAILURE); \
93988447a05SGarrett D'Amore }
94088447a05SGarrett D'Amore 
94188447a05SGarrett D'Amore /*
94288447a05SGarrett D'Amore  * unmute an output pin
94388447a05SGarrett D'Amore  */
94488447a05SGarrett D'Amore #define	AUDIOHD_NODE_UNMUTE_OUT(statep, caddr, wid) \
94588447a05SGarrett D'Amore { \
94688447a05SGarrett D'Amore 	if (audioha_codec_4bit_verb_get(statep, \
94788447a05SGarrett D'Amore 	    caddr, wid, AUDIOHDC_VERB_SET_AMP_MUTE, \
94888447a05SGarrett D'Amore 	    AUDIOHDC_AMP_SET_LR_OUTPUT | AUDIOHDC_GAIN_MAX) == \
94988447a05SGarrett D'Amore 	    AUDIOHD_CODEC_FAILURE) \
950c6e681c0SYang-Rong Jerry Zhou 		return (DDI_FAILURE); \
95188447a05SGarrett D'Amore }
95288447a05SGarrett D'Amore 
953c7b817cfSZhao Edgar Liu - Sun Microsystems /*
954c7b817cfSZhao Edgar Liu - Sun Microsystems  * check volume adjust value of 2 channels control
955c7b817cfSZhao Edgar Liu - Sun Microsystems  */
956c7b817cfSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_CHECK_2CHANNELS_VOLUME(value) \
957c7b817cfSZhao Edgar Liu - Sun Microsystems { \
958c7b817cfSZhao Edgar Liu - Sun Microsystems 	if ((value) & ~0xffff) \
959c7b817cfSZhao Edgar Liu - Sun Microsystems 		return (EINVAL); \
960c7b817cfSZhao Edgar Liu - Sun Microsystems 	if ((((value) & 0xff00) >> 8) > 100 || \
961c7b817cfSZhao Edgar Liu - Sun Microsystems 	    ((value) & 0xff) > 100) \
962c7b817cfSZhao Edgar Liu - Sun Microsystems 		return (EINVAL); \
963c7b817cfSZhao Edgar Liu - Sun Microsystems }
964c7b817cfSZhao Edgar Liu - Sun Microsystems 
965c7b817cfSZhao Edgar Liu - Sun Microsystems /*
966c7b817cfSZhao Edgar Liu - Sun Microsystems  * check volume adjust value of mono channel control
967c7b817cfSZhao Edgar Liu - Sun Microsystems  */
968c7b817cfSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_CHECK_CHANNEL_VOLUME(value) \
969c7b817cfSZhao Edgar Liu - Sun Microsystems { \
970c7b817cfSZhao Edgar Liu - Sun Microsystems 	if ((value) & ~0xff) \
971c7b817cfSZhao Edgar Liu - Sun Microsystems 		return (EINVAL); \
972c7b817cfSZhao Edgar Liu - Sun Microsystems 	if (((value) & 0xff) > 100) \
973c7b817cfSZhao Edgar Liu - Sun Microsystems 		return (EINVAL); \
974c7b817cfSZhao Edgar Liu - Sun Microsystems }
975c7b817cfSZhao Edgar Liu - Sun Microsystems 
97688447a05SGarrett D'Amore #ifdef __cplusplus
97788447a05SGarrett D'Amore }
97888447a05SGarrett D'Amore #endif
97988447a05SGarrett D'Amore 
980ea463888SZhao Edgar Liu - Sun Microsystems /* Warlock annotation */
981ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(audiohd_ctrl::statep))
982ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(audiohd_state::inmask))
983ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(audiohd_state::adev))
984ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(audiohd_state::sample_bit_depth))
985ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(audiohd_state::sample_rate))
986ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(READ_ONLY_DATA(audiohd_state::hda_reg_handle))
987ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(audiohd_widget::codec))
988ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(audiohd_widget::wid_wid))
989ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(hda_codec::index))
990ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(hda_codec::statep))
991ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(hda_codec::vid))
992ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(audiohd_port::nchan))
993ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(audiohd_port::statep))
994ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(audiohd_port::sync_dir))
995ea463888SZhao Edgar Liu - Sun Microsystems 
99688447a05SGarrett D'Amore #endif	/* _SYS_AUDIOHD_IMPL_H_ */
997