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 /* 23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* 28 * Copyright (C) 4Front Technologies 1996-2009. 29 */ 30 31 /* 32 * Purpose: Driver for the Creative Sound Blaster Live! and Audigy/2/4 33 * sound cards 34 */ 35 36 #include <sys/types.h> 37 #include <sys/modctl.h> 38 #include <sys/kmem.h> 39 #include <sys/conf.h> 40 #include <sys/ddi.h> 41 #include <sys/sunddi.h> 42 #include <sys/pci.h> 43 #include <sys/note.h> 44 #include <sys/stdbool.h> 45 #include <sys/audio/audio_driver.h> 46 #include <sys/audio/ac97.h> 47 48 #include "audioemu10k.h" 49 #include <sys/promif.h> 50 51 /* 52 * Include the DSP files for emu10k1 (Live!) and emu10k2 (Audigy) 53 */ 54 #include "emu10k_gpr.h" 55 #include "emu10k1_dsp.h" 56 #include "emu10k2_dsp.h" 57 58 static struct ddi_device_acc_attr dev_attr = { 59 DDI_DEVICE_ATTR_V0, 60 DDI_STRUCTURE_LE_ACC, 61 DDI_STRICTORDER_ACC 62 }; 63 64 static struct ddi_device_acc_attr buf_attr = { 65 DDI_DEVICE_ATTR_V0, 66 DDI_NEVERSWAP_ACC, 67 DDI_STRICTORDER_ACC 68 }; 69 70 71 /* 72 * EMU10K routing stuff. 73 */ 74 #define MAX_SENDS 4 75 #define SEND_L 0 76 #define SEND_R 1 77 #define SEND_SURRL 2 78 #define SEND_SURRR 3 79 #define SEND_CEN 4 80 #define SEND_LFE 5 81 #define SEND_SIDEL 6 82 #define SEND_SIDER 7 83 84 #define SPDIF_L 20 85 #define SPDIF_R 21 86 87 /* 88 * Recording sources... we start from 16 to ensure that the 89 * record sources don't collide with AC'97 record sources in 90 * the control value. 91 */ 92 #define INPUT_AC97 1 93 #define INPUT_SPD1 2 94 #define INPUT_SPD2 3 95 #define INPUT_DIGCD 4 96 #define INPUT_AUX2 5 97 #define INPUT_LINE2 6 98 #define INPUT_STEREOMIX 7 99 100 static uint8_t front_routing[MAX_SENDS] = { 101 SEND_L, SEND_R, 0x3f, 0x3f 102 }; 103 static uint8_t surr_routing[MAX_SENDS] = { 104 SEND_SURRL, SEND_SURRR, 0x3f, 0x3f 105 }; 106 static uint8_t clfe_routing[MAX_SENDS] = { 107 SEND_CEN, SEND_LFE, 0x3f, 0x3f 108 }; 109 static uint8_t side_routing[MAX_SENDS] = { 110 SEND_SIDEL, SEND_SIDER, 0x3f, 0x3f 111 }; 112 static uint8_t no_routing[MAX_SENDS] = { 113 0x3f, 0x3f, 0x3f, 0x3f 114 }; 115 116 /* 117 * SB Live! cannot do DMA above 2G addresses. Audigy/2/4 have special 8k page 118 * mode that supports high addresses. However, we should not need this except 119 * on SPARC. For simplicity's sake, we are only delivering this driver for 120 * x86 platforms. If SPARC support is desired, then the code will have to 121 * be modified to support full 32-bit addressing. (And again, SB Live! 122 * can't do it anyway.) 123 */ 124 125 static ddi_dma_attr_t dma_attr_buf = { 126 DMA_ATTR_V0, /* Version */ 127 0x00000000ULL, /* Address low */ 128 0x7ffffff0ULL, /* Address high */ 129 0xffffffffULL, /* Counter max */ 130 1ULL, /* Default byte align */ 131 0x7f, /* Burst size */ 132 0x1, /* Minimum xfer size */ 133 0xffffffffULL, /* Maximum xfer size */ 134 0xffffffffULL, /* Max segment size */ 135 1, /* S/G list length */ 136 1, /* Granularity */ 137 0 /* Flag */ 138 }; 139 140 static int emu10k_attach(dev_info_t *); 141 static int emu10k_resume(dev_info_t *); 142 static int emu10k_detach(emu10k_devc_t *); 143 static int emu10k_suspend(emu10k_devc_t *); 144 145 static int emu10k_open(void *, int, unsigned *, unsigned *, caddr_t *); 146 static void emu10k_close(void *); 147 static int emu10k_start(void *); 148 static void emu10k_stop(void *); 149 static int emu10k_format(void *); 150 static int emu10k_channels(void *); 151 static int emu10k_rate(void *); 152 static uint64_t emu10k_count(void *); 153 static void emu10k_sync(void *, unsigned); 154 static size_t emu10k_qlen(void *); 155 static void emu10k_chinfo(void *, int, unsigned *, unsigned *); 156 157 static uint16_t emu10k_read_ac97(void *, uint8_t); 158 static void emu10k_write_ac97(void *, uint8_t, uint16_t); 159 static int emu10k_alloc_port(emu10k_devc_t *, int); 160 static void emu10k_destroy(emu10k_devc_t *); 161 static int emu10k_setup_intrs(emu10k_devc_t *); 162 static int emu10k_hwinit(emu10k_devc_t *); 163 static uint_t emu10k_intr(caddr_t, caddr_t); 164 static void emu10k_init_effects(emu10k_devc_t *); 165 166 static audio_engine_ops_t emu10k_engine_ops = { 167 AUDIO_ENGINE_VERSION, 168 emu10k_open, 169 emu10k_close, 170 emu10k_start, 171 emu10k_stop, 172 emu10k_count, 173 emu10k_format, 174 emu10k_channels, 175 emu10k_rate, 176 emu10k_sync, 177 emu10k_qlen, 178 emu10k_chinfo 179 }; 180 181 static uint16_t 182 emu10k_read_ac97(void *arg, uint8_t index) 183 { 184 emu10k_devc_t *devc = arg; 185 int dtemp = 0, i; 186 187 mutex_enter(&devc->mutex); 188 OUTB(devc, index, devc->regs + 0x1e); 189 for (i = 0; i < 10000; i++) 190 if (INB(devc, devc->regs + 0x1e) & 0x80) 191 break; 192 193 if (i == 1000) { 194 mutex_exit(&devc->mutex); 195 return (0); /* Timeout */ 196 } 197 dtemp = INW(devc, devc->regs + 0x1c); 198 199 mutex_exit(&devc->mutex); 200 201 return (dtemp & 0xffff); 202 } 203 204 static void 205 emu10k_write_ac97(void *arg, uint8_t index, uint16_t data) 206 { 207 emu10k_devc_t *devc = arg; 208 int i; 209 210 mutex_enter(&devc->mutex); 211 212 OUTB(devc, index, devc->regs + 0x1e); 213 for (i = 0; i < 10000; i++) 214 if (INB(devc, devc->regs + 0x1e) & 0x80) 215 break; 216 OUTW(devc, data, devc->regs + 0x1c); 217 218 mutex_exit(&devc->mutex); 219 } 220 221 static uint32_t 222 emu10k_read_reg(emu10k_devc_t *devc, int reg, int chn) 223 { 224 uint32_t ptr, ptr_addr_mask, val, mask, size, offset; 225 226 ptr_addr_mask = (devc->feature_mask & 227 (SB_AUDIGY|SB_AUDIGY2|SB_AUDIGY2VAL)) ? 228 0x0fff0000 : 0x07ff0000; 229 ptr = ((reg << 16) & ptr_addr_mask) | (chn & 0x3f); 230 OUTL(devc, ptr, devc->regs + 0x00); /* Pointer */ 231 val = INL(devc, devc->regs + 0x04); /* Data */ 232 if (reg & 0xff000000) { 233 size = (reg >> 24) & 0x3f; 234 offset = (reg >> 16) & 0x1f; 235 mask = ((1 << size) - 1) << offset; 236 val &= mask; 237 val >>= offset; 238 } 239 240 return (val); 241 } 242 243 static void 244 emu10k_write_reg(emu10k_devc_t *devc, int reg, int chn, uint32_t value) 245 { 246 uint32_t ptr, ptr_addr_mask, mask, size, offset; 247 248 ptr_addr_mask = (devc->feature_mask & 249 (SB_AUDIGY|SB_AUDIGY2|SB_AUDIGY2VAL)) ? 250 0x0fff0000 : 0x07ff0000; 251 ptr = ((reg << 16) & ptr_addr_mask) | (chn & 0x3f); 252 OUTL(devc, ptr, devc->regs + 0x00); /* Pointer */ 253 if (reg & 0xff000000) { 254 size = (reg >> 24) & 0x3f; 255 offset = (reg >> 16) & 0x1f; 256 mask = ((1 << size) - 1) << offset; 257 value <<= offset; 258 value &= mask; 259 value |= INL(devc, devc->regs + 0x04) & ~mask; /* data */ 260 } 261 OUTL(devc, value, devc->regs + 0x04); /* Data */ 262 } 263 264 static void 265 emu10k_write_routing(emu10k_devc_t *devc, int voice, unsigned char *routing) 266 { 267 int i; 268 269 ASSERT(routing != NULL); 270 271 if (devc->feature_mask & (SB_AUDIGY|SB_AUDIGY2|SB_AUDIGY2VAL)) { 272 unsigned int srda = 0; 273 274 for (i = 0; i < 4; i++) 275 srda |= routing[i] << (i * 8); 276 277 emu10k_write_reg(devc, SRDA, voice, srda); 278 } else { 279 int fxrt = 0; 280 281 for (i = 0; i < 4; i++) 282 fxrt |= routing[i] << ((i * 4) + 16); 283 emu10k_write_reg(devc, FXRT, voice, fxrt); 284 } 285 } 286 287 static void 288 emu10k_write_efx(emu10k_devc_t *devc, int reg, unsigned int value) 289 { 290 emu10k_write_reg(devc, reg, 0, value); 291 } 292 293 static uint_t 294 emu10k_intr(caddr_t argp, caddr_t nocare) 295 { 296 emu10k_devc_t *devc = (void *) argp; 297 emu10k_portc_t *portc; 298 uint32_t status; 299 audio_engine_t *cons = NULL, *prod = NULL; 300 301 302 _NOTE(ARGUNUSED (nocare)); 303 304 mutex_enter(&devc->mutex); 305 if (devc->suspended) { 306 mutex_exit(&devc->mutex); 307 return (DDI_INTR_UNCLAIMED); 308 } 309 310 status = INL(devc, devc->regs + INTPEND); 311 312 if (status == 0) { 313 mutex_exit(&devc->mutex); 314 return (DDI_INTR_UNCLAIMED); 315 } 316 317 if (status & INT_CL) { /* channel loop */ 318 emu10k_write_reg(devc, CLIPL, 0, (1U << 8)); 319 OUTL(devc, INT_CL, devc->regs + INTPEND); 320 portc = devc->portc[EMU10K_PLAY]; 321 if (portc->active) { 322 cons = portc->engine; 323 } 324 } 325 if (status & (INT_AF|INT_AH|INT_MF|INT_MH)) { /* ADC interrupt */ 326 OUTL(devc, INT_AF|INT_AH|INT_MF|INT_MH, devc->regs + INTPEND); 327 portc = devc->portc[EMU10K_REC]; 328 if (portc->active) { 329 prod = portc->engine; 330 } 331 } 332 333 mutex_exit(&devc->mutex); 334 335 if (cons) { 336 audio_engine_consume(cons); 337 } 338 if (prod) { 339 audio_engine_produce(prod); 340 } 341 342 return (DDI_INTR_CLAIMED); 343 } 344 345 /* 346 * Audio routines 347 */ 348 349 static void 350 emu10k_update_output_volume(emu10k_portc_t *portc, int voice, int chn) 351 { 352 emu10k_devc_t *devc = portc->devc; 353 unsigned int tmp; 354 unsigned char send[2]; 355 356 /* 357 * Each voice operator of EMU10k has 4 sends (0=left, 1=right, 358 * 2=surround_left, 3=surround_right). The original OSS driver 359 * used all of them to spread stereo output to two different 360 * speaker pairs. This Boomer version uses only the first two 361 * sends. The other sends are set to 0. 362 * 363 * Boomer uses multiple voice pairs to play multichannel 364 * audio. This function is used to update only one of these 365 * pairs. 366 */ 367 368 send[0] = 0xff; /* Max */ 369 send[1] = 0xff; /* Max */ 370 371 /* Analog voice */ 372 if (chn == LEFT_CH) { 373 send[1] = 0; 374 } else { 375 send[0] = 0; 376 } 377 378 tmp = emu10k_read_reg(devc, PTAB, voice) & 0xffff0000; 379 emu10k_write_reg(devc, PTAB, voice, tmp | (send[0] << 8) | send[1]); 380 } 381 382 static void 383 emu10k_setup_voice(emu10k_portc_t *portc, int voice, int chn, int buf_offset) 384 { 385 emu10k_devc_t *devc = portc->devc; 386 unsigned int nCRA = 0; 387 388 unsigned int loop_start, loop_end, buf_size; 389 390 int sz; 391 int start_pos; 392 393 emu10k_write_reg(devc, VEDS, voice, 0x0); /* OFF */ 394 emu10k_write_reg(devc, VTFT, voice, 0xffff); 395 emu10k_write_reg(devc, CVCF, voice, 0xffff); 396 397 sz = 2; /* Shift value for 16 bits stereo */ 398 399 /* Size of one stereo sub buffer */ 400 buf_size = (portc->buf_size / portc->channels) * 2; 401 loop_start = (portc->memptr + buf_offset) >> sz; 402 loop_end = (portc->memptr + buf_offset + buf_size) >> sz; 403 404 /* set stereo */ 405 emu10k_write_reg(devc, CPF, voice, 0x8000); 406 407 nCRA = 28; /* Stereo (16 bits) */ 408 start_pos = loop_start + nCRA; 409 410 /* SDL, ST, CA */ 411 412 emu10k_write_reg(devc, SDL, voice, loop_end); 413 emu10k_write_reg(devc, SCSA, voice, loop_start); 414 emu10k_write_reg(devc, PTAB, voice, 0); 415 416 emu10k_update_output_volume(portc, voice, chn); /* Set volume */ 417 418 emu10k_write_reg(devc, QKBCA, voice, start_pos); 419 420 emu10k_write_reg(devc, Z1, voice, 0); 421 emu10k_write_reg(devc, Z2, voice, 0); 422 423 /* This is really a physical address */ 424 emu10k_write_reg(devc, MAPA, voice, 425 0x1fff | (devc->silence_paddr << 1)); 426 emu10k_write_reg(devc, MAPB, voice, 427 0x1fff | (devc->silence_paddr << 1)); 428 429 emu10k_write_reg(devc, VTFT, voice, 0x0000ffff); 430 emu10k_write_reg(devc, CVCF, voice, 0x0000ffff); 431 emu10k_write_reg(devc, MEHA, voice, 0); 432 emu10k_write_reg(devc, MEDS, voice, 0x7f); 433 emu10k_write_reg(devc, MLV, voice, 0x8000); 434 emu10k_write_reg(devc, VLV, voice, 0x8000); 435 emu10k_write_reg(devc, VFM, voice, 0); 436 emu10k_write_reg(devc, TMFQ, voice, 0); 437 emu10k_write_reg(devc, VVFQ, voice, 0); 438 emu10k_write_reg(devc, MEV, voice, 0x8000); 439 emu10k_write_reg(devc, VEHA, voice, 0x7f7f); /* OK */ 440 /* No volume envelope delay (OK) */ 441 emu10k_write_reg(devc, VEV, voice, 0x8000); 442 emu10k_write_reg(devc, PEFE_FILTERAMOUNT, voice, 0x7f); 443 emu10k_write_reg(devc, PEFE_PITCHAMOUNT, voice, 0x00); 444 } 445 446 static void 447 emu10k_setup_silence(emu10k_portc_t *portc, int voice) 448 { 449 emu10k_devc_t *devc = portc->devc; 450 451 emu10k_write_reg(devc, VEDS, voice, 0x0); /* OFF */ 452 emu10k_write_reg(devc, VTFT, voice, 0xffff); 453 emu10k_write_reg(devc, CVCF, voice, 0xffff); 454 455 /* set stereo */ 456 emu10k_write_reg(devc, CPF, voice, 0x8000); 457 458 /* SDL, ST, CA */ 459 emu10k_write_reg(devc, SDL, voice, portc->fragfr); 460 emu10k_write_reg(devc, SCSA, voice, 0); 461 emu10k_write_reg(devc, PTAB, voice, 0); 462 emu10k_write_reg(devc, QKBCA, voice, 0); 463 464 emu10k_write_reg(devc, Z1, voice, 0); 465 emu10k_write_reg(devc, Z2, voice, 0); 466 467 /* This is really a physical address */ 468 emu10k_write_reg(devc, MAPA, voice, 469 0x1fff | (devc->silence_paddr << 1)); 470 emu10k_write_reg(devc, MAPB, voice, 471 0x1fff | (devc->silence_paddr << 1)); 472 473 emu10k_write_reg(devc, VTFT, voice, 0x0000ffff); 474 emu10k_write_reg(devc, CVCF, voice, 0x0000ffff); 475 emu10k_write_reg(devc, MEHA, voice, 0); 476 emu10k_write_reg(devc, MEDS, voice, 0x7f); 477 emu10k_write_reg(devc, MLV, voice, 0x8000); 478 emu10k_write_reg(devc, VLV, voice, 0x8000); 479 emu10k_write_reg(devc, VFM, voice, 0); 480 emu10k_write_reg(devc, TMFQ, voice, 0); 481 emu10k_write_reg(devc, VVFQ, voice, 0); 482 emu10k_write_reg(devc, MEV, voice, 0x8000); 483 emu10k_write_reg(devc, VEHA, voice, 0x7f7f); /* OK */ 484 /* No volume envelope delay (OK) */ 485 emu10k_write_reg(devc, VEV, voice, 0x8000); 486 emu10k_write_reg(devc, PEFE_FILTERAMOUNT, voice, 0x7f); 487 emu10k_write_reg(devc, PEFE_PITCHAMOUNT, voice, 0x00); 488 } 489 490 int 491 emu10k_open(void *arg, int flag, 492 unsigned *fragfrp, unsigned *nfragsp, caddr_t *bufp) 493 { 494 emu10k_portc_t *portc = arg; 495 emu10k_devc_t *devc = portc->devc; 496 497 _NOTE(ARGUNUSED(flag)); 498 499 portc->started = B_FALSE; 500 portc->active = B_FALSE; 501 *fragfrp = portc->fragfr; 502 *nfragsp = portc->nfrags; 503 *bufp = portc->buf_kaddr; 504 505 mutex_enter(&devc->mutex); 506 if (!devc->suspended) 507 portc->reset_port(portc); 508 portc->count = 0; 509 mutex_exit(&devc->mutex); 510 511 return (0); 512 } 513 514 void 515 emu10k_close(void *arg) 516 { 517 emu10k_portc_t *portc = arg; 518 emu10k_devc_t *devc = portc->devc; 519 520 mutex_enter(&devc->mutex); 521 if (!devc->suspended) 522 portc->stop_port(portc); 523 portc->started = B_FALSE; 524 mutex_exit(&devc->mutex); 525 } 526 527 int 528 emu10k_start(void *arg) 529 { 530 emu10k_portc_t *portc = arg; 531 emu10k_devc_t *devc = portc->devc; 532 533 mutex_enter(&devc->mutex); 534 if (!portc->started) { 535 if (!devc->suspended) 536 portc->start_port(portc); 537 portc->started = B_TRUE; 538 } 539 mutex_exit(&devc->mutex); 540 return (0); 541 } 542 543 void 544 emu10k_stop(void *arg) 545 { 546 emu10k_portc_t *portc = arg; 547 emu10k_devc_t *devc = portc->devc; 548 549 mutex_enter(&devc->mutex); 550 if (portc->started) { 551 if (!devc->suspended) 552 portc->stop_port(portc); 553 portc->started = B_FALSE; 554 } 555 mutex_exit(&devc->mutex); 556 } 557 558 int 559 emu10k_format(void *arg) 560 { 561 _NOTE(ARGUNUSED(arg)); 562 563 return (AUDIO_FORMAT_S16_LE); 564 } 565 566 int 567 emu10k_channels(void *arg) 568 { 569 emu10k_portc_t *portc = arg; 570 571 return (portc->channels); 572 } 573 574 int 575 emu10k_rate(void *arg) 576 { 577 _NOTE(ARGUNUSED(arg)); 578 579 return (SAMPLE_RATE); 580 } 581 582 void 583 emu10k_sync(void *arg, unsigned nframes) 584 { 585 emu10k_portc_t *portc = arg; 586 _NOTE(ARGUNUSED(nframes)); 587 588 (void) ddi_dma_sync(portc->buf_dmah, 0, 0, portc->syncdir); 589 } 590 591 size_t 592 emu10k_qlen(void *arg) 593 { 594 _NOTE(ARGUNUSED (arg)); 595 return (0); 596 } 597 598 uint64_t 599 emu10k_count(void *arg) 600 { 601 emu10k_portc_t *portc = arg; 602 emu10k_devc_t *devc = portc->devc; 603 uint64_t count; 604 605 mutex_enter(&devc->mutex); 606 if (!devc->suspended) 607 portc->update_port(portc); 608 count = portc->count; 609 mutex_exit(&devc->mutex); 610 611 return (count); 612 } 613 614 static void 615 emu10k_chinfo(void *arg, int chan, unsigned *offset, unsigned *incr) 616 { 617 emu10k_portc_t *portc = arg; 618 619 *offset = portc->nframes * (chan / 2) * 2 + (chan % 2); 620 *incr = 2; 621 } 622 623 /* private implementation bits */ 624 625 static void 626 emu10k_set_loop_stop(emu10k_devc_t *devc, int voice, int s) 627 { 628 unsigned int tmp; 629 int offs, bit; 630 631 offs = voice / 32; 632 bit = voice % 32; 633 s = !!s; 634 635 tmp = emu10k_read_reg(devc, SOLL + offs, 0); 636 tmp &= ~(1 << bit); 637 638 if (s) 639 tmp |= (1 << bit); 640 emu10k_write_reg(devc, SOLL + offs, 0, tmp); 641 } 642 643 static unsigned int 644 emu10k_rate_to_pitch(unsigned int rate) 645 { 646 static unsigned int logMagTable[128] = { 647 0x00000, 0x02dfc, 0x05b9e, 0x088e6, 648 0x0b5d6, 0x0e26f, 0x10eb3, 0x13aa2, 649 0x1663f, 0x1918a, 0x1bc84, 0x1e72e, 650 0x2118b, 0x23b9a, 0x2655d, 0x28ed5, 651 0x2b803, 0x2e0e8, 0x30985, 0x331db, 652 0x359eb, 0x381b6, 0x3a93d, 0x3d081, 653 0x3f782, 0x41e42, 0x444c1, 0x46b01, 654 0x49101, 0x4b6c4, 0x4dc49, 0x50191, 655 0x5269e, 0x54b6f, 0x57006, 0x59463, 656 0x5b888, 0x5dc74, 0x60029, 0x623a7, 657 0x646ee, 0x66a00, 0x68cdd, 0x6af86, 658 0x6d1fa, 0x6f43c, 0x7164b, 0x73829, 659 0x759d4, 0x77b4f, 0x79c9a, 0x7bdb5, 660 0x7dea1, 0x7ff5e, 0x81fed, 0x8404e, 661 0x86082, 0x88089, 0x8a064, 0x8c014, 662 0x8df98, 0x8fef1, 0x91e20, 0x93d26, 663 0x95c01, 0x97ab4, 0x9993e, 0x9b79f, 664 0x9d5d9, 0x9f3ec, 0xa11d8, 0xa2f9d, 665 0xa4d3c, 0xa6ab5, 0xa8808, 0xaa537, 666 0xac241, 0xadf26, 0xafbe7, 0xb1885, 667 0xb3500, 0xb5157, 0xb6d8c, 0xb899f, 668 0xba58f, 0xbc15e, 0xbdd0c, 0xbf899, 669 0xc1404, 0xc2f50, 0xc4a7b, 0xc6587, 670 0xc8073, 0xc9b3f, 0xcb5ed, 0xcd07c, 671 0xceaec, 0xd053f, 0xd1f73, 0xd398a, 672 0xd5384, 0xd6d60, 0xd8720, 0xda0c3, 673 0xdba4a, 0xdd3b4, 0xded03, 0xe0636, 674 0xe1f4e, 0xe384a, 0xe512c, 0xe69f3, 675 0xe829f, 0xe9b31, 0xeb3a9, 0xecc08, 676 0xee44c, 0xefc78, 0xf148a, 0xf2c83, 677 0xf4463, 0xf5c2a, 0xf73da, 0xf8b71, 678 0xfa2f0, 0xfba57, 0xfd1a7, 0xfe8df 679 }; 680 static char logSlopeTable[128] = { 681 0x5c, 0x5c, 0x5b, 0x5a, 0x5a, 0x59, 0x58, 0x58, 682 0x57, 0x56, 0x56, 0x55, 0x55, 0x54, 0x53, 0x53, 683 0x52, 0x52, 0x51, 0x51, 0x50, 0x50, 0x4f, 0x4f, 684 0x4e, 0x4d, 0x4d, 0x4d, 0x4c, 0x4c, 0x4b, 0x4b, 685 0x4a, 0x4a, 0x49, 0x49, 0x48, 0x48, 0x47, 0x47, 686 0x47, 0x46, 0x46, 0x45, 0x45, 0x45, 0x44, 0x44, 687 0x43, 0x43, 0x43, 0x42, 0x42, 0x42, 0x41, 0x41, 688 0x41, 0x40, 0x40, 0x40, 0x3f, 0x3f, 0x3f, 0x3e, 689 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c, 690 0x3b, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39, 691 0x39, 0x39, 0x39, 0x38, 0x38, 0x38, 0x38, 0x37, 692 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x36, 0x35, 693 0x35, 0x35, 0x35, 0x34, 0x34, 0x34, 0x34, 0x34, 694 0x33, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x32, 695 0x32, 0x31, 0x31, 0x31, 0x31, 0x31, 0x30, 0x30, 696 0x30, 0x30, 0x30, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f 697 }; 698 int i; 699 700 if (rate == 0) 701 return (0); /* Bail out if no leading "1" */ 702 rate *= 11185; /* Scale 48000 to 0x20002380 */ 703 for (i = 31; i > 0; i--) { 704 if (rate & 0x80000000) { /* Detect leading "1" */ 705 return (((unsigned int) (i - 15) << 20) + 706 logMagTable[0x7f & (rate >> 24)] + 707 (0x7f & (rate >> 17)) * 708 logSlopeTable[0x7f & (rate >> 24)]); 709 } 710 rate <<= 1; 711 } 712 713 return (0); /* Should never reach this point */ 714 } 715 716 static unsigned int 717 emu10k_rate_to_linearpitch(unsigned int rate) 718 { 719 rate = (rate << 8) / 375; 720 return (rate >> 1) + (rate & 1); 721 } 722 723 static void 724 emu10k_prepare_voice(emu10k_devc_t *devc, int voice) 725 { 726 unsigned int sample, initial_pitch, pitch_target; 727 unsigned int cra, cs, ccis, i; 728 729 /* setup CCR regs */ 730 cra = 64; 731 cs = 4; /* Stereo */ 732 ccis = 28; /* Stereo */ 733 sample = 0; /* 16 bit silence */ 734 735 for (i = 0; i < cs; i++) 736 emu10k_write_reg(devc, CD0 + i, voice, sample); 737 738 emu10k_write_reg(devc, CCR_CACHEINVALIDSIZE, voice, 0); 739 emu10k_write_reg(devc, CCR_READADDRESS, voice, cra); 740 emu10k_write_reg(devc, CCR_CACHEINVALIDSIZE, voice, ccis); 741 742 /* Set current pitch */ 743 emu10k_write_reg(devc, IFA, voice, 0xff00); 744 emu10k_write_reg(devc, VTFT, voice, 0xffffffff); 745 emu10k_write_reg(devc, CVCF, voice, 0xffffffff); 746 emu10k_set_loop_stop(devc, voice, 0); 747 748 pitch_target = emu10k_rate_to_linearpitch(SAMPLE_RATE); 749 initial_pitch = emu10k_rate_to_pitch(SAMPLE_RATE) >> 8; 750 emu10k_write_reg(devc, PTRX_PITCHTARGET, voice, pitch_target); 751 emu10k_write_reg(devc, CPF_CURRENTPITCH, voice, pitch_target); 752 emu10k_write_reg(devc, IP, voice, initial_pitch); 753 } 754 755 static void 756 emu10k_stop_voice(emu10k_devc_t *devc, int voice) 757 { 758 emu10k_write_reg(devc, IFA, voice, 0xffff); 759 emu10k_write_reg(devc, VTFT, voice, 0xffff); 760 emu10k_write_reg(devc, PTRX_PITCHTARGET, voice, 0); 761 emu10k_write_reg(devc, CPF_CURRENTPITCH, voice, 0); 762 emu10k_write_reg(devc, IP, voice, 0); 763 emu10k_set_loop_stop(devc, voice, 1); 764 } 765 766 static void 767 emu10k_reset_pair(emu10k_portc_t *portc, int voice, uint8_t *routing, 768 int buf_offset) 769 { 770 emu10k_devc_t *devc = portc->devc; 771 772 /* Left channel */ 773 /* Intial filter cutoff and attenuation */ 774 emu10k_write_reg(devc, IFA, voice, 0xffff); 775 /* Volume envelope decay and sustain */ 776 emu10k_write_reg(devc, VEDS, voice, 0x0); 777 /* Volume target and Filter cutoff target */ 778 emu10k_write_reg(devc, VTFT, voice, 0xffff); 779 /* Pitch target and sends A and B */ 780 emu10k_write_reg(devc, PTAB, voice, 0x0); 781 782 /* The same for right channel */ 783 emu10k_write_reg(devc, IFA, voice + 1, 0xffff); 784 emu10k_write_reg(devc, VEDS, voice + 1, 0x0); 785 emu10k_write_reg(devc, VTFT, voice + 1, 0xffff); 786 emu10k_write_reg(devc, PTAB, voice + 1, 0x0); 787 788 /* now setup the voices and go! */ 789 emu10k_setup_voice(portc, voice, LEFT_CH, buf_offset); 790 emu10k_setup_voice(portc, voice + 1, RIGHT_CH, buf_offset); 791 792 emu10k_write_routing(devc, voice, routing); 793 emu10k_write_routing(devc, voice + 1, routing); 794 } 795 796 void 797 emu10k_start_play(emu10k_portc_t *portc) 798 { 799 emu10k_devc_t *devc = portc->devc; 800 801 ASSERT(mutex_owned(&devc->mutex)); 802 emu10k_prepare_voice(devc, 0); 803 emu10k_prepare_voice(devc, 1); 804 805 emu10k_prepare_voice(devc, 2); 806 emu10k_prepare_voice(devc, 3); 807 808 emu10k_prepare_voice(devc, 4); 809 emu10k_prepare_voice(devc, 5); 810 811 emu10k_prepare_voice(devc, 6); 812 emu10k_prepare_voice(devc, 7); 813 814 emu10k_prepare_voice(devc, 8); 815 emu10k_prepare_voice(devc, 9); 816 817 /* arrange to receive full loop interrupts on channel 8 */ 818 emu10k_write_reg(devc, CLIEL, 0, (1U << 8)); 819 820 /* initialize our position counter... */ 821 portc->pos = 822 (emu10k_read_reg(devc, QKBCA, 0) & 0xffffff) - 823 (portc->memptr >> 2); 824 825 /* Trigger playback on all voices */ 826 emu10k_write_reg(devc, VEDS, 0, 0x7f7f); 827 emu10k_write_reg(devc, VEDS, 1, 0x7f7f); 828 emu10k_write_reg(devc, VEDS, 2, 0x7f7f); 829 emu10k_write_reg(devc, VEDS, 3, 0x7f7f); 830 emu10k_write_reg(devc, VEDS, 4, 0x7f7f); 831 emu10k_write_reg(devc, VEDS, 5, 0x7f7f); 832 emu10k_write_reg(devc, VEDS, 6, 0x7f7f); 833 emu10k_write_reg(devc, VEDS, 7, 0x7f7f); 834 emu10k_write_reg(devc, VEDS, 8, 0x7f7f); 835 emu10k_write_reg(devc, VEDS, 9, 0x7f7f); 836 837 portc->active = B_TRUE; 838 } 839 840 void 841 emu10k_stop_play(emu10k_portc_t *portc) 842 { 843 emu10k_devc_t *devc = portc->devc; 844 845 emu10k_stop_voice(devc, 0); 846 emu10k_stop_voice(devc, 1); 847 emu10k_stop_voice(devc, 2); 848 emu10k_stop_voice(devc, 3); 849 emu10k_stop_voice(devc, 4); 850 emu10k_stop_voice(devc, 5); 851 emu10k_stop_voice(devc, 6); 852 emu10k_stop_voice(devc, 7); 853 emu10k_stop_voice(devc, 8); 854 emu10k_stop_voice(devc, 9); 855 856 portc->active = B_FALSE; 857 } 858 859 void 860 emu10k_reset_play(emu10k_portc_t *portc) 861 { 862 emu10k_devc_t *devc = portc->devc; 863 uint32_t offs; 864 865 offs = (portc->buf_size / portc->channels) * 2; 866 867 if (devc->feature_mask & SB_71) { 868 emu10k_reset_pair(portc, 0, front_routing, 0); 869 emu10k_reset_pair(portc, 2, clfe_routing, offs); 870 emu10k_reset_pair(portc, 4, surr_routing, 2 * offs); 871 emu10k_reset_pair(portc, 6, side_routing, 3 * offs); 872 } else if (devc->feature_mask & SB_51) { 873 emu10k_reset_pair(portc, 0, front_routing, 0); 874 emu10k_reset_pair(portc, 2, clfe_routing, offs); 875 emu10k_reset_pair(portc, 4, surr_routing, 2 * offs); 876 } else { 877 emu10k_reset_pair(portc, 0, front_routing, 0); 878 emu10k_reset_pair(portc, 2, surr_routing, offs); 879 } 880 emu10k_setup_silence(portc, 8); 881 emu10k_setup_silence(portc, 9); 882 883 /* 884 * This way we can use voices 8 and 9 for timing, we have 885 * programmed them to be just the size of a single fragment, 886 * that way when they loop we get a clean interrupt. 887 */ 888 emu10k_write_routing(devc, 8, no_routing); 889 emu10k_write_routing(devc, 9, no_routing); 890 portc->pos = 0; 891 } 892 893 uint32_t emu10k_vars[5]; 894 895 void 896 emu10k_update_play(emu10k_portc_t *portc) 897 { 898 emu10k_devc_t *devc = portc->devc; 899 uint32_t cnt, pos; 900 901 /* 902 * Note: position is given as stereo samples, i.e. frames. 903 */ 904 pos = emu10k_read_reg(devc, QKBCA, 0) & 0xffffff; 905 pos -= (portc->memptr >> 2); 906 907 if (pos <= portc->pos) { 908 cnt = portc->nframes - portc->pos; 909 cnt += pos; 910 } else { 911 cnt = (pos - portc->pos); 912 } 913 if (portc->dopos) { 914 emu10k_vars[0] = portc->pos; 915 emu10k_vars[1] = pos; 916 emu10k_vars[2] = (uint32_t)portc->count; 917 emu10k_vars[3] = cnt; 918 portc->dopos = 0; 919 } 920 if (cnt > portc->nframes) { 921 printf("Got bogus count %u\n", cnt); 922 cnt = portc->fragfr; 923 } 924 ASSERT(cnt <= portc->nframes); 925 portc->count += cnt; 926 portc->pos = pos; 927 } 928 929 void 930 emu10k_start_rec(emu10k_portc_t *portc) 931 { 932 emu10k_devc_t *devc = portc->devc; 933 uint32_t tmp; 934 935 /* Intr enable */ 936 OUTL(devc, INL(devc, devc->regs + IE) | IE_MB | IE_AB, 937 devc->regs + IE); 938 939 tmp = 0; /* setup 48Kz */ 940 if (devc->feature_mask & (SB_AUDIGY|SB_AUDIGY2|SB_AUDIGY2VAL)) 941 tmp |= 0x30; /* Left/right channel enable */ 942 else 943 tmp |= 0x18; /* Left/right channel enable */ 944 emu10k_write_reg(devc, ADCSR, 0, tmp); /* GO */ 945 946 portc->active = B_TRUE; 947 } 948 949 void 950 emu10k_stop_rec(emu10k_portc_t *portc) 951 { 952 emu10k_devc_t *devc = portc->devc; 953 954 ASSERT(mutex_owned(&devc->mutex)); 955 emu10k_write_reg(devc, ADCSR, 0, 0); 956 957 portc->active = B_FALSE; 958 } 959 void 960 emu10k_reset_rec(emu10k_portc_t *portc) 961 { 962 emu10k_devc_t *devc = portc->devc; 963 uint32_t sz; 964 965 switch (portc->buf_size) { 966 case 4096: 967 sz = 15; 968 break; 969 case 8192: 970 sz = 19; 971 break; 972 case 16384: 973 sz = 23; 974 break; 975 case 32768: 976 sz = 27; 977 break; 978 case 65536: 979 sz = 31; 980 break; 981 } 982 emu10k_write_reg(devc, ADCBA, 0, portc->buf_paddr); 983 emu10k_write_reg(devc, ADCBS, 0, sz); 984 emu10k_write_reg(devc, ADCSR, 0, 0); /* reset for phase */ 985 portc->pos = 0; 986 OUTL(devc, INL(devc, devc->regs + IE) & ~(IE_MB | IE_AB), 987 devc->regs + IE); 988 } 989 990 void 991 emu10k_update_rec(emu10k_portc_t *portc) 992 { 993 emu10k_devc_t *devc = portc->devc; 994 uint32_t cnt, pos; 995 996 /* given in bytes, we divide all counts by 4 to get samples */ 997 pos = emu10k_read_reg(devc, 998 (devc->feature_mask & SB_LIVE) ? MIDX : ADCIDX, 0); 999 if (pos <= portc->pos) { 1000 cnt = ((portc->buf_size) - portc->pos) >> 2; 1001 cnt += (pos >> 2); 1002 } else { 1003 cnt = ((pos - portc->pos) >> 2); 1004 } 1005 portc->count += cnt; 1006 portc->pos = pos; 1007 } 1008 1009 int 1010 emu10k_alloc_port(emu10k_devc_t *devc, int num) 1011 { 1012 emu10k_portc_t *portc; 1013 size_t len; 1014 ddi_dma_cookie_t cookie; 1015 uint_t count; 1016 int dir; 1017 unsigned caps; 1018 audio_dev_t *adev; 1019 int i, n; 1020 1021 adev = devc->adev; 1022 portc = kmem_zalloc(sizeof (*portc), KM_SLEEP); 1023 devc->portc[num] = portc; 1024 portc->devc = devc; 1025 portc->started = B_FALSE; 1026 1027 portc->memptr = devc->audio_memptr; 1028 devc->audio_memptr += (DMABUF_SIZE + 4095) & ~4095; 1029 1030 switch (num) { 1031 case EMU10K_REC: 1032 portc->syncdir = DDI_DMA_SYNC_FORKERNEL; 1033 caps = ENGINE_INPUT_CAP; 1034 dir = DDI_DMA_READ; 1035 portc->channels = 2; 1036 portc->start_port = emu10k_start_rec; 1037 portc->stop_port = emu10k_stop_rec; 1038 portc->reset_port = emu10k_reset_rec; 1039 portc->update_port = emu10k_update_rec; 1040 /* This is the minimum record buffer size. */ 1041 portc->buf_size = 4096; 1042 portc->nfrags = 2; 1043 portc->nframes = 4096 / 4; 1044 portc->fragfr = portc->nframes / portc->nfrags; 1045 break; 1046 case EMU10K_PLAY: 1047 portc->syncdir = DDI_DMA_SYNC_FORDEV; 1048 caps = ENGINE_OUTPUT_CAP; 1049 dir = DDI_DMA_WRITE; 1050 portc->channels = 8; 1051 portc->start_port = emu10k_start_play; 1052 portc->stop_port = emu10k_stop_play; 1053 portc->reset_port = emu10k_reset_play; 1054 portc->update_port = emu10k_update_play; 1055 /* XXX: this could probably be tunable */ 1056 portc->nfrags = 2; 1057 portc->fragfr = 288; 1058 portc->nframes = portc->nfrags * portc->fragfr; 1059 portc->buf_size = portc->nframes * portc->channels * 2; 1060 break; 1061 default: 1062 return (DDI_FAILURE); 1063 } 1064 1065 /* 1066 * Fragments that are not powers of two don't seem to work 1067 * at all with EMU10K. For simplicity's sake, we eliminate 1068 * the question and fix the interrupt rate. This is also the 1069 * logical minimum for record, which requires at least 4K for 1070 * the record size. 1071 */ 1072 1073 if (portc->buf_size > DMABUF_SIZE) { 1074 cmn_err(CE_NOTE, "Buffer size %d is too large (max %d)", 1075 (int)portc->buf_size, DMABUF_SIZE); 1076 portc->buf_size = DMABUF_SIZE; 1077 } 1078 1079 /* Alloc buffers */ 1080 if (ddi_dma_alloc_handle(devc->dip, &dma_attr_buf, DDI_DMA_SLEEP, NULL, 1081 &portc->buf_dmah) != DDI_SUCCESS) { 1082 audio_dev_warn(adev, "failed to allocate BUF handle"); 1083 return (DDI_FAILURE); 1084 } 1085 1086 if (ddi_dma_mem_alloc(portc->buf_dmah, portc->buf_size, 1087 &dev_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, 1088 &portc->buf_kaddr, &len, &portc->buf_acch) != DDI_SUCCESS) { 1089 audio_dev_warn(adev, "failed to allocate BUF memory"); 1090 return (DDI_FAILURE); 1091 } 1092 1093 if (ddi_dma_addr_bind_handle(portc->buf_dmah, NULL, portc->buf_kaddr, 1094 len, DDI_DMA_CONSISTENT | dir, DDI_DMA_SLEEP, 1095 NULL, &cookie, &count) != DDI_SUCCESS) { 1096 audio_dev_warn(adev, "failed binding BUF DMA handle"); 1097 return (DDI_FAILURE); 1098 } 1099 portc->buf_paddr = cookie.dmac_address; 1100 1101 if ((devc->feature_mask & SB_LIVE) && 1102 (portc->buf_paddr & 0x80000000)) { 1103 audio_dev_warn(adev, "Got DMA buffer beyond 2G limit."); 1104 return (DDI_FAILURE); 1105 } 1106 1107 if (num == EMU10K_PLAY) { /* Output device */ 1108 n = portc->memptr / 4096; 1109 /* 1110 * Fill the page table 1111 */ 1112 for (i = 0; i < portc->buf_size / 4096; i++) { 1113 FILL_PAGE_MAP_ENTRY(n + i, 1114 portc->buf_paddr + i * 4096); 1115 } 1116 1117 (void) ddi_dma_sync(devc->pt_dmah, 0, 0, DDI_DMA_SYNC_FORDEV); 1118 } 1119 1120 portc->engine = audio_engine_alloc(&emu10k_engine_ops, caps); 1121 if (portc->engine == NULL) { 1122 audio_dev_warn(adev, "audio_engine_alloc failed"); 1123 return (DDI_FAILURE); 1124 } 1125 1126 audio_engine_set_private(portc->engine, portc); 1127 audio_dev_add_engine(adev, portc->engine); 1128 1129 return (DDI_SUCCESS); 1130 } 1131 1132 int 1133 emu10k_setup_intrs(emu10k_devc_t *devc) 1134 { 1135 uint_t ipri; 1136 int actual; 1137 int rv; 1138 ddi_intr_handle_t ih[1]; 1139 1140 rv = ddi_intr_alloc(devc->dip, ih, DDI_INTR_TYPE_FIXED, 1141 0, 1, &actual, DDI_INTR_ALLOC_STRICT); 1142 if ((rv != DDI_SUCCESS) || (actual != 1)) { 1143 audio_dev_warn(devc->adev, 1144 "Can't alloc interrupt handle (rv %d actual %d)", 1145 rv, actual); 1146 return (DDI_FAILURE); 1147 } 1148 1149 if (ddi_intr_get_pri(ih[0], &ipri) != DDI_SUCCESS) { 1150 audio_dev_warn(devc->adev, "Can't get interrupt priority"); 1151 (void) ddi_intr_free(ih[0]); 1152 return (DDI_FAILURE); 1153 } 1154 1155 if (ddi_intr_add_handler(ih[0], emu10k_intr, devc, NULL) != 1156 DDI_SUCCESS) { 1157 audio_dev_warn(devc->adev, "Can't add interrupt handler"); 1158 (void) ddi_intr_free(ih[0]); 1159 return (DDI_FAILURE); 1160 } 1161 1162 devc->ih = ih[0]; 1163 mutex_init(&devc->mutex, NULL, MUTEX_DRIVER, DDI_INTR_PRI(ipri)); 1164 return (DDI_SUCCESS); 1165 } 1166 1167 void 1168 emu10k_destroy(emu10k_devc_t *devc) 1169 { 1170 if (devc->ih != NULL) { 1171 (void) ddi_intr_disable(devc->ih); 1172 (void) ddi_intr_remove_handler(devc->ih); 1173 (void) ddi_intr_free(devc->ih); 1174 mutex_destroy(&devc->mutex); 1175 } 1176 1177 if (devc->ksp) { 1178 kstat_delete(devc->ksp); 1179 } 1180 1181 if (devc->silence_paddr) { 1182 (void) ddi_dma_unbind_handle(devc->silence_dmah); 1183 } 1184 if (devc->silence_acch) { 1185 ddi_dma_mem_free(&devc->silence_acch); 1186 } 1187 if (devc->silence_dmah) { 1188 ddi_dma_free_handle(&devc->silence_dmah); 1189 } 1190 1191 if (devc->pt_paddr) { 1192 (void) ddi_dma_unbind_handle(devc->pt_dmah); 1193 } 1194 if (devc->pt_acch) { 1195 ddi_dma_mem_free(&devc->pt_acch); 1196 } 1197 if (devc->pt_dmah) { 1198 ddi_dma_free_handle(&devc->pt_dmah); 1199 } 1200 1201 1202 for (int i = 0; i < CTL_MAX; i++) { 1203 emu10k_ctrl_t *ec = &devc->ctrls[i]; 1204 if (ec->ctrl != NULL) { 1205 audio_dev_del_control(ec->ctrl); 1206 ec->ctrl = NULL; 1207 } 1208 } 1209 1210 for (int i = 0; i < EMU10K_NUM_PORTC; i++) { 1211 emu10k_portc_t *portc = devc->portc[i]; 1212 if (!portc) 1213 continue; 1214 if (portc->engine) { 1215 audio_dev_remove_engine(devc->adev, portc->engine); 1216 audio_engine_free(portc->engine); 1217 } 1218 if (portc->buf_paddr) { 1219 (void) ddi_dma_unbind_handle(portc->buf_dmah); 1220 } 1221 if (portc->buf_acch) { 1222 ddi_dma_mem_free(&portc->buf_acch); 1223 } 1224 if (portc->buf_dmah) { 1225 ddi_dma_free_handle(&portc->buf_dmah); 1226 } 1227 kmem_free(portc, sizeof (*portc)); 1228 } 1229 1230 if (devc->ac97 != NULL) { 1231 ac97_free(devc->ac97); 1232 } 1233 if (devc->adev != NULL) { 1234 audio_dev_free(devc->adev); 1235 } 1236 if (devc->regsh != NULL) { 1237 ddi_regs_map_free(&devc->regsh); 1238 } 1239 if (devc->pcih != NULL) { 1240 pci_config_teardown(&devc->pcih); 1241 } 1242 1243 kmem_free(devc, sizeof (*devc)); 1244 } 1245 1246 static void 1247 emu10k_init_voice(emu10k_devc_t *devc, int voice) 1248 { 1249 emu10k_set_loop_stop(devc, voice, 1); 1250 1251 emu10k_write_reg(devc, VEDS, voice, 0x0); 1252 emu10k_write_reg(devc, IP, voice, 0x0); 1253 emu10k_write_reg(devc, VTFT, voice, 0xffff); 1254 emu10k_write_reg(devc, CVCF, voice, 0xffff); 1255 emu10k_write_reg(devc, PTAB, voice, 0x0); 1256 emu10k_write_reg(devc, CPF, voice, 0x0); 1257 emu10k_write_reg(devc, CCR, voice, 0x0); 1258 emu10k_write_reg(devc, SCSA, voice, 0x0); 1259 emu10k_write_reg(devc, SDL, voice, 0x10); 1260 emu10k_write_reg(devc, QKBCA, voice, 0x0); 1261 emu10k_write_reg(devc, Z1, voice, 0x0); 1262 emu10k_write_reg(devc, Z2, voice, 0x0); 1263 1264 if (devc->feature_mask & (SB_AUDIGY|SB_AUDIGY2|SB_AUDIGY2VAL)) 1265 emu10k_write_reg(devc, SRDA, voice, 0x03020100); 1266 else 1267 emu10k_write_reg(devc, FXRT, voice, 0x32100000); 1268 1269 emu10k_write_reg(devc, MEHA, voice, 0x0); 1270 emu10k_write_reg(devc, MEDS, voice, 0x0); 1271 emu10k_write_reg(devc, IFA, voice, 0xffff); 1272 emu10k_write_reg(devc, PEFE, voice, 0x0); 1273 emu10k_write_reg(devc, VFM, voice, 0x0); 1274 emu10k_write_reg(devc, TMFQ, voice, 24); 1275 emu10k_write_reg(devc, VVFQ, voice, 24); 1276 emu10k_write_reg(devc, TMPE, voice, 0x0); 1277 emu10k_write_reg(devc, VLV, voice, 0x0); 1278 emu10k_write_reg(devc, MLV, voice, 0x0); 1279 emu10k_write_reg(devc, VEHA, voice, 0x0); 1280 emu10k_write_reg(devc, VEV, voice, 0x0); 1281 emu10k_write_reg(devc, MEV, voice, 0x0); 1282 1283 if (devc->feature_mask & (SB_AUDIGY|SB_AUDIGY2|SB_AUDIGY2VAL)) { 1284 emu10k_write_reg(devc, CSBA, voice, 0x0); 1285 emu10k_write_reg(devc, CSDC, voice, 0x0); 1286 emu10k_write_reg(devc, CSFE, voice, 0x0); 1287 emu10k_write_reg(devc, CSHG, voice, 0x0); 1288 emu10k_write_reg(devc, SRHE, voice, 0x3f3f3f3f); 1289 } 1290 } 1291 1292 static void 1293 emu10k_refresh_mixer(emu10k_devc_t *devc) 1294 { 1295 uint32_t val; 1296 uint32_t set; 1297 1298 for (int gpr = 0; gpr < MAX_GPR; gpr++) { 1299 if (devc->gpr_shadow[gpr].valid) { 1300 emu10k_write_reg(devc, gpr + GPR0, 0, 1301 devc->gpr_shadow[gpr].value); 1302 } 1303 } 1304 1305 set = devc->ctrls[CTL_JACK3].val; 1306 if (devc->feature_mask & SB_INVSP) { 1307 set = !set; 1308 } 1309 1310 if (devc->feature_mask & (SB_AUDIGY|SB_AUDIGY2|SB_AUDIGY2VAL)) { 1311 val = INL(devc, devc->regs + 0x18); 1312 val &= ~A_IOCFG_GPOUT0; 1313 val |= set ? 0x44 : 0x40; 1314 OUTL(devc, val, devc->regs + 0x18); 1315 1316 } else if (devc->feature_mask & SB_LIVE) { 1317 val = INL(devc, devc->regs + HCFG); 1318 val &= ~HCFG_GPOUT0; 1319 val |= set ? HCFG_GPOUT0 : 0; 1320 OUTL(devc, val, devc->regs + HCFG); 1321 } 1322 } 1323 1324 int 1325 emu10k_hwinit(emu10k_devc_t *devc) 1326 { 1327 1328 unsigned int tmp, i; 1329 unsigned int reg; 1330 1331 ASSERT(mutex_owned(&devc->mutex)); 1332 1333 emu10k_write_reg(devc, AC97SLOT, 0, AC97SLOT_CENTER | AC97SLOT_LFE); 1334 1335 OUTL(devc, 0x00000000, devc->regs + 0x0c); /* Intr disable */ 1336 OUTL(devc, HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE_MASK | 1337 HCFG_MUTEBUTTONENABLE, 1338 devc->regs + HCFG); 1339 1340 emu10k_write_reg(devc, MBS, 0, 0x0); 1341 emu10k_write_reg(devc, MBA, 0, 0x0); 1342 emu10k_write_reg(devc, FXBS, 0, 0x0); 1343 emu10k_write_reg(devc, FXBA, 0, 0x0); 1344 emu10k_write_reg(devc, ADCBS, 0, 0x0); 1345 emu10k_write_reg(devc, ADCBA, 0, 0x0); 1346 1347 OUTL(devc, 0, devc->regs + IE); 1348 emu10k_write_reg(devc, CLIEL, 0, 0x0); 1349 emu10k_write_reg(devc, CLIEH, 0, 0x0); 1350 if (!(devc->feature_mask & SB_LIVE)) { 1351 emu10k_write_reg(devc, HLIEL, 0, 0x0); 1352 emu10k_write_reg(devc, HLIEH, 0, 0x0); 1353 } 1354 emu10k_write_reg(devc, CLIPL, 0, 0xffffffff); 1355 emu10k_write_reg(devc, CLIPH, 0, 0xffffffff); 1356 emu10k_write_reg(devc, SOLL, 0, 0xffffffff); 1357 emu10k_write_reg(devc, SOLH, 0, 0xffffffff); 1358 1359 1360 if (devc->feature_mask & (SB_AUDIGY|SB_AUDIGY2|SB_AUDIGY2VAL)) { 1361 emu10k_write_reg(devc, SOC, 0, 0xf00); /* ?? */ 1362 emu10k_write_reg(devc, AC97SLOT, 0, 0x3); /* ?? */ 1363 } 1364 1365 for (i = 0; i < 64; i++) 1366 emu10k_init_voice(devc, i); 1367 1368 emu10k_write_reg(devc, SCS0, 0, 0x2109204); 1369 emu10k_write_reg(devc, SCS1, 0, 0x2109204); 1370 emu10k_write_reg(devc, SCS2, 0, 0x2109204); 1371 1372 emu10k_write_reg(devc, PTBA, 0, devc->pt_paddr); 1373 tmp = emu10k_read_reg(devc, PTBA, 0); 1374 1375 emu10k_write_reg(devc, TCBA, 0, 0x0); 1376 emu10k_write_reg(devc, TCBS, 0, 0x4); 1377 1378 reg = 0; 1379 if (devc->feature_mask & SB_71) { 1380 reg = AC97SLOT_CENTER | AC97SLOT_LFE | AC97SLOT_REAR_LEFT | 1381 AC97SLOT_REAR_RIGHT; 1382 } else if (devc->feature_mask & SB_51) { 1383 reg = AC97SLOT_CENTER | AC97SLOT_LFE; 1384 } 1385 if (devc->feature_mask & (SB_AUDIGY|SB_AUDIGY2|SB_AUDIGY2VAL)) 1386 reg |= 0x40; 1387 emu10k_write_reg(devc, AC97SLOT, 0, reg); 1388 1389 if (devc->feature_mask & SB_AUDIGY2) { 1390 /* Enable analog outputs on Audigy2 */ 1391 int tmp; 1392 1393 /* Setup SRCMulti_I2S SamplingRate */ 1394 tmp = emu10k_read_reg(devc, EHC, 0); 1395 tmp &= 0xfffff1ff; 1396 tmp |= (0x2 << 9); 1397 emu10k_write_reg(devc, EHC, 0, tmp); 1398 /* emu10k_write_reg (devc, SOC, 0, 0x00000000); */ 1399 1400 /* Setup SRCSel (Enable Spdif,I2S SRCMulti) */ 1401 OUTL(devc, 0x600000, devc->regs + 0x20); 1402 OUTL(devc, 0x14, devc->regs + 0x24); 1403 1404 /* Setup SRCMulti Input Audio Enable */ 1405 OUTL(devc, 0x6E0000, devc->regs + 0x20); 1406 1407 OUTL(devc, 0xFF00FF00, devc->regs + 0x24); 1408 1409 /* Setup I2S ASRC Enable (HC register) */ 1410 tmp = INL(devc, devc->regs + HCFG); 1411 tmp |= 0x00000070; 1412 OUTL(devc, tmp, devc->regs + HCFG); 1413 1414 /* 1415 * Unmute Analog now. Set GPO6 to 1 for Apollo. 1416 * This has to be done after init ALice3 I2SOut beyond 48KHz. 1417 * So, sequence is important 1418 */ 1419 tmp = INL(devc, devc->regs + 0x18); 1420 tmp |= 0x0040; 1421 1422 OUTL(devc, tmp, devc->regs + 0x18); 1423 } 1424 1425 if (devc->feature_mask & SB_AUDIGY2VAL) { 1426 /* Enable analog outputs on Audigy2 */ 1427 int tmp; 1428 1429 /* Setup SRCMulti_I2S SamplingRate */ 1430 tmp = emu10k_read_reg(devc, EHC, 0); 1431 tmp &= 0xfffff1ff; 1432 tmp |= (0x2 << 9); 1433 emu10k_write_reg(devc, EHC, 0, tmp); 1434 1435 /* Setup SRCSel (Enable Spdif,I2S SRCMulti) */ 1436 OUTL(devc, 0x600000, devc->regs + 0x20); 1437 OUTL(devc, 0x14, devc->regs + 0x24); 1438 1439 /* Setup SRCMulti Input Audio Enable */ 1440 OUTL(devc, 0x7B0000, devc->regs + 0x20); 1441 OUTL(devc, 0xFF000000, devc->regs + 0x24); 1442 1443 /* SPDIF output enable */ 1444 OUTL(devc, 0x7A0000, devc->regs + 0x20); 1445 OUTL(devc, 0xFF000000, devc->regs + 0x24); 1446 1447 tmp = INL(devc, devc->regs + 0x18) & ~0x8; 1448 OUTL(devc, tmp, devc->regs + 0x18); 1449 } 1450 1451 emu10k_write_reg(devc, SOLL, 0, 0xffffffff); 1452 emu10k_write_reg(devc, SOLH, 0, 0xffffffff); 1453 1454 if (devc->feature_mask & (SB_AUDIGY|SB_AUDIGY2|SB_AUDIGY2VAL)) { 1455 unsigned int mode = 0; 1456 1457 if (devc->feature_mask & (SB_AUDIGY2|SB_AUDIGY2VAL)) 1458 mode |= HCFG_AC3ENABLE_GPSPDIF | HCFG_AC3ENABLE_CDSPDIF; 1459 OUTL(devc, 1460 HCFG_AUDIOENABLE | HCFG_AUTOMUTE | 1461 HCFG_JOYENABLE | A_HCFG_VMUTE | 1462 A_HCFG_AUTOMUTE | mode, devc->regs + HCFG); 1463 1464 OUTL(devc, INL(devc, devc->regs + 0x18) | 1465 0x0004, devc->regs + 0x18); /* GPIO (S/PDIF enable) */ 1466 1467 1468 /* enable IR port */ 1469 tmp = INL(devc, devc->regs + 0x18); 1470 OUTL(devc, tmp | A_IOCFG_GPOUT2, devc->regs + 0x18); 1471 drv_usecwait(500); 1472 OUTL(devc, tmp | A_IOCFG_GPOUT1 | A_IOCFG_GPOUT2, 1473 devc->regs + 0x18); 1474 drv_usecwait(100); 1475 OUTL(devc, tmp, devc->regs + 0x18); 1476 } else { 1477 OUTL(devc, 1478 HCFG_AUDIOENABLE | HCFG_LOCKTANKCACHE_MASK | 1479 HCFG_AUTOMUTE | HCFG_JOYENABLE, devc->regs + HCFG); 1480 } 1481 1482 1483 /* enable IR port */ 1484 tmp = INL(devc, devc->regs + HCFG); 1485 OUTL(devc, tmp | HCFG_GPOUT2, devc->regs + HCFG); 1486 drv_usecwait(500); 1487 OUTL(devc, tmp | HCFG_GPOUT1 | HCFG_GPOUT2, devc->regs + HCFG); 1488 drv_usecwait(100); 1489 OUTL(devc, tmp, devc->regs + HCFG); 1490 1491 1492 /* 1493 * Start by configuring for analog mode. 1494 */ 1495 if (devc->feature_mask & (SB_AUDIGY|SB_AUDIGY2|SB_AUDIGY2VAL)) { 1496 reg = INL(devc, devc->regs + 0x18) & ~A_IOCFG_GPOUT0; 1497 reg |= ((devc->feature_mask & SB_INVSP) ? 0x4 : 0); 1498 OUTL(devc, reg, devc->regs + 0x18); 1499 } 1500 if (devc->feature_mask & SB_LIVE) { /* SBLIVE */ 1501 reg = INL(devc, devc->regs + HCFG) & ~HCFG_GPOUT0; 1502 reg |= ((devc->feature_mask & SB_INVSP) ? HCFG_GPOUT0 : 0); 1503 OUTL(devc, reg, devc->regs + HCFG); 1504 } 1505 1506 if (devc->feature_mask & SB_AUDIGY2VAL) { 1507 OUTL(devc, INL(devc, devc->regs + 0x18) | 0x0060, 1508 devc->regs + 0x18); 1509 } else if (devc->feature_mask & SB_AUDIGY2) { 1510 OUTL(devc, INL(devc, devc->regs + 0x18) | 0x0040, 1511 devc->regs + 0x18); 1512 } else if (devc->feature_mask & SB_AUDIGY) { 1513 OUTL(devc, INL(devc, devc->regs + 0x18) | 0x0080, 1514 devc->regs + 0x18); 1515 } 1516 1517 emu10k_init_effects(devc); 1518 1519 return (DDI_SUCCESS); 1520 } 1521 1522 static const int db2lin_101[101] = { 1523 0x00000000, 1524 0x0024B53A, 0x002750CA, 0x002A1BC6, 0x002D198D, 0x00304DBA, 0x0033BC2A, 1525 0x00376901, 0x003B58AF, 0x003F8FF1, 0x004413DF, 0x0048E9EA, 0x004E17E9, 1526 0x0053A419, 0x0059952C, 0x005FF24E, 0x0066C32A, 0x006E0FFB, 0x0075E18D, 1527 0x007E414F, 0x0087395B, 0x0090D482, 0x009B1E5B, 0x00A6234F, 0x00B1F0A7, 1528 0x00BE94A1, 0x00CC1E7C, 0x00DA9E8D, 0x00EA2650, 0x00FAC881, 0x010C9931, 1529 0x011FADDC, 0x01341D87, 0x014A00D8, 0x01617235, 0x017A8DE6, 0x01957233, 1530 0x01B23F8D, 0x01D118B1, 0x01F222D4, 0x021585D1, 0x023B6C57, 0x0264041D, 1531 0x028F7E19, 0x02BE0EBD, 0x02EFEE33, 0x032558A2, 0x035E8E7A, 0x039BD4BC, 1532 0x03DD7551, 0x0423BF61, 0x046F07B5, 0x04BFA91B, 0x051604D5, 0x0572830D, 1533 0x05D59354, 0x063FAD27, 0x06B15080, 0x072B0673, 0x07AD61CD, 0x0838FFCA, 1534 0x08CE88D3, 0x096EB147, 0x0A1A3A53, 0x0AD1F2E0, 0x0B96B889, 0x0C6978A5, 1535 0x0D4B316A, 0x0E3CF31B, 0x0F3FE155, 0x10553469, 0x117E3AD9, 0x12BC5AEA, 1536 0x14111457, 0x157E0219, 0x1704DC5E, 0x18A77A97, 0x1A67D5B6, 0x1C480A87, 1537 0x1E4A5C45, 0x2071374D, 0x22BF3412, 0x25371A37, 0x27DBE3EF, 0x2AB0C18F, 1538 0x2DB91D6F, 0x30F89FFD, 0x34733433, 0x382D0C46, 0x3C2AA6BD, 0x4070D3D9, 1539 0x4504BB66, 0x49EBE2F1, 0x4F2C346F, 0x54CC0565, 0x5AD21E86, 0x6145C3E7, 1540 0x682EBDBD, 0x6F9561C4, 0x77829D4D, 1541 0x7fffffff 1542 }; 1543 1544 static int 1545 emu10k_convert_fixpoint(int val) 1546 { 1547 if (val < 0) 1548 val = 0; 1549 if (val > 100) 1550 val = 100; 1551 return (db2lin_101[val]); 1552 } 1553 1554 static void 1555 emu10k_write_gpr(emu10k_devc_t *devc, int gpr, uint32_t value) 1556 { 1557 ASSERT(gpr < MAX_GPR); 1558 devc->gpr_shadow[gpr].valid = B_TRUE; 1559 devc->gpr_shadow[gpr].value = value; 1560 if (!devc->suspended) { 1561 emu10k_write_reg(devc, gpr + GPR0, 0, value); 1562 } 1563 } 1564 1565 static int 1566 emu10k_set_stereo(void *arg, uint64_t val) 1567 { 1568 emu10k_ctrl_t *ec = arg; 1569 emu10k_devc_t *devc = ec->devc; 1570 uint32_t left, right; 1571 1572 left = (val >> 8) & 0xff; 1573 right = val & 0xff; 1574 if ((left > 100) || (right > 100) || (val & ~(0xffff))) 1575 return (EINVAL); 1576 1577 left = emu10k_convert_fixpoint(left); 1578 right = emu10k_convert_fixpoint(right); 1579 1580 mutex_enter(&devc->mutex); 1581 ec->val = val; 1582 1583 emu10k_write_gpr(devc, ec->gpr_num, left); 1584 emu10k_write_gpr(devc, ec->gpr_num + 1, right); 1585 1586 mutex_exit(&devc->mutex); 1587 return (0); 1588 } 1589 1590 static int 1591 emu10k_set_mono(void *arg, uint64_t val) 1592 { 1593 emu10k_ctrl_t *ec = arg; 1594 emu10k_devc_t *devc = ec->devc; 1595 uint32_t v; 1596 1597 if (val > 100) 1598 return (EINVAL); 1599 1600 v = emu10k_convert_fixpoint(val & 0xff); 1601 1602 mutex_enter(&devc->mutex); 1603 ec->val = val; 1604 emu10k_write_gpr(devc, ec->gpr_num, v); 1605 mutex_exit(&devc->mutex); 1606 return (0); 1607 } 1608 1609 static int 1610 emu10k_get_control(void *arg, uint64_t *val) 1611 { 1612 emu10k_ctrl_t *ec = arg; 1613 emu10k_devc_t *devc = ec->devc; 1614 1615 mutex_enter(&devc->mutex); 1616 *val = ec->val; 1617 mutex_exit(&devc->mutex); 1618 return (0); 1619 } 1620 1621 #define PLAYCTL (AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_PLAY) 1622 #define RECCTL (AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_REC) 1623 #define MONCTL (AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_MONITOR) 1624 #define MAINVOL (PLAYCTL | AUDIO_CTRL_FLAG_MAINVOL) 1625 #define PCMVOL (PLAYCTL | AUDIO_CTRL_FLAG_PCMVOL) 1626 #define RECVOL (RECCTL | AUDIO_CTRL_FLAG_RECVOL) 1627 #define MONVOL (MONCTL | AUDIO_CTRL_FLAG_MONVOL) 1628 1629 static int 1630 emu10k_get_ac97src(void *arg, uint64_t *valp) 1631 { 1632 ac97_ctrl_t *ctrl = arg; 1633 1634 return (ac97_control_get(ctrl, valp)); 1635 } 1636 1637 static int 1638 emu10k_set_ac97src(void *arg, uint64_t value) 1639 { 1640 ac97_ctrl_t *ctrl = arg; 1641 1642 return (ac97_control_set(ctrl, value)); 1643 } 1644 1645 static int 1646 emu10k_set_jack3(void *arg, uint64_t value) 1647 { 1648 emu10k_ctrl_t *ec = arg; 1649 emu10k_devc_t *devc = ec->devc; 1650 uint32_t set_val; 1651 uint32_t val; 1652 1653 set_val = ddi_ffs(value & 0xffffffffU); 1654 set_val--; 1655 mutex_enter(&devc->mutex); 1656 switch (set_val) { 1657 case 0: 1658 case 1: 1659 break; 1660 default: 1661 mutex_exit(&devc->mutex); 1662 return (EINVAL); 1663 } 1664 ec->val = value; 1665 /* center/lfe */ 1666 if (devc->feature_mask & SB_INVSP) { 1667 set_val = !set_val; 1668 } 1669 if (!devc->suspended) { 1670 if (devc->feature_mask & (SB_AUDIGY|SB_AUDIGY2|SB_AUDIGY2VAL)) { 1671 val = INL(devc, devc->regs + 0x18); 1672 val &= ~A_IOCFG_GPOUT0; 1673 val |= set_val ? 0x44 : 0x40; 1674 OUTL(devc, val, devc->regs + 0x18); 1675 1676 } else if (devc->feature_mask & SB_LIVE) { 1677 val = INL(devc, devc->regs + HCFG); 1678 val &= ~HCFG_GPOUT0; 1679 val |= set_val ? HCFG_GPOUT0 : 0; 1680 OUTL(devc, val, devc->regs + HCFG); 1681 } 1682 } 1683 mutex_exit(&devc->mutex); 1684 return (0); 1685 } 1686 1687 static int 1688 emu10k_set_recsrc(void *arg, uint64_t value) 1689 { 1690 emu10k_ctrl_t *ec = arg; 1691 emu10k_devc_t *devc = ec->devc; 1692 uint32_t set_val; 1693 1694 set_val = ddi_ffs(value & 0xffffffffU); 1695 set_val--; 1696 1697 /* 1698 * We start assuming well set up AC'97 for stereomix recording. 1699 */ 1700 switch (set_val) { 1701 case INPUT_AC97: 1702 case INPUT_SPD1: 1703 case INPUT_SPD2: 1704 case INPUT_DIGCD: 1705 case INPUT_AUX2: 1706 case INPUT_LINE2: 1707 case INPUT_STEREOMIX: 1708 break; 1709 default: 1710 return (EINVAL); 1711 } 1712 1713 mutex_enter(&devc->mutex); 1714 ec->val = value; 1715 1716 emu10k_write_gpr(devc, GPR_REC_AC97, (set_val == INPUT_AC97)); 1717 emu10k_write_gpr(devc, GPR_REC_SPDIF1, (set_val == INPUT_SPD1)); 1718 emu10k_write_gpr(devc, GPR_REC_SPDIF2, (set_val == INPUT_SPD2)); 1719 emu10k_write_gpr(devc, GPR_REC_DIGCD, (set_val == INPUT_DIGCD)); 1720 emu10k_write_gpr(devc, GPR_REC_AUX2, (set_val == INPUT_AUX2)); 1721 emu10k_write_gpr(devc, GPR_REC_LINE2, (set_val == INPUT_LINE2)); 1722 emu10k_write_gpr(devc, GPR_REC_PCM, (set_val == INPUT_STEREOMIX)); 1723 1724 mutex_exit(&devc->mutex); 1725 1726 return (0); 1727 } 1728 1729 static void 1730 emu10k_create_stereo(emu10k_devc_t *devc, int ctl, int gpr, 1731 const char *id, int flags, int defval) 1732 { 1733 emu10k_ctrl_t *ec; 1734 audio_ctrl_desc_t desc; 1735 1736 bzero(&desc, sizeof (desc)); 1737 1738 ec = &devc->ctrls[ctl]; 1739 ec->devc = devc; 1740 ec->gpr_num = gpr; 1741 1742 desc.acd_name = id; 1743 desc.acd_type = AUDIO_CTRL_TYPE_STEREO; 1744 desc.acd_minvalue = 0; 1745 desc.acd_maxvalue = 100; 1746 desc.acd_flags = flags; 1747 1748 ec->val = (defval << 8) | defval; 1749 ec->ctrl = audio_dev_add_control(devc->adev, &desc, 1750 emu10k_get_control, emu10k_set_stereo, ec); 1751 1752 mutex_enter(&devc->mutex); 1753 emu10k_write_gpr(devc, gpr, emu10k_convert_fixpoint(defval)); 1754 emu10k_write_gpr(devc, gpr + 1, emu10k_convert_fixpoint(defval)); 1755 mutex_exit(&devc->mutex); 1756 } 1757 1758 static void 1759 emu10k_create_mono(emu10k_devc_t *devc, int ctl, int gpr, 1760 const char *id, int flags, int defval) 1761 { 1762 emu10k_ctrl_t *ec; 1763 audio_ctrl_desc_t desc; 1764 1765 bzero(&desc, sizeof (desc)); 1766 1767 ec = &devc->ctrls[ctl]; 1768 ec->devc = devc; 1769 ec->gpr_num = gpr; 1770 1771 desc.acd_name = id; 1772 desc.acd_type = AUDIO_CTRL_TYPE_MONO; 1773 desc.acd_minvalue = 0; 1774 desc.acd_maxvalue = 100; 1775 desc.acd_flags = flags; 1776 1777 ec->val = defval; 1778 ec->ctrl = audio_dev_add_control(devc->adev, &desc, 1779 emu10k_get_control, emu10k_set_mono, ec); 1780 1781 mutex_enter(&devc->mutex); 1782 emu10k_write_gpr(devc, gpr, emu10k_convert_fixpoint(defval)); 1783 mutex_exit(&devc->mutex); 1784 } 1785 1786 /* 1787 * AC'97 source. The AC'97 PCM record channel is routed to our 1788 * mixer. While we could support the direct monitoring capability of 1789 * the AC'97 part itself, this would not work correctly with outputs 1790 * that are not routed via AC'97 (such as the Live Drive headphones 1791 * or digital outputs.) So we just offer the ability to select one 1792 * AC'97 source, and then offer independent ability to either monitor 1793 * or record from the AC'97 mixer's PCM record channel. 1794 */ 1795 static void 1796 emu10k_create_ac97src(emu10k_devc_t *devc) 1797 { 1798 emu10k_ctrl_t *ec; 1799 audio_ctrl_desc_t desc; 1800 ac97_ctrl_t *ac; 1801 const audio_ctrl_desc_t *acd; 1802 1803 bzero(&desc, sizeof (desc)); 1804 1805 ec = &devc->ctrls[CTL_AC97SRC]; 1806 desc.acd_name = "ac97-source"; 1807 desc.acd_type = AUDIO_CTRL_TYPE_ENUM; 1808 desc.acd_flags = RECCTL; 1809 ec->devc = devc; 1810 ac = ac97_control_find(devc->ac97, AUDIO_CTRL_ID_RECSRC); 1811 if (ac == NULL) { 1812 return; 1813 } 1814 1815 acd = ac97_control_desc(ac); 1816 1817 for (int i = 0; i < 64; i++) { 1818 const char *n; 1819 if (((acd->acd_minvalue & (1ULL << i)) == 0) || 1820 ((n = acd->acd_enum[i]) == NULL)) { 1821 continue; 1822 } 1823 desc.acd_enum[i] = acd->acd_enum[i]; 1824 /* we suppress some port options */ 1825 if ((strcmp(n, AUDIO_PORT_STEREOMIX) == 0) || 1826 (strcmp(n, AUDIO_PORT_MONOMIX) == 0) || 1827 (strcmp(n, AUDIO_PORT_VIDEO) == 0)) { 1828 continue; 1829 } 1830 desc.acd_minvalue |= (1ULL << i); 1831 desc.acd_maxvalue |= (1ULL << i); 1832 } 1833 1834 ec->ctrl = audio_dev_add_control(devc->adev, &desc, 1835 emu10k_get_ac97src, emu10k_set_ac97src, ac); 1836 } 1837 1838 /* 1839 * Record source... this one is tricky. While the chip will 1840 * conceivably let us *mix* some of the audio streams for recording, 1841 * the AC'97 inputs don't have this capability. Offering it to users 1842 * is likely to be confusing, so we offer a single record source 1843 * selection option. Its not ideal, but it ought to be good enough 1844 * for the vast majority of users. 1845 */ 1846 static void 1847 emu10k_create_recsrc(emu10k_devc_t *devc) 1848 { 1849 emu10k_ctrl_t *ec; 1850 audio_ctrl_desc_t desc; 1851 ac97_ctrl_t *ac; 1852 1853 bzero(&desc, sizeof (desc)); 1854 1855 ec = &devc->ctrls[CTL_RECSRC]; 1856 desc.acd_name = AUDIO_CTRL_ID_RECSRC; 1857 desc.acd_type = AUDIO_CTRL_TYPE_ENUM; 1858 desc.acd_flags = RECCTL; 1859 desc.acd_minvalue = 0; 1860 desc.acd_maxvalue = 0; 1861 bzero(desc.acd_enum, sizeof (desc.acd_enum)); 1862 ec->devc = devc; 1863 ac = ac97_control_find(devc->ac97, AUDIO_CTRL_ID_RECSRC); 1864 1865 /* only low order bits set by AC'97 */ 1866 ASSERT(desc.acd_minvalue == desc.acd_maxvalue); 1867 ASSERT((desc.acd_minvalue & ~0xffff) == 0); 1868 1869 /* 1870 * It would be really cool if we could detect whether these 1871 * options are all sensible on a given configuration. Units 1872 * without live-drive support, and units without a physical 1873 * live-drive, simply can't do all these. 1874 */ 1875 if (ac != NULL) { 1876 desc.acd_minvalue |= (1 << INPUT_AC97); 1877 desc.acd_maxvalue |= (1 << INPUT_AC97); 1878 desc.acd_enum[INPUT_AC97] = "ac97"; 1879 ec->val = (1 << INPUT_AC97); 1880 } else { 1881 /* next best guess */ 1882 ec->val = (1 << INPUT_LINE2); 1883 } 1884 1885 desc.acd_minvalue |= (1 << INPUT_SPD1); 1886 desc.acd_maxvalue |= (1 << INPUT_SPD1); 1887 desc.acd_enum[INPUT_SPD1] = AUDIO_PORT_SPDIFIN; 1888 1889 desc.acd_minvalue |= (1 << INPUT_SPD2); 1890 desc.acd_maxvalue |= (1 << INPUT_SPD2); 1891 desc.acd_enum[INPUT_SPD2] = "spdif2-in"; 1892 1893 desc.acd_minvalue |= (1 << INPUT_DIGCD); 1894 desc.acd_maxvalue |= (1 << INPUT_DIGCD); 1895 desc.acd_enum[INPUT_DIGCD] = "digital-cd"; 1896 1897 desc.acd_minvalue |= (1 << INPUT_AUX2); 1898 desc.acd_maxvalue |= (1 << INPUT_AUX2); 1899 desc.acd_enum[INPUT_AUX2] = AUDIO_PORT_AUX2IN; 1900 1901 desc.acd_minvalue |= (1 << INPUT_LINE2); 1902 desc.acd_maxvalue |= (1 << INPUT_LINE2); 1903 desc.acd_enum[INPUT_LINE2] = "line2-in"; 1904 1905 desc.acd_minvalue |= (1 << INPUT_STEREOMIX); 1906 desc.acd_maxvalue |= (1 << INPUT_STEREOMIX); 1907 desc.acd_enum[INPUT_STEREOMIX] = AUDIO_PORT_STEREOMIX; 1908 1909 emu10k_write_gpr(devc, GPR_REC_SPDIF1, 0); 1910 emu10k_write_gpr(devc, GPR_REC_SPDIF2, 0); 1911 emu10k_write_gpr(devc, GPR_REC_DIGCD, 0); 1912 emu10k_write_gpr(devc, GPR_REC_AUX2, 0); 1913 emu10k_write_gpr(devc, GPR_REC_LINE2, 0); 1914 emu10k_write_gpr(devc, GPR_REC_PCM, 0); 1915 emu10k_write_gpr(devc, GPR_REC_AC97, 1); 1916 1917 ec->ctrl = audio_dev_add_control(devc->adev, &desc, 1918 emu10k_get_control, emu10k_set_recsrc, ec); 1919 } 1920 1921 static void 1922 emu10k_create_jack3(emu10k_devc_t *devc) 1923 { 1924 emu10k_ctrl_t *ec; 1925 audio_ctrl_desc_t desc; 1926 1927 bzero(&desc, sizeof (desc)); 1928 1929 ec = &devc->ctrls[CTL_JACK3]; 1930 desc.acd_name = AUDIO_CTRL_ID_JACK3; 1931 desc.acd_type = AUDIO_CTRL_TYPE_ENUM; 1932 desc.acd_flags = AUDIO_CTRL_FLAG_RW; 1933 desc.acd_minvalue = 0x3; 1934 desc.acd_maxvalue = 0x3; 1935 bzero(desc.acd_enum, sizeof (desc.acd_enum)); 1936 ec->devc = devc; 1937 ec->val = 0x1; 1938 1939 desc.acd_enum[0] = AUDIO_PORT_CENLFE; 1940 desc.acd_enum[1] = AUDIO_PORT_SPDIFOUT; 1941 1942 ec->ctrl = audio_dev_add_control(devc->adev, &desc, 1943 emu10k_get_control, emu10k_set_jack3, ec); 1944 } 1945 1946 1947 static void 1948 emu10k_create_controls(emu10k_devc_t *devc) 1949 { 1950 ac97_t *ac97; 1951 ac97_ctrl_t *ac; 1952 1953 emu10k_create_mono(devc, CTL_VOLUME, GPR_VOL_PCM, 1954 AUDIO_CTRL_ID_VOLUME, PCMVOL, 75); 1955 1956 emu10k_create_stereo(devc, CTL_FRONT, GPR_VOL_FRONT, 1957 AUDIO_CTRL_ID_FRONT, MAINVOL, 100); 1958 emu10k_create_stereo(devc, CTL_SURROUND, GPR_VOL_SURR, 1959 AUDIO_CTRL_ID_SURROUND, MAINVOL, 100); 1960 if (devc->feature_mask & (SB_51 | SB_71)) { 1961 emu10k_create_mono(devc, CTL_CENTER, GPR_VOL_CEN, 1962 AUDIO_CTRL_ID_CENTER, MAINVOL, 100); 1963 emu10k_create_mono(devc, CTL_LFE, GPR_VOL_LFE, 1964 AUDIO_CTRL_ID_LFE, MAINVOL, 100); 1965 } 1966 if (devc->feature_mask & SB_71) { 1967 emu10k_create_stereo(devc, CTL_SIDE, GPR_VOL_SIDE, 1968 "side", MAINVOL, 100); 1969 } 1970 1971 emu10k_create_stereo(devc, CTL_RECGAIN, GPR_VOL_REC, 1972 AUDIO_CTRL_ID_RECGAIN, RECVOL, 50); 1973 1974 emu10k_create_ac97src(devc); 1975 emu10k_create_recsrc(devc); 1976 /* 1977 * 5.1 devices have versa jack. Note that from what we can 1978 * tell, none of the 7.1 devices have or need this versa jack, 1979 * as they all seem to have a dedicated digital I/O port. 1980 */ 1981 if ((devc->feature_mask & SB_51) && 1982 !(devc->feature_mask & SB_AUDIGY2VAL)) { 1983 emu10k_create_jack3(devc); 1984 } 1985 1986 /* these ones AC'97 can manage directly */ 1987 ac97 = devc->ac97; 1988 1989 if ((ac = ac97_control_find(ac97, AUDIO_CTRL_ID_MICBOOST)) != NULL) 1990 ac97_control_register(ac); 1991 if ((ac = ac97_control_find(ac97, AUDIO_CTRL_ID_MICGAIN)) != NULL) 1992 ac97_control_register(ac); 1993 1994 /* set any AC'97 analog outputs to full volume (no attenuation) */ 1995 if ((ac = ac97_control_find(ac97, AUDIO_CTRL_ID_FRONT)) != NULL) 1996 ac97_control_set(ac, (100 << 8) | 100); 1997 if ((ac = ac97_control_find(ac97, AUDIO_CTRL_ID_LINEOUT)) != NULL) 1998 ac97_control_set(ac, (100 << 8) | 100); 1999 if ((ac = ac97_control_find(ac97, AUDIO_CTRL_ID_SURROUND)) != NULL) 2000 ac97_control_set(ac, (100 << 8) | 100); 2001 if ((ac = ac97_control_find(ac97, AUDIO_CTRL_ID_CENTER)) != NULL) 2002 ac97_control_set(ac, 100); 2003 if ((ac = ac97_control_find(ac97, AUDIO_CTRL_ID_LFE)) != NULL) 2004 ac97_control_set(ac, 100); 2005 2006 /* Monitor sources */ 2007 emu10k_create_stereo(devc, CTL_AC97, GPR_MON_AC97, 2008 "ac97-monitor", MONVOL, 0); 2009 emu10k_create_stereo(devc, CTL_SPD1, GPR_MON_SPDIF1, 2010 AUDIO_PORT_SPDIFIN, MONVOL, 0); 2011 emu10k_create_stereo(devc, CTL_DIGCD, GPR_MON_DIGCD, 2012 "digital-cd", MONVOL, 0); 2013 emu10k_create_stereo(devc, CTL_SPD1, GPR_MON_SPDIF1, 2014 AUDIO_PORT_SPDIFIN, MONVOL, 0); 2015 2016 if ((devc->feature_mask & SB_NOEXP) == 0) { 2017 /* 2018 * These ports are only available via an external 2019 * expansion box. Don't expose them for cards that 2020 * don't have support for it. 2021 */ 2022 emu10k_create_stereo(devc, CTL_HEADPH, GPR_VOL_HEADPH, 2023 AUDIO_CTRL_ID_HEADPHONE, MAINVOL, 100); 2024 emu10k_create_stereo(devc, CTL_SPD2, GPR_MON_SPDIF2, 2025 "spdif2-in", MONVOL, 0); 2026 emu10k_create_stereo(devc, CTL_LINE2, GPR_MON_LINE2, 2027 "line2-in", MONVOL, 0); 2028 emu10k_create_stereo(devc, CTL_AUX2, GPR_MON_AUX2, 2029 AUDIO_PORT_AUX2IN, MONVOL, 0); 2030 } 2031 } 2032 2033 static void 2034 emu10k_load_dsp(emu10k_devc_t *devc, uint32_t *code, int ncode, 2035 uint32_t *init, int ninit) 2036 { 2037 int i; 2038 2039 if (ncode > 1024) { 2040 audio_dev_warn(devc->adev, "DSP file size too big"); 2041 return; 2042 } 2043 if (ninit > MAX_GPR) { 2044 audio_dev_warn(devc->adev, "Too many inits"); 2045 return; 2046 } 2047 2048 /* Upload our DSP code */ 2049 for (i = 0; i < ncode; i++) { 2050 emu10k_write_efx(devc, UC0 + i, code[i]); 2051 } 2052 2053 /* Upload the initialization settings */ 2054 for (i = 0; i < ninit; i += 2) { 2055 emu10k_write_reg(devc, init[i] + GPR0, 0, init[i + 1]); 2056 } 2057 } 2058 2059 #define LIVE_NOP() \ 2060 emu10k_write_efx(devc, UC0 + (pc * 2), 0x10040); \ 2061 emu10k_write_efx(devc, UC0 + (pc * 2 + 1), 0x610040); \ 2062 pc++ 2063 #define LIVE_ACC3(r, a, x, y) /* z=w+x+y */ \ 2064 emu10k_write_efx(devc, UC0 + (pc * 2), (x << 10) | y); \ 2065 emu10k_write_efx(devc, UC0 + (pc * 2 + 1), (6 << 20) | (r << 10) | a); \ 2066 pc++ 2067 2068 #define AUDIGY_ACC3(r, a, x, y) /* z=w+x+y */ \ 2069 emu10k_write_efx(devc, UC0 + (pc * 2), (x << 12) | y); \ 2070 emu10k_write_efx(devc, UC0 + (pc * 2+1), (6 << 24) | (r << 12) | a); \ 2071 pc++ 2072 #define AUDIGY_NOP() AUDIGY_ACC3(0xc0, 0xc0, 0xc0, 0xc0) 2073 2074 static void 2075 emu10k_init_effects(emu10k_devc_t *devc) 2076 { 2077 int i; 2078 unsigned short pc; 2079 2080 ASSERT(mutex_owned(&devc->mutex)); 2081 2082 if (devc->feature_mask & (SB_AUDIGY|SB_AUDIGY2|SB_AUDIGY2VAL)) { 2083 pc = 0; 2084 for (i = 0; i < 512; i++) { 2085 AUDIGY_NOP(); 2086 } 2087 2088 for (i = 0; i < 256; i++) 2089 emu10k_write_efx(devc, GPR0 + i, 0); 2090 emu10k_write_reg(devc, AUDIGY_DBG, 0, 0); 2091 emu10k_load_dsp(devc, 2092 emu10k2_code, 2093 sizeof (emu10k2_code) / sizeof (emu10k2_code[0]), 2094 emu10k2_init, 2095 sizeof (emu10k2_init) / sizeof (emu10k2_init[0])); 2096 2097 } else { 2098 pc = 0; 2099 for (i = 0; i < 512; i++) { 2100 LIVE_NOP(); 2101 } 2102 2103 for (i = 0; i < 256; i++) 2104 emu10k_write_efx(devc, GPR0 + i, 0); 2105 emu10k_write_reg(devc, DBG, 0, 0); 2106 emu10k_load_dsp(devc, 2107 emu10k1_code, 2108 sizeof (emu10k1_code) / sizeof (emu10k1_code[0]), 2109 emu10k1_init, 2110 sizeof (emu10k1_init) / sizeof (emu10k1_init[0])); 2111 } 2112 } 2113 2114 /* mixer */ 2115 2116 static struct { 2117 uint16_t devid; 2118 uint16_t subid; 2119 const char *model; 2120 const char *prod; 2121 unsigned feature_mask; 2122 } emu10k_cards[] = { 2123 { 0x2, 0x0020, "CT4670", "Live! Value", SB_LIVE | SB_NOEXP }, 2124 { 0x2, 0x0021, "CT4621", "Live!", SB_LIVE }, 2125 { 0x2, 0x100a, "SB0220", "Live! 5.1 Digital", 2126 SB_LIVE | SB_51 | SB_NOEXP }, 2127 { 0x2, 0x8022, "CT4780", "Live! Value", SB_LIVE }, 2128 { 0x2, 0x8023, "CT4790", "PCI512", SB_LIVE | SB_NOEXP }, 2129 { 0x2, 0x8026, "CT4830", "Live! Value", SB_LIVE }, 2130 { 0x2, 0x8028, "CT4870", "Live! Value", SB_LIVE }, 2131 { 0x2, 0x8031, "CT4831", "Live! Value", SB_LIVE }, 2132 { 0x2, 0x8040, "CT4760", "Live!", SB_LIVE }, 2133 { 0x2, 0x8051, "CT4850", "Live! Value", SB_LIVE }, 2134 { 0x2, 0x8061, "SB0060", "Live! 5.1", SB_LIVE | SB_51 }, 2135 { 0x2, 0x8064, "SB0100", "Live! 5.1", SB_LIVE | SB_51 }, 2136 { 0x2, 0x8065, "SB0220", "Live! 5.1", SB_LIVE | SB_51 }, 2137 { 0x2, 0x8066, "SB0228", "Live! 5.1", SB_LIVE | SB_51 }, 2138 { 0x4, 0x0051, "SB0090", "Audigy", SB_AUDIGY | SB_51 }, 2139 { 0x4, 0x0052, "SB0160", "Audigy ES", SB_AUDIGY | SB_51 }, 2140 { 0x4, 0x0053, "SB0092", "Audigy", SB_AUDIGY | SB_51 }, 2141 { 0x4, 0x1002, "SB0240P", "Audigy 2 Platinum", 2142 SB_AUDIGY2 | SB_71 | SB_INVSP }, 2143 { 0x4, 0x1003, "SB0353", "Audigy 2 ZS", SB_AUDIGY2 | SB_71 | SB_INVSP }, 2144 { 0x4, 0x1005, "SB0280", "Audigy 2 Platinum EX", SB_AUDIGY2 | SB_71 }, 2145 { 0x4, 0x1007, "SB0240", "Audigy 2", SB_AUDIGY2 | SB_71 }, 2146 { 0x4, 0x2001, "SB0360", "Audigy 2 ZS", SB_AUDIGY2 | SB_71 | SB_INVSP }, 2147 { 0x4, 0x2002, "SB0350", "Audigy 2 ZS", SB_AUDIGY2 | SB_71 | SB_INVSP }, 2148 { 0x4, 0x2006, "SB0350", "Audigy 2", SB_AUDIGY2 | SB_71 | SB_INVSP }, 2149 { 0x4, 0x2007, "SB0380", "Audigy 4 Pro", SB_AUDIGY2 | SB_71 }, 2150 { 0x8, 0x1001, "SB0400", "Audigy 2 Value", 2151 SB_AUDIGY2VAL | SB_71 | SB_NOEXP }, 2152 { 0x8, 0x1021, "SB0610", "Audigy 4", 2153 SB_AUDIGY2VAL | SB_71 | SB_NOEXP }, 2154 { 0x8, 0x2001, "SB0530", "Audigy 2 ZS Notebook", 2155 SB_AUDIGY2VAL | SB_71 }, 2156 { 0, 0, NULL, NULL, 0 }, 2157 }; 2158 2159 int 2160 emu10k_attach(dev_info_t *dip) 2161 { 2162 uint16_t pci_command; 2163 uint16_t subid; 2164 uint16_t devid; 2165 emu10k_devc_t *devc; 2166 ddi_acc_handle_t pcih; 2167 ddi_dma_cookie_t cookie; 2168 uint_t count; 2169 ulong_t len; 2170 int i; 2171 const char *name; 2172 const char *model; 2173 char namebuf[64]; 2174 int feature_mask; 2175 2176 devc = kmem_zalloc(sizeof (*devc), KM_SLEEP); 2177 devc->dip = dip; 2178 ddi_set_driver_private(dip, devc); 2179 2180 if ((devc->adev = audio_dev_alloc(dip, 0)) == NULL) { 2181 cmn_err(CE_WARN, "audio_dev_alloc failed"); 2182 goto error; 2183 } 2184 2185 if (pci_config_setup(dip, &pcih) != DDI_SUCCESS) { 2186 audio_dev_warn(devc->adev, "pci_config_setup failed"); 2187 goto error; 2188 } 2189 devc->pcih = pcih; 2190 2191 devid = pci_config_get16(pcih, PCI_CONF_DEVID); 2192 subid = pci_config_get16(pcih, PCI_CONF_SUBSYSID); 2193 2194 pci_command = pci_config_get16(pcih, PCI_CONF_COMM); 2195 pci_command |= PCI_COMM_ME | PCI_COMM_IO; 2196 pci_config_put16(pcih, PCI_CONF_COMM, pci_command); 2197 2198 if ((ddi_regs_map_setup(dip, 1, &devc->regs, 0, 0, &dev_attr, 2199 &devc->regsh)) != DDI_SUCCESS) { 2200 audio_dev_warn(devc->adev, "failed to map registers"); 2201 goto error; 2202 } 2203 2204 switch (devid) { 2205 case PCI_DEVICE_ID_SBLIVE: 2206 name = "Live!"; 2207 model = "CT????"; 2208 feature_mask = SB_LIVE; 2209 break; 2210 2211 case PCI_DEVICE_ID_AUDIGYVALUE: 2212 name = "Audigy 2 Value"; 2213 model = "SB????"; 2214 feature_mask = SB_AUDIGY2VAL; 2215 break; 2216 2217 case PCI_DEVICE_ID_AUDIGY: 2218 if (subid >= 0x1002 && subid <= 0x2005) { 2219 name = "Audigy 2"; 2220 model = "SB????"; 2221 feature_mask = SB_AUDIGY2; 2222 } else { 2223 name = "Audigy"; 2224 model = "SB????"; 2225 feature_mask = SB_AUDIGY; 2226 } 2227 break; 2228 2229 default: 2230 audio_dev_warn(devc->adev, "Unrecognized device"); 2231 goto error; 2232 } 2233 2234 for (i = 0; emu10k_cards[i].prod; i++) { 2235 if ((devid == emu10k_cards[i].devid) && 2236 (subid == emu10k_cards[i].subid)) { 2237 name = emu10k_cards[i].prod; 2238 model = emu10k_cards[i].model; 2239 feature_mask = emu10k_cards[i].feature_mask; 2240 break; 2241 } 2242 } 2243 devc->feature_mask = feature_mask; 2244 2245 (void) snprintf(namebuf, sizeof (namebuf), "Sound Blaster %s", name); 2246 2247 audio_dev_set_description(devc->adev, namebuf); 2248 audio_dev_set_version(devc->adev, model); 2249 2250 if (emu10k_setup_intrs(devc) != DDI_SUCCESS) 2251 goto error; 2252 2253 /* allocate static page table memory */ 2254 2255 devc->max_mem = AUDIO_MEMSIZE; 2256 2257 /* SB Live/Audigy supports at most 32M of memory) */ 2258 if (devc->max_mem > 32 * 1024 * 1024) 2259 devc->max_mem = 32 * 1024 * 1024; 2260 2261 devc->max_pages = devc->max_mem / 4096; 2262 if (devc->max_pages < 1024) 2263 devc->max_pages = 1024; 2264 2265 /* Allocate page table */ 2266 if (ddi_dma_alloc_handle(devc->dip, &dma_attr_buf, DDI_DMA_SLEEP, NULL, 2267 &devc->pt_dmah) != DDI_SUCCESS) { 2268 audio_dev_warn(devc->adev, 2269 "failed to allocate page table handle"); 2270 return (DDI_FAILURE); 2271 } 2272 2273 if (ddi_dma_mem_alloc(devc->pt_dmah, devc->max_pages * 4, 2274 &dev_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, 2275 &devc->pt_kaddr, &len, &devc->pt_acch) != 2276 DDI_SUCCESS) { 2277 audio_dev_warn(devc->adev, 2278 "failed to allocate memory for page table"); 2279 return (DDI_FAILURE); 2280 } 2281 2282 if (ddi_dma_addr_bind_handle(devc->pt_dmah, NULL, 2283 devc->pt_kaddr, len, DDI_DMA_CONSISTENT | DDI_DMA_WRITE, 2284 DDI_DMA_SLEEP, NULL, &cookie, &count) != DDI_SUCCESS) { 2285 audio_dev_warn(devc->adev, 2286 "failed binding page table DMA handle"); 2287 return (DDI_FAILURE); 2288 } 2289 2290 devc->page_map = (void *)devc->pt_kaddr; 2291 devc->pt_paddr = cookie.dmac_address; 2292 bzero(devc->pt_kaddr, devc->max_pages * 4); 2293 2294 /* Allocate silent page */ 2295 if (ddi_dma_alloc_handle(devc->dip, &dma_attr_buf, DDI_DMA_SLEEP, NULL, 2296 &devc->silence_dmah) != DDI_SUCCESS) { 2297 audio_dev_warn(devc->adev, 2298 "failed to allocate silent page handle"); 2299 return (DDI_FAILURE); 2300 } 2301 2302 if (ddi_dma_mem_alloc(devc->silence_dmah, 4096, 2303 &buf_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, 2304 &devc->silence_kaddr, &len, 2305 &devc->silence_acch) != DDI_SUCCESS) { 2306 audio_dev_warn(devc->adev, 2307 "failed to allocate silent page memory"); 2308 return (DDI_FAILURE); 2309 } 2310 2311 (void) ddi_dma_sync(devc->silence_dmah, 0, 0, DDI_DMA_SYNC_FORDEV); 2312 2313 if (ddi_dma_addr_bind_handle(devc->silence_dmah, NULL, 2314 devc->silence_kaddr, len, DDI_DMA_CONSISTENT | DDI_DMA_WRITE, 2315 DDI_DMA_SLEEP, NULL, &cookie, &count) != DDI_SUCCESS) { 2316 audio_dev_warn(devc->adev, 2317 "failed binding silent page DMA handle"); 2318 return (DDI_FAILURE); 2319 } 2320 2321 devc->silence_paddr = cookie.dmac_address; 2322 bzero(devc->silence_kaddr, 4096); 2323 devc->audio_memptr = 4096; /* Skip the silence page */ 2324 2325 for (i = 0; i < devc->max_pages; i++) 2326 FILL_PAGE_MAP_ENTRY(i, devc->silence_paddr); 2327 2328 (void) ddi_dma_sync(devc->pt_dmah, 0, 0, DDI_DMA_SYNC_FORDEV); 2329 2330 devc->ac97 = ac97_allocate(devc->adev, dip, 2331 emu10k_read_ac97, emu10k_write_ac97, devc); 2332 if (devc->ac97 == NULL) { 2333 audio_dev_warn(devc->adev, "failed to allocate ac97 handle"); 2334 goto error; 2335 } 2336 2337 ac97_probe_controls(devc->ac97); 2338 2339 /* allocate voice 0 for play */ 2340 if (emu10k_alloc_port(devc, EMU10K_REC) != DDI_SUCCESS) 2341 goto error; 2342 2343 if (emu10k_alloc_port(devc, EMU10K_PLAY) != DDI_SUCCESS) 2344 goto error; 2345 2346 /* now initialize the hardware */ 2347 mutex_enter(&devc->mutex); 2348 if (emu10k_hwinit(devc) != DDI_SUCCESS) { 2349 mutex_exit(&devc->mutex); 2350 goto error; 2351 } 2352 mutex_exit(&devc->mutex); 2353 2354 emu10k_create_controls(devc); 2355 2356 /* set up kernel statistics */ 2357 if ((devc->ksp = kstat_create(EMU10K_NAME, ddi_get_instance(dip), 2358 EMU10K_NAME, "controller", KSTAT_TYPE_INTR, 2359 1, KSTAT_FLAG_PERSISTENT)) != NULL) { 2360 kstat_install(devc->ksp); 2361 } 2362 2363 if (audio_dev_register(devc->adev) != DDI_SUCCESS) { 2364 audio_dev_warn(devc->adev, "unable to register audio device"); 2365 goto error; 2366 } 2367 2368 (void) ddi_intr_enable(devc->ih); 2369 ddi_report_dev(dip); 2370 2371 return (DDI_SUCCESS); 2372 2373 error: 2374 emu10k_destroy(devc); 2375 return (DDI_FAILURE); 2376 } 2377 2378 int 2379 emu10k_resume(dev_info_t *dip) 2380 { 2381 emu10k_devc_t *devc; 2382 emu10k_portc_t *portc; 2383 2384 devc = ddi_get_driver_private(dip); 2385 2386 for (int i = 0; i < EMU10K_NUM_PORTC; i++) { 2387 portc = devc->portc[i]; 2388 audio_engine_reset(portc->engine); 2389 } 2390 2391 mutex_enter(&devc->mutex); 2392 if (emu10k_hwinit(devc) != DDI_SUCCESS) { 2393 mutex_exit(&devc->mutex); 2394 /* 2395 * In case of failure, we leave the chip suspended, 2396 * but don't panic. Audio service is not normally a a 2397 * critical service. 2398 */ 2399 audio_dev_warn(devc->adev, "FAILED to RESUME device"); 2400 return (DDI_SUCCESS); 2401 } 2402 2403 emu10k_refresh_mixer(devc); 2404 2405 devc->suspended = B_FALSE; 2406 2407 for (int i = 0; i < EMU10K_NUM_PORTC; i++) { 2408 2409 portc = devc->portc[i]; 2410 2411 portc->stop_port(portc); 2412 2413 portc->dopos = 1; 2414 if (portc->started) { 2415 portc->reset_port(portc); 2416 portc->start_port(portc); 2417 } 2418 } 2419 2420 mutex_exit(&devc->mutex); 2421 2422 /* resume ac97 */ 2423 ac97_resume(devc->ac97); 2424 2425 return (DDI_SUCCESS); 2426 } 2427 2428 int 2429 emu10k_detach(emu10k_devc_t *devc) 2430 { 2431 if (audio_dev_unregister(devc->adev) != DDI_SUCCESS) 2432 return (DDI_FAILURE); 2433 2434 emu10k_destroy(devc); 2435 return (DDI_SUCCESS); 2436 } 2437 2438 int 2439 emu10k_suspend(emu10k_devc_t *devc) 2440 { 2441 ac97_suspend(devc->ac97); 2442 2443 mutex_enter(&devc->mutex); 2444 2445 devc->suspended = B_TRUE; 2446 2447 emu10k_write_reg(devc, CLIEL, 0, 0); 2448 emu10k_write_reg(devc, CLIEH, 0, 0); 2449 if (!(devc->feature_mask & SB_LIVE)) { 2450 emu10k_write_reg(devc, HLIEL, 0, 0x0); 2451 emu10k_write_reg(devc, HLIEH, 0, 0x0); 2452 } 2453 OUTL(devc, 0, devc->regs + IE); /* Intr enable (all off) */ 2454 2455 for (int i = 0; i < EMU10K_NUM_PORTC; i++) { 2456 emu10k_portc_t *portc = devc->portc[i]; 2457 portc->stop_port(portc); 2458 } 2459 2460 /* stop all voices */ 2461 for (int i = 0; i < 64; i++) { 2462 emu10k_write_reg(devc, VEDS, i, 0); 2463 } 2464 for (int i = 0; i < 64; i++) { 2465 emu10k_write_reg(devc, VTFT, i, 0); 2466 emu10k_write_reg(devc, CVCF, i, 0); 2467 emu10k_write_reg(devc, PTAB, i, 0); 2468 emu10k_write_reg(devc, CPF, i, 0); 2469 } 2470 /* 2471 * Turn off the hardware 2472 */ 2473 OUTL(devc, 2474 HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE_MASK | 2475 HCFG_MUTEBUTTONENABLE, devc->regs + HCFG); 2476 2477 /* stop ADC recording */ 2478 emu10k_write_reg(devc, ADCSR, 0, 0x0); 2479 emu10k_write_reg(devc, ADCBA, 0, 0x0); 2480 emu10k_write_reg(devc, ADCBA, 0, 0x0); 2481 2482 emu10k_write_reg(devc, PTBA, 0, 0); 2483 2484 mutex_exit(&devc->mutex); 2485 2486 return (DDI_SUCCESS); 2487 } 2488 2489 static int emu10k_ddi_attach(dev_info_t *, ddi_attach_cmd_t); 2490 static int emu10k_ddi_detach(dev_info_t *, ddi_detach_cmd_t); 2491 static int emu10k_ddi_quiesce(dev_info_t *); 2492 2493 static struct dev_ops emu10k_dev_ops = { 2494 DEVO_REV, /* rev */ 2495 0, /* refcnt */ 2496 NULL, /* getinfo */ 2497 nulldev, /* identify */ 2498 nulldev, /* probe */ 2499 emu10k_ddi_attach, /* attach */ 2500 emu10k_ddi_detach, /* detach */ 2501 nodev, /* reset */ 2502 NULL, /* cb_ops */ 2503 NULL, /* bus_ops */ 2504 NULL, /* power */ 2505 emu10k_ddi_quiesce, /* quiesce */ 2506 }; 2507 2508 static struct modldrv emu10k_modldrv = { 2509 &mod_driverops, /* drv_modops */ 2510 "Creative EMU10K Audio", /* linkinfo */ 2511 &emu10k_dev_ops, /* dev_ops */ 2512 }; 2513 2514 static struct modlinkage modlinkage = { 2515 MODREV_1, 2516 { &emu10k_modldrv, NULL } 2517 }; 2518 2519 int 2520 _init(void) 2521 { 2522 int rv; 2523 2524 audio_init_ops(&emu10k_dev_ops, EMU10K_NAME); 2525 if ((rv = mod_install(&modlinkage)) != 0) { 2526 audio_fini_ops(&emu10k_dev_ops); 2527 } 2528 return (rv); 2529 } 2530 2531 int 2532 _fini(void) 2533 { 2534 int rv; 2535 2536 if ((rv = mod_remove(&modlinkage)) == 0) { 2537 audio_fini_ops(&emu10k_dev_ops); 2538 } 2539 return (rv); 2540 } 2541 2542 int 2543 _info(struct modinfo *modinfop) 2544 { 2545 return (mod_info(&modlinkage, modinfop)); 2546 } 2547 2548 int 2549 emu10k_ddi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) 2550 { 2551 switch (cmd) { 2552 case DDI_ATTACH: 2553 return (emu10k_attach(dip)); 2554 2555 case DDI_RESUME: 2556 return (emu10k_resume(dip)); 2557 2558 default: 2559 return (DDI_FAILURE); 2560 } 2561 } 2562 2563 int 2564 emu10k_ddi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd) 2565 { 2566 emu10k_devc_t *devc; 2567 2568 devc = ddi_get_driver_private(dip); 2569 2570 switch (cmd) { 2571 case DDI_DETACH: 2572 return (emu10k_detach(devc)); 2573 2574 case DDI_SUSPEND: 2575 return (emu10k_suspend(devc)); 2576 2577 default: 2578 return (DDI_FAILURE); 2579 } 2580 } 2581 2582 int 2583 emu10k_ddi_quiesce(dev_info_t *dip) 2584 { 2585 emu10k_devc_t *devc; 2586 2587 devc = ddi_get_driver_private(dip); 2588 2589 /* stop all voices */ 2590 for (int i = 0; i < 64; i++) { 2591 emu10k_write_reg(devc, VEDS, i, 0); 2592 } 2593 for (int i = 0; i < 64; i++) { 2594 emu10k_write_reg(devc, VTFT, i, 0); 2595 emu10k_write_reg(devc, CVCF, i, 0); 2596 emu10k_write_reg(devc, PTAB, i, 0); 2597 emu10k_write_reg(devc, CPF, i, 0); 2598 } 2599 2600 /* 2601 * Turn off the hardware 2602 */ 2603 OUTL(devc, 0, devc->regs + IE); /* Intr enable (all off) */ 2604 OUTL(devc, 2605 HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE_MASK | 2606 HCFG_MUTEBUTTONENABLE, devc->regs + HCFG); 2607 2608 /* stop ADC recording */ 2609 emu10k_write_reg(devc, ADCSR, 0, 0x0); 2610 emu10k_write_reg(devc, ADCBA, 0, 0x0); 2611 emu10k_write_reg(devc, ADCBA, 0, 0x0); 2612 2613 emu10k_write_reg(devc, PTBA, 0, 0); 2614 2615 return (DDI_SUCCESS); 2616 } 2617