[alsa-devel] [PATCH 1/2] ALSA: hda - Fix probing and stuttering on CMI8888 HD-audio controller

Takashi Iwai tiwai at suse.de
Wed Oct 29 14:20:04 CET 2014


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 at 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
 }


More information about the Alsa-devel mailing list