Эх сурвалжийг харах

disp: msm: sde: fix state transition and vm release in TUI

This change fixes state machine transition during TUI process
kill to disable crtc and release vm resources cleanly.

Change-Id: If92c548bea5a3ed69721a9ecc28848910b44558d
Signed-off-by: Shamika Joshi <[email protected]>
Shamika Joshi 1 жил өмнө
parent
commit
723d8a5895

+ 13 - 0
msm/sde/sde_kms.c

@@ -1498,6 +1498,11 @@ int sde_kms_vm_trusted_post_commit(struct sde_kms *sde_kms,
 	vm_ops = sde_vm_get_ops(sde_kms);
 
 	crtc = sde_kms_vm_get_vm_crtc(state);
+
+	if (sde_kms->vm->lastclose_in_progress && !crtc) {
+		sde_dbg_set_hw_ownership_status(false);
+		goto relase_vm;
+	}
 	if (!crtc)
 		return 0;
 
@@ -1507,6 +1512,7 @@ int sde_kms_vm_trusted_post_commit(struct sde_kms *sde_kms,
 	if (vm_req != VM_REQ_RELEASE)
 		return 0;
 
+relase_vm:
 	sde_kms_vm_pre_release(sde_kms, state, false);
 	sde_kms_vm_set_sid(sde_kms, 0);
 
@@ -2915,6 +2921,10 @@ static void sde_kms_lastclose(struct msm_kms *kms)
 
 	sde_kms = to_sde_kms(kms);
 	dev = sde_kms->dev;
+
+	if (sde_kms && sde_kms->vm)
+		sde_kms->vm->lastclose_in_progress = true;
+
 	drm_modeset_acquire_init(&ctx, 0);
 
 	state = drm_atomic_state_alloc(dev);
@@ -2949,6 +2959,9 @@ out_ctx:
 		SDE_ERROR("kms lastclose failed: %d\n", ret);
 
 	SDE_EVT32(ret, SDE_EVTLOG_FUNC_EXIT);
+
+	if (sde_kms && sde_kms->vm)
+		sde_kms->vm->lastclose_in_progress = false;
 	return;
 
 backoff:

+ 4 - 0
msm/sde/sde_vm.h

@@ -1,5 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
 /*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
  */
 
@@ -188,6 +189,8 @@ struct sde_vm_ops {
  * @msgq_listener_thread - handle to msgq receiver thread
  * @vm_work - kthread work obj for msgq
  * @msgq_handle - handle to display msgq
+ * @lastclose_in_progress - boolean entry to check if
+ *                          lastclose is in progress
  */
 struct sde_vm {
 	struct mutex vm_res_lock;
@@ -199,6 +202,7 @@ struct sde_vm {
 	struct task_struct *msgq_listener_thread;
 	struct sde_vm_msg_work vm_work;
 	void *msgq_handle;
+	bool lastclose_in_progress;
 };
 
 /**

+ 4 - 1
msm/sde/sde_vm_common.c

@@ -323,7 +323,10 @@ int sde_vm_request_valid(struct sde_kms *sde_kms,
 			rc = -EINVAL;
 		break;
 	case VM_REQ_ACQUIRE:
-		if ((old_state != VM_REQ_RELEASE) || (vm_owns_hw && !sde_in_trusted_vm(sde_kms)))
+		if ((old_state == VM_REQ_ACQUIRE) && sde_in_trusted_vm(sde_kms))
+			rc = 0;
+		else if ((old_state != VM_REQ_RELEASE) ||
+			(vm_owns_hw && !sde_in_trusted_vm(sde_kms)))
 			rc = -EINVAL;
 		break;
 	default: