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

drm/amd/powerplay: add temperature sensor support for navi10

the hwmon interface need temperature sensor type support.
1. SENSOR_HOTSPOT_TEMP
2. SENSOR_EDGE_TEMP(SENSOR_GPU_TEMP)
3. SENSOR_MEM_TEMP

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

authored by

Kevin Wang and committed by
Alex Deucher
e5aa29ce 71cc9ef3

+41
+41
drivers/gpu/drm/amd/powerplay/navi10_ppt.c
··· 1255 1255 return 0; 1256 1256 } 1257 1257 1258 + static int navi10_thermal_get_temperature(struct smu_context *smu, 1259 + enum amd_pp_sensors sensor, 1260 + uint32_t *value) 1261 + { 1262 + SmuMetrics_t metrics; 1263 + int ret = 0; 1264 + 1265 + if (!value) 1266 + return -EINVAL; 1267 + 1268 + ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS, (void *)&metrics, false); 1269 + if (ret) 1270 + return ret; 1271 + 1272 + switch (sensor) { 1273 + case AMDGPU_PP_SENSOR_HOTSPOT_TEMP: 1274 + *value = metrics.TemperatureHotspot * 1275 + SMU_TEMPERATURE_UNITS_PER_CENTIGRADES; 1276 + break; 1277 + case AMDGPU_PP_SENSOR_EDGE_TEMP: 1278 + *value = metrics.TemperatureEdge * 1279 + SMU_TEMPERATURE_UNITS_PER_CENTIGRADES; 1280 + break; 1281 + case AMDGPU_PP_SENSOR_MEM_TEMP: 1282 + *value = metrics.TemperatureMem * 1283 + SMU_TEMPERATURE_UNITS_PER_CENTIGRADES; 1284 + break; 1285 + default: 1286 + pr_err("Invalid sensor for retrieving temp\n"); 1287 + return -EINVAL; 1288 + } 1289 + 1290 + return 0; 1291 + } 1292 + 1258 1293 static int navi10_read_sensor(struct smu_context *smu, 1259 1294 enum amd_pp_sensors sensor, 1260 1295 void *data, uint32_t *size) ··· 1309 1274 break; 1310 1275 case AMDGPU_PP_SENSOR_GPU_POWER: 1311 1276 ret = navi10_get_gpu_power(smu, (uint32_t *)data); 1277 + *size = 4; 1278 + break; 1279 + case AMDGPU_PP_SENSOR_HOTSPOT_TEMP: 1280 + case AMDGPU_PP_SENSOR_EDGE_TEMP: 1281 + case AMDGPU_PP_SENSOR_MEM_TEMP: 1282 + ret = navi10_thermal_get_temperature(smu, sensor, (uint32_t *)data); 1312 1283 *size = 4; 1313 1284 break; 1314 1285 default: