Linux Audio

Check our new training course

Loading...
v5.4
  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__ */
v5.9
  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	 * @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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
109struct drm_gem_shmem_object *drm_gem_shmem_create(struct drm_device *dev, size_t size);
110void drm_gem_shmem_free_object(struct drm_gem_object *obj);
111
112int drm_gem_shmem_get_pages(struct drm_gem_shmem_object *shmem);
113void drm_gem_shmem_put_pages(struct drm_gem_shmem_object *shmem);
114int drm_gem_shmem_pin(struct drm_gem_object *obj);
115void drm_gem_shmem_unpin(struct drm_gem_object *obj);
116void *drm_gem_shmem_vmap(struct drm_gem_object *obj);
117void drm_gem_shmem_vunmap(struct drm_gem_object *obj, void *vaddr);
118
119int drm_gem_shmem_madvise(struct drm_gem_object *obj, int madv);
120
121static inline bool drm_gem_shmem_is_purgeable(struct drm_gem_shmem_object *shmem)
122{
123	return (shmem->madv > 0) &&
124		!shmem->vmap_use_count && shmem->sgt &&
125		!shmem->base.dma_buf && !shmem->base.import_attach;
126}
127
128void drm_gem_shmem_purge_locked(struct drm_gem_object *obj);
129bool drm_gem_shmem_purge(struct drm_gem_object *obj);
130
131struct drm_gem_shmem_object *
132drm_gem_shmem_create_with_handle(struct drm_file *file_priv,
133				 struct drm_device *dev, size_t size,
134				 uint32_t *handle);
135
136struct drm_gem_object *
137drm_gem_shmem_create_object_cached(struct drm_device *dev, size_t size);
138
139int drm_gem_shmem_dumb_create(struct drm_file *file, struct drm_device *dev,
140			      struct drm_mode_create_dumb *args);
141
142int drm_gem_shmem_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
 
 
143
144void drm_gem_shmem_print_info(struct drm_printer *p, unsigned int indent,
145			      const struct drm_gem_object *obj);
146
147struct sg_table *drm_gem_shmem_get_sg_table(struct drm_gem_object *obj);
148struct drm_gem_object *
149drm_gem_shmem_prime_import_sg_table(struct drm_device *dev,
150				    struct dma_buf_attachment *attach,
151				    struct sg_table *sgt);
152
153struct sg_table *drm_gem_shmem_get_pages_sgt(struct drm_gem_object *obj);
154
155/**
156 * DRM_GEM_SHMEM_DRIVER_OPS - Default shmem GEM operations
157 *
158 * This macro provides a shortcut for setting the shmem GEM operations in
159 * the &drm_driver structure.
160 */
161#define DRM_GEM_SHMEM_DRIVER_OPS \
162	.prime_handle_to_fd	= drm_gem_prime_handle_to_fd, \
163	.prime_fd_to_handle	= drm_gem_prime_fd_to_handle, \
164	.gem_prime_import_sg_table = drm_gem_shmem_prime_import_sg_table, \
165	.gem_prime_mmap		= drm_gem_prime_mmap, \
166	.dumb_create		= drm_gem_shmem_dumb_create
167
168#endif /* __DRM_GEM_SHMEM_HELPER_H__ */