Commit 93e7b348 authored by Hongzhan Chen's avatar Hongzhan Chen Committed by Jan Kiszka

cobalt/timer: pipeline: abstract handling of ONESHOT_STOPPED mode

It adds a way to force the timer management code to reprogram the
hardware on option, to make the real device controlled by the proxy
tick again as it leaves the ONESHOT_STOPPED mode. The I-pipe does not
require any further action in this case, leading to a nop.
Signed-off-by: default avatarHongzhan Chen <hongzhan.chen@intel.com>
Signed-off-by: Jan Kiszka's avatarJan Kiszka <jan.kiszka@siemens.com>
parent b3f4db82
......@@ -9,4 +9,10 @@ int pipeline_install_tick_proxy(void);
void pipeline_uninstall_tick_proxy(void);
struct xnsched;
static inline bool pipeline_must_force_program_tick(struct xnsched *sched)
{
return false;
}
#endif /* !_COBALT_KERNEL_IPIPE_TICK_H */
......@@ -48,6 +48,11 @@
#define XNINIRQ 0x00004000 /* In IRQ handling context */
#define XNHDEFER 0x00002000 /* Host tick deferred */
/*
* Hardware timer is stopped.
*/
#define XNTSTOP 0x00000800
struct xnsched_rt {
xnsched_queue_t runnable; /*!< Runnable thread queue. */
};
......
......@@ -147,7 +147,7 @@ void xnclock_core_local_shot(struct xnsched *sched)
* or a timer with an earlier timeout date is scheduled,
* whichever comes first.
*/
sched->lflags &= ~(XNHDEFER|XNIDLE);
sched->lflags &= ~(XNHDEFER|XNIDLE|XNTSTOP);
timer = container_of(h, struct xntimer, aplink);
if (unlikely(timer == &sched->htimer)) {
if (xnsched_resched_p(sched) ||
......
......@@ -18,6 +18,7 @@
* 02111-1307, USA.
*/
#include <linux/sched.h>
#include <pipeline/tick.h>
#include <cobalt/kernel/sched.h>
#include <cobalt/kernel/thread.h>
#include <cobalt/kernel/timer.h>
......@@ -63,8 +64,10 @@ int xntimer_heading_p(struct xntimer *timer)
void xntimer_enqueue_and_program(struct xntimer *timer, xntimerq_t *q)
{
struct xnsched *sched = xntimer_sched(timer);
xntimer_enqueue(timer, q);
if (xntimer_heading_p(timer)) {
if (pipeline_must_force_program_tick(sched) || xntimer_heading_p(timer)) {
struct xnsched *sched = xntimer_sched(timer);
struct xnclock *clock = xntimer_clock(timer);
if (sched != xnsched_current())
......
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