All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kiszka <jan.kiszka@siemens.com>
To: xenomai@xenomai.org
Subject: [PATCH 15/25] cobalt/tick: dovetail: install/uninstall proxy tick device
Date: Thu, 20 May 2021 23:44:25 +0200	[thread overview]
Message-ID: <4cbe75587bdbcc8bb83540ab25f52bdb8aa15d21.1621547075.git.jan.kiszka@siemens.com> (raw)
In-Reply-To: <cover.1621547075.git.jan.kiszka@siemens.com>

From: Hongzhan Chen <hongzhan.chen@intel.com>

Signed-off-by: Hongzhan Chen <hongzhan.chen@intel.com>
[Philippe: protect xntimer_start with nklock]
Signed-off-by: Philippe Gerum <rpm@xenomai.org>
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 kernel/cobalt/dovetail/tick.c | 83 ++++++++++++++++++++++++++++++++++-
 1 file changed, 81 insertions(+), 2 deletions(-)

diff --git a/kernel/cobalt/dovetail/tick.c b/kernel/cobalt/dovetail/tick.c
index 01927f7089..fba9f78d00 100644
--- a/kernel/cobalt/dovetail/tick.c
+++ b/kernel/cobalt/dovetail/tick.c
@@ -6,8 +6,87 @@
  */
 
 #include <linux/tick.h>
+#include <linux/clockchips.h>
 #include <cobalt/kernel/intr.h>
 #include <pipeline/tick.h>
