Skip to content

Commit 1b50b77

Browse files
committed
hwmon: (k10temp) Add support for temperature offsets
Add support for handling temperature offset values for various AMD CPUs, similar to the code used in the coretemp driver for Intel CPUs. This is primarily for Ryzen CPUs (which has documented temperature offsets), but the code is kept generic to simplify adding additional CPUs. Signed-off-by: Guenter Roeck <linux@roeck-us.net>
1 parent 9af0a9a commit 1b50b77

File tree

1 file changed

+30
-0
lines changed

1 file changed

+30
-0
lines changed

drivers/hwmon/k10temp.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,24 @@ static DEFINE_MUTEX(nb_smu_ind_mutex);
7171
struct k10temp_data {
7272
struct pci_dev *pdev;
7373
void (*read_tempreg)(struct pci_dev *pdev, u32 *regval);
74+
int temp_offset;
75+
};
76+
77+
struct tctl_offset {
78+
u8 model;
79+
char const *id;
80+
int offset;
81+
};
82+
83+
static const struct tctl_offset tctl_offset_table[] = {
84+
{ 0x17, "AMD Ryzen 7 1600X", 20000 },
85+
{ 0x17, "AMD Ryzen 7 1700X", 20000 },
86+
{ 0x17, "AMD Ryzen 7 1800X", 20000 },
87+
{ 0x17, "AMD Ryzen Threadripper 1950X", 27000 },
88+
{ 0x17, "AMD Ryzen Threadripper 1920X", 27000 },
89+
{ 0x17, "AMD Ryzen Threadripper 1950", 10000 },
90+
{ 0x17, "AMD Ryzen Threadripper 1920", 10000 },
91+
{ 0x17, "AMD Ryzen Threadripper 1910", 10000 },
7492
};
7593

7694
static void read_tempreg_pci(struct pci_dev *pdev, u32 *regval)
@@ -110,6 +128,7 @@ static ssize_t temp1_input_show(struct device *dev,
110128

111129
data->read_tempreg(data->pdev, &regval);
112130
temp = (regval >> 21) * 125;
131+
temp -= data->temp_offset;
113132

114133
return sprintf(buf, "%u\n", temp);
115134
}
@@ -217,6 +236,7 @@ static int k10temp_probe(struct pci_dev *pdev,
217236
struct device *dev = &pdev->dev;
218237
struct k10temp_data *data;
219238
struct device *hwmon_dev;
239+
int i;
220240

221241
if (unreliable) {
222242
if (!force) {
@@ -242,6 +262,16 @@ static int k10temp_probe(struct pci_dev *pdev,
242262
else
243263
data->read_tempreg = read_tempreg_pci;
244264

265+
for (i = 0; i < ARRAY_SIZE(tctl_offset_table); i++) {
266+
const struct tctl_offset *entry = &tctl_offset_table[i];
267+
268+
if (boot_cpu_data.x86 == entry->model &&
269+
strstr(boot_cpu_data.x86_model_id, entry->id)) {
270+
data->temp_offset = entry->offset;
271+
break;
272+
}
273+
}
274+
245275
hwmon_dev = devm_hwmon_device_register_with_groups(dev, "k10temp", data,
246276
k10temp_groups);
247277
return PTR_ERR_OR_ZERO(hwmon_dev);

0 commit comments

Comments
 (0)