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