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 | |
e4d2006f CW |
31 | struct drm_i915_private; |
32 | ||
d501b1d2 | 33 | #ifdef CONFIG_DRM_I915_DEBUG_GEM |
7f961d79 CW |
34 | |
35 | #define GEM_SHOW_DEBUG() (drm_debug & DRM_UT_DRIVER) | |
36 | ||
d5653ec3 | 37 | #define GEM_BUG_ON(condition) do { if (unlikely((condition))) { \ |
128326a1 CW |
38 | pr_err("%s:%d GEM_BUG_ON(%s)\n", \ |
39 | __func__, __LINE__, __stringify(condition)); \ | |
40 | GEM_TRACE("%s:%d GEM_BUG_ON(%s)\n", \ | |
41 | __func__, __LINE__, __stringify(condition)); \ | |
d5653ec3 MK |
42 | BUG(); \ |
43 | } \ | |
44 | } while(0) | |
17cfde60 | 45 | #define GEM_WARN_ON(expr) WARN_ON(expr) |
eca56a35 | 46 | |
ae9a043b CW |
47 | #define GEM_DEBUG_DECL(var) var |
48 | #define GEM_DEBUG_EXEC(expr) expr | |
49 | #define GEM_DEBUG_BUG_ON(expr) GEM_BUG_ON(expr) | |
bbb8a9d7 | 50 | #define GEM_DEBUG_WARN_ON(expr) GEM_WARN_ON(expr) |
eca56a35 | 51 | |
d501b1d2 | 52 | #else |
7f961d79 CW |
53 | |
54 | #define GEM_SHOW_DEBUG() (0) | |
55 | ||
4cfa20c8 | 56 | #define GEM_BUG_ON(expr) BUILD_BUG_ON_INVALID(expr) |
bbb8a9d7 | 57 | #define GEM_WARN_ON(expr) ({ unlikely(!!(expr)); }) |
eca56a35 | 58 | |
ae9a043b CW |
59 | #define GEM_DEBUG_DECL(var) |
60 | #define GEM_DEBUG_EXEC(expr) do { } while (0) | |
61 | #define GEM_DEBUG_BUG_ON(expr) | |
bbb8a9d7 | 62 | #define GEM_DEBUG_WARN_ON(expr) ({ BUILD_BUG_ON_INVALID(expr); 0; }) |
d501b1d2 CW |
63 | #endif |
64 | ||
bccd3b83 CW |
65 | #if IS_ENABLED(CONFIG_DRM_I915_TRACE_GEM) |
66 | #define GEM_TRACE(...) trace_printk(__VA_ARGS__) | |
629820fc | 67 | #define GEM_TRACE_DUMP() ftrace_dump(DUMP_ALL) |
09a4c02e CW |
68 | #define GEM_TRACE_DUMP_ON(expr) \ |
69 | do { if (expr) ftrace_dump(DUMP_ALL); } while (0) | |
bccd3b83 CW |
70 | #else |
71 | #define GEM_TRACE(...) do { } while (0) | |
629820fc | 72 | #define GEM_TRACE_DUMP() do { } while (0) |
09a4c02e | 73 | #define GEM_TRACE_DUMP_ON(expr) BUILD_BUG_ON_INVALID(expr) |
bccd3b83 CW |
74 | #endif |
75 | ||
3d606249 CW |
76 | #define I915_GEM_IDLE_TIMEOUT (HZ / 5) |
77 | ||
f351d087 CW |
78 | static inline void __tasklet_disable_sync_once(struct tasklet_struct *t) |
79 | { | |
41a1bde3 | 80 | if (!atomic_fetch_inc(&t->count)) |
f351d087 CW |
81 | tasklet_unlock_wait(t); |
82 | } | |
83 | ||
9512f985 CW |
84 | static inline bool __tasklet_is_enabled(const struct tasklet_struct *t) |
85 | { | |
86 | return !atomic_read(&t->count); | |
87 | } | |
88 | ||
41a1bde3 CW |
89 | static inline bool __tasklet_enable(struct tasklet_struct *t) |
90 | { | |
91 | return atomic_dec_and_test(&t->count); | |
92 | } | |
93 | ||
6d06779e CW |
94 | static inline bool __tasklet_is_scheduled(struct tasklet_struct *t) |
95 | { | |
96 | return test_bit(TASKLET_STATE_SCHED, &t->state); | |
97 | } | |
98 | ||
d501b1d2 | 99 | #endif /* __I915_GEM_H__ */ |