drm/ttm: remove default caching
[linux-2.6-microblaze.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_ttm.c
index ca568e2..15ce752 100644 (file)
@@ -68,7 +68,7 @@ static int amdgpu_ttm_init_on_chip(struct amdgpu_device *adev,
                                    uint64_t size)
 {
        return ttm_range_man_init(&adev->mman.bdev, type,
-                                 TTM_PL_FLAG_UNCACHED, TTM_PL_FLAG_UNCACHED,
+                                 TTM_PL_FLAG_UNCACHED,
                                  false, size >> PAGE_SHIFT);
 }
 
@@ -88,7 +88,8 @@ static void amdgpu_evict_flags(struct ttm_buffer_object *bo,
        static const struct ttm_place placements = {
                .fpfn = 0,
                .lpfn = 0,
-               .flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM
+               .mem_type = TTM_PL_SYSTEM,
+               .flags = TTM_PL_MASK_CACHING
        };
 
        /* Don't handle scatter gather BOs */
@@ -174,24 +175,6 @@ static int amdgpu_verify_access(struct ttm_buffer_object *bo, struct file *filp)
                                          filp->private_data);
 }
 
-/**
- * amdgpu_move_null - Register memory for a buffer object
- *
- * @bo: The bo to assign the memory to
- * @new_mem: The memory to be assigned.
- *
- * Assign the memory from new_mem to the memory of the buffer object bo.
- */
-static void amdgpu_move_null(struct ttm_buffer_object *bo,
-                            struct ttm_resource *new_mem)
-{
-       struct ttm_resource *old_mem = &bo->mem;
-
-       BUG_ON(old_mem->mm_node != NULL);
-       *old_mem = *new_mem;
-       new_mem->mm_node = NULL;
-}
-
 /**
  * amdgpu_mm_node_addr - Compute the GPU relative offset of a GTT buffer.
  *
@@ -551,7 +534,8 @@ static int amdgpu_move_vram_ram(struct ttm_buffer_object *bo, bool evict,
        placement.busy_placement = &placements;
        placements.fpfn = 0;
        placements.lpfn = 0;
-       placements.flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
+       placements.mem_type = TTM_PL_TT;
+       placements.flags = TTM_PL_MASK_CACHING;
        r = ttm_bo_mem_space(bo, &placement, &tmp_mem, ctx);
        if (unlikely(r)) {
                pr_err("Failed to find GTT space for blit from VRAM\n");
@@ -607,7 +591,8 @@ static int amdgpu_move_ram_vram(struct ttm_buffer_object *bo, bool evict,
        placement.busy_placement = &placements;
        placements.fpfn = 0;
        placements.lpfn = 0;
-       placements.flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
+       placements.mem_type = TTM_PL_TT;
+       placements.flags = TTM_PL_MASK_CACHING;
        r = ttm_bo_mem_space(bo, &placement, &tmp_mem, ctx);
        if (unlikely(r)) {
                pr_err("Failed to find GTT space for blit to VRAM\n");
@@ -676,7 +661,7 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
        adev = amdgpu_ttm_adev(bo->bdev);
 
        if (old_mem->mem_type == TTM_PL_SYSTEM && bo->ttm == NULL) {
-               amdgpu_move_null(bo, new_mem);
+               ttm_bo_move_null(bo, new_mem);
                return 0;
        }
        if ((old_mem->mem_type == TTM_PL_TT &&
@@ -684,7 +669,7 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
            (old_mem->mem_type == TTM_PL_SYSTEM &&
             new_mem->mem_type == TTM_PL_TT)) {
                /* bind is enough */
-               amdgpu_move_null(bo, new_mem);
+               ttm_bo_move_null(bo, new_mem);
                return 0;
        }
        if (old_mem->mem_type == AMDGPU_PL_GDS ||
@@ -694,7 +679,7 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
            new_mem->mem_type == AMDGPU_PL_GWS ||
            new_mem->mem_type == AMDGPU_PL_OA) {
                /* Nothing to save here */
-               amdgpu_move_null(bo, new_mem);
+               ttm_bo_move_null(bo, new_mem);
                return 0;
        }
 
@@ -773,7 +758,7 @@ static int amdgpu_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_reso
                        mem->bus.addr = (u8 *)adev->mman.aper_base_kaddr +
                                        mem->bus.offset;
 
