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