All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stephen Boyd <sboyd@codeaurora.org>
To: Arpit Goel <B44344@freescale.com>
Cc: linux@arm.linux.org.uk, takata@linux-m32r.org, philb@gnu.org,
	geert@linux-m68k.org, schwidefsky@de.ibm.com,
	heiko.carstens@de.ibm.com, linux390@de.ibm.com,
	davem@davemloft.net, rob.herring@calxeda.com, arnd@arndb.de,
	swarren@nvidia.com, john.stultz@linaro.org,
	jesper.nilsson@axis.com, gregkh@linuxfoundation.org,
	sam@ravnborg.org, linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, linux-m32r@ml.linux-m32r.org,
	linux-m32r-ja@ml.linux-m32r.org, linux-m68k@vger.kernel.org,
	linux-s390@vger.kernel.org, sparclinux@vger.kernel.org,
	mattw@codeaurora.org
Subject: Re: [PATCH 2/2] Convert PowerPC macro spin_event_timeout() to architecture independent macro
Date: Wed, 31 Jul 2013 00:16:30 -0700	[thread overview]
Message-ID: <20130731071630.GI8868@codeaurora.org> (raw)
In-Reply-To: <1375187900-17582-3-git-send-email-B44344@freescale.com>

On 07/30, Arpit Goel wrote:
> This patch ports PowerPC implementation of spin_event_timeout() for generic
> use. Architecture specific implementation can be added to asm/delay.h, which
> will override the generic linux implementation.
> 
> Signed-off-by: Arpit Goel <B44344@freescale.com>
> ---

We use something similar internally but it's tied specifically to
readl.

>  
> +#ifndef spin_event_timeout
> +/**
> + * spin_event_timeout - spin until a condition gets true or a timeout elapses
> + * @condition: a C expression to evalate
> + * @timeout: timeout, in microseconds
> + * @delay: the number of microseconds to delay between each evaluation of
> + *         @condition
> + *
> + * The process spins until the condition evaluates to true (non-zero) or the
> + * timeout elapses.  The return value of this macro is the value of
> + * @condition when the loop terminates. This allows you to determine the cause
> + * of the loop terminates.  If the return value is zero, then you know a
> + * timeout has occurred.
> + *
> + * This primary purpose of this macro is to poll on a hardware register
> + * until a status bit changes.  The timeout ensures that the loop still
> + * terminates even if the bit never changes.  The delay is for devices that
> + * need a delay in between successive reads.
> + *
> + * gcc will optimize out the if-statement if @delay is a constant.
> + *
> + * This is copied from PowerPC based spin_event_timeout() implementation
> + * and modified for generic usecase.
> + */
> +#define spin_event_timeout(condition, timeout, delay)		\
> +({								\
> +	typeof(condition) __ret;				\
> +	unsigned long __loops = timeout/USECS_PER_JIFFY;	\
> +	unsigned long __start = jiffies;			\
> +	while (!(__ret = (condition)) &&			\
> +		time_before(jiffies, __start + __loops + 1))	\
> +		if (delay)					\
> +			udelay(delay);				\
> +		else						\
> +			schedule();				\
> +	if (!__ret)						\
> +		__ret = (condition);				\
> +	__ret;							\
> +})

What do you do here if jiffies aren't incrementing (i.e
interrupts are disabled). The time_before() check won't work
there and it would be nice if we were able to use this in such
situations. I think powerpc gets around this by reading the
hardware timer directly?

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation

WARNING: multiple messages have this Message-ID (diff)
From: Stephen Boyd <sboyd@codeaurora.org>
To: linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH 2/2] Convert PowerPC macro spin_event_timeout() to architecture independent macro
Date: Wed, 31 Jul 2013 07:16:30 +0000	[thread overview]
Message-ID: <20130731071630.GI8868@codeaurora.org> (raw)
In-Reply-To: <1375187900-17582-3-git-send-email-B44344@freescale.com>

On 07/30, Arpit Goel wrote:
> This patch ports PowerPC implementation of spin_event_timeout() for generic
> use. Architecture specific implementation can be added to asm/delay.h, which
> will override the generic linux implementation.
> 
> Signed-off-by: Arpit Goel <B44344@freescale.com>
> ---

We use something similar internally but it's tied specifically to
readl.

