| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #ifndef __ASM_MACH_IPI_H
 | 
					
						
							|  |  |  | #define __ASM_MACH_IPI_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-06-26 13:59:56 +02:00
										 |  |  | /* Avoid include hell */ | 
					
						
							|  |  |  | #define NMI_VECTOR 0x02
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | void send_IPI_mask_bitmask(cpumask_t mask, int vector); | 
					
						
							|  |  |  | void __send_IPI_shortcut(unsigned int shortcut, int vector); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-06-25 14:54:52 -07:00
										 |  |  | extern int no_broadcast; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | static inline void send_IPI_mask(cpumask_t mask, int vector) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	send_IPI_mask_bitmask(mask, vector); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-06-25 14:54:52 -07:00
										 |  |  | static inline void __local_send_IPI_allbutself(int vector) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-06-26 13:59:56 +02:00
										 |  |  | 	if (no_broadcast || vector == NMI_VECTOR) { | 
					
						
							| 
									
										
										
										
											2005-06-25 14:54:52 -07:00
										 |  |  | 		cpumask_t mask = cpu_online_map; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-11 22:43:09 +01:00
										 |  |  | 		cpu_clear(smp_processor_id(), mask); | 
					
						
							| 
									
										
										
										
											2005-06-25 14:54:52 -07:00
										 |  |  | 		send_IPI_mask(mask, vector); | 
					
						
							|  |  |  | 	} else | 
					
						
							|  |  |  | 		__send_IPI_shortcut(APIC_DEST_ALLBUT, vector); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void __local_send_IPI_all(int vector) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-06-26 13:59:56 +02:00
										 |  |  | 	if (no_broadcast || vector == NMI_VECTOR) | 
					
						
							| 
									
										
										
										
											2005-06-25 14:54:52 -07:00
										 |  |  | 		send_IPI_mask(cpu_online_map, vector); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		__send_IPI_shortcut(APIC_DEST_ALLINC, vector); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | static inline void send_IPI_allbutself(int vector) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * if there are no other CPUs in the system then we get an APIC send  | 
					
						
							|  |  |  | 	 * error if we try to broadcast, thus avoid sending IPIs in this case. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	if (!(num_online_cpus() > 1)) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-06-25 14:54:52 -07:00
										 |  |  | 	__local_send_IPI_allbutself(vector); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	return; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void send_IPI_all(int vector) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2005-06-25 14:54:52 -07:00
										 |  |  | 	__local_send_IPI_all(vector); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* __ASM_MACH_IPI_H */
 |