Commit 60465245 authored by Guenter Roeck's avatar Guenter Roeck

hwmon: (k10temp) Reorganize and simplify temperature support detection

Use a bit map to describe if temperature channels are supported,
and use it for all temperature channels. Use a separate flag,
independent of Tdie support, to indicate if the system is running
on a Ryzen CPU.
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent b02c6857
...@@ -96,13 +96,20 @@ struct k10temp_data { ...@@ -96,13 +96,20 @@ struct k10temp_data {
void (*read_tempreg)(struct pci_dev *pdev, u32 *regval); void (*read_tempreg)(struct pci_dev *pdev, u32 *regval);
int temp_offset; int temp_offset;
u32 temp_adjust_mask; u32 temp_adjust_mask;
bool show_tdie; u32 show_temp;
u32 show_tccd;
u32 svi_addr[2]; u32 svi_addr[2];
bool is_zen;
bool show_current; bool show_current;
int cfactor[2]; int cfactor[2];
}; };
#define TCTL_BIT 0
#define TDIE_BIT 1
#define TCCD_BIT(x) ((x) + 2)
#define HAVE_TEMP(d, channel) ((d)->show_temp & BIT(channel))
#define HAVE_TDIE(d) HAVE_TEMP(d, TDIE_BIT)
struct tctl_offset { struct tctl_offset {
u8 model; u8 model;
char const *id; char const *id;
...@@ -333,23 +340,11 @@ static umode_t k10temp_is_visible(const void *_data, ...@@ -333,23 +340,11 @@ static umode_t k10temp_is_visible(const void *_data,
case hwmon_temp: case hwmon_temp:
switch (attr) { switch (attr) {
case hwmon_temp_input: case hwmon_temp_input:
switch (channel) { if (!HAVE_TEMP(data, channel))
case 0: /* Tctl */
break;
case 1: /* Tdie */
if (!data->show_tdie)
return 0; return 0;
break; break;
case 2 ... 9: /* Tccd{1-8} */
if (!(data->show_tccd & BIT(channel - 2)))
return 0;
break;
default:
return 0;
}
break;
case hwmon_temp_max: case hwmon_temp_max:
if (channel || data->show_tdie) if (channel || data->is_zen)
return 0; return 0;
break; break;
case hwmon_temp_crit: case hwmon_temp_crit:
...@@ -368,20 +363,9 @@ static umode_t k10temp_is_visible(const void *_data, ...@@ -368,20 +363,9 @@ static umode_t k10temp_is_visible(const void *_data,
return 0; return 0;
break; break;
case hwmon_temp_label: case hwmon_temp_label:
/* No labels if we don't show the die temperature */ /* Show temperature labels only on Zen CPUs */
if (!data->show_tdie) if (!data->is_zen || !HAVE_TEMP(data, channel))
return 0; return 0;
switch (channel) {
case 0: /* Tctl */
case 1: /* Tdie */
break;
case 2 ... 9: /* Tccd{1-8} */
if (!(data->show_tccd & BIT(channel - 2)))
return 0;
break;
default:
return 0;
}
break; break;
default: default:
return 0; return 0;
...@@ -480,7 +464,7 @@ static void k10temp_init_debugfs(struct k10temp_data *data) ...@@ -480,7 +464,7 @@ static void k10temp_init_debugfs(struct k10temp_data *data)
char name[32]; char name[32];
/* Only show debugfs data for Family 17h/18h CPUs */ /* Only show debugfs data for Family 17h/18h CPUs */
if (!data->show_tdie) if (!data->is_zen)
return; return;
scnprintf(name, sizeof(name), "k10temp-%s", pci_name(data->pdev)); scnprintf(name, sizeof(name), "k10temp-%s", pci_name(data->pdev));
...@@ -546,7 +530,7 @@ static void k10temp_get_ccd_support(struct pci_dev *pdev, ...@@ -546,7 +530,7 @@ static void k10temp_get_ccd_support(struct pci_dev *pdev,
amd_smn_read(amd_pci_dev_to_node_id(pdev), amd_smn_read(amd_pci_dev_to_node_id(pdev),
F17H_M70H_CCD_TEMP(i), &regval); F17H_M70H_CCD_TEMP(i), &regval);
if (regval & F17H_M70H_CCD_TEMP_VALID) if (regval & F17H_M70H_CCD_TEMP_VALID)
data->show_tccd |= BIT(i); data->show_temp |= BIT(TCCD_BIT(i));
} }
} }
...@@ -573,6 +557,7 @@ static int k10temp_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -573,6 +557,7 @@ static int k10temp_probe(struct pci_dev *pdev, const struct pci_device_id *id)
return -ENOMEM; return -ENOMEM;
data->pdev = pdev; data->pdev = pdev;
data->show_temp |= BIT(TCTL_BIT); /* Always show Tctl */
if (boot_cpu_data.x86 == 0x15 && if (boot_cpu_data.x86 == 0x15 &&
((boot_cpu_data.x86_model & 0xf0) == 0x60 || ((boot_cpu_data.x86_model & 0xf0) == 0x60 ||
...@@ -582,7 +567,8 @@ static int k10temp_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -582,7 +567,8 @@ static int k10temp_probe(struct pci_dev *pdev, const struct pci_device_id *id)
} else if (boot_cpu_data.x86 == 0x17 || boot_cpu_data.x86 == 0x18) { } else if (boot_cpu_data.x86 == 0x17 || boot_cpu_data.x86 == 0x18) {
data->temp_adjust_mask = CUR_TEMP_RANGE_SEL_MASK; data->temp_adjust_mask = CUR_TEMP_RANGE_SEL_MASK;
data->read_tempreg = read_tempreg_nb_f17; data->read_tempreg = read_tempreg_nb_f17;
data->show_tdie = true; data->show_temp |= BIT(TDIE_BIT); /* show Tdie */
data->is_zen = true;
switch (boot_cpu_data.x86_model) { switch (boot_cpu_data.x86_model) {
case 0x1: /* Zen */ case 0x1: /* Zen */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment