Loading Documentation/devicetree/bindings/thermal/qoriq-thermal.txt +1 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ Required properties: Optional property: - little-endian : If present, the TMU registers are little endian. If absent, the default is big endian. - clocks : the clock for clocking the TMU silicon. Example: Loading drivers/thermal/armada_thermal.c +2 −3 Original line number Diff line number Diff line Loading @@ -53,7 +53,6 @@ #define CONTROL0_TSEN_MODE_EXTERNAL 0x2 #define CONTROL0_TSEN_MODE_MASK 0x3 #define CONTROL1_TSEN_AVG_SHIFT 0 #define CONTROL1_TSEN_AVG_MASK 0x7 #define CONTROL1_EXT_TSEN_SW_RESET BIT(7) #define CONTROL1_EXT_TSEN_HW_RESETn BIT(8) Loading Loading @@ -267,8 +266,8 @@ static void armada_cp110_init(struct platform_device *pdev, /* Average the output value over 2^1 = 2 samples */ regmap_read(priv->syscon, data->syscon_control1_off, ®); reg &= ~CONTROL1_TSEN_AVG_MASK << CONTROL1_TSEN_AVG_SHIFT; reg |= 1 << CONTROL1_TSEN_AVG_SHIFT; reg &= ~CONTROL1_TSEN_AVG_MASK; reg |= 1; regmap_write(priv->syscon, data->syscon_control1_off, reg); } Loading drivers/thermal/intel/int340x_thermal/acpi_thermal_rel.c +0 −6 Original line number Diff line number Diff line Loading @@ -77,9 +77,6 @@ int acpi_parse_trt(acpi_handle handle, int *trt_count, struct trt **trtp, struct acpi_buffer element = { 0, NULL }; struct acpi_buffer trt_format = { sizeof("RRNNNNNN"), "RRNNNNNN" }; if (!acpi_has_method(handle, "_TRT")) return -ENODEV; status = acpi_evaluate_object(handle, "_TRT", NULL, &buffer); if (ACPI_FAILURE(status)) return -ENODEV; Loading Loading @@ -158,9 +155,6 @@ int acpi_parse_art(acpi_handle handle, int *art_count, struct art **artp, struct acpi_buffer art_format = { sizeof("RRNNNNNNNNNNN"), "RRNNNNNNNNNNN" }; if (!acpi_has_method(handle, "_ART")) return -ENODEV; status = acpi_evaluate_object(handle, "_ART", NULL, &buffer); if (ACPI_FAILURE(status)) return -ENODEV; Loading drivers/thermal/intel/int340x_thermal/int3403_thermal.c +1 −1 Original line number Diff line number Diff line Loading @@ -181,7 +181,7 @@ static int int3403_cdev_add(struct int3403_priv *priv) p = buf.pointer; if (!p || (p->type != ACPI_TYPE_PACKAGE)) { printk(KERN_WARNING "Invalid PPSS data\n"); pr_warn("Invalid PPSS data\n"); kfree(buf.pointer); return -EFAULT; } Loading drivers/thermal/intel/int340x_thermal/processor_thermal_device.c +92 −4 Original line number Diff line number Diff line Loading @@ -39,6 +39,9 @@ /* GeminiLake thermal reporting device */ #define PCI_DEVICE_ID_PROC_GLK_THERMAL 0x318C /* IceLake thermal reporting device */ #define PCI_DEVICE_ID_PROC_ICL_THERMAL 0x8a03 #define DRV_NAME "proc_thermal" struct power_config { Loading Loading @@ -137,6 +140,72 @@ static const struct attribute_group power_limit_attribute_group = { .name = "power_limits" }; static ssize_t tcc_offset_degree_celsius_show(struct device *dev, struct device_attribute *attr, char *buf) { u64 val; int err; err = rdmsrl_safe(MSR_IA32_TEMPERATURE_TARGET, &val); if (err) return err; val = (val >> 24) & 0xff; return sprintf(buf, "%d\n", (int)val); } static int tcc_offset_update(int tcc) { u64 val; int err; if (!tcc) return -EINVAL; err = rdmsrl_safe(MSR_IA32_TEMPERATURE_TARGET, &val); if (err) return err; val &= ~GENMASK_ULL(31, 24); val |= (tcc & 0xff) << 24; err = wrmsrl_safe(MSR_IA32_TEMPERATURE_TARGET, val); if (err) return err; return 0; } static int tcc_offset_save; static ssize_t tcc_offset_degree_celsius_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { u64 val; int tcc, err; err = rdmsrl_safe(MSR_PLATFORM_INFO, &val); if (err) return err; if (!(val & BIT(30))) return -EACCES; if (kstrtoint(buf, 0, &tcc)) return -EINVAL; err = tcc_offset_update(tcc); if (err) return err; tcc_offset_save = tcc; return count; } static DEVICE_ATTR_RW(tcc_offset_degree_celsius); static int stored_tjmax; /* since it is fixed, we can have local storage */ static int get_tjmax(void) Loading Loading @@ -332,6 +401,7 @@ static void proc_thermal_remove(struct proc_thermal_device *proc_priv) acpi_remove_notify_handler(proc_priv->adev->handle, ACPI_DEVICE_NOTIFY, proc_thermal_notify); int340x_thermal_zone_remove(proc_priv->int340x_zone); sysfs_remove_file(&proc_priv->dev->kobj, &dev_attr_tcc_offset_degree_celsius.attr); sysfs_remove_group(&proc_priv->dev->kobj, &power_limit_attribute_group); } Loading @@ -355,8 +425,15 @@ static int int3401_add(struct platform_device *pdev) dev_info(&pdev->dev, "Creating sysfs group for PROC_THERMAL_PLATFORM_DEV\n"); return sysfs_create_group(&pdev->dev.kobj, &power_limit_attribute_group); ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_tcc_offset_degree_celsius.attr); if (ret) return ret; ret = sysfs_create_group(&pdev->dev.kobj, &power_limit_attribute_group); if (ret) sysfs_remove_file(&pdev->dev.kobj, &dev_attr_tcc_offset_degree_celsius.attr); return ret; } static int int3401_remove(struct platform_device *pdev) Loading Loading @@ -588,8 +665,15 @@ static int proc_thermal_pci_probe(struct pci_dev *pdev, dev_info(&pdev->dev, "Creating sysfs group for PROC_THERMAL_PCI\n"); return sysfs_create_group(&pdev->dev.kobj, &power_limit_attribute_group); ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_tcc_offset_degree_celsius.attr); if (ret) return ret; ret = sysfs_create_group(&pdev->dev.kobj, &power_limit_attribute_group); if (ret) sysfs_remove_file(&pdev->dev.kobj, &dev_attr_tcc_offset_degree_celsius.attr); return ret; } static void proc_thermal_pci_remove(struct pci_dev *pdev) Loading @@ -615,6 +699,8 @@ static int proc_thermal_resume(struct device *dev) proc_dev = dev_get_drvdata(dev); proc_thermal_read_ppcc(proc_dev); tcc_offset_update(tcc_offset_save); return 0; } #else Loading @@ -636,6 +722,8 @@ static const struct pci_device_id proc_thermal_pci_ids[] = { { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_PROC_CNL_THERMAL)}, { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_PROC_CFL_THERMAL)}, { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_PROC_GLK_THERMAL)}, { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_PROC_ICL_THERMAL), .driver_data = (kernel_ulong_t)&rapl_mmio_hsw, }, { 0, }, }; Loading Loading
Documentation/devicetree/bindings/thermal/qoriq-thermal.txt +1 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ Required properties: Optional property: - little-endian : If present, the TMU registers are little endian. If absent, the default is big endian. - clocks : the clock for clocking the TMU silicon. Example: Loading
drivers/thermal/armada_thermal.c +2 −3 Original line number Diff line number Diff line Loading @@ -53,7 +53,6 @@ #define CONTROL0_TSEN_MODE_EXTERNAL 0x2 #define CONTROL0_TSEN_MODE_MASK 0x3 #define CONTROL1_TSEN_AVG_SHIFT 0 #define CONTROL1_TSEN_AVG_MASK 0x7 #define CONTROL1_EXT_TSEN_SW_RESET BIT(7) #define CONTROL1_EXT_TSEN_HW_RESETn BIT(8) Loading Loading @@ -267,8 +266,8 @@ static void armada_cp110_init(struct platform_device *pdev, /* Average the output value over 2^1 = 2 samples */ regmap_read(priv->syscon, data->syscon_control1_off, ®); reg &= ~CONTROL1_TSEN_AVG_MASK << CONTROL1_TSEN_AVG_SHIFT; reg |= 1 << CONTROL1_TSEN_AVG_SHIFT; reg &= ~CONTROL1_TSEN_AVG_MASK; reg |= 1; regmap_write(priv->syscon, data->syscon_control1_off, reg); } Loading
drivers/thermal/intel/int340x_thermal/acpi_thermal_rel.c +0 −6 Original line number Diff line number Diff line Loading @@ -77,9 +77,6 @@ int acpi_parse_trt(acpi_handle handle, int *trt_count, struct trt **trtp, struct acpi_buffer element = { 0, NULL }; struct acpi_buffer trt_format = { sizeof("RRNNNNNN"), "RRNNNNNN" }; if (!acpi_has_method(handle, "_TRT")) return -ENODEV; status = acpi_evaluate_object(handle, "_TRT", NULL, &buffer); if (ACPI_FAILURE(status)) return -ENODEV; Loading Loading @@ -158,9 +155,6 @@ int acpi_parse_art(acpi_handle handle, int *art_count, struct art **artp, struct acpi_buffer art_format = { sizeof("RRNNNNNNNNNNN"), "RRNNNNNNNNNNN" }; if (!acpi_has_method(handle, "_ART")) return -ENODEV; status = acpi_evaluate_object(handle, "_ART", NULL, &buffer); if (ACPI_FAILURE(status)) return -ENODEV; Loading
drivers/thermal/intel/int340x_thermal/int3403_thermal.c +1 −1 Original line number Diff line number Diff line Loading @@ -181,7 +181,7 @@ static int int3403_cdev_add(struct int3403_priv *priv) p = buf.pointer; if (!p || (p->type != ACPI_TYPE_PACKAGE)) { printk(KERN_WARNING "Invalid PPSS data\n"); pr_warn("Invalid PPSS data\n"); kfree(buf.pointer); return -EFAULT; } Loading
drivers/thermal/intel/int340x_thermal/processor_thermal_device.c +92 −4 Original line number Diff line number Diff line Loading @@ -39,6 +39,9 @@ /* GeminiLake thermal reporting device */ #define PCI_DEVICE_ID_PROC_GLK_THERMAL 0x318C /* IceLake thermal reporting device */ #define PCI_DEVICE_ID_PROC_ICL_THERMAL 0x8a03 #define DRV_NAME "proc_thermal" struct power_config { Loading Loading @@ -137,6 +140,72 @@ static const struct attribute_group power_limit_attribute_group = { .name = "power_limits" }; static ssize_t tcc_offset_degree_celsius_show(struct device *dev, struct device_attribute *attr, char *buf) { u64 val; int err; err = rdmsrl_safe(MSR_IA32_TEMPERATURE_TARGET, &val); if (err) return err; val = (val >> 24) & 0xff; return sprintf(buf, "%d\n", (int)val); } static int tcc_offset_update(int tcc) { u64 val; int err; if (!tcc) return -EINVAL; err = rdmsrl_safe(MSR_IA32_TEMPERATURE_TARGET, &val); if (err) return err; val &= ~GENMASK_ULL(31, 24); val |= (tcc & 0xff) << 24; err = wrmsrl_safe(MSR_IA32_TEMPERATURE_TARGET, val); if (err) return err; return 0; } static int tcc_offset_save; static ssize_t tcc_offset_degree_celsius_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { u64 val; int tcc, err; err = rdmsrl_safe(MSR_PLATFORM_INFO, &val); if (err) return err; if (!(val & BIT(30))) return -EACCES; if (kstrtoint(buf, 0, &tcc)) return -EINVAL; err = tcc_offset_update(tcc); if (err) return err; tcc_offset_save = tcc; return count; } static DEVICE_ATTR_RW(tcc_offset_degree_celsius); static int stored_tjmax; /* since it is fixed, we can have local storage */ static int get_tjmax(void) Loading Loading @@ -332,6 +401,7 @@ static void proc_thermal_remove(struct proc_thermal_device *proc_priv) acpi_remove_notify_handler(proc_priv->adev->handle, ACPI_DEVICE_NOTIFY, proc_thermal_notify); int340x_thermal_zone_remove(proc_priv->int340x_zone); sysfs_remove_file(&proc_priv->dev->kobj, &dev_attr_tcc_offset_degree_celsius.attr); sysfs_remove_group(&proc_priv->dev->kobj, &power_limit_attribute_group); } Loading @@ -355,8 +425,15 @@ static int int3401_add(struct platform_device *pdev) dev_info(&pdev->dev, "Creating sysfs group for PROC_THERMAL_PLATFORM_DEV\n"); return sysfs_create_group(&pdev->dev.kobj, &power_limit_attribute_group); ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_tcc_offset_degree_celsius.attr); if (ret) return ret; ret = sysfs_create_group(&pdev->dev.kobj, &power_limit_attribute_group); if (ret) sysfs_remove_file(&pdev->dev.kobj, &dev_attr_tcc_offset_degree_celsius.attr); return ret; } static int int3401_remove(struct platform_device *pdev) Loading Loading @@ -588,8 +665,15 @@ static int proc_thermal_pci_probe(struct pci_dev *pdev, dev_info(&pdev->dev, "Creating sysfs group for PROC_THERMAL_PCI\n"); return sysfs_create_group(&pdev->dev.kobj, &power_limit_attribute_group); ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_tcc_offset_degree_celsius.attr); if (ret) return ret; ret = sysfs_create_group(&pdev->dev.kobj, &power_limit_attribute_group); if (ret) sysfs_remove_file(&pdev->dev.kobj, &dev_attr_tcc_offset_degree_celsius.attr); return ret; } static void proc_thermal_pci_remove(struct pci_dev *pdev) Loading @@ -615,6 +699,8 @@ static int proc_thermal_resume(struct device *dev) proc_dev = dev_get_drvdata(dev); proc_thermal_read_ppcc(proc_dev); tcc_offset_update(tcc_offset_save); return 0; } #else Loading @@ -636,6 +722,8 @@ static const struct pci_device_id proc_thermal_pci_ids[] = { { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_PROC_CNL_THERMAL)}, { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_PROC_CFL_THERMAL)}, { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_PROC_GLK_THERMAL)}, { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_PROC_ICL_THERMAL), .driver_data = (kernel_ulong_t)&rapl_mmio_hsw, }, { 0, }, }; Loading