From patchwork Wed Jul 1 16:29:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nastya Vicodin X-Patchwork-Id: 240625 List-Id: U-Boot discussion From: vicooodin at gmail.com (Anastasiia Lukianenko) Date: Wed, 1 Jul 2020 19:29:50 +0300 Subject: [PATCH 08/17] linux/compat.h: Add wait_event_timeout macro In-Reply-To: <20200701162959.9814-1-vicooodin@gmail.com> References: <20200701162959.9814-1-vicooodin@gmail.com> Message-ID: <20200701162959.9814-9-vicooodin@gmail.com> From: Oleksandr Andrushchenko Add wait_event_timeout - sleep until a condition gets true or a timeout elapses. This is a stripped version of the same from Linux kernel with the following u-boot specific modifications: - no wait queues supported - use u-boot timer to detect timeouts - check for Ctrl-C pressed during wait Signed-off-by: Oleksandr Andrushchenko Signed-off-by: Anastasiia Lukianenko --- include/linux/compat.h | 45 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/include/linux/compat.h b/include/linux/compat.h index 712eeaef4e..5375b7d3b8 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -1,12 +1,20 @@ #ifndef _LINUX_COMPAT_H_ #define _LINUX_COMPAT_H_ +#include #include #include + +#include + #include #include #include +#ifdef CONFIG_XEN +#include +#endif + struct unused {}; typedef struct unused unused_t; @@ -122,6 +130,43 @@ static inline void kmem_cache_destroy(struct kmem_cache *cachep) #define add_wait_queue(...) do { } while (0) #define remove_wait_queue(...) do { } while (0) +#ifndef CONFIG_XEN +#define eventchn_poll() +#endif + +#define __wait_event_timeout(condition, timeout, ret) \ +({ \ + ulong __ret = ret; /* explicit shadow */ \ + ulong start = get_timer(0); \ + for (;;) { \ + eventchn_poll(); \ + if (condition) { \ + __ret = 1; \ + break; \ + } \ + if ((get_timer(start) > timeout) || ctrlc()) { \ + __ret = 0; \ + break; \ + } \ + cpu_relax(); \ + } \ + __ret; \ +}) + +/* + * 0 if the @condition evaluated to %false after the @timeout elapsed, + * 1 if the @condition evaluated to %true + */ +#define wait_event_timeout(wq_head, condition, timeout) \ +({ \ + ulong __ret; \ + if (condition) \ + __ret = 1; \ + else \ + __ret = __wait_event_timeout(condition, timeout, __ret);\ + __ret; \ +}) + #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) /* This is also defined in ARMv8's mmu.h */