Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 6 May 2007 20:22:18 GMT
From:      Rui Paulo <rpaulo@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 119366 for review
Message-ID:  <200705062022.l46KMIud093057@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=119366

Change 119366 by rpaulo@rpaulo_epsilon on 2007/05/06 20:21:17

	Final changes for this driver.
	* Use dev.cpu.N.temperature instead of creating new OIDs in hw.
	* Use sched_bind/unbind when reading MSRs or when doing a
	  cpuid.
	* The sysctl should be read only, not read-write.

Affected files ...

.. //depot/projects/soc2007/rpaulo-macbook/dev/msrtemp/msrtemp.c#3 edit

Differences ...

==== //depot/projects/soc2007/rpaulo-macbook/dev/msrtemp/msrtemp.c#3 (text+ko) ====

@@ -23,7 +23,7 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  *
- * $P4: //depot/projects/soc2007/rpaulo-macbook/dev/msrtemp/msrtemp.c#2 $
+ * $P4: //depot/projects/soc2007/rpaulo-macbook/dev/msrtemp/msrtemp.c#3 $
  *
  */
 
@@ -38,6 +38,8 @@
 #include <sys/conf.h>
 #include <sys/kernel.h>
 #include <sys/sysctl.h>
+#include <sys/proc.h>	/* for curthread */
+#include <sys/sched.h>
 
 #include <machine/specialreg.h>
 #include <machine/cpufunc.h>
@@ -46,8 +48,7 @@
 struct msrtemp_softc {
 	device_t	sc_dev;
 
-	struct sysctl_ctx_list	sc_sysctl_ctx;
-	struct sysctl_oid      *sc_sysctl_tree;
+	struct sysctl_oid *sc_oid;
 };
 
 /*
@@ -58,7 +59,7 @@
 static int	msrtemp_attach(device_t);
 static int	msrtemp_detach(device_t);
 
-static int	msrtemp_get_temp(void);
+static int	msrtemp_get_temp(int);
 static int	msrtemp_get_temp_sysctl(SYSCTL_HANDLER_ARGS);
 
 static device_method_t msrtemp_methods[] = {
@@ -124,44 +125,42 @@
 static int
 msrtemp_attach(device_t dev)
 {
+	int regs[4];
 	struct msrtemp_softc *sc = device_get_softc(dev);
-	struct sysctl_oid *top;
-	char name[2];
+	device_t pdev;
+
+	pdev = device_get_parent(dev);
 
 	if (bootverbose) {
+		mtx_lock_spin(&sched_lock);
+		sched_bind(curthread, device_get_unit(dev));
+
 		/*
 		 * CPUID 0x06 returns 1 if the processor has on-die thermal
 		 * sensors. We already checked that in the identify routine.
 		 * EBX[0:3] contains the number of sensors.
 		 */
-		int regs[4];
 		do_cpuid(0x06, regs);
-		
+
+		sched_unbind(curthread);
+		mtx_unlock_spin(&sched_lock);
+
 		device_printf(dev, "%d digital thermal sensor(s)\n",
 			      regs[2] & 0x03);
 	}
 	device_printf(dev, "current temperature: %d degC\n",
-		      msrtemp_get_temp());
+		      msrtemp_get_temp(device_get_unit(dev)));
 
-	sysctl_ctx_init(&sc->sc_sysctl_ctx);
-	sc->sc_sysctl_tree = SYSCTL_ADD_NODE(&sc->sc_sysctl_ctx,
-					     SYSCTL_STATIC_CHILDREN(_hw),
-					     OID_AUTO,
-					     device_get_name(dev),
-					     CTLFLAG_RD, 0, "");
-
-	name[0] = '0' + device_get_unit(dev);
-	name[1] = 0;
-
-	top = SYSCTL_ADD_NODE(&sc->sc_sysctl_ctx,
-			      SYSCTL_CHILDREN(sc->sc_sysctl_tree),
-			      OID_AUTO, name, CTLFLAG_RD, 0, "");
-
-	SYSCTL_ADD_PROC(&sc->sc_sysctl_ctx,
-			SYSCTL_CHILDREN(top),
-			OID_AUTO, "temperature", CTLTYPE_INT | CTLFLAG_RW,
-			NULL, 0, msrtemp_get_temp_sysctl, "I",
-			"Current temperature in degC");
+	/*
+	 * Add the "temperature" MIB to dev.cpu.N.
+	 */
+	sc->sc_oid = SYSCTL_ADD_PROC(device_get_sysctl_ctx(pdev),
+				     SYSCTL_CHILDREN(
+					     device_get_sysctl_tree(pdev)),
+				     OID_AUTO, "temperature",
+				     CTLTYPE_INT | CTLFLAG_RD,
+				     dev, 0, msrtemp_get_temp_sysctl, "I",
+				     "Current temperature in degC");
 	return 0;
 }
 
@@ -170,17 +169,19 @@
 {
 	struct msrtemp_softc *sc = device_get_softc(dev);
 
-	sysctl_ctx_free(&sc->sc_sysctl_ctx);
+	sysctl_remove_oid(sc->sc_oid, 1, 0);
 
 	return 0;
 }
 
 
 static int
-msrtemp_get_temp(void)
+msrtemp_get_temp(int cpu)
 {
 	uint64_t temp;
 
+	mtx_lock_spin(&sched_lock);
+	sched_bind(curthread, cpu);
 	/*
 	 * The digital temperature reading is located at bit 16
 	 * of MSR_THERM_STATUS.
@@ -188,7 +189,7 @@
 	 * There is a bit on that MSR that indicates whether the
 	 * temperature is valid or not.
 	 *
-	 * The temperature is located by subtracting the temperature
+	 * The temperature is computed by subtracting the temperature
 	 * reading by Tj(max).
 	 *
 	 * 100 is Tj(max). On some CPUs it should be 85, but Intel
@@ -196,6 +197,9 @@
 	 * 100 degC for everyone.
 	 */
 	temp = rdmsr(MSR_THERM_STATUS);
+ 
+	sched_unbind(curthread);
+	mtx_unlock_spin(&sched_lock);
 
 	/*
 	 * Bit 31 contains "Reading valid"
@@ -216,8 +220,9 @@
 msrtemp_get_temp_sysctl(SYSCTL_HANDLER_ARGS)
 {
 	int temp;
+	device_t dev = (device_t) arg1;
 
-	temp = msrtemp_get_temp();
+	temp = msrtemp_get_temp(device_get_unit(dev));
 
 	return sysctl_handle_int(oidp, &temp, 0, req);
 }



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