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