Linux Audio

Check our new training course

Linux debugging, profiling, tracing and performance analysis training

Apr 14-17, 2025
Register
Loading...
Note: File does not exist in v3.1.
  1/*
  2 * Copyright © 2016 Intel Corporation
  3 *
  4 * Permission is hereby granted, free of charge, to any person obtaining a
  5 * copy of this software and associated documentation files (the "Software"),
  6 * to deal in the Software without restriction, including without limitation
  7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8 * and/or sell copies of the Software, and to permit persons to whom the
  9 * Software is furnished to do so, subject to the following conditions:
 10 *
 11 * The above copyright notice and this permission notice (including the next
 12 * paragraph) shall be included in all copies or substantial portions of the
 13 * Software.
 14 *
 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 21 * IN THE SOFTWARE.
 22 *
 23 */
 24
 25#ifndef __I915_GEM_H__
 26#define __I915_GEM_H__
 27
 28#include <linux/bug.h>
 29#include <linux/interrupt.h>
 30
 31#include <drm/drm_drv.h>
 32
 33#include "i915_utils.h"
 34
 35struct drm_i915_private;
 36
 37#ifdef CONFIG_DRM_I915_DEBUG_GEM
 38
 39#define GEM_SHOW_DEBUG() drm_debug_enabled(DRM_UT_DRIVER)
 40
 41#ifdef CONFIG_DRM_I915_DEBUG_GEM_ONCE
 42#define __GEM_BUG(cond) BUG()
 43#else
 44#define __GEM_BUG(cond) \
 45	WARN(1, "%s:%d GEM_BUG_ON(%s)\n", __func__, __LINE__, __stringify(cond))
 46#endif
 47
 48#define GEM_BUG_ON(condition) do { if (unlikely((condition))) {	\
 49		GEM_TRACE_ERR("%s:%d GEM_BUG_ON(%s)\n", \
 50			      __func__, __LINE__, __stringify(condition)); \
 51		GEM_TRACE_DUMP(); \
 52		__GEM_BUG(condition); \
 53		} \
 54	} while(0)
 55#define GEM_WARN_ON(expr) WARN_ON(expr)
 56
 57#define GEM_DEBUG_DECL(var) var
 58#define GEM_DEBUG_EXEC(expr) expr
 59#define GEM_DEBUG_BUG_ON(expr) GEM_BUG_ON(expr)
 60#define GEM_DEBUG_WARN_ON(expr) GEM_WARN_ON(expr)
 61
 62#else
 63
 64#define GEM_SHOW_DEBUG() (0)
 65
 66#define GEM_BUG_ON(expr) BUILD_BUG_ON_INVALID(expr)
 67#define GEM_WARN_ON(expr) ({ unlikely(!!(expr)); })
 68
 69#define GEM_DEBUG_DECL(var)
 70#define GEM_DEBUG_EXEC(expr) do { } while (0)
 71#define GEM_DEBUG_BUG_ON(expr)
 72#define GEM_DEBUG_WARN_ON(expr) ({ BUILD_BUG_ON_INVALID(expr); 0; })
 73#endif
 74
 75#if IS_ENABLED(CONFIG_DRM_I915_TRACE_GEM)
 76#define GEM_TRACE(...) trace_printk(__VA_ARGS__)
 77#define GEM_TRACE_ERR(...) do {						\
 78	pr_err(__VA_ARGS__);						\
 79	trace_printk(__VA_ARGS__);					\
 80} while (0)
 81#define GEM_TRACE_DUMP() \
 82	do { ftrace_dump(DUMP_ALL); __add_taint_for_CI(TAINT_WARN); } while (0)
 83#define GEM_TRACE_DUMP_ON(expr) \
 84	do { if (expr) GEM_TRACE_DUMP(); } while (0)
 85#else
 86#define GEM_TRACE(...) do { } while (0)
 87#define GEM_TRACE_ERR(...) do { } while (0)
 88#define GEM_TRACE_DUMP() do { } while (0)
 89#define GEM_TRACE_DUMP_ON(expr) BUILD_BUG_ON_INVALID(expr)
 90#endif
 91
 92#define I915_GEM_IDLE_TIMEOUT (HZ / 5)
 93
 94static inline void tasklet_lock(struct tasklet_struct *t)
 95{
 96	while (!tasklet_trylock(t))
 97		cpu_relax();
 98}
 99
100static inline bool tasklet_is_locked(const struct tasklet_struct *t)
101{
102	return test_bit(TASKLET_STATE_RUN, &t->state);
103}
104
105static inline void __tasklet_disable_sync_once(struct tasklet_struct *t)
106{
107	if (!atomic_fetch_inc(&t->count))
108		tasklet_unlock_spin_wait(t);
109}
110
111static inline bool __tasklet_is_enabled(const struct tasklet_struct *t)
112{
113	return !atomic_read(&t->count);
114}
115
116static inline bool __tasklet_enable(struct tasklet_struct *t)
117{
118	return atomic_dec_and_test(&t->count);
119}
120
121static inline bool __tasklet_is_scheduled(struct tasklet_struct *t)
122{
123	return test_bit(TASKLET_STATE_SCHED, &t->state);
124}
125
126struct i915_gem_ww_ctx {
127	struct ww_acquire_ctx ctx;
128	struct list_head obj_list;
129	bool intr;
130	struct drm_i915_gem_object *contended;
131};
132
133void i915_gem_ww_ctx_init(struct i915_gem_ww_ctx *ctx, bool intr);
134void i915_gem_ww_ctx_fini(struct i915_gem_ww_ctx *ctx);
135int __must_check i915_gem_ww_ctx_backoff(struct i915_gem_ww_ctx *ctx);
136void i915_gem_ww_unlock_single(struct drm_i915_gem_object *obj);
137
138#endif /* __I915_GEM_H__ */