aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0208-drm-amdgpu-add-and-implement-the-GPU-reset-status-qu.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0208-drm-amdgpu-add-and-implement-the-GPU-reset-status-qu.patch')
-rw-r--r--meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0208-drm-amdgpu-add-and-implement-the-GPU-reset-status-qu.patch145
1 files changed, 145 insertions, 0 deletions
diff --git a/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0208-drm-amdgpu-add-and-implement-the-GPU-reset-status-qu.patch b/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0208-drm-amdgpu-add-and-implement-the-GPU-reset-status-qu.patch
new file mode 100644
index 00000000..c1648175
--- /dev/null
+++ b/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0208-drm-amdgpu-add-and-implement-the-GPU-reset-status-qu.patch
@@ -0,0 +1,145 @@
+From d94aed5a6c947b1fda346aff1fa316dacf4a1a5a Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= <marek.olsak@amd.com>
+Date: Tue, 5 May 2015 21:13:49 +0200
+Subject: [PATCH 0208/1050] drm/amdgpu: add and implement the GPU reset status
+ query
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Marek Olšák <marek.olsak@amd.com>
+Reviewed-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Jammy Zhou <Jammy.Zhou@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu.h | 6 ++---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | 36 +++++++++++++++++++-----------
+ drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 1 +
+ 3 files changed, 27 insertions(+), 16 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+index 66b5bd0..ebff89e 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+@@ -1040,7 +1040,7 @@ struct amdgpu_vm_manager {
+
+ struct amdgpu_ctx_state {
+ uint64_t flags;
+- uint64_t hangs;
++ uint32_t hangs;
+ };
+
+ struct amdgpu_ctx {
+@@ -1049,6 +1049,7 @@ struct amdgpu_ctx {
+ struct amdgpu_fpriv *fpriv;
+ struct amdgpu_ctx_state state;
+ uint32_t id;
++ unsigned reset_counter;
+ };
+
+ struct amdgpu_ctx_mgr {
+@@ -1897,8 +1898,6 @@ int amdgpu_ctx_alloc(struct amdgpu_device *adev,struct amdgpu_fpriv *fpriv,
+ uint32_t *id,uint32_t flags);
+ int amdgpu_ctx_free(struct amdgpu_device *adev, struct amdgpu_fpriv *fpriv,
+ uint32_t id);
+-int amdgpu_ctx_query(struct amdgpu_device *adev, struct amdgpu_fpriv *fpriv,
+- uint32_t id,struct amdgpu_ctx_state *state);
+
+ void amdgpu_ctx_fini(struct amdgpu_fpriv *fpriv);
+ struct amdgpu_ctx *amdgpu_ctx_get(struct amdgpu_fpriv *fpriv, uint32_t id);
+@@ -2006,6 +2005,7 @@ struct amdgpu_device {
+ atomic64_t vram_vis_usage;
+ atomic64_t gtt_usage;
+ atomic64_t num_bytes_moved;
++ atomic_t gpu_reset_counter;
+
+ /* display */
+ struct amdgpu_mode_info mode_info;
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
+index bcd332e..6c66ac8 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
+@@ -81,21 +81,36 @@ int amdgpu_ctx_free(struct amdgpu_device *adev, struct amdgpu_fpriv *fpriv, uint
+ return -EINVAL;
+ }
+
+-int amdgpu_ctx_query(struct amdgpu_device *adev, struct amdgpu_fpriv *fpriv, uint32_t id, struct amdgpu_ctx_state *state)
++static int amdgpu_ctx_query(struct amdgpu_device *adev,
++ struct amdgpu_fpriv *fpriv, uint32_t id,
++ union drm_amdgpu_ctx_out *out)
+ {
+ struct amdgpu_ctx *ctx;
+ struct amdgpu_ctx_mgr *mgr = &fpriv->ctx_mgr;
++ unsigned reset_counter;
+
+ mutex_lock(&mgr->lock);
+ ctx = idr_find(&mgr->ctx_handles, id);
+- if (ctx) {
+- /* state should alter with CS activity */
+- *state = ctx->state;
++ if (!ctx) {
+ mutex_unlock(&mgr->lock);
+- return 0;
++ return -EINVAL;
+ }
++
++ /* TODO: these two are always zero */
++ out->state.flags = ctx->state.flags;
++ out->state.hangs = ctx->state.hangs;
++
++ /* determine if a GPU reset has occured since the last call */
++ reset_counter = atomic_read(&adev->gpu_reset_counter);
++ /* TODO: this should ideally return NO, GUILTY, or INNOCENT. */
++ if (ctx->reset_counter == reset_counter)
++ out->state.reset_status = AMDGPU_CTX_NO_RESET;
++ else
++ out->state.reset_status = AMDGPU_CTX_UNKNOWN_RESET;
++ ctx->reset_counter = reset_counter;
++
+ mutex_unlock(&mgr->lock);
+- return -EINVAL;
++ return 0;
+ }
+
+ void amdgpu_ctx_fini(struct amdgpu_fpriv *fpriv)
+@@ -115,12 +130,11 @@ void amdgpu_ctx_fini(struct amdgpu_fpriv *fpriv)
+ }
+
+ int amdgpu_ctx_ioctl(struct drm_device *dev, void *data,
+- struct drm_file *filp)
++ struct drm_file *filp)
+ {
+ int r;
+ uint32_t id;
+ uint32_t flags;
+- struct amdgpu_ctx_state state;
+
+ union drm_amdgpu_ctx *args = data;
+ struct amdgpu_device *adev = dev->dev_private;
+@@ -139,11 +153,7 @@ int amdgpu_ctx_ioctl(struct drm_device *dev, void *data,
+ r = amdgpu_ctx_free(adev, fpriv, id);
+ break;
+ case AMDGPU_CTX_OP_QUERY_STATE:
+- r = amdgpu_ctx_query(adev, fpriv, id, &state);
+- if (r == 0) {
+- args->out.state.flags = state.flags;
+- args->out.state.hangs = state.hangs;
+- }
++ r = amdgpu_ctx_query(adev, fpriv, id, &args->out);
+ break;
+ default:
+ return -EINVAL;
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+index 61cf5ad..3448d9f 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+@@ -1781,6 +1781,7 @@ int amdgpu_gpu_reset(struct amdgpu_device *adev)
+ }
+
+ adev->needs_reset = false;
++ atomic_inc(&adev->gpu_reset_counter);
+
+ /* block TTM */
+ resched = ttm_bo_lock_delayed_workqueue(&adev->mman.bdev);
+--
+1.9.1
+