>  
> +#ifndef spin_event_timeout
> +/**
> + * spin_event_timeout - spin until a condition gets true or a timeout elapses
> + * @condition: a C expression to evalate
> + * @timeout: timeout, in microseconds
> + * @delay: the number of microseconds to delay between each evaluation of
> + *         @condition
> + *
> + * The process spins until the condition evaluates to true (non-zero) or the
> + * timeout elapses.  The return value of this macro is the value of
> + * @condition when the loop terminates. This allows you to determine the cause
> + * of the loop terminates.  If the return value is zero, then you know a
> + * timeout has occurred.
> + *
> + * This primary purpose of this macro is to poll on a hardware register
> + * until a status bit changes.  The timeout ensures that the loop still
> + * terminates even if the bit never changes.  The delay is for devices that
> + * need a delay in between successive reads.
> + *
> + * gcc will optimize out the if-statement if @delay is a constant.
> + *
> + * This is copied from PowerPC based spin_event_timeout() implementation
> + * and modified for generic usecase.
> + */
> +#define spin_event_timeout(condition, timeout, delay)		\
> +({								\
> +	typeof(condition) __ret;				\
> +	unsigned long __loops = timeout/USECS_PER_JIFFY;	\
> +	unsigned long __start = jiffies;			\
> +	while (!(__ret = (condition)) &&			\
> +		time_before(jiffies, __start + __loops + 1))	\
> +		if (delay)					\
> +			udelay(delay);				\
> +		else						\
> +			schedule();				\
> +	if (!__ret)						\
> +		__ret = (condition);				\
> +	__ret;							\
> +})

What do you do here if jiffies aren't incrementing (i.e
interrupts are disabled). The time_before() check won't work
there and it would be nice if we were able to use this in such
situations. I think powerpc gets around this by reading the
hardware timer directly?

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation

WARNING: multiple messages have this Message-ID (diff)
From: sboyd@codeaurora.org (Stephen Boyd)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/2] Convert PowerPC macro spin_event_timeout() to architecture independent macro
Date: Wed, 31 Jul 2013 00:16:30 -0700	[thread overview]
Message-ID: <20130731071630.GI8868@codeaurora.org> (raw)
In-Reply-To: <1375187900-17582-3-git-send-email-B44344@freescale.com>

On 07/30, Arpit Goel wrote:
> This patch ports PowerPC implementation of spin_event_timeout() for generic
> use. Architecture specific implementation can be added to asm/delay.h, which
> will override the generic linux implementation.
> 
> Signed-off-by: Arpit Goel <B44344@freescale.com>
> ---

We use something similar internally but it's tied specifically to
readl.

>  
> +#ifndef spin_event_timeout
> +/**
> + * spin_event_timeout - spin until a condition gets true or a timeout elapses
> + * @condition: a C expression to evalate
> + * @timeout: timeout, in microseconds
> + * @delay: the number of microseconds to delay between each evaluation of
> + *         @condition
> + *
> + * The process spins until the condition evaluates to true (non-zero) or the
> + * timeout elapses.  The return value of this macro is the value of
> + * @condition when the loop terminates. This allows you to determine the cause
> + * of the loop terminates.  If the return value is zero, then you know a
> + * timeout has occurred.
> + *
> + * This primary purpose of this macro is to poll on a hardware register
> + * until a status bit changes.  The timeout ensures that the loop still
> + * terminates even if the bit never changes.  The delay is for devices that
> + * need a delay in between successive reads.
> + *
> + * gcc will optimize out the if-statement if @delay is a constant.
> + *
> + * This is copied from PowerPC based spin_event_timeout() implementation
> + * and modified for generic usecase.
> + */
> +#define spin_event_timeout(condition, timeout, delay)		\
> +({								\
> +	typeof(condition) __ret;				\
> +	unsigned long __loops = timeout/USECS_PER_JIFFY;	\
> +	unsigned long __start = jiffies;			\
> +	while (!(__ret = (condition)) &&			\
> +		time_before(jiffies, __start + __loops + 1))	\
> +		if (delay)					\
> +			udelay(delay);				\
> +		else						\
> +			schedule();				\
> +	if (!__ret)						\
> +		__ret = (condition);				\
> +	__ret;							\
> +})

