diff --git a/msm/sde/sde_encoder_phys_cmd.c b/msm/sde/sde_encoder_phys_cmd.c index ff08d72119..98e32b34b9 100644 --- a/msm/sde/sde_encoder_phys_cmd.c +++ b/msm/sde/sde_encoder_phys_cmd.c @@ -243,8 +243,10 @@ static void sde_encoder_phys_cmd_te_rd_ptr_irq(void *arg, int irq_idx) sde_encoder_helper_get_pp_line_count(phys_enc->parent, info); SDE_EVT32_IRQ(DRMID(phys_enc->parent), - info[0].pp_idx, info[0].intf_idx, info[0].wr_ptr_line_count, - info[1].pp_idx, info[1].intf_idx, info[1].wr_ptr_line_count, + info[0].pp_idx, info[0].intf_idx, + info[0].wr_ptr_line_count, info[0].intf_frame_count, + info[1].pp_idx, info[1].intf_idx, + info[1].wr_ptr_line_count, info[1].intf_frame_count, scheduler_status); if (phys_enc->parent_ops.handle_vblank_virt) diff --git a/msm/sde/sde_encoder_phys_vid.c b/msm/sde/sde_encoder_phys_vid.c index 1102caf8f6..b49fea311e 100644 --- a/msm/sde/sde_encoder_phys_vid.c +++ b/msm/sde/sde_encoder_phys_vid.c @@ -474,6 +474,7 @@ static void sde_encoder_phys_vid_vblank_irq(void *arg, int irq_idx) { struct sde_encoder_phys *phys_enc = arg; struct sde_hw_ctl *hw_ctl; + struct intf_status intf_status = {0}; unsigned long lock_flags; u32 flush_register = ~0; u32 reset_status = 0; @@ -530,11 +531,16 @@ not_flushed: phys_enc->parent_ops.handle_vblank_virt(phys_enc->parent, phys_enc); + if (phys_enc->hw_intf->ops.get_status) + phys_enc->hw_intf->ops.get_status(phys_enc->hw_intf, + &intf_status); + SDE_EVT32_IRQ(DRMID(phys_enc->parent), phys_enc->hw_intf->idx - INTF_0, old_cnt, atomic_read(&phys_enc->pending_kickoff_cnt), reset_status ? SDE_EVTLOG_ERROR : 0, flush_register, event, - atomic_read(&phys_enc->pending_retire_fence_cnt)); + atomic_read(&phys_enc->pending_retire_fence_cnt), + intf_status.frame_count); /* Signal any waiting atomic commit thread */ wake_up_all(&phys_enc->pending_kickoff_wq); diff --git a/msm/sde/sde_hw_intf.c b/msm/sde/sde_hw_intf.c index 00ebaec926..ee46474016 100644 --- a/msm/sde/sde_hw_intf.c +++ b/msm/sde/sde_hw_intf.c @@ -628,6 +628,9 @@ static int sde_hw_intf_get_vsync_info(struct sde_hw_intf *intf, val = SDE_REG_READ(c, INTF_TEAR_LINE_COUNT); info->wr_ptr_line_count = val & 0xffff; + val = SDE_REG_READ(c, INTF_FRAME_COUNT); + info->intf_frame_count = val; + return 0; } diff --git a/msm/sde/sde_hw_mdss.h b/msm/sde/sde_hw_mdss.h index d4f52f2ba0..6a75881176 100644 --- a/msm/sde/sde_hw_mdss.h +++ b/msm/sde/sde_hw_mdss.h @@ -680,6 +680,7 @@ struct sde_hw_autorefresh { * @rd_ptr_frame_count: num frames sent since enabling interface * @rd_ptr_line_count: current line on panel (rd ptr) * @wr_ptr_line_count: current line within pp fifo (wr ptr) + * @intf_frame_count: num frames read from intf */ struct sde_hw_pp_vsync_info { u32 pp_idx; @@ -688,6 +689,7 @@ struct sde_hw_pp_vsync_info { u32 rd_ptr_frame_count; u32 rd_ptr_line_count; u32 wr_ptr_line_count; + u32 intf_frame_count; }; #endif /* _SDE_HW_MDSS_H */