esa.c revision 1.63
1/* $NetBSD: esa.c,v 1.63 2019/03/16 12:09:58 isaki Exp $ */ 2 3/* 4 * Copyright (c) 2001-2008 Jared D. McNeill <jmcneill@invisible.ca> 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. The name of the author may not be used to endorse or promote products 13 * derived from this software without specific prior written permission. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 20 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 22 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 23 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 */ 27 28/* 29 * ESS Allegro-1 / Maestro3 Audio Driver 30 * 31 * Based on the FreeBSD maestro3 driver and the NetBSD eap driver. 32 * Original driver by Don Kim. 33 * 34 * The list management code could possibly be written better, but what 35 * we have right now does the job nicely. Thanks to Zach Brown <zab@zabbo.net> 36 * and Andrew MacDonald <amac@epsilon.yi.org> for helping me debug the 37 * problems with the original list management code present in the Linux 38 * driver. 39 */ 40 41#include <sys/cdefs.h> 42__KERNEL_RCSID(0, "$NetBSD: esa.c,v 1.63 2019/03/16 12:09:58 isaki Exp $"); 43 44#include <sys/types.h> 45#include <sys/errno.h> 46#include <sys/null.h> 47#include <sys/param.h> 48#include <sys/systm.h> 49#include <sys/kmem.h> 50#include <sys/device.h> 51#include <sys/conf.h> 52#include <sys/exec.h> 53#include <sys/select.h> 54#include <sys/audioio.h> 55#include <sys/bus.h> 56#include <sys/intr.h> 57 58#include <dev/audio_if.h> 59#include <dev/mulaw.h> 60#include <dev/auconv.h> 61 62#include <dev/ic/ac97var.h> 63#include <dev/ic/ac97reg.h> 64 65#include <dev/pci/pcidevs.h> 66#include <dev/pci/pcivar.h> 67#include <dev/pci/esareg.h> 68#include <dev/pci/esadsp.h> 69#include <dev/pci/esavar.h> 70 71#define PCI_CBIO 0x10 72 73#define ESA_DAC_DATA 0x1100 74 75enum { 76 ESS_ALLEGRO1, 77 ESS_MAESTRO3 78}; 79 80static const struct esa_card_type { 81 uint16_t pci_vendor_id; 82 uint16_t pci_product_id; 83 int type; 84 int delay1, delay2; 85} esa_card_types[] = { 86 { PCI_VENDOR_ESSTECH, PCI_PRODUCT_ESSTECH_ALLEGRO1, 87 ESS_ALLEGRO1, 50, 800 }, 88 { PCI_VENDOR_ESSTECH, PCI_PRODUCT_ESSTECH_MAESTRO3, 89 ESS_MAESTRO3, 20, 500 }, 90 { PCI_VENDOR_ESSTECH, PCI_PRODUCT_ESSTECH_MAESTRO3_2, 91 ESS_MAESTRO3, 20, 500 }, 92 { 0, 0, 0, 0, 0 } 93}; 94 95static struct audio_device esa_device = { 96 "ESS Allegro", 97 "", 98 "esa" 99}; 100 101static int esa_match(device_t, cfdata_t, void *); 102static void esa_attach(device_t, device_t, void *); 103static int esa_detach(device_t, int); 104static void esa_childdet(device_t, device_t); 105 106/* audio(9) functions */ 107static int esa_query_encoding(void *, struct audio_encoding *); 108static int esa_set_params(void *, int, int, audio_params_t *, 109 audio_params_t *, stream_filter_list_t *, 110 stream_filter_list_t *); 111static int esa_round_blocksize(void *, int, int, 112 const audio_params_t *); 113static int esa_commit_settings(void *); 114static int esa_halt_output(void *); 115static int esa_halt_input(void *); 116static int esa_set_port(void *, mixer_ctrl_t *); 117static int esa_get_port(void *, mixer_ctrl_t *); 118static int esa_query_devinfo(void *, mixer_devinfo_t *); 119static void * esa_malloc(void *, int, size_t); 120static void esa_free(void *, void *, size_t); 121static int esa_getdev(void *, struct audio_device *); 122static size_t esa_round_buffersize(void *, int, size_t); 123static int esa_get_props(void *); 124static int esa_trigger_output(void *, void *, void *, int, 125 void (*)(void *), void *, 126 const audio_params_t *); 127static int esa_trigger_input(void *, void *, void *, int, 128 void (*)(void *), void *, 129 const audio_params_t *); 130static void esa_get_locks(void *, kmutex_t **, kmutex_t **); 131 132static int esa_intr(void *); 133static int esa_allocmem(struct esa_softc *, size_t, size_t, 134 struct esa_dma *); 135static int esa_freemem(struct esa_softc *, struct esa_dma *); 136static paddr_t esa_mappage(void *, void *, off_t, int); 137 138/* Supporting subroutines */ 139static uint16_t esa_read_assp(struct esa_softc *, uint16_t, uint16_t); 140static void esa_write_assp(struct esa_softc *, uint16_t, uint16_t, 141 uint16_t); 142static int esa_init_codec(struct esa_softc *); 143static int esa_attach_codec(void *, struct ac97_codec_if *); 144static int esa_read_codec(void *, uint8_t, uint16_t *); 145static int esa_write_codec(void *, uint8_t, uint16_t); 146static int esa_reset_codec(void *); 147static enum ac97_host_flags esa_flags_codec(void *); 148static int esa_wait(struct esa_softc *); 149static int esa_init(struct esa_softc *); 150static void esa_config(struct esa_softc *); 151static uint8_t esa_assp_halt(struct esa_softc *); 152static void esa_codec_reset(struct esa_softc *); 153static int esa_amp_enable(struct esa_softc *); 154static void esa_enable_interrupts(struct esa_softc *); 155static uint32_t esa_get_pointer(struct esa_softc *, 156 struct esa_channel *); 157 158/* list management */ 159static int esa_add_list(struct esa_voice *, struct esa_list *, 160 uint16_t, int); 161static void esa_remove_list(struct esa_voice *, struct esa_list *, 162 int); 163 164/* power management */ 165static bool esa_suspend(device_t, const pmf_qual_t *); 166static bool esa_resume(device_t, const pmf_qual_t *); 167 168 169#define ESA_NENCODINGS 8 170static audio_encoding_t esa_encoding[ESA_NENCODINGS] = { 171 { 0, AudioEulinear, AUDIO_ENCODING_ULINEAR, 8, 0 }, 172 { 1, AudioEmulaw, AUDIO_ENCODING_ULAW, 8, 173 AUDIO_ENCODINGFLAG_EMULATED }, 174 { 2, AudioEalaw, AUDIO_ENCODING_ALAW, 8, AUDIO_ENCODINGFLAG_EMULATED }, 175 { 3, AudioEslinear, AUDIO_ENCODING_SLINEAR, 8, 176 AUDIO_ENCODINGFLAG_EMULATED }, /* XXX: Are you sure? */ 177 { 4, AudioEslinear_le, AUDIO_ENCODING_SLINEAR_LE, 16, 0 }, 178 { 5, AudioEulinear_le, AUDIO_ENCODING_ULINEAR_LE, 16, 179 AUDIO_ENCODINGFLAG_EMULATED }, 180 { 6, AudioEslinear_be, AUDIO_ENCODING_SLINEAR_BE, 16, 181 AUDIO_ENCODINGFLAG_EMULATED }, 182 { 7, AudioEulinear_be, AUDIO_ENCODING_ULINEAR_BE, 16, 183 AUDIO_ENCODINGFLAG_EMULATED } 184}; 185 186#define ESA_NFORMATS 4 187static const struct audio_format esa_formats[ESA_NFORMATS] = { 188 {NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_SLINEAR_LE, 16, 16, 189 2, AUFMT_STEREO, 0, {ESA_MINRATE, ESA_MAXRATE}}, 190 {NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_SLINEAR_LE, 16, 16, 191 1, AUFMT_MONAURAL, 0, {ESA_MINRATE, ESA_MAXRATE}}, 192 {NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_ULINEAR_LE, 8, 8, 193 2, AUFMT_STEREO, 0, {ESA_MINRATE, ESA_MAXRATE}}, 194 {NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_ULINEAR_LE, 8, 8, 195 1, AUFMT_MONAURAL, 0, {ESA_MINRATE, ESA_MAXRATE}}, 196}; 197 198static const struct audio_hw_if esa_hw_if = { 199 .query_encoding = esa_query_encoding, 200 .set_params = esa_set_params, 201 .round_blocksize = esa_round_blocksize, 202 .commit_settings = esa_commit_settings, 203 .halt_output = esa_halt_output, 204 .halt_input = esa_halt_input, 205 .getdev = esa_getdev, 206 .set_port = esa_set_port, 207 .get_port = esa_get_port, 208 .query_devinfo = esa_query_devinfo, 209 .allocm = esa_malloc, 210 .freem = esa_free, 211 .round_buffersize = esa_round_buffersize, 212 .mappage = esa_mappage, 213 .get_props = esa_get_props, 214 .trigger_output = esa_trigger_output, 215 .trigger_input = esa_trigger_input, 216 .get_locks = esa_get_locks, 217}; 218 219CFATTACH_DECL2_NEW(esa, sizeof(struct esa_softc), esa_match, esa_attach, 220 esa_detach, NULL, NULL, esa_childdet); 221 222/* 223 * audio(9) functions 224 */ 225 226static int 227esa_query_encoding(void *hdl, struct audio_encoding *ae) 228{ 229 230 if (ae->index < 0 || ae->index >= ESA_NENCODINGS) 231 return EINVAL; 232 *ae = esa_encoding[ae->index]; 233 234 return 0; 235} 236 237static int 238esa_set_params(void *hdl, int setmode, int usemode, 239 audio_params_t *play, audio_params_t *rec, stream_filter_list_t *pfil, 240 stream_filter_list_t *rfil) 241{ 242 struct esa_voice *vc; 243 struct esa_channel *ch; 244 struct audio_params *p; 245 stream_filter_list_t *fil; 246 int mode, i; 247 248 vc = hdl; 249 for (mode = AUMODE_RECORD; mode != -1; 250 mode = (mode == AUMODE_RECORD) ? AUMODE_PLAY : -1) { 251 if ((setmode & mode) == 0) 252 continue; 253 254 switch (mode) { 255 case AUMODE_PLAY: 256 p = play; 257 ch = &vc->play; 258 fil = pfil; 259 break; 260 case AUMODE_RECORD: 261 p = rec; 262 ch = &vc->rec; 263 fil = rfil; 264 break; 265 default: 266 return EINVAL; 267 } 268 269 if (p->sample_rate < ESA_MINRATE || 270 p->sample_rate > ESA_MAXRATE || 271 (p->precision != 8 && p->precision != 16) || 272 (p->channels < 1 || p->channels > 2)) 273 return EINVAL; 274 275 i = auconv_set_converter(esa_formats, ESA_NFORMATS, 276 mode, p, FALSE, fil); 277 if (i < 0) 278 return EINVAL; 279 if (fil->req_size > 0) 280 p = &fil->filters[0].param; 281 ch->mode = *p; 282 } 283 284 return 0; 285} 286 287static int 288esa_commit_settings(void *hdl) 289{ 290 struct esa_voice *vc; 291 struct esa_softc *sc; 292 const audio_params_t *p; 293 const audio_params_t *r; 294 uint32_t data; 295 uint32_t freq; 296 int data_bytes; 297 298 vc = hdl; 299 sc = device_private(vc->parent); 300 p = &vc->play.mode; 301 r = &vc->rec.mode; 302 data_bytes = (((ESA_MINISRC_TMP_BUFFER_SIZE & ~1) + 303 (ESA_MINISRC_IN_BUFFER_SIZE & ~1) + 304 (ESA_MINISRC_OUT_BUFFER_SIZE & ~1) + 4) + 255) 305 &~ 255; 306 /* playback */ 307 vc->play.data_offset = ESA_DAC_DATA + (data_bytes * vc->index); 308 if (p->channels == 1) 309 data = 1; 310 else 311 data = 0; 312 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 313 vc->play.data_offset + ESA_SRC3_MODE_OFFSET, 314 data); 315 if (p->precision == 8) 316 data = 1; 317 else 318 data = 0; 319 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 320 vc->play.data_offset + ESA_SRC3_WORD_LENGTH_OFFSET, 321 data); 322 if ((freq = ((p->sample_rate << 15) + 24000) / 48000) != 0) { 323 freq--; 324 } 325 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 326 vc->play.data_offset + ESA_CDATA_FREQUENCY, freq); 327 328 /* recording */ 329 vc->rec.data_offset = ESA_DAC_DATA + (data_bytes * vc->index) + 330 (data_bytes / 2); 331 if (r->channels == 1) 332 data = 1; 333 else 334 data = 0; 335 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 336 vc->rec.data_offset + ESA_SRC3_MODE_OFFSET, 337 data); 338 if (r->precision == 8) 339 data = 1; 340 else 341 data = 0; 342 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 343 vc->rec.data_offset + ESA_SRC3_WORD_LENGTH_OFFSET, 344 data); 345 if ((freq = ((r->sample_rate << 15) + 24000) / 48000) != 0) { 346 freq--; 347 } 348 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 349 vc->rec.data_offset + ESA_CDATA_FREQUENCY, freq); 350 351 return 0; 352}; 353 354static int 355esa_round_blocksize(void *hdl, int bs, int mode, 356 const audio_params_t *param) 357{ 358 359 return bs & ~0x20; /* Be conservative; align to 32 bytes */ 360} 361 362static int 363esa_halt_output(void *hdl) 364{ 365 struct esa_voice *vc; 366 struct esa_softc *sc; 367 bus_space_tag_t iot; 368 bus_space_handle_t ioh; 369 uint16_t data; 370 371 vc = hdl; 372 sc = device_private(vc->parent); 373 iot = sc->sc_iot; 374 ioh = sc->sc_ioh; 375 if (vc->play.active == 0) 376 return 0; 377 378 vc->play.active = 0; 379 380 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 381 ESA_CDATA_INSTANCE_READY + vc->play.data_offset, 0); 382 383 sc->sc_ntimers--; 384 if (sc->sc_ntimers == 0) { 385 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 386 ESA_KDATA_TIMER_COUNT_RELOAD, 0); 387 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 388 ESA_KDATA_TIMER_COUNT_CURRENT, 0); 389 data = bus_space_read_2(iot, ioh, ESA_HOST_INT_CTRL); 390 bus_space_write_2(iot, ioh, ESA_HOST_INT_CTRL, 391 data & ~ESA_CLKRUN_GEN_ENABLE); 392 } 393 394 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 395 ESA_KDATA_MIXER_TASK_NUMBER, 396 sc->mixer_list.indexmap[vc->index]); 397 /* remove ourselves from the packed lists */ 398 esa_remove_list(vc, &sc->mixer_list, vc->index); 399 esa_remove_list(vc, &sc->dma_list, vc->index); 400 esa_remove_list(vc, &sc->msrc_list, vc->index); 401 402 return 0; 403} 404 405static int 406esa_halt_input(void *hdl) 407{ 408 struct esa_voice *vc; 409 struct esa_softc *sc; 410 bus_space_tag_t iot; 411 bus_space_handle_t ioh; 412 uint32_t data; 413 414 vc = hdl; 415 sc = device_private(vc->parent); 416 iot = sc->sc_iot; 417 ioh = sc->sc_ioh; 418 if (vc->rec.active == 0) 419 return 0; 420 421 vc->rec.active = 0; 422 423 sc->sc_ntimers--; 424 if (sc->sc_ntimers == 0) { 425 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 426 ESA_KDATA_TIMER_COUNT_RELOAD, 0); 427 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 428 ESA_KDATA_TIMER_COUNT_CURRENT, 0); 429 data = bus_space_read_2(iot, ioh, ESA_HOST_INT_CTRL); 430 bus_space_write_2(iot, ioh, ESA_HOST_INT_CTRL, 431 data & ~ESA_CLKRUN_GEN_ENABLE); 432 } 433 434 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, vc->rec.data_offset + 435 ESA_CDATA_INSTANCE_READY, 0); 436 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, ESA_KDATA_ADC1_REQUEST, 437 0); 438 439 /* remove ourselves from the packed lists */ 440 esa_remove_list(vc, &sc->adc1_list, vc->index + ESA_NUM_VOICES); 441 esa_remove_list(vc, &sc->dma_list, vc->index + ESA_NUM_VOICES); 442 esa_remove_list(vc, &sc->msrc_list, vc->index + ESA_NUM_VOICES); 443 444 return 0; 445} 446 447static void * 448esa_malloc(void *hdl, int direction, size_t size) 449{ 450 struct esa_voice *vc; 451 struct esa_softc *sc; 452 struct esa_dma *p; 453 int error; 454 455 p = kmem_alloc(sizeof(*p), KM_SLEEP); 456 vc = hdl; 457 sc = device_private(vc->parent); 458 error = esa_allocmem(sc, size, 16, p); 459 if (error) { 460 kmem_free(p, sizeof(*p)); 461 aprint_error_dev(sc->sc_dev, 462 "%s: not enough memory\n", __func__); 463 return 0; 464 } 465 p->next = vc->dma; 466 vc->dma = p; 467 468 return KERNADDR(p); 469} 470 471static void 472esa_free(void *hdl, void *addr, size_t size) 473{ 474 struct esa_voice *vc; 475 struct esa_softc *sc; 476 struct esa_dma *p; 477 struct esa_dma **pp; 478 479 vc = hdl; 480 sc = device_private(vc->parent); 481 for (pp = &vc->dma; (p = *pp) != NULL; pp = &p->next) 482 if (KERNADDR(p) == addr) { 483 esa_freemem(sc, p); 484 *pp = p->next; 485 kmem_free(p, sizeof(*p)); 486 return; 487 } 488} 489 490static int 491esa_getdev(void *hdl, struct audio_device *ret) 492{ 493 494 *ret = esa_device; 495 return 0; 496} 497 498static int 499esa_set_port(void *hdl, mixer_ctrl_t *mc) 500{ 501 struct esa_voice *vc; 502 struct esa_softc *sc; 503 504 vc = hdl; 505 sc = device_private(vc->parent); 506 return sc->codec_if->vtbl->mixer_set_port(sc->codec_if, mc); 507} 508 509static int 510esa_get_port(void *hdl, mixer_ctrl_t *mc) 511{ 512 struct esa_voice *vc; 513 struct esa_softc *sc; 514 515 vc = hdl; 516 sc = device_private(vc->parent); 517 return sc->codec_if->vtbl->mixer_get_port(sc->codec_if, mc); 518} 519 520static int 521esa_query_devinfo(void *hdl, mixer_devinfo_t *di) 522{ 523 struct esa_voice *vc; 524 struct esa_softc *sc; 525 526 vc = hdl; 527 sc = device_private(vc->parent); 528 return sc->codec_if->vtbl->query_devinfo(sc->codec_if, di); 529} 530 531static size_t 532esa_round_buffersize(void *hdl, int direction, size_t bufsize) 533{ 534 535 return bufsize; 536} 537 538static int 539esa_get_props(void *hdl) 540{ 541 542 return AUDIO_PROP_MMAP | AUDIO_PROP_INDEPENDENT | AUDIO_PROP_FULLDUPLEX; 543} 544 545static int 546esa_trigger_output(void *hdl, void *start, void *end, int blksize, 547 void (*intr)(void *), void *intrarg, const audio_params_t *param) 548{ 549 struct esa_voice *vc; 550 struct esa_softc *sc; 551 struct esa_dma *p; 552 bus_space_tag_t iot; 553 bus_space_handle_t ioh; 554 size_t size; 555 uint32_t data, bufaddr, i; 556 int data_bytes, dac_data, dsp_in_size; 557 int dsp_out_size, dsp_in_buf, dsp_out_buf; 558 559 vc = hdl; 560 sc = device_private(vc->parent); 561 iot = sc->sc_iot; 562 ioh = sc->sc_ioh; 563 data_bytes = (((ESA_MINISRC_TMP_BUFFER_SIZE & ~1) + 564 (ESA_MINISRC_IN_BUFFER_SIZE & ~1) + 565 (ESA_MINISRC_OUT_BUFFER_SIZE & ~1) + 4) + 255) & ~255; 566 dac_data = ESA_DAC_DATA + (data_bytes * vc->index); 567 dsp_in_size = ESA_MINISRC_IN_BUFFER_SIZE - (0x20 * 2); 568 dsp_out_size = ESA_MINISRC_OUT_BUFFER_SIZE - (0x20 * 2); 569 dsp_in_buf = dac_data + (ESA_MINISRC_TMP_BUFFER_SIZE / 2); 570 dsp_out_buf = dsp_in_buf + (dsp_in_size / 2) + 1; 571 572 if (vc->play.active) 573 return EINVAL; 574 575 for (p = vc->dma; p && KERNADDR(p) != start; p = p->next) 576 continue; 577 if (p == NULL) { 578 aprint_error_dev(sc->sc_dev, "%s: bad addr %p\n", __func__, 579 start); 580 return EINVAL; 581 } 582 583 vc->play.active = 1; 584 vc->play.intr = intr; 585 vc->play.arg = intrarg; 586 vc->play.pos = 0; 587 vc->play.count = 0; 588 vc->play.buf = start; 589 vc->play.bufsize = size = (size_t)(((char *)end - (char *)start)); 590 vc->play.blksize = blksize; 591 bufaddr = DMAADDR(p); 592 vc->play.start = bufaddr; 593 594#define LO(x) ((x) & 0x0000ffff) 595#define HI(x) ((x) >> 16) 596 597 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, dac_data + 598 ESA_CDATA_HOST_SRC_ADDRL, LO(bufaddr)); 599 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, dac_data + 600 ESA_CDATA_HOST_SRC_ADDRH, HI(bufaddr)); 601 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, dac_data + 602 ESA_CDATA_HOST_SRC_END_PLUS_1L, LO(bufaddr + size)); 603 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, dac_data + 604 ESA_CDATA_HOST_SRC_END_PLUS_1H, HI(bufaddr + size)); 605 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, dac_data + 606 ESA_CDATA_HOST_SRC_CURRENTL, LO(bufaddr)); 607 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, dac_data + 608 ESA_CDATA_HOST_SRC_CURRENTH, HI(bufaddr)); 609 610 /* DSP buffers */ 611 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, dac_data + 612 ESA_CDATA_IN_BUF_BEGIN, dsp_in_buf); 613 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, dac_data + 614 ESA_CDATA_IN_BUF_END_PLUS_1, dsp_in_buf + (dsp_in_size / 2)); 615 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, dac_data + 616 ESA_CDATA_IN_BUF_HEAD, dsp_in_buf); 617 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, dac_data + 618 ESA_CDATA_IN_BUF_TAIL, dsp_in_buf); 619 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, dac_data + 620 ESA_CDATA_OUT_BUF_BEGIN, dsp_out_buf); 621 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, dac_data + 622 ESA_CDATA_OUT_BUF_END_PLUS_1, dsp_out_buf + (dsp_out_size / 2)); 623 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, dac_data + 624 ESA_CDATA_OUT_BUF_HEAD, dsp_out_buf); 625 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, dac_data + 626 ESA_CDATA_OUT_BUF_TAIL, dsp_out_buf); 627 628 /* Some per-client initializers */ 629 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, dac_data + 630 ESA_SRC3_DIRECTION_OFFSET + 12, dac_data + 40 + 8); 631 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, dac_data + 632 ESA_SRC3_DIRECTION_OFFSET + 19, 0x400 + ESA_MINISRC_COEF_LOC); 633 /* Enable or disable low-pass filter? (0xff if rate > 45000) */ 634 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, dac_data + 635 ESA_SRC3_DIRECTION_OFFSET + 22, 636 vc->play.mode.sample_rate > 45000 ? 0xff : 0); 637 /* Tell it which way DMA is going */ 638 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, dac_data + 639 ESA_CDATA_DMA_CONTROL, 640 ESA_DMACONTROL_AUTOREPEAT + ESA_DMAC_PAGE3_SELECTOR + 641 ESA_DMAC_BLOCKF_SELECTOR); 642 643 /* Set an armload of static initializers */ 644 for (i = 0; i < __arraycount(esa_playvals); i++) 645 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, dac_data + 646 esa_playvals[i].addr, esa_playvals[i].val); 647 648 /* Put us in the packed task lists */ 649 esa_add_list(vc, &sc->msrc_list, dac_data >> ESA_DP_SHIFT_COUNT, 650 vc->index); 651 esa_add_list(vc, &sc->dma_list, dac_data >> ESA_DP_SHIFT_COUNT, 652 vc->index); 653 esa_add_list(vc, &sc->mixer_list, dac_data >> ESA_DP_SHIFT_COUNT, 654 vc->index); 655#undef LO 656#undef HI 657 658 sc->sc_ntimers++; 659 660 if (sc->sc_ntimers == 1) { 661 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 662 ESA_KDATA_TIMER_COUNT_RELOAD, 240); 663 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 664 ESA_KDATA_TIMER_COUNT_CURRENT, 240); 665 data = bus_space_read_2(iot, ioh, ESA_HOST_INT_CTRL); 666 bus_space_write_2(iot, ioh, ESA_HOST_INT_CTRL, 667 data | ESA_CLKRUN_GEN_ENABLE); 668 } 669 670 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, dac_data + 671 ESA_CDATA_INSTANCE_READY, 1); 672 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 673 ESA_KDATA_MIXER_TASK_NUMBER, 674 sc->mixer_list.indexmap[vc->index]); 675 676 return 0; 677} 678 679static int 680esa_trigger_input(void *hdl, void *start, void *end, int blksize, 681 void (*intr)(void *), void *intrarg, const audio_params_t *param) 682{ 683 struct esa_voice *vc; 684 struct esa_softc *sc; 685 struct esa_dma *p; 686 bus_space_tag_t iot; 687 bus_space_handle_t ioh; 688 uint32_t data, bufaddr, i; 689 size_t size; 690 int data_bytes, adc_data, dsp_in_size; 691 int dsp_out_size, dsp_in_buf, dsp_out_buf; 692 693 vc = hdl; 694 sc = device_private(vc->parent); 695 iot = sc->sc_iot; 696 ioh = sc->sc_ioh; 697 data_bytes = (((ESA_MINISRC_TMP_BUFFER_SIZE & ~1) + 698 (ESA_MINISRC_IN_BUFFER_SIZE & ~1) + 699 (ESA_MINISRC_OUT_BUFFER_SIZE & ~1) + 4) + 255) & ~255; 700 adc_data = ESA_DAC_DATA + (data_bytes * vc->index) + (data_bytes / 2); 701 dsp_in_size = ESA_MINISRC_IN_BUFFER_SIZE - (0x10 * 2); 702 dsp_out_size = ESA_MINISRC_OUT_BUFFER_SIZE - (0x10 * 2); 703 dsp_in_buf = adc_data + (ESA_MINISRC_TMP_BUFFER_SIZE / 2); 704 dsp_out_buf = dsp_in_buf + (dsp_in_size / 2) + 1; 705 706 vc->rec.data_offset = adc_data; 707 708 /* We only support 1 recording channel */ 709 if (vc->index > 0) 710 return ENODEV; 711 712 if (vc->rec.active) 713 return EINVAL; 714 715 for (p = vc->dma; p && KERNADDR(p) != start; p = p->next) 716 continue; 717 if (p == NULL) { 718 aprint_error_dev(sc->sc_dev, "%s: bad addr %p\n", 719 __func__, start); 720 return EINVAL; 721 } 722 723 vc->rec.active = 1; 724 vc->rec.intr = intr; 725 vc->rec.arg = intrarg; 726 vc->rec.pos = 0; 727 vc->rec.count = 0; 728 vc->rec.buf = start; 729 vc->rec.bufsize = size = (size_t)(((char *)end - (char *)start)); 730 vc->rec.blksize = blksize; 731 bufaddr = DMAADDR(p); 732 vc->rec.start = bufaddr; 733 734#define LO(x) ((x) & 0x0000ffff) 735#define HI(x) ((x) >> 16) 736 737 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, adc_data + 738 ESA_CDATA_HOST_SRC_ADDRL, LO(bufaddr)); 739 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, adc_data + 740 ESA_CDATA_HOST_SRC_ADDRH, HI(bufaddr)); 741 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, adc_data + 742 ESA_CDATA_HOST_SRC_END_PLUS_1L, LO(bufaddr + size)); 743 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, adc_data + 744 ESA_CDATA_HOST_SRC_END_PLUS_1H, HI(bufaddr + size)); 745 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, adc_data + 746 ESA_CDATA_HOST_SRC_CURRENTL, LO(bufaddr)); 747 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, adc_data + 748 ESA_CDATA_HOST_SRC_CURRENTH, HI(bufaddr)); 749 750 /* DSP buffers */ 751 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, adc_data + 752 ESA_CDATA_IN_BUF_BEGIN, dsp_in_buf); 753 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, adc_data + 754 ESA_CDATA_IN_BUF_END_PLUS_1, dsp_in_buf + (dsp_in_size / 2)); 755 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, adc_data + 756 ESA_CDATA_IN_BUF_HEAD, dsp_in_buf); 757 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, adc_data + 758 ESA_CDATA_IN_BUF_TAIL, dsp_in_buf); 759 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, adc_data + 760 ESA_CDATA_OUT_BUF_BEGIN, dsp_out_buf); 761 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, adc_data + 762 ESA_CDATA_OUT_BUF_END_PLUS_1, dsp_out_buf + (dsp_out_size / 2)); 763 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, adc_data + 764 ESA_CDATA_OUT_BUF_HEAD, dsp_out_buf); 765 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, adc_data + 766 ESA_CDATA_OUT_BUF_TAIL, dsp_out_buf); 767 768 /* Some per-client initializers */ 769 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, adc_data + 770 ESA_SRC3_DIRECTION_OFFSET + 12, adc_data + 40 + 8); 771 /* Tell it which way DMA is going */ 772 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, adc_data + 773 ESA_CDATA_DMA_CONTROL, 774 ESA_DMACONTROL_DIRECTION + ESA_DMACONTROL_AUTOREPEAT + 775 ESA_DMAC_PAGE3_SELECTOR + ESA_DMAC_BLOCKF_SELECTOR); 776 777 /* Set an armload of static initializers */ 778 for (i = 0; i < __arraycount(esa_recvals); i++) 779 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, adc_data + 780 esa_recvals[i].addr, esa_recvals[i].val); 781 782 /* Put us in the packed task lists */ 783 esa_add_list(vc, &sc->adc1_list, adc_data >> ESA_DP_SHIFT_COUNT, 784 vc->index + ESA_NUM_VOICES); 785 esa_add_list(vc, &sc->msrc_list, adc_data >> ESA_DP_SHIFT_COUNT, 786 vc->index + ESA_NUM_VOICES); 787 esa_add_list(vc, &sc->dma_list, adc_data >> ESA_DP_SHIFT_COUNT, 788 vc->index + ESA_NUM_VOICES); 789#undef LO 790#undef HI 791 792 sc->sc_ntimers++; 793 if (sc->sc_ntimers == 1) { 794 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 795 ESA_KDATA_TIMER_COUNT_RELOAD, 240); 796 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 797 ESA_KDATA_TIMER_COUNT_CURRENT, 240); 798 data = bus_space_read_2(iot, ioh, ESA_HOST_INT_CTRL); 799 bus_space_write_2(iot, ioh, ESA_HOST_INT_CTRL, 800 data | ESA_CLKRUN_GEN_ENABLE); 801 } 802 803 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, adc_data + 804 ESA_CDATA_INSTANCE_READY, 1); 805 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, ESA_KDATA_ADC1_REQUEST, 806 1); 807 808 return 0; 809} 810 811/* Interrupt handler */ 812static int 813esa_intr(void *hdl) 814{ 815 struct esa_softc *sc; 816 struct esa_voice *vc; 817 bus_space_tag_t iot; 818 bus_space_handle_t ioh; 819 uint8_t status; 820 uint32_t pos; 821 uint32_t diff; 822 uint32_t blksize; 823 int i; 824 825 sc = hdl; 826 mutex_spin_enter(&sc->sc_intr_lock); 827 828 iot = sc->sc_iot; 829 ioh = sc->sc_ioh; 830 831 status = bus_space_read_1(iot, ioh, ESA_HOST_INT_STATUS); 832 if (status == 0xff) { 833 mutex_spin_exit(&sc->sc_intr_lock); 834 return 0; 835 } 836 837 /* ack the interrupt */ 838 bus_space_write_1(iot, ioh, ESA_HOST_INT_STATUS, status); 839 840 if (status & ESA_HV_INT_PENDING) { 841 uint8_t event; 842 843 aprint_normal_dev(sc->sc_dev, "hardware volume interrupt\n"); 844 event = bus_space_read_1(iot, ioh, ESA_HW_VOL_COUNTER_MASTER); 845 switch(event) { 846 case 0xaa: /* volume up */ 847 pmf_event_inject(NULL, PMFE_AUDIO_VOLUME_UP); 848 break; 849 case 0x66: /* volume down */ 850 pmf_event_inject(NULL, PMFE_AUDIO_VOLUME_DOWN); 851 break; 852 case 0x88: /* mute */ 853 pmf_event_inject(NULL, PMFE_AUDIO_VOLUME_TOGGLE); 854 break; 855 default: 856 aprint_normal_dev(sc->sc_dev, 857 "unknown hwvol event 0x%02x\n", event); 858 break; 859 } 860 bus_space_write_1(iot, ioh, ESA_HW_VOL_COUNTER_MASTER, 0x88); 861 } 862 863 if ((status & ESA_ASSP_INT_PENDING) == 0 || 864 (bus_space_read_1(iot, ioh, 865 ESA_ASSP_CONTROL_B) & ESA_STOP_ASSP_CLOCK) != 0 || 866 (bus_space_read_1(iot, ioh, 867 ESA_ASSP_HOST_INT_STATUS) & ESA_DSP2HOST_REQ_TIMER) == 0) { 868 mutex_spin_exit(&sc->sc_intr_lock); 869 return 1; 870 } 871 872 bus_space_write_1(iot, ioh, ESA_ASSP_HOST_INT_STATUS, 873 ESA_DSP2HOST_REQ_TIMER); 874 875 for (i = 0; i < ESA_NUM_VOICES; i++) { 876 vc = &sc->voice[i]; 877 878 if (vc->play.active) { 879 pos = esa_get_pointer(sc, &vc->play) % vc->play.bufsize; 880 diff = (vc->play.bufsize + pos - vc->play.pos) % 881 vc->play.bufsize; 882 883 vc->play.pos = pos; 884 vc->play.count += diff; 885 blksize = vc->play.blksize; 886 887 while (vc->play.count >= blksize) { 888 vc->play.count -= blksize; 889 (*vc->play.intr)(vc->play.arg); 890 } 891 } 892 893 if (vc->rec.active) { 894 pos = esa_get_pointer(sc, &vc->rec) % vc->rec.bufsize; 895 diff = (vc->rec.bufsize + pos - vc->rec.pos) % 896 vc->rec.bufsize; 897 898 vc->rec.pos = pos; 899 vc->rec.count += diff; 900 blksize = vc->rec.blksize; 901 902 while (vc->rec.count >= blksize) { 903 vc->rec.count -= blksize; 904 (*vc->rec.intr)(vc->rec.arg); 905 } 906 } 907 } 908 909 mutex_spin_exit(&sc->sc_intr_lock); 910 return 1; 911} 912 913static int 914esa_allocmem(struct esa_softc *sc, size_t size, size_t align, 915 struct esa_dma *p) 916{ 917 int error; 918 919 p->size = size; 920 error = bus_dmamem_alloc(sc->sc_dmat, p->size, align, 0, 921 p->segs, __arraycount(p->segs), 922 &p->nsegs, BUS_DMA_WAITOK); 923 if (error) 924 return error; 925 926 error = bus_dmamem_map(sc->sc_dmat, p->segs, p->nsegs, p->size, 927 &p->addr, BUS_DMA_WAITOK | BUS_DMA_COHERENT); 928 if (error) 929 goto free; 930 931 error = bus_dmamap_create(sc->sc_dmat, p->size, 1, p->size, 0, 932 BUS_DMA_WAITOK, &p->map); 933 if (error) 934 goto unmap; 935 936 error = bus_dmamap_load(sc->sc_dmat, p->map, p->addr, p->size, NULL, 937 BUS_DMA_WAITOK); 938 if (error) 939 goto destroy; 940 941 return 0; 942 943destroy: 944 bus_dmamap_destroy(sc->sc_dmat, p->map); 945unmap: 946 bus_dmamem_unmap(sc->sc_dmat, p->addr, p->size); 947free: 948 bus_dmamem_free(sc->sc_dmat, p->segs, p->nsegs); 949 950 return error; 951} 952 953static int 954esa_freemem(struct esa_softc *sc, struct esa_dma *p) 955{ 956 957 bus_dmamap_unload(sc->sc_dmat, p->map); 958 bus_dmamap_destroy(sc->sc_dmat, p->map); 959 bus_dmamem_unmap(sc->sc_dmat, p->addr, p->size); 960 bus_dmamem_free(sc->sc_dmat, p->segs, p->nsegs); 961 962 return 0; 963} 964 965/* 966 * Supporting Subroutines 967 */ 968 969static int 970esa_match(device_t dev, cfdata_t match, void *aux) 971{ 972 struct pci_attach_args *pa; 973 974 pa = (struct pci_attach_args *)aux; 975 switch (PCI_VENDOR(pa->pa_id)) { 976 case PCI_VENDOR_ESSTECH: 977 switch(PCI_PRODUCT(pa->pa_id)) { 978 case PCI_PRODUCT_ESSTECH_ALLEGRO1: 979 case PCI_PRODUCT_ESSTECH_MAESTRO3: 980 case PCI_PRODUCT_ESSTECH_MAESTRO3_2: 981 return 1; 982 } 983 } 984 985 return 0; 986} 987 988static void 989esa_attach(device_t parent, device_t self, void *aux) 990{ 991 struct esa_softc *sc; 992 struct pci_attach_args *pa; 993 pcitag_t tag; 994 pci_chipset_tag_t pc; 995 pci_intr_handle_t ih; 996 const struct esa_card_type *card; 997 const char *intrstr; 998 uint32_t data; 999 int revision, i, error; 1000 char intrbuf[PCI_INTRSTR_LEN]; 1001 1002 sc = device_private(self); 1003 pa = (struct pci_attach_args *)aux; 1004 tag = pa->pa_tag; 1005 pc = pa->pa_pc; 1006 1007 pci_aprint_devinfo(pa, "Audio controller"); 1008 1009 revision = PCI_REVISION(pa->pa_class); 1010 1011 for (card = esa_card_types; card->pci_vendor_id; card++) 1012 if (PCI_VENDOR(pa->pa_id) == card->pci_vendor_id && 1013 PCI_PRODUCT(pa->pa_id) == card->pci_product_id) { 1014 sc->type = card->type; 1015 sc->delay1 = card->delay1; 1016 sc->delay2 = card->delay2; 1017 break; 1018 } 1019 1020 data = pci_conf_read(pc, tag, PCI_COMMAND_STATUS_REG); 1021 data |= (PCI_COMMAND_IO_ENABLE | PCI_COMMAND_MEM_ENABLE 1022 | PCI_COMMAND_MASTER_ENABLE); 1023 pci_conf_write(pc, tag, PCI_COMMAND_STATUS_REG, data); 1024 1025 /* Map I/O register */ 1026 if (pci_mapreg_map(pa, PCI_CBIO, PCI_MAPREG_TYPE_IO, 0, 1027 &sc->sc_iot, &sc->sc_ioh, &sc->sc_iob, &sc->sc_ios)) { 1028 aprint_error_dev(sc->sc_dev, "can't map i/o space\n"); 1029 return; 1030 } 1031 1032 /* Initialize softc */ 1033 sc->sc_dev = self; 1034 sc->sc_tag = tag; 1035 sc->sc_pct = pc; 1036 sc->sc_dmat = pa->pa_dmat; 1037 1038 mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE); 1039 mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_AUDIO); 1040 1041 /* Map and establish an interrupt */ 1042 if (pci_intr_map(pa, &ih)) { 1043 aprint_error_dev(sc->sc_dev, "can't map interrupt\n"); 1044 mutex_destroy(&sc->sc_lock); 1045 mutex_destroy(&sc->sc_intr_lock); 1046 return; 1047 } 1048 intrstr = pci_intr_string(pc, ih, intrbuf, sizeof(intrbuf)); 1049 sc->sc_ih = pci_intr_establish_xname(pc, ih, IPL_AUDIO, esa_intr, sc, 1050 device_xname(self)); 1051 if (sc->sc_ih == NULL) { 1052 aprint_error_dev(sc->sc_dev, "can't establish interrupt"); 1053 if (intrstr != NULL) 1054 aprint_error(" at %s", intrstr); 1055 aprint_error("\n"); 1056 mutex_destroy(&sc->sc_lock); 1057 mutex_destroy(&sc->sc_intr_lock); 1058 return; 1059 } 1060 aprint_normal_dev(sc->sc_dev, "interrupting at %s\n", intrstr); 1061 1062 /* power up chip */ 1063 if ((error = pci_activate(pa->pa_pc, pa->pa_tag, self, 1064 pci_activate_null)) && error != EOPNOTSUPP) { 1065 aprint_error_dev(sc->sc_dev, "cannot activate %d\n", error); 1066 mutex_destroy(&sc->sc_lock); 1067 mutex_destroy(&sc->sc_intr_lock); 1068 return; 1069 } 1070 1071 /* Init chip */ 1072 if (esa_init(sc) == -1) { 1073 aprint_error_dev(sc->sc_dev, 1074 "esa_attach: unable to initialize the card\n"); 1075 mutex_destroy(&sc->sc_lock); 1076 mutex_destroy(&sc->sc_intr_lock); 1077 return; 1078 } 1079 1080 /* create suspend save area */ 1081 sc->savememsz = sizeof(uint16_t) * (ESA_REV_B_CODE_MEMORY_LENGTH 1082 + ESA_REV_B_DATA_MEMORY_LENGTH + 1); 1083 sc->savemem = kmem_zalloc(sc->savememsz, KM_SLEEP); 1084 1085 /* 1086 * Every card I've seen has had their channels swapped with respect 1087 * to the mixer. Ie: 1088 * $ mixerctl -w outputs.master=0,191 1089 * Would result in the _right_ speaker being turned off. 1090 * 1091 * So, we will swap the left and right mixer channels to compensate 1092 * for this. 1093 * 1094 * XXX PR# 23620: The Dell C810 channels are not swapped. Match 1095 * on revision ID for now; this is probably wrong. 1096 */ 1097 if (revision == 0x10 && sc->type == ESS_MAESTRO3) 1098 sc->codec_flags = 0; 1099 else 1100 sc->codec_flags = AC97_HOST_SWAPPED_CHANNELS; 1101 1102 /* initialize list management structures */ 1103 sc->mixer_list.mem_addr = ESA_KDATA_MIXER_XFER0; 1104 sc->mixer_list.max = ESA_MAX_VIRTUAL_MIXER_CHANNELS; 1105 sc->adc1_list.mem_addr = ESA_KDATA_ADC1_XFER0; 1106 sc->adc1_list.max = ESA_MAX_VIRTUAL_ADC1_CHANNELS; 1107 sc->dma_list.mem_addr = ESA_KDATA_DMA_XFER0; 1108 sc->dma_list.max = ESA_MAX_VIRTUAL_DMA_CHANNELS; 1109 sc->msrc_list.mem_addr = ESA_KDATA_INSTANCE0_MINISRC; 1110 sc->msrc_list.max = ESA_MAX_INSTANCE_MINISRC; 1111 1112 /* initialize index maps */ 1113 for (i = 0; i < ESA_NUM_VOICES * 2; i++) { 1114 sc->mixer_list.indexmap[i] = -1; 1115 sc->msrc_list.indexmap[i] = -1; 1116 sc->dma_list.indexmap[i] = -1; 1117 sc->adc1_list.indexmap[i] = -1; 1118 } 1119 1120 /* Attach AC97 host interface */ 1121 sc->host_if.arg = sc; 1122 sc->host_if.attach = esa_attach_codec; 1123 sc->host_if.read = esa_read_codec; 1124 sc->host_if.write = esa_write_codec; 1125 sc->host_if.reset = esa_reset_codec; 1126 sc->host_if.flags = esa_flags_codec; 1127 1128 if (ac97_attach(&sc->host_if, self, &sc->sc_lock) != 0) { 1129 mutex_destroy(&sc->sc_lock); 1130 mutex_destroy(&sc->sc_intr_lock); 1131 return; 1132 } 1133 1134 /* Attach audio interface. */ 1135 for (i = 0; i < ESA_NUM_VOICES; i++) { 1136 sc->voice[i].parent = sc->sc_dev; 1137 sc->voice[i].index = i; 1138 sc->sc_audiodev[i] = 1139 audio_attach_mi(&esa_hw_if, &sc->voice[i], sc->sc_dev); 1140 } 1141 1142 if (!pmf_device_register(self, esa_suspend, esa_resume)) 1143 aprint_error_dev(self, "couldn't establish power handler\n"); 1144 1145 return; 1146} 1147 1148void 1149esa_childdet(device_t self, device_t child) 1150{ 1151 struct esa_softc *sc = device_private(self); 1152 int i; 1153 1154 for (i = 0; i < ESA_NUM_VOICES; i++) { 1155 if (sc->sc_audiodev[i] == child) { 1156 sc->sc_audiodev[i] = NULL; 1157 break; 1158 } 1159 } 1160 KASSERT(i < ESA_NUM_VOICES); 1161} 1162 1163static int 1164esa_detach(device_t self, int flags) 1165{ 1166 struct esa_softc *sc; 1167 int i; 1168 1169 sc = device_private(self); 1170 for (i = 0; i < ESA_NUM_VOICES; i++) { 1171 if (sc->sc_audiodev[i] != NULL) 1172 config_detach(sc->sc_audiodev[i], flags); 1173 } 1174 1175 if (sc->sc_ih != NULL) 1176 pci_intr_disestablish(sc->sc_pct, sc->sc_ih); 1177 if (sc->sc_ios) 1178 bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios); 1179 1180 kmem_free(sc->savemem, sc->savememsz); 1181 mutex_destroy(&sc->sc_lock); 1182 mutex_destroy(&sc->sc_intr_lock); 1183 1184 return 0; 1185} 1186 1187static uint16_t 1188esa_read_assp(struct esa_softc *sc, uint16_t region, uint16_t index) 1189{ 1190 uint16_t data; 1191 bus_space_tag_t iot; 1192 bus_space_handle_t ioh; 1193 1194 iot = sc->sc_iot; 1195 ioh = sc->sc_ioh; 1196 bus_space_write_2(iot, ioh, ESA_DSP_PORT_MEMORY_TYPE, 1197 region & ESA_MEMTYPE_MASK); 1198 bus_space_write_2(iot, ioh, ESA_DSP_PORT_MEMORY_INDEX, index); 1199 data = bus_space_read_2(iot, ioh, ESA_DSP_PORT_MEMORY_DATA); 1200 1201 return data; 1202} 1203 1204static void 1205esa_write_assp(struct esa_softc *sc, uint16_t region, uint16_t index, 1206 uint16_t data) 1207{ 1208 bus_space_tag_t iot; 1209 bus_space_handle_t ioh; 1210 1211 iot = sc->sc_iot; 1212 ioh = sc->sc_ioh; 1213 bus_space_write_2(iot, ioh, ESA_DSP_PORT_MEMORY_TYPE, 1214 region & ESA_MEMTYPE_MASK); 1215 bus_space_write_2(iot, ioh, ESA_DSP_PORT_MEMORY_INDEX, index); 1216 bus_space_write_2(iot, ioh, ESA_DSP_PORT_MEMORY_DATA, data); 1217 1218 return; 1219} 1220 1221static int 1222esa_init_codec(struct esa_softc *sc) 1223{ 1224 bus_space_tag_t iot; 1225 bus_space_handle_t ioh; 1226 uint32_t data; 1227 1228 iot = sc->sc_iot; 1229 ioh = sc->sc_ioh; 1230 data = bus_space_read_1(iot, ioh, ESA_CODEC_COMMAND); 1231 1232 return (data & 0x1) ? 0 : 1; 1233} 1234 1235static int 1236esa_attach_codec(void *aux, struct ac97_codec_if *codec_if) 1237{ 1238 struct esa_softc *sc; 1239 1240 sc = aux; 1241 sc->codec_if = codec_if; 1242 1243 return 0; 1244} 1245 1246static int 1247esa_read_codec(void *aux, uint8_t reg, uint16_t *result) 1248{ 1249 struct esa_softc *sc; 1250 bus_space_tag_t iot; 1251 bus_space_handle_t ioh; 1252 1253 sc = aux; 1254 iot = sc->sc_iot; 1255 ioh = sc->sc_ioh; 1256 if (esa_wait(sc)) 1257 aprint_error_dev(sc->sc_dev, "esa_read_codec: timed out\n"); 1258 bus_space_write_1(iot, ioh, ESA_CODEC_COMMAND, (reg & 0x7f) | 0x80); 1259 delay(50); 1260 if (esa_wait(sc)) 1261 aprint_error_dev(sc->sc_dev, "esa_read_codec: timed out\n"); 1262 *result = bus_space_read_2(iot, ioh, ESA_CODEC_DATA); 1263 1264 return 0; 1265} 1266 1267static int 1268esa_write_codec(void *aux, uint8_t reg, uint16_t data) 1269{ 1270 struct esa_softc *sc; 1271 bus_space_tag_t iot; 1272 bus_space_handle_t ioh; 1273 1274 sc = aux; 1275 iot = sc->sc_iot; 1276 ioh = sc->sc_ioh; 1277 if (esa_wait(sc)) { 1278 aprint_error_dev(sc->sc_dev, "esa_write_codec: timed out\n"); 1279 return -1; 1280 } 1281 bus_space_write_2(iot, ioh, ESA_CODEC_DATA, data); 1282 bus_space_write_1(iot, ioh, ESA_CODEC_COMMAND, reg & 0x7f); 1283 delay(50); 1284 1285 return 0; 1286} 1287 1288static int 1289esa_reset_codec(void *aux) 1290{ 1291 1292 return 0; 1293} 1294 1295static enum ac97_host_flags 1296esa_flags_codec(void *aux) 1297{ 1298 struct esa_softc *sc; 1299 1300 sc = aux; 1301 return sc->codec_flags; 1302} 1303 1304static int 1305esa_wait(struct esa_softc *sc) 1306{ 1307 int i, val; 1308 bus_space_tag_t iot; 1309 bus_space_handle_t ioh; 1310 1311 iot = sc->sc_iot; 1312 ioh = sc->sc_ioh; 1313 for (i = 0; i < 20; i++) { 1314 val = bus_space_read_1(iot, ioh, ESA_CODEC_STATUS); 1315 if ((val & 1) == 0) 1316 return 0; 1317 delay(2); 1318 } 1319 1320 return -1; 1321} 1322 1323static int 1324esa_init(struct esa_softc *sc) 1325{ 1326 struct esa_voice *vc; 1327 bus_space_tag_t iot; 1328 bus_space_handle_t ioh; 1329 pcitag_t tag; 1330 pci_chipset_tag_t pc; 1331 uint32_t data, i, size; 1332 uint8_t reset_state; 1333 int data_bytes; 1334 1335 iot = sc->sc_iot; 1336 ioh = sc->sc_ioh; 1337 tag = sc->sc_tag; 1338 pc = sc->sc_pct; 1339 data_bytes = (((ESA_MINISRC_TMP_BUFFER_SIZE & ~1) + 1340 (ESA_MINISRC_IN_BUFFER_SIZE & ~1) + 1341 (ESA_MINISRC_OUT_BUFFER_SIZE & ~1) + 4) + 255) & ~255; 1342 1343 mutex_spin_enter(&sc->sc_intr_lock); 1344 1345 /* Disable legacy emulation */ 1346 data = pci_conf_read(pc, tag, PCI_LEGACY_AUDIO_CTRL); 1347 data |= DISABLE_LEGACY; 1348 pci_conf_write(pc, tag, PCI_LEGACY_AUDIO_CTRL, data); 1349 1350 esa_config(sc); 1351 1352 reset_state = esa_assp_halt(sc); 1353 1354 esa_init_codec(sc); 1355 esa_codec_reset(sc); 1356 1357 /* Zero kernel and mixer data */ 1358 size = ESA_REV_B_DATA_MEMORY_UNIT_LENGTH * ESA_NUM_UNITS_KERNEL_DATA; 1359 for (i = 0; i < size / 2; i++) { 1360 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 1361 ESA_KDATA_BASE_ADDR + i, 0); 1362 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 1363 ESA_KDATA_BASE_ADDR2 + i, 0); 1364 } 1365 1366 /* Init DMA pointer */ 1367 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, ESA_KDATA_CURRENT_DMA, 1368 ESA_KDATA_DMA_XFER0); 1369 1370 /* Write kernel code into memory */ 1371 for (i = 0; i < __arraycount(esa_assp_kernel_image); i++) 1372 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_CODE, 1373 ESA_REV_B_CODE_MEMORY_BEGIN + i, esa_assp_kernel_image[i]); 1374 1375 for (i = 0; i < __arraycount(esa_assp_minisrc_image); i++) 1376 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_CODE, 0x400 + i, 1377 esa_assp_minisrc_image[i]); 1378 1379 /* Write the coefficients for the low pass filter */ 1380 for (i = 0; i < __arraycount(esa_minisrc_lpf_image); i++) 1381 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_CODE, 1382 0x400 + ESA_MINISRC_COEF_LOC + i, 1383 esa_minisrc_lpf_image[i]); 1384 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_CODE, 1385 0x400 + ESA_MINISRC_COEF_LOC + size, 0x8000); 1386 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, ESA_KDATA_TASK0, 0x400); 1387 /* Init the mixer number */ 1388 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 1389 ESA_KDATA_MIXER_TASK_NUMBER, 0); 1390 /* Extreme kernel master volume */ 1391 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 1392 ESA_KDATA_DAC_LEFT_VOLUME, ESA_ARB_VOLUME); 1393 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 1394 ESA_KDATA_DAC_RIGHT_VOLUME, ESA_ARB_VOLUME); 1395 1396 if (esa_amp_enable(sc)) 1397 return -1; 1398 1399 /* Zero entire DAC/ADC area */ 1400 for (i = 0x1100; i < 0x1c00; i++) 1401 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, i, 0); 1402 1403 /* set some sane defaults */ 1404 for (i = 0; i < ESA_NUM_VOICES; i++) { 1405 vc = &sc->voice[i]; 1406 vc->play.data_offset = ESA_DAC_DATA + (data_bytes * i); 1407 vc->rec.data_offset = ESA_DAC_DATA + (data_bytes * i * 2); 1408 } 1409 1410 esa_enable_interrupts(sc); 1411 1412 bus_space_write_1(iot, ioh, ESA_DSP_PORT_CONTROL_REG_B, 1413 reset_state | ESA_REGB_ENABLE_RESET); 1414 1415 mutex_spin_exit(&sc->sc_intr_lock); 1416 1417 return 0; 1418} 1419 1420static void 1421esa_config(struct esa_softc *sc) 1422{ 1423 bus_space_tag_t iot; 1424 bus_space_handle_t ioh; 1425 pcitag_t tag; 1426 pci_chipset_tag_t pc; 1427 uint32_t data; 1428 1429 iot = sc->sc_iot; 1430 ioh = sc->sc_ioh; 1431 tag = sc->sc_tag; 1432 pc = sc->sc_pct; 1433 1434 data = pci_conf_read(pc, tag, ESA_PCI_ALLEGRO_CONFIG); 1435 data &= ESA_REDUCED_DEBOUNCE; 1436 data |= ESA_PM_CTRL_ENABLE | ESA_CLK_DIV_BY_49 | ESA_USE_PCI_TIMING; 1437 pci_conf_write(pc, tag, ESA_PCI_ALLEGRO_CONFIG, data); 1438 1439 bus_space_write_1(iot, ioh, ESA_ASSP_CONTROL_B, ESA_RESET_ASSP); 1440 data = pci_conf_read(pc, tag, ESA_PCI_ALLEGRO_CONFIG); 1441 data &= ~ESA_INT_CLK_SELECT; 1442 if (sc->type == ESS_MAESTRO3) { 1443 data &= ~ESA_INT_CLK_MULT_ENABLE; 1444 data |= ESA_INT_CLK_SRC_NOT_PCI; 1445 } 1446 data &= ~(ESA_CLK_MULT_MODE_SELECT | ESA_CLK_MULT_MODE_SELECT_2); 1447 pci_conf_write(pc, tag, ESA_PCI_ALLEGRO_CONFIG, data); 1448 1449 if (sc->type == ESS_ALLEGRO1) { 1450 data = pci_conf_read(pc, tag, ESA_PCI_USER_CONFIG); 1451 data |= ESA_IN_CLK_12MHZ_SELECT; 1452 pci_conf_write(pc, tag, ESA_PCI_USER_CONFIG, data); 1453 } 1454 1455 data = bus_space_read_1(iot, ioh, ESA_ASSP_CONTROL_A); 1456 data &= ~(ESA_DSP_CLK_36MHZ_SELECT | ESA_ASSP_CLK_49MHZ_SELECT); 1457 data |= ESA_ASSP_CLK_49MHZ_SELECT; /* XXX: Assumes 49MHz DSP */ 1458 data |= ESA_ASSP_0_WS_ENABLE; 1459 bus_space_write_1(iot, ioh, ESA_ASSP_CONTROL_A, data); 1460 1461 bus_space_write_1(iot, ioh, ESA_ASSP_CONTROL_B, ESA_RUN_ASSP); 1462 1463 return; 1464} 1465 1466static uint8_t 1467esa_assp_halt(struct esa_softc *sc) 1468{ 1469 bus_space_tag_t iot; 1470 bus_space_handle_t ioh; 1471 uint8_t data, reset_state; 1472 1473 iot = sc->sc_iot; 1474 ioh = sc->sc_ioh; 1475 data = bus_space_read_1(iot, ioh, ESA_DSP_PORT_CONTROL_REG_B); 1476 reset_state = data & ~ESA_REGB_STOP_CLOCK; 1477 delay(10000); 1478 bus_space_write_1(iot, ioh, ESA_DSP_PORT_CONTROL_REG_B, 1479 reset_state & ~ESA_REGB_ENABLE_RESET); 1480 delay(10000); 1481 1482 return reset_state; 1483} 1484 1485static void 1486esa_codec_reset(struct esa_softc *sc) 1487{ 1488 bus_space_tag_t iot; 1489 bus_space_handle_t ioh; 1490 uint16_t data, dir; 1491 int retry; 1492 1493 iot = sc->sc_iot; 1494 ioh = sc->sc_ioh; 1495 retry = 0; 1496 do { 1497 data = bus_space_read_2(iot, ioh, ESA_GPIO_DIRECTION); 1498 dir = data | 0x10; /* assuming pci bus master? */ 1499 1500 /* remote codec config */ 1501 data = bus_space_read_2(iot, ioh, ESA_RING_BUS_CTRL_B); 1502 bus_space_write_2(iot, ioh, ESA_RING_BUS_CTRL_B, 1503 data & ~ESA_SECOND_CODEC_ID_MASK); 1504 data = bus_space_read_2(iot, ioh, ESA_SDO_OUT_DEST_CTRL); 1505 bus_space_write_2(iot, ioh, ESA_SDO_OUT_DEST_CTRL, 1506 data & ~ESA_COMMAND_ADDR_OUT); 1507 data = bus_space_read_2(iot, ioh, ESA_SDO_IN_DEST_CTRL); 1508 bus_space_write_2(iot, ioh, ESA_SDO_IN_DEST_CTRL, 1509 data & ~ESA_STATUS_ADDR_IN); 1510 1511 bus_space_write_2(iot, ioh, ESA_RING_BUS_CTRL_A, 1512 ESA_IO_SRAM_ENABLE); 1513 delay(20); 1514 1515 bus_space_write_2(iot, ioh, ESA_GPIO_DIRECTION, 1516 dir & ~ESA_GPO_PRIMARY_AC97); 1517 bus_space_write_2(iot, ioh, ESA_GPIO_MASK, 1518 ~ESA_GPO_PRIMARY_AC97); 1519 bus_space_write_2(iot, ioh, ESA_GPIO_DATA, 0); 1520 bus_space_write_2(iot, ioh, ESA_GPIO_DIRECTION, 1521 dir | ESA_GPO_PRIMARY_AC97); 1522 delay(sc->delay1 * 1000); 1523 bus_space_write_2(iot, ioh, ESA_GPIO_DATA, 1524 ESA_GPO_PRIMARY_AC97); 1525 delay(5); 1526 bus_space_write_2(iot, ioh, ESA_RING_BUS_CTRL_A, 1527 ESA_IO_SRAM_ENABLE | ESA_SERIAL_AC_LINK_ENABLE); 1528 bus_space_write_2(iot, ioh, ESA_GPIO_MASK, ~0); 1529 delay(sc->delay2 * 1000); 1530 1531 esa_read_codec(sc, 0x7c, &data); 1532 if ((data == 0) || (data == 0xffff)) { 1533 retry++; 1534 if (retry > 3) { 1535 aprint_error_dev(sc->sc_dev, 1536 "esa_codec_reset: failed\n"); 1537 break; 1538 } 1539 aprint_normal_dev(sc->sc_dev, 1540 "esa_codec_reset: retrying\n"); 1541 } else 1542 retry = 0; 1543 } while (retry); 1544 1545 return; 1546} 1547 1548static int 1549esa_amp_enable(struct esa_softc *sc) 1550{ 1551 bus_space_tag_t iot; 1552 bus_space_handle_t ioh; 1553 uint32_t gpo, polarity_port, polarity; 1554 uint16_t data; 1555 1556 iot = sc->sc_iot; 1557 ioh = sc->sc_ioh; 1558 switch (sc->type) { 1559 case ESS_ALLEGRO1: 1560 polarity_port = 0x1800; 1561 break; 1562 case ESS_MAESTRO3: 1563 polarity_port = 0x1100; 1564 break; 1565 default: 1566 aprint_error_dev(sc->sc_dev, 1567 "esa_amp_enable: Unknown chip type!!!\n"); 1568 return 1; 1569 } 1570 1571 gpo = (polarity_port >> 8) & 0x0f; 1572 polarity = polarity_port >> 12; 1573 polarity = !polarity; /* Enable */ 1574 polarity = polarity << gpo; 1575 gpo = 1 << gpo; 1576 bus_space_write_2(iot, ioh, ESA_GPIO_MASK, ~gpo); 1577 data = bus_space_read_2(iot, ioh, ESA_GPIO_DIRECTION); 1578 bus_space_write_2(iot, ioh, ESA_GPIO_DIRECTION, data | gpo); 1579 data = ESA_GPO_SECONDARY_AC97 | ESA_GPO_PRIMARY_AC97 | polarity; 1580 bus_space_write_2(iot, ioh, ESA_GPIO_DATA, data); 1581 bus_space_write_2(iot, ioh, ESA_GPIO_MASK, ~0); 1582 1583 return 0; 1584} 1585 1586static void 1587esa_enable_interrupts(struct esa_softc *sc) 1588{ 1589 bus_space_tag_t iot; 1590 bus_space_handle_t ioh; 1591 uint8_t data; 1592 1593 iot = sc->sc_iot; 1594 ioh = sc->sc_ioh; 1595 bus_space_write_2(iot, ioh, ESA_HOST_INT_CTRL, 1596 ESA_ASSP_INT_ENABLE | ESA_HV_INT_ENABLE); 1597 data = bus_space_read_1(iot, ioh, ESA_ASSP_CONTROL_C); 1598 bus_space_write_1(iot, ioh, ESA_ASSP_CONTROL_C, 1599 data | ESA_ASSP_HOST_INT_ENABLE); 1600} 1601 1602/* 1603 * List management 1604 */ 1605static int 1606esa_add_list(struct esa_voice *vc, struct esa_list *el, 1607 uint16_t val, int index) 1608{ 1609 struct esa_softc *sc; 1610 1611 sc = device_private(vc->parent); 1612 el->indexmap[index] = el->currlen; 1613 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 1614 el->mem_addr + el->currlen, 1615 val); 1616 1617 return el->currlen++; 1618} 1619 1620static void 1621esa_remove_list(struct esa_voice *vc, struct esa_list *el, int index) 1622{ 1623 struct esa_softc *sc; 1624 uint16_t val; 1625 int lastindex; 1626 int vindex; 1627 int i; 1628 1629 sc = device_private(vc->parent); 1630 lastindex = el->currlen - 1; 1631 vindex = el->indexmap[index]; 1632 1633 /* reset our virtual index */ 1634 el->indexmap[index] = -1; 1635 1636 if (vindex != lastindex) { 1637 val = esa_read_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 1638 el->mem_addr + lastindex); 1639 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 1640 el->mem_addr + vindex, 1641 val); 1642 for (i = 0; i < ESA_NUM_VOICES * 2; i++) 1643 if (el->indexmap[i] == lastindex) 1644 break; 1645 if (i >= ESA_NUM_VOICES * 2) 1646 aprint_error_dev(sc->sc_dev, 1647 "esa_remove_list: invalid task index\n"); 1648 else 1649 el->indexmap[i] = vindex; 1650 } 1651 1652 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, 1653 el->mem_addr + lastindex, 0); 1654 el->currlen--; 1655 1656 return; 1657} 1658 1659static bool 1660esa_suspend(device_t dv, const pmf_qual_t *qual) 1661{ 1662 struct esa_softc *sc = device_private(dv); 1663 bus_space_tag_t iot = sc->sc_iot; 1664 bus_space_handle_t ioh = sc->sc_ioh; 1665 int i, index; 1666 1667 index = 0; 1668 1669 mutex_enter(&sc->sc_lock); 1670 mutex_spin_enter(&sc->sc_intr_lock); 1671 1672 bus_space_write_2(iot, ioh, ESA_HOST_INT_CTRL, 0); 1673 bus_space_write_1(iot, ioh, ESA_ASSP_CONTROL_C, 0); 1674 1675 esa_assp_halt(sc); 1676 1677 /* Save ASSP state */ 1678 for (i = ESA_REV_B_CODE_MEMORY_BEGIN; i <= ESA_REV_B_CODE_MEMORY_END; 1679 i++) 1680 sc->savemem[index++] = esa_read_assp(sc, 1681 ESA_MEMTYPE_INTERNAL_CODE, i); 1682 for (i = ESA_REV_B_DATA_MEMORY_BEGIN; i <= ESA_REV_B_DATA_MEMORY_END; 1683 i++) 1684 sc->savemem[index++] = esa_read_assp(sc, 1685 ESA_MEMTYPE_INTERNAL_DATA, i); 1686 1687 mutex_spin_exit(&sc->sc_intr_lock); 1688 mutex_exit(&sc->sc_lock); 1689 1690 return true; 1691} 1692 1693static bool 1694esa_resume(device_t dv, const pmf_qual_t *qual) 1695{ 1696 struct esa_softc *sc = device_private(dv); 1697 bus_space_tag_t iot = sc->sc_iot; 1698 bus_space_handle_t ioh = sc->sc_ioh; 1699 int i, index; 1700 uint8_t reset_state; 1701 pcireg_t data; 1702 1703 index = 0; 1704 1705 delay(10000); 1706 1707 mutex_enter(&sc->sc_lock); 1708 mutex_spin_enter(&sc->sc_intr_lock); 1709 1710 data = pci_conf_read(sc->sc_pct, sc->sc_tag, PCI_LEGACY_AUDIO_CTRL); 1711 pci_conf_write(sc->sc_pct, sc->sc_tag, PCI_LEGACY_AUDIO_CTRL, 1712 data | DISABLE_LEGACY); 1713 1714 bus_space_write_4(iot, ioh, ESA_PCI_ACPI_CONTROL, ESA_PCI_ACPI_D0); 1715 1716 esa_config(sc); 1717 1718 reset_state = esa_assp_halt(sc); 1719 1720 esa_init_codec(sc); 1721 esa_codec_reset(sc); 1722 1723 /* restore ASSP */ 1724 for (i = ESA_REV_B_CODE_MEMORY_BEGIN; i <= ESA_REV_B_CODE_MEMORY_END; 1725 i++) 1726 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_CODE, i, 1727 sc->savemem[index++]); 1728 for (i = ESA_REV_B_DATA_MEMORY_BEGIN; i <= ESA_REV_B_DATA_MEMORY_END; 1729 i++) 1730 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, i, 1731 sc->savemem[index++]); 1732 1733 esa_write_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, ESA_KDATA_DMA_ACTIVE, 0); 1734 bus_space_write_1(iot, ioh, ESA_DSP_PORT_CONTROL_REG_B, 1735 reset_state | ESA_REGB_ENABLE_RESET); 1736 1737 esa_enable_interrupts(sc); 1738 esa_amp_enable(sc); 1739 1740 mutex_spin_exit(&sc->sc_intr_lock); 1741 1742 /* Finally, power up AC97 codec */ 1743 delay(1000); 1744 1745 sc->codec_if->vtbl->restore_ports(sc->codec_if); 1746 1747 mutex_exit(&sc->sc_lock); 1748 1749 return true; 1750} 1751 1752static uint32_t 1753esa_get_pointer(struct esa_softc *sc, struct esa_channel *ch) 1754{ 1755 uint16_t hi, lo; 1756 uint32_t addr; 1757 int data_offset; 1758 1759 data_offset = ch->data_offset; 1760 hi = esa_read_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, data_offset + 1761 ESA_CDATA_HOST_SRC_CURRENTH); 1762 lo = esa_read_assp(sc, ESA_MEMTYPE_INTERNAL_DATA, data_offset + 1763 ESA_CDATA_HOST_SRC_CURRENTL); 1764 1765 addr = lo | ((uint32_t)hi << 16); 1766 return (addr - ch->start); 1767} 1768 1769static paddr_t 1770esa_mappage(void *addr, void *mem, off_t off, int prot) 1771{ 1772 struct esa_voice *vc; 1773 struct esa_softc *sc; 1774 struct esa_dma *p; 1775 1776 vc = addr; 1777 sc = device_private(vc->parent); 1778 if (off < 0) 1779 return -1; 1780 for (p = vc->dma; p && KERNADDR(p) != mem; p = p->next) 1781 continue; 1782 if (p == NULL) 1783 return -1; 1784 return bus_dmamem_mmap(sc->sc_dmat, p->segs, p->nsegs, 1785 off, prot, BUS_DMA_WAITOK); 1786} 1787 1788static void 1789esa_get_locks(void *addr, kmutex_t **intr, kmutex_t **proc) 1790{ 1791 struct esa_voice *vc; 1792 struct esa_softc *sc; 1793 1794 vc = addr; 1795 sc = device_private(vc->parent); 1796 1797 *intr = &sc->sc_intr_lock; 1798 *proc = &sc->sc_lock; 1799} 1800