aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2002-drm-amdgpu-partial-revert-VRAM-lost-handling-v2.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2002-drm-amdgpu-partial-revert-VRAM-lost-handling-v2.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2002-drm-amdgpu-partial-revert-VRAM-lost-handling-v2.patch134
1 files changed, 134 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2002-drm-amdgpu-partial-revert-VRAM-lost-handling-v2.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2002-drm-amdgpu-partial-revert-VRAM-lost-handling-v2.patch
new file mode 100644
index 00000000..4aa104ba
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2002-drm-amdgpu-partial-revert-VRAM-lost-handling-v2.patch
@@ -0,0 +1,134 @@
+From 91f3d262c09acc937ef27d37f7e689057edc455a Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Mon, 9 Oct 2017 14:45:09 +0200
+Subject: [PATCH 2002/4131] drm/amdgpu: partial revert VRAM lost handling v2
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Keep blocking the CS, but revert everything else. Mapping BOs and info IOCTL
+are harmless and can still happen even when VRAM content ist lost.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 11 -----------
+ drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 5 -----
+ drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 14 ++++++++++----
+ 3 files changed, 10 insertions(+), 20 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+index 8a936a7..dbc64be 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+@@ -1321,16 +1321,12 @@ int amdgpu_cs_wait_ioctl(struct drm_device *dev, void *data,
+ {
+ union drm_amdgpu_wait_cs *wait = data;
+ struct amdgpu_device *adev = dev->dev_private;
+- struct amdgpu_fpriv *fpriv = filp->driver_priv;
+ unsigned long timeout = amdgpu_gem_timeout(wait->in.timeout);
+ struct amdgpu_ring *ring = NULL;
+ struct amdgpu_ctx *ctx;
+ struct dma_fence *fence;
+ long r;
+
+- if (amdgpu_kms_vram_lost(adev, fpriv))
+- return -ENODEV;
+-
+ ctx = amdgpu_ctx_get(filp->driver_priv, wait->in.ctx_id);
+ if (ctx == NULL)
+ return -EINVAL;
+@@ -1399,16 +1395,12 @@ int amdgpu_cs_fence_to_handle_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_fence_to_handle *info = data;
+ struct dma_fence *fence;
+ struct drm_syncobj *syncobj;
+ struct sync_file *sync_file;
+ int fd, r;
+
+- if (amdgpu_kms_vram_lost(adev, fpriv))
+- return -ENODEV;
+-
+ fence = amdgpu_cs_get_fence(adev, filp, &info->in.fence);
+ if (IS_ERR(fence))
+ return PTR_ERR(fence);
+@@ -1570,15 +1562,12 @@ int amdgpu_cs_wait_fences_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_wait_fences *wait = data;
+ uint32_t fence_count = wait->in.fence_count;
+ struct drm_amdgpu_fence *fences_user;
+ struct drm_amdgpu_fence *fences;
+ int r;
+
+- if (amdgpu_kms_vram_lost(adev, fpriv))
+- return -ENODEV;
+ /* Get the fences from userspace */
+ fences = kmalloc_array(fence_count, sizeof(struct drm_amdgpu_fence),
+ GFP_KERNEL);
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+index 86602b0..a296451 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+@@ -751,11 +751,6 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
+ args->operation);
+ return -EINVAL;
+ }
+- if ((args->operation == AMDGPU_VA_OP_MAP) ||
+- (args->operation == AMDGPU_VA_OP_REPLACE)) {
+- if (amdgpu_kms_vram_lost(adev, fpriv))
+- return -ENODEV;
+- }
+
+ INIT_LIST_HEAD(&list);
+ INIT_LIST_HEAD(&duplicates);
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+index 4f2876f..4e29362 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+@@ -282,7 +282,6 @@ static int amdgpu_firmware_info(struct drm_amdgpu_info_firmware *fw_info,
+ static int amdgpu_info_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;
+ struct drm_amdgpu_info *info = data;
+ struct amdgpu_mode_info *minfo = &adev->mode_info;
+ void __user *out = (void __user *)(uintptr_t)info->return_pointer;
+@@ -295,8 +294,6 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
+
+ if (!info->return_size || !info->return_pointer)
+ return -EINVAL;
+- if (amdgpu_kms_vram_lost(adev, fpriv))
+- return -ENODEV;
+
+ switch (info->query) {
+ case AMDGPU_INFO_VIRTUAL_RANGE: {
+@@ -836,10 +833,19 @@ void amdgpu_driver_lastclose_kms(struct drm_device *dev)
+ vga_switcheroo_process_delayed_switch();
+ }
+
++/**
++ * 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);
++ return fpriv->vram_lost_counter !=
++ atomic_read(&adev->vram_lost_counter);
+ }
+
+ /**
+--
+2.7.4
+