--- a/sys/dev/drm/radeon/rv6xx_dpm.c +++ b/sys/dev/drm/radeon/rv6xx_dpm.c @@ -534,10 +534,19 @@ static inline u32 rv6xx_calculate_vco_frequency(u32 ref_clock, static inline u32 rv6xx_calculate_spread_spectrum_clk_v(u32 vco_freq, u32 ref_freq, u32 ss_rate, u32 ss_percent, u32 fb_divider_scale) { - u32 fb_divider = vco_freq / ref_freq; + u32 denom, fb_divider; + + if (ref_freq == 0) + return 0; + + fb_divider = vco_freq / ref_freq; - return (ss_percent * ss_rate * 4 * (fb_divider * fb_divider) / - (5375 * ((vco_freq * 10) / (4096 >> fb_divider_scale)))); + denom = 5375 * ((vco_freq * 10) / (4096 >> fb_divider_scale)); + if (denom == 0) + return 0; + + return (ss_percent * ss_rate * 4 * (fb_divider * fb_divider) / denom); } # NOTE: authored against the read-only sys/ tree after verification; never applied there.