mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-07 20:58:14 -04:00
drm/msm/dpu: Capture dpu snapshot when frame_done_timer timeouts
Trigger a devcoredump to dump dpu registers and capture the drm atomic state when the frame_done_timer timeouts. v2: Optimize the format in which frame_done_timeout_cnt is incremented v3: Describe parameter frame_done_timeout_cnt in dpu_encoder_virt Reported-by: kernel test robot <lkp@intel.com> Closes: https://lore.kernel.org/oe-kbuild-all/202312010225.2OJWLKmA-lkp@intel.com/ Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Signed-off-by: Paloma Arellano <quic_parellan@quicinc.com> Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com> Patchwork: https://patchwork.freedesktop.org/patch/569834/ Link: https://lore.kernel.org/r/20231130224740.24383-1-quic_parellan@quicinc.com Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
This commit is contained in:
committed by
Dmitry Baryshkov
parent
0b414c7314
commit
9cad81143e
@@ -151,6 +151,8 @@ enum dpu_enc_rc_states {
|
||||
* @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
|
||||
@@ -191,6 +193,7 @@ struct dpu_encoder_virt {
|
||||
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;
|
||||
@@ -1204,6 +1207,8 @@ static void dpu_encoder_virt_atomic_enable(struct drm_encoder *drm_enc,
|
||||
|
||||
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)
|
||||
@@ -2115,11 +2120,12 @@ static int _dpu_encoder_status_show(struct seq_file *s, void *data)
|
||||
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));
|
||||
}
|
||||
@@ -2341,6 +2347,9 @@ static void dpu_encoder_frame_done_timeout(struct timer_list *t)
|
||||
|
||||
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);
|
||||
@@ -2392,6 +2401,7 @@ struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
|
||||
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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user