| From 3ab7511eafdd5c4f40d2832f09554478dfbea170 Mon Sep 17 00:00:00 2001 |
| From: Ard Biesheuvel <ard.biesheuvel@linaro.org> |
| Date: Mon, 17 Oct 2016 17:23:59 +0100 |
| Subject: ALSA: hda - allow 40 bit DMA mask for NVidia devices |
| |
| From: Ard Biesheuvel <ard.biesheuvel@linaro.org> |
| |
| commit 3ab7511eafdd5c4f40d2832f09554478dfbea170 upstream. |
| |
| Commit 49d9e77e72cf ("ALSA: hda - Fix system panic when DMA > 40 bits |
| for Nvidia audio controllers") simply disabled any DMA exceeding 32 |
| bits for NVidia devices, even though they are capable of performing |
| DMA up to 40 bits. On some architectures (such as arm64), system memory |
| is not guaranteed to be 32-bit addressable by PCI devices, and so this |
| change prevents NVidia devices from working on platforms such as AMD |
| Seattle. |
| |
| Since the original commit already mentioned that up to 40 bits of DMA |
| is supported, and given that the code has been updated in the meantime |
| to support a 40 bit DMA mask on other devices, revert commit 49d9e77e72cf |
| and explicitly set the DMA mask to 40 bits for NVidia devices. |
| |
| Fixes: 49d9e77e72cf ('ALSA: hda - Fix system panic when DMA > 40 bits...') |
| Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/pci/hda/hda_intel.c | 7 +++++-- |
| 1 file changed, 5 insertions(+), 2 deletions(-) |
| |
| --- a/sound/pci/hda/hda_intel.c |
| +++ b/sound/pci/hda/hda_intel.c |
| @@ -340,8 +340,7 @@ enum { |
| |
| /* quirks for Nvidia */ |
| #define AZX_DCAPS_PRESET_NVIDIA \ |
| - (AZX_DCAPS_NO_MSI | /*AZX_DCAPS_ALIGN_BUFSIZE |*/ \ |
| - AZX_DCAPS_NO_64BIT | AZX_DCAPS_CORBRP_SELF_CLEAR |\ |
| + (AZX_DCAPS_NO_MSI | AZX_DCAPS_CORBRP_SELF_CLEAR |\ |
| AZX_DCAPS_SNOOP_TYPE(NVIDIA)) |
| |
| #define AZX_DCAPS_PRESET_CTHDA \ |
| @@ -1699,6 +1698,10 @@ static int azx_first_init(struct azx *ch |
| } |
| } |
| |
| + /* NVidia hardware normally only supports up to 40 bits of DMA */ |
| + if (chip->pci->vendor == PCI_VENDOR_ID_NVIDIA) |
| + dma_bits = 40; |
| + |
| /* disable 64bit DMA address on some devices */ |
| if (chip->driver_caps & AZX_DCAPS_NO_64BIT) { |
| dev_dbg(card->dev, "Disabling 64bit DMA\n"); |