2019-05-27 08:55:01 +02:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2011-10-04 19:19:01 +09:00
/* exynos_drm_gem.h
*
* Copyright ( c ) 2011 Samsung Electronics Co . , Ltd .
* Authoer : Inki Dae < inki . dae @ samsung . com >
*/
# ifndef _EXYNOS_DRM_GEM_H_
# define _EXYNOS_DRM_GEM_H_
2014-09-23 15:46:53 +02:00
# include <drm/drm_gem.h>
2018-04-14 21:34:29 +05:30
# include <linux/mm_types.h>
2014-09-23 15:46:53 +02:00
2015-10-02 09:33:47 +09:00
# define to_exynos_gem(x) container_of(x, struct exynos_drm_gem, base)
2011-10-04 19:19:01 +09:00
2012-04-03 21:27:58 +09:00
# define IS_NONCONTIG_BUFFER(f) (f & EXYNOS_BO_NONCONTIG)
2011-10-04 19:19:01 +09:00
/*
* exynos drm buffer structure .
*
* @ base : a gem object .
* - a new handle to this gem object would be created
* by drm_gem_handle_create ( ) .
2015-08-16 14:38:49 +09:00
* @ flags : indicate memory type to allocated buffer and cache attruibute .
2012-06-29 16:28:17 +09:00
* @ size : size requested from user , in bytes and this size is aligned
* in page unit .
2015-08-16 14:38:49 +09:00
* @ cookie : cookie returned by dma_alloc_attrs
2020-04-23 14:43:49 +09:00
* @ kvaddr : kernel virtual address to allocated memory region ( for fbdev )
2015-08-16 14:38:49 +09:00
* @ dma_addr : bus address ( accessed by dma ) to allocated memory region .
* - this address could be physical address without IOMMU and
* device address with IOMMU .
2020-04-23 14:43:49 +09:00
* @ dma_attrs : attrs passed dma mapping framework
2015-09-16 14:14:54 +09:00
* @ sgt : Imported sg_table .
2011-10-04 19:19:01 +09:00
*
2013-10-24 16:02:57 +09:00
* P . S . this object would be transferred to user as kms_bo . handle so
2011-10-04 19:19:01 +09:00
* user can access the buffer through kms_bo . handle .
*/
2015-10-02 09:33:47 +09:00
struct exynos_drm_gem {
2015-08-16 14:38:49 +09: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 13:46:00 -07:00
unsigned long dma_attrs ;
2015-09-16 14:14:54 +09:00
struct sg_table * sgt ;
2011-10-04 19:19:01 +09:00
} ;
2011-12-13 14:39:13 +09:00
/* destroy a buffer with gem object */
2015-10-02 09:33:47 +09:00
void exynos_drm_gem_destroy ( struct exynos_drm_gem * exynos_gem ) ;
2011-12-13 14:39:13 +09:00
/* create a new buffer with gem object */
2015-10-02 09:33:47 +09:00
struct exynos_drm_gem * exynos_drm_gem_create ( struct drm_device * dev ,
unsigned int flags ,
2020-04-23 14:43:49 +09:00
unsigned long size ,
bool kvmap ) ;
2011-10-04 19:19:01 +09: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 14:20:23 +09:00
struct drm_file * file_priv ) ;
2011-10-04 19:19:01 +09:00
2016-03-08 14:12:59 +09: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 18:47:06 +09:00
/*
2018-07-09 15:44:31 +02:00
* get exynos drm object from gem handle , this function could be used for
2012-03-16 18:47:06 +09:00
* other drivers such as 2 d / 3 d acceleration drivers .
* with this function call , gem object reference count would be increased .
*/
2018-07-09 15:44:31 +02:00
struct exynos_drm_gem * exynos_drm_gem_get ( struct drm_file * filp ,
unsigned int gem_handle ) ;
2012-03-16 18:47:06 +09:00
/*
2018-07-09 15:44:31 +02:00
* put exynos drm object acquired from exynos_drm_gem_get ( ) ,
* gem object reference count would be decreased .
2012-03-16 18:47:06 +09:00
*/
2018-07-09 15:44:31 +02:00
static inline void exynos_drm_gem_put ( struct exynos_drm_gem * exynos_gem )
{
drm_gem_object_put_unlocked ( & exynos_gem - > base ) ;
}
2012-03-16 18:47:06 +09:00
2012-05-04 15:51:17 +09: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 ) ;
2011-10-04 19:19:01 +09:00
/* free gem object. */
2015-10-02 09:33:47 +09:00
void exynos_drm_gem_free_object ( struct drm_gem_object * obj ) ;
2011-10-04 19:19:01 +09:00
/* create memory region for drm framebuffer. */
int exynos_drm_gem_dumb_create ( struct drm_file * file_priv ,
2011-12-13 14:20:23 +09:00
struct drm_device * dev ,
struct drm_mode_create_dumb * args ) ;
2011-10-04 19:19:01 +09:00
2011-12-13 14:20:23 +09: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 19:19:01 +09:00
2015-08-16 14:33:08 +09:00
/* low-level interface prime helpers */
2017-10-30 08:28:09 +01:00
struct drm_gem_object * exynos_drm_gem_prime_import ( struct drm_device * dev ,
struct dma_buf * dma_buf ) ;
2015-08-16 14:33:08 +09:00
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 16:30:47 +09:00
int exynos_drm_gem_prime_mmap ( struct drm_gem_object * obj ,
struct vm_area_struct * vma ) ;
2015-08-16 14:33:08 +09:00
2011-10-04 19:19:01 +09:00
# endif