⬢ DragonFlyBSD Kernel Audit
DF-4931 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/radeon/rv740_dpm.c
+++ b/sys/dev/drm/radeon/rv740_dpm.c
@@ -163,14 +163,15 @@
 		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);
+			u64 clk_v = 4ULL * ss.percentage * fbdiv /
+				((u64)clk_s * 10000);
 
 			cg_spll_spread_spectrum &= ~CLK_S_MASK;
 			cg_spll_spread_spectrum |= CLK_S(clk_s);
 			cg_spll_spread_spectrum |= SSEN;
 
 			cg_spll_spread_spectrum_2 &= ~CLK_V_MASK;
-			cg_spll_spread_spectrum_2 |= CLK_V(clk_v);
+			cg_spll_spread_spectrum_2 |= CLK_V((u32)clk_v) & CLK_V_MASK;
 		}
 	}
 
@@ -256,11 +257,12 @@
 			if (!decoded_ref)
 				return -EINVAL;
 			clk_s = reference_clock * 5 / (decoded_ref * ss.rate);
-			clk_v = 0x40000 * ss.percentage *
-				(dividers.whole_fb_div + (dividers.frac_fb_div / 8)) / (clk_s * 10000);
+			clk_v = (u32)(0x40000ULL * ss.percentage *
+				(dividers.whole_fb_div + (dividers.frac_fb_div / 8)) /
+				((u64)clk_s * 10000));
 
 			mpll_ss1 &= ~CLKV_MASK;
-			mpll_ss1 |= CLKV(clk_v);
+			mpll_ss1 |= CLKV(clk_v) & CLKV_MASK;
 
 			mpll_ss2 &= ~CLKS_MASK;
 			mpll_ss2 |= CLKS(clk_s);