Merge tag 'drm-misc-next-2021-07-16' of git://anongit.freedesktop.org/drm/drm-misc...
[linux-2.6-microblaze.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_ttm.c
index b46726e..acd95d3 100644 (file)
@@ -592,10 +592,6 @@ static int amdgpu_ttm_io_mem_reserve(struct ttm_device *bdev,
 
                mem->bus.offset += adev->gmc.aper_base;
                mem->bus.is_iomem = true;
-               if (adev->gmc.xgmi.connected_to_cpu)
-                       mem->bus.caching = ttm_cached;
-               else
-                       mem->bus.caching = ttm_write_combined;
                break;
        default:
                return -EINVAL;
@@ -683,23 +679,23 @@ int amdgpu_ttm_tt_get_user_pages(struct amdgpu_bo *bo, struct page **pages)
                return -ESRCH;
 
        mmap_read_lock(mm);
-       vma = find_vma(mm, start);
-       mmap_read_unlock(mm);
-       if (unlikely(!vma || start < vma->vm_start)) {
+       vma = vma_lookup(mm, start);
+       if (unlikely(!vma)) {
                r = -EFAULT;
-               goto out_putmm;
+               goto out_unlock;
        }
        if (unlikely((gtt->userflags & AMDGPU_GEM_USERPTR_ANONONLY) &&
                vma->vm_file)) {
                r = -EPERM;
-               goto out_putmm;
+               goto out_unlock;
        }
 
        readonly = amdgpu_ttm_tt_is_readonly(ttm);
        r = amdgpu_hmm_range_get_pages(&bo->notifier, mm, pages, start,
                                       ttm->num_pages, &gtt->range, readonly,
-                                      false);
-out_putmm:
+                                      true, NULL);
+out_unlock:
+       mmap_read_unlock(mm);
        mmput(mm);
 
        return r;
@@ -843,7 +839,7 @@ static int amdgpu_ttm_gart_bind(struct amdgpu_device *adev,
                uint64_t page_idx = 1;
 
                r = amdgpu_gart_bind(adev, gtt->offset, page_idx,
-                               ttm->pages, gtt->ttm.dma_address, flags);
+                               gtt->ttm.dma_address, flags);
                if (r)
                        goto gart_bind_fail;
 
@@ -857,11 +853,10 @@ static int amdgpu_ttm_gart_bind(struct amdgpu_device *adev,
                r = amdgpu_gart_bind(adev,
                                gtt->offset + (page_idx << PAGE_SHIFT),
                                ttm->num_pages - page_idx,
-                               &ttm->pages[page_idx],
                                &(gtt->ttm.dma_address[page_idx]), flags);
        } else {
                r = amdgpu_gart_bind(adev, gtt->offset, ttm->num_pages,
-                                    ttm->pages, gtt->ttm.dma_address, flags);
+                                    gtt->ttm.dma_address, flags);
        }
 
 gart_bind_fail:
@@ -926,7 +921,8 @@ static int amdgpu_ttm_backend_bind(struct ttm_device *bdev,
            bo_mem->mem_type == AMDGPU_PL_OA)
                return -EINVAL;
 
-       if (!amdgpu_gtt_mgr_has_gart_addr(bo_mem)) {
+       if (bo_mem->mem_type != TTM_PL_TT ||
+           !amdgpu_gtt_mgr_has_gart_addr(bo_mem)) {
                gtt->offset = AMDGPU_BO_INVALID_OFFSET;
                return 0;
        }
@@ -937,7 +933,7 @@ static int amdgpu_ttm_backend_bind(struct ttm_device *bdev,
        /* bind pages into GART page tables */
        gtt->offset = (u64)bo_mem->start << PAGE_SHIFT;
        r = amdgpu_gart_bind(adev, gtt->offset, ttm->num_pages,
-               ttm->pages, gtt->ttm.dma_address, flags);
+               gtt->ttm.dma_address, flags);
 
        if (r)
                DRM_ERROR("failed to bind %u pages at 0x%08llX\n",
@@ -1131,8 +1127,6 @@ static int amdgpu_ttm_tt_populate(struct ttm_device *bdev,
                ttm->sg = kzalloc(sizeof(struct sg_table), GFP_KERNEL);
                if (!ttm->sg)
                        return -ENOMEM;
-
-               ttm->page_flags |= TTM_PAGE_FLAG_SG;
                return 0;
        }
 
@@ -1158,7 +1152,6 @@ static void amdgpu_ttm_tt_unpopulate(struct ttm_device *bdev,
                amdgpu_ttm_tt_set_user_pages(ttm, NULL);
                kfree(ttm->sg);
                ttm->sg = NULL;
-               ttm->page_flags &= ~TTM_PAGE_FLAG_SG;
                return;
        }
 
@@ -1192,6 +1185,9 @@ int amdgpu_ttm_tt_set_userptr(struct ttm_buffer_object *bo,
                        return -ENOMEM;
        }
 
+       /* Set TTM_PAGE_FLAG_SG before populate but after create. */
+       bo->ttm->page_flags |= TTM_PAGE_FLAG_SG;
+
        gtt = (void *)bo->ttm;
        gtt->userptr = addr;
        gtt->userflags = flags;