Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5db47b00 authored by Carsten Emde's avatar Carsten Emde Committed by Linus Torvalds
Browse files

drivers/hwmon/coretemp.c: detect the thermal sensors by CPUID



The thermal sensors of Intel(R) CPUs can be detected by CPUID instruction,
indicated by CPUID.06H.EAX[0].

Signed-off-by: default avatarHuaxu Wan <huaxu.wan@linux.intel.com>
Signed-off-by: default avatarCarsten Emde <C.Emde@osadl.org>
Reviewed-by: default avatarValdis Kletnieks <valdis.kletnieks@vt.edu>
Cc: Jean Delvare <khali@linux-fr.org>
Cc: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
Cc: Yong Wang <yong.y.wang@linux.intel.com>
Cc: Rudolf Marek <r.marek@assembler.cz>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent e0c70b80
Loading
Loading
Loading
Loading
+12 −20
Original line number Original line Diff line number Diff line
@@ -451,28 +451,20 @@ static int __init coretemp_init(void)


	for_each_online_cpu(i) {
	for_each_online_cpu(i) {
		struct cpuinfo_x86 *c = &cpu_data(i);
		struct cpuinfo_x86 *c = &cpu_data(i);

		/*
		/* check if family 6, models 0xe (Pentium M DC),
		 * CPUID.06H.EAX[0] indicates whether the CPU has thermal
		  0xf (Core 2 DC 65nm), 0x16 (Core 2 SC 65nm),
		 * sensors. We check this bit only, all the early CPUs
		  0x17 (Penryn 45nm), 0x1a (Nehalem), 0x1c (Atom),
		 * without thermal sensors will be filtered out.
		  0x1e (Lynnfield) */
		 */
		if ((c->cpuid_level < 0) || (c->x86 != 0x6) ||
		if (c->cpuid_level >= 6 && (cpuid_eax(0x06) & 0x01)) {
		    !((c->x86_model == 0xe) || (c->x86_model == 0xf) ||
			(c->x86_model == 0x16) || (c->x86_model == 0x17) ||
			(c->x86_model == 0x1a) || (c->x86_model == 0x1c) ||
			(c->x86_model == 0x1e))) {

			/* supported CPU not found, but report the unknown
			   family 6 CPU */
			if ((c->x86 == 0x6) && (c->x86_model > 0xf))
				printk(KERN_WARNING DRVNAME ": Unknown CPU "
					"model 0x%x\n", c->x86_model);
			continue;
		}

			err = coretemp_device_add(i);
			err = coretemp_device_add(i);
			if (err)
			if (err)
				goto exit_devices_unreg;
				goto exit_devices_unreg;

		} else {
			printk(KERN_INFO DRVNAME ": CPU (model=0x%x)"
				" has no thermal sensor.\n", c->x86_model);
		}
	}
	}
	if (list_empty(&pdev_list)) {
	if (list_empty(&pdev_list)) {
		err = -ENODEV;
		err = -ENODEV;