drm/ttm: Add DRM_MM_SEARCH_BELOW for TTM_PL_FLAG_TOPDOWN
authorMichel Dänzer <michel.daenzer@amd.com>
Tue, 28 Oct 2014 09:35:03 +0000 (18:35 +0900)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 12 Nov 2014 16:56:32 +0000 (11:56 -0500)
If the BO should be placed at the top of the area, we should start looking
for holes from the top.

Reviewed-by: Lauri Kasanen <cand@gmx.com>
Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/ttm/ttm_bo_manager.c

index 964387fc5c8f860544704ae3ce21d50084448361..1e93f6c198a2d3a4212cae088293ec69558ed26f 100644 (file)
@@ -55,6 +55,7 @@ static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
        struct ttm_range_manager *rman = (struct ttm_range_manager *) man->priv;
        struct drm_mm *mm = &rman->mm;
        struct drm_mm_node *node = NULL;
+       enum drm_mm_search_flags sflags = DRM_MM_SEARCH_BEST;
        enum drm_mm_allocator_flags aflags = DRM_MM_CREATE_DEFAULT;
        unsigned long lpfn;
        int ret;
@@ -67,15 +68,16 @@ static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
        if (!node)
                return -ENOMEM;
 
-       if (place->flags & TTM_PL_FLAG_TOPDOWN)
+       if (place->flags & TTM_PL_FLAG_TOPDOWN) {
+               sflags |= DRM_MM_SEARCH_BELOW;
                aflags = DRM_MM_CREATE_TOP;
+       }
 
        spin_lock(&rman->lock);
        ret = drm_mm_insert_node_in_range_generic(mm, node, mem->num_pages,
                                          mem->page_alignment, 0,
                                          place->fpfn, lpfn,
-                                         DRM_MM_SEARCH_BEST,
-                                         aflags);
+                                         sflags, aflags);
        spin_unlock(&rman->lock);
 
        if (unlikely(ret)) {