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

Commit a4659053 authored by Jan Beulich's avatar Jan Beulich Committed by Guenter Roeck
Browse files

x86/hwmon: fix initialization of coretemp



Using cpuid_eax() to determine feature availability on other than
the current CPU is invalid. And feature availability should also be
checked in the hotplug code path.

Signed-off-by: default avatarJan Beulich <jbeulich@novell.com>
Cc: Rudolf Marek <r.marek@assembler.cz>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Signed-off-by: default avatarGuenter Roeck <guenter.roeck@ericsson.com>
parent d172132f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -168,6 +168,7 @@
#define X86_FEATURE_XSAVEOPT	(7*32+ 4) /* Optimized Xsave */
#define X86_FEATURE_PLN		(7*32+ 5) /* Intel Power Limit Notification */
#define X86_FEATURE_PTS		(7*32+ 6) /* Intel Package Thermal Status */
#define X86_FEATURE_DTS		(7*32+ 7) /* Digital Thermal Sensor */

/* Virtualization flags: Linux defined, word 8 */
#define X86_FEATURE_TPR_SHADOW  (8*32+ 0) /* Intel TPR Shadow */
+1 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ void __cpuinit init_scattered_cpuid_features(struct cpuinfo_x86 *c)
	const struct cpuid_bit *cb;

	static const struct cpuid_bit __cpuinitconst cpuid_bits[] = {
		{ X86_FEATURE_DTS,		CR_EAX, 0, 0x00000006, 0 },
		{ X86_FEATURE_IDA,		CR_EAX, 1, 0x00000006, 0 },
		{ X86_FEATURE_ARAT,		CR_EAX, 2, 0x00000006, 0 },
		{ X86_FEATURE_PLN,		CR_EAX, 4, 0x00000006, 0 },
+13 −16
Original line number Diff line number Diff line
@@ -423,9 +423,18 @@ static int __cpuinit coretemp_device_add(unsigned int cpu)
	int err;
	struct platform_device *pdev;
	struct pdev_entry *pdev_entry;
#ifdef CONFIG_SMP
	struct cpuinfo_x86 *c = &cpu_data(cpu);
#endif

	/*
	 * CPUID.06H.EAX[0] indicates whether the CPU has thermal
	 * sensors. We check this bit only, all the early CPUs
	 * without thermal sensors will be filtered out.
	 */
	if (!cpu_has(c, X86_FEATURE_DTS)) {
		printk(KERN_INFO DRVNAME ": CPU (model=0x%x)"
		       " has no thermal sensor.\n", c->x86_model);
		return 0;
	}

	mutex_lock(&pdev_list_mutex);

@@ -527,20 +536,8 @@ static int __init coretemp_init(void)
	if (err)
		goto exit;

	for_each_online_cpu(i) {
		struct cpuinfo_x86 *c = &cpu_data(i);
		/*
		 * CPUID.06H.EAX[0] indicates whether the CPU has thermal
		 * sensors. We check this bit only, all the early CPUs
		 * without thermal sensors will be filtered out.
		 */
		if (c->cpuid_level >= 6 && (cpuid_eax(0x06) & 0x01))
	for_each_online_cpu(i)
		coretemp_device_add(i);
		else {
			printk(KERN_INFO DRVNAME ": CPU (model=0x%x)"
				" has no thermal sensor.\n", c->x86_model);
		}
	}

#ifndef CONFIG_HOTPLUG_CPU
	if (list_empty(&pdev_list)) {