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:
parent
8240ef50d4
commit
e1c054918c
3 changed files with 33 additions and 33 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue