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