1558a398bSSimon Schubert /*- 2558a398bSSimon Schubert * Copyright (c) 2006 Stephane E. Potvin <sepotvin@videotron.ca> 32a1ad637SFrançois Tigeot * Copyright (c) 2008-2012 Alexander Motin <mav@FreeBSD.org> 4558a398bSSimon Schubert * All rights reserved. 5558a398bSSimon Schubert * 6558a398bSSimon Schubert * Redistribution and use in source and binary forms, with or without 7558a398bSSimon Schubert * modification, are permitted provided that the following conditions 8558a398bSSimon Schubert * are met: 9558a398bSSimon Schubert * 1. Redistributions of source code must retain the above copyright 10558a398bSSimon Schubert * notice, this list of conditions and the following disclaimer. 11558a398bSSimon Schubert * 2. Redistributions in binary form must reproduce the above copyright 12558a398bSSimon Schubert * notice, this list of conditions and the following disclaimer in the 13558a398bSSimon Schubert * documentation and/or other materials provided with the distribution. 14558a398bSSimon Schubert * 15558a398bSSimon Schubert * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16558a398bSSimon Schubert * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17558a398bSSimon Schubert * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18558a398bSSimon Schubert * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19558a398bSSimon Schubert * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20558a398bSSimon Schubert * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21558a398bSSimon Schubert * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22558a398bSSimon Schubert * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23558a398bSSimon Schubert * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24558a398bSSimon Schubert * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25558a398bSSimon Schubert * SUCH DAMAGE. 26558a398bSSimon Schubert * 272a1ad637SFrançois Tigeot * $FreeBSD: head/sys/dev/sound/pci/hda/hdac_private.h 230326 2012-01-19 01:55:48Z mav $ 28558a398bSSimon Schubert */ 29558a398bSSimon Schubert 30558a398bSSimon Schubert #ifndef _HDAC_PRIVATE_H_ 31558a398bSSimon Schubert #define _HDAC_PRIVATE_H_ 32558a398bSSimon Schubert 33558a398bSSimon Schubert /**************************************************************************** 344886ec58SHasso Tepper * Miscellaneous defines 35558a398bSSimon Schubert ****************************************************************************/ 36558a398bSSimon Schubert #define HDAC_CODEC_MAX 16 37558a398bSSimon Schubert 38558a398bSSimon Schubert /**************************************************************************** 39558a398bSSimon Schubert * Helper Macros 40558a398bSSimon Schubert ****************************************************************************/ 41558a398bSSimon Schubert #define HDAC_READ_1(mem, offset) \ 42558a398bSSimon Schubert bus_space_read_1((mem)->mem_tag, (mem)->mem_handle, (offset)) 43558a398bSSimon Schubert #define HDAC_READ_2(mem, offset) \ 44558a398bSSimon Schubert bus_space_read_2((mem)->mem_tag, (mem)->mem_handle, (offset)) 45558a398bSSimon Schubert #define HDAC_READ_4(mem, offset) \ 46558a398bSSimon Schubert bus_space_read_4((mem)->mem_tag, (mem)->mem_handle, (offset)) 47558a398bSSimon Schubert #define HDAC_WRITE_1(mem, offset, value) \ 48558a398bSSimon Schubert bus_space_write_1((mem)->mem_tag, (mem)->mem_handle, (offset), (value)) 49558a398bSSimon Schubert #define HDAC_WRITE_2(mem, offset, value) \ 50558a398bSSimon Schubert bus_space_write_2((mem)->mem_tag, (mem)->mem_handle, (offset), (value)) 51558a398bSSimon Schubert #define HDAC_WRITE_4(mem, offset, value) \ 52558a398bSSimon Schubert bus_space_write_4((mem)->mem_tag, (mem)->mem_handle, (offset), (value)) 53558a398bSSimon Schubert 54558a398bSSimon Schubert #define HDAC_ISDCTL(sc, n) (_HDAC_ISDCTL((n), (sc)->num_iss, (sc)->num_oss)) 55558a398bSSimon Schubert #define HDAC_ISDSTS(sc, n) (_HDAC_ISDSTS((n), (sc)->num_iss, (sc)->num_oss)) 56558a398bSSimon Schubert #define HDAC_ISDPICB(sc, n) (_HDAC_ISDPICB((n), (sc)->num_iss, (sc)->num_oss)) 57558a398bSSimon Schubert #define HDAC_ISDCBL(sc, n) (_HDAC_ISDCBL((n), (sc)->num_iss, (sc)->num_oss)) 58558a398bSSimon Schubert #define HDAC_ISDLVI(sc, n) (_HDAC_ISDLVI((n), (sc)->num_iss, (sc)->num_oss)) 59558a398bSSimon Schubert #define HDAC_ISDFIFOD(sc, n) (_HDAC_ISDFIFOD((n), (sc)->num_iss, (sc)->num_oss)) 60558a398bSSimon Schubert #define HDAC_ISDFMT(sc, n) (_HDAC_ISDFMT((n), (sc)->num_iss, (sc)->num_oss)) 61558a398bSSimon Schubert #define HDAC_ISDBDPL(sc, n) (_HDAC_ISDBDPL((n), (sc)->num_iss, (sc)->num_oss)) 62558a398bSSimon Schubert #define HDAC_ISDBDPU(sc, n) (_HDAC_ISDBDPU((n), (sc)->num_iss, (sc)->num_oss)) 63558a398bSSimon Schubert 64558a398bSSimon Schubert #define HDAC_OSDCTL(sc, n) (_HDAC_OSDCTL((n), (sc)->num_iss, (sc)->num_oss)) 65558a398bSSimon Schubert #define HDAC_OSDSTS(sc, n) (_HDAC_OSDSTS((n), (sc)->num_iss, (sc)->num_oss)) 66558a398bSSimon Schubert #define HDAC_OSDPICB(sc, n) (_HDAC_OSDPICB((n), (sc)->num_iss, (sc)->num_oss)) 67558a398bSSimon Schubert #define HDAC_OSDCBL(sc, n) (_HDAC_OSDCBL((n), (sc)->num_iss, (sc)->num_oss)) 68558a398bSSimon Schubert #define HDAC_OSDLVI(sc, n) (_HDAC_OSDLVI((n), (sc)->num_iss, (sc)->num_oss)) 69558a398bSSimon Schubert #define HDAC_OSDFIFOD(sc, n) (_HDAC_OSDFIFOD((n), (sc)->num_iss, (sc)->num_oss)) 70558a398bSSimon Schubert #define HDAC_OSDBDPL(sc, n) (_HDAC_OSDBDPL((n), (sc)->num_iss, (sc)->num_oss)) 71558a398bSSimon Schubert #define HDAC_OSDBDPU(sc, n) (_HDAC_OSDBDPU((n), (sc)->num_iss, (sc)->num_oss)) 72558a398bSSimon Schubert 73558a398bSSimon Schubert #define HDAC_BSDCTL(sc, n) (_HDAC_BSDCTL((n), (sc)->num_iss, (sc)->num_oss)) 74558a398bSSimon Schubert #define HDAC_BSDSTS(sc, n) (_HDAC_BSDSTS((n), (sc)->num_iss, (sc)->num_oss)) 75558a398bSSimon Schubert #define HDAC_BSDPICB(sc, n) (_HDAC_BSDPICB((n), (sc)->num_iss, (sc)->num_oss)) 76558a398bSSimon Schubert #define HDAC_BSDCBL(sc, n) (_HDAC_BSDCBL((n), (sc)->num_iss, (sc)->num_oss)) 77558a398bSSimon Schubert #define HDAC_BSDLVI(sc, n) (_HDAC_BSDLVI((n), (sc)->num_iss, (sc)->num_oss)) 78558a398bSSimon Schubert #define HDAC_BSDFIFOD(sc, n) (_HDAC_BSDFIFOD((n), (sc)->num_iss, (sc)->num_oss)) 79558a398bSSimon Schubert #define HDAC_BSDBDPL(sc, n) (_HDAC_BSDBDPL((n), (sc)->num_iss, (sc)->num_oss)) 80558a398bSSimon Schubert #define HDAC_BSDBDPU(sc, n) (_HDAC_BSDBDPU((n), (sc)->num_iss, (sc)->num_oss)) 81558a398bSSimon Schubert 82558a398bSSimon Schubert /**************************************************************************** 834886ec58SHasso Tepper * Custom hdac malloc type 844886ec58SHasso Tepper ****************************************************************************/ 854886ec58SHasso Tepper MALLOC_DECLARE(M_HDAC); 864886ec58SHasso Tepper 874886ec58SHasso Tepper /**************************************************************************** 88558a398bSSimon Schubert * struct hdac_mem 89558a398bSSimon Schubert * 90558a398bSSimon Schubert * Holds the resources necessary to describe the physical memory associated 91558a398bSSimon Schubert * with the device. 92558a398bSSimon Schubert ****************************************************************************/ 93558a398bSSimon Schubert struct hdac_mem { 94558a398bSSimon Schubert struct resource *mem_res; 95558a398bSSimon Schubert int mem_rid; 96558a398bSSimon Schubert bus_space_tag_t mem_tag; 97558a398bSSimon Schubert bus_space_handle_t mem_handle; 98558a398bSSimon Schubert }; 99558a398bSSimon Schubert 100558a398bSSimon Schubert /**************************************************************************** 101558a398bSSimon Schubert * struct hdac_irq 102558a398bSSimon Schubert * 103558a398bSSimon Schubert * Holds the resources necessary to describe the irq associated with the 104558a398bSSimon Schubert * device. 105558a398bSSimon Schubert ****************************************************************************/ 106558a398bSSimon Schubert struct hdac_irq { 107558a398bSSimon Schubert struct resource *irq_res; 108558a398bSSimon Schubert int irq_rid; 109558a398bSSimon Schubert void *irq_handle; 110558a398bSSimon Schubert }; 111558a398bSSimon Schubert 112558a398bSSimon Schubert /**************************************************************************** 113558a398bSSimon Schubert * struct hdac_dma 114558a398bSSimon Schubert * 115558a398bSSimon Schubert * This structure is used to hold all the information to manage the dma 116558a398bSSimon Schubert * states. 117558a398bSSimon Schubert ****************************************************************************/ 118558a398bSSimon Schubert struct hdac_dma { 119558a398bSSimon Schubert bus_dma_tag_t dma_tag; 120558a398bSSimon Schubert bus_dmamap_t dma_map; 121558a398bSSimon Schubert bus_addr_t dma_paddr; 1224886ec58SHasso Tepper bus_size_t dma_size; 123558a398bSSimon Schubert caddr_t dma_vaddr; 124558a398bSSimon Schubert }; 125558a398bSSimon Schubert 126558a398bSSimon Schubert /**************************************************************************** 127558a398bSSimon Schubert * struct hdac_rirb 128558a398bSSimon Schubert * 129558a398bSSimon Schubert * Hold a response from a verb sent to a codec received via the rirb. 130558a398bSSimon Schubert ****************************************************************************/ 131558a398bSSimon Schubert struct hdac_rirb { 132558a398bSSimon Schubert uint32_t response; 133558a398bSSimon Schubert uint32_t response_ex; 134558a398bSSimon Schubert }; 135558a398bSSimon Schubert 136558a398bSSimon Schubert #define HDAC_RIRB_RESPONSE_EX_SDATA_IN_MASK 0x0000000f 137558a398bSSimon Schubert #define HDAC_RIRB_RESPONSE_EX_SDATA_IN_OFFSET 0 138558a398bSSimon Schubert #define HDAC_RIRB_RESPONSE_EX_UNSOLICITED 0x00000010 139558a398bSSimon Schubert 140558a398bSSimon Schubert #define HDAC_RIRB_RESPONSE_EX_SDATA_IN(response_ex) \ 141558a398bSSimon Schubert (((response_ex) & HDAC_RIRB_RESPONSE_EX_SDATA_IN_MASK) >> \ 142558a398bSSimon Schubert HDAC_RIRB_RESPONSE_EX_SDATA_IN_OFFSET) 143558a398bSSimon Schubert 144558a398bSSimon Schubert struct hdac_bdle { 145558a398bSSimon Schubert volatile uint32_t addrl; 146558a398bSSimon Schubert volatile uint32_t addrh; 147558a398bSSimon Schubert volatile uint32_t len; 148558a398bSSimon Schubert volatile uint32_t ioc; 149558a398bSSimon Schubert } __packed; 150558a398bSSimon Schubert 1512a1ad637SFrançois Tigeot struct hdac_stream { 152558a398bSSimon Schubert device_t dev; 1532a1ad637SFrançois Tigeot struct hdac_dma bdl; 154558a398bSSimon Schubert int dir; 1552a1ad637SFrançois Tigeot int stream; 1562a1ad637SFrançois Tigeot int blksz; 1572a1ad637SFrançois Tigeot int running; 1582a1ad637SFrançois Tigeot int bw; 1592a1ad637SFrançois Tigeot int stripe; 1602a1ad637SFrançois Tigeot uint16_t format; 161558a398bSSimon Schubert }; 162558a398bSSimon Schubert 163558a398bSSimon Schubert struct hdac_softc { 164558a398bSSimon Schubert device_t dev; 165*67931cc4SFrançois Tigeot struct lock *lock; 166558a398bSSimon Schubert 167558a398bSSimon Schubert struct intr_config_hook intrhook; 168558a398bSSimon Schubert 169558a398bSSimon Schubert struct hdac_mem mem; 170558a398bSSimon Schubert struct hdac_irq irq; 171558a398bSSimon Schubert 1722a1ad637SFrançois Tigeot uint32_t quirks_on; 1732a1ad637SFrançois Tigeot uint32_t quirks_off; 1746ef811ffSHasso Tepper uint32_t flags; 1752a1ad637SFrançois Tigeot #define HDAC_F_DMA_NOCACHE 0x00000001 176558a398bSSimon Schubert 177558a398bSSimon Schubert int num_iss; 178558a398bSSimon Schubert int num_oss; 179558a398bSSimon Schubert int num_bss; 1802a1ad637SFrançois Tigeot int num_ss; 1812a1ad637SFrançois Tigeot int num_sdo; 182558a398bSSimon Schubert int support_64bit; 183558a398bSSimon Schubert 184558a398bSSimon Schubert int corb_size; 185558a398bSSimon Schubert struct hdac_dma corb_dma; 186558a398bSSimon Schubert int corb_wp; 187558a398bSSimon Schubert 188558a398bSSimon Schubert int rirb_size; 189558a398bSSimon Schubert struct hdac_dma rirb_dma; 190558a398bSSimon Schubert int rirb_rp; 191558a398bSSimon Schubert 1924886ec58SHasso Tepper struct hdac_dma pos_dma; 1934886ec58SHasso Tepper 194558a398bSSimon Schubert bus_dma_tag_t chan_dmat; 195558a398bSSimon Schubert 1962a1ad637SFrançois Tigeot /* Polling */ 1974886ec58SHasso Tepper int polling; 1984886ec58SHasso Tepper int poll_ival; 1992a1ad637SFrançois Tigeot struct callout poll_callout; 2004886ec58SHasso Tepper 2012a1ad637SFrançois Tigeot int unsol_registered; 20219c72e40SHasso Tepper struct task unsolq_task; 203558a398bSSimon Schubert #define HDAC_UNSOLQ_MAX 64 204558a398bSSimon Schubert #define HDAC_UNSOLQ_READY 0 205558a398bSSimon Schubert #define HDAC_UNSOLQ_BUSY 1 206558a398bSSimon Schubert int unsolq_rp; 207558a398bSSimon Schubert int unsolq_wp; 208558a398bSSimon Schubert int unsolq_st; 209558a398bSSimon Schubert uint32_t unsolq[HDAC_UNSOLQ_MAX]; 210558a398bSSimon Schubert 2112a1ad637SFrançois Tigeot int sdo_bw_used; 212558a398bSSimon Schubert 2132a1ad637SFrançois Tigeot struct hdac_stream *streams; 2142a1ad637SFrançois Tigeot 2152a1ad637SFrançois Tigeot struct { 2162a1ad637SFrançois Tigeot device_t dev; 2172a1ad637SFrançois Tigeot uint16_t vendor_id; 2182a1ad637SFrançois Tigeot uint16_t device_id; 2192a1ad637SFrançois Tigeot uint8_t revision_id; 2202a1ad637SFrançois Tigeot uint8_t stepping_id; 2212a1ad637SFrançois Tigeot int pending; 2222a1ad637SFrançois Tigeot uint32_t response; 2232a1ad637SFrançois Tigeot int sdi_bw_used; 2242a1ad637SFrançois Tigeot } codecs[HDAC_CODEC_MAX]; 225558a398bSSimon Schubert }; 226558a398bSSimon Schubert 227558a398bSSimon Schubert #endif 228