xref: /openbmc/linux/include/drm/drm_prime.h (revision 379af079)
1c6bb9baaSDaniel Vetter /*
2c6bb9baaSDaniel Vetter  * Copyright © 2012 Red Hat
3c6bb9baaSDaniel Vetter  * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
4c6bb9baaSDaniel Vetter  * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
5c6bb9baaSDaniel Vetter  * Copyright (c) 2009-2010, Code Aurora Forum.
6c6bb9baaSDaniel Vetter  *
7c6bb9baaSDaniel Vetter  * Permission is hereby granted, free of charge, to any person obtaining a
8c6bb9baaSDaniel Vetter  * copy of this software and associated documentation files (the "Software"),
9c6bb9baaSDaniel Vetter  * to deal in the Software without restriction, including without limitation
10c6bb9baaSDaniel Vetter  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11c6bb9baaSDaniel Vetter  * and/or sell copies of the Software, and to permit persons to whom the
12c6bb9baaSDaniel Vetter  * Software is furnished to do so, subject to the following conditions:
13c6bb9baaSDaniel Vetter  *
14c6bb9baaSDaniel Vetter  * The above copyright notice and this permission notice (including the next
15c6bb9baaSDaniel Vetter  * paragraph) shall be included in all copies or substantial portions of the
16c6bb9baaSDaniel Vetter  * Software.
17c6bb9baaSDaniel Vetter  *
18c6bb9baaSDaniel Vetter  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19c6bb9baaSDaniel Vetter  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20c6bb9baaSDaniel Vetter  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21c6bb9baaSDaniel Vetter  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22c6bb9baaSDaniel Vetter  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23c6bb9baaSDaniel Vetter  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
24c6bb9baaSDaniel Vetter  * IN THE SOFTWARE.
25c6bb9baaSDaniel Vetter  *
26c6bb9baaSDaniel Vetter  * Authors:
27c6bb9baaSDaniel Vetter  *      Dave Airlie <airlied@redhat.com>
28c6bb9baaSDaniel Vetter  *      Rob Clark <rob.clark@linaro.org>
29c6bb9baaSDaniel Vetter  *
30c6bb9baaSDaniel Vetter  */
31c6bb9baaSDaniel Vetter 
32c6bb9baaSDaniel Vetter #ifndef __DRM_PRIME_H__
33c6bb9baaSDaniel Vetter #define __DRM_PRIME_H__
34c6bb9baaSDaniel Vetter 
35c6bb9baaSDaniel Vetter #include <linux/mutex.h>
36c6bb9baaSDaniel Vetter #include <linux/rbtree.h>
37a8f8b1d9SDaniel Vetter #include <linux/scatterlist.h>
38c6bb9baaSDaniel Vetter 
39c6bb9baaSDaniel Vetter /**
40c6bb9baaSDaniel Vetter  * struct drm_prime_file_private - per-file tracking for PRIME
41c6bb9baaSDaniel Vetter  *
42c6bb9baaSDaniel Vetter  * This just contains the internal &struct dma_buf and handle caches for each
43c6bb9baaSDaniel Vetter  * &struct drm_file used by the PRIME core code.
44c6bb9baaSDaniel Vetter  */
45c6bb9baaSDaniel Vetter struct drm_prime_file_private {
46c6bb9baaSDaniel Vetter /* private: */
47c6bb9baaSDaniel Vetter 	struct mutex lock;
48c6bb9baaSDaniel Vetter 	struct rb_root dmabufs;
49c6bb9baaSDaniel Vetter 	struct rb_root handles;
50c6bb9baaSDaniel Vetter };
51c6bb9baaSDaniel Vetter 
52bebc1d55SLaura Abbott struct device;
53bebc1d55SLaura Abbott 
54c6bb9baaSDaniel Vetter struct dma_buf_export_info;
55c6bb9baaSDaniel Vetter struct dma_buf;
56c308279fSSamuel Li struct dma_buf_attachment;
577938f421SLucas De Marchi struct iosys_map;
58c308279fSSamuel Li 
59c308279fSSamuel Li enum dma_data_direction;
60c6bb9baaSDaniel Vetter 
61c6bb9baaSDaniel Vetter struct drm_device;
62c6bb9baaSDaniel Vetter struct drm_gem_object;
63*379af079SFelix Kuehling struct drm_file;
64c6bb9baaSDaniel Vetter 
65b283e92aSDaniel Vetter /* core prime functions */
66c6bb9baaSDaniel Vetter struct dma_buf *drm_gem_dmabuf_export(struct drm_device *dev,
67c6bb9baaSDaniel Vetter 				      struct dma_buf_export_info *exp_info);
6891faa047SDaniel Vetter void drm_gem_dmabuf_release(struct dma_buf *dma_buf);
69b283e92aSDaniel Vetter 
70*379af079SFelix Kuehling int drm_gem_prime_fd_to_handle(struct drm_device *dev,
71*379af079SFelix Kuehling 			       struct drm_file *file_priv, int prime_fd, uint32_t *handle);
72*379af079SFelix Kuehling int drm_gem_prime_handle_to_fd(struct drm_device *dev,
73*379af079SFelix Kuehling 			       struct drm_file *file_priv, uint32_t handle, uint32_t flags,
74*379af079SFelix Kuehling 			       int *prime_fd);
75*379af079SFelix Kuehling 
76b283e92aSDaniel Vetter /* helper functions for exporting */
77a19741e5SChristian König int drm_gem_map_attach(struct dma_buf *dma_buf,
78c308279fSSamuel Li 		       struct dma_buf_attachment *attach);
79c308279fSSamuel Li void drm_gem_map_detach(struct dma_buf *dma_buf,
80c308279fSSamuel Li 			struct dma_buf_attachment *attach);
81c308279fSSamuel Li struct sg_table *drm_gem_map_dma_buf(struct dma_buf_attachment *attach,
82c308279fSSamuel Li 				     enum dma_data_direction dir);
83c308279fSSamuel Li void drm_gem_unmap_dma_buf(struct dma_buf_attachment *attach,
84c308279fSSamuel Li 			   struct sg_table *sgt,
85c308279fSSamuel Li 			   enum dma_data_direction dir);
867938f421SLucas De Marchi int drm_gem_dmabuf_vmap(struct dma_buf *dma_buf, struct iosys_map *map);
877938f421SLucas De Marchi void drm_gem_dmabuf_vunmap(struct dma_buf *dma_buf, struct iosys_map *map);
88b283e92aSDaniel Vetter 
89b283e92aSDaniel Vetter int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
90c308279fSSamuel Li int drm_gem_dmabuf_mmap(struct dma_buf *dma_buf, struct vm_area_struct *vma);
91c6bb9baaSDaniel Vetter 
92707d561fSGerd Hoffmann struct sg_table *drm_prime_pages_to_sg(struct drm_device *dev,
93707d561fSGerd Hoffmann 				       struct page **pages, unsigned int nr_pages);
94e4fa8457SDaniel Vetter struct dma_buf *drm_gem_prime_export(struct drm_gem_object *obj,
95b283e92aSDaniel Vetter 				     int flags);
96b283e92aSDaniel Vetter 
97d46e7ae2SMarek Szyprowski unsigned long drm_prime_get_contiguous_size(struct sg_table *sgt);
98d46e7ae2SMarek Szyprowski 
99b283e92aSDaniel Vetter /* helper functions for importing */
100b283e92aSDaniel Vetter struct drm_gem_object *drm_gem_prime_import_dev(struct drm_device *dev,
101b283e92aSDaniel Vetter 						struct dma_buf *dma_buf,
102b283e92aSDaniel Vetter 						struct device *attach_dev);
103b283e92aSDaniel Vetter struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
104b283e92aSDaniel Vetter 					    struct dma_buf *dma_buf);
105b283e92aSDaniel Vetter 
106b283e92aSDaniel Vetter void drm_prime_gem_destroy(struct drm_gem_object *obj, struct sg_table *sg);
107b283e92aSDaniel Vetter 
108c67e6279SChristian König int drm_prime_sg_to_page_array(struct sg_table *sgt, struct page **pages,
109c67e6279SChristian König 			       int max_pages);
110c67e6279SChristian König int drm_prime_sg_to_dma_addr_array(struct sg_table *sgt, dma_addr_t *addrs,
111c67e6279SChristian König 				   int max_pages);
112c6bb9baaSDaniel Vetter 
113c6bb9baaSDaniel Vetter #endif /* __DRM_PRIME_H__ */
114