19#ifndef _COPPERPLATE_CLOCKOBJ_H
20#define _COPPERPLATE_CLOCKOBJ_H
23#include <xeno_config.h>
24#include <boilerplate/time.h>
25#include <boilerplate/list.h>
26#include <boilerplate/lock.h>
27#include <boilerplate/limits.h>
41#ifdef CONFIG_XENO_COPPERPLATE_CLOCK_RESTRICTED
42#define CLOCK_COPPERPLATE CLOCK_REALTIME
44#define CLOCK_COPPERPLATE CLOCK_MONOTONIC
49 struct timespec epoch;
50 struct timespec offset;
51#ifndef CONFIG_XENO_LORES_CLOCK_DISABLED
52 unsigned int resolution;
53 unsigned int frequency;
57#define zero_time ((struct timespec){ .tv_sec = 0, .tv_nsec = 0 })
63void clockobj_set_date(
struct clockobj *clkobj, ticks_t ticks);
65void clockobj_get_date(
struct clockobj *clkobj, ticks_t *pticks);
67ticks_t clockobj_get_time(
struct clockobj *clkobj);
69void clockobj_get_distance(
struct clockobj *clkobj,
70 const struct itimerspec *itm,
71 struct timespec *delta);
73void clockobj_caltime_to_timeout(
struct clockobj *clkobj,
const struct tm *tm,
74 unsigned long rticks,
struct timespec *ts);
76void clockobj_caltime_to_ticks(
struct clockobj *clkobj,
const struct tm *tm,
77 unsigned long rticks, ticks_t *pticks);
79void clockobj_ticks_to_caltime(
struct clockobj *clkobj,
82 unsigned long *rticks);
84void clockobj_convert_clocks(
struct clockobj *clkobj,
85 const struct timespec *in,
87 struct timespec *out);
89int clockobj_set_resolution(
struct clockobj *clkobj,
90 unsigned int resolution_ns);
92int clockobj_init(
struct clockobj *clkobj,
93 unsigned int resolution_ns);
95int clockobj_destroy(
struct clockobj *clkobj);
97#ifndef CONFIG_XENO_LORES_CLOCK_DISABLED
99void __clockobj_ticks_to_timeout(
struct clockobj *clkobj, clockid_t clk_id,
100 ticks_t ticks,
struct timespec *ts);
102void __clockobj_ticks_to_timespec(
struct clockobj *clkobj,
103 ticks_t ticks,
struct timespec *ts);
110#ifdef CONFIG_XENO_COBALT
112#include <cobalt/ticks.h>
113#include <cobalt/sys/cobalt.h>
123static inline ticks_t clockobj_get_ns(
void)
126 return cobalt_read_ns();
130void clockobj_ns_to_timespec(ticks_t ns,
struct timespec *ts)
134 ts->tv_sec = (time_t)cobalt_divrem_billion(ns, &rem);
135 ts->tv_nsec = (long)rem;
140ticks_t clockobj_get_ns(
void);
143void clockobj_ns_to_timespec(ticks_t ns,
struct timespec *ts)
145 ts->tv_sec = ns / 1000000000ULL;
146 ts->tv_nsec = ns - (ts->tv_sec * 1000000000ULL);
151#ifdef CONFIG_XENO_LORES_CLOCK_DISABLED
154void __clockobj_ticks_to_timeout(
struct clockobj *clkobj,
156 ticks_t ticks,
struct timespec *ts)
158 struct timespec now, delta;
160 __RT(clock_gettime(clk_id, &now));
161 clockobj_ns_to_timespec(ticks, &delta);
162 timespec_add(ts, &now, &delta);
166void __clockobj_ticks_to_timespec(
struct clockobj *clkobj,
167 ticks_t ticks,
struct timespec *ts)
169 clockobj_ns_to_timespec(ticks, ts);
173void clockobj_ticks_to_timespec(
struct clockobj *clkobj,
174 ticks_t ticks,
struct timespec *ts)
176 __clockobj_ticks_to_timespec(clkobj, ticks, ts);
180unsigned int clockobj_get_resolution(
struct clockobj *clkobj)
186unsigned int clockobj_get_frequency(
struct clockobj *clkobj)
191static inline sticks_t clockobj_ns_to_ticks(
struct clockobj *clkobj,
197static inline sticks_t clockobj_ticks_to_ns(
struct clockobj *clkobj,
206void clockobj_ticks_to_timespec(
struct clockobj *clkobj,
207 ticks_t ticks,
struct timespec *ts)
209 __clockobj_ticks_to_timespec(clkobj, ticks, ts);
213unsigned int clockobj_get_resolution(
struct clockobj *clkobj)
215 return clkobj->resolution;
219unsigned int clockobj_get_frequency(
struct clockobj *clkobj)
221 return clkobj->frequency;
224sticks_t clockobj_ns_to_ticks(
struct clockobj *clkobj,
227static inline sticks_t clockobj_ticks_to_ns(
struct clockobj *clkobj,
230 return ticks * clkobj->resolution;
236void clockobj_ticks_to_timeout(
struct clockobj *clkobj,
237 ticks_t ticks,
struct timespec *ts)
239 __clockobj_ticks_to_timeout(clkobj, CLOCK_COPPERPLATE, ticks, ts);