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