* [PATCH] drm/amd/display: avoid 64-bit division
@ 2026-06-19 8:23 Arnd Bergmann
2026-06-19 8:30 ` sashiko-bot
2026-06-19 15:21 ` David Laight
0 siblings, 2 replies; 11+ messages in thread
From: Arnd Bergmann @ 2026-06-19 8:23 UTC (permalink / raw)
To: Harry Wentland, Leo Li, Alex Deucher, Christian König,
David Airlie, Simona Vetter, Ovidiu Bunea, Ray Wu, Leo Chen
Cc: Arnd Bergmann, Rodrigo Siqueira, Gaghik Khachatrian,
Dillon Varone, Chuanyu Tseng, Linus Probert, Kees Cook, amd-gfx,
dri-devel, linux-kernel
From: Arnd Bergmann <arnd@arndb.de>
64-bit division is costly on 32-bit targets and should be avoided:
x86_64-linux-ld: drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.o: in function `get_dp_dto_frequency_100hz':
dce_clock_source.c:(.text+0x407): undefined reference to `__udivdi3'
x86_64-linux-ld: drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.o: in function `dcn401_get_dp_dto_frequency_100hz':
dce_clock_source.c:(.text+0x8b8): undefined reference to `__udivdi3'
Replace the open-coded division with a div_u64() call where necessary.
This could be done in a more clever way using mul_u64_u32_shr()
or similar, but since this is called rarely, use the most readable
variant that works.
Fixes: 6f6483dbfacd ("drm/amd/display: Update get_pixel_clk_frequency() for DCN4x DCCG DP DTO")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c b/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c
index 7c293917e6fd..501ab1a3bac2 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c
@@ -1229,9 +1229,9 @@ static bool get_dp_dto_frequency_100hz(
*/
modulo_hz = REG_READ(MODULO[inst]);
if (modulo_hz) {
- temp = div_u64((uint64_t)clock_hz * dp_dto_ref_khz * 10, modulo_hz);
- ASSERT(temp / 100 <= 0xFFFFFFFFUL);
- *pixel_clk_100hz = (unsigned int)(temp / 100);
+ temp = clock_hz * dp_dto_ref_khz * 10;
+ ASSERT(temp <= INT_MAX * modulo_hz * 100);
+ *pixel_clk_100hz = div_u64(temp, modulo_hz * 100);
} else
*pixel_clk_100hz = 0;
} else {
@@ -1286,12 +1286,12 @@ static bool dcn401_get_dp_dto_frequency_100hz(const struct clock_source *clock_s
*/
temp = (unsigned long long)dp_dto_integer * modulo_hz + phase_hz;
- if (temp / 100 > 0xFFFFFFFFUL) {
+ if (temp > (UINT_MAX * 100ULL)) {
/* pixel rate 100hz should never be this high, if it is, throw an assert and return 0 */
BREAK_TO_DEBUGGER();
*pixel_clk_100hz = 0;
} else {
- *pixel_clk_100hz = (unsigned int)(temp / 100);
+ *pixel_clk_100hz = div_u64(temp, 100);
}
return true;
--
2.39.5
^ permalink raw reply related [flat|nested] 11+ messages in thread* Re: [PATCH] drm/amd/display: avoid 64-bit division 2026-06-19 8:23 [PATCH] drm/amd/display: avoid 64-bit division Arnd Bergmann @ 2026-06-19 8:30 ` sashiko-bot 2026-06-19 15:21 ` David Laight 1 sibling, 0 replies; 11+ messages in thread From: sashiko-bot @ 2026-06-19 8:30 UTC (permalink / raw) To: Arnd Bergmann; +Cc: dri-devel Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider: - [High] Missing 64-bit cast leads to 32-bit multiplication overflow in numerator calculation. - [High] 32-bit overflow in `modulo_hz * 100` causes incorrect divisor and potential divide-by-zero. - [Medium] `ASSERT` logic is broken due to 32-bit integer overflow. -- commit 9cda336bf5ea701c3d123b38512793b3554f5c3b Author: Arnd Bergmann <arnd@arndb.de> drm/amd/display: avoid 64-bit division This commit avoids 64-bit division on 32-bit targets in DCE clock source calculations by replacing open-coded division with div_u64(). > diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c b/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c > index 83dcfae6c3c0d..ed9a6733d3457 100644 > --- a/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c > +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c > @@ -1229,9 +1229,9 @@ static bool get_dp_dto_frequency_100hz( > */ > modulo_hz = REG_READ(MODULO[inst]); > if (modulo_hz) { > - temp = div_u64((uint64_t)clock_hz * dp_dto_ref_khz * 10, modulo_hz); > - ASSERT(temp / 100 <= 0xFFFFFFFFUL); > - *pixel_clk_100hz = (unsigned int)(temp / 100); > + temp = clock_hz * dp_dto_ref_khz * 10; [Severity: High] Does this drop a required 64-bit cast, leading to a 32-bit multiplication overflow? Both clock_hz and dp_dto_ref_khz are 32-bit unsigned integers representing frequencies. dp_dto_ref_khz is typically around 600,000 (600 MHz in kHz), and clock_hz can also be extremely large. Their product easily exceeds the 32-bit maximum. Without the (uint64_t) cast that was present in the original code, the multiplication is performed entirely using 32-bit arithmetic. The result overflows, wraps around, and is then implicitly cast to the 64-bit temp variable, resulting in an incorrect numerator. > + ASSERT(temp <= INT_MAX * modulo_hz * 100); [Severity: Medium] Can this expression overflow 32-bit integer limits and break the assertion logic? The expression INT_MAX * modulo_hz * 100 is evaluated using 32-bit integer arithmetic. Since INT_MAX is already nearly half of the maximum 32-bit unsigned value, multiplying it by 100 and any typical modulo_hz frequency will overflow 32-bit limits multiple times, producing an arbitrary wrapped value. The 64-bit temp is then compared against this 32-bit value. > + *pixel_clk_100hz = div_u64(temp, modulo_hz * 100); [Severity: High] Does modulo_hz * 100 overflow, resulting in an incorrect divisor or a potential divide-by-zero? modulo_hz is a 32-bit unsigned integer representing a clock frequency (often around 600 MHz). Multiplying it by 100 evaluates as a 32-bit operation, which exceeds UINT_MAX and wraps around. The div_u64() function expects a u32 divisor, so it uses this truncated, wrapped value instead of the intended divisor. If modulo_hz happens to be exactly 1073741824 (about 1.07 GHz), modulo_hz * 100 wraps to exactly 0, which would trigger a divide-by-zero kernel panic in div_u64(). -- Sashiko AI review · https://sashiko.dev/#/patchset/20260619082313.3583603-1-arnd@kernel.org?part=1 ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] drm/amd/display: avoid 64-bit division 2026-06-19 8:23 [PATCH] drm/amd/display: avoid 64-bit division Arnd Bergmann 2026-06-19 8:30 ` sashiko-bot @ 2026-06-19 15:21 ` David Laight 1 sibling, 0 replies; 11+ messages in thread From: David Laight @ 2026-06-19 15:21 UTC (permalink / raw) To: Arnd Bergmann Cc: Harry Wentland, Leo Li, Alex Deucher, Christian König, David Airlie, Simona Vetter, Ovidiu Bunea, Ray Wu, Leo Chen, Arnd Bergmann, Rodrigo Siqueira, Gaghik Khachatrian, Dillon Varone, Chuanyu Tseng, Linus Probert, Kees Cook, amd-gfx, dri-devel, linux-kernel On Fri, 19 Jun 2026 10:23:00 +0200 Arnd Bergmann <arnd@kernel.org> wrote: > From: Arnd Bergmann <arnd@arndb.de> > > 64-bit division is costly on 32-bit targets and should be avoided: > > x86_64-linux-ld: drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.o: in function `get_dp_dto_frequency_100hz': > dce_clock_source.c:(.text+0x407): undefined reference to `__udivdi3' > x86_64-linux-ld: drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.o: in function `dcn401_get_dp_dto_frequency_100hz': > dce_clock_source.c:(.text+0x8b8): undefined reference to `__udivdi3' > > Replace the open-coded division with a div_u64() call where necessary. > This could be done in a more clever way using mul_u64_u32_shr() > or similar, but since this is called rarely, use the most readable > variant that works. > > Fixes: 6f6483dbfacd ("drm/amd/display: Update get_pixel_clk_frequency() for DCN4x DCCG DP DTO") > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > --- > drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c | 10 +++++----- > 1 file changed, 5 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c b/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c > index 7c293917e6fd..501ab1a3bac2 100644 > --- a/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c > +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c > @@ -1229,9 +1229,9 @@ static bool get_dp_dto_frequency_100hz( > */ > modulo_hz = REG_READ(MODULO[inst]); > if (modulo_hz) { > - temp = div_u64((uint64_t)clock_hz * dp_dto_ref_khz * 10, modulo_hz); > - ASSERT(temp / 100 <= 0xFFFFFFFFUL); > - *pixel_clk_100hz = (unsigned int)(temp / 100); > + temp = clock_hz * dp_dto_ref_khz * 10; > + ASSERT(temp <= INT_MAX * modulo_hz * 100); Doesn't that need something to force the RHS to 64bit? (or has modulo_hz been changed in a patch I'm not seeing?) David > + *pixel_clk_100hz = div_u64(temp, modulo_hz * 100); > } else > *pixel_clk_100hz = 0; > } else { > @@ -1286,12 +1286,12 @@ static bool dcn401_get_dp_dto_frequency_100hz(const struct clock_source *clock_s > */ > temp = (unsigned long long)dp_dto_integer * modulo_hz + phase_hz; > > - if (temp / 100 > 0xFFFFFFFFUL) { > + if (temp > (UINT_MAX * 100ULL)) { > /* pixel rate 100hz should never be this high, if it is, throw an assert and return 0 */ > BREAK_TO_DEBUGGER(); > *pixel_clk_100hz = 0; > } else { > - *pixel_clk_100hz = (unsigned int)(temp / 100); > + *pixel_clk_100hz = div_u64(temp, 100); > } > > return true; ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH] drm/amd/display: avoid 64-bit division
@ 2019-07-08 13:52 ` Arnd Bergmann
0 siblings, 0 replies; 11+ messages in thread
From: Arnd Bergmann @ 2019-07-08 13:52 UTC (permalink / raw)
To: Harry Wentland, Leo Li, Alex Deucher, Christian König,
David (ChunMing) Zhou, David Airlie, Daniel Vetter
Cc: Charlene Liu, Chris Park, Arnd Bergmann, Tony Cheng,
David Francis, linux-kernel, amd-gfx, Nikola Cornij,
Dmytro Laktyushkin, dri-devel, Jun Lei, Bhawanpreet Lakha,
Anthony Koo
On 32-bit architectures, dividing a 64-bit integer in the kernel
leads to a link error:
ERROR: "__udivdi3" [drivers/gpu/drm/amd/amdgpu/amdgpu.ko] undefined!
ERROR: "__divdi3" [drivers/gpu/drm/amd/amdgpu/amdgpu.ko] undefined!
Change the two recently introduced instances to a multiply+shift
operation that is also much cheaper on 32-bit architectures.
We can do that here, since both of them are really 32-bit numbers
that change a few percent.
Fixes: bedbbe6af4be ("drm/amd/display: Move link functions from dc to dc_link")
Fixes: f18bc4e53ad6 ("drm/amd/display: update calculated bounding box logic for NV")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
drivers/gpu/drm/amd/display/dc/core/dc_link.c | 4 ++--
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
index c17db5c144aa..8dbf759eba45 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
@@ -3072,8 +3072,8 @@ uint32_t dc_link_bandwidth_kbps(
* but the difference is minimal and is in a safe direction,
* which all works well around potential ambiguity of DP 1.4a spec.
*/
- long long fec_link_bw_kbps = link_bw_kbps * 970LL;
- link_bw_kbps = (uint32_t)(fec_link_bw_kbps / 1000LL);
+ link_bw_kbps = mul_u64_u32_shr(BIT_ULL(32) * 970LL / 1000,
+ link_bw_kbps, 32);
}
#endif
diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
index b35327bafbc5..70ac8a95d2db 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
@@ -2657,7 +2657,7 @@ static void update_bounding_box(struct dc *dc, struct _vcs_dpi_soc_bounding_box_
calculated_states[i].dram_speed_mts = uclk_states[i] * 16 / 1000;
// FCLK:UCLK ratio is 1.08
- min_fclk_required_by_uclk = ((unsigned long long)uclk_states[i]) * 1080 / 1000000;
+ min_fclk_required_by_uclk = mul_u64_u32_shr(BIT_ULL(32) * 1080 / 1000000, uclk_states[i], 32);
calculated_states[i].fabricclk_mhz = (min_fclk_required_by_uclk < min_dcfclk) ?
min_dcfclk : min_fclk_required_by_uclk;
--
2.20.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH] drm/amd/display: avoid 64-bit division @ 2019-07-08 13:52 ` Arnd Bergmann 0 siblings, 0 replies; 11+ messages in thread From: Arnd Bergmann @ 2019-07-08 13:52 UTC (permalink / raw) To: Harry Wentland, Leo Li, Alex Deucher, Christian König, David (ChunMing) Zhou, David Airlie, Daniel Vetter Cc: Arnd Bergmann, Chris Park, Charlene Liu, Jun Lei, Tony Cheng, Bhawanpreet Lakha, Tony Cheng, Anthony Koo, David Francis, Dmytro Laktyushkin, Nikola Cornij, amd-gfx, dri-devel, linux-kernel On 32-bit architectures, dividing a 64-bit integer in the kernel leads to a link error: ERROR: "__udivdi3" [drivers/gpu/drm/amd/amdgpu/amdgpu.ko] undefined! ERROR: "__divdi3" [drivers/gpu/drm/amd/amdgpu/amdgpu.ko] undefined! Change the two recently introduced instances to a multiply+shift operation that is also much cheaper on 32-bit architectures. We can do that here, since both of them are really 32-bit numbers that change a few percent. Fixes: bedbbe6af4be ("drm/amd/display: Move link functions from dc to dc_link") Fixes: f18bc4e53ad6 ("drm/amd/display: update calculated bounding box logic for NV") Signed-off-by: Arnd Bergmann <arnd@arndb.de> --- drivers/gpu/drm/amd/display/dc/core/dc_link.c | 4 ++-- drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c index c17db5c144aa..8dbf759eba45 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c @@ -3072,8 +3072,8 @@ uint32_t dc_link_bandwidth_kbps( * but the difference is minimal and is in a safe direction, * which all works well around potential ambiguity of DP 1.4a spec. */ - long long fec_link_bw_kbps = link_bw_kbps * 970LL; - link_bw_kbps = (uint32_t)(fec_link_bw_kbps / 1000LL); + link_bw_kbps = mul_u64_u32_shr(BIT_ULL(32) * 970LL / 1000, + link_bw_kbps, 32); } #endif diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c index b35327bafbc5..70ac8a95d2db 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c @@ -2657,7 +2657,7 @@ static void update_bounding_box(struct dc *dc, struct _vcs_dpi_soc_bounding_box_ calculated_states[i].dram_speed_mts = uclk_states[i] * 16 / 1000; // FCLK:UCLK ratio is 1.08 - min_fclk_required_by_uclk = ((unsigned long long)uclk_states[i]) * 1080 / 1000000; + min_fclk_required_by_uclk = mul_u64_u32_shr(BIT_ULL(32) * 1080 / 1000000, uclk_states[i], 32); calculated_states[i].fabricclk_mhz = (min_fclk_required_by_uclk < min_dcfclk) ? min_dcfclk : min_fclk_required_by_uclk; -- 2.20.0 ^ permalink raw reply related [flat|nested] 11+ messages in thread
[parent not found: <20190708135238.651483-1-arnd-r2nGTMty4D4@public.gmane.org>]
* Re: [PATCH] drm/amd/display: avoid 64-bit division [not found] ` <20190708135238.651483-1-arnd-r2nGTMty4D4@public.gmane.org> @ 2019-07-08 14:16 ` Kazlauskas, Nicholas 0 siblings, 0 replies; 11+ messages in thread From: Kazlauskas, Nicholas @ 2019-07-08 14:16 UTC (permalink / raw) To: Arnd Bergmann Cc: Li, Sun peng (Leo), Wentland, Harry, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, Deucher, Alexander, Lakha, Bhawanpreet On 7/8/19 9:52 AM, Arnd Bergmann wrote: > On 32-bit architectures, dividing a 64-bit integer in the kernel > leads to a link error: > > ERROR: "__udivdi3" [drivers/gpu/drm/amd/amdgpu/amdgpu.ko] undefined! > ERROR: "__divdi3" [drivers/gpu/drm/amd/amdgpu/amdgpu.ko] undefined! > > Change the two recently introduced instances to a multiply+shift > operation that is also much cheaper on 32-bit architectures. > We can do that here, since both of them are really 32-bit numbers > that change a few percent. > > Fixes: bedbbe6af4be ("drm/amd/display: Move link functions from dc to dc_link") > Fixes: f18bc4e53ad6 ("drm/amd/display: update calculated bounding box logic for NV") > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > --- > drivers/gpu/drm/amd/display/dc/core/dc_link.c | 4 ++-- > drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c | 2 +- > 2 files changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c > index c17db5c144aa..8dbf759eba45 100644 > --- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c > +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c > @@ -3072,8 +3072,8 @@ uint32_t dc_link_bandwidth_kbps( > * but the difference is minimal and is in a safe direction, > * which all works well around potential ambiguity of DP 1.4a spec. > */ > - long long fec_link_bw_kbps = link_bw_kbps * 970LL; > - link_bw_kbps = (uint32_t)(fec_link_bw_kbps / 1000LL); > + link_bw_kbps = mul_u64_u32_shr(BIT_ULL(32) * 970LL / 1000, > + link_bw_kbps, 32); > } > #endif > > diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c > index b35327bafbc5..70ac8a95d2db 100644 > --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c > +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c > @@ -2657,7 +2657,7 @@ static void update_bounding_box(struct dc *dc, struct _vcs_dpi_soc_bounding_box_ > calculated_states[i].dram_speed_mts = uclk_states[i] * 16 / 1000; > > // FCLK:UCLK ratio is 1.08 > - min_fclk_required_by_uclk = ((unsigned long long)uclk_states[i]) * 1080 / 1000000; > + min_fclk_required_by_uclk = mul_u64_u32_shr(BIT_ULL(32) * 1080 / 1000000, uclk_states[i], 32); Even though the mul + shift will be faster here, I would prefer that this just be a div_u64 for clarity. Nicholas Kazlauskas > > calculated_states[i].fabricclk_mhz = (min_fclk_required_by_uclk < min_dcfclk) ? > min_dcfclk : min_fclk_required_by_uclk; > _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] drm/amd/display: avoid 64-bit division 2019-07-08 13:52 ` Arnd Bergmann (?) (?) @ 2019-07-08 18:20 ` Abramov, Slava -1 siblings, 0 replies; 11+ messages in thread From: Abramov, Slava @ 2019-07-08 18:20 UTC (permalink / raw) To: Arnd Bergmann, Wentland, Harry, Li, Sun peng (Leo), Deucher, Alexander, Koenig, Christian, Zhou, David(ChunMing), David Airlie, Daniel Vetter Cc: Liu, Charlene, Park, Chris, Lakha, Bhawanpreet, Francis, David, linux-kernel@vger.kernel.org, amd-gfx@lists.freedesktop.org, Cornij, Nikola, Laktyushkin, Dmytro, dri-devel@lists.freedesktop.org, Lei, Jun, Cheng, Tony, Koo, Anthony [-- Attachment #1.1: Type: text/plain, Size: 3456 bytes --] Acked-by: Slava Abramov <slava.abramov@amd.com> Tested-by: Slava Abramov <slava.abramov@amd.com> ________________________________ From: amd-gfx <amd-gfx-bounces@lists.freedesktop.org> on behalf of Arnd Bergmann <arnd@arndb.de> Sent: Monday, July 8, 2019 9:52:08 AM To: Wentland, Harry; Li, Sun peng (Leo); Deucher, Alexander; Koenig, Christian; Zhou, David(ChunMing); David Airlie; Daniel Vetter Cc: Liu, Charlene; Park, Chris; Arnd Bergmann; Cheng, Tony; Francis, David; linux-kernel@vger.kernel.org; amd-gfx@lists.freedesktop.org; Cornij, Nikola; Laktyushkin, Dmytro; dri-devel@lists.freedesktop.org; Lei, Jun; Lakha, Bhawanpreet; Koo, Anthony Subject: [PATCH] drm/amd/display: avoid 64-bit division On 32-bit architectures, dividing a 64-bit integer in the kernel leads to a link error: ERROR: "__udivdi3" [drivers/gpu/drm/amd/amdgpu/amdgpu.ko] undefined! ERROR: "__divdi3" [drivers/gpu/drm/amd/amdgpu/amdgpu.ko] undefined! Change the two recently introduced instances to a multiply+shift operation that is also much cheaper on 32-bit architectures. We can do that here, since both of them are really 32-bit numbers that change a few percent. Fixes: bedbbe6af4be ("drm/amd/display: Move link functions from dc to dc_link") Fixes: f18bc4e53ad6 ("drm/amd/display: update calculated bounding box logic for NV") Signed-off-by: Arnd Bergmann <arnd@arndb.de> --- drivers/gpu/drm/amd/display/dc/core/dc_link.c | 4 ++-- drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c index c17db5c144aa..8dbf759eba45 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c @@ -3072,8 +3072,8 @@ uint32_t dc_link_bandwidth_kbps( * but the difference is minimal and is in a safe direction, * which all works well around potential ambiguity of DP 1.4a spec. */ - long long fec_link_bw_kbps = link_bw_kbps * 970LL; - link_bw_kbps = (uint32_t)(fec_link_bw_kbps / 1000LL); + link_bw_kbps = mul_u64_u32_shr(BIT_ULL(32) * 970LL / 1000, + link_bw_kbps, 32); } #endif diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c index b35327bafbc5..70ac8a95d2db 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c @@ -2657,7 +2657,7 @@ static void update_bounding_box(struct dc *dc, struct _vcs_dpi_soc_bounding_box_ calculated_states[i].dram_speed_mts = uclk_states[i] * 16 / 1000; // FCLK:UCLK ratio is 1.08 - min_fclk_required_by_uclk = ((unsigned long long)uclk_states[i]) * 1080 / 1000000; + min_fclk_required_by_uclk = mul_u64_u32_shr(BIT_ULL(32) * 1080 / 1000000, uclk_states[i], 32); calculated_states[i].fabricclk_mhz = (min_fclk_required_by_uclk < min_dcfclk) ? min_dcfclk : min_fclk_required_by_uclk; -- 2.20.0 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx [-- Attachment #1.2: Type: text/html, Size: 6005 bytes --] [-- Attachment #2: Type: text/plain, Size: 159 bytes --] _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH] drm/amd/display: avoid 64-bit division 2019-07-08 13:52 ` Arnd Bergmann ` (2 preceding siblings ...) (?) @ 2019-07-09 16:31 ` Abramov, Slava [not found] ` <DM6PR12MB320967C48957C4F2F0E92438FEF10-lmeGfMZKVrEA9tGwT7oCEgdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org> -1 siblings, 1 reply; 11+ messages in thread From: Abramov, Slava @ 2019-07-09 16:31 UTC (permalink / raw) To: Arnd Bergmann, Wentland, Harry, Li, Sun peng (Leo), Deucher, Alexander, Koenig, Christian, Zhou, David(ChunMing), David Airlie, Daniel Vetter Cc: Liu, Charlene, Park, Chris, Lakha, Bhawanpreet, Francis, David, linux-kernel@vger.kernel.org, amd-gfx@lists.freedesktop.org, Cornij, Nikola, Laktyushkin, Dmytro, dri-devel@lists.freedesktop.org, Lei, Jun, Cheng, Tony, Koo, Anthony [-- Attachment #1.1: Type: text/plain, Size: 3720 bytes --] Hi Arnd! Thanks for bisecting this issue. I wonder whether you are going to commit your patch or planning to update it and it's still in your work queue. We have one of our 32-bit builds failing because of this issue, so that I would like either to fix it or wait to your fix if it has chances to go upstream today. Sincerely, Slava Abramov ________________________________ From: amd-gfx <amd-gfx-bounces@lists.freedesktop.org> on behalf of Arnd Bergmann <arnd@arndb.de> Sent: Monday, July 8, 2019 9:52:08 AM To: Wentland, Harry; Li, Sun peng (Leo); Deucher, Alexander; Koenig, Christian; Zhou, David(ChunMing); David Airlie; Daniel Vetter Cc: Liu, Charlene; Park, Chris; Arnd Bergmann; Cheng, Tony; Francis, David; linux-kernel@vger.kernel.org; amd-gfx@lists.freedesktop.org; Cornij, Nikola; Laktyushkin, Dmytro; dri-devel@lists.freedesktop.org; Lei, Jun; Lakha, Bhawanpreet; Koo, Anthony Subject: [PATCH] drm/amd/display: avoid 64-bit division On 32-bit architectures, dividing a 64-bit integer in the kernel leads to a link error: ERROR: "__udivdi3" [drivers/gpu/drm/amd/amdgpu/amdgpu.ko] undefined! ERROR: "__divdi3" [drivers/gpu/drm/amd/amdgpu/amdgpu.ko] undefined! Change the two recently introduced instances to a multiply+shift operation that is also much cheaper on 32-bit architectures. We can do that here, since both of them are really 32-bit numbers that change a few percent. Fixes: bedbbe6af4be ("drm/amd/display: Move link functions from dc to dc_link") Fixes: f18bc4e53ad6 ("drm/amd/display: update calculated bounding box logic for NV") Signed-off-by: Arnd Bergmann <arnd@arndb.de> --- drivers/gpu/drm/amd/display/dc/core/dc_link.c | 4 ++-- drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c index c17db5c144aa..8dbf759eba45 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c @@ -3072,8 +3072,8 @@ uint32_t dc_link_bandwidth_kbps( * but the difference is minimal and is in a safe direction, * which all works well around potential ambiguity of DP 1.4a spec. */ - long long fec_link_bw_kbps = link_bw_kbps * 970LL; - link_bw_kbps = (uint32_t)(fec_link_bw_kbps / 1000LL); + link_bw_kbps = mul_u64_u32_shr(BIT_ULL(32) * 970LL / 1000, + link_bw_kbps, 32); } #endif diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c index b35327bafbc5..70ac8a95d2db 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c @@ -2657,7 +2657,7 @@ static void update_bounding_box(struct dc *dc, struct _vcs_dpi_soc_bounding_box_ calculated_states[i].dram_speed_mts = uclk_states[i] * 16 / 1000; // FCLK:UCLK ratio is 1.08 - min_fclk_required_by_uclk = ((unsigned long long)uclk_states[i]) * 1080 / 1000000; + min_fclk_required_by_uclk = mul_u64_u32_shr(BIT_ULL(32) * 1080 / 1000000, uclk_states[i], 32); calculated_states[i].fabricclk_mhz = (min_fclk_required_by_uclk < min_dcfclk) ? min_dcfclk : min_fclk_required_by_uclk; -- 2.20.0 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx [-- Attachment #1.2: Type: text/html, Size: 6640 bytes --] [-- Attachment #2: Type: text/plain, Size: 159 bytes --] _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel ^ permalink raw reply related [flat|nested] 11+ messages in thread
[parent not found: <DM6PR12MB320967C48957C4F2F0E92438FEF10-lmeGfMZKVrEA9tGwT7oCEgdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>]
* Re: [PATCH] drm/amd/display: avoid 64-bit division [not found] ` <DM6PR12MB320967C48957C4F2F0E92438FEF10-lmeGfMZKVrEA9tGwT7oCEgdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org> @ 2019-07-09 16:40 ` Deucher, Alexander 2019-07-09 19:37 ` Arnd Bergmann 0 siblings, 1 reply; 11+ messages in thread From: Deucher, Alexander @ 2019-07-09 16:40 UTC (permalink / raw) To: Abramov, Slava, Arnd Bergmann, Wentland, Harry, Li, Sun peng (Leo), Koenig, Christian, Zhou, David(ChunMing), David Airlie, Daniel Vetter Cc: Liu, Charlene, Park, Chris, Lakha, Bhawanpreet, Francis, David, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, Cornij, Nikola, Laktyushkin, Dmytro, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, Lei, Jun, Cheng, Tony, Koo, Anthony [-- Attachment #1.1: Type: text/plain, Size: 4659 bytes --] I'll just apply Arnd's patch. If the display team wants to adjust it later to clarify the operation, they should go ahead as a follow up patch. Thanks, Alex ________________________________ From: Abramov, Slava Sent: Tuesday, July 9, 2019 12:31 PM To: Arnd Bergmann; Wentland, Harry; Li, Sun peng (Leo); Deucher, Alexander; Koenig, Christian; Zhou, David(ChunMing); David Airlie; Daniel Vetter Cc: Liu, Charlene; Park, Chris; Cheng, Tony; Francis, David; linux-kernel@vger.kernel.org; amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org; Cornij, Nikola; Laktyushkin, Dmytro; dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org; Lei, Jun; Lakha, Bhawanpreet; Koo, Anthony Subject: Re: [PATCH] drm/amd/display: avoid 64-bit division Hi Arnd! Thanks for bisecting this issue. I wonder whether you are going to commit your patch or planning to update it and it's still in your work queue. We have one of our 32-bit builds failing because of this issue, so that I would like either to fix it or wait to your fix if it has chances to go upstream today. Sincerely, Slava Abramov ________________________________ From: amd-gfx <amd-gfx-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org> on behalf of Arnd Bergmann <arnd-r2nGTMty4D4@public.gmane.org> Sent: Monday, July 8, 2019 9:52:08 AM To: Wentland, Harry; Li, Sun peng (Leo); Deucher, Alexander; Koenig, Christian; Zhou, David(ChunMing); David Airlie; Daniel Vetter Cc: Liu, Charlene; Park, Chris; Arnd Bergmann; Cheng, Tony; Francis, David; linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org; amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org; Cornij, Nikola; Laktyushkin, Dmytro; dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org; Lei, Jun; Lakha, Bhawanpreet; Koo, Anthony Subject: [PATCH] drm/amd/display: avoid 64-bit division On 32-bit architectures, dividing a 64-bit integer in the kernel leads to a link error: ERROR: "__udivdi3" [drivers/gpu/drm/amd/amdgpu/amdgpu.ko] undefined! ERROR: "__divdi3" [drivers/gpu/drm/amd/amdgpu/amdgpu.ko] undefined! Change the two recently introduced instances to a multiply+shift operation that is also much cheaper on 32-bit architectures. We can do that here, since both of them are really 32-bit numbers that change a few percent. Fixes: bedbbe6af4be ("drm/amd/display: Move link functions from dc to dc_link") Fixes: f18bc4e53ad6 ("drm/amd/display: update calculated bounding box logic for NV") Signed-off-by: Arnd Bergmann <arnd-r2nGTMty4D4@public.gmane.org> --- drivers/gpu/drm/amd/display/dc/core/dc_link.c | 4 ++-- drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c index c17db5c144aa..8dbf759eba45 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c @@ -3072,8 +3072,8 @@ uint32_t dc_link_bandwidth_kbps( * but the difference is minimal and is in a safe direction, * which all works well around potential ambiguity of DP 1.4a spec. */ - long long fec_link_bw_kbps = link_bw_kbps * 970LL; - link_bw_kbps = (uint32_t)(fec_link_bw_kbps / 1000LL); + link_bw_kbps = mul_u64_u32_shr(BIT_ULL(32) * 970LL / 1000, + link_bw_kbps, 32); } #endif diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c index b35327bafbc5..70ac8a95d2db 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c @@ -2657,7 +2657,7 @@ static void update_bounding_box(struct dc *dc, struct _vcs_dpi_soc_bounding_box_ calculated_states[i].dram_speed_mts = uclk_states[i] * 16 / 1000; // FCLK:UCLK ratio is 1.08 - min_fclk_required_by_uclk = ((unsigned long long)uclk_states[i]) * 1080 / 1000000; + min_fclk_required_by_uclk = mul_u64_u32_shr(BIT_ULL(32) * 1080 / 1000000, uclk_states[i], 32); calculated_states[i].fabricclk_mhz = (min_fclk_required_by_uclk < min_dcfclk) ? min_dcfclk : min_fclk_required_by_uclk; -- 2.20.0 _______________________________________________ amd-gfx mailing list amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx [-- Attachment #1.2: Type: text/html, Size: 8553 bytes --] [-- Attachment #2: Type: text/plain, Size: 153 bytes --] _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH] drm/amd/display: avoid 64-bit division 2019-07-09 16:40 ` Deucher, Alexander @ 2019-07-09 19:37 ` Arnd Bergmann 0 siblings, 0 replies; 11+ messages in thread From: Arnd Bergmann @ 2019-07-09 19:37 UTC (permalink / raw) To: Deucher, Alexander Cc: Abramov, Slava, Wentland, Harry, Li, Sun peng (Leo), Koenig, Christian, Zhou, David(ChunMing), David Airlie, Daniel Vetter, Liu, Charlene, Park, Chris, Cheng, Tony, Francis, David, linux-kernel@vger.kernel.org, amd-gfx@lists.freedesktop.org, Cornij, Nikola, Laktyushkin, Dmytro, dri-devel@lists.freedesktop.org, Lei, Jun On Tue, Jul 9, 2019 at 6:40 PM Deucher, Alexander <Alexander.Deucher@amd.com> wrote: > > I'll just apply Arnd's patch. If the display team wants to adjust it later to clarify the > operation, they should go ahead as a follow up patch. Thanks! > From: Abramov, Slava > Sent: Tuesday, July 9, 2019 12:31 PM > > Thanks for bisecting this issue. > > > > I wonder whether you are going to commit your patch or planning to update it and it's > > still in your work queue. We have one of our 32-bit builds failing because of this > > issue, so that I would like either to fix it or wait to your fix if it has chances to go > > upstream today. I was going to update the patch, but had not gotten to that yet. Arnd ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] drm/amd/display: avoid 64-bit division @ 2019-07-09 19:37 ` Arnd Bergmann 0 siblings, 0 replies; 11+ messages in thread From: Arnd Bergmann @ 2019-07-09 19:37 UTC (permalink / raw) To: Deucher, Alexander Cc: Abramov, Slava, Wentland, Harry, Li, Sun peng (Leo), Koenig, Christian, Zhou, David(ChunMing), David Airlie, Daniel Vetter, Liu, Charlene, Park, Chris, Cheng, Tony, Francis, David, linux-kernel@vger.kernel.org, amd-gfx@lists.freedesktop.org, Cornij, Nikola, Laktyushkin, Dmytro, dri-devel@lists.freedesktop.org, Lei, Jun, Lakha, Bhawanpreet, Koo, Anthony On Tue, Jul 9, 2019 at 6:40 PM Deucher, Alexander <Alexander.Deucher@amd.com> wrote: > > I'll just apply Arnd's patch. If the display team wants to adjust it later to clarify the > operation, they should go ahead as a follow up patch. Thanks! > From: Abramov, Slava > Sent: Tuesday, July 9, 2019 12:31 PM > > Thanks for bisecting this issue. > > > > I wonder whether you are going to commit your patch or planning to update it and it's > > still in your work queue. We have one of our 32-bit builds failing because of this > > issue, so that I would like either to fix it or wait to your fix if it has chances to go > > upstream today. I was going to update the patch, but had not gotten to that yet. Arnd ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2026-06-19 15:21 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-19 8:23 [PATCH] drm/amd/display: avoid 64-bit division Arnd Bergmann
2026-06-19 8:30 ` sashiko-bot
2026-06-19 15:21 ` David Laight
-- strict thread matches above, loose matches on Subject: below --
2019-07-08 13:52 Arnd Bergmann
2019-07-08 13:52 ` Arnd Bergmann
[not found] ` <20190708135238.651483-1-arnd-r2nGTMty4D4@public.gmane.org>
2019-07-08 14:16 ` Kazlauskas, Nicholas
2019-07-08 18:20 ` Abramov, Slava
2019-07-09 16:31 ` Abramov, Slava
[not found] ` <DM6PR12MB320967C48957C4F2F0E92438FEF10-lmeGfMZKVrEA9tGwT7oCEgdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2019-07-09 16:40 ` Deucher, Alexander
2019-07-09 19:37 ` Arnd Bergmann
2019-07-09 19:37 ` Arnd Bergmann
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.