diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index 46cbad9dbc..0781dc072b 100644 --- a/msm/sde/sde_kms.c +++ b/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: diff --git a/msm/sde/sde_vm.h b/msm/sde/sde_vm.h index 3c35c9d742..3e777afebf 100644 --- a/msm/sde/sde_vm.h +++ b/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; }; /** diff --git a/msm/sde/sde_vm_common.c b/msm/sde/sde_vm_common.c index c137bff2ec..a0bf134127 100644 --- a/msm/sde/sde_vm_common.c +++ b/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: