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