fix nouveau on Tegra, Enable IOMMU on Exynos

This commit is contained in:
Peter Robinson 2018-04-12 08:25:54 +01:00
parent 6cb6bcb528
commit dabc7ac977
8 changed files with 80 additions and 10 deletions

View File

@ -0,0 +1,64 @@
From 369971aa0101c4cfb84dacaaaa1b5cc5790c14ff Mon Sep 17 00:00:00 2001
From: Thierry Reding <treding@nvidia.com>
Date: Wed, 11 Apr 2018 10:34:17 +0200
Subject: [PATCH] drm/nouveau: tegra: Detach from ARM DMA/IOMMU mapping
Depending on the kernel configuration, early ARM architecture setup code
may have attached the GPU to a DMA/IOMMU mapping that transparently uses
the IOMMU to back the DMA API. Tegra requires special handling for IOMMU
backed buffers (a special bit in the GPU's MMU page tables indicates the
memory path to take: via the SMMU or directly to the memory controller).
Transparently backing DMA memory with an IOMMU prevents Nouveau from
properly handling such memory accesses and causes memory access faults.
As a side-note: buffers other than those allocated in instance memory
don't need to be physically contiguous from the GPU's perspective since
the GPU can map them into contiguous buffers using its own MMU. Mapping
these buffers through the IOMMU is unnecessary and will even lead to
performance degradation because of the additional translation.
Signed-off-by: Thierry Reding <treding@nvidia.com>
---
drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c b/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c
index 1f07999aea1d..ac7706f56f6f 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c
@@ -19,6 +19,11 @@
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
+
+#if IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)
+#include <asm/dma-iommu.h>
+#endif
+
#include <core/tegra.h>
#ifdef CONFIG_NOUVEAU_PLATFORM_DRIVER
#include "priv.h"
@@ -105,6 +110,20 @@ nvkm_device_tegra_probe_iommu(struct nvkm_device_tegra *tdev)
unsigned long pgsize_bitmap;
int ret;
+#if IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)
+ if (dev->archdata.mapping) {
+ struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev);
+
+ arm_iommu_release_mapping(mapping);
+ arm_iommu_detach_device(dev);
+
+ if (dev->archdata.dma_coherent)
+ set_dma_ops(dev, &arm_coherent_dma_ops);
+ else
+ set_dma_ops(dev, &arm_dma_ops);
+ }
+#endif
+
if (!tdev->func->iommu_bit)
return;
--
2.16.3

View File

@ -1 +1 @@
# CONFIG_DRM_EXYNOS_IOMMU is not set CONFIG_DRM_EXYNOS_IOMMU=y

View File

@ -1 +1 @@
# CONFIG_EXYNOS_IOMMU is not set CONFIG_EXYNOS_IOMMU=y

View File

@ -1386,7 +1386,7 @@ CONFIG_DRM_EXYNOS_DSI=y
CONFIG_DRM_EXYNOS_FIMD=y CONFIG_DRM_EXYNOS_FIMD=y
CONFIG_DRM_EXYNOS_G2D=y CONFIG_DRM_EXYNOS_G2D=y
CONFIG_DRM_EXYNOS_HDMI=y CONFIG_DRM_EXYNOS_HDMI=y
# CONFIG_DRM_EXYNOS_IOMMU is not set CONFIG_DRM_EXYNOS_IOMMU=y
CONFIG_DRM_EXYNOS=m CONFIG_DRM_EXYNOS=m
CONFIG_DRM_EXYNOS_MIC=y CONFIG_DRM_EXYNOS_MIC=y
CONFIG_DRM_EXYNOS_MIXER=y CONFIG_DRM_EXYNOS_MIXER=y
@ -1702,7 +1702,7 @@ CONFIG_EXYNOS5420_MCPM=y
CONFIG_EXYNOS_ADC=m CONFIG_EXYNOS_ADC=m
CONFIG_EXYNOS_AUDSS_CLK_CON=m CONFIG_EXYNOS_AUDSS_CLK_CON=m
# CONFIG_EXYNOS_IOMMU_DEBUG is not set # CONFIG_EXYNOS_IOMMU_DEBUG is not set
# CONFIG_EXYNOS_IOMMU is not set CONFIG_EXYNOS_IOMMU=y
CONFIG_EXYNOS_THERMAL=y CONFIG_EXYNOS_THERMAL=y
# CONFIG_EZNPS_GIC is not set # CONFIG_EZNPS_GIC is not set
# CONFIG_EZX_PCAP is not set # CONFIG_EZX_PCAP is not set

View File

@ -1328,7 +1328,7 @@ CONFIG_DRM_EXYNOS_DSI=y
CONFIG_DRM_EXYNOS_FIMD=y CONFIG_DRM_EXYNOS_FIMD=y
CONFIG_DRM_EXYNOS_G2D=y CONFIG_DRM_EXYNOS_G2D=y
CONFIG_DRM_EXYNOS_HDMI=y CONFIG_DRM_EXYNOS_HDMI=y
# CONFIG_DRM_EXYNOS_IOMMU is not set CONFIG_DRM_EXYNOS_IOMMU=y
CONFIG_DRM_EXYNOS=m CONFIG_DRM_EXYNOS=m
CONFIG_DRM_EXYNOS_MIC=y CONFIG_DRM_EXYNOS_MIC=y
CONFIG_DRM_EXYNOS_MIXER=y CONFIG_DRM_EXYNOS_MIXER=y
@ -1611,7 +1611,7 @@ CONFIG_EXYNOS5420_MCPM=y
CONFIG_EXYNOS_ADC=m CONFIG_EXYNOS_ADC=m
CONFIG_EXYNOS_AUDSS_CLK_CON=m CONFIG_EXYNOS_AUDSS_CLK_CON=m
# CONFIG_EXYNOS_IOMMU_DEBUG is not set # CONFIG_EXYNOS_IOMMU_DEBUG is not set
# CONFIG_EXYNOS_IOMMU is not set CONFIG_EXYNOS_IOMMU=y
CONFIG_EXYNOS_THERMAL=y CONFIG_EXYNOS_THERMAL=y
# CONFIG_EZNPS_GIC is not set # CONFIG_EZNPS_GIC is not set
# CONFIG_EZX_PCAP is not set # CONFIG_EZX_PCAP is not set

