Lines Matching +full:pc +full:- +full:ack

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
5 * Copyright (c) 2003 Orlando Bassotto <orlando.bassotto@ieo-research.it>
46 /* -------------------------------------------------------------------- */
236 /* -------------------------------------------------------------------- */
257 /* -------------------------------------------------------------------- */
297 /* -------------------------------------------------------------------- */
304 return bus_space_read_1(sc->st, sc->sh, regno);
306 return bus_space_read_2(sc->st, sc->sh, regno);
308 return bus_space_read_4(sc->st, sc->sh, regno);
319 bus_space_write_1(sc->st, sc->sh, regno, data);
322 bus_space_write_2(sc->st, sc->sh, regno, data);
325 bus_space_write_4(sc->st, sc->sh, regno, data);
335 ptr = ((reg << 16) & sc->addrmask) | (chn & EMU_PTR_CHNO_MASK);
341 mask = ((1 << size) - 1) << offset;
353 ptr = ((reg << 16) & sc->addrmask) | (chn & EMU_PTR_CHNO_MASK);
358 mask = ((1 << size) - 1) << offset;
367 emu_wrefx(struct sc_info *sc, unsigned int pc, unsigned int data)
369 pc += sc->audigy ? EMU_A_MICROCODEBASE : EMU_MICROCODEBASE;
370 emu_wrptr(sc, 0, pc, data);
373 /* -------------------------------------------------------------------- */
403 /* -------------------------------------------------------------------- */
413 for (i = 0; i < sc->nchans; i++) {
414 pch = &sc->pch[i];
415 if (pch->buffer) {
416 tmp = (pch->spd * sndbuf_getalign(pch->buffer))
417 / pch->blksz;
424 rch = &sc->rch[i];
425 if (rch->buffer) {
426 tmp = (rch->spd * sndbuf_getalign(rch->buffer))
427 / rch->blksz;
433 sc->timerinterval = 48000 / rate;
434 emu_wr(sc, EMU_TIMER, sc->timerinterval & 0x03ff, 2);
436 return sc->timerinterval;
444 if (sc->timer++ == 0) {
450 sc->timer = 0;
532 for (i = 31; i > 0; i--) {
534 return (((u_int32_t) (i - 15) << 20) +
559 for (i = 0; i < 64 && sc->voice[i].busy; i++);
561 v = &sc->voice[i];
562 v->busy = 1;
576 return -1;
579 m->start = emu_memstart(sc, buf) * EMUPAGESIZE;
580 m->end = m->start + sz;
581 m->channel = NULL;
582 m->speed = 0;
583 m->b16 = 0;
584 m->stereo = 0;
585 m->running = 0;
586 m->ismaster = 1;
587 m->vol = 0xff;
588 m->buf = tmp_addr;
589 m->slave = s;
590 if (sc->audigy) {
591 m->fxrt1 = FXBUS_MIDI_CHORUS | FXBUS_PCM_RIGHT << 8 |
593 m->fxrt2 = 0x3f3f3f3f; /* No effects on second route */
595 m->fxrt1 = FXBUS_MIDI_CHORUS | FXBUS_PCM_RIGHT << 4 |
597 m->fxrt2 = 0;
601 s->start = m->start;
602 s->end = m->end;
603 s->channel = NULL;
604 s->speed = 0;
605 s->b16 = 0;
606 s->stereo = 0;
607 s->running = 0;
608 s->ismaster = 0;
609 s->vol = m->vol;
610 s->buf = m->buf;
611 s->fxrt1 = m->fxrt1;
612 s->fxrt2 = m->fxrt2;
613 s->slave = NULL;
621 struct emu_voice *v = ch->master;
623 if (ch->fmt) {
624 v->b16 = (ch->fmt & AFMT_16BIT) ? 1 : 0;
625 v->stereo = (AFMT_CHANNEL(ch->fmt) > 1) ? 1 : 0;
626 if (v->slave != NULL) {
627 v->slave->b16 = v->b16;
628 v->slave->stereo = v->stereo;
631 if (ch->spd) {
632 v->speed = ch->spd;
633 if (v->slave != NULL)
634 v->slave->speed = v->speed;
645 s = (v->stereo ? 1 : 0) + (v->b16 ? 1 : 0);
647 sa = v->start >> s;
648 ea = v->end >> s;
650 l = r = x = y = v->vol;
651 if (v->stereo) {
652 l = v->ismaster ? l : 0;
653 r = v->ismaster ? 0 : r;
656 emu_wrptr(sc, v->vnum, EMU_CHAN_CPF, v->stereo ? EMU_CHAN_CPF_STEREO_MASK : 0);
657 val = v->stereo ? 28 : 30;
658 val *= v->b16 ? 1 : 2;
661 if (sc->audigy) {
662 emu_wrptr(sc, v->vnum, EMU_A_CHAN_FXRT1, v->fxrt1);
663 emu_wrptr(sc, v->vnum, EMU_A_CHAN_FXRT2, v->fxrt2);
664 emu_wrptr(sc, v->vnum, EMU_A_CHAN_SENDAMOUNTS, 0);
667 emu_wrptr(sc, v->vnum, EMU_CHAN_FXRT, v->fxrt1 << 16);
669 emu_wrptr(sc, v->vnum, EMU_CHAN_PTRX, (x << 8) | r);
670 emu_wrptr(sc, v->vnum, EMU_CHAN_DSL, ea | (y << 24));
671 emu_wrptr(sc, v->vnum, EMU_CHAN_PSST, sa | (l << 24));
672 emu_wrptr(sc, v->vnum, EMU_CHAN_CCCA, start | (v->b16 ? 0 : EMU_CHAN_CCCA_8BITSELECT));
674 emu_wrptr(sc, v->vnum, EMU_CHAN_Z1, 0);
675 emu_wrptr(sc, v->vnum, EMU_CHAN_Z2, 0);
677 silent_page = ((u_int32_t)(sc->mem.silent_page_addr) << 1)
679 emu_wrptr(sc, v->vnum, EMU_CHAN_MAPA, silent_page);
680 emu_wrptr(sc, v->vnum, EMU_CHAN_MAPB, silent_page);
682 emu_wrptr(sc, v->vnum, EMU_CHAN_CVCF, EMU_CHAN_CVCF_CURRFILTER_MASK);
683 emu_wrptr(sc, v->vnum, EMU_CHAN_VTFT, EMU_CHAN_VTFT_FILTERTARGET_MASK);
684 emu_wrptr(sc, v->vnum, EMU_CHAN_ATKHLDM, 0);
685 emu_wrptr(sc, v->vnum, EMU_CHAN_DCYSUSM, EMU_CHAN_DCYSUSM_DECAYTIME_MASK);
686 emu_wrptr(sc, v->vnum, EMU_CHAN_LFOVAL1, 0x8000);
687 emu_wrptr(sc, v->vnum, EMU_CHAN_LFOVAL2, 0x8000);
688 emu_wrptr(sc, v->vnum, EMU_CHAN_FMMOD, 0);
689 emu_wrptr(sc, v->vnum, EMU_CHAN_TREMFRQ, 0);
690 emu_wrptr(sc, v->vnum, EMU_CHAN_FM2FRQ2, 0);
691 emu_wrptr(sc, v->vnum, EMU_CHAN_ENVVAL, 0x8000);
693 emu_wrptr(sc, v->vnum, EMU_CHAN_ATKHLDV,
695 emu_wrptr(sc, v->vnum, EMU_CHAN_ENVVOL, 0x8000);
697 emu_wrptr(sc, v->vnum, EMU_CHAN_PEFE_FILTERAMOUNT, 0x7f);
698 emu_wrptr(sc, v->vnum, EMU_CHAN_PEFE_PITCHAMOUNT, 0);
700 if (v->slave != NULL)
701 emu_vwrite(sc, v->slave);
713 cs = v->stereo ? 4 : 2;
714 ccis = v->stereo ? 28 : 30;
715 ccis *= v->b16 ? 1 : 2;
716 sample = v->b16 ? 0x00000000 : 0x80808080;
719 emu_wrptr(sc, v->vnum, EMU_CHAN_CD0 + i, sample);
720 emu_wrptr(sc, v->vnum, EMU_CHAN_CCR_CACHEINVALIDSIZE, 0);
721 emu_wrptr(sc, v->vnum, EMU_CHAN_CCR_READADDRESS, cra);
722 emu_wrptr(sc, v->vnum, EMU_CHAN_CCR_CACHEINVALIDSIZE, ccis);
724 emu_wrptr(sc, v->vnum, EMU_CHAN_IFATN, 0xff00);
725 emu_wrptr(sc, v->vnum, EMU_CHAN_VTFT, 0xffffffff);
726 emu_wrptr(sc, v->vnum, EMU_CHAN_CVCF, 0xffffffff);
727 emu_wrptr(sc, v->vnum, EMU_CHAN_DCYSUSV, 0x00007f7f);
728 emu_enastop(sc, v->vnum, 0);
730 pitch_target = emu_rate_to_linearpitch(v->speed);
731 initial_pitch = emu_rate_to_pitch(v->speed) >> 8;
732 emu_wrptr(sc, v->vnum, EMU_CHAN_PTRX_PITCHTARGET, pitch_target);
733 emu_wrptr(sc, v->vnum, EMU_CHAN_CPF_PITCH, pitch_target);
734 emu_wrptr(sc, v->vnum, EMU_CHAN_IP, initial_pitch);
736 emu_wrptr(sc, v->vnum, EMU_CHAN_PTRX_PITCHTARGET, 0);
737 emu_wrptr(sc, v->vnum, EMU_CHAN_CPF_PITCH, 0);
738 emu_wrptr(sc, v->vnum, EMU_CHAN_IFATN, 0xffff);
739 emu_wrptr(sc, v->vnum, EMU_CHAN_VTFT, 0x0000ffff);
740 emu_wrptr(sc, v->vnum, EMU_CHAN_CVCF, 0x0000ffff);
741 emu_wrptr(sc, v->vnum, EMU_CHAN_IP, 0);
742 emu_enastop(sc, v->vnum, 1);
744 if (v->slave != NULL)
745 emu_vtrigger(sc, v->slave, go);
753 s = (v->b16 ? 1 : 0) + (v->stereo ? 1 : 0);
754 ptr = (emu_rdptr(sc, v->vnum, EMU_CHAN_CCCA_CURRADDR) - (v->start >> s)) << s;
778 printf("voice number %d\n", v->vnum);
782 printf("%s\t[%08x]", regname[i], emu_rdptr(sc, v->vnum, i));
790 if (sc->audigy) {
795 emu_rdptr(sc, v->vnum, i + 0x70));
816 ch = &sc->pch[sc->pnum++];
817 ch->buffer = b;
818 ch->parent = sc;
819 ch->channel = c;
820 ch->blksz = sc->bufsz / 2;
821 ch->fmt = SND_FORMAT(AFMT_U8, 1, 0);
822 ch->spd = 8000;
823 snd_mtxlock(sc->lock);
824 ch->master = emu_valloc(sc);
825 ch->slave = emu_valloc(sc);
826 snd_mtxunlock(sc->lock);
827 r = (emu_vinit(sc, ch->master, ch->slave, sc->bufsz, ch->buffer))
837 struct sc_info *sc = ch->parent;
840 snd_mtxlock(sc->lock);
841 r = emu_memfree(sc, sndbuf_getbuf(ch->buffer));
842 snd_mtxunlock(sc->lock);
852 ch->fmt = format;
861 ch->spd = speed;
862 return ch->spd;
869 struct sc_info *sc = ch->parent;
871 ch->blksz = blocksize;
872 snd_mtxlock(sc->lock);
874 snd_mtxunlock(sc->lock);
882 struct sc_info *sc = ch->parent;
887 snd_mtxlock(sc->lock);
890 emu_vwrite(sc, ch->master);
895 ch->master->b16 ? 16 : 8,
896 ch->master->stereo ? "stereo" : "mono",
897 ch->master->speed);
898 emu_vdump(sc, ch->master);
899 emu_vdump(sc, ch->slave);
902 ch->run = (go == PCMTRIG_START) ? 1 : 0;
903 emu_vtrigger(sc, ch->master, ch->run);
904 snd_mtxunlock(sc->lock);
912 struct sc_info *sc = ch->parent;
915 snd_mtxlock(sc->lock);
916 r = emu_vpos(sc, ch->master);
917 snd_mtxunlock(sc->lock);
950 ch = &sc->rch[sc->rnum];
951 ch->buffer = b;
952 ch->parent = sc;
953 ch->channel = c;
954 ch->blksz = sc->bufsz / 2;
955 ch->fmt = SND_FORMAT(AFMT_U8, 1, 0);
956 ch->spd = 8000;
957 ch->num = sc->rnum;
958 switch(sc->rnum) {
960 ch->idxreg = sc->audigy ? EMU_A_ADCIDX : EMU_ADCIDX;
961 ch->basereg = EMU_ADCBA;
962 ch->sizereg = EMU_ADCBS;
963 ch->setupreg = EMU_ADCCR;
964 ch->irqmask = EMU_INTE_ADCBUFENABLE;
968 ch->idxreg = EMU_FXIDX;
969 ch->basereg = EMU_FXBA;
970 ch->sizereg = EMU_FXBS;
971 ch->setupreg = EMU_FXWC;
972 ch->irqmask = EMU_INTE_EFXBUFENABLE;
976 ch->idxreg = EMU_MICIDX;
977 ch->basereg = EMU_MICBA;
978 ch->sizereg = EMU_MICBS;
979 ch->setupreg = 0;
980 ch->irqmask = EMU_INTE_MICBUFENABLE;
983 sc->rnum++;
984 if (sndbuf_alloc(ch->buffer, sc->parent_dmat, 0, sc->bufsz) != 0)
987 snd_mtxlock(sc->lock);
988 emu_wrptr(sc, 0, ch->basereg, sndbuf_getbufaddr(ch->buffer));
989 emu_wrptr(sc, 0, ch->sizereg, 0); /* off */
990 snd_mtxunlock(sc->lock);
1000 ch->fmt = format;
1009 if (ch->num == 0) {
1010 if (ch->parent->audigy)
1015 if (ch->num == 1)
1017 if (ch->num == 2)
1019 ch->spd = speed;
1020 return ch->spd;
1027 struct sc_info *sc = ch->parent;
1029 ch->blksz = blocksize;
1030 snd_mtxlock(sc->lock);
1032 snd_mtxunlock(sc->lock);
1041 struct sc_info *sc = ch->parent;
1047 switch(sc->bufsz) {
1072 snd_mtxlock(sc->lock);
1075 ch->run = 1;
1076 emu_wrptr(sc, 0, ch->sizereg, sz);
1077 if (ch->num == 0) {
1078 if (sc->audigy) {
1080 if (AFMT_CHANNEL(ch->fmt) > 1)
1082 val |= audigy_recval(ch->spd);
1085 if (AFMT_CHANNEL(ch->fmt) > 1)
1087 val |= emu_recval(ch->spd);
1090 emu_wrptr(sc, 0, ch->setupreg, 0);
1091 emu_wrptr(sc, 0, ch->setupreg, val);
1094 val |= ch->irqmask;
1100 ch->run = 0;
1101 emu_wrptr(sc, 0, ch->sizereg, 0);
1102 if (ch->setupreg)
1103 emu_wrptr(sc, 0, ch->setupreg, 0);
1105 val &= ~ch->irqmask;
1114 snd_mtxunlock(sc->lock);
1123 struct sc_info *sc = ch->parent;
1126 snd_mtxlock(sc->lock);
1127 r = emu_rdptr(sc, 0, ch->idxreg) & 0x0000ffff;
1128 snd_mtxunlock(sc->lock);
1138 return &emu_reccaps[ch->num];
1174 snd_mtxlock(sc->lock);
1175 sc->mpu_intr = NULL;
1176 snd_mtxunlock(sc->lock);
1195 if (sc->mpu_intr)
1196 (sc->mpu_intr)(sc->mpu);
1208 sc->mpu = mpu401_init(&emu_mpu_class, sc, emu_intr2, &sc->mpu_intr);
1210 /* -------------------------------------------------------------------- */
1217 u_int32_t stat, ack, i, x;
1219 snd_mtxlock(sc->lock);
1224 ack = 0;
1228 ack |= EMU_IPR_INTERVALTIMER;
1231 ack |= stat & (EMU_IPR_ADCBUFFULL | EMU_IPR_ADCBUFHALFFULL);
1234 ack |= stat & (EMU_IPR_EFXBUFFULL | EMU_IPR_EFXBUFHALFFULL);
1237 ack |= stat & (EMU_IPR_MICBUFFULL | EMU_IPR_MICBUFHALFFULL);
1240 ack |= EMU_PCIERROR;
1241 device_printf(sc->dev, "pci error\n");
1242 /* we still get an nmi with ecc ram even if we ack this */
1245 ack |= EMU_IPR_RATETRCHANGE;
1247 device_printf(sc->dev,
1253 if (sc->mpu_intr) {
1254 (sc->mpu_intr)(sc->mpu);
1255 ack |= EMU_IPR_MIDIRECVBUFE | EMU_IPR_MIDITRANSBUFE;
1258 if (stat & ~ack)
1259 device_printf(sc->dev, "dodgy irq: %x (harmless)\n",
1260 stat & ~ack);
1264 if (ack) {
1265 snd_mtxunlock(sc->lock);
1267 if (ack & EMU_IPR_INTERVALTIMER) {
1269 for (i = 0; i < sc->nchans; i++) {
1270 if (sc->pch[i].run) {
1272 chn_intr(sc->pch[i].channel);
1279 if (ack & (EMU_IPR_ADCBUFFULL | EMU_IPR_ADCBUFHALFFULL)) {
1280 if (sc->rch[0].channel)
1281 chn_intr(sc->rch[0].channel);
1283 if (ack & (EMU_IPR_EFXBUFFULL | EMU_IPR_EFXBUFHALFFULL)) {
1284 if (sc->rch[1].channel)
1285 chn_intr(sc->rch[1].channel);
1287 if (ack & (EMU_IPR_MICBUFFULL | EMU_IPR_MICBUFHALFFULL)) {
1288 if (sc->rch[2].channel)
1289 chn_intr(sc->rch[2].channel);
1292 snd_mtxlock(sc->lock);
1295 snd_mtxunlock(sc->lock);
1298 /* -------------------------------------------------------------------- */
1305 *phys = error ? 0 : (bus_addr_t)segs->ds_addr;
1309 (unsigned long)segs->ds_addr, (unsigned long)segs->ds_len,
1321 if (bus_dmamem_alloc(sc->parent_dmat, &buf, BUS_DMA_NOWAIT, map))
1323 if (bus_dmamap_load(sc->parent_dmat, *map, buf, sz, emu_setmap, addr,
1325 bus_dmamem_free(sc->parent_dmat, buf, *map);
1334 bus_dmamap_unload(sc->parent_dmat, map);
1335 bus_dmamem_free(sc->parent_dmat, buf, map);
1342 struct emu_mem *mem = &sc->mem;
1355 if (mem->bmap[idx >> 3] & (1 << (idx & 7)))
1365 buf = emu_malloc(sc, sz, &blk->buf_addr, &blk->buf_map);
1366 *addr = blk->buf_addr;
1371 blk->buf = buf;
1372 blk->pte_start = start;
1373 blk->pte_size = blksz;
1375 printf("buf %p, pte_start %d, pte_size %d\n", blk->buf,
1376 blk->pte_start, blk->pte_size);
1380 mem->bmap[idx >> 3] |= 1 << (idx & 7);
1381 tmp = (uint32_t)(blk->buf_addr + ofs);
1383 printf("pte[%d] -> %x phys, %x virt\n", idx, tmp,
1386 mem->ptb_pages[idx] = (tmp << 1) | idx;
1389 SLIST_INSERT_HEAD(&mem->blocks, blk, link);
1397 struct emu_mem *mem = &sc->mem;
1401 SLIST_FOREACH(i, &mem->blocks, link) {
1402 if (i->buf == buf)
1407 SLIST_REMOVE(&mem->blocks, blk, emu_memblk, link);
1408 emu_free(sc, buf, blk->buf_map);
1409 tmp = (u_int32_t)(sc->mem.silent_page_addr) << 1;
1410 for (idx = blk->pte_start; idx < blk->pte_start + blk->pte_size; idx++) {
1411 mem->bmap[idx >> 3] &= ~(1 << (idx & 7));
1412 mem->ptb_pages[idx] = tmp | idx;
1421 struct emu_mem *mem = &sc->mem;
1425 SLIST_FOREACH(i, &mem->blocks, link) {
1426 if (i->buf == buf)
1430 return -EINVAL;
1431 return blk->pte_start;
1436 u_int32_t *pc)
1438 emu_wrefx(sc, (*pc) * 2, (x << 10) | y);
1439 emu_wrefx(sc, (*pc) * 2 + 1, (op << 20) | (z << 10) | w);
1440 (*pc)++;
1445 u_int32_t *pc)
1447 emu_wrefx(sc, (*pc) * 2, (x << 12) | y);
1448 emu_wrefx(sc, (*pc) * 2 + 1, (op << 24) | (z << 12) | w);
1449 (*pc)++;
1456 u_int32_t pc = 0;
1458 /* skip 0, 0, -1, 0 - NOPs */
1460 audigy_addefxop(sc, 0x0f, 0x0c0, 0x0c0, 0x0cf, 0x0c0, &pc);
1465 pc = 16;
1472 0x000-0x00f : 16 registers (?)
1495 0x0c0 - 0x0c4 = 0 - 4
1508 0x200 - 0x2ff
1510 0x300 - 0x3ff
1512 0x400 - 0x5ff
1517 A_C_00000000, A_FXBUS(FXBUS_PCM_LEFT), &pc);
1519 A_C_00000000, A_FXBUS(FXBUS_PCM_RIGHT), &pc);
1521 /* GPR[0/1] = RCA S/PDIF[l/r] -- Master volume */
1523 A_C_00000000, A_EXTIN(EXTIN_COAX_SPDIF_L), &pc);
1525 A_C_00000000, A_EXTIN(EXTIN_COAX_SPDIF_R), &pc);
1527 /* GPR[2] = GPR[0] (Left) / 2 + GPR[1] (Right) / 2 -- Central volume */
1529 A_C_40000000, A_GPR(0), &pc);
1533 A_C_00000000, A_C_00000000, A_GPR(0), &pc);
1535 A_C_00000000, A_C_00000000, A_GPR(1), &pc);
1539 A_C_00000000, A_GPR(0), &pc);
1541 A_C_00000000, A_GPR(1), &pc);
1545 A_C_00000000, A_GPR(0), &pc);
1547 A_C_00000000, A_GPR(1), &pc);
1552 A_GPR(0), A_GPR(2), &pc);
1555 A_GPR(1), A_GPR(2), &pc);
1559 A_GPR(0), A_GPR(2), &pc);
1562 A_GPR(1), A_GPR(2), &pc);
1568 A_GPR(16), A_GPR(0), &pc);
1570 A_GPR(17), A_GPR(1), &pc);
1575 A_GPR(16), A_GPR(0), &pc);
1577 A_GPR(17), A_GPR(1), &pc);
1585 A_C_00000000, A_GPR(0), &pc);
1587 A_C_00000000, A_GPR(1), &pc);
1591 A_C_00000000, A_GPR(0), &pc);
1593 A_C_00000000, A_GPR(1), &pc);
1598 A_C_00000000, A_EXTIN(A_EXTIN_AC97_L), &pc);
1600 A_C_00000000, A_EXTIN(A_EXTIN_AC97_R), &pc);
1610 u_int32_t pc = 16;
1612 /* acc3 0,0,0,0 - NOPs */
1621 /* FX-8010 DSP Registers:
1623 0x000-0x00f : 16 registers
1642 0x040 - 0x044 = 0 - 4
1657 0x100 - 0x1ff
1659 0x200 - 0x2ff
1661 0x300 - 0x3ff
1664 /* Routing - this will be configurable in later version */
1666 /* GPR[0/1] = FX * 4 + SPDIF-in */
1668 FXBUS(FXBUS_PCM_LEFT), C_00000004, &pc);
1670 FXBUS(FXBUS_PCM_RIGHT), C_00000004, &pc);
1672 /* GPR[0/1] += APS-input */
1674 sc->APS ? EXTIN(EXTIN_TOSLINK_L) : C_00000000, &pc);
1676 sc->APS ? EXTIN(EXTIN_TOSLINK_R) : C_00000000, &pc);
1680 C_00000000, GPR(0), &pc);
1682 C_00000001, GPR(1), &pc);
1684 /* GPR[2] = GPR[0] (Left) / 2 + GPR[1] (Right) / 2 -- Central volume */
1685 emu_addefxop(sc, iINTERP, GPR(2), GPR(1), C_40000000, GPR(0), &pc);
1691 GPR(16), GPR(0), &pc);
1693 GPR(17), GPR(1), &pc);
1701 C_00000000, GPR(0), &pc);
1703 C_00000000, GPR(1), &pc);
1708 C_00000000, GPR(0), &pc);
1710 C_00000000, GPR(1), &pc);
1715 GPR(0), GPR(2), &pc);
1718 GPR(1), GPR(2), &pc);
1721 GPR(0), GPR(2), &pc);
1724 GPR(1), GPR(2), &pc);
1728 C_00000000, GPR(0), &pc);
1730 C_00000000, GPR(1), &pc);
1734 C_00000000, EXTIN(EXTIN_AC97_L), &pc);
1736 C_00000000, EXTIN(EXTIN_AC97_R), &pc);
1748 if (sc->audigy) {
1776 if (sc->audigy) {
1814 if (sc->audigy) {
1826 sc->voice[ch].vnum = ch;
1827 sc->voice[ch].slave = NULL;
1828 sc->voice[ch].busy = 0;
1829 sc->voice[ch].ismaster = 0;
1830 sc->voice[ch].running = 0;
1831 sc->voice[ch].b16 = 0;
1832 sc->voice[ch].stereo = 0;
1833 sc->voice[ch].speed = 0;
1834 sc->voice[ch].start = 0;
1835 sc->voice[ch].end = 0;
1836 sc->voice[ch].channel = NULL;
1838 sc->pnum = sc->rnum = 0;
1862 if (!sc->audigy)
1864 else if (sc->audigy2) { /* Audigy 2 */
1883 SLIST_INIT(&sc->mem.blocks);
1884 sc->mem.ptb_pages = emu_malloc(sc, EMUMAXPAGES * sizeof(u_int32_t),
1885 &sc->mem.ptb_pages_addr, &sc->mem.ptb_map);
1886 if (sc->mem.ptb_pages == NULL)
1887 return -1;
1889 sc->mem.silent_page = emu_malloc(sc, EMUPAGESIZE,
1890 &sc->mem.silent_page_addr, &sc->mem.silent_map);
1891 if (sc->mem.silent_page == NULL) {
1892 emu_free(sc, sc->mem.ptb_pages, sc->mem.ptb_map);
1893 return -1;
1896 bzero(sc->mem.silent_page, EMUPAGESIZE);
1897 tmp = (u_int32_t)(sc->mem.silent_page_addr) << 1;
1899 sc->mem.ptb_pages[i] = tmp | i;
1901 emu_wrptr(sc, 0, EMU_PTB, (sc->mem.ptb_pages_addr));
1934 if (sc->audigy) {
1936 if (sc->audigy2) /* Audigy 2 */
1949 if (sc->audigy2) { /* Audigy 2 */
1962 if (sc->rev >= 6)
1968 sc->tos_link = 0;
1974 sc->tos_link = 1;
1998 if (sc->audigy) { /* stop fx processor */
2026 if (!SLIST_EMPTY(&sc->mem.blocks))
2027 device_printf(sc->dev, "warning: memblock list not empty\n");
2028 emu_free(sc, sc->mem.ptb_pages, sc->mem.ptb_map);
2029 emu_free(sc, sc->mem.silent_page, sc->mem.silent_map);
2031 if(sc->mpu)
2032 mpu401_uninit(sc->mpu);
2074 sc->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_emu10k1 softc");
2075 sc->dev = dev;
2076 sc->type = pci_get_devid(dev);
2077 sc->rev = pci_get_revid(dev);
2078 sc->audigy = sc->type == EMU10K2_PCI_ID || sc->type == EMU10K3_PCI_ID;
2079 sc->audigy2 = (sc->audigy && sc->rev == 0x04);
2080 sc->nchans = sc->audigy ? 8 : 4;
2081 sc->addrmask = sc->audigy ? EMU_A_PTR_ADDR_MASK : EMU_PTR_ADDR_MASK;
2086 sc->reg = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &i, RF_ACTIVE);
2087 if (sc->reg == NULL) {
2091 sc->st = rman_get_bustag(sc->reg);
2092 sc->sh = rman_get_bushandle(sc->reg);
2094 sc->bufsz = pcm_getbuffersize(dev, 4096, EMU_DEFAULT_BUFSZ, 65536);
2098 /*lowaddr*/(1U << 31) - 1, /* can only access 0-2gb */
2101 /*maxsize*/sc->bufsz, /*nsegments*/1, /*maxsegz*/0x3ffff,
2103 &sc->parent_dmat) != 0) {
2108 if (emu_init(sc) == -1) {
2116 if (mixer_init(dev, ac97_getmixerclass(), codec) == -1) goto bad;
2121 sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &i,
2123 if (!sc->irq ||
2124 snd_setup_intr(dev, sc->irq, INTR_MPSAFE, emu_intr, sc, &sc->ih)) {
2130 rman_get_start(sc->reg), rman_get_start(sc->irq),
2134 for (i = 0; i < sc->nchans; i++)
2146 if (sc->reg) bus_release_resource(dev, SYS_RES_IOPORT, PCIR_BAR(0), sc->reg);
2147 if (sc->ih) bus_teardown_intr(dev, sc->irq, sc->ih);
2148 if (sc->irq) bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
2149 if (sc->parent_dmat) bus_dma_tag_destroy(sc->parent_dmat);
2150 if (sc->lock) snd_mtxfree(sc->lock);
2169 bus_release_resource(dev, SYS_RES_IOPORT, PCIR_BAR(0), sc->reg);
2170 bus_teardown_intr(dev, sc->irq, sc->ih);
2171 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
2172 bus_dma_tag_destroy(sc->parent_dmat);
2173 snd_mtxfree(sc->lock);
2218 return s ? -1000 : ENXIO;