diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2004-drm-amdgpu-move-the-VRAM-lost-counter-per-context.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2004-drm-amdgpu-move-the-VRAM-lost-counter-per-context.patch | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2004-drm-amdgpu-move-the-VRAM-lost-counter-per-context.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2004-drm-amdgpu-move-the-VRAM-lost-counter-per-context.patch new file mode 100644 index 00000000..cf3fb885 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2004-drm-amdgpu-move-the-VRAM-lost-counter-per-context.patch @@ -0,0 +1,142 @@ +From 1a2e65964f1e9a8794ac32d21627d11d5b5257d4 Mon Sep 17 00:00:00 2001 +From: Christian Koenig <christian.koenig@amd.com> +Date: Mon, 9 Oct 2017 15:18:43 +0200 +Subject: [PATCH 2004/4131] drm/amdgpu: move the VRAM lost counter per context +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Instead of per device track the VRAM lost per context and return ECANCELED +instead of ENODEV. + +Signed-off-by: Christian König <christian.koenig@amd.com> +Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com> + + Conflicts: + drivers/gpu/drm/amd/amdgpu/amdgpu.h + +Change-Id: Icc1a205ff59807aa1c14efd4b95c50b8ac24c208 +--- + drivers/gpu/drm/amd/amdgpu/amdgpu.h | 6 ++---- + drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 9 +++++---- + drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | 1 + + drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 16 ---------------- + 4 files changed, 8 insertions(+), 24 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +index bb9a760..abe9258 100755 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +@@ -756,10 +756,11 @@ struct amdgpu_ctx { + struct amdgpu_device *adev; + struct amdgpu_queue_mgr queue_mgr; + unsigned reset_counter; ++ uint32_t vram_lost_counter; + spinlock_t ring_lock; + struct dma_fence **fences; + struct amdgpu_ctx_ring rings[AMDGPU_MAX_RINGS]; +- bool preamble_presented; ++ bool preamble_presented; + enum amd_sched_priority init_priority; + enum amd_sched_priority override_priority; + struct mutex lock; +@@ -804,7 +805,6 @@ struct amdgpu_fpriv { + struct amdgpu_ctx_mgr ctx_mgr; + spinlock_t sem_handles_lock; + struct idr sem_handles; +- u32 vram_lost_counter; + }; + + /* +@@ -1949,8 +1949,6 @@ static inline bool amdgpu_has_atpx(void) { return false; } + extern const struct drm_ioctl_desc amdgpu_ioctls_kms[]; + extern const int amdgpu_max_kms_ioctl; + +-bool amdgpu_kms_vram_lost(struct amdgpu_device *adev, +- struct amdgpu_fpriv *fpriv); + int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags); + void amdgpu_driver_unload_kms(struct drm_device *dev); + void amdgpu_driver_lastclose_kms(struct drm_device *dev); +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +index a9a700c..4917001 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +@@ -178,7 +178,11 @@ static int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) + if (ret) + goto free_all_kdata; + +- p->job->vram_lost_counter = fpriv->vram_lost_counter; ++ p->job->vram_lost_counter = atomic_read(&p->adev->vram_lost_counter); ++ if (p->ctx->vram_lost_counter != p->job->vram_lost_counter) { ++ ret = -ECANCELED; ++ goto free_all_kdata; ++ } + + if (p->uf_entry.robj) + p->job->uf_addr = uf_offset; +@@ -1254,7 +1258,6 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p, + int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) + { + struct amdgpu_device *adev = dev->dev_private; +- struct amdgpu_fpriv *fpriv = filp->driver_priv; + union drm_amdgpu_cs *cs = data; + struct amdgpu_cs_parser parser = {}; + bool reserved_buffers = false; +@@ -1262,8 +1265,6 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) + + if (!adev->accel_working) + return -EBUSY; +- if (amdgpu_kms_vram_lost(adev, fpriv)) +- return -ENODEV; + + parser.adev = adev; + parser.filp = filp; +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c +index 064247b..d8465a2 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c +@@ -77,6 +77,7 @@ static int amdgpu_ctx_init(struct amdgpu_device *adev, + } + + ctx->reset_counter = atomic_read(&adev->gpu_reset_counter); ++ ctx->vram_lost_counter = atomic_read(&adev->vram_lost_counter); + ctx->init_priority = priority; + ctx->override_priority = AMD_SCHED_PRIORITY_UNSET; + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +index 4e29362..b529d7e 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +@@ -834,21 +834,6 @@ void amdgpu_driver_lastclose_kms(struct drm_device *dev) + } + + /** +- * amdgpu_kms_vram_lost - check if VRAM was lost for this client +- * +- * @adev: amdgpu device +- * @fpriv: client private +- * +- * Check if all CS is blocked for the client because of lost VRAM +- */ +-bool amdgpu_kms_vram_lost(struct amdgpu_device *adev, +- struct amdgpu_fpriv *fpriv) +-{ +- return fpriv->vram_lost_counter != +- atomic_read(&adev->vram_lost_counter); +-} +- +-/** + * amdgpu_driver_open_kms - drm callback for open + * + * @dev: drm dev pointer +@@ -906,7 +891,6 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) + + amdgpu_ctx_mgr_init(&fpriv->ctx_mgr); + +- fpriv->vram_lost_counter = atomic_read(&adev->vram_lost_counter); + file_priv->driver_priv = fpriv; + + out_suspend: +-- +2.7.4 + |