-               mem->bus.base = adev->gmc.aper_base;
+               mem->bus.offset += adev->gmc.aper_base;
                mem->bus.is_iomem = true;
                break;
        default:
@@ -785,12 +770,13 @@ static int amdgpu_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_reso
 static unsigned long amdgpu_ttm_io_mem_pfn(struct ttm_buffer_object *bo,
                                           unsigned long page_offset)
 {
+       struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
        uint64_t offset = (page_offset << PAGE_SHIFT);
        struct drm_mm_node *mm;
 
        mm = amdgpu_find_mm_node(&bo->mem, &offset);
-       return (bo->mem.bus.base >> PAGE_SHIFT) + mm->start +
-               (offset >> PAGE_SHIFT);
+       offset += adev->gmc.aper_base;
+       return mm->start + (offset >> PAGE_SHIFT);
 }
 
 /**
@@ -1188,8 +1174,8 @@ int amdgpu_ttm_alloc_gart(struct ttm_buffer_object *bo)
                placement.busy_placement = &placements;
                placements.fpfn = 0;
                placements.lpfn = adev->gmc.gart_size >> PAGE_SHIFT;
-               placements.flags = (bo->mem.placement & ~TTM_PL_MASK_MEM) |
-                       TTM_PL_FLAG_TT;
+               placements.mem_type = TTM_PL_TT;
+               placements.flags = bo->mem.placement;
 
                r = ttm_bo_mem_space(bo, &placement, &tmp, &ctx);
                if (unlikely(r))
@@ -1273,12 +1259,6 @@ static void amdgpu_ttm_backend_destroy(struct ttm_bo_device *bdev,
        kfree(gtt);
 }
 
-static struct ttm_backend_func amdgpu_backend_func = {
-       .bind = &amdgpu_ttm_backend_bind,
-       .unbind = &amdgpu_ttm_backend_unbind,
-       .destroy = &amdgpu_ttm_backend_destroy,
-};
-
 /**
  * amdgpu_ttm_tt_create - Create a ttm_tt object for a given BO
  *
@@ -1295,7 +1275,6 @@ static struct ttm_tt *amdgpu_ttm_tt_create(struct ttm_buffer_object *bo,
        if (gtt == NULL) {
                return NULL;
        }
-       gtt->ttm.ttm.func = &amdgpu_backend_func;
        gtt->gobj = &bo->base;
 
        /* allocate space for the uninitialized page entries */
