diff options
| -rw-r--r-- | drivers/gpu/drm/panfrost/panfrost_gem.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/panfrost/panfrost_gem.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/panfrost/panfrost_mmu.c | 8 |
3 files changed, 11 insertions, 1 deletions
diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.c b/drivers/gpu/drm/panfrost/panfrost_gem.c index a5528a360ef4..97d64ceedbb4 100644 --- a/drivers/gpu/drm/panfrost/panfrost_gem.c +++ b/drivers/gpu/drm/panfrost/panfrost_gem.c | |||
| @@ -19,7 +19,8 @@ static void panfrost_gem_free_object(struct drm_gem_object *obj) | |||
| 19 | struct panfrost_gem_object *bo = to_panfrost_bo(obj); | 19 | struct panfrost_gem_object *bo = to_panfrost_bo(obj); |
| 20 | struct panfrost_device *pfdev = obj->dev->dev_private; | 20 | struct panfrost_device *pfdev = obj->dev->dev_private; |
| 21 | 21 | ||
| 22 | panfrost_mmu_unmap(bo); | 22 | if (bo->is_mapped) |
| 23 | panfrost_mmu_unmap(bo); | ||
| 23 | 24 | ||
| 24 | spin_lock(&pfdev->mm_lock); | 25 | spin_lock(&pfdev->mm_lock); |
| 25 | drm_mm_remove_node(&bo->node); | 26 | drm_mm_remove_node(&bo->node); |
diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.h b/drivers/gpu/drm/panfrost/panfrost_gem.h index 045000eb5fcf..6dbcaba020fc 100644 --- a/drivers/gpu/drm/panfrost/panfrost_gem.h +++ b/drivers/gpu/drm/panfrost/panfrost_gem.h | |||
| @@ -11,6 +11,7 @@ struct panfrost_gem_object { | |||
| 11 | struct drm_gem_shmem_object base; | 11 | struct drm_gem_shmem_object base; |
| 12 | 12 | ||
| 13 | struct drm_mm_node node; | 13 | struct drm_mm_node node; |
| 14 | bool is_mapped; | ||
| 14 | }; | 15 | }; |
| 15 | 16 | ||
| 16 | static inline | 17 | static inline |
diff --git a/drivers/gpu/drm/panfrost/panfrost_mmu.c b/drivers/gpu/drm/panfrost/panfrost_mmu.c index 762b1bd2a8c2..92ac995dd9c6 100644 --- a/drivers/gpu/drm/panfrost/panfrost_mmu.c +++ b/drivers/gpu/drm/panfrost/panfrost_mmu.c | |||
| @@ -156,6 +156,9 @@ int panfrost_mmu_map(struct panfrost_gem_object *bo) | |||
| 156 | struct sg_table *sgt; | 156 | struct sg_table *sgt; |
| 157 | int ret; | 157 | int ret; |
| 158 | 158 | ||
| 159 | if (WARN_ON(bo->is_mapped)) | ||
| 160 | return 0; | ||
| 161 | |||
| 159 | sgt = drm_gem_shmem_get_pages_sgt(obj); | 162 | sgt = drm_gem_shmem_get_pages_sgt(obj); |
| 160 | if (WARN_ON(IS_ERR(sgt))) | 163 | if (WARN_ON(IS_ERR(sgt))) |
| 161 | return PTR_ERR(sgt); | 164 | return PTR_ERR(sgt); |
| @@ -189,6 +192,7 @@ int panfrost_mmu_map(struct panfrost_gem_object *bo) | |||
| 189 | 192 | ||
| 190 | pm_runtime_mark_last_busy(pfdev->dev); | 193 | pm_runtime_mark_last_busy(pfdev->dev); |
| 191 | pm_runtime_put_autosuspend(pfdev->dev); | 194 | pm_runtime_put_autosuspend(pfdev->dev); |
| 195 | bo->is_mapped = true; | ||
| 192 | 196 | ||
| 193 | return 0; | 197 | return 0; |
| 194 | } | 198 | } |
| @@ -203,6 +207,9 @@ void panfrost_mmu_unmap(struct panfrost_gem_object *bo) | |||
| 203 | size_t unmapped_len = 0; | 207 | size_t unmapped_len = 0; |
| 204 | int ret; | 208 | int ret; |
| 205 | 209 | ||
| 210 | if (WARN_ON(!bo->is_mapped)) | ||
| 211 | return; | ||
| 212 | |||
| 206 | dev_dbg(pfdev->dev, "unmap: iova=%llx, len=%zx", iova, len); | 213 | dev_dbg(pfdev->dev, "unmap: iova=%llx, len=%zx", iova, len); |
| 207 | 214 | ||
| 208 | ret = pm_runtime_get_sync(pfdev->dev); | 215 | ret = pm_runtime_get_sync(pfdev->dev); |
| @@ -230,6 +237,7 @@ void panfrost_mmu_unmap(struct panfrost_gem_object *bo) | |||
| 230 | 237 | ||
| 231 | pm_runtime_mark_last_busy(pfdev->dev); | 238 | pm_runtime_mark_last_busy(pfdev->dev); |
| 232 | pm_runtime_put_autosuspend(pfdev->dev); | 239 | pm_runtime_put_autosuspend(pfdev->dev); |
| 240 | bo->is_mapped = false; | ||
| 233 | } | 241 | } |
| 234 | 242 | ||
| 235 | static void mmu_tlb_inv_context_s1(void *cookie) | 243 | static void mmu_tlb_inv_context_s1(void *cookie) |
