Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : 3 : : #ifndef __DRM_GEM_SHMEM_HELPER_H__ 4 : : #define __DRM_GEM_SHMEM_HELPER_H__ 5 : : 6 : : #include <linux/fs.h> 7 : : #include <linux/mm.h> 8 : : #include <linux/mutex.h> 9 : : 10 : : #include <drm/drm_file.h> 11 : : #include <drm/drm_gem.h> 12 : : #include <drm/drm_ioctl.h> 13 : : #include <drm/drm_prime.h> 14 : : 15 : : struct dma_buf_attachment; 16 : : struct drm_mode_create_dumb; 17 : : struct drm_printer; 18 : : struct sg_table; 19 : : 20 : : /** 21 : : * struct drm_gem_shmem_object - GEM object backed by shmem 22 : : */ 23 : : struct drm_gem_shmem_object { 24 : : /** 25 : : * @base: Base GEM object 26 : : */ 27 : : struct drm_gem_object base; 28 : : 29 : : /** 30 : : * @pages_lock: Protects the page table and use count 31 : : */ 32 : : struct mutex pages_lock; 33 : : 34 : : /** 35 : : * @pages: Page table 36 : : */ 37 : : struct page **pages; 38 : : 39 : : /** 40 : : * @pages_use_count: 41 : : * 42 : : * Reference count on the pages table. 43 : : * The pages are put when the count reaches zero. 44 : : */ 45 : : unsigned int pages_use_count; 46 : : 47 : : /** 48 : : * @madv: State for madvise 49 : : * 50 : : * 0 is active/inuse. 51 : : * A negative value is the object is purged. 52 : : * Positive values are driver specific and not used by the helpers. 53 : : */ 54 : : int madv; 55 : : 56 : : /** 57 : : * @madv_list: List entry for madvise tracking 58 : : * 59 : : * Typically used by drivers to track purgeable objects 60 : : */ 61 : : struct list_head madv_list; 62 : : 63 : : /** 64 : : * @pages_mark_dirty_on_put: 65 : : * 66 : : * Mark pages as dirty when they are put. 67 : : */ 68 : : unsigned int pages_mark_dirty_on_put : 1; 69 : : 70 : : /** 71 : : * @pages_mark_accessed_on_put: 72 : : * 73 : : * Mark pages as accessed when they are put. 74 : : */ 75 : : unsigned int pages_mark_accessed_on_put : 1; 76 : : 77 : : /** 78 : : * @sgt: Scatter/gather table for imported PRIME buffers 79 : : */ 80 : : struct sg_table *sgt; 81 : : 82 : : /** 83 : : * @vmap_lock: Protects the vmap address and use count 84 : : */ 85 : : struct mutex vmap_lock; 86 : : 87 : : /** 88 : : * @vaddr: Kernel virtual address of the backing memory 89 : : */ 90 : : void *vaddr; 91 : : 92 : : /** 93 : : * @vmap_use_count: 94 : : * 95 : : * Reference count on the virtual address. 96 : : * The address are un-mapped when the count reaches zero. 97 : : */ 98 : : unsigned int vmap_use_count; 99 : : 100 : : /** 101 : : * @map_cached: map object cached (instead of using writecombine). 102 : : */ 103 : : bool map_cached; 104 : : }; 105 : : 106 : : #define to_drm_gem_shmem_obj(obj) \ 107 : : container_of(obj, struct drm_gem_shmem_object, base) 108 : : 109 : : struct drm_gem_shmem_object *drm_gem_shmem_create(struct drm_device *dev, size_t size); 110 : : void drm_gem_shmem_free_object(struct drm_gem_object *obj); 111 : : 112 : : int drm_gem_shmem_get_pages(struct drm_gem_shmem_object *shmem); 113 : : void drm_gem_shmem_put_pages(struct drm_gem_shmem_object *shmem); 114 : : int drm_gem_shmem_pin(struct drm_gem_object *obj); 115 : : void drm_gem_shmem_unpin(struct drm_gem_object *obj); 116 : : void *drm_gem_shmem_vmap(struct drm_gem_object *obj); 117 : : void drm_gem_shmem_vunmap(struct drm_gem_object *obj, void *vaddr); 118 : : 119 : : int drm_gem_shmem_madvise(struct drm_gem_object *obj, int madv); 120 : : 121 : 0 : static inline bool drm_gem_shmem_is_purgeable(struct drm_gem_shmem_object *shmem) 122 : : { 123 : 0 : return (shmem->madv > 0) && 124 [ # # # # ]: 0 : !shmem->vmap_use_count && shmem->sgt && 125 [ # # # # : 0 : !shmem->base.dma_buf && !shmem->base.import_attach; # # # # ] 126 : : } 127 : : 128 : : void drm_gem_shmem_purge_locked(struct drm_gem_object *obj); 129 : : bool drm_gem_shmem_purge(struct drm_gem_object *obj); 130 : : 131 : : struct drm_gem_shmem_object * 132 : : drm_gem_shmem_create_with_handle(struct drm_file *file_priv, 133 : : struct drm_device *dev, size_t size, 134 : : uint32_t *handle); 135 : : int drm_gem_shmem_dumb_create(struct drm_file *file, struct drm_device *dev, 136 : : struct drm_mode_create_dumb *args); 137 : : 138 : : int drm_gem_shmem_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma); 139 : : 140 : : void drm_gem_shmem_print_info(struct drm_printer *p, unsigned int indent, 141 : : const struct drm_gem_object *obj); 142 : : 143 : : struct sg_table *drm_gem_shmem_get_sg_table(struct drm_gem_object *obj); 144 : : struct drm_gem_object * 145 : : drm_gem_shmem_prime_import_sg_table(struct drm_device *dev, 146 : : struct dma_buf_attachment *attach, 147 : : struct sg_table *sgt); 148 : : 149 : : struct sg_table *drm_gem_shmem_get_pages_sgt(struct drm_gem_object *obj); 150 : : 151 : : /** 152 : : * DRM_GEM_SHMEM_DRIVER_OPS - Default shmem GEM operations 153 : : * 154 : : * This macro provides a shortcut for setting the shmem GEM operations in 155 : : * the &drm_driver structure. 156 : : */ 157 : : #define DRM_GEM_SHMEM_DRIVER_OPS \ 158 : : .prime_handle_to_fd = drm_gem_prime_handle_to_fd, \ 159 : : .prime_fd_to_handle = drm_gem_prime_fd_to_handle, \ 160 : : .gem_prime_import_sg_table = drm_gem_shmem_prime_import_sg_table, \ 161 : : .gem_prime_mmap = drm_gem_prime_mmap, \ 162 : : .dumb_create = drm_gem_shmem_dumb_create 163 : : 164 : : #endif /* __DRM_GEM_SHMEM_HELPER_H__ */