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)31static 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