aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
diff options
context:
space:
mode:
authorChunming Zhou <David1.Zhou@amd.com>2017-05-15 04:48:27 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-05-24 18:11:52 -0400
commitf1892138abcb6d58359189f3b0a6c95f10613513 (patch)
tree127e78746b85e17adb9793c4d38f5aadab8e9f92 /drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
parent0c49e0b8a43c8addb0498cd32390f4ef08b5dd27 (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.c10
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,
235static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) 235static 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
753bool 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
804out_suspend: 814out_suspend: