linux/include/drm/drm_gem_shmem_helper.h
<<
>>
Prefs
   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
  15struct dma_buf_attachment;
  16struct drm_mode_create_dumb;
  17struct drm_printer;
  18struct sg_table;
  19
  20/**
  21 * struct drm_gem_shmem_object - GEM object backed by shmem
  22 */
  23struct 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
 130struct drm_gem_shmem_object *drm_gem_shmem_create(struct drm_device *dev, size_t size);
 131void drm_gem_shmem_free_object(struct drm_gem_object *obj);
 132
 133int drm_gem_shmem_get_pages(struct drm_gem_shmem_object *shmem);
 134void drm_gem_shmem_put_pages(struct drm_gem_shmem_object *shmem);
 135int drm_gem_shmem_pin(struct drm_gem_object *obj);
 136void drm_gem_shmem_unpin(struct drm_gem_object *obj);
 137void *drm_gem_shmem_vmap(struct drm_gem_object *obj);
 138void drm_gem_shmem_vunmap(struct drm_gem_object *obj, void *vaddr);
 139
 140int drm_gem_shmem_madvise(struct drm_gem_object *obj, int madv);
 141
 142static 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
 149void drm_gem_shmem_purge_locked(struct drm_gem_object *obj);
 150bool drm_gem_shmem_purge(struct drm_gem_object *obj);
 151
 152struct drm_gem_shmem_object *
 153drm_gem_shmem_create_with_handle(struct drm_file *file_priv,
 154                                 struct drm_device *dev, size_t size,
 155                                 uint32_t *handle);
 156int drm_gem_shmem_dumb_create(struct drm_file *file, struct drm_device *dev,
 157                              struct drm_mode_create_dumb *args);
 158
 159int drm_gem_shmem_mmap(struct file *filp, struct vm_area_struct *vma);
 160
 161extern const struct vm_operations_struct drm_gem_shmem_vm_ops;
 162
 163void drm_gem_shmem_print_info(struct drm_printer *p, unsigned int indent,
 164                              const struct drm_gem_object *obj);
 165
 166struct sg_table *drm_gem_shmem_get_sg_table(struct drm_gem_object *obj);
 167struct drm_gem_object *
 168drm_gem_shmem_prime_import_sg_table(struct drm_device *dev,
 169                                    struct dma_buf_attachment *attach,
 170                                    struct sg_table *sgt);
 171
 172struct 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__ */
 188