From: Candice Li <[email protected]>

amdgpu_umc.active_mask is widened to u64 to
match 64-bit harvest masks and avoid LP32
unsigned long width limits.

Fix UMC harvest bitmask (drop le16 on u8, use 1ULL shift).

Signed-off-by: Candice Li <[email protected]>
Reviewed-by: Hawking Zhang <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c | 25 +++++++++++++++++--------
 drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h |  8 +-------
 2 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c
index 986f307630f61..34702e5cb1b6c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c
@@ -21,6 +21,7 @@
  *
  */
 
+#include <linux/bitmap.h>
 #include <linux/sort.h>
 #include "amdgpu.h"
 #include "umc_v6_7.h"
@@ -426,6 +427,7 @@ static int amdgpu_umc_loop_all_aid(struct amdgpu_device 
*adev, umc_func func,
        uint32_t node_inst;
        uint32_t umc_inst;
        uint32_t ch_inst;
+       DECLARE_BITMAP(umc_bitmap, 64);
        int ret;
 
        /*
@@ -435,9 +437,10 @@ static int amdgpu_umc_loop_all_aid(struct amdgpu_device 
*adev, umc_func func,
         * umc.node_inst_num = maximum number of node instances
         * Channel instances are not assumed to be harvested.
         */
-       dev_dbg(adev->dev, "active umcs :%lx umc_inst per node: %d",
+       dev_dbg(adev->dev, "active umcs :%llx umc_inst per node: %d",
                adev->umc.active_mask, adev->umc.umc_inst_num);
-       for_each_set_bit(umc_node_inst, &(adev->umc.active_mask),
+       bitmap_from_u64(umc_bitmap, adev->umc.active_mask);
+       for_each_set_bit(umc_node_inst, umc_bitmap,
                         adev->umc.node_inst_num * adev->umc.umc_inst_num) {
                node_inst = umc_node_inst / adev->umc.umc_inst_num;
                umc_inst = umc_node_inst % adev->umc.umc_inst_num;
@@ -470,12 +473,18 @@ int amdgpu_umc_loop_channels(struct amdgpu_device *adev,
                return amdgpu_umc_loop_all_aid(adev, func, data);
 
        if (adev->umc.node_inst_num) {
-               LOOP_UMC_EACH_NODE_INST_AND_CH(node_inst, umc_inst, ch_inst) {
-                       ret = func(adev, node_inst, umc_inst, ch_inst, data);
-                       if (ret) {
-                               dev_err(adev->dev, "Node %d umc %d ch %d func 
returns %d\n",
-                                       node_inst, umc_inst, ch_inst, ret);
-                               return ret;
+               DECLARE_BITMAP(umc_bitmap, 64);
+
+               bitmap_from_u64(umc_bitmap, adev->umc.active_mask);
+               for_each_set_bit(node_inst, umc_bitmap, 
adev->umc.node_inst_num) {
+                       LOOP_UMC_INST_AND_CH(umc_inst, ch_inst) {
+                               ret = func(adev, node_inst, umc_inst, ch_inst, 
data);
+                               if (ret) {
+                                       dev_err(adev->dev,
+                                               "Node %d umc %d ch %d func 
returns %d\n",
+                                               node_inst, umc_inst, ch_inst, 
ret);
+                                       return ret;
+                               }
                        }
                }
        } else {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h
index b2a3db60d231e..9e6d8681b0731 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h
@@ -45,12 +45,6 @@
 #define LOOP_UMC_CH_INST(ch_inst) for ((ch_inst) = 0; (ch_inst) < 
adev->umc.channel_inst_num; (ch_inst)++)
 #define LOOP_UMC_INST_AND_CH(umc_inst, ch_inst) LOOP_UMC_INST((umc_inst)) 
LOOP_UMC_CH_INST((ch_inst))
 
-#define LOOP_UMC_NODE_INST(node_inst) \
-               for_each_set_bit((node_inst), &(adev->umc.active_mask), 
adev->umc.node_inst_num)
-
-#define LOOP_UMC_EACH_NODE_INST_AND_CH(node_inst, umc_inst, ch_inst) \
-               LOOP_UMC_NODE_INST((node_inst)) 
LOOP_UMC_INST_AND_CH((umc_inst), (ch_inst))
-
 /* Page retirement tag */
 #define UMC_ECC_NEW_DETECTED_TAG       0x1
 /*
@@ -117,7 +111,7 @@ struct amdgpu_umc {
        struct amdgpu_umc_ras *ras;
 
        /* active mask for umc node instance */
-       unsigned long active_mask;
+       u64 active_mask;
 
        unsigned long err_addr_cnt;
 };
-- 
2.55.0

Reply via email to