When building amdgpu for 32-bit x86 (CONFIG_X86_32), modpost fails
with:

  ERROR: modpost: drivers/gpu/drm/amd/amdgpu/amdgpu.ko: symbol
  '__udivdi3' undefined!

The UTM QoS helpers dchub_v2_get_sop_total_available_bandwidth_KBps()
and dchub_v2_is_qos_bandwidth_supported_by_sop() divide a 64-bit
bandwidth product by 100 using the native '/' operator. On 32-bit
targets GCC lowers this to a __udivdi3() libgcc call, which the
kernel does not link into modules.

Replace the raw divisions with div_u64(), the kernel's standard
64-bit division helper.

Fixes: 7f7d7ea1fa51 ("drm/amd/display: Add new sources for DCN6")
Reported-by: k2ci <[email protected]>
Signed-off-by: Linlin Yang <[email protected]>
---
 .../bounding_boxes/utm_qos_model_dchub_v2.h   | 23 +++++++++++--------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git 
a/drivers/gpu/drm/amd/display/dc/dml2_0/dml21/inc/bounding_boxes/utm_qos_model_dchub_v2.h
 
b/drivers/gpu/drm/amd/display/dc/dml2_0/dml21/inc/bounding_boxes/utm_qos_model_dchub_v2.h
index ebca5ddda284..39df427a9ee7 100644
--- 
a/drivers/gpu/drm/amd/display/dc/dml2_0/dml21/inc/bounding_boxes/utm_qos_model_dchub_v2.h
+++ 
b/drivers/gpu/drm/amd/display/dc/dml2_0/dml21/inc/bounding_boxes/utm_qos_model_dchub_v2.h
@@ -3,6 +3,7 @@
 // Copyright 2025 Advanced Micro Devices, Inc.
 #ifndef UTM_QOS_MODEL_DCHUB_V2_H
 #define UTM_QOS_MODEL_DCHUB_V2_H
+#include <linux/math64.h>
 #include "utm_qos_model_types.h"
 
 struct utm_qos_model_dchub_memory_path_latency_v2 {
@@ -63,22 +64,22 @@ static inline void 
dchub_v2_get_sop_total_available_bandwidth_KBps(
        uint64_t dram_available_bandwidth_KBps_urgent;
        uint64_t fabric_available_bandwidth_KBps_urgent;
 
-       dram_available_bandwidth_KBps_nominal = (uint64_t) sop->uclk_khz
+       dram_available_bandwidth_KBps_nominal = div_u64((uint64_t)sop->uclk_khz
                        * socbb->dram_channel_count
                        * socbb->dram_channel_width_bytes
                        * socbb->dram_transactions_per_clock
-                       * socbb->dram_derate_percent_nominal / 100;
-       dram_available_bandwidth_KBps_urgent = (uint64_t) sop->uclk_khz
+                       * socbb->dram_derate_percent_nominal, 100);
+       dram_available_bandwidth_KBps_urgent = div_u64((uint64_t)sop->uclk_khz
                        * socbb->dram_channel_count
                        * socbb->dram_channel_width_bytes
                        * socbb->dram_transactions_per_clock
-                       * socbb->dram_derate_percent_urgent / 100;
-       fabric_available_bandwidth_KBps_nominal = (uint64_t) sop->fclk_khz
+                       * socbb->dram_derate_percent_urgent, 100);
+       fabric_available_bandwidth_KBps_nominal = 
div_u64((uint64_t)sop->fclk_khz
                        * socbb->fabric_datapath_to_dcn_data_return_bytes
-                       * socbb->fabric_derate_percent_nominal / 100;
-       fabric_available_bandwidth_KBps_urgent = (uint64_t) sop->fclk_khz
+                       * socbb->fabric_derate_percent_nominal, 100);
+       fabric_available_bandwidth_KBps_urgent = div_u64((uint64_t)sop->fclk_khz
                        * socbb->fabric_datapath_to_dcn_data_return_bytes
-                       * socbb->fabric_derate_percent_urgent / 100;
+                       * socbb->fabric_derate_percent_urgent, 100);
 
        total_available_bandwidth->nominal_bandwidth_KBps =
                        dram_available_bandwidth_KBps_nominal < 
fabric_available_bandwidth_KBps_nominal ?
@@ -112,9 +113,11 @@ static inline bool 
dchub_v2_is_qos_bandwidth_supported_by_sop(
        nominal_available_bandwidth_KBps = 
available_bandwidth.nominal_bandwidth_KBps;
        urgent_available_bandwidth_KBps = 
available_bandwidth.urgent_bandwidth_KBps;
 
-       if ((nominal_available_bandwidth_KBps * nominal_utm_budget_percent / 
100) < qos_bandwidth->nominal_bandwidth_KBps)
+       if (div_u64(nominal_available_bandwidth_KBps * 
nominal_utm_budget_percent, 100) <
+                       qos_bandwidth->nominal_bandwidth_KBps)
                return false;
-       else if ((urgent_available_bandwidth_KBps * urgent_utm_budget_percent / 
100) < qos_bandwidth->urgent_bandwidth_KBps)
+       else if (div_u64(urgent_available_bandwidth_KBps * 
urgent_utm_budget_percent, 100) <
+                       qos_bandwidth->urgent_bandwidth_KBps)
                return false;
        else
                return true;
-- 
2.25.1

Reply via email to