Commit | Line | Data |
---|---|---|
85438a8d TZ |
1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | ||
3 | #ifndef DRM_GEM_VRAM_HELPER_H | |
4 | #define DRM_GEM_VRAM_HELPER_H | |
5 | ||
6b5ce4a1 | 6 | #include <drm/drm_file.h> |
85438a8d | 7 | #include <drm/drm_gem.h> |
ede0c69c | 8 | #include <drm/drm_gem_ttm_helper.h> |
6b5ce4a1 | 9 | #include <drm/drm_ioctl.h> |
80f7c3f7 | 10 | #include <drm/drm_modes.h> |
a3185f91 CK |
11 | #include <drm/ttm/ttm_bo.h> |
12 | #include <drm/ttm/ttm_placement.h> | |
6b5ce4a1 | 13 | |
ae710a45 | 14 | #include <linux/container_of.h> |
7938f421 | 15 | #include <linux/iosys-map.h> |
85438a8d | 16 | |
fed1eec0 | 17 | struct drm_mode_create_dumb; |
6542ad89 TZ |
18 | struct drm_plane; |
19 | struct drm_plane_state; | |
20 | struct drm_simple_display_pipe; | |
85438a8d | 21 | struct filp; |
59f5989a | 22 | struct vm_area_struct; |
85438a8d | 23 | |
7053e0ea CK |
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) | |
85438a8d TZ |
27 | |
28 | /* | |
29 | * Buffer-object helpers | |
30 | */ | |
31 | ||
32 | /** | |
33 | * struct drm_gem_vram_object - GEM object backed by VRAM | |
85438a8d | 34 | * @bo: TTM buffer object |
49a3f51d | 35 | * @map: Mapping information for @bo |
a0abb82d AMB |
36 | * @placement: TTM placement information. Supported placements are %TTM_PL_VRAM |
37 | * and %TTM_PL_SYSTEM | |
85438a8d | 38 | * @placements: TTM placement information. |
85438a8d TZ |
39 | * |
40 | * The type struct drm_gem_vram_object represents a GEM object that is | |
41 | * backed by VRAM. It can be used for simple framebuffer devices with | |
42 | * dedicated memory. The buffer object can be evicted to system memory if | |
43 | * video memory becomes scarce. | |
37a48adf TZ |
44 | * |
45 | * GEM VRAM objects perform reference counting for pin and mapping | |
46 | * operations. So a buffer object that has been pinned N times with | |
47 | * drm_gem_vram_pin() must be unpinned N times with | |
48 | * drm_gem_vram_unpin(). The same applies to pairs of | |
c8908bde TZ |
49 | * drm_gem_vram_kmap() and drm_gem_vram_kunmap(), as well as pairs of |
50 | * drm_gem_vram_vmap() and drm_gem_vram_vunmap(). | |
85438a8d TZ |
51 | */ |
52 | struct drm_gem_vram_object { | |
85438a8d | 53 | struct ttm_buffer_object bo; |
7938f421 | 54 | struct iosys_map map; |
85438a8d | 55 | |
37a48adf | 56 | /** |
49a3f51d | 57 | * @vmap_use_count: |
37a48adf TZ |
58 | * |
59 | * Reference count on the virtual address. | |
60 | * The address are un-mapped when the count reaches zero. | |
61 | */ | |
49a3f51d | 62 | unsigned int vmap_use_count; |
37a48adf | 63 | |
85438a8d TZ |
64 | /* Supported placements are %TTM_PL_VRAM and %TTM_PL_SYSTEM */ |
65 | struct ttm_placement placement; | |
66 | struct ttm_place placements[2]; | |
85438a8d TZ |
67 | }; |
68 | ||
69 | /** | |
e9d2871f MCC |
70 | * drm_gem_vram_of_bo - Returns the container of type |
71 | * &struct drm_gem_vram_object for field bo. | |
85438a8d TZ |
72 | * @bo: the VRAM buffer object |
73 | * Returns: The containing GEM VRAM object | |
74 | */ | |
75 | static 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 | /** | |
e9d2871f MCC |
82 | * drm_gem_vram_of_gem - Returns the container of type |
83 | * &struct drm_gem_vram_object for field gem. | |
85438a8d TZ |
84 | * @gem: the GEM object |
85 | * Returns: The containing GEM VRAM object | |
86 | */ | |
87 | static inline struct drm_gem_vram_object *drm_gem_vram_of_gem( | |
88 | struct drm_gem_object *gem) | |
89 | { | |
0e580c6d | 90 | return container_of(gem, struct drm_gem_vram_object, bo.base); |
85438a8d TZ |
91 | } |
92 | ||
93 | struct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev, | |
85438a8d | 94 | size_t size, |
ebe9428b | 95 | unsigned long pg_align); |
85438a8d | 96 | void drm_gem_vram_put(struct drm_gem_vram_object *gbo); |
85438a8d TZ |
97 | s64 drm_gem_vram_offset(struct drm_gem_vram_object *gbo); |
98 | int drm_gem_vram_pin(struct drm_gem_vram_object *gbo, unsigned long pl_flag); | |
99 | int drm_gem_vram_unpin(struct drm_gem_vram_object *gbo); | |
7938f421 LDM |
100 | int drm_gem_vram_vmap(struct drm_gem_vram_object *gbo, struct iosys_map *map); |
101 | void drm_gem_vram_vunmap(struct drm_gem_vram_object *gbo, | |
102 | struct iosys_map *map); | |
85438a8d | 103 | |
fed1eec0 TZ |
104 | int drm_gem_vram_fill_create_dumb(struct drm_file *file, |
105 | struct drm_device *dev, | |
fed1eec0 | 106 | unsigned long pg_align, |
98707327 | 107 | unsigned long pitch_align, |
fed1eec0 TZ |
108 | struct drm_mode_create_dumb *args); |
109 | ||
737000fd TZ |
110 | /* |
111 | * Helpers for struct drm_driver | |
112 | */ | |
113 | ||
59f5989a TZ |
114 | int drm_gem_vram_driver_dumb_create(struct drm_file *file, |
115 | struct drm_device *dev, | |
116 | struct drm_mode_create_dumb *args); | |
59f5989a | 117 | |
6542ad89 TZ |
118 | /* |
119 | * Helpers for struct drm_plane_helper_funcs | |
120 | */ | |
121 | int | |
122 | drm_gem_vram_plane_helper_prepare_fb(struct drm_plane *plane, | |
123 | struct drm_plane_state *new_state); | |
124 | void | |
125 | drm_gem_vram_plane_helper_cleanup_fb(struct drm_plane *plane, | |
126 | struct drm_plane_state *old_state); | |
127 | ||
f8bd3dbb | 128 | /** |
a0abb82d AMB |
129 | * DRM_GEM_VRAM_PLANE_HELPER_FUNCS - Initializes struct drm_plane_helper_funcs |
130 | * for VRAM handling | |
f8bd3dbb DV |
131 | * |
132 | * Drivers may use GEM BOs as VRAM helpers for the framebuffer memory. This | |
133 | * macro initializes struct drm_plane_helper_funcs to use the respective helper | |
134 | * functions. | |
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 | ||
6542ad89 TZ |
140 | /* |
141 | * Helpers for struct drm_simple_display_pipe_funcs | |
142 | */ | |
143 | ||
144 | int drm_gem_vram_simple_display_pipe_prepare_fb( | |
145 | struct drm_simple_display_pipe *pipe, | |
146 | struct drm_plane_state *new_state); | |
147 | ||
148 | void drm_gem_vram_simple_display_pipe_cleanup_fb( | |
149 | struct drm_simple_display_pipe *pipe, | |
150 | struct drm_plane_state *old_state); | |
151 | ||
59f5989a | 152 | /** |
a0abb82d AMB |
153 | * define DRM_GEM_VRAM_DRIVER - default callback functions for |
154 | * &struct drm_driver | |
59f5989a TZ |
155 | * |
156 | * Drivers that use VRAM MM and GEM VRAM can use this macro to initialize | |
157 | * &struct drm_driver with default functions. | |
158 | */ | |
159 | #define DRM_GEM_VRAM_DRIVER \ | |
71e801b9 TZ |
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 | |
59f5989a | 163 | |
6b5ce4a1 TZ |
164 | /* |
165 | * VRAM memory manager | |
166 | */ | |
167 | ||
168 | /** | |
169 | * struct drm_vram_mm - An instance of VRAM MM | |
170 | * @vram_base: Base address of the managed video memory | |
171 | * @vram_size: Size of the managed video memory in bytes | |
172 | * @bdev: The TTM BO device. | |
6b5ce4a1 TZ |
173 | * |
174 | * The fields &struct drm_vram_mm.vram_base and | |
175 | * &struct drm_vram_mm.vrm_size are managed by VRAM MM, but are | |
176 | * available for public read access. Use the field | |
177 | * &struct drm_vram_mm.bdev to access the TTM BO device. | |
178 | */ | |
179 | struct drm_vram_mm { | |
180 | uint64_t vram_base; | |
181 | size_t vram_size; | |
182 | ||
8af8a109 | 183 | struct ttm_device bdev; |
6b5ce4a1 TZ |
184 | }; |
185 | ||
186 | /** | |
a0abb82d AMB |
187 | * drm_vram_mm_of_bdev() - Returns the container of type &struct ttm_device for |
188 | * field bdev. | |
6b5ce4a1 TZ |
189 | * @bdev: the TTM BO device |
190 | * | |
191 | * Returns: | |
192 | * The containing instance of &struct drm_vram_mm | |
193 | */ | |
194 | static inline struct drm_vram_mm *drm_vram_mm_of_bdev( | |
8af8a109 | 195 | struct ttm_device *bdev) |
6b5ce4a1 TZ |
196 | { |
197 | return container_of(bdev, struct drm_vram_mm, bdev); | |
198 | } | |
199 | ||
7ce84471 | 200 | void drm_vram_mm_debugfs_init(struct drm_minor *minor); |
6b5ce4a1 TZ |
201 | |
202 | /* | |
203 | * Helpers for integration with struct drm_device | |
204 | */ | |
205 | ||
a5f23a72 TZ |
206 | int drmm_vram_helper_init(struct drm_device *dev, uint64_t vram_base, |
207 | size_t vram_size); | |
208 | ||
80f7c3f7 TZ |
209 | /* |
210 | * Mode-config helpers | |
211 | */ | |
212 | ||
213 | enum drm_mode_status | |
214 | drm_vram_helper_mode_valid(struct drm_device *dev, | |
215 | const struct drm_display_mode *mode); | |
216 | ||
85438a8d | 217 | #endif |