1
2
3#ifndef DRM_GEM_VRAM_HELPER_H
4#define DRM_GEM_VRAM_HELPER_H
5
6#include <drm/drm_file.h>
7#include <drm/drm_gem.h>
8#include <drm/drm_ioctl.h>
9#include <drm/drm_modes.h>
10#include <drm/ttm/ttm_bo_api.h>
11#include <drm/ttm/ttm_bo_driver.h>
12
13#include <linux/dma-buf-map.h>
14#include <linux/kernel.h>
15
16struct drm_mode_create_dumb;
17struct drm_plane;
18struct drm_plane_state;
19struct drm_simple_display_pipe;
20struct filp;
21struct vm_area_struct;
22
23#define DRM_GEM_VRAM_PL_FLAG_SYSTEM (1 << 0)
24#define DRM_GEM_VRAM_PL_FLAG_VRAM (1 << 1)
25#define DRM_GEM_VRAM_PL_FLAG_TOPDOWN (1 << 2)
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51struct drm_gem_vram_object {
52 struct ttm_buffer_object bo;
53 struct dma_buf_map map;
54
55
56
57
58
59
60
61 unsigned int vmap_use_count;
62
63
64 struct ttm_placement placement;
65 struct ttm_place placements[2];
66};
67
68
69
70
71
72
73
74static inline struct drm_gem_vram_object *drm_gem_vram_of_bo(
75 struct ttm_buffer_object *bo)
76{
77 return container_of(bo, struct drm_gem_vram_object, bo);
78}
79
80
81
82
83
84
85
86static inline struct drm_gem_vram_object *drm_gem_vram_of_gem(
87 struct drm_gem_object *gem)
88{
89 return container_of(gem, struct drm_gem_vram_object, bo.base);
90}
91
92struct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev,
93 size_t size,
94 unsigned long pg_align);
95void drm_gem_vram_put(struct drm_gem_vram_object *gbo);
96u64 drm_gem_vram_mmap_offset(struct drm_gem_vram_object *gbo);
97s64 drm_gem_vram_offset(struct drm_gem_vram_object *gbo);
98int drm_gem_vram_pin(struct drm_gem_vram_object *gbo, unsigned long pl_flag);
99int drm_gem_vram_unpin(struct drm_gem_vram_object *gbo);
100int drm_gem_vram_vmap(struct drm_gem_vram_object *gbo, struct dma_buf_map *map);
101void drm_gem_vram_vunmap(struct drm_gem_vram_object *gbo, struct dma_buf_map *map);
102
103int drm_gem_vram_fill_create_dumb(struct drm_file *file,
104 struct drm_device *dev,
105 unsigned long pg_align,
106 unsigned long pitch_align,
107 struct drm_mode_create_dumb *args);
108
109
110
111
112
113int drm_gem_vram_driver_dumb_create(struct drm_file *file,
114 struct drm_device *dev,
115 struct drm_mode_create_dumb *args);
116int drm_gem_vram_driver_dumb_mmap_offset(struct drm_file *file,
117 struct drm_device *dev,
118 uint32_t handle, uint64_t *offset);
119
120
121
122
123int
124drm_gem_vram_plane_helper_prepare_fb(struct drm_plane *plane,
125 struct drm_plane_state *new_state);
126void
127drm_gem_vram_plane_helper_cleanup_fb(struct drm_plane *plane,
128 struct drm_plane_state *old_state);
129
130
131
132
133
134int drm_gem_vram_simple_display_pipe_prepare_fb(
135 struct drm_simple_display_pipe *pipe,
136 struct drm_plane_state *new_state);
137
138void drm_gem_vram_simple_display_pipe_cleanup_fb(
139 struct drm_simple_display_pipe *pipe,
140 struct drm_plane_state *old_state);
141
142
143
144
145
146
147
148
149#define DRM_GEM_VRAM_DRIVER \
150 .debugfs_init = drm_vram_mm_debugfs_init, \
151 .dumb_create = drm_gem_vram_driver_dumb_create, \
152 .dumb_map_offset = drm_gem_vram_driver_dumb_mmap_offset, \
153 .gem_prime_mmap = drm_gem_prime_mmap
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171struct drm_vram_mm {
172 uint64_t vram_base;
173 size_t vram_size;
174
175 struct ttm_device bdev;
176};
177
178
179
180
181
182
183
184
185
186static inline struct drm_vram_mm *drm_vram_mm_of_bdev(
187 struct ttm_device *bdev)
188{
189 return container_of(bdev, struct drm_vram_mm, bdev);
190}
191
192void drm_vram_mm_debugfs_init(struct drm_minor *minor);
193
194
195
196
197
198struct drm_vram_mm *drm_vram_helper_alloc_mm(
199 struct drm_device *dev, uint64_t vram_base, size_t vram_size);
200void drm_vram_helper_release_mm(struct drm_device *dev);
201
202int drmm_vram_helper_init(struct drm_device *dev, uint64_t vram_base,
203 size_t vram_size);
204
205
206
207
208
209enum drm_mode_status
210drm_vram_helper_mode_valid(struct drm_device *dev,
211 const struct drm_display_mode *mode);
212
213#endif
214