disp: msm: sde: only flush SSPPs when enabling sys-cache read
The worker function for enabling sys-cache re-uses the flushes from the previous commit. This ends up flushing several blocks which have no programming update. Instead, only flush planes attached to the CRTC which is entering sys-cache state. Change-Id: Ieed68a713e9e56a5718518cf1a6b632f37864fb9 Signed-off-by: Steve Cohen <cohens@codeaurora.org>
This commit is contained in:
@@ -6456,13 +6456,10 @@ void __sde_crtc_static_cache_read_work(struct kthread_work *work)
|
|||||||
{
|
{
|
||||||
struct sde_crtc *sde_crtc = container_of(work, struct sde_crtc,
|
struct sde_crtc *sde_crtc = container_of(work, struct sde_crtc,
|
||||||
static_cache_read_work.work);
|
static_cache_read_work.work);
|
||||||
struct drm_crtc *crtc;
|
struct drm_crtc *crtc = &sde_crtc->base;
|
||||||
|
struct sde_hw_ctl *ctl = sde_crtc->mixers[0].hw_ctl;
|
||||||
struct drm_encoder *enc, *drm_enc = NULL;
|
struct drm_encoder *enc, *drm_enc = NULL;
|
||||||
|
struct drm_plane *plane;
|
||||||
if (!sde_crtc)
|
|
||||||
return;
|
|
||||||
|
|
||||||
crtc = &sde_crtc->base;
|
|
||||||
|
|
||||||
if (sde_crtc->cache_state != CACHE_STATE_FRAME_WRITE)
|
if (sde_crtc->cache_state != CACHE_STATE_FRAME_WRITE)
|
||||||
return;
|
return;
|
||||||
@@ -6473,8 +6470,9 @@ void __sde_crtc_static_cache_read_work(struct kthread_work *work)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!drm_enc) {
|
if (!drm_enc || !ctl || !sde_crtc->num_mixers) {
|
||||||
SDE_ERROR("invalid encoder\n");
|
SDE_ERROR("invalid object, drm_enc:%d, ctl:%d\n", !drm_enc,
|
||||||
|
!ctl);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6482,7 +6480,14 @@ void __sde_crtc_static_cache_read_work(struct kthread_work *work)
|
|||||||
|
|
||||||
sde_crtc_static_img_control(crtc, CACHE_STATE_FRAME_READ, false);
|
sde_crtc_static_img_control(crtc, CACHE_STATE_FRAME_READ, false);
|
||||||
|
|
||||||
/* kickoff encoder with previous configuration and wait for VBLANK */
|
/* flush only the sys-cache enabled SSPPs */
|
||||||
|
if (ctl->ops.clear_pending_flush)
|
||||||
|
ctl->ops.clear_pending_flush(ctl);
|
||||||
|
|
||||||
|
drm_atomic_crtc_for_each_plane(plane, crtc)
|
||||||
|
sde_plane_ctl_flush(plane, ctl, true);
|
||||||
|
|
||||||
|
/* kickoff encoder and wait for VBLANK */
|
||||||
sde_encoder_kickoff(drm_enc, false, false);
|
sde_encoder_kickoff(drm_enc, false, false);
|
||||||
sde_encoder_wait_for_event(drm_enc, MSM_ENC_VBLANK);
|
sde_encoder_wait_for_event(drm_enc, MSM_ENC_VBLANK);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user