瀏覽代碼

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 <[email protected]>
Yashwanth 5 年之前
父節點
當前提交
9d7c72743d
共有 2 個文件被更改,包括 11 次插入2 次删除
  1. 6 2
      msm/msm_gem.c
  2. 5 0
      msm/msm_gem.h

+ 6 - 2
msm/msm_gem.c

@@ -421,8 +421,9 @@ static int msm_gem_get_iova_locked(struct drm_gem_object *obj,
 		bool reattach = false;
 		bool reattach = false;
 
 
 		dev = msm_gem_get_aspace_device(aspace);
 		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;
 			dmabuf = obj->import_attach->dmabuf;
 
 
 			DRM_DEBUG("detach nsec-dev:%pK attach sec-dev:%pK\n",
 			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));
 						PTR_ERR(obj->import_attach));
 				goto unlock;
 				goto unlock;
 			}
 			}
+			msm_obj->obj_dirty = false;
 			reattach = true;
 			reattach = true;
 		}
 		}
 
 
@@ -631,6 +633,7 @@ void msm_gem_aspace_domain_attach_detach_update(
 			if (obj->import_attach) {
 			if (obj->import_attach) {
 				mutex_lock(&msm_obj->lock);
 				mutex_lock(&msm_obj->lock);
 				put_iova(obj);
 				put_iova(obj);
+				msm_obj->obj_dirty = true;
 				mutex_unlock(&msm_obj->lock);
 				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);
 	INIT_LIST_HEAD(&msm_obj->iova_list);
 	msm_obj->aspace = NULL;
 	msm_obj->aspace = NULL;
 	msm_obj->in_active_list = false;
 	msm_obj->in_active_list = false;
+	msm_obj->obj_dirty = false;
 
 
 	if (struct_mutex_locked) {
 	if (struct_mutex_locked) {
 		WARN_ON(!mutex_is_locked(&dev->struct_mutex));
 		WARN_ON(!mutex_is_locked(&dev->struct_mutex));

+ 5 - 0
msm/msm_gem.h

@@ -139,6 +139,11 @@ struct msm_gem_object {
 	struct msm_gem_address_space *aspace;
 	struct msm_gem_address_space *aspace;
 	bool in_active_list;
 	bool in_active_list;
 	char name[32]; /* Identifier to print for the debugfs files */
 	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)
 #define to_msm_bo(x) container_of(x, struct msm_gem_object, base)