From 7000c5cd18918546a4996f39ba880fd02be0c296 Mon Sep 17 00:00:00 2001 From: songyanguang <345810377@qq.com> Date: Fri, 20 Sep 2024 19:28:42 +0800 Subject: [PATCH] According to ARMv8 architecture, the IRQ should be enable by calling gic_setup_spi when the NO. is larger than 31. --- .../intr/arm/armv8-a/cortex-a55/3568/trap_common.c | 7 ++++++- Ubiquitous/XiZi_AIoT/softkernel/syscall/sys_register_irq.c | 6 ++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Ubiquitous/XiZi_AIoT/hardkernel/intr/arm/armv8-a/cortex-a55/3568/trap_common.c b/Ubiquitous/XiZi_AIoT/hardkernel/intr/arm/armv8-a/cortex-a55/3568/trap_common.c index 354e2d2ee..1c2ca1a1d 100644 --- a/Ubiquitous/XiZi_AIoT/hardkernel/intr/arm/armv8-a/cortex-a55/3568/trap_common.c +++ b/Ubiquitous/XiZi_AIoT/hardkernel/intr/arm/armv8-a/cortex-a55/3568/trap_common.c @@ -70,7 +70,12 @@ static void _cpu_irq_disable(void) static void _single_irq_enable(int irq, int cpu, int prio) { - gic_setup_ppi((uint32_t)cpu, (uint32_t)irq); + if (irq < 32) { + gic_setup_ppi((uint32_t)cpu, (uint32_t)irq); + } + else { + gic_setup_spi((uint32_t)cpu, (uint32_t)irq); + } } static void _single_irq_disable(int irq, int cpu) diff --git a/Ubiquitous/XiZi_AIoT/softkernel/syscall/sys_register_irq.c b/Ubiquitous/XiZi_AIoT/softkernel/syscall/sys_register_irq.c index 38a19bcff..91c3ac6c8 100644 --- a/Ubiquitous/XiZi_AIoT/softkernel/syscall/sys_register_irq.c +++ b/Ubiquitous/XiZi_AIoT/softkernel/syscall/sys_register_irq.c @@ -104,6 +104,8 @@ extern struct session_backend* create_session_inner(struct Thread* client, struc static struct XiziTrapDriver* p_intr_driver = NULL; int sys_register_irq(int irq_num, int irq_opcode) { + int cpu_id; + // init intr resource; if (p_intr_driver == NULL) { struct TraceTag intr_ac_tag; @@ -140,6 +142,10 @@ int sys_register_irq(int irq_num, int irq_opcode) p_intr_driver->bind_irq_handler(irq_num, user_irq_handler); cur_task->bind_irq = true; + // enable irq + cpu_id = p_intr_driver->cur_cpu_id(); + p_intr_driver->single_irq_enable(irq_num, cpu_id, 0); + return 0; }