1 /*- 2 * Copyright (c) 2006 Stephane E. Potvin <sepotvin@videotron.ca> 3 * Copyright (c) 2006 Ariff Abdullah <ariff@FreeBSD.org> 4 * Copyright (c) 2008 Alexander Motin <mav@FreeBSD.org> 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29 /* 30 * Intel High Definition Audio (Controller) driver for FreeBSD. Be advised 31 * that this driver still in its early stage, and possible of rewrite are 32 * pretty much guaranteed. There are supposedly several distinct parent/child 33 * busses to make this "perfect", but as for now and for the sake of 34 * simplicity, everything is gobble up within single source. 35 * 36 * List of subsys: 37 * 1) HDA Controller support 38 * 2) HDA Codecs support, which may include 39 * - HDA 40 * - Modem 41 * - HDMI 42 * 3) Widget parser - the real magic of why this driver works on so 43 * many hardwares with minimal vendor specific quirk. The original 44 * parser was written using Ruby and can be found at 45 * http://people.freebsd.org/~ariff/HDA/parser.rb . This crude 46 * ruby parser take the verbose dmesg dump as its input. Refer to 47 * http://www.microsoft.com/whdc/device/audio/default.mspx for various 48 * interesting documents, especially UAA (Universal Audio Architecture). 49 * 4) Possible vendor specific support. 50 * (snd_hda_intel, snd_hda_ati, etc..) 51 * 52 * Thanks to Ahmad Ubaidah Omar @ Defenxis Sdn. Bhd. for the 53 * Compaq V3000 with Conexant HDA. 54 * 55 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 56 * * * 57 * * This driver is a collaborative effort made by: * 58 * * * 59 * * Stephane E. Potvin <sepotvin@videotron.ca> * 60 * * Andrea Bittau <a.bittau@cs.ucl.ac.uk> * 61 * * Wesley Morgan <morganw@chemikals.org> * 62 * * Daniel Eischen <deischen@FreeBSD.org> * 63 * * Maxime Guillaud <bsd-ports@mguillaud.net> * 64 * * Ariff Abdullah <ariff@FreeBSD.org> * 65 * * Alexander Motin <mav@FreeBSD.org> * 66 * * * 67 * * ....and various people from freebsd-multimedia@FreeBSD.org * 68 * * * 69 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 70 */ 71 72 #include <dev/sound/pcm/sound.h> 73 #include <dev/pci/pcireg.h> 74 #include <dev/pci/pcivar.h> 75 76 #include <sys/ctype.h> 77 #include <sys/taskqueue.h> 78 79 #include <dev/sound/pci/hda/hdac_private.h> 80 #include <dev/sound/pci/hda/hdac_reg.h> 81 #include <dev/sound/pci/hda/hda_reg.h> 82 #include <dev/sound/pci/hda/hdac.h> 83 84 #include "mixer_if.h" 85 86 #define HDA_DRV_TEST_REV "20081226_0122" 87 88 SND_DECLARE_FILE("$FreeBSD$"); 89 90 #define HDA_BOOTVERBOSE(stmt) do { \ 91 if (bootverbose != 0 || snd_verbose > 3) { \ 92 stmt \ 93 } \ 94 } while(0) 95 96 #define HDA_BOOTHVERBOSE(stmt) do { \ 97 if (snd_verbose > 3) { \ 98 stmt \ 99 } \ 100 } while(0) 101 102 #if 1 103 #undef HDAC_INTR_EXTRA 104 #define HDAC_INTR_EXTRA 1 105 #endif 106 107 #define hdac_lock(sc) snd_mtxlock((sc)->lock) 108 #define hdac_unlock(sc) snd_mtxunlock((sc)->lock) 109 #define hdac_lockassert(sc) snd_mtxassert((sc)->lock) 110 #define hdac_lockowned(sc) mtx_owned((sc)->lock) 111 112 #undef HDAC_MSI_ENABLED 113 #if __FreeBSD_version >= 700026 || \ 114 (__FreeBSD_version < 700000 && __FreeBSD_version >= 602106) 115 #define HDAC_MSI_ENABLED 1 116 #endif 117 118 #define HDA_FLAG_MATCH(fl, v) (((fl) & (v)) == (v)) 119 #define HDA_DEV_MATCH(fl, v) ((fl) == (v) || \ 120 (fl) == 0xffffffff || \ 121 (((fl) & 0xffff0000) == 0xffff0000 && \ 122 ((fl) & 0x0000ffff) == ((v) & 0x0000ffff)) || \ 123 (((fl) & 0x0000ffff) == 0x0000ffff && \ 124 ((fl) & 0xffff0000) == ((v) & 0xffff0000))) 125 #define HDA_MATCH_ALL 0xffffffff 126 #define HDAC_INVALID 0xffffffff 127 128 /* Default controller / jack sense poll: 250ms */ 129 #define HDAC_POLL_INTERVAL max(hz >> 2, 1) 130 131 /* 132 * Make room for possible 4096 playback/record channels, in 100 years to come. 133 */ 134 #define HDAC_TRIGGER_NONE 0x00000000 135 #define HDAC_TRIGGER_PLAY 0x00000fff 136 #define HDAC_TRIGGER_REC 0x00fff000 137 #define HDAC_TRIGGER_UNSOL 0x80000000 138 139 #define HDA_MODEL_CONSTRUCT(vendor, model) \ 140 (((uint32_t)(model) << 16) | ((vendor##_VENDORID) & 0xffff)) 141 142 /* Controller models */ 143 144 /* Intel */ 145 #define INTEL_VENDORID 0x8086 146 #define HDA_INTEL_82801F HDA_MODEL_CONSTRUCT(INTEL, 0x2668) 147 #define HDA_INTEL_63XXESB HDA_MODEL_CONSTRUCT(INTEL, 0x269a) 148 #define HDA_INTEL_82801G HDA_MODEL_CONSTRUCT(INTEL, 0x27d8) 149 #define HDA_INTEL_82801H HDA_MODEL_CONSTRUCT(INTEL, 0x284b) 150 #define HDA_INTEL_82801I HDA_MODEL_CONSTRUCT(INTEL, 0x293e) 151 #define HDA_INTEL_82801J HDA_MODEL_CONSTRUCT(INTEL, 0x3a3e) 152 #define HDA_INTEL_SCH HDA_MODEL_CONSTRUCT(INTEL, 0x811b) 153 #define HDA_INTEL_ALL HDA_MODEL_CONSTRUCT(INTEL, 0xffff) 154 155 /* Nvidia */ 156 #define NVIDIA_VENDORID 0x10de 157 #define HDA_NVIDIA_MCP51 HDA_MODEL_CONSTRUCT(NVIDIA, 0x026c) 158 #define HDA_NVIDIA_MCP55 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0371) 159 #define HDA_NVIDIA_MCP61_1 HDA_MODEL_CONSTRUCT(NVIDIA, 0x03e4) 160 #define HDA_NVIDIA_MCP61_2 HDA_MODEL_CONSTRUCT(NVIDIA, 0x03f0) 161 #define HDA_NVIDIA_MCP65_1 HDA_MODEL_CONSTRUCT(NVIDIA, 0x044a) 162 #define HDA_NVIDIA_MCP65_2 HDA_MODEL_CONSTRUCT(NVIDIA, 0x044b) 163 #define HDA_NVIDIA_MCP67_1 HDA_MODEL_CONSTRUCT(NVIDIA, 0x055c) 164 #define HDA_NVIDIA_MCP67_2 HDA_MODEL_CONSTRUCT(NVIDIA, 0x055d) 165 #define HDA_NVIDIA_MCP78_1 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0774) 166 #define HDA_NVIDIA_MCP78_2 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0775) 167 #define HDA_NVIDIA_MCP78_3 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0776) 168 #define HDA_NVIDIA_MCP78_4 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0777) 169 #define HDA_NVIDIA_MCP73_1 HDA_MODEL_CONSTRUCT(NVIDIA, 0x07fc) 170 #define HDA_NVIDIA_MCP73_2 HDA_MODEL_CONSTRUCT(NVIDIA, 0x07fd) 171 #define HDA_NVIDIA_MCP79_1 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0ac0) 172 #define HDA_NVIDIA_MCP79_2 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0ac1) 173 #define HDA_NVIDIA_MCP79_3 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0ac2) 174 #define HDA_NVIDIA_MCP79_4 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0ac3) 175 #define HDA_NVIDIA_ALL HDA_MODEL_CONSTRUCT(NVIDIA, 0xffff) 176 177 /* ATI */ 178 #define ATI_VENDORID 0x1002 179 #define HDA_ATI_SB450 HDA_MODEL_CONSTRUCT(ATI, 0x437b) 180 #define HDA_ATI_SB600 HDA_MODEL_CONSTRUCT(ATI, 0x4383) 181 #define HDA_ATI_ALL HDA_MODEL_CONSTRUCT(ATI, 0xffff) 182 183 /* VIA */ 184 #define VIA_VENDORID 0x1106 185 #define HDA_VIA_VT82XX HDA_MODEL_CONSTRUCT(VIA, 0x3288) 186 #define HDA_VIA_ALL HDA_MODEL_CONSTRUCT(VIA, 0xffff) 187 188 /* SiS */ 189 #define SIS_VENDORID 0x1039 190 #define HDA_SIS_966 HDA_MODEL_CONSTRUCT(SIS, 0x7502) 191 #define HDA_SIS_ALL HDA_MODEL_CONSTRUCT(SIS, 0xffff) 192 193 /* ULI */ 194 #define ULI_VENDORID 0x10b9 195 #define HDA_ULI_M5461 HDA_MODEL_CONSTRUCT(ULI, 0x5461) 196 #define HDA_ULI_ALL HDA_MODEL_CONSTRUCT(ULI, 0xffff) 197 198 /* OEM/subvendors */ 199 200 /* Intel */ 201 #define INTEL_D101GGC_SUBVENDOR HDA_MODEL_CONSTRUCT(INTEL, 0xd600) 202 203 /* HP/Compaq */ 204 #define HP_VENDORID 0x103c 205 #define HP_V3000_SUBVENDOR HDA_MODEL_CONSTRUCT(HP, 0x30b5) 206 #define HP_NX7400_SUBVENDOR HDA_MODEL_CONSTRUCT(HP, 0x30a2) 207 #define HP_NX6310_SUBVENDOR HDA_MODEL_CONSTRUCT(HP, 0x30aa) 208 #define HP_NX6325_SUBVENDOR HDA_MODEL_CONSTRUCT(HP, 0x30b0) 209 #define HP_XW4300_SUBVENDOR HDA_MODEL_CONSTRUCT(HP, 0x3013) 210 #define HP_3010_SUBVENDOR HDA_MODEL_CONSTRUCT(HP, 0x3010) 211 #define HP_DV5000_SUBVENDOR HDA_MODEL_CONSTRUCT(HP, 0x30a5) 212 #define HP_DC7700S_SUBVENDOR HDA_MODEL_CONSTRUCT(HP, 0x2801) 213 #define HP_DC7700_SUBVENDOR HDA_MODEL_CONSTRUCT(HP, 0x2802) 214 #define HP_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(HP, 0xffff) 215 /* What is wrong with XN 2563 anyway? (Got the picture ?) */ 216 #define HP_NX6325_SUBVENDORX 0x103c30b0 217 218 /* Dell */ 219 #define DELL_VENDORID 0x1028 220 #define DELL_D630_SUBVENDOR HDA_MODEL_CONSTRUCT(DELL, 0x01f9) 221 #define DELL_D820_SUBVENDOR HDA_MODEL_CONSTRUCT(DELL, 0x01cc) 222 #define DELL_V1400_SUBVENDOR HDA_MODEL_CONSTRUCT(DELL, 0x0227) 223 #define DELL_V1500_SUBVENDOR HDA_MODEL_CONSTRUCT(DELL, 0x0228) 224 #define DELL_I1300_SUBVENDOR HDA_MODEL_CONSTRUCT(DELL, 0x01c9) 225 #define DELL_XPSM1210_SUBVENDOR HDA_MODEL_CONSTRUCT(DELL, 0x01d7) 226 #define DELL_OPLX745_SUBVENDOR HDA_MODEL_CONSTRUCT(DELL, 0x01da) 227 #define DELL_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(DELL, 0xffff) 228 229 /* Clevo */ 230 #define CLEVO_VENDORID 0x1558 231 #define CLEVO_D900T_SUBVENDOR HDA_MODEL_CONSTRUCT(CLEVO, 0x0900) 232 #define CLEVO_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(CLEVO, 0xffff) 233 234 /* Acer */ 235 #define ACER_VENDORID 0x1025 236 #define ACER_A5050_SUBVENDOR HDA_MODEL_CONSTRUCT(ACER, 0x010f) 237 #define ACER_A4520_SUBVENDOR HDA_MODEL_CONSTRUCT(ACER, 0x0127) 238 #define ACER_A4710_SUBVENDOR HDA_MODEL_CONSTRUCT(ACER, 0x012f) 239 #define ACER_A4715_SUBVENDOR HDA_MODEL_CONSTRUCT(ACER, 0x0133) 240 #define ACER_3681WXM_SUBVENDOR HDA_MODEL_CONSTRUCT(ACER, 0x0110) 241 #define ACER_T6292_SUBVENDOR HDA_MODEL_CONSTRUCT(ACER, 0x011b) 242 #define ACER_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(ACER, 0xffff) 243 244 /* Asus */ 245 #define ASUS_VENDORID 0x1043 246 #define ASUS_A8X_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1153) 247 #define ASUS_U5F_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1263) 248 #define ASUS_W6F_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1263) 249 #define ASUS_A7M_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1323) 250 #define ASUS_F3JC_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1338) 251 #define ASUS_G2K_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1339) 252 #define ASUS_A7T_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x13c2) 253 #define ASUS_W2J_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1971) 254 #define ASUS_M5200_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1993) 255 #define ASUS_P1AH2_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x81cb) 256 #define ASUS_M2NPVMX_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x81cb) 257 #define ASUS_M2V_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x81e7) 258 #define ASUS_P5BWD_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x81ec) 259 #define ASUS_M2N_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x8234) 260 #define ASUS_A8NVMCSM_SUBVENDOR HDA_MODEL_CONSTRUCT(NVIDIA, 0xcb84) 261 #define ASUS_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0xffff) 262 263 /* IBM / Lenovo */ 264 #define IBM_VENDORID 0x1014 265 #define IBM_M52_SUBVENDOR HDA_MODEL_CONSTRUCT(IBM, 0x02f6) 266 #define IBM_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(IBM, 0xffff) 267 268 /* Lenovo */ 269 #define LENOVO_VENDORID 0x17aa 270 #define LENOVO_3KN100_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x2066) 271 #define LENOVO_3KN200_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x384e) 272 #define LENOVO_TCA55_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x1015) 273 #define LENOVO_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0xffff) 274 275 /* Samsung */ 276 #define SAMSUNG_VENDORID 0x144d 277 #define SAMSUNG_Q1_SUBVENDOR HDA_MODEL_CONSTRUCT(SAMSUNG, 0xc027) 278 #define SAMSUNG_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(SAMSUNG, 0xffff) 279 280 /* Medion ? */ 281 #define MEDION_VENDORID 0x161f 282 #define MEDION_MD95257_SUBVENDOR HDA_MODEL_CONSTRUCT(MEDION, 0x203d) 283 #define MEDION_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(MEDION, 0xffff) 284 285 /* Apple Computer Inc. */ 286 #define APPLE_VENDORID 0x106b 287 #define APPLE_MB3_SUBVENDOR HDA_MODEL_CONSTRUCT(APPLE, 0x00a1) 288 289 /* Sony */ 290 #define SONY_VENDORID 0x104d 291 #define SONY_S5_SUBVENDOR HDA_MODEL_CONSTRUCT(SONY, 0x81cc) 292 #define SONY_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(SONY, 0xffff) 293 294 /* 295 * Apple Intel MacXXXX seems using Sigmatel codec/vendor id 296 * instead of their own, which is beyond my comprehension 297 * (see HDA_CODEC_STAC9221 below). 298 */ 299 #define APPLE_INTEL_MAC 0x76808384 300 301 /* LG Electronics */ 302 #define LG_VENDORID 0x1854 303 #define LG_LW20_SUBVENDOR HDA_MODEL_CONSTRUCT(LG, 0x0018) 304 #define LG_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(LG, 0xffff) 305 306 /* Fujitsu Siemens */ 307 #define FS_VENDORID 0x1734 308 #define FS_PA1510_SUBVENDOR HDA_MODEL_CONSTRUCT(FS, 0x10b8) 309 #define FS_SI1848_SUBVENDOR HDA_MODEL_CONSTRUCT(FS, 0x10cd) 310 #define FS_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(FS, 0xffff) 311 312 /* Fujitsu Limited */ 313 #define FL_VENDORID 0x10cf 314 #define FL_S7020D_SUBVENDOR HDA_MODEL_CONSTRUCT(FL, 0x1326) 315 #define FL_U1010_SUBVENDOR HDA_MODEL_CONSTRUCT(FL, 0x142d) 316 #define FL_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(FL, 0xffff) 317 318 /* Toshiba */ 319 #define TOSHIBA_VENDORID 0x1179 320 #define TOSHIBA_U200_SUBVENDOR HDA_MODEL_CONSTRUCT(TOSHIBA, 0x0001) 321 #define TOSHIBA_A135_SUBVENDOR HDA_MODEL_CONSTRUCT(TOSHIBA, 0xff01) 322 #define TOSHIBA_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(TOSHIBA, 0xffff) 323 324 /* Micro-Star International (MSI) */ 325 #define MSI_VENDORID 0x1462 326 #define MSI_MS1034_SUBVENDOR HDA_MODEL_CONSTRUCT(MSI, 0x0349) 327 #define MSI_MS034A_SUBVENDOR HDA_MODEL_CONSTRUCT(MSI, 0x034a) 328 #define MSI_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(MSI, 0xffff) 329 330 /* Giga-Byte Technology */ 331 #define GB_VENDORID 0x1458 332 #define GB_G33S2H_SUBVENDOR HDA_MODEL_CONSTRUCT(GB, 0xa022) 333 #define GP_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(GB, 0xffff) 334 335 /* Uniwill ? */ 336 #define UNIWILL_VENDORID 0x1584 337 #define UNIWILL_9075_SUBVENDOR HDA_MODEL_CONSTRUCT(UNIWILL, 0x9075) 338 #define UNIWILL_9080_SUBVENDOR HDA_MODEL_CONSTRUCT(UNIWILL, 0x9080) 339 340 341 /* Misc constants.. */ 342 #define HDA_AMP_VOL_DEFAULT (-1) 343 #define HDA_AMP_MUTE_DEFAULT (0xffffffff) 344 #define HDA_AMP_MUTE_NONE (0) 345 #define HDA_AMP_MUTE_LEFT (1 << 0) 346 #define HDA_AMP_MUTE_RIGHT (1 << 1) 347 #define HDA_AMP_MUTE_ALL (HDA_AMP_MUTE_LEFT | HDA_AMP_MUTE_RIGHT) 348 349 #define HDA_AMP_LEFT_MUTED(v) ((v) & (HDA_AMP_MUTE_LEFT)) 350 #define HDA_AMP_RIGHT_MUTED(v) (((v) & HDA_AMP_MUTE_RIGHT) >> 1) 351 352 #define HDA_ADC_MONITOR (1 << 0) 353 354 #define HDA_CTL_OUT 1 355 #define HDA_CTL_IN 2 356 357 #define HDA_GPIO_MAX 8 358 /* 0 - 7 = GPIO , 8 = Flush */ 359 #define HDA_QUIRK_GPIO0 (1 << 0) 360 #define HDA_QUIRK_GPIO1 (1 << 1) 361 #define HDA_QUIRK_GPIO2 (1 << 2) 362 #define HDA_QUIRK_GPIO3 (1 << 3) 363 #define HDA_QUIRK_GPIO4 (1 << 4) 364 #define HDA_QUIRK_GPIO5 (1 << 5) 365 #define HDA_QUIRK_GPIO6 (1 << 6) 366 #define HDA_QUIRK_GPIO7 (1 << 7) 367 #define HDA_QUIRK_GPIOFLUSH (1 << 8) 368 369 /* 9 - 25 = anything else */ 370 #define HDA_QUIRK_SOFTPCMVOL (1 << 9) 371 #define HDA_QUIRK_FIXEDRATE (1 << 10) 372 #define HDA_QUIRK_FORCESTEREO (1 << 11) 373 #define HDA_QUIRK_EAPDINV (1 << 12) 374 #define HDA_QUIRK_DMAPOS (1 << 13) 375 #define HDA_QUIRK_SENSEINV (1 << 14) 376 377 /* 26 - 31 = vrefs */ 378 #define HDA_QUIRK_IVREF50 (1 << 26) 379 #define HDA_QUIRK_IVREF80 (1 << 27) 380 #define HDA_QUIRK_IVREF100 (1 << 28) 381 #define HDA_QUIRK_OVREF50 (1 << 29) 382 #define HDA_QUIRK_OVREF80 (1 << 30) 383 #define HDA_QUIRK_OVREF100 (1 << 31) 384 385 #define HDA_QUIRK_IVREF (HDA_QUIRK_IVREF50 | HDA_QUIRK_IVREF80 | \ 386 HDA_QUIRK_IVREF100) 387 #define HDA_QUIRK_OVREF (HDA_QUIRK_OVREF50 | HDA_QUIRK_OVREF80 | \ 388 HDA_QUIRK_OVREF100) 389 #define HDA_QUIRK_VREF (HDA_QUIRK_IVREF | HDA_QUIRK_OVREF) 390 391 #if __FreeBSD_version < 600000 392 #define taskqueue_drain(...) 393 #endif 394 395 static const struct { 396 char *key; 397 uint32_t value; 398 } hdac_quirks_tab[] = { 399 { "gpio0", HDA_QUIRK_GPIO0 }, 400 { "gpio1", HDA_QUIRK_GPIO1 }, 401 { "gpio2", HDA_QUIRK_GPIO2 }, 402 { "gpio3", HDA_QUIRK_GPIO3 }, 403 { "gpio4", HDA_QUIRK_GPIO4 }, 404 { "gpio5", HDA_QUIRK_GPIO5 }, 405 { "gpio6", HDA_QUIRK_GPIO6 }, 406 { "gpio7", HDA_QUIRK_GPIO7 }, 407 { "gpioflush", HDA_QUIRK_GPIOFLUSH }, 408 { "softpcmvol", HDA_QUIRK_SOFTPCMVOL }, 409 { "fixedrate", HDA_QUIRK_FIXEDRATE }, 410 { "forcestereo", HDA_QUIRK_FORCESTEREO }, 411 { "eapdinv", HDA_QUIRK_EAPDINV }, 412 { "dmapos", HDA_QUIRK_DMAPOS }, 413 { "senseinv", HDA_QUIRK_SENSEINV }, 414 { "ivref50", HDA_QUIRK_IVREF50 }, 415 { "ivref80", HDA_QUIRK_IVREF80 }, 416 { "ivref100", HDA_QUIRK_IVREF100 }, 417 { "ovref50", HDA_QUIRK_OVREF50 }, 418 { "ovref80", HDA_QUIRK_OVREF80 }, 419 { "ovref100", HDA_QUIRK_OVREF100 }, 420 { "ivref", HDA_QUIRK_IVREF }, 421 { "ovref", HDA_QUIRK_OVREF }, 422 { "vref", HDA_QUIRK_VREF }, 423 }; 424 #define HDAC_QUIRKS_TAB_LEN \ 425 (sizeof(hdac_quirks_tab) / sizeof(hdac_quirks_tab[0])) 426 427 #define HDA_BDL_MIN 2 428 #define HDA_BDL_MAX 256 429 #define HDA_BDL_DEFAULT HDA_BDL_MIN 430 431 #define HDA_BLK_MIN HDAC_DMA_ALIGNMENT 432 #define HDA_BLK_ALIGN (~(HDA_BLK_MIN - 1)) 433 434 #define HDA_BUFSZ_MIN 4096 435 #define HDA_BUFSZ_MAX 65536 436 #define HDA_BUFSZ_DEFAULT 16384 437 438 #define HDA_PARSE_MAXDEPTH 10 439 440 #define HDAC_UNSOLTAG_EVENT_HP 0x00 441 442 MALLOC_DEFINE(M_HDAC, "hdac", "High Definition Audio Controller"); 443 444 const char *HDA_COLORS[16] = {"Unknown", "Black", "Grey", "Blue", "Green", "Red", 445 "Orange", "Yellow", "Purple", "Pink", "Res.A", "Res.B", "Res.C", "Res.D", 446 "White", "Other"}; 447 448 const char *HDA_DEVS[16] = {"Line-out", "Speaker", "Headphones", "CD", 449 "SPDIF-out", "Digital-out", "Modem-line", "Modem-handset", "Line-in", 450 "AUX", "Mic", "Telephony", "SPDIF-in", "Digital-in", "Res.E", "Other"}; 451 452 const char *HDA_CONNS[4] = {"Jack", "None", "Fixed", "Both"}; 453 454 /* Default */ 455 static uint32_t hdac_fmt[] = { 456 AFMT_STEREO | AFMT_S16_LE, 457 0 458 }; 459 460 static struct pcmchan_caps hdac_caps = {48000, 48000, hdac_fmt, 0}; 461 462 static const struct { 463 uint32_t model; 464 char *desc; 465 } hdac_devices[] = { 466 { HDA_INTEL_82801F, "Intel 82801F" }, 467 { HDA_INTEL_63XXESB, "Intel 631x/632xESB" }, 468 { HDA_INTEL_82801G, "Intel 82801G" }, 469 { HDA_INTEL_82801H, "Intel 82801H" }, 470 { HDA_INTEL_82801I, "Intel 82801I" }, 471 { HDA_INTEL_82801J, "Intel 82801J" }, 472 { HDA_INTEL_SCH, "Intel SCH" }, 473 { HDA_NVIDIA_MCP51, "NVidia MCP51" }, 474 { HDA_NVIDIA_MCP55, "NVidia MCP55" }, 475 { HDA_NVIDIA_MCP61_1, "NVidia MCP61" }, 476 { HDA_NVIDIA_MCP61_2, "NVidia MCP61" }, 477 { HDA_NVIDIA_MCP65_1, "NVidia MCP65" }, 478 { HDA_NVIDIA_MCP65_2, "NVidia MCP65" }, 479 { HDA_NVIDIA_MCP67_1, "NVidia MCP67" }, 480 { HDA_NVIDIA_MCP67_2, "NVidia MCP67" }, 481 { HDA_NVIDIA_MCP73_1, "NVidia MCP73" }, 482 { HDA_NVIDIA_MCP73_2, "NVidia MCP73" }, 483 { HDA_NVIDIA_MCP78_1, "NVidia MCP78" }, 484 { HDA_NVIDIA_MCP78_2, "NVidia MCP78" }, 485 { HDA_NVIDIA_MCP78_3, "NVidia MCP78" }, 486 { HDA_NVIDIA_MCP78_4, "NVidia MCP78" }, 487 { HDA_NVIDIA_MCP79_1, "NVidia MCP79" }, 488 { HDA_NVIDIA_MCP79_2, "NVidia MCP79" }, 489 { HDA_NVIDIA_MCP79_3, "NVidia MCP79" }, 490 { HDA_NVIDIA_MCP79_4, "NVidia MCP79" }, 491 { HDA_ATI_SB450, "ATI SB450" }, 492 { HDA_ATI_SB600, "ATI SB600" }, 493 { HDA_VIA_VT82XX, "VIA VT8251/8237A" }, 494 { HDA_SIS_966, "SiS 966" }, 495 { HDA_ULI_M5461, "ULI M5461" }, 496 /* Unknown */ 497 { HDA_INTEL_ALL, "Intel (Unknown)" }, 498 { HDA_NVIDIA_ALL, "NVidia (Unknown)" }, 499 { HDA_ATI_ALL, "ATI (Unknown)" }, 500 { HDA_VIA_ALL, "VIA (Unknown)" }, 501 { HDA_SIS_ALL, "SiS (Unknown)" }, 502 { HDA_ULI_ALL, "ULI (Unknown)" }, 503 }; 504 #define HDAC_DEVICES_LEN (sizeof(hdac_devices) / sizeof(hdac_devices[0])) 505 506 static const struct { 507 uint16_t vendor; 508 uint8_t reg; 509 uint8_t mask; 510 uint8_t enable; 511 } hdac_pcie_snoop[] = { 512 { INTEL_VENDORID, 0x00, 0x00, 0x00 }, 513 { ATI_VENDORID, 0x42, 0xf8, 0x02 }, 514 { NVIDIA_VENDORID, 0x4e, 0xf0, 0x0f }, 515 }; 516 #define HDAC_PCIESNOOP_LEN \ 517 (sizeof(hdac_pcie_snoop) / sizeof(hdac_pcie_snoop[0])) 518 519 static const struct { 520 uint32_t rate; 521 int valid; 522 uint16_t base; 523 uint16_t mul; 524 uint16_t div; 525 } hda_rate_tab[] = { 526 { 8000, 1, 0x0000, 0x0000, 0x0500 }, /* (48000 * 1) / 6 */ 527 { 9600, 0, 0x0000, 0x0000, 0x0400 }, /* (48000 * 1) / 5 */ 528 { 12000, 0, 0x0000, 0x0000, 0x0300 }, /* (48000 * 1) / 4 */ 529 { 16000, 1, 0x0000, 0x0000, 0x0200 }, /* (48000 * 1) / 3 */ 530 { 18000, 0, 0x0000, 0x1000, 0x0700 }, /* (48000 * 3) / 8 */ 531 { 19200, 0, 0x0000, 0x0800, 0x0400 }, /* (48000 * 2) / 5 */ 532 { 24000, 0, 0x0000, 0x0000, 0x0100 }, /* (48000 * 1) / 2 */ 533 { 28800, 0, 0x0000, 0x1000, 0x0400 }, /* (48000 * 3) / 5 */ 534 { 32000, 1, 0x0000, 0x0800, 0x0200 }, /* (48000 * 2) / 3 */ 535 { 36000, 0, 0x0000, 0x1000, 0x0300 }, /* (48000 * 3) / 4 */ 536 { 38400, 0, 0x0000, 0x1800, 0x0400 }, /* (48000 * 4) / 5 */ 537 { 48000, 1, 0x0000, 0x0000, 0x0000 }, /* (48000 * 1) / 1 */ 538 { 64000, 0, 0x0000, 0x1800, 0x0200 }, /* (48000 * 4) / 3 */ 539 { 72000, 0, 0x0000, 0x1000, 0x0100 }, /* (48000 * 3) / 2 */ 540 { 96000, 1, 0x0000, 0x0800, 0x0000 }, /* (48000 * 2) / 1 */ 541 { 144000, 0, 0x0000, 0x1000, 0x0000 }, /* (48000 * 3) / 1 */ 542 { 192000, 1, 0x0000, 0x1800, 0x0000 }, /* (48000 * 4) / 1 */ 543 { 8820, 0, 0x4000, 0x0000, 0x0400 }, /* (44100 * 1) / 5 */ 544 { 11025, 1, 0x4000, 0x0000, 0x0300 }, /* (44100 * 1) / 4 */ 545 { 12600, 0, 0x4000, 0x0800, 0x0600 }, /* (44100 * 2) / 7 */ 546 { 14700, 0, 0x4000, 0x0000, 0x0200 }, /* (44100 * 1) / 3 */ 547 { 17640, 0, 0x4000, 0x0800, 0x0400 }, /* (44100 * 2) / 5 */ 548 { 18900, 0, 0x4000, 0x1000, 0x0600 }, /* (44100 * 3) / 7 */ 549 { 22050, 1, 0x4000, 0x0000, 0x0100 }, /* (44100 * 1) / 2 */ 550 { 25200, 0, 0x4000, 0x1800, 0x0600 }, /* (44100 * 4) / 7 */ 551 { 26460, 0, 0x4000, 0x1000, 0x0400 }, /* (44100 * 3) / 5 */ 552 { 29400, 0, 0x4000, 0x0800, 0x0200 }, /* (44100 * 2) / 3 */ 553 { 33075, 0, 0x4000, 0x1000, 0x0300 }, /* (44100 * 3) / 4 */ 554 { 35280, 0, 0x4000, 0x1800, 0x0400 }, /* (44100 * 4) / 5 */ 555 { 44100, 1, 0x4000, 0x0000, 0x0000 }, /* (44100 * 1) / 1 */ 556 { 58800, 0, 0x4000, 0x1800, 0x0200 }, /* (44100 * 4) / 3 */ 557 { 66150, 0, 0x4000, 0x1000, 0x0100 }, /* (44100 * 3) / 2 */ 558 { 88200, 1, 0x4000, 0x0800, 0x0000 }, /* (44100 * 2) / 1 */ 559 { 132300, 0, 0x4000, 0x1000, 0x0000 }, /* (44100 * 3) / 1 */ 560 { 176400, 1, 0x4000, 0x1800, 0x0000 }, /* (44100 * 4) / 1 */ 561 }; 562 #define HDA_RATE_TAB_LEN (sizeof(hda_rate_tab) / sizeof(hda_rate_tab[0])) 563 564 /* All codecs you can eat... */ 565 #define HDA_CODEC_CONSTRUCT(vendor, id) \ 566 (((uint32_t)(vendor##_VENDORID) << 16) | ((id) & 0xffff)) 567 568 /* Realtek */ 569 #define REALTEK_VENDORID 0x10ec 570 #define HDA_CODEC_ALC260 HDA_CODEC_CONSTRUCT(REALTEK, 0x0260) 571 #define HDA_CODEC_ALC262 HDA_CODEC_CONSTRUCT(REALTEK, 0x0262) 572 #define HDA_CODEC_ALC267 HDA_CODEC_CONSTRUCT(REALTEK, 0x0267) 573 #define HDA_CODEC_ALC268 HDA_CODEC_CONSTRUCT(REALTEK, 0x0268) 574 #define HDA_CODEC_ALC269 HDA_CODEC_CONSTRUCT(REALTEK, 0x0269) 575 #define HDA_CODEC_ALC272 HDA_CODEC_CONSTRUCT(REALTEK, 0x0272) 576 #define HDA_CODEC_ALC660 HDA_CODEC_CONSTRUCT(REALTEK, 0x0660) 577 #define HDA_CODEC_ALC662 HDA_CODEC_CONSTRUCT(REALTEK, 0x0662) 578 #define HDA_CODEC_ALC663 HDA_CODEC_CONSTRUCT(REALTEK, 0x0663) 579 #define HDA_CODEC_ALC861 HDA_CODEC_CONSTRUCT(REALTEK, 0x0861) 580 #define HDA_CODEC_ALC861VD HDA_CODEC_CONSTRUCT(REALTEK, 0x0862) 581 #define HDA_CODEC_ALC880 HDA_CODEC_CONSTRUCT(REALTEK, 0x0880) 582 #define HDA_CODEC_ALC882 HDA_CODEC_CONSTRUCT(REALTEK, 0x0882) 583 #define HDA_CODEC_ALC883 HDA_CODEC_CONSTRUCT(REALTEK, 0x0883) 584 #define HDA_CODEC_ALC885 HDA_CODEC_CONSTRUCT(REALTEK, 0x0885) 585 #define HDA_CODEC_ALC888 HDA_CODEC_CONSTRUCT(REALTEK, 0x0888) 586 #define HDA_CODEC_ALC889 HDA_CODEC_CONSTRUCT(REALTEK, 0x0889) 587 #define HDA_CODEC_ALCXXXX HDA_CODEC_CONSTRUCT(REALTEK, 0xffff) 588 589 /* Analog Devices */ 590 #define ANALOGDEVICES_VENDORID 0x11d4 591 #define HDA_CODEC_AD1884A HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x184a) 592 #define HDA_CODEC_AD1882 HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1882) 593 #define HDA_CODEC_AD1883 HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1883) 594 #define HDA_CODEC_AD1884 HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1884) 595 #define HDA_CODEC_AD1984A HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x194a) 596 #define HDA_CODEC_AD1984B HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x194b) 597 #define HDA_CODEC_AD1981HD HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1981) 598 #define HDA_CODEC_AD1983 HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1983) 599 #define HDA_CODEC_AD1984 HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1984) 600 #define HDA_CODEC_AD1986A HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1986) 601 #define HDA_CODEC_AD1987 HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1987) 602 #define HDA_CODEC_AD1988 HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1988) 603 #define HDA_CODEC_AD1988B HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x198b) 604 #define HDA_CODEC_AD1882A HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x882a) 605 #define HDA_CODEC_AD1989B HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x989b) 606 #define HDA_CODEC_ADXXXX HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0xffff) 607 608 /* CMedia */ 609 #define CMEDIA_VENDORID 0x434d 610 #define HDA_CODEC_CMI9880 HDA_CODEC_CONSTRUCT(CMEDIA, 0x4980) 611 #define HDA_CODEC_CMIXXXX HDA_CODEC_CONSTRUCT(CMEDIA, 0xffff) 612 613 /* Sigmatel */ 614 #define SIGMATEL_VENDORID 0x8384 615 #define HDA_CODEC_STAC9230X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7612) 616 #define HDA_CODEC_STAC9230D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7613) 617 #define HDA_CODEC_STAC9229X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7614) 618 #define HDA_CODEC_STAC9229D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7615) 619 #define HDA_CODEC_STAC9228X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7616) 620 #define HDA_CODEC_STAC9228D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7617) 621 #define HDA_CODEC_STAC9227X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7618) 622 #define HDA_CODEC_STAC9227D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7619) 623 #define HDA_CODEC_STAC9274 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7620) 624 #define HDA_CODEC_STAC9274D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7621) 625 #define HDA_CODEC_STAC9273X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7622) 626 #define HDA_CODEC_STAC9273D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7623) 627 #define HDA_CODEC_STAC9272X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7624) 628 #define HDA_CODEC_STAC9272D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7625) 629 #define HDA_CODEC_STAC9271X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7626) 630 #define HDA_CODEC_STAC9271D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7627) 631 #define HDA_CODEC_STAC9274X5NH HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7628) 632 #define HDA_CODEC_STAC9274D5NH HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7629) 633 #define HDA_CODEC_STAC9250 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7634) 634 #define HDA_CODEC_STAC9251 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7636) 635 #define HDA_CODEC_IDT92HD700X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7638) 636 #define HDA_CODEC_IDT92HD700D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7639) 637 #define HDA_CODEC_IDT92HD206X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7645) 638 #define HDA_CODEC_IDT92HD206D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7646) 639 #define HDA_CODEC_STAC9872AK HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7662) 640 #define HDA_CODEC_STAC9221 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7680) 641 #define HDA_CODEC_STAC922XD HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7681) 642 #define HDA_CODEC_STAC9221_A2 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7682) 643 #define HDA_CODEC_STAC9221D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7683) 644 #define HDA_CODEC_STAC9220 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7690) 645 #define HDA_CODEC_STAC9200D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7691) 646 #define HDA_CODEC_IDT92HD005 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7698) 647 #define HDA_CODEC_IDT92HD005D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7699) 648 #define HDA_CODEC_STAC9205X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a0) 649 #define HDA_CODEC_STAC9205D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a1) 650 #define HDA_CODEC_STAC9204X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a2) 651 #define HDA_CODEC_STAC9204D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a3) 652 #define HDA_CODEC_STAC9220_A2 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7880) 653 #define HDA_CODEC_STAC9220_A1 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7882) 654 #define HDA_CODEC_STACXXXX HDA_CODEC_CONSTRUCT(SIGMATEL, 0xffff) 655 656 /* IDT */ 657 #define IDT_VENDORID 0x111d 658 #define HDA_CODEC_IDT92HD75BX HDA_CODEC_CONSTRUCT(IDT, 0x7603) 659 #define HDA_CODEC_IDT92HD83C1X HDA_CODEC_CONSTRUCT(IDT, 0x7604) 660 #define HDA_CODEC_IDT92HD81B1X HDA_CODEC_CONSTRUCT(IDT, 0x7605) 661 #define HDA_CODEC_IDT92HD75B3 HDA_CODEC_CONSTRUCT(IDT, 0x7608) 662 #define HDA_CODEC_IDT92HD73D1 HDA_CODEC_CONSTRUCT(IDT, 0x7674) 663 #define HDA_CODEC_IDT92HD73C1 HDA_CODEC_CONSTRUCT(IDT, 0x7675) 664 #define HDA_CODEC_IDT92HD73E1 HDA_CODEC_CONSTRUCT(IDT, 0x7676) 665 #define HDA_CODEC_IDT92HD71B8 HDA_CODEC_CONSTRUCT(IDT, 0x76b0) 666 #define HDA_CODEC_IDT92HD71B7 HDA_CODEC_CONSTRUCT(IDT, 0x76b2) 667 #define HDA_CODEC_IDT92HD71B5 HDA_CODEC_CONSTRUCT(IDT, 0x76b6) 668 #define HDA_CODEC_IDT92HD83C1C HDA_CODEC_CONSTRUCT(IDT, 0x76d4) 669 #define HDA_CODEC_IDT92HD81B1C HDA_CODEC_CONSTRUCT(IDT, 0x76d5) 670 #define HDA_CODEC_IDTXXXX HDA_CODEC_CONSTRUCT(IDT, 0xffff) 671 672 /* Silicon Image */ 673 #define SII_VENDORID 0x1095 674 #define HDA_CODEC_SII1392 HDA_CODEC_CONSTRUCT(SII, 0x1392) 675 #define HDA_CODEC_SIIXXXX HDA_CODEC_CONSTRUCT(SII, 0xffff) 676 677 /* Lucent/Agere */ 678 #define AGERE_VENDORID 0x11c1 679 #define HDA_CODEC_AGEREXXXX HDA_CODEC_CONSTRUCT(AGERE, 0xffff) 680 681 /* Conexant */ 682 #define CONEXANT_VENDORID 0x14f1 683 #define HDA_CODEC_CX20549 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5045) 684 #define HDA_CODEC_CX20551 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5047) 685 #define HDA_CODEC_CX20561 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5051) 686 #define HDA_CODEC_CXXXXX HDA_CODEC_CONSTRUCT(CONEXANT, 0xffff) 687 688 /* VIA */ 689 #define HDA_CODEC_VT1708_8 HDA_CODEC_CONSTRUCT(VIA, 0x1708) 690 #define HDA_CODEC_VT1708_9 HDA_CODEC_CONSTRUCT(VIA, 0x1709) 691 #define HDA_CODEC_VT1708_A HDA_CODEC_CONSTRUCT(VIA, 0x170a) 692 #define HDA_CODEC_VT1708_B HDA_CODEC_CONSTRUCT(VIA, 0x170b) 693 #define HDA_CODEC_VT1709_0 HDA_CODEC_CONSTRUCT(VIA, 0xe710) 694 #define HDA_CODEC_VT1709_1 HDA_CODEC_CONSTRUCT(VIA, 0xe711) 695 #define HDA_CODEC_VT1709_2 HDA_CODEC_CONSTRUCT(VIA, 0xe712) 696 #define HDA_CODEC_VT1709_3 HDA_CODEC_CONSTRUCT(VIA, 0xe713) 697 #define HDA_CODEC_VT1709_4 HDA_CODEC_CONSTRUCT(VIA, 0xe714) 698 #define HDA_CODEC_VT1709_5 HDA_CODEC_CONSTRUCT(VIA, 0xe715) 699 #define HDA_CODEC_VT1709_6 HDA_CODEC_CONSTRUCT(VIA, 0xe716) 700 #define HDA_CODEC_VT1709_7 HDA_CODEC_CONSTRUCT(VIA, 0xe717) 701 #define HDA_CODEC_VT1708B_0 HDA_CODEC_CONSTRUCT(VIA, 0xe720) 702 #define HDA_CODEC_VT1708B_1 HDA_CODEC_CONSTRUCT(VIA, 0xe721) 703 #define HDA_CODEC_VT1708B_2 HDA_CODEC_CONSTRUCT(VIA, 0xe722) 704 #define HDA_CODEC_VT1708B_3 HDA_CODEC_CONSTRUCT(VIA, 0xe723) 705 #define HDA_CODEC_VT1708B_4 HDA_CODEC_CONSTRUCT(VIA, 0xe724) 706 #define HDA_CODEC_VT1708B_5 HDA_CODEC_CONSTRUCT(VIA, 0xe725) 707 #define HDA_CODEC_VT1708B_6 HDA_CODEC_CONSTRUCT(VIA, 0xe726) 708 #define HDA_CODEC_VT1708B_7 HDA_CODEC_CONSTRUCT(VIA, 0xe727) 709 #define HDA_CODEC_VTXXXX HDA_CODEC_CONSTRUCT(VIA, 0xffff) 710 711 /* ATI */ 712 #define HDA_CODEC_ATIRS600_1 HDA_CODEC_CONSTRUCT(ATI, 0x793c) 713 #define HDA_CODEC_ATIRS600_2 HDA_CODEC_CONSTRUCT(ATI, 0x7919) 714 #define HDA_CODEC_ATIRS690 HDA_CODEC_CONSTRUCT(ATI, 0x791a) 715 #define HDA_CODEC_ATIR6XX HDA_CODEC_CONSTRUCT(ATI, 0xaa01) 716 #define HDA_CODEC_ATIXXXX HDA_CODEC_CONSTRUCT(ATI, 0xffff) 717 718 /* NVIDIA */ 719 #define HDA_CODEC_NVIDIAXXXX HDA_CODEC_CONSTRUCT(NVIDIA, 0xffff) 720 721 /* INTEL */ 722 #define HDA_CODEC_INTELXXXX HDA_CODEC_CONSTRUCT(INTEL, 0xffff) 723 724 /* Codecs */ 725 static const struct { 726 uint32_t id; 727 char *name; 728 } hdac_codecs[] = { 729 { HDA_CODEC_ALC260, "Realtek ALC260" }, 730 { HDA_CODEC_ALC262, "Realtek ALC262" }, 731 { HDA_CODEC_ALC267, "Realtek ALC267" }, 732 { HDA_CODEC_ALC268, "Realtek ALC268" }, 733 { HDA_CODEC_ALC269, "Realtek ALC269" }, 734 { HDA_CODEC_ALC272, "Realtek ALC272" }, 735 { HDA_CODEC_ALC660, "Realtek ALC660" }, 736 { HDA_CODEC_ALC662, "Realtek ALC662" }, 737 { HDA_CODEC_ALC663, "Realtek ALC663" }, 738 { HDA_CODEC_ALC861, "Realtek ALC861" }, 739 { HDA_CODEC_ALC861VD, "Realtek ALC861-VD" }, 740 { HDA_CODEC_ALC880, "Realtek ALC880" }, 741 { HDA_CODEC_ALC882, "Realtek ALC882" }, 742 { HDA_CODEC_ALC883, "Realtek ALC883" }, 743 { HDA_CODEC_ALC885, "Realtek ALC885" }, 744 { HDA_CODEC_ALC888, "Realtek ALC888" }, 745 { HDA_CODEC_ALC889, "Realtek ALC889" }, 746 { HDA_CODEC_AD1882, "Analog Devices AD1882" }, 747 { HDA_CODEC_AD1882A, "Analog Devices AD1882A" }, 748 { HDA_CODEC_AD1883, "Analog Devices AD1883" }, 749 { HDA_CODEC_AD1884, "Analog Devices AD1884" }, 750 { HDA_CODEC_AD1884A, "Analog Devices AD1884A" }, 751 { HDA_CODEC_AD1981HD, "Analog Devices AD1981HD" }, 752 { HDA_CODEC_AD1983, "Analog Devices AD1983" }, 753 { HDA_CODEC_AD1984, "Analog Devices AD1984" }, 754 { HDA_CODEC_AD1984A, "Analog Devices AD1984A" }, 755 { HDA_CODEC_AD1984B, "Analog Devices AD1984B" }, 756 { HDA_CODEC_AD1986A, "Analog Devices AD1986A" }, 757 { HDA_CODEC_AD1987, "Analog Devices AD1987" }, 758 { HDA_CODEC_AD1988, "Analog Devices AD1988A" }, 759 { HDA_CODEC_AD1988B, "Analog Devices AD1988B" }, 760 { HDA_CODEC_AD1989B, "Analog Devices AD1989B" }, 761 { HDA_CODEC_CMI9880, "CMedia CMI9880" }, 762 { HDA_CODEC_STAC9200D, "Sigmatel STAC9200D" }, 763 { HDA_CODEC_STAC9204X, "Sigmatel STAC9204X" }, 764 { HDA_CODEC_STAC9204D, "Sigmatel STAC9204D" }, 765 { HDA_CODEC_STAC9205X, "Sigmatel STAC9205X" }, 766 { HDA_CODEC_STAC9205D, "Sigmatel STAC9205D" }, 767 { HDA_CODEC_STAC9220, "Sigmatel STAC9220" }, 768 { HDA_CODEC_STAC9220_A1, "Sigmatel STAC9220_A1" }, 769 { HDA_CODEC_STAC9220_A2, "Sigmatel STAC9220_A2" }, 770 { HDA_CODEC_STAC9221, "Sigmatel STAC9221" }, 771 { HDA_CODEC_STAC9221_A2, "Sigmatel STAC9221_A2" }, 772 { HDA_CODEC_STAC9221D, "Sigmatel STAC9221D" }, 773 { HDA_CODEC_STAC922XD, "Sigmatel STAC9220D/9223D" }, 774 { HDA_CODEC_STAC9227X, "Sigmatel STAC9227X" }, 775 { HDA_CODEC_STAC9227D, "Sigmatel STAC9227D" }, 776 { HDA_CODEC_STAC9228X, "Sigmatel STAC9228X" }, 777 { HDA_CODEC_STAC9228D, "Sigmatel STAC9228D" }, 778 { HDA_CODEC_STAC9229X, "Sigmatel STAC9229X" }, 779 { HDA_CODEC_STAC9229D, "Sigmatel STAC9229D" }, 780 { HDA_CODEC_STAC9230X, "Sigmatel STAC9230X" }, 781 { HDA_CODEC_STAC9230D, "Sigmatel STAC9230D" }, 782 { HDA_CODEC_STAC9250, "Sigmatel STAC9250" }, 783 { HDA_CODEC_STAC9251, "Sigmatel STAC9251" }, 784 { HDA_CODEC_STAC9271X, "Sigmatel STAC9271X" }, 785 { HDA_CODEC_STAC9271D, "Sigmatel STAC9271D" }, 786 { HDA_CODEC_STAC9272X, "Sigmatel STAC9272X" }, 787 { HDA_CODEC_STAC9272D, "Sigmatel STAC9272D" }, 788 { HDA_CODEC_STAC9273X, "Sigmatel STAC9273X" }, 789 { HDA_CODEC_STAC9273D, "Sigmatel STAC9273D" }, 790 { HDA_CODEC_STAC9274, "Sigmatel STAC9274" }, 791 { HDA_CODEC_STAC9274D, "Sigmatel STAC9274D" }, 792 { HDA_CODEC_STAC9274X5NH, "Sigmatel STAC9274X5NH" }, 793 { HDA_CODEC_STAC9274D5NH, "Sigmatel STAC9274D5NH" }, 794 { HDA_CODEC_STAC9872AK, "Sigmatel STAC9872AK" }, 795 { HDA_CODEC_IDT92HD005, "IDT 92HD005" }, 796 { HDA_CODEC_IDT92HD005D, "IDT 92HD005D" }, 797 { HDA_CODEC_IDT92HD206X, "IDT 92HD206X" }, 798 { HDA_CODEC_IDT92HD206D, "IDT 92HD206D" }, 799 { HDA_CODEC_IDT92HD700X, "IDT 92HD700X" }, 800 { HDA_CODEC_IDT92HD700D, "IDT 92HD700D" }, 801 { HDA_CODEC_IDT92HD71B5, "IDT 92HD71B5" }, 802 { HDA_CODEC_IDT92HD71B7, "IDT 92HD71B7" }, 803 { HDA_CODEC_IDT92HD71B8, "IDT 92HD71B8" }, 804 { HDA_CODEC_IDT92HD73C1, "IDT 92HD73C1" }, 805 { HDA_CODEC_IDT92HD73D1, "IDT 92HD73D1" }, 806 { HDA_CODEC_IDT92HD73E1, "IDT 92HD73E1" }, 807 { HDA_CODEC_IDT92HD75B3, "IDT 92HD75B3" }, 808 { HDA_CODEC_IDT92HD75BX, "IDT 92HD75BX" }, 809 { HDA_CODEC_IDT92HD81B1C, "IDT 92HD81B1C" }, 810 { HDA_CODEC_IDT92HD81B1X, "IDT 92HD81B1X" }, 811 { HDA_CODEC_IDT92HD83C1C, "IDT 92HD83C1C" }, 812 { HDA_CODEC_IDT92HD83C1X, "IDT 92HD83C1X" }, 813 { HDA_CODEC_CX20549, "Conexant CX20549 (Venice)" }, 814 { HDA_CODEC_CX20551, "Conexant CX20551 (Waikiki)" }, 815 { HDA_CODEC_CX20561, "Conexant CX20561 (Hermosa)" }, 816 { HDA_CODEC_VT1708_8, "VIA VT1708_8" }, 817 { HDA_CODEC_VT1708_9, "VIA VT1708_9" }, 818 { HDA_CODEC_VT1708_A, "VIA VT1708_A" }, 819 { HDA_CODEC_VT1708_B, "VIA VT1708_B" }, 820 { HDA_CODEC_VT1709_0, "VIA VT1709_0" }, 821 { HDA_CODEC_VT1709_1, "VIA VT1709_1" }, 822 { HDA_CODEC_VT1709_2, "VIA VT1709_2" }, 823 { HDA_CODEC_VT1709_3, "VIA VT1709_3" }, 824 { HDA_CODEC_VT1709_4, "VIA VT1709_4" }, 825 { HDA_CODEC_VT1709_5, "VIA VT1709_5" }, 826 { HDA_CODEC_VT1709_6, "VIA VT1709_6" }, 827 { HDA_CODEC_VT1709_7, "VIA VT1709_7" }, 828 { HDA_CODEC_VT1708B_0, "VIA VT1708B_0" }, 829 { HDA_CODEC_VT1708B_1, "VIA VT1708B_1" }, 830 { HDA_CODEC_VT1708B_2, "VIA VT1708B_2" }, 831 { HDA_CODEC_VT1708B_3, "VIA VT1708B_3" }, 832 { HDA_CODEC_VT1708B_4, "VIA VT1708B_4" }, 833 { HDA_CODEC_VT1708B_5, "VIA VT1708B_5" }, 834 { HDA_CODEC_VT1708B_6, "VIA VT1708B_6" }, 835 { HDA_CODEC_VT1708B_7, "VIA VT1708B_7" }, 836 { HDA_CODEC_ATIRS600_1,"ATI RS600 HDMI" }, 837 { HDA_CODEC_ATIRS600_2,"ATI RS600 HDMI" }, 838 { HDA_CODEC_ATIRS690, "ATI RS690/780 HDMI" }, 839 { HDA_CODEC_ATIR6XX, "ATI R6xx HDMI" }, 840 { HDA_CODEC_SII1392, "Silicon Image SiI1392 HDMI" }, 841 /* Unknown codec */ 842 { HDA_CODEC_ALCXXXX, "Realtek (Unknown)" }, 843 { HDA_CODEC_ADXXXX, "Analog Devices (Unknown)" }, 844 { HDA_CODEC_CMIXXXX, "CMedia (Unknown)" }, 845 { HDA_CODEC_STACXXXX, "Sigmatel (Unknown)" }, 846 { HDA_CODEC_SIIXXXX, "Silicon Image (Unknown)" }, 847 { HDA_CODEC_AGEREXXXX, "Lucent/Agere Systems (Unknown)" }, 848 { HDA_CODEC_CXXXXX, "Conexant (Unknown)" }, 849 { HDA_CODEC_VTXXXX, "VIA (Unknown)" }, 850 { HDA_CODEC_ATIXXXX, "ATI (Unknown)" }, 851 { HDA_CODEC_NVIDIAXXXX,"NVidia (Unknown)" }, 852 { HDA_CODEC_INTELXXXX, "Intel (Unknown)" }, 853 { HDA_CODEC_IDTXXXX, "IDT (Unknown)" }, 854 }; 855 #define HDAC_CODECS_LEN (sizeof(hdac_codecs) / sizeof(hdac_codecs[0])) 856 857 858 /**************************************************************************** 859 * Function prototypes 860 ****************************************************************************/ 861 static void hdac_intr_handler(void *); 862 static int hdac_reset(struct hdac_softc *, int); 863 static int hdac_get_capabilities(struct hdac_softc *); 864 static void hdac_dma_cb(void *, bus_dma_segment_t *, int, int); 865 static int hdac_dma_alloc(struct hdac_softc *, 866 struct hdac_dma *, bus_size_t); 867 static void hdac_dma_free(struct hdac_softc *, struct hdac_dma *); 868 static int hdac_mem_alloc(struct hdac_softc *); 869 static void hdac_mem_free(struct hdac_softc *); 870 static int hdac_irq_alloc(struct hdac_softc *); 871 static void hdac_irq_free(struct hdac_softc *); 872 static void hdac_corb_init(struct hdac_softc *); 873 static void hdac_rirb_init(struct hdac_softc *); 874 static void hdac_corb_start(struct hdac_softc *); 875 static void hdac_rirb_start(struct hdac_softc *); 876 static void hdac_scan_codecs(struct hdac_softc *); 877 static void hdac_probe_codec(struct hdac_codec *); 878 static void hdac_probe_function(struct hdac_codec *, nid_t); 879 static int hdac_pcmchannel_setup(struct hdac_chan *); 880 881 static void hdac_attach2(void *); 882 883 static uint32_t hdac_command_sendone_internal(struct hdac_softc *, 884 uint32_t, int); 885 static void hdac_command_send_internal(struct hdac_softc *, 886 struct hdac_command_list *, int); 887 888 static int hdac_probe(device_t); 889 static int hdac_attach(device_t); 890 static int hdac_detach(device_t); 891 static int hdac_suspend(device_t); 892 static int hdac_resume(device_t); 893 static void hdac_widget_connection_select(struct hdac_widget *, uint8_t); 894 static void hdac_audio_ctl_amp_set(struct hdac_audio_ctl *, 895 uint32_t, int, int); 896 static struct hdac_audio_ctl *hdac_audio_ctl_amp_get(struct hdac_devinfo *, 897 nid_t, int, int, int); 898 static void hdac_audio_ctl_amp_set_internal(struct hdac_softc *, 899 nid_t, nid_t, int, int, int, int, int, int); 900 static struct hdac_widget *hdac_widget_get(struct hdac_devinfo *, nid_t); 901 902 static int hdac_rirb_flush(struct hdac_softc *sc); 903 static int hdac_unsolq_flush(struct hdac_softc *sc); 904 905 static void hdac_dump_pin_config(struct hdac_widget *w, uint32_t conf); 906 907 #define hdac_command(a1, a2, a3) \ 908 hdac_command_sendone_internal(a1, a2, a3) 909 910 #define hdac_codec_id(c) \ 911 ((uint32_t)((c == NULL) ? 0x00000000 : \ 912 ((((uint32_t)(c)->vendor_id & 0x0000ffff) << 16) | \ 913 ((uint32_t)(c)->device_id & 0x0000ffff)))) 914 915 static char * 916 hdac_codec_name(struct hdac_codec *codec) 917 { 918 uint32_t id; 919 int i; 920 921 id = hdac_codec_id(codec); 922 923 for (i = 0; i < HDAC_CODECS_LEN; i++) { 924 if (HDA_DEV_MATCH(hdac_codecs[i].id, id)) 925 return (hdac_codecs[i].name); 926 } 927 928 return ((id == 0x00000000) ? "NULL Codec" : "Unknown Codec"); 929 } 930 931 static char * 932 hdac_audio_ctl_ossmixer_mask2allname(uint32_t mask, char *buf, size_t len) 933 { 934 static char *ossname[] = SOUND_DEVICE_NAMES; 935 int i, first = 1; 936 937 bzero(buf, len); 938 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) { 939 if (mask & (1 << i)) { 940 if (first == 0) 941 strlcat(buf, ", ", len); 942 strlcat(buf, ossname[i], len); 943 first = 0; 944 } 945 } 946 return (buf); 947 } 948 949 static struct hdac_audio_ctl * 950 hdac_audio_ctl_each(struct hdac_devinfo *devinfo, int *index) 951 { 952 if (devinfo == NULL || 953 devinfo->node_type != HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO || 954 index == NULL || devinfo->function.audio.ctl == NULL || 955 devinfo->function.audio.ctlcnt < 1 || 956 *index < 0 || *index >= devinfo->function.audio.ctlcnt) 957 return (NULL); 958 return (&devinfo->function.audio.ctl[(*index)++]); 959 } 960 961 static struct hdac_audio_ctl * 962 hdac_audio_ctl_amp_get(struct hdac_devinfo *devinfo, nid_t nid, int dir, 963 int index, int cnt) 964 { 965 struct hdac_audio_ctl *ctl; 966 int i, found = 0; 967 968 if (devinfo == NULL || devinfo->function.audio.ctl == NULL) 969 return (NULL); 970 971 i = 0; 972 while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) { 973 if (ctl->enable == 0) 974 continue; 975 if (ctl->widget->nid != nid) 976 continue; 977 if (dir && ctl->ndir != dir) 978 continue; 979 if (index >= 0 && ctl->ndir == HDA_CTL_IN && 980 ctl->dir == ctl->ndir && ctl->index != index) 981 continue; 982 found++; 983 if (found == cnt || cnt <= 0) 984 return (ctl); 985 } 986 987 return (NULL); 988 } 989 990 /* 991 * Jack detection (Speaker/HP redirection) event handler. 992 */ 993 static void 994 hdac_hp_switch_handler(struct hdac_devinfo *devinfo) 995 { 996 struct hdac_audio_as *as; 997 struct hdac_softc *sc; 998 struct hdac_widget *w; 999 struct hdac_audio_ctl *ctl; 1000 uint32_t val, res; 1001 int i, j; 1002 nid_t cad; 1003 1004 if (devinfo == NULL || devinfo->codec == NULL || 1005 devinfo->codec->sc == NULL) 1006 return; 1007 1008 sc = devinfo->codec->sc; 1009 cad = devinfo->codec->cad; 1010 as = devinfo->function.audio.as; 1011 for (i = 0; i < devinfo->function.audio.ascnt; i++) { 1012 if (as[i].hpredir < 0) 1013 continue; 1014 1015 w = hdac_widget_get(devinfo, as[i].pins[15]); 1016 if (w == NULL || w->enable == 0 || w->type != 1017 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 1018 continue; 1019 1020 res = hdac_command(sc, 1021 HDA_CMD_GET_PIN_SENSE(cad, as[i].pins[15]), cad); 1022 1023 HDA_BOOTVERBOSE( 1024 device_printf(sc->dev, 1025 "Pin sense: nid=%d res=0x%08x\n", 1026 as[i].pins[15], res); 1027 ); 1028 1029 res = HDA_CMD_GET_PIN_SENSE_PRESENCE_DETECT(res); 1030 if (devinfo->function.audio.quirks & HDA_QUIRK_SENSEINV) 1031 res ^= 1; 1032 1033 /* (Un)Mute headphone pin. */ 1034 ctl = hdac_audio_ctl_amp_get(devinfo, 1035 as[i].pins[15], HDA_CTL_IN, -1, 1); 1036 if (ctl != NULL && ctl->mute) { 1037 /* If pin has muter - use it. */ 1038 val = (res != 0) ? 0 : 1; 1039 if (val != ctl->forcemute) { 1040 ctl->forcemute = val; 1041 hdac_audio_ctl_amp_set(ctl, 1042 HDA_AMP_MUTE_DEFAULT, 1043 HDA_AMP_VOL_DEFAULT, HDA_AMP_VOL_DEFAULT); 1044 } 1045 } else { 1046 /* If there is no muter - disable pin output. */ 1047 w = hdac_widget_get(devinfo, as[i].pins[15]); 1048 if (w != NULL && w->type == 1049 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) { 1050 if (res != 0) 1051 val = w->wclass.pin.ctrl | 1052 HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE; 1053 else 1054 val = w->wclass.pin.ctrl & 1055 ~HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE; 1056 if (val != w->wclass.pin.ctrl) { 1057 w->wclass.pin.ctrl = val; 1058 hdac_command(sc, 1059 HDA_CMD_SET_PIN_WIDGET_CTRL(cad, 1060 w->nid, w->wclass.pin.ctrl), cad); 1061 } 1062 } 1063 } 1064 /* (Un)Mute other pins. */ 1065 for (j = 0; j < 15; j++) { 1066 if (as[i].pins[j] <= 0) 1067 continue; 1068 ctl = hdac_audio_ctl_amp_get(devinfo, 1069 as[i].pins[j], HDA_CTL_IN, -1, 1); 1070 if (ctl != NULL && ctl->mute) { 1071 /* If pin has muter - use it. */ 1072 val = (res != 0) ? 1 : 0; 1073 if (val == ctl->forcemute) 1074 continue; 1075 ctl->forcemute = val; 1076 hdac_audio_ctl_amp_set(ctl, 1077 HDA_AMP_MUTE_DEFAULT, 1078 HDA_AMP_VOL_DEFAULT, HDA_AMP_VOL_DEFAULT); 1079 continue; 1080 } 1081 /* If there is no muter - disable pin output. */ 1082 w = hdac_widget_get(devinfo, as[i].pins[j]); 1083 if (w != NULL && w->type == 1084 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) { 1085 if (res != 0) 1086 val = w->wclass.pin.ctrl & 1087 ~HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE; 1088 else 1089 val = w->wclass.pin.ctrl | 1090 HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE; 1091 if (val != w->wclass.pin.ctrl) { 1092 w->wclass.pin.ctrl = val; 1093 hdac_command(sc, 1094 HDA_CMD_SET_PIN_WIDGET_CTRL(cad, 1095 w->nid, w->wclass.pin.ctrl), cad); 1096 } 1097 } 1098 } 1099 } 1100 } 1101 1102 /* 1103 * Callback for poll based jack detection. 1104 */ 1105 static void 1106 hdac_jack_poll_callback(void *arg) 1107 { 1108 struct hdac_devinfo *devinfo = arg; 1109 struct hdac_softc *sc; 1110 1111 if (devinfo == NULL || devinfo->codec == NULL || 1112 devinfo->codec->sc == NULL) 1113 return; 1114 sc = devinfo->codec->sc; 1115 hdac_lock(sc); 1116 if (sc->poll_ival == 0) { 1117 hdac_unlock(sc); 1118 return; 1119 } 1120 hdac_hp_switch_handler(devinfo); 1121 callout_reset(&sc->poll_jack, sc->poll_ival, 1122 hdac_jack_poll_callback, devinfo); 1123 hdac_unlock(sc); 1124 } 1125 1126 /* 1127 * Jack detection initializer. 1128 */ 1129 static void 1130 hdac_hp_switch_init(struct hdac_devinfo *devinfo) 1131 { 1132 struct hdac_softc *sc = devinfo->codec->sc; 1133 struct hdac_audio_as *as = devinfo->function.audio.as; 1134 struct hdac_widget *w; 1135 uint32_t id; 1136 int i, enable = 0, poll = 0; 1137 nid_t cad; 1138 1139 id = hdac_codec_id(devinfo->codec); 1140 cad = devinfo->codec->cad; 1141 for (i = 0; i < devinfo->function.audio.ascnt; i++) { 1142 if (as[i].hpredir < 0) 1143 continue; 1144 1145 w = hdac_widget_get(devinfo, as[i].pins[15]); 1146 if (w == NULL || w->enable == 0 || w->type != 1147 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 1148 continue; 1149 if (HDA_PARAM_PIN_CAP_PRESENCE_DETECT_CAP(w->wclass.pin.cap) == 0 || 1150 (HDA_CONFIG_DEFAULTCONF_MISC(w->wclass.pin.config) & 1) != 0) { 1151 device_printf(sc->dev, 1152 "No jack detection support at pin %d\n", 1153 as[i].pins[15]); 1154 continue; 1155 } 1156 enable = 1; 1157 if (HDA_PARAM_AUDIO_WIDGET_CAP_UNSOL_CAP(w->param.widget_cap)) { 1158 hdac_command(sc, 1159 HDA_CMD_SET_UNSOLICITED_RESPONSE(cad, w->nid, 1160 HDA_CMD_SET_UNSOLICITED_RESPONSE_ENABLE | 1161 HDAC_UNSOLTAG_EVENT_HP), cad); 1162 } else 1163 poll = 1; 1164 HDA_BOOTVERBOSE( 1165 device_printf(sc->dev, 1166 "Enabling headphone/speaker " 1167 "audio routing switching:\n"); 1168 device_printf(sc->dev, "\tas=%d sense nid=%d [%s]\n", 1169 i, w->nid, (poll != 0) ? "POLL" : "UNSOL"); 1170 ); 1171 } 1172 if (enable) { 1173 hdac_hp_switch_handler(devinfo); 1174 if (poll) { 1175 callout_reset(&sc->poll_jack, 1, 1176 hdac_jack_poll_callback, devinfo); 1177 } 1178 } 1179 } 1180 1181 /* 1182 * Unsolicited messages handler. 1183 */ 1184 static void 1185 hdac_unsolicited_handler(struct hdac_codec *codec, uint32_t tag) 1186 { 1187 struct hdac_softc *sc; 1188 struct hdac_devinfo *devinfo = NULL; 1189 int i; 1190 1191 if (codec == NULL || codec->sc == NULL) 1192 return; 1193 1194 sc = codec->sc; 1195 1196 HDA_BOOTVERBOSE( 1197 device_printf(sc->dev, "Unsol Tag: 0x%08x\n", tag); 1198 ); 1199 1200 for (i = 0; i < codec->num_fgs; i++) { 1201 if (codec->fgs[i].node_type == 1202 HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO) { 1203 devinfo = &codec->fgs[i]; 1204 break; 1205 } 1206 } 1207 1208 if (devinfo == NULL) 1209 return; 1210 1211 switch (tag) { 1212 case HDAC_UNSOLTAG_EVENT_HP: 1213 hdac_hp_switch_handler(devinfo); 1214 break; 1215 default: 1216 device_printf(sc->dev, "Unknown unsol tag: 0x%08x!\n", tag); 1217 break; 1218 } 1219 } 1220 1221 static int 1222 hdac_stream_intr(struct hdac_softc *sc, struct hdac_chan *ch) 1223 { 1224 /* XXX to be removed */ 1225 #ifdef HDAC_INTR_EXTRA 1226 uint32_t res; 1227 #endif 1228 1229 if (!(ch->flags & HDAC_CHN_RUNNING)) 1230 return (0); 1231 1232 /* XXX to be removed */ 1233 #ifdef HDAC_INTR_EXTRA 1234 res = HDAC_READ_1(&sc->mem, ch->off + HDAC_SDSTS); 1235 #endif 1236 1237 /* XXX to be removed */ 1238 #ifdef HDAC_INTR_EXTRA 1239 HDA_BOOTVERBOSE( 1240 if (res & (HDAC_SDSTS_DESE | HDAC_SDSTS_FIFOE)) 1241 device_printf(ch->pdevinfo->dev, 1242 "PCMDIR_%s intr triggered beyond stream boundary:" 1243 "%08x\n", 1244 (ch->dir == PCMDIR_PLAY) ? "PLAY" : "REC", res); 1245 ); 1246 #endif 1247 1248 HDAC_WRITE_1(&sc->mem, ch->off + HDAC_SDSTS, 1249 HDAC_SDSTS_DESE | HDAC_SDSTS_FIFOE | HDAC_SDSTS_BCIS ); 1250 1251 /* XXX to be removed */ 1252 #ifdef HDAC_INTR_EXTRA 1253 if (res & HDAC_SDSTS_BCIS) { 1254 #endif 1255 return (1); 1256 /* XXX to be removed */ 1257 #ifdef HDAC_INTR_EXTRA 1258 } 1259 #endif 1260 1261 return (0); 1262 } 1263 1264 /**************************************************************************** 1265 * void hdac_intr_handler(void *) 1266 * 1267 * Interrupt handler. Processes interrupts received from the hdac. 1268 ****************************************************************************/ 1269 static void 1270 hdac_intr_handler(void *context) 1271 { 1272 struct hdac_softc *sc; 1273 uint32_t intsts; 1274 uint8_t rirbsts; 1275 struct hdac_rirb *rirb_base; 1276 uint32_t trigger; 1277 int i; 1278 1279 sc = (struct hdac_softc *)context; 1280 1281 hdac_lock(sc); 1282 if (sc->polling != 0) { 1283 hdac_unlock(sc); 1284 return; 1285 } 1286 1287 /* Do we have anything to do? */ 1288 intsts = HDAC_READ_4(&sc->mem, HDAC_INTSTS); 1289 if (!HDA_FLAG_MATCH(intsts, HDAC_INTSTS_GIS)) { 1290 hdac_unlock(sc); 1291 return; 1292 } 1293 1294 trigger = 0; 1295 1296 /* Was this a controller interrupt? */ 1297 if (HDA_FLAG_MATCH(intsts, HDAC_INTSTS_CIS)) { 1298 rirb_base = (struct hdac_rirb *)sc->rirb_dma.dma_vaddr; 1299 rirbsts = HDAC_READ_1(&sc->mem, HDAC_RIRBSTS); 1300 /* Get as many responses that we can */ 1301 while (HDA_FLAG_MATCH(rirbsts, HDAC_RIRBSTS_RINTFL)) { 1302 HDAC_WRITE_1(&sc->mem, 1303 HDAC_RIRBSTS, HDAC_RIRBSTS_RINTFL); 1304 if (hdac_rirb_flush(sc) != 0) 1305 trigger |= HDAC_TRIGGER_UNSOL; 1306 rirbsts = HDAC_READ_1(&sc->mem, HDAC_RIRBSTS); 1307 } 1308 /* XXX to be removed */ 1309 /* Clear interrupt and exit */ 1310 #ifdef HDAC_INTR_EXTRA 1311 HDAC_WRITE_4(&sc->mem, HDAC_INTSTS, HDAC_INTSTS_CIS); 1312 #endif 1313 } 1314 1315 if (intsts & HDAC_INTSTS_SIS_MASK) { 1316 for (i = 0; i < sc->num_chans; i++) { 1317 if ((intsts & (1 << (sc->chans[i].off >> 5))) && 1318 hdac_stream_intr(sc, &sc->chans[i]) != 0) 1319 trigger |= (1 << i); 1320 } 1321 /* XXX to be removed */ 1322 #ifdef HDAC_INTR_EXTRA 1323 HDAC_WRITE_4(&sc->mem, HDAC_INTSTS, intsts & 1324 HDAC_INTSTS_SIS_MASK); 1325 #endif 1326 } 1327 1328 hdac_unlock(sc); 1329 1330 for (i = 0; i < sc->num_chans; i++) { 1331 if (trigger & (1 << i)) 1332 chn_intr(sc->chans[i].c); 1333 } 1334 if (trigger & HDAC_TRIGGER_UNSOL) 1335 taskqueue_enqueue(taskqueue_thread, &sc->unsolq_task); 1336 } 1337 1338 /**************************************************************************** 1339 * int hdac_reset(hdac_softc *, int) 1340 * 1341 * Reset the hdac to a quiescent and known state. 1342 ****************************************************************************/ 1343 static int 1344 hdac_reset(struct hdac_softc *sc, int wakeup) 1345 { 1346 uint32_t gctl; 1347 int count, i; 1348 1349 /* 1350 * Stop all Streams DMA engine 1351 */ 1352 for (i = 0; i < sc->num_iss; i++) 1353 HDAC_WRITE_4(&sc->mem, HDAC_ISDCTL(sc, i), 0x0); 1354 for (i = 0; i < sc->num_oss; i++) 1355 HDAC_WRITE_4(&sc->mem, HDAC_OSDCTL(sc, i), 0x0); 1356 for (i = 0; i < sc->num_bss; i++) 1357 HDAC_WRITE_4(&sc->mem, HDAC_BSDCTL(sc, i), 0x0); 1358 1359 /* 1360 * Stop Control DMA engines. 1361 */ 1362 HDAC_WRITE_1(&sc->mem, HDAC_CORBCTL, 0x0); 1363 HDAC_WRITE_1(&sc->mem, HDAC_RIRBCTL, 0x0); 1364 1365 /* 1366 * Reset DMA position buffer. 1367 */ 1368 HDAC_WRITE_4(&sc->mem, HDAC_DPIBLBASE, 0x0); 1369 HDAC_WRITE_4(&sc->mem, HDAC_DPIBUBASE, 0x0); 1370 1371 /* 1372 * Reset the controller. The reset must remain asserted for 1373 * a minimum of 100us. 1374 */ 1375 gctl = HDAC_READ_4(&sc->mem, HDAC_GCTL); 1376 HDAC_WRITE_4(&sc->mem, HDAC_GCTL, gctl & ~HDAC_GCTL_CRST); 1377 count = 10000; 1378 do { 1379 gctl = HDAC_READ_4(&sc->mem, HDAC_GCTL); 1380 if (!(gctl & HDAC_GCTL_CRST)) 1381 break; 1382 DELAY(10); 1383 } while (--count); 1384 if (gctl & HDAC_GCTL_CRST) { 1385 device_printf(sc->dev, "Unable to put hdac in reset\n"); 1386 return (ENXIO); 1387 } 1388 1389 /* If wakeup is not requested - leave the controller in reset state. */ 1390 if (!wakeup) 1391 return (0); 1392 1393 DELAY(100); 1394 gctl = HDAC_READ_4(&sc->mem, HDAC_GCTL); 1395 HDAC_WRITE_4(&sc->mem, HDAC_GCTL, gctl | HDAC_GCTL_CRST); 1396 count = 10000; 1397 do { 1398 gctl = HDAC_READ_4(&sc->mem, HDAC_GCTL); 1399 if (gctl & HDAC_GCTL_CRST) 1400 break; 1401 DELAY(10); 1402 } while (--count); 1403 if (!(gctl & HDAC_GCTL_CRST)) { 1404 device_printf(sc->dev, "Device stuck in reset\n"); 1405 return (ENXIO); 1406 } 1407 1408 /* 1409 * Wait for codecs to finish their own reset sequence. The delay here 1410 * should be of 250us but for some reasons, on it's not enough on my 1411 * computer. Let's use twice as much as necessary to make sure that 1412 * it's reset properly. 1413 */ 1414 DELAY(1000); 1415 1416 return (0); 1417 } 1418 1419 1420 /**************************************************************************** 1421 * int hdac_get_capabilities(struct hdac_softc *); 1422 * 1423 * Retreive the general capabilities of the hdac; 1424 * Number of Input Streams 1425 * Number of Output Streams 1426 * Number of bidirectional Streams 1427 * 64bit ready 1428 * CORB and RIRB sizes 1429 ****************************************************************************/ 1430 static int 1431 hdac_get_capabilities(struct hdac_softc *sc) 1432 { 1433 uint16_t gcap; 1434 uint8_t corbsize, rirbsize; 1435 1436 gcap = HDAC_READ_2(&sc->mem, HDAC_GCAP); 1437 sc->num_iss = HDAC_GCAP_ISS(gcap); 1438 sc->num_oss = HDAC_GCAP_OSS(gcap); 1439 sc->num_bss = HDAC_GCAP_BSS(gcap); 1440 1441 sc->support_64bit = HDA_FLAG_MATCH(gcap, HDAC_GCAP_64OK); 1442 1443 corbsize = HDAC_READ_1(&sc->mem, HDAC_CORBSIZE); 1444 if ((corbsize & HDAC_CORBSIZE_CORBSZCAP_256) == 1445 HDAC_CORBSIZE_CORBSZCAP_256) 1446 sc->corb_size = 256; 1447 else if ((corbsize & HDAC_CORBSIZE_CORBSZCAP_16) == 1448 HDAC_CORBSIZE_CORBSZCAP_16) 1449 sc->corb_size = 16; 1450 else if ((corbsize & HDAC_CORBSIZE_CORBSZCAP_2) == 1451 HDAC_CORBSIZE_CORBSZCAP_2) 1452 sc->corb_size = 2; 1453 else { 1454 device_printf(sc->dev, "%s: Invalid corb size (%x)\n", 1455 __func__, corbsize); 1456 return (ENXIO); 1457 } 1458 1459 rirbsize = HDAC_READ_1(&sc->mem, HDAC_RIRBSIZE); 1460 if ((rirbsize & HDAC_RIRBSIZE_RIRBSZCAP_256) == 1461 HDAC_RIRBSIZE_RIRBSZCAP_256) 1462 sc->rirb_size = 256; 1463 else if ((rirbsize & HDAC_RIRBSIZE_RIRBSZCAP_16) == 1464 HDAC_RIRBSIZE_RIRBSZCAP_16) 1465 sc->rirb_size = 16; 1466 else if ((rirbsize & HDAC_RIRBSIZE_RIRBSZCAP_2) == 1467 HDAC_RIRBSIZE_RIRBSZCAP_2) 1468 sc->rirb_size = 2; 1469 else { 1470 device_printf(sc->dev, "%s: Invalid rirb size (%x)\n", 1471 __func__, rirbsize); 1472 return (ENXIO); 1473 } 1474 1475 HDA_BOOTHVERBOSE( 1476 device_printf(sc->dev, " CORB size: %d\n", sc->corb_size); 1477 device_printf(sc->dev, " RIRB size: %d\n", sc->rirb_size); 1478 device_printf(sc->dev, " Streams: ISS=%d OSS=%d BSS=%d\n", 1479 sc->num_iss, sc->num_oss, sc->num_bss); 1480 ); 1481 1482 return (0); 1483 } 1484 1485 1486 /**************************************************************************** 1487 * void hdac_dma_cb 1488 * 1489 * This function is called by bus_dmamap_load when the mapping has been 1490 * established. We just record the physical address of the mapping into 1491 * the struct hdac_dma passed in. 1492 ****************************************************************************/ 1493 static void 1494 hdac_dma_cb(void *callback_arg, bus_dma_segment_t *segs, int nseg, int error) 1495 { 1496 struct hdac_dma *dma; 1497 1498 if (error == 0) { 1499 dma = (struct hdac_dma *)callback_arg; 1500 dma->dma_paddr = segs[0].ds_addr; 1501 } 1502 } 1503 1504 1505 /**************************************************************************** 1506 * int hdac_dma_alloc 1507 * 1508 * This function allocate and setup a dma region (struct hdac_dma). 1509 * It must be freed by a corresponding hdac_dma_free. 1510 ****************************************************************************/ 1511 static int 1512 hdac_dma_alloc(struct hdac_softc *sc, struct hdac_dma *dma, bus_size_t size) 1513 { 1514 bus_size_t roundsz; 1515 int result; 1516 int lowaddr; 1517 1518 roundsz = roundup2(size, HDAC_DMA_ALIGNMENT); 1519 lowaddr = (sc->support_64bit) ? BUS_SPACE_MAXADDR : 1520 BUS_SPACE_MAXADDR_32BIT; 1521 bzero(dma, sizeof(*dma)); 1522 1523 /* 1524 * Create a DMA tag 1525 */ 1526 result = bus_dma_tag_create(NULL, /* parent */ 1527 HDAC_DMA_ALIGNMENT, /* alignment */ 1528 0, /* boundary */ 1529 lowaddr, /* lowaddr */ 1530 BUS_SPACE_MAXADDR, /* highaddr */ 1531 NULL, /* filtfunc */ 1532 NULL, /* fistfuncarg */ 1533 roundsz, /* maxsize */ 1534 1, /* nsegments */ 1535 roundsz, /* maxsegsz */ 1536 0, /* flags */ 1537 NULL, /* lockfunc */ 1538 NULL, /* lockfuncarg */ 1539 &dma->dma_tag); /* dmat */ 1540 if (result != 0) { 1541 device_printf(sc->dev, "%s: bus_dma_tag_create failed (%x)\n", 1542 __func__, result); 1543 goto hdac_dma_alloc_fail; 1544 } 1545 1546 /* 1547 * Allocate DMA memory 1548 */ 1549 result = bus_dmamem_alloc(dma->dma_tag, (void **)&dma->dma_vaddr, 1550 BUS_DMA_NOWAIT | BUS_DMA_ZERO | 1551 ((sc->flags & HDAC_F_DMA_NOCACHE) ? BUS_DMA_NOCACHE : 0), 1552 &dma->dma_map); 1553 if (result != 0) { 1554 device_printf(sc->dev, "%s: bus_dmamem_alloc failed (%x)\n", 1555 __func__, result); 1556 goto hdac_dma_alloc_fail; 1557 } 1558 1559 dma->dma_size = roundsz; 1560 1561 /* 1562 * Map the memory 1563 */ 1564 result = bus_dmamap_load(dma->dma_tag, dma->dma_map, 1565 (void *)dma->dma_vaddr, roundsz, hdac_dma_cb, (void *)dma, 0); 1566 if (result != 0 || dma->dma_paddr == 0) { 1567 if (result == 0) 1568 result = ENOMEM; 1569 device_printf(sc->dev, "%s: bus_dmamem_load failed (%x)\n", 1570 __func__, result); 1571 goto hdac_dma_alloc_fail; 1572 } 1573 1574 HDA_BOOTHVERBOSE( 1575 device_printf(sc->dev, "%s: size=%ju -> roundsz=%ju\n", 1576 __func__, (uintmax_t)size, (uintmax_t)roundsz); 1577 ); 1578 1579 return (0); 1580 1581 hdac_dma_alloc_fail: 1582 hdac_dma_free(sc, dma); 1583 1584 return (result); 1585 } 1586 1587 1588 /**************************************************************************** 1589 * void hdac_dma_free(struct hdac_softc *, struct hdac_dma *) 1590 * 1591 * Free a struct dhac_dma that has been previously allocated via the 1592 * hdac_dma_alloc function. 1593 ****************************************************************************/ 1594 static void 1595 hdac_dma_free(struct hdac_softc *sc, struct hdac_dma *dma) 1596 { 1597 if (dma->dma_map != NULL) { 1598 #if 0 1599 /* Flush caches */ 1600 bus_dmamap_sync(dma->dma_tag, dma->dma_map, 1601 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); 1602 #endif 1603 bus_dmamap_unload(dma->dma_tag, dma->dma_map); 1604 } 1605 if (dma->dma_vaddr != NULL) { 1606 bus_dmamem_free(dma->dma_tag, dma->dma_vaddr, dma->dma_map); 1607 dma->dma_vaddr = NULL; 1608 } 1609 dma->dma_map = NULL; 1610 if (dma->dma_tag != NULL) { 1611 bus_dma_tag_destroy(dma->dma_tag); 1612 dma->dma_tag = NULL; 1613 } 1614 dma->dma_size = 0; 1615 } 1616 1617 /**************************************************************************** 1618 * int hdac_mem_alloc(struct hdac_softc *) 1619 * 1620 * Allocate all the bus resources necessary to speak with the physical 1621 * controller. 1622 ****************************************************************************/ 1623 static int 1624 hdac_mem_alloc(struct hdac_softc *sc) 1625 { 1626 struct hdac_mem *mem; 1627 1628 mem = &sc->mem; 1629 mem->mem_rid = PCIR_BAR(0); 1630 mem->mem_res = bus_alloc_resource_any(sc->dev, SYS_RES_MEMORY, 1631 &mem->mem_rid, RF_ACTIVE); 1632 if (mem->mem_res == NULL) { 1633 device_printf(sc->dev, 1634 "%s: Unable to allocate memory resource\n", __func__); 1635 return (ENOMEM); 1636 } 1637 mem->mem_tag = rman_get_bustag(mem->mem_res); 1638 mem->mem_handle = rman_get_bushandle(mem->mem_res); 1639 1640 return (0); 1641 } 1642 1643 /**************************************************************************** 1644 * void hdac_mem_free(struct hdac_softc *) 1645 * 1646 * Free up resources previously allocated by hdac_mem_alloc. 1647 ****************************************************************************/ 1648 static void 1649 hdac_mem_free(struct hdac_softc *sc) 1650 { 1651 struct hdac_mem *mem; 1652 1653 mem = &sc->mem; 1654 if (mem->mem_res != NULL) 1655 bus_release_resource(sc->dev, SYS_RES_MEMORY, mem->mem_rid, 1656 mem->mem_res); 1657 mem->mem_res = NULL; 1658 } 1659 1660 /**************************************************************************** 1661 * int hdac_irq_alloc(struct hdac_softc *) 1662 * 1663 * Allocate and setup the resources necessary for interrupt handling. 1664 ****************************************************************************/ 1665 static int 1666 hdac_irq_alloc(struct hdac_softc *sc) 1667 { 1668 struct hdac_irq *irq; 1669 int result; 1670 1671 irq = &sc->irq; 1672 irq->irq_rid = 0x0; 1673 1674 #ifdef HDAC_MSI_ENABLED 1675 if ((sc->flags & HDAC_F_MSI) && 1676 (result = pci_msi_count(sc->dev)) == 1 && 1677 pci_alloc_msi(sc->dev, &result) == 0) 1678 irq->irq_rid = 0x1; 1679 else 1680 #endif 1681 sc->flags &= ~HDAC_F_MSI; 1682 1683 irq->irq_res = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ, 1684 &irq->irq_rid, RF_SHAREABLE | RF_ACTIVE); 1685 if (irq->irq_res == NULL) { 1686 device_printf(sc->dev, "%s: Unable to allocate irq\n", 1687 __func__); 1688 goto hdac_irq_alloc_fail; 1689 } 1690 result = bus_setup_intr(sc->dev, irq->irq_res, INTR_MPSAFE | INTR_TYPE_AV, 1691 NULL, hdac_intr_handler, sc, &irq->irq_handle); 1692 if (result != 0) { 1693 device_printf(sc->dev, 1694 "%s: Unable to setup interrupt handler (%x)\n", 1695 __func__, result); 1696 goto hdac_irq_alloc_fail; 1697 } 1698 1699 return (0); 1700 1701 hdac_irq_alloc_fail: 1702 hdac_irq_free(sc); 1703 1704 return (ENXIO); 1705 } 1706 1707 /**************************************************************************** 1708 * void hdac_irq_free(struct hdac_softc *) 1709 * 1710 * Free up resources previously allocated by hdac_irq_alloc. 1711 ****************************************************************************/ 1712 static void 1713 hdac_irq_free(struct hdac_softc *sc) 1714 { 1715 struct hdac_irq *irq; 1716 1717 irq = &sc->irq; 1718 if (irq->irq_res != NULL && irq->irq_handle != NULL) 1719 bus_teardown_intr(sc->dev, irq->irq_res, irq->irq_handle); 1720 if (irq->irq_res != NULL) 1721 bus_release_resource(sc->dev, SYS_RES_IRQ, irq->irq_rid, 1722 irq->irq_res); 1723 #ifdef HDAC_MSI_ENABLED 1724 if ((sc->flags & HDAC_F_MSI) && irq->irq_rid == 0x1) 1725 pci_release_msi(sc->dev); 1726 #endif 1727 irq->irq_handle = NULL; 1728 irq->irq_res = NULL; 1729 irq->irq_rid = 0x0; 1730 } 1731 1732 /**************************************************************************** 1733 * void hdac_corb_init(struct hdac_softc *) 1734 * 1735 * Initialize the corb registers for operations but do not start it up yet. 1736 * The CORB engine must not be running when this function is called. 1737 ****************************************************************************/ 1738 static void 1739 hdac_corb_init(struct hdac_softc *sc) 1740 { 1741 uint8_t corbsize; 1742 uint64_t corbpaddr; 1743 1744 /* Setup the CORB size. */ 1745 switch (sc->corb_size) { 1746 case 256: 1747 corbsize = HDAC_CORBSIZE_CORBSIZE(HDAC_CORBSIZE_CORBSIZE_256); 1748 break; 1749 case 16: 1750 corbsize = HDAC_CORBSIZE_CORBSIZE(HDAC_CORBSIZE_CORBSIZE_16); 1751 break; 1752 case 2: 1753 corbsize = HDAC_CORBSIZE_CORBSIZE(HDAC_CORBSIZE_CORBSIZE_2); 1754 break; 1755 default: 1756 panic("%s: Invalid CORB size (%x)\n", __func__, sc->corb_size); 1757 } 1758 HDAC_WRITE_1(&sc->mem, HDAC_CORBSIZE, corbsize); 1759 1760 /* Setup the CORB Address in the hdac */ 1761 corbpaddr = (uint64_t)sc->corb_dma.dma_paddr; 1762 HDAC_WRITE_4(&sc->mem, HDAC_CORBLBASE, (uint32_t)corbpaddr); 1763 HDAC_WRITE_4(&sc->mem, HDAC_CORBUBASE, (uint32_t)(corbpaddr >> 32)); 1764 1765 /* Set the WP and RP */ 1766 sc->corb_wp = 0; 1767 HDAC_WRITE_2(&sc->mem, HDAC_CORBWP, sc->corb_wp); 1768 HDAC_WRITE_2(&sc->mem, HDAC_CORBRP, HDAC_CORBRP_CORBRPRST); 1769 /* 1770 * The HDA specification indicates that the CORBRPRST bit will always 1771 * read as zero. Unfortunately, it seems that at least the 82801G 1772 * doesn't reset the bit to zero, which stalls the corb engine. 1773 * manually reset the bit to zero before continuing. 1774 */ 1775 HDAC_WRITE_2(&sc->mem, HDAC_CORBRP, 0x0); 1776 1777 /* Enable CORB error reporting */ 1778 #if 0 1779 HDAC_WRITE_1(&sc->mem, HDAC_CORBCTL, HDAC_CORBCTL_CMEIE); 1780 #endif 1781 } 1782 1783 /**************************************************************************** 1784 * void hdac_rirb_init(struct hdac_softc *) 1785 * 1786 * Initialize the rirb registers for operations but do not start it up yet. 1787 * The RIRB engine must not be running when this function is called. 1788 ****************************************************************************/ 1789 static void 1790 hdac_rirb_init(struct hdac_softc *sc) 1791 { 1792 uint8_t rirbsize; 1793 uint64_t rirbpaddr; 1794 1795 /* Setup the RIRB size. */ 1796 switch (sc->rirb_size) { 1797 case 256: 1798 rirbsize = HDAC_RIRBSIZE_RIRBSIZE(HDAC_RIRBSIZE_RIRBSIZE_256); 1799 break; 1800 case 16: 1801 rirbsize = HDAC_RIRBSIZE_RIRBSIZE(HDAC_RIRBSIZE_RIRBSIZE_16); 1802 break; 1803 case 2: 1804 rirbsize = HDAC_RIRBSIZE_RIRBSIZE(HDAC_RIRBSIZE_RIRBSIZE_2); 1805 break; 1806 default: 1807 panic("%s: Invalid RIRB size (%x)\n", __func__, sc->rirb_size); 1808 } 1809 HDAC_WRITE_1(&sc->mem, HDAC_RIRBSIZE, rirbsize); 1810 1811 /* Setup the RIRB Address in the hdac */ 1812 rirbpaddr = (uint64_t)sc->rirb_dma.dma_paddr; 1813 HDAC_WRITE_4(&sc->mem, HDAC_RIRBLBASE, (uint32_t)rirbpaddr); 1814 HDAC_WRITE_4(&sc->mem, HDAC_RIRBUBASE, (uint32_t)(rirbpaddr >> 32)); 1815 1816 /* Setup the WP and RP */ 1817 sc->rirb_rp = 0; 1818 HDAC_WRITE_2(&sc->mem, HDAC_RIRBWP, HDAC_RIRBWP_RIRBWPRST); 1819 1820 /* Setup the interrupt threshold */ 1821 HDAC_WRITE_2(&sc->mem, HDAC_RINTCNT, sc->rirb_size / 2); 1822 1823 /* Enable Overrun and response received reporting */ 1824 #if 0 1825 HDAC_WRITE_1(&sc->mem, HDAC_RIRBCTL, 1826 HDAC_RIRBCTL_RIRBOIC | HDAC_RIRBCTL_RINTCTL); 1827 #else 1828 HDAC_WRITE_1(&sc->mem, HDAC_RIRBCTL, HDAC_RIRBCTL_RINTCTL); 1829 #endif 1830 1831 #if 0 1832 /* 1833 * Make sure that the Host CPU cache doesn't contain any dirty 1834 * cache lines that falls in the rirb. If I understood correctly, it 1835 * should be sufficient to do this only once as the rirb is purely 1836 * read-only from now on. 1837 */ 1838 bus_dmamap_sync(sc->rirb_dma.dma_tag, sc->rirb_dma.dma_map, 1839 BUS_DMASYNC_PREREAD); 1840 #endif 1841 } 1842 1843 /**************************************************************************** 1844 * void hdac_corb_start(hdac_softc *) 1845 * 1846 * Startup the corb DMA engine 1847 ****************************************************************************/ 1848 static void 1849 hdac_corb_start(struct hdac_softc *sc) 1850 { 1851 uint32_t corbctl; 1852 1853 corbctl = HDAC_READ_1(&sc->mem, HDAC_CORBCTL); 1854 corbctl |= HDAC_CORBCTL_CORBRUN; 1855 HDAC_WRITE_1(&sc->mem, HDAC_CORBCTL, corbctl); 1856 } 1857 1858 /**************************************************************************** 1859 * void hdac_rirb_start(hdac_softc *) 1860 * 1861 * Startup the rirb DMA engine 1862 ****************************************************************************/ 1863 static void 1864 hdac_rirb_start(struct hdac_softc *sc) 1865 { 1866 uint32_t rirbctl; 1867 1868 rirbctl = HDAC_READ_1(&sc->mem, HDAC_RIRBCTL); 1869 rirbctl |= HDAC_RIRBCTL_RIRBDMAEN; 1870 HDAC_WRITE_1(&sc->mem, HDAC_RIRBCTL, rirbctl); 1871 } 1872 1873 1874 /**************************************************************************** 1875 * void hdac_scan_codecs(struct hdac_softc *, int) 1876 * 1877 * Scan the bus for available codecs, starting with num. 1878 ****************************************************************************/ 1879 static void 1880 hdac_scan_codecs(struct hdac_softc *sc) 1881 { 1882 struct hdac_codec *codec; 1883 int i; 1884 uint16_t statests; 1885 1886 statests = HDAC_READ_2(&sc->mem, HDAC_STATESTS); 1887 for (i = 0; i < HDAC_CODEC_MAX; i++) { 1888 if (HDAC_STATESTS_SDIWAKE(statests, i)) { 1889 /* We have found a codec. */ 1890 codec = (struct hdac_codec *)malloc(sizeof(*codec), 1891 M_HDAC, M_ZERO | M_NOWAIT); 1892 if (codec == NULL) { 1893 device_printf(sc->dev, 1894 "Unable to allocate memory for codec\n"); 1895 continue; 1896 } 1897 codec->commands = NULL; 1898 codec->responses_received = 0; 1899 codec->verbs_sent = 0; 1900 codec->sc = sc; 1901 codec->cad = i; 1902 sc->codecs[i] = codec; 1903 hdac_probe_codec(codec); 1904 } 1905 } 1906 /* All codecs have been probed, now try to attach drivers to them */ 1907 /* bus_generic_attach(sc->dev); */ 1908 } 1909 1910 /**************************************************************************** 1911 * void hdac_probe_codec(struct hdac_softc *, int) 1912 * 1913 * Probe a the given codec_id for available function groups. 1914 ****************************************************************************/ 1915 static void 1916 hdac_probe_codec(struct hdac_codec *codec) 1917 { 1918 struct hdac_softc *sc = codec->sc; 1919 uint32_t vendorid, revisionid, subnode; 1920 int startnode; 1921 int endnode; 1922 int i; 1923 nid_t cad = codec->cad; 1924 1925 HDA_BOOTVERBOSE( 1926 device_printf(sc->dev, "Probing codec #%d...\n", cad); 1927 ); 1928 vendorid = hdac_command(sc, 1929 HDA_CMD_GET_PARAMETER(cad, 0x0, HDA_PARAM_VENDOR_ID), 1930 cad); 1931 revisionid = hdac_command(sc, 1932 HDA_CMD_GET_PARAMETER(cad, 0x0, HDA_PARAM_REVISION_ID), 1933 cad); 1934 codec->vendor_id = HDA_PARAM_VENDOR_ID_VENDOR_ID(vendorid); 1935 codec->device_id = HDA_PARAM_VENDOR_ID_DEVICE_ID(vendorid); 1936 codec->revision_id = HDA_PARAM_REVISION_ID_REVISION_ID(revisionid); 1937 codec->stepping_id = HDA_PARAM_REVISION_ID_STEPPING_ID(revisionid); 1938 1939 if (vendorid == HDAC_INVALID && revisionid == HDAC_INVALID) { 1940 device_printf(sc->dev, "Codec #%d is not responding!" 1941 " Probing aborted.\n", cad); 1942 return; 1943 } 1944 1945 device_printf(sc->dev, "HDA Codec #%d: %s\n", 1946 cad, hdac_codec_name(codec)); 1947 HDA_BOOTVERBOSE( 1948 device_printf(sc->dev, " HDA Codec ID: 0x%08x\n", 1949 hdac_codec_id(codec)); 1950 device_printf(sc->dev, " Vendor: 0x%04x\n", 1951 codec->vendor_id); 1952 device_printf(sc->dev, " Device: 0x%04x\n", 1953 codec->device_id); 1954 device_printf(sc->dev, " Revision: 0x%02x\n", 1955 codec->revision_id); 1956 device_printf(sc->dev, " Stepping: 0x%02x\n", 1957 codec->stepping_id); 1958 device_printf(sc->dev, "PCI Subvendor: 0x%08x\n", 1959 sc->pci_subvendor); 1960 ); 1961 subnode = hdac_command(sc, 1962 HDA_CMD_GET_PARAMETER(cad, 0x0, HDA_PARAM_SUB_NODE_COUNT), 1963 cad); 1964 startnode = HDA_PARAM_SUB_NODE_COUNT_START(subnode); 1965 endnode = startnode + HDA_PARAM_SUB_NODE_COUNT_TOTAL(subnode); 1966 1967 HDA_BOOTHVERBOSE( 1968 device_printf(sc->dev, "\tstartnode=%d endnode=%d\n", 1969 startnode, endnode); 1970 ); 1971 1972 codec->fgs = (struct hdac_devinfo *)malloc(sizeof(struct hdac_devinfo) * 1973 (endnode - startnode), M_HDAC, M_NOWAIT | M_ZERO); 1974 if (codec->fgs == NULL) { 1975 device_printf(sc->dev, "%s: Unable to allocate function groups\n", 1976 __func__); 1977 return; 1978 } 1979 1980 for (i = startnode; i < endnode; i++) 1981 hdac_probe_function(codec, i); 1982 return; 1983 } 1984 1985 /* 1986 * Probe codec function and add it to the list. 1987 */ 1988 static void 1989 hdac_probe_function(struct hdac_codec *codec, nid_t nid) 1990 { 1991 struct hdac_softc *sc = codec->sc; 1992 struct hdac_devinfo *devinfo = &codec->fgs[codec->num_fgs]; 1993 uint32_t fctgrptype; 1994 uint32_t res; 1995 nid_t cad = codec->cad; 1996 1997 fctgrptype = HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE(hdac_command(sc, 1998 HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_FCT_GRP_TYPE), cad)); 1999 2000 devinfo->nid = nid; 2001 devinfo->node_type = fctgrptype; 2002 devinfo->codec = codec; 2003 2004 res = hdac_command(sc, 2005 HDA_CMD_GET_PARAMETER(cad , nid, HDA_PARAM_SUB_NODE_COUNT), cad); 2006 2007 devinfo->nodecnt = HDA_PARAM_SUB_NODE_COUNT_TOTAL(res); 2008 devinfo->startnode = HDA_PARAM_SUB_NODE_COUNT_START(res); 2009 devinfo->endnode = devinfo->startnode + devinfo->nodecnt; 2010 2011 HDA_BOOTVERBOSE( 2012 device_printf(sc->dev, 2013 "\tFound %s FG nid=%d startnode=%d endnode=%d total=%d\n", 2014 (fctgrptype == HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO) ? "audio": 2015 (fctgrptype == HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_MODEM) ? "modem": 2016 "unknown", nid, devinfo->startnode, devinfo->endnode, 2017 devinfo->nodecnt); 2018 ); 2019 2020 if (devinfo->nodecnt > 0) 2021 devinfo->widget = (struct hdac_widget *)malloc( 2022 sizeof(*(devinfo->widget)) * devinfo->nodecnt, M_HDAC, 2023 M_NOWAIT | M_ZERO); 2024 else 2025 devinfo->widget = NULL; 2026 2027 if (devinfo->widget == NULL) { 2028 device_printf(sc->dev, "unable to allocate widgets!\n"); 2029 devinfo->endnode = devinfo->startnode; 2030 devinfo->nodecnt = 0; 2031 return; 2032 } 2033 2034 codec->num_fgs++; 2035 } 2036 2037 static void 2038 hdac_widget_connection_parse(struct hdac_widget *w) 2039 { 2040 struct hdac_softc *sc = w->devinfo->codec->sc; 2041 uint32_t res; 2042 int i, j, max, ents, entnum; 2043 nid_t cad = w->devinfo->codec->cad; 2044 nid_t nid = w->nid; 2045 nid_t cnid, addcnid, prevcnid; 2046 2047 w->nconns = 0; 2048 2049 res = hdac_command(sc, 2050 HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_CONN_LIST_LENGTH), cad); 2051 2052 ents = HDA_PARAM_CONN_LIST_LENGTH_LIST_LENGTH(res); 2053 2054 if (ents < 1) 2055 return; 2056 2057 entnum = HDA_PARAM_CONN_LIST_LENGTH_LONG_FORM(res) ? 2 : 4; 2058 max = (sizeof(w->conns) / sizeof(w->conns[0])) - 1; 2059 prevcnid = 0; 2060 2061 #define CONN_RMASK(e) (1 << ((32 / (e)) - 1)) 2062 #define CONN_NMASK(e) (CONN_RMASK(e) - 1) 2063 #define CONN_RESVAL(r, e, n) ((r) >> ((32 / (e)) * (n))) 2064 #define CONN_RANGE(r, e, n) (CONN_RESVAL(r, e, n) & CONN_RMASK(e)) 2065 #define CONN_CNID(r, e, n) (CONN_RESVAL(r, e, n) & CONN_NMASK(e)) 2066 2067 for (i = 0; i < ents; i += entnum) { 2068 res = hdac_command(sc, 2069 HDA_CMD_GET_CONN_LIST_ENTRY(cad, nid, i), cad); 2070 for (j = 0; j < entnum; j++) { 2071 cnid = CONN_CNID(res, entnum, j); 2072 if (cnid == 0) { 2073 if (w->nconns < ents) 2074 device_printf(sc->dev, 2075 "%s: nid=%d WARNING: zero cnid " 2076 "entnum=%d j=%d index=%d " 2077 "entries=%d found=%d res=0x%08x\n", 2078 __func__, nid, entnum, j, i, 2079 ents, w->nconns, res); 2080 else 2081 goto getconns_out; 2082 } 2083 if (cnid < w->devinfo->startnode || 2084 cnid >= w->devinfo->endnode) { 2085 HDA_BOOTVERBOSE( 2086 device_printf(sc->dev, 2087 "GHOST: nid=%d j=%d " 2088 "entnum=%d index=%d res=0x%08x\n", 2089 nid, j, entnum, i, res); 2090 ); 2091 } 2092 if (CONN_RANGE(res, entnum, j) == 0) 2093 addcnid = cnid; 2094 else if (prevcnid == 0 || prevcnid >= cnid) { 2095 device_printf(sc->dev, 2096 "%s: WARNING: Invalid child range " 2097 "nid=%d index=%d j=%d entnum=%d " 2098 "prevcnid=%d cnid=%d res=0x%08x\n", 2099 __func__, nid, i, j, entnum, prevcnid, 2100 cnid, res); 2101 addcnid = cnid; 2102 } else 2103 addcnid = prevcnid + 1; 2104 while (addcnid <= cnid) { 2105 if (w->nconns > max) { 2106 device_printf(sc->dev, 2107 "Adding %d (nid=%d): " 2108 "Max connection reached! max=%d\n", 2109 addcnid, nid, max + 1); 2110 goto getconns_out; 2111 } 2112 w->connsenable[w->nconns] = 1; 2113 w->conns[w->nconns++] = addcnid++; 2114 } 2115 prevcnid = cnid; 2116 } 2117 } 2118 2119 getconns_out: 2120 return; 2121 } 2122 2123 static uint32_t 2124 hdac_widget_pin_patch(uint32_t config, const char *str) 2125 { 2126 char buf[256]; 2127 char *key, *value, *rest, *bad; 2128 int ival, i; 2129 2130 strlcpy(buf, str, sizeof(buf)); 2131 rest = buf; 2132 while ((key = strsep(&rest, "=")) != NULL) { 2133 value = strsep(&rest, " \t"); 2134 if (value == NULL) 2135 break; 2136 ival = strtol(value, &bad, 10); 2137 if (strcmp(key, "seq") == 0) { 2138 config &= ~HDA_CONFIG_DEFAULTCONF_SEQUENCE_MASK; 2139 config |= ((ival << HDA_CONFIG_DEFAULTCONF_SEQUENCE_SHIFT) & 2140 HDA_CONFIG_DEFAULTCONF_SEQUENCE_MASK); 2141 } else if (strcmp(key, "as") == 0) { 2142 config &= ~HDA_CONFIG_DEFAULTCONF_ASSOCIATION_MASK; 2143 config |= ((ival << HDA_CONFIG_DEFAULTCONF_ASSOCIATION_SHIFT) & 2144 HDA_CONFIG_DEFAULTCONF_ASSOCIATION_MASK); 2145 } else if (strcmp(key, "misc") == 0) { 2146 config &= ~HDA_CONFIG_DEFAULTCONF_MISC_MASK; 2147 config |= ((ival << HDA_CONFIG_DEFAULTCONF_MISC_SHIFT) & 2148 HDA_CONFIG_DEFAULTCONF_MISC_MASK); 2149 } else if (strcmp(key, "color") == 0) { 2150 config &= ~HDA_CONFIG_DEFAULTCONF_COLOR_MASK; 2151 if (bad[0] == 0) { 2152 config |= ((ival << HDA_CONFIG_DEFAULTCONF_COLOR_SHIFT) & 2153 HDA_CONFIG_DEFAULTCONF_COLOR_MASK); 2154 }; 2155 for (i = 0; i < 16; i++) { 2156 if (strcasecmp(HDA_COLORS[i], value) == 0) { 2157 config |= (i << HDA_CONFIG_DEFAULTCONF_COLOR_SHIFT); 2158 break; 2159 } 2160 } 2161 } else if (strcmp(key, "ctype") == 0) { 2162 config &= ~HDA_CONFIG_DEFAULTCONF_CONNECTION_TYPE_MASK; 2163 config |= ((ival << HDA_CONFIG_DEFAULTCONF_CONNECTION_TYPE_SHIFT) & 2164 HDA_CONFIG_DEFAULTCONF_CONNECTION_TYPE_MASK); 2165 } else if (strcmp(key, "device") == 0) { 2166 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK; 2167 if (bad[0] == 0) { 2168 config |= ((ival << HDA_CONFIG_DEFAULTCONF_DEVICE_SHIFT) & 2169 HDA_CONFIG_DEFAULTCONF_DEVICE_MASK); 2170 continue; 2171 }; 2172 for (i = 0; i < 16; i++) { 2173 if (strcasecmp(HDA_DEVS[i], value) == 0) { 2174 config |= (i << HDA_CONFIG_DEFAULTCONF_DEVICE_SHIFT); 2175 break; 2176 } 2177 } 2178 } else if (strcmp(key, "loc") == 0) { 2179 config &= ~HDA_CONFIG_DEFAULTCONF_LOCATION_MASK; 2180 config |= ((ival << HDA_CONFIG_DEFAULTCONF_LOCATION_SHIFT) & 2181 HDA_CONFIG_DEFAULTCONF_LOCATION_MASK); 2182 } else if (strcmp(key, "conn") == 0) { 2183 config &= ~HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK; 2184 if (bad[0] == 0) { 2185 config |= ((ival << HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_SHIFT) & 2186 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK); 2187 continue; 2188 }; 2189 for (i = 0; i < 4; i++) { 2190 if (strcasecmp(HDA_CONNS[i], value) == 0) { 2191 config |= (i << HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_SHIFT); 2192 break; 2193 } 2194 } 2195 } 2196 } 2197 return (config); 2198 } 2199 2200 static uint32_t 2201 hdac_widget_pin_getconfig(struct hdac_widget *w) 2202 { 2203 struct hdac_softc *sc; 2204 uint32_t config, orig, id; 2205 nid_t cad, nid; 2206 char buf[32]; 2207 const char *res = NULL, *patch = NULL; 2208 2209 sc = w->devinfo->codec->sc; 2210 cad = w->devinfo->codec->cad; 2211 nid = w->nid; 2212 id = hdac_codec_id(w->devinfo->codec); 2213 2214 config = hdac_command(sc, 2215 HDA_CMD_GET_CONFIGURATION_DEFAULT(cad, nid), 2216 cad); 2217 orig = config; 2218 2219 HDA_BOOTVERBOSE( 2220 hdac_dump_pin_config(w, orig); 2221 ); 2222 2223 /* XXX: Old patches require complete review. 2224 * Now they may create more problem then solve due to 2225 * incorrect associations. 2226 */ 2227 if (id == HDA_CODEC_ALC880 && sc->pci_subvendor == LG_LW20_SUBVENDOR) { 2228 switch (nid) { 2229 case 26: 2230 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK; 2231 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_IN; 2232 break; 2233 case 27: 2234 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK; 2235 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT; 2236 break; 2237 default: 2238 break; 2239 } 2240 } else if (id == HDA_CODEC_ALC880 && 2241 (sc->pci_subvendor == CLEVO_D900T_SUBVENDOR || 2242 sc->pci_subvendor == ASUS_M5200_SUBVENDOR)) { 2243 /* 2244 * Super broken BIOS 2245 */ 2246 switch (nid) { 2247 case 24: /* MIC1 */ 2248 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK; 2249 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN; 2250 break; 2251 case 25: /* XXX MIC2 */ 2252 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK; 2253 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN; 2254 break; 2255 case 26: /* LINE1 */ 2256 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK; 2257 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_IN; 2258 break; 2259 case 27: /* XXX LINE2 */ 2260 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK; 2261 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_IN; 2262 break; 2263 case 28: /* CD */ 2264 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK; 2265 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_CD; 2266 break; 2267 } 2268 } else if (id == HDA_CODEC_ALC883 && 2269 (sc->pci_subvendor == MSI_MS034A_SUBVENDOR || 2270 HDA_DEV_MATCH(ACER_ALL_SUBVENDOR, sc->pci_subvendor))) { 2271 switch (nid) { 2272 case 25: 2273 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK | 2274 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK); 2275 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN | 2276 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED); 2277 break; 2278 case 28: 2279 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK | 2280 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK); 2281 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_CD | 2282 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED); 2283 break; 2284 } 2285 } else if (id == HDA_CODEC_CX20549 && sc->pci_subvendor == 2286 HP_V3000_SUBVENDOR) { 2287 switch (nid) { 2288 case 18: 2289 config &= ~HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK; 2290 config |= HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_NONE; 2291 break; 2292 case 20: 2293 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK | 2294 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK); 2295 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN | 2296 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED); 2297 break; 2298 case 21: 2299 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK | 2300 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK); 2301 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_CD | 2302 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED); 2303 break; 2304 } 2305 } else if (id == HDA_CODEC_CX20551 && sc->pci_subvendor == 2306 HP_DV5000_SUBVENDOR) { 2307 switch (nid) { 2308 case 20: 2309 case 21: 2310 config &= ~HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK; 2311 config |= HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_NONE; 2312 break; 2313 } 2314 } else if (id == HDA_CODEC_ALC861 && sc->pci_subvendor == 2315 ASUS_W6F_SUBVENDOR) { 2316 switch (nid) { 2317 case 11: 2318 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK | 2319 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK); 2320 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_OUT | 2321 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED); 2322 break; 2323 case 12: 2324 case 14: 2325 case 16: 2326 case 31: 2327 case 32: 2328 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK | 2329 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK); 2330 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN | 2331 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED); 2332 break; 2333 case 15: 2334 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK | 2335 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK); 2336 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT | 2337 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_JACK); 2338 break; 2339 } 2340 } else if (id == HDA_CODEC_ALC861 && sc->pci_subvendor == 2341 UNIWILL_9075_SUBVENDOR) { 2342 switch (nid) { 2343 case 15: 2344 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK | 2345 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK); 2346 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT | 2347 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_JACK); 2348 break; 2349 } 2350 } 2351 2352 /* New patches */ 2353 if (id == HDA_CODEC_AD1986A && 2354 (sc->pci_subvendor == ASUS_M2NPVMX_SUBVENDOR || 2355 sc->pci_subvendor == ASUS_A8NVMCSM_SUBVENDOR)) { 2356 switch (nid) { 2357 case 28: /* 5.1 out => 2.0 out + 2 inputs */ 2358 patch = "device=Line-in as=8 seq=1"; 2359 break; 2360 case 29: 2361 patch = "device=Mic as=8 seq=2"; 2362 break; 2363 case 31: /* Lot of inputs configured with as=15 and unusable */ 2364 patch = "as=8 seq=3"; 2365 break; 2366 case 32: 2367 patch = "as=8 seq=4"; 2368 break; 2369 case 34: 2370 patch = "as=8 seq=5"; 2371 break; 2372 case 36: 2373 patch = "as=8 seq=6"; 2374 break; 2375 } 2376 } else if (id == HDA_CODEC_ALC260 && 2377 HDA_DEV_MATCH(SONY_S5_SUBVENDOR, sc->pci_subvendor)) { 2378 switch (nid) { 2379 case 16: 2380 patch = "seq=15 device=Headphones"; 2381 break; 2382 } 2383 } else if (id == HDA_CODEC_ALC268 && 2384 HDA_DEV_MATCH(ACER_ALL_SUBVENDOR, sc->pci_subvendor)) { 2385 switch (nid) { 2386 case 28: 2387 patch = "device=CD conn=fixed"; 2388 break; 2389 } 2390 } 2391 2392 if (patch != NULL) 2393 config = hdac_widget_pin_patch(config, patch); 2394 2395 snprintf(buf, sizeof(buf), "cad%u.nid%u.config", cad, nid); 2396 if (resource_string_value(device_get_name(sc->dev), 2397 device_get_unit(sc->dev), buf, &res) == 0) { 2398 if (strncmp(res, "0x", 2) == 0) { 2399 config = strtol(res + 2, NULL, 16); 2400 } else { 2401 config = hdac_widget_pin_patch(config, res); 2402 } 2403 } 2404 2405 HDA_BOOTVERBOSE( 2406 if (config != orig) 2407 device_printf(sc->dev, 2408 "Patching pin config nid=%u 0x%08x -> 0x%08x\n", 2409 nid, orig, config); 2410 ); 2411 2412 return (config); 2413 } 2414 2415 static uint32_t 2416 hdac_widget_pin_getcaps(struct hdac_widget *w) 2417 { 2418 struct hdac_softc *sc; 2419 uint32_t caps, orig, id; 2420 nid_t cad, nid; 2421 2422 sc = w->devinfo->codec->sc; 2423 cad = w->devinfo->codec->cad; 2424 nid = w->nid; 2425 id = hdac_codec_id(w->devinfo->codec); 2426 2427 caps = hdac_command(sc, 2428 HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_PIN_CAP), cad); 2429 orig = caps; 2430 2431 HDA_BOOTVERBOSE( 2432 if (caps != orig) 2433 device_printf(sc->dev, 2434 "Patching pin caps nid=%u 0x%08x -> 0x%08x\n", 2435 nid, orig, caps); 2436 ); 2437 2438 return (caps); 2439 } 2440 2441 static void 2442 hdac_widget_pin_parse(struct hdac_widget *w) 2443 { 2444 struct hdac_softc *sc = w->devinfo->codec->sc; 2445 uint32_t config, pincap; 2446 const char *devstr, *connstr; 2447 nid_t cad = w->devinfo->codec->cad; 2448 nid_t nid = w->nid; 2449 2450 config = hdac_widget_pin_getconfig(w); 2451 w->wclass.pin.config = config; 2452 2453 pincap = hdac_widget_pin_getcaps(w); 2454 w->wclass.pin.cap = pincap; 2455 2456 w->wclass.pin.ctrl = hdac_command(sc, 2457 HDA_CMD_GET_PIN_WIDGET_CTRL(cad, nid), cad); 2458 2459 if (HDA_PARAM_PIN_CAP_EAPD_CAP(pincap)) { 2460 w->param.eapdbtl = hdac_command(sc, 2461 HDA_CMD_GET_EAPD_BTL_ENABLE(cad, nid), cad); 2462 w->param.eapdbtl &= 0x7; 2463 w->param.eapdbtl |= HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD; 2464 } else 2465 w->param.eapdbtl = HDAC_INVALID; 2466 2467 devstr = HDA_DEVS[(config & HDA_CONFIG_DEFAULTCONF_DEVICE_MASK) >> 2468 HDA_CONFIG_DEFAULTCONF_DEVICE_SHIFT]; 2469 2470 connstr = HDA_CONNS[(config & HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK) >> 2471 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_SHIFT]; 2472 2473 strlcat(w->name, ": ", sizeof(w->name)); 2474 strlcat(w->name, devstr, sizeof(w->name)); 2475 strlcat(w->name, " (", sizeof(w->name)); 2476 strlcat(w->name, connstr, sizeof(w->name)); 2477 strlcat(w->name, ")", sizeof(w->name)); 2478 } 2479 2480 static uint32_t 2481 hdac_widget_getcaps(struct hdac_widget *w, int *waspin) 2482 { 2483 struct hdac_softc *sc; 2484 uint32_t caps, orig, id; 2485 nid_t cad, nid, beeper = -1; 2486 2487 sc = w->devinfo->codec->sc; 2488 cad = w->devinfo->codec->cad; 2489 nid = w->nid; 2490 id = hdac_codec_id(w->devinfo->codec); 2491 2492 caps = hdac_command(sc, 2493 HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_AUDIO_WIDGET_CAP), 2494 cad); 2495 orig = caps; 2496 2497 /* On some codecs beeper is an input pin, but it is not recordable 2498 alone. Also most of BIOSes does not declare beeper pin. 2499 Change beeper pin node type to beeper to help parser. */ 2500 *waspin = 0; 2501 switch (id) { 2502 case HDA_CODEC_AD1988: 2503 case HDA_CODEC_AD1988B: 2504 beeper = 26; 2505 break; 2506 case HDA_CODEC_ALC260: 2507 beeper = 23; 2508 break; 2509 case HDA_CODEC_ALC262: 2510 case HDA_CODEC_ALC268: 2511 case HDA_CODEC_ALC880: 2512 case HDA_CODEC_ALC882: 2513 case HDA_CODEC_ALC883: 2514 case HDA_CODEC_ALC885: 2515 case HDA_CODEC_ALC888: 2516 case HDA_CODEC_ALC889: 2517 beeper = 29; 2518 break; 2519 } 2520 if (nid == beeper) { 2521 caps &= ~HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_MASK; 2522 caps |= HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_BEEP_WIDGET << 2523 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_SHIFT; 2524 *waspin = 1; 2525 } 2526 2527 HDA_BOOTVERBOSE( 2528 if (caps != orig) { 2529 device_printf(sc->dev, 2530 "Patching widget caps nid=%u 0x%08x -> 0x%08x\n", 2531 nid, orig, caps); 2532 } 2533 ); 2534 2535 return (caps); 2536 } 2537 2538 static void 2539 hdac_widget_parse(struct hdac_widget *w) 2540 { 2541 struct hdac_softc *sc = w->devinfo->codec->sc; 2542 uint32_t wcap, cap; 2543 char *typestr; 2544 nid_t cad = w->devinfo->codec->cad; 2545 nid_t nid = w->nid; 2546 2547 wcap = hdac_widget_getcaps(w, &w->waspin); 2548 2549 w->param.widget_cap = wcap; 2550 w->type = HDA_PARAM_AUDIO_WIDGET_CAP_TYPE(wcap); 2551 2552 switch (w->type) { 2553 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_OUTPUT: 2554 typestr = "audio output"; 2555 break; 2556 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT: 2557 typestr = "audio input"; 2558 break; 2559 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER: 2560 typestr = "audio mixer"; 2561 break; 2562 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR: 2563 typestr = "audio selector"; 2564 break; 2565 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX: 2566 typestr = "pin"; 2567 break; 2568 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_POWER_WIDGET: 2569 typestr = "power widget"; 2570 break; 2571 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_VOLUME_WIDGET: 2572 typestr = "volume widget"; 2573 break; 2574 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_BEEP_WIDGET: 2575 typestr = "beep widget"; 2576 break; 2577 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_VENDOR_WIDGET: 2578 typestr = "vendor widget"; 2579 break; 2580 default: 2581 typestr = "unknown type"; 2582 break; 2583 } 2584 2585 strlcpy(w->name, typestr, sizeof(w->name)); 2586 2587 hdac_widget_connection_parse(w); 2588 2589 if (HDA_PARAM_AUDIO_WIDGET_CAP_OUT_AMP(wcap)) { 2590 if (HDA_PARAM_AUDIO_WIDGET_CAP_AMP_OVR(wcap)) 2591 w->param.outamp_cap = 2592 hdac_command(sc, 2593 HDA_CMD_GET_PARAMETER(cad, nid, 2594 HDA_PARAM_OUTPUT_AMP_CAP), cad); 2595 else 2596 w->param.outamp_cap = 2597 w->devinfo->function.audio.outamp_cap; 2598 } else 2599 w->param.outamp_cap = 0; 2600 2601 if (HDA_PARAM_AUDIO_WIDGET_CAP_IN_AMP(wcap)) { 2602 if (HDA_PARAM_AUDIO_WIDGET_CAP_AMP_OVR(wcap)) 2603 w->param.inamp_cap = 2604 hdac_command(sc, 2605 HDA_CMD_GET_PARAMETER(cad, nid, 2606 HDA_PARAM_INPUT_AMP_CAP), cad); 2607 else 2608 w->param.inamp_cap = 2609 w->devinfo->function.audio.inamp_cap; 2610 } else 2611 w->param.inamp_cap = 0; 2612 2613 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_OUTPUT || 2614 w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT) { 2615 if (HDA_PARAM_AUDIO_WIDGET_CAP_FORMAT_OVR(wcap)) { 2616 cap = hdac_command(sc, 2617 HDA_CMD_GET_PARAMETER(cad, nid, 2618 HDA_PARAM_SUPP_STREAM_FORMATS), cad); 2619 w->param.supp_stream_formats = (cap != 0) ? cap : 2620 w->devinfo->function.audio.supp_stream_formats; 2621 cap = hdac_command(sc, 2622 HDA_CMD_GET_PARAMETER(cad, nid, 2623 HDA_PARAM_SUPP_PCM_SIZE_RATE), cad); 2624 w->param.supp_pcm_size_rate = (cap != 0) ? cap : 2625 w->devinfo->function.audio.supp_pcm_size_rate; 2626 } else { 2627 w->param.supp_stream_formats = 2628 w->devinfo->function.audio.supp_stream_formats; 2629 w->param.supp_pcm_size_rate = 2630 w->devinfo->function.audio.supp_pcm_size_rate; 2631 } 2632 } else { 2633 w->param.supp_stream_formats = 0; 2634 w->param.supp_pcm_size_rate = 0; 2635 } 2636 2637 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 2638 hdac_widget_pin_parse(w); 2639 } 2640 2641 static struct hdac_widget * 2642 hdac_widget_get(struct hdac_devinfo *devinfo, nid_t nid) 2643 { 2644 if (devinfo == NULL || devinfo->widget == NULL || 2645 nid < devinfo->startnode || nid >= devinfo->endnode) 2646 return (NULL); 2647 return (&devinfo->widget[nid - devinfo->startnode]); 2648 } 2649 2650 static __inline int 2651 hda_poll_channel(struct hdac_chan *ch) 2652 { 2653 uint32_t sz, delta; 2654 volatile uint32_t ptr; 2655 2656 if (!(ch->flags & HDAC_CHN_RUNNING)) 2657 return (0); 2658 2659 sz = ch->blksz * ch->blkcnt; 2660 if (ch->dmapos != NULL) 2661 ptr = *(ch->dmapos); 2662 else 2663 ptr = HDAC_READ_4(&ch->devinfo->codec->sc->mem, 2664 ch->off + HDAC_SDLPIB); 2665 ch->ptr = ptr; 2666 ptr %= sz; 2667 ptr &= ~(ch->blksz - 1); 2668 delta = (sz + ptr - ch->prevptr) % sz; 2669 2670 if (delta < ch->blksz) 2671 return (0); 2672 2673 ch->prevptr = ptr; 2674 2675 return (1); 2676 } 2677 2678 static void 2679 hda_poll_callback(void *arg) 2680 { 2681 struct hdac_softc *sc = arg; 2682 uint32_t trigger; 2683 int i, active = 0; 2684 2685 if (sc == NULL) 2686 return; 2687 2688 hdac_lock(sc); 2689 if (sc->polling == 0) { 2690 hdac_unlock(sc); 2691 return; 2692 } 2693 2694 trigger = 0; 2695 for (i = 0; i < sc->num_chans; i++) { 2696 if ((sc->chans[i].flags & HDAC_CHN_RUNNING) == 0) 2697 continue; 2698 active = 1; 2699 if (hda_poll_channel(&sc->chans[i])) 2700 trigger |= (1 << i); 2701 } 2702 2703 /* XXX */ 2704 if (active) 2705 callout_reset(&sc->poll_hda, sc->poll_ticks, 2706 hda_poll_callback, sc); 2707 2708 hdac_unlock(sc); 2709 2710 for (i = 0; i < sc->num_chans; i++) { 2711 if (trigger & (1 << i)) 2712 chn_intr(sc->chans[i].c); 2713 } 2714 } 2715 2716 static int 2717 hdac_rirb_flush(struct hdac_softc *sc) 2718 { 2719 struct hdac_rirb *rirb_base, *rirb; 2720 struct hdac_codec *codec; 2721 struct hdac_command_list *commands; 2722 nid_t cad; 2723 uint32_t resp; 2724 uint8_t rirbwp; 2725 int ret; 2726 2727 rirb_base = (struct hdac_rirb *)sc->rirb_dma.dma_vaddr; 2728 rirbwp = HDAC_READ_1(&sc->mem, HDAC_RIRBWP); 2729 #if 0 2730 bus_dmamap_sync(sc->rirb_dma.dma_tag, sc->rirb_dma.dma_map, 2731 BUS_DMASYNC_POSTREAD); 2732 #endif 2733 2734 ret = 0; 2735 2736 while (sc->rirb_rp != rirbwp) { 2737 sc->rirb_rp++; 2738 sc->rirb_rp %= sc->rirb_size; 2739 rirb = &rirb_base[sc->rirb_rp]; 2740 cad = HDAC_RIRB_RESPONSE_EX_SDATA_IN(rirb->response_ex); 2741 if (cad < 0 || cad >= HDAC_CODEC_MAX || 2742 sc->codecs[cad] == NULL) 2743 continue; 2744 resp = rirb->response; 2745 codec = sc->codecs[cad]; 2746 commands = codec->commands; 2747 if (rirb->response_ex & HDAC_RIRB_RESPONSE_EX_UNSOLICITED) { 2748 sc->unsolq[sc->unsolq_wp++] = (cad << 16) | 2749 ((resp >> 26) & 0xffff); 2750 sc->unsolq_wp %= HDAC_UNSOLQ_MAX; 2751 } else if (commands != NULL && commands->num_commands > 0 && 2752 codec->responses_received < commands->num_commands) 2753 commands->responses[codec->responses_received++] = 2754 resp; 2755 ret++; 2756 } 2757 2758 return (ret); 2759 } 2760 2761 static int 2762 hdac_unsolq_flush(struct hdac_softc *sc) 2763 { 2764 nid_t cad; 2765 uint32_t tag; 2766 int ret = 0; 2767 2768 if (sc->unsolq_st == HDAC_UNSOLQ_READY) { 2769 sc->unsolq_st = HDAC_UNSOLQ_BUSY; 2770 while (sc->unsolq_rp != sc->unsolq_wp) { 2771 cad = sc->unsolq[sc->unsolq_rp] >> 16; 2772 tag = sc->unsolq[sc->unsolq_rp++] & 0xffff; 2773 sc->unsolq_rp %= HDAC_UNSOLQ_MAX; 2774 hdac_unsolicited_handler(sc->codecs[cad], tag); 2775 ret++; 2776 } 2777 sc->unsolq_st = HDAC_UNSOLQ_READY; 2778 } 2779 2780 return (ret); 2781 } 2782 2783 static void 2784 hdac_poll_callback(void *arg) 2785 { 2786 struct hdac_softc *sc = arg; 2787 if (sc == NULL) 2788 return; 2789 2790 hdac_lock(sc); 2791 if (sc->polling == 0 || sc->poll_ival == 0) { 2792 hdac_unlock(sc); 2793 return; 2794 } 2795 if (hdac_rirb_flush(sc) != 0) 2796 hdac_unsolq_flush(sc); 2797 callout_reset(&sc->poll_hdac, sc->poll_ival, hdac_poll_callback, sc); 2798 hdac_unlock(sc); 2799 } 2800 2801 static void 2802 hdac_poll_reinit(struct hdac_softc *sc) 2803 { 2804 int i, pollticks, min = 1000000; 2805 struct hdac_chan *ch; 2806 2807 for (i = 0; i < sc->num_chans; i++) { 2808 if ((sc->chans[i].flags & HDAC_CHN_RUNNING) == 0) 2809 continue; 2810 ch = &sc->chans[i]; 2811 pollticks = ((uint64_t)hz * ch->blksz) / 2812 ((uint64_t)sndbuf_getbps(ch->b) * 2813 sndbuf_getspd(ch->b)); 2814 pollticks >>= 1; 2815 if (pollticks > hz) 2816 pollticks = hz; 2817 if (pollticks < 1) { 2818 HDA_BOOTVERBOSE( 2819 device_printf(sc->dev, 2820 "%s: pollticks=%d < 1 !\n", 2821 __func__, pollticks); 2822 ); 2823 pollticks = 1; 2824 } 2825 if (min > pollticks) 2826 min = pollticks; 2827 } 2828 HDA_BOOTVERBOSE( 2829 device_printf(sc->dev, 2830 "%s: pollticks %d -> %d\n", 2831 __func__, sc->poll_ticks, min); 2832 ); 2833 sc->poll_ticks = min; 2834 if (min == 1000000) 2835 callout_stop(&sc->poll_hda); 2836 else 2837 callout_reset(&sc->poll_hda, 1, hda_poll_callback, sc); 2838 } 2839 2840 static void 2841 hdac_stream_stop(struct hdac_chan *ch) 2842 { 2843 struct hdac_softc *sc = ch->devinfo->codec->sc; 2844 uint32_t ctl; 2845 2846 ctl = HDAC_READ_1(&sc->mem, ch->off + HDAC_SDCTL0); 2847 ctl &= ~(HDAC_SDCTL_IOCE | HDAC_SDCTL_FEIE | HDAC_SDCTL_DEIE | 2848 HDAC_SDCTL_RUN); 2849 HDAC_WRITE_1(&sc->mem, ch->off + HDAC_SDCTL0, ctl); 2850 2851 ch->flags &= ~HDAC_CHN_RUNNING; 2852 2853 if (sc->polling != 0) 2854 hdac_poll_reinit(sc); 2855 2856 ctl = HDAC_READ_4(&sc->mem, HDAC_INTCTL); 2857 ctl &= ~(1 << (ch->off >> 5)); 2858 HDAC_WRITE_4(&sc->mem, HDAC_INTCTL, ctl); 2859 } 2860 2861 static void 2862 hdac_stream_start(struct hdac_chan *ch) 2863 { 2864 struct hdac_softc *sc = ch->devinfo->codec->sc; 2865 uint32_t ctl; 2866 2867 ch->flags |= HDAC_CHN_RUNNING; 2868 2869 if (sc->polling != 0) 2870 hdac_poll_reinit(sc); 2871 2872 ctl = HDAC_READ_4(&sc->mem, HDAC_INTCTL); 2873 ctl |= 1 << (ch->off >> 5); 2874 HDAC_WRITE_4(&sc->mem, HDAC_INTCTL, ctl); 2875 2876 ctl = HDAC_READ_1(&sc->mem, ch->off + HDAC_SDCTL0); 2877 ctl |= HDAC_SDCTL_IOCE | HDAC_SDCTL_FEIE | HDAC_SDCTL_DEIE | 2878 HDAC_SDCTL_RUN; 2879 HDAC_WRITE_1(&sc->mem, ch->off + HDAC_SDCTL0, ctl); 2880 } 2881 2882 static void 2883 hdac_stream_reset(struct hdac_chan *ch) 2884 { 2885 struct hdac_softc *sc = ch->devinfo->codec->sc; 2886 int timeout = 1000; 2887 int to = timeout; 2888 uint32_t ctl; 2889 2890 ctl = HDAC_READ_1(&sc->mem, ch->off + HDAC_SDCTL0); 2891 ctl |= HDAC_SDCTL_SRST; 2892 HDAC_WRITE_1(&sc->mem, ch->off + HDAC_SDCTL0, ctl); 2893 do { 2894 ctl = HDAC_READ_1(&sc->mem, ch->off + HDAC_SDCTL0); 2895 if (ctl & HDAC_SDCTL_SRST) 2896 break; 2897 DELAY(10); 2898 } while (--to); 2899 if (!(ctl & HDAC_SDCTL_SRST)) { 2900 device_printf(sc->dev, "timeout in reset\n"); 2901 } 2902 ctl &= ~HDAC_SDCTL_SRST; 2903 HDAC_WRITE_1(&sc->mem, ch->off + HDAC_SDCTL0, ctl); 2904 to = timeout; 2905 do { 2906 ctl = HDAC_READ_1(&sc->mem, ch->off + HDAC_SDCTL0); 2907 if (!(ctl & HDAC_SDCTL_SRST)) 2908 break; 2909 DELAY(10); 2910 } while (--to); 2911 if (ctl & HDAC_SDCTL_SRST) 2912 device_printf(sc->dev, "can't reset!\n"); 2913 } 2914 2915 static void 2916 hdac_stream_setid(struct hdac_chan *ch) 2917 { 2918 struct hdac_softc *sc = ch->devinfo->codec->sc; 2919 uint32_t ctl; 2920 2921 ctl = HDAC_READ_1(&sc->mem, ch->off + HDAC_SDCTL2); 2922 ctl &= ~HDAC_SDCTL2_STRM_MASK; 2923 ctl |= ch->sid << HDAC_SDCTL2_STRM_SHIFT; 2924 HDAC_WRITE_1(&sc->mem, ch->off + HDAC_SDCTL2, ctl); 2925 } 2926 2927 static void 2928 hdac_bdl_setup(struct hdac_chan *ch) 2929 { 2930 struct hdac_softc *sc = ch->devinfo->codec->sc; 2931 struct hdac_bdle *bdle; 2932 uint64_t addr; 2933 uint32_t blksz, blkcnt; 2934 int i; 2935 2936 addr = (uint64_t)sndbuf_getbufaddr(ch->b); 2937 bdle = (struct hdac_bdle *)ch->bdl_dma.dma_vaddr; 2938 2939 blksz = ch->blksz; 2940 blkcnt = ch->blkcnt; 2941 2942 for (i = 0; i < blkcnt; i++, bdle++) { 2943 bdle->addrl = (uint32_t)addr; 2944 bdle->addrh = (uint32_t)(addr >> 32); 2945 bdle->len = blksz; 2946 bdle->ioc = 1; 2947 addr += blksz; 2948 } 2949 2950 HDAC_WRITE_4(&sc->mem, ch->off + HDAC_SDCBL, blksz * blkcnt); 2951 HDAC_WRITE_2(&sc->mem, ch->off + HDAC_SDLVI, blkcnt - 1); 2952 addr = ch->bdl_dma.dma_paddr; 2953 HDAC_WRITE_4(&sc->mem, ch->off + HDAC_SDBDPL, (uint32_t)addr); 2954 HDAC_WRITE_4(&sc->mem, ch->off + HDAC_SDBDPU, (uint32_t)(addr >> 32)); 2955 if (ch->dmapos != NULL && 2956 !(HDAC_READ_4(&sc->mem, HDAC_DPIBLBASE) & 0x00000001)) { 2957 addr = sc->pos_dma.dma_paddr; 2958 HDAC_WRITE_4(&sc->mem, HDAC_DPIBLBASE, 2959 ((uint32_t)addr & HDAC_DPLBASE_DPLBASE_MASK) | 0x00000001); 2960 HDAC_WRITE_4(&sc->mem, HDAC_DPIBUBASE, (uint32_t)(addr >> 32)); 2961 } 2962 } 2963 2964 static int 2965 hdac_bdl_alloc(struct hdac_chan *ch) 2966 { 2967 struct hdac_softc *sc = ch->devinfo->codec->sc; 2968 int rc; 2969 2970 rc = hdac_dma_alloc(sc, &ch->bdl_dma, 2971 sizeof(struct hdac_bdle) * HDA_BDL_MAX); 2972 if (rc) { 2973 device_printf(sc->dev, "can't alloc bdl\n"); 2974 return (rc); 2975 } 2976 2977 return (0); 2978 } 2979 2980 static void 2981 hdac_audio_ctl_amp_set_internal(struct hdac_softc *sc, nid_t cad, nid_t nid, 2982 int index, int lmute, int rmute, 2983 int left, int right, int dir) 2984 { 2985 uint16_t v = 0; 2986 2987 if (sc == NULL) 2988 return; 2989 2990 if (left != right || lmute != rmute) { 2991 v = (1 << (15 - dir)) | (1 << 13) | (index << 8) | 2992 (lmute << 7) | left; 2993 hdac_command(sc, 2994 HDA_CMD_SET_AMP_GAIN_MUTE(cad, nid, v), cad); 2995 v = (1 << (15 - dir)) | (1 << 12) | (index << 8) | 2996 (rmute << 7) | right; 2997 } else 2998 v = (1 << (15 - dir)) | (3 << 12) | (index << 8) | 2999 (lmute << 7) | left; 3000 3001 hdac_command(sc, 3002 HDA_CMD_SET_AMP_GAIN_MUTE(cad, nid, v), cad); 3003 } 3004 3005 static void 3006 hdac_audio_ctl_amp_set(struct hdac_audio_ctl *ctl, uint32_t mute, 3007 int left, int right) 3008 { 3009 struct hdac_softc *sc; 3010 nid_t nid, cad; 3011 int lmute, rmute; 3012 3013 sc = ctl->widget->devinfo->codec->sc; 3014 cad = ctl->widget->devinfo->codec->cad; 3015 nid = ctl->widget->nid; 3016 3017 /* Save new values if valid. */ 3018 if (mute != HDA_AMP_MUTE_DEFAULT) 3019 ctl->muted = mute; 3020 if (left != HDA_AMP_VOL_DEFAULT) 3021 ctl->left = left; 3022 if (right != HDA_AMP_VOL_DEFAULT) 3023 ctl->right = right; 3024 /* Prepare effective values */ 3025 if (ctl->forcemute) { 3026 lmute = 1; 3027 rmute = 1; 3028 left = 0; 3029 right = 0; 3030 } else { 3031 lmute = HDA_AMP_LEFT_MUTED(ctl->muted); 3032 rmute = HDA_AMP_RIGHT_MUTED(ctl->muted); 3033 left = ctl->left; 3034 right = ctl->right; 3035 } 3036 /* Apply effective values */ 3037 if (ctl->dir & HDA_CTL_OUT) 3038 hdac_audio_ctl_amp_set_internal(sc, cad, nid, ctl->index, 3039 lmute, rmute, left, right, 0); 3040 if (ctl->dir & HDA_CTL_IN) 3041 hdac_audio_ctl_amp_set_internal(sc, cad, nid, ctl->index, 3042 lmute, rmute, left, right, 1); 3043 } 3044 3045 static void 3046 hdac_widget_connection_select(struct hdac_widget *w, uint8_t index) 3047 { 3048 if (w == NULL || w->nconns < 1 || index > (w->nconns - 1)) 3049 return; 3050 hdac_command(w->devinfo->codec->sc, 3051 HDA_CMD_SET_CONNECTION_SELECT_CONTROL(w->devinfo->codec->cad, 3052 w->nid, index), w->devinfo->codec->cad); 3053 w->selconn = index; 3054 } 3055 3056 3057 /**************************************************************************** 3058 * uint32_t hdac_command_sendone_internal 3059 * 3060 * Wrapper function that sends only one command to a given codec 3061 ****************************************************************************/ 3062 static uint32_t 3063 hdac_command_sendone_internal(struct hdac_softc *sc, uint32_t verb, nid_t cad) 3064 { 3065 struct hdac_command_list cl; 3066 uint32_t response = HDAC_INVALID; 3067 3068 if (!hdac_lockowned(sc)) 3069 device_printf(sc->dev, "WARNING!!!! mtx not owned!!!!\n"); 3070 cl.num_commands = 1; 3071 cl.verbs = &verb; 3072 cl.responses = &response; 3073 3074 hdac_command_send_internal(sc, &cl, cad); 3075 3076 return (response); 3077 } 3078 3079 /**************************************************************************** 3080 * hdac_command_send_internal 3081 * 3082 * Send a command list to the codec via the corb. We queue as much verbs as 3083 * we can and msleep on the codec. When the interrupt get the responses 3084 * back from the rirb, it will wake us up so we can queue the remaining verbs 3085 * if any. 3086 ****************************************************************************/ 3087 static void 3088 hdac_command_send_internal(struct hdac_softc *sc, 3089 struct hdac_command_list *commands, nid_t cad) 3090 { 3091 struct hdac_codec *codec; 3092 int corbrp; 3093 uint32_t *corb; 3094 int timeout; 3095 int retry = 10; 3096 struct hdac_rirb *rirb_base; 3097 3098 if (sc == NULL || sc->codecs[cad] == NULL || commands == NULL || 3099 commands->num_commands < 1) 3100 return; 3101 3102 codec = sc->codecs[cad]; 3103 codec->commands = commands; 3104 codec->responses_received = 0; 3105 codec->verbs_sent = 0; 3106 corb = (uint32_t *)sc->corb_dma.dma_vaddr; 3107 rirb_base = (struct hdac_rirb *)sc->rirb_dma.dma_vaddr; 3108 3109 do { 3110 if (codec->verbs_sent != commands->num_commands) { 3111 /* Queue as many verbs as possible */ 3112 corbrp = HDAC_READ_2(&sc->mem, HDAC_CORBRP); 3113 #if 0 3114 bus_dmamap_sync(sc->corb_dma.dma_tag, 3115 sc->corb_dma.dma_map, BUS_DMASYNC_PREWRITE); 3116 #endif 3117 while (codec->verbs_sent != commands->num_commands && 3118 ((sc->corb_wp + 1) % sc->corb_size) != corbrp) { 3119 sc->corb_wp++; 3120 sc->corb_wp %= sc->corb_size; 3121 corb[sc->corb_wp] = 3122 commands->verbs[codec->verbs_sent++]; 3123 } 3124 3125 /* Send the verbs to the codecs */ 3126 #if 0 3127 bus_dmamap_sync(sc->corb_dma.dma_tag, 3128 sc->corb_dma.dma_map, BUS_DMASYNC_POSTWRITE); 3129 #endif 3130 HDAC_WRITE_2(&sc->mem, HDAC_CORBWP, sc->corb_wp); 3131 } 3132 3133 timeout = 1000; 3134 while (hdac_rirb_flush(sc) == 0 && --timeout) 3135 DELAY(10); 3136 } while ((codec->verbs_sent != commands->num_commands || 3137 codec->responses_received != commands->num_commands) && --retry); 3138 3139 if (retry == 0) 3140 device_printf(sc->dev, 3141 "%s: TIMEOUT numcmd=%d, sent=%d, received=%d\n", 3142 __func__, commands->num_commands, codec->verbs_sent, 3143 codec->responses_received); 3144 3145 codec->commands = NULL; 3146 codec->responses_received = 0; 3147 codec->verbs_sent = 0; 3148 3149 hdac_unsolq_flush(sc); 3150 } 3151 3152 3153 /**************************************************************************** 3154 * Device Methods 3155 ****************************************************************************/ 3156 3157 /**************************************************************************** 3158 * int hdac_probe(device_t) 3159 * 3160 * Probe for the presence of an hdac. If none is found, check for a generic 3161 * match using the subclass of the device. 3162 ****************************************************************************/ 3163 static int 3164 hdac_probe(device_t dev) 3165 { 3166 int i, result; 3167 uint32_t model; 3168 uint16_t class, subclass; 3169 char desc[64]; 3170 3171 model = (uint32_t)pci_get_device(dev) << 16; 3172 model |= (uint32_t)pci_get_vendor(dev) & 0x0000ffff; 3173 class = pci_get_class(dev); 3174 subclass = pci_get_subclass(dev); 3175 3176 bzero(desc, sizeof(desc)); 3177 result = ENXIO; 3178 for (i = 0; i < HDAC_DEVICES_LEN; i++) { 3179 if (hdac_devices[i].model == model) { 3180 strlcpy(desc, hdac_devices[i].desc, sizeof(desc)); 3181 result = BUS_PROBE_DEFAULT; 3182 break; 3183 } 3184 if (HDA_DEV_MATCH(hdac_devices[i].model, model) && 3185 class == PCIC_MULTIMEDIA && 3186 subclass == PCIS_MULTIMEDIA_HDA) { 3187 strlcpy(desc, hdac_devices[i].desc, sizeof(desc)); 3188 result = BUS_PROBE_GENERIC; 3189 break; 3190 } 3191 } 3192 if (result == ENXIO && class == PCIC_MULTIMEDIA && 3193 subclass == PCIS_MULTIMEDIA_HDA) { 3194 strlcpy(desc, "Generic", sizeof(desc)); 3195 result = BUS_PROBE_GENERIC; 3196 } 3197 if (result != ENXIO) { 3198 strlcat(desc, " High Definition Audio Controller", 3199 sizeof(desc)); 3200 device_set_desc_copy(dev, desc); 3201 } 3202 3203 return (result); 3204 } 3205 3206 static void * 3207 hdac_channel_init(kobj_t obj, void *data, struct snd_dbuf *b, 3208 struct pcm_channel *c, int dir) 3209 { 3210 struct hdac_pcm_devinfo *pdevinfo = data; 3211 struct hdac_devinfo *devinfo = pdevinfo->devinfo; 3212 struct hdac_softc *sc = devinfo->codec->sc; 3213 struct hdac_chan *ch; 3214 int i, ord = 0, chid; 3215 3216 hdac_lock(sc); 3217 3218 chid = (dir == PCMDIR_PLAY)?pdevinfo->play:pdevinfo->rec; 3219 ch = &sc->chans[chid]; 3220 for (i = 0; i < sc->num_chans && i < chid; i++) { 3221 if (ch->dir == sc->chans[i].dir) 3222 ord++; 3223 } 3224 if (dir == PCMDIR_PLAY) { 3225 ch->off = (sc->num_iss + ord) << 5; 3226 } else { 3227 ch->off = ord << 5; 3228 } 3229 3230 if (devinfo->function.audio.quirks & HDA_QUIRK_FIXEDRATE) { 3231 ch->caps.minspeed = ch->caps.maxspeed = 48000; 3232 ch->pcmrates[0] = 48000; 3233 ch->pcmrates[1] = 0; 3234 } 3235 if (sc->pos_dma.dma_vaddr != NULL) 3236 ch->dmapos = (uint32_t *)(sc->pos_dma.dma_vaddr + 3237 (sc->streamcnt * 8)); 3238 else 3239 ch->dmapos = NULL; 3240 ch->sid = ++sc->streamcnt; 3241 ch->dir = dir; 3242 ch->b = b; 3243 ch->c = c; 3244 ch->blksz = pdevinfo->chan_size / pdevinfo->chan_blkcnt; 3245 ch->blkcnt = pdevinfo->chan_blkcnt; 3246 hdac_unlock(sc); 3247 3248 if (hdac_bdl_alloc(ch) != 0) { 3249 ch->blkcnt = 0; 3250 return (NULL); 3251 } 3252 3253 if (sndbuf_alloc(ch->b, sc->chan_dmat, 3254 (sc->flags & HDAC_F_DMA_NOCACHE) ? BUS_DMA_NOCACHE : 0, 3255 pdevinfo->chan_size) != 0) 3256 return (NULL); 3257 3258 return (ch); 3259 } 3260 3261 static int 3262 hdac_channel_setformat(kobj_t obj, void *data, uint32_t format) 3263 { 3264 struct hdac_chan *ch = data; 3265 int i; 3266 3267 for (i = 0; ch->caps.fmtlist[i] != 0; i++) { 3268 if (format == ch->caps.fmtlist[i]) { 3269 ch->fmt = format; 3270 return (0); 3271 } 3272 } 3273 3274 return (EINVAL); 3275 } 3276 3277 static int 3278 hdac_channel_setspeed(kobj_t obj, void *data, uint32_t speed) 3279 { 3280 struct hdac_chan *ch = data; 3281 uint32_t spd = 0, threshold; 3282 int i; 3283 3284 for (i = 0; ch->pcmrates[i] != 0; i++) { 3285 spd = ch->pcmrates[i]; 3286 threshold = spd + ((ch->pcmrates[i + 1] != 0) ? 3287 ((ch->pcmrates[i + 1] - spd) >> 1) : 0); 3288 if (speed < threshold) 3289 break; 3290 } 3291 3292 if (spd == 0) /* impossible */ 3293 ch->spd = 48000; 3294 else 3295 ch->spd = spd; 3296 3297 return (ch->spd); 3298 } 3299 3300 static void 3301 hdac_stream_setup(struct hdac_chan *ch) 3302 { 3303 struct hdac_softc *sc = ch->devinfo->codec->sc; 3304 struct hdac_audio_as *as = &ch->devinfo->function.audio.as[ch->as]; 3305 struct hdac_widget *w; 3306 int i, chn, totalchn, c; 3307 nid_t cad = ch->devinfo->codec->cad; 3308 uint16_t fmt, dfmt; 3309 3310 HDA_BOOTHVERBOSE( 3311 device_printf(ch->pdevinfo->dev, 3312 "PCMDIR_%s: Stream setup fmt=%08x speed=%d\n", 3313 (ch->dir == PCMDIR_PLAY) ? "PLAY" : "REC", 3314 ch->fmt, ch->spd); 3315 ); 3316 fmt = 0; 3317 if (ch->fmt & AFMT_S16_LE) 3318 fmt |= ch->bit16 << 4; 3319 else if (ch->fmt & AFMT_S32_LE) 3320 fmt |= ch->bit32 << 4; 3321 else 3322 fmt |= 1 << 4; 3323 3324 for (i = 0; i < HDA_RATE_TAB_LEN; i++) { 3325 if (hda_rate_tab[i].valid && ch->spd == hda_rate_tab[i].rate) { 3326 fmt |= hda_rate_tab[i].base; 3327 fmt |= hda_rate_tab[i].mul; 3328 fmt |= hda_rate_tab[i].div; 3329 break; 3330 } 3331 } 3332 3333 if (ch->fmt & (AFMT_STEREO | AFMT_AC3)) { 3334 fmt |= 1; 3335 totalchn = 2; 3336 } else 3337 totalchn = 1; 3338 3339 HDAC_WRITE_2(&sc->mem, ch->off + HDAC_SDFMT, fmt); 3340 3341 dfmt = HDA_CMD_SET_DIGITAL_CONV_FMT1_DIGEN; 3342 if (ch->fmt & AFMT_AC3) 3343 dfmt |= HDA_CMD_SET_DIGITAL_CONV_FMT1_NAUDIO; 3344 3345 chn = 0; 3346 for (i = 0; ch->io[i] != -1; i++) { 3347 w = hdac_widget_get(ch->devinfo, ch->io[i]); 3348 if (w == NULL) 3349 continue; 3350 3351 if (as->hpredir >= 0 && i == as->pincnt) 3352 chn = 0; 3353 HDA_BOOTHVERBOSE( 3354 device_printf(ch->pdevinfo->dev, 3355 "PCMDIR_%s: Stream setup nid=%d: " 3356 "fmt=0x%04x, dfmt=0x%04x\n", 3357 (ch->dir == PCMDIR_PLAY) ? "PLAY" : "REC", 3358 ch->io[i], fmt, dfmt); 3359 ); 3360 hdac_command(sc, 3361 HDA_CMD_SET_CONV_FMT(cad, ch->io[i], fmt), cad); 3362 if (HDA_PARAM_AUDIO_WIDGET_CAP_DIGITAL(w->param.widget_cap)) { 3363 hdac_command(sc, 3364 HDA_CMD_SET_DIGITAL_CONV_FMT1(cad, ch->io[i], dfmt), 3365 cad); 3366 } 3367 /* If HP redirection is enabled, but failed to use same 3368 DAC make last DAC one to duplicate first one. */ 3369 if (as->hpredir >= 0 && i == as->pincnt) { 3370 c = (ch->sid << 4); 3371 } else if (chn >= totalchn) { 3372 /* This is until OSS will support multichannel. 3373 Should be: c = 0; to disable unused DAC */ 3374 c = (ch->sid << 4); 3375 }else { 3376 c = (ch->sid << 4) | chn; 3377 } 3378 hdac_command(sc, 3379 HDA_CMD_SET_CONV_STREAM_CHAN(cad, ch->io[i], c), cad); 3380 chn += 3381 HDA_PARAM_AUDIO_WIDGET_CAP_STEREO(w->param.widget_cap) ? 3382 2 : 1; 3383 } 3384 } 3385 3386 static int 3387 hdac_channel_setfragments(kobj_t obj, void *data, 3388 uint32_t blksz, uint32_t blkcnt) 3389 { 3390 struct hdac_chan *ch = data; 3391 struct hdac_softc *sc = ch->devinfo->codec->sc; 3392 3393 blksz &= HDA_BLK_ALIGN; 3394 3395 if (blksz > (sndbuf_getmaxsize(ch->b) / HDA_BDL_MIN)) 3396 blksz = sndbuf_getmaxsize(ch->b) / HDA_BDL_MIN; 3397 if (blksz < HDA_BLK_MIN) 3398 blksz = HDA_BLK_MIN; 3399 if (blkcnt > HDA_BDL_MAX) 3400 blkcnt = HDA_BDL_MAX; 3401 if (blkcnt < HDA_BDL_MIN) 3402 blkcnt = HDA_BDL_MIN; 3403 3404 while ((blksz * blkcnt) > sndbuf_getmaxsize(ch->b)) { 3405 if ((blkcnt >> 1) >= HDA_BDL_MIN) 3406 blkcnt >>= 1; 3407 else if ((blksz >> 1) >= HDA_BLK_MIN) 3408 blksz >>= 1; 3409 else 3410 break; 3411 } 3412 3413 if ((sndbuf_getblksz(ch->b) != blksz || 3414 sndbuf_getblkcnt(ch->b) != blkcnt) && 3415 sndbuf_resize(ch->b, blkcnt, blksz) != 0) 3416 device_printf(sc->dev, "%s: failed blksz=%u blkcnt=%u\n", 3417 __func__, blksz, blkcnt); 3418 3419 ch->blksz = sndbuf_getblksz(ch->b); 3420 ch->blkcnt = sndbuf_getblkcnt(ch->b); 3421 3422 return (1); 3423 } 3424 3425 static int 3426 hdac_channel_setblocksize(kobj_t obj, void *data, uint32_t blksz) 3427 { 3428 struct hdac_chan *ch = data; 3429 3430 hdac_channel_setfragments(obj, data, blksz, ch->pdevinfo->chan_blkcnt); 3431 3432 return (ch->blksz); 3433 } 3434 3435 static void 3436 hdac_channel_stop(struct hdac_softc *sc, struct hdac_chan *ch) 3437 { 3438 struct hdac_devinfo *devinfo = ch->devinfo; 3439 struct hdac_widget *w; 3440 nid_t cad = devinfo->codec->cad; 3441 int i; 3442 3443 hdac_stream_stop(ch); 3444 3445 for (i = 0; ch->io[i] != -1; i++) { 3446 w = hdac_widget_get(ch->devinfo, ch->io[i]); 3447 if (w == NULL) 3448 continue; 3449 if (HDA_PARAM_AUDIO_WIDGET_CAP_DIGITAL(w->param.widget_cap)) { 3450 hdac_command(sc, 3451 HDA_CMD_SET_DIGITAL_CONV_FMT1(cad, ch->io[i], 0), 3452 cad); 3453 } 3454 hdac_command(sc, 3455 HDA_CMD_SET_CONV_STREAM_CHAN(cad, ch->io[i], 3456 0), cad); 3457 } 3458 } 3459 3460 static void 3461 hdac_channel_start(struct hdac_softc *sc, struct hdac_chan *ch) 3462 { 3463 ch->ptr = 0; 3464 ch->prevptr = 0; 3465 hdac_stream_stop(ch); 3466 hdac_stream_reset(ch); 3467 hdac_bdl_setup(ch); 3468 hdac_stream_setid(ch); 3469 hdac_stream_setup(ch); 3470 hdac_stream_start(ch); 3471 } 3472 3473 static int 3474 hdac_channel_trigger(kobj_t obj, void *data, int go) 3475 { 3476 struct hdac_chan *ch = data; 3477 struct hdac_softc *sc = ch->devinfo->codec->sc; 3478 3479 if (!PCMTRIG_COMMON(go)) 3480 return (0); 3481 3482 hdac_lock(sc); 3483 switch (go) { 3484 case PCMTRIG_START: 3485 hdac_channel_start(sc, ch); 3486 break; 3487 case PCMTRIG_STOP: 3488 case PCMTRIG_ABORT: 3489 hdac_channel_stop(sc, ch); 3490 break; 3491 default: 3492 break; 3493 } 3494 hdac_unlock(sc); 3495 3496 return (0); 3497 } 3498 3499 static int 3500 hdac_channel_getptr(kobj_t obj, void *data) 3501 { 3502 struct hdac_chan *ch = data; 3503 struct hdac_softc *sc = ch->devinfo->codec->sc; 3504 uint32_t ptr; 3505 3506 hdac_lock(sc); 3507 if (sc->polling != 0) 3508 ptr = ch->ptr; 3509 else if (ch->dmapos != NULL) 3510 ptr = *(ch->dmapos); 3511 else 3512 ptr = HDAC_READ_4(&sc->mem, ch->off + HDAC_SDLPIB); 3513 hdac_unlock(sc); 3514 3515 /* 3516 * Round to available space and force 128 bytes aligment. 3517 */ 3518 ptr %= ch->blksz * ch->blkcnt; 3519 ptr &= HDA_BLK_ALIGN; 3520 3521 return (ptr); 3522 } 3523 3524 static struct pcmchan_caps * 3525 hdac_channel_getcaps(kobj_t obj, void *data) 3526 { 3527 return (&((struct hdac_chan *)data)->caps); 3528 } 3529 3530 static kobj_method_t hdac_channel_methods[] = { 3531 KOBJMETHOD(channel_init, hdac_channel_init), 3532 KOBJMETHOD(channel_setformat, hdac_channel_setformat), 3533 KOBJMETHOD(channel_setspeed, hdac_channel_setspeed), 3534 KOBJMETHOD(channel_setblocksize, hdac_channel_setblocksize), 3535 KOBJMETHOD(channel_setfragments, hdac_channel_setfragments), 3536 KOBJMETHOD(channel_trigger, hdac_channel_trigger), 3537 KOBJMETHOD(channel_getptr, hdac_channel_getptr), 3538 KOBJMETHOD(channel_getcaps, hdac_channel_getcaps), 3539 { 0, 0 } 3540 }; 3541 CHANNEL_DECLARE(hdac_channel); 3542 3543 static int 3544 hdac_audio_ctl_ossmixer_init(struct snd_mixer *m) 3545 { 3546 struct hdac_pcm_devinfo *pdevinfo = mix_getdevinfo(m); 3547 struct hdac_devinfo *devinfo = pdevinfo->devinfo; 3548 struct hdac_softc *sc = devinfo->codec->sc; 3549 struct hdac_widget *w, *cw; 3550 struct hdac_audio_ctl *ctl; 3551 uint32_t mask, recmask, id; 3552 int i, j, softpcmvol; 3553 3554 hdac_lock(sc); 3555 3556 /* Make sure that in case of soft volume it won't stay muted. */ 3557 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) { 3558 pdevinfo->left[i] = 100; 3559 pdevinfo->right[i] = 100; 3560 } 3561 3562 mask = 0; 3563 recmask = 0; 3564 id = hdac_codec_id(devinfo->codec); 3565 3566 /* Declate EAPD as ogain control. */ 3567 if (pdevinfo->play >= 0) { 3568 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 3569 w = hdac_widget_get(devinfo, i); 3570 if (w == NULL || w->enable == 0) 3571 continue; 3572 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX || 3573 w->param.eapdbtl == HDAC_INVALID || 3574 w->bindas != sc->chans[pdevinfo->play].as) 3575 continue; 3576 mask |= SOUND_MASK_OGAIN; 3577 break; 3578 } 3579 } 3580 3581 /* Declare volume controls assigned to this association. */ 3582 i = 0; 3583 ctl = NULL; 3584 while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) { 3585 if (ctl->enable == 0) 3586 continue; 3587 if ((pdevinfo->play >= 0 && 3588 ctl->widget->bindas == sc->chans[pdevinfo->play].as) || 3589 (pdevinfo->rec >= 0 && 3590 ctl->widget->bindas == sc->chans[pdevinfo->rec].as) || 3591 (ctl->widget->bindas == -2 && pdevinfo->index == 0)) 3592 mask |= ctl->ossmask; 3593 } 3594 3595 /* Declare record sources available to this association. */ 3596 if (pdevinfo->rec >= 0) { 3597 struct hdac_chan *ch = &sc->chans[pdevinfo->rec]; 3598 for (i = 0; ch->io[i] != -1; i++) { 3599 w = hdac_widget_get(devinfo, ch->io[i]); 3600 if (w == NULL || w->enable == 0) 3601 continue; 3602 for (j = 0; j < w->nconns; j++) { 3603 if (w->connsenable[j] == 0) 3604 continue; 3605 cw = hdac_widget_get(devinfo, w->conns[j]); 3606 if (cw == NULL || cw->enable == 0) 3607 continue; 3608 if (cw->bindas != sc->chans[pdevinfo->rec].as && 3609 cw->bindas != -2) 3610 continue; 3611 recmask |= cw->ossmask; 3612 } 3613 } 3614 } 3615 3616 /* Declare soft PCM volume if needed. */ 3617 if (pdevinfo->play >= 0 && !pdevinfo->digital) { 3618 ctl = NULL; 3619 if ((mask & SOUND_MASK_PCM) == 0 || 3620 (devinfo->function.audio.quirks & HDA_QUIRK_SOFTPCMVOL)) { 3621 softpcmvol = 1; 3622 mask |= SOUND_MASK_PCM; 3623 } else { 3624 softpcmvol = 0; 3625 i = 0; 3626 while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) { 3627 if (ctl->enable == 0) 3628 continue; 3629 if (ctl->widget->bindas != sc->chans[pdevinfo->play].as && 3630 (ctl->widget->bindas != -2 || pdevinfo->index != 0)) 3631 continue; 3632 if (!(ctl->ossmask & SOUND_MASK_PCM)) 3633 continue; 3634 if (ctl->step > 0) 3635 break; 3636 } 3637 } 3638 3639 if (softpcmvol == 1 || ctl == NULL) { 3640 pcm_setflags(pdevinfo->dev, pcm_getflags(pdevinfo->dev) | SD_F_SOFTPCMVOL); 3641 HDA_BOOTVERBOSE( 3642 device_printf(pdevinfo->dev, 3643 "%s Soft PCM volume\n", 3644 (softpcmvol == 1) ? "Forcing" : "Enabling"); 3645 ); 3646 } 3647 } 3648 3649 /* Declare master volume if needed. */ 3650 if (pdevinfo->play >= 0) { 3651 if ((mask & (SOUND_MASK_VOLUME | SOUND_MASK_PCM)) == 3652 SOUND_MASK_PCM) { 3653 mask |= SOUND_MASK_VOLUME; 3654 mix_setparentchild(m, SOUND_MIXER_VOLUME, 3655 SOUND_MASK_PCM); 3656 mix_setrealdev(m, SOUND_MIXER_VOLUME, 3657 SOUND_MIXER_NONE); 3658 HDA_BOOTVERBOSE( 3659 device_printf(pdevinfo->dev, 3660 "Forcing master volume with PCM\n"); 3661 ); 3662 } 3663 } 3664 3665 recmask &= (1 << SOUND_MIXER_NRDEVICES) - 1; 3666 mask &= (1 << SOUND_MIXER_NRDEVICES) - 1; 3667 3668 mix_setrecdevs(m, recmask); 3669 mix_setdevs(m, mask); 3670 3671 hdac_unlock(sc); 3672 3673 return (0); 3674 } 3675 3676 static int 3677 hdac_audio_ctl_ossmixer_set(struct snd_mixer *m, unsigned dev, 3678 unsigned left, unsigned right) 3679 { 3680 struct hdac_pcm_devinfo *pdevinfo = mix_getdevinfo(m); 3681 struct hdac_devinfo *devinfo = pdevinfo->devinfo; 3682 struct hdac_softc *sc = devinfo->codec->sc; 3683 struct hdac_widget *w; 3684 struct hdac_audio_ctl *ctl; 3685 uint32_t mute; 3686 int lvol, rvol; 3687 int i, j; 3688 3689 hdac_lock(sc); 3690 /* Save new values. */ 3691 pdevinfo->left[dev] = left; 3692 pdevinfo->right[dev] = right; 3693 3694 /* 'ogain' is the special case implemented with EAPD. */ 3695 if (dev == SOUND_MIXER_OGAIN) { 3696 uint32_t orig; 3697 w = NULL; 3698 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 3699 w = hdac_widget_get(devinfo, i); 3700 if (w == NULL || w->enable == 0) 3701 continue; 3702 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX || 3703 w->param.eapdbtl == HDAC_INVALID) 3704 continue; 3705 break; 3706 } 3707 if (i >= devinfo->endnode) { 3708 hdac_unlock(sc); 3709 return (-1); 3710 } 3711 orig = w->param.eapdbtl; 3712 if (left == 0) 3713 w->param.eapdbtl &= ~HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD; 3714 else 3715 w->param.eapdbtl |= HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD; 3716 if (orig != w->param.eapdbtl) { 3717 uint32_t val; 3718 3719 val = w->param.eapdbtl; 3720 if (devinfo->function.audio.quirks & HDA_QUIRK_EAPDINV) 3721 val ^= HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD; 3722 hdac_command(sc, 3723 HDA_CMD_SET_EAPD_BTL_ENABLE(devinfo->codec->cad, 3724 w->nid, val), devinfo->codec->cad); 3725 } 3726 hdac_unlock(sc); 3727 return (left | (left << 8)); 3728 } 3729 3730 /* Recalculate all controls related to this OSS device. */ 3731 i = 0; 3732 while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) { 3733 if (ctl->enable == 0 || 3734 !(ctl->ossmask & (1 << dev))) 3735 continue; 3736 if (!((pdevinfo->play >= 0 && 3737 ctl->widget->bindas == sc->chans[pdevinfo->play].as) || 3738 (pdevinfo->rec >= 0 && 3739 ctl->widget->bindas == sc->chans[pdevinfo->rec].as) || 3740 ctl->widget->bindas == -2)) 3741 continue; 3742 3743 lvol = 100; 3744 rvol = 100; 3745 for (j = 0; j < SOUND_MIXER_NRDEVICES; j++) { 3746 if (ctl->ossmask & (1 << j)) { 3747 lvol = lvol * pdevinfo->left[j] / 100; 3748 rvol = rvol * pdevinfo->right[j] / 100; 3749 } 3750 } 3751 mute = (left == 0) ? HDA_AMP_MUTE_LEFT : 0; 3752 mute |= (right == 0) ? HDA_AMP_MUTE_RIGHT : 0; 3753 lvol = (lvol * ctl->step + 50) / 100; 3754 rvol = (rvol * ctl->step + 50) / 100; 3755 hdac_audio_ctl_amp_set(ctl, mute, lvol, rvol); 3756 } 3757 hdac_unlock(sc); 3758 3759 return (left | (right << 8)); 3760 } 3761 3762 /* 3763 * Commutate specified record source. 3764 */ 3765 static uint32_t 3766 hdac_audio_ctl_recsel_comm(struct hdac_pcm_devinfo *pdevinfo, uint32_t src, nid_t nid, int depth) 3767 { 3768 struct hdac_devinfo *devinfo = pdevinfo->devinfo; 3769 struct hdac_widget *w, *cw; 3770 struct hdac_audio_ctl *ctl; 3771 char buf[64]; 3772 int i, muted; 3773 uint32_t res = 0; 3774 3775 if (depth > HDA_PARSE_MAXDEPTH) 3776 return (0); 3777 3778 w = hdac_widget_get(devinfo, nid); 3779 if (w == NULL || w->enable == 0) 3780 return (0); 3781 3782 for (i = 0; i < w->nconns; i++) { 3783 if (w->connsenable[i] == 0) 3784 continue; 3785 cw = hdac_widget_get(devinfo, w->conns[i]); 3786 if (cw == NULL || cw->enable == 0 || cw->bindas == -1) 3787 continue; 3788 /* Call recursively to trace signal to it's source if needed. */ 3789 if ((src & cw->ossmask) != 0) { 3790 if (cw->ossdev < 0) { 3791 res |= hdac_audio_ctl_recsel_comm(pdevinfo, src, 3792 w->conns[i], depth + 1); 3793 } else { 3794 res |= cw->ossmask; 3795 } 3796 } 3797 /* We have two special cases: mixers and others (selectors). */ 3798 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER) { 3799 ctl = hdac_audio_ctl_amp_get(devinfo, 3800 w->nid, HDA_CTL_IN, i, 1); 3801 if (ctl == NULL) 3802 continue; 3803 /* If we have input control on this node mute them 3804 * according to requested sources. */ 3805 muted = (src & cw->ossmask) ? 0 : 1; 3806 if (muted != ctl->forcemute) { 3807 ctl->forcemute = muted; 3808 hdac_audio_ctl_amp_set(ctl, 3809 HDA_AMP_MUTE_DEFAULT, 3810 HDA_AMP_VOL_DEFAULT, HDA_AMP_VOL_DEFAULT); 3811 } 3812 HDA_BOOTHVERBOSE( 3813 device_printf(pdevinfo->dev, 3814 "Recsel (%s): nid %d source %d %s\n", 3815 hdac_audio_ctl_ossmixer_mask2allname( 3816 src, buf, sizeof(buf)), 3817 nid, i, muted?"mute":"unmute"); 3818 ); 3819 } else { 3820 if (w->nconns == 1) 3821 break; 3822 if ((src & cw->ossmask) == 0) 3823 continue; 3824 /* If we found requested source - select it and exit. */ 3825 hdac_widget_connection_select(w, i); 3826 HDA_BOOTHVERBOSE( 3827 device_printf(pdevinfo->dev, 3828 "Recsel (%s): nid %d source %d select\n", 3829 hdac_audio_ctl_ossmixer_mask2allname( 3830 src, buf, sizeof(buf)), 3831 nid, i); 3832 ); 3833 break; 3834 } 3835 } 3836 return (res); 3837 } 3838 3839 static uint32_t 3840 hdac_audio_ctl_ossmixer_setrecsrc(struct snd_mixer *m, uint32_t src) 3841 { 3842 struct hdac_pcm_devinfo *pdevinfo = mix_getdevinfo(m); 3843 struct hdac_devinfo *devinfo = pdevinfo->devinfo; 3844 struct hdac_widget *w; 3845 struct hdac_softc *sc = devinfo->codec->sc; 3846 struct hdac_chan *ch; 3847 int i; 3848 uint32_t ret = 0xffffffff; 3849 3850 hdac_lock(sc); 3851 3852 /* Commutate requested recsrc for each ADC. */ 3853 ch = &sc->chans[pdevinfo->rec]; 3854 for (i = 0; ch->io[i] != -1; i++) { 3855 w = hdac_widget_get(devinfo, ch->io[i]); 3856 if (w == NULL || w->enable == 0) 3857 continue; 3858 ret &= hdac_audio_ctl_recsel_comm(pdevinfo, src, ch->io[i], 0); 3859 } 3860 3861 hdac_unlock(sc); 3862 3863 return ((ret == 0xffffffff)? 0 : ret); 3864 } 3865 3866 static kobj_method_t hdac_audio_ctl_ossmixer_methods[] = { 3867 KOBJMETHOD(mixer_init, hdac_audio_ctl_ossmixer_init), 3868 KOBJMETHOD(mixer_set, hdac_audio_ctl_ossmixer_set), 3869 KOBJMETHOD(mixer_setrecsrc, hdac_audio_ctl_ossmixer_setrecsrc), 3870 { 0, 0 } 3871 }; 3872 MIXER_DECLARE(hdac_audio_ctl_ossmixer); 3873 3874 static void 3875 hdac_unsolq_task(void *context, int pending) 3876 { 3877 struct hdac_softc *sc; 3878 3879 sc = (struct hdac_softc *)context; 3880 3881 hdac_lock(sc); 3882 hdac_unsolq_flush(sc); 3883 hdac_unlock(sc); 3884 } 3885 3886 /**************************************************************************** 3887 * int hdac_attach(device_t) 3888 * 3889 * Attach the device into the kernel. Interrupts usually won't be enabled 3890 * when this function is called. Setup everything that doesn't require 3891 * interrupts and defer probing of codecs until interrupts are enabled. 3892 ****************************************************************************/ 3893 static int 3894 hdac_attach(device_t dev) 3895 { 3896 struct hdac_softc *sc; 3897 int result; 3898 int i; 3899 uint16_t vendor; 3900 uint8_t v; 3901 3902 device_printf(dev, "HDA Driver Revision: %s\n", HDA_DRV_TEST_REV); 3903 3904 sc = device_get_softc(dev); 3905 sc->lock = snd_mtxcreate(device_get_nameunit(dev), HDAC_MTX_NAME); 3906 sc->dev = dev; 3907 sc->pci_subvendor = (uint32_t)pci_get_subdevice(sc->dev) << 16; 3908 sc->pci_subvendor |= (uint32_t)pci_get_subvendor(sc->dev) & 0x0000ffff; 3909 vendor = pci_get_vendor(dev); 3910 3911 if (sc->pci_subvendor == HP_NX6325_SUBVENDORX) { 3912 /* Screw nx6325 - subdevice/subvendor swapped */ 3913 sc->pci_subvendor = HP_NX6325_SUBVENDOR; 3914 } 3915 3916 callout_init(&sc->poll_hda, CALLOUT_MPSAFE); 3917 callout_init(&sc->poll_hdac, CALLOUT_MPSAFE); 3918 callout_init(&sc->poll_jack, CALLOUT_MPSAFE); 3919 3920 TASK_INIT(&sc->unsolq_task, 0, hdac_unsolq_task, sc); 3921 3922 sc->poll_ticks = 1000000; 3923 sc->poll_ival = HDAC_POLL_INTERVAL; 3924 if (resource_int_value(device_get_name(dev), 3925 device_get_unit(dev), "polling", &i) == 0 && i != 0) 3926 sc->polling = 1; 3927 else 3928 sc->polling = 0; 3929 3930 result = bus_dma_tag_create(NULL, /* parent */ 3931 HDAC_DMA_ALIGNMENT, /* alignment */ 3932 0, /* boundary */ 3933 BUS_SPACE_MAXADDR_32BIT, /* lowaddr */ 3934 BUS_SPACE_MAXADDR, /* highaddr */ 3935 NULL, /* filtfunc */ 3936 NULL, /* fistfuncarg */ 3937 HDA_BUFSZ_MAX, /* maxsize */ 3938 1, /* nsegments */ 3939 HDA_BUFSZ_MAX, /* maxsegsz */ 3940 0, /* flags */ 3941 NULL, /* lockfunc */ 3942 NULL, /* lockfuncarg */ 3943 &sc->chan_dmat); /* dmat */ 3944 if (result != 0) { 3945 device_printf(dev, "%s: bus_dma_tag_create failed (%x)\n", 3946 __func__, result); 3947 snd_mtxfree(sc->lock); 3948 free(sc, M_DEVBUF); 3949 return (ENXIO); 3950 } 3951 3952 3953 sc->hdabus = NULL; 3954 for (i = 0; i < HDAC_CODEC_MAX; i++) 3955 sc->codecs[i] = NULL; 3956 3957 pci_enable_busmaster(dev); 3958 3959 if (vendor == INTEL_VENDORID) { 3960 /* TCSEL -> TC0 */ 3961 v = pci_read_config(dev, 0x44, 1); 3962 pci_write_config(dev, 0x44, v & 0xf8, 1); 3963 HDA_BOOTHVERBOSE( 3964 device_printf(dev, "TCSEL: 0x%02d -> 0x%02d\n", v, 3965 pci_read_config(dev, 0x44, 1)); 3966 ); 3967 } 3968 3969 #ifdef HDAC_MSI_ENABLED 3970 if (resource_int_value(device_get_name(dev), 3971 device_get_unit(dev), "msi", &i) == 0 && i != 0 && 3972 pci_msi_count(dev) == 1) 3973 sc->flags |= HDAC_F_MSI; 3974 else 3975 #endif 3976 sc->flags &= ~HDAC_F_MSI; 3977 3978 #if defined(__i386__) || defined(__amd64__) 3979 sc->flags |= HDAC_F_DMA_NOCACHE; 3980 3981 if (resource_int_value(device_get_name(dev), 3982 device_get_unit(dev), "snoop", &i) == 0 && i != 0) { 3983 #else 3984 sc->flags &= ~HDAC_F_DMA_NOCACHE; 3985 #endif 3986 /* 3987 * Try to enable PCIe snoop to avoid messing around with 3988 * uncacheable DMA attribute. Since PCIe snoop register 3989 * config is pretty much vendor specific, there are no 3990 * general solutions on how to enable it, forcing us (even 3991 * Microsoft) to enable uncacheable or write combined DMA 3992 * by default. 3993 * 3994 * http://msdn2.microsoft.com/en-us/library/ms790324.aspx 3995 */ 3996 for (i = 0; i < HDAC_PCIESNOOP_LEN; i++) { 3997 if (hdac_pcie_snoop[i].vendor != vendor) 3998 continue; 3999 sc->flags &= ~HDAC_F_DMA_NOCACHE; 4000 if (hdac_pcie_snoop[i].reg == 0x00) 4001 break; 4002 v = pci_read_config(dev, hdac_pcie_snoop[i].reg, 1); 4003 if ((v & hdac_pcie_snoop[i].enable) == 4004 hdac_pcie_snoop[i].enable) 4005 break; 4006 v &= hdac_pcie_snoop[i].mask; 4007 v |= hdac_pcie_snoop[i].enable; 4008 pci_write_config(dev, hdac_pcie_snoop[i].reg, v, 1); 4009 v = pci_read_config(dev, hdac_pcie_snoop[i].reg, 1); 4010 if ((v & hdac_pcie_snoop[i].enable) != 4011 hdac_pcie_snoop[i].enable) { 4012 HDA_BOOTVERBOSE( 4013 device_printf(dev, 4014 "WARNING: Failed to enable PCIe " 4015 "snoop!\n"); 4016 ); 4017 #if defined(__i386__) || defined(__amd64__) 4018 sc->flags |= HDAC_F_DMA_NOCACHE; 4019 #endif 4020 } 4021 break; 4022 } 4023 #if defined(__i386__) || defined(__amd64__) 4024 } 4025 #endif 4026 4027 HDA_BOOTHVERBOSE( 4028 device_printf(dev, "DMA Coherency: %s / vendor=0x%04x\n", 4029 (sc->flags & HDAC_F_DMA_NOCACHE) ? 4030 "Uncacheable" : "PCIe snoop", vendor); 4031 ); 4032 4033 /* Allocate resources */ 4034 result = hdac_mem_alloc(sc); 4035 if (result != 0) 4036 goto hdac_attach_fail; 4037 result = hdac_irq_alloc(sc); 4038 if (result != 0) 4039 goto hdac_attach_fail; 4040 4041 /* Get Capabilities */ 4042 result = hdac_get_capabilities(sc); 4043 if (result != 0) 4044 goto hdac_attach_fail; 4045 4046 /* Allocate CORB and RIRB dma memory */ 4047 result = hdac_dma_alloc(sc, &sc->corb_dma, 4048 sc->corb_size * sizeof(uint32_t)); 4049 if (result != 0) 4050 goto hdac_attach_fail; 4051 result = hdac_dma_alloc(sc, &sc->rirb_dma, 4052 sc->rirb_size * sizeof(struct hdac_rirb)); 4053 if (result != 0) 4054 goto hdac_attach_fail; 4055 4056 /* Quiesce everything */ 4057 HDA_BOOTHVERBOSE( 4058 device_printf(dev, "Reset controller...\n"); 4059 ); 4060 hdac_reset(sc, 1); 4061 4062 /* Initialize the CORB and RIRB */ 4063 hdac_corb_init(sc); 4064 hdac_rirb_init(sc); 4065 4066 /* Defer remaining of initialization until interrupts are enabled */ 4067 sc->intrhook.ich_func = hdac_attach2; 4068 sc->intrhook.ich_arg = (void *)sc; 4069 if (cold == 0 || config_intrhook_establish(&sc->intrhook) != 0) { 4070 sc->intrhook.ich_func = NULL; 4071 hdac_attach2((void *)sc); 4072 } 4073 4074 return (0); 4075 4076 hdac_attach_fail: 4077 hdac_irq_free(sc); 4078 hdac_dma_free(sc, &sc->rirb_dma); 4079 hdac_dma_free(sc, &sc->corb_dma); 4080 hdac_mem_free(sc); 4081 snd_mtxfree(sc->lock); 4082 free(sc, M_DEVBUF); 4083 4084 return (ENXIO); 4085 } 4086 4087 static void 4088 hdac_audio_parse(struct hdac_devinfo *devinfo) 4089 { 4090 struct hdac_codec *codec = devinfo->codec; 4091 struct hdac_softc *sc = codec->sc; 4092 struct hdac_widget *w; 4093 uint32_t res; 4094 int i; 4095 nid_t cad, nid; 4096 4097 cad = devinfo->codec->cad; 4098 nid = devinfo->nid; 4099 4100 res = hdac_command(sc, 4101 HDA_CMD_GET_PARAMETER(cad , nid, HDA_PARAM_GPIO_COUNT), cad); 4102 devinfo->function.audio.gpio = res; 4103 4104 HDA_BOOTVERBOSE( 4105 device_printf(sc->dev, "GPIO: 0x%08x " 4106 "NumGPIO=%d NumGPO=%d " 4107 "NumGPI=%d GPIWake=%d GPIUnsol=%d\n", 4108 devinfo->function.audio.gpio, 4109 HDA_PARAM_GPIO_COUNT_NUM_GPIO(devinfo->function.audio.gpio), 4110 HDA_PARAM_GPIO_COUNT_NUM_GPO(devinfo->function.audio.gpio), 4111 HDA_PARAM_GPIO_COUNT_NUM_GPI(devinfo->function.audio.gpio), 4112 HDA_PARAM_GPIO_COUNT_GPI_WAKE(devinfo->function.audio.gpio), 4113 HDA_PARAM_GPIO_COUNT_GPI_UNSOL(devinfo->function.audio.gpio)); 4114 ); 4115 4116 res = hdac_command(sc, 4117 HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_SUPP_STREAM_FORMATS), 4118 cad); 4119 devinfo->function.audio.supp_stream_formats = res; 4120 4121 res = hdac_command(sc, 4122 HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_SUPP_PCM_SIZE_RATE), 4123 cad); 4124 devinfo->function.audio.supp_pcm_size_rate = res; 4125 4126 res = hdac_command(sc, 4127 HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_OUTPUT_AMP_CAP), 4128 cad); 4129 devinfo->function.audio.outamp_cap = res; 4130 4131 res = hdac_command(sc, 4132 HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_INPUT_AMP_CAP), 4133 cad); 4134 devinfo->function.audio.inamp_cap = res; 4135 4136 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 4137 w = hdac_widget_get(devinfo, i); 4138 if (w == NULL) 4139 device_printf(sc->dev, "Ghost widget! nid=%d!\n", i); 4140 else { 4141 w->devinfo = devinfo; 4142 w->nid = i; 4143 w->enable = 1; 4144 w->selconn = -1; 4145 w->pflags = 0; 4146 w->ossdev = -1; 4147 w->bindas = -1; 4148 w->param.eapdbtl = HDAC_INVALID; 4149 hdac_widget_parse(w); 4150 } 4151 } 4152 } 4153 4154 static void 4155 hdac_audio_ctl_parse(struct hdac_devinfo *devinfo) 4156 { 4157 struct hdac_softc *sc = devinfo->codec->sc; 4158 struct hdac_audio_ctl *ctls; 4159 struct hdac_widget *w, *cw; 4160 int i, j, cnt, max, ocap, icap; 4161 int mute, offset, step, size; 4162 4163 /* XXX This is redundant */ 4164 max = 0; 4165 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 4166 w = hdac_widget_get(devinfo, i); 4167 if (w == NULL || w->enable == 0) 4168 continue; 4169 if (w->param.outamp_cap != 0) 4170 max++; 4171 if (w->param.inamp_cap != 0) { 4172 switch (w->type) { 4173 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR: 4174 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER: 4175 for (j = 0; j < w->nconns; j++) { 4176 cw = hdac_widget_get(devinfo, 4177 w->conns[j]); 4178 if (cw == NULL || cw->enable == 0) 4179 continue; 4180 max++; 4181 } 4182 break; 4183 default: 4184 max++; 4185 break; 4186 } 4187 } 4188 } 4189 4190 devinfo->function.audio.ctlcnt = max; 4191 4192 if (max < 1) 4193 return; 4194 4195 ctls = (struct hdac_audio_ctl *)malloc( 4196 sizeof(*ctls) * max, M_HDAC, M_ZERO | M_NOWAIT); 4197 4198 if (ctls == NULL) { 4199 /* Blekh! */ 4200 device_printf(sc->dev, "unable to allocate ctls!\n"); 4201 devinfo->function.audio.ctlcnt = 0; 4202 return; 4203 } 4204 4205 cnt = 0; 4206 for (i = devinfo->startnode; cnt < max && i < devinfo->endnode; i++) { 4207 if (cnt >= max) { 4208 device_printf(sc->dev, "%s: Ctl overflow!\n", 4209 __func__); 4210 break; 4211 } 4212 w = hdac_widget_get(devinfo, i); 4213 if (w == NULL || w->enable == 0) 4214 continue; 4215 ocap = w->param.outamp_cap; 4216 icap = w->param.inamp_cap; 4217 if (ocap != 0) { 4218 mute = HDA_PARAM_OUTPUT_AMP_CAP_MUTE_CAP(ocap); 4219 step = HDA_PARAM_OUTPUT_AMP_CAP_NUMSTEPS(ocap); 4220 size = HDA_PARAM_OUTPUT_AMP_CAP_STEPSIZE(ocap); 4221 offset = HDA_PARAM_OUTPUT_AMP_CAP_OFFSET(ocap); 4222 /*if (offset > step) { 4223 HDA_BOOTVERBOSE( 4224 device_printf(sc->dev, 4225 "BUGGY outamp: nid=%d " 4226 "[offset=%d > step=%d]\n", 4227 w->nid, offset, step); 4228 ); 4229 offset = step; 4230 }*/ 4231 ctls[cnt].enable = 1; 4232 ctls[cnt].widget = w; 4233 ctls[cnt].mute = mute; 4234 ctls[cnt].step = step; 4235 ctls[cnt].size = size; 4236 ctls[cnt].offset = offset; 4237 ctls[cnt].left = offset; 4238 ctls[cnt].right = offset; 4239 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX || 4240 w->waspin) 4241 ctls[cnt].ndir = HDA_CTL_IN; 4242 else 4243 ctls[cnt].ndir = HDA_CTL_OUT; 4244 ctls[cnt++].dir = HDA_CTL_OUT; 4245 } 4246 4247 if (icap != 0) { 4248 mute = HDA_PARAM_OUTPUT_AMP_CAP_MUTE_CAP(icap); 4249 step = HDA_PARAM_OUTPUT_AMP_CAP_NUMSTEPS(icap); 4250 size = HDA_PARAM_OUTPUT_AMP_CAP_STEPSIZE(icap); 4251 offset = HDA_PARAM_OUTPUT_AMP_CAP_OFFSET(icap); 4252 /*if (offset > step) { 4253 HDA_BOOTVERBOSE( 4254 device_printf(sc->dev, 4255 "BUGGY inamp: nid=%d " 4256 "[offset=%d > step=%d]\n", 4257 w->nid, offset, step); 4258 ); 4259 offset = step; 4260 }*/ 4261 switch (w->type) { 4262 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR: 4263 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER: 4264 for (j = 0; j < w->nconns; j++) { 4265 if (cnt >= max) { 4266 device_printf(sc->dev, 4267 "%s: Ctl overflow!\n", 4268 __func__); 4269 break; 4270 } 4271 cw = hdac_widget_get(devinfo, 4272 w->conns[j]); 4273 if (cw == NULL || cw->enable == 0) 4274 continue; 4275 ctls[cnt].enable = 1; 4276 ctls[cnt].widget = w; 4277 ctls[cnt].childwidget = cw; 4278 ctls[cnt].index = j; 4279 ctls[cnt].mute = mute; 4280 ctls[cnt].step = step; 4281 ctls[cnt].size = size; 4282 ctls[cnt].offset = offset; 4283 ctls[cnt].left = offset; 4284 ctls[cnt].right = offset; 4285 ctls[cnt].ndir = HDA_CTL_IN; 4286 ctls[cnt++].dir = HDA_CTL_IN; 4287 } 4288 break; 4289 default: 4290 if (cnt >= max) { 4291 device_printf(sc->dev, 4292 "%s: Ctl overflow!\n", 4293 __func__); 4294 break; 4295 } 4296 ctls[cnt].enable = 1; 4297 ctls[cnt].widget = w; 4298 ctls[cnt].mute = mute; 4299 ctls[cnt].step = step; 4300 ctls[cnt].size = size; 4301 ctls[cnt].offset = offset; 4302 ctls[cnt].left = offset; 4303 ctls[cnt].right = offset; 4304 if (w->type == 4305 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 4306 ctls[cnt].ndir = HDA_CTL_OUT; 4307 else 4308 ctls[cnt].ndir = HDA_CTL_IN; 4309 ctls[cnt++].dir = HDA_CTL_IN; 4310 break; 4311 } 4312 } 4313 } 4314 4315 devinfo->function.audio.ctl = ctls; 4316 } 4317 4318 static void 4319 hdac_audio_as_parse(struct hdac_devinfo *devinfo) 4320 { 4321 struct hdac_softc *sc = devinfo->codec->sc; 4322 struct hdac_audio_as *as; 4323 struct hdac_widget *w; 4324 int i, j, cnt, max, type, dir, assoc, seq, first, hpredir; 4325 4326 /* Count present associations */ 4327 max = 0; 4328 for (j = 1; j < 16; j++) { 4329 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 4330 w = hdac_widget_get(devinfo, i); 4331 if (w == NULL || w->enable == 0) 4332 continue; 4333 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 4334 continue; 4335 if (HDA_CONFIG_DEFAULTCONF_ASSOCIATION(w->wclass.pin.config) 4336 != j) 4337 continue; 4338 max++; 4339 if (j != 15) /* There could be many 1-pin assocs #15 */ 4340 break; 4341 } 4342 } 4343 4344 devinfo->function.audio.ascnt = max; 4345 4346 if (max < 1) 4347 return; 4348 4349 as = (struct hdac_audio_as *)malloc( 4350 sizeof(*as) * max, M_HDAC, M_ZERO | M_NOWAIT); 4351 4352 if (as == NULL) { 4353 /* Blekh! */ 4354 device_printf(sc->dev, "unable to allocate assocs!\n"); 4355 devinfo->function.audio.ascnt = 0; 4356 return; 4357 } 4358 4359 for (i = 0; i < max; i++) { 4360 as[i].hpredir = -1; 4361 as[i].chan = -1; 4362 as[i].digital = 1; 4363 } 4364 4365 /* Scan associations skipping as=0. */ 4366 cnt = 0; 4367 for (j = 1; j < 16; j++) { 4368 first = 16; 4369 hpredir = 0; 4370 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 4371 w = hdac_widget_get(devinfo, i); 4372 if (w == NULL || w->enable == 0) 4373 continue; 4374 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 4375 continue; 4376 assoc = HDA_CONFIG_DEFAULTCONF_ASSOCIATION(w->wclass.pin.config); 4377 seq = HDA_CONFIG_DEFAULTCONF_SEQUENCE(w->wclass.pin.config); 4378 if (assoc != j) { 4379 continue; 4380 } 4381 KASSERT(cnt < max, 4382 ("%s: Associations owerflow (%d of %d)", 4383 __func__, cnt, max)); 4384 type = w->wclass.pin.config & 4385 HDA_CONFIG_DEFAULTCONF_DEVICE_MASK; 4386 /* Get pin direction. */ 4387 if (type == HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_OUT || 4388 type == HDA_CONFIG_DEFAULTCONF_DEVICE_SPEAKER || 4389 type == HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT || 4390 type == HDA_CONFIG_DEFAULTCONF_DEVICE_SPDIF_OUT || 4391 type == HDA_CONFIG_DEFAULTCONF_DEVICE_DIGITAL_OTHER_OUT) 4392 dir = HDA_CTL_OUT; 4393 else 4394 dir = HDA_CTL_IN; 4395 /* If this is a first pin - create new association. */ 4396 if (as[cnt].pincnt == 0) { 4397 as[cnt].enable = 1; 4398 as[cnt].index = j; 4399 as[cnt].dir = dir; 4400 } 4401 if (seq < first) 4402 first = seq; 4403 /* Check association correctness. */ 4404 if (as[cnt].pins[seq] != 0) { 4405 device_printf(sc->dev, "%s: Duplicate pin %d (%d) " 4406 "in association %d! Disabling association.\n", 4407 __func__, seq, w->nid, j); 4408 as[cnt].enable = 0; 4409 } 4410 if (dir != as[cnt].dir) { 4411 device_printf(sc->dev, "%s: Pin %d has wrong " 4412 "direction for association %d! Disabling " 4413 "association.\n", 4414 __func__, w->nid, j); 4415 as[cnt].enable = 0; 4416 } 4417 if (!HDA_PARAM_AUDIO_WIDGET_CAP_DIGITAL(w->param.widget_cap)) 4418 as[cnt].digital = 0; 4419 /* Headphones with seq=15 may mean redirection. */ 4420 if (type == HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT && 4421 seq == 15) 4422 hpredir = 1; 4423 as[cnt].pins[seq] = w->nid; 4424 as[cnt].pincnt++; 4425 /* Association 15 is a multiple unassociated pins. */ 4426 if (j == 15) 4427 cnt++; 4428 } 4429 if (j != 15 && as[cnt].pincnt > 0) { 4430 if (hpredir && as[cnt].pincnt > 1) 4431 as[cnt].hpredir = first; 4432 cnt++; 4433 } 4434 } 4435 HDA_BOOTVERBOSE( 4436 device_printf(sc->dev, 4437 "%d associations found:\n", max); 4438 for (i = 0; i < max; i++) { 4439 device_printf(sc->dev, 4440 "Association %d (%d) %s%s:\n", 4441 i, as[i].index, (as[i].dir == HDA_CTL_IN)?"in":"out", 4442 as[i].enable?"":" (disabled)"); 4443 for (j = 0; j < 16; j++) { 4444 if (as[i].pins[j] == 0) 4445 continue; 4446 device_printf(sc->dev, 4447 " Pin nid=%d seq=%d\n", 4448 as[i].pins[j], j); 4449 } 4450 } 4451 ); 4452 4453 devinfo->function.audio.as = as; 4454 } 4455 4456 static const struct { 4457 uint32_t model; 4458 uint32_t id; 4459 uint32_t set, unset; 4460 } hdac_quirks[] = { 4461 /* 4462 * XXX Force stereo quirk. Monoural recording / playback 4463 * on few codecs (especially ALC880) seems broken or 4464 * perhaps unsupported. 4465 */ 4466 { HDA_MATCH_ALL, HDA_MATCH_ALL, 4467 HDA_QUIRK_FORCESTEREO | HDA_QUIRK_IVREF, 0 }, 4468 { ACER_ALL_SUBVENDOR, HDA_MATCH_ALL, 4469 HDA_QUIRK_GPIO0, 0 }, 4470 { ASUS_G2K_SUBVENDOR, HDA_CODEC_ALC660, 4471 HDA_QUIRK_GPIO0, 0 }, 4472 { ASUS_M5200_SUBVENDOR, HDA_CODEC_ALC880, 4473 HDA_QUIRK_GPIO0, 0 }, 4474 { ASUS_A7M_SUBVENDOR, HDA_CODEC_ALC880, 4475 HDA_QUIRK_GPIO0, 0 }, 4476 { ASUS_A7T_SUBVENDOR, HDA_CODEC_ALC882, 4477 HDA_QUIRK_GPIO0, 0 }, 4478 { ASUS_W2J_SUBVENDOR, HDA_CODEC_ALC882, 4479 HDA_QUIRK_GPIO0, 0 }, 4480 { ASUS_U5F_SUBVENDOR, HDA_CODEC_AD1986A, 4481 HDA_QUIRK_EAPDINV, 0 }, 4482 { ASUS_A8X_SUBVENDOR, HDA_CODEC_AD1986A, 4483 HDA_QUIRK_EAPDINV, 0 }, 4484 { ASUS_F3JC_SUBVENDOR, HDA_CODEC_ALC861, 4485 HDA_QUIRK_OVREF, 0 }, 4486 { UNIWILL_9075_SUBVENDOR, HDA_CODEC_ALC861, 4487 HDA_QUIRK_OVREF, 0 }, 4488 /*{ ASUS_M2N_SUBVENDOR, HDA_CODEC_AD1988, 4489 HDA_QUIRK_IVREF80, HDA_QUIRK_IVREF50 | HDA_QUIRK_IVREF100 },*/ 4490 { MEDION_MD95257_SUBVENDOR, HDA_CODEC_ALC880, 4491 HDA_QUIRK_GPIO1, 0 }, 4492 { LENOVO_3KN100_SUBVENDOR, HDA_CODEC_AD1986A, 4493 HDA_QUIRK_EAPDINV | HDA_QUIRK_SENSEINV, 0 }, 4494 { SAMSUNG_Q1_SUBVENDOR, HDA_CODEC_AD1986A, 4495 HDA_QUIRK_EAPDINV, 0 }, 4496 { APPLE_MB3_SUBVENDOR, HDA_CODEC_ALC885, 4497 HDA_QUIRK_GPIO0 | HDA_QUIRK_OVREF50, 0}, 4498 { APPLE_INTEL_MAC, HDA_CODEC_STAC9221, 4499 HDA_QUIRK_GPIO0 | HDA_QUIRK_GPIO1, 0 }, 4500 { DELL_D630_SUBVENDOR, HDA_CODEC_STAC9205X, 4501 HDA_QUIRK_GPIO0, 0 }, 4502 { DELL_V1400_SUBVENDOR, HDA_CODEC_STAC9228X, 4503 HDA_QUIRK_GPIO2, 0 }, 4504 { DELL_V1500_SUBVENDOR, HDA_CODEC_STAC9205X, 4505 HDA_QUIRK_GPIO0, 0 }, 4506 { HDA_MATCH_ALL, HDA_CODEC_AD1988, 4507 HDA_QUIRK_IVREF80, HDA_QUIRK_IVREF50 | HDA_QUIRK_IVREF100 }, 4508 { HDA_MATCH_ALL, HDA_CODEC_AD1988B, 4509 HDA_QUIRK_IVREF80, HDA_QUIRK_IVREF50 | HDA_QUIRK_IVREF100 }, 4510 { HDA_MATCH_ALL, HDA_CODEC_CX20549, 4511 0, HDA_QUIRK_FORCESTEREO } 4512 }; 4513 #define HDAC_QUIRKS_LEN (sizeof(hdac_quirks) / sizeof(hdac_quirks[0])) 4514 4515 static void 4516 hdac_vendor_patch_parse(struct hdac_devinfo *devinfo) 4517 { 4518 struct hdac_widget *w; 4519 uint32_t id, subvendor; 4520 int i; 4521 4522 id = hdac_codec_id(devinfo->codec); 4523 subvendor = devinfo->codec->sc->pci_subvendor; 4524 4525 /* 4526 * Quirks 4527 */ 4528 for (i = 0; i < HDAC_QUIRKS_LEN; i++) { 4529 if (!(HDA_DEV_MATCH(hdac_quirks[i].model, subvendor) && 4530 HDA_DEV_MATCH(hdac_quirks[i].id, id))) 4531 continue; 4532 if (hdac_quirks[i].set != 0) 4533 devinfo->function.audio.quirks |= 4534 hdac_quirks[i].set; 4535 if (hdac_quirks[i].unset != 0) 4536 devinfo->function.audio.quirks &= 4537 ~(hdac_quirks[i].unset); 4538 } 4539 4540 switch (id) { 4541 case HDA_CODEC_ALC883: 4542 /* 4543 * nid: 24/25 = External (jack) or Internal (fixed) Mic. 4544 * Clear vref cap for jack connectivity. 4545 */ 4546 w = hdac_widget_get(devinfo, 24); 4547 if (w != NULL && w->enable != 0 && w->type == 4548 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX && 4549 (w->wclass.pin.config & 4550 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK) == 4551 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_JACK) 4552 w->wclass.pin.cap &= ~( 4553 HDA_PARAM_PIN_CAP_VREF_CTRL_100_MASK | 4554 HDA_PARAM_PIN_CAP_VREF_CTRL_80_MASK | 4555 HDA_PARAM_PIN_CAP_VREF_CTRL_50_MASK); 4556 w = hdac_widget_get(devinfo, 25); 4557 if (w != NULL && w->enable != 0 && w->type == 4558 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX && 4559 (w->wclass.pin.config & 4560 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK) == 4561 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_JACK) 4562 w->wclass.pin.cap &= ~( 4563 HDA_PARAM_PIN_CAP_VREF_CTRL_100_MASK | 4564 HDA_PARAM_PIN_CAP_VREF_CTRL_80_MASK | 4565 HDA_PARAM_PIN_CAP_VREF_CTRL_50_MASK); 4566 /* 4567 * nid: 26 = Line-in, leave it alone. 4568 */ 4569 break; 4570 case HDA_CODEC_AD1986A: 4571 /* 4572 * This codec has overcomplicated input mixing. 4573 * Make some cleaning there. 4574 */ 4575 /* Disable input mono mixer. Not needed and not supported. */ 4576 w = hdac_widget_get(devinfo, 43); 4577 if (w != NULL) 4578 w->enable = 0; 4579 /* Disable any with any input mixing mesh. Use separately. */ 4580 w = hdac_widget_get(devinfo, 39); 4581 if (w != NULL) 4582 w->enable = 0; 4583 w = hdac_widget_get(devinfo, 40); 4584 if (w != NULL) 4585 w->enable = 0; 4586 w = hdac_widget_get(devinfo, 41); 4587 if (w != NULL) 4588 w->enable = 0; 4589 w = hdac_widget_get(devinfo, 42); 4590 if (w != NULL) 4591 w->enable = 0; 4592 /* Disable duplicate mixer node connector. */ 4593 w = hdac_widget_get(devinfo, 15); 4594 if (w != NULL) 4595 w->connsenable[3] = 0; 4596 4597 if (subvendor == ASUS_A8X_SUBVENDOR) { 4598 /* 4599 * This is just plain ridiculous.. There 4600 * are several A8 series that share the same 4601 * pci id but works differently (EAPD). 4602 */ 4603 w = hdac_widget_get(devinfo, 26); 4604 if (w != NULL && w->type == 4605 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX && 4606 (w->wclass.pin.config & 4607 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK) != 4608 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_NONE) 4609 devinfo->function.audio.quirks &= 4610 ~HDA_QUIRK_EAPDINV; 4611 } 4612 break; 4613 case HDA_CODEC_AD1981HD: 4614 /* 4615 * This codec has very unusual design with several 4616 * points inappropriate for the present parser. 4617 */ 4618 /* Disable recording from mono playback mix. */ 4619 w = hdac_widget_get(devinfo, 21); 4620 if (w != NULL) 4621 w->connsenable[3] = 0; 4622 /* Disable rear to front mic mixer, use separately. */ 4623 w = hdac_widget_get(devinfo, 31); 4624 if (w != NULL) 4625 w->enable = 0; 4626 /* Disable playback mixer, use direct bypass. */ 4627 w = hdac_widget_get(devinfo, 14); 4628 if (w != NULL) 4629 w->enable = 0; 4630 break; 4631 } 4632 } 4633 4634 /* 4635 * Trace path from DAC to pin. 4636 */ 4637 static nid_t 4638 hdac_audio_trace_dac(struct hdac_devinfo *devinfo, int as, int seq, nid_t nid, 4639 int dupseq, int min, int only, int depth) 4640 { 4641 struct hdac_widget *w; 4642 int i, im = -1; 4643 nid_t m = 0, ret; 4644 4645 if (depth > HDA_PARSE_MAXDEPTH) 4646 return (0); 4647 w = hdac_widget_get(devinfo, nid); 4648 if (w == NULL || w->enable == 0) 4649 return (0); 4650 HDA_BOOTHVERBOSE( 4651 if (!only) { 4652 device_printf(devinfo->codec->sc->dev, 4653 " %*stracing via nid %d\n", 4654 depth + 1, "", w->nid); 4655 } 4656 ); 4657 /* Use only unused widgets */ 4658 if (w->bindas >= 0 && w->bindas != as) { 4659 HDA_BOOTHVERBOSE( 4660 if (!only) { 4661 device_printf(devinfo->codec->sc->dev, 4662 " %*snid %d busy by association %d\n", 4663 depth + 1, "", w->nid, w->bindas); 4664 } 4665 ); 4666 return (0); 4667 } 4668 if (dupseq < 0) { 4669 if (w->bindseqmask != 0) { 4670 HDA_BOOTHVERBOSE( 4671 if (!only) { 4672 device_printf(devinfo->codec->sc->dev, 4673 " %*snid %d busy by seqmask %x\n", 4674 depth + 1, "", w->nid, w->bindseqmask); 4675 } 4676 ); 4677 return (0); 4678 } 4679 } else { 4680 /* If this is headphones - allow duplicate first pin. */ 4681 if (w->bindseqmask != 0 && 4682 (w->bindseqmask & (1 << dupseq)) == 0) { 4683 HDA_BOOTHVERBOSE( 4684 device_printf(devinfo->codec->sc->dev, 4685 " %*snid %d busy by seqmask %x\n", 4686 depth + 1, "", w->nid, w->bindseqmask); 4687 ); 4688 return (0); 4689 } 4690 } 4691 4692 switch (w->type) { 4693 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT: 4694 /* Do not traverse input. AD1988 has digital monitor 4695 for which we are not ready. */ 4696 break; 4697 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_OUTPUT: 4698 /* If we are tracing HP take only dac of first pin. */ 4699 if ((only == 0 || only == w->nid) && 4700 (w->nid >= min) && (dupseq < 0 || w->nid == 4701 devinfo->function.audio.as[as].dacs[dupseq])) 4702 m = w->nid; 4703 break; 4704 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX: 4705 if (depth > 0) 4706 break; 4707 /* Fall */ 4708 default: 4709 /* Find reachable DACs with smallest nid respecting constraints. */ 4710 for (i = 0; i < w->nconns; i++) { 4711 if (w->connsenable[i] == 0) 4712 continue; 4713 if (w->selconn != -1 && w->selconn != i) 4714 continue; 4715 if ((ret = hdac_audio_trace_dac(devinfo, as, seq, 4716 w->conns[i], dupseq, min, only, depth + 1)) != 0) { 4717 if (m == 0 || ret < m) { 4718 m = ret; 4719 im = i; 4720 } 4721 if (only || dupseq >= 0) 4722 break; 4723 } 4724 } 4725 if (m && only && ((w->nconns > 1 && 4726 w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER) || 4727 w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR)) 4728 w->selconn = im; 4729 break; 4730 } 4731 if (m && only) { 4732 w->bindas = as; 4733 w->bindseqmask |= (1 << seq); 4734 } 4735 HDA_BOOTHVERBOSE( 4736 if (!only) { 4737 device_printf(devinfo->codec->sc->dev, 4738 " %*snid %d returned %d\n", 4739 depth + 1, "", w->nid, m); 4740 } 4741 ); 4742 return (m); 4743 } 4744 4745 /* 4746 * Trace path from widget to ADC. 4747 */ 4748 static nid_t 4749 hdac_audio_trace_adc(struct hdac_devinfo *devinfo, int as, int seq, nid_t nid, 4750 int only, int depth) 4751 { 4752 struct hdac_widget *w, *wc; 4753 int i, j; 4754 nid_t res = 0; 4755 4756 if (depth > HDA_PARSE_MAXDEPTH) 4757 return (0); 4758 w = hdac_widget_get(devinfo, nid); 4759 if (w == NULL || w->enable == 0) 4760 return (0); 4761 HDA_BOOTHVERBOSE( 4762 device_printf(devinfo->codec->sc->dev, 4763 " %*stracing via nid %d\n", 4764 depth + 1, "", w->nid); 4765 ); 4766 /* Use only unused widgets */ 4767 if (w->bindas >= 0 && w->bindas != as) { 4768 HDA_BOOTHVERBOSE( 4769 device_printf(devinfo->codec->sc->dev, 4770 " %*snid %d busy by association %d\n", 4771 depth + 1, "", w->nid, w->bindas); 4772 ); 4773 return (0); 4774 } 4775 4776 switch (w->type) { 4777 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT: 4778 /* If we are tracing HP take only dac of first pin. */ 4779 if (only == w->nid) 4780 res = 1; 4781 break; 4782 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX: 4783 if (depth > 0) 4784 break; 4785 /* Fall */ 4786 default: 4787 /* Try to find reachable ADCs with specified nid. */ 4788 for (j = devinfo->startnode; j < devinfo->endnode; j++) { 4789 wc = hdac_widget_get(devinfo, j); 4790 if (wc == NULL || wc->enable == 0) 4791 continue; 4792 for (i = 0; i < wc->nconns; i++) { 4793 if (wc->connsenable[i] == 0) 4794 continue; 4795 if (wc->conns[i] != nid) 4796 continue; 4797 if (hdac_audio_trace_adc(devinfo, as, seq, 4798 j, only, depth + 1) != 0) { 4799 res = 1; 4800 if (((wc->nconns > 1 && 4801 wc->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER) || 4802 wc->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR) && 4803 wc->selconn == -1) 4804 wc->selconn = i; 4805 } 4806 } 4807 } 4808 break; 4809 } 4810 if (res) { 4811 w->bindas = as; 4812 w->bindseqmask |= (1 << seq); 4813 } 4814 HDA_BOOTHVERBOSE( 4815 device_printf(devinfo->codec->sc->dev, 4816 " %*snid %d returned %d\n", 4817 depth + 1, "", w->nid, res); 4818 ); 4819 return (res); 4820 } 4821 4822 /* 4823 * Erase trace path of the specified association. 4824 */ 4825 static void 4826 hdac_audio_undo_trace(struct hdac_devinfo *devinfo, int as, int seq) 4827 { 4828 struct hdac_widget *w; 4829 int i; 4830 4831 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 4832 w = hdac_widget_get(devinfo, i); 4833 if (w == NULL || w->enable == 0) 4834 continue; 4835 if (w->bindas == as) { 4836 if (seq >= 0) { 4837 w->bindseqmask &= ~(1 << seq); 4838 if (w->bindseqmask == 0) { 4839 w->bindas = -1; 4840 w->selconn = -1; 4841 } 4842 } else { 4843 w->bindas = -1; 4844 w->bindseqmask = 0; 4845 w->selconn = -1; 4846 } 4847 } 4848 } 4849 } 4850 4851 /* 4852 * Trace association path from DAC to output 4853 */ 4854 static int 4855 hdac_audio_trace_as_out(struct hdac_devinfo *devinfo, int as, int seq) 4856 { 4857 struct hdac_audio_as *ases = devinfo->function.audio.as; 4858 int i, hpredir; 4859 nid_t min, res; 4860 4861 /* Find next pin */ 4862 for (i = seq; i < 16 && ases[as].pins[i] == 0; i++) 4863 ; 4864 /* Check if there is no any left. If so - we succeded. */ 4865 if (i == 16) 4866 return (1); 4867 4868 hpredir = (i == 15 && ases[as].fakeredir == 0)?ases[as].hpredir:-1; 4869 min = 0; 4870 res = 0; 4871 do { 4872 HDA_BOOTHVERBOSE( 4873 device_printf(devinfo->codec->sc->dev, 4874 " Tracing pin %d with min nid %d", 4875 ases[as].pins[i], min); 4876 if (hpredir >= 0) 4877 printf(" and hpredir %d", hpredir); 4878 printf("\n"); 4879 ); 4880 /* Trace this pin taking min nid into account. */ 4881 res = hdac_audio_trace_dac(devinfo, as, i, 4882 ases[as].pins[i], hpredir, min, 0, 0); 4883 if (res == 0) { 4884 /* If we failed - return to previous and redo it. */ 4885 HDA_BOOTVERBOSE( 4886 device_printf(devinfo->codec->sc->dev, 4887 " Unable to trace pin %d seq %d with min " 4888 "nid %d", 4889 ases[as].pins[i], i, min); 4890 if (hpredir >= 0) 4891 printf(" and hpredir %d", hpredir); 4892 printf("\n"); 4893 ); 4894 return (0); 4895 } 4896 HDA_BOOTVERBOSE( 4897 device_printf(devinfo->codec->sc->dev, 4898 " Pin %d traced to DAC %d", 4899 ases[as].pins[i], res); 4900 if (hpredir >= 0) 4901 printf(" and hpredir %d", hpredir); 4902 if (ases[as].fakeredir) 4903 printf(" with fake redirection"); 4904 printf("\n"); 4905 ); 4906 /* Trace again to mark the path */ 4907 hdac_audio_trace_dac(devinfo, as, i, 4908 ases[as].pins[i], hpredir, min, res, 0); 4909 ases[as].dacs[i] = res; 4910 /* We succeded, so call next. */ 4911 if (hdac_audio_trace_as_out(devinfo, as, i + 1)) 4912 return (1); 4913 /* If next failed, we should retry with next min */ 4914 hdac_audio_undo_trace(devinfo, as, i); 4915 ases[as].dacs[i] = 0; 4916 min = res + 1; 4917 } while (1); 4918 } 4919 4920 /* 4921 * Trace association path from input to ADC 4922 */ 4923 static int 4924 hdac_audio_trace_as_in(struct hdac_devinfo *devinfo, int as) 4925 { 4926 struct hdac_audio_as *ases = devinfo->function.audio.as; 4927 struct hdac_widget *w; 4928 int i, j, k; 4929 4930 for (j = devinfo->startnode; j < devinfo->endnode; j++) { 4931 w = hdac_widget_get(devinfo, j); 4932 if (w == NULL || w->enable == 0) 4933 continue; 4934 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT) 4935 continue; 4936 if (w->bindas >= 0 && w->bindas != as) 4937 continue; 4938 4939 /* Find next pin */ 4940 for (i = 0; i < 16; i++) { 4941 if (ases[as].pins[i] == 0) 4942 continue; 4943 4944 HDA_BOOTHVERBOSE( 4945 device_printf(devinfo->codec->sc->dev, 4946 " Tracing pin %d to ADC %d\n", 4947 ases[as].pins[i], j); 4948 ); 4949 /* Trace this pin taking goal into account. */ 4950 if (hdac_audio_trace_adc(devinfo, as, i, 4951 ases[as].pins[i], j, 0) == 0) { 4952 /* If we failed - return to previous and redo it. */ 4953 HDA_BOOTVERBOSE( 4954 device_printf(devinfo->codec->sc->dev, 4955 " Unable to trace pin %d to ADC %d, undo traces\n", 4956 ases[as].pins[i], j); 4957 ); 4958 hdac_audio_undo_trace(devinfo, as, -1); 4959 for (k = 0; k < 16; k++) 4960 ases[as].dacs[k] = 0; 4961 break; 4962 } 4963 HDA_BOOTVERBOSE( 4964 device_printf(devinfo->codec->sc->dev, 4965 " Pin %d traced to ADC %d\n", 4966 ases[as].pins[i], j); 4967 ); 4968 ases[as].dacs[i] = j; 4969 } 4970 if (i == 16) 4971 return (1); 4972 } 4973 return (0); 4974 } 4975 4976 /* 4977 * Trace input monitor path from mixer to output association. 4978 */ 4979 static int 4980 hdac_audio_trace_to_out(struct hdac_devinfo *devinfo, nid_t nid, int depth) 4981 { 4982 struct hdac_audio_as *ases = devinfo->function.audio.as; 4983 struct hdac_widget *w, *wc; 4984 int i, j; 4985 nid_t res = 0; 4986 4987 if (depth > HDA_PARSE_MAXDEPTH) 4988 return (0); 4989 w = hdac_widget_get(devinfo, nid); 4990 if (w == NULL || w->enable == 0) 4991 return (0); 4992 HDA_BOOTHVERBOSE( 4993 device_printf(devinfo->codec->sc->dev, 4994 " %*stracing via nid %d\n", 4995 depth + 1, "", w->nid); 4996 ); 4997 /* Use only unused widgets */ 4998 if (depth > 0 && w->bindas != -1) { 4999 if (w->bindas < 0 || ases[w->bindas].dir == HDA_CTL_OUT) { 5000 HDA_BOOTHVERBOSE( 5001 device_printf(devinfo->codec->sc->dev, 5002 " %*snid %d found output association %d\n", 5003 depth + 1, "", w->nid, w->bindas); 5004 ); 5005 return (1); 5006 } else { 5007 HDA_BOOTHVERBOSE( 5008 device_printf(devinfo->codec->sc->dev, 5009 " %*snid %d busy by input association %d\n", 5010 depth + 1, "", w->nid, w->bindas); 5011 ); 5012 return (0); 5013 } 5014 } 5015 5016 switch (w->type) { 5017 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT: 5018 /* Do not traverse input. AD1988 has digital monitor 5019 for which we are not ready. */ 5020 break; 5021 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX: 5022 if (depth > 0) 5023 break; 5024 /* Fall */ 5025 default: 5026 /* Try to find reachable ADCs with specified nid. */ 5027 for (j = devinfo->startnode; j < devinfo->endnode; j++) { 5028 wc = hdac_widget_get(devinfo, j); 5029 if (wc == NULL || wc->enable == 0) 5030 continue; 5031 for (i = 0; i < wc->nconns; i++) { 5032 if (wc->connsenable[i] == 0) 5033 continue; 5034 if (wc->conns[i] != nid) 5035 continue; 5036 if (hdac_audio_trace_to_out(devinfo, 5037 j, depth + 1) != 0) { 5038 res = 1; 5039 if (wc->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR && 5040 wc->selconn == -1) 5041 wc->selconn = i; 5042 } 5043 } 5044 } 5045 break; 5046 } 5047 if (res) 5048 w->bindas = -2; 5049 5050 HDA_BOOTHVERBOSE( 5051 device_printf(devinfo->codec->sc->dev, 5052 " %*snid %d returned %d\n", 5053 depth + 1, "", w->nid, res); 5054 ); 5055 return (res); 5056 } 5057 5058 /* 5059 * Trace extra associations (beeper, monitor) 5060 */ 5061 static void 5062 hdac_audio_trace_as_extra(struct hdac_devinfo *devinfo) 5063 { 5064 struct hdac_audio_as *as = devinfo->function.audio.as; 5065 struct hdac_widget *w; 5066 int j; 5067 5068 /* Input monitor */ 5069 /* Find mixer associated with input, but supplying signal 5070 for output associations. Hope it will be input monitor. */ 5071 HDA_BOOTVERBOSE( 5072 device_printf(devinfo->codec->sc->dev, 5073 "Tracing input monitor\n"); 5074 ); 5075 for (j = devinfo->startnode; j < devinfo->endnode; j++) { 5076 w = hdac_widget_get(devinfo, j); 5077 if (w == NULL || w->enable == 0) 5078 continue; 5079 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER) 5080 continue; 5081 if (w->bindas < 0 || as[w->bindas].dir != HDA_CTL_IN) 5082 continue; 5083 HDA_BOOTVERBOSE( 5084 device_printf(devinfo->codec->sc->dev, 5085 " Tracing nid %d to out\n", 5086 j); 5087 ); 5088 if (hdac_audio_trace_to_out(devinfo, w->nid, 0)) { 5089 HDA_BOOTVERBOSE( 5090 device_printf(devinfo->codec->sc->dev, 5091 " nid %d is input monitor\n", 5092 w->nid); 5093 ); 5094 w->pflags |= HDA_ADC_MONITOR; 5095 w->ossdev = SOUND_MIXER_IMIX; 5096 } 5097 } 5098 5099 /* Beeper */ 5100 HDA_BOOTVERBOSE( 5101 device_printf(devinfo->codec->sc->dev, 5102 "Tracing beeper\n"); 5103 ); 5104 for (j = devinfo->startnode; j < devinfo->endnode; j++) { 5105 w = hdac_widget_get(devinfo, j); 5106 if (w == NULL || w->enable == 0) 5107 continue; 5108 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_BEEP_WIDGET) 5109 continue; 5110 HDA_BOOTHVERBOSE( 5111 device_printf(devinfo->codec->sc->dev, 5112 " Tracing nid %d to out\n", 5113 j); 5114 ); 5115 if (hdac_audio_trace_to_out(devinfo, w->nid, 0)) { 5116 HDA_BOOTVERBOSE( 5117 device_printf(devinfo->codec->sc->dev, 5118 " nid %d traced to out\n", 5119 j); 5120 ); 5121 } 5122 w->bindas = -2; 5123 } 5124 } 5125 5126 /* 5127 * Bind assotiations to PCM channels 5128 */ 5129 static void 5130 hdac_audio_bind_as(struct hdac_devinfo *devinfo) 5131 { 5132 struct hdac_softc *sc = devinfo->codec->sc; 5133 struct hdac_audio_as *as = devinfo->function.audio.as; 5134 int j, cnt = 0, free; 5135 5136 for (j = 0; j < devinfo->function.audio.ascnt; j++) { 5137 if (as[j].enable) 5138 cnt++; 5139 } 5140 if (sc->num_chans == 0) { 5141 sc->chans = (struct hdac_chan *)malloc( 5142 sizeof(struct hdac_chan) * cnt, 5143 M_HDAC, M_ZERO | M_NOWAIT); 5144 if (sc->chans == NULL) { 5145 device_printf(devinfo->codec->sc->dev, 5146 "Channels memory allocation failed!\n"); 5147 return; 5148 } 5149 } else { 5150 sc->chans = (struct hdac_chan *)realloc(sc->chans, 5151 sizeof(struct hdac_chan) * (sc->num_chans + cnt), 5152 M_HDAC, M_ZERO | M_NOWAIT); 5153 if (sc->chans == NULL) { 5154 sc->num_chans = 0; 5155 device_printf(devinfo->codec->sc->dev, 5156 "Channels memory allocation failed!\n"); 5157 return; 5158 } 5159 } 5160 free = sc->num_chans; 5161 sc->num_chans += cnt; 5162 5163 for (j = free; j < free + cnt; j++) { 5164 devinfo->codec->sc->chans[j].devinfo = devinfo; 5165 devinfo->codec->sc->chans[j].as = -1; 5166 } 5167 5168 /* Assign associations in order of their numbers, */ 5169 for (j = 0; j < devinfo->function.audio.ascnt; j++) { 5170 if (as[j].enable == 0) 5171 continue; 5172 5173 as[j].chan = free; 5174 devinfo->codec->sc->chans[free].as = j; 5175 devinfo->codec->sc->chans[free].dir = 5176 (as[j].dir == HDA_CTL_IN) ? PCMDIR_REC : PCMDIR_PLAY; 5177 hdac_pcmchannel_setup(&devinfo->codec->sc->chans[free]); 5178 free++; 5179 } 5180 } 5181 5182 static void 5183 hdac_audio_disable_nonaudio(struct hdac_devinfo *devinfo) 5184 { 5185 struct hdac_widget *w; 5186 int i; 5187 5188 /* Disable power and volume widgets. */ 5189 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5190 w = hdac_widget_get(devinfo, i); 5191 if (w == NULL || w->enable == 0) 5192 continue; 5193 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_POWER_WIDGET || 5194 w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_VOLUME_WIDGET) { 5195 w->enable = 0; 5196 HDA_BOOTHVERBOSE( 5197 device_printf(devinfo->codec->sc->dev, 5198 " Disabling nid %d due to it's" 5199 " non-audio type.\n", 5200 w->nid); 5201 ); 5202 } 5203 } 5204 } 5205 5206 static void 5207 hdac_audio_disable_useless(struct hdac_devinfo *devinfo) 5208 { 5209 struct hdac_widget *w, *cw; 5210 struct hdac_audio_ctl *ctl; 5211 int done, found, i, j, k; 5212 5213 /* Disable useless pins. */ 5214 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5215 w = hdac_widget_get(devinfo, i); 5216 if (w == NULL || w->enable == 0) 5217 continue; 5218 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) { 5219 if ((w->wclass.pin.config & 5220 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK) == 5221 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_NONE) { 5222 w->enable = 0; 5223 HDA_BOOTHVERBOSE( 5224 device_printf(devinfo->codec->sc->dev, 5225 " Disabling pin nid %d due" 5226 " to None connectivity.\n", 5227 w->nid); 5228 ); 5229 } else if ((w->wclass.pin.config & 5230 HDA_CONFIG_DEFAULTCONF_ASSOCIATION_MASK) == 0) { 5231 w->enable = 0; 5232 HDA_BOOTHVERBOSE( 5233 device_printf(devinfo->codec->sc->dev, 5234 " Disabling unassociated" 5235 " pin nid %d.\n", 5236 w->nid); 5237 ); 5238 } 5239 } 5240 } 5241 do { 5242 done = 1; 5243 /* Disable and mute controls for disabled widgets. */ 5244 i = 0; 5245 while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) { 5246 if (ctl->enable == 0) 5247 continue; 5248 if (ctl->widget->enable == 0 || 5249 (ctl->childwidget != NULL && 5250 ctl->childwidget->enable == 0)) { 5251 ctl->forcemute = 1; 5252 ctl->muted = HDA_AMP_MUTE_ALL; 5253 ctl->left = 0; 5254 ctl->right = 0; 5255 ctl->enable = 0; 5256 if (ctl->ndir == HDA_CTL_IN) 5257 ctl->widget->connsenable[ctl->index] = 0; 5258 done = 0; 5259 HDA_BOOTHVERBOSE( 5260 device_printf(devinfo->codec->sc->dev, 5261 " Disabling ctl %d nid %d cnid %d due" 5262 " to disabled widget.\n", i, 5263 ctl->widget->nid, 5264 (ctl->childwidget != NULL)? 5265 ctl->childwidget->nid:-1); 5266 ); 5267 } 5268 } 5269 /* Disable useless widgets. */ 5270 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5271 w = hdac_widget_get(devinfo, i); 5272 if (w == NULL || w->enable == 0) 5273 continue; 5274 /* Disable inputs with disabled child widgets. */ 5275 for (j = 0; j < w->nconns; j++) { 5276 if (w->connsenable[j]) { 5277 cw = hdac_widget_get(devinfo, w->conns[j]); 5278 if (cw == NULL || cw->enable == 0) { 5279 w->connsenable[j] = 0; 5280 HDA_BOOTHVERBOSE( 5281 device_printf(devinfo->codec->sc->dev, 5282 " Disabling nid %d connection %d due" 5283 " to disabled child widget.\n", 5284 i, j); 5285 ); 5286 } 5287 } 5288 } 5289 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR && 5290 w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER) 5291 continue; 5292 /* Disable mixers and selectors without inputs. */ 5293 found = 0; 5294 for (j = 0; j < w->nconns; j++) { 5295 if (w->connsenable[j]) { 5296 found = 1; 5297 break; 5298 } 5299 } 5300 if (found == 0) { 5301 w->enable = 0; 5302 done = 0; 5303 HDA_BOOTHVERBOSE( 5304 device_printf(devinfo->codec->sc->dev, 5305 " Disabling nid %d due to all it's" 5306 " inputs disabled.\n", w->nid); 5307 ); 5308 } 5309 /* Disable nodes without consumers. */ 5310 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR && 5311 w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER) 5312 continue; 5313 found = 0; 5314 for (k = devinfo->startnode; k < devinfo->endnode; k++) { 5315 cw = hdac_widget_get(devinfo, k); 5316 if (cw == NULL || cw->enable == 0) 5317 continue; 5318 for (j = 0; j < cw->nconns; j++) { 5319 if (cw->connsenable[j] && cw->conns[j] == i) { 5320 found = 1; 5321 break; 5322 } 5323 } 5324 } 5325 if (found == 0) { 5326 w->enable = 0; 5327 done = 0; 5328 HDA_BOOTHVERBOSE( 5329 device_printf(devinfo->codec->sc->dev, 5330 " Disabling nid %d due to all it's" 5331 " consumers disabled.\n", w->nid); 5332 ); 5333 } 5334 } 5335 } while (done == 0); 5336 5337 } 5338 5339 static void 5340 hdac_audio_disable_unas(struct hdac_devinfo *devinfo) 5341 { 5342 struct hdac_audio_as *as = devinfo->function.audio.as; 5343 struct hdac_widget *w, *cw; 5344 struct hdac_audio_ctl *ctl; 5345 int i, j, k; 5346 5347 /* Disable unassosiated widgets. */ 5348 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5349 w = hdac_widget_get(devinfo, i); 5350 if (w == NULL || w->enable == 0) 5351 continue; 5352 if (w->bindas == -1) { 5353 w->enable = 0; 5354 HDA_BOOTHVERBOSE( 5355 device_printf(devinfo->codec->sc->dev, 5356 " Disabling unassociated nid %d.\n", 5357 w->nid); 5358 ); 5359 } 5360 } 5361 /* Disable input connections on input pin and 5362 * output on output. */ 5363 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5364 w = hdac_widget_get(devinfo, i); 5365 if (w == NULL || w->enable == 0) 5366 continue; 5367 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 5368 continue; 5369 if (w->bindas < 0) 5370 continue; 5371 if (as[w->bindas].dir == HDA_CTL_IN) { 5372 for (j = 0; j < w->nconns; j++) { 5373 if (w->connsenable[j] == 0) 5374 continue; 5375 w->connsenable[j] = 0; 5376 HDA_BOOTHVERBOSE( 5377 device_printf(devinfo->codec->sc->dev, 5378 " Disabling connection to input pin " 5379 "nid %d conn %d.\n", 5380 i, j); 5381 ); 5382 } 5383 ctl = hdac_audio_ctl_amp_get(devinfo, w->nid, 5384 HDA_CTL_IN, -1, 1); 5385 if (ctl && ctl->enable) { 5386 ctl->forcemute = 1; 5387 ctl->muted = HDA_AMP_MUTE_ALL; 5388 ctl->left = 0; 5389 ctl->right = 0; 5390 ctl->enable = 0; 5391 } 5392 } else { 5393 ctl = hdac_audio_ctl_amp_get(devinfo, w->nid, 5394 HDA_CTL_OUT, -1, 1); 5395 if (ctl && ctl->enable) { 5396 ctl->forcemute = 1; 5397 ctl->muted = HDA_AMP_MUTE_ALL; 5398 ctl->left = 0; 5399 ctl->right = 0; 5400 ctl->enable = 0; 5401 } 5402 for (k = devinfo->startnode; k < devinfo->endnode; k++) { 5403 cw = hdac_widget_get(devinfo, k); 5404 if (cw == NULL || cw->enable == 0) 5405 continue; 5406 for (j = 0; j < cw->nconns; j++) { 5407 if (cw->connsenable[j] && cw->conns[j] == i) { 5408 cw->connsenable[j] = 0; 5409 HDA_BOOTHVERBOSE( 5410 device_printf(devinfo->codec->sc->dev, 5411 " Disabling connection from output pin " 5412 "nid %d conn %d cnid %d.\n", 5413 k, j, i); 5414 ); 5415 if (cw->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX && 5416 cw->nconns > 1) 5417 continue; 5418 ctl = hdac_audio_ctl_amp_get(devinfo, k, 5419 HDA_CTL_IN, j, 1); 5420 if (ctl && ctl->enable) { 5421 ctl->forcemute = 1; 5422 ctl->muted = HDA_AMP_MUTE_ALL; 5423 ctl->left = 0; 5424 ctl->right = 0; 5425 ctl->enable = 0; 5426 } 5427 } 5428 } 5429 } 5430 } 5431 } 5432 } 5433 5434 static void 5435 hdac_audio_disable_notselected(struct hdac_devinfo *devinfo) 5436 { 5437 struct hdac_audio_as *as = devinfo->function.audio.as; 5438 struct hdac_widget *w; 5439 int i, j; 5440 5441 /* On playback path we can safely disable all unseleted inputs. */ 5442 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5443 w = hdac_widget_get(devinfo, i); 5444 if (w == NULL || w->enable == 0) 5445 continue; 5446 if (w->nconns <= 1) 5447 continue; 5448 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER) 5449 continue; 5450 if (w->bindas < 0 || as[w->bindas].dir == HDA_CTL_IN) 5451 continue; 5452 for (j = 0; j < w->nconns; j++) { 5453 if (w->connsenable[j] == 0) 5454 continue; 5455 if (w->selconn < 0 || w->selconn == j) 5456 continue; 5457 w->connsenable[j] = 0; 5458 HDA_BOOTHVERBOSE( 5459 device_printf(devinfo->codec->sc->dev, 5460 " Disabling unselected connection " 5461 "nid %d conn %d.\n", 5462 i, j); 5463 ); 5464 } 5465 } 5466 } 5467 5468 static void 5469 hdac_audio_disable_crossas(struct hdac_devinfo *devinfo) 5470 { 5471 struct hdac_widget *w, *cw; 5472 struct hdac_audio_ctl *ctl; 5473 int i, j; 5474 5475 /* Disable crossassociatement connections. */ 5476 /* ... using selectors */ 5477 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5478 w = hdac_widget_get(devinfo, i); 5479 if (w == NULL || w->enable == 0) 5480 continue; 5481 if (w->nconns <= 1) 5482 continue; 5483 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER) 5484 continue; 5485 if (w->bindas == -2) 5486 continue; 5487 for (j = 0; j < w->nconns; j++) { 5488 if (w->connsenable[j] == 0) 5489 continue; 5490 cw = hdac_widget_get(devinfo, w->conns[j]); 5491 if (cw == NULL || w->enable == 0) 5492 continue; 5493 if (w->bindas == cw->bindas || cw->bindas == -2) 5494 continue; 5495 w->connsenable[j] = 0; 5496 HDA_BOOTHVERBOSE( 5497 device_printf(devinfo->codec->sc->dev, 5498 " Disabling crossassociatement connection " 5499 "nid %d conn %d cnid %d.\n", 5500 i, j, cw->nid); 5501 ); 5502 } 5503 } 5504 /* ... using controls */ 5505 i = 0; 5506 while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) { 5507 if (ctl->enable == 0 || ctl->childwidget == NULL) 5508 continue; 5509 if (ctl->widget->bindas == -2 || 5510 ctl->childwidget->bindas == -2) 5511 continue; 5512 if (ctl->widget->bindas != ctl->childwidget->bindas) { 5513 ctl->forcemute = 1; 5514 ctl->muted = HDA_AMP_MUTE_ALL; 5515 ctl->left = 0; 5516 ctl->right = 0; 5517 ctl->enable = 0; 5518 if (ctl->ndir == HDA_CTL_IN) 5519 ctl->widget->connsenable[ctl->index] = 0; 5520 HDA_BOOTHVERBOSE( 5521 device_printf(devinfo->codec->sc->dev, 5522 " Disabling crossassociatement connection " 5523 "ctl %d nid %d cnid %d.\n", i, 5524 ctl->widget->nid, 5525 ctl->childwidget->nid); 5526 ); 5527 } 5528 } 5529 5530 } 5531 5532 #define HDA_CTL_GIVE(ctl) ((ctl)->step?1:0) 5533 5534 /* 5535 * Find controls to control amplification for source. 5536 */ 5537 static int 5538 hdac_audio_ctl_source_amp(struct hdac_devinfo *devinfo, nid_t nid, int index, 5539 int ossdev, int ctlable, int depth, int need) 5540 { 5541 struct hdac_widget *w, *wc; 5542 struct hdac_audio_ctl *ctl; 5543 int i, j, conns = 0, rneed; 5544 5545 if (depth > HDA_PARSE_MAXDEPTH) 5546 return (need); 5547 5548 w = hdac_widget_get(devinfo, nid); 5549 if (w == NULL || w->enable == 0) 5550 return (need); 5551 5552 /* Count number of active inputs. */ 5553 if (depth > 0) { 5554 for (j = 0; j < w->nconns; j++) { 5555 if (w->connsenable[j]) 5556 conns++; 5557 } 5558 } 5559 5560 /* If this is not a first step - use input mixer. 5561 Pins have common input ctl so care must be taken. */ 5562 if (depth > 0 && ctlable && (conns == 1 || 5563 w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX)) { 5564 ctl = hdac_audio_ctl_amp_get(devinfo, w->nid, HDA_CTL_IN, 5565 index, 1); 5566 if (ctl) { 5567 if (HDA_CTL_GIVE(ctl) & need) 5568 ctl->ossmask |= (1 << ossdev); 5569 else 5570 ctl->possmask |= (1 << ossdev); 5571 need &= ~HDA_CTL_GIVE(ctl); 5572 } 5573 } 5574 5575 /* If widget has own ossdev - not traverse it. 5576 It will be traversed on it's own. */ 5577 if (w->ossdev >= 0 && depth > 0) 5578 return (need); 5579 5580 /* We must not traverse pin */ 5581 if ((w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT || 5582 w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) && 5583 depth > 0) 5584 return (need); 5585 5586 /* record that this widget exports such signal, */ 5587 w->ossmask |= (1 << ossdev); 5588 5589 /* If signals mixed, we can't assign controls farther. 5590 * Ignore this on depth zero. Caller must knows why. 5591 * Ignore this for static selectors if this input selected. 5592 */ 5593 if (conns > 1) 5594 ctlable = 0; 5595 5596 if (ctlable) { 5597 ctl = hdac_audio_ctl_amp_get(devinfo, w->nid, HDA_CTL_OUT, -1, 1); 5598 if (ctl) { 5599 if (HDA_CTL_GIVE(ctl) & need) 5600 ctl->ossmask |= (1 << ossdev); 5601 else 5602 ctl->possmask |= (1 << ossdev); 5603 need &= ~HDA_CTL_GIVE(ctl); 5604 } 5605 } 5606 5607 rneed = 0; 5608 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5609 wc = hdac_widget_get(devinfo, i); 5610 if (wc == NULL || wc->enable == 0) 5611 continue; 5612 for (j = 0; j < wc->nconns; j++) { 5613 if (wc->connsenable[j] && wc->conns[j] == nid) { 5614 rneed |= hdac_audio_ctl_source_amp(devinfo, 5615 wc->nid, j, ossdev, ctlable, depth + 1, need); 5616 } 5617 } 5618 } 5619 rneed &= need; 5620 5621 return (rneed); 5622 } 5623 5624 /* 5625 * Find controls to control amplification for destination. 5626 */ 5627 static void 5628 hdac_audio_ctl_dest_amp(struct hdac_devinfo *devinfo, nid_t nid, 5629 int ossdev, int depth, int need) 5630 { 5631 struct hdac_audio_as *as = devinfo->function.audio.as; 5632 struct hdac_widget *w, *wc; 5633 struct hdac_audio_ctl *ctl; 5634 int i, j, consumers; 5635 5636 if (depth > HDA_PARSE_MAXDEPTH) 5637 return; 5638 5639 w = hdac_widget_get(devinfo, nid); 5640 if (w == NULL || w->enable == 0) 5641 return; 5642 5643 if (depth > 0) { 5644 /* If this node produce output for several consumers, 5645 we can't touch it. */ 5646 consumers = 0; 5647 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5648 wc = hdac_widget_get(devinfo, i); 5649 if (wc == NULL || wc->enable == 0) 5650 continue; 5651 for (j = 0; j < wc->nconns; j++) { 5652 if (wc->connsenable[j] && wc->conns[j] == nid) 5653 consumers++; 5654 } 5655 } 5656 /* The only exception is if real HP redirection is configured 5657 and this is a duplication point. 5658 XXX: Actually exception is not completely correct. 5659 XXX: Duplication point check is not perfect. */ 5660 if ((consumers == 2 && (w->bindas < 0 || 5661 as[w->bindas].hpredir < 0 || as[w->bindas].fakeredir || 5662 (w->bindseqmask & (1 << 15)) == 0)) || 5663 consumers > 2) 5664 return; 5665 5666 /* Else use it's output mixer. */ 5667 ctl = hdac_audio_ctl_amp_get(devinfo, w->nid, 5668 HDA_CTL_OUT, -1, 1); 5669 if (ctl) { 5670 if (HDA_CTL_GIVE(ctl) & need) 5671 ctl->ossmask |= (1 << ossdev); 5672 else 5673 ctl->possmask |= (1 << ossdev); 5674 need &= ~HDA_CTL_GIVE(ctl); 5675 } 5676 } 5677 5678 /* We must not traverse pin */ 5679 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX && 5680 depth > 0) 5681 return; 5682 5683 for (i = 0; i < w->nconns; i++) { 5684 int tneed = need; 5685 if (w->connsenable[i] == 0) 5686 continue; 5687 ctl = hdac_audio_ctl_amp_get(devinfo, w->nid, 5688 HDA_CTL_IN, i, 1); 5689 if (ctl) { 5690 if (HDA_CTL_GIVE(ctl) & tneed) 5691 ctl->ossmask |= (1 << ossdev); 5692 else 5693 ctl->possmask |= (1 << ossdev); 5694 tneed &= ~HDA_CTL_GIVE(ctl); 5695 } 5696 hdac_audio_ctl_dest_amp(devinfo, w->conns[i], ossdev, 5697 depth + 1, tneed); 5698 } 5699 } 5700 5701 /* 5702 * Assign OSS names to sound sources 5703 */ 5704 static void 5705 hdac_audio_assign_names(struct hdac_devinfo *devinfo) 5706 { 5707 struct hdac_audio_as *as = devinfo->function.audio.as; 5708 struct hdac_widget *w; 5709 int i, j; 5710 int type = -1, use, used = 0; 5711 static const int types[7][13] = { 5712 { SOUND_MIXER_LINE, SOUND_MIXER_LINE1, SOUND_MIXER_LINE2, 5713 SOUND_MIXER_LINE3, -1 }, /* line */ 5714 { SOUND_MIXER_MONITOR, SOUND_MIXER_MIC, -1 }, /* int mic */ 5715 { SOUND_MIXER_MIC, SOUND_MIXER_MONITOR, -1 }, /* ext mic */ 5716 { SOUND_MIXER_CD, -1 }, /* cd */ 5717 { SOUND_MIXER_SPEAKER, -1 }, /* speaker */ 5718 { SOUND_MIXER_DIGITAL1, SOUND_MIXER_DIGITAL2, SOUND_MIXER_DIGITAL3, 5719 -1 }, /* digital */ 5720 { SOUND_MIXER_LINE, SOUND_MIXER_LINE1, SOUND_MIXER_LINE2, 5721 SOUND_MIXER_LINE3, SOUND_MIXER_PHONEIN, SOUND_MIXER_PHONEOUT, 5722 SOUND_MIXER_VIDEO, SOUND_MIXER_RADIO, SOUND_MIXER_DIGITAL1, 5723 SOUND_MIXER_DIGITAL2, SOUND_MIXER_DIGITAL3, SOUND_MIXER_MONITOR, 5724 -1 } /* others */ 5725 }; 5726 5727 /* Surely known names */ 5728 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5729 w = hdac_widget_get(devinfo, i); 5730 if (w == NULL || w->enable == 0) 5731 continue; 5732 if (w->bindas == -1) 5733 continue; 5734 use = -1; 5735 switch (w->type) { 5736 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX: 5737 if (as[w->bindas].dir == HDA_CTL_OUT) 5738 break; 5739 type = -1; 5740 switch (w->wclass.pin.config & HDA_CONFIG_DEFAULTCONF_DEVICE_MASK) { 5741 case HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_IN: 5742 type = 0; 5743 break; 5744 case HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN: 5745 if ((w->wclass.pin.config & HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK) 5746 == HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_JACK) 5747 break; 5748 type = 1; 5749 break; 5750 case HDA_CONFIG_DEFAULTCONF_DEVICE_CD: 5751 type = 3; 5752 break; 5753 case HDA_CONFIG_DEFAULTCONF_DEVICE_SPEAKER: 5754 type = 4; 5755 break; 5756 case HDA_CONFIG_DEFAULTCONF_DEVICE_SPDIF_IN: 5757 case HDA_CONFIG_DEFAULTCONF_DEVICE_DIGITAL_OTHER_IN: 5758 type = 5; 5759 break; 5760 } 5761 if (type == -1) 5762 break; 5763 j = 0; 5764 while (types[type][j] >= 0 && 5765 (used & (1 << types[type][j])) != 0) { 5766 j++; 5767 } 5768 if (types[type][j] >= 0) 5769 use = types[type][j]; 5770 break; 5771 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_OUTPUT: 5772 use = SOUND_MIXER_PCM; 5773 break; 5774 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_BEEP_WIDGET: 5775 use = SOUND_MIXER_SPEAKER; 5776 break; 5777 default: 5778 break; 5779 } 5780 if (use >= 0) { 5781 w->ossdev = use; 5782 used |= (1 << use); 5783 } 5784 } 5785 /* Semi-known names */ 5786 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5787 w = hdac_widget_get(devinfo, i); 5788 if (w == NULL || w->enable == 0) 5789 continue; 5790 if (w->ossdev >= 0) 5791 continue; 5792 if (w->bindas == -1) 5793 continue; 5794 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 5795 continue; 5796 if (as[w->bindas].dir == HDA_CTL_OUT) 5797 continue; 5798 type = -1; 5799 switch (w->wclass.pin.config & HDA_CONFIG_DEFAULTCONF_DEVICE_MASK) { 5800 case HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_OUT: 5801 case HDA_CONFIG_DEFAULTCONF_DEVICE_SPEAKER: 5802 case HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT: 5803 case HDA_CONFIG_DEFAULTCONF_DEVICE_AUX: 5804 type = 0; 5805 break; 5806 case HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN: 5807 type = 2; 5808 break; 5809 case HDA_CONFIG_DEFAULTCONF_DEVICE_SPDIF_OUT: 5810 case HDA_CONFIG_DEFAULTCONF_DEVICE_DIGITAL_OTHER_OUT: 5811 type = 5; 5812 break; 5813 } 5814 if (type == -1) 5815 break; 5816 j = 0; 5817 while (types[type][j] >= 0 && 5818 (used & (1 << types[type][j])) != 0) { 5819 j++; 5820 } 5821 if (types[type][j] >= 0) { 5822 w->ossdev = types[type][j]; 5823 used |= (1 << types[type][j]); 5824 } 5825 } 5826 /* Others */ 5827 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5828 w = hdac_widget_get(devinfo, i); 5829 if (w == NULL || w->enable == 0) 5830 continue; 5831 if (w->ossdev >= 0) 5832 continue; 5833 if (w->bindas == -1) 5834 continue; 5835 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 5836 continue; 5837 if (as[w->bindas].dir == HDA_CTL_OUT) 5838 continue; 5839 j = 0; 5840 while (types[6][j] >= 0 && 5841 (used & (1 << types[6][j])) != 0) { 5842 j++; 5843 } 5844 if (types[6][j] >= 0) { 5845 w->ossdev = types[6][j]; 5846 used |= (1 << types[6][j]); 5847 } 5848 } 5849 } 5850 5851 static void 5852 hdac_audio_build_tree(struct hdac_devinfo *devinfo) 5853 { 5854 struct hdac_audio_as *as = devinfo->function.audio.as; 5855 int j, res; 5856 5857 /* Trace all associations in order of their numbers, */ 5858 for (j = 0; j < devinfo->function.audio.ascnt; j++) { 5859 if (as[j].enable == 0) 5860 continue; 5861 HDA_BOOTVERBOSE( 5862 device_printf(devinfo->codec->sc->dev, 5863 "Tracing association %d (%d)\n", j, as[j].index); 5864 ); 5865 if (as[j].dir == HDA_CTL_OUT) { 5866 retry: 5867 res = hdac_audio_trace_as_out(devinfo, j, 0); 5868 if (res == 0 && as[j].hpredir >= 0 && 5869 as[j].fakeredir == 0) { 5870 /* If codec can't do analog HP redirection 5871 try to make it using one more DAC. */ 5872 as[j].fakeredir = 1; 5873 goto retry; 5874 } 5875 } else { 5876 res = hdac_audio_trace_as_in(devinfo, j); 5877 } 5878 if (res) { 5879 HDA_BOOTVERBOSE( 5880 device_printf(devinfo->codec->sc->dev, 5881 "Association %d (%d) trace succeded\n", 5882 j, as[j].index); 5883 ); 5884 } else { 5885 HDA_BOOTVERBOSE( 5886 device_printf(devinfo->codec->sc->dev, 5887 "Association %d (%d) trace failed\n", 5888 j, as[j].index); 5889 ); 5890 as[j].enable = 0; 5891 } 5892 } 5893 5894 /* Trace mixer and beeper pseudo associations. */ 5895 hdac_audio_trace_as_extra(devinfo); 5896 } 5897 5898 static void 5899 hdac_audio_assign_mixers(struct hdac_devinfo *devinfo) 5900 { 5901 struct hdac_audio_as *as = devinfo->function.audio.as; 5902 struct hdac_audio_ctl *ctl; 5903 struct hdac_widget *w; 5904 int i; 5905 5906 /* Assign mixers to the tree. */ 5907 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5908 w = hdac_widget_get(devinfo, i); 5909 if (w == NULL || w->enable == 0) 5910 continue; 5911 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_OUTPUT || 5912 w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_BEEP_WIDGET || 5913 (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX && 5914 as[w->bindas].dir == HDA_CTL_IN)) { 5915 if (w->ossdev < 0) 5916 continue; 5917 hdac_audio_ctl_source_amp(devinfo, w->nid, -1, 5918 w->ossdev, 1, 0, 1); 5919 } else if ((w->pflags & HDA_ADC_MONITOR) != 0) { 5920 if (w->ossdev < 0) 5921 continue; 5922 if (hdac_audio_ctl_source_amp(devinfo, w->nid, -1, 5923 w->ossdev, 1, 0, 1)) { 5924 /* If we are unable to control input monitor 5925 as source - try to control it as destination. */ 5926 hdac_audio_ctl_dest_amp(devinfo, w->nid, 5927 w->ossdev, 0, 1); 5928 } 5929 } else if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT) { 5930 hdac_audio_ctl_dest_amp(devinfo, w->nid, 5931 SOUND_MIXER_RECLEV, 0, 1); 5932 } else if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX && 5933 as[w->bindas].dir == HDA_CTL_OUT) { 5934 hdac_audio_ctl_dest_amp(devinfo, w->nid, 5935 SOUND_MIXER_VOLUME, 0, 1); 5936 } 5937 } 5938 /* Treat unrequired as possible. */ 5939 i = 0; 5940 while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) { 5941 if (ctl->ossmask == 0) 5942 ctl->ossmask = ctl->possmask; 5943 } 5944 } 5945 5946 static void 5947 hdac_audio_prepare_pin_ctrl(struct hdac_devinfo *devinfo) 5948 { 5949 struct hdac_audio_as *as = devinfo->function.audio.as; 5950 struct hdac_widget *w; 5951 uint32_t pincap; 5952 int i; 5953 5954 for (i = 0; i < devinfo->nodecnt; i++) { 5955 w = &devinfo->widget[i]; 5956 if (w == NULL) 5957 continue; 5958 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 5959 continue; 5960 5961 pincap = w->wclass.pin.cap; 5962 5963 /* Disable everything. */ 5964 w->wclass.pin.ctrl &= ~( 5965 HDA_CMD_SET_PIN_WIDGET_CTRL_HPHN_ENABLE | 5966 HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE | 5967 HDA_CMD_SET_PIN_WIDGET_CTRL_IN_ENABLE | 5968 HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE_MASK); 5969 5970 if (w->enable == 0 || 5971 w->bindas < 0 || as[w->bindas].enable == 0) { 5972 /* Pin is unused so left it disabled. */ 5973 continue; 5974 } else if (as[w->bindas].dir == HDA_CTL_IN) { 5975 /* Input pin, configure for input. */ 5976 if (HDA_PARAM_PIN_CAP_INPUT_CAP(pincap)) 5977 w->wclass.pin.ctrl |= 5978 HDA_CMD_SET_PIN_WIDGET_CTRL_IN_ENABLE; 5979 5980 if ((devinfo->function.audio.quirks & HDA_QUIRK_IVREF100) && 5981 HDA_PARAM_PIN_CAP_VREF_CTRL_100(pincap)) 5982 w->wclass.pin.ctrl |= 5983 HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE( 5984 HDA_CMD_PIN_WIDGET_CTRL_VREF_ENABLE_100); 5985 else if ((devinfo->function.audio.quirks & HDA_QUIRK_IVREF80) && 5986 HDA_PARAM_PIN_CAP_VREF_CTRL_80(pincap)) 5987 w->wclass.pin.ctrl |= 5988 HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE( 5989 HDA_CMD_PIN_WIDGET_CTRL_VREF_ENABLE_80); 5990 else if ((devinfo->function.audio.quirks & HDA_QUIRK_IVREF50) && 5991 HDA_PARAM_PIN_CAP_VREF_CTRL_50(pincap)) 5992 w->wclass.pin.ctrl |= 5993 HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE( 5994 HDA_CMD_PIN_WIDGET_CTRL_VREF_ENABLE_50); 5995 } else { 5996 /* Output pin, configure for output. */ 5997 if (HDA_PARAM_PIN_CAP_OUTPUT_CAP(pincap)) 5998 w->wclass.pin.ctrl |= 5999 HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE; 6000 6001 if (HDA_PARAM_PIN_CAP_HEADPHONE_CAP(pincap) && 6002 (w->wclass.pin.config & 6003 HDA_CONFIG_DEFAULTCONF_DEVICE_MASK) == 6004 HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT) 6005 w->wclass.pin.ctrl |= 6006 HDA_CMD_SET_PIN_WIDGET_CTRL_HPHN_ENABLE; 6007 6008 if ((devinfo->function.audio.quirks & HDA_QUIRK_OVREF100) && 6009 HDA_PARAM_PIN_CAP_VREF_CTRL_100(pincap)) 6010 w->wclass.pin.ctrl |= 6011 HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE( 6012 HDA_CMD_PIN_WIDGET_CTRL_VREF_ENABLE_100); 6013 else if ((devinfo->function.audio.quirks & HDA_QUIRK_OVREF80) && 6014 HDA_PARAM_PIN_CAP_VREF_CTRL_80(pincap)) 6015 w->wclass.pin.ctrl |= 6016 HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE( 6017 HDA_CMD_PIN_WIDGET_CTRL_VREF_ENABLE_80); 6018 else if ((devinfo->function.audio.quirks & HDA_QUIRK_OVREF50) && 6019 HDA_PARAM_PIN_CAP_VREF_CTRL_50(pincap)) 6020 w->wclass.pin.ctrl |= 6021 HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE( 6022 HDA_CMD_PIN_WIDGET_CTRL_VREF_ENABLE_50); 6023 } 6024 } 6025 } 6026 6027 static void 6028 hdac_audio_commit(struct hdac_devinfo *devinfo) 6029 { 6030 struct hdac_softc *sc = devinfo->codec->sc; 6031 struct hdac_widget *w; 6032 nid_t cad; 6033 uint32_t gdata, gmask, gdir; 6034 int commitgpio, numgpio; 6035 int i; 6036 6037 cad = devinfo->codec->cad; 6038 6039 if (sc->pci_subvendor == APPLE_INTEL_MAC) 6040 hdac_command(sc, HDA_CMD_12BIT(cad, devinfo->nid, 6041 0x7e7, 0), cad); 6042 6043 gdata = 0; 6044 gmask = 0; 6045 gdir = 0; 6046 commitgpio = 0; 6047 6048 numgpio = HDA_PARAM_GPIO_COUNT_NUM_GPIO( 6049 devinfo->function.audio.gpio); 6050 6051 if (devinfo->function.audio.quirks & HDA_QUIRK_GPIOFLUSH) 6052 commitgpio = (numgpio > 0) ? 1 : 0; 6053 else { 6054 for (i = 0; i < numgpio && i < HDA_GPIO_MAX; i++) { 6055 if (!(devinfo->function.audio.quirks & 6056 (1 << i))) 6057 continue; 6058 if (commitgpio == 0) { 6059 commitgpio = 1; 6060 HDA_BOOTVERBOSE( 6061 gdata = hdac_command(sc, 6062 HDA_CMD_GET_GPIO_DATA(cad, 6063 devinfo->nid), cad); 6064 gmask = hdac_command(sc, 6065 HDA_CMD_GET_GPIO_ENABLE_MASK(cad, 6066 devinfo->nid), cad); 6067 gdir = hdac_command(sc, 6068 HDA_CMD_GET_GPIO_DIRECTION(cad, 6069 devinfo->nid), cad); 6070 device_printf(sc->dev, 6071 "GPIO init: data=0x%08x " 6072 "mask=0x%08x dir=0x%08x\n", 6073 gdata, gmask, gdir); 6074 gdata = 0; 6075 gmask = 0; 6076 gdir = 0; 6077 ); 6078 } 6079 gdata |= 1 << i; 6080 gmask |= 1 << i; 6081 gdir |= 1 << i; 6082 } 6083 } 6084 6085 if (commitgpio != 0) { 6086 HDA_BOOTVERBOSE( 6087 device_printf(sc->dev, 6088 "GPIO commit: data=0x%08x mask=0x%08x " 6089 "dir=0x%08x\n", 6090 gdata, gmask, gdir); 6091 ); 6092 hdac_command(sc, 6093 HDA_CMD_SET_GPIO_ENABLE_MASK(cad, devinfo->nid, 6094 gmask), cad); 6095 hdac_command(sc, 6096 HDA_CMD_SET_GPIO_DIRECTION(cad, devinfo->nid, 6097 gdir), cad); 6098 hdac_command(sc, 6099 HDA_CMD_SET_GPIO_DATA(cad, devinfo->nid, 6100 gdata), cad); 6101 } 6102 6103 for (i = 0; i < devinfo->nodecnt; i++) { 6104 w = &devinfo->widget[i]; 6105 if (w == NULL) 6106 continue; 6107 if (w->selconn == -1) 6108 w->selconn = 0; 6109 if (w->nconns > 0) 6110 hdac_widget_connection_select(w, w->selconn); 6111 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) { 6112 hdac_command(sc, 6113 HDA_CMD_SET_PIN_WIDGET_CTRL(cad, w->nid, 6114 w->wclass.pin.ctrl), cad); 6115 } 6116 if (w->param.eapdbtl != HDAC_INVALID) { 6117 uint32_t val; 6118 6119 val = w->param.eapdbtl; 6120 if (devinfo->function.audio.quirks & 6121 HDA_QUIRK_EAPDINV) 6122 val ^= HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD; 6123 hdac_command(sc, 6124 HDA_CMD_SET_EAPD_BTL_ENABLE(cad, w->nid, 6125 val), cad); 6126 6127 } 6128 } 6129 } 6130 6131 static void 6132 hdac_audio_ctl_commit(struct hdac_devinfo *devinfo) 6133 { 6134 struct hdac_audio_ctl *ctl; 6135 int i, z; 6136 6137 i = 0; 6138 while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) { 6139 if (ctl->enable == 0) { 6140 /* Mute disabled controls. */ 6141 hdac_audio_ctl_amp_set(ctl, HDA_AMP_MUTE_ALL, 0, 0); 6142 continue; 6143 } 6144 /* Init controls to 0dB amplification. */ 6145 z = ctl->offset; 6146 if (z > ctl->step) 6147 z = ctl->step; 6148 hdac_audio_ctl_amp_set(ctl, HDA_AMP_MUTE_NONE, z, z); 6149 } 6150 } 6151 6152 static void 6153 hdac_powerup(struct hdac_devinfo *devinfo) 6154 { 6155 struct hdac_softc *sc = devinfo->codec->sc; 6156 nid_t cad = devinfo->codec->cad; 6157 int i; 6158 6159 hdac_command(sc, 6160 HDA_CMD_SET_POWER_STATE(cad, 6161 devinfo->nid, HDA_CMD_POWER_STATE_D0), 6162 cad); 6163 DELAY(100); 6164 6165 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 6166 hdac_command(sc, 6167 HDA_CMD_SET_POWER_STATE(cad, 6168 i, HDA_CMD_POWER_STATE_D0), 6169 cad); 6170 } 6171 DELAY(1000); 6172 } 6173 6174 static int 6175 hdac_pcmchannel_setup(struct hdac_chan *ch) 6176 { 6177 struct hdac_devinfo *devinfo = ch->devinfo; 6178 struct hdac_audio_as *as = devinfo->function.audio.as; 6179 struct hdac_widget *w; 6180 uint32_t cap, fmtcap, pcmcap; 6181 int i, j, ret, max; 6182 6183 ch->caps = hdac_caps; 6184 ch->caps.fmtlist = ch->fmtlist; 6185 ch->bit16 = 1; 6186 ch->bit32 = 0; 6187 ch->pcmrates[0] = 48000; 6188 ch->pcmrates[1] = 0; 6189 6190 ret = 0; 6191 fmtcap = devinfo->function.audio.supp_stream_formats; 6192 pcmcap = devinfo->function.audio.supp_pcm_size_rate; 6193 max = (sizeof(ch->io) / sizeof(ch->io[0])) - 1; 6194 6195 for (i = 0; i < 16 && ret < max; i++) { 6196 /* Check as is correct */ 6197 if (ch->as < 0) 6198 break; 6199 /* Cound only present DACs */ 6200 if (as[ch->as].dacs[i] <= 0) 6201 continue; 6202 /* Ignore duplicates */ 6203 for (j = 0; j < ret; j++) { 6204 if (ch->io[j] == as[ch->as].dacs[i]) 6205 break; 6206 } 6207 if (j < ret) 6208 continue; 6209 6210 w = hdac_widget_get(devinfo, as[ch->as].dacs[i]); 6211 if (w == NULL || w->enable == 0) 6212 continue; 6213 if (!HDA_PARAM_AUDIO_WIDGET_CAP_STEREO(w->param.widget_cap)) 6214 continue; 6215 cap = w->param.supp_stream_formats; 6216 /*if (HDA_PARAM_SUPP_STREAM_FORMATS_FLOAT32(cap)) { 6217 }*/ 6218 if (!HDA_PARAM_SUPP_STREAM_FORMATS_PCM(cap) && 6219 !HDA_PARAM_SUPP_STREAM_FORMATS_AC3(cap)) 6220 continue; 6221 /* Many codec does not declare AC3 support on SPDIF. 6222 I don't beleave that they doesn't support it! */ 6223 if (HDA_PARAM_AUDIO_WIDGET_CAP_DIGITAL(w->param.widget_cap)) 6224 cap |= HDA_PARAM_SUPP_STREAM_FORMATS_AC3_MASK; 6225 if (ret == 0) { 6226 fmtcap = cap; 6227 pcmcap = w->param.supp_pcm_size_rate; 6228 } else { 6229 fmtcap &= cap; 6230 pcmcap &= w->param.supp_pcm_size_rate; 6231 } 6232 ch->io[ret++] = as[ch->as].dacs[i]; 6233 } 6234 ch->io[ret] = -1; 6235 6236 ch->supp_stream_formats = fmtcap; 6237 ch->supp_pcm_size_rate = pcmcap; 6238 6239 /* 6240 * 8bit = 0 6241 * 16bit = 1 6242 * 20bit = 2 6243 * 24bit = 3 6244 * 32bit = 4 6245 */ 6246 if (ret > 0) { 6247 i = 0; 6248 if (HDA_PARAM_SUPP_STREAM_FORMATS_PCM(fmtcap)) { 6249 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_16BIT(pcmcap)) 6250 ch->bit16 = 1; 6251 else if (HDA_PARAM_SUPP_PCM_SIZE_RATE_8BIT(pcmcap)) 6252 ch->bit16 = 0; 6253 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_32BIT(pcmcap)) 6254 ch->bit32 = 4; 6255 else if (HDA_PARAM_SUPP_PCM_SIZE_RATE_24BIT(pcmcap)) 6256 ch->bit32 = 3; 6257 else if (HDA_PARAM_SUPP_PCM_SIZE_RATE_20BIT(pcmcap)) 6258 ch->bit32 = 2; 6259 if (!(devinfo->function.audio.quirks & HDA_QUIRK_FORCESTEREO)) 6260 ch->fmtlist[i++] = AFMT_S16_LE; 6261 ch->fmtlist[i++] = AFMT_S16_LE | AFMT_STEREO; 6262 if (ch->bit32 > 0) { 6263 if (!(devinfo->function.audio.quirks & 6264 HDA_QUIRK_FORCESTEREO)) 6265 ch->fmtlist[i++] = AFMT_S32_LE; 6266 ch->fmtlist[i++] = AFMT_S32_LE | AFMT_STEREO; 6267 } 6268 } 6269 if (HDA_PARAM_SUPP_STREAM_FORMATS_AC3(fmtcap)) { 6270 ch->fmtlist[i++] = AFMT_AC3; 6271 } 6272 ch->fmtlist[i] = 0; 6273 i = 0; 6274 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_8KHZ(pcmcap)) 6275 ch->pcmrates[i++] = 8000; 6276 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_11KHZ(pcmcap)) 6277 ch->pcmrates[i++] = 11025; 6278 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_16KHZ(pcmcap)) 6279 ch->pcmrates[i++] = 16000; 6280 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_22KHZ(pcmcap)) 6281 ch->pcmrates[i++] = 22050; 6282 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_32KHZ(pcmcap)) 6283 ch->pcmrates[i++] = 32000; 6284 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_44KHZ(pcmcap)) 6285 ch->pcmrates[i++] = 44100; 6286 /* if (HDA_PARAM_SUPP_PCM_SIZE_RATE_48KHZ(pcmcap)) */ 6287 ch->pcmrates[i++] = 48000; 6288 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_88KHZ(pcmcap)) 6289 ch->pcmrates[i++] = 88200; 6290 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_96KHZ(pcmcap)) 6291 ch->pcmrates[i++] = 96000; 6292 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_176KHZ(pcmcap)) 6293 ch->pcmrates[i++] = 176400; 6294 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_192KHZ(pcmcap)) 6295 ch->pcmrates[i++] = 192000; 6296 /* if (HDA_PARAM_SUPP_PCM_SIZE_RATE_384KHZ(pcmcap)) */ 6297 ch->pcmrates[i] = 0; 6298 if (i > 0) { 6299 ch->caps.minspeed = ch->pcmrates[0]; 6300 ch->caps.maxspeed = ch->pcmrates[i - 1]; 6301 } 6302 } 6303 6304 return (ret); 6305 } 6306 6307 static void 6308 hdac_create_pcms(struct hdac_devinfo *devinfo) 6309 { 6310 struct hdac_softc *sc = devinfo->codec->sc; 6311 struct hdac_audio_as *as = devinfo->function.audio.as; 6312 int i, j, apdev = 0, ardev = 0, dpdev = 0, drdev = 0; 6313 6314 for (i = 0; i < devinfo->function.audio.ascnt; i++) { 6315 if (as[i].enable == 0) 6316 continue; 6317 if (as[i].dir == HDA_CTL_IN) { 6318 if (as[i].digital) 6319 drdev++; 6320 else 6321 ardev++; 6322 } else { 6323 if (as[i].digital) 6324 dpdev++; 6325 else 6326 apdev++; 6327 } 6328 } 6329 devinfo->function.audio.num_devs = 6330 max(ardev, apdev) + max(drdev, dpdev); 6331 devinfo->function.audio.devs = 6332 (struct hdac_pcm_devinfo *)malloc( 6333 devinfo->function.audio.num_devs * sizeof(struct hdac_pcm_devinfo), 6334 M_HDAC, M_ZERO | M_NOWAIT); 6335 if (devinfo->function.audio.devs == NULL) { 6336 device_printf(sc->dev, 6337 "Unable to allocate memory for devices\n"); 6338 return; 6339 } 6340 for (i = 0; i < devinfo->function.audio.num_devs; i++) { 6341 devinfo->function.audio.devs[i].index = i; 6342 devinfo->function.audio.devs[i].devinfo = devinfo; 6343 devinfo->function.audio.devs[i].play = -1; 6344 devinfo->function.audio.devs[i].rec = -1; 6345 devinfo->function.audio.devs[i].digital = 2; 6346 } 6347 for (i = 0; i < devinfo->function.audio.ascnt; i++) { 6348 if (as[i].enable == 0) 6349 continue; 6350 for (j = 0; j < devinfo->function.audio.num_devs; j++) { 6351 if (devinfo->function.audio.devs[j].digital != 2 && 6352 devinfo->function.audio.devs[j].digital != 6353 as[i].digital) 6354 continue; 6355 if (as[i].dir == HDA_CTL_IN) { 6356 if (devinfo->function.audio.devs[j].rec >= 0) 6357 continue; 6358 devinfo->function.audio.devs[j].rec 6359 = as[i].chan; 6360 } else { 6361 if (devinfo->function.audio.devs[j].play >= 0) 6362 continue; 6363 devinfo->function.audio.devs[j].play 6364 = as[i].chan; 6365 } 6366 sc->chans[as[i].chan].pdevinfo = 6367 &devinfo->function.audio.devs[j]; 6368 devinfo->function.audio.devs[j].digital = 6369 as[i].digital; 6370 break; 6371 } 6372 } 6373 for (i = 0; i < devinfo->function.audio.num_devs; i++) { 6374 struct hdac_pcm_devinfo *pdevinfo = 6375 &devinfo->function.audio.devs[i]; 6376 pdevinfo->dev = 6377 device_add_child(sc->dev, "pcm", -1); 6378 device_set_ivars(pdevinfo->dev, 6379 (void *)pdevinfo); 6380 } 6381 } 6382 6383 static void 6384 hdac_dump_ctls(struct hdac_pcm_devinfo *pdevinfo, const char *banner, uint32_t flag) 6385 { 6386 struct hdac_devinfo *devinfo = pdevinfo->devinfo; 6387 struct hdac_audio_ctl *ctl; 6388 struct hdac_softc *sc = devinfo->codec->sc; 6389 char buf[64]; 6390 int i, j, printed; 6391 6392 if (flag == 0) { 6393 flag = ~(SOUND_MASK_VOLUME | SOUND_MASK_PCM | 6394 SOUND_MASK_CD | SOUND_MASK_LINE | SOUND_MASK_RECLEV | 6395 SOUND_MASK_MIC | SOUND_MASK_SPEAKER | SOUND_MASK_OGAIN | 6396 SOUND_MASK_IMIX | SOUND_MASK_MONITOR); 6397 } 6398 6399 for (j = 0; j < SOUND_MIXER_NRDEVICES; j++) { 6400 if ((flag & (1 << j)) == 0) 6401 continue; 6402 i = 0; 6403 printed = 0; 6404 while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) { 6405 if (ctl->enable == 0 || 6406 ctl->widget->enable == 0) 6407 continue; 6408 if (!((pdevinfo->play >= 0 && 6409 ctl->widget->bindas == sc->chans[pdevinfo->play].as) || 6410 (pdevinfo->rec >= 0 && 6411 ctl->widget->bindas == sc->chans[pdevinfo->rec].as) || 6412 (ctl->widget->bindas == -2 && pdevinfo->index == 0))) 6413 continue; 6414 if ((ctl->ossmask & (1 << j)) == 0) 6415 continue; 6416 6417 if (printed == 0) { 6418 device_printf(pdevinfo->dev, "\n"); 6419 if (banner != NULL) { 6420 device_printf(pdevinfo->dev, "%s", banner); 6421 } else { 6422 device_printf(pdevinfo->dev, "Unknown Ctl"); 6423 } 6424 printf(" (OSS: %s)\n", 6425 hdac_audio_ctl_ossmixer_mask2allname(1 << j, 6426 buf, sizeof(buf))); 6427 device_printf(pdevinfo->dev, " |\n"); 6428 printed = 1; 6429 } 6430 device_printf(pdevinfo->dev, " +- ctl %2d (nid %3d %s", i, 6431 ctl->widget->nid, 6432 (ctl->ndir == HDA_CTL_IN)?"in ":"out"); 6433 if (ctl->ndir == HDA_CTL_IN && ctl->ndir == ctl->dir) 6434 printf(" %2d): ", ctl->index); 6435 else 6436 printf("): "); 6437 if (ctl->step > 0) { 6438 printf("%+d/%+ddB (%d steps)%s\n", 6439 (0 - ctl->offset) * (ctl->size + 1) / 4, 6440 (ctl->step - ctl->offset) * (ctl->size + 1) / 4, 6441 ctl->step + 1, 6442 ctl->mute?" + mute":""); 6443 } else 6444 printf("%s\n", ctl->mute?"mute":""); 6445 } 6446 } 6447 } 6448 6449 static void 6450 hdac_dump_audio_formats(device_t dev, uint32_t fcap, uint32_t pcmcap) 6451 { 6452 uint32_t cap; 6453 6454 cap = fcap; 6455 if (cap != 0) { 6456 device_printf(dev, " Stream cap: 0x%08x\n", cap); 6457 device_printf(dev, " "); 6458 if (HDA_PARAM_SUPP_STREAM_FORMATS_AC3(cap)) 6459 printf(" AC3"); 6460 if (HDA_PARAM_SUPP_STREAM_FORMATS_FLOAT32(cap)) 6461 printf(" FLOAT32"); 6462 if (HDA_PARAM_SUPP_STREAM_FORMATS_PCM(cap)) 6463 printf(" PCM"); 6464 printf("\n"); 6465 } 6466 cap = pcmcap; 6467 if (cap != 0) { 6468 device_printf(dev, " PCM cap: 0x%08x\n", cap); 6469 device_printf(dev, " "); 6470 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_8BIT(cap)) 6471 printf(" 8"); 6472 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_16BIT(cap)) 6473 printf(" 16"); 6474 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_20BIT(cap)) 6475 printf(" 20"); 6476 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_24BIT(cap)) 6477 printf(" 24"); 6478 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_32BIT(cap)) 6479 printf(" 32"); 6480 printf(" bits,"); 6481 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_8KHZ(cap)) 6482 printf(" 8"); 6483 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_11KHZ(cap)) 6484 printf(" 11"); 6485 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_16KHZ(cap)) 6486 printf(" 16"); 6487 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_22KHZ(cap)) 6488 printf(" 22"); 6489 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_32KHZ(cap)) 6490 printf(" 32"); 6491 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_44KHZ(cap)) 6492 printf(" 44"); 6493 printf(" 48"); 6494 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_88KHZ(cap)) 6495 printf(" 88"); 6496 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_96KHZ(cap)) 6497 printf(" 96"); 6498 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_176KHZ(cap)) 6499 printf(" 176"); 6500 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_192KHZ(cap)) 6501 printf(" 192"); 6502 printf(" KHz\n"); 6503 } 6504 } 6505 6506 static void 6507 hdac_dump_pin(struct hdac_softc *sc, struct hdac_widget *w) 6508 { 6509 uint32_t pincap; 6510 6511 pincap = w->wclass.pin.cap; 6512 6513 device_printf(sc->dev, " Pin cap: 0x%08x\n", pincap); 6514 device_printf(sc->dev, " "); 6515 if (HDA_PARAM_PIN_CAP_IMP_SENSE_CAP(pincap)) 6516 printf(" ISC"); 6517 if (HDA_PARAM_PIN_CAP_TRIGGER_REQD(pincap)) 6518 printf(" TRQD"); 6519 if (HDA_PARAM_PIN_CAP_PRESENCE_DETECT_CAP(pincap)) 6520 printf(" PDC"); 6521 if (HDA_PARAM_PIN_CAP_HEADPHONE_CAP(pincap)) 6522 printf(" HP"); 6523 if (HDA_PARAM_PIN_CAP_OUTPUT_CAP(pincap)) 6524 printf(" OUT"); 6525 if (HDA_PARAM_PIN_CAP_INPUT_CAP(pincap)) 6526 printf(" IN"); 6527 if (HDA_PARAM_PIN_CAP_BALANCED_IO_PINS(pincap)) 6528 printf(" BAL"); 6529 if (HDA_PARAM_PIN_CAP_VREF_CTRL(pincap)) { 6530 printf(" VREF["); 6531 if (HDA_PARAM_PIN_CAP_VREF_CTRL_50(pincap)) 6532 printf(" 50"); 6533 if (HDA_PARAM_PIN_CAP_VREF_CTRL_80(pincap)) 6534 printf(" 80"); 6535 if (HDA_PARAM_PIN_CAP_VREF_CTRL_100(pincap)) 6536 printf(" 100"); 6537 if (HDA_PARAM_PIN_CAP_VREF_CTRL_GROUND(pincap)) 6538 printf(" GROUND"); 6539 if (HDA_PARAM_PIN_CAP_VREF_CTRL_HIZ(pincap)) 6540 printf(" HIZ"); 6541 printf(" ]"); 6542 } 6543 if (HDA_PARAM_PIN_CAP_EAPD_CAP(pincap)) 6544 printf(" EAPD"); 6545 printf("\n"); 6546 device_printf(sc->dev, " Pin config: 0x%08x\n", 6547 w->wclass.pin.config); 6548 device_printf(sc->dev, " Pin control: 0x%08x", w->wclass.pin.ctrl); 6549 if (w->wclass.pin.ctrl & HDA_CMD_SET_PIN_WIDGET_CTRL_HPHN_ENABLE) 6550 printf(" HP"); 6551 if (w->wclass.pin.ctrl & HDA_CMD_SET_PIN_WIDGET_CTRL_IN_ENABLE) 6552 printf(" IN"); 6553 if (w->wclass.pin.ctrl & HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE) 6554 printf(" OUT"); 6555 if (w->wclass.pin.ctrl & HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE_MASK) 6556 printf(" VREFs"); 6557 printf("\n"); 6558 } 6559 6560 static void 6561 hdac_dump_pin_config(struct hdac_widget *w, uint32_t conf) 6562 { 6563 struct hdac_softc *sc = w->devinfo->codec->sc; 6564 6565 device_printf(sc->dev, " nid %d 0x%08x as %2d seq %2d %13s %5s " 6566 "jack %2d loc %2d color %7s misc %d%s\n", 6567 w->nid, conf, 6568 HDA_CONFIG_DEFAULTCONF_ASSOCIATION(conf), 6569 HDA_CONFIG_DEFAULTCONF_SEQUENCE(conf), 6570 HDA_DEVS[HDA_CONFIG_DEFAULTCONF_DEVICE(conf)], 6571 HDA_CONNS[HDA_CONFIG_DEFAULTCONF_CONNECTIVITY(conf)], 6572 HDA_CONFIG_DEFAULTCONF_CONNECTION_TYPE(conf), 6573 HDA_CONFIG_DEFAULTCONF_LOCATION(conf), 6574 HDA_COLORS[HDA_CONFIG_DEFAULTCONF_COLOR(conf)], 6575 HDA_CONFIG_DEFAULTCONF_MISC(conf), 6576 (w->enable == 0)?" [DISABLED]":""); 6577 } 6578 6579 static void 6580 hdac_dump_pin_configs(struct hdac_devinfo *devinfo) 6581 { 6582 struct hdac_widget *w; 6583 int i; 6584 6585 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 6586 w = hdac_widget_get(devinfo, i); 6587 if (w == NULL) 6588 continue; 6589 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 6590 continue; 6591 hdac_dump_pin_config(w, w->wclass.pin.config); 6592 } 6593 } 6594 6595 static void 6596 hdac_dump_amp(struct hdac_softc *sc, uint32_t cap, char *banner) 6597 { 6598 device_printf(sc->dev, " %s amp: 0x%08x\n", banner, cap); 6599 device_printf(sc->dev, " " 6600 "mute=%d step=%d size=%d offset=%d\n", 6601 HDA_PARAM_OUTPUT_AMP_CAP_MUTE_CAP(cap), 6602 HDA_PARAM_OUTPUT_AMP_CAP_NUMSTEPS(cap), 6603 HDA_PARAM_OUTPUT_AMP_CAP_STEPSIZE(cap), 6604 HDA_PARAM_OUTPUT_AMP_CAP_OFFSET(cap)); 6605 } 6606 6607 static void 6608 hdac_dump_nodes(struct hdac_devinfo *devinfo) 6609 { 6610 struct hdac_softc *sc = devinfo->codec->sc; 6611 static char *ossname[] = SOUND_DEVICE_NAMES; 6612 struct hdac_widget *w, *cw; 6613 char buf[64]; 6614 int i, j; 6615 6616 device_printf(sc->dev, "\n"); 6617 device_printf(sc->dev, "Default Parameter\n"); 6618 device_printf(sc->dev, "-----------------\n"); 6619 hdac_dump_audio_formats(sc->dev, 6620 devinfo->function.audio.supp_stream_formats, 6621 devinfo->function.audio.supp_pcm_size_rate); 6622 device_printf(sc->dev, " IN amp: 0x%08x\n", 6623 devinfo->function.audio.inamp_cap); 6624 device_printf(sc->dev, " OUT amp: 0x%08x\n", 6625 devinfo->function.audio.outamp_cap); 6626 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 6627 w = hdac_widget_get(devinfo, i); 6628 if (w == NULL) { 6629 device_printf(sc->dev, "Ghost widget nid=%d\n", i); 6630 continue; 6631 } 6632 device_printf(sc->dev, "\n"); 6633 device_printf(sc->dev, " nid: %d%s\n", w->nid, 6634 (w->enable == 0) ? " [DISABLED]" : ""); 6635 device_printf(sc->dev, " Name: %s\n", w->name); 6636 device_printf(sc->dev, " Widget cap: 0x%08x\n", 6637 w->param.widget_cap); 6638 if (w->param.widget_cap & 0x0ee1) { 6639 device_printf(sc->dev, " "); 6640 if (HDA_PARAM_AUDIO_WIDGET_CAP_LR_SWAP(w->param.widget_cap)) 6641 printf(" LRSWAP"); 6642 if (HDA_PARAM_AUDIO_WIDGET_CAP_POWER_CTRL(w->param.widget_cap)) 6643 printf(" PWR"); 6644 if (HDA_PARAM_AUDIO_WIDGET_CAP_DIGITAL(w->param.widget_cap)) 6645 printf(" DIGITAL"); 6646 if (HDA_PARAM_AUDIO_WIDGET_CAP_UNSOL_CAP(w->param.widget_cap)) 6647 printf(" UNSOL"); 6648 if (HDA_PARAM_AUDIO_WIDGET_CAP_PROC_WIDGET(w->param.widget_cap)) 6649 printf(" PROC"); 6650 if (HDA_PARAM_AUDIO_WIDGET_CAP_STRIPE(w->param.widget_cap)) 6651 printf(" STRIPE"); 6652 if (HDA_PARAM_AUDIO_WIDGET_CAP_STEREO(w->param.widget_cap)) 6653 printf(" STEREO"); 6654 printf("\n"); 6655 } 6656 if (w->bindas != -1) { 6657 device_printf(sc->dev, " Association: %d (0x%08x)\n", 6658 w->bindas, w->bindseqmask); 6659 } 6660 if (w->ossmask != 0 || w->ossdev >= 0) { 6661 device_printf(sc->dev, " OSS: %s", 6662 hdac_audio_ctl_ossmixer_mask2allname(w->ossmask, buf, sizeof(buf))); 6663 if (w->ossdev >= 0) 6664 printf(" (%s)", ossname[w->ossdev]); 6665 printf("\n"); 6666 } 6667 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_OUTPUT || 6668 w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT) { 6669 hdac_dump_audio_formats(sc->dev, 6670 w->param.supp_stream_formats, 6671 w->param.supp_pcm_size_rate); 6672 } else if (w->type == 6673 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 6674 hdac_dump_pin(sc, w); 6675 if (w->param.eapdbtl != HDAC_INVALID) 6676 device_printf(sc->dev, " EAPD: 0x%08x\n", 6677 w->param.eapdbtl); 6678 if (HDA_PARAM_AUDIO_WIDGET_CAP_OUT_AMP(w->param.widget_cap) && 6679 w->param.outamp_cap != 0) 6680 hdac_dump_amp(sc, w->param.outamp_cap, "Output"); 6681 if (HDA_PARAM_AUDIO_WIDGET_CAP_IN_AMP(w->param.widget_cap) && 6682 w->param.inamp_cap != 0) 6683 hdac_dump_amp(sc, w->param.inamp_cap, " Input"); 6684 if (w->nconns > 0) { 6685 device_printf(sc->dev, " connections: %d\n", w->nconns); 6686 device_printf(sc->dev, " |\n"); 6687 } 6688 for (j = 0; j < w->nconns; j++) { 6689 cw = hdac_widget_get(devinfo, w->conns[j]); 6690 device_printf(sc->dev, " + %s<- nid=%d [%s]", 6691 (w->connsenable[j] == 0)?"[DISABLED] ":"", 6692 w->conns[j], (cw == NULL) ? "GHOST!" : cw->name); 6693 if (cw == NULL) 6694 printf(" [UNKNOWN]"); 6695 else if (cw->enable == 0) 6696 printf(" [DISABLED]"); 6697 if (w->nconns > 1 && w->selconn == j && w->type != 6698 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER) 6699 printf(" (selected)"); 6700 printf("\n"); 6701 } 6702 } 6703 6704 } 6705 6706 static void 6707 hdac_dump_dst_nid(struct hdac_pcm_devinfo *pdevinfo, nid_t nid, int depth) 6708 { 6709 struct hdac_devinfo *devinfo = pdevinfo->devinfo; 6710 struct hdac_widget *w, *cw; 6711 char buf[64]; 6712 int i, printed = 0; 6713 6714 if (depth > HDA_PARSE_MAXDEPTH) 6715 return; 6716 6717 w = hdac_widget_get(devinfo, nid); 6718 if (w == NULL || w->enable == 0) 6719 return; 6720 6721 if (depth == 0) 6722 device_printf(pdevinfo->dev, "%*s", 4, ""); 6723 else 6724 device_printf(pdevinfo->dev, "%*s + <- ", 4 + (depth - 1) * 7, ""); 6725 printf("nid=%d [%s]", w->nid, w->name); 6726 6727 if (depth > 0) { 6728 if (w->ossmask == 0) { 6729 printf("\n"); 6730 return; 6731 } 6732 printf(" [src: %s]", 6733 hdac_audio_ctl_ossmixer_mask2allname( 6734 w->ossmask, buf, sizeof(buf))); 6735 if (w->ossdev >= 0) { 6736 printf("\n"); 6737 return; 6738 } 6739 } 6740 printf("\n"); 6741 6742 for (i = 0; i < w->nconns; i++) { 6743 if (w->connsenable[i] == 0) 6744 continue; 6745 cw = hdac_widget_get(devinfo, w->conns[i]); 6746 if (cw == NULL || cw->enable == 0 || cw->bindas == -1) 6747 continue; 6748 if (printed == 0) { 6749 device_printf(pdevinfo->dev, "%*s |\n", 4 + (depth) * 7, ""); 6750 printed = 1; 6751 } 6752 hdac_dump_dst_nid(pdevinfo, w->conns[i], depth + 1); 6753 } 6754 6755 } 6756 6757 static void 6758 hdac_dump_dac(struct hdac_pcm_devinfo *pdevinfo) 6759 { 6760 struct hdac_devinfo *devinfo = pdevinfo->devinfo; 6761 struct hdac_softc *sc = devinfo->codec->sc; 6762 struct hdac_widget *w; 6763 int i, printed = 0; 6764 6765 if (pdevinfo->play < 0) 6766 return; 6767 6768 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 6769 w = hdac_widget_get(devinfo, i); 6770 if (w == NULL || w->enable == 0) 6771 continue; 6772 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 6773 continue; 6774 if (w->bindas != sc->chans[pdevinfo->play].as) 6775 continue; 6776 if (printed == 0) { 6777 printed = 1; 6778 device_printf(pdevinfo->dev, "\n"); 6779 device_printf(pdevinfo->dev, "Playback:\n"); 6780 } 6781 device_printf(pdevinfo->dev, "\n"); 6782 hdac_dump_dst_nid(pdevinfo, i, 0); 6783 } 6784 } 6785 6786 static void 6787 hdac_dump_adc(struct hdac_pcm_devinfo *pdevinfo) 6788 { 6789 struct hdac_devinfo *devinfo = pdevinfo->devinfo; 6790 struct hdac_softc *sc = devinfo->codec->sc; 6791 struct hdac_widget *w; 6792 int i; 6793 int printed = 0; 6794 6795 if (pdevinfo->rec < 0) 6796 return; 6797 6798 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 6799 w = hdac_widget_get(devinfo, i); 6800 if (w == NULL || w->enable == 0) 6801 continue; 6802 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT) 6803 continue; 6804 if (w->bindas != sc->chans[pdevinfo->rec].as) 6805 continue; 6806 if (printed == 0) { 6807 printed = 1; 6808 device_printf(pdevinfo->dev, "\n"); 6809 device_printf(pdevinfo->dev, "Record:\n"); 6810 } 6811 device_printf(pdevinfo->dev, "\n"); 6812 hdac_dump_dst_nid(pdevinfo, i, 0); 6813 } 6814 } 6815 6816 static void 6817 hdac_dump_mix(struct hdac_pcm_devinfo *pdevinfo) 6818 { 6819 struct hdac_devinfo *devinfo = pdevinfo->devinfo; 6820 struct hdac_widget *w; 6821 int i; 6822 int printed = 0; 6823 6824 if (pdevinfo->index != 0) 6825 return; 6826 6827 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 6828 w = hdac_widget_get(devinfo, i); 6829 if (w == NULL || w->enable == 0) 6830 continue; 6831 if ((w->pflags & HDA_ADC_MONITOR) == 0) 6832 continue; 6833 if (printed == 0) { 6834 printed = 1; 6835 device_printf(pdevinfo->dev, "\n"); 6836 device_printf(pdevinfo->dev, "Input Mix:\n"); 6837 } 6838 device_printf(pdevinfo->dev, "\n"); 6839 hdac_dump_dst_nid(pdevinfo, i, 0); 6840 } 6841 } 6842 6843 static void 6844 hdac_dump_pcmchannels(struct hdac_pcm_devinfo *pdevinfo) 6845 { 6846 struct hdac_softc *sc = pdevinfo->devinfo->codec->sc; 6847 nid_t *nids; 6848 int i; 6849 6850 if (pdevinfo->play >= 0) { 6851 i = pdevinfo->play; 6852 device_printf(pdevinfo->dev, "\n"); 6853 device_printf(pdevinfo->dev, "Playback:\n"); 6854 device_printf(pdevinfo->dev, "\n"); 6855 hdac_dump_audio_formats(pdevinfo->dev, sc->chans[i].supp_stream_formats, 6856 sc->chans[i].supp_pcm_size_rate); 6857 device_printf(pdevinfo->dev, " DAC:"); 6858 for (nids = sc->chans[i].io; *nids != -1; nids++) 6859 printf(" %d", *nids); 6860 printf("\n"); 6861 } 6862 if (pdevinfo->rec >= 0) { 6863 i = pdevinfo->rec; 6864 device_printf(pdevinfo->dev, "\n"); 6865 device_printf(pdevinfo->dev, "Record:\n"); 6866 device_printf(pdevinfo->dev, "\n"); 6867 hdac_dump_audio_formats(pdevinfo->dev, sc->chans[i].supp_stream_formats, 6868 sc->chans[i].supp_pcm_size_rate); 6869 device_printf(pdevinfo->dev, " ADC:"); 6870 for (nids = sc->chans[i].io; *nids != -1; nids++) 6871 printf(" %d", *nids); 6872 printf("\n"); 6873 } 6874 } 6875 6876 static void 6877 hdac_release_resources(struct hdac_softc *sc) 6878 { 6879 int i, j; 6880 6881 if (sc == NULL) 6882 return; 6883 6884 hdac_lock(sc); 6885 sc->polling = 0; 6886 sc->poll_ival = 0; 6887 callout_stop(&sc->poll_hda); 6888 callout_stop(&sc->poll_hdac); 6889 callout_stop(&sc->poll_jack); 6890 hdac_reset(sc, 0); 6891 hdac_unlock(sc); 6892 taskqueue_drain(taskqueue_thread, &sc->unsolq_task); 6893 callout_drain(&sc->poll_hda); 6894 callout_drain(&sc->poll_hdac); 6895 callout_drain(&sc->poll_jack); 6896 6897 hdac_irq_free(sc); 6898 6899 for (i = 0; i < HDAC_CODEC_MAX; i++) { 6900 if (sc->codecs[i] == NULL) 6901 continue; 6902 for (j = 0; j < sc->codecs[i]->num_fgs; j++) { 6903 free(sc->codecs[i]->fgs[j].widget, M_HDAC); 6904 if (sc->codecs[i]->fgs[j].node_type == 6905 HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO) { 6906 free(sc->codecs[i]->fgs[j].function.audio.ctl, 6907 M_HDAC); 6908 free(sc->codecs[i]->fgs[j].function.audio.as, 6909 M_HDAC); 6910 free(sc->codecs[i]->fgs[j].function.audio.devs, 6911 M_HDAC); 6912 } 6913 } 6914 free(sc->codecs[i]->fgs, M_HDAC); 6915 free(sc->codecs[i], M_HDAC); 6916 sc->codecs[i] = NULL; 6917 } 6918 6919 hdac_dma_free(sc, &sc->pos_dma); 6920 hdac_dma_free(sc, &sc->rirb_dma); 6921 hdac_dma_free(sc, &sc->corb_dma); 6922 for (i = 0; i < sc->num_chans; i++) { 6923 if (sc->chans[i].blkcnt > 0) 6924 hdac_dma_free(sc, &sc->chans[i].bdl_dma); 6925 } 6926 free(sc->chans, M_HDAC); 6927 if (sc->chan_dmat != NULL) { 6928 bus_dma_tag_destroy(sc->chan_dmat); 6929 sc->chan_dmat = NULL; 6930 } 6931 hdac_mem_free(sc); 6932 snd_mtxfree(sc->lock); 6933 } 6934 6935 /* This function surely going to make its way into upper level someday. */ 6936 static void 6937 hdac_config_fetch(struct hdac_softc *sc, uint32_t *on, uint32_t *off) 6938 { 6939 const char *res = NULL; 6940 int i = 0, j, k, len, inv; 6941 6942 if (on != NULL) 6943 *on = 0; 6944 if (off != NULL) 6945 *off = 0; 6946 if (sc == NULL) 6947 return; 6948 if (resource_string_value(device_get_name(sc->dev), 6949 device_get_unit(sc->dev), "config", &res) != 0) 6950 return; 6951 if (!(res != NULL && strlen(res) > 0)) 6952 return; 6953 HDA_BOOTVERBOSE( 6954 device_printf(sc->dev, "HDA Config:"); 6955 ); 6956 for (;;) { 6957 while (res[i] != '\0' && 6958 (res[i] == ',' || isspace(res[i]) != 0)) 6959 i++; 6960 if (res[i] == '\0') { 6961 HDA_BOOTVERBOSE( 6962 printf("\n"); 6963 ); 6964 return; 6965 } 6966 j = i; 6967 while (res[j] != '\0' && 6968 !(res[j] == ',' || isspace(res[j]) != 0)) 6969 j++; 6970 len = j - i; 6971 if (len > 2 && strncmp(res + i, "no", 2) == 0) 6972 inv = 2; 6973 else 6974 inv = 0; 6975 for (k = 0; len > inv && k < HDAC_QUIRKS_TAB_LEN; k++) { 6976 if (strncmp(res + i + inv, 6977 hdac_quirks_tab[k].key, len - inv) != 0) 6978 continue; 6979 if (len - inv != strlen(hdac_quirks_tab[k].key)) 6980 break; 6981 HDA_BOOTVERBOSE( 6982 printf(" %s%s", (inv != 0) ? "no" : "", 6983 hdac_quirks_tab[k].key); 6984 ); 6985 if (inv == 0 && on != NULL) 6986 *on |= hdac_quirks_tab[k].value; 6987 else if (inv != 0 && off != NULL) 6988 *off |= hdac_quirks_tab[k].value; 6989 break; 6990 } 6991 i = j; 6992 } 6993 } 6994 6995 #ifdef SND_DYNSYSCTL 6996 static int 6997 sysctl_hdac_polling(SYSCTL_HANDLER_ARGS) 6998 { 6999 struct hdac_softc *sc; 7000 device_t dev; 7001 uint32_t ctl; 7002 int err, val; 7003 7004 dev = oidp->oid_arg1; 7005 sc = device_get_softc(dev); 7006 if (sc == NULL) 7007 return (EINVAL); 7008 hdac_lock(sc); 7009 val = sc->polling; 7010 hdac_unlock(sc); 7011 err = sysctl_handle_int(oidp, &val, 0, req); 7012 7013 if (err != 0 || req->newptr == NULL) 7014 return (err); 7015 if (val < 0 || val > 1) 7016 return (EINVAL); 7017 7018 hdac_lock(sc); 7019 if (val != sc->polling) { 7020 if (val == 0) { 7021 callout_stop(&sc->poll_hda); 7022 callout_stop(&sc->poll_hdac); 7023 hdac_unlock(sc); 7024 callout_drain(&sc->poll_hda); 7025 callout_drain(&sc->poll_hdac); 7026 hdac_lock(sc); 7027 sc->polling = 0; 7028 ctl = HDAC_READ_4(&sc->mem, HDAC_INTCTL); 7029 ctl |= HDAC_INTCTL_GIE; 7030 HDAC_WRITE_4(&sc->mem, HDAC_INTCTL, ctl); 7031 } else { 7032 ctl = HDAC_READ_4(&sc->mem, HDAC_INTCTL); 7033 ctl &= ~HDAC_INTCTL_GIE; 7034 HDAC_WRITE_4(&sc->mem, HDAC_INTCTL, ctl); 7035 hdac_unlock(sc); 7036 taskqueue_drain(taskqueue_thread, &sc->unsolq_task); 7037 hdac_lock(sc); 7038 sc->polling = 1; 7039 hdac_poll_reinit(sc); 7040 callout_reset(&sc->poll_hdac, 1, hdac_poll_callback, sc); 7041 } 7042 } 7043 hdac_unlock(sc); 7044 7045 return (err); 7046 } 7047 7048 static int 7049 sysctl_hdac_polling_interval(SYSCTL_HANDLER_ARGS) 7050 { 7051 struct hdac_softc *sc; 7052 device_t dev; 7053 int err, val; 7054 7055 dev = oidp->oid_arg1; 7056 sc = device_get_softc(dev); 7057 if (sc == NULL) 7058 return (EINVAL); 7059 hdac_lock(sc); 7060 val = ((uint64_t)sc->poll_ival * 1000) / hz; 7061 hdac_unlock(sc); 7062 err = sysctl_handle_int(oidp, &val, 0, req); 7063 7064 if (err != 0 || req->newptr == NULL) 7065 return (err); 7066 7067 if (val < 1) 7068 val = 1; 7069 if (val > 5000) 7070 val = 5000; 7071 val = ((uint64_t)val * hz) / 1000; 7072 if (val < 1) 7073 val = 1; 7074 if (val > (hz * 5)) 7075 val = hz * 5; 7076 7077 hdac_lock(sc); 7078 sc->poll_ival = val; 7079 hdac_unlock(sc); 7080 7081 return (err); 7082 } 7083 7084 static int 7085 sysctl_hdac_pindump(SYSCTL_HANDLER_ARGS) 7086 { 7087 struct hdac_softc *sc; 7088 struct hdac_codec *codec; 7089 struct hdac_devinfo *devinfo; 7090 struct hdac_widget *w; 7091 device_t dev; 7092 uint32_t res, pincap, delay; 7093 int codec_index, fg_index; 7094 int i, err, val; 7095 nid_t cad; 7096 7097 dev = oidp->oid_arg1; 7098 sc = device_get_softc(dev); 7099 if (sc == NULL) 7100 return (EINVAL); 7101 val = 0; 7102 err = sysctl_handle_int(oidp, &val, 0, req); 7103 if (err != 0 || req->newptr == NULL || val == 0) 7104 return (err); 7105 7106 /* XXX: Temporary. For debugging. */ 7107 if (val == 100) { 7108 hdac_suspend(dev); 7109 return (0); 7110 } else if (val == 101) { 7111 hdac_resume(dev); 7112 return (0); 7113 } 7114 7115 hdac_lock(sc); 7116 for (codec_index = 0; codec_index < HDAC_CODEC_MAX; codec_index++) { 7117 codec = sc->codecs[codec_index]; 7118 if (codec == NULL) 7119 continue; 7120 cad = codec->cad; 7121 for (fg_index = 0; fg_index < codec->num_fgs; fg_index++) { 7122 devinfo = &codec->fgs[fg_index]; 7123 if (devinfo->node_type != 7124 HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO) 7125 continue; 7126 7127 device_printf(dev, "Dumping AFG cad=%d nid=%d pins:\n", 7128 codec_index, devinfo->nid); 7129 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 7130 w = hdac_widget_get(devinfo, i); 7131 if (w == NULL || w->type != 7132 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 7133 continue; 7134 hdac_dump_pin_config(w, w->wclass.pin.config); 7135 pincap = w->wclass.pin.cap; 7136 device_printf(dev, " Caps: %2s %3s %2s %4s %4s", 7137 HDA_PARAM_PIN_CAP_INPUT_CAP(pincap)?"IN":"", 7138 HDA_PARAM_PIN_CAP_OUTPUT_CAP(pincap)?"OUT":"", 7139 HDA_PARAM_PIN_CAP_HEADPHONE_CAP(pincap)?"HP":"", 7140 HDA_PARAM_PIN_CAP_EAPD_CAP(pincap)?"EAPD":"", 7141 HDA_PARAM_PIN_CAP_VREF_CTRL(pincap)?"VREF":""); 7142 if (HDA_PARAM_PIN_CAP_IMP_SENSE_CAP(pincap) || 7143 HDA_PARAM_PIN_CAP_PRESENCE_DETECT_CAP(pincap)) { 7144 if (HDA_PARAM_PIN_CAP_TRIGGER_REQD(pincap)) { 7145 delay = 0; 7146 hdac_command(sc, 7147 HDA_CMD_SET_PIN_SENSE(cad, w->nid, 0), cad); 7148 do { 7149 res = hdac_command(sc, 7150 HDA_CMD_GET_PIN_SENSE(cad, w->nid), cad); 7151 if (res != 0x7fffffff && res != 0xffffffff) 7152 break; 7153 DELAY(10); 7154 } while (++delay < 10000); 7155 } else { 7156 delay = 0; 7157 res = hdac_command(sc, HDA_CMD_GET_PIN_SENSE(cad, 7158 w->nid), cad); 7159 } 7160 printf(" Sense: 0x%08x", res); 7161 if (delay > 0) 7162 printf(" delay %dus", delay * 10); 7163 } 7164 printf("\n"); 7165 } 7166 device_printf(dev, 7167 "NumGPIO=%d NumGPO=%d NumGPI=%d GPIWake=%d GPIUnsol=%d\n", 7168 HDA_PARAM_GPIO_COUNT_NUM_GPIO(devinfo->function.audio.gpio), 7169 HDA_PARAM_GPIO_COUNT_NUM_GPO(devinfo->function.audio.gpio), 7170 HDA_PARAM_GPIO_COUNT_NUM_GPI(devinfo->function.audio.gpio), 7171 HDA_PARAM_GPIO_COUNT_GPI_WAKE(devinfo->function.audio.gpio), 7172 HDA_PARAM_GPIO_COUNT_GPI_UNSOL(devinfo->function.audio.gpio)); 7173 if (HDA_PARAM_GPIO_COUNT_NUM_GPI(devinfo->function.audio.gpio) > 0) { 7174 device_printf(dev, " GPI:"); 7175 res = hdac_command(sc, 7176 HDA_CMD_GET_GPI_DATA(cad, devinfo->nid), cad); 7177 printf(" data=0x%08x", res); 7178 res = hdac_command(sc, 7179 HDA_CMD_GET_GPI_WAKE_ENABLE_MASK(cad, devinfo->nid), 7180 cad); 7181 printf(" wake=0x%08x", res); 7182 res = hdac_command(sc, 7183 HDA_CMD_GET_GPI_UNSOLICITED_ENABLE_MASK(cad, devinfo->nid), 7184 cad); 7185 printf(" unsol=0x%08x", res); 7186 res = hdac_command(sc, 7187 HDA_CMD_GET_GPI_STICKY_MASK(cad, devinfo->nid), cad); 7188 printf(" sticky=0x%08x\n", res); 7189 } 7190 if (HDA_PARAM_GPIO_COUNT_NUM_GPO(devinfo->function.audio.gpio) > 0) { 7191 device_printf(dev, " GPO:"); 7192 res = hdac_command(sc, 7193 HDA_CMD_GET_GPO_DATA(cad, devinfo->nid), cad); 7194 printf(" data=0x%08x\n", res); 7195 } 7196 if (HDA_PARAM_GPIO_COUNT_NUM_GPIO(devinfo->function.audio.gpio) > 0) { 7197 device_printf(dev, "GPIO:"); 7198 res = hdac_command(sc, 7199 HDA_CMD_GET_GPIO_DATA(cad, devinfo->nid), cad); 7200 printf(" data=0x%08x", res); 7201 res = hdac_command(sc, 7202 HDA_CMD_GET_GPIO_ENABLE_MASK(cad, devinfo->nid), cad); 7203 printf(" enable=0x%08x", res); 7204 res = hdac_command(sc, 7205 HDA_CMD_GET_GPIO_DIRECTION(cad, devinfo->nid), cad); 7206 printf(" direction=0x%08x\n", res); 7207 res = hdac_command(sc, 7208 HDA_CMD_GET_GPIO_WAKE_ENABLE_MASK(cad, devinfo->nid), cad); 7209 device_printf(dev, " wake=0x%08x", res); 7210 res = hdac_command(sc, 7211 HDA_CMD_GET_GPIO_UNSOLICITED_ENABLE_MASK(cad, devinfo->nid), 7212 cad); 7213 printf(" unsol=0x%08x", res); 7214 res = hdac_command(sc, 7215 HDA_CMD_GET_GPIO_STICKY_MASK(cad, devinfo->nid), cad); 7216 printf(" sticky=0x%08x\n", res); 7217 } 7218 } 7219 } 7220 hdac_unlock(sc); 7221 return (0); 7222 } 7223 #endif 7224 7225 static void 7226 hdac_attach2(void *arg) 7227 { 7228 struct hdac_codec *codec; 7229 struct hdac_softc *sc; 7230 struct hdac_audio_ctl *ctl; 7231 uint32_t quirks_on, quirks_off; 7232 int codec_index, fg_index; 7233 int i, dmaalloc = 0; 7234 struct hdac_devinfo *devinfo; 7235 7236 sc = (struct hdac_softc *)arg; 7237 7238 hdac_config_fetch(sc, &quirks_on, &quirks_off); 7239 7240 HDA_BOOTHVERBOSE( 7241 device_printf(sc->dev, "HDA Config: on=0x%08x off=0x%08x\n", 7242 quirks_on, quirks_off); 7243 ); 7244 7245 hdac_lock(sc); 7246 7247 /* Remove ourselves from the config hooks */ 7248 if (sc->intrhook.ich_func != NULL) { 7249 config_intrhook_disestablish(&sc->intrhook); 7250 sc->intrhook.ich_func = NULL; 7251 } 7252 7253 /* Start the corb and rirb engines */ 7254 HDA_BOOTHVERBOSE( 7255 device_printf(sc->dev, "Starting CORB Engine...\n"); 7256 ); 7257 hdac_corb_start(sc); 7258 HDA_BOOTHVERBOSE( 7259 device_printf(sc->dev, "Starting RIRB Engine...\n"); 7260 ); 7261 hdac_rirb_start(sc); 7262 7263 HDA_BOOTHVERBOSE( 7264 device_printf(sc->dev, 7265 "Enabling controller interrupt...\n"); 7266 ); 7267 HDAC_WRITE_4(&sc->mem, HDAC_GCTL, HDAC_READ_4(&sc->mem, HDAC_GCTL) | 7268 HDAC_GCTL_UNSOL); 7269 if (sc->polling == 0) { 7270 HDAC_WRITE_4(&sc->mem, HDAC_INTCTL, 7271 HDAC_INTCTL_CIE | HDAC_INTCTL_GIE); 7272 } else { 7273 callout_reset(&sc->poll_hdac, 1, hdac_poll_callback, sc); 7274 } 7275 DELAY(1000); 7276 7277 HDA_BOOTHVERBOSE( 7278 device_printf(sc->dev, 7279 "Scanning HDA codecs ...\n"); 7280 ); 7281 hdac_scan_codecs(sc); 7282 7283 for (codec_index = 0; codec_index < HDAC_CODEC_MAX; codec_index++) { 7284 codec = sc->codecs[codec_index]; 7285 if (codec == NULL) 7286 continue; 7287 for (fg_index = 0; fg_index < codec->num_fgs; fg_index++) { 7288 devinfo = &codec->fgs[fg_index]; 7289 HDA_BOOTVERBOSE( 7290 device_printf(sc->dev, "\n"); 7291 device_printf(sc->dev, 7292 "Processing %s FG cad=%d nid=%d...\n", 7293 (devinfo->node_type == HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO) ? "audio": 7294 (devinfo->node_type == HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_MODEM) ? "modem": 7295 "unknown", 7296 devinfo->codec->cad, devinfo->nid); 7297 ); 7298 if (devinfo->node_type != 7299 HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO) { 7300 HDA_BOOTHVERBOSE( 7301 device_printf(sc->dev, 7302 "Powering down...\n"); 7303 ); 7304 hdac_command(sc, 7305 HDA_CMD_SET_POWER_STATE(codec->cad, 7306 devinfo->nid, HDA_CMD_POWER_STATE_D3), 7307 codec->cad); 7308 continue; 7309 } 7310 7311 HDA_BOOTHVERBOSE( 7312 device_printf(sc->dev, "Powering up...\n"); 7313 ); 7314 hdac_powerup(devinfo); 7315 HDA_BOOTHVERBOSE( 7316 device_printf(sc->dev, "Parsing audio FG...\n"); 7317 ); 7318 hdac_audio_parse(devinfo); 7319 HDA_BOOTHVERBOSE( 7320 device_printf(sc->dev, "Parsing Ctls...\n"); 7321 ); 7322 hdac_audio_ctl_parse(devinfo); 7323 HDA_BOOTHVERBOSE( 7324 device_printf(sc->dev, "Parsing vendor patch...\n"); 7325 ); 7326 hdac_vendor_patch_parse(devinfo); 7327 devinfo->function.audio.quirks |= quirks_on; 7328 devinfo->function.audio.quirks &= ~quirks_off; 7329 7330 HDA_BOOTHVERBOSE( 7331 device_printf(sc->dev, "Disabling nonaudio...\n"); 7332 ); 7333 hdac_audio_disable_nonaudio(devinfo); 7334 HDA_BOOTHVERBOSE( 7335 device_printf(sc->dev, "Disabling useless...\n"); 7336 ); 7337 hdac_audio_disable_useless(devinfo); 7338 HDA_BOOTVERBOSE( 7339 device_printf(sc->dev, "Patched pins configuration:\n"); 7340 hdac_dump_pin_configs(devinfo); 7341 ); 7342 HDA_BOOTHVERBOSE( 7343 device_printf(sc->dev, "Parsing pin associations...\n"); 7344 ); 7345 hdac_audio_as_parse(devinfo); 7346 HDA_BOOTHVERBOSE( 7347 device_printf(sc->dev, "Building AFG tree...\n"); 7348 ); 7349 hdac_audio_build_tree(devinfo); 7350 HDA_BOOTHVERBOSE( 7351 device_printf(sc->dev, "Disabling unassociated " 7352 "widgets...\n"); 7353 ); 7354 hdac_audio_disable_unas(devinfo); 7355 HDA_BOOTHVERBOSE( 7356 device_printf(sc->dev, "Disabling nonselected " 7357 "inputs...\n"); 7358 ); 7359 hdac_audio_disable_notselected(devinfo); 7360 HDA_BOOTHVERBOSE( 7361 device_printf(sc->dev, "Disabling useless...\n"); 7362 ); 7363 hdac_audio_disable_useless(devinfo); 7364 HDA_BOOTHVERBOSE( 7365 device_printf(sc->dev, "Disabling " 7366 "crossassociatement connections...\n"); 7367 ); 7368 hdac_audio_disable_crossas(devinfo); 7369 HDA_BOOTHVERBOSE( 7370 device_printf(sc->dev, "Disabling useless...\n"); 7371 ); 7372 hdac_audio_disable_useless(devinfo); 7373 HDA_BOOTHVERBOSE( 7374 device_printf(sc->dev, "Binding associations to channels...\n"); 7375 ); 7376 hdac_audio_bind_as(devinfo); 7377 HDA_BOOTHVERBOSE( 7378 device_printf(sc->dev, "Assigning names to signal sources...\n"); 7379 ); 7380 hdac_audio_assign_names(devinfo); 7381 HDA_BOOTHVERBOSE( 7382 device_printf(sc->dev, "Assigning mixers to the tree...\n"); 7383 ); 7384 hdac_audio_assign_mixers(devinfo); 7385 HDA_BOOTHVERBOSE( 7386 device_printf(sc->dev, "Preparing pin controls...\n"); 7387 ); 7388 hdac_audio_prepare_pin_ctrl(devinfo); 7389 HDA_BOOTHVERBOSE( 7390 device_printf(sc->dev, "AFG commit...\n"); 7391 ); 7392 hdac_audio_commit(devinfo); 7393 HDA_BOOTHVERBOSE( 7394 device_printf(sc->dev, "Ctls commit...\n"); 7395 ); 7396 hdac_audio_ctl_commit(devinfo); 7397 HDA_BOOTHVERBOSE( 7398 device_printf(sc->dev, "HP switch init...\n"); 7399 ); 7400 hdac_hp_switch_init(devinfo); 7401 7402 if ((devinfo->function.audio.quirks & HDA_QUIRK_DMAPOS) && 7403 dmaalloc == 0) { 7404 if (hdac_dma_alloc(sc, &sc->pos_dma, 7405 (sc->num_iss + sc->num_oss + sc->num_bss) * 8) != 0) { 7406 HDA_BOOTVERBOSE( 7407 device_printf(sc->dev, "Failed to " 7408 "allocate DMA pos buffer " 7409 "(non-fatal)\n"); 7410 ); 7411 } else 7412 dmaalloc = 1; 7413 } 7414 7415 HDA_BOOTHVERBOSE( 7416 device_printf(sc->dev, "Creating PCM devices...\n"); 7417 ); 7418 hdac_create_pcms(devinfo); 7419 7420 HDA_BOOTVERBOSE( 7421 if (devinfo->function.audio.quirks != 0) { 7422 device_printf(sc->dev, "FG config/quirks:"); 7423 for (i = 0; i < HDAC_QUIRKS_TAB_LEN; i++) { 7424 if ((devinfo->function.audio.quirks & 7425 hdac_quirks_tab[i].value) == 7426 hdac_quirks_tab[i].value) 7427 printf(" %s", hdac_quirks_tab[i].key); 7428 } 7429 printf("\n"); 7430 } 7431 7432 device_printf(sc->dev, "\n"); 7433 device_printf(sc->dev, "+-------------------+\n"); 7434 device_printf(sc->dev, "| DUMPING HDA NODES |\n"); 7435 device_printf(sc->dev, "+-------------------+\n"); 7436 hdac_dump_nodes(devinfo); 7437 ); 7438 7439 HDA_BOOTHVERBOSE( 7440 device_printf(sc->dev, "\n"); 7441 device_printf(sc->dev, "+------------------------+\n"); 7442 device_printf(sc->dev, "| DUMPING HDA AMPLIFIERS |\n"); 7443 device_printf(sc->dev, "+------------------------+\n"); 7444 device_printf(sc->dev, "\n"); 7445 i = 0; 7446 while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) { 7447 device_printf(sc->dev, "%3d: nid %3d %s (%s) index %d", i, 7448 (ctl->widget != NULL) ? ctl->widget->nid : -1, 7449 (ctl->ndir == HDA_CTL_IN)?"in ":"out", 7450 (ctl->dir == HDA_CTL_IN)?"in ":"out", 7451 ctl->index); 7452 if (ctl->childwidget != NULL) 7453 printf(" cnid %3d", ctl->childwidget->nid); 7454 else 7455 printf(" "); 7456 printf(" ossmask=0x%08x\n", 7457 ctl->ossmask); 7458 device_printf(sc->dev, 7459 " mute: %d step: %3d size: %3d off: %3d%s\n", 7460 ctl->mute, ctl->step, ctl->size, ctl->offset, 7461 (ctl->enable == 0) ? " [DISABLED]" : 7462 ((ctl->ossmask == 0) ? " [UNUSED]" : "")); 7463 } 7464 ); 7465 } 7466 } 7467 hdac_unlock(sc); 7468 7469 HDA_BOOTVERBOSE( 7470 device_printf(sc->dev, "\n"); 7471 ); 7472 7473 bus_generic_attach(sc->dev); 7474 7475 #ifdef SND_DYNSYSCTL 7476 SYSCTL_ADD_PROC(device_get_sysctl_ctx(sc->dev), 7477 SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)), OID_AUTO, 7478 "polling", CTLTYPE_INT | CTLFLAG_RW, sc->dev, sizeof(sc->dev), 7479 sysctl_hdac_polling, "I", "Enable polling mode"); 7480 SYSCTL_ADD_PROC(device_get_sysctl_ctx(sc->dev), 7481 SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)), OID_AUTO, 7482 "polling_interval", CTLTYPE_INT | CTLFLAG_RW, sc->dev, 7483 sizeof(sc->dev), sysctl_hdac_polling_interval, "I", 7484 "Controller/Jack Sense polling interval (1-1000 ms)"); 7485 SYSCTL_ADD_PROC(device_get_sysctl_ctx(sc->dev), 7486 SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)), OID_AUTO, 7487 "pindump", CTLTYPE_INT | CTLFLAG_RW, sc->dev, sizeof(sc->dev), 7488 sysctl_hdac_pindump, "I", "Dump pin states/data"); 7489 #endif 7490 } 7491 7492 /**************************************************************************** 7493 * int hdac_suspend(device_t) 7494 * 7495 * Suspend and power down HDA bus and codecs. 7496 ****************************************************************************/ 7497 static int 7498 hdac_suspend(device_t dev) 7499 { 7500 struct hdac_softc *sc; 7501 struct hdac_codec *codec; 7502 struct hdac_devinfo *devinfo; 7503 int codec_index, fg_index, i; 7504 7505 HDA_BOOTHVERBOSE( 7506 device_printf(dev, "Suspend...\n"); 7507 ); 7508 7509 sc = device_get_softc(dev); 7510 hdac_lock(sc); 7511 7512 HDA_BOOTHVERBOSE( 7513 device_printf(dev, "Stop streams...\n"); 7514 ); 7515 for (i = 0; i < sc->num_chans; i++) { 7516 if (sc->chans[i].flags & HDAC_CHN_RUNNING) { 7517 sc->chans[i].flags |= HDAC_CHN_SUSPEND; 7518 hdac_channel_stop(sc, &sc->chans[i]); 7519 } 7520 } 7521 7522 for (codec_index = 0; codec_index < HDAC_CODEC_MAX; codec_index++) { 7523 codec = sc->codecs[codec_index]; 7524 if (codec == NULL) 7525 continue; 7526 for (fg_index = 0; fg_index < codec->num_fgs; fg_index++) { 7527 devinfo = &codec->fgs[fg_index]; 7528 HDA_BOOTHVERBOSE( 7529 device_printf(dev, 7530 "Power down FG" 7531 " cad=%d nid=%d to the D3 state...\n", 7532 codec->cad, devinfo->nid); 7533 ); 7534 hdac_command(sc, 7535 HDA_CMD_SET_POWER_STATE(codec->cad, 7536 devinfo->nid, HDA_CMD_POWER_STATE_D3), 7537 codec->cad); 7538 } 7539 } 7540 7541 HDA_BOOTHVERBOSE( 7542 device_printf(dev, "Reset controller...\n"); 7543 ); 7544 callout_stop(&sc->poll_hda); 7545 callout_stop(&sc->poll_hdac); 7546 callout_stop(&sc->poll_jack); 7547 hdac_reset(sc, 0); 7548 hdac_unlock(sc); 7549 taskqueue_drain(taskqueue_thread, &sc->unsolq_task); 7550 callout_drain(&sc->poll_hda); 7551 callout_drain(&sc->poll_hdac); 7552 callout_drain(&sc->poll_jack); 7553 7554 HDA_BOOTHVERBOSE( 7555 device_printf(dev, "Suspend done\n"); 7556 ); 7557 7558 return (0); 7559 } 7560 7561 /**************************************************************************** 7562 * int hdac_resume(device_t) 7563 * 7564 * Powerup and restore HDA bus and codecs state. 7565 ****************************************************************************/ 7566 static int 7567 hdac_resume(device_t dev) 7568 { 7569 struct hdac_softc *sc; 7570 struct hdac_codec *codec; 7571 struct hdac_devinfo *devinfo; 7572 int codec_index, fg_index, i; 7573 7574 HDA_BOOTHVERBOSE( 7575 device_printf(dev, "Resume...\n"); 7576 ); 7577 7578 sc = device_get_softc(dev); 7579 hdac_lock(sc); 7580 7581 /* Quiesce everything */ 7582 HDA_BOOTHVERBOSE( 7583 device_printf(dev, "Reset controller...\n"); 7584 ); 7585 hdac_reset(sc, 1); 7586 7587 /* Initialize the CORB and RIRB */ 7588 hdac_corb_init(sc); 7589 hdac_rirb_init(sc); 7590 7591 /* Start the corb and rirb engines */ 7592 HDA_BOOTHVERBOSE( 7593 device_printf(dev, "Starting CORB Engine...\n"); 7594 ); 7595 hdac_corb_start(sc); 7596 HDA_BOOTHVERBOSE( 7597 device_printf(dev, "Starting RIRB Engine...\n"); 7598 ); 7599 hdac_rirb_start(sc); 7600 7601 HDA_BOOTHVERBOSE( 7602 device_printf(dev, 7603 "Enabling controller interrupt...\n"); 7604 ); 7605 HDAC_WRITE_4(&sc->mem, HDAC_GCTL, HDAC_READ_4(&sc->mem, HDAC_GCTL) | 7606 HDAC_GCTL_UNSOL); 7607 if (sc->polling == 0) { 7608 HDAC_WRITE_4(&sc->mem, HDAC_INTCTL, 7609 HDAC_INTCTL_CIE | HDAC_INTCTL_GIE); 7610 } else { 7611 callout_reset(&sc->poll_hdac, 1, hdac_poll_callback, sc); 7612 } 7613 DELAY(1000); 7614 7615 for (codec_index = 0; codec_index < HDAC_CODEC_MAX; codec_index++) { 7616 codec = sc->codecs[codec_index]; 7617 if (codec == NULL) 7618 continue; 7619 for (fg_index = 0; fg_index < codec->num_fgs; fg_index++) { 7620 devinfo = &codec->fgs[fg_index]; 7621 if (devinfo->node_type != 7622 HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO) { 7623 HDA_BOOTHVERBOSE( 7624 device_printf(dev, 7625 "Power down unsupported non-audio FG" 7626 " cad=%d nid=%d to the D3 state...\n", 7627 codec->cad, devinfo->nid); 7628 ); 7629 hdac_command(sc, 7630 HDA_CMD_SET_POWER_STATE(codec->cad, 7631 devinfo->nid, HDA_CMD_POWER_STATE_D3), 7632 codec->cad); 7633 continue; 7634 } 7635 7636 HDA_BOOTHVERBOSE( 7637 device_printf(dev, 7638 "Power up audio FG cad=%d nid=%d...\n", 7639 devinfo->codec->cad, devinfo->nid); 7640 ); 7641 hdac_powerup(devinfo); 7642 HDA_BOOTHVERBOSE( 7643 device_printf(dev, "AFG commit...\n"); 7644 ); 7645 hdac_audio_commit(devinfo); 7646 HDA_BOOTHVERBOSE( 7647 device_printf(dev, "Ctls commit...\n"); 7648 ); 7649 hdac_audio_ctl_commit(devinfo); 7650 HDA_BOOTHVERBOSE( 7651 device_printf(dev, "HP switch init...\n"); 7652 ); 7653 hdac_hp_switch_init(devinfo); 7654 7655 hdac_unlock(sc); 7656 for (i = 0; i < devinfo->function.audio.num_devs; i++) { 7657 struct hdac_pcm_devinfo *pdevinfo = 7658 &devinfo->function.audio.devs[i]; 7659 HDA_BOOTHVERBOSE( 7660 device_printf(pdevinfo->dev, 7661 "OSS mixer reinitialization...\n"); 7662 ); 7663 if (mixer_reinit(pdevinfo->dev) == -1) 7664 device_printf(pdevinfo->dev, 7665 "unable to reinitialize the mixer\n"); 7666 } 7667 hdac_lock(sc); 7668 } 7669 } 7670 7671 HDA_BOOTHVERBOSE( 7672 device_printf(dev, "Start streams...\n"); 7673 ); 7674 for (i = 0; i < sc->num_chans; i++) { 7675 if (sc->chans[i].flags & HDAC_CHN_SUSPEND) { 7676 sc->chans[i].flags &= ~HDAC_CHN_SUSPEND; 7677 hdac_channel_start(sc, &sc->chans[i]); 7678 } 7679 } 7680 7681 hdac_unlock(sc); 7682 7683 HDA_BOOTHVERBOSE( 7684 device_printf(dev, "Resume done\n"); 7685 ); 7686 7687 return (0); 7688 } 7689 /**************************************************************************** 7690 * int hdac_detach(device_t) 7691 * 7692 * Detach and free up resources utilized by the hdac device. 7693 ****************************************************************************/ 7694 static int 7695 hdac_detach(device_t dev) 7696 { 7697 struct hdac_softc *sc; 7698 device_t *devlist; 7699 int i, devcount, error; 7700 7701 if ((error = device_get_children(dev, &devlist, &devcount)) != 0) 7702 return (error); 7703 for (i = 0; i < devcount; i++) { 7704 if ((error = device_delete_child(dev, devlist[i])) != 0) { 7705 free(devlist, M_TEMP); 7706 return (error); 7707 } 7708 } 7709 free(devlist, M_TEMP); 7710 7711 sc = device_get_softc(dev); 7712 hdac_release_resources(sc); 7713 7714 return (0); 7715 } 7716 7717 static int 7718 hdac_print_child(device_t dev, device_t child) 7719 { 7720 struct hdac_pcm_devinfo *pdevinfo = 7721 (struct hdac_pcm_devinfo *)device_get_ivars(child); 7722 int retval; 7723 7724 retval = bus_print_child_header(dev, child); 7725 retval += printf(" at cad %d nid %d", 7726 pdevinfo->devinfo->codec->cad, pdevinfo->devinfo->nid); 7727 retval += bus_print_child_footer(dev, child); 7728 7729 return (retval); 7730 } 7731 7732 static device_method_t hdac_methods[] = { 7733 /* device interface */ 7734 DEVMETHOD(device_probe, hdac_probe), 7735 DEVMETHOD(device_attach, hdac_attach), 7736 DEVMETHOD(device_detach, hdac_detach), 7737 DEVMETHOD(device_suspend, hdac_suspend), 7738 DEVMETHOD(device_resume, hdac_resume), 7739 /* Bus interface */ 7740 DEVMETHOD(bus_print_child, hdac_print_child), 7741 { 0, 0 } 7742 }; 7743 7744 static driver_t hdac_driver = { 7745 "hdac", 7746 hdac_methods, 7747 sizeof(struct hdac_softc), 7748 }; 7749 7750 static devclass_t hdac_devclass; 7751 7752 DRIVER_MODULE(snd_hda, pci, hdac_driver, hdac_devclass, 0, 0); 7753 MODULE_DEPEND(snd_hda, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER); 7754 MODULE_VERSION(snd_hda, 1); 7755 7756 static int 7757 hdac_pcm_probe(device_t dev) 7758 { 7759 struct hdac_pcm_devinfo *pdevinfo = 7760 (struct hdac_pcm_devinfo *)device_get_ivars(dev); 7761 char buf[128]; 7762 7763 snprintf(buf, sizeof(buf), "HDA %s PCM #%d %s", 7764 hdac_codec_name(pdevinfo->devinfo->codec), 7765 pdevinfo->index, 7766 pdevinfo->digital?"Digital":"Analog"); 7767 device_set_desc_copy(dev, buf); 7768 return (0); 7769 } 7770 7771 static int 7772 hdac_pcm_attach(device_t dev) 7773 { 7774 struct hdac_pcm_devinfo *pdevinfo = 7775 (struct hdac_pcm_devinfo *)device_get_ivars(dev); 7776 struct hdac_softc *sc = pdevinfo->devinfo->codec->sc; 7777 char status[SND_STATUSLEN]; 7778 int i; 7779 7780 pdevinfo->chan_size = pcm_getbuffersize(dev, 7781 HDA_BUFSZ_MIN, HDA_BUFSZ_DEFAULT, HDA_BUFSZ_MAX); 7782 7783 HDA_BOOTVERBOSE( 7784 device_printf(dev, "+--------------------------------------+\n"); 7785 device_printf(dev, "| DUMPING PCM Playback/Record Channels |\n"); 7786 device_printf(dev, "+--------------------------------------+\n"); 7787 hdac_dump_pcmchannels(pdevinfo); 7788 device_printf(dev, "\n"); 7789 device_printf(dev, "+--------------------------------+\n"); 7790 device_printf(dev, "| DUMPING Playback/Record Pathes |\n"); 7791 device_printf(dev, "+--------------------------------+\n"); 7792 hdac_dump_dac(pdevinfo); 7793 hdac_dump_adc(pdevinfo); 7794 hdac_dump_mix(pdevinfo); 7795 device_printf(dev, "\n"); 7796 device_printf(dev, "+-------------------------+\n"); 7797 device_printf(dev, "| DUMPING Volume Controls |\n"); 7798 device_printf(dev, "+-------------------------+\n"); 7799 hdac_dump_ctls(pdevinfo, "Master Volume", SOUND_MASK_VOLUME); 7800 hdac_dump_ctls(pdevinfo, "PCM Volume", SOUND_MASK_PCM); 7801 hdac_dump_ctls(pdevinfo, "CD Volume", SOUND_MASK_CD); 7802 hdac_dump_ctls(pdevinfo, "Microphone Volume", SOUND_MASK_MIC); 7803 hdac_dump_ctls(pdevinfo, "Microphone2 Volume", SOUND_MASK_MONITOR); 7804 hdac_dump_ctls(pdevinfo, "Line-in Volume", SOUND_MASK_LINE); 7805 hdac_dump_ctls(pdevinfo, "Speaker/Beep Volume", SOUND_MASK_SPEAKER); 7806 hdac_dump_ctls(pdevinfo, "Recording Level", SOUND_MASK_RECLEV); 7807 hdac_dump_ctls(pdevinfo, "Input Mix Level", SOUND_MASK_IMIX); 7808 hdac_dump_ctls(pdevinfo, NULL, 0); 7809 device_printf(dev, "\n"); 7810 ); 7811 7812 if (resource_int_value(device_get_name(dev), 7813 device_get_unit(dev), "blocksize", &i) == 0 && i > 0) { 7814 i &= HDA_BLK_ALIGN; 7815 if (i < HDA_BLK_MIN) 7816 i = HDA_BLK_MIN; 7817 pdevinfo->chan_blkcnt = pdevinfo->chan_size / i; 7818 i = 0; 7819 while (pdevinfo->chan_blkcnt >> i) 7820 i++; 7821 pdevinfo->chan_blkcnt = 1 << (i - 1); 7822 if (pdevinfo->chan_blkcnt < HDA_BDL_MIN) 7823 pdevinfo->chan_blkcnt = HDA_BDL_MIN; 7824 else if (pdevinfo->chan_blkcnt > HDA_BDL_MAX) 7825 pdevinfo->chan_blkcnt = HDA_BDL_MAX; 7826 } else 7827 pdevinfo->chan_blkcnt = HDA_BDL_DEFAULT; 7828 7829 /* 7830 * We don't register interrupt handler with snd_setup_intr 7831 * in pcm device. Mark pcm device as MPSAFE manually. 7832 */ 7833 pcm_setflags(dev, pcm_getflags(dev) | SD_F_MPSAFE); 7834 7835 HDA_BOOTHVERBOSE( 7836 device_printf(dev, "OSS mixer initialization...\n"); 7837 ); 7838 if (mixer_init(dev, &hdac_audio_ctl_ossmixer_class, pdevinfo) != 0) 7839 device_printf(dev, "Can't register mixer\n"); 7840 7841 HDA_BOOTHVERBOSE( 7842 device_printf(dev, "Registering PCM channels...\n"); 7843 ); 7844 if (pcm_register(dev, pdevinfo, (pdevinfo->play >= 0)?1:0, 7845 (pdevinfo->rec >= 0)?1:0) != 0) 7846 device_printf(dev, "Can't register PCM\n"); 7847 7848 pdevinfo->registered++; 7849 7850 if (pdevinfo->play >= 0) 7851 pcm_addchan(dev, PCMDIR_PLAY, &hdac_channel_class, pdevinfo); 7852 if (pdevinfo->rec >= 0) 7853 pcm_addchan(dev, PCMDIR_REC, &hdac_channel_class, pdevinfo); 7854 7855 snprintf(status, SND_STATUSLEN, "at cad %d nid %d on %s %s", 7856 pdevinfo->devinfo->codec->cad, pdevinfo->devinfo->nid, 7857 device_get_nameunit(sc->dev), PCM_KLDSTRING(snd_hda)); 7858 pcm_setstatus(dev, status); 7859 7860 return (0); 7861 } 7862 7863 static int 7864 hdac_pcm_detach(device_t dev) 7865 { 7866 struct hdac_pcm_devinfo *pdevinfo = 7867 (struct hdac_pcm_devinfo *)device_get_ivars(dev); 7868 int err; 7869 7870 if (pdevinfo->registered > 0) { 7871 err = pcm_unregister(dev); 7872 if (err != 0) 7873 return (err); 7874 } 7875 7876 return (0); 7877 } 7878 7879 static device_method_t hdac_pcm_methods[] = { 7880 /* device interface */ 7881 DEVMETHOD(device_probe, hdac_pcm_probe), 7882 DEVMETHOD(device_attach, hdac_pcm_attach), 7883 DEVMETHOD(device_detach, hdac_pcm_detach), 7884 { 0, 0 } 7885 }; 7886 7887 static driver_t hdac_pcm_driver = { 7888 "pcm", 7889 hdac_pcm_methods, 7890 PCM_SOFTC_SIZE, 7891 }; 7892 7893 DRIVER_MODULE(snd_hda_pcm, hdac, hdac_pcm_driver, pcm_devclass, 0, 0); 7894 7895