soc: neorv32: add option for reading clock frequency from sysinfo at boot

Add Kconfig option for reading the NEORV32 clock frequency from SYSINFO at
boot time.

Signed-off-by: Henrik Brix Andersen <henrik@brixandersen.dk>
This commit is contained in:
Henrik Brix Andersen 2025-03-07 15:00:58 +00:00 committed by Benjamin Cabé
commit 8a1ed6f02d
3 changed files with 25 additions and 3 deletions

View file

@ -19,4 +19,15 @@ config SOC_NEORV32_VERSION
identical to that of the NEORV32 Machine implementation ID (mimpid)
register.
config SOC_NEORV32_READ_FREQUENCY_AT_RUNTIME
bool "Read the NEORV32 clock frequency at runtime"
default y
depends on !$(dt_node_has_prop,/cpus/cpu@0,clock-frequency)
select SOC_EARLY_INIT_HOOK
select TIMER_READS_ITS_FREQUENCY_AT_RUNTIME
help
If enabled, the NEORV32 clock frequency will be read from SYSINFO during boot. This
results in small overhead, which can be avoided by setting the clock-frequency property of
the cpu@0 devicetree node if the frequency is known at build-time.
endif # SOC_NEORV32

View file

@ -4,7 +4,7 @@
if SOC_NEORV32
config SYS_CLOCK_HW_CYCLES_PER_SEC
default $(dt_node_int_prop_int,/cpus/cpu@0,clock-frequency) if RISCV_MACHINE_TIMER
default $(dt_node_int_prop_int,/cpus/cpu@0,clock-frequency) if !SOC_NEORV32_READ_FREQUENCY_AT_RUNTIME
config NUM_IRQS
default 32

View file

@ -7,11 +7,22 @@
#include <zephyr/irq.h>
#include <soc.h>
#if defined(CONFIG_RISCV_SOC_INTERRUPT_INIT)
#ifdef CONFIG_SOC_NEORV32_READ_FREQUENCY_AT_RUNTIME
extern int z_clock_hw_cycles_per_sec;
void soc_early_init_hook(void)
{
uint32_t base = DT_REG_ADDR(DT_NODELABEL(sysinfo));
z_clock_hw_cycles_per_sec = sys_read32(base + NEORV32_SYSINFO_CLK);
}
#endif /* CONFIG_SOC_NEORV32_READ_FREQUENCY_AT_RUNTIME */
#ifdef CONFIG_RISCV_SOC_INTERRUPT_INIT
void soc_interrupt_init(void)
{
(void)arch_irq_lock();
csr_write(mie, 0);
}
#endif
#endif /* CONFIG_RISCV_SOC_INTERRUPT_INIT */