diff mbox

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

Message ID s5hzjcf57y3.wl-tiwai@suse.de (mailing list archive)
State Accepted
Commit 3b70bdba2fcb374a2235a56ab73334348d819579
Delegated to: Takashi Iwai
Headers show

Commit Message

Takashi Iwai Oct. 29, 2014, 1:20 p.m. UTC
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 mbox

Patch

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
 }