]> Git Repo - linux.git/blobdiff - drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
drm/amdgpu: be explicit about cpu vram access for driver BOs (v2)
[linux.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_gem.c
index ae43b58c9733a1962cbd6dae4ce42fb8c52fa81a..5839fab374bf62dac0a5781a4617da0e5335aafd 100644 (file)
@@ -449,7 +449,7 @@ out:
  * vital here, so they are not reported back to userspace.
  */
 static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev,
-                                   struct amdgpu_bo_va *bo_va)
+                                   struct amdgpu_bo_va *bo_va, uint32_t operation)
 {
        struct ttm_validate_buffer tv, *entry;
        struct amdgpu_bo_list_entry *vm_bos;
@@ -485,7 +485,9 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev,
        if (r)
                goto error_unlock;
 
-       r = amdgpu_vm_bo_update(adev, bo_va, &bo_va->bo->tbo.mem);
+
+       if (operation == AMDGPU_VA_OP_MAP)
+               r = amdgpu_vm_bo_update(adev, bo_va, &bo_va->bo->tbo.mem);
 
 error_unlock:
        mutex_unlock(&bo_va->vm->mutex);
@@ -580,7 +582,7 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
        }
 
        if (!r && !(args->flags & AMDGPU_VM_DELAY_UPDATE))
-               amdgpu_gem_va_update_vm(adev, bo_va);
+               amdgpu_gem_va_update_vm(adev, bo_va, args->operation);
 
        drm_gem_object_unreference_unlocked(gobj);
        return r;
@@ -613,6 +615,7 @@ int amdgpu_gem_op_ioctl(struct drm_device *dev, void *data,
                info.alignment = robj->tbo.mem.page_alignment << PAGE_SHIFT;
                info.domains = robj->initial_domain;
                info.domain_flags = robj->flags;
+               amdgpu_bo_unreserve(robj);
                if (copy_to_user(out, &info, sizeof(info)))
                        r = -EFAULT;
                break;
@@ -620,17 +623,19 @@ int amdgpu_gem_op_ioctl(struct drm_device *dev, void *data,
        case AMDGPU_GEM_OP_SET_PLACEMENT:
                if (amdgpu_ttm_tt_has_userptr(robj->tbo.ttm)) {
                        r = -EPERM;
+                       amdgpu_bo_unreserve(robj);
                        break;
                }
                robj->initial_domain = args->value & (AMDGPU_GEM_DOMAIN_VRAM |
                                                      AMDGPU_GEM_DOMAIN_GTT |
                                                      AMDGPU_GEM_DOMAIN_CPU);
+               amdgpu_bo_unreserve(robj);
                break;
        default:
+               amdgpu_bo_unreserve(robj);
                r = -EINVAL;
        }
 
-       amdgpu_bo_unreserve(robj);
 out:
        drm_gem_object_unreference_unlocked(gobj);
        return r;
@@ -651,7 +656,8 @@ int amdgpu_mode_dumb_create(struct drm_file *file_priv,
 
        r = amdgpu_gem_object_create(adev, args->size, 0,
                                     AMDGPU_GEM_DOMAIN_VRAM,
-                                    0, ttm_bo_type_device,
+                                    AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
+                                    ttm_bo_type_device,
                                     &gobj);
        if (r)
                return -ENOMEM;
This page took 0.03672 seconds and 4 git commands to generate.