1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | /* |
3 | * Copyright (C) 2011-12 Synopsys, Inc. (www.synopsys.com) |
4 | */ |
5 | |
6 | #include <linux/interrupt.h> |
7 | #include <linux/irqchip.h> |
8 | #include <asm/mach_desc.h> |
9 | |
10 | #include <asm/irq_regs.h> |
11 | #include <asm/smp.h> |
12 | |
13 | /* |
14 | * Late Interrupt system init called from start_kernel for Boot CPU only |
15 | * |
16 | * Since slab must already be initialized, platforms can start doing any |
17 | * needed request_irq( )s |
18 | */ |
19 | void __init init_IRQ(void) |
20 | { |
21 | /* |
22 | * process the entire interrupt tree in one go |
23 | * Any external intc will be setup provided DT chains them |
24 | * properly |
25 | */ |
26 | irqchip_init(); |
27 | |
28 | #ifdef CONFIG_SMP |
29 | /* a SMP H/w block could do IPI IRQ request here */ |
30 | if (plat_smp_ops.init_per_cpu) |
31 | plat_smp_ops.init_per_cpu(smp_processor_id()); |
32 | #endif |
33 | |
34 | if (machine_desc->init_per_cpu) |
35 | machine_desc->init_per_cpu(smp_processor_id()); |
36 | } |
37 | |
38 | /* |
39 | * "C" Entry point for any ARC ISR, called from low level vector handler |
40 | * @irq is the vector number read from ICAUSE reg of on-chip intc |
41 | */ |
42 | void arch_do_IRQ(unsigned int hwirq, struct pt_regs *regs) |
43 | { |
44 | struct pt_regs *old_regs; |
45 | |
46 | irq_enter(); |
47 | old_regs = set_irq_regs(regs); |
48 | generic_handle_domain_irq(NULL, hwirq); |
49 | set_irq_regs(old_regs); |
50 | irq_exit(); |
51 | } |
52 | |