Module Name:    src
Committed By:   jdc
Date:           Sat Feb  2 21:54:51 UTC 2013

Modified Files:
        src/sys/arch/sparc64/dev: tda.c

Log Message:
Add sysmon support to display the fan-speed related values for the CPU and
system fans.
Fix a bug where the system fan was always set to full speed (63), which was
noticed when viewing the values reported by `envstat`.


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/sparc64/dev/tda.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/sparc64/dev/tda.c
diff -u src/sys/arch/sparc64/dev/tda.c:1.6 src/sys/arch/sparc64/dev/tda.c:1.7
--- src/sys/arch/sparc64/dev/tda.c:1.6	Sat Oct 27 17:18:12 2012
+++ src/sys/arch/sparc64/dev/tda.c	Sat Feb  2 21:54:51 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: tda.c,v 1.6 2012/10/27 17:18:12 chs Exp $	*/
+/*	$NetBSD: tda.c,v 1.7 2013/02/02 21:54:51 jdc Exp $	*/
 /*	$OpenBSD: tda.c,v 1.4 2008/02/27 17:25:00 robert Exp $ */
 
 /*
@@ -19,7 +19,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tda.c,v 1.6 2012/10/27 17:18:12 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tda.c,v 1.7 2013/02/02 21:54:51 jdc Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -44,10 +44,14 @@ __KERNEL_RCSID(0, "$NetBSD: tda.c,v 1.6 
 #define TDA_PSFAN_ON            0x1f
 #define TDA_PSFAN_OFF           0x00
 
-/* Internal and External temperature senor numbers */
+/* Internal and External temperature sensor numbers */
 #define SENSOR_TEMP_EXT		0
 #define SENSOR_TEMP_INT		1
 
+/* Fan sensor numbers */
+#define SENSOR_FAN_CPU		0
+#define SENSOR_FAN_SYS		1
+
 #define CPU_TEMP_MAX		(67 * 1000000 + 273150000)
 #define CPU_TEMP_MIN		(57 * 1000000 + 273150000)
 #define SYS_TEMP_MAX		(30 * 1000000 + 273150000)
@@ -61,11 +65,15 @@ struct tda_softc {
 	u_int16_t		sc_cfan_speed;	/* current CPU fan speed */
 	u_int16_t		sc_sfan_speed;	/* current SYS fan speed */
 
+	struct sysmon_envsys	*sc_sme;
+	envsys_data_t		sc_sensor[2];
+
 	callout_t		sc_timer;
 };
 
 int	tda_match(device_t, cfdata_t, void *);
 void	tda_attach(device_t, device_t, void *);
+void	tda_refresh(struct sysmon_envsys *, envsys_data_t *);
 
 void	tda_setspeed(struct tda_softc *);
 static void	tda_adjust(void *);
@@ -115,9 +123,45 @@ tda_attach(device_t parent, device_t sel
 	 */
 	sc->sc_cfan_speed = sc->sc_sfan_speed = (TDA_FANSPEED_MAX+TDA_FANSPEED_MIN)/2;
 	tda_setspeed(sc);
-
+	
 	callout_init(&sc->sc_timer, CALLOUT_MPSAFE);
 	callout_reset(&sc->sc_timer, hz*20, tda_timeout, sc);
+
+	/* Initialise sensor data */
+	sc->sc_sensor[SENSOR_FAN_CPU].state = ENVSYS_SINVALID;
+	sc->sc_sensor[SENSOR_FAN_CPU].units = ENVSYS_INTEGER;
+	sc->sc_sensor[SENSOR_FAN_CPU].flags = ENVSYS_FMONNOTSUPP;
+	strlcpy(sc->sc_sensor[SENSOR_FAN_CPU].desc,
+	    "fan.cpu",sizeof("fan.cpu"));
+	sc->sc_sensor[SENSOR_FAN_SYS].state = ENVSYS_SINVALID;
+	sc->sc_sensor[SENSOR_FAN_SYS].units = ENVSYS_INTEGER;
+	sc->sc_sensor[SENSOR_FAN_SYS].flags = ENVSYS_FMONNOTSUPP;
+	strlcpy(sc->sc_sensor[SENSOR_FAN_SYS].desc,
+	    "fan.sys",sizeof("fan.sys"));
+	sc->sc_sme = sysmon_envsys_create();
+	if (sysmon_envsys_sensor_attach(
+	    sc->sc_sme, &sc->sc_sensor[SENSOR_FAN_CPU])) {
+		sysmon_envsys_destroy(sc->sc_sme);
+		aprint_error_dev(self,
+		    "unable to attach cpu fan at sysmon\n");
+		return;
+	}
+	if (sysmon_envsys_sensor_attach(
+	    sc->sc_sme, &sc->sc_sensor[SENSOR_FAN_SYS])) {
+		sysmon_envsys_destroy(sc->sc_sme);
+		aprint_error_dev(self,
+		    "unable to attach sys fan at sysmon\n");
+		return;
+	}
+        sc->sc_sme->sme_name = device_xname(self);
+        sc->sc_sme->sme_cookie = sc;
+        sc->sc_sme->sme_refresh = tda_refresh;
+	if (sysmon_envsys_register(sc->sc_sme)) {
+		aprint_error_dev(self,
+		    "unable to register with sysmon\n");
+		sysmon_envsys_destroy(sc->sc_sme);
+		return;
+	}
 }
 
 static void
@@ -221,7 +265,7 @@ tda_adjust(void *v)
 	if (stemp < SYS_TEMP_MIN)
 		sspeed = TDA_FANSPEED_MIN;
 	else if (stemp < SYS_TEMP_MAX)
-		sc->sc_sfan_speed = TDA_FANSPEED_MIN +
+		sspeed = TDA_FANSPEED_MIN +
 			(stemp - SYS_TEMP_MIN) * 
 			(TDA_FANSPEED_MAX - TDA_FANSPEED_MIN) / 
 			(SYS_TEMP_MAX - SYS_TEMP_MIN);
@@ -233,3 +277,22 @@ tda_adjust(void *v)
 	sc->sc_cfan_speed = cspeed;
 	tda_setspeed(sc);
 }
+
+void
+tda_refresh(struct sysmon_envsys *sme, envsys_data_t *edata)
+{
+	struct tda_softc *sc = sme->sme_cookie;
+	u_int16_t speed;
+
+	if (edata->sensor == SENSOR_FAN_CPU)
+		speed = sc->sc_cfan_speed;
+	else
+		speed = sc->sc_sfan_speed;
+	if (!speed)
+		edata->state = ENVSYS_SINVALID;
+	else {
+		edata->value_cur = speed;
+		edata->state = ENVSYS_SVALID;
+	}
+}
+

Reply via email to