mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2026-05-23 14:21:32 +01:00
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 <anup.patel@oss.qualcomm.com> Reviewed-by: Nicholas Piggin <npiggin@gmail.com> Link: https://lore.kernel.org/r/20260425104048.2335262-4-anup.patel@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
+62
-3
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user