summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/coretemp/coretemp.c68
1 files changed, 40 insertions, 28 deletions
diff --git a/sys/dev/coretemp/coretemp.c b/sys/dev/coretemp/coretemp.c
index 99f1c75..eec93d8 100644
--- a/sys/dev/coretemp/coretemp.c
+++ b/sys/dev/coretemp/coretemp.c
@@ -178,34 +178,6 @@ coretemp_attach(device_t dev)
*/
sc->sc_tjmax = 100;
- /*
- * Attempt to get Tj(max) from MSR IA32_TEMPERATURE_TARGET.
- *
- * This method is described in Intel white paper
- * "CPU Monitoring With DTS/PECI". (#322683)
- */
- ret = rdmsr_safe(MSR_IA32_TEMPERATURE_TARGET, &msr);
- if (ret == 0) {
- tjtarget = (msr >> 16) & 0xff;
- /*
- * On earlier generation of processors, the value obtained
- * from IA32_TEMPERATURE_TARGET register is an offset that
- * needs to be summed with a model specific base. It is
- * however not clear what these numbers are, with the
- * publicly available documents from Intel.
- *
- * For now, we consider [70, 100]C range, as described in
- * #322683, as "reasonable" and accept these values
- * whenever the MSR is available for read, regardless the
- * CPU model.
- */
- if (tjtarget >= 70 && tjtarget <= 100)
- sc->sc_tjmax = tjtarget;
- else
- device_printf(dev, "Tj(target) value %d does "
- "not seem right.\n", tjtarget);
- }
-
if ((cpu_model == 0xf && cpu_stepping >= 2) || cpu_model == 0xe) {
/*
* On some Core 2 CPUs, there's an undocumented MSR that
@@ -217,6 +189,46 @@ coretemp_attach(device_t dev)
msr = rdmsr(MSR_IA32_EXT_CONFIG);
if (msr & (1 << 30))
sc->sc_tjmax = 85;
+ } else if (cpu_model == 0x17) {
+ switch (cpu_stepping) {
+ case 0x6: /* Mobile Core 2 Duo */
+ sc->sc_tjmax = 104;
+ break;
+ default: /* Unknown stepping */
+ break;
+ }
+ } else {
+ /*
+ * Attempt to get Tj(max) from MSR IA32_TEMPERATURE_TARGET.
+ *
+ * This method is described in Intel white paper "CPU
+ * Monitoring With DTS/PECI". (#322683)
+ */
+ ret = rdmsr_safe(MSR_IA32_TEMPERATURE_TARGET, &msr);
+ if (ret == 0) {
+ tjtarget = (msr >> 16) & 0xff;
+
+ /*
+ * On earlier generation of processors, the value
+ * obtained from IA32_TEMPERATURE_TARGET register is
+ * an offset that needs to be summed with a model
+ * specific base. It is however not clear what
+ * these numbers are, with the publicly available
+ * documents from Intel.
+ *
+ * For now, we consider [70, 100]C range, as
+ * described in #322683, as "reasonable" and accept
+ * these values whenever the MSR is available for
+ * read, regardless the CPU model.
+ */
+ if (tjtarget >= 70 && tjtarget <= 100)
+ sc->sc_tjmax = tjtarget;
+ else
+ device_printf(dev, "Tj(target) value %d "
+ "does not seem right.\n", tjtarget);
+ } else
+ device_printf(dev, "Can not get Tj(target) "
+ "from your CPU, using 100C.\n");
}
if (bootverbose)
OpenPOWER on IntegriCloud