disp: msm: sde: fix vblank handling during trusted UI
Currently vblank enable/disable events are processed based on the vm ownership check. Use the vblank helper functions instead, during the transitions to avoid processing the vblank from DRM framework level. Change-Id: Icb2bd569e73d9206a234489a288320fecf631845 Signed-off-by: Veera Sundaram Sankaran <veeras@codeaurora.org>
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user