2019-05-08 11:26:11 +03:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
# ifndef DRM_GEM_VRAM_HELPER_H
# define DRM_GEM_VRAM_HELPER_H
2019-09-11 14:09:07 +03:00
# include <drm/drm_file.h>
2019-05-08 11:26:11 +03:00
# include <drm/drm_gem.h>
2019-09-11 14:09:07 +03:00
# include <drm/drm_ioctl.h>
2020-02-03 18:52:55 +03:00
# include <drm/drm_modes.h>
2019-05-08 11:26:11 +03:00
# include <drm/ttm/ttm_bo_api.h>
2019-09-11 14:09:07 +03:00
# include <drm/ttm/ttm_bo_driver.h>
2020-11-03 12:30:11 +03:00
# include <linux/dma-buf-map.h>
2019-05-08 11:26:11 +03:00
# include <linux/kernel.h> /* for container_of() */
2019-05-08 11:26:14 +03:00
struct drm_mode_create_dumb ;
2019-10-24 11:14:01 +03:00
struct drm_plane ;
struct drm_plane_state ;
struct drm_simple_display_pipe ;
2019-05-08 11:26:11 +03:00
struct filp ;
2019-05-08 11:26:18 +03:00
struct vm_area_struct ;
2019-05-08 11:26:11 +03:00
2020-09-07 17:14:52 +03:00
# define DRM_GEM_VRAM_PL_FLAG_SYSTEM (1 << 0)
# define DRM_GEM_VRAM_PL_FLAG_VRAM (1 << 1)
# define DRM_GEM_VRAM_PL_FLAG_TOPDOWN (1 << 2)
2019-05-08 11:26:11 +03:00
/*
* Buffer - object helpers
*/
/**
* struct drm_gem_vram_object - GEM object backed by VRAM
* @ bo : TTM buffer object
2020-11-03 12:30:11 +03:00
* @ map : Mapping information for @ bo
2019-05-08 11:26:11 +03:00
* @ placement : TTM placement information . Supported placements are \
% TTM_PL_VRAM and % TTM_PL_SYSTEM
* @ placements : TTM placement information .
*
* The type struct drm_gem_vram_object represents a GEM object that is
* backed by VRAM . It can be used for simple framebuffer devices with
* dedicated memory . The buffer object can be evicted to system memory if
* video memory becomes scarce .
2019-09-06 15:20:53 +03:00
*
* GEM VRAM objects perform reference counting for pin and mapping
* operations . So a buffer object that has been pinned N times with
* drm_gem_vram_pin ( ) must be unpinned N times with
* drm_gem_vram_unpin ( ) . The same applies to pairs of
2019-09-11 15:03:50 +03:00
* drm_gem_vram_kmap ( ) and drm_gem_vram_kunmap ( ) , as well as pairs of
* drm_gem_vram_vmap ( ) and drm_gem_vram_vunmap ( ) .
2019-05-08 11:26:11 +03:00
*/
struct drm_gem_vram_object {
struct ttm_buffer_object bo ;
2020-11-03 12:30:11 +03:00
struct dma_buf_map map ;
2019-05-08 11:26:11 +03:00
2019-09-06 15:20:53 +03:00
/**
2020-11-03 12:30:11 +03:00
* @ vmap_use_count :
2019-09-06 15:20:53 +03:00
*
* Reference count on the virtual address .
* The address are un - mapped when the count reaches zero .
*/
2020-11-03 12:30:11 +03:00
unsigned int vmap_use_count ;
2019-09-06 15:20:53 +03:00
2019-05-08 11:26:11 +03:00
/* Supported placements are %TTM_PL_VRAM and %TTM_PL_SYSTEM */
struct ttm_placement placement ;
struct ttm_place placements [ 2 ] ;
} ;
/**
2020-11-16 13:18:01 +03:00
* drm_gem_vram_of_bo - Returns the container of type
* & struct drm_gem_vram_object for field bo .
2019-05-08 11:26:11 +03:00
* @ bo : the VRAM buffer object
* Returns : The containing GEM VRAM object
*/
static inline struct drm_gem_vram_object * drm_gem_vram_of_bo (
struct ttm_buffer_object * bo )
{
return container_of ( bo , struct drm_gem_vram_object , bo ) ;
}
/**
2020-11-16 13:18:01 +03:00
* drm_gem_vram_of_gem - Returns the container of type
* & struct drm_gem_vram_object for field gem .
2019-05-08 11:26:11 +03:00
* @ gem : the GEM object
* Returns : The containing GEM VRAM object
*/
static inline struct drm_gem_vram_object * drm_gem_vram_of_gem (
struct drm_gem_object * gem )
{
2019-08-05 17:01:04 +03:00
return container_of ( gem , struct drm_gem_vram_object , bo . base ) ;
2019-05-08 11:26:11 +03:00
}
struct drm_gem_vram_object * drm_gem_vram_create ( struct drm_device * dev ,
size_t size ,
2020-01-06 15:57:43 +03:00
unsigned long pg_align ) ;
2019-05-08 11:26:11 +03:00
void drm_gem_vram_put ( struct drm_gem_vram_object * gbo ) ;
u64 drm_gem_vram_mmap_offset ( struct drm_gem_vram_object * gbo ) ;
s64 drm_gem_vram_offset ( struct drm_gem_vram_object * gbo ) ;
int drm_gem_vram_pin ( struct drm_gem_vram_object * gbo , unsigned long pl_flag ) ;
int drm_gem_vram_unpin ( struct drm_gem_vram_object * gbo ) ;
2020-11-03 12:30:11 +03:00
int drm_gem_vram_vmap ( struct drm_gem_vram_object * gbo , struct dma_buf_map * map ) ;
void drm_gem_vram_vunmap ( struct drm_gem_vram_object * gbo , struct dma_buf_map * map ) ;
2019-05-08 11:26:11 +03:00
2019-05-08 11:26:14 +03:00
int drm_gem_vram_fill_create_dumb ( struct drm_file * file ,
struct drm_device * dev ,
unsigned long pg_align ,
2019-12-03 11:38:17 +03:00
unsigned long pitch_align ,
2019-05-08 11:26:14 +03:00
struct drm_mode_create_dumb * args ) ;
2019-05-08 11:26:13 +03:00
/*
* Helpers for struct drm_driver
*/
2019-05-08 11:26:18 +03:00
int drm_gem_vram_driver_dumb_create ( struct drm_file * file ,
struct drm_device * dev ,
struct drm_mode_create_dumb * args ) ;
2019-05-08 11:26:13 +03:00
int drm_gem_vram_driver_dumb_mmap_offset ( struct drm_file * file ,
struct drm_device * dev ,
uint32_t handle , uint64_t * offset ) ;
2019-05-08 11:26:18 +03:00
2019-10-24 11:14:01 +03:00
/*
* Helpers for struct drm_plane_helper_funcs
*/
int
drm_gem_vram_plane_helper_prepare_fb ( struct drm_plane * plane ,
struct drm_plane_state * new_state ) ;
void
drm_gem_vram_plane_helper_cleanup_fb ( struct drm_plane * plane ,
struct drm_plane_state * old_state ) ;
/*
* Helpers for struct drm_simple_display_pipe_funcs
*/
int drm_gem_vram_simple_display_pipe_prepare_fb (
struct drm_simple_display_pipe * pipe ,
struct drm_plane_state * new_state ) ;
void drm_gem_vram_simple_display_pipe_cleanup_fb (
struct drm_simple_display_pipe * pipe ,
struct drm_plane_state * old_state ) ;
2019-05-08 11:26:18 +03:00
/**
* define DRM_GEM_VRAM_DRIVER - default callback functions for \
& struct drm_driver
*
* Drivers that use VRAM MM and GEM VRAM can use this macro to initialize
* & struct drm_driver with default functions .
*/
# define DRM_GEM_VRAM_DRIVER \
2019-09-04 08:47:37 +03:00
. debugfs_init = drm_vram_mm_debugfs_init , \
2019-05-08 11:26:18 +03:00
. dumb_create = drm_gem_vram_driver_dumb_create , \
2019-07-02 14:50:08 +03:00
. dumb_map_offset = drm_gem_vram_driver_dumb_mmap_offset , \
. gem_prime_mmap = drm_gem_prime_mmap
2019-05-08 11:26:18 +03:00
2019-09-11 14:09:07 +03:00
/*
* VRAM memory manager
*/
/**
* struct drm_vram_mm - An instance of VRAM MM
* @ vram_base : Base address of the managed video memory
* @ vram_size : Size of the managed video memory in bytes
* @ bdev : The TTM BO device .
* @ funcs : TTM BO functions
*
* The fields & struct drm_vram_mm . vram_base and
* & struct drm_vram_mm . vrm_size are managed by VRAM MM , but are
* available for public read access . Use the field
* & struct drm_vram_mm . bdev to access the TTM BO device .
*/
struct drm_vram_mm {
uint64_t vram_base ;
size_t vram_size ;
struct ttm_bo_device bdev ;
} ;
/**
* drm_vram_mm_of_bdev ( ) - \
Returns the container of type & struct ttm_bo_device for field bdev .
* @ bdev : the TTM BO device
*
* Returns :
* The containing instance of & struct drm_vram_mm
*/
static inline struct drm_vram_mm * drm_vram_mm_of_bdev (
struct ttm_bo_device * bdev )
{
return container_of ( bdev , struct drm_vram_mm , bdev ) ;
}
2020-03-10 16:31:21 +03:00
void drm_vram_mm_debugfs_init ( struct drm_minor * minor ) ;
2019-09-11 14:09:07 +03:00
/*
* Helpers for integration with struct drm_device
*/
struct drm_vram_mm * drm_vram_helper_alloc_mm (
2019-09-11 14:09:08 +03:00
struct drm_device * dev , uint64_t vram_base , size_t vram_size ) ;
2019-09-11 14:09:07 +03:00
void drm_vram_helper_release_mm ( struct drm_device * dev ) ;
2020-07-16 15:53:48 +03:00
int drmm_vram_helper_init ( struct drm_device * dev , uint64_t vram_base ,
size_t vram_size ) ;
2020-02-03 18:52:55 +03:00
/*
* Mode - config helpers
*/
enum drm_mode_status
drm_vram_helper_mode_valid ( struct drm_device * dev ,
const struct drm_display_mode * mode ) ;
2019-05-08 11:26:11 +03:00
# endif