[PATCH 3/5] drm/amdgpu: add context flags for dedicated vmid reqest
Chunming Zhou
David1.Zhou at amd.com
Fri Apr 21 10:05:40 UTC 2017
ctx_alloc will check dedicated flag for its process by this flag.
Change-Id: I5f80dc39dc9d44660a96a2b710b0dbb4d3b9039d
Signed-off-by: Chunming Zhou <David1.Zhou at 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
More information about the amd-gfx
mailing list