lib: sbi_timer: Introduce sbi_timer_compute_delta() and friends

The users of timer event have to compute next_event (aka timer value
in the future) based on desired units and unit frequency. Introduce
sbi_timer_compute_delta() and friends to simplify computing next_event
for timer event users.

Signed-off-by: Anup Patel <anup.patel@oss.qualcomm.com>
Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Link: https://lore.kernel.org/r/20260425104048.2335262-5-anup.patel@oss.qualcomm.com
Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
Anup Patel
2026-04-25 16:10:48 +05:30
committed by Anup Patel
parent b7fa8a246c
commit 1932ee3f0a
2 changed files with 37 additions and 4 deletions
+27
View File
@@ -88,6 +88,21 @@ struct sbi_timer_device {
struct sbi_scratch; struct sbi_scratch;
/** Compute timer value delta based on arbitary units */
u64 sbi_timer_compute_delta(ulong units, u64 unit_freq);
/** Compute timer value delta from milliseconds */
static inline u64 sbi_timer_compute_mdelta(ulong msecs)
{
return sbi_timer_compute_delta(msecs, 1000);
}
/** Compute timer value delta from microseconds */
static inline u64 sbi_timer_compute_udelta(ulong usecs)
{
return sbi_timer_compute_delta(usecs, 1000000);
}
/** Generic delay loop of desired granularity */ /** Generic delay loop of desired granularity */
void sbi_timer_delay_loop(ulong units, u64 unit_freq, void sbi_timer_delay_loop(ulong units, u64 unit_freq,
void (*delay_fn)(void *), void *opaque); void (*delay_fn)(void *), void *opaque);
@@ -125,6 +140,18 @@ bool sbi_timer_waitms_until(bool (*predicate)(void *), void *arg,
/** Get timer value for current HART */ /** Get timer value for current HART */
u64 sbi_timer_value(void); u64 sbi_timer_value(void);
/** Compute timer value after specified milliseconds */
static inline u64 sbi_timer_value_after_msecs(ulong msecs)
{
return sbi_timer_value() + sbi_timer_compute_mdelta(msecs);
}
/** Compute timer value after specified microseconds */
static inline u64 sbi_timer_value_after_usecs(ulong usecs)
{
return sbi_timer_value() + sbi_timer_compute_udelta(usecs);
}
/** Get virtualized timer value for current HART */ /** Get virtualized timer value for current HART */
u64 sbi_timer_virt_value(void); u64 sbi_timer_virt_value(void);
+10 -4
View File
@@ -58,6 +58,15 @@ static void nop_delay_fn(void *opaque)
cpu_relax(); cpu_relax();
} }
u64 sbi_timer_compute_delta(ulong units, u64 unit_freq)
{
u64 delta;
delta = ((u64)timer_dev->timer_freq * (u64)units);
delta = delta / unit_freq;
return delta;
}
void sbi_timer_delay_loop(ulong units, u64 unit_freq, void sbi_timer_delay_loop(ulong units, u64 unit_freq,
void (*delay_fn)(void *), void *opaque) void (*delay_fn)(void *), void *opaque)
{ {
@@ -72,15 +81,12 @@ void sbi_timer_delay_loop(ulong units, u64 unit_freq,
/* Save starting timer value */ /* Save starting timer value */
start_val = get_time_val(); start_val = get_time_val();
/* Compute desired timer value delta */
delta = ((u64)timer_dev->timer_freq * (u64)units);
delta = delta / unit_freq;
/* Use NOP delay function if delay function not available */ /* Use NOP delay function if delay function not available */
if (!delay_fn) if (!delay_fn)
delay_fn = nop_delay_fn; delay_fn = nop_delay_fn;
/* Busy loop until desired timer value delta reached */ /* Busy loop until desired timer value delta reached */
delta = sbi_timer_compute_delta(units, unit_freq);
while ((get_time_val() - start_val) < delta) while ((get_time_val() - start_val) < delta)
delay_fn(opaque); delay_fn(opaque);
} }