XenevaOS
Loading...
Searching...
No Matches
drm_gpuvm.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: GPL-2.0-only OR MIT */
2
3#ifndef __DRM_GPUVM_H__
4#define __DRM_GPUVM_H__
5
6/*
7 * Copyright (c) 2022 Red Hat.
8 *
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included in
17 * all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
23 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25 * OTHER DEALINGS IN THE SOFTWARE.
26 */
27
28#include <linux/dma-resv.h>
29#include <linux/list.h>
30#include <linux/llist.h>
31#include <linux/rbtree.h>
32#include <linux/types.h>
33
34#include <drm/drm_device.h>
35#include <drm/drm_gem.h>
36#include <drm/drm_exec.h>
37
38struct drm_gpuvm;
39struct drm_gpuvm_bo;
40struct drm_gpuvm_ops;
41
52
58 DRM_GPUVA_SPARSE = (1 << 1),
59
64};
65
74struct drm_gpuva {
78 struct drm_gpuvm *vm;
79
85
90
94 struct {
99
100 /*
101 * @range: the range
102 */
104 } va;
105
109 struct {
114
119
125
129 struct {
133 struct rb_node node;
134
142 struct list_head entry;
143
148 } rb;
149};
150
151int drm_gpuva_insert(struct drm_gpuvm *gpuvm, struct drm_gpuva *va);
153
154void drm_gpuva_link(struct drm_gpuva *va, struct drm_gpuvm_bo *vm_bo);
157
158struct drm_gpuva *drm_gpuva_find(struct drm_gpuvm *gpuvm,
159 u64 addr, u64 range);
161 u64 addr, u64 range);
162struct drm_gpuva *drm_gpuva_find_prev(struct drm_gpuvm *gpuvm, u64 start);
164
171static inline void drm_gpuva_invalidate(struct drm_gpuva *va, bool invalidate)
172{
173 if (invalidate)
174 va->flags |= DRM_GPUVA_INVALIDATED;
175 else
176 va->flags &= ~DRM_GPUVA_INVALIDATED;
177}
178
186static inline bool drm_gpuva_invalidated(struct drm_gpuva *va)
187{
188 return va->flags & DRM_GPUVA_INVALIDATED;
189}
190
216
229struct drm_gpuvm {
233 const char *name;
234
239
244
249
254
258 struct {
262 struct rb_root_cached tree;
263
268 } rb;
269
273 struct kref kref;
274
282
286 const struct drm_gpuvm_ops *ops;
287
292
296 struct {
301 struct list_head list;
302
308
314
318 struct {
323 struct list_head list;
324
329 struct list_head *local_list;
330
334 spinlock_t lock;
336
341};
342
343void drm_gpuvm_init(struct drm_gpuvm *gpuvm, const char *name,
345 struct drm_device *drm,
346 struct drm_gem_object *r_obj,
347 u64 start_offset, u64 range,
348 u64 reserve_offset, u64 reserve_range,
349 const struct drm_gpuvm_ops *ops);
350
360static inline struct drm_gpuvm *
361drm_gpuvm_get(struct drm_gpuvm *gpuvm)
362{
363 kref_get(&gpuvm->kref);
364
365 return gpuvm;
366}
367
368void drm_gpuvm_put(struct drm_gpuvm *gpuvm);
369
370bool drm_gpuvm_range_valid(struct drm_gpuvm *gpuvm, u64 addr, u64 range);
371bool drm_gpuvm_interval_empty(struct drm_gpuvm *gpuvm, u64 addr, u64 range);
372
373struct drm_gem_object *
375
383static inline bool
384drm_gpuvm_resv_protected(struct drm_gpuvm *gpuvm)
385{
386 return gpuvm->flags & DRM_GPUVM_RESV_PROTECTED;
387}
388
396static inline bool
397drm_gpuvm_immediate_mode(struct drm_gpuvm *gpuvm)
398{
399 return gpuvm->flags & DRM_GPUVM_IMMEDIATE_MODE;
400}
401
408#define drm_gpuvm_resv(gpuvm__) ((gpuvm__)->r_obj->resv)
409
418#define drm_gpuvm_resv_obj(gpuvm__) ((gpuvm__)->r_obj)
419
420#define drm_gpuvm_resv_held(gpuvm__) \
421 dma_resv_held(drm_gpuvm_resv(gpuvm__))
422
423#define drm_gpuvm_resv_assert_held(gpuvm__) \
424 dma_resv_assert_held(drm_gpuvm_resv(gpuvm__))
425
426#define drm_gpuvm_resv_held(gpuvm__) \
427 dma_resv_held(drm_gpuvm_resv(gpuvm__))
428
429#define drm_gpuvm_resv_assert_held(gpuvm__) \
430 dma_resv_assert_held(drm_gpuvm_resv(gpuvm__))
431
441static inline bool
442drm_gpuvm_is_extobj(struct drm_gpuvm *gpuvm,
443 struct drm_gem_object *obj)
444{
445 return obj && obj->resv != drm_gpuvm_resv(gpuvm);
446}
447
448static inline struct drm_gpuva *
449__drm_gpuva_next(struct drm_gpuva *va)
450{
451 if (va && !list_is_last(&va->rb.entry, &va->vm->rb.list))
452 return list_next_entry(va, rb.entry);
453
454 return NULL;
455}
456
473#define drm_gpuvm_for_each_va_range(va__, gpuvm__, start__, end__) \
474 for (va__ = drm_gpuva_find_first((gpuvm__), (start__), (end__) - (start__)); \
475 va__ && (va__->va.addr < (end__)); \
476 va__ = __drm_gpuva_next(va__))
477
496#define drm_gpuvm_for_each_va_range_safe(va__, next__, gpuvm__, start__, end__) \
497 for (va__ = drm_gpuva_find_first((gpuvm__), (start__), (end__) - (start__)), \
498 next__ = __drm_gpuva_next(va__); \
499 va__ && (va__->va.addr < (end__)); \
500 va__ = next__, next__ = __drm_gpuva_next(va__))
501
510#define drm_gpuvm_for_each_va(va__, gpuvm__) \
511 list_for_each_entry(va__, &(gpuvm__)->rb.list, rb.entry)
512
523#define drm_gpuvm_for_each_va_safe(va__, next__, gpuvm__) \
524 list_for_each_entry_safe(va__, next__, &(gpuvm__)->rb.list, rb.entry)
525
538
543
547 struct drm_gpuvm *vm;
548
553 unsigned int num_fences;
554
559 struct {
564 int (*fn)(struct drm_gpuvm_exec *vm_exec);
565
569 void *priv;
571};
572
574 struct drm_exec *exec,
575 unsigned int num_fences);
576
578 struct drm_exec *exec,
579 unsigned int num_fences);
580
582 struct drm_exec *exec,
583 u64 addr, u64 range,
584 unsigned int num_fences);
585
587
589 struct drm_gem_object **objs,
590 unsigned int num_objs);
591
593 u64 addr, u64 range);
594
604static inline void
605drm_gpuvm_exec_unlock(struct drm_gpuvm_exec *vm_exec)
606{
607 drm_exec_fini(&vm_exec->exec);
608}
609
610int drm_gpuvm_validate(struct drm_gpuvm *gpuvm, struct drm_exec *exec);
612 struct drm_exec *exec,
613 struct dma_fence *fence,
614 enum dma_resv_usage private_usage,
615 enum dma_resv_usage extobj_usage);
616
626static inline void
627drm_gpuvm_exec_resv_add_fence(struct drm_gpuvm_exec *vm_exec,
628 struct dma_fence *fence,
629 enum dma_resv_usage private_usage,
630 enum dma_resv_usage extobj_usage)
631{
632 drm_gpuvm_resv_add_fence(vm_exec->vm, &vm_exec->exec, fence,
633 private_usage, extobj_usage);
634}
635
644static inline int
645drm_gpuvm_exec_validate(struct drm_gpuvm_exec *vm_exec)
646{
647 return drm_gpuvm_validate(vm_exec->vm, &vm_exec->exec);
648}
649
671 struct drm_gpuvm *vm;
672
678
684
688 struct kref kref;
689
693 struct {
701
706 struct {
711 struct list_head gem;
712
717 struct list_head extobj;
718
723 struct list_head evict;
724
729 struct llist_node bo_defer;
732};
733
734struct drm_gpuvm_bo *
736 struct drm_gem_object *obj);
737
738struct drm_gpuvm_bo *
740 struct drm_gem_object *obj);
741struct drm_gpuvm_bo *
743
753static inline struct drm_gpuvm_bo *
754drm_gpuvm_bo_get(struct drm_gpuvm_bo *vm_bo)
755{
756 kref_get(&vm_bo->kref);
757 return vm_bo;
758}
759
760bool drm_gpuvm_bo_put(struct drm_gpuvm_bo *vm_bo);
761
764
765struct drm_gpuvm_bo *
767 struct drm_gem_object *obj);
768
769void drm_gpuvm_bo_evict(struct drm_gpuvm_bo *vm_bo, bool evict);
770
779static inline void
780drm_gpuvm_bo_gem_evict(struct drm_gem_object *obj, bool evict)
781{
782 struct drm_gpuvm_bo *vm_bo;
783
787 }
788}
789
791
802#define drm_gpuvm_bo_for_each_va(va__, vm_bo__) \
803 list_for_each_entry(va__, &(vm_bo)->list.gpuva, gem.entry)
804
818#define drm_gpuvm_bo_for_each_va_safe(va__, next__, vm_bo__) \
819 list_for_each_entry_safe(va__, next__, &(vm_bo)->list.gpuva, gem.entry)
820
852
864 struct {
869
874 } va;
875
879 struct {
884
890};
891
902 struct drm_gpuva *va;
903
914 bool keep;
915};
916
956
967 struct drm_gpuva *va;
968};
969
985
990
991 union {
996
1001
1006
1010 struct drm_gpuva_op_prefetch prefetch;
1011 };
1012};
1013
1022};
1023
1031#define drm_gpuva_for_each_op(op, ops) list_for_each_entry(op, &(ops)->list, entry)
1032
1042#define drm_gpuva_for_each_op_safe(op, next, ops) \
1043 list_for_each_entry_safe(op, next, &(ops)->list, entry)
1044
1053#define drm_gpuva_for_each_op_from_reverse(op, ops) \
1054 list_for_each_entry_from_reverse(op, &(ops)->list, entry)
1055
1063#define drm_gpuva_for_each_op_reverse(op, ops) \
1064 list_for_each_entry_reverse(op, &(ops)->list, entry)
1065
1070#define drm_gpuva_first_op(ops) \
1071 list_first_entry(&(ops)->list, struct drm_gpuva_op, entry)
1072
1077#define drm_gpuva_last_op(ops) \
1078 list_last_entry(&(ops)->list, struct drm_gpuva_op, entry)
1079
1084#define drm_gpuva_prev_op(op) list_prev_entry(op, entry)
1085
1090#define drm_gpuva_next_op(op) list_next_entry(op, entry)
1091
1101
1102struct drm_gpuva_ops *
1104 const struct drm_gpuvm_map_req *req);
1105struct drm_gpuva_ops *
1107 const struct drm_gpuvm_map_req *req);
1108
1109struct drm_gpuva_ops *
1111 u64 addr, u64 range);
1112
1113struct drm_gpuva_ops *
1115 u64 addr, u64 range);
1116
1117struct drm_gpuva_ops *
1119
1121 struct drm_gpuva_ops *ops);
1122
1123static inline void drm_gpuva_init_from_op(struct drm_gpuva *va,
1124 const struct drm_gpuva_op_map *op)
1125{
1126 va->va.addr = op->va.addr;
1127 va->va.range = op->va.range;
1128 va->gem.obj = op->gem.obj;
1129 va->gem.offset = op->gem.offset;
1130}
1131
1146 void (*vm_free)(struct drm_gpuvm *gpuvm);
1147
1158 struct drm_gpuva_op *(*op_alloc)(void);
1159
1170 void (*op_free)(struct drm_gpuva_op *op);
1171
1182 struct drm_gpuvm_bo *(*vm_bo_alloc)(void);
1183
1194 void (*vm_bo_free)(struct drm_gpuvm_bo *vm_bo);
1195
1205 int (*vm_bo_validate)(struct drm_gpuvm_bo *vm_bo,
1206 struct drm_exec *exec);
1207
1217 int (*sm_step_map)(struct drm_gpuva_op *op, void *priv);
1218
1234 int (*sm_step_remap)(struct drm_gpuva_op *op, void *priv);
1235
1250 int (*sm_step_unmap)(struct drm_gpuva_op *op, void *priv);
1251};
1252
1253int drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm, void *priv,
1254 const struct drm_gpuvm_map_req *req);
1255
1256int drm_gpuvm_sm_unmap(struct drm_gpuvm *gpuvm, void *priv,
1257 u64 addr, u64 range);
1258
1260 struct drm_exec *exec, unsigned int num_fences,
1261 struct drm_gpuvm_map_req *req);
1262
1263int drm_gpuvm_sm_unmap_exec_lock(struct drm_gpuvm *gpuvm, struct drm_exec *exec,
1264 u64 req_addr, u64 req_range);
1265
1266void drm_gpuva_map(struct drm_gpuvm *gpuvm,
1267 struct drm_gpuva *va,
1268 const struct drm_gpuva_op_map *op);
1269
1270void drm_gpuva_remap(struct drm_gpuva *prev,
1271 struct drm_gpuva *next,
1272 const struct drm_gpuva_op_remap *op);
1273
1275
1287static inline void
1288drm_gpuva_op_remap_to_unmap_range(const struct drm_gpuva_op_remap *op,
1289 u64 *start_addr, u64 *range)
1290{
1291 const u64 va_start = op->prev ?
1292 op->prev->va.addr + op->prev->va.range :
1293 op->unmap->va->va.addr;
1294 const u64 va_end = op->next ?
1295 op->next->va.addr :
1296 op->unmap->va->va.addr + op->unmap->va->va.range;
1297
1298 if (start_addr)
1299 *start_addr = va_start;
1300 if (range)
1301 *range = va_end - va_start;
1302}
1303
1304#endif /* __DRM_GPUVM_H__ */
#define list_next_entry(pos, member)
Definition list.h:27
uint8_t flags
Definition virtio.h:0
XEProcessList * list
Definition main.cpp:27
#define va_end(ap)
Definition acmsvcex.h:198
#define va_start(ap, A)
Definition acmsvcex.h:199
#define NULL
Definition actypes.h:561
void * fn
Definition audrv.c:980
#define BIT(nr)
Definition bitops.h:112
int map
Definition d_mode.c:31
dma_resv_usage
Definition dma-resv.h:71
struct drm_crtc struct drm_plane struct drm_plane const struct drm_crtc_funcs const char * name
Definition drm_crtc.h:1242
void drm_exec_fini(struct drm_exec *exec)
#define drm_gem_for_each_gpuvm_bo(entry__, obj__)
Definition drm_gem.h:682
#define drm_gem_gpuva_assert_lock_held(gpuvm, obj)
Definition drm_gem.h:655
int drm_gpuvm_sm_map_exec_lock(struct drm_gpuvm *gpuvm, struct drm_exec *exec, unsigned int num_fences, struct drm_gpuvm_map_req *req)
int drm_gpuva_insert(struct drm_gpuvm *gpuvm, struct drm_gpuva *va)
struct drm_gpuva * drm_gpuva_find_prev(struct drm_gpuvm *gpuvm, u64 start)
struct drm_gpuvm_bo * drm_gpuvm_bo_obtain_locked(struct drm_gpuvm *gpuvm, struct drm_gem_object *obj)
bool drm_gpuvm_bo_put(struct drm_gpuvm_bo *vm_bo)
int drm_gpuvm_prepare_vm(struct drm_gpuvm *gpuvm, struct drm_exec *exec, unsigned int num_fences)
void drm_gpuvm_bo_extobj_add(struct drm_gpuvm_bo *vm_bo)
struct drm_gpuvm_bo * drm_gpuvm_bo_obtain_prealloc(struct drm_gpuvm_bo *vm_bo)
void drm_gpuva_unmap(const struct drm_gpuva_op_unmap *op)
int drm_gpuvm_validate(struct drm_gpuvm *gpuvm, struct drm_exec *exec)
int drm_gpuvm_prepare_range(struct drm_gpuvm *gpuvm, struct drm_exec *exec, u64 addr, u64 range, unsigned int num_fences)
int drm_gpuvm_exec_lock(struct drm_gpuvm_exec *vm_exec)
struct drm_gpuva * drm_gpuva_find_first(struct drm_gpuvm *gpuvm, u64 addr, u64 range)
void drm_gpuvm_resv_add_fence(struct drm_gpuvm *gpuvm, struct drm_exec *exec, struct dma_fence *fence, enum dma_resv_usage private_usage, enum dma_resv_usage extobj_usage)
void drm_gpuva_map(struct drm_gpuvm *gpuvm, struct drm_gpuva *va, const struct drm_gpuva_op_map *op)
void drm_gpuva_link(struct drm_gpuva *va, struct drm_gpuvm_bo *vm_bo)
void drm_gpuva_unlink_defer(struct drm_gpuva *va)
void drm_gpuva_remap(struct drm_gpuva *prev, struct drm_gpuva *next, const struct drm_gpuva_op_remap *op)
drm_gpuvm_flags
Definition drm_gpuvm.h:194
@ DRM_GPUVM_IMMEDIATE_MODE
Definition drm_gpuvm.h:209
@ DRM_GPUVM_RESV_PROTECTED
Definition drm_gpuvm.h:199
@ DRM_GPUVM_USERBITS
Definition drm_gpuvm.h:214
int drm_gpuvm_exec_lock_array(struct drm_gpuvm_exec *vm_exec, struct drm_gem_object **objs, unsigned int num_objs)
struct drm_gpuva_ops * drm_gpuvm_bo_unmap_ops_create(struct drm_gpuvm_bo *vm_bo)
bool drm_gpuvm_range_valid(struct drm_gpuvm *gpuvm, u64 addr, u64 range)
void drm_gpuvm_put(struct drm_gpuvm *gpuvm)
struct drm_gpuva * drm_gpuva_find_next(struct drm_gpuvm *gpuvm, u64 end)
void drm_gpuva_ops_free(struct drm_gpuvm *gpuvm, struct drm_gpuva_ops *ops)
int drm_gpuvm_prepare_objects(struct drm_gpuvm *gpuvm, struct drm_exec *exec, unsigned int num_fences)
void drm_gpuvm_bo_deferred_cleanup(struct drm_gpuvm *gpuvm)
struct drm_gpuva * drm_gpuva_find(struct drm_gpuvm *gpuvm, u64 addr, u64 range)
void drm_gpuvm_init(struct drm_gpuvm *gpuvm, const char *name, enum drm_gpuvm_flags flags, struct drm_device *drm, struct drm_gem_object *r_obj, u64 start_offset, u64 range, u64 reserve_offset, u64 reserve_range, const struct drm_gpuvm_ops *ops)
struct drm_gpuva_ops * drm_gpuvm_madvise_ops_create(struct drm_gpuvm *gpuvm, const struct drm_gpuvm_map_req *req)
int drm_gpuvm_exec_lock_range(struct drm_gpuvm_exec *vm_exec, u64 addr, u64 range)
void drm_gpuva_remove(struct drm_gpuva *va)
int drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm, void *priv, const struct drm_gpuvm_map_req *req)
struct drm_gpuvm_bo * drm_gpuvm_bo_create(struct drm_gpuvm *gpuvm, struct drm_gem_object *obj)
bool drm_gpuvm_bo_put_deferred(struct drm_gpuvm_bo *vm_bo)
struct drm_gpuvm_bo * drm_gpuvm_bo_find(struct drm_gpuvm *gpuvm, struct drm_gem_object *obj)
int drm_gpuvm_sm_unmap(struct drm_gpuvm *gpuvm, void *priv, u64 addr, u64 range)
int drm_gpuvm_sm_unmap_exec_lock(struct drm_gpuvm *gpuvm, struct drm_exec *exec, u64 req_addr, u64 req_range)
drm_gpuva_flags
Definition drm_gpuvm.h:45
@ DRM_GPUVA_USERBITS
Definition drm_gpuvm.h:63
@ DRM_GPUVA_SPARSE
Definition drm_gpuvm.h:58
@ DRM_GPUVA_INVALIDATED
Definition drm_gpuvm.h:51
struct drm_gpuva_ops * drm_gpuvm_prefetch_ops_create(struct drm_gpuvm *gpuvm, u64 addr, u64 range)
#define drm_gpuvm_resv(gpuvm__)
Definition drm_gpuvm.h:408
struct drm_gpuva_ops * drm_gpuvm_sm_unmap_ops_create(struct drm_gpuvm *gpuvm, u64 addr, u64 range)
struct drm_gpuva_ops * drm_gpuvm_sm_map_ops_create(struct drm_gpuvm *gpuvm, const struct drm_gpuvm_map_req *req)
void drm_gpuvm_bo_evict(struct drm_gpuvm_bo *vm_bo, bool evict)
bool drm_gpuvm_interval_empty(struct drm_gpuvm *gpuvm, u64 addr, u64 range)
drm_gpuva_op_type
Definition drm_gpuvm.h:826
@ DRM_GPUVA_OP_PREFETCH
Definition drm_gpuvm.h:845
@ DRM_GPUVA_OP_REMAP
Definition drm_gpuvm.h:835
@ DRM_GPUVA_OP_MAP
Definition drm_gpuvm.h:830
@ DRM_GPUVA_OP_DRIVER
Definition drm_gpuvm.h:850
@ DRM_GPUVA_OP_UNMAP
Definition drm_gpuvm.h:840
struct drm_gem_object * drm_gpuvm_resv_object_alloc(struct drm_device *drm)
void drm_gpuva_unlink(struct drm_gpuva *va)
const char va_list * va
Definition drm_print.h:222
void int node
Definition kthread.h:31
uint64_t u64
Definition kernel.h:17
int spinlock_t
Definition kernel.h:44
uint32_t u32
Definition kernel.h:16
char end[]
void(* entry)(void *)
Definition process.h:101
Definition dma-fence.h:70
Definition drm_device.h:75
Definition drm_exec.h:23
Definition drm_gem.h:277
struct dma_resv * resv
Definition drm_gem.h:386
Definition drm_gpuvm.h:859
u64 addr
Definition drm_gpuvm.h:868
struct drm_gpuva_op_map::@45 gem
u64 range
Definition drm_gpuvm.h:873
struct drm_gpuva_op_map::@44 va
u64 offset
Definition drm_gpuvm.h:883
struct drm_gem_object * obj
Definition drm_gpuvm.h:888
Definition drm_gpuvm.h:963
struct drm_gpuva * va
Definition drm_gpuvm.h:967
Definition drm_gpuvm.h:940
struct drm_gpuva_op_map * next
Definition drm_gpuvm.h:949
struct drm_gpuva_op_map * prev
Definition drm_gpuvm.h:944
struct drm_gpuva_op_unmap * unmap
Definition drm_gpuvm.h:954
Definition drm_gpuvm.h:898
struct drm_gpuva * va
Definition drm_gpuvm.h:902
bool keep
Definition drm_gpuvm.h:914
Definition drm_gpuvm.h:977
struct list_head entry
Definition drm_gpuvm.h:984
enum drm_gpuva_op_type op
Definition drm_gpuvm.h:989
Definition drm_gpuvm.h:1017
struct list_head list
Definition drm_gpuvm.h:1021
Definition drm_gpuvm.h:74
struct list_head entry
Definition drm_gpuvm.h:123
struct drm_gem_object * obj
Definition drm_gpuvm.h:118
struct drm_gpuva::@36 gem
struct drm_gpuva::@35 va
u64 addr
Definition drm_gpuvm.h:98
u64 range
Definition drm_gpuvm.h:103
u64 __subtree_last
Definition drm_gpuvm.h:147
struct drm_gpuva::@37 rb
u64 offset
Definition drm_gpuvm.h:113
struct drm_gpuvm_bo * vm_bo
Definition drm_gpuvm.h:84
struct drm_gpuvm * vm
Definition drm_gpuvm.h:78
enum drm_gpuva_flags flags
Definition drm_gpuvm.h:89
Definition drm_gpuvm.h:666
struct drm_gpuvm * vm
Definition drm_gpuvm.h:671
struct list_head evict
Definition drm_gpuvm.h:723
bool evicted
Definition drm_gpuvm.h:683
struct kref kref
Definition drm_gpuvm.h:688
struct drm_gpuvm_bo::@42::@43 entry
struct drm_gpuvm_bo::@42 list
struct drm_gem_object * obj
Definition drm_gpuvm.h:677
struct list_head gpuva
Definition drm_gpuvm.h:700
Definition drm_gpuvm.h:533
struct drm_exec exec
Definition drm_gpuvm.h:537
struct drm_gpuvm * vm
Definition drm_gpuvm.h:547
unsigned int num_fences
Definition drm_gpuvm.h:553
void * priv
Definition drm_gpuvm.h:569
struct drm_gpuvm_exec::@41 extra
u32 flags
Definition drm_gpuvm.h:542
Definition drm_gpuvm.h:1095
struct drm_gpuva_op_map map
Definition drm_gpuvm.h:1099
Definition drm_gpuvm.h:1139
int(* sm_step_map)(struct drm_gpuva_op *op, void *priv)
Definition drm_gpuvm.h:1217
int(* vm_bo_validate)(struct drm_gpuvm_bo *vm_bo, struct drm_exec *exec)
Definition drm_gpuvm.h:1205
void(* vm_bo_free)(struct drm_gpuvm_bo *vm_bo)
Definition drm_gpuvm.h:1194
int(* sm_step_unmap)(struct drm_gpuva_op *op, void *priv)
Definition drm_gpuvm.h:1250
void(* op_free)(struct drm_gpuva_op *op)
Definition drm_gpuvm.h:1170
void(* vm_free)(struct drm_gpuvm *gpuvm)
Definition drm_gpuvm.h:1146
int(* sm_step_remap)(struct drm_gpuva_op *op, void *priv)
Definition drm_gpuvm.h:1234
Definition drm_gpuvm.h:229
enum drm_gpuvm_flags flags
Definition drm_gpuvm.h:238
const struct drm_gpuvm_ops * ops
Definition drm_gpuvm.h:286
struct drm_gpuva kernel_alloc_node
Definition drm_gpuvm.h:281
u64 mm_range
Definition drm_gpuvm.h:253
spinlock_t lock
Definition drm_gpuvm.h:312
const char * name
Definition drm_gpuvm.h:233
struct list_head * local_list
Definition drm_gpuvm.h:307
struct kref kref
Definition drm_gpuvm.h:273
struct drm_gpuvm::@38 rb
struct drm_gpuvm::@39 extobj
struct drm_gpuvm::@40 evict
struct drm_gem_object * r_obj
Definition drm_gpuvm.h:291
u64 mm_start
Definition drm_gpuvm.h:248
struct llist_head bo_defer
Definition drm_gpuvm.h:340
struct drm_device * drm
Definition drm_gpuvm.h:243
Definition kref.h:44
Definition list.h:11
Definition llist.h:46
Definition llist.h:42
Definition rbtree_types.h:21
Definition rbtree_types.h:48