mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
phy: rockchip: samsung-hdptx: Prevent divide-by-zero when computing clk rate
Calculating 'sdm' fraction in rk_hdptx_phy_clk_calc_rate_from_pll_cfg()
could trigger a divide-by-zero, as it uses div_u64() with a denominator
read directly from hardware: the values ropll_hw.sdm_deno,
ropll_hw.sdc_deno, ropll_hw.sdc_n, and ropll_hw.sdc_num are populated
from PLL registers which, in theory, could be left by the bootloader
uninitialized/misconfigured.
Provide the necessary sanitization to avoid trusting the hardware state.
Reported-by: Sashiko <sashiko-bot@kernel.org>
Closes: https://sashiko.dev/#/patchset/20260611-hdptx-clk-fixes-v3-0-67b1b0c00e16@collabora.com?part=1
Fixes: 3481fc04d9 ("phy: rockchip: samsung-hdptx: Compute clk rate from PLL config")
Tested-by: Diederik de Haas <diederik@cknow-tech.com> # NanoPC-T6 LTS
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Reviewed-by: Andy Yan <andy.yan@rock-chips.com>
Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
Link: https://patch.msgid.link/20260811-hdptx-clk-fixes-v6-2-75bca0ee5753@collabora.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
f0c2c9c58a
commit
c4fe5a9f37
|
|
@ -2270,10 +2270,20 @@ static u64 rk_hdptx_phy_clk_calc_rate_from_pll_cfg(struct rk_hdptx_phy *hdptx)
|
|||
|
||||
fout = PLL_REF_CLK * ropll_hw.pms_mdiv;
|
||||
if (ropll_hw.sdm_en) {
|
||||
val = 16U * ropll_hw.sdm_deno *
|
||||
(ropll_hw.sdc_deno * ropll_hw.sdc_n - ropll_hw.sdc_num);
|
||||
if (!val) {
|
||||
/*
|
||||
* The PLL config currently stored in hardware can't be
|
||||
* translated into a rate. The next .set_rate() should
|
||||
* program a valid configuration and help with recovery.
|
||||
*/
|
||||
dev_dbg(hdptx->dev, "Invalid ROPLL hw state: deno == 0\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
sdm = div_u64(PLL_REF_CLK * ropll_hw.sdc_deno *
|
||||
ropll_hw.pms_mdiv * ropll_hw.sdm_num,
|
||||
16 * ropll_hw.sdm_deno *
|
||||
(ropll_hw.sdc_deno * ropll_hw.sdc_n - ropll_hw.sdc_num));
|
||||
ropll_hw.pms_mdiv * ropll_hw.sdm_num, val);
|
||||
|
||||
if (ropll_hw.sdm_num_sign)
|
||||
fout = fout - sdm;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user