drm/amdgpu:fix vf_error_put
authorMonk Liu <Monk.Liu@amd.com>
Mon, 16 Oct 2017 11:50:44 +0000 (19:50 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 20 Oct 2017 17:28:44 +0000 (13:28 -0400)
1,it should not work on non-SR-IOV case
2,the NO_VBIOS error is incorrect, should
handle it under detect_sriov_bios.
3,wrap the whole detect_sriov_bios with sriov check

Signed-off-by: Monk Liu <Monk.Liu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vf_error.c

index 07726afd9307ba00c5980e2c33e9293ee78d0f3b..e29731c4ada704d7eb783990bcad8e8d8f77ad7d 100644 (file)
@@ -2032,12 +2032,17 @@ static int amdgpu_resume(struct amdgpu_device *adev)
 
 static void amdgpu_device_detect_sriov_bios(struct amdgpu_device *adev)
 {
-       if (adev->is_atom_fw) {
-               if (amdgpu_atomfirmware_gpu_supports_virtualization(adev))
-                       adev->virt.caps |= AMDGPU_SRIOV_CAPS_SRIOV_VBIOS;
-       } else {
-               if (amdgpu_atombios_has_gpu_virtualization_table(adev))
-                       adev->virt.caps |= AMDGPU_SRIOV_CAPS_SRIOV_VBIOS;
+       if (amdgpu_sriov_vf(adev)) {
+               if (adev->is_atom_fw) {
+                       if (amdgpu_atomfirmware_gpu_supports_virtualization(adev))
+                               adev->virt.caps |= AMDGPU_SRIOV_CAPS_SRIOV_VBIOS;
+               } else {
+                       if (amdgpu_atombios_has_gpu_virtualization_table(adev))
+                               adev->virt.caps |= AMDGPU_SRIOV_CAPS_SRIOV_VBIOS;
+               }
+
+               if (!(adev->virt.caps & AMDGPU_SRIOV_CAPS_SRIOV_VBIOS))
+                       amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_NO_VBIOS, 0, 0);
        }
 }
 
@@ -2207,7 +2212,6 @@ int amdgpu_device_init(struct amdgpu_device *adev,
        if (amdgpu_need_post(adev)) {
                if (!adev->bios) {
                        dev_err(adev->dev, "no vBIOS found\n");
-                       amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_NO_VBIOS, 0, 0);
                        r = -EINVAL;
                        goto failed;
                }
@@ -2215,7 +2219,6 @@ int amdgpu_device_init(struct amdgpu_device *adev,
                r = amdgpu_atom_asic_init(adev->mode_info.atom_context);
                if (r) {
                        dev_err(adev->dev, "gpu post error!\n");
-                       amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_GPU_POST_ERROR, 0, 0);
                        goto failed;
                }
        } else {
@@ -3019,7 +3022,6 @@ out:
                }
        } else {
                dev_err(adev->dev, "asic resume failed (%d).\n", r);
-               amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_ASIC_RESUME_FAIL, 0, r);
                for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
                        if (adev->rings[i] && adev->rings[i]->sched.thread) {
                                kthread_unpark(adev->rings[i]->sched.thread);
@@ -3033,7 +3035,6 @@ out:
        if (r) {
                /* bad news, how to tell it to userspace ? */
                dev_info(adev->dev, "GPU reset failed\n");
-               amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_GPU_RESET_FAIL, 0, r);
        }
        else {
                dev_info(adev->dev, "GPU reset successed!\n");
index 746b81339835eccf1b52c166974b0ce090c54758..7f7097931c6f86ae2c73b9b0a7188527360e2510 100644 (file)
@@ -31,7 +31,12 @@ void amdgpu_vf_error_put(struct amdgpu_device *adev,
                         uint64_t error_data)
 {
        int index;
-       uint16_t error_code = AMDGIM_ERROR_CODE(AMDGIM_ERROR_CATEGORY_VF, sub_error_code);
+       uint16_t error_code;
+
+       if (!amdgpu_sriov_vf(adev))
+               return;
+
+       error_code = AMDGIM_ERROR_CODE(AMDGIM_ERROR_CATEGORY_VF, sub_error_code);
 
        mutex_lock(&adev->virt.vf_errors.lock);
        index = adev->virt.vf_errors.write_count % AMDGPU_VF_ERROR_ENTRY_SIZE;