aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2017-10-09 08:45:09 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-10-19 15:27:03 -0400
commit396bcb41e035df7b98fb150ca950bf213e70ae7b (patch)
tree09ec736839cc47c275c6dd677271af1520b11cc9 /drivers/gpu/drm/amd/amdgpu
parent6ed4e2e673d348df6623012a628a8ab8624e3222 (diff)
drm/amdgpu: partial revert VRAM lost handling v2
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> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c11
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c14
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 5de092eab0fa..0c07df72743c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -1272,16 +1272,12 @@ int amdgpu_cs_wait_ioctl(struct drm_device *dev, void *data,
1272{ 1272{
1273 union drm_amdgpu_wait_cs *wait = data; 1273 union drm_amdgpu_wait_cs *wait = data;
1274 struct amdgpu_device *adev = dev->dev_private; 1274 struct amdgpu_device *adev = dev->dev_private;
1275 struct amdgpu_fpriv *fpriv = filp->driver_priv;
1276 unsigned long timeout = amdgpu_gem_timeout(wait->in.timeout); 1275 unsigned long timeout = amdgpu_gem_timeout(wait->in.timeout);
1277 struct amdgpu_ring *ring = NULL; 1276 struct amdgpu_ring *ring = NULL;
1278 struct amdgpu_ctx *ctx; 1277 struct amdgpu_ctx *ctx;
1279 struct dma_fence *fence; 1278 struct dma_fence *fence;
1280 long r; 1279 long r;
1281 1280
1282 if (amdgpu_kms_vram_lost(adev, fpriv))
1283 return -ENODEV;
1284
1285 ctx = amdgpu_ctx_get(filp->driver_priv, wait->in.ctx_id); 1281 ctx = amdgpu_ctx_get(filp->driver_priv, wait->in.ctx_id);
1286 if (ctx == NULL) 1282 if (ctx == NULL)
1287 return -EINVAL; 1283 return -EINVAL;
@@ -1350,16 +1346,12 @@ int amdgpu_cs_fence_to_handle_ioctl(struct drm_device *dev, void *data,
1350 struct drm_file *filp) 1346 struct drm_file *filp)
1351{ 1347{
1352 struct amdgpu_device *adev = dev->dev_private; 1348 struct amdgpu_device *adev = dev->dev_private;
1353 struct amdgpu_fpriv *fpriv = filp->driver_priv;
1354 union drm_amdgpu_fence_to_handle *info = data; 1349 union drm_amdgpu_fence_to_handle *info = data;
1355 struct dma_fence *fence; 1350 struct dma_fence *fence;
1356 struct drm_syncobj *syncobj; 1351 struct drm_syncobj *syncobj;
1357 struct sync_file *sync_file; 1352 struct sync_file *sync_file;
1358 int fd, r; 1353 int fd, r;
1359 1354
1360 if (amdgpu_kms_vram_lost(adev, fpriv))
1361 return -ENODEV;
1362
1363 fence = amdgpu_cs_get_fence(adev, filp, &info->in.fence); 1355 fence = amdgpu_cs_get_fence(adev, filp, &info->in.fence);
1364 if (IS_ERR(fence)) 1356 if (IS_ERR(fence))
1365 return PTR_ERR(fence); 1357 return PTR_ERR(fence);
@@ -1521,15 +1513,12 @@ int amdgpu_cs_wait_fences_ioctl(struct drm_device *dev, void *data,
1521 struct drm_file *filp) 1513 struct drm_file *filp)
1522{ 1514{
1523 struct amdgpu_device *adev = dev->dev_private; 1515 struct amdgpu_device *adev = dev->dev_private;
1524 struct amdgpu_fpriv *fpriv = filp->driver_priv;
1525 union drm_amdgpu_wait_fences *wait = data; 1516 union drm_amdgpu_wait_fences *wait = data;
1526 uint32_t fence_count = wait->in.fence_count; 1517 uint32_t fence_count = wait->in.fence_count;
1527 struct drm_amdgpu_fence *fences_user; 1518 struct drm_amdgpu_fence *fences_user;
1528 struct drm_amdgpu_fence *fences; 1519 struct drm_amdgpu_fence *fences;
1529 int r; 1520 int r;
1530 1521
1531 if (amdgpu_kms_vram_lost(adev, fpriv))
1532 return -ENODEV;
1533 /* Get the fences from userspace */ 1522 /* Get the fences from userspace */
1534 fences = kmalloc_array(fence_count, sizeof(struct drm_amdgpu_fence), 1523 fences = kmalloc_array(fence_count, sizeof(struct drm_amdgpu_fence),
1535 GFP_KERNEL); 1524 GFP_KERNEL);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
index 21e99366cab3..fb72edc4c026 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
@@ -579,11 +579,6 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
579 args->operation); 579 args->operation);
580 return -EINVAL; 580 return -EINVAL;
581 } 581 }
582 if ((args->operation == AMDGPU_VA_OP_MAP) ||
583 (args->operation == AMDGPU_VA_OP_REPLACE)) {
584 if (amdgpu_kms_vram_lost(adev, fpriv))
585 return -ENODEV;
586 }
587 582
588 INIT_LIST_HEAD(&list); 583 INIT_LIST_HEAD(&list);
589 INIT_LIST_HEAD(&duplicates); 584 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 82e8d43b235a..f759836d10ef 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -270,7 +270,6 @@ static int amdgpu_firmware_info(struct drm_amdgpu_info_firmware *fw_info,
270static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) 270static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
271{ 271{
272 struct amdgpu_device *adev = dev->dev_private; 272 struct amdgpu_device *adev = dev->dev_private;
273 struct amdgpu_fpriv *fpriv = filp->driver_priv;
274 struct drm_amdgpu_info *info = data; 273 struct drm_amdgpu_info *info = data;
275 struct amdgpu_mode_info *minfo = &adev->mode_info; 274 struct amdgpu_mode_info *minfo = &adev->mode_info;
276 void __user *out = (void __user *)(uintptr_t)info->return_pointer; 275 void __user *out = (void __user *)(uintptr_t)info->return_pointer;
@@ -283,8 +282,6 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
283 282
284 if (!info->return_size || !info->return_pointer) 283 if (!info->return_size || !info->return_pointer)
285 return -EINVAL; 284 return -EINVAL;
286 if (amdgpu_kms_vram_lost(adev, fpriv))
287 return -ENODEV;
288 285
289 switch (info->query) { 286 switch (info->query) {
290 case AMDGPU_INFO_ACCEL_WORKING: 287 case AMDGPU_INFO_ACCEL_WORKING:
@@ -792,10 +789,19 @@ void amdgpu_driver_lastclose_kms(struct drm_device *dev)
792 vga_switcheroo_process_delayed_switch(); 789 vga_switcheroo_process_delayed_switch();
793} 790}
794 791
792/**
793 * amdgpu_kms_vram_lost - check if VRAM was lost for this client
794 *
795 * @adev: amdgpu device
796 * @fpriv: client private
797 *
798 * Check if all CS is blocked for the client because of lost VRAM
799 */
795bool amdgpu_kms_vram_lost(struct amdgpu_device *adev, 800bool amdgpu_kms_vram_lost(struct amdgpu_device *adev,
796 struct amdgpu_fpriv *fpriv) 801 struct amdgpu_fpriv *fpriv)
797{ 802{
798 return fpriv->vram_lost_counter != atomic_read(&adev->vram_lost_counter); 803 return fpriv->vram_lost_counter !=
804 atomic_read(&adev->vram_lost_counter);
799} 805}
800 806
801/** 807/**