+#include <cobalt/kernel/sched.h>
+#include <cobalt/kernel/timer.h>
+
+static DEFINE_PER_CPU(struct clock_proxy_device *, proxy_device);
+
+static int proxy_set_next_ktime(ktime_t expires,
+				struct clock_event_device *proxy_dev)
+{
+	struct xnsched *sched;
+	ktime_t delta;
+	unsigned long flags;
+	int ret;
+
+	/*
+	 * When Negative delta have been observed, we set delta zero.
+	 * Or else exntimer_start() will return -ETIMEDOUT and do not
+	 * trigger shot
+	 */
+	delta = ktime_sub(expires, ktime_get_mono_fast_ns());
+	if (delta < 0)
+		delta = 0;
+
+	xnlock_get_irqsave(&nklock, flags);
+	sched = xnsched_current();
+	ret = xntimer_start(&sched->htimer, delta, XN_INFINITE, XN_RELATIVE);
+	xnlock_put_irqrestore(&nklock, flags);
+
+	return ret ? -ETIME : 0;
+}
+
+void xn_core_tick(struct clock_event_device *dummy) /* hard irqs off */
+{
+	xnintr_core_clock_handler();
+}
+
+static int proxy_set_oneshot_stopped(struct clock_event_device *proxy_dev)
+{
+	struct clock_event_device *real_dev;
+	struct clock_proxy_device *dev;
+	struct xnsched *sched;
+	spl_t s;
+
+	dev = container_of(proxy_dev, struct clock_proxy_device, proxy_device);
+
+	/*
+	 * In-band wants to disable the clock hardware on entering a
+	 * tickless state, so we have to stop our in-band tick
+	 * emulation. Propagate the request for shutting down the
+	 * hardware to the real device only if we have no outstanding
+	 * OOB timers. CAUTION: the in-band timer is counted when
+	 * assessing the RQ_IDLE condition, so we need to stop it
+	 * prior to testing the latter.
+	 */
+	xnlock_get_irqsave(&nklock, s);
+	sched = xnsched_current();
+	xntimer_stop(&sched->htimer);
+
+	if (sched->lflags & XNIDLE) {
+		real_dev = dev->real_device;
+		real_dev->set_state_oneshot_stopped(real_dev);
+	}
+
+	xnlock_put_irqrestore(&nklock, s);
+
+	return 0;
+}
+
+static void setup_proxy(struct clock_proxy_device *dev)
+{
+	struct clock_event_device *proxy_dev = &dev->proxy_device;
+
+	dev->handle_oob_event = xn_core_tick;
+	proxy_dev->features |= CLOCK_EVT_FEAT_KTIME;
+	proxy_dev->set_next_ktime = proxy_set_next_ktime;
+	if (proxy_dev->set_state_oneshot_stopped)
+		proxy_dev->set_state_oneshot_stopped = proxy_set_oneshot_stopped;
+	__this_cpu_write(proxy_device, dev);
+}
 
 int pipeline_install_tick_proxy(void)
 {
@@ -18,7 +97,7 @@ int pipeline_install_tick_proxy(void)
 		return ret;
 
 	/* Install the proxy tick device */
-	TODO();	ret = 0;
+	ret = tick_install_proxy(setup_proxy, &xnsched_realtime_cpus);
 	if (ret)
 		goto fail_proxy;
 
@@ -33,7 +112,7 @@ fail_proxy:
 void pipeline_uninstall_tick_proxy(void)
 {
 	/* Uninstall the proxy tick device. */
-	TODO();
+	tick_uninstall_proxy(&xnsched_realtime_cpus);
 
 	pipeline_free_timer_ipi();
 }
-- 
2.26.2



  parent reply	other threads:[~2021-05-20 21:44 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-20 21:44 [PATCH 00/25] Dovetail integration, next round Jan Kiszka
2021-05-20 21:44 ` [PATCH 01/25] cobalt/kernel: ipipe: rename xnsched_realtime_domain to xnsched_primary_domain Jan Kiszka
2021-05-20 21:44 ` [PATCH 02/25] cobalt/kevents: dovetail: drop call to obsolete force_commit_memory() Jan Kiszka
2021-05-20 21:44 ` [PATCH 03/25] cobalt/intr: dovetail: implement interrupt management, handling Jan Kiszka
2021-05-20 21:44 ` [PATCH 04/25] cobalt/irq: dovetail: implement out-of-band irq management and handling Jan Kiszka
2021-05-20 21:44 ` [PATCH 05/25] cobalt/kevents: dovetail: enable back tracing Jan Kiszka
2021-05-20 21:44 ` [PATCH 06/25] cobalt/x86: ipipe: Remove leftover from x86_32 removal Jan Kiszka
2021-05-20 21:44 ` [PATCH 07/25] cobalt/x86: ipipe: Drop unused strncpy_from_user_nocheck Jan Kiszka
2021-05-20 21:44 ` [PATCH 08/25] cobalt/x86: Move shared headers out of pipeline specific folder Jan Kiszka
2021-05-20 21:44 ` [PATCH 09/25] cobalt/x86: dovetail: add architecture bits Jan Kiszka
2021-05-20 21:44 ` [PATCH 10/25] cobalt/kernel: dovetail: implement sirq services Jan Kiszka
2021-05-20 21:44 ` [PATCH 11/25] cobalt/sched: dovetail: add task control block initializers Jan Kiszka
2021-05-20 21:44 ` [PATCH 12/25] cobalt/clock: dovetail: provide backend code to CLOCK_HOST_REALTIME Jan Kiszka
2021-05-20 21:44 ` [PATCH 13/25] cobalt/init: dovetail: add oob stage enabling, disabling services Jan Kiszka
2021-05-20 21:44 ` [PATCH 14/25] cobalt/timer: Check if nklock is held in timer services Jan Kiszka
2021-05-20 21:44 ` Jan Kiszka [this message]
2021-05-20 21:44 ` [PATCH 16/25] cobalt/tick: dovetail: implement pipeline_set_timer_shot() Jan Kiszka
2021-05-20 21:44 ` [PATCH 17/25] cobalt/tick: dovetail: implement pipeline_timer_name() Jan Kiszka
2021-05-20 21:44 ` [PATCH 18/25] cobalt/timer: pipeline: abstract handling of ONESHOT_STOPPED mode Jan Kiszka
2021-05-20 21:44 ` [PATCH 19/25] cobalt/timer: dovetail: handle " Jan Kiszka
2021-05-20 21:44 ` [PATCH 20/25] cobalt/tick: dovetail: flatten the call stack to pipeline services Jan Kiszka
2021-05-20 21:44 ` [PATCH 21/25] cobalt/clock: dovetail: implement pipeline_read_cycle_counter() Jan Kiszka
2021-05-20 21:44 ` [PATCH 22/25] lib/cobalt: ticks: drop cobalt_read_hrclock() Jan Kiszka
2021-05-20 21:44 ` [PATCH 23/25] lib/cobalt: dovetail: allow representing time as count of nanoseconds Jan Kiszka
2021-05-20 21:44 ` [PATCH 24/25] lib/cobalt: add default wrapper to clock_settime() Jan Kiszka
2021-05-20 21:44 ` [PATCH 25/25] lib/cobalt: dovetail: use clock_gettime() vcall for reading timestamps Jan Kiszka

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4cbe75587bdbcc8bb83540ab25f52bdb8aa15d21.1621547075.git.jan.kiszka@siemens.com \
    --to=jan.kiszka@siemens.com \
    --cc=xenomai@xenomai.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.