Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amd/powerplay: add sensor lock support for smu

when multithreading access sysfs of amdgpu_pm_info at the sametime.
the swsmu driver cause smu firmware hang.

eg:
single thread access:
Message A + Param A ==> right
Message B + Param B ==> right
Message C + Param C ==> right
multithreading access:
Message A + Param B ==> error
Message B + Param A ==> error
Message C + Param C ==> right

the patch will add sensor lock(mutex) to avoid this error.

Signed-off-by: Kevin Wang <kevin1.wang@amd.com>
Reviewed-by: Kenneth Feng <kenneth.feng@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Kevin Wang and committed by
Alex Deucher
95f71bfa 64e51a1b

+9
+2
drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
··· 840 840 smu->smu_baco.state = SMU_BACO_STATE_EXIT; 841 841 smu->smu_baco.platform_support = false; 842 842 843 + mutex_init(&smu->sensor_lock); 844 + 843 845 smu->watermarks_bitmap = 0; 844 846 smu->power_profile_mode = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT; 845 847 smu->default_power_profile_mode = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT;
+2
drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
··· 1025 1025 if (!data || !size) 1026 1026 return -EINVAL; 1027 1027 1028 + mutex_lock(&smu->sensor_lock); 1028 1029 switch (sensor) { 1029 1030 case AMDGPU_PP_SENSOR_MAX_FAN_RPM: 1030 1031 *(uint32_t *)data = pptable->FanMaximumRpm; ··· 1052 1051 default: 1053 1052 ret = smu_smc_read_sensor(smu, sensor, data, size); 1054 1053 } 1054 + mutex_unlock(&smu->sensor_lock); 1055 1055 1056 1056 return ret; 1057 1057 }
+1
drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
··· 350 350 const struct smu_funcs *funcs; 351 351 const struct pptable_funcs *ppt_funcs; 352 352 struct mutex mutex; 353 + struct mutex sensor_lock; 353 354 uint64_t pool_size; 354 355 355 356 struct smu_table_context smu_table;
+2
drivers/gpu/drm/amd/powerplay/navi10_ppt.c
··· 1387 1387 if(!data || !size) 1388 1388 return -EINVAL; 1389 1389 1390 + mutex_lock(&smu->sensor_lock); 1390 1391 switch (sensor) { 1391 1392 case AMDGPU_PP_SENSOR_MAX_FAN_RPM: 1392 1393 *(uint32_t *)data = pptable->FanMaximumRpm; ··· 1411 1410 default: 1412 1411 ret = smu_smc_read_sensor(smu, sensor, data, size); 1413 1412 } 1413 + mutex_unlock(&smu->sensor_lock); 1414 1414 1415 1415 return ret; 1416 1416 }
+2
drivers/gpu/drm/amd/powerplay/vega20_ppt.c
··· 3017 3017 if(!data || !size) 3018 3018 return -EINVAL; 3019 3019 3020 + mutex_lock(&smu->sensor_lock); 3020 3021 switch (sensor) { 3021 3022 case AMDGPU_PP_SENSOR_MAX_FAN_RPM: 3022 3023 *(uint32_t *)data = pptable->FanMaximumRpm; ··· 3043 3042 default: 3044 3043 ret = smu_smc_read_sensor(smu, sensor, data, size); 3045 3044 } 3045 + mutex_unlock(&smu->sensor_lock); 3046 3046 3047 3047 return ret; 3048 3048 }