diff options
author | Chunming Zhou <David1.Zhou@amd.com> | 2017-05-15 04:48:27 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-05-24 18:11:52 -0400 |
commit | f1892138abcb6d58359189f3b0a6c95f10613513 (patch) | |
tree | 127e78746b85e17adb9793c4d38f5aadab8e9f92 /drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | |
parent | 0c49e0b8a43c8addb0498cd32390f4ef08b5dd27 (diff) |
drm/amdgpu: return -ENODEV to user space when vram is lost v2
below ioctl will return -ENODEV:
amdgpu_cs_ioctl
amdgpu_cs_wait_ioctl
amdgpu_cs_wait_fences_ioctl
amdgpu_gem_va_ioctl
amdgpu_info_ioctl
v2: only for map and replace cases in amdgpu_gem_va_ioctl
Signed-off-by: Chunming Zhou <David1.Zhou@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index 62f0a9591bb5..b324f07f137a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | |||
@@ -235,6 +235,7 @@ static int amdgpu_firmware_info(struct drm_amdgpu_info_firmware *fw_info, | |||
235 | static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | 235 | static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) |
236 | { | 236 | { |
237 | struct amdgpu_device *adev = dev->dev_private; | 237 | struct amdgpu_device *adev = dev->dev_private; |
238 | struct amdgpu_fpriv *fpriv = filp->driver_priv; | ||
238 | struct drm_amdgpu_info *info = data; | 239 | struct drm_amdgpu_info *info = data; |
239 | struct amdgpu_mode_info *minfo = &adev->mode_info; | 240 | struct amdgpu_mode_info *minfo = &adev->mode_info; |
240 | void __user *out = (void __user *)(uintptr_t)info->return_pointer; | 241 | void __user *out = (void __user *)(uintptr_t)info->return_pointer; |
@@ -247,6 +248,8 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file | |||
247 | 248 | ||
248 | if (!info->return_size || !info->return_pointer) | 249 | if (!info->return_size || !info->return_pointer) |
249 | return -EINVAL; | 250 | return -EINVAL; |
251 | if (amdgpu_kms_vram_lost(adev, fpriv)) | ||
252 | return -ENODEV; | ||
250 | 253 | ||
251 | switch (info->query) { | 254 | switch (info->query) { |
252 | case AMDGPU_INFO_ACCEL_WORKING: | 255 | case AMDGPU_INFO_ACCEL_WORKING: |
@@ -747,6 +750,12 @@ void amdgpu_driver_lastclose_kms(struct drm_device *dev) | |||
747 | vga_switcheroo_process_delayed_switch(); | 750 | vga_switcheroo_process_delayed_switch(); |
748 | } | 751 | } |
749 | 752 | ||
753 | bool amdgpu_kms_vram_lost(struct amdgpu_device *adev, | ||
754 | struct amdgpu_fpriv *fpriv) | ||
755 | { | ||
756 | return fpriv->vram_lost_counter != atomic_read(&adev->vram_lost_counter); | ||
757 | } | ||
758 | |||
750 | /** | 759 | /** |
751 | * amdgpu_driver_open_kms - drm callback for open | 760 | * amdgpu_driver_open_kms - drm callback for open |
752 | * | 761 | * |
@@ -799,6 +808,7 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) | |||
799 | 808 | ||
800 | amdgpu_ctx_mgr_init(&fpriv->ctx_mgr); | 809 | amdgpu_ctx_mgr_init(&fpriv->ctx_mgr); |
801 | 810 | ||
811 | fpriv->vram_lost_counter = atomic_read(&adev->vram_lost_counter); | ||
802 | file_priv->driver_priv = fpriv; | 812 | file_priv->driver_priv = fpriv; |
803 | 813 | ||
804 | out_suspend: | 814 | out_suspend: |