Merge "disp: msm: sde: fix state transition and vm release in TUI"
Dieser Commit ist enthalten in:

committet von
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);
|
||||
|
||||
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:
|
||||
|
@@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -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:
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren