diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/asm-generic/hardirq.h | 6 | ||||
| -rw-r--r-- | include/asm-generic/msi.h | 4 | ||||
| -rw-r--r-- | include/linux/hardirq.h | 4 | ||||
| -rw-r--r-- | include/linux/interrupt.h | 8 | ||||
| -rw-r--r-- | include/linux/ioport.h | 7 | ||||
| -rw-r--r-- | include/linux/irq.h | 16 | ||||
| -rw-r--r-- | include/linux/irq_cpustat.h | 28 | ||||
| -rw-r--r-- | include/linux/irqdomain.h | 10 | ||||
| -rw-r--r-- | include/linux/platform_device.h | 6 | ||||
| -rw-r--r-- | include/linux/preempt.h | 30 | ||||
| -rw-r--r-- | include/linux/vtime.h | 42 | 
11 files changed, 81 insertions, 80 deletions
| diff --git a/include/asm-generic/hardirq.h b/include/asm-generic/hardirq.h index d14214dfc10b..7317e8258b48 100644 --- a/include/asm-generic/hardirq.h +++ b/include/asm-generic/hardirq.h @@ -7,9 +7,13 @@  typedef struct {  	unsigned int __softirq_pending; +#ifdef ARCH_WANTS_NMI_IRQSTAT +	unsigned int __nmi_count; +#endif  } ____cacheline_aligned irq_cpustat_t; -#include <linux/irq_cpustat.h>	/* Standard mappings for irq_cpustat_t above */ +DECLARE_PER_CPU_ALIGNED(irq_cpustat_t, irq_stat); +  #include <linux/irq.h>  #ifndef ack_bad_irq diff --git a/include/asm-generic/msi.h b/include/asm-generic/msi.h index 25344de0e8f9..bf910d47e900 100644 --- a/include/asm-generic/msi.h +++ b/include/asm-generic/msi.h @@ -24,12 +24,16 @@ struct msi_desc;  typedef struct msi_alloc_info {  	struct msi_desc			*desc;  	irq_hw_number_t			hwirq; +	unsigned long			flags;  	union {  		unsigned long		ul;  		void			*ptr;  	} scratchpad[NUM_MSI_ALLOC_SCRATCHPAD_REGS];  } msi_alloc_info_t; +/* Device generating MSIs is proxying for another device */ +#define MSI_ALLOC_FLAGS_PROXY_DEVICE	(1UL << 0) +  #define GENERIC_MSI_DOMAIN_OPS		1  #endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */ diff --git a/include/linux/hardirq.h b/include/linux/hardirq.h index 754f67ac4326..7c9d6a2d7e90 100644 --- a/include/linux/hardirq.h +++ b/include/linux/hardirq.h @@ -32,9 +32,9 @@ static __always_inline void rcu_irq_enter_check_tick(void)   */  #define __irq_enter()					\  	do {						\ -		account_irq_enter_time(current);	\  		preempt_count_add(HARDIRQ_OFFSET);	\  		lockdep_hardirq_enter();		\ +		account_hardirq_enter(current);		\  	} while (0)  /* @@ -62,8 +62,8 @@ void irq_enter_rcu(void);   */  #define __irq_exit()					\  	do {						\ +		account_hardirq_exit(current);		\  		lockdep_hardirq_exit();			\ -		account_irq_exit_time(current);		\  		preempt_count_sub(HARDIRQ_OFFSET);	\  	} while (0) diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index ee8299eb1f52..870b3251e174 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h @@ -352,6 +352,8 @@ extern int irq_can_set_affinity(unsigned int irq);  extern int irq_select_affinity(unsigned int irq);  extern int irq_set_affinity_hint(unsigned int irq, const struct cpumask *m); +extern int irq_update_affinity_desc(unsigned int irq, +				    struct irq_affinity_desc *affinity);  extern int  irq_set_affinity_notifier(unsigned int irq, struct irq_affinity_notify *notify); @@ -387,6 +389,12 @@ static inline int irq_set_affinity_hint(unsigned int irq,  	return -EINVAL;  } +static inline int irq_update_affinity_desc(unsigned int irq, +					   struct irq_affinity_desc *affinity) +{ +	return -EINVAL; +} +  static inline int  irq_set_affinity_notifier(unsigned int irq, struct irq_affinity_notify *notify)  { diff --git a/include/linux/ioport.h b/include/linux/ioport.h index 5135d4b86cd6..f9bf374f9633 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -307,6 +307,13 @@ struct resource *devm_request_free_mem_region(struct device *dev,  struct resource *request_free_mem_region(struct resource *base,  		unsigned long size, const char *name); +static inline void irqresource_disabled(struct resource *res, u32 irq) +{ +	res->start = irq; +	res->end = irq; +	res->flags = IORESOURCE_IRQ | IORESOURCE_DISABLED | IORESOURCE_UNSET; +} +  #ifdef CONFIG_IO_STRICT_DEVMEM  void revoke_devmem(struct resource *res);  #else diff --git a/include/linux/irq.h b/include/linux/irq.h index c54365309e97..c332871d59da 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h @@ -647,7 +647,6 @@ static inline int irq_set_parent(int irq, int parent_irq)   */  extern void handle_level_irq(struct irq_desc *desc);  extern void handle_fasteoi_irq(struct irq_desc *desc); -extern void handle_percpu_devid_fasteoi_ipi(struct irq_desc *desc);  extern void handle_edge_irq(struct irq_desc *desc);  extern void handle_edge_eoi_irq(struct irq_desc *desc);  extern void handle_simple_irq(struct irq_desc *desc); @@ -954,21 +953,6 @@ static inline void irq_free_desc(unsigned int irq)  	irq_free_descs(irq, 1);  } -#ifdef CONFIG_GENERIC_IRQ_LEGACY_ALLOC_HWIRQ -unsigned int irq_alloc_hwirqs(int cnt, int node); -static inline unsigned int irq_alloc_hwirq(int node) -{ -	return irq_alloc_hwirqs(1, node); -} -void irq_free_hwirqs(unsigned int from, int cnt); -static inline void irq_free_hwirq(unsigned int irq) -{ -	return irq_free_hwirqs(irq, 1); -} -int arch_setup_hwirq(unsigned int irq, int node); -void arch_teardown_hwirq(unsigned int irq); -#endif -  #ifdef CONFIG_GENERIC_IRQ_LEGACY  void irq_init_desc(unsigned int irq);  #endif diff --git a/include/linux/irq_cpustat.h b/include/linux/irq_cpustat.h deleted file mode 100644 index 6e8895cd4d92..000000000000 --- a/include/linux/irq_cpustat.h +++ /dev/null @@ -1,28 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef __irq_cpustat_h -#define __irq_cpustat_h - -/* - * Contains default mappings for irq_cpustat_t, used by almost every - * architecture.  Some arch (like s390) have per cpu hardware pages and - * they define their own mappings for irq_stat. - * - * Keith Owens <kaos@ocs.com.au> July 2000. - */ - - -/* - * Simple wrappers reducing source bloat.  Define all irq_stat fields - * here, even ones that are arch dependent.  That way we get common - * definitions instead of differing sets for each arch. - */ - -#ifndef __ARCH_IRQ_STAT -DECLARE_PER_CPU_ALIGNED(irq_cpustat_t, irq_stat);	/* defined in asm/hardirq.h */ -#define __IRQ_STAT(cpu, member)	(per_cpu(irq_stat.member, cpu)) -#endif - -/* arch dependent irq_stat fields */ -#define nmi_count(cpu)		__IRQ_STAT((cpu), __nmi_count)	/* i386 */ - -#endif	/* __irq_cpustat_h */ diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h index ea5a337e0f8b..42d196805f58 100644 --- a/include/linux/irqdomain.h +++ b/include/linux/irqdomain.h @@ -37,8 +37,8 @@  #include <linux/radix-tree.h>  struct device_node; +struct fwnode_handle;  struct irq_domain; -struct of_device_id;  struct irq_chip;  struct irq_data;  struct cpumask; @@ -271,6 +271,12 @@ struct irq_domain *irq_domain_add_legacy(struct device_node *of_node,  					 irq_hw_number_t first_hwirq,  					 const struct irq_domain_ops *ops,  					 void *host_data); +struct irq_domain *irq_domain_create_legacy(struct fwnode_handle *fwnode, +					    unsigned int size, +					    unsigned int first_irq, +					    irq_hw_number_t first_hwirq, +					    const struct irq_domain_ops *ops, +					    void *host_data);  extern struct irq_domain *irq_find_matching_fwspec(struct irq_fwspec *fwspec,  						   enum irq_domain_bus_token bus_token);  extern bool irq_domain_check_msi_remap(void); @@ -381,8 +387,6 @@ extern int irq_domain_associate(struct irq_domain *domain, unsigned int irq,  extern void irq_domain_associate_many(struct irq_domain *domain,  				      unsigned int irq_base,  				      irq_hw_number_t hwirq_base, int count); -extern void irq_domain_disassociate(struct irq_domain *domain, -				    unsigned int irq);  extern unsigned int irq_create_mapping_affinity(struct irq_domain *host,  				      irq_hw_number_t hwirq, diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h index ee6a9f10c2c7..3f23f6e430bf 100644 --- a/include/linux/platform_device.h +++ b/include/linux/platform_device.h @@ -15,6 +15,7 @@  #define PLATFORM_DEVID_NONE	(-1)  #define PLATFORM_DEVID_AUTO	(-2) +struct irq_affinity;  struct mfd_cell;  struct property_entry;  struct platform_device_id; @@ -73,6 +74,11 @@ devm_platform_ioremap_resource_byname(struct platform_device *pdev,  extern int platform_get_irq(struct platform_device *, unsigned int);  extern int platform_get_irq_optional(struct platform_device *, unsigned int);  extern int platform_irq_count(struct platform_device *); +extern int devm_platform_get_irqs_affinity(struct platform_device *dev, +					   struct irq_affinity *affd, +					   unsigned int minvec, +					   unsigned int maxvec, +					   int **irqs);  extern struct resource *platform_get_resource_byname(struct platform_device *,  						     unsigned int,  						     const char *); diff --git a/include/linux/preempt.h b/include/linux/preempt.h index 6df63cbe8bb0..69cc8b64aa3a 100644 --- a/include/linux/preempt.h +++ b/include/linux/preempt.h @@ -77,31 +77,33 @@  /* preempt_count() and related functions, depends on PREEMPT_NEED_RESCHED */  #include <asm/preempt.h> +#define nmi_count()	(preempt_count() & NMI_MASK)  #define hardirq_count()	(preempt_count() & HARDIRQ_MASK)  #define softirq_count()	(preempt_count() & SOFTIRQ_MASK) -#define irq_count()	(preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK \ -				 | NMI_MASK)) +#define irq_count()	(nmi_count() | hardirq_count() | softirq_count())  /* - * Are we doing bottom half or hardware interrupt processing? + * Macros to retrieve the current execution context:   * - * in_irq()       - We're in (hard) IRQ context + * in_nmi()		- We're in NMI context + * in_hardirq()		- We're in hard IRQ context + * in_serving_softirq()	- We're in softirq context + * in_task()		- We're in task context + */ +#define in_nmi()		(nmi_count()) +#define in_hardirq()		(hardirq_count()) +#define in_serving_softirq()	(softirq_count() & SOFTIRQ_OFFSET) +#define in_task()		(!(in_nmi() | in_hardirq() | in_serving_softirq())) + +/* + * The following macros are deprecated and should not be used in new code: + * in_irq()       - Obsolete version of in_hardirq()   * in_softirq()   - We have BH disabled, or are processing softirqs   * in_interrupt() - We're in NMI,IRQ,SoftIRQ context or have BH disabled - * in_serving_softirq() - We're in softirq context - * in_nmi()       - We're in NMI context - * in_task()	  - We're in task context - * - * Note: due to the BH disabled confusion: in_softirq(),in_interrupt() really - *       should not be used in new code.   */  #define in_irq()		(hardirq_count())  #define in_softirq()		(softirq_count())  #define in_interrupt()		(irq_count()) -#define in_serving_softirq()	(softirq_count() & SOFTIRQ_OFFSET) -#define in_nmi()		(preempt_count() & NMI_MASK) -#define in_task()		(!(preempt_count() & \ -				   (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_OFFSET)))  /*   * The preempt_count offset after preempt_disable(); diff --git a/include/linux/vtime.h b/include/linux/vtime.h index 2cdeca062db3..041d6524d144 100644 --- a/include/linux/vtime.h +++ b/include/linux/vtime.h @@ -83,36 +83,46 @@ static inline void vtime_init_idle(struct task_struct *tsk, int cpu) { }  #endif  #ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE -extern void vtime_account_irq_enter(struct task_struct *tsk); -static inline void vtime_account_irq_exit(struct task_struct *tsk) -{ -	/* On hard|softirq exit we always account to hard|softirq cputime */ -	vtime_account_kernel(tsk); -} +extern void vtime_account_irq(struct task_struct *tsk, unsigned int offset); +extern void vtime_account_softirq(struct task_struct *tsk); +extern void vtime_account_hardirq(struct task_struct *tsk);  extern void vtime_flush(struct task_struct *tsk);  #else /* !CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */ -static inline void vtime_account_irq_enter(struct task_struct *tsk) { } -static inline void vtime_account_irq_exit(struct task_struct *tsk) { } +static inline void vtime_account_irq(struct task_struct *tsk, unsigned int offset) { } +static inline void vtime_account_softirq(struct task_struct *tsk) { } +static inline void vtime_account_hardirq(struct task_struct *tsk) { }  static inline void vtime_flush(struct task_struct *tsk) { }  #endif  #ifdef CONFIG_IRQ_TIME_ACCOUNTING -extern void irqtime_account_irq(struct task_struct *tsk); +extern void irqtime_account_irq(struct task_struct *tsk, unsigned int offset);  #else -static inline void irqtime_account_irq(struct task_struct *tsk) { } +static inline void irqtime_account_irq(struct task_struct *tsk, unsigned int offset) { }  #endif -static inline void account_irq_enter_time(struct task_struct *tsk) +static inline void account_softirq_enter(struct task_struct *tsk) +{ +	vtime_account_irq(tsk, SOFTIRQ_OFFSET); +	irqtime_account_irq(tsk, SOFTIRQ_OFFSET); +} + +static inline void account_softirq_exit(struct task_struct *tsk) +{ +	vtime_account_softirq(tsk); +	irqtime_account_irq(tsk, 0); +} + +static inline void account_hardirq_enter(struct task_struct *tsk)  { -	vtime_account_irq_enter(tsk); -	irqtime_account_irq(tsk); +	vtime_account_irq(tsk, HARDIRQ_OFFSET); +	irqtime_account_irq(tsk, HARDIRQ_OFFSET);  } -static inline void account_irq_exit_time(struct task_struct *tsk) +static inline void account_hardirq_exit(struct task_struct *tsk)  { -	vtime_account_irq_exit(tsk); -	irqtime_account_irq(tsk); +	vtime_account_hardirq(tsk); +	irqtime_account_irq(tsk, 0);  }  #endif /* _LINUX_KERNEL_VTIME_H */ | 
