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/dma-buf-map.h>
15#include <linux/kernel.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 dma_buf_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 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);
116
117
118
119
120int
121drm_gem_vram_plane_helper_prepare_fb(struct drm_plane *plane,
122 struct drm_plane_state *new_state);
123void
124drm_gem_vram_plane_helper_cleanup_fb(struct drm_plane *plane,
125 struct drm_plane_state *old_state);
126
127
128
129
130
131
132
133
134
135#define DRM_GEM_VRAM_PLANE_HELPER_FUNCS \
136 .prepare_fb = drm_gem_vram_plane_helper_prepare_fb, \
137 .cleanup_fb = drm_gem_vram_plane_helper_cleanup_fb
138
139
140
141
142
143int drm_gem_vram_simple_display_pipe_prepare_fb(
144 struct drm_simple_display_pipe *pipe,
145 struct drm_plane_state *new_state);
146
147void drm_gem_vram_simple_display_pipe_cleanup_fb(
148 struct drm_simple_display_pipe *pipe,
149 struct drm_plane_state *old_state);
150
151
152
153
154
155
156
157
158#define DRM_GEM_VRAM_DRIVER \
159 .debugfs_init = drm_vram_mm_debugfs_init, \
160 .dumb_create = drm_gem_vram_driver_dumb_create, \
161 .dumb_map_offset = drm_gem_ttm_dumb_map_offset, \
162 .gem_prime_mmap = drm_gem_prime_mmap
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180struct drm_vram_mm {
181 uint64_t vram_base;
182 size_t vram_size;
183
184 struct ttm_device bdev;
185};
186
187
188
189
190
191
192
193
194
195static inline struct drm_vram_mm *drm_vram_mm_of_bdev(
196 struct ttm_device *bdev)
197{
198 return container_of(bdev, struct drm_vram_mm, bdev);
199}
200
201void drm_vram_mm_debugfs_init(struct drm_minor *minor);
202
203
204
205
206
207int drmm_vram_helper_init(struct drm_device *dev, uint64_t vram_base,
208 size_t vram_size);
209
210
211
212
213
214enum drm_mode_status
215drm_vram_helper_mode_valid(struct drm_device *dev,
216 const struct drm_display_mode *mode);
217
218#endif
219