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