mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	genirq: Provide NMI handlers
Provide flow handlers that are NMI safe for interrupts and percpu_devid interrupts. Signed-off-by: Julien Thierry <julien.thierry@arm.com> Acked-by: Marc Zyngier <marc.zyngier@arm.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Marc Zyngier <marc.zyngier@arm.com> Cc: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
This commit is contained in:
		
							parent
							
								
									4b078c3f1a
								
							
						
					
					
						commit
						2dcf1fbcad
					
				
					 2 changed files with 57 additions and 0 deletions
				
			
		| 
						 | 
					@ -601,6 +601,9 @@ extern void handle_percpu_devid_irq(struct irq_desc *desc);
 | 
				
			||||||
extern void handle_bad_irq(struct irq_desc *desc);
 | 
					extern void handle_bad_irq(struct irq_desc *desc);
 | 
				
			||||||
extern void handle_nested_irq(unsigned int irq);
 | 
					extern void handle_nested_irq(unsigned int irq);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern void handle_fasteoi_nmi(struct irq_desc *desc);
 | 
				
			||||||
 | 
					extern void handle_percpu_devid_fasteoi_nmi(struct irq_desc *desc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int irq_chip_compose_msi_msg(struct irq_data *data, struct msi_msg *msg);
 | 
					extern int irq_chip_compose_msi_msg(struct irq_data *data, struct msi_msg *msg);
 | 
				
			||||||
extern int irq_chip_pm_get(struct irq_data *data);
 | 
					extern int irq_chip_pm_get(struct irq_data *data);
 | 
				
			||||||
extern int irq_chip_pm_put(struct irq_data *data);
 | 
					extern int irq_chip_pm_put(struct irq_data *data);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -729,6 +729,37 @@ void handle_fasteoi_irq(struct irq_desc *desc)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL_GPL(handle_fasteoi_irq);
 | 
					EXPORT_SYMBOL_GPL(handle_fasteoi_irq);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 *	handle_fasteoi_nmi - irq handler for NMI interrupt lines
 | 
				
			||||||
 | 
					 *	@desc:	the interrupt description structure for this irq
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	A simple NMI-safe handler, considering the restrictions
 | 
				
			||||||
 | 
					 *	from request_nmi.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Only a single callback will be issued to the chip: an ->eoi()
 | 
				
			||||||
 | 
					 *	call when the interrupt has been serviced. This enables support
 | 
				
			||||||
 | 
					 *	for modern forms of interrupt handlers, which handle the flow
 | 
				
			||||||
 | 
					 *	details in hardware, transparently.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void handle_fasteoi_nmi(struct irq_desc *desc)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct irq_chip *chip = irq_desc_get_chip(desc);
 | 
				
			||||||
 | 
						struct irqaction *action = desc->action;
 | 
				
			||||||
 | 
						unsigned int irq = irq_desc_get_irq(desc);
 | 
				
			||||||
 | 
						irqreturn_t res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						trace_irq_handler_entry(irq, action);
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * NMIs cannot be shared, there is only one action.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						res = action->handler(irq, action->dev_id);
 | 
				
			||||||
 | 
						trace_irq_handler_exit(irq, action, res);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (chip->irq_eoi)
 | 
				
			||||||
 | 
							chip->irq_eoi(&desc->irq_data);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EXPORT_SYMBOL_GPL(handle_fasteoi_nmi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 *	handle_edge_irq - edge type IRQ handler
 | 
					 *	handle_edge_irq - edge type IRQ handler
 | 
				
			||||||
 *	@desc:	the interrupt description structure for this irq
 | 
					 *	@desc:	the interrupt description structure for this irq
 | 
				
			||||||
| 
						 | 
					@ -908,6 +939,29 @@ void handle_percpu_devid_irq(struct irq_desc *desc)
 | 
				
			||||||
		chip->irq_eoi(&desc->irq_data);
 | 
							chip->irq_eoi(&desc->irq_data);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * handle_percpu_devid_fasteoi_nmi - Per CPU local NMI handler with per cpu
 | 
				
			||||||
 | 
					 *				     dev ids
 | 
				
			||||||
 | 
					 * @desc:	the interrupt description structure for this irq
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Similar to handle_fasteoi_nmi, but handling the dev_id cookie
 | 
				
			||||||
 | 
					 * as a percpu pointer.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void handle_percpu_devid_fasteoi_nmi(struct irq_desc *desc)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct irq_chip *chip = irq_desc_get_chip(desc);
 | 
				
			||||||
 | 
						struct irqaction *action = desc->action;
 | 
				
			||||||
 | 
						unsigned int irq = irq_desc_get_irq(desc);
 | 
				
			||||||
 | 
						irqreturn_t res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						trace_irq_handler_entry(irq, action);
 | 
				
			||||||
 | 
						res = action->handler(irq, raw_cpu_ptr(action->percpu_dev_id));
 | 
				
			||||||
 | 
						trace_irq_handler_exit(irq, action, res);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (chip->irq_eoi)
 | 
				
			||||||
 | 
							chip->irq_eoi(&desc->irq_data);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
__irq_do_set_handler(struct irq_desc *desc, irq_flow_handler_t handle,
 | 
					__irq_do_set_handler(struct irq_desc *desc, irq_flow_handler_t handle,
 | 
				
			||||||
		     int is_chained, const char *name)
 | 
							     int is_chained, const char *name)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue