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> Cc: stable@vger.kernel.org # 5.3.xalistair/sunxi64-5.4-dsi
parent
e0e4a2ce7a
commit
0092130675
|
@ -843,6 +843,8 @@ static int smu_sw_init(void *handle)
|
||||||
smu->smu_baco.state = SMU_BACO_STATE_EXIT;
|
smu->smu_baco.state = SMU_BACO_STATE_EXIT;
|
||||||
smu->smu_baco.platform_support = false;
|
smu->smu_baco.platform_support = false;
|
||||||
|
|
||||||
|
mutex_init(&smu->sensor_lock);
|
||||||
|
|
||||||
smu->watermarks_bitmap = 0;
|
smu->watermarks_bitmap = 0;
|
||||||
smu->power_profile_mode = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT;
|
smu->power_profile_mode = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT;
|
||||||
smu->default_power_profile_mode = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT;
|
smu->default_power_profile_mode = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT;
|
||||||
|
|
|
@ -1018,6 +1018,7 @@ static int arcturus_read_sensor(struct smu_context *smu,
|
||||||
if (!data || !size)
|
if (!data || !size)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
mutex_lock(&smu->sensor_lock);
|
||||||
switch (sensor) {
|
switch (sensor) {
|
||||||
case AMDGPU_PP_SENSOR_MAX_FAN_RPM:
|
case AMDGPU_PP_SENSOR_MAX_FAN_RPM:
|
||||||
*(uint32_t *)data = pptable->FanMaximumRpm;
|
*(uint32_t *)data = pptable->FanMaximumRpm;
|
||||||
|
@ -1044,6 +1045,7 @@ static int arcturus_read_sensor(struct smu_context *smu,
|
||||||
default:
|
default:
|
||||||
ret = smu_smc_read_sensor(smu, sensor, data, size);
|
ret = smu_smc_read_sensor(smu, sensor, data, size);
|
||||||
}
|
}
|
||||||
|
mutex_unlock(&smu->sensor_lock);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -344,6 +344,7 @@ struct smu_context
|
||||||
const struct smu_funcs *funcs;
|
const struct smu_funcs *funcs;
|
||||||
const struct pptable_funcs *ppt_funcs;
|
const struct pptable_funcs *ppt_funcs;
|
||||||
struct mutex mutex;
|
struct mutex mutex;
|
||||||
|
struct mutex sensor_lock;
|
||||||
uint64_t pool_size;
|
uint64_t pool_size;
|
||||||
|
|
||||||
struct smu_table_context smu_table;
|
struct smu_table_context smu_table;
|
||||||
|
|
|
@ -1386,6 +1386,7 @@ static int navi10_read_sensor(struct smu_context *smu,
|
||||||
if(!data || !size)
|
if(!data || !size)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
mutex_lock(&smu->sensor_lock);
|
||||||
switch (sensor) {
|
switch (sensor) {
|
||||||
case AMDGPU_PP_SENSOR_MAX_FAN_RPM:
|
case AMDGPU_PP_SENSOR_MAX_FAN_RPM:
|
||||||
*(uint32_t *)data = pptable->FanMaximumRpm;
|
*(uint32_t *)data = pptable->FanMaximumRpm;
|
||||||
|
@ -1409,6 +1410,7 @@ static int navi10_read_sensor(struct smu_context *smu,
|
||||||
default:
|
default:
|
||||||
ret = smu_smc_read_sensor(smu, sensor, data, size);
|
ret = smu_smc_read_sensor(smu, sensor, data, size);
|
||||||
}
|
}
|
||||||
|
mutex_unlock(&smu->sensor_lock);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3023,6 +3023,7 @@ static int vega20_read_sensor(struct smu_context *smu,
|
||||||
if(!data || !size)
|
if(!data || !size)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
mutex_lock(&smu->sensor_lock);
|
||||||
switch (sensor) {
|
switch (sensor) {
|
||||||
case AMDGPU_PP_SENSOR_MAX_FAN_RPM:
|
case AMDGPU_PP_SENSOR_MAX_FAN_RPM:
|
||||||
*(uint32_t *)data = pptable->FanMaximumRpm;
|
*(uint32_t *)data = pptable->FanMaximumRpm;
|
||||||
|
@ -3048,6 +3049,7 @@ static int vega20_read_sensor(struct smu_context *smu,
|
||||||
default:
|
default:
|
||||||
ret = smu_smc_read_sensor(smu, sensor, data, size);
|
ret = smu_smc_read_sensor(smu, sensor, data, size);
|
||||||
}
|
}
|
||||||
|
mutex_unlock(&smu->sensor_lock);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue