]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdgpu: Respect placement requirements in amdgpu_gtt_mgr functions
authorTimur Kristóf <timur.kristof@gmail.com>
Mon, 25 May 2026 11:33:17 +0000 (13:33 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 17 Jun 2026 22:27:50 +0000 (18:27 -0400)
When testing intersection and compatibility, respect
the actual placement requirements. This is a pre-requisite
for ensuring that UVD CS BOs do not cross 256M segments.

Fixes: ded910f368a5 ("drm/amdgpu: Implement intersect/compatible functions")
Suggested-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit bc06579ca29dee9c245a41b12e39c7bb6938af5d)
Cc: stable@vger.kernel.org
drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c

index d23a91d029aa810ff1db1102fccab37a8a1e98cc..0ea32561c4bcaaa84bd3a83ac94e7b55469d2308 100644 (file)
@@ -272,7 +272,20 @@ static bool amdgpu_gtt_mgr_intersects(struct ttm_resource_manager *man,
                                      const struct ttm_place *place,
                                      size_t size)
 {
-       return !place->lpfn || amdgpu_gtt_mgr_has_gart_addr(res);
+       const struct drm_mm_node *const node = &to_ttm_range_mgr_node(res)->mm_nodes[0];
+       const u32 num_pages = PFN_UP(size);
+
+       if (!place->lpfn)
+               return true;
+
+       if (!amdgpu_gtt_mgr_has_gart_addr(res))
+               return false;
+
+       if (place->fpfn >= (node->start + num_pages) ||
+           (place->lpfn && place->lpfn <= node->start))
+               return false;
+
+       return true;
 }
 
 /**
@@ -290,7 +303,20 @@ static bool amdgpu_gtt_mgr_compatible(struct ttm_resource_manager *man,
                                      const struct ttm_place *place,
                                      size_t size)
 {
-       return !place->lpfn || amdgpu_gtt_mgr_has_gart_addr(res);
+       const struct drm_mm_node *const node = &to_ttm_range_mgr_node(res)->mm_nodes[0];
+       const u32 num_pages = PFN_UP(size);
+
+       if (!place->lpfn)
+               return true;
+
+       if (!amdgpu_gtt_mgr_has_gart_addr(res))
+               return false;
+
+       if (node->start < place->fpfn ||
+           (place->lpfn && (node->start + num_pages) > place->lpfn))
+               return false;
+
+       return true;
 }
 
 /**