浏览代码

disp: msm: sde: move vm-ownership check to crtc custom events

Currently all the custom event register/unregister calls are
blocked based on the vm-ownership checks. Avoid this check
for connector events as it has only software updates unlike
the crtc events which directly touch the HW registers. This
allows the connector events to be registered before the first
commit where the VM ownership is obtained.

Change-Id: Id78e365929cb958ead10221b9267f1c1c0406a27
Signed-off-by: Veera Sundaram Sankaran <[email protected]>
Veera Sundaram Sankaran 4 年之前
父节点
当前提交
643e9c2d80
共有 1 个文件被更改,包括 13 次插入8 次删除
  1. 13 8
      msm/sde/sde_kms.c

+ 13 - 8
msm/sde/sde_kms.c

@@ -4595,18 +4595,24 @@ static int _sde_kms_register_events(struct msm_kms *kms,
 	}
 	}
 
 
 	sde_kms = to_sde_kms(kms);
 	sde_kms = to_sde_kms(kms);
-	vm_ops = sde_vm_get_ops(sde_kms);
-	sde_vm_lock(sde_kms);
-	if (vm_ops && vm_ops->vm_owns_hw && !vm_ops->vm_owns_hw(sde_kms)) {
-		sde_vm_unlock(sde_kms);
-		DRM_INFO("HW is owned by other VM\n");
-		return -EACCES;
-	}
 
 
+	/* check vm ownership, if event registration requires HW access */
 	switch (obj->type) {
 	switch (obj->type) {
 	case DRM_MODE_OBJECT_CRTC:
 	case DRM_MODE_OBJECT_CRTC:
+		vm_ops = sde_vm_get_ops(sde_kms);
+		sde_vm_lock(sde_kms);
+
+		if (vm_ops && vm_ops->vm_owns_hw
+				&& !vm_ops->vm_owns_hw(sde_kms)) {
+			sde_vm_unlock(sde_kms);
+			SDE_DEBUG("HW is owned by other VM\n");
+			return -EACCES;
+		}
+
 		crtc = obj_to_crtc(obj);
 		crtc = obj_to_crtc(obj);
 		ret = sde_crtc_register_custom_event(sde_kms, crtc, event, en);
 		ret = sde_crtc_register_custom_event(sde_kms, crtc, event, en);
+
+		sde_vm_unlock(sde_kms);
 		break;
 		break;
 	case DRM_MODE_OBJECT_CONNECTOR:
 	case DRM_MODE_OBJECT_CONNECTOR:
 		conn = obj_to_connector(obj);
 		conn = obj_to_connector(obj);
@@ -4615,7 +4621,6 @@ static int _sde_kms_register_events(struct msm_kms *kms,
 		break;
 		break;
 	}
 	}
 
 
-	sde_vm_unlock(sde_kms);
 	return ret;
 	return ret;
 }
 }