Merge drm/drm-next into drm-misc-next
[linux-block.git] / drivers / gpu / drm / radeon / radeon_ttm.c
index 5d50c9edbe806a318b5309608d4c853e0514b896..31a06ecf450f1aaca6d8557e820290f8c2342a96 100644 (file)
@@ -56,7 +56,7 @@
 static int radeon_ttm_debugfs_init(struct radeon_device *rdev);
 static void radeon_ttm_debugfs_fini(struct radeon_device *rdev);
 
-static struct radeon_device *radeon_get_rdev(struct ttm_bo_device *bdev)
+struct radeon_device *radeon_get_rdev(struct ttm_bo_device *bdev)
 {
        struct radeon_mman *mman;
        struct radeon_device *rdev;
@@ -66,55 +66,20 @@ static struct radeon_device *radeon_get_rdev(struct ttm_bo_device *bdev)
        return rdev;
 }
 
-static int radeon_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
-                               struct ttm_mem_type_manager *man)
+static int radeon_ttm_init_vram(struct radeon_device *rdev)
 {
-       struct radeon_device *rdev;
-
-       rdev = radeon_get_rdev(bdev);
+       return ttm_range_man_init(&rdev->mman.bdev, TTM_PL_VRAM,
+                                 TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_WC,
+                                 TTM_PL_FLAG_WC, false,
+                                 rdev->mc.real_vram_size >> PAGE_SHIFT);
+}
 
