* @crtc_frame_event_cb:       callback handler for frame event
  * @crtc_frame_event_cb_data:  callback handler private data
  * @frame_done_timeout_ms:     frame done timeout in ms
+ * @frame_done_timeout_cnt:    atomic counter tracking the number of frame
+ *                             done timeouts
  * @frame_done_timer:          watchdog timer for frame done event
  * @disp_info:                 local copy of msm_display_info struct
  * @idle_pc_supported:         indicate if idle power collaps is supported
        void *crtc_frame_event_cb_data;
 
        atomic_t frame_done_timeout_ms;
+       atomic_t frame_done_timeout_cnt;
        struct timer_list frame_done_timer;
 
        struct msm_display_info disp_info;
 
        dpu_enc->dsc = dpu_encoder_get_dsc_config(drm_enc);
 
+       atomic_set(&dpu_enc->frame_done_timeout_cnt, 0);
+
        if (disp_info->intf_type == INTF_DP)
                dpu_enc->wide_bus_en = msm_dp_wide_bus_available(priv->dp[index]);
        else if (disp_info->intf_type == INTF_DSI)
        for (i = 0; i < dpu_enc->num_phys_encs; i++) {
                struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
 
-               seq_printf(s, "intf:%d  wb:%d  vsync:%8d     underrun:%8d    ",
+               seq_printf(s, "intf:%d  wb:%d  vsync:%8d     underrun:%8d    frame_done_cnt:%d",
                                phys->hw_intf ? phys->hw_intf->idx - INTF_0 : -1,
                                phys->hw_wb ? phys->hw_wb->idx - WB_0 : -1,
                                atomic_read(&phys->vsync_cnt),
-                               atomic_read(&phys->underrun_cnt));
+                               atomic_read(&phys->underrun_cnt),
+                               atomic_read(&dpu_enc->frame_done_timeout_cnt));
 
                seq_printf(s, "mode: %s\n", dpu_encoder_helper_get_intf_type(phys->intf_mode));
        }
 
        DPU_ERROR_ENC(dpu_enc, "frame done timeout\n");
 
+       if (atomic_inc_return(&dpu_enc->frame_done_timeout_cnt) == 1)
+               msm_disp_snapshot_state(drm_enc->dev);
+
        event = DPU_ENCODER_FRAME_EVENT_ERROR;
        trace_dpu_enc_frame_done_timeout(DRMID(drm_enc), event);
        dpu_enc->crtc_frame_event_cb(dpu_enc->crtc_frame_event_cb_data, event);
                goto fail;
 
        atomic_set(&dpu_enc->frame_done_timeout_ms, 0);
+       atomic_set(&dpu_enc->frame_done_timeout_cnt, 0);
        timer_setup(&dpu_enc->frame_done_timer,
                        dpu_encoder_frame_done_timeout, 0);