6#ifndef __DRM_GPUSVM_H__
7#define __DRM_GPUSVM_H__
14struct dev_pagemap_ops;
77 const struct mmu_notifier_range *mmu_range);
205 struct mm_struct *
mm;
257 struct mm_struct *mm,
258 unsigned long mm_start,
unsigned long mm_range,
259 unsigned long notifier_size,
261 const unsigned long *chunk_sizes,
int num_chunks);
274 unsigned long fault_addr,
275 unsigned long gpuva_start,
276 unsigned long gpuva_end,
313 const struct mmu_notifier_range *mmu_range);
317 struct mm_struct *mm,
318 struct mmu_interval_notifier *
notifier,
319 unsigned long pages_start,
unsigned long pages_end,
324 unsigned long npages,
329 unsigned long npages);
357 void *dev_private_owner,
358 const struct dev_pagemap *pagemap);
370#define drm_gpusvm_driver_set_lock(gpusvm, lock) \
372 if (!WARN((gpusvm)->lock_dep_map, \
373 "GPUSVM range lock should be set only once."))\
374 (gpusvm)->lock_dep_map = &(lock)->dep_map; \
377#define drm_gpusvm_driver_set_lock(gpusvm, lock) do {} while (0)
386#define drm_gpusvm_notifier_lock(gpusvm__) \
387 down_read(&(gpusvm__)->notifier_lock)
395#define drm_gpusvm_notifier_unlock(gpusvm__) \
396 up_read(&(gpusvm__)->notifier_lock)
404static inline unsigned long
416static inline unsigned long
428static inline unsigned long
431 return drm_gpusvm_range_end(range) - drm_gpusvm_range_start(range);
440static inline unsigned long
452static inline unsigned long
464static inline unsigned long
467 return drm_gpusvm_notifier_end(
notifier) -
468 drm_gpusvm_notifier_start(
notifier);
481 if (range && !list_is_last(&range->
entry,
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__))
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__))
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__))
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__))
#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
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 rbtree_types.h:48