Commit e1c05491 authored by Marc Zyngier's avatar Marc Zyngier
Browse files

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: default avatarMarc Zyngier <maz@kernel.org>
parent 8240ef50
Loading
Loading
Loading
Loading
+21 −1
Original line number Diff line number Diff line
@@ -63,7 +63,27 @@ int arch_show_interrupts(struct seq_file *p, int prec)
 */
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);
}

/*
+4 −10
Original line number Diff line number Diff line
@@ -161,24 +161,18 @@ static inline void generic_handle_irq_desc(struct irq_desc *desc)
int handle_irq_desc(struct irq_desc *desc);
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,
 * and handle the result interrupt number. Return -EINVAL if
 * 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);

static inline 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_HANDLE_DOMAIN_IRQ
int handle_domain_irq(struct irq_domain *domain,
		      unsigned int hwirq, struct pt_regs *regs);

#ifdef CONFIG_IRQ_DOMAIN
int handle_domain_nmi(struct irq_domain *domain, unsigned int hwirq,
		      struct pt_regs *regs);
#endif
+8 −22
Original line number Diff line number Diff line
@@ -659,7 +659,7 @@ int generic_handle_irq(unsigned int 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
 *                             to a domain, usually for a non-root interrupt
@@ -676,8 +676,9 @@ int generic_handle_domain_irq(struct irq_domain *domain, unsigned int hwirq)
}
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
 * @domain:	The domain where to perform the lookup
 * @hwirq:	The HW irq number to convert to a logical one
@@ -686,8 +687,8 @@ EXPORT_SYMBOL_GPL(generic_handle_domain_irq);
 *
 * Returns:	0 on success, or -EINVAL if conversion has failed
 */
int __handle_domain_irq(struct irq_domain *domain, unsigned int hwirq,
			bool lookup, struct pt_regs *regs)
int handle_domain_irq(struct irq_domain *domain,
		      unsigned int hwirq, struct pt_regs *regs)
{
	struct pt_regs *old_regs = set_irq_regs(regs);
	struct irq_desc *desc;
@@ -695,22 +696,8 @@ int __handle_domain_irq(struct irq_domain *domain, unsigned int hwirq,

	irq_enter();

	if (likely(IS_ENABLED(CONFIG_IRQ_DOMAIN) && lookup)) {
	/* The irqdomain code provides boundary checks */
	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))
		handle_irq_desc(desc);
	else
@@ -721,7 +708,6 @@ int __handle_domain_irq(struct irq_domain *domain, unsigned int hwirq,
	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