| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * IDT Winchip specific Machine Check Exception Reporting | 
					
						
							| 
									
										
										
										
											2009-01-05 14:08:04 +00:00
										 |  |  |  * (C) Copyright 2002 Alan Cox <alan@lxorguk.ukuu.org.uk> | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  */ | 
					
						
							|  |  |  | #include <linux/interrupt.h>
 | 
					
						
							| 
									
										
										
										
											2009-04-08 12:31:22 +02:00
										 |  |  | #include <linux/kernel.h>
 | 
					
						
							|  |  |  | #include <linux/types.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-22 23:10:57 +01:00
										 |  |  | #include <asm/processor.h>
 | 
					
						
							| 
									
										
										
										
											2009-06-15 17:22:15 +09:00
										 |  |  | #include <asm/mce.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #include <asm/msr.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-08 12:31:22 +02:00
										 |  |  | /* Machine check handler for WinChip C6: */ | 
					
						
							| 
									
										
										
										
											2008-02-22 23:10:57 +01:00
										 |  |  | static void winchip_machine_check(struct pt_regs *regs, long error_code) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							|  |  |  | 	printk(KERN_EMERG "CPU0: Machine Check Exception.\n"); | 
					
						
							| 
									
										
										
										
											2013-01-21 17:17:39 +10:30
										 |  |  | 	add_taint(TAINT_MACHINE_CHECK, LOCKDEP_NOW_UNRELIABLE); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Set up machine check reporting on the Winchip C6 series */ | 
					
						
							| 
									
										
										
										
											2005-11-07 00:58:42 -08:00
										 |  |  | void winchip_mcheck_init(struct cpuinfo_x86 *c) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							|  |  |  | 	u32 lo, hi; | 
					
						
							| 
									
										
										
										
											2009-04-08 12:31:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	machine_check_vector = winchip_machine_check; | 
					
						
							| 
									
										
										
										
											2009-04-08 12:31:22 +02:00
										 |  |  | 	/* Make sure the vector pointer is visible before we enable MCEs: */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	wmb(); | 
					
						
							| 
									
										
										
										
											2009-04-08 12:31:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	rdmsr(MSR_IDT_FCR1, lo, hi); | 
					
						
							| 
									
										
										
										
											2008-02-22 23:10:57 +01:00
										 |  |  | 	lo |= (1<<2);	/* Enable EIERRINT (int 18 MCE) */ | 
					
						
							|  |  |  | 	lo &= ~(1<<4);	/* Enable MCE */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	wrmsr(MSR_IDT_FCR1, lo, hi); | 
					
						
							| 
									
										
										
										
											2009-04-08 12:31:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	set_in_cr4(X86_CR4_MCE); | 
					
						
							| 
									
										
										
										
											2009-04-08 12:31:22 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	printk(KERN_INFO | 
					
						
							|  |  |  | 	       "Winchip machine check reporting enabled on CPU#0.\n"); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } |