2019-06-03 08:44:50 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2012-03-05 15:49:29 +04:00
/*
* Based on arch / arm / kernel / irq . c
*
* Copyright ( C ) 1992 Linus Torvalds
* Modifications for ARM processor Copyright ( C ) 1995 - 2000 Russell King .
* Support for Dynamic Tick Timer Copyright ( C ) 2004 - 2005 Nokia Corporation .
* Dynamic Tick Timer written by Tony Lindgren < tony @ atomide . com > and
* Tuukka Tikkanen < tuukka . tikkanen @ elektrobit . com > .
* Copyright ( C ) 2012 ARM Ltd .
*/
# include <linux/irq.h>
2017-07-21 16:25:33 +03:00
# include <linux/memory.h>
2012-03-05 15:49:29 +04:00
# include <linux/smp.h>
2020-06-20 19:19:00 +03:00
# include <linux/hardirq.h>
2012-03-05 15:49:29 +04:00
# include <linux/init.h>
2013-01-14 16:39:31 +04:00
# include <linux/irqchip.h>
2019-06-11 12:38:09 +03:00
# include <linux/kprobes.h>
2012-03-05 15:49:29 +04:00
# include <linux/seq_file.h>
2017-07-21 16:25:33 +03:00
# include <linux/vmalloc.h>
2019-06-11 12:38:09 +03:00
# include <asm/daifflags.h>
2018-01-08 18:38:10 +03:00
# include <asm/vmap_stack.h>
2012-03-05 15:49:29 +04:00
2019-01-31 17:58:39 +03:00
/* Only access this in an NMI enter/exit */
DEFINE_PER_CPU ( struct nmi_ctx , nmi_contexts ) ;
2017-07-31 23:17:03 +03:00
DEFINE_PER_CPU ( unsigned long * , irq_stack_ptr ) ;
2015-12-04 14:02:26 +03:00
2017-07-21 16:25:33 +03:00
# ifdef CONFIG_VMAP_STACK
static void init_irq_stacks ( void )
{
int cpu ;
unsigned long * p ;
for_each_possible_cpu ( cpu ) {
2018-01-08 18:38:10 +03:00
p = arch_alloc_vmap_stack ( IRQ_STACK_SIZE , cpu_to_node ( cpu ) ) ;
2017-07-21 16:25:33 +03:00
per_cpu ( irq_stack_ptr , cpu ) = p ;
}
}
# else
/* irq stack only needs to be 16 byte aligned - not IRQ_STACK_SIZE aligned. */
DEFINE_PER_CPU_ALIGNED ( unsigned long [ IRQ_STACK_SIZE / sizeof ( long ) ] , irq_stack ) ;
2017-07-31 23:17:03 +03:00
static void init_irq_stacks ( void )
{
int cpu ;
for_each_possible_cpu ( cpu )
per_cpu ( irq_stack_ptr , cpu ) = per_cpu ( irq_stack , cpu ) ;
}
2017-07-21 16:25:33 +03:00
# endif
2017-07-31 23:17:03 +03:00
2012-03-05 15:49:29 +04:00
void __init init_IRQ ( void )
{
2017-07-31 23:17:03 +03:00
init_irq_stacks ( ) ;
2013-01-14 16:39:31 +04:00
irqchip_init ( ) ;
2012-03-05 15:49:29 +04:00
if ( ! handle_arch_irq )
panic ( " No interrupt controller found. " ) ;
2019-06-11 12:38:12 +03:00
if ( system_uses_irq_prio_masking ( ) ) {
/*
* Now that we have a stack for our IRQ handler , set
* the PMR / PSR pair to a consistent state .
*/
WARN_ON ( read_sysreg ( daif ) & PSR_A_BIT ) ;
local_daif_restore ( DAIF_PROCCTX_NOIRQ ) ;
}
2012-03-05 15:49:29 +04:00
}
2019-06-11 12:38:09 +03:00
/*
* Stubs to make nmi_enter / exit ( ) code callable from ASM
*/
asmlinkage void notrace asm_nmi_enter ( void )
{
nmi_enter ( ) ;
}
NOKPROBE_SYMBOL ( asm_nmi_enter ) ;
asmlinkage void notrace asm_nmi_exit ( void )
{
nmi_exit ( ) ;
2012-03-05 15:49:29 +04:00
}
2019-06-11 12:38:09 +03:00
NOKPROBE_SYMBOL ( asm_nmi_exit ) ;