2019-05-08 10:26:11 +02:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
# ifndef DRM_GEM_VRAM_HELPER_H
# define DRM_GEM_VRAM_HELPER_H
2019-09-11 13:09:07 +02:00
# include <drm/drm_file.h>
2019-05-08 10:26:11 +02:00
# include <drm/drm_gem.h>
2021-04-08 16:01:37 +02:00
# include <drm/drm_gem_ttm_helper.h>
2019-09-11 13:09:07 +02:00
# include <drm/drm_ioctl.h>
2020-02-03 16:52:55 +01:00
# include <drm/drm_modes.h>
2022-05-09 21:13:35 +02:00
# include <drm/ttm/ttm_bo.h>
# include <drm/ttm/ttm_placement.h>
2019-09-11 13:09:07 +02:00
2021-11-10 12:24:23 +02:00
# include <linux/container_of.h>
2022-02-04 09:05:41 -08:00
# include <linux/iosys-map.h>
2019-05-08 10:26:11 +02:00
2019-05-08 10:26:14 +02:00
struct drm_mode_create_dumb ;
2019-10-24 10:14:01 +02:00
struct drm_plane ;
struct drm_plane_state ;
struct drm_simple_display_pipe ;
2019-05-08 10:26:11 +02:00
struct filp ;
2019-05-08 10:26:18 +02:00
struct vm_area_struct ;
2019-05-08 10:26:11 +02:00
2020-09-07 16:14:52 +02: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 10:26:11 +02:00
/*
* Buffer - object helpers
*/
/**
* struct drm_gem_vram_object - GEM object backed by VRAM
* @ bo : TTM buffer object
2020-11-03 10:30:11 +01:00
* @ map : Mapping information for @ bo
2019-05-08 10:26:11 +02: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 14:20:53 +02: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 14:03:50 +02: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 10:26:11 +02:00
*/
struct drm_gem_vram_object {
struct ttm_buffer_object bo ;
2022-02-04 09:05:41 -08:00
struct iosys_map map ;
2019-05-08 10:26:11 +02:00
2019-09-06 14:20:53 +02:00
/**
2020-11-03 10:30:11 +01:00
* @ vmap_use_count :
2019-09-06 14:20:53 +02:00
*
* Reference count on the virtual address .
* The address are un - mapped when the count reaches zero .
*/
2020-11-03 10:30:11 +01:00
unsigned int vmap_use_count ;
2019-09-06 14:20:53 +02:00
2019-05-08 10:26:11 +02:00
/* Supported placements are %TTM_PL_VRAM and %TTM_PL_SYSTEM */
struct ttm_placement placement ;
struct ttm_place placements [ 2 ] ;
} ;
/**
2020-11-16 11:18:01 +01:00
* drm_gem_vram_of_bo - Returns the container of type
* & struct drm_gem_vram_object for field bo .
2019-05-08 10:26:11 +02: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 11:18:01 +01:00
* drm_gem_vram_of_gem - Returns the container of type
* & struct drm_gem_vram_object for field gem .
2019-05-08 10:26:11 +02: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 16:01:04 +02:00
return container_of ( gem , struct drm_gem_vram_object , bo . base ) ;
2019-05-08 10:26:11 +02:00
}
struct drm_gem_vram_object * drm_gem_vram_create ( struct drm_device * dev ,
size_t size ,
2020-01-06 13:57:43 +01:00
unsigned long pg_align ) ;
2019-05-08 10:26:11 +02:00
void drm_gem_vram_put ( 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 ) ;
2022-02-04 09:05:41 -08:00
int drm_gem_vram_vmap ( struct drm_gem_vram_object * gbo , struct iosys_map * map ) ;
void drm_gem_vram_vunmap ( struct drm_gem_vram_object * gbo ,
struct iosys_map * map ) ;
2019-05-08 10:26:11 +02:00
2019-05-08 10:26:14 +02:00
int drm_gem_vram_fill_create_dumb ( struct drm_file * file ,
struct drm_device * dev ,
unsigned long pg_align ,
2019-12-03 09:38:17 +01:00
unsigned long pitch_align ,
2019-05-08 10:26:14 +02:00
struct drm_mode_create_dumb * args ) ;
2019-05-08 10:26:13 +02:00
/*
* Helpers for struct drm_driver
*/
2019-05-08 10:26:18 +02:00
int drm_gem_vram_driver_dumb_create ( struct drm_file * file ,
struct drm_device * dev ,
struct drm_mode_create_dumb * args ) ;
2019-10-24 10:14:01 +02: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 ) ;
2021-06-22 18:55:06 +02:00
/**
* DRM_GEM_VRAM_PLANE_HELPER_FUNCS -
* Initializes struct drm_plane_helper_funcs for VRAM handling
*
* Drivers may use GEM BOs as VRAM helpers for the framebuffer memory . This
* macro initializes struct drm_plane_helper_funcs to use the respective helper
* functions .
*/
# define DRM_GEM_VRAM_PLANE_HELPER_FUNCS \
. prepare_fb = drm_gem_vram_plane_helper_prepare_fb , \
. cleanup_fb = drm_gem_vram_plane_helper_cleanup_fb
2019-10-24 10:14:01 +02:00
/*
* 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 10:26:18 +02: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 \
2023-06-20 09:59:58 +02:00
. debugfs_init = drm_vram_mm_debugfs_init , \
. dumb_create = drm_gem_vram_driver_dumb_create , \
. dumb_map_offset = drm_gem_ttm_dumb_map_offset
2019-05-08 10:26:18 +02:00
2019-09-11 13:09:07 +02: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 ;
2020-10-01 14:51:40 +02:00
struct ttm_device bdev ;
2019-09-11 13:09:07 +02:00
} ;
/**
* drm_vram_mm_of_bdev ( ) - \
2020-10-01 14:51:40 +02:00
Returns the container of type & struct ttm_device for field bdev .
2019-09-11 13:09:07 +02:00
* @ 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 (
2020-10-01 14:51:40 +02:00
struct ttm_device * bdev )
2019-09-11 13:09:07 +02:00
{
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 13:09:07 +02:00
/*
* Helpers for integration with struct drm_device
*/
2020-07-16 14:53:48 +02:00
int drmm_vram_helper_init ( struct drm_device * dev , uint64_t vram_base ,
size_t vram_size ) ;
2020-02-03 16:52:55 +01: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 10:26:11 +02:00
# endif