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