View File

@ -1318,7 +1318,7 @@ CONFIG_DRM_EXYNOS_DSI=y
CONFIG_DRM_EXYNOS_FIMD=y CONFIG_DRM_EXYNOS_FIMD=y
CONFIG_DRM_EXYNOS_G2D=y CONFIG_DRM_EXYNOS_G2D=y
CONFIG_DRM_EXYNOS_HDMI=y CONFIG_DRM_EXYNOS_HDMI=y
# CONFIG_DRM_EXYNOS_IOMMU is not set CONFIG_DRM_EXYNOS_IOMMU=y
CONFIG_DRM_EXYNOS=m CONFIG_DRM_EXYNOS=m
CONFIG_DRM_EXYNOS_MIC=y CONFIG_DRM_EXYNOS_MIC=y
CONFIG_DRM_EXYNOS_MIXER=y CONFIG_DRM_EXYNOS_MIXER=y
@ -1601,7 +1601,7 @@ CONFIG_EXYNOS5420_MCPM=y
CONFIG_EXYNOS_ADC=m CONFIG_EXYNOS_ADC=m
CONFIG_EXYNOS_AUDSS_CLK_CON=m CONFIG_EXYNOS_AUDSS_CLK_CON=m
# CONFIG_EXYNOS_IOMMU_DEBUG is not set # CONFIG_EXYNOS_IOMMU_DEBUG is not set
# CONFIG_EXYNOS_IOMMU is not set CONFIG_EXYNOS_IOMMU=y
CONFIG_EXYNOS_THERMAL=y CONFIG_EXYNOS_THERMAL=y
# CONFIG_EZNPS_GIC is not set # CONFIG_EZNPS_GIC is not set
# CONFIG_EZX_PCAP is not set # CONFIG_EZX_PCAP is not set

View File

@ -1376,7 +1376,7 @@ CONFIG_DRM_EXYNOS_DSI=y
CONFIG_DRM_EXYNOS_FIMD=y CONFIG_DRM_EXYNOS_FIMD=y
CONFIG_DRM_EXYNOS_G2D=y CONFIG_DRM_EXYNOS_G2D=y
CONFIG_DRM_EXYNOS_HDMI=y CONFIG_DRM_EXYNOS_HDMI=y
# CONFIG_DRM_EXYNOS_IOMMU is not set CONFIG_DRM_EXYNOS_IOMMU=y
CONFIG_DRM_EXYNOS=m CONFIG_DRM_EXYNOS=m
CONFIG_DRM_EXYNOS_MIC=y CONFIG_DRM_EXYNOS_MIC=y
CONFIG_DRM_EXYNOS_MIXER=y CONFIG_DRM_EXYNOS_MIXER=y
@ -1692,7 +1692,7 @@ CONFIG_EXYNOS5420_MCPM=y
CONFIG_EXYNOS_ADC=m CONFIG_EXYNOS_ADC=m
CONFIG_EXYNOS_AUDSS_CLK_CON=m CONFIG_EXYNOS_AUDSS_CLK_CON=m
# CONFIG_EXYNOS_IOMMU_DEBUG is not set # CONFIG_EXYNOS_IOMMU_DEBUG is not set
# CONFIG_EXYNOS_IOMMU is not set CONFIG_EXYNOS_IOMMU=y
CONFIG_EXYNOS_THERMAL=y CONFIG_EXYNOS_THERMAL=y
# CONFIG_EZNPS_GIC is not set # CONFIG_EZNPS_GIC is not set
# CONFIG_EZX_PCAP is not set # CONFIG_EZX_PCAP is not set

View File

@ -583,6 +583,8 @@ Patch304: arm-dts-imx6qdl-udoo-Disable-usbh1-to-avoid-kernel-hang.patch
# https://marc.info/?l=linux-kernel&m=152328880417846&w=2 # https://marc.info/?l=linux-kernel&m=152328880417846&w=2
Patch308: arm64-thunderx-crypto-zip-fixes.patch Patch308: arm64-thunderx-crypto-zip-fixes.patch
Patch309: arm-tegra-fix-nouveau-crash.patch
# Fix USB on the RPi https://patchwork.kernel.org/patch/9879371/ # Fix USB on the RPi https://patchwork.kernel.org/patch/9879371/
Patch320: bcm283x-dma-mapping-skip-USB-devices-when-configuring-DMA-during-probe.patch Patch320: bcm283x-dma-mapping-skip-USB-devices-when-configuring-DMA-during-probe.patch
@ -1856,6 +1858,10 @@ fi
# #
# #
%changelog %changelog
* Thu Apr 12 2018 Peter Robinson <pbrobinson@fedoraproject.org>
- Patch to fix nouveau on Tegra platforms
- Enable IOMMU on Exynos now upstream does
* Wed Apr 11 2018 Laura Abbott <labbott@redhat.com> * Wed Apr 11 2018 Laura Abbott <labbott@redhat.com>
- Enable JFFS2 and some MTD modules (rhbz 1474493) - Enable JFFS2 and some MTD modules (rhbz 1474493)
- Enable a few infiniband options (rhbz 1291902) - Enable a few infiniband options (rhbz 1291902)