]> Git Repo - linux.git/blobdiff - drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
Merge tag 'for-linus-4.2-rc0-tag' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_gem.c
index 5fd0bc73b302acda6061a916c7562056c77e0b25..0ec222295feeb50e2a0798d7c091067ff2c3975b 100644 (file)
@@ -37,6 +37,7 @@ void amdgpu_gem_object_free(struct drm_gem_object *gobj)
        if (robj) {
                if (robj->gem_base.import_attach)
                        drm_prime_gem_destroy(&robj->gem_base, robj->tbo.sg);
+               amdgpu_mn_unregister(robj);
                amdgpu_bo_unref(&robj);
        }
 }
@@ -316,7 +317,8 @@ int amdgpu_mode_dumb_mmap(struct drm_file *filp,
                return -ENOENT;
        }
        robj = gem_to_amdgpu_bo(gobj);
-       if (amdgpu_ttm_tt_has_userptr(robj->tbo.ttm)) {
+       if (amdgpu_ttm_tt_has_userptr(robj->tbo.ttm) ||
+           (robj->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)) {
                drm_gem_object_unreference_unlocked(gobj);
                return -EPERM;
        }
@@ -503,7 +505,7 @@ error_free:
 int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
                          struct drm_file *filp)
 {
-       union drm_amdgpu_gem_va *args = data;
+       struct drm_amdgpu_gem_va *args = data;
        struct drm_gem_object *gobj;
        struct amdgpu_device *adev = dev->dev_private;
        struct amdgpu_fpriv *fpriv = filp->driver_priv;
@@ -512,94 +514,73 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
        uint32_t invalid_flags, va_flags = 0;
        int r = 0;
 
-       if (!adev->vm_manager.enabled) {
-               memset(args, 0, sizeof(*args));
-               args->out.result = AMDGPU_VA_RESULT_ERROR;
+       if (!adev->vm_manager.enabled)
                return -ENOTTY;
-       }
 
-       if (args->in.va_address < AMDGPU_VA_RESERVED_SIZE) {
+       if (args->va_address < AMDGPU_VA_RESERVED_SIZE) {
                dev_err(&dev->pdev->dev,
                        "va_address 0x%lX is in reserved area 0x%X\n",
-                       (unsigned long)args->in.va_address,
+                       (unsigned long)args->va_address,
                        AMDGPU_VA_RESERVED_SIZE);
-               memset(args, 0, sizeof(*args));
-               args->out.result = AMDGPU_VA_RESULT_ERROR;
                return -EINVAL;
        }
 
        invalid_flags = ~(AMDGPU_VM_PAGE_READABLE | AMDGPU_VM_PAGE_WRITEABLE |
                        AMDGPU_VM_PAGE_EXECUTABLE);
-       if ((args->in.flags & invalid_flags)) {
+       if ((args->flags & invalid_flags)) {
                dev_err(&dev->pdev->dev, "invalid flags 0x%08X vs 0x%08X\n",
-                       args->in.flags, invalid_flags);
-               memset(args, 0, sizeof(*args));
-               args->out.result = AMDGPU_VA_RESULT_ERROR;
+                       args->flags, invalid_flags);
                return -EINVAL;
        }
 
-       switch (args->in.operation) {
+       switch (args->operation) {
        case AMDGPU_VA_OP_MAP:
        case AMDGPU_VA_OP_UNMAP:
                break;
        default:
                dev_err(&dev->pdev->dev, "unsupported operation %d\n",
-                       args->in.operation);
-               memset(args, 0, sizeof(*args));
-               args->out.result = AMDGPU_VA_RESULT_ERROR;
+                       args->operation);
                return -EINVAL;
        }
 
-       gobj = drm_gem_object_lookup(dev, filp, args->in.handle);
-       if (gobj == NULL) {
-               memset(args, 0, sizeof(*args));
-               args->out.result = AMDGPU_VA_RESULT_ERROR;
+       gobj = drm_gem_object_lookup(dev, filp, args->handle);
+       if (gobj == NULL)
                return -ENOENT;
-       }
+
        rbo = gem_to_amdgpu_bo(gobj);
        r = amdgpu_bo_reserve(rbo, false);
        if (r) {
-               if (r != -ERESTARTSYS) {
-                       memset(args, 0, sizeof(*args));
-                       args->out.result = AMDGPU_VA_RESULT_ERROR;
-               }
                drm_gem_object_unreference_unlocked(gobj);
                return r;
        }
+
        bo_va = amdgpu_vm_bo_find(&fpriv->vm, rbo);
        if (!bo_va) {
-               memset(args, 0, sizeof(*args));
-               args->out.result = AMDGPU_VA_RESULT_ERROR;
-               drm_gem_object_unreference_unlocked(gobj);
+               amdgpu_bo_unreserve(rbo);
                return -ENOENT;
        }
 
-       switch (args->in.operation) {
+       switch (args->operation) {
        case AMDGPU_VA_OP_MAP:
-               if (args->in.flags & AMDGPU_VM_PAGE_READABLE)
+               if (args->flags & AMDGPU_VM_PAGE_READABLE)
                        va_flags |= AMDGPU_PTE_READABLE;
-               if (args->in.flags & AMDGPU_VM_PAGE_WRITEABLE)
+               if (args->flags & AMDGPU_VM_PAGE_WRITEABLE)
                        va_flags |= AMDGPU_PTE_WRITEABLE;
-               if (args->in.flags & AMDGPU_VM_PAGE_EXECUTABLE)
+               if (args->flags & AMDGPU_VM_PAGE_EXECUTABLE)
                        va_flags |= AMDGPU_PTE_EXECUTABLE;
-               r = amdgpu_vm_bo_map(adev, bo_va, args->in.va_address, 0,
-                                    amdgpu_bo_size(bo_va->bo), va_flags);
+               r = amdgpu_vm_bo_map(adev, bo_va, args->va_address,
+                                    args->offset_in_bo, args->map_size,
+                                    va_flags);
                break;
        case AMDGPU_VA_OP_UNMAP:
-               r = amdgpu_vm_bo_unmap(adev, bo_va, args->in.va_address);
+               r = amdgpu_vm_bo_unmap(adev, bo_va, args->va_address);
                break;
        default:
                break;
        }
 
-       if (!r) {
+       if (!r)
                amdgpu_gem_va_update_vm(adev, bo_va);
-               memset(args, 0, sizeof(*args));
-               args->out.result = AMDGPU_VA_RESULT_OK;
-       } else {
-               memset(args, 0, sizeof(*args));
-               args->out.result = AMDGPU_VA_RESULT_ERROR;
-       }
 
        drm_gem_object_unreference_unlocked(gobj);
        return r;
@@ -636,7 +617,7 @@ int amdgpu_gem_op_ioctl(struct drm_device *dev, void *data,
                        r = -EFAULT;
                break;
        }
-       case AMDGPU_GEM_OP_SET_INITIAL_DOMAIN:
+       case AMDGPU_GEM_OP_SET_PLACEMENT:
                if (amdgpu_ttm_tt_has_userptr(robj->tbo.ttm)) {
                        r = -EPERM;
                        break;
This page took 0.039944 seconds and 4 git commands to generate.