Merge tag 'drm-next-5.5-2019-10-09' of git://people.freedesktop.org/~agd5f/linux...
[linux-2.6-microblaze.git] / drivers / gpu / drm / ttm / ttm_bo.c
index 6394e0c..dc3f7d6 100644 (file)
@@ -185,8 +185,9 @@ static void ttm_bo_add_mem_to_lru(struct ttm_buffer_object *bo,
        list_add_tail(&bo->lru, &man->lru[bo->priority]);
        kref_get(&bo->list_kref);
 
-       if (bo->ttm && !(bo->ttm->page_flags &
-                        (TTM_PAGE_FLAG_SG | TTM_PAGE_FLAG_SWAPPED))) {
+       if (!(man->flags & TTM_MEMTYPE_FLAG_FIXED) && bo->ttm &&
+           !(bo->ttm->page_flags & (TTM_PAGE_FLAG_SG |
+                                    TTM_PAGE_FLAG_SWAPPED))) {
                list_add_tail(&bo->swap, &bdev->glob->swap_lru[bo->priority]);
                kref_get(&bo->list_kref);
        }
@@ -675,7 +676,7 @@ static void ttm_bo_release(struct kref *kref)
        if (bo->bdev->driver->release_notify)
                bo->bdev->driver->release_notify(bo);
 
-       drm_vma_offset_remove(&bdev->vma_manager, &bo->base.vma_node);
+       drm_vma_offset_remove(bdev->vma_manager, &bo->base.vma_node);
        ttm_mem_io_lock(man, false);
        ttm_mem_io_free_vm(bo);
        ttm_mem_io_unlock(man);
@@ -878,11 +879,11 @@ static int ttm_mem_evict_first(struct ttm_bo_device *bdev,
 
        if (!bo) {
                if (busy_bo)
-                       ttm_bo_get(busy_bo);
+                       kref_get(&busy_bo->list_kref);
                spin_unlock(&glob->lru_lock);
                ret = ttm_mem_evict_wait_busy(busy_bo, ctx, ticket);
                if (busy_bo)
-                       ttm_bo_put(busy_bo);
+                       kref_put(&busy_bo->list_kref, ttm_bo_release_list);
                return ret;
        }
 
@@ -1364,7 +1365,7 @@ int ttm_bo_init_reserved(struct ttm_bo_device *bdev,
         */
        if (bo->type == ttm_bo_type_device ||
            bo->type == ttm_bo_type_sg)
-               ret = drm_vma_offset_add(&bdev->vma_manager, &bo->base.vma_node,
+               ret = drm_vma_offset_add(bdev->vma_manager, &bo->base.vma_node,
                                         bo->mem.num_pages);
 
        /* passed reservation objects should already be locked,
@@ -1715,8 +1716,6 @@ int ttm_bo_device_release(struct ttm_bo_device *bdev)
                        pr_debug("Swap list %d was clean\n", i);
        spin_unlock(&glob->lru_lock);
 
-       drm_vma_offset_manager_destroy(&bdev->vma_manager);
-
        if (!ret)
                ttm_bo_global_release();
 
@@ -1727,11 +1726,15 @@ EXPORT_SYMBOL(ttm_bo_device_release);
 int ttm_bo_device_init(struct ttm_bo_device *bdev,
                       struct ttm_bo_driver *driver,
                       struct address_space *mapping,
+                      struct drm_vma_offset_manager *vma_manager,
                       bool need_dma32)
 {
        struct ttm_bo_global *glob = &ttm_bo_glob;
        int ret;
 
+       if (WARN_ON(vma_manager == NULL))
+               return -EINVAL;
+
        ret = ttm_bo_global_init();
        if (ret)
                return ret;
@@ -1748,9 +1751,7 @@ int ttm_bo_device_init(struct ttm_bo_device *bdev,
        if (unlikely(ret != 0))
                goto out_no_sys;
 
-       drm_vma_offset_manager_init(&bdev->vma_manager,
-                                   DRM_FILE_PAGE_OFFSET_START,
-                                   DRM_FILE_PAGE_OFFSET_SIZE);
+       bdev->vma_manager = vma_manager;
        INIT_DELAYED_WORK(&bdev->wq, ttm_bo_delayed_workqueue);
        INIT_LIST_HEAD(&bdev->ddestroy);
        bdev->dev_mapping = mapping;