diff options
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); |
