ctx_alloc will check dedicated flag for its process by this flag.

Change-Id: I5f80dc39dc9d44660a96a2b710b0dbb4d3b9039d
Signed-off-by: Chunming Zhou <david1.z...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c |  9 ++++--
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c  | 50 +++++++++++++++++++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h  |  4 +++
 include/uapi/drm/amdgpu_drm.h           |  3 ++
 4 files changed, 64 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
index c2b2896..b620923 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
@@ -109,8 +109,13 @@ static int amdgpu_ctx_alloc(struct amdgpu_device *adev,
        struct amdgpu_ctx *ctx;
        int r;
 
-       if (flags)
-               return -EINVAL;
+       if ((flags & AMDGPU_CTX_FLAGS_DEDICATED_VMID) &&
+           !amdgpu_vm_dedicated_vmid_ready(&fpriv->vm)) {
+               r = amdgpu_vm_alloc_dedicated_vmid(adev, &fpriv->vm);
+               if (r)
+                       return r;
+       }
+
        ctx = kmalloc(sizeof(*ctx), GFP_KERNEL);
        if (!ctx)
                return -ENOMEM;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index e7dd8d1..21cca99 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -397,6 +397,17 @@ static bool amdgpu_vm_had_gpu_reset(struct amdgpu_device 
*adev,
                atomic_read(&adev->gpu_reset_counter);
 }
 
+bool amdgpu_vm_dedicated_vmid_ready(struct amdgpu_vm *vm)
+{
+       unsigned vmhub;
+
+       for (vmhub = 0; vmhub < AMDGPU_MAX_VMHUBS; vmhub++) {
+               if (!vm->dedicated_vmid[vmhub])
+                       return false;
+       }
+       return true;
+}
+
 /**
  * amdgpu_vm_grab_id - allocate the next free VMID
  *
@@ -546,6 +557,45 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct 
amdgpu_ring *ring,
        return r;
 }
 
+int amdgpu_vm_alloc_dedicated_vmid(struct amdgpu_device *adev,
+                                  struct amdgpu_vm *vm)
+{
+       struct amdgpu_vm_id_manager *id_mgr;
+       struct amdgpu_vm_id *idle;
+       unsigned vmhub;
+       int r;
+
+       for (vmhub = 0; vmhub < AMDGPU_MAX_VMHUBS; vmhub++) {
+               id_mgr = &adev->vm_manager.id_mgr[vmhub];
+
+               mutex_lock(&id_mgr->lock);
+               /* Select the first entry VMID */
+               idle = list_first_entry(&id_mgr->ids_lru, struct amdgpu_vm_id,
+                                       list);
+               list_del_init(&idle->list);
+               vm->dedicated_vmid[vmhub] = idle;
+               mutex_unlock(&id_mgr->lock);
+
+               r = amdgpu_sync_wait(&idle->active);
+               if (r)
+                       goto err;
+       }
+
+       return 0;
+err:
+       for (vmhub = 0; vmhub < AMDGPU_MAX_VMHUBS; vmhub++) {
+               id_mgr = &adev->vm_manager.id_mgr[vmhub];
+
+               mutex_lock(&id_mgr->lock);
+               if (vm->dedicated_vmid[vmhub])
+                       list_add(&vm->dedicated_vmid[vmhub]->list,
+                                &id_mgr->ids_lru);
+               vm->dedicated_vmid[vmhub] = NULL;
+               mutex_unlock(&id_mgr->lock);
+       }
+       return r;
+}
+
 static bool amdgpu_vm_ring_has_compute_vm_bug(struct amdgpu_ring *ring)
 {
        struct amdgpu_device *adev = ring->adev;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
index a056e01..90453af 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
@@ -212,6 +212,10 @@ int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,
 int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
                      struct amdgpu_sync *sync, struct fence *fence,
                      struct amdgpu_job *job);
+int amdgpu_vm_alloc_dedicated_vmid(struct amdgpu_device *adev,
+                                  struct amdgpu_vm *vm);
+bool amdgpu_vm_dedicated_vmid_ready(struct amdgpu_vm *vm);
+
 int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job);
 void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vmhub,
                        unsigned vmid);
diff --git a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h
index 56b7a2f3..754208e 100644
--- a/include/uapi/drm/amdgpu_drm.h
+++ b/include/uapi/drm/amdgpu_drm.h
@@ -182,6 +182,9 @@ struct drm_amdgpu_bo_list_out {
 /* unknown cause */
 #define AMDGPU_CTX_UNKNOWN_RESET       3
 
+/* context flags */
+#define AMDGPU_CTX_FLAGS_DEDICATED_VMID        (1ULL << 0)
+
 struct drm_amdgpu_ctx_in {
        /** AMDGPU_CTX_OP_* */
        __u32   op;
-- 
1.9.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to