diff options
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.patch | 134 |
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 + |