diff options
Diffstat (limited to 'sys/dev/pci/drm/amd/amdgpu/amdgpu_sched.c')
-rw-r--r-- | sys/dev/pci/drm/amd/amdgpu/amdgpu_sched.c | 65 |
1 files changed, 57 insertions, 8 deletions
diff --git a/sys/dev/pci/drm/amd/amdgpu/amdgpu_sched.c b/sys/dev/pci/drm/amd/amdgpu/amdgpu_sched.c index 1be20214f8b..5fc2a5dd621 100644 --- a/sys/dev/pci/drm/amd/amdgpu/amdgpu_sched.c +++ b/sys/dev/pci/drm/amd/amdgpu/amdgpu_sched.c @@ -23,8 +23,11 @@ */ #include <linux/fdtable.h> +#include <linux/file.h> #include <linux/pid.h> + #include <drm/amdgpu_drm.h> + #include "amdgpu.h" #include "amdgpu_vm.h" @@ -55,22 +58,62 @@ static int amdgpu_sched_process_priority_override(struct amdgpu_device *adev, { STUB(); return -ENOSYS; -#if 0 - struct file *filp = fget(fd); - struct drm_file *file; +#ifdef notyet + struct fd f = fdget(fd); struct amdgpu_fpriv *fpriv; struct amdgpu_ctx *ctx; uint32_t id; + int r; - if (!filp) + if (!f.file) return -EINVAL; - file = filp->private_data; - fpriv = file->driver_priv; + r = amdgpu_file_to_fpriv(f.file, &fpriv); + if (r) { + fdput(f); + return r; + } + idr_for_each_entry(&fpriv->ctx_mgr.ctx_handles, ctx, id) amdgpu_ctx_priority_override(ctx, priority); - fput(filp); + fdput(f); + return 0; +#endif +} + +static int amdgpu_sched_context_priority_override(struct amdgpu_device *adev, + int fd, + unsigned ctx_id, + enum drm_sched_priority priority) +{ + STUB(); + return -ENOSYS; +#ifdef notyet + struct fd f = fdget(fd); + struct amdgpu_fpriv *fpriv; + struct amdgpu_ctx *ctx; + int r; + + if (!f.file) + return -EINVAL; + + r = amdgpu_file_to_fpriv(f.file, &fpriv); + if (r) { + fdput(f); + return r; + } + + ctx = amdgpu_ctx_get(fpriv, ctx_id); + + if (!ctx) { + fdput(f); + return -EINVAL; + } + + amdgpu_ctx_priority_override(ctx, priority); + amdgpu_ctx_put(ctx); + fdput(f); return 0; #endif @@ -85,7 +128,7 @@ int amdgpu_sched_ioctl(struct drm_device *dev, void *data, int r; priority = amdgpu_to_sched_priority(args->in.priority); - if (args->in.flags || priority == DRM_SCHED_PRIORITY_INVALID) + if (priority == DRM_SCHED_PRIORITY_INVALID) return -EINVAL; switch (args->in.op) { @@ -94,6 +137,12 @@ int amdgpu_sched_ioctl(struct drm_device *dev, void *data, args->in.fd, priority); break; + case AMDGPU_SCHED_OP_CONTEXT_PRIORITY_OVERRIDE: + r = amdgpu_sched_context_priority_override(adev, + args->in.fd, + args->in.ctx_id, + priority); + break; default: DRM_ERROR("Invalid sched op specified: %d\n", args->in.op); r = -EINVAL; |