diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2019-02-23 10:53:31 +0100 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2019-02-23 10:53:31 +0100 | 
| commit | a324ca9cad4736252c33c1e28cffe1d87f262d03 (patch) | |
| tree | da64e14dd8432602634773b52073928c50dfb85c /kernel/irq/irqdesc.c | |
| parent | 4e6b26d23dc1faee318796d5c7f91b5692b1e6be (diff) | |
| parent | 28528fca4908142bd1a3247956cba56c9c667d71 (diff) | |
Merge tag 'irqchip-5.1' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms into irq/core
Pull irqchip updates from Marc Zyngier
- Core pseudo-NMI handling code
- Allow the default irq domain to be retrieved
- A new interrupt controller for the Loongson LS1X platform
- Affinity support for the SiFive PLIC
- Better support for the iMX irqsteer driver
- NUMA aware memory allocations for GICv3
- A handful of other fixes (i8259, GICv3, PLIC)
Diffstat (limited to 'kernel/irq/irqdesc.c')
| -rw-r--r-- | kernel/irq/irqdesc.c | 35 | 
1 files changed, 35 insertions, 0 deletions
diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c index 84fa255d0329..13539e12cd80 100644 --- a/kernel/irq/irqdesc.c +++ b/kernel/irq/irqdesc.c @@ -670,6 +670,41 @@ int __handle_domain_irq(struct irq_domain *domain, unsigned int hwirq,  	set_irq_regs(old_regs);  	return ret;  } + +#ifdef CONFIG_IRQ_DOMAIN +/** + * handle_domain_nmi - Invoke the handler for a HW irq belonging to a domain + * @domain:	The domain where to perform the lookup + * @hwirq:	The HW irq number to convert to a logical one + * @regs:	Register file coming from the low-level handling code + * + * Returns:	0 on success, or -EINVAL if conversion has failed + */ +int handle_domain_nmi(struct irq_domain *domain, unsigned int hwirq, +		      struct pt_regs *regs) +{ +	struct pt_regs *old_regs = set_irq_regs(regs); +	unsigned int irq; +	int ret = 0; + +	nmi_enter(); + +	irq = irq_find_mapping(domain, hwirq); + +	/* +	 * ack_bad_irq is not NMI-safe, just report +	 * an invalid interrupt. +	 */ +	if (likely(irq)) +		generic_handle_irq(irq); +	else +		ret = -EINVAL; + +	nmi_exit(); +	set_irq_regs(old_regs); +	return ret; +} +#endif  #endif  /* Dynamic interrupt handling */  | 
