* [PATCH] drm/msm/dp: Avoid division by zero in msm_dp_ctrl_config_msa()
@ 2026-01-08 23:29 Nathan Chancellor
2026-01-09 9:06 ` Konrad Dybcio
0 siblings, 1 reply; 6+ messages in thread
From: Nathan Chancellor @ 2026-01-08 23:29 UTC (permalink / raw)
To: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten
Cc: linux-arm-msm, dri-devel, freedreno, llvm, patches,
kernel test robot, Nathan Chancellor
An (admittedly problematic) optimization change in LLVM 20 [1] turns
known division by zero into the equivalent of __builtin_unreachable(),
which invokes undefined behavior if it is encountered in a control flow
graph, destroying code generation. When compile testing for x86_64,
objtool flags an instance of this optimization triggering in
msm_dp_ctrl_config_msa(), inlined into msm_dp_ctrl_on_stream():
drivers/gpu/drm/msm/msm.o: warning: objtool: msm_dp_ctrl_on_stream(): unexpected end of section .text.msm_dp_ctrl_on_stream
The zero division happens if the else branch in the first if statement
in msm_dp_ctrl_config_msa() is taken because pixel_div is initialized to
zero and it is not possible for LLVM to eliminate the else branch since
rate is still not known after inlining into msm_dp_ctrl_on_stream().
Change pixel_div to one to make the division well defined in the
presence of an unsupported rate, relying on the DRM_ERROR print to
indicate the error to the user.
Fixes: c943b4948b58 ("drm/msm/dp: add displayPort driver support")
Link: https://github.com/llvm/llvm-project/commit/37932643abab699e8bb1def08b7eb4eae7ff1448 [1]
Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202601081959.9UVJEOfP-lkp@intel.com/
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
---
drivers/gpu/drm/msm/dp/dp_ctrl.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_ctrl.c
index cbcc7c2f0ffc..e4731c059ed8 100644
--- a/drivers/gpu/drm/msm/dp/dp_ctrl.c
+++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c
@@ -2395,7 +2395,7 @@ static void msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl,
bool is_ycbcr_420)
{
u32 pixel_m, pixel_n;
- u32 mvid, nvid, pixel_div = 0, dispcc_input_rate;
+ u32 mvid, nvid, pixel_div = 1, dispcc_input_rate;
u32 const nvid_fixed = DP_LINK_CONSTANT_N_VALUE;
u32 const link_rate_hbr2 = 540000;
u32 const link_rate_hbr3 = 810000;
---
base-commit: 66691e272e40c91305f1704695e0cb340cd162ff
change-id: 20260108-drm-msm-dp_ctrl-avoid-zero-div-be5dc40cbc18
Best regards,
--
Nathan Chancellor <nathan@kernel.org>
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH] drm/msm/dp: Avoid division by zero in msm_dp_ctrl_config_msa() 2026-01-08 23:29 [PATCH] drm/msm/dp: Avoid division by zero in msm_dp_ctrl_config_msa() Nathan Chancellor @ 2026-01-09 9:06 ` Konrad Dybcio 2026-01-10 22:53 ` Nathan Chancellor 2026-01-12 2:37 ` Dmitry Baryshkov 0 siblings, 2 replies; 6+ messages in thread From: Konrad Dybcio @ 2026-01-09 9:06 UTC (permalink / raw) To: Nathan Chancellor, Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang, Sean Paul, Marijn Suijten Cc: linux-arm-msm, dri-devel, freedreno, llvm, patches, kernel test robot On 1/9/26 12:29 AM, Nathan Chancellor wrote: > An (admittedly problematic) optimization change in LLVM 20 [1] turns > known division by zero into the equivalent of __builtin_unreachable(), > which invokes undefined behavior if it is encountered in a control flow > graph, destroying code generation. When compile testing for x86_64, > objtool flags an instance of this optimization triggering in > msm_dp_ctrl_config_msa(), inlined into msm_dp_ctrl_on_stream(): > > drivers/gpu/drm/msm/msm.o: warning: objtool: msm_dp_ctrl_on_stream(): unexpected end of section .text.msm_dp_ctrl_on_stream > > The zero division happens if the else branch in the first if statement > in msm_dp_ctrl_config_msa() is taken because pixel_div is initialized to > zero and it is not possible for LLVM to eliminate the else branch since > rate is still not known after inlining into msm_dp_ctrl_on_stream(). > Change pixel_div to one to make the division well defined in the > presence of an unsupported rate, relying on the DRM_ERROR print to > indicate the error to the user. > > Fixes: c943b4948b58 ("drm/msm/dp: add displayPort driver support") > Link: https://github.com/llvm/llvm-project/commit/37932643abab699e8bb1def08b7eb4eae7ff1448 [1] > Reported-by: kernel test robot <lkp@intel.com> > Closes: https://lore.kernel.org/oe-kbuild-all/202601081959.9UVJEOfP-lkp@intel.com/ > Signed-off-by: Nathan Chancellor <nathan@kernel.org> > --- > drivers/gpu/drm/msm/dp/dp_ctrl.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_ctrl.c > index cbcc7c2f0ffc..e4731c059ed8 100644 > --- a/drivers/gpu/drm/msm/dp/dp_ctrl.c > +++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c > @@ -2395,7 +2395,7 @@ static void msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, > bool is_ycbcr_420) > { > u32 pixel_m, pixel_n; > - u32 mvid, nvid, pixel_div = 0, dispcc_input_rate; > + u32 mvid, nvid, pixel_div = 1, dispcc_input_rate; > u32 const nvid_fixed = DP_LINK_CONSTANT_N_VALUE; > u32 const link_rate_hbr2 = 540000; > u32 const link_rate_hbr3 = 810000; > > --- > base-commit: 66691e272e40c91305f1704695e0cb340cd162ff > change-id: 20260108-drm-msm-dp_ctrl-avoid-zero-div-be5dc40cbc18 Dmitry, would it be beneficial to throw an actual error when the rate is is mangled? i.e. diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_ctrl.c index aa2303d0e148..4f710b8e6bc6 100644 --- a/drivers/gpu/drm/msm/dp/dp_ctrl.c +++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c @@ -2404,9 +2404,9 @@ static int msm_dp_ctrl_link_retrain(struct msm_dp_ctrl_private *ctrl) return msm_dp_ctrl_setup_main_link(ctrl, &training_step); } -static void msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, - u32 rate, u32 stream_rate_khz, - bool is_ycbcr_420) +static int msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, + u32 rate, u32 stream_rate_khz, + bool is_ycbcr_420) { u32 pixel_m, pixel_n; u32 mvid, nvid, pixel_div = 0, dispcc_input_rate; @@ -2415,14 +2415,21 @@ static void msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, u32 const link_rate_hbr3 = 810000; unsigned long den, num; - if (rate == link_rate_hbr3) + switch (rate) { + case link_rate_hbr3: pixel_div = 6; - else if (rate == 162000 || rate == 270000) - pixel_div = 2; - else if (rate == link_rate_hbr2) + break; + case link_rate_hbr2: pixel_div = 4; - else + break; + case 270000: + case 162000: + pixel_div = 2; + break; + default: DRM_ERROR("Invalid pixel mux divider\n"); + return -EINVAL; + } dispcc_input_rate = (rate * 10) / pixel_div; @@ -2458,6 +2465,8 @@ static void msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, drm_dbg_dp(ctrl->drm_dev, "mvid=0x%x, nvid=0x%x\n", mvid, nvid); msm_dp_write_link(ctrl, REG_DP_SOFTWARE_MVID, mvid); msm_dp_write_link(ctrl, REG_DP_SOFTWARE_NVID, nvid); + + return 0; } int msm_dp_ctrl_on_stream(struct msm_dp_ctrl *msm_dp_ctrl, bool force_link_train) @@ -2525,10 +2534,11 @@ int msm_dp_ctrl_on_stream(struct msm_dp_ctrl *msm_dp_ctrl, bool force_link_train msm_dp_ctrl_configure_source_params(ctrl); - msm_dp_ctrl_config_msa(ctrl, - ctrl->link->link_params.rate, - pixel_rate_orig, - ctrl->panel->msm_dp_mode.out_fmt_is_yuv_420); + ret = msm_dp_ctrl_config_msa(ctrl, ctrl->link->link_params.rate, + pixel_rate_orig, + ctrl->panel->msm_dp_mode.out_fmt_is_yuv_420); + if (ret) + return ret; msm_dp_panel_clear_dsc_dto(ctrl->panel); Konrad ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] drm/msm/dp: Avoid division by zero in msm_dp_ctrl_config_msa() 2026-01-09 9:06 ` Konrad Dybcio @ 2026-01-10 22:53 ` Nathan Chancellor 2026-01-12 2:37 ` Dmitry Baryshkov 1 sibling, 0 replies; 6+ messages in thread From: Nathan Chancellor @ 2026-01-10 22:53 UTC (permalink / raw) To: Konrad Dybcio Cc: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang, Sean Paul, Marijn Suijten, linux-arm-msm, dri-devel, freedreno, llvm, patches, kernel test robot On Fri, Jan 09, 2026 at 10:06:29AM +0100, Konrad Dybcio wrote: > Dmitry, would it be beneficial to throw an actual error when the rate is > is mangled? i.e. This certainly seems more robust if acceptable. > diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_ctrl.c > index aa2303d0e148..4f710b8e6bc6 100644 > --- a/drivers/gpu/drm/msm/dp/dp_ctrl.c > +++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c > @@ -2404,9 +2404,9 @@ static int msm_dp_ctrl_link_retrain(struct msm_dp_ctrl_private *ctrl) > return msm_dp_ctrl_setup_main_link(ctrl, &training_step); > } > > -static void msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, > - u32 rate, u32 stream_rate_khz, > - bool is_ycbcr_420) > +static int msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, > + u32 rate, u32 stream_rate_khz, > + bool is_ycbcr_420) > { > u32 pixel_m, pixel_n; > u32 mvid, nvid, pixel_div = 0, dispcc_input_rate; This initialization is now unnecessary with this change. > @@ -2415,14 +2415,21 @@ static void msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, > u32 const link_rate_hbr3 = 810000; > unsigned long den, num; > > - if (rate == link_rate_hbr3) > + switch (rate) { > + case link_rate_hbr3: > pixel_div = 6; > - else if (rate == 162000 || rate == 270000) > - pixel_div = 2; > - else if (rate == link_rate_hbr2) > + break; > + case link_rate_hbr2: > pixel_div = 4; > - else > + break; > + case 270000: > + case 162000: > + pixel_div = 2; > + break; > + default: > DRM_ERROR("Invalid pixel mux divider\n"); > + return -EINVAL; > + } > > dispcc_input_rate = (rate * 10) / pixel_div; > > @@ -2458,6 +2465,8 @@ static void msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, > drm_dbg_dp(ctrl->drm_dev, "mvid=0x%x, nvid=0x%x\n", mvid, nvid); > msm_dp_write_link(ctrl, REG_DP_SOFTWARE_MVID, mvid); > msm_dp_write_link(ctrl, REG_DP_SOFTWARE_NVID, nvid); > + > + return 0; > } > > int msm_dp_ctrl_on_stream(struct msm_dp_ctrl *msm_dp_ctrl, bool force_link_train) > @@ -2525,10 +2534,11 @@ int msm_dp_ctrl_on_stream(struct msm_dp_ctrl *msm_dp_ctrl, bool force_link_train > > msm_dp_ctrl_configure_source_params(ctrl); > > - msm_dp_ctrl_config_msa(ctrl, > - ctrl->link->link_params.rate, > - pixel_rate_orig, > - ctrl->panel->msm_dp_mode.out_fmt_is_yuv_420); > + ret = msm_dp_ctrl_config_msa(ctrl, ctrl->link->link_params.rate, > + pixel_rate_orig, > + ctrl->panel->msm_dp_mode.out_fmt_is_yuv_420); > + if (ret) > + return ret; > > msm_dp_panel_clear_dsc_dto(ctrl->panel); > > > > Konrad ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] drm/msm/dp: Avoid division by zero in msm_dp_ctrl_config_msa() 2026-01-09 9:06 ` Konrad Dybcio 2026-01-10 22:53 ` Nathan Chancellor @ 2026-01-12 2:37 ` Dmitry Baryshkov 2026-01-13 20:59 ` Nathan Chancellor 1 sibling, 1 reply; 6+ messages in thread From: Dmitry Baryshkov @ 2026-01-12 2:37 UTC (permalink / raw) To: Konrad Dybcio Cc: Nathan Chancellor, Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang, Sean Paul, Marijn Suijten, linux-arm-msm, dri-devel, freedreno, llvm, patches, kernel test robot On Fri, Jan 09, 2026 at 10:06:29AM +0100, Konrad Dybcio wrote: > On 1/9/26 12:29 AM, Nathan Chancellor wrote: > > An (admittedly problematic) optimization change in LLVM 20 [1] turns > > known division by zero into the equivalent of __builtin_unreachable(), > > which invokes undefined behavior if it is encountered in a control flow > > graph, destroying code generation. When compile testing for x86_64, > > objtool flags an instance of this optimization triggering in > > msm_dp_ctrl_config_msa(), inlined into msm_dp_ctrl_on_stream(): > > > > drivers/gpu/drm/msm/msm.o: warning: objtool: msm_dp_ctrl_on_stream(): unexpected end of section .text.msm_dp_ctrl_on_stream > > > > The zero division happens if the else branch in the first if statement > > in msm_dp_ctrl_config_msa() is taken because pixel_div is initialized to > > zero and it is not possible for LLVM to eliminate the else branch since > > rate is still not known after inlining into msm_dp_ctrl_on_stream(). > > Change pixel_div to one to make the division well defined in the > > presence of an unsupported rate, relying on the DRM_ERROR print to > > indicate the error to the user. > > > > Fixes: c943b4948b58 ("drm/msm/dp: add displayPort driver support") > > Link: https://github.com/llvm/llvm-project/commit/37932643abab699e8bb1def08b7eb4eae7ff1448 [1] > > Reported-by: kernel test robot <lkp@intel.com> > > Closes: https://lore.kernel.org/oe-kbuild-all/202601081959.9UVJEOfP-lkp@intel.com/ > > Signed-off-by: Nathan Chancellor <nathan@kernel.org> > > --- > > drivers/gpu/drm/msm/dp/dp_ctrl.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_ctrl.c > > index cbcc7c2f0ffc..e4731c059ed8 100644 > > --- a/drivers/gpu/drm/msm/dp/dp_ctrl.c > > +++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c > > @@ -2395,7 +2395,7 @@ static void msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, > > bool is_ycbcr_420) > > { > > u32 pixel_m, pixel_n; > > - u32 mvid, nvid, pixel_div = 0, dispcc_input_rate; > > + u32 mvid, nvid, pixel_div = 1, dispcc_input_rate; > > u32 const nvid_fixed = DP_LINK_CONSTANT_N_VALUE; > > u32 const link_rate_hbr2 = 540000; > > u32 const link_rate_hbr3 = 810000; > > > > --- > > base-commit: 66691e272e40c91305f1704695e0cb340cd162ff > > change-id: 20260108-drm-msm-dp_ctrl-avoid-zero-div-be5dc40cbc18 > > Dmitry, would it be beneficial to throw an actual error when the rate is > is mangled? i.e. > > diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_ctrl.c > index aa2303d0e148..4f710b8e6bc6 100644 > --- a/drivers/gpu/drm/msm/dp/dp_ctrl.c > +++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c > @@ -2404,9 +2404,9 @@ static int msm_dp_ctrl_link_retrain(struct msm_dp_ctrl_private *ctrl) > return msm_dp_ctrl_setup_main_link(ctrl, &training_step); > } > > -static void msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, > - u32 rate, u32 stream_rate_khz, > - bool is_ycbcr_420) > +static int msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, > + u32 rate, u32 stream_rate_khz, > + bool is_ycbcr_420) > { > u32 pixel_m, pixel_n; > u32 mvid, nvid, pixel_div = 0, dispcc_input_rate; > @@ -2415,14 +2415,21 @@ static void msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, > u32 const link_rate_hbr3 = 810000; > unsigned long den, num; > > - if (rate == link_rate_hbr3) > + switch (rate) { > + case link_rate_hbr3: > pixel_div = 6; > - else if (rate == 162000 || rate == 270000) > - pixel_div = 2; > - else if (rate == link_rate_hbr2) > + break; > + case link_rate_hbr2: > pixel_div = 4; > - else > + break; > + case 270000: > + case 162000: > + pixel_div = 2; > + break; > + default: > DRM_ERROR("Invalid pixel mux divider\n"); > + return -EINVAL; Well... In the ideal world, we can't end up here, PHY's configure_dp_clocks (or qcom_edp_set_vco_div()) will fail if the link rate is is invalid here. I think, we should return an error here, but there is no need to propagate it further. See the discussion at https://lore.kernel.org/dri-devel/f2ce6ae51c50b0d2e57b905c63b43413@codeaurora.org/ > + } > > dispcc_input_rate = (rate * 10) / pixel_div; > > @@ -2458,6 +2465,8 @@ static void msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, > drm_dbg_dp(ctrl->drm_dev, "mvid=0x%x, nvid=0x%x\n", mvid, nvid); > msm_dp_write_link(ctrl, REG_DP_SOFTWARE_MVID, mvid); > msm_dp_write_link(ctrl, REG_DP_SOFTWARE_NVID, nvid); > + > + return 0; > } > > int msm_dp_ctrl_on_stream(struct msm_dp_ctrl *msm_dp_ctrl, bool force_link_train) > @@ -2525,10 +2534,11 @@ int msm_dp_ctrl_on_stream(struct msm_dp_ctrl *msm_dp_ctrl, bool force_link_train > > msm_dp_ctrl_configure_source_params(ctrl); > > - msm_dp_ctrl_config_msa(ctrl, > - ctrl->link->link_params.rate, > - pixel_rate_orig, > - ctrl->panel->msm_dp_mode.out_fmt_is_yuv_420); > + ret = msm_dp_ctrl_config_msa(ctrl, ctrl->link->link_params.rate, > + pixel_rate_orig, > + ctrl->panel->msm_dp_mode.out_fmt_is_yuv_420); > + if (ret) > + return ret; > > msm_dp_panel_clear_dsc_dto(ctrl->panel); > > > > Konrad -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] drm/msm/dp: Avoid division by zero in msm_dp_ctrl_config_msa() 2026-01-12 2:37 ` Dmitry Baryshkov @ 2026-01-13 20:59 ` Nathan Chancellor 2026-01-13 21:02 ` Dmitry Baryshkov 0 siblings, 1 reply; 6+ messages in thread From: Nathan Chancellor @ 2026-01-13 20:59 UTC (permalink / raw) To: Dmitry Baryshkov Cc: Konrad Dybcio, Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang, Sean Paul, Marijn Suijten, linux-arm-msm, dri-devel, freedreno, llvm, patches, kernel test robot On Mon, Jan 12, 2026 at 04:37:46AM +0200, Dmitry Baryshkov wrote: > On Fri, Jan 09, 2026 at 10:06:29AM +0100, Konrad Dybcio wrote: > > Dmitry, would it be beneficial to throw an actual error when the rate is > > is mangled? i.e. > > > > diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_ctrl.c > > index aa2303d0e148..4f710b8e6bc6 100644 > > --- a/drivers/gpu/drm/msm/dp/dp_ctrl.c > > +++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c > > @@ -2404,9 +2404,9 @@ static int msm_dp_ctrl_link_retrain(struct msm_dp_ctrl_private *ctrl) > > return msm_dp_ctrl_setup_main_link(ctrl, &training_step); > > } > > > > -static void msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, > > - u32 rate, u32 stream_rate_khz, > > - bool is_ycbcr_420) > > +static int msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, > > + u32 rate, u32 stream_rate_khz, > > + bool is_ycbcr_420) > > { > > u32 pixel_m, pixel_n; > > u32 mvid, nvid, pixel_div = 0, dispcc_input_rate; > > @@ -2415,14 +2415,21 @@ static void msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, > > u32 const link_rate_hbr3 = 810000; > > unsigned long den, num; > > > > - if (rate == link_rate_hbr3) > > + switch (rate) { > > + case link_rate_hbr3: > > pixel_div = 6; > > - else if (rate == 162000 || rate == 270000) > > - pixel_div = 2; > > - else if (rate == link_rate_hbr2) > > + break; > > + case link_rate_hbr2: > > pixel_div = 4; > > - else > > + break; > > + case 270000: > > + case 162000: > > + pixel_div = 2; > > + break; > > + default: > > DRM_ERROR("Invalid pixel mux divider\n"); > > + return -EINVAL; > > Well... In the ideal world, we can't end up here, PHY's > configure_dp_clocks (or qcom_edp_set_vco_div()) will fail if the link > rate is is invalid here. I think, we should return an error here, but > there is no need to propagate it further. > > See the discussion at https://lore.kernel.org/dri-devel/f2ce6ae51c50b0d2e57b905c63b43413@codeaurora.org/ I interpret that as approving of the above hunk but omitting the hunk that modifies msm_dp_ctrl_on_stream(). In that case, what is the point of changing the return type of msm_dp_ctrl_config_msa()? Wouldn't the below diff have the same exact effect as a smaller change? I don't mind rolling this up as a v2. Cheers, Nathan diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_ctrl.c index aa2303d0e148..d8ea73b89f7c 100644 --- a/drivers/gpu/drm/msm/dp/dp_ctrl.c +++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c @@ -2409,20 +2409,27 @@ static void msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, bool is_ycbcr_420) { u32 pixel_m, pixel_n; - u32 mvid, nvid, pixel_div = 0, dispcc_input_rate; + u32 mvid, nvid, pixel_div, dispcc_input_rate; u32 const nvid_fixed = DP_LINK_CONSTANT_N_VALUE; u32 const link_rate_hbr2 = 540000; u32 const link_rate_hbr3 = 810000; unsigned long den, num; - if (rate == link_rate_hbr3) + switch (rate) { + case link_rate_hbr3: pixel_div = 6; - else if (rate == 162000 || rate == 270000) - pixel_div = 2; - else if (rate == link_rate_hbr2) + break; + case link_rate_hbr2: pixel_div = 4; - else + break; + case 162000: + case 270000: + pixel_div = 2; + break; + default: DRM_ERROR("Invalid pixel mux divider\n"); + return; + } dispcc_input_rate = (rate * 10) / pixel_div; ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] drm/msm/dp: Avoid division by zero in msm_dp_ctrl_config_msa() 2026-01-13 20:59 ` Nathan Chancellor @ 2026-01-13 21:02 ` Dmitry Baryshkov 0 siblings, 0 replies; 6+ messages in thread From: Dmitry Baryshkov @ 2026-01-13 21:02 UTC (permalink / raw) To: Nathan Chancellor Cc: Konrad Dybcio, Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang, Sean Paul, Marijn Suijten, linux-arm-msm, dri-devel, freedreno, llvm, patches, kernel test robot On 13/01/2026 22:59, Nathan Chancellor wrote: > On Mon, Jan 12, 2026 at 04:37:46AM +0200, Dmitry Baryshkov wrote: >> On Fri, Jan 09, 2026 at 10:06:29AM +0100, Konrad Dybcio wrote: >>> Dmitry, would it be beneficial to throw an actual error when the rate is >>> is mangled? i.e. >>> >>> diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_ctrl.c >>> index aa2303d0e148..4f710b8e6bc6 100644 >>> --- a/drivers/gpu/drm/msm/dp/dp_ctrl.c >>> +++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c >>> @@ -2404,9 +2404,9 @@ static int msm_dp_ctrl_link_retrain(struct msm_dp_ctrl_private *ctrl) >>> return msm_dp_ctrl_setup_main_link(ctrl, &training_step); >>> } >>> >>> -static void msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, >>> - u32 rate, u32 stream_rate_khz, >>> - bool is_ycbcr_420) >>> +static int msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, >>> + u32 rate, u32 stream_rate_khz, >>> + bool is_ycbcr_420) >>> { >>> u32 pixel_m, pixel_n; >>> u32 mvid, nvid, pixel_div = 0, dispcc_input_rate; >>> @@ -2415,14 +2415,21 @@ static void msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, >>> u32 const link_rate_hbr3 = 810000; >>> unsigned long den, num; >>> >>> - if (rate == link_rate_hbr3) >>> + switch (rate) { >>> + case link_rate_hbr3: >>> pixel_div = 6; >>> - else if (rate == 162000 || rate == 270000) >>> - pixel_div = 2; >>> - else if (rate == link_rate_hbr2) >>> + break; >>> + case link_rate_hbr2: >>> pixel_div = 4; >>> - else >>> + break; >>> + case 270000: >>> + case 162000: >>> + pixel_div = 2; >>> + break; >>> + default: >>> DRM_ERROR("Invalid pixel mux divider\n"); >>> + return -EINVAL; >> >> Well... In the ideal world, we can't end up here, PHY's >> configure_dp_clocks (or qcom_edp_set_vco_div()) will fail if the link >> rate is is invalid here. I think, we should return an error here, but >> there is no need to propagate it further. >> >> See the discussion at https://lore.kernel.org/dri-devel/f2ce6ae51c50b0d2e57b905c63b43413@codeaurora.org/ > > I interpret that as approving of the above hunk but omitting the hunk > that modifies msm_dp_ctrl_on_stream(). In that case, what is the point > of changing the return type of msm_dp_ctrl_config_msa()? Wouldn't the > below diff have the same exact effect as a smaller change? I don't mind > rolling this up as a v2. > > Cheers, > Nathan > > diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_ctrl.c > index aa2303d0e148..d8ea73b89f7c 100644 > --- a/drivers/gpu/drm/msm/dp/dp_ctrl.c > +++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c > @@ -2409,20 +2409,27 @@ static void msm_dp_ctrl_config_msa(struct msm_dp_ctrl_private *ctrl, > bool is_ycbcr_420) > { > u32 pixel_m, pixel_n; > - u32 mvid, nvid, pixel_div = 0, dispcc_input_rate; > + u32 mvid, nvid, pixel_div, dispcc_input_rate; > u32 const nvid_fixed = DP_LINK_CONSTANT_N_VALUE; > u32 const link_rate_hbr2 = 540000; > u32 const link_rate_hbr3 = 810000; > unsigned long den, num; > > - if (rate == link_rate_hbr3) > + switch (rate) { > + case link_rate_hbr3: > pixel_div = 6; > - else if (rate == 162000 || rate == 270000) > - pixel_div = 2; > - else if (rate == link_rate_hbr2) > + break; > + case link_rate_hbr2: > pixel_div = 4; > - else > + break; > + case 162000: > + case 270000: > + pixel_div = 2; > + break; > + default: > DRM_ERROR("Invalid pixel mux divider\n"); > + return; Please add a comment, stating that we can't actually reach it. LGTM otherwise. > + } > > dispcc_input_rate = (rate * 10) / pixel_div; > -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-01-13 21:02 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-01-08 23:29 [PATCH] drm/msm/dp: Avoid division by zero in msm_dp_ctrl_config_msa() Nathan Chancellor 2026-01-09 9:06 ` Konrad Dybcio 2026-01-10 22:53 ` Nathan Chancellor 2026-01-12 2:37 ` Dmitry Baryshkov 2026-01-13 20:59 ` Nathan Chancellor 2026-01-13 21:02 ` Dmitry Baryshkov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox