Skip to content

Clock Event Device

include/time/clock_evdev.h View source View on GitHub
struct clock_evdev (21 fields) source
§ char *name
§ enum err (*set_next_event)(struct clock_evdev *, time_ns_t delta_ns)

Guaranteed to be called at IRQL_HIGH_LEVEL

§ timestamp_t next_event
§ time_ns_t min_delta_ns
§ time_ns_t max_delta_ns
§ enum clock_evdev_state state
§ enum clock_evdev_flags flags
§ enum clock_rating rating
§ enum err (*change_state)(struct clock_evdev *, enum clock_evdev_state state)
§ enum err (*resume_tick)(struct clock_evdev *)
§ size_t min_delta_ticks
§ size_t max_delta_ticks
§ fx32_32_t mult

Tick -> NS

§ bool in_global_list
§ struct list_node list_internal

Used in global list

§ struct list_node group_list

struct clock_evdev_group

§ cpu_id_t bound_to_cpu

CPU_ID_NONE/!EVDEV_PERCPU = no binding

§ struct cpu_mask cpu_mask
§ irq_t irq
§ struct clock *clock

Optional pointer

§ void *private
struct clock_evdev_group (6 fields) source

The clock evdevs are meant to be sequentially added to this

§ char *name
§ struct list_head clock_evdevs
§ size_t clock_evdev_count

This is not synchronized because this happens once at group initialization

§ struct clock_evdev *(*evdev_for_cpu)(struct clock_evdev_group *, cpu_id_t cpu)
§ struct list_node list_internal

Global list as well

enum clock_evdev_state (4 variants) source
§ CLOCK_EVDEV_STATE_OFF
§ CLOCK_EVDEV_STATE_PERIODIC
§ CLOCK_EVDEV_STATE_ONESHOT
§ CLOCK_EVDEV_STATE_ONESHOT_STOPPED
enum clock_evdev_flags (5 variants) source
§ CLOCK_EVDEV_PERIODIC = 1
§ CLOCK_EVDEV_ONESHOT = 1 << 1
§ CLOCK_EVDEV_DYNIRQ = 1 << 2
§ CLOCK_EVDEV_PERCPU = 1 << 3
§ CLOCK_EVDEV_TICK_SUITABLE = 1 << 4
enum clock_evdev_group_flags (2 variants) source
§ CLOCK_EVDEV_GROUP_NONE = 0
§ CLOCK_EVDEV_GROUP_PERCPU = 1

Each CPU has one

struct clock_evdev_group * clock_evdev_group_create(const char *fmt)
source
struct clock_evdev * clock_evdev_create(const char *fmt)
source
struct clock_evdev_group * clock_evdev_group_search_for(const char *name)
source
void clock_evdev_register(struct clock_evdev *ced)
source
void clock_evdev_group_register(struct clock_evdev_group *cedg)
source
void clock_evdev_group_add(
    struct clock_evdev_group *cedg,
    struct clock_evdev *ced
)
source
struct clock_evdev * clock_evdev_for_cpu(
    struct clock_evdev_group *cedg,
    cpu_id_t cpu
)
source
void clock_evdev_group_unregister(struct clock_evdev_group *cedg)
source