]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/i915/snps_hdmi_pll: Fix 64-bit divisor truncation by using div64_u64
authorAnkit Nautiyal <ankit.k.nautiyal@intel.com>
Wed, 18 Jun 2025 13:09:50 +0000 (18:39 +0530)
committerJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Mon, 23 Jun 2025 11:59:55 +0000 (14:59 +0300)
DIV_ROUND_CLOSEST_ULL uses do_div(), which expects a 32-bit divisor.
When passing a 64-bit constant like CURVE2_MULTIPLIER, the value is
silently truncated to u32, potentially leading to incorrect results
on large divisors.

Replace DIV_ROUND_CLOSEST_ULL with DIV64_U64_ROUND_CLOSEST which correctly
handles full 64-bit division.

v2: Use DIV64_U64_ROUND_CLOSEST instead of div64_u64 macro. (Jani)

Fixes: 5947642004bf ("drm/i915/display: Add support for SNPS PHY HDMI PLL algorithm for DG2")
Reported-by: Vas Novikov <vasya.novikov@gmail.com>
Closes: https://lore.kernel.org/all/8d7c7958-9558-4c8a-a81a-e9310f2d8852@gmail.com/
Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Cc: Suraj Kandpal <suraj.kandpal@intel.com>
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Vas Novikov <vasya.novikov@gmail.com>
Cc: stable@vger.kernel.org # v6.15+
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Link: https://lore.kernel.org/r/20250618130951.1596587-2-ankit.k.nautiyal@intel.com
(cherry picked from commit b300a175a11e6a934d728317dc39787723cc7917)
Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
drivers/gpu/drm/i915/display/intel_snps_hdmi_pll.c

index 74bb3bedf30f5d6eee70a63ababb4f9e3ca72bcf..5111bdc3075b58cf0b64a1705d83a55ab88bf0d1 100644 (file)
@@ -103,8 +103,8 @@ static void get_ana_cp_int_prop(u64 vco_clk,
                            DIV_ROUND_DOWN_ULL(curve_1_interpolated, CURVE0_MULTIPLIER)));
 
        ana_cp_int_temp =
-               DIV_ROUND_CLOSEST_ULL(DIV_ROUND_DOWN_ULL(adjusted_vco_clk1, curve_2_scaled1),
-                                     CURVE2_MULTIPLIER);
+               DIV64_U64_ROUND_CLOSEST(DIV_ROUND_DOWN_ULL(adjusted_vco_clk1, curve_2_scaled1),
+                                       CURVE2_MULTIPLIER);
 
        *ana_cp_int = max(1, min(ana_cp_int_temp, 127));