Loading drivers/clocksource/Kconfig +15 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,21 @@ config ARM_ARCH_TIMER bool select CLKSRC_OF if OF config ARM_ARCH_TIMER_EVTSTREAM bool "Support for ARM architected timer event stream generation" default y if ARM_ARCH_TIMER help This option enables support for event stream generation based on the ARM architected timer. It is used for waking up CPUs executing the wfe instruction at a frequency represented as a power-of-2 divisor of the clock rate. The main use of the event stream is wfe-based timeouts of userspace locking implementations. It might also be useful for imposing timeout on wfe to safeguard against any programming errors in case an expected event is not generated. This must be disabled for hardware validation purposes to detect any hardware anomalies of missing events. config CLKSRC_METAG_GENERIC def_bool y if METAG help Loading drivers/clocksource/arm_arch_timer.c +16 −1 Original line number Diff line number Diff line Loading @@ -325,7 +325,20 @@ static void arch_counter_set_user_access(void) arch_timer_set_cntkctl(cntkctl); } static int __cpuinit arch_timer_setup(struct clock_event_device *clk) static void arch_timer_configure_evtstream(void) { int evt_stream_div, pos; /* Find the closest power of two to the divisor */ evt_stream_div = arch_timer_rate / ARCH_TIMER_EVT_STREAM_FREQ; pos = fls(evt_stream_div); if (pos > 1 && !(evt_stream_div & (1 << (pos - 2)))) pos--; /* enable event stream */ arch_timer_evtstrm_enable(min(pos, 15)); } static int arch_timer_setup(struct clock_event_device *clk) { __arch_timer_setup(ARCH_CP15_TIMER, clk); Loading @@ -338,6 +351,8 @@ static int __cpuinit arch_timer_setup(struct clock_event_device *clk) } arch_counter_set_user_access(); if (IS_ENABLED(CONFIG_ARM_ARCH_TIMER_EVTSTREAM)) arch_timer_configure_evtstream(); return 0; } Loading include/clocksource/arm_arch_timer.h +2 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,8 @@ #define ARCH_TIMER_USR_VT_ACCESS_EN (1 << 8) /* virtual timer registers */ #define ARCH_TIMER_USR_PT_ACCESS_EN (1 << 9) /* physical timer registers */ #define ARCH_TIMER_EVT_STREAM_FREQ 10000 /* 100us */ #ifdef CONFIG_ARM_ARCH_TIMER extern u32 arch_timer_get_rate(void); Loading Loading
drivers/clocksource/Kconfig +15 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,21 @@ config ARM_ARCH_TIMER bool select CLKSRC_OF if OF config ARM_ARCH_TIMER_EVTSTREAM bool "Support for ARM architected timer event stream generation" default y if ARM_ARCH_TIMER help This option enables support for event stream generation based on the ARM architected timer. It is used for waking up CPUs executing the wfe instruction at a frequency represented as a power-of-2 divisor of the clock rate. The main use of the event stream is wfe-based timeouts of userspace locking implementations. It might also be useful for imposing timeout on wfe to safeguard against any programming errors in case an expected event is not generated. This must be disabled for hardware validation purposes to detect any hardware anomalies of missing events. config CLKSRC_METAG_GENERIC def_bool y if METAG help Loading
drivers/clocksource/arm_arch_timer.c +16 −1 Original line number Diff line number Diff line Loading @@ -325,7 +325,20 @@ static void arch_counter_set_user_access(void) arch_timer_set_cntkctl(cntkctl); } static int __cpuinit arch_timer_setup(struct clock_event_device *clk) static void arch_timer_configure_evtstream(void) { int evt_stream_div, pos; /* Find the closest power of two to the divisor */ evt_stream_div = arch_timer_rate / ARCH_TIMER_EVT_STREAM_FREQ; pos = fls(evt_stream_div); if (pos > 1 && !(evt_stream_div & (1 << (pos - 2)))) pos--; /* enable event stream */ arch_timer_evtstrm_enable(min(pos, 15)); } static int arch_timer_setup(struct clock_event_device *clk) { __arch_timer_setup(ARCH_CP15_TIMER, clk); Loading @@ -338,6 +351,8 @@ static int __cpuinit arch_timer_setup(struct clock_event_device *clk) } arch_counter_set_user_access(); if (IS_ENABLED(CONFIG_ARM_ARCH_TIMER_EVTSTREAM)) arch_timer_configure_evtstream(); return 0; } Loading
include/clocksource/arm_arch_timer.h +2 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,8 @@ #define ARCH_TIMER_USR_VT_ACCESS_EN (1 << 8) /* virtual timer registers */ #define ARCH_TIMER_USR_PT_ACCESS_EN (1 << 9) /* physical timer registers */ #define ARCH_TIMER_EVT_STREAM_FREQ 10000 /* 100us */ #ifdef CONFIG_ARM_ARCH_TIMER extern u32 arch_timer_get_rate(void); Loading