#ifndef EMU10K_H
#define EMU10K_H
#define PCI_VENDOR_ID_CREATIVE 0x1102
#define PCI_DEVICE_ID_SBLIVE 0x0002
#define PCI_DEVICE_ID_AUDIGY 0x0004
#define PCI_DEVICE_ID_AUDIGYVALUE 0x0008
#define SAMPLE_RATE 48000
#define EMU10K_NAME "audioemu10k"
#define EMU10K_NUM_PORTC 2
#define EMU10K_PLAY 0
#define EMU10K_REC 1
#define EMU10K_NUM_FRAGS (2*4)
#define EMU10K_MAX_INTRS 512
#define EMU10K_MIN_INTRS 10
#define EMU10K_INTRS 100
#define FRAGMENT_FRAMES 512
#define EMU10K1_MAGIC 0xe10001
#define EMU10K2_MAGIC 0xe10002
#define DMABUF_SIZE (256 * 1024)
#define AUDIO_MAXVOICE (2*EMU10K_NUM_PORTC)
#define AUDIO_MEMSIZE (EMU10K_NUM_PORTC*DMABUF_SIZE+4096)
#define WC 0x10
#define HCFG 0x14
#define HCFG_CODECFORMAT_MASK 0x00070000
#define HCFG_CODECFORMAT_AC97 0x00000000
#define HCFG_CODECFORMAT_I2S 0x00010000
#define HCFG_GPINPUT0 0x00004000
#define HCFG_GPINPUT1 0x00002000
#define HCFG_GPOUTPUT_MASK 0x00001c00
#define HCFG_GPOUT0 0x00001000
#define HCFG_GPOUT1 0x00000800
#define HCFG_GPOUT2 0x00000400
#define HCFG_JOYENABLE 0x00000200
#define HCFG_PHASETRACKENABLE 0x00000100
#define HCFG_AC3ENABLE_MASK 0x0x0000e0
#define HCFG_AC3ENABLE_ZVIDEO 0x00000080
#define HCFG_AC3ENABLE_CDSPDIF 0x00000040
#define HCFG_AC3ENABLE_GPSPDIF 0x00000020
#define HCFG_AUTOMUTE 0x00000010
#define HCFG_LOCKSOUNDCACHE 0x00000008
#define HCFG_LOCKTANKCACHE_MASK 0x00000004
#define HCFG_LOCKTANKCACHE 0x01020014
#define HCFG_MUTEBUTTONENABLE 0x00000002
#define HCFG_AUDIOENABLE 0x00000001
#define A_HCFG_VMUTE 0x00004000
#define A_HCFG_AUTOMUTE 0x00008000
#define A_HCFG_XM 0x00040000
#define A_IOCFG_GPOUT0 0x0044
#define A_IOCFG_GPOUT1 0x0002
#define A_IOCFG_GPOUT2 0x0001
#define GPIO_VERSAPLUGGED 0x2000
#define GPIO_FRONTPLUGGED 0x4000
#define GPIO_REARPLUGGED 0x8000
#define GPIO_HEADPHPLUGGED 0x0100
#define GPIO_ANALOG_MUTE 0x0040
#define GPIO_DIGITAL_ENABLE 0x0004
#define FILL_PAGE_MAP_ENTRY(e, v) \
ddi_put32(devc->pt_acch, devc->page_map + e, ((v) << 1) | (e));
#define CPF 0x000
#define CPF_CURRENTPITCH_MASK 0xffff0000
#define CPF_CURRENTPITCH 0x10100000
#define CPF_STEREO_MASK 0x00008000
#define CPF_STOP_MASK 0x00004000
#define CPF_FRACADDRESS_MASK 0x00003fff
#define PTAB 0x001
#define PTRX_PITCHTARGET_MASK 0xffff0000
#define PTRX_PITCHTARGET 0x10100001
#define PTRX_FXSENDAMOUNT_A_MASK 0x0000ff00
#define PTRX_FXSENDAMOUNT_A 0x08080001
#define PTRX_FXSENDAMOUNT_B_MASK 0x000000ff
#define PTRX_FXSENDAMOUNT_B 0x08000001
#define CVCF 0x002
#define VTFT 0x003
#define Z2 0x004
#define Z1 0x005
#define SCSA 0x006
#define SDL 0x007
#define QKBCA 0x008
#define CCR 0x009
#define CCR_CACHEINVALIDSIZE 0x07190009
#define CCR_CACHEINVALIDSIZE_MASK 0xfe000000
#define CCR_CACHELOOPFLAG 0x01000000
#define CCR_INTERLEAVEDSAMPLES 0x00800000
#define CCR_WORDSIZEDSAMPLES 0x00400000
#define CCR_READADDRESS 0x06100009
#define CCR_READADDRESS_MASK 0x003f0000
#define CCR_LOOPINVALSIZE 0x0000fe00
#define CCR_LOOPFLAG 0x00000100
#define CCR_CACHELOOPADDRHI 0x000000ff
#define CLP 0x00a
#define SRHE 0x07c
#define STHE 0x07d
#define SRDA 0x07e
#define STDA 0x07f
#define L_FXRT 0x00b
#define FXRT 0x00b
#define MAPA 0x00c
#define MAPB 0x00d
#define VEV 0x010
#define VEHA 0x011
#define VEDS 0x012
#define MLV 0x013
#define MEV 0x014
#define MEHA 0x015
#define MEDS 0x016
#define VLV 0x017
#define IP 0x018
#define IFA 0x019
#define PEFE 0x01a
#define PEFE_PITCHAMOUNT_MASK 0x0000ff00
#define PEFE_PITCHAMOUNT 0x0808001a
#define PEFE_FILTERAMOUNT_MASK 0x000000ff
#define PEFE_FILTERAMOUNT 0x0800001a
#define VFM 0x01b
#define TMFQ 0x01c
#define VVFQ 0x01d
#define TMPE 0x01e
#define CD0 0x020
#define PTBA 0x040
#define TCBA 0x041
#define ADCSR 0x042
#define FXWC 0x043
#define TCBS 0x044
#define MBA 0x045
#define ADCBA 0x046
#define FXBA 0x047
#define MBS 0x049
#define ADCBS 0x04a
#define FXBS 0x04b
#define CSBA 0x4c
#define CSDC 0x4d
#define CSFE 0x4e
#define CSHG 0x4f
#define CDCS 0x050
#define GPSCS 0x051
#define DBG 0x052
#define AUDIGY_DBG 0x053
#define SCS0 0x054
#define SCS1 0x055
#define SCS2 0x056
#define CLIEL 0x058
#define CLIEH 0x059
#define CLIPL 0x05a
#define CLIPH 0x05b
#define SOLL 0x05c
#define SOLH 0x05d
#define SOC 0x05e
#define AC97SLOT 0x05f
#define AC97SLOT_REAR_RIGHT 0x01
#define AC97SLOT_REAR_LEFT 0x02
#define AC97SLOT_CENTER 0x10
#define AC97SLOT_LFE 0x20
#define CDSRCS 0x060
#define GPSRCS 0x061
#define ZVSRCS 0x062
#define ADCIDX 0x063
#define MIDX 0x064
#define FXIDX 0x065
#define HLIEL 0x066
#define HLIEH 0x067
#define HLIPL 0x068
#define HLIPH 0x069
#define GPR0 ((devc->feature_mask&SB_LIVE)? 0x100:0x400)
#define TMA0 0x300
#define UC0 ((devc->feature_mask&SB_LIVE) ? 0x400:0x600)
#define INTPEND 0x08
#define INT_VI 0x00100000
#define INT_VD 0x00080000
#define INT_MU 0x00040000
#define INT_MF 0x00020000
#define INT_MH 0x00010000
#define INT_AF 0x00008000
#define INT_AH 0x00004000
#define INT_IT 0x00000200
#define INT_TX 0x00000100
#define INT_RX 0x00000080
#define INT_CL 0x00000040
#define IE 0x0c
#define IE_VI 0x00000400
#define IE_VD 0x00000200
#define IE_MU 0x00000100
#define IE_MB 0x00000080
#define IE_AB 0x00000040
#define IE_IT 0x00000004
#define IE_TX 0x00000002
#define IE_RX 0x00000001
#define TIMR 0x1a
#define MUADAT 0x070
#define MUACMD 0x071
#define MUASTAT MUACMD
#define SPRI 0x6a
#define SPRA 0x6b
#define SPRC 0x6c
#define EHC 0x76
#define SRHE 0x07c
#define STHE 0x07d
#define SRDA 0x07e
#define ROM0 0x00000000
#define ROM1 0x02000000
#define ROM2 0x04000000
#define ROM3 0x06000000
#define ROM4 0x08000000
#define ROM5 0x0A000000
#define ROM6 0x0C000000
#define ROM7 0x0E000000
#define BYTESIZE 0x01000000
#define MAX_GPR 256
#define SB_LIVE 1
#define SB_AUDIGY 2
#define SB_AUDIGY2 4
#define SB_AUDIGY2VAL 8
#define SB_51 0x10
#define SB_71 0x20
#define SB_INVSP 0x40
#define SB_NOEXP 0x80
#define LEFT_CH 0
#define RIGHT_CH 1
#ifdef _KERNEL
typedef struct _emu10k_devc_t emu10k_devc_t;
typedef struct _emu10k_portc_t emu10k_portc_t;
typedef enum {
CTL_VOLUME = 0,
CTL_FRONT,
CTL_SURROUND,
CTL_CENTER,
CTL_LFE,
CTL_SIDE,
CTL_HEADPH,
CTL_RECGAIN,
CTL_RECSRC,
CTL_AC97SRC,
CTL_AC97,
CTL_DIGCD,
CTL_SPD1,
CTL_SPD2,
CTL_LINE2,
CTL_AUX2,
CTL_JACK3,
CTL_MAX,
} emu10k_ctrl_id_t;
typedef struct _emu10k_ctrl {
emu10k_devc_t *devc;
audio_ctrl_t *ctrl;
int gpr_num;
uint64_t val;
} emu10k_ctrl_t;
typedef struct _emu10k_gpr {
boolean_t valid;
uint32_t value;
} emu10k_gpr_t;
struct _emu10k_portc_t {
emu10k_devc_t *devc;
audio_engine_t *engine;
void (*update_port)(emu10k_portc_t *);
void (*reset_port)(emu10k_portc_t *);
void (*stop_port)(emu10k_portc_t *);
void (*start_port)(emu10k_portc_t *);
int channels;
boolean_t started;
boolean_t active;
unsigned nframes;
unsigned nfrags;
unsigned fragsz;
ddi_dma_handle_t buf_dmah;
ddi_acc_handle_t buf_acch;
uint32_t buf_paddr;
caddr_t buf_kaddr;
size_t buf_size;
uint32_t memptr;
int syncdir;
uint64_t count;
uint32_t pos;
int dopos;
};
struct _emu10k_devc_t {
dev_info_t *dip;
audio_dev_t *adev;
ddi_acc_handle_t pcih;
ddi_acc_handle_t regsh;
caddr_t regs;
kmutex_t mutex;
ddi_dma_handle_t pt_dmah;
ddi_acc_handle_t pt_acch;
uint32_t pt_paddr;
caddr_t pt_kaddr;
uint32_t *page_map;
ddi_dma_handle_t silence_dmah;
ddi_acc_handle_t silence_acch;
uint32_t silence_paddr;
caddr_t silence_kaddr;
int feature_mask;
int max_mem, max_pages, nr_pages;
ac97_t *ac97;
ac97_ctrl_t *ac97_recsrc;
uint32_t ac97_stereomix;
emu10k_gpr_t gpr_shadow[MAX_GPR];
emu10k_ctrl_t ctrls[CTL_MAX];
int audio_memptr;
int *silent_page;
emu10k_portc_t *portc[EMU10K_NUM_PORTC];
};
#define INB(devc, reg) ddi_get8(devc->regsh, (void *)(reg))
#define OUTB(devc, val, reg) ddi_put8(devc->regsh, (void *)(reg), (val))
#define INW(devc, reg) ddi_get16(devc->regsh, (void *)(reg))
#define OUTW(devc, val, reg) ddi_put16(devc->regsh, (void *)(reg), (val))
#define INL(devc, reg) ddi_get32(devc->regsh, (void *)(reg))
#define OUTL(devc, val, reg) ddi_put32(devc->regsh, (void *)(reg), (val))
#endif
#endif