0001
0002
0003 #ifndef DRM_GEM_VRAM_HELPER_H
0004 #define DRM_GEM_VRAM_HELPER_H
0005
0006 #include <drm/drm_file.h>
0007 #include <drm/drm_gem.h>
0008 #include <drm/drm_gem_ttm_helper.h>
0009 #include <drm/drm_ioctl.h>
0010 #include <drm/drm_modes.h>
0011 #include <drm/ttm/ttm_bo_api.h>
0012 #include <drm/ttm/ttm_bo_driver.h>
0013
0014 #include <linux/container_of.h>
0015 #include <linux/iosys-map.h>
0016
0017 struct drm_mode_create_dumb;
0018 struct drm_plane;
0019 struct drm_plane_state;
0020 struct drm_simple_display_pipe;
0021 struct filp;
0022 struct vm_area_struct;
0023
0024 #define DRM_GEM_VRAM_PL_FLAG_SYSTEM (1 << 0)
0025 #define DRM_GEM_VRAM_PL_FLAG_VRAM (1 << 1)
0026 #define DRM_GEM_VRAM_PL_FLAG_TOPDOWN (1 << 2)
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052 struct drm_gem_vram_object {
0053 struct ttm_buffer_object bo;
0054 struct iosys_map map;
0055
0056
0057
0058
0059
0060
0061
0062 unsigned int vmap_use_count;
0063
0064
0065 struct ttm_placement placement;
0066 struct ttm_place placements[2];
0067 };
0068
0069
0070
0071
0072
0073
0074
0075 static inline struct drm_gem_vram_object *drm_gem_vram_of_bo(
0076 struct ttm_buffer_object *bo)
0077 {
0078 return container_of(bo, struct drm_gem_vram_object, bo);
0079 }
0080
0081
0082
0083
0084
0085
0086
0087 static inline struct drm_gem_vram_object *drm_gem_vram_of_gem(
0088 struct drm_gem_object *gem)
0089 {
0090 return container_of(gem, struct drm_gem_vram_object, bo.base);
0091 }
0092
0093 struct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev,
0094 size_t size,
0095 unsigned long pg_align);
0096 void drm_gem_vram_put(struct drm_gem_vram_object *gbo);
0097 s64 drm_gem_vram_offset(struct drm_gem_vram_object *gbo);
0098 int drm_gem_vram_pin(struct drm_gem_vram_object *gbo, unsigned long pl_flag);
0099 int drm_gem_vram_unpin(struct drm_gem_vram_object *gbo);
0100 int drm_gem_vram_vmap(struct drm_gem_vram_object *gbo, struct iosys_map *map);
0101 void drm_gem_vram_vunmap(struct drm_gem_vram_object *gbo,
0102 struct iosys_map *map);
0103
0104 int drm_gem_vram_fill_create_dumb(struct drm_file *file,
0105 struct drm_device *dev,
0106 unsigned long pg_align,
0107 unsigned long pitch_align,
0108 struct drm_mode_create_dumb *args);
0109
0110
0111
0112
0113
0114 int drm_gem_vram_driver_dumb_create(struct drm_file *file,
0115 struct drm_device *dev,
0116 struct drm_mode_create_dumb *args);
0117
0118
0119
0120
0121 int
0122 drm_gem_vram_plane_helper_prepare_fb(struct drm_plane *plane,
0123 struct drm_plane_state *new_state);
0124 void
0125 drm_gem_vram_plane_helper_cleanup_fb(struct drm_plane *plane,
0126 struct drm_plane_state *old_state);
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136 #define DRM_GEM_VRAM_PLANE_HELPER_FUNCS \
0137 .prepare_fb = drm_gem_vram_plane_helper_prepare_fb, \
0138 .cleanup_fb = drm_gem_vram_plane_helper_cleanup_fb
0139
0140
0141
0142
0143
0144 int drm_gem_vram_simple_display_pipe_prepare_fb(
0145 struct drm_simple_display_pipe *pipe,
0146 struct drm_plane_state *new_state);
0147
0148 void drm_gem_vram_simple_display_pipe_cleanup_fb(
0149 struct drm_simple_display_pipe *pipe,
0150 struct drm_plane_state *old_state);
0151
0152
0153
0154
0155
0156
0157
0158
0159 #define DRM_GEM_VRAM_DRIVER \
0160 .debugfs_init = drm_vram_mm_debugfs_init, \
0161 .dumb_create = drm_gem_vram_driver_dumb_create, \
0162 .dumb_map_offset = drm_gem_ttm_dumb_map_offset, \
0163 .gem_prime_mmap = drm_gem_prime_mmap
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181 struct drm_vram_mm {
0182 uint64_t vram_base;
0183 size_t vram_size;
0184
0185 struct ttm_device bdev;
0186 };
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196 static inline struct drm_vram_mm *drm_vram_mm_of_bdev(
0197 struct ttm_device *bdev)
0198 {
0199 return container_of(bdev, struct drm_vram_mm, bdev);
0200 }
0201
0202 void drm_vram_mm_debugfs_init(struct drm_minor *minor);
0203
0204
0205
0206
0207
0208 int drmm_vram_helper_init(struct drm_device *dev, uint64_t vram_base,
0209 size_t vram_size);
0210
0211
0212
0213
0214
0215 enum drm_mode_status
0216 drm_vram_helper_mode_valid(struct drm_device *dev,
0217 const struct drm_display_mode *mode);
0218
0219 #endif