Commit | Line | Data |
---|---|---|
d501b1d2 CW |
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 | ||
47979480 | 28 | #include <linux/bug.h> |
f351d087 | 29 | #include <linux/interrupt.h> |
47979480 | 30 | |
a09d9a80 JN |
31 | #include <drm/drm_drv.h> |
32 | ||
8ad305f1 CW |
33 | #include "i915_utils.h" |
34 | ||
e4d2006f CW |
35 | struct drm_i915_private; |
36 | ||
d501b1d2 | 37 | #ifdef CONFIG_DRM_I915_DEBUG_GEM |
7f961d79 | 38 | |
bdbf43d7 | 39 | #define GEM_SHOW_DEBUG() drm_debug_enabled(DRM_UT_DRIVER) |
7f961d79 | 40 | |
d5653ec3 | 41 | #define GEM_BUG_ON(condition) do { if (unlikely((condition))) { \ |
c97fb526 CW |
42 | GEM_TRACE_ERR("%s:%d GEM_BUG_ON(%s)\n", \ |
43 | __func__, __LINE__, __stringify(condition)); \ | |
8ad305f1 | 44 | GEM_TRACE_DUMP(); \ |
d5653ec3 MK |
45 | BUG(); \ |
46 | } \ | |
47 | } while(0) | |
17cfde60 | 48 | #define GEM_WARN_ON(expr) WARN_ON(expr) |
eca56a35 | 49 | |
ae9a043b CW |
50 | #define GEM_DEBUG_DECL(var) var |
51 | #define GEM_DEBUG_EXEC(expr) expr | |
52 | #define GEM_DEBUG_BUG_ON(expr) GEM_BUG_ON(expr) | |
bbb8a9d7 | 53 | #define GEM_DEBUG_WARN_ON(expr) GEM_WARN_ON(expr) |
eca56a35 | 54 | |
d501b1d2 | 55 | #else |
7f961d79 CW |
56 | |
57 | #define GEM_SHOW_DEBUG() (0) | |
58 | ||
4cfa20c8 | 59 | #define GEM_BUG_ON(expr) BUILD_BUG_ON_INVALID(expr) |
bbb8a9d7 | 60 | #define GEM_WARN_ON(expr) ({ unlikely(!!(expr)); }) |
eca56a35 | 61 | |
ae9a043b CW |
62 | #define GEM_DEBUG_DECL(var) |
63 | #define GEM_DEBUG_EXEC(expr) do { } while (0) | |
64 | #define GEM_DEBUG_BUG_ON(expr) | |
bbb8a9d7 | 65 | #define GEM_DEBUG_WARN_ON(expr) ({ BUILD_BUG_ON_INVALID(expr); 0; }) |
d501b1d2 CW |
66 | #endif |
67 | ||
bccd3b83 CW |
68 | #if IS_ENABLED(CONFIG_DRM_I915_TRACE_GEM) |
69 | #define GEM_TRACE(...) trace_printk(__VA_ARGS__) | |
c97fb526 CW |
70 | #define GEM_TRACE_ERR(...) do { \ |
71 | pr_err(__VA_ARGS__); \ | |
72 | trace_printk(__VA_ARGS__); \ | |
73 | } while (0) | |
7a73e671 CW |
74 | #define GEM_TRACE_DUMP() \ |
75 | do { ftrace_dump(DUMP_ALL); add_taint_for_CI(TAINT_WARN); } while (0) | |
09a4c02e | 76 | #define GEM_TRACE_DUMP_ON(expr) \ |
7a73e671 | 77 | do { if (expr) GEM_TRACE_DUMP(); } while (0) |
bccd3b83 CW |
78 | #else |
79 | #define GEM_TRACE(...) do { } while (0) | |
c97fb526 | 80 | #define GEM_TRACE_ERR(...) do { } while (0) |
629820fc | 81 | #define GEM_TRACE_DUMP() do { } while (0) |
09a4c02e | 82 | #define GEM_TRACE_DUMP_ON(expr) BUILD_BUG_ON_INVALID(expr) |
bccd3b83 CW |
83 | #endif |
84 | ||
3d606249 CW |
85 | #define I915_GEM_IDLE_TIMEOUT (HZ / 5) |
86 | ||
c36eebd9 CW |
87 | static inline void tasklet_lock(struct tasklet_struct *t) |
88 | { | |
89 | while (!tasklet_trylock(t)) | |
90 | cpu_relax(); | |
91 | } | |
92 | ||
3c00660d CW |
93 | static inline bool tasklet_is_locked(const struct tasklet_struct *t) |
94 | { | |
95 | return test_bit(TASKLET_STATE_RUN, &t->state); | |
96 | } | |
97 | ||
f351d087 CW |
98 | static inline void __tasklet_disable_sync_once(struct tasklet_struct *t) |
99 | { | |
41a1bde3 | 100 | if (!atomic_fetch_inc(&t->count)) |
f351d087 CW |
101 | tasklet_unlock_wait(t); |
102 | } | |
103 | ||
9512f985 CW |
104 | static inline bool __tasklet_is_enabled(const struct tasklet_struct *t) |
105 | { | |
106 | return !atomic_read(&t->count); | |
107 | } | |
108 | ||
41a1bde3 CW |
109 | static inline bool __tasklet_enable(struct tasklet_struct *t) |
110 | { | |
111 | return atomic_dec_and_test(&t->count); | |
112 | } | |
113 | ||
6d06779e CW |
114 | static inline bool __tasklet_is_scheduled(struct tasklet_struct *t) |
115 | { | |
116 | return test_bit(TASKLET_STATE_SCHED, &t->state); | |
117 | } | |
118 | ||
d501b1d2 | 119 | #endif /* __I915_GEM_H__ */ |