xref: /illumos-gate/usr/src/uts/common/io/audio/drv/audioixp/audioixp.h (revision 68c47f65208790c466e5e484f2293d3baed71c6a)
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 /*
22*68c47f65SGarrett D'Amore  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
2388447a05SGarrett D'Amore  * Use is subject to license terms.
2488447a05SGarrett D'Amore  */
2588447a05SGarrett D'Amore 
2688447a05SGarrett D'Amore #ifndef	_AUDIOIXP_H_
2788447a05SGarrett D'Amore #define	_AUDIOIXP_H_
2888447a05SGarrett D'Amore 
2988447a05SGarrett D'Amore /*
3088447a05SGarrett D'Amore  * Header file for the audioixp device driver
3188447a05SGarrett D'Amore  */
3288447a05SGarrett D'Amore 
3388447a05SGarrett D'Amore #define	IXP_DEV_CONFIG		"onboard1"
3488447a05SGarrett D'Amore #define	IXP_DEV_VERSION		"a"
3588447a05SGarrett D'Amore 
3688447a05SGarrett D'Amore /*
3788447a05SGarrett D'Amore  * Driver supported configuration information
3888447a05SGarrett D'Amore  */
3988447a05SGarrett D'Amore #define	IXP_NAME		"audioixp"
4088447a05SGarrett D'Amore #define	IXP_MOD_NAME		"ATI IXP audio driver"
4188447a05SGarrett D'Amore #define	IXP_CONFIG_REGS		(0)	/* PCI configure register */
4288447a05SGarrett D'Amore #define	IXP_IO_AM_REGS		(1)	/* PCI base register 0x10 */
4388447a05SGarrett D'Amore 
4488447a05SGarrett D'Amore #define	IXP_PLAY		0
4588447a05SGarrett D'Amore #define	IXP_REC			1
4688447a05SGarrett D'Amore 
4788447a05SGarrett D'Amore #define	IXP_BD_NUMS			(8)
4888447a05SGarrett D'Amore 
4988447a05SGarrett D'Amore /*
5088447a05SGarrett D'Amore  * PCI configuration registers and bits
5188447a05SGarrett D'Amore  */
5288447a05SGarrett D'Amore #define	IXP_PCI_ID_200		(0x10024341U)
5388447a05SGarrett D'Amore #define	IXP_PCI_ID_300		(0x10024361U)
5488447a05SGarrett D'Amore #define	IXP_PCI_ID_400		(0x10024370U)
5588447a05SGarrett D'Amore #define	IXP_PCI_ID_SB600	(0x10024382U)
5688447a05SGarrett D'Amore 
5788447a05SGarrett D'Amore /*
5888447a05SGarrett D'Amore  * Audio controller registers and bits
5988447a05SGarrett D'Amore  */
6088447a05SGarrett D'Amore #define	IXP_AUDIO_INT				(0x00)
6188447a05SGarrett D'Amore #define	IXP_AUDIO_INT_IN_DMA_OVERFLOW		(1U<<0)
6288447a05SGarrett D'Amore #define	IXP_AUDIO_INT_IN_DMA			(1U<<1)
6388447a05SGarrett D'Amore #define	IXP_AUDIO_INT_OUT_DMA_UNDERFLOW		(1U<<2)
6488447a05SGarrett D'Amore #define	IXP_AUDIO_INT_OUT_DMA			(1U<<3)
6588447a05SGarrett D'Amore #define	IXP_AUDIO_INT_CODEC0_NOT_READY		(1U<<10)
6688447a05SGarrett D'Amore #define	IXP_AUDIO_INT_CODEC1_NOT_READY		(1U<<11)
6788447a05SGarrett D'Amore #define	IXP_AUDIO_INT_CODEC2_NOT_READY		(1U<<12)
6888447a05SGarrett D'Amore #define	IXP_AUDIO_INT_NEW_FRAME			(1U<<13)
6988447a05SGarrett D'Amore 
7088447a05SGarrett D'Amore #define	IXP_AUDIO_INT_EN			(0x04)
7188447a05SGarrett D'Amore #define	IXP_AUDIO_INT_EN_IN_DMA_OVERFLOW	(1U<<0)
7288447a05SGarrett D'Amore #define	IXP_AUDIO_INT_EN_STATUS			(1U<<1)
7388447a05SGarrett D'Amore #define	IXP_AUDIO_INT_EN_OUT_DMA_UNDERFLOW	(1U<<2)
7488447a05SGarrett D'Amore #define	IXP_AUDIO_INT_EN_CODEC0_NOT_READY	(1U<<10)
7588447a05SGarrett D'Amore #define	IXP_AUDIO_INT_EN_CODEC1_NOT_READY	(1U<<11)
7688447a05SGarrett D'Amore #define	IXP_AUDIO_INT_EN_CODEC2_NOT_READY	(1U<<12)
7788447a05SGarrett D'Amore #define	IXP_AUDIO_INT_EN_NEW_FRAME		(1U<<13)
7888447a05SGarrett D'Amore 
7988447a05SGarrett D'Amore #define	IXP_AUDIO_CMD				(0x08)
8088447a05SGarrett D'Amore #define	IXP_AUDIO_CMD_POWER_DOWN		(1U<<0)
8188447a05SGarrett D'Amore #define	IXP_AUDIO_CMD_EN_IN			(1U<<1)
8288447a05SGarrett D'Amore #define	IXP_AUDIO_CMD_EN_OUT			(1U<<2)
8388447a05SGarrett D'Amore #define	IXP_AUDIO_CMD_EN_IN_DMA			(1U<<8)
8488447a05SGarrett D'Amore #define	IXP_AUDIO_CMD_EN_OUT_DMA		(1U<<9)
8588447a05SGarrett D'Amore #define	IXP_AUDIO_CMD_INTER_IN			(1U<<21)
8688447a05SGarrett D'Amore #define	IXP_AUDIO_CMD_INTER_OUT			(1U<<22)
8788447a05SGarrett D'Amore #define	IXP_AUDIO_CMD_BURST_EN			(1U<<25)
8888447a05SGarrett D'Amore #define	IXP_AUDIO_CMD_AC_ACTIVE			(1U<<28)
8988447a05SGarrett D'Amore #define	IXP_AUDIO_CMD_AC_SOFT_RESET		(1U<<29)
9088447a05SGarrett D'Amore #define	IXP_AUDIO_CMD_AC_SYNC			(1U<<30)
9188447a05SGarrett D'Amore #define	IXP_AUDIO_CMD_AC_RESET			(1U<<31)
9288447a05SGarrett D'Amore 
9388447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_PHY_ADDR_DATA		(0x0c)
9488447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_PHY_PRIMARY_CODEC	(0u)
9588447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_PHY_SECOND_CODEC	(1u)
9688447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_PHY_THIRD_CODEC	(2u)
9788447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_PHY_READ		(1u<<2)
9888447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_PHY_WRITE		(0u)
9988447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_PHY_EN			(1u<<8)
10088447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_PHY_ADDR_SHIFT		(9)
10188447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_PHY_ADDR_MASK		(0x7fu<<9)
10288447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_PHY_DATA_SHIFT		(16)
10388447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_PHY_DATA_MASK		(0xffffu<<16)
10488447a05SGarrett D'Amore 
10588447a05SGarrett D'Amore #define	IXP_AUDIO_IN_PHY_ADDR_DATA		(0x10)
10688447a05SGarrett D'Amore #define	IXP_AUDIO_IN_PHY_READY			(1u<<8)
10788447a05SGarrett D'Amore #define	IXP_AUDIO_IN_PHY_ADDR_SHIFT		(9)
10888447a05SGarrett D'Amore #define	IXP_AUDIO_IN_PHY_ADDR_MASK		(0x7fu<<9)
10988447a05SGarrett D'Amore #define	IXP_AUDIO_IN_PHY_DATA_SHIFT		(16)
11088447a05SGarrett D'Amore #define	IXP_AUDIO_IN_PHY_DATA_MASK		(0xffffu<<16)
11188447a05SGarrett D'Amore 
11288447a05SGarrett D'Amore #define	IXP_AUDIO_SLOTREQ			(0x14)
11388447a05SGarrett D'Amore #define	IXP_AUDIO_COUNTER			(0x18)
11488447a05SGarrett D'Amore #define	IXP_AUDIO_IN_FIFO_THRESHOLD		(0x1c)
11588447a05SGarrett D'Amore #define	IXP_AUDIO_IN_DMA_LINK_P			(0x20)
11688447a05SGarrett D'Amore #define	IXP_AUDIO_IN_DMA_LINK_P_EN		(1u<<0)
11788447a05SGarrett D'Amore 
11888447a05SGarrett D'Amore #define	IXP_AUDIO_IN_DMA_DT_START		(0x24)
11988447a05SGarrett D'Amore #define	IXP_AUDIO_IN_DMA_DT_NEXT		(0x28)
12088447a05SGarrett D'Amore #define	IXP_AUDIO_IN_DMA_DT_CUR			(0x2c)
12188447a05SGarrett D'Amore #define	IXP_AUDIO_IN_DT_SIZE_FIFO_INFO		(0x30)
12288447a05SGarrett D'Amore 
12388447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_DMA_SLOT_EN_THRESHOLD	(0x34)
12488447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_DMA_SLOT_3		(1U<<0)
12588447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_DMA_SLOT_4		(1U<<1)
12688447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_DMA_SLOT_5		(1U<<2)
12788447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_DMA_SLOT_6		(1U<<3)
12888447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_DMA_SLOT_7		(1U<<4)
12988447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_DMA_SLOT_8		(1U<<5)
13088447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_DMA_SLOT_9		(1U<<6)
13188447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_DMA_SLOT_10		(1U<<7)
13288447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_DMA_SLOT_11		(1U<<8)
13388447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_DMA_SLOT_12		(1U<<9)
13488447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_DMA_THRESHOLD_MASK	(0x7fU<<11)
13588447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_DMA_THRESHOLD_SHIFT	(11)
13688447a05SGarrett D'Amore 
13788447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_DMA_LINK_P		(0x38)
13888447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_DMA_LINK_P_EN		(1U<<0)
13988447a05SGarrett D'Amore 
14088447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_DMA_DT_START		(0x3c)
14188447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_DMA_DT_NEXT		(0x40)
14288447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_DMA_DT_CUR		(0x44)
14388447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_DT_SIZE_USED_FREE		(0x48)
14488447a05SGarrett D'Amore #define	IXP_AUDIO_SPDIF_CMD			(0x4c)
14588447a05SGarrett D'Amore #define	IXP_AUDIO_SPDIF_LINK_P			(0x50)
14688447a05SGarrett D'Amore #define	IXP_AUDIO_SPDIF_DT_START		(0x54)
14788447a05SGarrett D'Amore #define	IXP_AUDIO_SPDIF_DT_NEXT			(0x58)
14888447a05SGarrett D'Amore #define	IXP_AUDIO_SPDIF_DT_CUR			(0x5c)
14988447a05SGarrett D'Amore #define	IXP_AUDIO_SPDIF_DT_SIZE_FIFO_INFO	(0x60)
15088447a05SGarrett D'Amore #define	IXP_AUDIO_MODEM_MIRROR			(0x7c)
15188447a05SGarrett D'Amore #define	IXP_AUDIO_AUDIO_MIRROR			(0x80)
15288447a05SGarrett D'Amore #define	IXP_AUDIO_6CH_RECORDER_EN		(0x84)
15388447a05SGarrett D'Amore #define	IXP_AUDIO_FIFO_FLUSH		(0x88)
15488447a05SGarrett D'Amore #define	IXP_AUDIO_FIFO_FLUSH_OUT		(1u<<0)
15588447a05SGarrett D'Amore #define	IXP_AUDIO_FIFO_FLUSH_IN			(1u<<1)
15688447a05SGarrett D'Amore 
15788447a05SGarrett D'Amore #define	IXP_AUDIO_OUT_FIFO_INFO		(0x8c)
15888447a05SGarrett D'Amore #define	IXP_AUDIO_SPDIF_STATUS_BITS_REG1	(0x90)
15988447a05SGarrett D'Amore #define	IXP_AUDIO_SPDIF_STATUS_BITS_REG2	(0x94)
16088447a05SGarrett D'Amore #define	IXP_AUDIO_SPDIF_STATUS_BITS_REG3	(0x98)
16188447a05SGarrett D'Amore #define	IXP_AUDIO_SPDIF_STATUS_BITS_REG4	(0x9c)
16288447a05SGarrett D'Amore #define	IXP_AUDIO_SPDIF_STATUS_BITS_REG5	(0xa0)
16388447a05SGarrett D'Amore #define	IXP_AUDIO_SPDIF_STATUS_BITS_REG6	(0xa4)
16488447a05SGarrett D'Amore #define	IXP_AUDIO_PHY_SEMA			(0xa8)
16588447a05SGarrett D'Amore 
16688447a05SGarrett D'Amore /*
16788447a05SGarrett D'Amore  * AC97 status and link control registers are located
16888447a05SGarrett D'Amore  * in PCI configuration space.
16988447a05SGarrett D'Amore  */
17088447a05SGarrett D'Amore #define	IXP_REG_GSR				0x40
17188447a05SGarrett D'Amore #define	IXP_REG_GCR				0x41
17288447a05SGarrett D'Amore 
17388447a05SGarrett D'Amore /* AC link interface status register */
17488447a05SGarrett D'Amore #define	IXP_GSR_PRI_READY			0x01
17588447a05SGarrett D'Amore #define	IXP_GSR_SEC_READY			0x04
17688447a05SGarrett D'Amore #define	IXP_GSR_TRI_READY			0x10
17788447a05SGarrett D'Amore #define	IXP_GSR_FOUR_READY			0x20
17888447a05SGarrett D'Amore 
17988447a05SGarrett D'Amore /* AC link interface control register */
18088447a05SGarrett D'Amore #define	IXP_GCR_ENAC97				0x80
18188447a05SGarrett D'Amore #define	IXP_GCR_RST				0x40
18288447a05SGarrett D'Amore #define	IXP_GCR_RSYNCHI				0x20
18388447a05SGarrett D'Amore #define	IXP_GCR_SDO				0x10
18488447a05SGarrett D'Amore #define	IXP_GCR_VSR				0x08
18588447a05SGarrett D'Amore #define	IXP_GCR_3D_AUDIO_CHANNEL		0x04
18688447a05SGarrett D'Amore 
18788447a05SGarrett D'Amore /*
18888447a05SGarrett D'Amore  * Macro for AD1980 codec
18988447a05SGarrett D'Amore  */
19088447a05SGarrett D'Amore #define	AD1980_VID1		0x4144
19188447a05SGarrett D'Amore #define	AD1980_VID2		0x5370
19288447a05SGarrett D'Amore #define	AD1985_VID2		0x5375
19388447a05SGarrett D'Amore #define	CODEC_AD_REG_MISC	0x76	/* offset of ad1980 misc control reg */
19488447a05SGarrett D'Amore #define	AD1980_MISC_LOSEL	0x0020	/* Line-out amplifier output selector */
19588447a05SGarrett D'Amore #define	AD1980_MISC_HPSEL	0x0400	/* HP-out amplifier output selector */
19688447a05SGarrett D'Amore 
19788447a05SGarrett D'Amore struct audioixp_port {
19888447a05SGarrett D'Amore 	int			num;
19988447a05SGarrett D'Amore 	struct audioixp_state	*statep;
20088447a05SGarrett D'Amore 	ddi_dma_handle_t	samp_dmah;
20188447a05SGarrett D'Amore 	ddi_acc_handle_t	samp_acch;
20288447a05SGarrett D'Amore 	size_t			samp_size;
20388447a05SGarrett D'Amore 	caddr_t			samp_kaddr;
20488447a05SGarrett D'Amore 	uint32_t		samp_paddr;
20588447a05SGarrett D'Amore 
20688447a05SGarrett D'Amore 	ddi_dma_handle_t	bdl_dmah;
20788447a05SGarrett D'Amore 	ddi_acc_handle_t	bdl_acch;
20888447a05SGarrett D'Amore 	size_t			bdl_size;
20988447a05SGarrett D'Amore 	caddr_t			bdl_kaddr;
21088447a05SGarrett D'Amore 	uint32_t		bdl_paddr;
21188447a05SGarrett D'Amore 
212*68c47f65SGarrett D'Amore 	unsigned		nframes;
21388447a05SGarrett D'Amore 	unsigned		fragfr;
21488447a05SGarrett D'Amore 	unsigned		fragsz;
21588447a05SGarrett D'Amore 	uint64_t		count;
21688447a05SGarrett D'Amore 	uint32_t		offset;
21788447a05SGarrett D'Amore 	uint8_t			nchan;
21888447a05SGarrett D'Amore 
21988447a05SGarrett D'Amore 	unsigned		sync_dir;
22088447a05SGarrett D'Amore 
22188447a05SGarrett D'Amore 	boolean_t		started;
22288447a05SGarrett D'Amore 
22388447a05SGarrett D'Amore 	audio_engine_t		*engine;
22488447a05SGarrett D'Amore };
22588447a05SGarrett D'Amore typedef struct audioixp_port audioixp_port_t;
22688447a05SGarrett D'Amore 
22788447a05SGarrett D'Amore /*
22888447a05SGarrett D'Amore  * buffer descriptor list entry, see datasheet
22988447a05SGarrett D'Amore  */
23088447a05SGarrett D'Amore struct audioixp_bd_entry {
23188447a05SGarrett D'Amore 	uint32_t	buf_base;	/* the address of the buffer */
23288447a05SGarrett D'Amore 	uint16_t	status;		/* status of the buffer */
23388447a05SGarrett D'Amore 	uint16_t	buf_len;	/* size of the buffer in DWORD */
23488447a05SGarrett D'Amore 	uint32_t	next;		/* physical addr of next bd_entry */
23588447a05SGarrett D'Amore };
23688447a05SGarrett D'Amore typedef struct	audioixp_bd_entry	audioixp_bd_entry_t;
23788447a05SGarrett D'Amore 
23888447a05SGarrett D'Amore /*
23988447a05SGarrett D'Amore  * audioixp_state_t	-per instance state and operation data
24088447a05SGarrett D'Amore  */
24188447a05SGarrett D'Amore struct audioixp_state {
24288447a05SGarrett D'Amore 	kmutex_t		inst_lock;	/* state protection lock */
24388447a05SGarrett D'Amore 	dev_info_t		*dip;
24488447a05SGarrett D'Amore 	audio_dev_t		*adev;		/* audio handle */
24588447a05SGarrett D'Amore 	ac97_t			*ac97;
24688447a05SGarrett D'Amore 	audioixp_port_t		*play_port;
24788447a05SGarrett D'Amore 	audioixp_port_t		*rec_port;
24888447a05SGarrett D'Amore 
24988447a05SGarrett D'Amore 	ddi_acc_handle_t	pcih;		/* pci configuration space */
25088447a05SGarrett D'Amore 	ddi_acc_handle_t	regsh;		/* for audio mixer register */
25188447a05SGarrett D'Amore 	caddr_t			regsp;		/* base of audio mixer regs */
25288447a05SGarrett D'Amore 
25388447a05SGarrett D'Amore 	boolean_t		suspended;
25488447a05SGarrett D'Amore 	boolean_t		swap_out;	/* swap line-out and sur-out */
25588447a05SGarrett D'Amore 
25688447a05SGarrett D'Amore 	uint32_t		ixp_codec_not_ready_bits; /* for codec detect */
25788447a05SGarrett D'Amore };
25888447a05SGarrett D'Amore typedef struct audioixp_state	 audioixp_state_t;
25988447a05SGarrett D'Amore 
26088447a05SGarrett D'Amore /*
26188447a05SGarrett D'Amore  * Useful bit twiddlers
26288447a05SGarrett D'Amore  */
26388447a05SGarrett D'Amore #define	GET32(reg)	\
26488447a05SGarrett D'Amore 	ddi_get32(statep->regsh, (void *)(statep->regsp + (reg)))
26588447a05SGarrett D'Amore 
26688447a05SGarrett D'Amore #define	PUT32(reg, val)	\
26788447a05SGarrett D'Amore 	ddi_put32(statep->regsh, (void *)(statep->regsp + (reg)), (val))
26888447a05SGarrett D'Amore 
26988447a05SGarrett D'Amore #define	SET32(reg, val)	PUT32(reg, GET32(reg) | ((uint32_t)(val)))
27088447a05SGarrett D'Amore 
27188447a05SGarrett D'Amore #define	CLR32(reg, val)	PUT32(reg, GET32(reg) & ~((uint32_t)(val)))
27288447a05SGarrett D'Amore 
27388447a05SGarrett D'Amore #define	IXP_INTS		(175)	/* default interrupt rate */
27488447a05SGarrett D'Amore #define	IXP_MIN_INTS		(24)	/* minimum interrupt rate */
27588447a05SGarrett D'Amore #define	IXP_MAX_INTS		(500)	/* maximum interrupt rate */
27688447a05SGarrett D'Amore 
27788447a05SGarrett D'Amore #endif /* _AUDIOIXP_H_ */
278