Commit 9f27d034 authored by Hongzhan Chen's avatar Hongzhan Chen Committed by Jan Kiszka

cobalt/tick: dovetail: implement pipeline_set_timer_shot()

Signed-off-by: default avatarHongzhan Chen <hongzhan.chen@intel.com>
[Philippe: clarify some variable names]
Signed-off-by: Philippe Gerum's avatarPhilippe Gerum <rpm@xenomai.org>
Signed-off-by: Jan Kiszka's avatarJan Kiszka <jan.kiszka@siemens.com>
parent 4cbe7558
......@@ -19,17 +19,7 @@ static inline u64 pipeline_read_cycle_counter(void)
return 0;
}
static inline void pipeline_set_timer_shot(unsigned long cycles)
{
/*
* N/A. Revisit: xnclock_core_local_shot() should go to the
* I-pipe section, we do things differently on Dovetail via
* the proxy tick device. As a consequence,
* pipeline_set_timer_shot() should not be part of the
* pipeline interface.
*/
TODO();
}
void pipeline_set_timer_shot(unsigned long cycles);
static inline const char *pipeline_timer_name(void)
{
......
......@@ -14,6 +14,34 @@
static DEFINE_PER_CPU(struct clock_proxy_device *, proxy_device);
void pipeline_set_timer_shot(unsigned long delay) /* ns */
{
struct clock_proxy_device *dev = __this_cpu_read(proxy_device);
struct clock_event_device *real_dev = dev->real_device;
u64 cycles;
ktime_t t;
int ret;
if (real_dev->features & CLOCK_EVT_FEAT_KTIME) {
t = ktime_add(delay, xnclock_core_read_raw());
real_dev->set_next_ktime(t, real_dev);
} else {
if (delay <= 0) {
delay = real_dev->min_delta_ns;
} else {
delay = min_t(int64_t, delay,
real_dev->max_delta_ns);
delay = max_t(int64_t, delay,
real_dev->min_delta_ns);
}
cycles = ((u64)delay * real_dev->mult) >> real_dev->shift;
ret = real_dev->set_next_event(cycles, real_dev);
if (ret)
real_dev->set_next_event(real_dev->min_delta_ticks,
real_dev);
}
}
static int proxy_set_next_ktime(ktime_t expires,
struct clock_event_device *proxy_dev)
{
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment