]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/amdkfd: fix missing L2 cache info in topology
authorEric Huang <jinhuieric.huang@amd.com>
Tue, 28 Jan 2025 20:48:26 +0000 (15:48 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 29 May 2025 09:13:25 +0000 (11:13 +0200)
[ Upstream commit 5ffd56822a7159917306d99f18fd15dfd7288f20 ]

In some ASICs L2 cache info may miss in kfd topology,
because the first bitmap may be empty, that means
the first cu may be inactive, so to find the first
active cu will solve the issue.

v2: Only find the first active cu in the first xcc

Signed-off-by: Eric Huang <jinhuieric.huang@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Acked-by: Lijo Lazar <lijo.lazar@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/amd/amdkfd/kfd_topology.c

index 334c576a75b144426729edf009aca2801725d439..98317eda2cdb444b7324f24c56b395a6f5b2e752 100644 (file)
@@ -1683,17 +1683,32 @@ static int fill_in_l2_l3_pcache(struct kfd_cache_properties **props_ext,
                                int cache_type, unsigned int cu_processor_id,
                                struct kfd_node *knode)
 {
-       unsigned int cu_sibling_map_mask;
+       unsigned int cu_sibling_map_mask = 0;
        int first_active_cu;
        int i, j, k, xcc, start, end;
        int num_xcc = NUM_XCC(knode->xcc_mask);
        struct kfd_cache_properties *pcache = NULL;
        enum amdgpu_memory_partition mode;
        struct amdgpu_device *adev = knode->adev;
+       bool found = false;
 
        start = ffs(knode->xcc_mask) - 1;
        end = start + num_xcc;
-       cu_sibling_map_mask = cu_info->bitmap[start][0][0];
+
+       /* To find the bitmap in the first active cu in the first
+        * xcc, it is based on the assumption that evrey xcc must
+        * have at least one active cu.
+        */
+       for (i = 0; i < gfx_info->max_shader_engines && !found; i++) {
+               for (j = 0; j < gfx_info->max_sh_per_se && !found; j++) {
+                       if (cu_info->bitmap[start][i % 4][j % 4]) {
+                               cu_sibling_map_mask =
+                                       cu_info->bitmap[start][i % 4][j % 4];
+                               found = true;
+                       }
+               }
+       }
+
        cu_sibling_map_mask &=
                ((1 << pcache_info[cache_type].num_cu_shared) - 1);
        first_active_cu = ffs(cu_sibling_map_mask);