XenevaOS
Loading...
Searching...
No Matches
drm_gpusvm.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: GPL-2.0-only OR MIT */
2/*
3 * Copyright © 2024 Intel Corporation
4 */
5
6#ifndef __DRM_GPUSVM_H__
7#define __DRM_GPUSVM_H__
8
9#include <linux/dma-mapping.h>
10#include <linux/kref.h>
11#include <linux/interval_tree.h>
12#include <linux/mmu_notifier.h>
13
14struct dev_pagemap_ops;
15struct drm_device;
16struct drm_gpusvm;
18struct drm_gpusvm_ops;
19struct drm_gpusvm_range;
20struct drm_pagemap;
21struct drm_pagemap_addr;
22
38 struct drm_gpusvm_notifier *(*notifier_alloc)(void);
39
46 void (*notifier_free)(struct drm_gpusvm_notifier *notifier);
47
56 struct drm_gpusvm_range *(*range_alloc)(struct drm_gpusvm *gpusvm);
57
64 void (*range_free)(struct drm_gpusvm_range *range);
65
75 void (*invalidate)(struct drm_gpusvm *gpusvm,
76 struct drm_gpusvm_notifier *notifier,
77 const struct mmu_notifier_range *mmu_range);
78};
79
99 struct mmu_interval_notifier notifier;
104 struct {
107};
108
120 union {
121 struct {
122 /* All flags below must be set upon creation */
124 /* All flags below must be set / cleared under notifier lock */
129 };
131 };
132};
133
148 struct dma_iova_state state;
149 unsigned long state_offset;
150 unsigned long notifier_seq;
152};
153
175
203 const char *name;
205 struct mm_struct *mm;
206 unsigned long mm_start;
207 unsigned long mm_range;
208 unsigned long notifier_size;
209 const struct drm_gpusvm_ops *ops;
210 const unsigned long *chunk_sizes;
215#ifdef CONFIG_LOCKDEP
220 struct lockdep_map *lock_dep_map;
221#endif
222};
223
247 unsigned long timeslice_ms;
248 unsigned int in_notifier :1;
249 unsigned int read_only :1;
250 unsigned int devmem_possible :1;
251 unsigned int devmem_only :1;
252 unsigned int allow_mixed :1;
253};
254
255int drm_gpusvm_init(struct drm_gpusvm *gpusvm,
256 const char *name, struct drm_device *drm,
257 struct mm_struct *mm,
258 unsigned long mm_start, unsigned long mm_range,
259 unsigned long notifier_size,
260 const struct drm_gpusvm_ops *ops,
261 const unsigned long *chunk_sizes, int num_chunks);
262
263void drm_gpusvm_fini(struct drm_gpusvm *gpusvm);
264
265void drm_gpusvm_free(struct drm_gpusvm *gpusvm);
266
267unsigned long
269 unsigned long start,
270 unsigned long end);
271
272struct drm_gpusvm_range *
274 unsigned long fault_addr,
275 unsigned long gpuva_start,
276 unsigned long gpuva_end,
277 const struct drm_gpusvm_ctx *ctx);
278
280 struct drm_gpusvm_range *range);
281
283 struct drm_gpusvm_range *range);
284
285struct drm_gpusvm_range *
287
289
291 struct drm_gpusvm_range *range);
292
294 struct drm_gpusvm_range *range,
295 const struct drm_gpusvm_ctx *ctx);
296
298 struct drm_gpusvm_range *range,
299 const struct drm_gpusvm_ctx *ctx);
300
301bool drm_gpusvm_has_mapping(struct drm_gpusvm *gpusvm, unsigned long start,
302 unsigned long end);
303
304struct drm_gpusvm_notifier *
305drm_gpusvm_notifier_find(struct drm_gpusvm *gpusvm, unsigned long start,
306 unsigned long end);
307
308struct drm_gpusvm_range *
310 unsigned long end);
311
313 const struct mmu_notifier_range *mmu_range);
314
316 struct drm_gpusvm_pages *svm_pages,
317 struct mm_struct *mm,
318 struct mmu_interval_notifier *notifier,
319 unsigned long pages_start, unsigned long pages_end,
320 const struct drm_gpusvm_ctx *ctx);
321
323 struct drm_gpusvm_pages *svm_pages,
324 unsigned long npages,
325 const struct drm_gpusvm_ctx *ctx);
326
328 struct drm_gpusvm_pages *svm_pages,
329 unsigned long npages);
330
355
357 void *dev_private_owner,
358 const struct dev_pagemap *pagemap);
359
360#ifdef CONFIG_LOCKDEP
370#define drm_gpusvm_driver_set_lock(gpusvm, lock) \
371 do { \
372 if (!WARN((gpusvm)->lock_dep_map, \
373 "GPUSVM range lock should be set only once."))\
374 (gpusvm)->lock_dep_map = &(lock)->dep_map; \
375 } while (0)
376#else
377#define drm_gpusvm_driver_set_lock(gpusvm, lock) do {} while (0)
378#endif
379
386#define drm_gpusvm_notifier_lock(gpusvm__) \
387 down_read(&(gpusvm__)->notifier_lock)
388
395#define drm_gpusvm_notifier_unlock(gpusvm__) \
396 up_read(&(gpusvm__)->notifier_lock)
397
404static inline unsigned long
405drm_gpusvm_range_start(struct drm_gpusvm_range *range)
406{
407 return range->itree.start;
408}
409
416static inline unsigned long
417drm_gpusvm_range_end(struct drm_gpusvm_range *range)
418{
419 return range->itree.last + 1;
420}
421
428static inline unsigned long
429drm_gpusvm_range_size(struct drm_gpusvm_range *range)
430{
431 return drm_gpusvm_range_end(range) - drm_gpusvm_range_start(range);
432}
433
440static inline unsigned long
441drm_gpusvm_notifier_start(struct drm_gpusvm_notifier *notifier)
442{
443 return notifier->itree.start;
444}
445
452static inline unsigned long
453drm_gpusvm_notifier_end(struct drm_gpusvm_notifier *notifier)
454{
455 return notifier->itree.last + 1;
456}
457
464static inline unsigned long
465drm_gpusvm_notifier_size(struct drm_gpusvm_notifier *notifier)
466{
467 return drm_gpusvm_notifier_end(notifier) -
468 drm_gpusvm_notifier_start(notifier);
469}
470
478static inline struct drm_gpusvm_range *
479__drm_gpusvm_range_next(struct drm_gpusvm_range *range)
480{
481 if (range && !list_is_last(&range->entry,
482 &range->notifier->range_list))
483 return list_next_entry(range, entry);
484
485 return NULL;
486}
487
499#define drm_gpusvm_for_each_range(range__, notifier__, start__, end__) \
500 for ((range__) = (range__) ?: \
501 drm_gpusvm_range_find((notifier__), (start__), (end__)); \
502 (range__) && (drm_gpusvm_range_start(range__) < (end__)); \
503 (range__) = __drm_gpusvm_range_next(range__))
504
516#define drm_gpusvm_for_each_range_safe(range__, next__, notifier__, start__, end__) \
517 for ((range__) = drm_gpusvm_range_find((notifier__), (start__), (end__)), \
518 (next__) = __drm_gpusvm_range_next(range__); \
519 (range__) && (drm_gpusvm_range_start(range__) < (end__)); \
520 (range__) = (next__), (next__) = __drm_gpusvm_range_next(range__))
521
530static inline struct drm_gpusvm_notifier *
531__drm_gpusvm_notifier_next(struct drm_gpusvm_notifier *notifier)
532{
533 if (notifier && !list_is_last(&notifier->entry,
534 &notifier->gpusvm->notifier_list))
536
537 return NULL;
538}
539
549#define drm_gpusvm_for_each_notifier(notifier__, gpusvm__, start__, end__) \
550 for ((notifier__) = drm_gpusvm_notifier_find((gpusvm__), (start__), (end__)); \
551 (notifier__) && (drm_gpusvm_notifier_start(notifier__) < (end__)); \
552 (notifier__) = __drm_gpusvm_notifier_next(notifier__))
553
565#define drm_gpusvm_for_each_notifier_safe(notifier__, next__, gpusvm__, start__, end__) \
566 for ((notifier__) = drm_gpusvm_notifier_find((gpusvm__), (start__), (end__)), \
567 (next__) = __drm_gpusvm_notifier_next(notifier__); \
568 (notifier__) && (drm_gpusvm_notifier_start(notifier__) < (end__)); \
569 (notifier__) = (next__), (next__) = __drm_gpusvm_notifier_next(notifier__))
570
571#endif /* __DRM_GPUSVM_H__ */
#define list_next_entry(pos, member)
Definition list.h:27
#define NULL
Definition actypes.h:561
struct drm_crtc struct drm_plane struct drm_plane const struct drm_crtc_funcs const char * name
Definition drm_crtc.h:1242
enum drm_gpusvm_scan_result drm_gpusvm_scan_mm(struct drm_gpusvm_range *range, void *dev_private_owner, const struct dev_pagemap *pagemap)
int drm_gpusvm_init(struct drm_gpusvm *gpusvm, const char *name, struct drm_device *drm, struct mm_struct *mm, unsigned long mm_start, unsigned long mm_range, unsigned long notifier_size, const struct drm_gpusvm_ops *ops, const unsigned long *chunk_sizes, int num_chunks)
bool drm_gpusvm_has_mapping(struct drm_gpusvm *gpusvm, unsigned long start, unsigned long end)
void drm_gpusvm_range_remove(struct drm_gpusvm *gpusvm, struct drm_gpusvm_range *range)
void drm_gpusvm_range_set_unmapped(struct drm_gpusvm_range *range, const struct mmu_notifier_range *mmu_range)
int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm, struct drm_gpusvm_pages *svm_pages, struct mm_struct *mm, struct mmu_interval_notifier *notifier, unsigned long pages_start, unsigned long pages_end, const struct drm_gpusvm_ctx *ctx)
struct drm_gpusvm_notifier * drm_gpusvm_notifier_find(struct drm_gpusvm *gpusvm, unsigned long start, unsigned long end)
struct drm_gpusvm_range * drm_gpusvm_range_get(struct drm_gpusvm_range *range)
bool drm_gpusvm_range_pages_valid(struct drm_gpusvm *gpusvm, struct drm_gpusvm_range *range)
void drm_gpusvm_range_unmap_pages(struct drm_gpusvm *gpusvm, struct drm_gpusvm_range *range, const struct drm_gpusvm_ctx *ctx)
void drm_gpusvm_fini(struct drm_gpusvm *gpusvm)
struct drm_gpusvm_range * drm_gpusvm_range_find_or_insert(struct drm_gpusvm *gpusvm, unsigned long fault_addr, unsigned long gpuva_start, unsigned long gpuva_end, const struct drm_gpusvm_ctx *ctx)
void drm_gpusvm_range_put(struct drm_gpusvm_range *range)
struct drm_gpusvm_range * drm_gpusvm_range_find(struct drm_gpusvm_notifier *notifier, unsigned long start, unsigned long end)
void drm_gpusvm_free_pages(struct drm_gpusvm *gpusvm, struct drm_gpusvm_pages *svm_pages, unsigned long npages)
void drm_gpusvm_free(struct drm_gpusvm *gpusvm)
drm_gpusvm_scan_result
Definition drm_gpusvm.h:347
@ DRM_GPUSVM_SCAN_MIXED
Definition drm_gpusvm.h:353
@ DRM_GPUSVM_SCAN_EQUAL
Definition drm_gpusvm.h:349
@ DRM_GPUSVM_SCAN_SYSTEM
Definition drm_gpusvm.h:351
@ DRM_GPUSVM_SCAN_UNPOPULATED
Definition drm_gpusvm.h:348
@ DRM_GPUSVM_SCAN_MIXED_DEVICE
Definition drm_gpusvm.h:352
@ DRM_GPUSVM_SCAN_OTHER
Definition drm_gpusvm.h:350
int drm_gpusvm_range_get_pages(struct drm_gpusvm *gpusvm, struct drm_gpusvm_range *range, const struct drm_gpusvm_ctx *ctx)
void drm_gpusvm_unmap_pages(struct drm_gpusvm *gpusvm, struct drm_gpusvm_pages *svm_pages, unsigned long npages, const struct drm_gpusvm_ctx *ctx)
unsigned long drm_gpusvm_find_vma_start(struct drm_gpusvm *gpusvm, unsigned long start, unsigned long end)
int drm_gpusvm_range_evict(struct drm_gpusvm *gpusvm, struct drm_gpusvm_range *range)
uint16_t u16
Definition kernel.h:15
uint32_t u32
Definition kernel.h:16
char end[]
void(* entry)(void *)
Definition process.h:101
Definition drm_device.h:75
Definition drm_gpusvm.h:244
unsigned int read_only
Definition drm_gpusvm.h:249
unsigned int allow_mixed
Definition drm_gpusvm.h:252
void * device_private_page_owner
Definition drm_gpusvm.h:245
unsigned int devmem_possible
Definition drm_gpusvm.h:250
unsigned int devmem_only
Definition drm_gpusvm.h:251
unsigned long check_pages_threshold
Definition drm_gpusvm.h:246
unsigned int in_notifier
Definition drm_gpusvm.h:248
unsigned long timeslice_ms
Definition drm_gpusvm.h:247
Definition drm_gpusvm.h:97
struct list_head range_list
Definition drm_gpusvm.h:103
struct mmu_interval_notifier notifier
Definition drm_gpusvm.h:99
struct drm_gpusvm_notifier::@30 flags
u32 removed
Definition drm_gpusvm.h:105
struct list_head entry
Definition drm_gpusvm.h:101
struct rb_root_cached root
Definition drm_gpusvm.h:102
struct drm_gpusvm * gpusvm
Definition drm_gpusvm.h:98
struct interval_tree_node itree
Definition drm_gpusvm.h:100
Definition drm_gpusvm.h:30
void(* range_free)(struct drm_gpusvm_range *range)
Definition drm_gpusvm.h:64
void(* invalidate)(struct drm_gpusvm *gpusvm, struct drm_gpusvm_notifier *notifier, const struct mmu_notifier_range *mmu_range)
Definition drm_gpusvm.h:75
void(* notifier_free)(struct drm_gpusvm_notifier *notifier)
Definition drm_gpusvm.h:46
Definition drm_gpusvm.h:119
u16 has_dma_mapping
Definition drm_gpusvm.h:128
u16 partial_unmap
Definition drm_gpusvm.h:126
u16 unmapped
Definition drm_gpusvm.h:125
u16 migrate_devmem
Definition drm_gpusvm.h:123
u16 has_devmem_pages
Definition drm_gpusvm.h:127
u16 __flags
Definition drm_gpusvm.h:130
Definition drm_gpusvm.h:145
struct drm_pagemap * dpagemap
Definition drm_gpusvm.h:147
unsigned long notifier_seq
Definition drm_gpusvm.h:150
struct drm_gpusvm_pages_flags flags
Definition drm_gpusvm.h:151
unsigned long state_offset
Definition drm_gpusvm.h:149
struct drm_pagemap_addr * dma_addr
Definition drm_gpusvm.h:146
struct dma_iova_state state
Definition drm_gpusvm.h:148
Definition drm_gpusvm.h:167
struct drm_gpusvm * gpusvm
Definition drm_gpusvm.h:168
struct list_head entry
Definition drm_gpusvm.h:172
struct drm_gpusvm_pages pages
Definition drm_gpusvm.h:173
struct kref refcount
Definition drm_gpusvm.h:170
struct drm_gpusvm_notifier * notifier
Definition drm_gpusvm.h:169
struct interval_tree_node itree
Definition drm_gpusvm.h:171
Definition drm_gpusvm.h:202
unsigned long notifier_size
Definition drm_gpusvm.h:208
struct rb_root_cached root
Definition drm_gpusvm.h:213
const unsigned long * chunk_sizes
Definition drm_gpusvm.h:210
const char * name
Definition drm_gpusvm.h:203
const struct drm_gpusvm_ops * ops
Definition drm_gpusvm.h:209
struct rw_semaphore notifier_lock
Definition drm_gpusvm.h:212
unsigned long mm_start
Definition drm_gpusvm.h:206
unsigned long mm_range
Definition drm_gpusvm.h:207
struct list_head notifier_list
Definition drm_gpusvm.h:214
struct drm_device * drm
Definition drm_gpusvm.h:204
struct mm_struct * mm
Definition drm_gpusvm.h:205
int num_chunks
Definition drm_gpusvm.h:211
Definition drm_pagemap.h:41
Definition drm_pagemap.h:165
Definition interval_tree.h:7
unsigned long start
Definition interval_tree.h:9
unsigned long last
Definition interval_tree.h:10
Definition kref.h:44
Definition list.h:11
Definition lockdep.h:161
Definition rbtree_types.h:48
Definition rwsem.h:36