xref: /onnv-gate/usr/src/uts/common/io/audio/drv/audioemu10k/audioemu10k.h (revision 11936:54dc8a89ba0d)
110913Sgdamore@opensolaris.org /*
210913Sgdamore@opensolaris.org  * CDDL HEADER START
310913Sgdamore@opensolaris.org  *
410913Sgdamore@opensolaris.org  * The contents of this file are subject to the terms of the
510913Sgdamore@opensolaris.org  * Common Development and Distribution License (the "License").
610913Sgdamore@opensolaris.org  * You may not use this file except in compliance with the License.
710913Sgdamore@opensolaris.org  *
810913Sgdamore@opensolaris.org  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
910913Sgdamore@opensolaris.org  * or http://www.opensolaris.org/os/licensing.
1010913Sgdamore@opensolaris.org  * See the License for the specific language governing permissions
1110913Sgdamore@opensolaris.org  * and limitations under the License.
1210913Sgdamore@opensolaris.org  *
1310913Sgdamore@opensolaris.org  * When distributing Covered Code, include this CDDL HEADER in each
1410913Sgdamore@opensolaris.org  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1510913Sgdamore@opensolaris.org  * If applicable, add the following below this CDDL HEADER, with the
1610913Sgdamore@opensolaris.org  * fields enclosed by brackets "[]" replaced with your own identifying
1710913Sgdamore@opensolaris.org  * information: Portions Copyright [yyyy] [name of copyright owner]
1810913Sgdamore@opensolaris.org  *
1910913Sgdamore@opensolaris.org  * CDDL HEADER END
2010913Sgdamore@opensolaris.org  */
2110913Sgdamore@opensolaris.org 
2210913Sgdamore@opensolaris.org /*
23*11936Sgdamore@opensolaris.org  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
2410913Sgdamore@opensolaris.org  * Use is subject to license terms.
2510913Sgdamore@opensolaris.org  */
2610913Sgdamore@opensolaris.org 
2710913Sgdamore@opensolaris.org /*
2810913Sgdamore@opensolaris.org  * Purpose: Definitions for the SB Live/Audigy driver
2910913Sgdamore@opensolaris.org  */
3010913Sgdamore@opensolaris.org /*
3110913Sgdamore@opensolaris.org  * Copyright (C) 4Front Technologies 1996-2009.
3210913Sgdamore@opensolaris.org  */
3310913Sgdamore@opensolaris.org #ifndef	EMU10K_H
3410913Sgdamore@opensolaris.org #define	EMU10K_H
3510913Sgdamore@opensolaris.org 
3610913Sgdamore@opensolaris.org #define	PCI_VENDOR_ID_CREATIVE		0x1102
3710913Sgdamore@opensolaris.org #define	PCI_DEVICE_ID_SBLIVE		0x0002
3810913Sgdamore@opensolaris.org #define	PCI_DEVICE_ID_AUDIGY		0x0004
3910913Sgdamore@opensolaris.org #define	PCI_DEVICE_ID_AUDIGYVALUE	0x0008
4010913Sgdamore@opensolaris.org 
4110913Sgdamore@opensolaris.org #define	SAMPLE_RATE		48000
4210913Sgdamore@opensolaris.org 
4310913Sgdamore@opensolaris.org #define	EMU10K_NAME		"audioemu10k"
4410913Sgdamore@opensolaris.org 
4510913Sgdamore@opensolaris.org #define	EMU10K_NUM_PORTC	2
4610913Sgdamore@opensolaris.org #define	EMU10K_PLAY		0
4710913Sgdamore@opensolaris.org #define	EMU10K_REC		1
4810913Sgdamore@opensolaris.org 
4910913Sgdamore@opensolaris.org #define	EMU10K_NUM_FRAGS	(2*4)	/* Must be multiple of 2 */
5010913Sgdamore@opensolaris.org 
5110913Sgdamore@opensolaris.org #define	EMU10K_MAX_INTRS	512
5210913Sgdamore@opensolaris.org #define	EMU10K_MIN_INTRS	10
5310913Sgdamore@opensolaris.org #define	EMU10K_INTRS		100
5410913Sgdamore@opensolaris.org 
5510913Sgdamore@opensolaris.org #define	FRAGMENT_FRAMES		512
5610913Sgdamore@opensolaris.org 
5710913Sgdamore@opensolaris.org #define	EMU10K1_MAGIC		0xe10001
5810913Sgdamore@opensolaris.org #define	EMU10K2_MAGIC		0xe10002
5910913Sgdamore@opensolaris.org 
6010913Sgdamore@opensolaris.org /* Audio */
6110913Sgdamore@opensolaris.org 
6210913Sgdamore@opensolaris.org #define	DMABUF_SIZE		(256 * 1024)
6310913Sgdamore@opensolaris.org 
6410913Sgdamore@opensolaris.org #define	AUDIO_MAXVOICE		(2*EMU10K_NUM_PORTC)
6510913Sgdamore@opensolaris.org /* Audio buffer + silent page */
6610913Sgdamore@opensolaris.org #define	AUDIO_MEMSIZE		(EMU10K_NUM_PORTC*DMABUF_SIZE+4096)
6710913Sgdamore@opensolaris.org 
6810913Sgdamore@opensolaris.org /* Wall clock register */
6910913Sgdamore@opensolaris.org #define	WC			0x10
7010913Sgdamore@opensolaris.org 
7110913Sgdamore@opensolaris.org /* Hardware config register */
7210913Sgdamore@opensolaris.org #define	HCFG			0x14
7310913Sgdamore@opensolaris.org #define	HCFG_CODECFORMAT_MASK	0x00070000	/* CODEC format */
7410913Sgdamore@opensolaris.org #define	HCFG_CODECFORMAT_AC97	0x00000000	/* AC97 CODEC format */
7510913Sgdamore@opensolaris.org #define	HCFG_CODECFORMAT_I2S	0x00010000	/* I2S CODEC format */
7610913Sgdamore@opensolaris.org #define	HCFG_GPINPUT0		0x00004000	/* External pin112 */
7710913Sgdamore@opensolaris.org #define	HCFG_GPINPUT1		0x00002000	/* External pin110 */
7810913Sgdamore@opensolaris.org #define	HCFG_GPOUTPUT_MASK	0x00001c00	/* Controllable pins */
7910913Sgdamore@opensolaris.org #define	HCFG_GPOUT0		0x00001000	/* enable dig out on 5.1 */
8010913Sgdamore@opensolaris.org #define	HCFG_GPOUT1		0x00000800	/* IR */
8110913Sgdamore@opensolaris.org #define	HCFG_GPOUT2		0x00000400	/* IR */
8210913Sgdamore@opensolaris.org #define	HCFG_JOYENABLE		0x00000200	/* Internal joystick enable */
8310913Sgdamore@opensolaris.org #define	HCFG_PHASETRACKENABLE	0x00000100	/* Phase tracking enable */
8410913Sgdamore@opensolaris.org #define	HCFG_AC3ENABLE_MASK	0x0x0000e0	/* AC3 async input control */
8510913Sgdamore@opensolaris.org #define	HCFG_AC3ENABLE_ZVIDEO	0x00000080	/* Chan 0/1 replace ZVIDEO  */
8610913Sgdamore@opensolaris.org #define	HCFG_AC3ENABLE_CDSPDIF	0x00000040	/* Chan 0/1 replace CDSPDIF */
8710913Sgdamore@opensolaris.org #define	HCFG_AC3ENABLE_GPSPDIF	0x00000020	/* Chan 0/1 replace GPSPDIF */
8810913Sgdamore@opensolaris.org #define	HCFG_AUTOMUTE		0x00000010
8910913Sgdamore@opensolaris.org #define	HCFG_LOCKSOUNDCACHE	0x00000008
9010913Sgdamore@opensolaris.org #define	HCFG_LOCKTANKCACHE_MASK	0x00000004
9110913Sgdamore@opensolaris.org #define	HCFG_LOCKTANKCACHE	0x01020014
9210913Sgdamore@opensolaris.org #define	HCFG_MUTEBUTTONENABLE	0x00000002	/* Mute can clear audioenable */
9310913Sgdamore@opensolaris.org #define	HCFG_AUDIOENABLE	0x00000001	/* Codecs can send data */
9410913Sgdamore@opensolaris.org #define	A_HCFG_VMUTE		0x00004000
9510913Sgdamore@opensolaris.org #define	A_HCFG_AUTOMUTE		0x00008000
9610913Sgdamore@opensolaris.org #define	A_HCFG_XM		0x00040000	/* Xtended address mode */
9710913Sgdamore@opensolaris.org 
9810913Sgdamore@opensolaris.org /*
9910913Sgdamore@opensolaris.org  * GPIO bit definitions (global register 0x18) for Audigy.
10010913Sgdamore@opensolaris.org  */
10110913Sgdamore@opensolaris.org 
10210913Sgdamore@opensolaris.org #define	A_IOCFG_GPOUT0		0x0044	/* analog/digital? */
10310913Sgdamore@opensolaris.org #define	A_IOCFG_GPOUT1		0x0002	/* IR */
10410913Sgdamore@opensolaris.org #define	A_IOCFG_GPOUT2		0x0001	/* IR */
10510913Sgdamore@opensolaris.org 
10610913Sgdamore@opensolaris.org /* Status bits (read only) */
10710913Sgdamore@opensolaris.org #define	GPIO_VERSAPLUGGED	0x2000	/* Center/LFE/digital */
10810913Sgdamore@opensolaris.org #define	GPIO_FRONTPLUGGED	0x4000
10910913Sgdamore@opensolaris.org #define	GPIO_REARPLUGGED	0x8000
11010913Sgdamore@opensolaris.org #define	GPIO_HEADPHPLUGGED	0x0100
11110913Sgdamore@opensolaris.org #define	GPIO_ANALOG_MUTE	0x0040
11210913Sgdamore@opensolaris.org #define	GPIO_DIGITAL_ENABLE	0x0004	/* Cen/lfe (0) or digital (1) switch */
11310913Sgdamore@opensolaris.org 
11410913Sgdamore@opensolaris.org #define	FILL_PAGE_MAP_ENTRY(e, v)					\
11510913Sgdamore@opensolaris.org 	ddi_put32(devc->pt_acch, devc->page_map + e, ((v) << 1) | (e));
11610913Sgdamore@opensolaris.org 
11710913Sgdamore@opensolaris.org /*
11810913Sgdamore@opensolaris.org  * Audio block registers
11910913Sgdamore@opensolaris.org  */
12010913Sgdamore@opensolaris.org 
12110913Sgdamore@opensolaris.org #define	CPF		0x000	/* DW:cnl   Current pitch and fraction */
12210913Sgdamore@opensolaris.org #define	CPF_CURRENTPITCH_MASK		0xffff0000
12310913Sgdamore@opensolaris.org #define	CPF_CURRENTPITCH		0x10100000
12410913Sgdamore@opensolaris.org #define	CPF_STEREO_MASK			0x00008000
12510913Sgdamore@opensolaris.org #define	CPF_STOP_MASK			0x00004000
12610913Sgdamore@opensolaris.org #define	CPF_FRACADDRESS_MASK		0x00003fff
12710913Sgdamore@opensolaris.org 
12810913Sgdamore@opensolaris.org 
12910913Sgdamore@opensolaris.org #define	PTAB		0x001	/* DW:cnl   Pitch target and sends A and B */
13010913Sgdamore@opensolaris.org #define	PTRX_PITCHTARGET_MASK		0xffff0000
13110913Sgdamore@opensolaris.org #define	PTRX_PITCHTARGET		0x10100001
13210913Sgdamore@opensolaris.org #define	PTRX_FXSENDAMOUNT_A_MASK	0x0000ff00
13310913Sgdamore@opensolaris.org #define	PTRX_FXSENDAMOUNT_A		0x08080001
13410913Sgdamore@opensolaris.org #define	PTRX_FXSENDAMOUNT_B_MASK	0x000000ff
13510913Sgdamore@opensolaris.org #define	PTRX_FXSENDAMOUNT_B		0x08000001
13610913Sgdamore@opensolaris.org 
13710913Sgdamore@opensolaris.org 
13810913Sgdamore@opensolaris.org #define	CVCF		0x002	/* DW:cnl   Curr vol and curr filter cutoff */
13910913Sgdamore@opensolaris.org #define	VTFT		0x003	/* DW:cnl   Volume tgt and filter cutoff tgt */
14010913Sgdamore@opensolaris.org #define	Z2		0x004	/* DW:cnl   Filter delay memory 2 */
14110913Sgdamore@opensolaris.org #define	Z1		0x005	/* DW:cnl   Filter delay memory 1 */
14210913Sgdamore@opensolaris.org #define	SCSA		0x006	/* DW:cnl   Send C and Start addr */
14310913Sgdamore@opensolaris.org #define	SDL		0x007	/* DW:cnl   Send D and Loop addr */
14410913Sgdamore@opensolaris.org #define	QKBCA		0x008	/* DW:cnl   Filter Q, ROM, etc */
14510913Sgdamore@opensolaris.org #define	CCR		0x009
14610913Sgdamore@opensolaris.org #define	CCR_CACHEINVALIDSIZE		0x07190009
14710913Sgdamore@opensolaris.org #define	CCR_CACHEINVALIDSIZE_MASK	0xfe000000
14810913Sgdamore@opensolaris.org #define	CCR_CACHELOOPFLAG		0x01000000
14910913Sgdamore@opensolaris.org #define	CCR_INTERLEAVEDSAMPLES		0x00800000
15010913Sgdamore@opensolaris.org #define	CCR_WORDSIZEDSAMPLES		0x00400000
15110913Sgdamore@opensolaris.org #define	CCR_READADDRESS			0x06100009
15210913Sgdamore@opensolaris.org #define	CCR_READADDRESS_MASK		0x003f0000
15310913Sgdamore@opensolaris.org #define	CCR_LOOPINVALSIZE		0x0000fe00
15410913Sgdamore@opensolaris.org #define	CCR_LOOPFLAG			0x00000100
15510913Sgdamore@opensolaris.org #define	CCR_CACHELOOPADDRHI		0x000000ff
15610913Sgdamore@opensolaris.org 
15710913Sgdamore@opensolaris.org #define	CLP		0x00a
15810913Sgdamore@opensolaris.org #define	SRHE		0x07c
15910913Sgdamore@opensolaris.org #define	STHE		0x07d
16010913Sgdamore@opensolaris.org #define	SRDA		0x07e
16110913Sgdamore@opensolaris.org #define	STDA		0x07f
16210913Sgdamore@opensolaris.org #define	L_FXRT		0x00b
16310913Sgdamore@opensolaris.org #define	FXRT		0x00b	/* W:cnl */
16410913Sgdamore@opensolaris.org #define	MAPA		0x00c
16510913Sgdamore@opensolaris.org #define	MAPB		0x00d
16610913Sgdamore@opensolaris.org #define	VEV		0x010	/* W:cnl */
16710913Sgdamore@opensolaris.org #define	VEHA		0x011	/* W:cnl */
16810913Sgdamore@opensolaris.org #define	VEDS		0x012	/* W:cnl */
16910913Sgdamore@opensolaris.org #define	MLV		0x013	/* W:cnl */
17010913Sgdamore@opensolaris.org #define	MEV		0x014	/* W:cnl */
17110913Sgdamore@opensolaris.org #define	MEHA		0x015	/* W:cnl */
17210913Sgdamore@opensolaris.org #define	MEDS		0x016	/* W:cnl */
17310913Sgdamore@opensolaris.org #define	VLV		0x017	/* W:cnl */
17410913Sgdamore@opensolaris.org #define	IP		0x018	/* W:cnl */
17510913Sgdamore@opensolaris.org #define	IFA		0x019	/* W:cnl */
17610913Sgdamore@opensolaris.org #define	PEFE		0x01a	/* W:cnl */
17710913Sgdamore@opensolaris.org #define	PEFE_PITCHAMOUNT_MASK	0x0000ff00	/* Pitch envlope amount */
17810913Sgdamore@opensolaris.org #define	PEFE_PITCHAMOUNT	0x0808001a
17910913Sgdamore@opensolaris.org #define	PEFE_FILTERAMOUNT_MASK	0x000000ff	/* Filter envlope amount */
18010913Sgdamore@opensolaris.org #define	PEFE_FILTERAMOUNT	0x0800001a
18110913Sgdamore@opensolaris.org 
18210913Sgdamore@opensolaris.org #define	VFM		0x01b	/* W:cnl */
18310913Sgdamore@opensolaris.org #define	TMFQ		0x01c	/* W:cnl */
18410913Sgdamore@opensolaris.org #define	VVFQ		0x01d	/* W:cnl */
18510913Sgdamore@opensolaris.org #define	TMPE		0x01e	/* W:cnl */
18610913Sgdamore@opensolaris.org #define	CD0		0x020	/* DW:cnl (16 registers) */
18710913Sgdamore@opensolaris.org #define	PTBA		0x040	/* DW:nocnl */
18810913Sgdamore@opensolaris.org #define	TCBA		0x041	/* DW:nocnl */
18910913Sgdamore@opensolaris.org #define	ADCSR		0x042	/* B:nocnl */
19010913Sgdamore@opensolaris.org #define	FXWC		0x043	/* DW:nocnl */
19110913Sgdamore@opensolaris.org #define	TCBS		0x044	/* B:nocnl */
19210913Sgdamore@opensolaris.org #define	MBA		0x045	/* DW:nocnl */
19310913Sgdamore@opensolaris.org #define	ADCBA		0x046	/* DW:nocnl */
19410913Sgdamore@opensolaris.org #define	FXBA		0x047	/* DW:nocnl */
19510913Sgdamore@opensolaris.org 
19610913Sgdamore@opensolaris.org #define	MBS		0x049	/* B:nocnl */
19710913Sgdamore@opensolaris.org #define	ADCBS		0x04a	/* B:nocnl */
19810913Sgdamore@opensolaris.org #define	FXBS		0x04b	/* B:nocnl */
19910913Sgdamore@opensolaris.org #define	CSBA	0x4c
20010913Sgdamore@opensolaris.org #define	CSDC	0x4d
20110913Sgdamore@opensolaris.org #define	CSFE	0x4e
20210913Sgdamore@opensolaris.org #define	CSHG	0x4f
20310913Sgdamore@opensolaris.org #define	CDCS		0x050	/* DW:nocnl */
20410913Sgdamore@opensolaris.org #define	GPSCS		0x051	/* DW:nocnl */
20510913Sgdamore@opensolaris.org #define	DBG		0x052	/* DW:nocnl */
20610913Sgdamore@opensolaris.org #define	AUDIGY_DBG	0x053	/* DW:nocnl */
20710913Sgdamore@opensolaris.org #define	SCS0		0x054	/* DW:nocnl */
20810913Sgdamore@opensolaris.org #define	SCS1		0x055	/* DW:nocnl */
20910913Sgdamore@opensolaris.org #define	SCS2		0x056	/* DW:nocnl */
21010913Sgdamore@opensolaris.org #define	CLIEL		0x058	/* DW:nocnl */
21110913Sgdamore@opensolaris.org #define	CLIEH		0x059	/* DW:nocnl */
21210913Sgdamore@opensolaris.org #define	CLIPL		0x05a	/* DW:nocnl */
21310913Sgdamore@opensolaris.org #define	CLIPH		0x05b	/* DW:nocnl */
21410913Sgdamore@opensolaris.org #define	SOLL		0x05c	/* DW:nocnl */
21510913Sgdamore@opensolaris.org #define	SOLH		0x05d	/* DW:nocnl */
21610913Sgdamore@opensolaris.org #define	SOC		0x05e	/* DW:nocnl */
21710913Sgdamore@opensolaris.org #define	AC97SLOT	0x05f
21810913Sgdamore@opensolaris.org #define	AC97SLOT_REAR_RIGHT	0x01
21910913Sgdamore@opensolaris.org #define	AC97SLOT_REAR_LEFT	0x02
22010913Sgdamore@opensolaris.org #define	AC97SLOT_CENTER		0x10
22110913Sgdamore@opensolaris.org #define	AC97SLOT_LFE		0x20
22210913Sgdamore@opensolaris.org #define	CDSRCS		0x060	/* DW:nocnl */
22310913Sgdamore@opensolaris.org #define	GPSRCS		0x061	/* DW:nocnl */
22410913Sgdamore@opensolaris.org #define	ZVSRCS		0x062	/* DW:nocnl */
22510913Sgdamore@opensolaris.org #define	ADCIDX		0x063	/* W:nocnl */
22610913Sgdamore@opensolaris.org #define	MIDX		0x064	/* W:nocnl */
22710913Sgdamore@opensolaris.org #define	FXIDX		0x065	/* W:nocnl */
22810913Sgdamore@opensolaris.org 
22910913Sgdamore@opensolaris.org /* Half loop interrupt registers (audigy only) */
23010913Sgdamore@opensolaris.org #define	HLIEL		0x066	/* DW:nocnl */
23110913Sgdamore@opensolaris.org #define	HLIEH		0x067	/* DW:nocnl */
23210913Sgdamore@opensolaris.org #define	HLIPL		0x068	/* DW:nocnl */
23310913Sgdamore@opensolaris.org #define	HLIPH		0x069	/* DW:nocnl */
23410913Sgdamore@opensolaris.org #define	GPR0	((devc->feature_mask&SB_LIVE)? 0x100:0x400)	/* DW:nocnl */
23510913Sgdamore@opensolaris.org #define	TMA0		0x300	/* Tank memory */
23610913Sgdamore@opensolaris.org #define	UC0	((devc->feature_mask&SB_LIVE) ? 0x400:0x600)	/* DSM ucode */
23710913Sgdamore@opensolaris.org 
23810913Sgdamore@opensolaris.org /* Interrupt pending register */
23910913Sgdamore@opensolaris.org #define	INTPEND	0x08
24010913Sgdamore@opensolaris.org #define		INT_VI		0x00100000
24110913Sgdamore@opensolaris.org #define		INT_VD		0x00080000
24210913Sgdamore@opensolaris.org #define		INT_MU		0x00040000
24310913Sgdamore@opensolaris.org #define		INT_MF		0x00020000
24410913Sgdamore@opensolaris.org #define		INT_MH		0x00010000
24510913Sgdamore@opensolaris.org #define		INT_AF		0x00008000
24610913Sgdamore@opensolaris.org #define		INT_AH		0x00004000
24710913Sgdamore@opensolaris.org #define		INT_IT		0x00000200
24810913Sgdamore@opensolaris.org #define		INT_TX		0x00000100
24910913Sgdamore@opensolaris.org #define		INT_RX		0x00000080
25010913Sgdamore@opensolaris.org #define		INT_CL		0x00000040
25110913Sgdamore@opensolaris.org /* Interrupt enable register */
25210913Sgdamore@opensolaris.org #define	IE	0x0c
25310913Sgdamore@opensolaris.org #define		IE_VI		0x00000400
25410913Sgdamore@opensolaris.org #define		IE_VD		0x00000200
25510913Sgdamore@opensolaris.org #define		IE_MU		0x00000100
25610913Sgdamore@opensolaris.org #define		IE_MB		0x00000080
25710913Sgdamore@opensolaris.org #define		IE_AB		0x00000040
25810913Sgdamore@opensolaris.org #define		IE_IT		0x00000004
25910913Sgdamore@opensolaris.org #define		IE_TX		0x00000002
26010913Sgdamore@opensolaris.org #define		IE_RX		0x00000001
26110913Sgdamore@opensolaris.org 
26210913Sgdamore@opensolaris.org /* Interval timer register */
26310913Sgdamore@opensolaris.org #define	TIMR		0x1a
26410913Sgdamore@opensolaris.org 
26510913Sgdamore@opensolaris.org /* EMU10K2 MIDI UART */
26610913Sgdamore@opensolaris.org #define	MUADAT		0x070
26710913Sgdamore@opensolaris.org #define	MUACMD		0x071
26810913Sgdamore@opensolaris.org #define	MUASTAT		MUACMD
26910913Sgdamore@opensolaris.org 
27010913Sgdamore@opensolaris.org /* EMU10K2 S/PDIF recording buffer */
27110913Sgdamore@opensolaris.org #define	SPRI		0x6a
27210913Sgdamore@opensolaris.org #define	SPRA		0x6b
27310913Sgdamore@opensolaris.org #define	SPRC		0x6c
27410913Sgdamore@opensolaris.org 
27510913Sgdamore@opensolaris.org #define	EHC		0x76	/* Audigy 2 */
27610913Sgdamore@opensolaris.org 
27710913Sgdamore@opensolaris.org #define	SRHE	0x07c
27810913Sgdamore@opensolaris.org #define	STHE	0x07d
27910913Sgdamore@opensolaris.org #define	SRDA	0x07e
28010913Sgdamore@opensolaris.org 
28110913Sgdamore@opensolaris.org #define	ROM0		0x00000000	/* interpolation ROM 0 */
28210913Sgdamore@opensolaris.org #define	ROM1		0x02000000	/* interpolation ROM 1 */
28310913Sgdamore@opensolaris.org #define	ROM2		0x04000000	/* interpolation ROM 2 */
28410913Sgdamore@opensolaris.org #define	ROM3		0x06000000	/* interpolation ROM 3 */
28510913Sgdamore@opensolaris.org #define	ROM4		0x08000000	/* interpolation ROM 4 */
28610913Sgdamore@opensolaris.org #define	ROM5		0x0A000000	/* interpolation ROM 5 */
28710913Sgdamore@opensolaris.org #define	ROM6		0x0C000000	/* interpolation ROM 6 */
28810913Sgdamore@opensolaris.org #define	ROM7		0x0E000000	/* interpolation ROM 7 */
28910913Sgdamore@opensolaris.org #define	BYTESIZE	0x01000000	/* byte sound memory */
29010913Sgdamore@opensolaris.org 
29110913Sgdamore@opensolaris.org #define	MAX_GPR	256
29210913Sgdamore@opensolaris.org 
29310913Sgdamore@opensolaris.org /* See feature_mask below */
29410913Sgdamore@opensolaris.org #define	SB_LIVE		1
29510913Sgdamore@opensolaris.org #define	SB_AUDIGY	2
29610913Sgdamore@opensolaris.org #define	SB_AUDIGY2	4
29710913Sgdamore@opensolaris.org #define	SB_AUDIGY2VAL	8
29810913Sgdamore@opensolaris.org #define	SB_51		0x10
29910913Sgdamore@opensolaris.org #define	SB_71		0x20
30010913Sgdamore@opensolaris.org #define	SB_INVSP	0x40	/* invert shared spdif switch */
30110913Sgdamore@opensolaris.org #define	SB_NOEXP	0x80	/* no support for Live! Drive or expansion */
30210913Sgdamore@opensolaris.org 
30310913Sgdamore@opensolaris.org #define	LEFT_CH		0
30410913Sgdamore@opensolaris.org #define	RIGHT_CH	1
30510913Sgdamore@opensolaris.org 
30610913Sgdamore@opensolaris.org #ifdef	_KERNEL
30710913Sgdamore@opensolaris.org 
30810913Sgdamore@opensolaris.org typedef struct _emu10k_devc_t emu10k_devc_t;
30910913Sgdamore@opensolaris.org typedef struct _emu10k_portc_t emu10k_portc_t;
31010913Sgdamore@opensolaris.org 
31110913Sgdamore@opensolaris.org 
31210913Sgdamore@opensolaris.org typedef enum {
31310913Sgdamore@opensolaris.org 	CTL_VOLUME = 0,
31410913Sgdamore@opensolaris.org 	CTL_FRONT,
31510913Sgdamore@opensolaris.org 	CTL_SURROUND,
31610913Sgdamore@opensolaris.org 	CTL_CENTER,
31710913Sgdamore@opensolaris.org 	CTL_LFE,
31810913Sgdamore@opensolaris.org 	CTL_SIDE,
31910913Sgdamore@opensolaris.org 	CTL_HEADPH,
32010913Sgdamore@opensolaris.org 
32110913Sgdamore@opensolaris.org 	CTL_RECGAIN,
32210913Sgdamore@opensolaris.org 	CTL_RECSRC,
32310913Sgdamore@opensolaris.org 	CTL_AC97SRC,
32410913Sgdamore@opensolaris.org 
32510913Sgdamore@opensolaris.org 	/* monitor source values */
32610913Sgdamore@opensolaris.org 	CTL_AC97,
32710913Sgdamore@opensolaris.org 	CTL_DIGCD,
32810913Sgdamore@opensolaris.org 	CTL_SPD1,
32910913Sgdamore@opensolaris.org 	CTL_SPD2,
33010913Sgdamore@opensolaris.org 	CTL_LINE2,
33110913Sgdamore@opensolaris.org 	CTL_AUX2,
33210913Sgdamore@opensolaris.org 
33310913Sgdamore@opensolaris.org 	CTL_JACK3,
33410913Sgdamore@opensolaris.org 
33510913Sgdamore@opensolaris.org 	/* this one must be last */
33610913Sgdamore@opensolaris.org 	CTL_MAX,
33710913Sgdamore@opensolaris.org } emu10k_ctrl_id_t;
33810913Sgdamore@opensolaris.org 
33910913Sgdamore@opensolaris.org typedef struct _emu10k_ctrl {
34010913Sgdamore@opensolaris.org 	emu10k_devc_t	*devc;
34110913Sgdamore@opensolaris.org 	audio_ctrl_t	*ctrl;
34210913Sgdamore@opensolaris.org 	int		gpr_num;
34310913Sgdamore@opensolaris.org 	uint64_t	val;
34410913Sgdamore@opensolaris.org } emu10k_ctrl_t;
34510913Sgdamore@opensolaris.org 
34610913Sgdamore@opensolaris.org typedef struct _emu10k_gpr {
34710913Sgdamore@opensolaris.org 	boolean_t	valid;
34810913Sgdamore@opensolaris.org 	uint32_t	value;
34910913Sgdamore@opensolaris.org } emu10k_gpr_t;
35010913Sgdamore@opensolaris.org 
35110913Sgdamore@opensolaris.org struct _emu10k_portc_t {
35210913Sgdamore@opensolaris.org 	emu10k_devc_t		*devc;
35310913Sgdamore@opensolaris.org 	audio_engine_t		*engine;
35410913Sgdamore@opensolaris.org 
35510913Sgdamore@opensolaris.org 	/* Helper functions */
35610913Sgdamore@opensolaris.org 	void			(*update_port)(emu10k_portc_t *);
35710913Sgdamore@opensolaris.org 	void			(*reset_port)(emu10k_portc_t *);
35810913Sgdamore@opensolaris.org 	void			(*stop_port)(emu10k_portc_t *);
35910913Sgdamore@opensolaris.org 	void			(*start_port)(emu10k_portc_t *);
36010913Sgdamore@opensolaris.org 
36110913Sgdamore@opensolaris.org 	int			channels;
36210913Sgdamore@opensolaris.org 
36310913Sgdamore@opensolaris.org 	boolean_t		started;
36410913Sgdamore@opensolaris.org 	boolean_t		active;
36510913Sgdamore@opensolaris.org 	unsigned		nframes;
36610913Sgdamore@opensolaris.org 	unsigned		nfrags;
36710913Sgdamore@opensolaris.org 	unsigned		fragsz;
36810913Sgdamore@opensolaris.org 
36910913Sgdamore@opensolaris.org 	ddi_dma_handle_t	buf_dmah;	/* dma for buffers */
37010913Sgdamore@opensolaris.org 	ddi_acc_handle_t	buf_acch;
37110913Sgdamore@opensolaris.org 	uint32_t		buf_paddr;
37210913Sgdamore@opensolaris.org 	caddr_t			buf_kaddr;
37310913Sgdamore@opensolaris.org 	size_t			buf_size;
37410913Sgdamore@opensolaris.org 	/* Start of loop within the internal memory space */
37510913Sgdamore@opensolaris.org 	uint32_t		memptr;
37610913Sgdamore@opensolaris.org 	int			syncdir;
37710913Sgdamore@opensolaris.org 	/* Position & timing */
37810913Sgdamore@opensolaris.org 	uint64_t		count;
37910913Sgdamore@opensolaris.org 	uint32_t		pos;
38010913Sgdamore@opensolaris.org 	int		dopos;
38110913Sgdamore@opensolaris.org };
38210913Sgdamore@opensolaris.org 
38310913Sgdamore@opensolaris.org struct _emu10k_devc_t {
38410913Sgdamore@opensolaris.org 	dev_info_t		*dip;
38510913Sgdamore@opensolaris.org 	audio_dev_t		*adev;
38610913Sgdamore@opensolaris.org 	ddi_acc_handle_t	pcih;
38710913Sgdamore@opensolaris.org 	ddi_acc_handle_t	regsh;
38810913Sgdamore@opensolaris.org 	caddr_t			regs;
38910913Sgdamore@opensolaris.org 	kmutex_t		mutex;
39010913Sgdamore@opensolaris.org 
39110913Sgdamore@opensolaris.org 	/*
39210913Sgdamore@opensolaris.org 	 * Page table
39310913Sgdamore@opensolaris.org 	 */
39410913Sgdamore@opensolaris.org 	ddi_dma_handle_t	pt_dmah;	/* dma for page_tablefers */
39510913Sgdamore@opensolaris.org 	ddi_acc_handle_t	pt_acch;
39610913Sgdamore@opensolaris.org 	uint32_t		pt_paddr;
39710913Sgdamore@opensolaris.org 	caddr_t			pt_kaddr;
39810913Sgdamore@opensolaris.org 	uint32_t		*page_map;	/* up to 8k ptrs to 4k pages */
39910913Sgdamore@opensolaris.org 
40010913Sgdamore@opensolaris.org 
40110913Sgdamore@opensolaris.org 	/*
40210913Sgdamore@opensolaris.org 	 * Silent page used by voices that don't play anything.
40310913Sgdamore@opensolaris.org 	 */
40410913Sgdamore@opensolaris.org 	ddi_dma_handle_t	silence_dmah;	/* dma for silencefers */
40510913Sgdamore@opensolaris.org 	ddi_acc_handle_t	silence_acch;
40610913Sgdamore@opensolaris.org 	uint32_t		silence_paddr;
40710913Sgdamore@opensolaris.org 	caddr_t			silence_kaddr;
40810913Sgdamore@opensolaris.org 
40910913Sgdamore@opensolaris.org 	/*
41010913Sgdamore@opensolaris.org 	 * Device feature mask tells which kind of features are
41110913Sgdamore@opensolaris.org 	 * supported by the hardware. Audigy2/2val have multiple bits
41210913Sgdamore@opensolaris.org 	 * set while Live! has just the SB_LIVE bits. So Features of
41310913Sgdamore@opensolaris.org 	 * Audigy will be reported by Audigy2/val too.
41410913Sgdamore@opensolaris.org 	 */
41510913Sgdamore@opensolaris.org 	int			feature_mask;
41610913Sgdamore@opensolaris.org 	int			max_mem, max_pages, nr_pages;
41710913Sgdamore@opensolaris.org 	/*
41810913Sgdamore@opensolaris.org 	 * Mixer
41910913Sgdamore@opensolaris.org 	 */
42010913Sgdamore@opensolaris.org 	ac97_t			*ac97;
42110913Sgdamore@opensolaris.org 	ac97_ctrl_t		*ac97_recsrc;
42210913Sgdamore@opensolaris.org 	uint32_t		ac97_stereomix;
42310913Sgdamore@opensolaris.org 	emu10k_gpr_t		gpr_shadow[MAX_GPR];
42410913Sgdamore@opensolaris.org 	emu10k_ctrl_t		ctrls[CTL_MAX];
42510913Sgdamore@opensolaris.org 
42610913Sgdamore@opensolaris.org 	/*
42710913Sgdamore@opensolaris.org 	 * Audio
42810913Sgdamore@opensolaris.org 	 */
42910913Sgdamore@opensolaris.org 
43010913Sgdamore@opensolaris.org 	int			audio_memptr;
43110913Sgdamore@opensolaris.org 	int			*silent_page;
43210913Sgdamore@opensolaris.org 
43310913Sgdamore@opensolaris.org 	emu10k_portc_t		*portc[EMU10K_NUM_PORTC];
43410913Sgdamore@opensolaris.org };
43510913Sgdamore@opensolaris.org 
43610913Sgdamore@opensolaris.org #define	INB(devc, reg)		ddi_get8(devc->regsh, (void *)(reg))
43710913Sgdamore@opensolaris.org #define	OUTB(devc, val, reg)	ddi_put8(devc->regsh, (void *)(reg), (val))
43810913Sgdamore@opensolaris.org 
43910913Sgdamore@opensolaris.org #define	INW(devc, reg)		ddi_get16(devc->regsh, (void *)(reg))
44010913Sgdamore@opensolaris.org #define	OUTW(devc, val, reg)	ddi_put16(devc->regsh, (void *)(reg), (val))
44110913Sgdamore@opensolaris.org 
44210913Sgdamore@opensolaris.org #define	INL(devc, reg)		ddi_get32(devc->regsh, (void *)(reg))
44310913Sgdamore@opensolaris.org #define	OUTL(devc, val, reg)	ddi_put32(devc->regsh, (void *)(reg), (val))
44410913Sgdamore@opensolaris.org 
44510913Sgdamore@opensolaris.org #endif	/* _KERNEL */
44610913Sgdamore@opensolaris.org 
44710913Sgdamore@opensolaris.org #endif /* EMU10K_H */
448