drm/amdgpu: disable gfxoff when using register read interface
authorAlex Deucher <alexander.deucher@amd.com>
Thu, 14 Nov 2019 16:39:05 +0000 (11:39 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 20 Nov 2019 23:40:21 +0000 (18:40 -0500)
When gfxoff is enabled, accessing gfx registers via MMIO
can lead to a hang.

Bug: https://bugzilla.kernel.org/show_bug.cgi?id=205497
Acked-by: Xiaojie Yuan <xiaojie.yuan@amd.com>
Reviewed-by: Evan Quan <evan.quan@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c

index a042ef471fbd8bd9d318683524c5876ac3af0eca..a73206784cbaec7fe8776ee4c3f6c6c9d0f24872 100644 (file)
@@ -649,15 +649,19 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
                        return -ENOMEM;
                alloc_size = info->read_mmr_reg.count * sizeof(*regs);
 
-               for (i = 0; i < info->read_mmr_reg.count; i++)
+               amdgpu_gfx_off_ctrl(adev, false);
+               for (i = 0; i < info->read_mmr_reg.count; i++) {
                        if (amdgpu_asic_read_register(adev, se_num, sh_num,
                                                      info->read_mmr_reg.dword_offset + i,
                                                      &regs[i])) {
                                DRM_DEBUG_KMS("unallowed offset %#x\n",
                                              info->read_mmr_reg.dword_offset + i);
                                kfree(regs);
+                               amdgpu_gfx_off_ctrl(adev, true);
                                return -EFAULT;
                        }
+               }
+               amdgpu_gfx_off_ctrl(adev, true);
                n = copy_to_user(out, regs, min(size, alloc_size));
                kfree(regs);
                return n ? -EFAULT : 0;