Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/msm/dpu: Start frame done timer after encoder kickoff

Starting the frame done timer before the encoder is finished kicking off
can lead to unnecessary frame done timeouts when the device is
experiencing heavy load (ex. when debug logs are enabled).

Thus, create a separate API for starting the encoder frame done timer and
call it after the encoder kickoff is finished

Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
Signed-off-by: Jessica Zhang <quic_jesszhan@quicinc.com>
Patchwork: https://patchwork.freedesktop.org/patch/637502/
Link: https://lore.kernel.org/r/20250214-concurrent-wb-v6-11-a44c293cf422@quicinc.com
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

authored by

Jessica Zhang and committed by
Dmitry Baryshkov
95bbde1d 3371005e

+24 -10
+3 -1
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
··· 999 999 1000 1000 dpu_vbif_clear_errors(dpu_kms); 1001 1001 1002 - drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) 1002 + drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) { 1003 1003 dpu_encoder_kickoff(encoder); 1004 + dpu_encoder_start_frame_done_timer(encoder); 1005 + } 1004 1006 1005 1007 reinit_completion(&dpu_crtc->frame_done_comp); 1006 1008
+19 -8
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
··· 2096 2096 } 2097 2097 2098 2098 /** 2099 + * dpu_encoder_start_frame_done_timer - Start the encoder frame done timer 2100 + * @drm_enc: Pointer to drm encoder structure 2101 + */ 2102 + void dpu_encoder_start_frame_done_timer(struct drm_encoder *drm_enc) 2103 + { 2104 + struct dpu_encoder_virt *dpu_enc; 2105 + unsigned long timeout_ms; 2106 + 2107 + dpu_enc = to_dpu_encoder_virt(drm_enc); 2108 + timeout_ms = DPU_ENCODER_FRAME_DONE_TIMEOUT_FRAMES * 1000 / 2109 + drm_mode_vrefresh(&drm_enc->crtc->state->adjusted_mode); 2110 + 2111 + atomic_set(&dpu_enc->frame_done_timeout_ms, timeout_ms); 2112 + mod_timer(&dpu_enc->frame_done_timer, 2113 + jiffies + msecs_to_jiffies(timeout_ms)); 2114 + 2115 + } 2116 + 2117 + /** 2099 2118 * dpu_encoder_kickoff - trigger a double buffer flip of the ctl path 2100 2119 * (i.e. ctl flush and start) immediately. 2101 2120 * @drm_enc: encoder pointer ··· 2123 2104 { 2124 2105 struct dpu_encoder_virt *dpu_enc; 2125 2106 struct dpu_encoder_phys *phys; 2126 - unsigned long timeout_ms; 2127 2107 unsigned int i; 2128 2108 2129 2109 DPU_ATRACE_BEGIN("encoder_kickoff"); 2130 2110 dpu_enc = to_dpu_encoder_virt(drm_enc); 2131 2111 2132 2112 trace_dpu_enc_kickoff(DRMID(drm_enc)); 2133 - 2134 - timeout_ms = DPU_ENCODER_FRAME_DONE_TIMEOUT_FRAMES * 1000 / 2135 - drm_mode_vrefresh(&drm_enc->crtc->state->adjusted_mode); 2136 - 2137 - atomic_set(&dpu_enc->frame_done_timeout_ms, timeout_ms); 2138 - mod_timer(&dpu_enc->frame_done_timer, 2139 - jiffies + msecs_to_jiffies(timeout_ms)); 2140 2113 2141 2114 /* All phys encs are ready to go, trigger the kickoff */ 2142 2115 _dpu_encoder_kickoff_phys(dpu_enc);
+2 -1
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 2 /* 3 - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. 3 + * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved. 4 4 * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. 5 5 * Copyright (C) 2013 Red Hat 6 6 * Author: Rob Clark <robdclark@gmail.com> ··· 95 95 96 96 bool dpu_encoder_is_valid_for_commit(struct drm_encoder *drm_enc); 97 97 98 + void dpu_encoder_start_frame_done_timer(struct drm_encoder *drm_enc); 98 99 #endif /* __DPU_ENCODER_H__ */