Returning invalid priorities as _NORMAL is a backwards compatibility
quirk of amdgpu_ctx_ioctl(). Move this detail one layer up where it
belongs.

Signed-off-by: Andres Rodriguez <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c       | 8 +++++---
 drivers/gpu/drm/amd/scheduler/gpu_scheduler.h | 3 ++-
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
index 68a852f..0285eef 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
@@ -219,51 +219,53 @@ static int amdgpu_ctx_query(struct amdgpu_device *adev,
 
 static enum amd_sched_priority amdgpu_to_sched_priority(int amdgpu_priority)
 {
        switch (amdgpu_priority) {
        case AMDGPU_CTX_PRIORITY_HIGH_HW:
                return AMD_SCHED_PRIORITY_HIGH_HW;
        case AMDGPU_CTX_PRIORITY_HIGH_SW:
                return AMD_SCHED_PRIORITY_HIGH_SW;
        case AMDGPU_CTX_PRIORITY_NORMAL:
                return AMD_SCHED_PRIORITY_NORMAL;
        case AMDGPU_CTX_PRIORITY_LOW_SW:
        case AMDGPU_CTX_PRIORITY_LOW_HW:
                return AMD_SCHED_PRIORITY_LOW;
        default:
                WARN(1, "Invalid context priority %d\n", amdgpu_priority);
-               return AMD_SCHED_PRIORITY_NORMAL;
+               return AMD_SCHED_PRIORITY_INVALID;
        }
 }
 
 int amdgpu_ctx_ioctl(struct drm_device *dev, void *data,
                     struct drm_file *filp)
 {
        int r;
        uint32_t id;
        enum amd_sched_priority priority;
 
        union drm_amdgpu_ctx *args = data;
        struct amdgpu_device *adev = dev->dev_private;
        struct amdgpu_fpriv *fpriv = filp->driver_priv;
 
        r = 0;
        id = args->in.ctx_id;
        priority = amdgpu_to_sched_priority(args->in.priority);
 
-       if (priority >= AMD_SCHED_PRIORITY_MAX)
-               return -EINVAL;
+       /* For backwards compatibility reasons, we need to accept
+        * ioctls with garbage in the priority field */
+       if (priority == AMD_SCHED_PRIORITY_INVALID)
+               priority = AMD_SCHED_PRIORITY_NORMAL;
 
        switch (args->in.op) {
        case AMDGPU_CTX_OP_ALLOC_CTX:
                r = amdgpu_ctx_alloc(adev, fpriv, priority, filp, &id);
                args->out.alloc.ctx_id = id;
                break;
        case AMDGPU_CTX_OP_FREE_CTX:
                r = amdgpu_ctx_free(fpriv, id);
                break;
        case AMDGPU_CTX_OP_QUERY_STATE:
                r = amdgpu_ctx_query(adev, fpriv, id, &args->out);
                break;
        default:
                return -EINVAL;
        }
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h 
b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h
index dbcaa2e..da040bc 100644
--- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h
+++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h
@@ -108,31 +108,32 @@ static inline bool amd_sched_invalidate_job(struct 
amd_sched_job *s_job, int thr
 */
 struct amd_sched_backend_ops {
        struct dma_fence *(*dependency)(struct amd_sched_job *sched_job);
        struct dma_fence *(*run_job)(struct amd_sched_job *sched_job);
        void (*timedout_job)(struct amd_sched_job *sched_job);
        void (*free_job)(struct amd_sched_job *sched_job);
 };
 
 enum amd_sched_priority {
        AMD_SCHED_PRIORITY_MIN,
        AMD_SCHED_PRIORITY_LOW = AMD_SCHED_PRIORITY_MIN,
        AMD_SCHED_PRIORITY_NORMAL,
        AMD_SCHED_PRIORITY_HIGH_SW,
        AMD_SCHED_PRIORITY_HIGH_HW,
        AMD_SCHED_PRIORITY_KERNEL,
-       AMD_SCHED_PRIORITY_MAX
+       AMD_SCHED_PRIORITY_MAX,
+       AMD_SCHED_PRIORITY_INVALID = -1
 };
 
 /**
  * One scheduler is implemented for each hardware ring
 */
 struct amd_gpu_scheduler {
        const struct amd_sched_backend_ops      *ops;
        uint32_t                        hw_submission_limit;
        long                            timeout;
        const char                      *name;
        struct amd_sched_rq             sched_rq[AMD_SCHED_PRIORITY_MAX];
        wait_queue_head_t               wake_up_worker;
        wait_queue_head_t               job_scheduled;
        atomic_t                        hw_rq_count;
        atomic64_t                      job_id_count;
-- 
2.9.3

_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to