Annotation of sys/dev/pci/azalia.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: azalia.h,v 1.11 2007/07/23 02:03:42 deanna Exp $ */
! 2: /* $NetBSD: azalia.h,v 1.6 2006/01/16 14:15:26 kent Exp $ */
! 3:
! 4: /*-
! 5: * Copyright (c) 2005 The NetBSD Foundation, Inc.
! 6: * All rights reserved.
! 7: *
! 8: * This code is derived from software contributed to The NetBSD Foundation
! 9: * by TAMURA Kent
! 10: *
! 11: * Redistribution and use in source and binary forms, with or without
! 12: * modification, are permitted provided that the following conditions
! 13: * are met:
! 14: * 1. Redistributions of source code must retain the above copyright
! 15: * notice, this list of conditions and the following disclaimer.
! 16: * 2. Redistributions in binary form must reproduce the above copyright
! 17: * notice, this list of conditions and the following disclaimer in the
! 18: * documentation and/or other materials provided with the distribution.
! 19: * 3. All advertising materials mentioning features or use of this software
! 20: * must display the following acknowledgement:
! 21: * This product includes software developed by the NetBSD
! 22: * Foundation, Inc. and its contributors.
! 23: * 4. Neither the name of The NetBSD Foundation nor the names of its
! 24: * contributors may be used to endorse or promote products derived
! 25: * from this software without specific prior written permission.
! 26: *
! 27: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
! 28: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
! 29: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
! 30: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
! 31: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
! 32: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
! 33: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
! 34: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
! 35: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
! 36: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
! 37: * POSSIBILITY OF SUCH DAMAGE.
! 38: */
! 39:
! 40: #include <sys/types.h>
! 41: #include <sys/audioio.h>
! 42:
! 43: /* ----------------------------------------------------------------
! 44: * High Definition Audio constant values
! 45: * ---------------------------------------------------------------- */
! 46:
! 47: /* High Definition Audio registers */
! 48: #define HDA_GCAP 0x000 /* 2 */
! 49: #define HDA_GCAP_OSS(x) ((x & 0xf000) >> 12)
! 50: #define HDA_GCAP_ISS(x) ((x & 0x0f00) >> 8)
! 51: #define HDA_GCAP_BSS(x) ((x & 0x00f8) >> 3)
! 52: #define HDA_GCAP_NSDO_MASK 0x0006
! 53: #define HDA_GCAP_NSDO_1 0x0000
! 54: #define HDA_GCAP_NSDO_2 0x0002
! 55: #define HDA_GCAP_NSDO_4 0x0004
! 56: #define HDA_GCAP_NSDO_RESERVED 0x0006
! 57: #define HDA_GCAP_64OK 0x0001
! 58: #define HDA_VMIN 0x002 /* 1 */
! 59: #define HDA_VMAJ 0x003 /* 1 */
! 60: #define HDA_OUTPAY 0x004 /* 2 */
! 61: #define HDA_INPAY 0x006 /* 2 */
! 62: #define HDA_GCTL 0x008 /* 4 */
! 63: #define HDA_GCTL_UNSOL 0x00000100
! 64: #define HDA_GCTL_FCNTRL 0x00000002
! 65: #define HDA_GCTL_CRST 0x00000001
! 66: #define HDA_WAKEEN 0x00c /* 2 */
! 67: #define HDA_WAKEEN_SDIWEN 0x7fff
! 68: #define HDA_STATESTS 0x00e /* 2 */
! 69: #define HDA_STATESTS_SDIWAKE 0x7fff
! 70: #define HDA_GSTS 0x010 /* 2 */
! 71: #define HDA_GSTS_FSTS 0x0002
! 72: #define HDA_OUTSTRMPAY 0x018 /* 2 */
! 73: #define HDA_INSTRMPAY 0x01a /* 2 */
! 74: #define HDA_INTCTL 0x020 /* 4 */
! 75: #define HDA_INTCTL_GIE 0x80000000
! 76: #define HDA_INTCTL_CIE 0x40000000
! 77: #define HDA_INTCTL_SIE 0x3fffffff
! 78: #define HDA_INTSTS 0x024 /* 4 */
! 79: #define HDA_INTSTS_GIS 0x80000000
! 80: #define HDA_INTSTS_CIS 0x40000000
! 81: #define HDA_INTSTS_SIS 0x3fffffff
! 82: #define HDA_WALCLK 0x030 /* 4 */
! 83: #define HDA_SSYNC 0x034 /* 4 */
! 84: #define HDA_SSYNC_SSYNC 0x3fffffff
! 85: #define HDA_CORBLBASE 0x040 /* 4 */
! 86: #define HDA_CORBUBASE 0x044 /* 4 */
! 87: #define HDA_CORBWP 0x048 /* 2 */
! 88: #define HDA_CORBWP_CORBWP 0x00ff
! 89: #define HDA_CORBRP 0x04a /* 2 */
! 90: #define HDA_CORBRP_CORBRPRST 0x8000
! 91: #define HDA_CORBRP_CORBRP 0x00ff
! 92: #define HDA_CORBCTL 0x04c /* 1 */
! 93: #define HDA_CORBCTL_CORBRUN 0x02
! 94: #define HDA_CORBCTL_CMEIE 0x01
! 95: #define HDA_CORBSTS 0x04d /* 1 */
! 96: #define HDA_CORBSTS_CMEI 0x01
! 97: #define HDA_CORBSIZE 0x04e /* 1 */
! 98: #define HDA_CORBSIZE_CORBSZCAP_MASK 0xf0
! 99: #define HDA_CORBSIZE_CORBSZCAP_2 0x10
! 100: #define HDA_CORBSIZE_CORBSZCAP_16 0x20
! 101: #define HDA_CORBSIZE_CORBSZCAP_256 0x40
! 102: #define HDA_CORBSIZE_CORBSIZE_MASK 0x03
! 103: #define HDA_CORBSIZE_CORBSIZE_2 0x00
! 104: #define HDA_CORBSIZE_CORBSIZE_16 0x01
! 105: #define HDA_CORBSIZE_CORBSIZE_256 0x02
! 106: #define HDA_RIRBLBASE 0x050 /* 4 */
! 107: #define HDA_RIRBUBASE 0x054 /* 4 */
! 108: #define HDA_RIRBWP 0x058 /* 2 */
! 109: #define HDA_RIRBWP_RIRBWPRST 0x8000
! 110: #define HDA_RIRBWP_RIRBWP 0x00ff
! 111: #define HDA_RINTCNT 0x05a /* 2 */
! 112: #define HDA_RINTCNT_RINTCNT 0x00ff
! 113: #define HDA_RIRBCTL 0x05c /* 1 */
! 114: #define HDA_RIRBCTL_RIRBOIC 0x04
! 115: #define HDA_RIRBCTL_RIRBDMAEN 0x02
! 116: #define HDA_RIRBCTL_RINTCTL 0x01
! 117: #define HDA_RIRBSTS 0x05d /* 1 */
! 118: #define HDA_RIRBSTS_RIRBOIS 0x04
! 119: #define HDA_RIRBSTS_RINTFL 0x01
! 120: #define HDA_RIRBSIZE 0x05e /* 1 */
! 121: #define HDA_RIRBSIZE_RIRBSZCAP_MASK 0xf0
! 122: #define HDA_RIRBSIZE_RIRBSZCAP_2 0x10
! 123: #define HDA_RIRBSIZE_RIRBSZCAP_16 0x20
! 124: #define HDA_RIRBSIZE_RIRBSZCAP_256 0x40
! 125: #define HDA_RIRBSIZE_RIRBSIZE_MASK 0x03
! 126: #define HDA_RIRBSIZE_RIRBSIZE_2 0x00
! 127: #define HDA_RIRBSIZE_RIRBSIZE_16 0x01
! 128: #define HDA_RIRBSIZE_RIRBSIZE_256 0x02
! 129: #define HDA_IC 0x060 /* 4 */
! 130: #define HDA_IR 0x064 /* 4 */
! 131: #define HDA_IRS 0x068 /* 2 */
! 132: #define HDA_IRS_IRRADD 0x00f0
! 133: #define HDA_IRS_IRRUNSOL 0x0008
! 134: #define HDA_IRS_IRV 0x0002
! 135: #define HDA_IRS_ICB 0x0001
! 136: #define HDA_DPLBASE 0x070 /* 4 */
! 137: #define HDA_DPLBASE_DPLBASE 0xffffff80
! 138: #define HDA_DPLBASE_ENABLE 0x00000001
! 139: #define HDA_DPUBASE 0x074
! 140:
! 141: #define HDA_SD_BASE 0x080
! 142: #define HDA_SD_CTL 0x00 /* 2 */
! 143: #define HDA_SD_CTL_DEIE 0x0010
! 144: #define HDA_SD_CTL_FEIE 0x0008
! 145: #define HDA_SD_CTL_IOCE 0x0004
! 146: #define HDA_SD_CTL_RUN 0x0002
! 147: #define HDA_SD_CTL_SRST 0x0001
! 148: #define HDA_SD_CTL2 0x02 /* 1 */
! 149: #define HDA_SD_CTL2_STRM 0xf0
! 150: #define HDA_SD_CTL2_STRM_SHIFT 4
! 151: #define HDA_SD_CTL2_DIR 0x08
! 152: #define HDA_SD_CTL2_TP 0x04
! 153: #define HDA_SD_CTL2_STRIPE 0x03
! 154: #define HDA_SD_STS 0x03 /* 1 */
! 155: #define HDA_SD_STS_FIFORDY 0x20
! 156: #define HDA_SD_STS_DESE 0x10
! 157: #define HDA_SD_STS_FIFOE 0x08
! 158: #define HDA_SD_STS_BCIS 0x04
! 159: #define HDA_SD_LPIB 0x04 /* 4 */
! 160: #define HDA_SD_CBL 0x08 /* 4 */
! 161: #define HDA_SD_LVI 0x0c /* 2 */
! 162: #define HDA_SD_LVI_LVI 0x00ff
! 163: #define HDA_SD_FIFOW 0x0e /* 2 */
! 164: #define HDA_SD_FIFOS 0x10 /* 2 */
! 165: #define HDA_SD_FMT 0x12 /* 2 */
! 166: #define HDA_SD_FMT_BASE 0x4000
! 167: #define HDA_SD_FMT_BASE_48 0x0000
! 168: #define HDA_SD_FMT_BASE_44 0x4000
! 169: #define HDA_SD_FMT_MULT 0x3800
! 170: #define HDA_SD_FMT_MULT_X1 0x0000
! 171: #define HDA_SD_FMT_MULT_X2 0x0800
! 172: #define HDA_SD_FMT_MULT_X3 0x1000
! 173: #define HDA_SD_FMT_MULT_X4 0x1800
! 174: #define HDA_SD_FMT_DIV 0x0700
! 175: #define HDA_SD_FMT_DIV_BY1 0x0000
! 176: #define HDA_SD_FMT_DIV_BY2 0x0100
! 177: #define HDA_SD_FMT_DIV_BY3 0x0200
! 178: #define HDA_SD_FMT_DIV_BY4 0x0300
! 179: #define HDA_SD_FMT_DIV_BY5 0x0400
! 180: #define HDA_SD_FMT_DIV_BY6 0x0500
! 181: #define HDA_SD_FMT_DIV_BY7 0x0600
! 182: #define HDA_SD_FMT_DIV_BY8 0x0700
! 183: #define HDA_SD_FMT_BITS 0x0070
! 184: #define HDA_SD_FMT_BITS_8_16 0x0000
! 185: #define HDA_SD_FMT_BITS_16_16 0x0010
! 186: #define HDA_SD_FMT_BITS_20_32 0x0020
! 187: #define HDA_SD_FMT_BITS_24_32 0x0030
! 188: #define HDA_SD_FMT_BITS_32_32 0x0040
! 189: #define HDA_SD_FMT_CHAN 0x000f
! 190: #define HDA_SD_BDPL 0x18 /* 4 */
! 191: #define HDA_SD_BDPU 0x1c /* 4 */
! 192: #define HDA_SD_SIZE 0x20
! 193:
! 194: /* CORB commands */
! 195: #define CORB_GET_PARAMETER 0xf00
! 196: #define COP_VENDOR_ID 0x00
! 197: #define COP_VID_VENDOR(x) (x >> 16)
! 198: #define COP_VID_DEVICE(x) (x & 0xffff)
! 199: #define COP_REVISION_ID 0x02
! 200: #define COP_RID_MAJ(x) ((x >> 20) & 0x0f)
! 201: #define COP_RID_MIN(x) ((x >> 16) & 0x0f)
! 202: #define COP_RID_REVISION(x) ((x >> 8) & 0xff)
! 203: #define COP_RID_STEPPING(x) (x & 0xff)
! 204: #define COP_SUBORDINATE_NODE_COUNT 0x04
! 205: #define COP_START_NID(x) ((x & 0x00ff0000) >> 16)
! 206: #define COP_NSUBNODES(x) (x & 0x000000ff)
! 207: #define COP_FUNCTION_GROUP_TYPE 0x05
! 208: #define COP_FTYPE(x) (x & 0x000000ff)
! 209: #define COP_FTYPE_RESERVED 0x01
! 210: #define COP_FTYPE_AUDIO 0x01
! 211: #define COP_FTYPE_MODEM 0x02
! 212: #define COP_AUDIO_FUNCTION_GROUP_CAPABILITY 0x08
! 213: #define COP_AUDIO_WIDGET_CAP 0x09
! 214: #define COP_AWCAP_TYPE(x) ((x >> 20) & 0xf)
! 215: #define COP_AWTYPE_AUDIO_OUTPUT 0x0
! 216: #define COP_AWTYPE_AUDIO_INPUT 0x1
! 217: #define COP_AWTYPE_AUDIO_MIXER 0x2
! 218: #define COP_AWTYPE_AUDIO_SELECTOR 0x3
! 219: #define COP_AWTYPE_PIN_COMPLEX 0x4
! 220: #define COP_AWTYPE_POWER 0x5
! 221: #define COP_AWTYPE_VOLUME_KNOB 0x6
! 222: #define COP_AWTYPE_BEEP_GENERATOR 0x7
! 223: #define COP_AWTYPE_VENDOR_DEFINED 0xf
! 224: #define COP_AWCAP_STEREO 0x001
! 225: #define COP_AWCAP_INAMP 0x002
! 226: #define COP_AWCAP_OUTAMP 0x004
! 227: #define COP_AWCAP_AMPOV 0x008
! 228: #define COP_AWCAP_FORMATOV 0x010
! 229: #define COP_AWCAP_STRIPE 0x020
! 230: #define COP_AWCAP_PROC 0x040
! 231: #define COP_AWCAP_UNSOL 0x080
! 232: #define COP_AWCAP_CONNLIST 0x100
! 233: #define COP_AWCAP_DIGITAL 0x200
! 234: #define COP_AWCAP_POWER 0x400
! 235: #define COP_AWCAP_LRSWAP 0x800
! 236: #define COP_AWCAP_DELAY(x) ((x >> 16) & 0xf)
! 237: #define COP_PCM 0x0a
! 238: #define COP_PCM_B32 0x00100000
! 239: #define COP_PCM_B24 0x00080000
! 240: #define COP_PCM_B20 0x00040000
! 241: #define COP_PCM_B16 0x00020000
! 242: #define COP_PCM_B8 0x00010000
! 243: #define COP_PCM_R3840 0x00000800
! 244: #define COP_PCM_R1920 0x00000400
! 245: #define COP_PCM_R1764 0x00000200
! 246: #define COP_PCM_R960 0x00000100
! 247: #define COP_PCM_R882 0x00000080
! 248: #define COP_PCM_R480 0x00000040
! 249: #define COP_PCM_R441 0x00000020
! 250: #define COP_PCM_R320 0x00000010
! 251: #define COP_PCM_R220 0x00000008
! 252: #define COP_PCM_R160 0x00000004
! 253: #define COP_PCM_R110 0x00000002
! 254: #define COP_PCM_R80 0x00000001
! 255: #define COP_STREAM_FORMATS 0x0b
! 256: #define COP_STREAM_FORMAT_PCM 0x00000001
! 257: #define COP_STREAM_FORMAT_FLOAT32 0x00000002
! 258: #define COP_STREAM_FORMAT_AC3 0x00000003
! 259: #define COP_PINCAP 0x0c
! 260: #define COP_PINCAP_IMPEDANCE 0x00000001
! 261: #define COP_PINCAP_TRIGGER 0x00000002
! 262: #define COP_PINCAP_PRESENCE 0x00000004
! 263: #define COP_PINCAP_HEADPHONE 0x00000008
! 264: #define COP_PINCAP_OUTPUT 0x00000010
! 265: #define COP_PINCAP_INPUT 0x00000020
! 266: #define COP_PINCAP_BALANCE 0x00000040
! 267: #define COP_PINCAP_VREF(x) ((x >> 8) & 0xff)
! 268: #define COP_PINCAP_EAPD 0x00010000
! 269: #define COP_INPUT_AMPCAP 0x0d
! 270: #define COP_AMPCAP_OFFSET(x) (x & 0x0000007f)
! 271: #define COP_AMPCAP_NUMSTEPS(x) ((x >> 8) & 0x7f)
! 272: #define COP_AMPCAP_STEPSIZE(x) ((x >> 16) & 0x7f)
! 273: #define COP_AMPCAP_MUTE 0x80000000
! 274: #define COP_CONNECTION_LIST_LENGTH 0x0e
! 275: #define COP_CLL_LONG 0x00000080
! 276: #define COP_CLL_LENGTH(x) (x & 0x0000007f)
! 277: #define COP_SUPPORTED_POWER_STATES 0x0f
! 278: #define COP_PROCESSING_CAPABILITIES 0x10
! 279: #define COP_GPIO_COUNT 0x11
! 280: #define COP_OUTPUT_AMPCAP 0x12
! 281: #define COP_VOLUME_KNOB_CAPABILITIES 0x13
! 282: #define COP_VKCAP_DELTA 0x00000080
! 283: #define COP_VKCAP_NUMSTEPS(x) (x & 0x7f)
! 284: #define CORB_GET_CONNECTION_SELECT_CONTROL 0xf01
! 285: #define CORB_CSC_INDEX(x) (x & 0xff)
! 286: #define CORB_SET_CONNECTION_SELECT_CONTROL 0x701
! 287: #define CORB_GET_CONNECTION_LIST_ENTRY 0xf02
! 288: #define CORB_CLE_LONG_0(x) (x & 0x0000ffff)
! 289: #define CORB_CLE_LONG_1(x) ((x & 0xffff0000) >> 16)
! 290: #define CORB_CLE_SHORT_0(x) (x & 0xff)
! 291: #define CORB_CLE_SHORT_1(x) ((x >> 8) & 0xff)
! 292: #define CORB_CLE_SHORT_2(x) ((x >> 16) & 0xff)
! 293: #define CORB_CLE_SHORT_3(x) ((x >> 24) & 0xff)
! 294: #define CORB_GET_PROCESSING_STATE 0xf03
! 295: #define CORB_SET_PROCESSING_STATE 0x703
! 296: #define CORB_GET_COEFFICIENT_INDEX 0xd00
! 297: #define CORB_SET_COEFFICIENT_INDEX 0x500
! 298: #define CORB_GET_PROCESSING_COEFFICIENT 0xc00
! 299: #define CORB_SET_PROCESSING_COEFFICIENT 0x400
! 300: #define CORB_GET_AMPLIFIER_GAIN_MUTE 0xb00
! 301: #define CORB_GAGM_INPUT 0x0000
! 302: #define CORB_GAGM_OUTPUT 0x8000
! 303: #define CORB_GAGM_RIGHT 0x0000
! 304: #define CORB_GAGM_LEFT 0x2000
! 305: #define CORB_GAGM_MUTE 0x00000080
! 306: #define CORB_GAGM_GAIN(x) (x & 0x0000007f)
! 307: #define CORB_SET_AMPLIFIER_GAIN_MUTE 0x300
! 308: #define CORB_AGM_GAIN_MASK 0x007f
! 309: #define CORB_AGM_MUTE 0x0080
! 310: #define CORB_AGM_INDEX_SHIFT 8
! 311: #define CORB_AGM_RIGHT 0x1000
! 312: #define CORB_AGM_LEFT 0x2000
! 313: #define CORB_AGM_INPUT 0x4000
! 314: #define CORB_AGM_OUTPUT 0x8000
! 315: #define CORB_GET_CONVERTER_FORMAT 0xa00
! 316: #define CORB_SET_CONVERTER_FORMAT 0x200
! 317: #define CORB_GET_DIGITAL_CONVERTER_CONTROL 0xf0d
! 318: #define CORB_SET_DIGITAL_CONVERTER_CONTROL_L 0x70d
! 319: #define CORB_SET_DIGITAL_CONVERTER_CONTROL_H 0x70e
! 320: #define CORB_GET_POWER_STATE 0xf05
! 321: #define CORB_SET_POWER_STATE 0x705
! 322: #define CORB_PS_D0 0x0
! 323: #define CORB_PS_D1 0x1
! 324: #define CORB_PS_D2 0x2
! 325: #define CORB_PS_D3 0x3
! 326: #define CORB_GET_CONVERTER_STREAM_CHANNEL 0xf06
! 327: #define CORB_SET_CONVERTER_STREAM_CHANNEL 0x706
! 328: #define CORB_GET_INPUT_CONVERTER_SDI_SELECT 0xf04
! 329: #define CORB_SET_INPUT_CONVERTER_SDI_SELECT 0x704
! 330: #define CORB_GET_PIN_WIDGET_CONTROL 0xf07
! 331: #define CORB_SET_PIN_WIDGET_CONTROL 0x707
! 332: #define CORB_PWC_HEADPHONE 0x80
! 333: #define CORB_PWC_OUTPUT 0x40
! 334: #define CORB_PWC_INPUT 0x20
! 335: #define CORB_PWC_VREF_HIZ 0x00
! 336: #define CORB_PWC_VREF_50 0x01
! 337: #define CORB_PWC_VREF_GND 0x02
! 338: #define CORB_PWC_VREF_80 0x04
! 339: #define CORB_PWC_VREF_100 0x05
! 340: #define CORB_GET_UNSOLICITED_RESPONSE 0xf08
! 341: #define CORB_SET_UNSOLICITED_RESPONSE 0x708
! 342: #define CORB_UNSOL_ENABLE 0x80
! 343: #define CORB_UNSOL_TAG(x) (x & 0x3f)
! 344: #define CORB_GET_PIN_SENSE 0xf09
! 345: #define CORB_PS_PRESENCE 0x80000000
! 346: #define CORB_PS_IMPEDANCE(x) (x & 0x7fffffff)
! 347: #define CORB_EXECUTE_PIN_SENSE 0x709
! 348: #define CORB_PS_RIGHT 0x1
! 349: #define CORB_GET_EAPD_BTL_ENABLE 0xf0c
! 350: #define CORB_SET_EAPD_BTL_ENABLE 0x70c
! 351: #define CORB_GET_GPI_DATA 0xf10
! 352: #define CORB_SET_GPI_DATA 0x710
! 353: #define CORB_GET_GPI_WAKE_ENABLE_MASK 0xf11
! 354: #define CORB_SET_GPI_WAKE_ENABLE_MASK 0x711
! 355: #define CORB_GET_GPI_UNSOLICITED_ENABLE_MASK 0xf12
! 356: #define CORB_SET_GPI_UNSOLICITED_ENABLE_MASK 0x712
! 357: #define CORB_GET_GPI_STICKY_MASK 0xf13
! 358: #define CORB_SET_GPI_STICKY_MASK 0x713
! 359: #define CORB_GET_GPO_DATA 0xf14
! 360: #define CORB_SET_GPO_DATA 0x714
! 361: #define CORB_GET_GPIO_DATA 0xf15
! 362: #define CORB_SET_GPIO_DATA 0x715
! 363: #define CORB_GET_GPIO_ENABLE_MASK 0xf16
! 364: #define CORB_SET_GPIO_ENABLE_MASK 0x716
! 365: #define CORB_GET_GPIO_DIRECTION 0xf17
! 366: #define CORB_SET_GPIO_DIRECTION 0x717
! 367: #define CORB_GET_GPIO_WAKE_ENABLE_MASK 0xf18
! 368: #define CORB_SET_GPIO_WAKE_ENABLE_MASK 0x718
! 369: #define CORB_GET_GPIO_UNSOLICITED_ENABLE_MASK 0xf19
! 370: #define CORB_SET_GPIO_UNSOLICITED_ENABLE_MASK 0x719
! 371: #define CORB_GET_GPIO_STICKY_MASK 0xf1a
! 372: #define CORB_SET_GPIO_STICKY_MASK 0x71a
! 373: #define CORB_GET_BEEP_GENERATION 0xf0a
! 374: #define CORB_SET_BEEP_GENERATION 0x70a
! 375: #define CORB_GET_VOLUME_KNOB 0xf0f
! 376: #define CORB_SET_VOLUME_KNOB 0x70f
! 377: #define CORB_VKNOB_DIRECT 0x80
! 378: #define CORB_VKNOB_VOLUME(x) (x & 0x7f)
! 379: #define CORB_GET_SUBSYSTEM_ID 0xf20
! 380: #define CORB_SET_SUBSYSTEM_ID_1 0x720
! 381: #define CORB_SET_SUBSYSTEM_ID_2 0x721
! 382: #define CORB_SET_SUBSYSTEM_ID_3 0x722
! 383: #define CORB_SET_SUBSYSTEM_ID_4 0x723
! 384: #define CORB_GET_CONFIGURATION_DEFAULT 0xf1c
! 385: #define CORB_SET_CONFIGURATION_DEFAULT_1 0x71c
! 386: #define CORB_SET_CONFIGURATION_DEFAULT_2 0x71d
! 387: #define CORB_SET_CONFIGURATION_DEFAULT_3 0x71e
! 388: #define CORB_SET_CONFIGURATION_DEFAULT_4 0x71f
! 389: #define CORB_CD_SEQUENCE(x) (x & 0x0000000f)
! 390: #define CORB_CD_SEQUENCE_MAX 0x0f
! 391: #define CORB_CD_ASSOCIATION(x) ((x >> 4) & 0xf)
! 392: #define CORB_CD_ASSOCIATION_MAX 0x0f
! 393: #define CORB_CD_MISC_MASK 0x00000f00
! 394: #define CORB_CD_COLOR(x) ((x >> 12) & 0xf)
! 395: #define CORB_CD_COLOR_UNKNOWN 0x0
! 396: #define CORB_CD_BLACK 0x1
! 397: #define CORB_CD_GRAY 0x2
! 398: #define CORB_CD_BLUE 0x3
! 399: #define CORB_CD_GREEN 0x4
! 400: #define CORB_CD_RED 0x5
! 401: #define CORB_CD_ORANGE 0x6
! 402: #define CORB_CD_YELLOW 0x7
! 403: #define CORB_CD_PURPLE 0x8
! 404: #define CORB_CD_PINK 0x9
! 405: #define CORB_CD_WHITE 0xe
! 406: #define CORB_CD_COLOR_OTHER 0xf
! 407: #define CORB_CD_CONNECTION_MASK 0x000f0000
! 408: #define CORB_CD_DEVICE(x) ((x >> 20) & 0xf)
! 409: #define CORB_CD_LINEOUT 0x0
! 410: #define CORB_CD_SPEAKER 0x1
! 411: #define CORB_CD_HEADPHONE 0x2
! 412: #define CORB_CD_CD 0x3
! 413: #define CORB_CD_SPDIFOUT 0x4
! 414: #define CORB_CD_DIGITALOUT 0x5
! 415: #define CORB_CD_MODEMLINE 0x6
! 416: #define CORB_CD_MODEMHANDSET 0x7
! 417: #define CORB_CD_LINEIN 0x8
! 418: #define CORB_CD_AUX 0x9
! 419: #define CORB_CD_MICIN 0xa
! 420: #define CORB_CD_TELEPHONY 0xb
! 421: #define CORB_CD_SPDIFIN 0xc
! 422: #define CORB_CD_DIGITALIN 0xd
! 423: #define CORB_CD_DEVICE_OTHER 0xf
! 424: #define CORB_CD_LOCATION_MASK 0x3f000000
! 425: #define CORB_CD_PORT_MASK 0xc0000000
! 426: #define CORB_GET_STRIPE_CONTROL 0xf24
! 427: #define CORB_SET_STRIPE_CONTROL 0x720 /* XXX typo in the spec? */
! 428: #define CORB_EXECUTE_FUNCTION_RESET 0x7ff
! 429:
! 430: #define CORB_NID_ROOT 0
! 431: #define HDA_MAX_CHANNELS 16
! 432:
! 433: /* memory-mapped types */
! 434: typedef struct {
! 435: uint32_t low;
! 436: uint32_t high;
! 437: uint32_t length;
! 438: uint32_t flags;
! 439: #define BDLIST_ENTRY_IOC 0x00000001
! 440: } __packed bdlist_entry_t;
! 441: #define HDA_BDL_MAX 256
! 442:
! 443: typedef struct {
! 444: uint32_t position;
! 445: uint32_t reserved;
! 446: } __packed dmaposition_t;
! 447:
! 448: typedef uint32_t corb_entry_t;
! 449: typedef struct {
! 450: uint32_t resp;
! 451: uint32_t resp_ex;
! 452: #define RIRB_UNSOL_TAG(resp) ((resp) >> 26)
! 453: #define RIRB_RESP_UNSOL (1 << 4)
! 454: #define RIRB_RESP_CODEC(ex) ((ex) & 0xf)
! 455: } __packed rirb_entry_t;
! 456:
! 457:
! 458: /* #define AZALIA_DEBUG */
! 459: #ifdef AZALIA_DEBUG
! 460: # define DPRINTF(x) do { printf x; } while (0/*CONSTCOND*/)
! 461: #else
! 462: # define DPRINTF(x) do {} while (0/*CONSTCOND*/)
! 463: #endif
! 464: #define PTR_UPPER32(x) ((uint64_t)(x) >> 32)
! 465: #define FLAGBUFLEN 256
! 466: #define MAX_VOLUME_255 1
! 467:
! 468: typedef int nid_t;
! 469:
! 470: typedef struct {
! 471: nid_t nid;
! 472: uint32_t widgetcap;
! 473: int type; /* = bit20-24 of widgetcap */
! 474: int nconnections;
! 475: nid_t *connections;
! 476: int selected;
! 477: uint32_t inamp_cap;
! 478: uint32_t outamp_cap;
! 479: char name[MAX_AUDIO_DEV_LEN];
! 480: union {
! 481: struct { /* for AUDIO_INPUT/OUTPUT */
! 482: uint32_t encodings;
! 483: uint32_t bits_rates;
! 484: } audio;
! 485: struct { /* for PIN */
! 486: uint32_t cap;
! 487: uint32_t config;
! 488: int sequence;
! 489: int association;
! 490: int color;
! 491: int device;
! 492: } pin;
! 493: struct { /* for VOLUME_KNOB */
! 494: uint32_t cap;
! 495: } volume;
! 496: } d;
! 497: } widget_t;
! 498: #define WIDGET_CHANNELS(w) ((w)->widgetcap & COP_AWCAP_STEREO ? 2 : 1)
! 499:
! 500: typedef struct {
! 501: mixer_devinfo_t devinfo;
! 502: nid_t nid; /* target NID; 0 is invalid. */
! 503: int target; /* 0-15: inamp index, 0x100: outamp, ... */
! 504: #define IS_MI_TARGET_INAMP(x) ((x) <= 15)
! 505: #define MI_TARGET_INAMP(x) (x)
! 506: #define MI_TARGET_OUTAMP 0x100
! 507: #define MI_TARGET_CONNLIST 0x101
! 508: #define MI_TARGET_PINDIR 0x102 /* for bidirectional pin */
! 509: #define MI_TARGET_PINBOOST 0x103 /* for headphone pin */
! 510: #define MI_TARGET_DAC 0x104
! 511: #define MI_TARGET_ADC 0x105
! 512: #define MI_TARGET_VOLUME 0x106
! 513: } mixer_item_t;
! 514:
! 515: #define VALID_WIDGET_NID(nid, codec) (nid == (codec)->audiofunc || \
! 516: (nid >= (codec)->wstart && \
! 517: nid < (codec)->wend))
! 518:
! 519: typedef struct {
! 520: int nconv;
! 521: nid_t conv[HDA_MAX_CHANNELS]; /* front, surround, clfe, side, ... */
! 522: } convgroup_t;
! 523: typedef struct {
! 524: int cur;
! 525: int ngroups;
! 526: convgroup_t groups[32];
! 527: } convgroupset_t;
! 528:
! 529: typedef struct codec_t {
! 530: int (*comresp)(const struct codec_t *, nid_t, uint32_t, uint32_t, uint32_t *);
! 531: int (*init_dacgroup)(struct codec_t *);
! 532: int (*init_widget)(const struct codec_t *, widget_t *, nid_t);
! 533: int (*mixer_init)(struct codec_t *);
! 534: int (*mixer_delete)(struct codec_t *);
! 535: int (*set_port)(struct codec_t *, mixer_ctrl_t *);
! 536: int (*get_port)(struct codec_t *, mixer_ctrl_t *);
! 537: int (*unsol_event)(struct codec_t *, int);
! 538:
! 539: struct azalia_t *az;
! 540: uint32_t vid; /* codec vendor/device ID */
! 541: uint32_t subid; /* PCI subvendor/device ID */
! 542: const char *name;
! 543: int address;
! 544: int nfunctions;
! 545: nid_t audiofunc; /* NID of an audio function node */
! 546: nid_t wstart; /* start NID of audio widgets */
! 547: nid_t wend; /* the last NID of audio widgets + 1 */
! 548: widget_t *w; /* widgets in the audio function.
! 549: * w[0] to w[wstart-1] are unused. */
! 550: #define FOR_EACH_WIDGET(this, i) for (i = (this)->wstart; i < (this)->wend; i++)
! 551:
! 552: convgroupset_t dacs;
! 553: convgroupset_t adcs;
! 554: int running;
! 555:
! 556: int nmixers, maxmixers;
! 557: mixer_item_t *mixers;
! 558:
! 559: struct audio_format* formats;
! 560: int nformats;
! 561: struct audio_encoding_set *encodings;
! 562:
! 563: uint32_t *extra;
! 564: } codec_t;
! 565:
! 566:
! 567: int azalia_codec_init_vtbl(codec_t *);
! 568: int azalia_codec_construct_format(codec_t *, int, int);
CVSweb