DF-3612 / fix.diff
--- a/sys/dev/drm/radeon/si_dpm.c +++ b/sys/dev/drm/radeon/si_dpm.c @@ -4828,8 +4828,13 @@ if (radeon_atombios_get_asic_ss_info(rdev, &ss, ASIC_INTERNAL_ENGINE_SS, vco_freq)) { - u32 clk_s = reference_clock * 5 / (reference_divider * ss.rate); - u32 clk_v = 4 * ss.percentage * fbdiv / (clk_s * 10000); + u32 clk_s, clk_v; + + if (ss.rate == 0) + return -EINVAL; + clk_s = reference_clock * 5 / (reference_divider * ss.rate); + clk_v = 4 * ss.percentage * fbdiv / (clk_s * 10000); + cg_spll_spread_spectrum &= ~CLK_S_MASK; cg_spll_spread_spectrum |= CLK_S(clk_s); @@ -4928,8 +4933,13 @@ tmp = tmp * tmp; if (radeon_atombios_get_asic_ss_info(rdev, &ss, ASIC_INTERNAL_MEMORY_SS, freq_nom)) { - u32 clks = reference_clock * 5 / ss.rate; - u32 clkv = (u32)((((131 * ss.percentage * ss.rate) / 100) * tmp) / freq_nom); + u32 clks, clkv; + + if (ss.rate == 0) + return -EINVAL; + clks = reference_clock * 5 / ss.rate; + clkv = (u32)((((131 * ss.percentage * ss.rate) / 100) * tmp) / freq_nom); + mpll_ss1 &= ~CLKV_MASK; mpll_ss1 |= CLKV(clkv); |