summaryrefslogtreecommitdiffstats
path: root/sys/dev/pci/drm/amd/amdgpu/amdgpu_sched.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/pci/drm/amd/amdgpu/amdgpu_sched.c')
-rw-r--r--sys/dev/pci/drm/amd/amdgpu/amdgpu_sched.c65
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;