XenevaOS
Loading...
Searching...
No Matches
drm_exec.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: GPL-2.0 OR MIT */
2
3#ifndef __DRM_EXEC_H__
4#define __DRM_EXEC_H__
5
6#include <linux/compiler.h>
7#include <linux/ww_mutex.h>
8
9#define DRM_EXEC_INTERRUPTIBLE_WAIT BIT(0)
10#define DRM_EXEC_IGNORE_DUPLICATES BIT(1)
11
12/*
13 * Dummy value used to initially enter the retry loop.
14 * internal use only.
15 */
16#define DRM_EXEC_DUMMY ((void *)~0)
17
18struct drm_gem_object;
19
23struct drm_exec {
28
32 struct ww_acquire_ctx ticket;
33
37 unsigned int num_objects;
38
42 unsigned int max_objects;
43
48
53
58};
59
68static inline struct drm_gem_object *
69drm_exec_obj(struct drm_exec *exec, unsigned long index)
70{
71 return index < exec->num_objects ? exec->objects[index] : NULL;
72}
73
74/* Helper for drm_exec_for_each_locked_object(). Internal use only. */
75#define __drm_exec_for_each_locked_object(exec, obj, __index) \
76 for (unsigned long __index = 0; ((obj) = drm_exec_obj(exec, __index)); ++__index)
84#define drm_exec_for_each_locked_object(exec, obj) \
85 __drm_exec_for_each_locked_object(exec, obj, __UNIQUE_ID(drm_exec))
86
87/* Helper for drm_exec_for_each_locked_object_reverse(). Internal use only. */
88#define __drm_exec_for_each_locked_object_reverse(exec, obj, __index) \
89 for (unsigned long __index = (exec)->num_objects - 1; \
90 ((obj) = drm_exec_obj(exec, __index)); --__index)
101#define drm_exec_for_each_locked_object_reverse(exec, obj) \
102 __drm_exec_for_each_locked_object_reverse(exec, obj, __UNIQUE_ID(drm_exec))
103
116#define drm_exec_until_all_locked(exec) \
117 for (bool const __maybe_unused __drm_exec_loop = false; \
118 drm_exec_cleanup(exec);) \
119 if (false) { \
120drm_exec_retry: __maybe_unused; \
121 continue; \
122 } else
123
133#define drm_exec_retry_on_contention(exec) \
134 do { \
135 if (unlikely(drm_exec_is_contended(exec))) \
136 goto drm_exec_retry; \
137 } while (__drm_exec_loop)
138
146static inline bool drm_exec_is_contended(struct drm_exec *exec)
147{
148 return !!exec->contended;
149}
150
160#define drm_exec_retry(_exec) \
161 do { \
162 WARN_ON((_exec)->contended != DRM_EXEC_DUMMY); \
163 goto drm_exec_retry; \
164 } while (__drm_exec_loop)
165
172static inline struct ww_acquire_ctx *drm_exec_ticket(struct drm_exec *exec)
173{
174 return &exec->ticket;
175}
176
177void drm_exec_init(struct drm_exec *exec, u32 flags, unsigned nr);
178void drm_exec_fini(struct drm_exec *exec);
179bool drm_exec_cleanup(struct drm_exec *exec);
180int drm_exec_lock_obj(struct drm_exec *exec, struct drm_gem_object *obj);
181void drm_exec_unlock_obj(struct drm_exec *exec, struct drm_gem_object *obj);
182int drm_exec_prepare_obj(struct drm_exec *exec, struct drm_gem_object *obj,
183 unsigned int num_fences);
185 struct drm_gem_object **objects,
186 unsigned int num_objects,
187 unsigned int num_fences);
188
189#endif
uint8_t flags
Definition virtio.h:0
#define index(str, chr)
Definition string.h:66
#define NULL
Definition actypes.h:561
void drm_exec_init(struct drm_exec *exec, u32 flags, unsigned nr)
int drm_exec_lock_obj(struct drm_exec *exec, struct drm_gem_object *obj)
void drm_exec_unlock_obj(struct drm_exec *exec, struct drm_gem_object *obj)
bool drm_exec_cleanup(struct drm_exec *exec)
int drm_exec_prepare_array(struct drm_exec *exec, struct drm_gem_object **objects, unsigned int num_objects, unsigned int num_fences)
int drm_exec_prepare_obj(struct drm_exec *exec, struct drm_gem_object *obj, unsigned int num_fences)
void drm_exec_fini(struct drm_exec *exec)
uint32_t u32
Definition kernel.h:16
Definition drm_exec.h:23
struct drm_gem_object * contended
Definition drm_exec.h:52
unsigned int num_objects
Definition drm_exec.h:37
unsigned int max_objects
Definition drm_exec.h:42
struct ww_acquire_ctx ticket
Definition drm_exec.h:32
u32 flags
Definition drm_exec.h:27
struct drm_gem_object * prelocked
Definition drm_exec.h:57
struct drm_gem_object ** objects
Definition drm_exec.h:47
Definition drm_gem.h:277