diff options
| author | Anup Patel <[email protected]> | 2026-04-25 16:10:47 +0530 |
|---|---|---|
| committer | Anup Patel <[email protected]> | 2026-05-09 13:16:05 +0530 |
| commit | b7fa8a246cba80d74c0993dd0275b3c1589ef8b6 (patch) | |
| tree | 6e17b11e6c60b1a48c1d12704428ac4f8f65abc1 /include | |
| parent | 357fae4820718f633abeb7aa6ca00fd57a574d8d (diff) | |
lib: sbi_timer: Add support for timer events
Currently, the sbi_timer only supports timer events configured via
SBI calls. Introduce struct sbi_timer_event and related functions
to allow configuring timer events from any part of OpenSBI.
Signed-off-by: Anup Patel <[email protected]>
Reviewed-by: Nicholas Piggin <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Anup Patel <[email protected]>
Diffstat (limited to 'include')
| -rw-r--r-- | include/sbi/sbi_timer.h | 65 |
1 files changed, 62 insertions, 3 deletions
diff --git a/include/sbi/sbi_timer.h b/include/sbi/sbi_timer.h index 2e1a7879..914a5f12 100644 --- a/include/sbi/sbi_timer.h +++ b/include/sbi/sbi_timer.h @@ -10,7 +10,60 @@ #ifndef __SBI_TIMER_H__ #define __SBI_TIMER_H__ -#include <sbi/sbi_types.h> +#include <sbi/sbi_list.h> + +/** Timer event re-start details */ +struct sbi_timer_event_restart { + /** Flag indicating whether event re-start is required */ + bool required; + /** Next time stamp for event if re-start is required */ + u64 next_event; +}; + +/** Timer event abstraction */ +struct sbi_timer_event { + /** List head for per-HART event list (Internal) */ + struct sbi_dlist head; + + /** Hart on which the event is started / running (Internal) */ + int hart_index; + + /** Time stamp when the event expires (Internal) */ + u64 time_stamp; + + /** + * Event callback to be called upon expiry. + * + * If the callback wants to re-start the event then + * it must update the event re-start details. + * + * NOTE: This will be called with the per-HART timer + * event list lock held. + */ + void (*callback)(struct sbi_timer_event *ev, + struct sbi_timer_event_restart *restart); + + /** + * Event cleanup to be called upon sbi_timer_exit() + * + * NOTE: This will be called with per-HART timer + * event list lock held. + */ + void (*cleanup)(struct sbi_timer_event *ev); + + /** Event specific private data */ + void *priv; +}; + +#define SBI_INIT_TIMER_EVENT(__ptr, __callback, __cleanup, __priv) \ +do { \ + SBI_INIT_LIST_HEAD(&(__ptr)->head); \ + (__ptr)->hart_index = -1; \ + (__ptr)->time_stamp = 0; \ + (__ptr)->callback = (__callback); \ + (__ptr)->cleanup = (__cleanup); \ + (__ptr)->priv = (__priv); \ +} while (0) /** Timer hardware device */ struct sbi_timer_device { @@ -86,8 +139,14 @@ void sbi_timer_set_delta(ulong delta); void sbi_timer_set_delta_upper(ulong delta_upper); #endif -/** Start timer event for current HART */ -void sbi_timer_event_start(u64 next_event); +/** Start timer event on current HART */ +void sbi_timer_event_start(struct sbi_timer_event *ev, u64 next_event); + +/** Stop timer event on current HART */ +void sbi_timer_event_stop(struct sbi_timer_event *ev); + +/** Start supervisor timer event on current HART */ +void sbi_timer_smode_event_start(u64 next_event); /** Process timer event for current HART */ void sbi_timer_process(void); |
