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 <tiwai@suse.de>
This commit is contained in:
parent
ba447289fd
commit
623c101083
@ -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,
|
static int snd_dma_dev_mmap(struct snd_dma_buffer *dmab,
|
||||||
struct vm_area_struct *area)
|
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,
|
return dma_mmap_coherent(dmab->dev.dev, area,
|
||||||
dmab->area, dmab->addr, dmab->bytes);
|
dmab->area, dmab->addr, dmab->bytes);
|
||||||
}
|
}
|
||||||
|
@ -669,16 +669,6 @@ static int azx_pcm_open(struct snd_pcm_substream *substream)
|
|||||||
return err;
|
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 = {
|
static const struct snd_pcm_ops azx_pcm_ops = {
|
||||||
.open = azx_pcm_open,
|
.open = azx_pcm_open,
|
||||||
.close = azx_pcm_close,
|
.close = azx_pcm_close,
|
||||||
@ -688,7 +678,6 @@ static const struct snd_pcm_ops azx_pcm_ops = {
|
|||||||
.trigger = azx_pcm_trigger,
|
.trigger = azx_pcm_trigger,
|
||||||
.pointer = azx_pcm_pointer,
|
.pointer = azx_pcm_pointer,
|
||||||
.get_time_info = azx_get_time_info,
|
.get_time_info = azx_get_time_info,
|
||||||
.mmap = azx_pcm_mmap,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void azx_pcm_free(struct snd_pcm *pcm)
|
static void azx_pcm_free(struct snd_pcm *pcm)
|
||||||
|
@ -74,8 +74,6 @@ struct azx;
|
|||||||
struct hda_controller_ops {
|
struct hda_controller_ops {
|
||||||
/* Disable msi if supported, PCI only */
|
/* Disable msi if supported, PCI only */
|
||||||
int (*disable_msi_reset_irq)(struct azx *);
|
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 */
|
/* Check if current position is acceptable */
|
||||||
int (*position_check)(struct azx *chip, struct azx_dev *azx_dev);
|
int (*position_check)(struct azx *chip, struct azx_dev *azx_dev);
|
||||||
/* enable/disable the link power */
|
/* enable/disable the link power */
|
||||||
|
@ -2037,17 +2037,6 @@ static int disable_msi_reset_irq(struct azx *chip)
|
|||||||
return 0;
|
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:
|
/* Denylist for skipping the whole probe:
|
||||||
* some HD-audio PCI entries are exposed without any codecs, and such devices
|
* some HD-audio PCI entries are exposed without any codecs, and such devices
|
||||||
* should be ignored from the beginning.
|
* 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 = {
|
static const struct hda_controller_ops pci_hda_ops = {
|
||||||
.disable_msi_reset_irq = disable_msi_reset_irq,
|
.disable_msi_reset_irq = disable_msi_reset_irq,
|
||||||
.pcm_mmap_prepare = pcm_mmap_prepare,
|
|
||||||
.position_check = azx_position_check,
|
.position_check = azx_position_check,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user