diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index 75d65a0110..f921db8795 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -4055,7 +4055,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); @@ -4066,7 +4071,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"); } @@ -6035,6 +6040,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"); @@ -6372,7 +6378,6 @@ enum sde_intf_mode sde_encoder_get_intf_mode(struct drm_encoder *encoder) u32 sde_encoder_get_frame_count(struct drm_encoder *encoder) { struct sde_encoder_virt *sde_enc = NULL; - struct sde_encoder_phys *phys; if (!encoder) { SDE_ERROR("invalid encoder\n"); @@ -6380,9 +6385,7 @@ u32 sde_encoder_get_frame_count(struct drm_encoder *encoder) } sde_enc = to_sde_encoder_virt(encoder); - phys = sde_enc->cur_master; - - return phys ? atomic_read(&phys->vsync_cnt) : 0; + return atomic_read(&sde_enc->vsync_cnt); } 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 22ccb09dab..1c85f74fd1 100644 --- a/msm/sde/sde_encoder.h +++ b/msm/sde/sde_encoder.h @@ -181,6 +181,7 @@ enum sde_sim_qsync_event { * @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 @@ -262,6 +263,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;