Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: MIT */
2/*
3 * Copyright © 2026 Intel Corporation
4 */
5
6#ifndef _XE_SLEEP_H_
7#define _XE_SLEEP_H_
8
9#include <linux/delay.h>
10#include <linux/math64.h>
11
12/**
13 * xe_sleep_relaxed_ms() - Sleep for an approximate time.
14 * @delay_ms: time in msec to sleep
15 *
16 * For smaller timeouts, sleep with 0.5ms accuracy.
17 */
18static inline void xe_sleep_relaxed_ms(unsigned int delay_ms)
19{
20 unsigned long min_us, max_us;
21
22 if (!delay_ms)
23 return;
24
25 if (delay_ms > 20) {
26 msleep(delay_ms);
27 return;
28 }
29
30 min_us = mul_u32_u32(delay_ms, 1000);
31 max_us = min_us + 500;
32
33 usleep_range(min_us, max_us);
34}
35
36/**
37 * xe_sleep_exponential_ms() - Sleep for a exponentially increased time.
38 * @sleep_period_ms: current time in msec to sleep
39 * @max_sleep_ms: maximum time in msec to sleep
40 *
41 * Sleep for the @sleep_period_ms and exponentially increase this time for the
42 * next loop, unless reaching the @max_sleep_ms limit.
43 *
44 * Return: approximate time in msec the task was delayed.
45 */
46static inline unsigned int xe_sleep_exponential_ms(unsigned int *sleep_period_ms,
47 unsigned int max_sleep_ms)
48{
49 unsigned int delay_ms = *sleep_period_ms;
50 unsigned int next_delay_ms = 2 * delay_ms;
51
52 xe_sleep_relaxed_ms(delay_ms);
53 *sleep_period_ms = min(next_delay_ms, max_sleep_ms);
54 return delay_ms;
55}
56
57#endif