diff options
author | Dave Airlie <airlied@redhat.com> | 2018-10-03 02:31:11 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2018-10-03 02:31:16 -0400 |
commit | 77d981b16f2db81ba6c7792a9102652045535127 (patch) | |
tree | 7bb277ec51a5b061ef3524746362031d906580cf | |
parent | 17b57b1883c1285f3d0dc2266e8f79286a7bef38 (diff) | |
parent | 1feda5eb77fc279a4c4eb93b9a0ac3bf7254b57a (diff) |
Merge tag 'exynos-drm-fixes-for-v4.19-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos into drm-fixes
Use default iommu domain instead of fake one
- This patch makes it to reuse default IOMMU domain instead of
allocating a fake IOMMU domain, and allows some design changes
for enhancement of IOMMU framework[1] without breaking Exynos DRM.
[1] https://www.spinics.net/lists/arm-kernel/msg676098.html
Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Inki Dae <inki.dae@samsung.com>
Link: https://patchwork.freedesktop.org/patch/msgid/1538360696-23579-1-git-send-email-inki.dae@samsung.com
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_iommu.h | 34 |
1 files changed, 6 insertions, 28 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_iommu.h b/drivers/gpu/drm/exynos/exynos_drm_iommu.h index 87f6b5672e11..797d9ee5f15a 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_iommu.h +++ b/drivers/gpu/drm/exynos/exynos_drm_iommu.h | |||
@@ -55,37 +55,12 @@ static inline void __exynos_iommu_detach(struct exynos_drm_private *priv, | |||
55 | static inline int __exynos_iommu_create_mapping(struct exynos_drm_private *priv, | 55 | static inline int __exynos_iommu_create_mapping(struct exynos_drm_private *priv, |
56 | unsigned long start, unsigned long size) | 56 | unsigned long start, unsigned long size) |
57 | { | 57 | { |
58 | struct iommu_domain *domain; | 58 | priv->mapping = iommu_get_domain_for_dev(priv->dma_dev); |
59 | int ret; | ||
60 | |||
61 | domain = iommu_domain_alloc(priv->dma_dev->bus); | ||
62 | if (!domain) | ||
63 | return -ENOMEM; | ||
64 | |||
65 | ret = iommu_get_dma_cookie(domain); | ||
66 | if (ret) | ||
67 | goto free_domain; | ||
68 | |||
69 | ret = iommu_dma_init_domain(domain, start, size, NULL); | ||
70 | if (ret) | ||
71 | goto put_cookie; | ||
72 | |||
73 | priv->mapping = domain; | ||
74 | return 0; | 59 | return 0; |
75 | |||
76 | put_cookie: | ||
77 | iommu_put_dma_cookie(domain); | ||
78 | free_domain: | ||
79 | iommu_domain_free(domain); | ||
80 | return ret; | ||
81 | } | 60 | } |
82 | 61 | ||
83 | static inline void __exynos_iommu_release_mapping(struct exynos_drm_private *priv) | 62 | static inline void __exynos_iommu_release_mapping(struct exynos_drm_private *priv) |
84 | { | 63 | { |
85 | struct iommu_domain *domain = priv->mapping; | ||
86 | |||
87 | iommu_put_dma_cookie(domain); | ||
88 | iommu_domain_free(domain); | ||
89 | priv->mapping = NULL; | 64 | priv->mapping = NULL; |
90 | } | 65 | } |
91 | 66 | ||
@@ -94,7 +69,9 @@ static inline int __exynos_iommu_attach(struct exynos_drm_private *priv, | |||
94 | { | 69 | { |
95 | struct iommu_domain *domain = priv->mapping; | 70 | struct iommu_domain *domain = priv->mapping; |
96 | 71 | ||
97 | return iommu_attach_device(domain, dev); | 72 | if (dev != priv->dma_dev) |
73 | return iommu_attach_device(domain, dev); | ||
74 | return 0; | ||
98 | } | 75 | } |
99 | 76 | ||
100 | static inline void __exynos_iommu_detach(struct exynos_drm_private *priv, | 77 | static inline void __exynos_iommu_detach(struct exynos_drm_private *priv, |
@@ -102,7 +79,8 @@ static inline void __exynos_iommu_detach(struct exynos_drm_private *priv, | |||
102 | { | 79 | { |
103 | struct iommu_domain *domain = priv->mapping; | 80 | struct iommu_domain *domain = priv->mapping; |
104 | 81 | ||
105 | iommu_detach_device(domain, dev); | 82 | if (dev != priv->dma_dev) |
83 | iommu_detach_device(domain, dev); | ||
106 | } | 84 | } |
107 | #else | 85 | #else |
108 | #error Unsupported architecture and IOMMU/DMA-mapping glue code | 86 | #error Unsupported architecture and IOMMU/DMA-mapping glue code |