17f4dd379Sjsg /* 27f4dd379Sjsg * Copyright © 2016 Intel Corporation 37f4dd379Sjsg * 47f4dd379Sjsg * Permission is hereby granted, free of charge, to any person obtaining a 57f4dd379Sjsg * copy of this software and associated documentation files (the "Software"), 67f4dd379Sjsg * to deal in the Software without restriction, including without limitation 77f4dd379Sjsg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 87f4dd379Sjsg * and/or sell copies of the Software, and to permit persons to whom the 97f4dd379Sjsg * Software is furnished to do so, subject to the following conditions: 107f4dd379Sjsg * 117f4dd379Sjsg * The above copyright notice and this permission notice (including the next 127f4dd379Sjsg * paragraph) shall be included in all copies or substantial portions of the 137f4dd379Sjsg * Software. 147f4dd379Sjsg * 157f4dd379Sjsg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 167f4dd379Sjsg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 177f4dd379Sjsg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 187f4dd379Sjsg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 197f4dd379Sjsg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 207f4dd379Sjsg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 217f4dd379Sjsg * IN THE SOFTWARE. 227f4dd379Sjsg * 237f4dd379Sjsg */ 247f4dd379Sjsg 257f4dd379Sjsg #ifndef __I915_UTILS_H 267f4dd379Sjsg #define __I915_UTILS_H 277f4dd379Sjsg 28c349dbc7Sjsg #include <linux/list.h> 29c349dbc7Sjsg #include <linux/overflow.h> 30c349dbc7Sjsg #include <linux/sched.h> 311bb76ff1Sjsg #include <linux/string_helpers.h> 32c349dbc7Sjsg #include <linux/types.h> 33c349dbc7Sjsg #include <linux/workqueue.h> 341bb76ff1Sjsg #include <linux/sched/clock.h> 351bb76ff1Sjsg 361bb76ff1Sjsg #ifdef CONFIG_X86 371bb76ff1Sjsg #include <asm/hypervisor.h> 381bb76ff1Sjsg #endif 39c349dbc7Sjsg 40c349dbc7Sjsg #define drm_i915_private inteldrm_softc 41c349dbc7Sjsg 42c349dbc7Sjsg struct drm_i915_private; 43c349dbc7Sjsg struct timeout; 44c349dbc7Sjsg 45c349dbc7Sjsg #define FDO_BUG_URL "https://gitlab.freedesktop.org/drm/intel/-/wikis/How-to-file-i915-bugs" 46c349dbc7Sjsg 477f4dd379Sjsg #define MISSING_CASE(x) WARN(1, "Missing case (%s == %ld)\n", \ 487f4dd379Sjsg __stringify(x), (long)(x)) 497f4dd379Sjsg 50c349dbc7Sjsg void __printf(3, 4) 51c349dbc7Sjsg __i915_printk(struct drm_i915_private *dev_priv, const char *level, 52c349dbc7Sjsg const char *fmt, ...); 53c349dbc7Sjsg 54c349dbc7Sjsg #define i915_report_error(dev_priv, fmt, ...) \ 55c349dbc7Sjsg __i915_printk(dev_priv, KERN_ERR, fmt, ##__VA_ARGS__) 56c349dbc7Sjsg 57c349dbc7Sjsg #if IS_ENABLED(CONFIG_DRM_I915_DEBUG) 58c349dbc7Sjsg 59c349dbc7Sjsg int __i915_inject_probe_error(struct drm_i915_private *i915, int err, 60c349dbc7Sjsg const char *func, int line); 61c349dbc7Sjsg #define i915_inject_probe_error(_i915, _err) \ 62c349dbc7Sjsg __i915_inject_probe_error((_i915), (_err), __func__, __LINE__) 63c349dbc7Sjsg bool i915_error_injected(void); 64c349dbc7Sjsg 657f4dd379Sjsg #else 66c349dbc7Sjsg 67c349dbc7Sjsg #define i915_inject_probe_error(i915, e) ({ BUILD_BUG_ON_INVALID(i915); 0; }) 68c349dbc7Sjsg #define i915_error_injected() false 69c349dbc7Sjsg 70c349dbc7Sjsg #endif 71c349dbc7Sjsg 72c349dbc7Sjsg #define i915_inject_probe_failure(i915) i915_inject_probe_error((i915), -ENODEV) 73c349dbc7Sjsg 74c349dbc7Sjsg #define i915_probe_error(i915, fmt, ...) \ 75c349dbc7Sjsg __i915_printk(i915, i915_error_injected() ? KERN_DEBUG : KERN_ERR, \ 76c349dbc7Sjsg fmt, ##__VA_ARGS__) 77c349dbc7Sjsg 78c349dbc7Sjsg #if defined(GCC_VERSION) && GCC_VERSION >= 70000 79c349dbc7Sjsg #define add_overflows_t(T, A, B) \ 80c349dbc7Sjsg __builtin_add_overflow_p((A), (B), (T)0) 81c349dbc7Sjsg #else 82c349dbc7Sjsg #define add_overflows_t(T, A, B) ({ \ 837f4dd379Sjsg typeof(A) a = (A); \ 847f4dd379Sjsg typeof(B) b = (B); \ 85c349dbc7Sjsg (T)(a + b) < a; \ 867f4dd379Sjsg }) 877f4dd379Sjsg #endif 887f4dd379Sjsg 89c349dbc7Sjsg #define add_overflows(A, B) \ 90c349dbc7Sjsg add_overflows_t(typeof((A) + (B)), (A), (B)) 91c349dbc7Sjsg 927f4dd379Sjsg #define range_overflows(start, size, max) ({ \ 937f4dd379Sjsg typeof(start) start__ = (start); \ 947f4dd379Sjsg typeof(size) size__ = (size); \ 957f4dd379Sjsg typeof(max) max__ = (max); \ 967f4dd379Sjsg (void)(&start__ == &size__); \ 977f4dd379Sjsg (void)(&start__ == &max__); \ 98c349dbc7Sjsg start__ >= max__ || size__ > max__ - start__; \ 99c349dbc7Sjsg }) 100c349dbc7Sjsg 101c349dbc7Sjsg #define range_overflows_t(type, start, size, max) \ 102c349dbc7Sjsg range_overflows((type)(start), (type)(size), (type)(max)) 103c349dbc7Sjsg 104c349dbc7Sjsg #define range_overflows_end(start, size, max) ({ \ 105c349dbc7Sjsg typeof(start) start__ = (start); \ 106c349dbc7Sjsg typeof(size) size__ = (size); \ 107c349dbc7Sjsg typeof(max) max__ = (max); \ 108c349dbc7Sjsg (void)(&start__ == &size__); \ 109c349dbc7Sjsg (void)(&start__ == &max__); \ 1107f4dd379Sjsg start__ > max__ || size__ > max__ - start__; \ 1117f4dd379Sjsg }) 1127f4dd379Sjsg 113c349dbc7Sjsg #define range_overflows_end_t(type, start, size, max) \ 114c349dbc7Sjsg range_overflows_end((type)(start), (type)(size), (type)(max)) 1157f4dd379Sjsg 1167f4dd379Sjsg /* Note we don't consider signbits :| */ 1177f4dd379Sjsg #define overflows_type(x, T) \ 118c349dbc7Sjsg (sizeof(x) > sizeof(T) && (x) >> BITS_PER_TYPE(T)) 119c349dbc7Sjsg 1207f4dd379Sjsg #define ptr_mask_bits(ptr, n) ({ \ 1217f4dd379Sjsg unsigned long __v = (unsigned long)(ptr); \ 1227f4dd379Sjsg (typeof(ptr))(__v & -BIT(n)); \ 1237f4dd379Sjsg }) 1247f4dd379Sjsg 1257f4dd379Sjsg #define ptr_unmask_bits(ptr, n) ((unsigned long)(ptr) & (BIT(n) - 1)) 1267f4dd379Sjsg 1277f4dd379Sjsg #define ptr_unpack_bits(ptr, bits, n) ({ \ 1287f4dd379Sjsg unsigned long __v = (unsigned long)(ptr); \ 1297f4dd379Sjsg *(bits) = __v & (BIT(n) - 1); \ 1307f4dd379Sjsg (typeof(ptr))(__v & -BIT(n)); \ 1317f4dd379Sjsg }) 1327f4dd379Sjsg 1337f4dd379Sjsg #define ptr_pack_bits(ptr, bits, n) ({ \ 1347f4dd379Sjsg unsigned long __bits = (bits); \ 1357f4dd379Sjsg GEM_BUG_ON(__bits & -BIT(n)); \ 1367f4dd379Sjsg ((typeof(ptr))((unsigned long)(ptr) | __bits)); \ 1377f4dd379Sjsg }) 1387f4dd379Sjsg 139c349dbc7Sjsg #define ptr_dec(ptr) ({ \ 140c349dbc7Sjsg unsigned long __v = (unsigned long)(ptr); \ 141c349dbc7Sjsg (typeof(ptr))(__v - 1); \ 142c349dbc7Sjsg }) 143c349dbc7Sjsg 144c349dbc7Sjsg #define ptr_inc(ptr) ({ \ 145c349dbc7Sjsg unsigned long __v = (unsigned long)(ptr); \ 146c349dbc7Sjsg (typeof(ptr))(__v + 1); \ 147c349dbc7Sjsg }) 148c349dbc7Sjsg 1497f4dd379Sjsg #define page_mask_bits(ptr) ptr_mask_bits(ptr, PAGE_SHIFT) 1507f4dd379Sjsg #define page_unmask_bits(ptr) ptr_unmask_bits(ptr, PAGE_SHIFT) 1517f4dd379Sjsg #define page_pack_bits(ptr, bits) ptr_pack_bits(ptr, bits, PAGE_SHIFT) 1527f4dd379Sjsg #define page_unpack_bits(ptr, bits) ptr_unpack_bits(ptr, bits, PAGE_SHIFT) 1537f4dd379Sjsg 1547f4dd379Sjsg #define fetch_and_zero(ptr) ({ \ 1557f4dd379Sjsg typeof(*ptr) __T = *(ptr); \ 1567f4dd379Sjsg *(ptr) = (typeof(*ptr))0; \ 1577f4dd379Sjsg __T; \ 1587f4dd379Sjsg }) 1597f4dd379Sjsg 1605ca02815Sjsg static __always_inline ptrdiff_t ptrdiff(const void *a, const void *b) 1615ca02815Sjsg { 1625ca02815Sjsg return a - b; 1635ca02815Sjsg } 1645ca02815Sjsg 165c349dbc7Sjsg /* 166c349dbc7Sjsg * container_of_user: Extract the superclass from a pointer to a member. 167c349dbc7Sjsg * 168c349dbc7Sjsg * Exactly like container_of() with the exception that it plays nicely 169c349dbc7Sjsg * with sparse for __user @ptr. 170c349dbc7Sjsg */ 171c349dbc7Sjsg #define container_of_user(ptr, type, member) ({ \ 172c349dbc7Sjsg void __user *__mptr = (void __user *)(ptr); \ 173f005ef32Sjsg BUILD_BUG_ON_MSG(!__same_type(*(ptr), typeof_member(type, member)) && \ 174c349dbc7Sjsg !__same_type(*(ptr), void), \ 175c349dbc7Sjsg "pointer type mismatch in container_of()"); \ 176c349dbc7Sjsg ((type __user *)(__mptr - offsetof(type, member))); }) 177c349dbc7Sjsg 178c349dbc7Sjsg /* 179c349dbc7Sjsg * check_user_mbz: Check that a user value exists and is zero 180c349dbc7Sjsg * 181c349dbc7Sjsg * Frequently in our uABI we reserve space for future extensions, and 182c349dbc7Sjsg * two ensure that userspace is prepared we enforce that space must 183c349dbc7Sjsg * be zero. (Then any future extension can safely assume a default value 184c349dbc7Sjsg * of 0.) 185c349dbc7Sjsg * 186c349dbc7Sjsg * check_user_mbz() combines checking that the user pointer is accessible 187c349dbc7Sjsg * and that the contained value is zero. 188c349dbc7Sjsg * 189c349dbc7Sjsg * Returns: -EFAULT if not accessible, -EINVAL if !zero, or 0 on success. 190c349dbc7Sjsg */ 191c349dbc7Sjsg #define check_user_mbz(U) ({ \ 192c349dbc7Sjsg typeof(*(U)) mbz__; \ 193c349dbc7Sjsg get_user(mbz__, (U)) ? -EFAULT : mbz__ ? -EINVAL : 0; \ 194c349dbc7Sjsg }) 195c349dbc7Sjsg 1967f4dd379Sjsg #define u64_to_ptr(T, x) ({ \ 1977f4dd379Sjsg typecheck(u64, x); \ 1987f4dd379Sjsg (T *)(uintptr_t)(x); \ 1997f4dd379Sjsg }) 2007f4dd379Sjsg 2017f4dd379Sjsg #define __mask_next_bit(mask) ({ \ 2027f4dd379Sjsg int __idx = ffs(mask) - 1; \ 2037f4dd379Sjsg mask &= ~BIT(__idx); \ 2047f4dd379Sjsg __idx; \ 2057f4dd379Sjsg }) 2067f4dd379Sjsg 207c349dbc7Sjsg static inline bool is_power_of_2_u64(u64 n) 2087f4dd379Sjsg { 209c349dbc7Sjsg return (n != 0 && ((n & (n - 1)) == 0)); 2107f4dd379Sjsg } 2117f4dd379Sjsg 2127f4dd379Sjsg static inline void __list_del_many(struct list_head *head, 2137f4dd379Sjsg struct list_head *first) 2147f4dd379Sjsg { 2157f4dd379Sjsg first->prev = head; 2167f4dd379Sjsg WRITE_ONCE(head->next, first); 2177f4dd379Sjsg } 2187f4dd379Sjsg 219c349dbc7Sjsg static inline int list_is_last_rcu(const struct list_head *list, 220c349dbc7Sjsg const struct list_head *head) 221c349dbc7Sjsg { 222c349dbc7Sjsg return READ_ONCE(list->next) == head; 223c349dbc7Sjsg } 224c349dbc7Sjsg 225c349dbc7Sjsg static inline unsigned long msecs_to_jiffies_timeout(const unsigned int m) 226c349dbc7Sjsg { 227c349dbc7Sjsg unsigned long j = msecs_to_jiffies(m); 228c349dbc7Sjsg 229c349dbc7Sjsg return min_t(unsigned long, MAX_JIFFY_OFFSET, j + 1); 230c349dbc7Sjsg } 231c349dbc7Sjsg 232c349dbc7Sjsg /* 233c349dbc7Sjsg * If you need to wait X milliseconds between events A and B, but event B 234c349dbc7Sjsg * doesn't happen exactly after event A, you record the timestamp (jiffies) of 235c349dbc7Sjsg * when event A happened, then just before event B you call this function and 236c349dbc7Sjsg * pass the timestamp as the first argument, and X as the second argument. 237c349dbc7Sjsg */ 238c349dbc7Sjsg static inline void 239c349dbc7Sjsg wait_remaining_ms_from_jiffies(unsigned long timestamp_jiffies, int to_wait_ms) 240c349dbc7Sjsg { 241c349dbc7Sjsg unsigned long target_jiffies, tmp_jiffies, remaining_jiffies; 242c349dbc7Sjsg 243c349dbc7Sjsg /* 244c349dbc7Sjsg * Don't re-read the value of "jiffies" every time since it may change 245c349dbc7Sjsg * behind our back and break the math. 246c349dbc7Sjsg */ 247c349dbc7Sjsg tmp_jiffies = jiffies; 248c349dbc7Sjsg target_jiffies = timestamp_jiffies + 249c349dbc7Sjsg msecs_to_jiffies_timeout(to_wait_ms); 250c349dbc7Sjsg 251c349dbc7Sjsg if (time_after(target_jiffies, tmp_jiffies)) { 252c349dbc7Sjsg remaining_jiffies = target_jiffies - tmp_jiffies; 253c349dbc7Sjsg while (remaining_jiffies) 254c349dbc7Sjsg remaining_jiffies = 255c349dbc7Sjsg schedule_timeout_uninterruptible(remaining_jiffies); 256c349dbc7Sjsg } 257c349dbc7Sjsg } 258c349dbc7Sjsg 259f005ef32Sjsg /* 260c349dbc7Sjsg * __wait_for - magic wait macro 261c349dbc7Sjsg * 262c349dbc7Sjsg * Macro to help avoid open coding check/wait/timeout patterns. Note that it's 263c349dbc7Sjsg * important that we check the condition again after having timed out, since the 264c349dbc7Sjsg * timeout could be due to preemption or similar and we've never had a chance to 265c349dbc7Sjsg * check the condition before the timeout. 266c349dbc7Sjsg */ 267c349dbc7Sjsg #define __wait_for(OP, COND, US, Wmin, Wmax) ({ \ 268c349dbc7Sjsg const ktime_t end__ = ktime_add_ns(ktime_get_raw(), 1000ll * (US)); \ 269c349dbc7Sjsg long wait__ = (Wmin); /* recommended min for usleep is 10 us */ \ 270c349dbc7Sjsg int ret__; \ 271c349dbc7Sjsg might_sleep(); \ 272c349dbc7Sjsg for (;;) { \ 273c349dbc7Sjsg const bool expired__ = ktime_after(ktime_get_raw(), end__); \ 274c349dbc7Sjsg OP; \ 275c349dbc7Sjsg /* Guarantee COND check prior to timeout */ \ 276c349dbc7Sjsg barrier(); \ 277c349dbc7Sjsg if (COND) { \ 278c349dbc7Sjsg ret__ = 0; \ 279c349dbc7Sjsg break; \ 280c349dbc7Sjsg } \ 281c349dbc7Sjsg if (expired__) { \ 282c349dbc7Sjsg ret__ = -ETIMEDOUT; \ 283c349dbc7Sjsg break; \ 284c349dbc7Sjsg } \ 285c349dbc7Sjsg usleep_range(wait__, wait__ * 2); \ 286c349dbc7Sjsg if (wait__ < (Wmax)) \ 287c349dbc7Sjsg wait__ <<= 1; \ 288c349dbc7Sjsg } \ 289c349dbc7Sjsg ret__; \ 290c349dbc7Sjsg }) 291c349dbc7Sjsg 292c349dbc7Sjsg #define _wait_for(COND, US, Wmin, Wmax) __wait_for(, (COND), (US), (Wmin), \ 293c349dbc7Sjsg (Wmax)) 294c349dbc7Sjsg #define wait_for(COND, MS) _wait_for((COND), (MS) * 1000, 10, 1000) 295c349dbc7Sjsg 296c349dbc7Sjsg /* If CONFIG_PREEMPT_COUNT is disabled, in_atomic() always reports false. */ 297c349dbc7Sjsg #if defined(CONFIG_DRM_I915_DEBUG) && defined(CONFIG_PREEMPT_COUNT) 298c349dbc7Sjsg # define _WAIT_FOR_ATOMIC_CHECK(ATOMIC) WARN_ON_ONCE((ATOMIC) && !in_atomic()) 299c349dbc7Sjsg #else 300c349dbc7Sjsg # define _WAIT_FOR_ATOMIC_CHECK(ATOMIC) do { } while (0) 301c349dbc7Sjsg #endif 302c349dbc7Sjsg 303c349dbc7Sjsg #define _wait_for_atomic(COND, US, ATOMIC) \ 304c349dbc7Sjsg ({ \ 305c349dbc7Sjsg int cpu, ret, timeout = (US) * 1000; \ 306c349dbc7Sjsg u64 base; \ 307c349dbc7Sjsg _WAIT_FOR_ATOMIC_CHECK(ATOMIC); \ 308c349dbc7Sjsg if (!(ATOMIC)) { \ 309c349dbc7Sjsg preempt_disable(); \ 310c349dbc7Sjsg cpu = smp_processor_id(); \ 311c349dbc7Sjsg } \ 312c349dbc7Sjsg base = local_clock(); \ 313c349dbc7Sjsg for (;;) { \ 314c349dbc7Sjsg u64 now = local_clock(); \ 315c349dbc7Sjsg if (!(ATOMIC)) \ 316c349dbc7Sjsg preempt_enable(); \ 317c349dbc7Sjsg /* Guarantee COND check prior to timeout */ \ 318c349dbc7Sjsg barrier(); \ 319c349dbc7Sjsg if (COND) { \ 320c349dbc7Sjsg ret = 0; \ 321c349dbc7Sjsg break; \ 322c349dbc7Sjsg } \ 323c349dbc7Sjsg if (now - base >= timeout) { \ 324c349dbc7Sjsg ret = -ETIMEDOUT; \ 325c349dbc7Sjsg break; \ 326c349dbc7Sjsg } \ 327c349dbc7Sjsg cpu_relax(); \ 328c349dbc7Sjsg if (!(ATOMIC)) { \ 329c349dbc7Sjsg preempt_disable(); \ 330c349dbc7Sjsg if (unlikely(cpu != smp_processor_id())) { \ 331c349dbc7Sjsg timeout -= now - base; \ 332c349dbc7Sjsg cpu = smp_processor_id(); \ 333c349dbc7Sjsg base = local_clock(); \ 334c349dbc7Sjsg } \ 335c349dbc7Sjsg } \ 336c349dbc7Sjsg } \ 337c349dbc7Sjsg ret; \ 338c349dbc7Sjsg }) 339c349dbc7Sjsg 340c349dbc7Sjsg #define wait_for_us(COND, US) \ 341c349dbc7Sjsg ({ \ 342c349dbc7Sjsg int ret__; \ 343c349dbc7Sjsg BUILD_BUG_ON(!__builtin_constant_p(US)); \ 344c349dbc7Sjsg if ((US) > 10) \ 345c349dbc7Sjsg ret__ = _wait_for((COND), (US), 10, 10); \ 346c349dbc7Sjsg else \ 347c349dbc7Sjsg ret__ = _wait_for_atomic((COND), (US), 0); \ 348c349dbc7Sjsg ret__; \ 349c349dbc7Sjsg }) 350c349dbc7Sjsg 351c349dbc7Sjsg #define wait_for_atomic_us(COND, US) \ 352c349dbc7Sjsg ({ \ 353c349dbc7Sjsg BUILD_BUG_ON(!__builtin_constant_p(US)); \ 354c349dbc7Sjsg BUILD_BUG_ON((US) > 50000); \ 355c349dbc7Sjsg _wait_for_atomic((COND), (US), 1); \ 356c349dbc7Sjsg }) 357c349dbc7Sjsg 358c349dbc7Sjsg #define wait_for_atomic(COND, MS) wait_for_atomic_us((COND), (MS) * 1000) 359c349dbc7Sjsg 360c349dbc7Sjsg #define KHz(x) (1000 * (x)) 361c349dbc7Sjsg #define MHz(x) KHz(1000 * (x)) 362c349dbc7Sjsg 363ad8b1aafSjsg void add_taint_for_CI(struct drm_i915_private *i915, unsigned int taint); 364ad8b1aafSjsg static inline void __add_taint_for_CI(unsigned int taint) 365c349dbc7Sjsg { 366c349dbc7Sjsg /* 367c349dbc7Sjsg * The system is "ok", just about surviving for the user, but 368c349dbc7Sjsg * CI results are now unreliable as the HW is very suspect. 369c349dbc7Sjsg * CI checks the taint state after every test and will reboot 370c349dbc7Sjsg * the machine if the kernel is tainted. 371c349dbc7Sjsg */ 372c349dbc7Sjsg add_taint(taint, LOCKDEP_STILL_OK); 373c349dbc7Sjsg } 374c349dbc7Sjsg 375c349dbc7Sjsg void cancel_timer(struct timeout *t); 376c349dbc7Sjsg void set_timer_ms(struct timeout *t, unsigned long timeout); 377c349dbc7Sjsg 3785ca02815Sjsg static inline bool timer_active(const struct timeout *t) 379c349dbc7Sjsg { 380c349dbc7Sjsg #ifdef __linux__ 3815ca02815Sjsg return READ_ONCE(t->expires); 382c349dbc7Sjsg #else 3835ca02815Sjsg return READ_ONCE(t->to_time); 384c349dbc7Sjsg #endif 385c349dbc7Sjsg } 386c349dbc7Sjsg 3875ca02815Sjsg static inline bool timer_expired(const struct timeout *t) 3885ca02815Sjsg { 3895ca02815Sjsg return timer_active(t) && !timer_pending(t); 3905ca02815Sjsg } 3915ca02815Sjsg 3921bb76ff1Sjsg static inline bool i915_run_as_guest(void) 3931bb76ff1Sjsg { 3941bb76ff1Sjsg #if IS_ENABLED(CONFIG_X86) 3951bb76ff1Sjsg return !hypervisor_is_type(X86_HYPER_NATIVE); 3961bb76ff1Sjsg #else 3971bb76ff1Sjsg /* Not supported yet */ 3981bb76ff1Sjsg return false; 3991bb76ff1Sjsg #endif 4001bb76ff1Sjsg } 4011bb76ff1Sjsg 4021bb76ff1Sjsg bool i915_vtd_active(struct drm_i915_private *i915); 403c349dbc7Sjsg 404*6c50df30Sjsg bool i915_direct_stolen_access(struct drm_i915_private *i915); 405*6c50df30Sjsg 4067f4dd379Sjsg #endif /* !__I915_UTILS_H */ 407