summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorAnup Patel <[email protected]>2026-04-25 16:10:47 +0530
committerAnup Patel <[email protected]>2026-05-09 13:16:05 +0530
commitb7fa8a246cba80d74c0993dd0275b3c1589ef8b6 (patch)
tree6e17b11e6c60b1a48c1d12704428ac4f8f65abc1 /include
parent357fae4820718f633abeb7aa6ca00fd57a574d8d (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.h65
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);