Module Name: src Committed By: jruoho Date: Sun Feb 20 19:24:09 UTC 2011
Modified Files: src/sys/arch/x86/x86: coretemp.c Log Message: Add proper definitions. Remove (too) verbose comments. Remove (wrong) debug printf. Do not mark the sensor as invalid based on whether the critical detector output signal has (ever) been asserted without reset. Support for trip-points will be added later. To generate a diff of this commit: cvs rdiff -u -r1.17 -r1.18 src/sys/arch/x86/x86/coretemp.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/x86/x86/coretemp.c diff -u src/sys/arch/x86/x86/coretemp.c:1.17 src/sys/arch/x86/x86/coretemp.c:1.18 --- src/sys/arch/x86/x86/coretemp.c:1.17 Sun Feb 20 13:42:46 2011 +++ src/sys/arch/x86/x86/coretemp.c Sun Feb 20 19:24:07 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: coretemp.c,v 1.17 2011/02/20 13:42:46 jruoho Exp $ */ +/* $NetBSD: coretemp.c,v 1.18 2011/02/20 19:24:07 jruoho Exp $ */ /*- * Copyright (c) 2007 Juan Romero Pardines. @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: coretemp.c,v 1.17 2011/02/20 13:42:46 jruoho Exp $"); +__KERNEL_RCSID(0, "$NetBSD: coretemp.c,v 1.18 2011/02/20 19:24:07 jruoho Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -51,6 +51,30 @@ #include <machine/cputypes.h> #include <machine/specialreg.h> +#define MSR_THERM_STATUS_STA __BIT(0) +#define MSR_THERM_STATUS_LOG __BIT(1) +#define MSR_THERM_STATUS_PROCHOT_EVT __BIT(2) +#define MSR_THERM_STATUS_PROCHOT_LOG __BIT(3) +#define MSR_THERM_STATUS_CRIT_STA __BIT(4) +#define MSR_THERM_STATUS_CRIT_LOG __BIT(5) +#define MSR_THERM_STATUS_TRIP1_STA __BIT(6) +#define MSR_THERM_STATUS_TRIP1_LOG __BIT(7) +#define MSR_THERM_STATUS_TRIP2_STA __BIT(8) +#define MSR_THERM_STATUS_TRIP2_LOG __BIT(9) +#define MSR_THERM_STATUS_READOUT __BITS(16, 22) +#define MSR_THERM_STATUS_RESOLUTION __BITS(27, 30) +#define MSR_THERM_STATUS_VALID __BIT(31) + +#define MSR_THERM_INTR_HITEMP __BIT(0) +#define MSR_THERM_INTR_LOTEMPT __BIT(1) +#define MSR_THERM_INTR_PROCHOT __BIT(2) +#define MSR_THERM_INTR_FORCPR __BIT(3) +#define MSR_THERM_INTR_OVERHEAT __BIT(4) +#define MSR_THERM_INTR_TRIP1_VAL __BITS(8, 14) +#define MSR_THERM_INTR_TRIP1 __BIT(15) +#define MSR_THERM_INTR_TRIP2_VAL __BIT(16, 22) +#define MSR_THERM_INTR_TRIP2 __BIT(23) + static int coretemp_match(device_t, cfdata_t, void *); static void coretemp_attach(device_t, device_t, void *); static int coretemp_detach(device_t, int); @@ -102,12 +126,16 @@ struct coretemp_softc *sc = device_private(self); struct cpufeature_attach_args *cfaa = aux; struct cpu_info *ci = cfaa->ci; + uint64_t msr; sc->sc_ci = ci; sc->sc_dev = self; + msr = rdmsr(MSR_THERM_STATUS); + msr = __SHIFTOUT(msr, MSR_THERM_STATUS_RESOLUTION); + aprint_naive("\n"); - aprint_normal(": Intel on-die thermal sensor\n"); + aprint_normal(": thermal sensor, %u C resolution\n", (uint32_t)msr); sc->sc_sensor.units = ENVSYS_STEMP; sc->sc_sensor.flags = ENVSYS_FMONCRITICAL; @@ -237,53 +265,27 @@ envsys_data_t *edata = arg1; uint64_t msr; - /* - * The digital temperature reading is located at bit 16 - * of MSR_THERM_STATUS. - * - * There is a bit on that MSR that indicates whether the - * temperature is valid or not. - * - * The temperature is computed by subtracting the temperature - * reading by Tj(max). - */ msr = rdmsr(MSR_THERM_STATUS); - /* - * Check for Thermal Status and Thermal Status Log. - */ - if ((msr & 0x03) == 0x03) - aprint_debug_dev(sc->sc_dev, "PROCHOT asserted\n"); - - /* - * Bit 31 contains "Reading valid". - */ - if (((msr >> 31) & 0x01) == 1) { + if ((msr & MSR_THERM_STATUS_VALID) == 0) + edata->state = ENVSYS_SINVALID; + else { /* - * Starting on bit 16 and ending on bit 22. + * The temperature is computed by + * subtracting the reading by Tj(max). */ - edata->value_cur = sc->sc_tjmax - ((msr >> 16) & 0x7F); + edata->value_cur = sc->sc_tjmax; + edata->value_cur -= __SHIFTOUT(msr, MSR_THERM_STATUS_READOUT); + /* * Convert to mK. */ edata->value_cur *= 1000000; edata->value_cur += 273150000; edata->state = ENVSYS_SVALID; - } else - edata->state = ENVSYS_SINVALID; + } - /* - * Check for Critical Temperature Status and Critical - * Temperature Log. - * It doesn't really matter if the current temperature is - * invalid because the "Critical Temperature Log" bit will - * tell us if the Critical Temperature has been reached in - * past. It's not directly related to the current temperature. - * - * If we reach a critical level, send a critical event to - * powerd(8) (if running). - */ - if (((msr >> 4) & 0x03) == 0x03) + if ((msr & MSR_THERM_STATUS_CRIT_STA) != 0) edata->state = ENVSYS_SCRITICAL; }