2011-10-04 14:19:01 +04:00
/* exynos_drm_gem.h
*
* Copyright ( c ) 2011 Samsung Electronics Co . , Ltd .
* Authoer : Inki Dae < inki . dae @ samsung . com >
*
2012-12-17 21:30:17 +04:00
* 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 .
2011-10-04 14:19:01 +04:00
*/
# ifndef _EXYNOS_DRM_GEM_H_
# define _EXYNOS_DRM_GEM_H_
2014-09-23 17:46:53 +04:00
# include <drm/drm_gem.h>
2015-10-02 03:33:47 +03:00
# define to_exynos_gem(x) container_of(x, struct exynos_drm_gem, base)
2011-10-04 14:19:01 +04:00
2012-04-03 16:27:58 +04:00
# define IS_NONCONTIG_BUFFER(f) (f & EXYNOS_BO_NONCONTIG)
2011-10-04 14:19:01 +04:00
/*
* exynos drm buffer structure .
*
* @ base : a gem object .
* - a new handle to this gem object would be created
* by drm_gem_handle_create ( ) .
2011-11-12 10:23:32 +04:00
* @ buffer : a pointer to exynos_drm_gem_buffer object .
* - contain the information to memory region allocated
* by user request or at framebuffer creation .
2011-10-04 14:19:01 +04:00
* continuous memory region allocated by user request
* or at framebuffer creation .
2015-08-16 08:38:49 +03:00
* @ flags : indicate memory type to allocated buffer and cache attruibute .
2012-06-29 11:28:17 +04:00
* @ size : size requested from user , in bytes and this size is aligned
* in page unit .
2015-08-16 08:38:49 +03:00
* @ cookie : cookie returned by dma_alloc_attrs
* @ kvaddr : kernel virtual address to allocated memory region .
* @ dma_addr : bus address ( accessed by dma ) to allocated memory region .
* - this address could be physical address without IOMMU and
* device address with IOMMU .
* @ pages : Array of backing pages .
2015-09-16 08:14:54 +03:00
* @ sgt : Imported sg_table .
2011-10-04 14:19:01 +04:00
*
2013-10-24 11:02:57 +04:00
* P . S . this object would be transferred to user as kms_bo . handle so
2011-10-04 14:19:01 +04:00
* user can access the buffer through kms_bo . handle .
*/
2015-10-02 03:33:47 +03:00
struct exynos_drm_gem {
2015-08-16 08:38:49 +03:00
struct drm_gem_object base ;
unsigned int flags ;
unsigned long size ;
void * cookie ;
void __iomem * kvaddr ;
dma_addr_t dma_addr ;
2016-08-03 23:46:00 +03:00
unsigned long dma_attrs ;
2015-08-16 08:38:49 +03:00
struct page * * pages ;
2015-09-16 08:14:54 +03:00
struct sg_table * sgt ;
2011-10-04 14:19:01 +04:00
} ;
2011-12-13 09:39:13 +04:00
/* destroy a buffer with gem object */
2015-10-02 03:33:47 +03:00
void exynos_drm_gem_destroy ( struct exynos_drm_gem * exynos_gem ) ;
2011-12-13 09:39:13 +04:00
/* create a new buffer with gem object */
2015-10-02 03:33:47 +03:00
struct exynos_drm_gem * exynos_drm_gem_create ( struct drm_device * dev ,
unsigned int flags ,
unsigned long size ) ;
2011-10-04 14:19:01 +04:00
/*
* request gem object creation and buffer allocation as the size
* that it is calculated with framebuffer information such as width ,
* height and bpp .
*/
int exynos_drm_gem_create_ioctl ( struct drm_device * dev , void * data ,
2011-12-13 09:20:23 +04:00
struct drm_file * file_priv ) ;
2011-10-04 14:19:01 +04:00
2016-03-08 08:12:59 +03:00
/* get fake-offset of gem object that can be used with mmap. */
int exynos_drm_gem_map_ioctl ( struct drm_device * dev , void * data ,
struct drm_file * file_priv ) ;
2012-03-16 13:47:06 +04:00
/*
* get dma address from gem handle and this function could be used for
* other drivers such as 2 d / 3 d acceleration drivers .
* with this function call , gem object reference count would be increased .
*/
2012-11-04 08:53:24 +04:00
dma_addr_t * exynos_drm_gem_get_dma_addr ( struct drm_device * dev ,
2012-03-16 13:47:06 +04:00
unsigned int gem_handle ,
2012-11-04 08:53:24 +04:00
struct drm_file * filp ) ;
2012-03-16 13:47:06 +04:00
/*
* put dma address from gem handle and this function could be used for
* other drivers such as 2 d / 3 d acceleration drivers .
* with this function call , gem object reference count would be decreased .
*/
void exynos_drm_gem_put_dma_addr ( struct drm_device * dev ,
unsigned int gem_handle ,
2012-11-04 08:53:24 +04:00
struct drm_file * filp ) ;
2012-03-16 13:47:06 +04:00
2012-05-04 10:51:17 +04:00
/* 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 ) ;
2013-03-11 16:15:59 +04:00
/* get buffer size to gem handle. */
unsigned long exynos_drm_gem_get_size ( struct drm_device * dev ,
unsigned int gem_handle ,
struct drm_file * file_priv ) ;
2011-10-04 14:19:01 +04:00
/* free gem object. */
2015-10-02 03:33:47 +03:00
void exynos_drm_gem_free_object ( struct drm_gem_object * obj ) ;
2011-10-04 14:19:01 +04:00
/* create memory region for drm framebuffer. */
int exynos_drm_gem_dumb_create ( struct drm_file * file_priv ,
2011-12-13 09:20:23 +04:00
struct drm_device * dev ,
struct drm_mode_create_dumb * args ) ;
2011-10-04 14:19:01 +04:00
/* map memory region for drm framebuffer to user space. */
int exynos_drm_gem_dumb_map_offset ( struct drm_file * file_priv ,
2011-12-13 09:20:23 +04:00
struct drm_device * dev , uint32_t handle ,
uint64_t * offset ) ;
2011-10-04 14:19:01 +04:00
2011-12-13 09:20:23 +04:00
/* page fault handler and mmap fault address(virtual) to physical memory. */
2017-02-25 01:56:41 +03:00
int exynos_drm_gem_fault ( struct vm_fault * vmf ) ;
2011-12-13 09:20:23 +04:00
/* 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 ) ;
2011-10-04 14:19:01 +04:00
2015-08-16 08:33:08 +03:00
/* low-level interface prime helpers */
struct sg_table * exynos_drm_gem_prime_get_sg_table ( struct drm_gem_object * obj ) ;
struct drm_gem_object *
exynos_drm_gem_prime_import_sg_table ( struct drm_device * dev ,
struct dma_buf_attachment * attach ,
struct sg_table * sgt ) ;
void * exynos_drm_gem_prime_vmap ( struct drm_gem_object * obj ) ;
void exynos_drm_gem_prime_vunmap ( struct drm_gem_object * obj , void * vaddr ) ;
2016-04-22 10:30:47 +03:00
int exynos_drm_gem_prime_mmap ( struct drm_gem_object * obj ,
struct vm_area_struct * vma ) ;
2015-08-16 08:33:08 +03:00
2011-10-04 14:19:01 +04:00
# endif