From c6092f3e66cc03729d0bbe771f732164ca6dcd75 Mon Sep 17 00:00:00 2001 From: Nilaan Gunabalachandran Date: Mon, 24 Jun 2019 16:34:10 -0400 Subject: [PATCH] disp: msm: sde: log intf framecount in event logs Log hardware interface framecount during te and vblank irqs for command and video mode panels, respectively. This will help in debugging any missed frames. Change-Id: Ie86f686c4cc12de6a1f31aa47d4c7a5b8a68ea55 Signed-off-by: Nilaan Gunabalachandran --- msm/sde/sde_encoder_phys_cmd.c | 6 ++++-- msm/sde/sde_encoder_phys_vid.c | 8 +++++++- msm/sde/sde_hw_intf.c | 3 +++ msm/sde/sde_hw_mdss.h | 2 ++ 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/msm/sde/sde_encoder_phys_cmd.c b/msm/sde/sde_encoder_phys_cmd.c index ff08d721191f..98e32b34b98f 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 1102caf8f610..b49fea311ee2 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 00ebaec9261b..ee4647401602 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 d4f52f2ba034..6a75881176ce 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 */