root/include/drm/drm_gem_shmem_helper.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. drm_gem_shmem_is_purgeable

   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 #define to_drm_gem_shmem_obj(obj) \
 102         container_of(obj, struct drm_gem_shmem_object, base)
 103 
 104 /**
 105  * DEFINE_DRM_GEM_SHMEM_FOPS() - Macro to generate file operations for shmem drivers
 106  * @name: name for the generated structure
 107  *
 108  * This macro autogenerates a suitable &struct file_operations for shmem based
 109  * drivers, which can be assigned to &drm_driver.fops. Note that this structure
 110  * cannot be shared between drivers, because it contains a reference to the
 111  * current module using THIS_MODULE.
 112  *
 113  * Note that the declaration is already marked as static - if you need a
 114  * non-static version of this you're probably doing it wrong and will break the
 115  * THIS_MODULE reference by accident.
 116  */
 117 #define DEFINE_DRM_GEM_SHMEM_FOPS(name) \
 118         static const struct file_operations name = {\
 119                 .owner          = THIS_MODULE,\
 120                 .open           = drm_open,\
 121                 .release        = drm_release,\
 122                 .unlocked_ioctl = drm_ioctl,\
 123                 .compat_ioctl   = drm_compat_ioctl,\
 124                 .poll           = drm_poll,\
 125                 .read           = drm_read,\
 126                 .llseek         = noop_llseek,\
 127                 .mmap           = drm_gem_shmem_mmap, \
 128         }
 129 
 130 struct drm_gem_shmem_object *drm_gem_shmem_create(struct drm_device *dev, size_t size);
 131 void drm_gem_shmem_free_object(struct drm_gem_object *obj);
 132 
 133 int drm_gem_shmem_get_pages(struct drm_gem_shmem_object *shmem);
 134 void drm_gem_shmem_put_pages(struct drm_gem_shmem_object *shmem);
 135 int drm_gem_shmem_pin(struct drm_gem_object *obj);
 136 void drm_gem_shmem_unpin(struct drm_gem_object *obj);
 137 void *drm_gem_shmem_vmap(struct drm_gem_object *obj);
 138 void drm_gem_shmem_vunmap(struct drm_gem_object *obj, void *vaddr);
 139 
 140 int drm_gem_shmem_madvise(struct drm_gem_object *obj, int madv);
 141 
 142 static inline bool drm_gem_shmem_is_purgeable(struct drm_gem_shmem_object *shmem)
 143 {
 144         return (shmem->madv > 0) &&
 145                 !shmem->vmap_use_count && shmem->sgt &&
 146                 !shmem->base.dma_buf && !shmem->base.import_attach;
 147 }
 148 
 149 void drm_gem_shmem_purge_locked(struct drm_gem_object *obj);
 150 bool drm_gem_shmem_purge(struct drm_gem_object *obj);
 151 
 152 struct drm_gem_shmem_object *
 153 drm_gem_shmem_create_with_handle(struct drm_file *file_priv,
 154                                  struct drm_device *dev, size_t size,
 155                                  uint32_t *handle);
 156 int drm_gem_shmem_dumb_create(struct drm_file *file, struct drm_device *dev,
 157                               struct drm_mode_create_dumb *args);
 158 
 159 int drm_gem_shmem_mmap(struct file *filp, struct vm_area_struct *vma);
 160 
 161 extern const struct vm_operations_struct drm_gem_shmem_vm_ops;
 162 
 163 void drm_gem_shmem_print_info(struct drm_printer *p, unsigned int indent,
 164                               const struct drm_gem_object *obj);
 165 
 166 struct sg_table *drm_gem_shmem_get_sg_table(struct drm_gem_object *obj);
 167 struct drm_gem_object *
 168 drm_gem_shmem_prime_import_sg_table(struct drm_device *dev,
 169                                     struct dma_buf_attachment *attach,
 170                                     struct sg_table *sgt);
 171 
 172 struct sg_table *drm_gem_shmem_get_pages_sgt(struct drm_gem_object *obj);
 173 
 174 /**
 175  * DRM_GEM_SHMEM_DRIVER_OPS - Default shmem GEM operations
 176  *
 177  * This macro provides a shortcut for setting the shmem GEM operations in
 178  * the &drm_driver structure.
 179  */
 180 #define DRM_GEM_SHMEM_DRIVER_OPS \
 181         .prime_handle_to_fd     = drm_gem_prime_handle_to_fd, \
 182         .prime_fd_to_handle     = drm_gem_prime_fd_to_handle, \
 183         .gem_prime_import_sg_table = drm_gem_shmem_prime_import_sg_table, \
 184         .gem_prime_mmap         = drm_gem_prime_mmap, \
 185         .dumb_create            = drm_gem_shmem_dumb_create
 186 
 187 #endif /* __DRM_GEM_SHMEM_HELPER_H__ */

/* [<][>][^][v][top][bottom][index][help] */