2019-03-13 03:43:44 +03:00
/* SPDX-License-Identifier: GPL-2.0 */
# ifndef __DRM_GEM_SHMEM_HELPER_H__
# define __DRM_GEM_SHMEM_HELPER_H__
# include <linux/fs.h>
# include <linux/mm.h>
# include <linux/mutex.h>
# include <drm/drm_file.h>
# include <drm/drm_gem.h>
# include <drm/drm_ioctl.h>
# include <drm/drm_prime.h>
struct dma_buf_attachment ;
struct drm_mode_create_dumb ;
struct drm_printer ;
struct sg_table ;
/**
* struct drm_gem_shmem_object - GEM object backed by shmem
*/
struct drm_gem_shmem_object {
/**
* @ base : Base GEM object
*/
struct drm_gem_object base ;
/**
* @ pages : Page table
*/
struct page * * pages ;
/**
* @ pages_use_count :
*
* Reference count on the pages table .
* The pages are put when the count reaches zero .
*/
unsigned int pages_use_count ;
2019-11-01 18:37:54 +03:00
/**
* @ madv : State for madvise
*
* 0 is active / inuse .
* A negative value is the object is purged .
* Positive values are driver specific and not used by the helpers .
*/
2019-08-05 17:33:57 +03:00
int madv ;
2019-11-01 18:37:54 +03:00
/**
* @ madv_list : List entry for madvise tracking
*
* Typically used by drivers to track purgeable objects
*/
2019-08-05 17:33:57 +03:00
struct list_head madv_list ;
2019-03-13 03:43:44 +03:00
/**
* @ sgt : Scatter / gather table for imported PRIME buffers
*/
struct sg_table * sgt ;
/**
* @ vaddr : Kernel virtual address of the backing memory
*/
void * vaddr ;
/**
* @ vmap_use_count :
*
* Reference count on the virtual address .
* The address are un - mapped when the count reaches zero .
*/
unsigned int vmap_use_count ;
2020-02-26 18:47:50 +03:00
2022-11-18 19:13:43 +03:00
/**
* @ pages_mark_dirty_on_put :
*
* Mark pages as dirty when they are put .
*/
bool pages_mark_dirty_on_put : 1 ;
/**
* @ pages_mark_accessed_on_put :
*
* Mark pages as accessed when they are put .
*/
bool pages_mark_accessed_on_put : 1 ;
2020-02-26 18:47:50 +03:00
/**
2020-11-17 16:31:55 +03:00
* @ map_wc : map object write - combined ( instead of using shmem defaults ) .
2020-02-26 18:47:50 +03:00
*/
2022-11-18 19:13:43 +03:00
bool map_wc : 1 ;
2019-03-13 03:43:44 +03:00
} ;
# define to_drm_gem_shmem_obj(obj) \
container_of ( obj , struct drm_gem_shmem_object , base )
struct drm_gem_shmem_object * drm_gem_shmem_create ( struct drm_device * dev , size_t size ) ;
2021-11-08 12:31:49 +03:00
void drm_gem_shmem_free ( struct drm_gem_shmem_object * shmem ) ;
2019-03-13 03:43:44 +03:00
void drm_gem_shmem_put_pages ( struct drm_gem_shmem_object * shmem ) ;
2021-11-08 12:31:49 +03:00
int drm_gem_shmem_pin ( struct drm_gem_shmem_object * shmem ) ;
void drm_gem_shmem_unpin ( struct drm_gem_shmem_object * shmem ) ;
2022-02-04 20:05:41 +03:00
int drm_gem_shmem_vmap ( struct drm_gem_shmem_object * shmem ,
struct iosys_map * map ) ;
void drm_gem_shmem_vunmap ( struct drm_gem_shmem_object * shmem ,
struct iosys_map * map ) ;
2021-11-08 12:31:49 +03:00
int drm_gem_shmem_mmap ( struct drm_gem_shmem_object * shmem , struct vm_area_struct * vma ) ;
2019-03-13 03:43:44 +03:00
2021-11-08 12:31:49 +03:00
int drm_gem_shmem_madvise ( struct drm_gem_shmem_object * shmem , int madv ) ;
2019-08-05 17:33:57 +03:00
static inline bool drm_gem_shmem_is_purgeable ( struct drm_gem_shmem_object * shmem )
{
return ( shmem - > madv > 0 ) & &
! shmem - > vmap_use_count & & shmem - > sgt & &
! shmem - > base . dma_buf & & ! shmem - > base . import_attach ;
}
2023-05-30 01:39:35 +03:00
void drm_gem_shmem_purge ( struct drm_gem_shmem_object * shmem ) ;
2019-08-05 17:33:57 +03:00
2021-11-08 12:31:49 +03:00
struct sg_table * drm_gem_shmem_get_sg_table ( struct drm_gem_shmem_object * shmem ) ;
struct sg_table * drm_gem_shmem_get_pages_sgt ( struct drm_gem_shmem_object * shmem ) ;
2019-03-13 03:43:44 +03:00
2021-11-08 12:31:49 +03:00
void drm_gem_shmem_print_info ( const struct drm_gem_shmem_object * shmem ,
struct drm_printer * p , unsigned int indent ) ;
2021-11-08 12:31:48 +03:00
2022-02-09 18:56:33 +03:00
extern const struct vm_operations_struct drm_gem_shmem_vm_ops ;
2021-11-08 12:31:48 +03:00
/*
* GEM object functions
*/
/**
2021-11-08 12:31:49 +03:00
* drm_gem_shmem_object_free - GEM object function for drm_gem_shmem_free ( )
2021-11-08 12:31:48 +03:00
* @ obj : GEM object to free
*
2021-11-08 12:31:49 +03:00
* This function wraps drm_gem_shmem_free ( ) . Drivers that employ the shmem helpers
2021-11-08 12:31:48 +03:00
* should use it as their & drm_gem_object_funcs . free handler .
*/
static inline void drm_gem_shmem_object_free ( struct drm_gem_object * obj )
{
2021-11-08 12:31:49 +03:00
struct drm_gem_shmem_object * shmem = to_drm_gem_shmem_obj ( obj ) ;
drm_gem_shmem_free ( shmem ) ;
2021-11-08 12:31:48 +03:00
}
/**
* drm_gem_shmem_object_print_info ( ) - Print & drm_gem_shmem_object info for debugfs
* @ p : DRM printer
* @ indent : Tab indentation level
* @ obj : GEM object
*
* This function wraps drm_gem_shmem_print_info ( ) . Drivers that employ the shmem helpers should
* use this function as their & drm_gem_object_funcs . print_info handler .
*/
static inline void drm_gem_shmem_object_print_info ( struct drm_printer * p , unsigned int indent ,
const struct drm_gem_object * obj )
{
2021-11-08 12:31:49 +03:00
const struct drm_gem_shmem_object * shmem = to_drm_gem_shmem_obj ( obj ) ;
drm_gem_shmem_print_info ( shmem , p , indent ) ;
2021-11-08 12:31:48 +03:00
}
/**
* drm_gem_shmem_object_pin - GEM object function for drm_gem_shmem_pin ( )
* @ obj : GEM object
*
* This function wraps drm_gem_shmem_pin ( ) . Drivers that employ the shmem helpers should
* use it as their & drm_gem_object_funcs . pin handler .
*/
static inline int drm_gem_shmem_object_pin ( struct drm_gem_object * obj )
{
2021-11-08 12:31:49 +03:00
struct drm_gem_shmem_object * shmem = to_drm_gem_shmem_obj ( obj ) ;
return drm_gem_shmem_pin ( shmem ) ;
2021-11-08 12:31:48 +03:00
}
/**
* drm_gem_shmem_object_unpin - GEM object function for drm_gem_shmem_unpin ( )
* @ obj : GEM object
*
* This function wraps drm_gem_shmem_unpin ( ) . Drivers that employ the shmem helpers should
* use it as their & drm_gem_object_funcs . unpin handler .
*/
static inline void drm_gem_shmem_object_unpin ( struct drm_gem_object * obj )
{
2021-11-08 12:31:49 +03:00
struct drm_gem_shmem_object * shmem = to_drm_gem_shmem_obj ( obj ) ;
drm_gem_shmem_unpin ( shmem ) ;
2021-11-08 12:31:48 +03:00
}
/**
* drm_gem_shmem_object_get_sg_table - GEM object function for drm_gem_shmem_get_sg_table ( )
* @ obj : GEM object
*
* This function wraps drm_gem_shmem_get_sg_table ( ) . Drivers that employ the shmem helpers should
* use it as their & drm_gem_object_funcs . get_sg_table handler .
*
* Returns :
2022-07-18 04:53:57 +03:00
* A pointer to the scatter / gather table of pinned pages or error pointer on failure .
2021-11-08 12:31:48 +03:00
*/
static inline struct sg_table * drm_gem_shmem_object_get_sg_table ( struct drm_gem_object * obj )
{
2021-11-08 12:31:49 +03:00
struct drm_gem_shmem_object * shmem = to_drm_gem_shmem_obj ( obj ) ;
return drm_gem_shmem_get_sg_table ( shmem ) ;
2021-11-08 12:31:48 +03:00
}
/*
* drm_gem_shmem_object_vmap - GEM object function for drm_gem_shmem_vmap ( )
* @ obj : GEM object
* @ map : Returns the kernel virtual address of the SHMEM GEM object ' s backing store .
*
* This function wraps drm_gem_shmem_vmap ( ) . Drivers that employ the shmem helpers should
* use it as their & drm_gem_object_funcs . vmap handler .
*
* Returns :
* 0 on success or a negative error code on failure .
*/
2022-02-04 20:05:41 +03:00
static inline int drm_gem_shmem_object_vmap ( struct drm_gem_object * obj ,
struct iosys_map * map )
2021-11-08 12:31:48 +03:00
{
2021-11-08 12:31:49 +03:00
struct drm_gem_shmem_object * shmem = to_drm_gem_shmem_obj ( obj ) ;
return drm_gem_shmem_vmap ( shmem , map ) ;
2021-11-08 12:31:48 +03:00
}
/*
* drm_gem_shmem_object_vunmap - GEM object function for drm_gem_shmem_vunmap ( )
* @ obj : GEM object
* @ map : Kernel virtual address where the SHMEM GEM object was mapped
*
* This function wraps drm_gem_shmem_vunmap ( ) . Drivers that employ the shmem helpers should
* use it as their & drm_gem_object_funcs . vunmap handler .
*/
2022-02-04 20:05:41 +03:00
static inline void drm_gem_shmem_object_vunmap ( struct drm_gem_object * obj ,
struct iosys_map * map )
2021-11-08 12:31:48 +03:00
{
2021-11-08 12:31:49 +03:00
struct drm_gem_shmem_object * shmem = to_drm_gem_shmem_obj ( obj ) ;
drm_gem_shmem_vunmap ( shmem , map ) ;
2021-11-08 12:31:48 +03:00
}
/**
* drm_gem_shmem_object_mmap - GEM object function for drm_gem_shmem_mmap ( )
* @ obj : GEM object
* @ vma : VMA for the area to be mapped
*
* This function wraps drm_gem_shmem_mmap ( ) . Drivers that employ the shmem helpers should
* use it as their & drm_gem_object_funcs . mmap handler .
*
* Returns :
* 0 on success or a negative error code on failure .
*/
static inline int drm_gem_shmem_object_mmap ( struct drm_gem_object * obj , struct vm_area_struct * vma )
{
2021-11-08 12:31:49 +03:00
struct drm_gem_shmem_object * shmem = to_drm_gem_shmem_obj ( obj ) ;
return drm_gem_shmem_mmap ( shmem , vma ) ;
2021-11-08 12:31:48 +03:00
}
/*
* Driver ops
*/
2019-03-13 03:43:44 +03:00
struct drm_gem_object *
drm_gem_shmem_prime_import_sg_table ( struct drm_device * dev ,
struct dma_buf_attachment * attach ,
struct sg_table * sgt ) ;
2021-11-08 12:31:49 +03:00
int drm_gem_shmem_dumb_create ( struct drm_file * file , struct drm_device * dev ,
struct drm_mode_create_dumb * args ) ;
2019-03-13 03:43:44 +03:00
/**
* DRM_GEM_SHMEM_DRIVER_OPS - Default shmem GEM operations
*
* This macro provides a shortcut for setting the shmem GEM operations in
* the & drm_driver structure .
*/
# define DRM_GEM_SHMEM_DRIVER_OPS \
. gem_prime_import_sg_table = drm_gem_shmem_prime_import_sg_table , \
2023-06-20 10:59:58 +03:00
. dumb_create = drm_gem_shmem_dumb_create
2019-03-13 03:43:44 +03:00
# endif /* __DRM_GEM_SHMEM_HELPER_H__ */