cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

iopoll.h (7761B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Copyright (c) 2012-2014 The Linux Foundation. All rights reserved.
      4 */
      5
      6#ifndef _LINUX_IOPOLL_H
      7#define _LINUX_IOPOLL_H
      8
      9#include <linux/kernel.h>
     10#include <linux/types.h>
     11#include <linux/ktime.h>
     12#include <linux/delay.h>
     13#include <linux/errno.h>
     14#include <linux/io.h>
     15
     16/**
     17 * read_poll_timeout - Periodically poll an address until a condition is
     18 *			met or a timeout occurs
     19 * @op: accessor function (takes @args as its arguments)
     20 * @val: Variable to read the value into
     21 * @cond: Break condition (usually involving @val)
     22 * @sleep_us: Maximum time to sleep between reads in us (0
     23 *            tight-loops).  Should be less than ~20ms since usleep_range
     24 *            is used (see Documentation/timers/timers-howto.rst).
     25 * @timeout_us: Timeout in us, 0 means never timeout
     26 * @sleep_before_read: if it is true, sleep @sleep_us before read.
     27 * @args: arguments for @op poll
     28 *
     29 * Returns 0 on success and -ETIMEDOUT upon a timeout. In either
     30 * case, the last read value at @args is stored in @val. Must not
     31 * be called from atomic context if sleep_us or timeout_us are used.
     32 *
     33 * When available, you'll probably want to use one of the specialized
     34 * macros defined below rather than this macro directly.
     35 */
     36#define read_poll_timeout(op, val, cond, sleep_us, timeout_us, \
     37				sleep_before_read, args...) \
     38({ \
     39	u64 __timeout_us = (timeout_us); \
     40	unsigned long __sleep_us = (sleep_us); \
     41	ktime_t __timeout = ktime_add_us(ktime_get(), __timeout_us); \
     42	might_sleep_if((__sleep_us) != 0); \
     43	if (sleep_before_read && __sleep_us) \
     44		usleep_range((__sleep_us >> 2) + 1, __sleep_us); \
     45	for (;;) { \
     46		(val) = op(args); \
     47		if (cond) \
     48			break; \
     49		if (__timeout_us && \
     50		    ktime_compare(ktime_get(), __timeout) > 0) { \
     51			(val) = op(args); \
     52			break; \
     53		} \
     54		if (__sleep_us) \
     55			usleep_range((__sleep_us >> 2) + 1, __sleep_us); \
     56	} \
     57	(cond) ? 0 : -ETIMEDOUT; \
     58})
     59
     60/**
     61 * read_poll_timeout_atomic - Periodically poll an address until a condition is
     62 * 				met or a timeout occurs
     63 * @op: accessor function (takes @args as its arguments)
     64 * @val: Variable to read the value into
     65 * @cond: Break condition (usually involving @val)
     66 * @delay_us: Time to udelay between reads in us (0 tight-loops).  Should
     67 *            be less than ~10us since udelay is used (see
     68 *            Documentation/timers/timers-howto.rst).
     69 * @timeout_us: Timeout in us, 0 means never timeout
     70 * @delay_before_read: if it is true, delay @delay_us before read.
     71 * @args: arguments for @op poll
     72 *
     73 * Returns 0 on success and -ETIMEDOUT upon a timeout. In either
     74 * case, the last read value at @args is stored in @val.
     75 *
     76 * When available, you'll probably want to use one of the specialized
     77 * macros defined below rather than this macro directly.
     78 */
     79#define read_poll_timeout_atomic(op, val, cond, delay_us, timeout_us, \
     80					delay_before_read, args...) \
     81({ \
     82	u64 __timeout_us = (timeout_us); \
     83	unsigned long __delay_us = (delay_us); \
     84	ktime_t __timeout = ktime_add_us(ktime_get(), __timeout_us); \
     85	if (delay_before_read && __delay_us) \
     86		udelay(__delay_us); \
     87	for (;;) { \
     88		(val) = op(args); \
     89		if (cond) \
     90			break; \
     91		if (__timeout_us && \
     92		    ktime_compare(ktime_get(), __timeout) > 0) { \
     93			(val) = op(args); \
     94			break; \
     95		} \
     96		if (__delay_us) \
     97			udelay(__delay_us); \
     98	} \
     99	(cond) ? 0 : -ETIMEDOUT; \
    100})
    101
    102/**
    103 * readx_poll_timeout - Periodically poll an address until a condition is met or a timeout occurs
    104 * @op: accessor function (takes @addr as its only argument)
    105 * @addr: Address to poll
    106 * @val: Variable to read the value into
    107 * @cond: Break condition (usually involving @val)
    108 * @sleep_us: Maximum time to sleep between reads in us (0
    109 *            tight-loops).  Should be less than ~20ms since usleep_range
    110 *            is used (see Documentation/timers/timers-howto.rst).
    111 * @timeout_us: Timeout in us, 0 means never timeout
    112 *
    113 * Returns 0 on success and -ETIMEDOUT upon a timeout. In either
    114 * case, the last read value at @addr is stored in @val. Must not
    115 * be called from atomic context if sleep_us or timeout_us are used.
    116 *
    117 * When available, you'll probably want to use one of the specialized
    118 * macros defined below rather than this macro directly.
    119 */
    120#define readx_poll_timeout(op, addr, val, cond, sleep_us, timeout_us)	\
    121	read_poll_timeout(op, val, cond, sleep_us, timeout_us, false, addr)
    122
    123/**
    124 * readx_poll_timeout_atomic - Periodically poll an address until a condition is met or a timeout occurs
    125 * @op: accessor function (takes @addr as its only argument)
    126 * @addr: Address to poll
    127 * @val: Variable to read the value into
    128 * @cond: Break condition (usually involving @val)
    129 * @delay_us: Time to udelay between reads in us (0 tight-loops).  Should
    130 *            be less than ~10us since udelay is used (see
    131 *            Documentation/timers/timers-howto.rst).
    132 * @timeout_us: Timeout in us, 0 means never timeout
    133 *
    134 * Returns 0 on success and -ETIMEDOUT upon a timeout. In either
    135 * case, the last read value at @addr is stored in @val.
    136 *
    137 * When available, you'll probably want to use one of the specialized
    138 * macros defined below rather than this macro directly.
    139 */
    140#define readx_poll_timeout_atomic(op, addr, val, cond, delay_us, timeout_us) \
    141	read_poll_timeout_atomic(op, val, cond, delay_us, timeout_us, false, addr)
    142
    143#define readb_poll_timeout(addr, val, cond, delay_us, timeout_us) \
    144	readx_poll_timeout(readb, addr, val, cond, delay_us, timeout_us)
    145
    146#define readb_poll_timeout_atomic(addr, val, cond, delay_us, timeout_us) \
    147	readx_poll_timeout_atomic(readb, addr, val, cond, delay_us, timeout_us)
    148
    149#define readw_poll_timeout(addr, val, cond, delay_us, timeout_us) \
    150	readx_poll_timeout(readw, addr, val, cond, delay_us, timeout_us)
    151
    152#define readw_poll_timeout_atomic(addr, val, cond, delay_us, timeout_us) \
    153	readx_poll_timeout_atomic(readw, addr, val, cond, delay_us, timeout_us)
    154
    155#define readl_poll_timeout(addr, val, cond, delay_us, timeout_us) \
    156	readx_poll_timeout(readl, addr, val, cond, delay_us, timeout_us)
    157
    158#define readl_poll_timeout_atomic(addr, val, cond, delay_us, timeout_us) \
    159	readx_poll_timeout_atomic(readl, addr, val, cond, delay_us, timeout_us)
    160
    161#define readq_poll_timeout(addr, val, cond, delay_us, timeout_us) \
    162	readx_poll_timeout(readq, addr, val, cond, delay_us, timeout_us)
    163
    164#define readq_poll_timeout_atomic(addr, val, cond, delay_us, timeout_us) \
    165	readx_poll_timeout_atomic(readq, addr, val, cond, delay_us, timeout_us)
    166
    167#define readb_relaxed_poll_timeout(addr, val, cond, delay_us, timeout_us) \
    168	readx_poll_timeout(readb_relaxed, addr, val, cond, delay_us, timeout_us)
    169
    170#define readb_relaxed_poll_timeout_atomic(addr, val, cond, delay_us, timeout_us) \
    171	readx_poll_timeout_atomic(readb_relaxed, addr, val, cond, delay_us, timeout_us)
    172
    173#define readw_relaxed_poll_timeout(addr, val, cond, delay_us, timeout_us) \
    174	readx_poll_timeout(readw_relaxed, addr, val, cond, delay_us, timeout_us)
    175
    176#define readw_relaxed_poll_timeout_atomic(addr, val, cond, delay_us, timeout_us) \
    177	readx_poll_timeout_atomic(readw_relaxed, addr, val, cond, delay_us, timeout_us)
    178
    179#define readl_relaxed_poll_timeout(addr, val, cond, delay_us, timeout_us) \
    180	readx_poll_timeout(readl_relaxed, addr, val, cond, delay_us, timeout_us)
    181
    182#define readl_relaxed_poll_timeout_atomic(addr, val, cond, delay_us, timeout_us) \
    183	readx_poll_timeout_atomic(readl_relaxed, addr, val, cond, delay_us, timeout_us)
    184
    185#define readq_relaxed_poll_timeout(addr, val, cond, delay_us, timeout_us) \
    186	readx_poll_timeout(readq_relaxed, addr, val, cond, delay_us, timeout_us)
    187
    188#define readq_relaxed_poll_timeout_atomic(addr, val, cond, delay_us, timeout_us) \
    189	readx_poll_timeout_atomic(readq_relaxed, addr, val, cond, delay_us, timeout_us)
    190
    191#endif /* _LINUX_IOPOLL_H */