From 093d93ed584b5fe61435a2f3133695522e18ebe3 Mon Sep 17 00:00:00 2001 From: Yashwanth Date: Wed, 1 Dec 2021 17:11:41 +0530 Subject: [PATCH] disp: msm: sde: update vm state atomic check for non-primary usecases If vm has already transitioned from primary to trusted, triggering a wb/secondary display commit will result in crash since hw is not owned by the vm. This change adds necessary changes to fail atomic check in such usecases. Change-Id: Ic9886d479726c27d1072d12304a87f3bf5deeb76 Signed-off-by: Yashwanth --- msm/sde/sde_kms.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index 158f2f896e..3a104bba2f 100644 --- a/msm/sde/sde_kms.c +++ b/msm/sde/sde_kms.c @@ -1,4 +1,5 @@ /* + * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2014-2021, The Linux Foundation. All rights reserved. * Copyright (C) 2013 Red Hat * Author: Rob Clark @@ -2861,7 +2862,7 @@ static int sde_kms_check_vm_request(struct msm_kms *kms, struct sde_vm_ops *vm_ops; enum sde_crtc_vm_req old_vm_req = VM_REQ_NONE, new_vm_req = VM_REQ_NONE; int i, rc = 0; - bool vm_req_active = false; + bool vm_req_active = false, prev_vm_req = false; bool vm_owns_hw; if (!kms || !state) @@ -2875,6 +2876,14 @@ static int sde_kms_check_vm_request(struct msm_kms *kms, if (!vm_ops->vm_request_valid || !vm_ops->vm_owns_hw || !vm_ops->vm_acquire) return -EINVAL; + drm_for_each_crtc(crtc, state->dev) { + if (crtc->state && (sde_crtc_get_property(to_sde_crtc_state(crtc->state), + CRTC_PROP_VM_REQ_STATE) == VM_REQ_RELEASE)) { + prev_vm_req = true; + break; + } + } + /* check for an active vm request */ for_each_oldnew_crtc_in_state(state, crtc, old_cstate, new_cstate, i) { struct sde_crtc_state *old_state = NULL, *new_state = NULL; @@ -2888,8 +2897,12 @@ static int sde_kms_check_vm_request(struct msm_kms *kms, old_state = to_sde_crtc_state(old_cstate); old_vm_req = sde_crtc_get_property(old_state, CRTC_PROP_VM_REQ_STATE); - /* No active request if the transition is from VM_REQ_NONE to VM_REQ_NONE */ - if (old_vm_req || new_vm_req) { + /* + * VM request should be validated in the following usecases + * - There is a vm request(other than VM_REQ_NONE) on current/prev crtc state. + * - Previously, vm transition has taken place on one of the crtc's. + */ + if (old_vm_req || new_vm_req || prev_vm_req) { if (!vm_req_active) { sde_vm_lock(sde_kms); vm_owns_hw = sde_vm_owns_hw(sde_kms);