diff options
author | V3n3RiX <venerix@koprulu.sector> | 2022-01-09 22:16:02 +0000 |
---|---|---|
committer | V3n3RiX <venerix@koprulu.sector> | 2022-01-09 22:16:02 +0000 |
commit | b907501806c020c9a430a2935677f5ed0db1f3b7 (patch) | |
tree | 59d2447f9da8ec749c49c00fe71c962a2c5348dd /sys-kernel/linux-image-redcore-lts-legacy/files/5.10-0001-Revert-hwmon-k10temp-Remove-support-for-displaying-v.patch | |
parent | 361e196143d4c25c79e7f25f3d88ce8a316929be (diff) |
sys-kernel/linux-{image,sources}-redcore-lts-legacy : move v5.10 to LTS legacy, version bump
Diffstat (limited to 'sys-kernel/linux-image-redcore-lts-legacy/files/5.10-0001-Revert-hwmon-k10temp-Remove-support-for-displaying-v.patch')
-rw-r--r-- | sys-kernel/linux-image-redcore-lts-legacy/files/5.10-0001-Revert-hwmon-k10temp-Remove-support-for-displaying-v.patch | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/sys-kernel/linux-image-redcore-lts-legacy/files/5.10-0001-Revert-hwmon-k10temp-Remove-support-for-displaying-v.patch b/sys-kernel/linux-image-redcore-lts-legacy/files/5.10-0001-Revert-hwmon-k10temp-Remove-support-for-displaying-v.patch new file mode 100644 index 00000000..a750b093 --- /dev/null +++ b/sys-kernel/linux-image-redcore-lts-legacy/files/5.10-0001-Revert-hwmon-k10temp-Remove-support-for-displaying-v.patch @@ -0,0 +1,188 @@ +From cb04c523c759e3704c6d8f81ad6fec7c94e09f69 Mon Sep 17 00:00:00 2001 +From: Gabriel Craciunescu <nix.or.die@gmail.com> +Date: Mon, 28 Dec 2020 16:23:11 +0100 +Subject: [PATCH] Revert "hwmon: (k10temp) Remove support for displaying + voltage and current on Zen CPUs" + +This reverts commit 0a4e668b5d52eed8026f5d717196b02b55fb2dc6. + +While not perfect ( and in this case caused by wrong code ), is better +than having nothing. Bugs could be fixed, and if not, such CPUs could be blacklisted +from getting the voltage informations.. +--- + drivers/hwmon/k10temp.c | 98 +++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 98 insertions(+) + +diff --git a/drivers/hwmon/k10temp.c b/drivers/hwmon/k10temp.c +index 3bc2551577a3..a250481b5a97 100644 +--- a/drivers/hwmon/k10temp.c ++++ b/drivers/hwmon/k10temp.c +@@ -11,6 +11,13 @@ + * convert raw register values is from https://github.com/ocerman/zenpower. + * The information is not confirmed from chip datasheets, but experiments + * suggest that it provides reasonable temperature values. ++ * - Register addresses to read chip voltage and current are also from ++ * https://github.com/ocerman/zenpower, and not confirmed from chip ++ * datasheets. Current calibration is board specific and not typically ++ * shared by board vendors. For this reason, current values are ++ * normalized to report 1A/LSB for core current and and 0.25A/LSB for SoC ++ * current. Reported values can be adjusted using the sensors configuration ++ * file. + */ + + #include <linux/bitops.h> +@@ -102,7 +109,10 @@ struct k10temp_data { + int temp_offset; + u32 temp_adjust_mask; + u32 show_temp; ++ u32 svi_addr[2]; + bool is_zen; ++ bool show_current; ++ int cfactor[2]; + }; + + #define TCTL_BIT 0 +@@ -127,6 +137,16 @@ static const struct tctl_offset tctl_offset_table[] = { + { 0x17, "AMD Ryzen Threadripper 29", 27000 }, /* 29{20,50,70,90}[W]X */ + }; + ++static bool is_threadripper(void) ++{ ++ return strstr(boot_cpu_data.x86_model_id, "Threadripper"); ++} ++ ++static bool is_epyc(void) ++{ ++ return strstr(boot_cpu_data.x86_model_id, "EPYC"); ++} ++ + static void read_htcreg_pci(struct pci_dev *pdev, u32 *regval) + { + pci_read_config_dword(pdev, REG_HARDWARE_THERMAL_CONTROL, regval); +@@ -191,6 +211,16 @@ static const char *k10temp_temp_label[] = { + "Tccd8", + }; + ++static const char *k10temp_in_label[] = { ++ "Vcore", ++ "Vsoc", ++}; ++ ++static const char *k10temp_curr_label[] = { ++ "Icore", ++ "Isoc", ++}; ++ + static int k10temp_read_labels(struct device *dev, + enum hwmon_sensor_types type, + u32 attr, int channel, const char **str) +@@ -199,6 +229,50 @@ static int k10temp_read_labels(struct device *dev, + case hwmon_temp: + *str = k10temp_temp_label[channel]; + break; ++ case hwmon_in: ++ *str = k10temp_in_label[channel]; ++ break; ++ case hwmon_curr: ++ *str = k10temp_curr_label[channel]; ++ break; ++ default: ++ return -EOPNOTSUPP; ++ } ++ return 0; ++} ++ ++static int k10temp_read_curr(struct device *dev, u32 attr, int channel, ++ long *val) ++{ ++ struct k10temp_data *data = dev_get_drvdata(dev); ++ u32 regval; ++ ++ switch (attr) { ++ case hwmon_curr_input: ++ amd_smn_read(amd_pci_dev_to_node_id(data->pdev), ++ data->svi_addr[channel], ®val); ++ *val = DIV_ROUND_CLOSEST(data->cfactor[channel] * ++ (regval & 0xff), ++ 1000); ++ break; ++ default: ++ return -EOPNOTSUPP; ++ } ++ return 0; ++} ++ ++static int k10temp_read_in(struct device *dev, u32 attr, int channel, long *val) ++{ ++ struct k10temp_data *data = dev_get_drvdata(dev); ++ u32 regval; ++ ++ switch (attr) { ++ case hwmon_in_input: ++ amd_smn_read(amd_pci_dev_to_node_id(data->pdev), ++ data->svi_addr[channel], ®val); ++ regval = (regval >> 16) & 0xff; ++ *val = DIV_ROUND_CLOSEST(155000 - regval * 625, 100); ++ break; + default: + return -EOPNOTSUPP; + } +@@ -257,6 +331,10 @@ static int k10temp_read(struct device *dev, enum hwmon_sensor_types type, + switch (type) { + case hwmon_temp: + return k10temp_read_temp(dev, attr, channel, val); ++ case hwmon_in: ++ return k10temp_read_in(dev, attr, channel, val); ++ case hwmon_curr: ++ return k10temp_read_curr(dev, attr, channel, val); + default: + return -EOPNOTSUPP; + } +@@ -305,6 +383,11 @@ static umode_t k10temp_is_visible(const void *_data, + return 0; + } + break; ++ case hwmon_in: ++ case hwmon_curr: ++ if (!data->show_current) ++ return 0; ++ break; + default: + return 0; + } +@@ -434,10 +517,20 @@ static int k10temp_probe(struct pci_dev *pdev, const struct pci_device_id *id) + case 0x8: /* Zen+ */ + case 0x11: /* Zen APU */ + case 0x18: /* Zen+ APU */ ++ data->show_current = !is_threadripper() && !is_epyc(); ++ data->svi_addr[0] = F17H_M01H_SVI_TEL_PLANE0; ++ data->svi_addr[1] = F17H_M01H_SVI_TEL_PLANE1; ++ data->cfactor[0] = F17H_M01H_CFACTOR_ICORE; ++ data->cfactor[1] = F17H_M01H_CFACTOR_ISOC; + k10temp_get_ccd_support(pdev, data, 4); + break; + case 0x31: /* Zen2 Threadripper */ + case 0x71: /* Zen2 */ ++ data->show_current = !is_threadripper() && !is_epyc(); ++ data->cfactor[0] = F17H_M31H_CFACTOR_ICORE; ++ data->cfactor[1] = F17H_M31H_CFACTOR_ISOC; ++ data->svi_addr[0] = F17H_M31H_SVI_TEL_PLANE0; ++ data->svi_addr[1] = F17H_M31H_SVI_TEL_PLANE1; + k10temp_get_ccd_support(pdev, data, 8); + break; + } +@@ -449,6 +542,11 @@ static int k10temp_probe(struct pci_dev *pdev, const struct pci_device_id *id) + + switch (boot_cpu_data.x86_model) { + case 0x0 ... 0x1: /* Zen3 */ ++ data->show_current = true; ++ data->svi_addr[0] = F19H_M01_SVI_TEL_PLANE0; ++ data->svi_addr[1] = F19H_M01_SVI_TEL_PLANE1; ++ data->cfactor[0] = F19H_M01H_CFACTOR_ICORE; ++ data->cfactor[1] = F19H_M01H_CFACTOR_ISOC; + k10temp_get_ccd_support(pdev, data, 8); + break; + } +-- +2.29.2 + |