[kernel] r16953 - in dists/squeeze/linux-2.6/debian: . config/kernelarch-x86 patches/features/all patches/series
Bastian Blank
waldi at alioth.debian.org
Mon Feb 28 07:32:46 UTC 2011
Author: waldi
Date: Mon Feb 28 07:32:43 2011
New Revision: 16953
Log:
* debian/changelog: Update.
* debian/patches/features/all/hwmon-k10temp.patch: Add
* debian/patches/series/31: Enable new patch.
* debian/config/kernelarch-x86/config: Enable SENSORS_K10TEMP.
Added:
dists/squeeze/linux-2.6/debian/patches/features/all/hwmon-k10temp.patch
Modified:
dists/squeeze/linux-2.6/debian/changelog
dists/squeeze/linux-2.6/debian/config/kernelarch-x86/config
dists/squeeze/linux-2.6/debian/patches/series/31
Modified: dists/squeeze/linux-2.6/debian/changelog
==============================================================================
--- dists/squeeze/linux-2.6/debian/changelog Mon Feb 28 04:35:20 2011 (r16952)
+++ dists/squeeze/linux-2.6/debian/changelog Mon Feb 28 07:32:43 2011 (r16953)
@@ -64,6 +64,10 @@
Thanks to Fabio M. Di Nitto <fabbione at fabbione.net> for the patch.
(Closes: #602853)
+ [ Bastian Blank ]
+ * Add supportt for AMD Family 10h/11h CPU internal temperatur sensor.
+ (closes: #614555)
+
-- Ian Campbell <ijc at hellion.org.uk> Thu, 13 Jan 2011 07:07:54 +0000
linux-2.6 (2.6.32-30) unstable; urgency=high
Modified: dists/squeeze/linux-2.6/debian/config/kernelarch-x86/config
==============================================================================
--- dists/squeeze/linux-2.6/debian/config/kernelarch-x86/config Mon Feb 28 04:35:20 2011 (r16952)
+++ dists/squeeze/linux-2.6/debian/config/kernelarch-x86/config Mon Feb 28 07:32:43 2011 (r16953)
@@ -414,6 +414,7 @@
CONFIG_SENSORS_ADM1026=m
CONFIG_SENSORS_ADM1031=m
CONFIG_SENSORS_K8TEMP=m
+CONFIG_SENSORS_K10TEMP=m
CONFIG_SENSORS_ASB100=m
CONFIG_SENSORS_DS1621=m
CONFIG_SENSORS_F71805F=m
Added: dists/squeeze/linux-2.6/debian/patches/features/all/hwmon-k10temp.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/hwmon-k10temp.patch Mon Feb 28 07:32:43 2011 (r16953)
@@ -0,0 +1,384 @@
+commit 3c57e89b467d1db6fda74d5c97112c8b9466dd97
+Author: Clemens Ladisch <clemens at ladisch.de>
+Date: Wed Dec 16 21:38:25 2009 +0100
+
+ hwmon: New driver for AMD Family 10h/11h CPUs
+
+ This adds a driver for the internal temperature sensor of AMD Family 10h
+ and 11h CPUs.
+
+ Signed-off-by: Clemens Ladisch <clemens at ladisch.de>
+ Signed-off-by: Jean Delvare <khali at linux-fr.org>
+
+diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
+index 95ccbe3..665947f 100644
+--- a/drivers/hwmon/Kconfig
++++ b/drivers/hwmon/Kconfig
+@@ -228,6 +228,18 @@ config SENSORS_K8TEMP
+ This driver can also be built as a module. If so, the module
+ will be called k8temp.
+
++config SENSORS_K10TEMP
++ tristate "AMD Phenom/Sempron/Turion/Opteron temperature sensor"
++ depends on X86 && PCI
++ help
++ If you say yes here you get support for the temperature
++ sensor(s) inside your CPU. Supported are later revisions of
++ the AMD Family 10h and all revisions of the AMD Family 11h
++ microarchitectures.
++
++ This driver can also be built as a module. If so, the module
++ will be called k10temp.
++
+ config SENSORS_AMS
+ tristate "Apple Motion Sensor driver"
+ depends on PPC_PMAC && !PPC64 && INPUT && ((ADB_PMU && I2C = y) || (ADB_PMU && !I2C) || I2C) && EXPERIMENTAL
+diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
+index 33c2ee1..da84a6a 100644
+--- a/drivers/hwmon/Makefile
++++ b/drivers/hwmon/Makefile
+@@ -53,6 +53,7 @@ obj-$(CONFIG_SENSORS_IBMAEM) += ibmaem.o
+ obj-$(CONFIG_SENSORS_IBMPEX) += ibmpex.o
+ obj-$(CONFIG_SENSORS_IT87) += it87.o
+ obj-$(CONFIG_SENSORS_K8TEMP) += k8temp.o
++obj-$(CONFIG_SENSORS_K10TEMP) += k10temp.o
+ obj-$(CONFIG_SENSORS_LIS3LV02D) += lis3lv02d.o hp_accel.o
+ obj-$(CONFIG_SENSORS_LIS3_SPI) += lis3lv02d.o lis3lv02d_spi.o
+ obj-$(CONFIG_SENSORS_LM63) += lm63.o
+diff --git a/drivers/hwmon/k10temp.c b/drivers/hwmon/k10temp.c
+new file mode 100644
+index 0000000..d8a26d1
+--- /dev/null
++++ b/drivers/hwmon/k10temp.c
+@@ -0,0 +1,197 @@
++/*
++ * k10temp.c - AMD Family 10h/11h processor hardware monitoring
++ *
++ * Copyright (c) 2009 Clemens Ladisch <clemens at ladisch.de>
++ *
++ *
++ * This driver is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This driver is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
++ * See the GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this driver; if not, see <http://www.gnu.org/licenses/>.
++ */
++
++#include <linux/err.h>
++#include <linux/hwmon.h>
++#include <linux/hwmon-sysfs.h>
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/pci.h>
++#include <asm/processor.h>
++
++MODULE_DESCRIPTION("AMD Family 10h/11h CPU core temperature monitor");
++MODULE_AUTHOR("Clemens Ladisch <clemens at ladisch.de>");
++MODULE_LICENSE("GPL");
++
++static bool force;
++module_param(force, bool, 0444);
++MODULE_PARM_DESC(force, "force loading on processors with erratum 319");
++
++#define REG_HARDWARE_THERMAL_CONTROL 0x64
++#define HTC_ENABLE 0x00000001
++
++#define REG_REPORTED_TEMPERATURE 0xa4
++
++#define REG_NORTHBRIDGE_CAPABILITIES 0xe8
++#define NB_CAP_HTC 0x00000400
++
++static ssize_t show_temp(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ u32 regval;
++
++ pci_read_config_dword(to_pci_dev(dev),
++ REG_REPORTED_TEMPERATURE, ®val);
++ return sprintf(buf, "%u\n", (regval >> 21) * 125);
++}
++
++static ssize_t show_temp_max(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ return sprintf(buf, "%d\n", 70 * 1000);
++}
++
++static ssize_t show_temp_crit(struct device *dev,
++ struct device_attribute *devattr, char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ int show_hyst = attr->index;
++ u32 regval;
++ int value;
++
++ pci_read_config_dword(to_pci_dev(dev),
++ REG_HARDWARE_THERMAL_CONTROL, ®val);
++ value = ((regval >> 16) & 0x7f) * 500 + 52000;
++ if (show_hyst)
++ value -= ((regval >> 24) & 0xf) * 500;
++ return sprintf(buf, "%d\n", value);
++}
++
++static ssize_t show_name(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ return sprintf(buf, "k10temp\n");
++}
++
++static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL);
++static DEVICE_ATTR(temp1_max, S_IRUGO, show_temp_max, NULL);
++static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO, show_temp_crit, NULL, 0);
++static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IRUGO, show_temp_crit, NULL, 1);
++static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
++
++static bool __devinit has_erratum_319(void)
++{
++ /*
++ * Erratum 319: The thermal sensor of older Family 10h processors
++ * (B steppings) may be unreliable.
++ */
++ return boot_cpu_data.x86 == 0x10 && boot_cpu_data.x86_model <= 2;
++}
++
++static int __devinit k10temp_probe(struct pci_dev *pdev,
++ const struct pci_device_id *id)
++{
++ struct device *hwmon_dev;
++ u32 reg_caps, reg_htc;
++ int err;
++
++ if (has_erratum_319() && !force) {
++ dev_err(&pdev->dev,
++ "unreliable CPU thermal sensor; monitoring disabled\n");
++ err = -ENODEV;
++ goto exit;
++ }
++
++ err = device_create_file(&pdev->dev, &dev_attr_temp1_input);
++ if (err)
++ goto exit;
++ err = device_create_file(&pdev->dev, &dev_attr_temp1_max);
++ if (err)
++ goto exit_remove;
++
++ pci_read_config_dword(pdev, REG_NORTHBRIDGE_CAPABILITIES, ®_caps);
++ pci_read_config_dword(pdev, REG_HARDWARE_THERMAL_CONTROL, ®_htc);
++ if ((reg_caps & NB_CAP_HTC) && (reg_htc & HTC_ENABLE)) {
++ err = device_create_file(&pdev->dev,
++ &sensor_dev_attr_temp1_crit.dev_attr);
++ if (err)
++ goto exit_remove;
++ err = device_create_file(&pdev->dev,
++ &sensor_dev_attr_temp1_crit_hyst.dev_attr);
++ if (err)
++ goto exit_remove;
++ }
++
++ err = device_create_file(&pdev->dev, &dev_attr_name);
++ if (err)
++ goto exit_remove;
++
++ hwmon_dev = hwmon_device_register(&pdev->dev);
++ if (IS_ERR(hwmon_dev)) {
++ err = PTR_ERR(hwmon_dev);
++ goto exit_remove;
++ }
++ dev_set_drvdata(&pdev->dev, hwmon_dev);
++
++ if (has_erratum_319() && force)
++ dev_warn(&pdev->dev,
++ "unreliable CPU thermal sensor; check erratum 319\n");
++ return 0;
++
++exit_remove:
++ device_remove_file(&pdev->dev, &dev_attr_name);
++ device_remove_file(&pdev->dev, &dev_attr_temp1_input);
++ device_remove_file(&pdev->dev, &dev_attr_temp1_max);
++ device_remove_file(&pdev->dev,
++ &sensor_dev_attr_temp1_crit.dev_attr);
++ device_remove_file(&pdev->dev,
++ &sensor_dev_attr_temp1_crit_hyst.dev_attr);
++exit:
++ return err;
++}
++
++static void __devexit k10temp_remove(struct pci_dev *pdev)
++{
++ hwmon_device_unregister(dev_get_drvdata(&pdev->dev));
++ device_remove_file(&pdev->dev, &dev_attr_name);
++ device_remove_file(&pdev->dev, &dev_attr_temp1_input);
++ device_remove_file(&pdev->dev, &dev_attr_temp1_max);
++ device_remove_file(&pdev->dev,
++ &sensor_dev_attr_temp1_crit.dev_attr);
++ device_remove_file(&pdev->dev,
++ &sensor_dev_attr_temp1_crit_hyst.dev_attr);
++ dev_set_drvdata(&pdev->dev, NULL);
++}
++
++static struct pci_device_id k10temp_id_table[] = {
++ { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_10H_NB_MISC) },
++ { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_11H_NB_MISC) },
++ {}
++};
++MODULE_DEVICE_TABLE(pci, k10temp_id_table);
++
++static struct pci_driver k10temp_driver = {
++ .name = "k10temp",
++ .id_table = k10temp_id_table,
++ .probe = k10temp_probe,
++ .remove = __devexit_p(k10temp_remove),
++};
++
++static int __init k10temp_init(void)
++{
++ return pci_register_driver(&k10temp_driver);
++}
++
++static void __exit k10temp_exit(void)
++{
++ pci_unregister_driver(&k10temp_driver);
++}
++
++module_init(k10temp_init)
++module_exit(k10temp_exit)
+
+commit c5114a1cd6d84b2b3144c1c3e093c80ca6c30f47
+Author: Clemens Ladisch <clemens at ladisch.de>
+Date: Sun Jan 10 20:52:34 2010 +0100
+
+ hwmon: (k10temp) Blacklist more family 10h processors
+
+ The latest version of the Revision Guide for AMD Family 10h Processors
+ lists two more processor revisions which may be affected by erratum 319.
+ Change the blacklisting code to correctly detect those processors, by
+ implementing AMD's recommended algorithm.
+
+ Signed-off-by: Clemens Ladisch <clemens at ladisch.de>
+ Signed-off-by: Jean Delvare <khali at linux-fr.org>
+ Cc: Andreas Herrmann <herrmann.der.user at googlemail.com>
+
+diff --git a/drivers/hwmon/k10temp.c b/drivers/hwmon/k10temp.c
+index d8a26d1..4c9d349 100644
+--- a/drivers/hwmon/k10temp.c
++++ b/drivers/hwmon/k10temp.c
+@@ -33,6 +33,16 @@ static bool force;
+ module_param(force, bool, 0444);
+ MODULE_PARM_DESC(force, "force loading on processors with erratum 319");
+
++/* CPUID function 0x80000001, ebx */
++#define CPUID_PKGTYPE_MASK 0xf0000000
++#define CPUID_PKGTYPE_F 0x00000000
++#define CPUID_PKGTYPE_AM2R2_AM3 0x10000000
++
++/* DRAM controller (PCI function 2) */
++#define REG_DCT0_CONFIG_HIGH 0x094
++#define DDR3_MODE 0x00000100
++
++/* miscellaneous (PCI function 3) */
+ #define REG_HARDWARE_THERMAL_CONTROL 0x64
+ #define HTC_ENABLE 0x00000001
+
+@@ -85,13 +95,28 @@ static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO, show_temp_crit, NULL, 0);
+ static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IRUGO, show_temp_crit, NULL, 1);
+ static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
+
+-static bool __devinit has_erratum_319(void)
++static bool __devinit has_erratum_319(struct pci_dev *pdev)
+ {
++ u32 pkg_type, reg_dram_cfg;
++
++ if (boot_cpu_data.x86 != 0x10)
++ return false;
++
+ /*
+- * Erratum 319: The thermal sensor of older Family 10h processors
+- * (B steppings) may be unreliable.
++ * Erratum 319: The thermal sensor of Socket F/AM2+ processors
++ * may be unreliable.
+ */
+- return boot_cpu_data.x86 == 0x10 && boot_cpu_data.x86_model <= 2;
++ pkg_type = cpuid_ebx(0x80000001) & CPUID_PKGTYPE_MASK;
++ if (pkg_type == CPUID_PKGTYPE_F)
++ return true;
++ if (pkg_type != CPUID_PKGTYPE_AM2R2_AM3)
++ return false;
++
++ /* Differentiate between AM2+ (bad) and AM3 (good) */
++ pci_bus_read_config_dword(pdev->bus,
++ PCI_DEVFN(PCI_SLOT(pdev->devfn), 2),
++ REG_DCT0_CONFIG_HIGH, ®_dram_cfg);
++ return !(reg_dram_cfg & DDR3_MODE);
+ }
+
+ static int __devinit k10temp_probe(struct pci_dev *pdev,
+@@ -99,9 +124,10 @@ static int __devinit k10temp_probe(struct pci_dev *pdev,
+ {
+ struct device *hwmon_dev;
+ u32 reg_caps, reg_htc;
++ int unreliable = has_erratum_319(pdev);
+ int err;
+
+- if (has_erratum_319() && !force) {
++ if (unreliable && !force) {
+ dev_err(&pdev->dev,
+ "unreliable CPU thermal sensor; monitoring disabled\n");
+ err = -ENODEV;
+@@ -139,7 +165,7 @@ static int __devinit k10temp_probe(struct pci_dev *pdev,
+ }
+ dev_set_drvdata(&pdev->dev, hwmon_dev);
+
+- if (has_erratum_319() && force)
++ if (unreliable && force)
+ dev_warn(&pdev->dev,
+ "unreliable CPU thermal sensor; check erratum 319\n");
+ return 0;
+
+commit eefc2d9e3d4f8820f2c128a0e44a23de28b1ed64
+Author: Jean Delvare <khali at linux-fr.org>
+Date: Sun Jun 20 09:22:31 2010 +0200
+
+ hwmon: (k10temp) Do not blacklist known working CPU models
+
+ When detecting AM2+ or AM3 socket with DDR2, only blacklist cores
+ which are known to exist in AM2+ format.
+
+ Signed-off-by: Jean Delvare <khali at linux-fr.org>
+ Acked-by: Clemens Ladisch <clemens at ladisch.de>
+ Cc: Andreas Herrmann <andreas.herrmann3 at amd.com>
+ Cc: stable at kernel.org
+
+diff --git a/drivers/hwmon/k10temp.c b/drivers/hwmon/k10temp.c
+index 099a213..da5a240 100644
+--- a/drivers/hwmon/k10temp.c
++++ b/drivers/hwmon/k10temp.c
+@@ -112,11 +112,21 @@ static bool __devinit has_erratum_319(struct pci_dev *pdev)
+ if (pkg_type != CPUID_PKGTYPE_AM2R2_AM3)
+ return false;
+
+- /* Differentiate between AM2+ (bad) and AM3 (good) */
++ /* DDR3 memory implies socket AM3, which is good */
+ pci_bus_read_config_dword(pdev->bus,
+ PCI_DEVFN(PCI_SLOT(pdev->devfn), 2),
+ REG_DCT0_CONFIG_HIGH, ®_dram_cfg);
+- return !(reg_dram_cfg & DDR3_MODE);
++ if (reg_dram_cfg & DDR3_MODE)
++ return false;
++
++ /*
++ * Unfortunately it is possible to run a socket AM3 CPU with DDR2
++ * memory. We blacklist all the cores which do exist in socket AM2+
++ * format. It still isn't perfect, as RB-C2 cores exist in both AM2+
++ * and AM3 formats, but that's the best we can do.
++ */
++ return boot_cpu_data.x86_model < 4 ||
++ (boot_cpu_data.x86_model == 4 && boot_cpu_data.x86_mask <= 2);
+ }
+
+ static int __devinit k10temp_probe(struct pci_dev *pdev,
Modified: dists/squeeze/linux-2.6/debian/patches/series/31
==============================================================================
--- dists/squeeze/linux-2.6/debian/patches/series/31 Mon Feb 28 04:35:20 2011 (r16952)
+++ dists/squeeze/linux-2.6/debian/patches/series/31 Mon Feb 28 07:32:43 2011 (r16953)
@@ -41,3 +41,4 @@
+ bugfix/all/usb-iowarrior-don-t-trust-report_size-for-buffer-siz.patch
+ bugfix/all/ALSA-caiaq-Fix-possible-string-buffer-overflow.patch
+ bugfix/all/fs-partitions-Validate-map_count-in-Mac-partition-ta.patch
++ features/all/hwmon-k10temp.patch
More information about the Kernel-svn-changes
mailing list