• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2020 Loongson Technology Corporation Limited
4  */
5 #ifndef _ASM_IRQ_H
6 #define _ASM_IRQ_H
7 
8 #include <linux/irqdomain.h>
9 #include <irq.h>
10 #include <asm-generic/irq.h>
11 
12 #define IRQ_STACK_SIZE			THREAD_SIZE
13 #define IRQ_STACK_START			(IRQ_STACK_SIZE - 16)
14 
15 DECLARE_PER_CPU(unsigned long, irq_stack);
16 
17 /*
18  * The highest address on the IRQ stack contains a dummy frame put down in
19  * genex.S (except_vec_vi_handler) which is structured as follows:
20  *
21  *   top ------------
22  *       | task sp  | <- irq_stack[cpu] + IRQ_STACK_START
23  *       ------------
24  *       |          | <- First frame of IRQ context
25  *       ------------
26  *
27  * task sp holds a copy of the task stack pointer where the struct pt_regs
28  * from exception entry can be found.
29  */
30 
on_irq_stack(int cpu,unsigned long sp)31 static inline bool on_irq_stack(int cpu, unsigned long sp)
32 {
33 	unsigned long low = per_cpu(irq_stack, cpu);
34 	unsigned long high = low + IRQ_STACK_SIZE;
35 
36 	return (low <= sp && sp <= high);
37 }
38 
39 struct irq_data;
40 struct device_node;
41 
42 int get_ipi_irq(void);
43 int get_pmc_irq(void);
44 int get_timer_irq(void);
45 void arch_init_irq(void);
46 void spurious_interrupt(void);
47 struct irq_domain *loongarch_cpu_irq_init(void);
48 
49 #define NR_IRQS_LEGACY 16
50 
51 void arch_trigger_cpumask_backtrace(const struct cpumask *mask,
52 					bool exclude_self);
53 #define arch_trigger_cpumask_backtrace arch_trigger_cpumask_backtrace
54 
55 #endif /* _ASM_IRQ_H */
56