diff options
Diffstat (limited to 'drivers/gpu/drm/exynos/exynos_drm_gem.h')
| -rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_gem.h | 80 | 
1 files changed, 55 insertions, 25 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.h b/drivers/gpu/drm/exynos/exynos_drm_gem.h index 085b2a5d5f7..35ebac47dc2 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.h +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.h @@ -3,24 +3,10 @@   * Copyright (c) 2011 Samsung Electronics Co., Ltd.   * Authoer: Inki Dae <inki.dae@samsung.com>   * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version.   */  #ifndef _EXYNOS_DRM_GEM_H_ @@ -35,21 +21,27 @@   * exynos drm gem buffer structure.   *   * @kvaddr: kernel virtual address to allocated memory region. + * *userptr: user space address.   * @dma_addr: bus address(accessed by dma) to allocated memory region.   *	- this address could be physical address without IOMMU and   *	device address with IOMMU. + * @write: whether pages will be written to by the caller. + * @pages: Array of backing pages.   * @sgt: sg table to transfer page data. - * @pages: contain all pages to allocated memory region. - * @page_size: could be 4K, 64K or 1MB.   * @size: size of allocated memory region. + * @pfnmap: indicate whether memory region from userptr is mmaped with + *	VM_PFNMAP or not.   */  struct exynos_drm_gem_buf {  	void __iomem		*kvaddr; +	unsigned long		userptr;  	dma_addr_t		dma_addr; -	struct sg_table		*sgt; +	struct dma_attrs	dma_attrs; +	unsigned int		write;  	struct page		**pages; -	unsigned long		page_size; +	struct sg_table		*sgt;  	unsigned long		size; +	bool			pfnmap;  };  /* @@ -65,6 +57,7 @@ struct exynos_drm_gem_buf {   *	or at framebuffer creation.   * @size: size requested from user, in bytes and this size is aligned   *	in page unit. + * @vma: a pointer to vm_area.   * @flags: indicate memory type to allocated buffer and cache attruibute.   *   * P.S. this object would be transfered to user as kms_bo.handle so @@ -74,6 +67,7 @@ struct exynos_drm_gem_obj {  	struct drm_gem_object		base;  	struct exynos_drm_gem_buf	*buffer;  	unsigned long			size; +	struct vm_area_struct		*vma;  	unsigned int			flags;  }; @@ -104,9 +98,9 @@ int exynos_drm_gem_create_ioctl(struct drm_device *dev, void *data,   * other drivers such as 2d/3d acceleration drivers.   * with this function call, gem object reference count would be increased.   */ -void *exynos_drm_gem_get_dma_addr(struct drm_device *dev, +dma_addr_t *exynos_drm_gem_get_dma_addr(struct drm_device *dev,  					unsigned int gem_handle, -					struct drm_file *file_priv); +					struct drm_file *filp);  /*   * put dma address from gem handle and this function could be used for @@ -115,7 +109,7 @@ void *exynos_drm_gem_get_dma_addr(struct drm_device *dev,   */  void exynos_drm_gem_put_dma_addr(struct drm_device *dev,  					unsigned int gem_handle, -					struct drm_file *file_priv); +					struct drm_file *filp);  /* get buffer offset to map to user space. */  int exynos_drm_gem_map_offset_ioctl(struct drm_device *dev, void *data, @@ -128,6 +122,10 @@ int exynos_drm_gem_map_offset_ioctl(struct drm_device *dev, void *data,  int exynos_drm_gem_mmap_ioctl(struct drm_device *dev, void *data,  			      struct drm_file *file_priv); +/* map user space allocated by malloc to pages. */ +int exynos_drm_gem_userptr_ioctl(struct drm_device *dev, void *data, +				      struct drm_file *file_priv); +  /* get buffer information to memory region allocated by gem. */  int exynos_drm_gem_get_ioctl(struct drm_device *dev, void *data,  				      struct drm_file *file_priv); @@ -163,4 +161,36 @@ int exynos_drm_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf);  /* set vm_flags and we can change the vm attribute to other one at here. */  int exynos_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma); +static inline int vma_is_io(struct vm_area_struct *vma) +{ +	return !!(vma->vm_flags & (VM_IO | VM_PFNMAP)); +} + +/* get a copy of a virtual memory region. */ +struct vm_area_struct *exynos_gem_get_vma(struct vm_area_struct *vma); + +/* release a userspace virtual memory area. */ +void exynos_gem_put_vma(struct vm_area_struct *vma); + +/* get pages from user space. */ +int exynos_gem_get_pages_from_userptr(unsigned long start, +						unsigned int npages, +						struct page **pages, +						struct vm_area_struct *vma); + +/* drop the reference to pages. */ +void exynos_gem_put_pages_to_userptr(struct page **pages, +					unsigned int npages, +					struct vm_area_struct *vma); + +/* map sgt with dma region. */ +int exynos_gem_map_sgt_with_dma(struct drm_device *drm_dev, +				struct sg_table *sgt, +				enum dma_data_direction dir); + +/* unmap sgt from dma region. */ +void exynos_gem_unmap_sgt_from_dma(struct drm_device *drm_dev, +				struct sg_table *sgt, +				enum dma_data_direction dir); +  #endif  |