Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 2 Dec 2010 21:03:41 GMT
From:      Mark Johnston <markjdb@gmail.com>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   kern/152792: [patch] move temperature conversion macros to a common header
Message-ID:  <201012022103.oB2L3fE2044318@red.freebsd.org>
Resent-Message-ID: <201012022110.oB2LAAGt088394@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         152792
>Category:       kern
>Synopsis:       [patch] move temperature conversion macros to a common header
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Thu Dec 02 21:10:09 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     Mark Johnston
>Release:        
>Organization:
Sandvine Inc.
>Environment:
>Description:
There are a few drivers that report system temperatures through sysctls using the "IK" format. This format expects values that are converted into multiples of 0.1 degrees Kelvin, and since most sensors report values in Celsius, they have to be converted. The drivers (acpi, coretemp and amdtemp) all have their own macros for doing this. This change puts a set of macros in sysctl.h for all drivers to use; moreover, they allow userspace programs to read temperature sysctls without having to redefine the macros yet again.
>How-To-Repeat:

>Fix:
Attached is a patch against HEAD (csup'ed about 2 days ago).

Patch attached with submission follows:

diff --git a/sys/dev/acpica/acpi_thermal.c b/sys/dev/acpica/acpi_thermal.c
index ec4178e..f3a283c 100644
--- a/sys/dev/acpica/acpi_thermal.c
+++ b/sys/dev/acpica/acpi_thermal.c
@@ -54,9 +54,6 @@ __FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_thermal.c,v 1.74 2010/06/11 19:27:21
 #define _COMPONENT	ACPI_THERMAL
 ACPI_MODULE_NAME("THERMAL")
 
-#define TZ_ZEROC	2732
-#define TZ_KELVTOC(x)	(((x) - TZ_ZEROC) / 10), abs(((x) - TZ_ZEROC) % 10)
-
 #define TZ_NOTIFY_TEMPERATURE	0x80 /* Temperature changed. */
 #define TZ_NOTIFY_LEVELS	0x81 /* Cooling levels changed. */
 #define TZ_NOTIFY_DEVICES	0x82 /* Device lists changed. */
diff --git a/sys/dev/amdtemp/amdtemp.c b/sys/dev/amdtemp/amdtemp.c
index 8ba46c7..0220b54 100644
--- a/sys/dev/amdtemp/amdtemp.c
+++ b/sys/dev/amdtemp/amdtemp.c
@@ -433,8 +433,6 @@ amdtemp_sysctl(SYSCTL_HANDLER_ARGS)
 	return (error);
 }
 
-#define	AMDTEMP_ZERO_C_TO_K	2732
-
 static int32_t
 amdtemp_gettemp0f(device_t dev, amdsensor_t sensor)
 {
@@ -468,7 +466,7 @@ amdtemp_gettemp0f(device_t dev, amdsensor_t sensor)
 	pci_write_config(dev, AMDTEMP_THERMTP_STAT, cfg | sel, 1);
 
 	/* CurTmp starts from -49C. */
-	offset = AMDTEMP_ZERO_C_TO_K - 490;
+	offset = TZ_ZEROC - 490;
 
 	/* Adjust offset if DiodeOffset is set and valid. */
 	temp = pci_read_config(dev, AMDTEMP_THERMTP_STAT, 4);
@@ -497,7 +495,7 @@ amdtemp_gettemp(device_t dev, amdsensor_t sensor)
 	int32_t diode_offset, offset;
 
 	/* CurTmp starts from 0C. */
-	offset = AMDTEMP_ZERO_C_TO_K;
+	offset = TZ_ZEROC;
 
 	/* Adjust offset if DiodeOffset is set and valid. */
 	temp = pci_read_config(dev, AMDTEMP_THERMTP_STAT, 4);
diff --git a/sys/dev/coretemp/coretemp.c b/sys/dev/coretemp/coretemp.c
index 7cfc9c6..cb26b1b 100644
--- a/sys/dev/coretemp/coretemp.c
+++ b/sys/dev/coretemp/coretemp.c
@@ -48,8 +48,6 @@ __FBSDID("$FreeBSD: src/sys/dev/coretemp/coretemp.c,v 1.12 2010/08/04 00:25:13 d
 #include <machine/cputypes.h>
 #include <machine/md_var.h>
 
-#define	TZ_ZEROC	2732
-
 struct coretemp_softc {
 	device_t	sc_dev;
 	int		sc_tjmax;
@@ -331,7 +329,7 @@ coretemp_get_temp_sysctl(SYSCTL_HANDLER_ARGS)
 	device_t dev = (device_t) arg1;
 	int temp;
 
-	temp = coretemp_get_temp(dev) * 10 + TZ_ZEROC;
+	temp = TZ_CEL_TO_KEL(coretemp_get_temp(dev));
 
 	return (sysctl_handle_int(oidp, &temp, 0, req));
 }
diff --git a/sys/sys/sysctl.h b/sys/sys/sysctl.h
index eae9c10..3ffccf9 100644
--- a/sys/sys/sysctl.h
+++ b/sys/sys/sysctl.h
@@ -114,6 +114,19 @@ struct ctlname {
  */
 #define CTL_AUTO_START	0x100
 
+/*
+ * Conversion between Celsius and Kelvin, for drivers that want to
+ * display a temperature reading through a sysctl. The IK sysctl format
+ * expects a value that's converted into multiples of 0.1 degrees Kelvin,
+ * so one multiplies a celsius reading by 10 and adds TZ_ZEROC to get the
+ * correct value.
+ */
+#define TZ_ZEROC		2732
+#define TZ_CTOKELV(x)		((x) * 10 + TZ_ZEROC)
+#define TZ_KELVTOC_INT(x)	(((x) - TZ_ZEROC) / 10)
+#define TZ_KELVTOC_FRAC(x)	abs(((x) - TZ_ZEROC) % 10)
+#define TZ_KELVTOC(x)		TZ_KELVTOC_INT(x), TZ_KELVTOC_FRAC(x)
+
 #ifdef _KERNEL
 #define SYSCTL_HANDLER_ARGS struct sysctl_oid *oidp, void *arg1, int arg2, \
 	struct sysctl_req *req


>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201012022103.oB2L3fE2044318>