-       switch (type) {
-       case TTM_PL_SYSTEM:
-               /* System memory */
-               man->flags = TTM_MEMTYPE_FLAG_MAPPABLE;
-               man->available_caching = TTM_PL_MASK_CACHING;
-               man->default_caching = TTM_PL_FLAG_CACHED;
-               break;
-       case TTM_PL_TT:
-               man->func = &ttm_bo_manager_func;
-               man->gpu_offset = rdev->mc.gtt_start;
-               man->available_caching = TTM_PL_MASK_CACHING;
-               man->default_caching = TTM_PL_FLAG_CACHED;
-               man->flags = TTM_MEMTYPE_FLAG_MAPPABLE | TTM_MEMTYPE_FLAG_CMA;
-#if IS_ENABLED(CONFIG_AGP)
-               if (rdev->flags & RADEON_IS_AGP) {
-                       if (!rdev->ddev->agp) {
-                               DRM_ERROR("AGP is not enabled for memory type %u\n",
-                                         (unsigned)type);
-                               return -EINVAL;
-                       }
-                       if (!rdev->ddev->agp->cant_use_aperture)
-                               man->flags = TTM_MEMTYPE_FLAG_MAPPABLE;
-                       man->available_caching = TTM_PL_FLAG_UNCACHED |
-                                                TTM_PL_FLAG_WC;
-                       man->default_caching = TTM_PL_FLAG_WC;
-               }
-#endif
-               break;
-       case TTM_PL_VRAM:
-               /* "On-card" video ram */
-               man->func = &ttm_bo_manager_func;
-               man->gpu_offset = rdev->mc.vram_start;
-               man->flags = TTM_MEMTYPE_FLAG_FIXED |
-                            TTM_MEMTYPE_FLAG_MAPPABLE;
-               man->available_caching = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_WC;
-               man->default_caching = TTM_PL_FLAG_WC;
-               break;
-       default:
-               DRM_ERROR("Unsupported memory type %u\n", (unsigned)type);
-               return -EINVAL;
-       }
-       return 0;
+static int radeon_ttm_init_gtt(struct radeon_device *rdev)
+{
+       return ttm_range_man_init(&rdev->mman.bdev, TTM_PL_TT,
+                                 TTM_PL_MASK_CACHING,
+                                 TTM_PL_FLAG_CACHED, true,
+                                 rdev->mc.gtt_size >> PAGE_SHIFT);
 }
 
 static void radeon_evict_flags(struct ttm_buffer_object *bo,
@@ -184,9 +149,9 @@ static int radeon_verify_access(struct ttm_buffer_object *bo, struct file *filp)
 }
 
 static void radeon_move_null(struct ttm_buffer_object *bo,
-                            struct ttm_mem_reg *new_mem)
+                            struct ttm_resource *new_mem)
 {
-       struct ttm_mem_reg *old_mem = &bo->mem;
+       struct ttm_resource *old_mem = &bo->mem;
 
        BUG_ON(old_mem->mm_node != NULL);
        *old_mem = *new_mem;
@@ -195,8 +160,8 @@ static void radeon_move_null(struct ttm_buffer_object *bo,
 
 static int radeon_move_blit(struct ttm_buffer_object *bo,
                        bool evict, bool no_wait_gpu,
-                       struct ttm_mem_reg *new_mem,
-                       struct ttm_mem_reg *old_mem)
+                       struct ttm_resource *new_mem,
+                       struct ttm_resource *old_mem)
 {
        struct radeon_device *rdev;
        uint64_t old_start, new_start;
@@ -251,11 +216,11 @@ static int radeon_move_blit(struct ttm_buffer_object *bo,
 static int radeon_move_vram_ram(struct ttm_buffer_object *bo,
                                bool evict, bool interruptible,
                                bool no_wait_gpu,
-                               struct ttm_mem_reg *new_mem)
+                               struct ttm_resource *new_mem)
 {
        struct ttm_operation_ctx ctx = { interruptible, no_wait_gpu };
-       struct ttm_mem_reg *old_mem = &bo->mem;
-       struct ttm_mem_reg tmp_mem;
+       struct ttm_resource *old_mem = &bo->mem;
+       struct ttm_resource tmp_mem;
        struct ttm_place placements;
        struct ttm_placement placement;
        int r;
@@ -289,18 +254,18 @@ static int radeon_move_vram_ram(struct ttm_buffer_object *bo,
        }
        r = ttm_bo_move_ttm(bo, &ctx, new_mem);
 out_cleanup:
-       ttm_bo_mem_put(bo, &tmp_mem);
+       ttm_resource_free(bo, &tmp_mem);
        return r;
 }
 
 static int radeon_move_ram_vram(struct ttm_buffer_object *bo,
                                bool evict, bool interruptible,
                                bool no_wait_gpu,
-                               struct ttm_mem_reg *new_mem)
+                               struct ttm_resource *new_mem)
 {
        struct ttm_operation_ctx ctx = { interruptible, no_wait_gpu };
-       struct ttm_mem_reg *old_mem = &bo->mem;
-       struct ttm_mem_reg tmp_mem;
+       struct ttm_resource *old_mem = &bo->mem;
+       struct ttm_resource tmp_mem;
        struct ttm_placement placement;
        struct ttm_place placements;
        int r;
@@ -327,17 +292,17 @@ static int radeon_move_ram_vram(struct ttm_buffer_object *bo,
                goto out_cleanup;
        }
 out_cleanup:
-       ttm_bo_mem_put(bo, &tmp_mem);
+       ttm_resource_free(bo, &tmp_mem);
        return r;
 }
 
 static int radeon_bo_move(struct ttm_buffer_object *bo, bool evict,
                          struct ttm_operation_ctx *ctx,
-                         struct ttm_mem_reg *new_mem)
+                         struct ttm_resource *new_mem)
 {
        struct radeon_device *rdev;
        struct radeon_bo *rbo;
-       struct ttm_mem_reg *old_mem = &bo->mem;
+       struct ttm_resource *old_mem = &bo->mem;
        int r;
 
        r = ttm_bo_wait(bo, ctx->interruptible, ctx->no_wait_gpu);
@@ -394,9 +359,8 @@ memcpy:
        return 0;
 }
 
