summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
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);