OSDN Git Service

drm/amdgpu: protect eeprom update from GPU reset
authorDennis Li <Dennis.Li@amd.com>
Wed, 14 Oct 2020 09:11:41 +0000 (17:11 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 21 Oct 2020 20:13:43 +0000 (16:13 -0400)
because i2c is unstable in GPU reset, driver need protect
eeprom update from GPU reset, to not miss any bad page record.

Signed-off-by: Dennis Li <Dennis.Li@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c

index 0e64c39..695bcfc 100644 (file)
@@ -149,7 +149,11 @@ static int __update_table_header(struct amdgpu_ras_eeprom_control *control,
 
        msg.addr = control->i2c_address;
 
+       /* i2c may be unstable in gpu reset */
+       down_read(&adev->reset_sem);
        ret = i2c_transfer(&adev->pm.smu_i2c, &msg, 1);
+       up_read(&adev->reset_sem);
+
        if (ret < 1)
                DRM_ERROR("Failed to write EEPROM table header, ret:%d", ret);
 
@@ -557,7 +561,11 @@ int amdgpu_ras_eeprom_process_recods(struct amdgpu_ras_eeprom_control *control,
                control->next_addr += EEPROM_TABLE_RECORD_SIZE;
        }
 
+       /* i2c may be unstable in gpu reset */
+       down_read(&adev->reset_sem);
        ret = i2c_transfer(&adev->pm.smu_i2c, msgs, num);
+       up_read(&adev->reset_sem);
+
        if (ret < 1) {
                DRM_ERROR("Failed to process EEPROM table records, ret:%d", ret);