2019-09-04 07:47:35 +02:00
// SPDX-License-Identifier: GPL-2.0-or-later
# include <linux/module.h>
# include <drm/drm_gem_ttm_helper.h>
/**
* DOC : overview
*
* This library provides helper functions for gem objects backed by
* ttm .
*/
/**
* drm_gem_ttm_print_info ( ) - Print & ttm_buffer_object info for debugfs
* @ p : DRM printer
* @ indent : Tab indentation level
* @ gem : GEM object
*
* This function can be used as & drm_gem_object_funcs . print_info
* callback .
*/
void drm_gem_ttm_print_info ( struct drm_printer * p , unsigned int indent ,
const struct drm_gem_object * gem )
{
2019-09-23 08:58:14 +02:00
static const char * const plname [ ] = {
2019-09-04 07:47:35 +02:00
[ TTM_PL_SYSTEM ] = " system " ,
[ TTM_PL_TT ] = " tt " ,
[ TTM_PL_VRAM ] = " vram " ,
[ TTM_PL_PRIV ] = " priv " ,
[ 16 ] = " cached " ,
[ 17 ] = " uncached " ,
[ 18 ] = " wc " ,
[ 19 ] = " contig " ,
[ 21 ] = " pinned " , /* NO_EVICT */
[ 22 ] = " topdown " ,
} ;
const struct ttm_buffer_object * bo = drm_gem_ttm_of_gem ( gem ) ;
drm_printf_indent ( p , indent , " placement= " ) ;
2021-04-12 15:11:47 +02:00
drm_print_bits ( p , bo - > resource - > placement , plname , ARRAY_SIZE ( plname ) ) ;
2019-09-04 07:47:35 +02:00
drm_printf ( p , " \n " ) ;
2021-04-12 15:11:47 +02:00
if ( bo - > resource - > bus . is_iomem )
2019-09-04 07:47:35 +02:00
drm_printf_indent ( p , indent , " bus.offset=%lx \n " ,
2021-04-12 15:11:47 +02:00
( unsigned long ) bo - > resource - > bus . offset ) ;
2019-09-04 07:47:35 +02:00
}
EXPORT_SYMBOL ( drm_gem_ttm_print_info ) ;
2020-11-03 10:30:10 +01:00
/**
* drm_gem_ttm_vmap ( ) - vmap & ttm_buffer_object
* @ gem : GEM object .
* @ map : [ out ] returns the dma - buf mapping .
*
* Maps a GEM object with ttm_bo_vmap ( ) . This function can be used as
* & drm_gem_object_funcs . vmap callback .
*
* Returns :
* 0 on success , or a negative errno code otherwise .
*/
int drm_gem_ttm_vmap ( struct drm_gem_object * gem ,
struct dma_buf_map * map )
{
struct ttm_buffer_object * bo = drm_gem_ttm_of_gem ( gem ) ;
return ttm_bo_vmap ( bo , map ) ;
}
EXPORT_SYMBOL ( drm_gem_ttm_vmap ) ;
/**
* drm_gem_ttm_vunmap ( ) - vunmap & ttm_buffer_object
* @ gem : GEM object .
* @ map : dma - buf mapping .
*
* Unmaps a GEM object with ttm_bo_vunmap ( ) . This function can be used as
* & drm_gem_object_funcs . vmap callback .
*/
void drm_gem_ttm_vunmap ( struct drm_gem_object * gem ,
struct dma_buf_map * map )
{
struct ttm_buffer_object * bo = drm_gem_ttm_of_gem ( gem ) ;
ttm_bo_vunmap ( bo , map ) ;
}
EXPORT_SYMBOL ( drm_gem_ttm_vunmap ) ;
2019-10-16 13:52:00 +02:00
/**
* drm_gem_ttm_mmap ( ) - mmap & ttm_buffer_object
* @ gem : GEM object .
* @ vma : vm area .
*
* This function can be used as & drm_gem_object_funcs . mmap
* callback .
*/
int drm_gem_ttm_mmap ( struct drm_gem_object * gem ,
struct vm_area_struct * vma )
{
struct ttm_buffer_object * bo = drm_gem_ttm_of_gem ( gem ) ;
2019-11-13 14:56:12 +01:00
int ret ;
2019-10-16 13:52:00 +02:00
2019-11-13 14:56:12 +01:00
ret = ttm_bo_mmap_obj ( vma , bo ) ;
if ( ret < 0 )
return ret ;
/*
* ttm has its own object refcounting , so drop gem reference
* to avoid double accounting counting .
*/
2020-05-15 10:50:53 +01:00
drm_gem_object_put ( gem ) ;
2019-11-13 14:56:12 +01:00
return 0 ;
2019-10-16 13:52:00 +02:00
}
EXPORT_SYMBOL ( drm_gem_ttm_mmap ) ;
2021-04-08 16:01:36 +02:00
/**
* drm_gem_ttm_dumb_map_offset ( ) - Implements struct & drm_driver . dumb_map_offset
* @ file : DRM file pointer .
* @ dev : DRM device .
* @ handle : GEM handle
* @ offset : Returns the mapping ' s memory offset on success
*
* Provides an implementation of struct & drm_driver . dumb_map_offset for
* TTM - based GEM drivers . TTM allocates the offset internally and
* drm_gem_ttm_dumb_map_offset ( ) returns it for dumb - buffer implementations .
*
* See struct & drm_driver . dumb_map_offset .
*
* Returns :
* 0 on success , or a negative errno code otherwise .
*/
int drm_gem_ttm_dumb_map_offset ( struct drm_file * file , struct drm_device * dev ,
uint32_t handle , uint64_t * offset )
{
struct drm_gem_object * gem ;
gem = drm_gem_object_lookup ( file , handle ) ;
if ( ! gem )
return - ENOENT ;
* offset = drm_vma_node_offset_addr ( & gem - > vma_node ) ;
drm_gem_object_put ( gem ) ;
return 0 ;
}
EXPORT_SYMBOL ( drm_gem_ttm_dumb_map_offset ) ;
2019-09-04 07:47:35 +02:00
MODULE_DESCRIPTION ( " DRM gem ttm helpers " ) ;
MODULE_LICENSE ( " GPL " ) ;