-static int radeon_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
+static int radeon_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_resource *mem)
 {
-       struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
        struct radeon_device *rdev = radeon_get_rdev(bdev);
 
        mem->bus.addr = NULL;
@@ -404,8 +368,7 @@ static int radeon_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_
        mem->bus.size = mem->num_pages << PAGE_SHIFT;
        mem->bus.base = 0;
        mem->bus.is_iomem = false;
-       if (!(man->flags & TTM_MEMTYPE_FLAG_MAPPABLE))
-               return -EINVAL;
+
        switch (mem->mem_type) {
        case TTM_PL_SYSTEM:
                /* system memory */
@@ -459,10 +422,6 @@ static int radeon_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_
        return 0;
 }
 
-static void radeon_ttm_io_mem_free(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
-{
-}
-
 /*
  * TTM backend functions.
  */
@@ -481,7 +440,7 @@ static int radeon_ttm_tt_pin_userptr(struct ttm_tt *ttm)
 {
        struct radeon_device *rdev = radeon_get_rdev(ttm->bdev);
        struct radeon_ttm_tt *gtt = (void *)ttm;
-       unsigned pinned = 0, nents;
+       unsigned pinned = 0;
        int r;
 
        int write = !(gtt->userflags & RADEON_GEM_USERPTR_READONLY);
@@ -521,9 +480,8 @@ static int radeon_ttm_tt_pin_userptr(struct ttm_tt *ttm)
        if (r)
                goto release_sg;
 
-       r = -ENOMEM;
-       nents = dma_map_sg(rdev->dev, ttm->sg->sgl, ttm->sg->nents, direction);
-       if (nents == 0)
+       r = dma_map_sgtable(rdev->dev, ttm->sg, direction, 0);
+       if (r)
                goto release_sg;
 
        drm_prime_sg_to_page_addr_arrays(ttm->sg, ttm->pages,
@@ -554,9 +512,9 @@ static void radeon_ttm_tt_unpin_userptr(struct ttm_tt *ttm)
                return;
 
        /* free the sg table and pages again */
-       dma_unmap_sg(rdev->dev, ttm->sg->sgl, ttm->sg->nents, direction);
+       dma_unmap_sgtable(rdev->dev, ttm->sg, direction, 0);
 
-       for_each_sg_page(ttm->sg->sgl, &sg_iter, ttm->sg->nents, 0) {
+       for_each_sgtable_page(ttm->sg, &sg_iter, 0) {
                struct page *page = sg_page_iter_page(&sg_iter);
                if (!(gtt->userflags & RADEON_GEM_USERPTR_READONLY))
                        set_page_dirty(page);
@@ -569,7 +527,7 @@ static void radeon_ttm_tt_unpin_userptr(struct ttm_tt *ttm)
 }
 
 static int radeon_ttm_backend_bind(struct ttm_tt *ttm,
-                                  struct ttm_mem_reg *bo_mem)
+                                  struct ttm_resource *bo_mem)
 {
        struct radeon_ttm_tt *gtt = (void*)ttm;
        uint32_t flags = RADEON_GART_PAGE_VALID | RADEON_GART_PAGE_READ |
@@ -598,7 +556,7 @@ static int radeon_ttm_backend_bind(struct ttm_tt *ttm,
        return 0;
 }
 
-static int radeon_ttm_backend_unbind(struct ttm_tt *ttm)
+static void radeon_ttm_backend_unbind(struct ttm_tt *ttm)
 {
        struct radeon_ttm_tt *gtt = (void *)ttm;
 
@@ -606,8 +564,6 @@ static int radeon_ttm_backend_unbind(struct ttm_tt *ttm)
 
        if (gtt->userptr)
                radeon_ttm_tt_unpin_userptr(ttm);
-
-       return 0;
 }
 
 static void radeon_ttm_backend_destroy(struct ttm_tt *ttm)
@@ -769,7 +725,6 @@ static struct ttm_bo_driver radeon_bo_driver = {
        .ttm_tt_create = &radeon_ttm_tt_create,
        .ttm_tt_populate = &radeon_ttm_tt_populate,
        .ttm_tt_unpopulate = &radeon_ttm_tt_unpopulate,
-       .init_mem_type = &radeon_init_mem_type,
        .eviction_valuable = ttm_bo_eviction_valuable,
        .evict_flags = &radeon_evict_flags,
        .move = &radeon_bo_move,
@@ -777,7 +732,6 @@ static struct ttm_bo_driver radeon_bo_driver = {
        .move_notify = &radeon_bo_move_notify,
        .fault_reserve_notify = &radeon_bo_fault_reserve_notify,
        .io_mem_reserve = &radeon_ttm_io_mem_reserve,
-       .io_mem_free = &radeon_ttm_io_mem_free,
 };
 
 int radeon_ttm_init(struct radeon_device *rdev)
@@ -795,8 +749,8 @@ int radeon_ttm_init(struct radeon_device *rdev)
                return r;
        }
        rdev->mman.initialized = true;
-       r = ttm_bo_init_mm(&rdev->mman.bdev, TTM_PL_VRAM,
-                               rdev->mc.real_vram_size >> PAGE_SHIFT);
+
+       r = radeon_ttm_init_vram(rdev);
        if (r) {
                DRM_ERROR("Failed initializing VRAM heap.\n");
                return r;
@@ -821,8 +775,8 @@ int radeon_ttm_init(struct radeon_device *rdev)
        }
        DRM_INFO("radeon: %uM of VRAM memory ready\n",
                 (unsigned) (rdev->mc.real_vram_size / (1024 * 1024)));
-       r = ttm_bo_init_mm(&rdev->mman.bdev, TTM_PL_TT,
-                               rdev->mc.gtt_size >> PAGE_SHIFT);
+
+       r = radeon_ttm_init_gtt(rdev);
        if (r) {
                DRM_ERROR("Failed initializing GTT heap.\n");
                return r;
@@ -853,8 +807,8 @@ void radeon_ttm_fini(struct radeon_device *rdev)
                }
                radeon_bo_unref(&rdev->stolen_vga_memory);
        }
-       ttm_bo_clean_mm(&rdev->mman.bdev, TTM_PL_VRAM);
-       ttm_bo_clean_mm(&rdev->mman.bdev, TTM_PL_TT);
+       ttm_range_man_fini(&rdev->mman.bdev, TTM_PL_VRAM);
+       ttm_range_man_fini(&rdev->mman.bdev, TTM_PL_TT);
        ttm_bo_device_release(&rdev->mman.bdev);
        radeon_gart_fini(rdev);
        rdev->mman.initialized = false;
@@ -865,12 +819,12 @@ void radeon_ttm_fini(struct radeon_device *rdev)
  * isn't running */
 void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size)
 {
-       struct ttm_mem_type_manager *man;
+       struct ttm_resource_manager *man;
 
        if (!rdev->mman.initialized)
                return;
 
-       man = &rdev->mman.bdev.man[TTM_PL_VRAM];
+       man = ttm_manager_type(&rdev->mman.bdev, TTM_PL_VRAM);
        /* this just adjusts TTM size idea, which sets lpfn to the correct value */
        man->size = size >> PAGE_SHIFT;
 }
@@ -924,7 +878,7 @@ static int radeon_mm_dump_table(struct seq_file *m, void *data)
        unsigned ttm_pl = *(int*)node->info_ent->data;
        struct drm_device *dev = node->minor->dev;
        struct radeon_device *rdev = dev->dev_private;
-       struct ttm_mem_type_manager *man = &rdev->mman.bdev.man[ttm_pl];
+       struct ttm_resource_manager *man = ttm_manager_type(&rdev->mman.bdev, ttm_pl);
        struct drm_printer p = drm_seq_file_printer(m);
 
        man->func->debug(man, &p);