At Wed, 29 Oct 2014 14:01:20 +0100, Takashi Iwai wrote:
At Wed, 29 Oct 2014 23:13:15 +1100, Geoffrey McRae wrote:
On Wed, 29 Oct 2014 08:50:53 +0100 Takashi Iwai tiwai@suse.de wrote:
At Wed, 29 Oct 2014 07:21:24 +1100, Geoffrey McRae wrote:
I can confirm that disable of MSI is required as even Windows 7 64bit does not enable this for Intel HDA. Out of curiosity I altered the driver to use MSI-X with the same results, interrupts are never received even though the PCI caps state that MSI is supported.
Playback is very poor and stutters if I do not allow snoop by commenting out "case AZX_DRIVER_CMEDIA:" in azx_check_snoop_available.
OK, so we have some conflicting results. Possibly we need non-cached pages only for CORB/RIRB but leave the stream buffers? Could you check the patch below?
The patch works fine, no errors reported, if I however disable snoop it continues to stutter.
OK, so the stuttering comes from the noncached pages of stream buffers, not CORB/RIRB coherency. I'll cook it up as a proper patch, then. Once when we confirm that the snoop for CORB/RIRB is really superfluous, we can drop that hack, too.
Hold on. The previous patch was wrong. My intention was to set wc for CORB/RIRB but not for buffers, but the patch enabled snoop wrongly for all. Below is the fixed one. It also covers the pgprot setup for mmap, which is also relevant.
Please check whether it results in stuttering, too. If yes, we just need to enable snoop again.
thanks,
Takashi
--- diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index cfcca4c30d4d..9ab1e631cb32 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -374,6 +374,8 @@ static void __mark_pages_wc(struct azx *chip, struct snd_dma_buffer *dmab, bool #ifdef CONFIG_SND_DMA_SGBUF if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_SG) { struct snd_sg_buf *sgbuf = dmab->private_data; + if (chip->driver_type == AZX_DRIVER_CMEDIA) + return; /* deal with only CORB/RIRB buffers */ if (on) set_pages_array_wc(sgbuf->page_table, sgbuf->pages); else @@ -1769,7 +1771,7 @@ static void pcm_mmap_prepare(struct snd_pcm_substream *substream, #ifdef CONFIG_X86 struct azx_pcm *apcm = snd_pcm_substream_chip(substream); struct azx *chip = apcm->chip; - if (!azx_snoop(chip)) + if (!azx_snoop(chip) && chip->driver_type != AZX_DRIVER_CMEDIA) area->vm_page_prot = pgprot_writecombine(area->vm_page_prot); #endif }