What do you do here if jiffies aren't incrementing (i.e
interrupts are disabled). The time_before() check won't work
there and it would be nice if we were able to use this in such
situations. I think powerpc gets around this by reading the
hardware timer directly?

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation

  reply	other threads:[~2013-07-31  7:16 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-30 12:38 [PATCH 0/2] Make PPC macro spin_event_timeout() architecture independent Arpit Goel
2013-07-30 12:50 ` Arpit Goel
2013-07-30 12:38 ` Arpit Goel
2013-07-30 12:38 ` Arpit Goel
2013-07-30 12:38 ` [PATCH 1/2] Make USECS_PER_JIFFY available for generic use Arpit Goel
2013-07-30 12:50   ` Arpit Goel
2013-07-30 12:38   ` Arpit Goel
2013-07-30 12:38   ` Arpit Goel
2013-07-30 12:38 ` [PATCH 2/2] Convert PowerPC macro spin_event_timeout() to architecture independent macro Arpit Goel
2013-07-30 12:50   ` Arpit Goel
2013-07-30 12:38   ` Arpit Goel
2013-07-30 12:38   ` Arpit Goel
2013-07-31  7:16   ` Stephen Boyd [this message]
2013-07-31  7:16     ` Stephen Boyd
2013-07-31  7:16     ` Stephen Boyd
2013-07-31 23:44     ` Timur Tabi
2013-07-31 23:44       ` Timur Tabi
2013-07-31 23:44       ` Timur Tabi
2013-07-31 23:44       ` Timur Tabi
2013-08-01  0:04       ` Stephen Boyd
2013-08-01  0:04         ` Stephen Boyd
2013-08-01  0:04         ` Stephen Boyd
2013-08-01  0:13         ` Timur Tabi
2013-08-01  0:13           ` Timur Tabi
2013-08-01  0:13           ` Timur Tabi
2013-08-01  0:16           ` Stephen Boyd
2013-08-01  0:16             ` Stephen Boyd
2013-08-01  0:16             ` Stephen Boyd
2013-08-01  0:20             ` Timur Tabi
2013-08-01  0:20               ` Timur Tabi
2013-08-01  0:20               ` Timur Tabi
2013-08-01  1:36               ` Stephen Boyd
2013-08-01  1:36                 ` Stephen Boyd
2013-08-01  1:36                 ` Stephen Boyd
2013-08-01  6:27         ` Srivastava Rajan-B34330
2013-08-01  6:27           ` Srivastava Rajan-B34330
2013-08-01  9:26         ` Goel Arpit-B44344
2013-08-01  9:26           ` Goel Arpit-B44344
2013-08-01  0:02   ` Timur Tabi
2013-08-01  0:02     ` Timur Tabi
2013-08-01  0:02     ` Timur Tabi
2013-08-01  4:38     ` Goel Arpit-B44344
2013-08-01  4:38       ` Goel Arpit-B44344
2013-08-01  4:43       ` Timur Tabi
2013-08-01  4:43         ` Timur Tabi
2013-07-30 13:08 ` [PATCH 0/2] Make PPC macro spin_event_timeout() architecture independent Geert Uytterhoeven
2013-07-30 13:08   ` Geert Uytterhoeven
2013-07-30 13:08   ` Geert Uytterhoeven
2013-07-30 13:08   ` Geert Uytterhoeven
2013-07-31 11:09   ` Goel Arpit-B44344
2013-07-31 11:09     ` Goel Arpit-B44344

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=20130731071630.GI8868@codeaurora.org \
    --to=sboyd@codeaurora.org \
    --cc=B44344@freescale.com \
    --cc=arnd@arndb.de \
    --cc=davem@davemloft.net \
    --cc=geert@linux-m68k.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=heiko.carstens@de.ibm.com \
    --cc=jesper.nilsson@axis.com \
    --cc=john.stultz@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-m32r-ja@ml.linux-m32r.org \
    --cc=linux-m32r@ml.linux-m32r.org \
    --cc=linux-m68k@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=linux390@de.ibm.com \
    --cc=linux@arm.linux.org.uk \
    --cc=mattw@codeaurora.org \
    --cc=philb@gnu.org \
    --cc=rob.herring@calxeda.com \
    --cc=sam@ravnborg.org \
    --cc=schwidefsky@de.ibm.com \
    --cc=sparclinux@vger.kernel.org \
    --cc=swarren@nvidia.com \
    --cc=takata@linux-m32r.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.