Date: Sun, 6 May 2007 21:10:35 GMT From: Rui Paulo <rpaulo@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 119371 for review Message-ID: <200705062110.l46LAZqE011583@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=119371 Change 119371 by rpaulo@rpaulo_epsilon on 2007/05/06 21:10:15 We don't need any scheduler support because: 1) msrtemp is a child of cpu - this implies that every rdmsr/cpuid instruction will be executed on that CPU. 2) rdmsr/cpuid are atomic, so I don't need to worry about any threads interfering. Bring back the device_printf()'s in the attach routine. Explained by: Attilio Rao Affected files ... .. //depot/projects/soc2007/rpaulo-macbook/dev/msrtemp/msrtemp.c#5 edit Differences ... ==== //depot/projects/soc2007/rpaulo-macbook/dev/msrtemp/msrtemp.c#5 (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#4 $ + * $P4: //depot/projects/soc2007/rpaulo-macbook/dev/msrtemp/msrtemp.c#5 $ * */ @@ -59,7 +59,7 @@ static int msrtemp_attach(device_t); static int msrtemp_detach(device_t); -static int msrtemp_get_temp(int); +static int msrtemp_get_temp(void); static int msrtemp_get_temp_sysctl(SYSCTL_HANDLER_ARGS); static device_method_t msrtemp_methods[] = { @@ -131,6 +131,19 @@ pdev = device_get_parent(dev); + if (bootverbose) { + /* + * 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. + */ + do_cpuid(0x06, regs); + device_printf(dev, "%d digital thermal sensor(s)\n", + regs[2] & 0x03); + } + device_printf(dev, "current temperature: %d degC\n", + msrtemp_get_temp()); + /* * Add the "temperature" MIB to dev.cpu.N. */ @@ -139,7 +152,7 @@ device_get_sysctl_tree(pdev)), OID_AUTO, "temperature", CTLTYPE_INT | CTLFLAG_RD, - dev, 0, msrtemp_get_temp_sysctl, "I", + NULL, 0, msrtemp_get_temp_sysctl, "I", "Current temperature in degC"); return 0; } @@ -156,12 +169,10 @@ static int -msrtemp_get_temp(int cpu) +msrtemp_get_temp(void) { 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. @@ -177,9 +188,6 @@ * 100 degC for everyone. */ temp = rdmsr(MSR_THERM_STATUS); - - sched_unbind(curthread); - mtx_unlock_spin(&sched_lock); /* * Bit 31 contains "Reading valid" @@ -200,9 +208,8 @@ msrtemp_get_temp_sysctl(SYSCTL_HANDLER_ARGS) { int temp; - device_t dev = (device_t) arg1; - temp = msrtemp_get_temp(device_get_unit(dev)); + temp = msrtemp_get_temp(); 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?200705062110.l46LAZqE011583>