diff --git a/arch/arc/core/irq_offload.c b/arch/arc/core/irq_offload.c index b658b8e353d4..d1a3f900ca3f 100644 --- a/arch/arc/core/irq_offload.c +++ b/arch/arc/core/irq_offload.c @@ -54,7 +54,7 @@ void arch_irq_offload(irq_offload_routine_t routine, const void *parameter) } /* need to be executed on every core in the system */ -int arc_irq_offload_init(void) +void arch_irq_offload_init(void) { IRQ_CONNECT(IRQ_OFFLOAD_LINE, IRQ_OFFLOAD_PRIO, arc_irq_offload_handler, NULL, 0); @@ -64,8 +64,4 @@ int arc_irq_offload_init(void) * with generic irq_enable() but via z_arc_v2_irq_unit_int_enable(). */ z_arc_v2_irq_unit_int_enable(IRQ_OFFLOAD_LINE); - - return 0; } - -SYS_INIT(arc_irq_offload_init, POST_KERNEL, 0); diff --git a/arch/arc/include/arc_irq_offload.h b/arch/arc/include/arc_irq_offload.h index c38d0a24b68e..243b46556522 100644 --- a/arch/arc/include/arc_irq_offload.h +++ b/arch/arc/include/arc_irq_offload.h @@ -9,11 +9,9 @@ #ifdef CONFIG_IRQ_OFFLOAD -int arc_irq_offload_init(const struct device *unused); - static inline void arc_irq_offload_init_smp(void) { - arc_irq_offload_init(NULL); + arch_irq_offload_init(); } #else diff --git a/arch/arm/core/irq_offload.c b/arch/arm/core/irq_offload.c index 5dc1feccf7ab..65349de331b0 100644 --- a/arch/arm/core/irq_offload.c +++ b/arch/arm/core/irq_offload.c @@ -42,3 +42,7 @@ void arch_irq_offload(irq_offload_routine_t routine, const void *parameter) offload_routine = NULL; k_sched_unlock(); } + +void arch_irq_offload_init(void) +{ +} diff --git a/arch/arm64/core/irq_offload.c b/arch/arm64/core/irq_offload.c index 1d5e3c829b88..4488e26849c0 100644 --- a/arch/arm64/core/irq_offload.c +++ b/arch/arm64/core/irq_offload.c @@ -23,3 +23,7 @@ void arch_irq_offload(irq_offload_routine_t routine, const void *parameter) : [svid] "i" (_SVC_CALL_IRQ_OFFLOAD), "r" (x0), "r" (x1)); } + +void arch_irq_offload_init(void) +{ +} diff --git a/arch/mips/core/irq_offload.c b/arch/mips/core/irq_offload.c index 2a62ae071e0b..5c85ada4d61c 100644 --- a/arch/mips/core/irq_offload.c +++ b/arch/mips/core/irq_offload.c @@ -48,3 +48,7 @@ void arch_irq_offload(irq_offload_routine_t routine, const void *parameter) irq_unlock(key); } + +void arch_irq_offload_init(void) +{ +} diff --git a/arch/nios2/core/irq_offload.c b/arch/nios2/core/irq_offload.c index d33882f9f021..0c918896be95 100644 --- a/arch/nios2/core/irq_offload.c +++ b/arch/nios2/core/irq_offload.c @@ -41,3 +41,7 @@ void arch_irq_offload(irq_offload_routine_t routine, const void *parameter) irq_unlock(key); } + +void arch_irq_offload_init(void) +{ +} diff --git a/arch/posix/core/irq.c b/arch/posix/core/irq.c index 11d99e782b12..a1d3568c154e 100644 --- a/arch/posix/core/irq.c +++ b/arch/posix/core/irq.c @@ -14,6 +14,10 @@ void arch_irq_offload(irq_offload_routine_t routine, const void *parameter) { posix_irq_offload(routine, parameter); } + +void arch_irq_offload_init(void) +{ +} #endif void arch_irq_enable(unsigned int irq) diff --git a/arch/riscv/core/irq_offload.c b/arch/riscv/core/irq_offload.c index d325bc2dcd68..73d4b04c2a16 100644 --- a/arch/riscv/core/irq_offload.c +++ b/arch/riscv/core/irq_offload.c @@ -11,3 +11,7 @@ void arch_irq_offload(irq_offload_routine_t routine, const void *parameter) { arch_syscall_invoke2((uintptr_t)routine, (uintptr_t)parameter, RV_ECALL_IRQ_OFFLOAD); } + +void arch_irq_offload_init(void) +{ +} diff --git a/arch/sparc/core/irq_offload.c b/arch/sparc/core/irq_offload.c index cd5acc08ba2a..f36e957084b2 100644 --- a/arch/sparc/core/irq_offload.c +++ b/arch/sparc/core/irq_offload.c @@ -39,3 +39,7 @@ void arch_irq_offload(irq_offload_routine_t routine, const void *parameter) irq_unlock(key); } + +void arch_irq_offload_init(void) +{ +} diff --git a/arch/x86/core/ia32/irq_offload.c b/arch/x86/core/ia32/irq_offload.c index 71e8363ece38..c7d68b34370d 100644 --- a/arch/x86/core/ia32/irq_offload.c +++ b/arch/x86/core/ia32/irq_offload.c @@ -47,3 +47,7 @@ void arch_irq_offload(irq_offload_routine_t routine, const void *parameter) irq_unlock(key); } + +void arch_irq_offload_init(void) +{ +} diff --git a/arch/x86/core/intel64/irq_offload.c b/arch/x86/core/intel64/irq_offload.c index c2771d735cfc..03ae8a9439b3 100644 --- a/arch/x86/core/intel64/irq_offload.c +++ b/arch/x86/core/intel64/irq_offload.c @@ -44,11 +44,7 @@ void arch_irq_offload(irq_offload_routine_t routine, const void *parameter) arch_irq_unlock(key); } -int irq_offload_init(void) +void arch_irq_offload_init(void) { x86_irq_funcs[CONFIG_IRQ_OFFLOAD_VECTOR - IV_IRQS] = dispatcher; - - return 0; } - -SYS_INIT(irq_offload_init, PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); diff --git a/arch/xtensa/core/irq_offload.c b/arch/xtensa/core/irq_offload.c index c142bfc5fc66..0e83520c8095 100644 --- a/arch/xtensa/core/irq_offload.c +++ b/arch/xtensa/core/irq_offload.c @@ -37,3 +37,7 @@ void arch_irq_offload(irq_offload_routine_t routine, const void *parameter) :: "r"(intenable), "r"(BIT(ZSR_IRQ_OFFLOAD_INT))); arch_irq_unlock(key); } + +void arch_irq_offload_init(void) +{ +} diff --git a/include/zephyr/arch/arch_interface.h b/include/zephyr/arch/arch_interface.h index 4411dfe3ddeb..6721cec11717 100644 --- a/include/zephyr/arch/arch_interface.h +++ b/include/zephyr/arch/arch_interface.h @@ -455,6 +455,13 @@ bool arch_irq_is_used(unsigned int irq); * @param parameter Value to pass to the function when invoked */ void arch_irq_offload(irq_offload_routine_t routine, const void *parameter); + + +/** + * Initialize the architecture-specific portion of the irq_offload subsystem + */ +void arch_irq_offload_init(void); + #endif /* CONFIG_IRQ_OFFLOAD */ /** @} */ diff --git a/kernel/init.c b/kernel/init.c index a6afabc2a2e8..1c24c5fc2b25 100644 --- a/kernel/init.c +++ b/kernel/init.c @@ -516,6 +516,9 @@ static void bg_thread_main(void *unused1, void *unused2, void *unused3) #endif /* CONFIG_MMU */ z_sys_post_kernel = true; +#if CONFIG_IRQ_OFFLOAD + arch_irq_offload_init(); +#endif z_sys_init_run_level(INIT_LEVEL_POST_KERNEL); #if CONFIG_SOC_LATE_INIT_HOOK soc_late_init_hook();