@@ -1697,6 +1676,9 @@ static struct ttm_bo_driver amdgpu_bo_driver = {
        .ttm_tt_create = &amdgpu_ttm_tt_create,
        .ttm_tt_populate = &amdgpu_ttm_tt_populate,
        .ttm_tt_unpopulate = &amdgpu_ttm_tt_unpopulate,
+       .ttm_tt_bind = &amdgpu_ttm_backend_bind,
+       .ttm_tt_unbind = &amdgpu_ttm_backend_unbind,
+       .ttm_tt_destroy = &amdgpu_ttm_backend_destroy,
        .eviction_valuable = amdgpu_ttm_bo_eviction_valuable,
        .evict_flags = &amdgpu_evict_flags,
        .move = &amdgpu_bo_move,
@@ -1722,8 +1704,8 @@ static struct ttm_bo_driver amdgpu_bo_driver = {
  */
 static void amdgpu_ttm_fw_reserve_vram_fini(struct amdgpu_device *adev)
 {
-       amdgpu_bo_free_kernel(&adev->fw_vram_usage.reserved_bo,
-               NULL, &adev->fw_vram_usage.va);
+       amdgpu_bo_free_kernel(&adev->mman.fw_vram_usage_reserved_bo,
+               NULL, &adev->mman.fw_vram_usage_va);
 }
 
 /**
@@ -1737,19 +1719,19 @@ static int amdgpu_ttm_fw_reserve_vram_init(struct amdgpu_device *adev)
 {
        uint64_t vram_size = adev->gmc.visible_vram_size;
 
-       adev->fw_vram_usage.va = NULL;
-       adev->fw_vram_usage.reserved_bo = NULL;
+       adev->mman.fw_vram_usage_va = NULL;
+       adev->mman.fw_vram_usage_reserved_bo = NULL;
 
-       if (adev->fw_vram_usage.size == 0 ||
-           adev->fw_vram_usage.size > vram_size)
+       if (adev->mman.fw_vram_usage_size == 0 ||
+           adev->mman.fw_vram_usage_size > vram_size)
                return 0;
 
        return amdgpu_bo_create_kernel_at(adev,
-                                         adev->fw_vram_usage.start_offset,
-                                         adev->fw_vram_usage.size,
+                                         adev->mman.fw_vram_usage_start_offset,
+                                         adev->mman.fw_vram_usage_size,
                                          AMDGPU_GEM_DOMAIN_VRAM,
-                                         &adev->fw_vram_usage.reserved_bo,
-                                         &adev->fw_vram_usage.va);
+                                         &adev->mman.fw_vram_usage_reserved_bo,
+                                         &adev->mman.fw_vram_usage_va);
 }
 
 /*
@@ -1781,7 +1763,7 @@ static void amdgpu_ttm_training_data_block_init(struct amdgpu_device *adev)
        memset(ctx, 0, sizeof(*ctx));
 
        ctx->c2p_train_data_offset =
-               ALIGN((adev->gmc.mc_vram_size - adev->discovery_tmr_size - SZ_1M), SZ_1M);
+               ALIGN((adev->gmc.mc_vram_size - adev->mman.discovery_tmr_size - SZ_1M), SZ_1M);
        ctx->p2c_train_data_offset =
                (adev->gmc.mc_vram_size - GDDR6_MEM_TRAINING_OFFSET);
        ctx->train_data_size =
@@ -1820,10 +1802,10 @@ static int amdgpu_ttm_reserve_tmr(struct amdgpu_device *adev)
         * Otherwise, fallback to legacy approach to check and reserve tmr block for ip
         * discovery data and G6 memory training data respectively
         */
-       adev->discovery_tmr_size =
+       adev->mman.discovery_tmr_size =
                amdgpu_atomfirmware_get_fw_reserved_fb_size(adev);
-       if (!adev->discovery_tmr_size)
-               adev->discovery_tmr_size = DISCOVERY_TMR_OFFSET;
+       if (!adev->mman.discovery_tmr_size)
+               adev->mman.discovery_tmr_size = DISCOVERY_TMR_OFFSET;
 
        if (mem_train_support) {
                /* reserve vram for mem train according to TMR location */
@@ -1843,14 +1825,14 @@ static int amdgpu_ttm_reserve_tmr(struct amdgpu_device *adev)
        }
 
        ret = amdgpu_bo_create_kernel_at(adev,
-                               adev->gmc.real_vram_size - adev->discovery_tmr_size,
-                               adev->discovery_tmr_size,
+                               adev->gmc.real_vram_size - adev->mman.discovery_tmr_size,
+                               adev->mman.discovery_tmr_size,
                                AMDGPU_GEM_DOMAIN_VRAM,
-                               &adev->discovery_memory,
+                               &adev->mman.discovery_memory,
                                NULL);
        if (ret) {
                DRM_ERROR("alloc tmr failed(%d)!\n", ret);
-               amdgpu_bo_free_kernel(&adev->discovery_memory, NULL, NULL);
+               amdgpu_bo_free_kernel(&adev->mman.discovery_memory, NULL, NULL);
                return ret;
        }
 
@@ -1871,15 +1853,14 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
        uint64_t gtt_size;
        int r;
        u64 vis_vram_limit;
-       void *stolen_vga_buf;
 
        mutex_init(&adev->mman.gtt_window_lock);
 
        /* No others user of address space so set it to 0 */
        r = ttm_bo_device_init(&adev->mman.bdev,
                               &amdgpu_bo_driver,
-                              adev->ddev->anon_inode->i_mapping,
-                              adev->ddev->vma_offset_manager,
+                              adev_to_drm(adev)->anon_inode->i_mapping,
+                              adev_to_drm(adev)->vma_offset_manager,
                               dma_addressing_limited(adev->dev));
        if (r) {
                DRM_ERROR("failed initializing buffer object driver(%d).\n", r);
@@ -1924,7 +1905,7 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
         * If IP discovery enabled, a block of memory should be
         * reserved for IP discovey.
         */
-       if (adev->discovery_bin) {
+       if (adev->mman.discovery_bin) {
                r = amdgpu_ttm_reserve_tmr(adev);
                if (r)
                        return r;
@@ -1934,10 +1915,17 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
         * This is used for VGA emulation and pre-OS scanout buffers to
         * avoid display artifacts while transitioning between pre-OS
         * and driver.  */
-       r = amdgpu_bo_create_kernel(adev, adev->gmc.stolen_size, PAGE_SIZE,
-                                   AMDGPU_GEM_DOMAIN_VRAM,
-                                   &adev->stolen_vga_memory,
-                                   NULL, &stolen_vga_buf);
+       r = amdgpu_bo_create_kernel_at(adev, 0, adev->mman.stolen_vga_size,
+                                      AMDGPU_GEM_DOMAIN_VRAM,
+                                      &adev->mman.stolen_vga_memory,
+                                      NULL);
+       if (r)
+               return r;
+       r = amdgpu_bo_create_kernel_at(adev, adev->mman.stolen_vga_size,
+                                      adev->mman.stolen_extended_size,
+                                      AMDGPU_GEM_DOMAIN_VRAM,
+                                      &adev->mman.stolen_extended_memory,
+                                      NULL);
        if (r)
                return r;
 
@@ -1993,9 +1981,10 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
  */
 void amdgpu_ttm_late_init(struct amdgpu_device *adev)
 {
-       void *stolen_vga_buf;
        /* return the VGA stolen memory (if any) back to VRAM */
-       amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, &stolen_vga_buf);
+       if (!adev->mman.keep_stolen_vga_memory)
+               amdgpu_bo_free_kernel(&adev->mman.stolen_vga_memory, NULL, NULL);
+       amdgpu_bo_free_kernel(&adev->mman.stolen_extended_memory, NULL, NULL);
 }
 
 /**
@@ -2007,8 +1996,11 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev)
                return;
 
        amdgpu_ttm_training_reserve_vram_fini(adev);
+       /* return the stolen vga memory back to VRAM */
+       if (adev->mman.keep_stolen_vga_memory)
+               amdgpu_bo_free_kernel(&adev->mman.stolen_vga_memory, NULL, NULL);
        /* return the IP Discovery TMR memory back to VRAM */
-       amdgpu_bo_free_kernel(&adev->discovery_memory, NULL, NULL);
+       amdgpu_bo_free_kernel(&adev->mman.discovery_memory, NULL, NULL);
        amdgpu_ttm_fw_reserve_vram_fini(adev);
 
        if (adev->mman.aper_base_kaddr)
@@ -2040,7 +2032,7 @@ void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev, bool enable)
        uint64_t size;
        int r;
 
-       if (!adev->mman.initialized || adev->in_gpu_reset ||
+       if (!adev->mman.initialized || amdgpu_in_reset(adev) ||
            adev->mman.buffer_funcs_enabled == enable)
                return;
 
@@ -2051,7 +2043,7 @@ void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev, bool enable)
                ring = adev->mman.buffer_funcs_ring;
                sched = &ring->sched;
                r = drm_sched_entity_init(&adev->mman.entity,
-                                         DRM_SCHED_PRIORITY_KERNEL, &sched,
+                                         DRM_SCHED_PRIORITY_KERNEL, &sched,
                                          1, NULL);
                if (r) {
                        DRM_ERROR("Failed setting up TTM BO move entity (%d)\n",
@@ -2076,7 +2068,7 @@ void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev, bool enable)
 int amdgpu_mmap(struct file *filp, struct vm_area_struct *vma)
 {
        struct drm_file *file_priv = filp->private_data;
-       struct amdgpu_device *adev = file_priv->minor->dev->dev_private;
+       struct amdgpu_device *adev = drm_to_adev(file_priv->minor->dev);
 
        if (adev == NULL)
                return -EINVAL;
@@ -2257,7 +2249,7 @@ static int amdgpu_mm_dump_table(struct seq_file *m, void *data)
        struct drm_info_node *node = (struct drm_info_node *)m->private;
        unsigned ttm_pl = (uintptr_t)node->info_ent->data;
        struct drm_device *dev = node->minor->dev;
-       struct amdgpu_device *adev = dev->dev_private;
+       struct amdgpu_device *adev = drm_to_adev(dev);
        struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev, ttm_pl);
        struct drm_printer p = drm_seq_file_printer(m);
 
@@ -2548,7 +2540,7 @@ int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev)
 #if defined(CONFIG_DEBUG_FS)
        unsigned count;
 
-       struct drm_minor *minor = adev->ddev->primary;
+       struct drm_minor *minor = adev_to_drm(adev)->primary;
        struct dentry *ent, *root = minor->debugfs_root;
 
        for (count = 0; count < ARRAY_SIZE(ttm_debugfs_entries); count++) {