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