1
2
3#ifndef DRM_GEM_VRAM_HELPER_H
4#define DRM_GEM_VRAM_HELPER_H
5
6#include <drm/drm_gem.h>
7#include <drm/ttm/ttm_bo_api.h>
8#include <drm/ttm/ttm_placement.h>
9#include <linux/kernel.h>
10
11struct drm_mode_create_dumb;
12struct drm_vram_mm_funcs;
13struct filp;
14struct vm_area_struct;
15
16#define DRM_GEM_VRAM_PL_FLAG_VRAM TTM_PL_FLAG_VRAM
17#define DRM_GEM_VRAM_PL_FLAG_SYSTEM TTM_PL_FLAG_SYSTEM
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38struct drm_gem_vram_object {
39 struct drm_gem_object gem;
40 struct ttm_buffer_object bo;
41 struct ttm_bo_kmap_obj kmap;
42
43
44 struct ttm_placement placement;
45 struct ttm_place placements[2];
46
47 int pin_count;
48};
49
50
51
52
53
54
55
56static inline struct drm_gem_vram_object *drm_gem_vram_of_bo(
57 struct ttm_buffer_object *bo)
58{
59 return container_of(bo, struct drm_gem_vram_object, bo);
60}
61
62
63
64
65
66
67
68static inline struct drm_gem_vram_object *drm_gem_vram_of_gem(
69 struct drm_gem_object *gem)
70{
71 return container_of(gem, struct drm_gem_vram_object, gem);
72}
73
74struct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev,
75 struct ttm_bo_device *bdev,
76 size_t size,
77 unsigned long pg_align,
78 bool interruptible);
79void drm_gem_vram_put(struct drm_gem_vram_object *gbo);
80u64 drm_gem_vram_mmap_offset(struct drm_gem_vram_object *gbo);
81s64 drm_gem_vram_offset(struct drm_gem_vram_object *gbo);
82int drm_gem_vram_pin(struct drm_gem_vram_object *gbo, unsigned long pl_flag);
83int drm_gem_vram_unpin(struct drm_gem_vram_object *gbo);
84void *drm_gem_vram_kmap(struct drm_gem_vram_object *gbo, bool map,
85 bool *is_iomem);
86void drm_gem_vram_kunmap(struct drm_gem_vram_object *gbo);
87
88int drm_gem_vram_fill_create_dumb(struct drm_file *file,
89 struct drm_device *dev,
90 struct ttm_bo_device *bdev,
91 unsigned long pg_align,
92 bool interruptible,
93 struct drm_mode_create_dumb *args);
94
95
96
97
98
99void drm_gem_vram_bo_driver_evict_flags(struct ttm_buffer_object *bo,
100 struct ttm_placement *pl);
101
102int drm_gem_vram_bo_driver_verify_access(struct ttm_buffer_object *bo,
103 struct file *filp);
104
105extern const struct drm_vram_mm_funcs drm_gem_vram_mm_funcs;
106
107
108
109
110
111void drm_gem_vram_driver_gem_free_object_unlocked(struct drm_gem_object *gem);
112int drm_gem_vram_driver_dumb_create(struct drm_file *file,
113 struct drm_device *dev,
114 struct drm_mode_create_dumb *args);
115int drm_gem_vram_driver_dumb_mmap_offset(struct drm_file *file,
116 struct drm_device *dev,
117 uint32_t handle, uint64_t *offset);
118
119
120
121
122
123
124
125
126#define DRM_GEM_VRAM_DRIVER \
127 .gem_free_object_unlocked = \
128 drm_gem_vram_driver_gem_free_object_unlocked, \
129 .dumb_create = drm_gem_vram_driver_dumb_create, \
130 .dumb_map_offset = drm_gem_vram_driver_dumb_mmap_offset
131
132
133
134
135
136int drm_gem_vram_driver_gem_prime_pin(struct drm_gem_object *obj);
137void drm_gem_vram_driver_gem_prime_unpin(struct drm_gem_object *obj);
138void *drm_gem_vram_driver_gem_prime_vmap(struct drm_gem_object *obj);
139void drm_gem_vram_driver_gem_prime_vunmap(struct drm_gem_object *obj,
140 void *vaddr);
141int drm_gem_vram_driver_gem_prime_mmap(struct drm_gem_object *obj,
142 struct vm_area_struct *vma);
143
144#define DRM_GEM_VRAM_DRIVER_PRIME \
145 .gem_prime_export = drm_gem_prime_export, \
146 .gem_prime_import = drm_gem_prime_import, \
147 .gem_prime_pin = drm_gem_vram_driver_gem_prime_pin, \
148 .gem_prime_unpin = drm_gem_vram_driver_gem_prime_unpin, \
149 .gem_prime_vmap = drm_gem_vram_driver_gem_prime_vmap, \
150 .gem_prime_vunmap = drm_gem_vram_driver_gem_prime_vunmap, \
151 .gem_prime_mmap = drm_gem_vram_driver_gem_prime_mmap
152
153#endif
154