From 9d7c72743d584c8edfdbdce860f7135d988966c1 Mon Sep 17 00:00:00 2001 From: Yashwanth Date: Thu, 13 Feb 2020 19:06:05 +0530 Subject: [PATCH] disp: msm: remap dmabuf attach during secure transitions During secure cb detach, gem objects stored in the aspace active list are not cleaned up properly leading to crash when secure cb attaches again. This change remaps dma buffer for those gem objects. Change-Id: I7626e87ab60a61261c802a7e7763982546c4c2e7 Signed-off-by: Yashwanth --- msm/msm_gem.c | 8 ++++++-- msm/msm_gem.h | 5 +++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/msm/msm_gem.c b/msm/msm_gem.c index aec28de51e14..4986eb1c2474 100644 --- a/msm/msm_gem.c +++ b/msm/msm_gem.c @@ -421,8 +421,9 @@ static int msm_gem_get_iova_locked(struct drm_gem_object *obj, bool reattach = false; dev = msm_gem_get_aspace_device(aspace); - if (dev && obj->import_attach && - (dev != obj->import_attach->dev)) { + if ((dev && obj->import_attach) && + ((dev != obj->import_attach->dev) || + msm_obj->obj_dirty)) { dmabuf = obj->import_attach->dmabuf; DRM_DEBUG("detach nsec-dev:%pK attach sec-dev:%pK\n", @@ -440,6 +441,7 @@ static int msm_gem_get_iova_locked(struct drm_gem_object *obj, PTR_ERR(obj->import_attach)); goto unlock; } + msm_obj->obj_dirty = false; reattach = true; } @@ -631,6 +633,7 @@ void msm_gem_aspace_domain_attach_detach_update( if (obj->import_attach) { mutex_lock(&msm_obj->lock); put_iova(obj); + msm_obj->obj_dirty = true; mutex_unlock(&msm_obj->lock); } } @@ -1091,6 +1094,7 @@ static int msm_gem_new_impl(struct drm_device *dev, INIT_LIST_HEAD(&msm_obj->iova_list); msm_obj->aspace = NULL; msm_obj->in_active_list = false; + msm_obj->obj_dirty = false; if (struct_mutex_locked) { WARN_ON(!mutex_is_locked(&dev->struct_mutex)); diff --git a/msm/msm_gem.h b/msm/msm_gem.h index bfbcfeeb3a2b..48759fdf96e1 100644 --- a/msm/msm_gem.h +++ b/msm/msm_gem.h @@ -139,6 +139,11 @@ struct msm_gem_object { struct msm_gem_address_space *aspace; bool in_active_list; char name[32]; /* Identifier to print for the debugfs files */ + + /* Indicates whether object needs to request for + * new pagetables due to cb switch + */ + bool obj_dirty; }; #define to_msm_bo(x) container_of(x, struct msm_gem_object, base)