[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, &regval);
++	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, &regval);
++	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, &reg_caps);
++	pci_read_config_dword(pdev, REG_HARDWARE_THERMAL_CONTROL, &reg_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, &reg_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, &reg_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