Commit 3cf2627d authored by Rafal Dyla's avatar Rafal Dyla Committed by Henrik Brix Andersen
Browse files

arch: riscv: Support for Direct ISRs for RISCV targets

Added missing features and configuration to support Direct ISRs

Signed-off-by: default avatarRafal Dyla <rafal.dyla@nordicsemi.no>
parent d1425eff
Loading
Loading
Loading
Loading
+17 −0
Changes for arch/riscv/core/irq_manage.c: 17 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
#include <zephyr/arch/riscv/csr.h>
#include <zephyr/irq_multilevel.h>
#include <zephyr/sw_isr_table.h>
#include <zephyr/pm/pm.h>

#ifdef CONFIG_RISCV_HAS_PLIC
#include <zephyr/drivers/interrupt_controller/riscv_plic.h>
@@ -75,3 +76,19 @@ int arch_irq_disconnect_dynamic(unsigned int irq, unsigned int priority,
}
#endif /* CONFIG_SHARED_INTERRUPTS */
#endif /* CONFIG_DYNAMIC_INTERRUPTS */

#ifdef CONFIG_PM
void arch_isr_direct_pm(void)
{
	unsigned int key;

	key = irq_lock();

	if (_kernel.idle) {
		_kernel.idle = 0;
		pm_system_resume();
	}

	irq_unlock(key);
}
#endif
+15 −0
Changes for drivers/timer/nrf_grtc_timer.c: 15 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -459,12 +459,27 @@ uint32_t sys_clock_elapsed(void)
	return (uint32_t)(counter_sub(counter(), last_count) / CYC_PER_TICK);
}

#if !defined(CONFIG_GEN_SW_ISR_TABLE)
ISR_DIRECT_DECLARE(nrfx_grtc_direct_irq_handler)
{
	nrfx_grtc_irq_handler();
	ISR_DIRECT_PM();
	return 1;
}
#endif

static int sys_clock_driver_init(void)
{
	nrfx_err_t err_code;

#if defined(CONFIG_GEN_SW_ISR_TABLE)
	IRQ_CONNECT(DT_IRQN(GRTC_NODE), DT_IRQ(GRTC_NODE, priority), nrfx_isr,
		    nrfx_grtc_irq_handler, 0);
#else
	IRQ_DIRECT_CONNECT(DT_IRQN(GRTC_NODE), DT_IRQ(GRTC_NODE, priority),
			   nrfx_grtc_direct_irq_handler, 0);
	irq_enable(DT_IRQN(GRTC_NODE));
#endif

#if defined(CONFIG_NRF_GRTC_TIMER_CLOCK_MANAGEMENT) && NRF_GRTC_HAS_CLKSEL
#if defined(CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC)
+9 −0
Changes for include/zephyr/arch/riscv/irq.h: 9 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -83,6 +83,15 @@ extern void z_riscv_irq_vector_set(unsigned int irq);
	z_riscv_irq_vector_set(irq_p); \
}

#ifdef CONFIG_PM
extern void arch_isr_direct_pm(void);
#define ARCH_ISR_DIRECT_PM() arch_isr_direct_pm()
#else
#define ARCH_ISR_DIRECT_PM()                                                                       \
	do {                                                                                       \
	} while (false)
#endif

#define ARCH_ISR_DIRECT_HEADER() arch_isr_direct_header()
#define ARCH_ISR_DIRECT_FOOTER(swap) arch_isr_direct_footer(swap)