diff --git a/linux/LibSensors.c b/linux/LibSensors.c index 3ad095977..04518585e 100644 --- a/linux/LibSensors.c +++ b/linux/LibSensors.c @@ -225,6 +225,45 @@ void LibSensors_getCPUTemperatures(CPUData* cpus, unsigned int existingCPUs, uns } } + /* + * k10temp, see https://www.kernel.org/doc/html/latest/hwmon/k10temp.html + * temp1 = Tctl, (optional) temp2 = Tdie, temp3..temp10 = Tccd1..8 + */ + if (topDriver == TD_K10TEMP) { + /* Display Tdie instead of Tctl if available */ + if (!isnan(data[1])) + data[0] = data[1]; + + /* Compute number of CCD entries */ + unsigned int ccd_entries = 0; + for (size_t i = 2; i <= existingCPUs; i++) { + if (isnan(data[i])) + break; + + ccd_entries++; + } + + if (ccd_entries == 0) { + for (size_t i = 1; i <= existingCPUs; i++) + data[i] = data[0]; + } else { + float ccd_data[ccd_entries]; + for (size_t i = 0; i < ccd_entries; i++) + ccd_data[i] = data[i + 2]; + + /* Handle threads being listed at the end */ + unsigned int ccd_size = existingCPUs / ccd_entries / 2; + + for (size_t i = 1; i <= existingCPUs; i++) { + unsigned int index = ((i - 1) / ccd_size) % ccd_entries; + data[i] = ccd_data[index]; + } + } + + /* No further adjustments */ + goto out; + } + /* Adjust data for chips not providing a platform temperature */ if (coreTempCount + 1 == activeCPUs || coreTempCount + 1 == activeCPUs / 2) { memmove(&data[1], &data[0], existingCPUs * sizeof(*data));