forked from mirrors/linux
		
	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: Jan Beulich <jbeulich@novell.com> Cc: Rudolf Marek <r.marek@assembler.cz> Cc: Fenghua Yu <fenghua.yu@intel.com> Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
This commit is contained in:
		
							parent
							
								
									d172132f35
								
							
						
					
					
						commit
						a46590533a
					
				
					 3 changed files with 15 additions and 16 deletions
				
			
		|  | @ -168,6 +168,7 @@ | ||||||
| #define X86_FEATURE_XSAVEOPT	(7*32+ 4) /* Optimized Xsave */ | #define X86_FEATURE_XSAVEOPT	(7*32+ 4) /* Optimized Xsave */ | ||||||
| #define X86_FEATURE_PLN		(7*32+ 5) /* Intel Power Limit Notification */ | #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_PTS		(7*32+ 6) /* Intel Package Thermal Status */ | ||||||
|  | #define X86_FEATURE_DTS		(7*32+ 7) /* Digital Thermal Sensor */ | ||||||
| 
 | 
 | ||||||
| /* Virtualization flags: Linux defined, word 8 */ | /* Virtualization flags: Linux defined, word 8 */ | ||||||
| #define X86_FEATURE_TPR_SHADOW  (8*32+ 0) /* Intel TPR Shadow */ | #define X86_FEATURE_TPR_SHADOW  (8*32+ 0) /* Intel TPR Shadow */ | ||||||
|  |  | ||||||
|  | @ -31,6 +31,7 @@ void __cpuinit init_scattered_cpuid_features(struct cpuinfo_x86 *c) | ||||||
| 	const struct cpuid_bit *cb; | 	const struct cpuid_bit *cb; | ||||||
| 
 | 
 | ||||||
| 	static const struct cpuid_bit __cpuinitconst cpuid_bits[] = { | 	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_IDA,		CR_EAX, 1, 0x00000006, 0 }, | ||||||
| 		{ X86_FEATURE_ARAT,		CR_EAX, 2, 0x00000006, 0 }, | 		{ X86_FEATURE_ARAT,		CR_EAX, 2, 0x00000006, 0 }, | ||||||
| 		{ X86_FEATURE_PLN,		CR_EAX, 4, 0x00000006, 0 }, | 		{ X86_FEATURE_PLN,		CR_EAX, 4, 0x00000006, 0 }, | ||||||
|  |  | ||||||
|  | @ -423,9 +423,18 @@ static int __cpuinit coretemp_device_add(unsigned int cpu) | ||||||
| 	int err; | 	int err; | ||||||
| 	struct platform_device *pdev; | 	struct platform_device *pdev; | ||||||
| 	struct pdev_entry *pdev_entry; | 	struct pdev_entry *pdev_entry; | ||||||
| #ifdef CONFIG_SMP |  | ||||||
| 	struct cpuinfo_x86 *c = &cpu_data(cpu); | 	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); | 	mutex_lock(&pdev_list_mutex); | ||||||
| 
 | 
 | ||||||
|  | @ -527,20 +536,8 @@ static int __init coretemp_init(void) | ||||||
| 	if (err) | 	if (err) | ||||||
| 		goto exit; | 		goto exit; | ||||||
| 
 | 
 | ||||||
| 	for_each_online_cpu(i) { | 	for_each_online_cpu(i) | ||||||
| 		struct cpuinfo_x86 *c = &cpu_data(i); | 		coretemp_device_add(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)) |  | ||||||
| 			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 | #ifndef CONFIG_HOTPLUG_CPU | ||||||
| 	if (list_empty(&pdev_list)) { | 	if (list_empty(&pdev_list)) { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Jan Beulich
						Jan Beulich