All of lore.kernel.org
 help / color / mirror / Atom feed
From: Philippe Gerum <rpm@xenomai.org>
To: Gilles Chanteperdrix <gilles.chanteperdrix@xenomai.org>
Cc: xenomai@xenomai.org
Subject: Re: [Xenomai-core] [rfc, patch] allow timer interrupt to be shared.
Date: Fri, 18 Aug 2006 12:55:33 +0200	[thread overview]
Message-ID: <1155898533.4326.50.camel@domain.hid> (raw)
In-Reply-To: <17636.56428.140050.265677@domain.hid>

On Thu, 2006-08-17 at 23:15 +0200, Gilles Chanteperdrix wrote:
> Hi, 
> 
> For review, you will find attached to this mail a patch which allows
> Xenomai to run on ARM platforms where the timer interrupt is
> shared. Such a platform have to define the constant
> IPIPE_HAVE_SHARED_TIMER_IRQ, as well as two functions or macros:
> - ipipe_timer_irq_p(), used by xnpod_announce_tick to test  whether a
> timer interrupt is pending, in which case it is handled, otherwise
> xnpod_announce_tick returns with the XN_ISR_PROPAGATE so that the
> interrupt is propagated to the Linux domain.
> - ipipe_mark_root_timer_irq(), used by xnarch_relay_tick so that the
> interrupt propagated by xnarch_relay_tick is treated by the root domain
> as a timer irq. As a matter of fact, since the interrupt is shared, the
> root domain has to know whether the irq is a timer irq, and since this
> interrupt is forged, the root domain can not rely on the same hardware
> mechanism as the xenomai domain irq.
> 
> The patch also contains a tiny patch of Xenomai syslib so that
> __tickAnnounce has the same return value as xnpod_announce_tick.
> 
> 
> 
> plain text document attachment (xeno-shared-timer-irq.diff)
> Index: include/asm-generic/hal.h
> ===================================================================
> --- include/asm-generic/hal.h	(revision 1451)
> +++ include/asm-generic/hal.h	(working copy)
> @@ -679,6 +679,12 @@
>  
>  #endif /* CONFIG_IPIPE_TRACE */
>  
> +#ifdef IPIPE_HAVE_SHARED_TIMER_IRQ
> +#define RTHAL_HAVE_SHARED_TIMER_IRQ
> +#define rthal_timer_irq_p()         ipipe_timer_irq_p()
> +#define rthal_mark_root_timer_irq() ipipe_mark_root_timer_irq()
> +#endif /* IPIPE_SHARED_TIMER_IRQ */

Let's avoid cascading conditionals through the layers here too:

#else
#define rthal_timer_irq_p() 0
#define rthal_mark_root_timer_irq()  do { } while(0) 
#endif
> +

I'd rather keep the number of obscure conditional macros as low as
possible; we should actually try to reduce them since we have a growing
number of real and pseudo-archs to support, and those macros tend to
obfuscate the generic code.

In the same vein, is there anything we could use in the compatible Adeos
patch that would unambiguously identify the presence of such support
without resorting to yet-another-macro like IPIPE_HAVE_SHARED_TIMER_IRQ?

>  #ifdef __cplusplus
>  }
>  #endif /* __cplusplus */
> Index: include/asm-generic/system.h
> ===================================================================
> --- include/asm-generic/system.h	(revision 1451)
> +++ include/asm-generic/system.h	(working copy)
> @@ -487,4 +487,9 @@
>  #define xnarch_post_graph(obj,state)
>  #define xnarch_post_graph_if(obj,state,cond)
>  
> +#ifdef RTHAL_HAVE_SHARED_TIMER_IRQ
> +#define XNARCH_HAVE_SHARED_TIMER_IRQ
> +#define xnarch_timer_irq_p()         rthal_timer_irq_p()
> +#endif /* IPIPE_SHARED_TIMER_IRQ */

#define xnarch_timer_irq_p() rthal_timer_irq_p()

> +
>  #endif /* !_XENO_ASM_GENERIC_SYSTEM_H */
> Index: include/asm-arm/bits/intr.h
> ===================================================================
> --- include/asm-arm/bits/intr.h	(revision 1451)
> +++ include/asm-arm/bits/intr.h	(working copy)
> @@ -27,6 +27,9 @@
>  
>  static inline void xnarch_relay_tick(void)
>  {
> +#ifdef RTHAL_HAVE_SHARED_TIMER_IRQ
> +	rthal_mark_root_timer_irq();
> +#endif /* RTHAL_HAVE_SHARED_TIMER_IRQ */
>  	rthal_irq_host_pend(RTHAL_TIMER_IRQ);
>  }
>  
> Index: ksrc/skins/vxworks/sysLib.c
> ===================================================================
> --- ksrc/skins/vxworks/sysLib.c	(revision 1451)
> +++ ksrc/skins/vxworks/sysLib.c	(working copy)
> @@ -24,19 +24,20 @@
>  
>  static wind_tick_handler_t tick_handler;
>  static long tick_handler_arg;
> +static int tick_status [XNARCH_NR_CPUS];
>  
>  void tickAnnounce(void)
>  {
>  	if (tick_handler != NULL)
>  		tick_handler(tick_handler_arg);
>  
> -	xnpod_announce_tick(&nkclock);
> +	tick_status[xnarch_current_cpu()] = xnpod_announce_tick(&nkclock);
>  }
>  
>  static int __tickAnnounce(xnintr_t *intr)
>  {
>  	tickAnnounce();
> -	return XN_ISR_HANDLED | XN_ISR_NOENABLE;
> +	return tick_status[xnarch_current_cpu()];
>  }
>  
>  int wind_sysclk_init(u_long init_rate)
> Index: ksrc/nucleus/pod.c
> ===================================================================
> --- ksrc/nucleus/pod.c	(revision 1451)
> +++ ksrc/nucleus/pod.c	(working copy)
> @@ -3249,6 +3249,11 @@
>  {
>  	xnsched_t *sched;
>  
> +#ifdef XNARCH_HAVE_SHARED_TIMER_IRQ
> +	if (!xnarch_timer_irq_p())
> +		return XN_ISR_NONE | XN_ISR_NOENABLE | XN_ISR_PROPAGATE;
> +#endif /* XNARCH_HAVE_SHARED_TIMER_IRQ */
> +	
>  	sched = xnpod_current_sched();
>  
>  	xnlock_get(&nklock);
> _______________________________________________
> Xenomai-core mailing list
> Xenomai-core@domain.hid
> https://mail.gna.org/listinfo/xenomai-core
-- 
Philippe.




  reply	other threads:[~2006-08-18 10:55 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-08-17 21:15 [Xenomai-core] [rfc, patch] allow timer interrupt to be shared Gilles Chanteperdrix
2006-08-18 10:55 ` Philippe Gerum [this message]
2006-08-18 11:16   ` Gilles Chanteperdrix
2006-08-18 12:36     ` Philippe Gerum
2006-08-18 12:39       ` Philippe Gerum
2006-08-18 13:53         ` Gilles Chanteperdrix
2006-08-18 14:21           ` Philippe Gerum

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=1155898533.4326.50.camel@domain.hid \
    --to=rpm@xenomai.org \
    --cc=gilles.chanteperdrix@xenomai.org \
    --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.