1
0
Fork 0
mirror of synced 2025-03-06 20:59:54 +01:00

genirq: Move non-irqdomain handle_domain_irq() handling into ARM's handle_IRQ()

Despite the name, handle_domain_irq() deals with non-irqdomain
handling for the sake of a handful of legacy ARM platforms.

Move such handling into ARM's handle_IRQ(), allowing for better
code generation for everyone else. This allows us get rid of
some complexity, and to rearrange the guards on the various helpers
in a more logical way.

Signed-off-by: Marc Zyngier <maz@kernel.org>
This commit is contained in:
Marc Zyngier 2021-05-12 16:18:15 +01:00
parent 8240ef50d4
commit e1c054918c
3 changed files with 33 additions and 33 deletions

View file

@ -63,7 +63,27 @@ int arch_show_interrupts(struct seq_file *p, int prec)
*/ */
void handle_IRQ(unsigned int irq, struct pt_regs *regs) void handle_IRQ(unsigned int irq, struct pt_regs *regs)
{ {
__handle_domain_irq(NULL, irq, false, regs); struct pt_regs *old_regs = set_irq_regs(regs);
struct irq_desc *desc;
irq_enter();
/*
* Some hardware gives randomly wrong interrupts. Rather
* than crashing, do something sensible.
*/
if (unlikely(!irq || irq >= nr_irqs))
desc = NULL;
else
desc = irq_to_desc(irq);
if (likely(desc))
handle_irq_desc(desc);
else
ack_bad_irq(irq);
irq_exit();
set_irq_regs(old_regs);
} }
/* /*

View file

@ -161,24 +161,18 @@ static inline void generic_handle_irq_desc(struct irq_desc *desc)
int handle_irq_desc(struct irq_desc *desc); int handle_irq_desc(struct irq_desc *desc);
int generic_handle_irq(unsigned int irq); int generic_handle_irq(unsigned int irq);
#ifdef CONFIG_HANDLE_DOMAIN_IRQ #ifdef CONFIG_IRQ_DOMAIN
/* /*
* Convert a HW interrupt number to a logical one using a IRQ domain, * Convert a HW interrupt number to a logical one using a IRQ domain,
* and handle the result interrupt number. Return -EINVAL if * and handle the result interrupt number. Return -EINVAL if
* conversion failed. * conversion failed.
*/ */
int __handle_domain_irq(struct irq_domain *domain, unsigned int hwirq,
bool lookup, struct pt_regs *regs);
int generic_handle_domain_irq(struct irq_domain *domain, unsigned int hwirq); int generic_handle_domain_irq(struct irq_domain *domain, unsigned int hwirq);
static inline int handle_domain_irq(struct irq_domain *domain, #ifdef CONFIG_HANDLE_DOMAIN_IRQ
unsigned int hwirq, struct pt_regs *regs) int handle_domain_irq(struct irq_domain *domain,
{ unsigned int hwirq, struct pt_regs *regs);
return __handle_domain_irq(domain, hwirq, true, regs);
}
#ifdef CONFIG_IRQ_DOMAIN
int handle_domain_nmi(struct irq_domain *domain, unsigned int hwirq, int handle_domain_nmi(struct irq_domain *domain, unsigned int hwirq,
struct pt_regs *regs); struct pt_regs *regs);
#endif #endif

View file

@ -659,7 +659,7 @@ int generic_handle_irq(unsigned int irq)
} }
EXPORT_SYMBOL_GPL(generic_handle_irq); EXPORT_SYMBOL_GPL(generic_handle_irq);
#ifdef CONFIG_HANDLE_DOMAIN_IRQ #ifdef CONFIG_IRQ_DOMAIN
/** /**
* generic_handle_domain_irq - Invoke the handler for a HW irq belonging * generic_handle_domain_irq - Invoke the handler for a HW irq belonging
* to a domain, usually for a non-root interrupt * to a domain, usually for a non-root interrupt
@ -676,9 +676,10 @@ int generic_handle_domain_irq(struct irq_domain *domain, unsigned int hwirq)
} }
EXPORT_SYMBOL_GPL(generic_handle_domain_irq); EXPORT_SYMBOL_GPL(generic_handle_domain_irq);
#ifdef CONFIG_HANDLE_DOMAIN_IRQ
/** /**
* __handle_domain_irq - Invoke the handler for a HW irq belonging to a domain, * handle_domain_irq - Invoke the handler for a HW irq belonging to a domain,
* usually for a root interrupt controller * usually for a root interrupt controller
* @domain: The domain where to perform the lookup * @domain: The domain where to perform the lookup
* @hwirq: The HW irq number to convert to a logical one * @hwirq: The HW irq number to convert to a logical one
* @lookup: Whether to perform the domain lookup or not * @lookup: Whether to perform the domain lookup or not
@ -686,8 +687,8 @@ EXPORT_SYMBOL_GPL(generic_handle_domain_irq);
* *
* Returns: 0 on success, or -EINVAL if conversion has failed * Returns: 0 on success, or -EINVAL if conversion has failed
*/ */
int __handle_domain_irq(struct irq_domain *domain, unsigned int hwirq, int handle_domain_irq(struct irq_domain *domain,
bool lookup, struct pt_regs *regs) unsigned int hwirq, struct pt_regs *regs)
{ {
struct pt_regs *old_regs = set_irq_regs(regs); struct pt_regs *old_regs = set_irq_regs(regs);
struct irq_desc *desc; struct irq_desc *desc;
@ -695,22 +696,8 @@ int __handle_domain_irq(struct irq_domain *domain, unsigned int hwirq,
irq_enter(); irq_enter();
if (likely(IS_ENABLED(CONFIG_IRQ_DOMAIN) && lookup)) { /* The irqdomain code provides boundary checks */
/* The irqdomain code provides boundary checks */ desc = irq_resolve_mapping(domain, hwirq);
desc = irq_resolve_mapping(domain, hwirq);
} else {
/*
* Some hardware gives randomly wrong interrupts. Rather
* than crashing, do something sensible.
*/
if (unlikely(!hwirq || hwirq >= nr_irqs)) {
ack_bad_irq(hwirq);
desc = NULL;
} else {
desc = irq_to_desc(hwirq);
}
}
if (likely(desc)) if (likely(desc))
handle_irq_desc(desc); handle_irq_desc(desc);
else else
@ -721,7 +708,6 @@ int __handle_domain_irq(struct irq_domain *domain, unsigned int hwirq,
return ret; return ret;
} }
#ifdef CONFIG_IRQ_DOMAIN
/** /**
* handle_domain_nmi - Invoke the handler for a HW irq belonging to a domain * handle_domain_nmi - Invoke the handler for a HW irq belonging to a domain
* @domain: The domain where to perform the lookup * @domain: The domain where to perform the lookup