From f4865f480d7c2a719fa89cc972a3419e69ab3eaf Mon Sep 17 00:00:00 2001 From: Akash Gajjar Date: Tue, 30 May 2023 13:59:50 +0530 Subject: [PATCH] disp: msm: sde: add vsync count in virtual encoder Introduce vsync count variable in virtual encoder structure to keep the vsync count variable value in sync while performing the poms. Consequently, this prevents the blocking of drm_vblank_put and the invocation of drm_crtc_funcs.disable_vblank. Change-Id: I74903a89b17a8f46fb1b21338500553f36771dd0 Signed-off-by: Akash Gajjar --- msm/sde/sde_encoder.c | 10 ++++++++-- msm/sde/sde_encoder.h | 2 ++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index 950e52e4..8e9c9f29 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -3715,7 +3715,12 @@ static void sde_encoder_vblank_callback(struct drm_encoder *drm_enc, spin_lock_irqsave(&sde_enc->enc_spinlock, lock_flags); phy_enc->last_vsync_timestamp = ts; + + if (phy_enc->ops.is_master && phy_enc->ops.is_master(phy_enc)) + atomic_inc(&sde_enc->vsync_cnt); + /* update count for debugfs */ atomic_inc(&phy_enc->vsync_cnt); + if (sde_enc->crtc_vblank_cb) sde_enc->crtc_vblank_cb(sde_enc->crtc_vblank_cb_data, ts); spin_unlock_irqrestore(&sde_enc->enc_spinlock, lock_flags); @@ -3726,7 +3731,7 @@ static void sde_encoder_vblank_callback(struct drm_encoder *drm_enc, if (phy_enc->sde_kms->debugfs_hw_fence) sde_encoder_hw_fence_status(phy_enc->sde_kms, sde_enc->crtc, phy_enc->hw_ctl); - SDE_EVT32(DRMID(drm_enc), ktime_to_us(ts), atomic_read(&phy_enc->vsync_cnt)); + SDE_EVT32(DRMID(drm_enc), ktime_to_us(ts), atomic_read(&sde_enc->vsync_cnt)); SDE_ATRACE_END("encoder_vblank_callback"); } @@ -5508,6 +5513,7 @@ static int sde_encoder_setup_display(struct sde_encoder_virt *sde_enc, phys_params.parent_ops = parent_ops; phys_params.enc_spinlock = &sde_enc->enc_spinlock; phys_params.vblank_ctl_lock = &sde_enc->vblank_ctl_lock; + atomic_set(&sde_enc->vsync_cnt, 0); SDE_DEBUG("\n"); @@ -5855,7 +5861,7 @@ u32 sde_encoder_get_frame_count(struct drm_encoder *encoder) phys = sde_enc->cur_master; - return phys ? atomic_read(&phys->vsync_cnt) : 0; + return phys ? atomic_read(&sde_enc->vsync_cnt) : 0; } bool sde_encoder_get_vblank_timestamp(struct drm_encoder *encoder, diff --git a/msm/sde/sde_encoder.h b/msm/sde/sde_encoder.h index 6b6b4d0d..4afa3eb5 100644 --- a/msm/sde/sde_encoder.h +++ b/msm/sde/sde_encoder.h @@ -147,6 +147,7 @@ enum sde_enc_rc_states { * @rsc_state_init: boolean to indicate rsc config init * @disp_info: local copy of msm_display_info struct * @misr_enable: misr enable/disable status + * @vsync_cnt: Vsync count for the physical encoder * @misr_reconfigure: boolean entry indicates misr reconfigure status * @misr_frame_count: misr frame count before start capturing the data * @idle_pc_enabled: indicate if idle power collapse is enabled @@ -224,6 +225,7 @@ struct sde_encoder_virt { bool rsc_state_init; struct msm_display_info disp_info; atomic_t misr_enable; + atomic_t vsync_cnt; bool misr_reconfigure; u32 misr_frame_count;