From 623c10108338b6b4e2c99de9fbc785f30b526c54 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Wed, 4 Aug 2021 08:13:29 +0200 Subject: [PATCH] ALSA: memalloc: Fix pgprot for WC mmap on x86 We have a special handling of WC pages on x86, and it's currently specific to HD-audio. The last forgotten piece was the pgprot setup for the mmap with WC pages. This patch moves the pgprot setup for WC pages from HD-audio-specific mmap callback to the common helper code. It allows us to remove the superfluous mmap callback in HD-audio and its prepare_mmap redirection. Link: https://lore.kernel.org/r/20210804061329.29265-1-tiwai@suse.de Signed-off-by: Takashi Iwai --- sound/core/memalloc.c | 4 ++++ sound/pci/hda/hda_controller.c | 11 ----------- sound/pci/hda/hda_controller.h | 2 -- sound/pci/hda/hda_intel.c | 12 ------------ 4 files changed, 4 insertions(+), 25 deletions(-) diff --git a/sound/core/memalloc.c b/sound/core/memalloc.c index 58bab2c..084b260 100644 --- a/sound/core/memalloc.c +++ b/sound/core/memalloc.c @@ -407,6 +407,10 @@ static void snd_dma_dev_free(struct snd_dma_buffer *dmab) static int snd_dma_dev_mmap(struct snd_dma_buffer *dmab, struct vm_area_struct *area) { +#ifdef CONFIG_X86 + if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_WC) + area->vm_page_prot = pgprot_writecombine(area->vm_page_prot); +#endif return dma_mmap_coherent(dmab->dev.dev, area, dmab->area, dmab->addr, dmab->bytes); } diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c index ea85c71..7cd4528 100644 --- a/sound/pci/hda/hda_controller.c +++ b/sound/pci/hda/hda_controller.c @@ -669,16 +669,6 @@ static int azx_pcm_open(struct snd_pcm_substream *substream) return err; } -static int azx_pcm_mmap(struct snd_pcm_substream *substream, - struct vm_area_struct *area) -{ - struct azx_pcm *apcm = snd_pcm_substream_chip(substream); - struct azx *chip = apcm->chip; - if (chip->ops->pcm_mmap_prepare) - chip->ops->pcm_mmap_prepare(substream, area); - return snd_pcm_lib_default_mmap(substream, area); -} - static const struct snd_pcm_ops azx_pcm_ops = { .open = azx_pcm_open, .close = azx_pcm_close, @@ -688,7 +678,6 @@ static const struct snd_pcm_ops azx_pcm_ops = { .trigger = azx_pcm_trigger, .pointer = azx_pcm_pointer, .get_time_info = azx_get_time_info, - .mmap = azx_pcm_mmap, }; static void azx_pcm_free(struct snd_pcm *pcm) diff --git a/sound/pci/hda/hda_controller.h b/sound/pci/hda/hda_controller.h index e4b290d..3062f87 100644 --- a/sound/pci/hda/hda_controller.h +++ b/sound/pci/hda/hda_controller.h @@ -74,8 +74,6 @@ struct azx; struct hda_controller_ops { /* Disable msi if supported, PCI only */ int (*disable_msi_reset_irq)(struct azx *); - void (*pcm_mmap_prepare)(struct snd_pcm_substream *substream, - struct vm_area_struct *area); /* Check if current position is acceptable */ int (*position_check)(struct azx *chip, struct azx_dev *azx_dev); /* enable/disable the link power */ diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 9771996..3aa432d 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -2037,17 +2037,6 @@ static int disable_msi_reset_irq(struct azx *chip) return 0; } -static void pcm_mmap_prepare(struct snd_pcm_substream *substream, - struct vm_area_struct *area) -{ -#ifdef CONFIG_X86 - struct azx_pcm *apcm = snd_pcm_substream_chip(substream); - struct azx *chip = apcm->chip; - if (chip->uc_buffer) - area->vm_page_prot = pgprot_writecombine(area->vm_page_prot); -#endif -} - /* Denylist for skipping the whole probe: * some HD-audio PCI entries are exposed without any codecs, and such devices * should be ignored from the beginning. @@ -2061,7 +2050,6 @@ static const struct pci_device_id driver_denylist[] = { static const struct hda_controller_ops pci_hda_ops = { .disable_msi_reset_irq = disable_msi_reset_irq, - .pcm_mmap_prepare = pcm_mmap_prepare, .position_check = azx_position_check, }; -- 2.7.4