From: Oleksandr Andrushchenko <oleksandr_andrushche...@epam.com> 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 <oleksandr_andrushche...@epam.com> Signed-off-by: Anastasiia Lukianenko <anastasiia_lukiane...@epam.com> --- 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 <console.h> #include <log.h> #include <malloc.h> + +#include <asm/processor.h> + #include <linux/types.h> #include <linux/err.h> #include <linux/kernel.h> +#ifdef CONFIG_XEN +#include <xen/events.h> +#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 */ -- 2.17.1