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 6 #include <drm/drm_gem.h> 7 #include <drm/ttm/ttm_bo_api.h> 8 #include <drm/ttm/ttm_placement.h> 9 #include <linux/kernel.h> /* for container_of() */ 10 11 struct filp; 12 13 #define DRM_GEM_VRAM_PL_FLAG_VRAM TTM_PL_FLAG_VRAM 14 #define DRM_GEM_VRAM_PL_FLAG_SYSTEM TTM_PL_FLAG_SYSTEM 15 16 /* 17 * Buffer-object helpers 18 */ 19 20 /** 21 * struct drm_gem_vram_object - GEM object backed by VRAM 22 * @gem: GEM object 23 * @bo: TTM buffer object 24 * @kmap: Mapping information for @bo 25 * @placement: TTM placement information. Supported placements are \ 26 %TTM_PL_VRAM and %TTM_PL_SYSTEM 27 * @placements: TTM placement information. 28 * @pin_count: Pin counter 29 * 30 * The type struct drm_gem_vram_object represents a GEM object that is 31 * backed by VRAM. It can be used for simple framebuffer devices with 32 * dedicated memory. The buffer object can be evicted to system memory if 33 * video memory becomes scarce. 34 */ 35 struct drm_gem_vram_object { 36 struct drm_gem_object gem; 37 struct ttm_buffer_object bo; 38 struct ttm_bo_kmap_obj kmap; 39 40 /* Supported placements are %TTM_PL_VRAM and %TTM_PL_SYSTEM */ 41 struct ttm_placement placement; 42 struct ttm_place placements[2]; 43 44 int pin_count; 45 }; 46 47 /** 48 * Returns the container of type &struct drm_gem_vram_object 49 * for field bo. 50 * @bo: the VRAM buffer object 51 * Returns: The containing GEM VRAM object 52 */ 53 static inline struct drm_gem_vram_object *drm_gem_vram_of_bo( 54 struct ttm_buffer_object *bo) 55 { 56 return container_of(bo, struct drm_gem_vram_object, bo); 57 } 58 59 /** 60 * Returns the container of type &struct drm_gem_vram_object 61 * for field gem. 62 * @gem: the GEM object 63 * Returns: The containing GEM VRAM object 64 */ 65 static inline struct drm_gem_vram_object *drm_gem_vram_of_gem( 66 struct drm_gem_object *gem) 67 { 68 return container_of(gem, struct drm_gem_vram_object, gem); 69 } 70 71 struct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev, 72 struct ttm_bo_device *bdev, 73 size_t size, 74 unsigned long pg_align, 75 bool interruptible); 76 void drm_gem_vram_put(struct drm_gem_vram_object *gbo); 77 int drm_gem_vram_reserve(struct drm_gem_vram_object *gbo, bool no_wait); 78 void drm_gem_vram_unreserve(struct drm_gem_vram_object *gbo); 79 u64 drm_gem_vram_mmap_offset(struct drm_gem_vram_object *gbo); 80 s64 drm_gem_vram_offset(struct drm_gem_vram_object *gbo); 81 int drm_gem_vram_pin(struct drm_gem_vram_object *gbo, unsigned long pl_flag); 82 int drm_gem_vram_unpin(struct drm_gem_vram_object *gbo); 83 int drm_gem_vram_push_to_system(struct drm_gem_vram_object *gbo); 84 void *drm_gem_vram_kmap_at(struct drm_gem_vram_object *gbo, bool map, 85 bool *is_iomem, struct ttm_bo_kmap_obj *kmap); 86 void *drm_gem_vram_kmap(struct drm_gem_vram_object *gbo, bool map, 87 bool *is_iomem); 88 void drm_gem_vram_kunmap_at(struct drm_gem_vram_object *gbo, 89 struct ttm_bo_kmap_obj *kmap); 90 void drm_gem_vram_kunmap(struct drm_gem_vram_object *gbo); 91 92 #endif 93