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 <[email protected]>
Signed-off-by: Timur Kristóf <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | 30 +++++++++++++++++++--
 1 file changed, 28 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
index 02f85802f579..19b6770a877d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
@@ -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;
 }
 
 /**
-- 
2.54.0

Reply via email to