Merge "disp: msm: sde: fix vblank handling during trusted UI"

This commit is contained in:
qctecmdr
2020-10-16 00:13:41 -07:00
committed by Gerrit - the friendly Code Review server

View File

@@ -205,64 +205,28 @@ static int _sde_kms_dump_clks_state(struct sde_kms *sde_kms)
} }
#endif #endif
static bool _sde_kms_skip_vblank_op(struct sde_kms *sde_kms)
{
struct sde_vm_ops *vm_ops = sde_vm_get_ops(sde_kms);
if (vm_ops && vm_ops->vm_owns_hw
&& !vm_ops->vm_owns_hw(sde_kms))
return true;
return false;
}
static int sde_kms_enable_vblank(struct msm_kms *kms, struct drm_crtc *crtc) static int sde_kms_enable_vblank(struct msm_kms *kms, struct drm_crtc *crtc)
{ {
int ret = 0; int ret;
struct sde_kms *sde_kms;
if (!kms) if (!kms || !crtc)
return -EINVAL; return -EINVAL;
sde_kms = to_sde_kms(kms);
sde_vm_lock(sde_kms);
if (_sde_kms_skip_vblank_op(sde_kms)) {
SDE_DEBUG("skipping vblank enable due to HW unavailablity\n");
goto done;
}
SDE_ATRACE_BEGIN("sde_kms_enable_vblank"); SDE_ATRACE_BEGIN("sde_kms_enable_vblank");
ret = sde_crtc_vblank(crtc, true); ret = sde_crtc_vblank(crtc, true);
SDE_ATRACE_END("sde_kms_enable_vblank"); SDE_ATRACE_END("sde_kms_enable_vblank");
done:
sde_vm_unlock(sde_kms);
return ret; return ret;
} }
static void sde_kms_disable_vblank(struct msm_kms *kms, struct drm_crtc *crtc) static void sde_kms_disable_vblank(struct msm_kms *kms, struct drm_crtc *crtc)
{ {
struct sde_kms *sde_kms; if (!kms || !crtc)
if (!kms)
return; return;
sde_kms = to_sde_kms(kms);
sde_vm_lock(sde_kms);
if (_sde_kms_skip_vblank_op(sde_kms)) {
SDE_DEBUG("skipping vblank disable due to HW unavailablity\n");
goto done;
}
SDE_ATRACE_BEGIN("sde_kms_disable_vblank"); SDE_ATRACE_BEGIN("sde_kms_disable_vblank");
sde_crtc_vblank(crtc, false); sde_crtc_vblank(crtc, false);
SDE_ATRACE_END("sde_kms_disable_vblank"); SDE_ATRACE_END("sde_kms_disable_vblank");
done:
sde_vm_unlock(sde_kms);
} }
static void sde_kms_wait_for_frame_transfer_complete(struct msm_kms *kms, static void sde_kms_wait_for_frame_transfer_complete(struct msm_kms *kms,
@@ -1071,6 +1035,9 @@ int sde_kms_vm_primary_prepare_commit(struct sde_kms *sde_kms,
if (drm_connector_mask(connector) & crtc->state->connector_mask) if (drm_connector_mask(connector) & crtc->state->connector_mask)
sde_connector_schedule_status_work(connector, true); sde_connector_schedule_status_work(connector, true);
/* enable vblank events */
drm_crtc_vblank_on(crtc);
/* handle non-SDE pre_acquire */ /* handle non-SDE pre_acquire */
if (vm_ops->vm_client_post_acquire) if (vm_ops->vm_client_post_acquire)
rc = vm_ops->vm_client_post_acquire(sde_kms); rc = vm_ops->vm_client_post_acquire(sde_kms);
@@ -1398,6 +1365,9 @@ int sde_kms_vm_pre_release(struct sde_kms *sde_kms,
/* disable IRQ line */ /* disable IRQ line */
sde_irq_update(&sde_kms->base, false); sde_irq_update(&sde_kms->base, false);
/* disable vblank events */
drm_crtc_vblank_off(crtc);
return rc; return rc;
} }
@@ -2534,33 +2504,29 @@ static int sde_kms_check_vm_request(struct msm_kms *kms,
for_each_oldnew_crtc_in_state(state, crtc, old_cstate, new_cstate, i) { for_each_oldnew_crtc_in_state(state, crtc, old_cstate, new_cstate, i) {
struct sde_crtc_state *old_state = NULL, *new_state = NULL; struct sde_crtc_state *old_state = NULL, *new_state = NULL;
new_state = to_sde_crtc_state(new_cstate); if (!new_cstate->active && !old_cstate->active)
if (!new_cstate->active && !new_cstate->active_changed)
continue; continue;
new_state = to_sde_crtc_state(new_cstate);
new_vm_req = sde_crtc_get_property(new_state, new_vm_req = sde_crtc_get_property(new_state,
CRTC_PROP_VM_REQ_STATE); CRTC_PROP_VM_REQ_STATE);
commit_crtc_cnt++; old_state = to_sde_crtc_state(old_cstate);
old_vm_req = sde_crtc_get_property(old_state,
if (old_cstate) { CRTC_PROP_VM_REQ_STATE);
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 * No active request if the transition is from
* VM_REQ_NONE to VM_REQ_NONE * VM_REQ_NONE to VM_REQ_NONE
*/ */
if (new_vm_req || (old_state && old_vm_req)) if (new_vm_req || old_vm_req)
vm_req_active = true; vm_req_active = true;
idle_pc_state = sde_crtc_get_property(new_state, idle_pc_state = sde_crtc_get_property(new_state,
CRTC_PROP_IDLE_PC_STATE); CRTC_PROP_IDLE_PC_STATE);
active_crtc = crtc; active_crtc = crtc;
commit_crtc_cnt++;
} }
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {