1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 27 /* 28 * audio810 Audio Driver 29 * 30 * The driver is primarily targeted at providing audio support for the 31 * W1100z and W2100z systems, which use the AMD 8111 audio core and 32 * the Realtek ALC 655 codec. The ALC 655 chip supports only fixed 48k 33 * sample rate. However, the audio core of AMD 8111 is completely 34 * compatible to the Intel ICHx chips (Intel 8x0 chipsets), so the 35 * driver can work for the ICHx. We only support the 48k maximum 36 * rate, since we only have a single PCM out channel. 37 * 38 * The AMD 8111 audio core, as an AC'97 controller, has independent 39 * channels for PCM in, PCM out, mic in, modem in, and modem out. 40 * The AC'97 controller is a PCI bus master with scatter/gather 41 * support. Each channel has a DMA engine. Currently, we use only 42 * the PCM in and PCM out channels. Each DMA engine uses one buffer 43 * descriptor list. And the buffer descriptor list is an array of up 44 * to 32 entries, each of which describes a data buffer. Each entry 45 * contains a pointer to a data buffer, control bits, and the length 46 * of the buffer being pointed to, where the length is expressed as 47 * the number of samples. This, combined with the 16-bit sample size, 48 * gives the actual physical length of the buffer. 49 * 50 * A workaround for the AD1980 and AD1985 codec: 51 * Most vendors connect the surr-out of the codecs to the line-out jack. 52 * So far we haven't found which vendors don't do that. So we assume that 53 * all vendors swap the surr-out and the line-out outputs. So we need swap 54 * the two outputs. But we still internally process the 55 * "ad198x-swap-output" property. If someday some vendors do not swap the 56 * outputs, we would set "ad198x-swap-output = 0" in the 57 * /kernel/drv/audio810.conf file, and unload and reload the audio810 58 * driver (or reboot). 59 * 60 * NOTE: 61 * This driver depends on the drv/audio and misc/ac97 62 * modules being loaded first. 63 */ 64 #include <sys/types.h> 65 #include <sys/modctl.h> 66 #include <sys/kmem.h> 67 #include <sys/conf.h> 68 #include <sys/ddi.h> 69 #include <sys/sunddi.h> 70 #include <sys/pci.h> 71 #include <sys/note.h> 72 #include <sys/audio/audio_driver.h> 73 #include <sys/audio/ac97.h> 74 #include "audio810.h" 75 76 /* 77 * Module linkage routines for the kernel 78 */ 79 static int audio810_ddi_attach(dev_info_t *, ddi_attach_cmd_t); 80 static int audio810_ddi_detach(dev_info_t *, ddi_detach_cmd_t); 81 static int audio810_ddi_quiesce(dev_info_t *); 82 83 /* 84 * Entry point routine prototypes 85 */ 86 static int audio810_open(void *, int, unsigned *, unsigned *, caddr_t *); 87 static void audio810_close(void *); 88 static int audio810_start(void *); 89 static void audio810_stop(void *); 90 static int audio810_format(void *); 91 static int audio810_channels(void *); 92 static int audio810_rate(void *); 93 static uint64_t audio810_count(void *); 94 static void audio810_sync(void *, unsigned); 95 static size_t audio810_qlen(void *); 96 97 static audio_engine_ops_t audio810_engine_ops = { 98 AUDIO_ENGINE_VERSION, 99 audio810_open, 100 audio810_close, 101 audio810_start, 102 audio810_stop, 103 audio810_count, 104 audio810_format, 105 audio810_channels, 106 audio810_rate, 107 audio810_sync, 108 audio810_qlen 109 }; 110 111 /* 112 * interrupt handler 113 */ 114 static uint_t audio810_intr(caddr_t); 115 116 /* 117 * Local Routine Prototypes 118 */ 119 static int audio810_attach(dev_info_t *); 120 static int audio810_resume(dev_info_t *); 121 static int audio810_detach(dev_info_t *); 122 static int audio810_suspend(dev_info_t *); 123 124 static int audio810_alloc_port(audio810_state_t *, int, uint8_t); 125 static void audio810_start_port(audio810_port_t *); 126 static void audio810_stop_port(audio810_port_t *); 127 static void audio810_reset_port(audio810_port_t *); 128 static void audio810_update_port(audio810_port_t *); 129 static int audio810_codec_sync(audio810_state_t *); 130 static void audio810_write_ac97(void *, uint8_t, uint16_t); 131 static uint16_t audio810_read_ac97(void *, uint8_t); 132 static int audio810_map_regs(dev_info_t *, audio810_state_t *); 133 static void audio810_unmap_regs(audio810_state_t *); 134 static void audio810_stop_dma(audio810_state_t *); 135 static int audio810_chip_init(audio810_state_t *); 136 static void audio810_destroy(audio810_state_t *); 137 138 /* 139 * Global variables, but used only by this file. 140 */ 141 142 /* driver name, so we don't have to call ddi_driver_name() or hard code strs */ 143 static char *audio810_name = I810_NAME; 144 145 146 /* 147 * DDI Structures 148 */ 149 150 /* Device operations structure */ 151 static struct dev_ops audio810_dev_ops = { 152 DEVO_REV, /* devo_rev */ 153 0, /* devo_refcnt */ 154 NULL, /* devo_getinfo */ 155 nulldev, /* devo_identify - obsolete */ 156 nulldev, /* devo_probe */ 157 audio810_ddi_attach, /* devo_attach */ 158 audio810_ddi_detach, /* devo_detach */ 159 nodev, /* devo_reset */ 160 NULL, /* devi_cb_ops */ 161 NULL, /* devo_bus_ops */ 162 NULL, /* devo_power */ 163 audio810_ddi_quiesce, /* devo_quiesce */ 164 }; 165 166 /* Linkage structure for loadable drivers */ 167 static struct modldrv audio810_modldrv = { 168 &mod_driverops, /* drv_modops */ 169 I810_MOD_NAME, /* drv_linkinfo */ 170 &audio810_dev_ops, /* drv_dev_ops */ 171 }; 172 173 /* Module linkage structure */ 174 static struct modlinkage audio810_modlinkage = { 175 MODREV_1, /* ml_rev */ 176 (void *)&audio810_modldrv, /* ml_linkage */ 177 NULL /* NULL terminates the list */ 178 }; 179 180 /* 181 * device access attributes for register mapping 182 */ 183 static struct ddi_device_acc_attr dev_attr = { 184 DDI_DEVICE_ATTR_V0, 185 DDI_STRUCTURE_LE_ACC, 186 DDI_STRICTORDER_ACC 187 }; 188 189 static struct ddi_device_acc_attr buf_attr = { 190 DDI_DEVICE_ATTR_V0, 191 DDI_STRUCTURE_LE_ACC, 192 DDI_STRICTORDER_ACC 193 }; 194 195 /* 196 * DMA attributes of buffer descriptor list 197 */ 198 static ddi_dma_attr_t bdlist_dma_attr = { 199 DMA_ATTR_V0, /* version */ 200 0, /* addr_lo */ 201 0xffffffff, /* addr_hi */ 202 0x0000ffff, /* count_max */ 203 8, /* align, BDL must be aligned on a 8-byte boundary */ 204 0x3c, /* burstsize */ 205 8, /* minxfer, set to the size of a BDlist entry */ 206 0x0000ffff, /* maxxfer */ 207 0x00000fff, /* seg, set to the RAM pagesize of intel platform */ 208 1, /* sgllen, there's no scatter-gather list */ 209 8, /* granular, set to the value of minxfer */ 210 0 /* flags, use virtual address */ 211 }; 212 213 /* 214 * DMA attributes of buffers to be used to receive/send audio data 215 */ 216 static ddi_dma_attr_t sample_buf_dma_attr = { 217 DMA_ATTR_V0, 218 0, /* addr_lo */ 219 0xffffffff, /* addr_hi */ 220 0x0001ffff, /* count_max */ 221 4, /* align, data buffer is aligned on a 4-byte boundary */ 222 0x3c, /* burstsize */ 223 4, /* minxfer, set to the size of a sample data */ 224 0x0001ffff, /* maxxfer */ 225 0x0001ffff, /* seg */ 226 1, /* sgllen, no scatter-gather */ 227 4, /* granular, set to the value of minxfer */ 228 0, /* flags, use virtual address */ 229 }; 230 231 /* 232 * _init() 233 * 234 * Description: 235 * Driver initialization, called when driver is first loaded. 236 * This is how access is initially given to all the static structures. 237 * 238 * Arguments: 239 * None 240 * 241 * Returns: 242 * mod_install() status, see mod_install(9f) 243 */ 244 int 245 _init(void) 246 { 247 int error; 248 249 audio_init_ops(&audio810_dev_ops, I810_NAME); 250 251 if ((error = mod_install(&audio810_modlinkage)) != 0) { 252 audio_fini_ops(&audio810_dev_ops); 253 } 254 255 return (error); 256 } 257 258 /* 259 * _fini() 260 * 261 * Description: 262 * Module de-initialization, called when the driver is to be unloaded. 263 * 264 * Arguments: 265 * None 266 * 267 * Returns: 268 * mod_remove() status, see mod_remove(9f) 269 */ 270 int 271 _fini(void) 272 { 273 int error; 274 275 if ((error = mod_remove(&audio810_modlinkage)) != 0) { 276 return (error); 277 } 278 279 /* clean up ops */ 280 audio_fini_ops(&audio810_dev_ops); 281 282 return (0); 283 } 284 285 /* 286 * _info() 287 * 288 * Description: 289 * Module information, returns information about the driver. 290 * 291 * Arguments: 292 * modinfo *modinfop Pointer to the opaque modinfo structure 293 * 294 * Returns: 295 * mod_info() status, see mod_info(9f) 296 */ 297 int 298 _info(struct modinfo *modinfop) 299 { 300 return (mod_info(&audio810_modlinkage, modinfop)); 301 } 302 303 304 /* ******************* Driver Entry Points ********************************* */ 305 306 /* 307 * audio810_ddi_attach() 308 * 309 * Description: 310 * Implements the DDI attach(9e) entry point. 311 * 312 * Arguments: 313 * dev_info_t *dip Pointer to the device's dev_info struct 314 * ddi_attach_cmd_t cmd Attach command 315 * 316 * Returns: 317 * DDI_SUCCESS The driver was initialized properly 318 * DDI_FAILURE The driver couldn't be initialized properly 319 */ 320 static int 321 audio810_ddi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) 322 { 323 switch (cmd) { 324 case DDI_ATTACH: 325 return (audio810_attach(dip)); 326 327 case DDI_RESUME: 328 return (audio810_resume(dip)); 329 } 330 return (DDI_FAILURE); 331 } 332 333 /* 334 * audio810_ddi_detach() 335 * 336 * Description: 337 * Implements the detach(9e) entry point. 338 * 339 * Arguments: 340 * dev_info_t *dip Pointer to the device's dev_info struct 341 * ddi_detach_cmd_t cmd Detach command 342 * 343 * Returns: 344 * DDI_SUCCESS The driver was detached 345 * DDI_FAILURE The driver couldn't be detached 346 */ 347 static int 348 audio810_ddi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd) 349 { 350 switch (cmd) { 351 case DDI_DETACH: 352 return (audio810_detach(dip)); 353 354 case DDI_SUSPEND: 355 return (audio810_suspend(dip)); 356 } 357 return (DDI_FAILURE); 358 } 359 360 /* 361 * audio810_ddi_quiesce() 362 * 363 * Description: 364 * Implements the quiesce(9e) entry point. 365 * 366 * Arguments: 367 * dev_info_t *dip Pointer to the device's dev_info struct 368 * 369 * Returns: 370 * DDI_SUCCESS The driver was quiesced 371 * DDI_FAILURE The driver couldn't be quiesced 372 */ 373 static int 374 audio810_ddi_quiesce(dev_info_t *dip) 375 { 376 audio810_state_t *statep; 377 378 if ((statep = ddi_get_driver_private(dip)) == NULL) 379 return (DDI_FAILURE); 380 381 audio810_stop_dma(statep); 382 return (DDI_SUCCESS); 383 } 384 385 /* 386 * audio810_intr() 387 * 388 * Description: 389 * Interrupt service routine for both play and record. For play we 390 * get the next buffers worth of audio. For record we send it on to 391 * the mixer. 392 * 393 * Each of buffer descriptor has a field IOC(interrupt on completion) 394 * When both this and the IOC bit of correspondent dma control register 395 * is set, it means that the controller should issue an interrupt upon 396 * completion of this buffer. 397 * (AMD 8111 hypertransport I/O hub data sheet. 3.8.3 page 71) 398 * 399 * Arguments: 400 * caddr_t arg Pointer to the interrupting device's state 401 * structure 402 * 403 * Returns: 404 * DDI_INTR_CLAIMED Interrupt claimed and processed 405 * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored 406 */ 407 static uint_t 408 audio810_intr(caddr_t arg) 409 { 410 audio810_state_t *statep; 411 uint16_t gsr; 412 413 statep = (void *)arg; 414 mutex_enter(&statep->inst_lock); 415 416 if (statep->suspended) { 417 mutex_exit(&statep->inst_lock); 418 return (DDI_INTR_UNCLAIMED); 419 } 420 421 gsr = I810_BM_GET32(I810_REG_GSR); 422 423 /* check if device is interrupting */ 424 if ((gsr & I810_GSR_USE_INTR) == 0) { 425 mutex_exit(&statep->inst_lock); 426 return (DDI_INTR_UNCLAIMED); 427 } 428 429 for (int pnum = 0; pnum < I810_NUM_PORTS; pnum++) { 430 audio810_port_t *port; 431 uint8_t regoff, index; 432 433 port = statep->ports[pnum]; 434 if (port == NULL) { 435 continue; 436 } 437 regoff = port->regoff; 438 439 if (!(I810_BM_GET8(port->stsoff) & I810_BM_SR_BCIS)) 440 continue; 441 442 /* update the LVI -- we just set it to the current value - 1 */ 443 index = I810_BM_GET8(regoff + I810_OFFSET_CIV); 444 index = (index - 1) % I810_BD_NUMS; 445 446 I810_BM_PUT8(regoff + I810_OFFSET_LVI, index); 447 448 /* clear any interrupt */ 449 I810_BM_PUT8(port->stsoff, 450 I810_BM_SR_LVBCI | I810_BM_SR_BCIS | I810_BM_SR_FIFOE); 451 } 452 453 /* update the kernel interrupt statistics */ 454 if (statep->ksp) { 455 I810_KIOP(statep)->intrs[KSTAT_INTR_HARD]++; 456 } 457 458 mutex_exit(&statep->inst_lock); 459 460 /* notify the framework */ 461 if (gsr & I810_GSR_INTR_PIN) { 462 audio_engine_produce(statep->ports[I810_PCM_IN]->engine); 463 } 464 if (gsr & I810_GSR_INTR_POUT) { 465 audio_engine_consume(statep->ports[I810_PCM_OUT]->engine); 466 } 467 468 return (DDI_INTR_CLAIMED); 469 } 470 471 /* 472 * audio810_open() 473 * 474 * Description: 475 * Opens a DMA engine for use. 476 * 477 * Arguments: 478 * void *arg The DMA engine to set up 479 * int flag Open flags 480 * unsigned *fragfrp Receives number of frames per fragment 481 * unsigned *nfragsp Receives number of fragments 482 * caddr_t *bufp Receives kernel data buffer 483 * 484 * Returns: 485 * 0 on success 486 * errno on failure 487 */ 488 static int 489 audio810_open(void *arg, int flag, unsigned *fragfrp, unsigned *nfragsp, 490 caddr_t *bufp) 491 { 492 audio810_port_t *port = arg; 493 494 _NOTE(ARGUNUSED(flag)); 495 496 port->started = B_FALSE; 497 port->count = 0; 498 *fragfrp = port->fragfr; 499 *nfragsp = port->nfrag; 500 *bufp = port->samp_kaddr; 501 502 mutex_enter(&port->statep->inst_lock); 503 audio810_reset_port(port); 504 mutex_exit(&port->statep->inst_lock); 505 506 return (0); 507 } 508 509 /* 510 * audio810_close() 511 * 512 * Description: 513 * Closes an audio DMA engine that was previously opened. Since 514 * nobody is using it, we take this opportunity to possibly power 515 * down the entire device. 516 * 517 * Arguments: 518 * void *arg The DMA engine to shut down 519 */ 520 static void 521 audio810_close(void *arg) 522 { 523 audio810_port_t *port = arg; 524 audio810_state_t *statep = port->statep; 525 526 mutex_enter(&statep->inst_lock); 527 audio810_stop_port(port); 528 port->started = B_FALSE; 529 mutex_exit(&statep->inst_lock); 530 } 531 532 /* 533 * audio810_stop() 534 * 535 * Description: 536 * This is called by the framework to stop a port that is 537 * transferring data. 538 * 539 * Arguments: 540 * void *arg The DMA engine to stop 541 */ 542 static void 543 audio810_stop(void *arg) 544 { 545 audio810_port_t *port = arg; 546 audio810_state_t *statep = port->statep; 547 548 mutex_enter(&statep->inst_lock); 549 if (port->started) { 550 audio810_stop_port(port); 551 } 552 port->started = B_FALSE; 553 mutex_exit(&statep->inst_lock); 554 } 555 556 /* 557 * audio810_start() 558 * 559 * Description: 560 * This is called by the framework to start a port transferring data. 561 * 562 * Arguments: 563 * void *arg The DMA engine to start 564 * 565 * Returns: 566 * 0 on success (never fails, errno if it did) 567 */ 568 static int 569 audio810_start(void *arg) 570 { 571 audio810_port_t *port = arg; 572 audio810_state_t *statep = port->statep; 573 574 mutex_enter(&statep->inst_lock); 575 if (!port->started) { 576 audio810_start_port(port); 577 port->started = B_TRUE; 578 } 579 mutex_exit(&statep->inst_lock); 580 return (0); 581 } 582 583 /* 584 * audio810_format() 585 * 586 * Description: 587 * This is called by the framework to query the format of the device. 588 * 589 * Arguments: 590 * void *arg The DMA engine to query 591 * 592 * Returns: 593 * Format of the device (fixed at AUDIO_FORMAT_S16_LE) 594 */ 595 static int 596 audio810_format(void *arg) 597 { 598 _NOTE(ARGUNUSED(arg)); 599 600 return (AUDIO_FORMAT_S16_LE); 601 } 602 603 /* 604 * audio810_channels() 605 * 606 * Description: 607 * This is called by the framework to query the num channels of 608 * the device. 609 * 610 * Arguments: 611 * void *arg The DMA engine to query 612 * 613 * Returns: 614 * 0 number of channels for device 615 */ 616 static int 617 audio810_channels(void *arg) 618 { 619 audio810_port_t *port = arg; 620 621 return (port->nchan); 622 } 623 624 /* 625 * audio810_rate() 626 * 627 * Description: 628 * This is called by the framework to query the rate of the device. 629 * 630 * Arguments: 631 * void *arg The DMA engine to query 632 * 633 * Returns: 634 * Rate of device (fixed at 48000 Hz) 635 */ 636 static int 637 audio810_rate(void *arg) 638 { 639 _NOTE(ARGUNUSED(arg)); 640 641 return (48000); 642 } 643 644 /* 645 * audio810_count() 646 * 647 * Description: 648 * This is called by the framework to get the engine's frame counter 649 * 650 * Arguments: 651 * void *arg The DMA engine to query 652 * 653 * Returns: 654 * frame count for current engine 655 */ 656 static uint64_t 657 audio810_count(void *arg) 658 { 659 audio810_port_t *port = arg; 660 audio810_state_t *statep = port->statep; 661 uint64_t val; 662 uint16_t picb; 663 uint64_t count; 664 uint8_t nchan; 665 666 mutex_enter(&statep->inst_lock); 667 audio810_update_port(port); 668 count = port->count; 669 picb = port->picb; 670 nchan = port->nchan; 671 mutex_exit(&statep->inst_lock); 672 673 if (statep->quirk == QUIRK_SIS7012) { 674 val = count + picb / (2 * nchan); 675 } else { 676 val = count + (picb / nchan); 677 } 678 679 return (val); 680 } 681 682 /* 683 * audio810_sync() 684 * 685 * Description: 686 * This is called by the framework to synchronize DMA caches. 687 * 688 * Arguments: 689 * void *arg The DMA engine to sync 690 */ 691 static void 692 audio810_sync(void *arg, unsigned nframes) 693 { 694 audio810_port_t *port = arg; 695 _NOTE(ARGUNUSED(nframes)); 696 697 (void) ddi_dma_sync(port->samp_dmah, 0, 0, port->sync_dir); 698 } 699 700 /* 701 * audio810_qlen() 702 * 703 * Description: 704 * This is called by the framework to determine on-device queue length. 705 * 706 * Arguments: 707 * void *arg The DMA engine to query 708 * 709 * Returns: 710 * hardware queue length not reported by count (0 for this device) 711 */ 712 static size_t 713 audio810_qlen(void *arg) 714 { 715 _NOTE(ARGUNUSED(arg)); 716 return (0); 717 } 718 719 /* *********************** Local Routines *************************** */ 720 721 /* 722 * audio810_start_port() 723 * 724 * Description: 725 * This routine starts the DMA engine. 726 * 727 * Arguments: 728 * audio810_port_t *port Port of DMA engine to start. 729 */ 730 static void 731 audio810_start_port(audio810_port_t *port) 732 { 733 audio810_state_t *statep = port->statep; 734 uint8_t cr; 735 736 ASSERT(mutex_owned(&statep->inst_lock)); 737 738 /* if suspended, then do nothing else */ 739 if (statep->suspended) { 740 return; 741 } 742 743 cr = I810_BM_GET8(port->regoff + I810_OFFSET_CR); 744 cr |= I810_BM_CR_IOCE; 745 I810_BM_PUT8(port->regoff + I810_OFFSET_CR, cr); 746 cr |= I810_BM_CR_RUN; 747 I810_BM_PUT8(port->regoff + I810_OFFSET_CR, cr); 748 } 749 750 /* 751 * audio810_stop_port() 752 * 753 * Description: 754 * This routine stops the DMA engine. 755 * 756 * Arguments: 757 * audio810_port_t *port Port of DMA engine to stop. 758 */ 759 static void 760 audio810_stop_port(audio810_port_t *port) 761 { 762 audio810_state_t *statep = port->statep; 763 uint8_t cr; 764 765 ASSERT(mutex_owned(&statep->inst_lock)); 766 767 /* if suspended, then do nothing else */ 768 if (statep->suspended) { 769 return; 770 } 771 772 cr = I810_BM_GET8(port->regoff + I810_OFFSET_CR); 773 cr &= ~I810_BM_CR_RUN; 774 I810_BM_PUT8(port->regoff + I810_OFFSET_CR, cr); 775 } 776 777 /* 778 * audio810_reset_port() 779 * 780 * Description: 781 * This routine resets the DMA engine pareparing it for work. 782 * 783 * Arguments: 784 * audio810_port_t *port Port of DMA engine to reset. 785 */ 786 static void 787 audio810_reset_port(audio810_port_t *port) 788 { 789 audio810_state_t *statep = port->statep; 790 uint32_t gcr; 791 792 ASSERT(mutex_owned(&statep->inst_lock)); 793 794 port->civ = 0; 795 port->picb = 0; 796 797 if (statep->suspended) 798 return; 799 800 /* 801 * Make sure we put once in stereo, to ensure we always start from 802 * front left. 803 */ 804 if (port->num == I810_PCM_OUT) { 805 806 if (statep->quirk == QUIRK_SIS7012) { 807 /* 808 * SiS 7012 needs its own special multichannel config. 809 */ 810 gcr = I810_BM_GET32(I810_REG_GCR); 811 gcr &= ~I810_GCR_SIS_CHANNELS_MASK; 812 I810_BM_PUT32(I810_REG_GCR, gcr); 813 delay(drv_usectohz(50000)); /* 50 msec */ 814 815 switch (statep->maxch) { 816 case 2: 817 gcr |= I810_GCR_SIS_2_CHANNELS; 818 break; 819 case 4: 820 gcr |= I810_GCR_SIS_4_CHANNELS; 821 break; 822 case 6: 823 gcr |= I810_GCR_SIS_6_CHANNELS; 824 break; 825 } 826 I810_BM_PUT32(I810_REG_GCR, gcr); 827 delay(drv_usectohz(50000)); /* 50 msec */ 828 829 /* 830 * SiS 7012 has special unmute bit. 831 */ 832 I810_BM_PUT8(I810_REG_SISCTL, I810_SISCTL_UNMUTE); 833 834 } else { 835 836 /* 837 * All other devices work the same. 838 */ 839 gcr = I810_BM_GET32(I810_REG_GCR); 840 gcr &= ~I810_GCR_CHANNELS_MASK; 841 842 I810_BM_PUT32(I810_REG_GCR, gcr); 843 delay(drv_usectohz(50000)); /* 50 msec */ 844 845 switch (statep->maxch) { 846 case 2: 847 gcr |= I810_GCR_2_CHANNELS; 848 break; 849 case 4: 850 gcr |= I810_GCR_4_CHANNELS; 851 break; 852 case 6: 853 gcr |= I810_GCR_6_CHANNELS; 854 break; 855 } 856 I810_BM_PUT32(I810_REG_GCR, gcr); 857 delay(drv_usectohz(50000)); /* 50 msec */ 858 } 859 } 860 861 /* 862 * Perform full reset of the engine, but leave it turned off. 863 */ 864 I810_BM_PUT8(port->regoff + I810_OFFSET_CR, 0); 865 I810_BM_PUT8(port->regoff + I810_OFFSET_CR, I810_BM_CR_RST); 866 867 /* program the offset of the BD list */ 868 I810_BM_PUT32(port->regoff + I810_OFFSET_BD_BASE, port->bdl_paddr); 869 870 /* we set the last index to the full count -- all buffers are valid */ 871 I810_BM_PUT8(port->regoff + I810_OFFSET_LVI, I810_BD_NUMS - 1); 872 } 873 874 /* 875 * audio810_update_port() 876 * 877 * Description: 878 * This routine updates the ports frame counter from hardware, and 879 * gracefully handles wraps. 880 * 881 * Arguments: 882 * audio810_port_t *port The port to update. 883 */ 884 static void 885 audio810_update_port(audio810_port_t *port) 886 { 887 audio810_state_t *statep = port->statep; 888 uint8_t regoff = port->regoff; 889 uint8_t civ; 890 uint16_t picb; 891 unsigned n; 892 893 if (statep->suspended) { 894 civ = 0; 895 picb = 0; 896 } else { 897 /* 898 * We read the position counters, but we're careful to avoid 899 * the situation where the position counter resets at the end 900 * of a buffer. 901 */ 902 for (int i = 0; i < 2; i++) { 903 civ = I810_BM_GET8(regoff + I810_OFFSET_CIV); 904 picb = I810_BM_GET16(port->picboff); 905 if (I810_BM_GET8(regoff + I810_OFFSET_CIV) == civ) { 906 /* 907 * Chip did not start a new index, 908 * so the picb is valid. 909 */ 910 break; 911 } 912 } 913 914 if (civ >= port->civ) { 915 n = civ - port->civ; 916 } else { 917 n = civ + (I810_BD_NUMS - port->civ); 918 } 919 port->count += (n * port->fragfr); 920 } 921 port->civ = civ; 922 port->picb = picb; 923 } 924 925 /* 926 * audio810_attach() 927 * 928 * Description: 929 * Attach an instance of the audio810 driver. This routine does the 930 * device dependent attach tasks, and registers with the audio framework. 931 * 932 * Arguments: 933 * dev_info_t *dip Pointer to the device's dev_info struct 934 * ddi_attach_cmd_t cmd Attach command 935 * 936 * Returns: 937 * DDI_SUCCESS The driver was initialized properly 938 * DDI_FAILURE The driver couldn't be initialized properly 939 */ 940 static int 941 audio810_attach(dev_info_t *dip) 942 { 943 uint16_t cmdreg; 944 audio810_state_t *statep; 945 audio_dev_t *adev; 946 ddi_acc_handle_t pcih; 947 uint32_t devid; 948 uint32_t gsr; 949 const char *name; 950 const char *vers; 951 uint8_t nch; 952 int maxch; 953 954 /* we don't support high level interrupts in the driver */ 955 if (ddi_intr_hilevel(dip, 0) != 0) { 956 cmn_err(CE_WARN, "!%s: unsupported high level interrupt", 957 audio810_name); 958 return (DDI_FAILURE); 959 } 960 961 /* allocate the soft state structure */ 962 statep = kmem_zalloc(sizeof (*statep), KM_SLEEP); 963 ddi_set_driver_private(dip, statep); 964 965 /* get iblock cookie information */ 966 if (ddi_get_iblock_cookie(dip, 0, &statep->iblock) != DDI_SUCCESS) { 967 cmn_err(CE_WARN, "!%s: cannot get iblock cookie", 968 audio810_name); 969 kmem_free(statep, sizeof (*statep)); 970 return (DDI_FAILURE); 971 } 972 mutex_init(&statep->inst_lock, NULL, MUTEX_DRIVER, statep->iblock); 973 mutex_init(&statep->ac_lock, NULL, MUTEX_DRIVER, statep->iblock); 974 975 if ((adev = audio_dev_alloc(dip, 0)) == NULL) { 976 cmn_err(CE_WARN, "!%s: unable to allocate audio dev", 977 audio810_name); 978 goto error; 979 } 980 statep->adev = adev; 981 statep->dip = dip; 982 983 /* map in the registers, allocate DMA buffers, etc. */ 984 if (audio810_map_regs(dip, statep) != DDI_SUCCESS) { 985 audio_dev_warn(adev, "couldn't map registers"); 986 goto error; 987 } 988 989 /* set PCI command register */ 990 if (pci_config_setup(dip, &pcih) != DDI_SUCCESS) { 991 audio_dev_warn(adev, "pci conf mapping failed"); 992 goto error; 993 } 994 cmdreg = pci_config_get16(pcih, PCI_CONF_COMM); 995 pci_config_put16(pcih, PCI_CONF_COMM, 996 cmdreg | PCI_COMM_IO | PCI_COMM_MAE | PCI_COMM_ME); 997 devid = pci_config_get16(pcih, PCI_CONF_VENID); 998 devid <<= 16; 999 devid |= pci_config_get16(pcih, PCI_CONF_DEVID); 1000 pci_config_teardown(&pcih); 1001 1002 name = "Unknown AC'97"; 1003 vers = ""; 1004 1005 statep->quirk = QUIRK_NONE; 1006 switch (devid) { 1007 case 0x80862415: 1008 name = "Intel AC'97"; 1009 vers = "ICH"; 1010 break; 1011 case 0x80862425: 1012 name = "Intel AC'97"; 1013 vers = "ICH0"; 1014 break; 1015 case 0x80867195: 1016 name = "Intel AC'97"; 1017 vers = "440MX"; 1018 break; 1019 case 0x80862445: 1020 name = "Intel AC'97"; 1021 vers = "ICH2"; 1022 break; 1023 case 0x80862485: 1024 name = "Intel AC'97"; 1025 vers = "ICH3"; 1026 break; 1027 case 0x808624C5: 1028 name = "Intel AC'97"; 1029 vers = "ICH4"; 1030 break; 1031 case 0x808624D5: 1032 name = "Intel AC'97"; 1033 vers = "ICH5"; 1034 break; 1035 case 0x8086266E: 1036 name = "Intel AC'97"; 1037 vers = "ICH6"; 1038 break; 1039 case 0x808627DE: 1040 name = "Intel AC'97"; 1041 vers = "ICH7"; 1042 break; 1043 case 0x808625A6: 1044 name = "Intel AC'97"; 1045 vers = "6300ESB"; 1046 break; 1047 case 0x80862698: 1048 name = "Intel AC'97"; 1049 vers = "ESB2"; 1050 break; 1051 case 0x10397012: 1052 name = "SiS AC'97"; 1053 vers = "7012"; 1054 statep->quirk = QUIRK_SIS7012; 1055 break; 1056 case 0x10de01b1: /* nForce */ 1057 name = "NVIDIA AC'97"; 1058 vers = "MCP1"; 1059 break; 1060 case 0x10de006a: /* nForce 2 */ 1061 name = "NVIDIA AC'97"; 1062 vers = "MCP2"; 1063 break; 1064 case 0x10de00da: /* nForce 3 */ 1065 name = "NVIDIA AC'97"; 1066 vers = "MCP3"; 1067 break; 1068 case 0x10de00ea: 1069 name = "NVIDIA AC'97"; 1070 vers = "CK8S"; 1071 break; 1072 case 0x10de0059: 1073 name = "NVIDIA AC'97"; 1074 vers = "CK804"; 1075 break; 1076 case 0x10de008a: 1077 name = "NVIDIA AC'97"; 1078 vers = "CK8"; 1079 break; 1080 case 0x10de003a: /* nForce 4 */ 1081 name = "NVIDIA AC'97"; 1082 vers = "MCP4"; 1083 break; 1084 case 0x10de026b: 1085 name = "NVIDIA AC'97"; 1086 vers = "MCP51"; 1087 break; 1088 case 0x1022746d: 1089 name = "AMD AC'97"; 1090 vers = "8111"; 1091 break; 1092 case 0x10227445: 1093 name = "AMD AC'97"; 1094 vers = "AMD768"; 1095 break; 1096 } 1097 /* set device information */ 1098 audio_dev_set_description(adev, name); 1099 audio_dev_set_version(adev, vers); 1100 1101 /* initialize audio controller and AC97 codec */ 1102 if (audio810_chip_init(statep) != DDI_SUCCESS) { 1103 audio_dev_warn(adev, "failed to init chip"); 1104 goto error; 1105 } 1106 1107 /* allocate ac97 handle */ 1108 statep->ac97 = ac97_alloc(dip, audio810_read_ac97, audio810_write_ac97, 1109 statep); 1110 if (statep->ac97 == NULL) { 1111 audio_dev_warn(adev, "failed to allocate ac97 handle"); 1112 goto error; 1113 } 1114 1115 /* initialize the AC'97 part */ 1116 if (ac97_init(statep->ac97, adev) != DDI_SUCCESS) { 1117 audio_dev_warn(adev, "ac'97 initialization failed"); 1118 goto error; 1119 } 1120 1121 /* 1122 * Override "max-channels" property to prevent configuration 1123 * of 4 or 6 (or possibly even 8!) channel audio. The default 1124 * is to support as many channels as the hardware can do. 1125 * 1126 * (Hmmm... perhaps this should be driven in the common 1127 * framework. The framework could even offer simplistic upmix 1128 * and downmix for various standard configs.) 1129 */ 1130 maxch = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, 1131 "max-channels", ac97_num_channels(statep->ac97)); 1132 if (maxch < 2) { 1133 maxch = 2; 1134 } 1135 1136 gsr = I810_BM_GET32(I810_REG_GSR); 1137 if (gsr & I810_GSR_CAP6CH) { 1138 nch = 6; 1139 } else if (gsr & I810_GSR_CAP4CH) { 1140 nch = 4; 1141 } else { 1142 nch = 2; 1143 } 1144 1145 statep->maxch = (uint8_t)min(nch, maxch); 1146 statep->maxch &= ~1; 1147 1148 /* allocate port structures */ 1149 if ((audio810_alloc_port(statep, I810_PCM_OUT, statep->maxch) != 1150 DDI_SUCCESS) || 1151 (audio810_alloc_port(statep, I810_PCM_IN, 2) != DDI_SUCCESS)) { 1152 goto error; 1153 } 1154 1155 /* set up kernel statistics */ 1156 if ((statep->ksp = kstat_create(I810_NAME, ddi_get_instance(dip), 1157 I810_NAME, "controller", KSTAT_TYPE_INTR, 1, 1158 KSTAT_FLAG_PERSISTENT)) != NULL) { 1159 kstat_install(statep->ksp); 1160 } 1161 1162 /* set up the interrupt handler */ 1163 if (ddi_add_intr(dip, 0, &statep->iblock, 1164 NULL, audio810_intr, (caddr_t)statep) != DDI_SUCCESS) { 1165 audio_dev_warn(adev, "bad interrupt specification"); 1166 goto error; 1167 } 1168 statep->intr_added = B_TRUE; 1169 1170 if (audio_dev_register(adev) != DDI_SUCCESS) { 1171 audio_dev_warn(adev, "unable to register with framework"); 1172 goto error; 1173 } 1174 1175 ddi_report_dev(dip); 1176 1177 return (DDI_SUCCESS); 1178 1179 error: 1180 audio810_destroy(statep); 1181 1182 return (DDI_FAILURE); 1183 } 1184 1185 1186 /* 1187 * audio810_resume() 1188 * 1189 * Description: 1190 * Resume operation of the device after sleeping or hibernating. 1191 * Note that this should never fail, even if hardware goes wonky, 1192 * because the current PM framework will panic if it does. 1193 * 1194 * Arguments: 1195 * dev_info_t *dip Pointer to the device's dev_info struct 1196 * 1197 * Returns: 1198 * DDI_SUCCESS The driver was resumed. 1199 */ 1200 static int 1201 audio810_resume(dev_info_t *dip) 1202 { 1203 audio810_state_t *statep; 1204 audio_dev_t *adev; 1205 1206 /* this should always be valid */ 1207 statep = ddi_get_driver_private(dip); 1208 adev = statep->adev; 1209 1210 ASSERT(statep != NULL); 1211 ASSERT(dip == statep->dip); 1212 1213 /* Restore the audio810 chip's state */ 1214 if (audio810_chip_init(statep) != DDI_SUCCESS) { 1215 /* 1216 * Note that PM gurus say we should return 1217 * success here. Failure of audio shouldn't 1218 * be considered FATAL to the system. The 1219 * upshot is that audio will not progress. 1220 */ 1221 audio_dev_warn(adev, "DDI_RESUME failed to init chip"); 1222 return (DDI_SUCCESS); 1223 } 1224 1225 /* allow ac97 operations again */ 1226 ac97_resume(statep->ac97); 1227 1228 mutex_enter(&statep->inst_lock); 1229 1230 ASSERT(statep->suspended); 1231 statep->suspended = B_FALSE; 1232 1233 for (int i = 0; i < I810_NUM_PORTS; i++) { 1234 1235 audio810_port_t *port = statep->ports[i]; 1236 1237 if (port != NULL) { 1238 /* reset framework DMA engine buffer */ 1239 if (port->engine != NULL) { 1240 audio_engine_reset(port->engine); 1241 } 1242 1243 /* reset and initialize hardware ports */ 1244 audio810_reset_port(port); 1245 if (port->started) { 1246 audio810_start_port(port); 1247 } else { 1248 audio810_stop_port(port); 1249 } 1250 } 1251 } 1252 mutex_exit(&statep->inst_lock); 1253 1254 return (DDI_SUCCESS); 1255 } 1256 1257 /* 1258 * audio810_detach() 1259 * 1260 * Description: 1261 * Detach an instance of the audio810 driver. 1262 * 1263 * Arguments: 1264 * dev_info_t *dip Pointer to the device's dev_info struct 1265 * 1266 * Returns: 1267 * DDI_SUCCESS The driver was detached 1268 * DDI_FAILURE The driver couldn't be detached 1269 */ 1270 static int 1271 audio810_detach(dev_info_t *dip) 1272 { 1273 audio810_state_t *statep; 1274 1275 statep = ddi_get_driver_private(dip); 1276 ASSERT(statep != NULL); 1277 1278 /* don't detach us if we are still in use */ 1279 if (audio_dev_unregister(statep->adev) != DDI_SUCCESS) { 1280 return (DDI_FAILURE); 1281 } 1282 1283 audio810_destroy(statep); 1284 return (DDI_SUCCESS); 1285 } 1286 1287 /* 1288 * audio810_suspend() 1289 * 1290 * Description: 1291 * Suspend an instance of the audio810 driver, in preparation for 1292 * sleep or hibernation. 1293 * 1294 * Arguments: 1295 * dev_info_t *dip Pointer to the device's dev_info struct 1296 * 1297 * Returns: 1298 * DDI_SUCCESS The driver was suspended 1299 */ 1300 static int 1301 audio810_suspend(dev_info_t *dip) 1302 { 1303 audio810_state_t *statep; 1304 1305 statep = ddi_get_driver_private(dip); 1306 ASSERT(statep != NULL); 1307 1308 ac97_suspend(statep->ac97); 1309 1310 mutex_enter(&statep->inst_lock); 1311 1312 ASSERT(statep->suspended == B_FALSE); 1313 1314 statep->suspended = B_TRUE; /* stop new ops */ 1315 1316 /* stop DMA engines */ 1317 audio810_stop_dma(statep); 1318 1319 mutex_exit(&statep->inst_lock); 1320 1321 return (DDI_SUCCESS); 1322 } 1323 1324 /* 1325 * audio810_alloc_port() 1326 * 1327 * Description: 1328 * This routine allocates the DMA handles and the memory for the 1329 * DMA engines to use. It also configures the BDL lists properly 1330 * for use. 1331 * 1332 * Arguments: 1333 * dev_info_t *dip Pointer to the device's devinfo 1334 * 1335 * Returns: 1336 * DDI_SUCCESS Registers successfully mapped 1337 * DDI_FAILURE Registers not successfully mapped 1338 */ 1339 static int 1340 audio810_alloc_port(audio810_state_t *statep, int num, uint8_t nchan) 1341 { 1342 ddi_dma_cookie_t cookie; 1343 uint_t count; 1344 int dir; 1345 unsigned caps; 1346 char *prop; 1347 char *nfprop; 1348 audio_dev_t *adev; 1349 audio810_port_t *port; 1350 uint32_t paddr; 1351 int rc; 1352 dev_info_t *dip; 1353 i810_bd_entry_t *bdentry; 1354 1355 adev = statep->adev; 1356 dip = statep->dip; 1357 1358 port = kmem_zalloc(sizeof (*port), KM_SLEEP); 1359 statep->ports[num] = port; 1360 port->statep = statep; 1361 port->started = B_FALSE; 1362 port->nchan = nchan; 1363 port->num = num; 1364 1365 switch (num) { 1366 case I810_PCM_IN: 1367 prop = "record-interrupts"; 1368 nfprop = "record-fragments"; 1369 dir = DDI_DMA_READ; 1370 caps = ENGINE_INPUT_CAP; 1371 port->sync_dir = DDI_DMA_SYNC_FORKERNEL; 1372 port->regoff = I810_BASE_PCM_IN; 1373 break; 1374 case I810_PCM_OUT: 1375 prop = "play-interrupts"; 1376 nfprop = "play-fragments"; 1377 dir = DDI_DMA_WRITE; 1378 caps = ENGINE_OUTPUT_CAP; 1379 port->sync_dir = DDI_DMA_SYNC_FORDEV; 1380 port->regoff = I810_BASE_PCM_OUT; 1381 break; 1382 default: 1383 audio_dev_warn(adev, "bad port number (%d)!", num); 1384 return (DDI_FAILURE); 1385 } 1386 1387 /* 1388 * SiS 7012 swaps status and picb registers. 1389 */ 1390 if (statep->quirk == QUIRK_SIS7012) { 1391 port->stsoff = port->regoff + I810_OFFSET_PICB; 1392 port->picboff = port->regoff + I810_OFFSET_SR; 1393 } else { 1394 port->stsoff = port->regoff + I810_OFFSET_SR; 1395 port->picboff = port->regoff + I810_OFFSET_PICB; 1396 } 1397 1398 port->intrs = ddi_prop_get_int(DDI_DEV_T_ANY, dip, 1399 DDI_PROP_DONTPASS, prop, I810_INTS); 1400 1401 /* make sure the values are good */ 1402 if (port->intrs < I810_MIN_INTS) { 1403 audio_dev_warn(adev, "%s too low, %d, resetting to %d", 1404 prop, port->intrs, I810_INTS); 1405 port->intrs = I810_INTS; 1406 } else if (port->intrs > I810_MAX_INTS) { 1407 audio_dev_warn(adev, "%s too high, %d, resetting to %d", 1408 prop, port->intrs, I810_INTS); 1409 port->intrs = I810_INTS; 1410 } 1411 1412 port->nfrag = ddi_prop_get_int(DDI_DEV_T_ANY, dip, 1413 DDI_PROP_DONTPASS, nfprop, I810_NFRAGS); 1414 1415 /* 1416 * Note that fragments must divide evenly into I810_BD_NUMS (32). 1417 */ 1418 if (port->nfrag <= 4) { 1419 port->nfrag = 4; 1420 } else if (port->nfrag <= 8) { 1421 port->nfrag = 8; 1422 } else if (port->nfrag <= 16) { 1423 port->nfrag = 16; 1424 } else { 1425 port->nfrag = I810_BD_NUMS; 1426 } 1427 1428 /* 1429 * Figure out how much space we need. Sample rate is 48kHz, and 1430 * we need to store 32 chunks. (Note that this means that low 1431 * interrupt frequencies will require more RAM. We could probably 1432 * do some cleverness to use a shorter BD list.) 1433 */ 1434 port->fragfr = 48000 / port->intrs; 1435 port->fragfr = I810_ROUNDUP(port->fragfr, I810_MOD_SIZE); 1436 port->fragsz = port->fragfr * port->nchan * 2; 1437 port->samp_size = port->fragsz * port->nfrag; 1438 1439 /* allocate dma handle */ 1440 rc = ddi_dma_alloc_handle(dip, &sample_buf_dma_attr, DDI_DMA_SLEEP, 1441 NULL, &port->samp_dmah); 1442 if (rc != DDI_SUCCESS) { 1443 audio_dev_warn(adev, "ddi_dma_alloc_handle failed: %d", rc); 1444 return (DDI_FAILURE); 1445 } 1446 /* allocate DMA buffer */ 1447 rc = ddi_dma_mem_alloc(port->samp_dmah, port->samp_size, &buf_attr, 1448 DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &port->samp_kaddr, 1449 &port->samp_size, &port->samp_acch); 1450 if (rc == DDI_FAILURE) { 1451 audio_dev_warn(adev, "dma_mem_alloc (%d) failed: %d", 1452 port->samp_size, rc); 1453 return (DDI_FAILURE); 1454 } 1455 1456 /* bind DMA buffer */ 1457 rc = ddi_dma_addr_bind_handle(port->samp_dmah, NULL, 1458 port->samp_kaddr, port->samp_size, dir|DDI_DMA_CONSISTENT, 1459 DDI_DMA_SLEEP, NULL, &cookie, &count); 1460 if ((rc != DDI_DMA_MAPPED) || (count != 1)) { 1461 audio_dev_warn(adev, 1462 "ddi_dma_addr_bind_handle failed: %d", rc); 1463 return (DDI_FAILURE); 1464 } 1465 port->samp_paddr = cookie.dmac_address; 1466 1467 /* 1468 * now, from here we allocate DMA memory for buffer descriptor list. 1469 * we allocate adjacent DMA memory for all DMA engines. 1470 */ 1471 rc = ddi_dma_alloc_handle(dip, &bdlist_dma_attr, DDI_DMA_SLEEP, 1472 NULL, &port->bdl_dmah); 1473 if (rc != DDI_SUCCESS) { 1474 audio_dev_warn(adev, "ddi_dma_alloc_handle(bdlist) failed"); 1475 return (DDI_FAILURE); 1476 } 1477 1478 /* 1479 * we allocate all buffer descriptors lists in continuous dma memory. 1480 */ 1481 port->bdl_size = sizeof (i810_bd_entry_t) * I810_BD_NUMS; 1482 rc = ddi_dma_mem_alloc(port->bdl_dmah, port->bdl_size, 1483 &dev_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, 1484 &port->bdl_kaddr, &port->bdl_size, &port->bdl_acch); 1485 if (rc != DDI_SUCCESS) { 1486 audio_dev_warn(adev, "ddi_dma_mem_alloc(bdlist) failed"); 1487 return (DDI_FAILURE); 1488 } 1489 1490 rc = ddi_dma_addr_bind_handle(port->bdl_dmah, NULL, port->bdl_kaddr, 1491 port->bdl_size, DDI_DMA_WRITE|DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, 1492 NULL, &cookie, &count); 1493 if ((rc != DDI_DMA_MAPPED) || (count != 1)) { 1494 audio_dev_warn(adev, "addr_bind_handle failed"); 1495 return (DDI_FAILURE); 1496 } 1497 port->bdl_paddr = cookie.dmac_address; 1498 1499 /* 1500 * Wire up the BD list. 1501 */ 1502 paddr = port->samp_paddr; 1503 bdentry = (void *)port->bdl_kaddr; 1504 for (int i = 0; i < I810_BD_NUMS; i++) { 1505 1506 /* set base address of buffer */ 1507 ddi_put32(port->bdl_acch, &bdentry->buf_base, paddr); 1508 /* 1509 * SiS 7012 counts samples in bytes, all other count 1510 * in words. 1511 */ 1512 ddi_put16(port->bdl_acch, &bdentry->buf_len, 1513 statep->quirk == QUIRK_SIS7012 ? port->fragsz : 1514 port->fragsz / 2); 1515 ddi_put16(port->bdl_acch, &bdentry->buf_cmd, 1516 BUF_CMD_IOC | BUF_CMD_BUP); 1517 paddr += port->fragsz; 1518 if ((i % port->nfrag) == (port->nfrag - 1)) { 1519 /* handle wrap */ 1520 paddr = port->samp_paddr; 1521 } 1522 bdentry++; 1523 } 1524 (void) ddi_dma_sync(port->bdl_dmah, 0, 0, DDI_DMA_SYNC_FORDEV); 1525 1526 port->engine = audio_engine_alloc(&audio810_engine_ops, caps); 1527 if (port->engine == NULL) { 1528 audio_dev_warn(adev, "audio_engine_alloc failed"); 1529 return (DDI_FAILURE); 1530 } 1531 1532 audio_engine_set_private(port->engine, port); 1533 audio_dev_add_engine(adev, port->engine); 1534 1535 return (DDI_SUCCESS); 1536 } 1537 1538 /* 1539 * audio810_free_port() 1540 * 1541 * Description: 1542 * This routine unbinds the DMA cookies, frees the DMA buffers, 1543 * deallocates the DMA handles. 1544 * 1545 * Arguments: 1546 * audio810_port_t *port The port structure for a DMA engine. 1547 */ 1548 static void 1549 audio810_free_port(audio810_port_t *port) 1550 { 1551 if (port == NULL) 1552 return; 1553 1554 if (port->engine) { 1555 audio_dev_remove_engine(port->statep->adev, port->engine); 1556 audio_engine_free(port->engine); 1557 } 1558 if (port->bdl_paddr) { 1559 (void) ddi_dma_unbind_handle(port->bdl_dmah); 1560 } 1561 if (port->bdl_acch) { 1562 ddi_dma_mem_free(&port->bdl_acch); 1563 } 1564 if (port->bdl_dmah) { 1565 ddi_dma_free_handle(&port->bdl_dmah); 1566 } 1567 if (port->samp_paddr) { 1568 (void) ddi_dma_unbind_handle(port->samp_dmah); 1569 } 1570 if (port->samp_acch) { 1571 ddi_dma_mem_free(&port->samp_acch); 1572 } 1573 if (port->samp_dmah) { 1574 ddi_dma_free_handle(&port->samp_dmah); 1575 } 1576 kmem_free(port, sizeof (*port)); 1577 } 1578 1579 /* 1580 * audio810_map_regs() 1581 * 1582 * Description: 1583 * The registers are mapped in. 1584 * 1585 * Arguments: 1586 * dev_info_t *dip Pointer to the device's devinfo 1587 * 1588 * Returns: 1589 * DDI_SUCCESS Registers successfully mapped 1590 * DDI_FAILURE Registers not successfully mapped 1591 */ 1592 static int 1593 audio810_map_regs(dev_info_t *dip, audio810_state_t *statep) 1594 { 1595 uint_t nregs = 0; 1596 int *regs_list; 1597 int i; 1598 int pciBar1 = 0; 1599 int pciBar2 = 0; 1600 int pciBar3 = 0; 1601 int pciBar4 = 0; 1602 1603 /* check the "reg" property to get the length of memory-mapped I/O */ 1604 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, 1605 "reg", (int **)®s_list, &nregs) != DDI_PROP_SUCCESS) { 1606 audio_dev_warn(statep->adev, "inquire regs property failed"); 1607 goto error; 1608 } 1609 /* 1610 * Some hardwares, such as Intel ICH0/ICH and AMD 8111, use PCI 0x10 1611 * and 0x14 BAR separately for native audio mixer BAR and native bus 1612 * mastering BAR. More advanced hardwares, such as Intel ICH4 and ICH5, 1613 * support PCI memory BAR, via PCI 0x18 and 0x1C BAR, that allows for 1614 * higher performance access to the controller register. All features 1615 * can be accessed via this BAR making the I/O BAR (PCI 0x10 and 0x14 1616 * BAR) capabilities obsolete. However, these controller maintain the 1617 * I/O BAR capability to allow for the reuse of legacy code maintaining 1618 * backward compatibility. The I/O BAR is disabled unless system BIOS 1619 * enables the simultaneous backward compatible capability on the 0x41 1620 * register. 1621 * 1622 * When I/O BAR is enabled, the value of "reg" property should be like 1623 * this, 1624 * phys_hi phys_mid phys_lo size_hi size_lo 1625 * -------------------------------------------------------- 1626 * 0000fd00 00000000 00000000 00000000 00000000 1627 * 0100fd10 00000000 00000000 00000000 00000100 1628 * 0100fd14 00000000 00000000 00000000 00000040 1629 * 0200fd18 00000000 00000000 00000000 00000200 1630 * 0200fd1c 00000000 00000000 00000000 00000100 1631 * 1632 * When I/O BAR is disabled, the "reg" property of the device node does 1633 * not consist of the description for the I/O BAR. The following example 1634 * illustrates the vaule of "reg" property, 1635 * 1636 * phys_hi phys_mid phys_lo size_hi size_lo 1637 * -------------------------------------------------------- 1638 * 0000fd00 00000000 00000000 00000000 00000000 1639 * 0200fd18 00000000 00000000 00000000 00000200 1640 * 0200fd1c 00000000 00000000 00000000 00000100 1641 * 1642 * If the hardware has memory-mapped I/O access, first try to use 1643 * this facility, otherwise we will try I/O access. 1644 */ 1645 for (i = 1; i < nregs/I810_INTS_PER_REG_PROP; i++) { 1646 switch (regs_list[I810_INTS_PER_REG_PROP * i] & 0x000000ff) { 1647 case 0x10: 1648 pciBar1 = i; 1649 break; 1650 case 0x14: 1651 pciBar2 = i; 1652 break; 1653 case 0x18: 1654 pciBar3 = i; 1655 break; 1656 case 0x1c: 1657 pciBar4 = i; 1658 break; 1659 default: /* we don't care others */ 1660 break; 1661 } 1662 } 1663 1664 if ((pciBar3 != 0) && (pciBar4 != 0)) { 1665 /* map audio mixer registers */ 1666 if ((ddi_regs_map_setup(dip, pciBar3, &statep->am_regs_base, 0, 1667 0, &dev_attr, &statep->am_regs_handle)) != DDI_SUCCESS) { 1668 audio_dev_warn(statep->adev, 1669 "memory am mapping failed"); 1670 goto error; 1671 } 1672 1673 /* map bus master register */ 1674 if ((ddi_regs_map_setup(dip, pciBar4, &statep->bm_regs_base, 0, 1675 0, &dev_attr, &statep->bm_regs_handle)) != DDI_SUCCESS) { 1676 audio_dev_warn(statep->adev, 1677 "memory bm mapping failed"); 1678 goto error; 1679 } 1680 1681 } else if ((pciBar1 != 0) && (pciBar2 != 0)) { 1682 /* map audio mixer registers */ 1683 if ((ddi_regs_map_setup(dip, pciBar1, &statep->am_regs_base, 0, 1684 0, &dev_attr, &statep->am_regs_handle)) != DDI_SUCCESS) { 1685 audio_dev_warn(statep->adev, "I/O am mapping failed"); 1686 goto error; 1687 } 1688 1689 /* map bus master register */ 1690 if ((ddi_regs_map_setup(dip, pciBar2, &statep->bm_regs_base, 0, 1691 0, &dev_attr, &statep->bm_regs_handle)) != DDI_SUCCESS) { 1692 audio_dev_warn(statep->adev, "I/O bm mapping failed"); 1693 goto error; 1694 } 1695 } else { 1696 audio_dev_warn(statep->adev, "map_regs() pci BAR error"); 1697 goto error; 1698 } 1699 1700 ddi_prop_free(regs_list); 1701 1702 return (DDI_SUCCESS); 1703 1704 error: 1705 if (nregs > 0) { 1706 ddi_prop_free(regs_list); 1707 } 1708 audio810_unmap_regs(statep); 1709 1710 return (DDI_FAILURE); 1711 } 1712 1713 /* 1714 * audio810_unmap_regs() 1715 * 1716 * Description: 1717 * This routine unmaps control registers. 1718 * 1719 * Arguments: 1720 * audio810_state_t *state The device's state structure 1721 */ 1722 static void 1723 audio810_unmap_regs(audio810_state_t *statep) 1724 { 1725 if (statep->bm_regs_handle) { 1726 ddi_regs_map_free(&statep->bm_regs_handle); 1727 } 1728 1729 if (statep->am_regs_handle) { 1730 ddi_regs_map_free(&statep->am_regs_handle); 1731 } 1732 } 1733 1734 /* 1735 * audio810_chip_init() 1736 * 1737 * Description: 1738 * This routine initializes the AMD 8111 audio controller. 1739 * codec. 1740 * 1741 * Arguments: 1742 * audio810_state_t *state The device's state structure 1743 * 1744 * Returns: 1745 * DDI_SUCCESS The hardware was initialized properly 1746 * DDI_FAILURE The hardware couldn't be initialized properly 1747 */ 1748 static int 1749 audio810_chip_init(audio810_state_t *statep) 1750 { 1751 uint32_t gcr; 1752 uint32_t gsr; 1753 uint32_t codec_ready; 1754 int loop; 1755 clock_t ticks; 1756 1757 gcr = I810_BM_GET32(I810_REG_GCR); 1758 ticks = drv_usectohz(100); 1759 1760 /* 1761 * Clear the channels bits for now. We'll set them later in 1762 * reset port. 1763 */ 1764 if (statep->quirk == QUIRK_SIS7012) { 1765 gcr &= ~(I810_GCR_ACLINK_OFF | I810_GCR_SIS_CHANNELS_MASK); 1766 } else { 1767 gcr &= ~(I810_GCR_ACLINK_OFF | I810_GCR_CHANNELS_MASK); 1768 } 1769 1770 /* 1771 * Datasheet(ICH5, document number of Intel: 252751-001): 1772 * 3.6.5.5(page 37) 1773 * if reset bit(bit1) is "0", driver must set it 1774 * to "1" to de-assert the AC_RESET# signal in AC 1775 * link, thus completing a cold reset. But if the 1776 * bit is "1", then a warm reset is required. 1777 */ 1778 gcr |= (gcr & I810_GCR_COLD_RST) == 0 ? 1779 I810_GCR_COLD_RST:I810_GCR_WARM_RST; 1780 I810_BM_PUT32(I810_REG_GCR, gcr); 1781 1782 /* according AC'97 spec, wait for codec reset */ 1783 for (loop = 6000; --loop >= 0; ) { 1784 delay(ticks); 1785 gcr = I810_BM_GET32(I810_REG_GCR); 1786 if ((gcr & I810_GCR_WARM_RST) == 0) { 1787 break; 1788 } 1789 } 1790 1791 /* codec reset failed */ 1792 if (loop < 0) { 1793 audio_dev_warn(statep->adev, "Failed to reset codec"); 1794 return (DDI_FAILURE); 1795 } 1796 1797 /* 1798 * Wait for codec ready. The hardware can provide the state of 1799 * codec ready bit on SDATA_IN[0], SDATA_IN[1] or SDATA_IN[2] 1800 */ 1801 codec_ready = 1802 I810_GSR_PRI_READY | I810_GSR_SEC_READY | I810_GSR_TRI_READY; 1803 for (loop = 7000; --loop >= 0; ) { 1804 delay(ticks); 1805 gsr = I810_BM_GET32(I810_REG_GSR); 1806 if ((gsr & codec_ready) != 0) { 1807 break; 1808 } 1809 } 1810 if (loop < 0) { 1811 audio_dev_warn(statep->adev, "No codec ready signal received"); 1812 return (DDI_FAILURE); 1813 } 1814 1815 /* 1816 * put the audio controller into quiet state, everything off 1817 */ 1818 audio810_stop_dma(statep); 1819 1820 return (DDI_SUCCESS); 1821 } 1822 1823 /* 1824 * audio810_stop_dma() 1825 * 1826 * Description: 1827 * This routine is used to put each DMA engine into the quiet state. 1828 * 1829 * Arguments: 1830 * audio810_state_t *state The device's state structure 1831 */ 1832 static void 1833 audio810_stop_dma(audio810_state_t *statep) 1834 { 1835 if (statep->bm_regs_handle == NULL) { 1836 return; 1837 } 1838 /* pause bus master (needed for the following reset register) */ 1839 I810_BM_PUT8(I810_BASE_PCM_IN + I810_OFFSET_CR, 0x0); 1840 I810_BM_PUT8(I810_BASE_PCM_OUT + I810_OFFSET_CR, 0x0); 1841 I810_BM_PUT8(I810_BASE_MIC + I810_OFFSET_CR, 0x0); 1842 1843 /* and then reset the bus master registers for a three DMA engines */ 1844 I810_BM_PUT8(I810_BASE_PCM_IN + I810_OFFSET_CR, I810_BM_CR_RST); 1845 I810_BM_PUT8(I810_BASE_PCM_OUT + I810_OFFSET_CR, I810_BM_CR_RST); 1846 I810_BM_PUT8(I810_BASE_MIC + I810_OFFSET_CR, I810_BM_CR_RST); 1847 } 1848 1849 1850 /* 1851 * audio810_codec_sync() 1852 * 1853 * Description: 1854 * Serialize access to the AC97 audio mixer registers. 1855 * 1856 * Arguments: 1857 * audio810_state_t *state The device's state structure 1858 * 1859 * Returns: 1860 * DDI_SUCCESS Ready for an I/O access to the codec 1861 * DDI_FAILURE An I/O access is currently in progress, can't 1862 * perform another I/O access. 1863 */ 1864 static int 1865 audio810_codec_sync(audio810_state_t *statep) 1866 { 1867 int i; 1868 uint16_t casr; 1869 1870 for (i = 0; i < 300; i++) { 1871 casr = I810_BM_GET8(I810_REG_CASR); 1872 if ((casr & 1) == 0) { 1873 return (DDI_SUCCESS); 1874 } 1875 drv_usecwait(10); 1876 } 1877 1878 return (DDI_FAILURE); 1879 } 1880 1881 /* 1882 * audio810_write_ac97() 1883 * 1884 * Description: 1885 * Set the specific AC97 Codec register. 1886 * 1887 * Arguments: 1888 * void *arg The device's state structure 1889 * uint8_t reg AC97 register number 1890 * uint16_t data The data want to be set 1891 */ 1892 static void 1893 audio810_write_ac97(void *arg, uint8_t reg, uint16_t data) 1894 { 1895 audio810_state_t *statep = arg; 1896 1897 mutex_enter(&statep->ac_lock); 1898 if (audio810_codec_sync(statep) == DDI_SUCCESS) { 1899 I810_AM_PUT16(reg, data); 1900 } 1901 mutex_exit(&statep->ac_lock); 1902 1903 (void) audio810_read_ac97(statep, reg); 1904 } 1905 1906 /* 1907 * audio810_read_ac97() 1908 * 1909 * Description: 1910 * Get the specific AC97 Codec register. 1911 * 1912 * Arguments: 1913 * void *arg The device's state structure 1914 * uint8_t reg AC97 register number 1915 * 1916 * Returns: 1917 * The register value. 1918 */ 1919 static uint16_t 1920 audio810_read_ac97(void *arg, uint8_t reg) 1921 { 1922 audio810_state_t *statep = arg; 1923 uint16_t val = 0xffff; 1924 1925 mutex_enter(&statep->ac_lock); 1926 if (audio810_codec_sync(statep) == DDI_SUCCESS) { 1927 val = I810_AM_GET16(reg); 1928 } 1929 mutex_exit(&statep->ac_lock); 1930 return (val); 1931 } 1932 1933 /* 1934 * audio810_destroy() 1935 * 1936 * Description: 1937 * This routine releases all resources held by the device instance, 1938 * as part of either detach or a failure in attach. 1939 * 1940 * Arguments: 1941 * audio810_state_t *state The device soft state. 1942 */ 1943 void 1944 audio810_destroy(audio810_state_t *statep) 1945 { 1946 /* stop DMA engines */ 1947 audio810_stop_dma(statep); 1948 1949 if (statep->intr_added) { 1950 ddi_remove_intr(statep->dip, 0, NULL); 1951 } 1952 1953 if (statep->ksp) { 1954 kstat_delete(statep->ksp); 1955 } 1956 1957 for (int i = 0; i < I810_NUM_PORTS; i++) { 1958 audio810_free_port(statep->ports[i]); 1959 } 1960 1961 audio810_unmap_regs(statep); 1962 1963 if (statep->ac97) 1964 ac97_free(statep->ac97); 1965 1966 if (statep->adev) 1967 audio_dev_free(statep->adev); 1968 1969 mutex_destroy(&statep->inst_lock); 1970 mutex_destroy(&statep->ac_lock); 1971 kmem_free(statep, sizeof (*statep)); 1972 } 1973