From mboxrd@z Thu Jan 1 00:00:00 1970 References: <20210122021240.18768-1-hongzhan.chen@intel.com> <20210122021240.18768-4-hongzhan.chen@intel.com> From: Philippe Gerum Subject: Re: [PATCH V2 4/5] cobalt/timer: pipeline: abstract signal test of XNTSTOP In-reply-to: <20210122021240.18768-4-hongzhan.chen@intel.com> Date: Sun, 24 Jan 2021 18:06:08 +0100 Message-ID: <874kj68dtr.fsf@xenomai.org> MIME-Version: 1.0 Content-Type: text/plain List-Id: Discussions about the Xenomai project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: hongzha1 Cc: xenomai@xenomai.org hongzha1 via Xenomai writes: > 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: hongzha1 > > diff --git a/include/cobalt/kernel/ipipe/pipeline/tick.h b/include/cobalt/kernel/ipipe/pipeline/tick.h > index 409581a3c..41347f7b1 100644 > --- a/include/cobalt/kernel/ipipe/pipeline/tick.h > +++ b/include/cobalt/kernel/ipipe/pipeline/tick.h > @@ -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 */ > diff --git a/include/cobalt/kernel/sched.h b/include/cobalt/kernel/sched.h > index c13f46ff7..aa24d5442 100644 > --- a/include/cobalt/kernel/sched.h > +++ b/include/cobalt/kernel/sched.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. */ > }; > diff --git a/kernel/cobalt/clock.c b/kernel/cobalt/clock.c > index bf24e1693..2115b15ef 100644 > --- a/kernel/cobalt/clock.c > +++ b/kernel/cobalt/clock.c > @@ -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) || > diff --git a/kernel/cobalt/timer.c b/kernel/cobalt/timer.c > index f9aa457ce..f667a3878 100644 > --- a/kernel/cobalt/timer.c > +++ b/kernel/cobalt/timer.c > @@ -18,6 +18,7 @@ > * 02111-1307, USA. > */ > #include > +#include > #include > #include > #include > @@ -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()) Merged, fixing up the short log. Thanks. -- Philippe.