xref: /linux/drivers/gpu/drm/exynos/exynos_drm_gem.h (revision 813fd67b57ffca0dd19fe1834f894a4558cf5e0b)
11c248b7dSInki Dae /* exynos_drm_gem.h
21c248b7dSInki Dae  *
31c248b7dSInki Dae  * Copyright (c) 2011 Samsung Electronics Co., Ltd.
41c248b7dSInki Dae  * Authoer: Inki Dae <inki.dae@samsung.com>
51c248b7dSInki Dae  *
6d81aecb5SInki Dae  * This program is free software; you can redistribute  it and/or modify it
7d81aecb5SInki Dae  * under  the terms of  the GNU General  Public License as published by the
8d81aecb5SInki Dae  * Free Software Foundation;  either version 2 of the  License, or (at your
9d81aecb5SInki Dae  * option) any later version.
101c248b7dSInki Dae  */
111c248b7dSInki Dae 
121c248b7dSInki Dae #ifndef _EXYNOS_DRM_GEM_H_
131c248b7dSInki Dae #define _EXYNOS_DRM_GEM_H_
141c248b7dSInki Dae 
15d9fc9413SDaniel Vetter #include <drm/drm_gem.h>
16d9fc9413SDaniel Vetter 
17*813fd67bSJoonyoung Shim #define to_exynos_gem(x)	container_of(x, struct exynos_drm_gem, base)
181c248b7dSInki Dae 
19dcf9af82SInki Dae #define IS_NONCONTIG_BUFFER(f)		(f & EXYNOS_BO_NONCONTIG)
20dcf9af82SInki Dae 
211c248b7dSInki Dae /*
221c248b7dSInki Dae  * exynos drm buffer structure.
231c248b7dSInki Dae  *
241c248b7dSInki Dae  * @base: a gem object.
251c248b7dSInki Dae  *	- a new handle to this gem object would be created
261c248b7dSInki Dae  *	by drm_gem_handle_create().
272c871127SInki Dae  * @buffer: a pointer to exynos_drm_gem_buffer object.
282c871127SInki Dae  *	- contain the information to memory region allocated
292c871127SInki Dae  *	by user request or at framebuffer creation.
301c248b7dSInki Dae  *	continuous memory region allocated by user request
311c248b7dSInki Dae  *	or at framebuffer creation.
322a8cb489SJoonyoung Shim  * @flags: indicate memory type to allocated buffer and cache attruibute.
333c52b880SInki Dae  * @size: size requested from user, in bytes and this size is aligned
343c52b880SInki Dae  *	in page unit.
352a8cb489SJoonyoung Shim  * @cookie: cookie returned by dma_alloc_attrs
362a8cb489SJoonyoung Shim  * @kvaddr: kernel virtual address to allocated memory region.
372a8cb489SJoonyoung Shim  * @dma_addr: bus address(accessed by dma) to allocated memory region.
382a8cb489SJoonyoung Shim  *	- this address could be physical address without IOMMU and
392a8cb489SJoonyoung Shim  *	device address with IOMMU.
402a8cb489SJoonyoung Shim  * @pages: Array of backing pages.
417c93537aSJoonyoung Shim  * @sgt: Imported sg_table.
421c248b7dSInki Dae  *
43c6b78bc8SMasanari Iida  * P.S. this object would be transferred to user as kms_bo.handle so
441c248b7dSInki Dae  *	user can access the buffer through kms_bo.handle.
451c248b7dSInki Dae  */
46*813fd67bSJoonyoung Shim struct exynos_drm_gem {
471c248b7dSInki Dae 	struct drm_gem_object	base;
482b35892eSInki Dae 	unsigned int		flags;
492a8cb489SJoonyoung Shim 	unsigned long		size;
502a8cb489SJoonyoung Shim 	void			*cookie;
512a8cb489SJoonyoung Shim 	void __iomem		*kvaddr;
522a8cb489SJoonyoung Shim 	dma_addr_t		dma_addr;
532a8cb489SJoonyoung Shim 	struct dma_attrs	dma_attrs;
542a8cb489SJoonyoung Shim 	struct page		**pages;
557c93537aSJoonyoung Shim 	struct sg_table		*sgt;
561c248b7dSInki Dae };
571c248b7dSInki Dae 
58b2df26c1SInki Dae struct page **exynos_gem_get_pages(struct drm_gem_object *obj, gfp_t gfpmask);
59b2df26c1SInki Dae 
602364839aSJoonyoung Shim /* destroy a buffer with gem object */
61*813fd67bSJoonyoung Shim void exynos_drm_gem_destroy(struct exynos_drm_gem *exynos_gem);
622364839aSJoonyoung Shim 
632364839aSJoonyoung Shim /* create a new buffer with gem object */
64*813fd67bSJoonyoung Shim struct exynos_drm_gem *exynos_drm_gem_create(struct drm_device *dev,
652b35892eSInki Dae 					     unsigned int flags,
66ee5e770eSJoonyoung Shim 					     unsigned long size);
671c248b7dSInki Dae 
681c248b7dSInki Dae /*
691c248b7dSInki Dae  * request gem object creation and buffer allocation as the size
701c248b7dSInki Dae  * that it is calculated with framebuffer information such as width,
711c248b7dSInki Dae  * height and bpp.
721c248b7dSInki Dae  */
731c248b7dSInki Dae int exynos_drm_gem_create_ioctl(struct drm_device *dev, void *data,
741c248b7dSInki Dae 				struct drm_file *file_priv);
751c248b7dSInki Dae 
76f0b1bda7SInki Dae /*
77f0b1bda7SInki Dae  * get dma address from gem handle and this function could be used for
78f0b1bda7SInki Dae  * other drivers such as 2d/3d acceleration drivers.
79f0b1bda7SInki Dae  * with this function call, gem object reference count would be increased.
80f0b1bda7SInki Dae  */
81d87342c1SInki Dae dma_addr_t *exynos_drm_gem_get_dma_addr(struct drm_device *dev,
82f0b1bda7SInki Dae 					unsigned int gem_handle,
83d87342c1SInki Dae 					struct drm_file *filp);
84f0b1bda7SInki Dae 
85f0b1bda7SInki Dae /*
86f0b1bda7SInki Dae  * put dma address from gem handle and this function could be used for
87f0b1bda7SInki Dae  * other drivers such as 2d/3d acceleration drivers.
88f0b1bda7SInki Dae  * with this function call, gem object reference count would be decreased.
89f0b1bda7SInki Dae  */
90f0b1bda7SInki Dae void exynos_drm_gem_put_dma_addr(struct drm_device *dev,
91f0b1bda7SInki Dae 					unsigned int gem_handle,
92d87342c1SInki Dae 					struct drm_file *filp);
93f0b1bda7SInki Dae 
942a3098ffSInki Dae /* map user space allocated by malloc to pages. */
952a3098ffSInki Dae int exynos_drm_gem_userptr_ioctl(struct drm_device *dev, void *data,
962a3098ffSInki Dae 				      struct drm_file *file_priv);
972a3098ffSInki Dae 
9840cd7e0cSInki Dae /* get buffer information to memory region allocated by gem. */
9940cd7e0cSInki Dae int exynos_drm_gem_get_ioctl(struct drm_device *dev, void *data,
10040cd7e0cSInki Dae 				      struct drm_file *file_priv);
10140cd7e0cSInki Dae 
102a4f19aaaSInki Dae /* get buffer size to gem handle. */
103a4f19aaaSInki Dae unsigned long exynos_drm_gem_get_size(struct drm_device *dev,
104a4f19aaaSInki Dae 						unsigned int gem_handle,
105a4f19aaaSInki Dae 						struct drm_file *file_priv);
106a4f19aaaSInki Dae 
1071c248b7dSInki Dae /* free gem object. */
108*813fd67bSJoonyoung Shim void exynos_drm_gem_free_object(struct drm_gem_object *obj);
1091c248b7dSInki Dae 
1101c248b7dSInki Dae /* create memory region for drm framebuffer. */
1111c248b7dSInki Dae int exynos_drm_gem_dumb_create(struct drm_file *file_priv,
112ee5e770eSJoonyoung Shim 			       struct drm_device *dev,
113ee5e770eSJoonyoung Shim 			       struct drm_mode_create_dumb *args);
1141c248b7dSInki Dae 
1151c248b7dSInki Dae /* map memory region for drm framebuffer to user space. */
1161c248b7dSInki Dae int exynos_drm_gem_dumb_map_offset(struct drm_file *file_priv,
117ee5e770eSJoonyoung Shim 				   struct drm_device *dev, uint32_t handle,
118ee5e770eSJoonyoung Shim 				   uint64_t *offset);
1191c248b7dSInki Dae 
120ee5e770eSJoonyoung Shim /* page fault handler and mmap fault address(virtual) to physical memory. */
121ee5e770eSJoonyoung Shim int exynos_drm_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf);
122ee5e770eSJoonyoung Shim 
123ee5e770eSJoonyoung Shim /* set vm_flags and we can change the vm attribute to other one at here. */
124ee5e770eSJoonyoung Shim int exynos_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
1251c248b7dSInki Dae 
1262a3098ffSInki Dae static inline int vma_is_io(struct vm_area_struct *vma)
1272a3098ffSInki Dae {
1282a3098ffSInki Dae 	return !!(vma->vm_flags & (VM_IO | VM_PFNMAP));
1292a3098ffSInki Dae }
1302a3098ffSInki Dae 
1312a3098ffSInki Dae /* get a copy of a virtual memory region. */
1322a3098ffSInki Dae struct vm_area_struct *exynos_gem_get_vma(struct vm_area_struct *vma);
1332a3098ffSInki Dae 
1342a3098ffSInki Dae /* release a userspace virtual memory area. */
1352a3098ffSInki Dae void exynos_gem_put_vma(struct vm_area_struct *vma);
1362a3098ffSInki Dae 
1372a3098ffSInki Dae /* get pages from user space. */
1382a3098ffSInki Dae int exynos_gem_get_pages_from_userptr(unsigned long start,
1392a3098ffSInki Dae 						unsigned int npages,
1402a3098ffSInki Dae 						struct page **pages,
1412a3098ffSInki Dae 						struct vm_area_struct *vma);
1422a3098ffSInki Dae 
1432a3098ffSInki Dae /* drop the reference to pages. */
1442a3098ffSInki Dae void exynos_gem_put_pages_to_userptr(struct page **pages,
1452a3098ffSInki Dae 					unsigned int npages,
1462a3098ffSInki Dae 					struct vm_area_struct *vma);
1472a3098ffSInki Dae 
1482a3098ffSInki Dae /* map sgt with dma region. */
1492a3098ffSInki Dae int exynos_gem_map_sgt_with_dma(struct drm_device *drm_dev,
1502a3098ffSInki Dae 				struct sg_table *sgt,
1512a3098ffSInki Dae 				enum dma_data_direction dir);
1522a3098ffSInki Dae 
1532a3098ffSInki Dae /* unmap sgt from dma region. */
1542a3098ffSInki Dae void exynos_gem_unmap_sgt_from_dma(struct drm_device *drm_dev,
1552a3098ffSInki Dae 				struct sg_table *sgt,
1562a3098ffSInki Dae 				enum dma_data_direction dir);
1572a3098ffSInki Dae 
15801ed50ddSJoonyoung Shim /* low-level interface prime helpers */
15901ed50ddSJoonyoung Shim struct sg_table *exynos_drm_gem_prime_get_sg_table(struct drm_gem_object *obj);
16001ed50ddSJoonyoung Shim struct drm_gem_object *
16101ed50ddSJoonyoung Shim exynos_drm_gem_prime_import_sg_table(struct drm_device *dev,
16201ed50ddSJoonyoung Shim 				     struct dma_buf_attachment *attach,
16301ed50ddSJoonyoung Shim 				     struct sg_table *sgt);
16401ed50ddSJoonyoung Shim void *exynos_drm_gem_prime_vmap(struct drm_gem_object *obj);
16501ed50ddSJoonyoung Shim void exynos_drm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
16601ed50ddSJoonyoung Shim 
1671c248b7dSInki Dae #endif
168