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) | ||||
| { | ||||
| 	__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 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 | ||||
|  |  | |||
|  | @ -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,9 +676,10 @@ 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, | ||||
|  *                       usually for a root interrupt controller | ||||
|  * 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 | ||||
|  * @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 | ||||
|  */ | ||||
| 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); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/* The irqdomain code provides boundary checks */ | ||||
| 	desc = irq_resolve_mapping(domain, 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 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Marc Zyngier
						Marc Zyngier