Lines Matching +full:ls +full:- +full:audio +full:- +full:card
16 * Contributions after 2012-01-13 are licensed under the terms of the
21 #include "hw/audio/soundhw.h"
22 #include "audio/audio.h"
24 #include "hw/qdev-properties.h"
37 #define SR_VALID_MASK ((1 << 5) - 1)
47 #define CR_VALID_MASK ((1 << 5) - 1)
52 #define GC_VALID_MASK ((1 << 6) - 1)
82 #define GS_VALID_MASK ((1 << 18) - 1)
122 QEMUSoundCard card; member
188 pci_dma_read(&s->dev, r->bdbar + r->civ * 8, b, 8); in fetch_bd()
189 r->bd_valid = 1; in fetch_bd()
190 r->bd.addr = le32_to_cpu(*(uint32_t *) &b[0]) & ~3; in fetch_bd()
191 r->bd.ctl_len = le32_to_cpu(*(uint32_t *) &b[4]); in fetch_bd()
192 r->picb = r->bd.ctl_len & 0xffff; in fetch_bd()
194 r->civ, r->bd.addr, r->bd.ctl_len >> 16, in fetch_bd()
195 r->bd.ctl_len & 0xffff, (r->bd.ctl_len & 0xffff) << 1); in fetch_bd()
203 uint32_t old_mask = r->sr & SR_INT_MASK; in update_sr()
212 if ((new_mask & SR_LVBCI) && (r->cr & CR_LVBIE)) { in update_sr()
216 if ((new_mask & SR_BCIS) && (r->cr & CR_IOCE)) { in update_sr()
223 r->sr = new_sr; in update_sr()
226 r->sr & SR_BCIS, r->sr & SR_LVBCI, r->sr, event, level); in update_sr()
233 s->glob_sta |= masks[r - s->bm_regs]; in update_sr()
235 pci_irq_assert(&s->dev); in update_sr()
237 s->glob_sta &= ~masks[r - s->bm_regs]; in update_sr()
239 pci_irq_deassert(&s->dev); in update_sr()
247 AUD_set_active_in(s->voice_pi, on); in voice_set_active()
251 AUD_set_active_out(s->voice_po, on); in voice_set_active()
255 AUD_set_active_in(s->voice_mc, on); in voice_set_active()
267 r->bdbar = 0; in reset_bm_regs()
268 r->civ = 0; in reset_bm_regs()
269 r->lvi = 0; in reset_bm_regs()
272 r->picb = 0; in reset_bm_regs()
273 r->piv = 0; in reset_bm_regs()
274 r->cr = r->cr & CR_DONT_CLEAR_MASK; in reset_bm_regs()
275 r->bd_valid = 0; in reset_bm_regs()
277 voice_set_active(s, r - s->bm_regs, 0); in reset_bm_regs()
278 memset(s->silence, 0, sizeof(s->silence)); in reset_bm_regs()
283 if (i + 2 > sizeof(s->mixer_data)) { in mixer_store()
285 i, sizeof(s->mixer_data)); in mixer_store()
289 s->mixer_data[i + 0] = v & 0xff; in mixer_store()
290 s->mixer_data[i + 1] = v >> 8; in mixer_store()
297 if (i + 2 > sizeof(s->mixer_data)) { in mixer_load()
299 i, sizeof(s->mixer_data)); in mixer_load()
301 val = s->mixer_data[i + 0] | (s->mixer_data[i + 1] << 8); in mixer_load()
317 s->invalid_freq[index] = 0; in open_voice()
320 s->voice_pi = AUD_open_in( in open_voice()
321 &s->card, in open_voice()
322 s->voice_pi, in open_voice()
331 s->voice_po = AUD_open_out( in open_voice()
332 &s->card, in open_voice()
333 s->voice_po, in open_voice()
342 s->voice_mc = AUD_open_in( in open_voice()
343 &s->card, in open_voice()
344 s->voice_mc, in open_voice()
353 s->invalid_freq[index] = freq; in open_voice()
356 AUD_close_in(&s->card, s->voice_pi); in open_voice()
357 s->voice_pi = NULL; in open_voice()
361 AUD_close_out(&s->card, s->voice_po); in open_voice()
362 s->voice_po = NULL; in open_voice()
366 AUD_close_in(&s->card, s->voice_mc); in open_voice()
367 s->voice_mc = NULL; in open_voice()
379 AUD_set_active_in(s->voice_pi, active[PI_INDEX]); in reset_voices()
383 AUD_set_active_out(s->voice_po, active[PO_INDEX]); in reset_voices()
387 AUD_set_active_in(s->voice_mc, active[MC_INDEX]); in reset_voices()
398 *rvol = 255 - *rvol; in get_volume()
399 *lvol = 255 - *lvol; in get_volume()
417 AUD_set_volume_out(s->voice_po, mute, lvol, rvol); in update_combined_volume_out()
428 AUD_set_volume_in(s->voice_pi, mute, lvol, rvol); in update_volume_in()
455 uint8_t ls = (val >> 8) & REC_MASK; in record_select() local
456 mixer_store(s, AC97_Record_Select, rs | (ls << 8)); in record_select()
464 memset(s->mixer_data, 0, sizeof(s->mixer_data)); in mixer_reset()
505 * Native audio mixer
512 s->cas = 0; in nam_readb()
519 s->cas = 0; in nam_readw()
527 s->cas = 0; in nam_readl()
532 * Native audio mixer
538 dolog("U nam writeb 0x%x <- 0x%x\n", addr, val); in nam_writeb()
539 s->cas = 0; in nam_writeb()
546 s->cas = 0; in nam_writew()
569 dolog("Attempt to write extended audio ID to 0x%x\n", val); in nam_writew()
582 dolog("Setting extended audio control to 0x%x\n", val); in nam_writew()
633 dolog("U nam writew 0x%x <- 0x%x\n", addr, val); in nam_writew()
642 dolog("U nam writel 0x%x <- 0x%x\n", addr, val); in nam_writel()
643 s->cas = 0; in nam_writel()
647 * Native audio bus master
658 dolog("CAS %d\n", s->cas); in nabm_readb()
659 val = s->cas; in nabm_readb()
660 s->cas = 1; in nabm_readb()
665 r = &s->bm_regs[GET_BM(addr)]; in nabm_readb()
666 val = r->civ; in nabm_readb()
667 dolog("CIV[%d] -> 0x%x\n", GET_BM(addr), val); in nabm_readb()
672 r = &s->bm_regs[GET_BM(addr)]; in nabm_readb()
673 val = r->lvi; in nabm_readb()
674 dolog("LVI[%d] -> 0x%x\n", GET_BM(addr), val); in nabm_readb()
679 r = &s->bm_regs[GET_BM(addr)]; in nabm_readb()
680 val = r->piv; in nabm_readb()
681 dolog("PIV[%d] -> 0x%x\n", GET_BM(addr), val); in nabm_readb()
686 r = &s->bm_regs[GET_BM(addr)]; in nabm_readb()
687 val = r->cr; in nabm_readb()
688 dolog("CR[%d] -> 0x%x\n", GET_BM(addr), val); in nabm_readb()
693 r = &s->bm_regs[GET_BM(addr)]; in nabm_readb()
694 val = r->sr & 0xff; in nabm_readb()
695 dolog("SRb[%d] -> 0x%x\n", GET_BM(addr), val); in nabm_readb()
698 dolog("U nabm readb 0x%x -> 0x%x\n", addr, val); in nabm_readb()
714 r = &s->bm_regs[GET_BM(addr)]; in nabm_readw()
715 val = r->sr; in nabm_readw()
716 dolog("SR[%d] -> 0x%x\n", GET_BM(addr), val); in nabm_readw()
721 r = &s->bm_regs[GET_BM(addr)]; in nabm_readw()
722 val = r->picb; in nabm_readw()
723 dolog("PICB[%d] -> 0x%x\n", GET_BM(addr), val); in nabm_readw()
726 dolog("U nabm readw 0x%x -> 0x%x\n", addr, val); in nabm_readw()
742 r = &s->bm_regs[GET_BM(addr)]; in nabm_readl()
743 val = r->bdbar; in nabm_readl()
744 dolog("BMADDR[%d] -> 0x%x\n", GET_BM(addr), val); in nabm_readl()
749 r = &s->bm_regs[GET_BM(addr)]; in nabm_readl()
750 val = r->civ | (r->lvi << 8) | (r->sr << 16); in nabm_readl()
751 dolog("CIV LVI SR[%d] -> 0x%x, 0x%x, 0x%x\n", GET_BM(addr), in nabm_readl()
752 r->civ, r->lvi, r->sr); in nabm_readl()
757 r = &s->bm_regs[GET_BM(addr)]; in nabm_readl()
758 val = r->picb | (r->piv << 16) | (r->cr << 24); in nabm_readl()
759 dolog("PICB PIV CR[%d] -> 0x%x 0x%x 0x%x 0x%x\n", GET_BM(addr), in nabm_readl()
760 val, r->picb, r->piv, r->cr); in nabm_readl()
763 val = s->glob_cnt; in nabm_readl()
764 dolog("glob_cnt -> 0x%x\n", val); in nabm_readl()
767 val = s->glob_sta | GS_S0CR; in nabm_readl()
768 dolog("glob_sta -> 0x%x\n", val); in nabm_readl()
771 dolog("U nabm readl 0x%x -> 0x%x\n", addr, val); in nabm_readl()
778 * Native audio bus master
790 r = &s->bm_regs[GET_BM(addr)]; in nabm_writeb()
791 if ((r->cr & CR_RPBM) && (r->sr & SR_DCH)) { in nabm_writeb()
792 r->sr &= ~(SR_DCH | SR_CELV); in nabm_writeb()
793 r->civ = r->piv; in nabm_writeb()
794 r->piv = (r->piv + 1) % 32; in nabm_writeb()
797 r->lvi = val % 32; in nabm_writeb()
798 dolog("LVI[%d] <- 0x%x\n", GET_BM(addr), val); in nabm_writeb()
803 r = &s->bm_regs[GET_BM(addr)]; in nabm_writeb()
807 r->cr = val & CR_VALID_MASK; in nabm_writeb()
808 if (!(r->cr & CR_RPBM)) { in nabm_writeb()
809 voice_set_active(s, r - s->bm_regs, 0); in nabm_writeb()
810 r->sr |= SR_DCH; in nabm_writeb()
812 r->civ = r->piv; in nabm_writeb()
813 r->piv = (r->piv + 1) % 32; in nabm_writeb()
815 r->sr &= ~SR_DCH; in nabm_writeb()
816 voice_set_active(s, r - s->bm_regs, 1); in nabm_writeb()
819 dolog("CR[%d] <- 0x%x (cr 0x%x)\n", GET_BM(addr), val, r->cr); in nabm_writeb()
824 r = &s->bm_regs[GET_BM(addr)]; in nabm_writeb()
825 r->sr |= val & ~(SR_RO_MASK | SR_WCLEAR_MASK); in nabm_writeb()
826 update_sr(s, r, r->sr & ~(val & SR_WCLEAR_MASK)); in nabm_writeb()
827 dolog("SR[%d] <- 0x%x (sr 0x%x)\n", GET_BM(addr), val, r->sr); in nabm_writeb()
830 dolog("U nabm writeb 0x%x <- 0x%x\n", addr, val); in nabm_writeb()
844 r = &s->bm_regs[GET_BM(addr)]; in nabm_writew()
845 r->sr |= val & ~(SR_RO_MASK | SR_WCLEAR_MASK); in nabm_writew()
846 update_sr(s, r, r->sr & ~(val & SR_WCLEAR_MASK)); in nabm_writew()
847 dolog("SR[%d] <- 0x%x (sr 0x%x)\n", GET_BM(addr), val, r->sr); in nabm_writew()
850 dolog("U nabm writew 0x%x <- 0x%x\n", addr, val); in nabm_writew()
864 r = &s->bm_regs[GET_BM(addr)]; in nabm_writel()
865 r->bdbar = val & ~3; in nabm_writel()
866 dolog("BDBAR[%d] <- 0x%x (bdbar 0x%x)\n", GET_BM(addr), val, r->bdbar); in nabm_writel()
871 s->glob_cnt = val & GC_VALID_MASK; in nabm_writel()
873 dolog("glob_cnt <- 0x%x (glob_cnt 0x%x)\n", val, s->glob_cnt); in nabm_writel()
876 s->glob_sta &= ~(val & GS_WCLEAR_MASK); in nabm_writel()
877 s->glob_sta |= (val & ~(GS_WCLEAR_MASK | GS_RO_MASK)) & GS_VALID_MASK; in nabm_writel()
878 dolog("glob_sta <- 0x%x (glob_sta 0x%x)\n", val, s->glob_sta); in nabm_writel()
881 dolog("U nabm writel 0x%x <- 0x%x\n", addr, val); in nabm_writel()
890 uint32_t addr = r->bd.addr; in write_audio()
891 uint32_t temp = r->picb << 1; in write_audio()
904 pci_dma_read(&s->dev, addr, tmpbuf, to_copy); in write_audio()
905 copied = AUD_write(s->voice_po, tmpbuf, to_copy); in write_audio()
912 temp -= copied; in write_audio()
920 s->last_samp = 0; in write_audio()
922 s->last_samp = *(uint32_t *)&tmpbuf[to_copy - 4]; in write_audio()
926 r->bd.addr = addr; in write_audio()
933 if (!(s->bup_flag & BUP_SET)) { in write_bup()
934 if (s->bup_flag & BUP_LAST) { in write_bup()
936 uint8_t *p = s->silence; in write_bup()
937 for (i = 0; i < sizeof(s->silence) / 4; i++, p += 4) { in write_bup()
938 *(uint32_t *) p = s->last_samp; in write_bup()
941 memset(s->silence, 0, sizeof(s->silence)); in write_bup()
943 s->bup_flag |= BUP_SET; in write_bup()
947 int temp = MIN(elapsed, sizeof(s->silence)); in write_bup()
949 int copied = AUD_write(s->voice_po, s->silence, temp); in write_bup()
953 temp -= copied; in write_bup()
954 elapsed -= copied; in write_bup()
963 uint32_t addr = r->bd.addr; in read_audio()
964 uint32_t temp = r->picb << 1; in read_audio()
967 SWVoiceIn *voice = (r - s->bm_regs) == MC_INDEX ? s->voice_mc : s->voice_pi; in read_audio()
984 pci_dma_write(&s->dev, addr, tmpbuf, acquired); in read_audio()
985 temp -= acquired; in read_audio()
990 r->bd.addr = addr; in read_audio()
996 AC97BusMasterRegs *r = &s->bm_regs[index]; in transfer_audio()
999 if (s->invalid_freq[index]) { in transfer_audio()
1001 index, s->invalid_freq[index]); in transfer_audio()
1005 if (r->sr & SR_DCH) { in transfer_audio()
1006 if (r->cr & CR_RPBM) { in transfer_audio()
1019 if (!r->bd_valid) { in transfer_audio()
1024 if (!r->picb) { in transfer_audio()
1026 r->civ, r->bd.addr, r->bd.ctl_len); in transfer_audio()
1027 if (r->civ == r->lvi) { in transfer_audio()
1028 r->sr |= SR_DCH; /* CELV? */ in transfer_audio()
1029 s->bup_flag = 0; in transfer_audio()
1032 r->sr &= ~SR_CELV; in transfer_audio()
1033 r->civ = r->piv; in transfer_audio()
1034 r->piv = (r->piv + 1) % 32; in transfer_audio()
1042 elapsed -= temp; in transfer_audio()
1043 r->picb -= (temp >> 1); in transfer_audio()
1049 elapsed -= temp; in transfer_audio()
1050 r->picb -= (temp >> 1); in transfer_audio()
1054 if (!r->picb) { in transfer_audio()
1055 uint32_t new_sr = r->sr & ~SR_CELV; in transfer_audio()
1057 if (r->bd.ctl_len & BD_IOC) { in transfer_audio()
1061 if (r->civ == r->lvi) { in transfer_audio()
1062 dolog("Underrun civ (%d) == lvi (%d)\n", r->civ, r->lvi); in transfer_audio()
1066 s->bup_flag = (r->bd.ctl_len & BD_BUP) ? BUP_LAST : 0; in transfer_audio()
1068 r->civ = r->piv; in transfer_audio()
1069 r->piv = (r->piv + 1) % 32; in transfer_audio()
1125 active[PI_INDEX] = !!(s->bm_regs[PI_INDEX].cr & CR_RPBM); in ac97_post_load()
1126 active[PO_INDEX] = !!(s->bm_regs[PO_INDEX].cr & CR_RPBM); in ac97_post_load()
1127 active[MC_INDEX] = !!(s->bm_regs[MC_INDEX].cr & CR_RPBM); in ac97_post_load()
1130 s->bup_flag = 0; in ac97_post_load()
1131 s->last_samp = 0; in ac97_post_load()
1161 return -1; in nam_read()
1172 return -1; in nam_read()
1209 return -1; in nabm_read()
1220 return -1; in nabm_read()
1259 reset_bm_regs(s, &s->bm_regs[0]); in ac97_on_reset()
1260 reset_bm_regs(s, &s->bm_regs[1]); in ac97_on_reset()
1261 reset_bm_regs(s, &s->bm_regs[2]); in ac97_on_reset()
1274 uint8_t *c = s->dev.config; in ac97_realize()
1276 if (!AUD_register_card ("ac97", &s->card, errp)) { in ac97_realize()
1291 /* nabmar native audio mixer base address rw */ in ac97_realize()
1298 /* nabmbar native audio bus mastering base address rw */ in ac97_realize()
1307 memory_region_init_io(&s->io_nam, OBJECT(s), &ac97_io_nam_ops, s, in ac97_realize()
1308 "ac97-nam", 1024); in ac97_realize()
1309 memory_region_init_io(&s->io_nabm, OBJECT(s), &ac97_io_nabm_ops, s, in ac97_realize()
1310 "ac97-nabm", 256); in ac97_realize()
1311 pci_register_bar(&s->dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &s->io_nam); in ac97_realize()
1312 pci_register_bar(&s->dev, 1, PCI_BASE_ADDRESS_SPACE_IO, &s->io_nabm); in ac97_realize()
1321 AUD_close_in(&s->card, s->voice_pi); in ac97_exit()
1322 AUD_close_out(&s->card, s->voice_po); in ac97_exit()
1323 AUD_close_in(&s->card, s->voice_mc); in ac97_exit()
1324 AUD_remove_card(&s->card); in ac97_exit()
1328 DEFINE_AUDIO_PROPERTIES(AC97LinkState, card),
1336 k->realize = ac97_realize; in ac97_class_init()
1337 k->exit = ac97_exit; in ac97_class_init()
1338 k->vendor_id = PCI_VENDOR_ID_INTEL; in ac97_class_init()
1339 k->device_id = PCI_DEVICE_ID_INTEL_82801AA_5; in ac97_class_init()
1340 k->revision = 0x01; in ac97_class_init()
1341 k->class_id = PCI_CLASS_MULTIMEDIA_AUDIO; in ac97_class_init()
1342 set_bit(DEVICE_CATEGORY_SOUND, dc->categories); in ac97_class_init()
1343 dc->desc = "Intel 82801AA AC97 Audio"; in ac97_class_init()
1344 dc->vmsd = &vmstate_ac97; in ac97_class_init()
1363 deprecated_register_soundhw("ac97", "Intel 82801AA AC97 Audio", in ac97_register_types()