diff options
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_iommu.c | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_iommu.c b/drivers/gpu/drm/exynos/exynos_drm_iommu.c index 7ca09ee19656..1e82529e0c41 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_iommu.c +++ b/drivers/gpu/drm/exynos/exynos_drm_iommu.c | |||
@@ -21,6 +21,23 @@ | |||
21 | #include "exynos_drm_drv.h" | 21 | #include "exynos_drm_drv.h" |
22 | #include "exynos_drm_iommu.h" | 22 | #include "exynos_drm_iommu.h" |
23 | 23 | ||
24 | static inline int configure_dma_max_seg_size(struct device *dev) | ||
25 | { | ||
26 | if (!dev->dma_parms) | ||
27 | dev->dma_parms = kzalloc(sizeof(*dev->dma_parms), GFP_KERNEL); | ||
28 | if (!dev->dma_parms) | ||
29 | return -ENOMEM; | ||
30 | |||
31 | dma_set_max_seg_size(dev, DMA_BIT_MASK(32)); | ||
32 | return 0; | ||
33 | } | ||
34 | |||
35 | static inline void clear_dma_max_seg_size(struct device *dev) | ||
36 | { | ||
37 | kfree(dev->dma_parms); | ||
38 | dev->dma_parms = NULL; | ||
39 | } | ||
40 | |||
24 | /* | 41 | /* |
25 | * drm_create_iommu_mapping - create a mapping structure | 42 | * drm_create_iommu_mapping - create a mapping structure |
26 | * | 43 | * |
@@ -80,13 +97,10 @@ int drm_iommu_attach_device(struct drm_device *drm_dev, | |||
80 | if (!priv->mapping) | 97 | if (!priv->mapping) |
81 | return 0; | 98 | return 0; |
82 | 99 | ||
83 | subdrv_dev->dma_parms = devm_kzalloc(subdrv_dev, | ||
84 | sizeof(*subdrv_dev->dma_parms), | ||
85 | GFP_KERNEL); | ||
86 | if (!subdrv_dev->dma_parms) | ||
87 | return -ENOMEM; | ||
88 | 100 | ||
89 | dma_set_max_seg_size(subdrv_dev, 0xffffffffu); | 101 | ret = configure_dma_max_seg_size(subdrv_dev); |
102 | if (ret) | ||
103 | return ret; | ||
90 | 104 | ||
91 | if (subdrv_dev->archdata.mapping) | 105 | if (subdrv_dev->archdata.mapping) |
92 | arm_iommu_detach_device(subdrv_dev); | 106 | arm_iommu_detach_device(subdrv_dev); |
@@ -94,6 +108,7 @@ int drm_iommu_attach_device(struct drm_device *drm_dev, | |||
94 | ret = arm_iommu_attach_device(subdrv_dev, priv->mapping); | 108 | ret = arm_iommu_attach_device(subdrv_dev, priv->mapping); |
95 | if (ret < 0) { | 109 | if (ret < 0) { |
96 | DRM_DEBUG_KMS("failed iommu attach.\n"); | 110 | DRM_DEBUG_KMS("failed iommu attach.\n"); |
111 | clear_dma_max_seg_size(subdrv_dev); | ||
97 | return ret; | 112 | return ret; |
98 | } | 113 | } |
99 | 114 | ||
@@ -119,4 +134,5 @@ void drm_iommu_detach_device(struct drm_device *drm_dev, | |||
119 | return; | 134 | return; |
120 | 135 | ||
121 | arm_iommu_detach_device(subdrv_dev); | 136 | arm_iommu_detach_device(subdrv_dev); |
137 | clear_dma_max_seg_size(subdrv_dev); | ||
122 | } | 138 | } |