Merge "disp: msm: sde: fix state transition and vm release in TUI"
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

commit
8ffa8d427b
@@ -1498,6 +1498,11 @@ int sde_kms_vm_trusted_post_commit(struct sde_kms *sde_kms,
|
|||||||
vm_ops = sde_vm_get_ops(sde_kms);
|
vm_ops = sde_vm_get_ops(sde_kms);
|
||||||
|
|
||||||
crtc = sde_kms_vm_get_vm_crtc(state);
|
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)
|
if (!crtc)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -1507,6 +1512,7 @@ int sde_kms_vm_trusted_post_commit(struct sde_kms *sde_kms,
|
|||||||
if (vm_req != VM_REQ_RELEASE)
|
if (vm_req != VM_REQ_RELEASE)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
relase_vm:
|
||||||
sde_kms_vm_pre_release(sde_kms, state, false);
|
sde_kms_vm_pre_release(sde_kms, state, false);
|
||||||
sde_kms_vm_set_sid(sde_kms, 0);
|
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);
|
sde_kms = to_sde_kms(kms);
|
||||||
dev = sde_kms->dev;
|
dev = sde_kms->dev;
|
||||||
|
|
||||||
|
if (sde_kms && sde_kms->vm)
|
||||||
|
sde_kms->vm->lastclose_in_progress = true;
|
||||||
|
|
||||||
drm_modeset_acquire_init(&ctx, 0);
|
drm_modeset_acquire_init(&ctx, 0);
|
||||||
|
|
||||||
state = drm_atomic_state_alloc(dev);
|
state = drm_atomic_state_alloc(dev);
|
||||||
@@ -2949,6 +2959,9 @@ out_ctx:
|
|||||||
SDE_ERROR("kms lastclose failed: %d\n", ret);
|
SDE_ERROR("kms lastclose failed: %d\n", ret);
|
||||||
|
|
||||||
SDE_EVT32(ret, SDE_EVTLOG_FUNC_EXIT);
|
SDE_EVT32(ret, SDE_EVTLOG_FUNC_EXIT);
|
||||||
|
|
||||||
|
if (sde_kms && sde_kms->vm)
|
||||||
|
sde_kms->vm->lastclose_in_progress = false;
|
||||||
return;
|
return;
|
||||||
|
|
||||||
backoff:
|
backoff:
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
/* 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.
|
* 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
|
* @msgq_listener_thread - handle to msgq receiver thread
|
||||||
* @vm_work - kthread work obj for msgq
|
* @vm_work - kthread work obj for msgq
|
||||||
* @msgq_handle - handle to display msgq
|
* @msgq_handle - handle to display msgq
|
||||||
|
* @lastclose_in_progress - boolean entry to check if
|
||||||
|
* lastclose is in progress
|
||||||
*/
|
*/
|
||||||
struct sde_vm {
|
struct sde_vm {
|
||||||
struct mutex vm_res_lock;
|
struct mutex vm_res_lock;
|
||||||
@@ -199,6 +202,7 @@ struct sde_vm {
|
|||||||
struct task_struct *msgq_listener_thread;
|
struct task_struct *msgq_listener_thread;
|
||||||
struct sde_vm_msg_work vm_work;
|
struct sde_vm_msg_work vm_work;
|
||||||
void *msgq_handle;
|
void *msgq_handle;
|
||||||
|
bool lastclose_in_progress;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -323,7 +323,10 @@ int sde_vm_request_valid(struct sde_kms *sde_kms,
|
|||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
break;
|
break;
|
||||||
case VM_REQ_ACQUIRE:
|
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;
|
rc = -EINVAL;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
Reference in New Issue
Block a user