diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0391-drm-amdgpu-add-kernel-ctx-support-v2.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0391-drm-amdgpu-add-kernel-ctx-support-v2.patch | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0391-drm-amdgpu-add-kernel-ctx-support-v2.patch b/common/recipes-kernel/linux/files/0391-drm-amdgpu-add-kernel-ctx-support-v2.patch new file mode 100644 index 00000000..8228b143 --- /dev/null +++ b/common/recipes-kernel/linux/files/0391-drm-amdgpu-add-kernel-ctx-support-v2.patch @@ -0,0 +1,193 @@ +From 23ca0e4e478836dcb93a54aa68cb48fbc66fb0ed Mon Sep 17 00:00:00 2001 +From: Chunming Zhou <david1.zhou@amd.com> +Date: Mon, 6 Jul 2015 13:42:58 +0800 +Subject: [PATCH 0391/1050] drm/amdgpu: add kernel ctx support (v2) + +v2: rebase against kfd changes + +Signed-off-by: Chunming Zhou <david1.zhou@amd.com> +Acked-by: Christian K?nig <christian.koenig@amd.com> +Reviewed-by: Jammy Zhou <Jammy.Zhou@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu.h | 3 ++ + drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | 83 +++++++++++++++++++++--------- + drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 9 ++++ + 3 files changed, 71 insertions(+), 24 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +index 79e81f3..47e4809 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +@@ -2065,6 +2065,9 @@ struct amdgpu_device { + + /* amdkfd interface */ + struct kfd_dev *kfd; ++ ++ /* kernel conext for IB submission */ ++ struct amdgpu_ctx *kernel_ctx; + }; + + bool amdgpu_device_is_px(struct drm_device *dev); +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c +index 41bc7fc..a5d8242 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c +@@ -48,33 +48,53 @@ static void amdgpu_ctx_do_release(struct kref *ref) + kfree(ctx); + } + ++static void amdgpu_ctx_init(struct amdgpu_device *adev, ++ struct amdgpu_fpriv *fpriv, ++ struct amdgpu_ctx *ctx, ++ uint32_t id) ++{ ++ int i; ++ memset(ctx, 0, sizeof(*ctx)); ++ ctx->adev = adev; ++ kref_init(&ctx->refcount); ++ spin_lock_init(&ctx->ring_lock); ++ for (i = 0; i < AMDGPU_MAX_RINGS; ++i) ++ ctx->rings[i].sequence = 1; ++} ++ + int amdgpu_ctx_alloc(struct amdgpu_device *adev, struct amdgpu_fpriv *fpriv, + uint32_t *id) + { + struct amdgpu_ctx *ctx; +- struct amdgpu_ctx_mgr *mgr = &fpriv->ctx_mgr; + int i, j, r; + + ctx = kmalloc(sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return -ENOMEM; +- +- mutex_lock(&mgr->lock); +- r = idr_alloc(&mgr->ctx_handles, ctx, 0, 0, GFP_KERNEL); +- if (r < 0) { ++ if (fpriv) { ++ struct amdgpu_ctx_mgr *mgr = &fpriv->ctx_mgr; ++ mutex_lock(&mgr->lock); ++ r = idr_alloc(&mgr->ctx_handles, ctx, 1, 0, GFP_KERNEL); ++ if (r < 0) { ++ mutex_unlock(&mgr->lock); ++ kfree(ctx); ++ return r; ++ } ++ *id = (uint32_t)r; ++ amdgpu_ctx_init(adev, fpriv, ctx, *id); + mutex_unlock(&mgr->lock); +- kfree(ctx); +- return r; ++ } else { ++ if (adev->kernel_ctx) { ++ DRM_ERROR("kernel cnotext has been created.\n"); ++ kfree(ctx); ++ return 0; ++ } ++ *id = AMD_KERNEL_CONTEXT_ID; ++ amdgpu_ctx_init(adev, fpriv, ctx, *id); ++ ++ adev->kernel_ctx = ctx; + } +- *id = (uint32_t)r; + +- memset(ctx, 0, sizeof(*ctx)); +- ctx->adev = adev; +- kref_init(&ctx->refcount); +- spin_lock_init(&ctx->ring_lock); +- for (i = 0; i < AMDGPU_MAX_RINGS; ++i) +- ctx->rings[i].sequence = 1; +- mutex_unlock(&mgr->lock); + if (amdgpu_enable_scheduler) { + /* create context entity for each ring */ + for (i = 0; i < adev->num_rings; i++) { +@@ -105,17 +125,23 @@ int amdgpu_ctx_alloc(struct amdgpu_device *adev, struct amdgpu_fpriv *fpriv, + int amdgpu_ctx_free(struct amdgpu_device *adev, struct amdgpu_fpriv *fpriv, uint32_t id) + { + struct amdgpu_ctx *ctx; +- struct amdgpu_ctx_mgr *mgr = &fpriv->ctx_mgr; + +- mutex_lock(&mgr->lock); +- ctx = idr_find(&mgr->ctx_handles, id); +- if (ctx) { +- idr_remove(&mgr->ctx_handles, id); +- kref_put(&ctx->refcount, amdgpu_ctx_do_release); ++ if (fpriv) { ++ struct amdgpu_ctx_mgr *mgr = &fpriv->ctx_mgr; ++ mutex_lock(&mgr->lock); ++ ctx = idr_find(&mgr->ctx_handles, id); ++ if (ctx) { ++ idr_remove(&mgr->ctx_handles, id); ++ kref_put(&ctx->refcount, amdgpu_ctx_do_release); ++ mutex_unlock(&mgr->lock); ++ return 0; ++ } + mutex_unlock(&mgr->lock); ++ } else { ++ ctx = adev->kernel_ctx; ++ kref_put(&ctx->refcount, amdgpu_ctx_do_release); + return 0; + } +- mutex_unlock(&mgr->lock); + return -EINVAL; + } + +@@ -124,9 +150,13 @@ static int amdgpu_ctx_query(struct amdgpu_device *adev, + union drm_amdgpu_ctx_out *out) + { + struct amdgpu_ctx *ctx; +- struct amdgpu_ctx_mgr *mgr = &fpriv->ctx_mgr; ++ struct amdgpu_ctx_mgr *mgr; + unsigned reset_counter; + ++ if (!fpriv) ++ return -EINVAL; ++ ++ mgr = &fpriv->ctx_mgr; + mutex_lock(&mgr->lock); + ctx = idr_find(&mgr->ctx_handles, id); + if (!ctx) { +@@ -202,7 +232,12 @@ int amdgpu_ctx_ioctl(struct drm_device *dev, void *data, + struct amdgpu_ctx *amdgpu_ctx_get(struct amdgpu_fpriv *fpriv, uint32_t id) + { + struct amdgpu_ctx *ctx; +- struct amdgpu_ctx_mgr *mgr = &fpriv->ctx_mgr; ++ struct amdgpu_ctx_mgr *mgr; ++ ++ if (!fpriv) ++ return NULL; ++ ++ mgr = &fpriv->ctx_mgr; + + mutex_lock(&mgr->lock); + ctx = idr_find(&mgr->ctx_handles, id); +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +index fefeeb2..801ebfc 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +@@ -1525,6 +1525,14 @@ int amdgpu_device_init(struct amdgpu_device *adev, + return r; + } + ++ if (!adev->kernel_ctx) { ++ uint32_t id = 0; ++ r = amdgpu_ctx_alloc(adev, NULL, &id); ++ if (r) { ++ dev_err(adev->dev, "failed to create kernel context (%d).\n", r); ++ return r; ++ } ++ } + r = amdgpu_ib_ring_tests(adev); + if (r) + DRM_ERROR("ib ring test failed (%d).\n", r); +@@ -1586,6 +1594,7 @@ void amdgpu_device_fini(struct amdgpu_device *adev) + adev->shutdown = true; + /* evict vram memory */ + amdgpu_bo_evict_vram(adev); ++ amdgpu_ctx_free(adev, NULL, 0); + amdgpu_ib_pool_fini(adev); + amdgpu_fence_driver_fini(adev); + amdgpu_fbdev_fini(adev); +-- +1.9.1 + |