OSDN Git Service

drm/tegra: Detach devices from IOMMU DMA domain on arm32
authorDmitry Osipenko <digetx@gmail.com>
Sun, 19 Aug 2018 14:24:20 +0000 (17:24 +0300)
committerThierry Reding <treding@nvidia.com>
Wed, 26 Sep 2018 15:24:02 +0000 (17:24 +0200)
All Tegra DRM devices are getting attached to an implicit IOMMU DMA
domain if CONFIG_ARM_DMA_USE_IOMMU=y. Since Tegra DRM driver manages IOMMU
by itself, the devices must be detached from the implicit domain using
arch-specific IOMMU-API. Note that this works only for arm32 and not for
arm64, which will remain broken if CONFIG_IOMMU_DMA is enabled.

Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
drivers/gpu/drm/tegra/drm.c

index 0ee924e..5520460 100644 (file)
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 
+#if IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)
+#include <asm/dma-iommu.h>
+#endif
+
 #include "drm.h"
 #include "gem.h"
 
@@ -1068,6 +1072,14 @@ struct iommu_group *host1x_client_iommu_attach(struct host1x_client *client,
                }
 
                if (!shared || (shared && (group != tegra->group))) {
+#if IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)
+                       if (client->dev->archdata.mapping) {
+                               struct dma_iommu_mapping *mapping =
+                                       to_dma_iommu_mapping(client->dev);
+                               arm_iommu_detach_device(client->dev);
+                               arm_iommu_release_mapping(mapping);
+                       }
+#endif
                        err = iommu_attach_group(tegra->domain, group);
                        if (err < 0) {
                                iommu_group_put(group);