mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-01 00:58:39 +02: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:
		
							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…
	
		Reference in a new issue
	
	 Marc Zyngier
						Marc Zyngier