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