162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci#ifndef DRM_GEM_VRAM_HELPER_H 462306a36Sopenharmony_ci#define DRM_GEM_VRAM_HELPER_H 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <drm/drm_file.h> 762306a36Sopenharmony_ci#include <drm/drm_gem.h> 862306a36Sopenharmony_ci#include <drm/drm_gem_ttm_helper.h> 962306a36Sopenharmony_ci#include <drm/drm_ioctl.h> 1062306a36Sopenharmony_ci#include <drm/drm_modes.h> 1162306a36Sopenharmony_ci#include <drm/ttm/ttm_bo.h> 1262306a36Sopenharmony_ci#include <drm/ttm/ttm_placement.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include <linux/container_of.h> 1562306a36Sopenharmony_ci#include <linux/iosys-map.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistruct drm_mode_create_dumb; 1862306a36Sopenharmony_cistruct drm_plane; 1962306a36Sopenharmony_cistruct drm_plane_state; 2062306a36Sopenharmony_cistruct drm_simple_display_pipe; 2162306a36Sopenharmony_cistruct filp; 2262306a36Sopenharmony_cistruct vm_area_struct; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define DRM_GEM_VRAM_PL_FLAG_SYSTEM (1 << 0) 2562306a36Sopenharmony_ci#define DRM_GEM_VRAM_PL_FLAG_VRAM (1 << 1) 2662306a36Sopenharmony_ci#define DRM_GEM_VRAM_PL_FLAG_TOPDOWN (1 << 2) 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci/* 2962306a36Sopenharmony_ci * Buffer-object helpers 3062306a36Sopenharmony_ci */ 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci/** 3362306a36Sopenharmony_ci * struct drm_gem_vram_object - GEM object backed by VRAM 3462306a36Sopenharmony_ci * @bo: TTM buffer object 3562306a36Sopenharmony_ci * @map: Mapping information for @bo 3662306a36Sopenharmony_ci * @placement: TTM placement information. Supported placements are \ 3762306a36Sopenharmony_ci %TTM_PL_VRAM and %TTM_PL_SYSTEM 3862306a36Sopenharmony_ci * @placements: TTM placement information. 3962306a36Sopenharmony_ci * 4062306a36Sopenharmony_ci * The type struct drm_gem_vram_object represents a GEM object that is 4162306a36Sopenharmony_ci * backed by VRAM. It can be used for simple framebuffer devices with 4262306a36Sopenharmony_ci * dedicated memory. The buffer object can be evicted to system memory if 4362306a36Sopenharmony_ci * video memory becomes scarce. 4462306a36Sopenharmony_ci * 4562306a36Sopenharmony_ci * GEM VRAM objects perform reference counting for pin and mapping 4662306a36Sopenharmony_ci * operations. So a buffer object that has been pinned N times with 4762306a36Sopenharmony_ci * drm_gem_vram_pin() must be unpinned N times with 4862306a36Sopenharmony_ci * drm_gem_vram_unpin(). The same applies to pairs of 4962306a36Sopenharmony_ci * drm_gem_vram_kmap() and drm_gem_vram_kunmap(), as well as pairs of 5062306a36Sopenharmony_ci * drm_gem_vram_vmap() and drm_gem_vram_vunmap(). 5162306a36Sopenharmony_ci */ 5262306a36Sopenharmony_cistruct drm_gem_vram_object { 5362306a36Sopenharmony_ci struct ttm_buffer_object bo; 5462306a36Sopenharmony_ci struct iosys_map map; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci /** 5762306a36Sopenharmony_ci * @vmap_use_count: 5862306a36Sopenharmony_ci * 5962306a36Sopenharmony_ci * Reference count on the virtual address. 6062306a36Sopenharmony_ci * The address are un-mapped when the count reaches zero. 6162306a36Sopenharmony_ci */ 6262306a36Sopenharmony_ci unsigned int vmap_use_count; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci /* Supported placements are %TTM_PL_VRAM and %TTM_PL_SYSTEM */ 6562306a36Sopenharmony_ci struct ttm_placement placement; 6662306a36Sopenharmony_ci struct ttm_place placements[2]; 6762306a36Sopenharmony_ci}; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci/** 7062306a36Sopenharmony_ci * drm_gem_vram_of_bo - Returns the container of type 7162306a36Sopenharmony_ci * &struct drm_gem_vram_object for field bo. 7262306a36Sopenharmony_ci * @bo: the VRAM buffer object 7362306a36Sopenharmony_ci * Returns: The containing GEM VRAM object 7462306a36Sopenharmony_ci */ 7562306a36Sopenharmony_cistatic inline struct drm_gem_vram_object *drm_gem_vram_of_bo( 7662306a36Sopenharmony_ci struct ttm_buffer_object *bo) 7762306a36Sopenharmony_ci{ 7862306a36Sopenharmony_ci return container_of(bo, struct drm_gem_vram_object, bo); 7962306a36Sopenharmony_ci} 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci/** 8262306a36Sopenharmony_ci * drm_gem_vram_of_gem - Returns the container of type 8362306a36Sopenharmony_ci * &struct drm_gem_vram_object for field gem. 8462306a36Sopenharmony_ci * @gem: the GEM object 8562306a36Sopenharmony_ci * Returns: The containing GEM VRAM object 8662306a36Sopenharmony_ci */ 8762306a36Sopenharmony_cistatic inline struct drm_gem_vram_object *drm_gem_vram_of_gem( 8862306a36Sopenharmony_ci struct drm_gem_object *gem) 8962306a36Sopenharmony_ci{ 9062306a36Sopenharmony_ci return container_of(gem, struct drm_gem_vram_object, bo.base); 9162306a36Sopenharmony_ci} 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_cistruct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev, 9462306a36Sopenharmony_ci size_t size, 9562306a36Sopenharmony_ci unsigned long pg_align); 9662306a36Sopenharmony_civoid drm_gem_vram_put(struct drm_gem_vram_object *gbo); 9762306a36Sopenharmony_cis64 drm_gem_vram_offset(struct drm_gem_vram_object *gbo); 9862306a36Sopenharmony_ciint drm_gem_vram_pin(struct drm_gem_vram_object *gbo, unsigned long pl_flag); 9962306a36Sopenharmony_ciint drm_gem_vram_unpin(struct drm_gem_vram_object *gbo); 10062306a36Sopenharmony_ciint drm_gem_vram_vmap(struct drm_gem_vram_object *gbo, struct iosys_map *map); 10162306a36Sopenharmony_civoid drm_gem_vram_vunmap(struct drm_gem_vram_object *gbo, 10262306a36Sopenharmony_ci struct iosys_map *map); 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ciint drm_gem_vram_fill_create_dumb(struct drm_file *file, 10562306a36Sopenharmony_ci struct drm_device *dev, 10662306a36Sopenharmony_ci unsigned long pg_align, 10762306a36Sopenharmony_ci unsigned long pitch_align, 10862306a36Sopenharmony_ci struct drm_mode_create_dumb *args); 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci/* 11162306a36Sopenharmony_ci * Helpers for struct drm_driver 11262306a36Sopenharmony_ci */ 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ciint drm_gem_vram_driver_dumb_create(struct drm_file *file, 11562306a36Sopenharmony_ci struct drm_device *dev, 11662306a36Sopenharmony_ci struct drm_mode_create_dumb *args); 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci/* 11962306a36Sopenharmony_ci * Helpers for struct drm_plane_helper_funcs 12062306a36Sopenharmony_ci */ 12162306a36Sopenharmony_ciint 12262306a36Sopenharmony_cidrm_gem_vram_plane_helper_prepare_fb(struct drm_plane *plane, 12362306a36Sopenharmony_ci struct drm_plane_state *new_state); 12462306a36Sopenharmony_civoid 12562306a36Sopenharmony_cidrm_gem_vram_plane_helper_cleanup_fb(struct drm_plane *plane, 12662306a36Sopenharmony_ci struct drm_plane_state *old_state); 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci/** 12962306a36Sopenharmony_ci * DRM_GEM_VRAM_PLANE_HELPER_FUNCS - 13062306a36Sopenharmony_ci * Initializes struct drm_plane_helper_funcs for VRAM handling 13162306a36Sopenharmony_ci * 13262306a36Sopenharmony_ci * Drivers may use GEM BOs as VRAM helpers for the framebuffer memory. This 13362306a36Sopenharmony_ci * macro initializes struct drm_plane_helper_funcs to use the respective helper 13462306a36Sopenharmony_ci * functions. 13562306a36Sopenharmony_ci */ 13662306a36Sopenharmony_ci#define DRM_GEM_VRAM_PLANE_HELPER_FUNCS \ 13762306a36Sopenharmony_ci .prepare_fb = drm_gem_vram_plane_helper_prepare_fb, \ 13862306a36Sopenharmony_ci .cleanup_fb = drm_gem_vram_plane_helper_cleanup_fb 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci/* 14162306a36Sopenharmony_ci * Helpers for struct drm_simple_display_pipe_funcs 14262306a36Sopenharmony_ci */ 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ciint drm_gem_vram_simple_display_pipe_prepare_fb( 14562306a36Sopenharmony_ci struct drm_simple_display_pipe *pipe, 14662306a36Sopenharmony_ci struct drm_plane_state *new_state); 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_civoid drm_gem_vram_simple_display_pipe_cleanup_fb( 14962306a36Sopenharmony_ci struct drm_simple_display_pipe *pipe, 15062306a36Sopenharmony_ci struct drm_plane_state *old_state); 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci/** 15362306a36Sopenharmony_ci * define DRM_GEM_VRAM_DRIVER - default callback functions for \ 15462306a36Sopenharmony_ci &struct drm_driver 15562306a36Sopenharmony_ci * 15662306a36Sopenharmony_ci * Drivers that use VRAM MM and GEM VRAM can use this macro to initialize 15762306a36Sopenharmony_ci * &struct drm_driver with default functions. 15862306a36Sopenharmony_ci */ 15962306a36Sopenharmony_ci#define DRM_GEM_VRAM_DRIVER \ 16062306a36Sopenharmony_ci .debugfs_init = drm_vram_mm_debugfs_init, \ 16162306a36Sopenharmony_ci .dumb_create = drm_gem_vram_driver_dumb_create, \ 16262306a36Sopenharmony_ci .dumb_map_offset = drm_gem_ttm_dumb_map_offset 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci/* 16562306a36Sopenharmony_ci * VRAM memory manager 16662306a36Sopenharmony_ci */ 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci/** 16962306a36Sopenharmony_ci * struct drm_vram_mm - An instance of VRAM MM 17062306a36Sopenharmony_ci * @vram_base: Base address of the managed video memory 17162306a36Sopenharmony_ci * @vram_size: Size of the managed video memory in bytes 17262306a36Sopenharmony_ci * @bdev: The TTM BO device. 17362306a36Sopenharmony_ci * @funcs: TTM BO functions 17462306a36Sopenharmony_ci * 17562306a36Sopenharmony_ci * The fields &struct drm_vram_mm.vram_base and 17662306a36Sopenharmony_ci * &struct drm_vram_mm.vrm_size are managed by VRAM MM, but are 17762306a36Sopenharmony_ci * available for public read access. Use the field 17862306a36Sopenharmony_ci * &struct drm_vram_mm.bdev to access the TTM BO device. 17962306a36Sopenharmony_ci */ 18062306a36Sopenharmony_cistruct drm_vram_mm { 18162306a36Sopenharmony_ci uint64_t vram_base; 18262306a36Sopenharmony_ci size_t vram_size; 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci struct ttm_device bdev; 18562306a36Sopenharmony_ci}; 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci/** 18862306a36Sopenharmony_ci * drm_vram_mm_of_bdev() - \ 18962306a36Sopenharmony_ci Returns the container of type &struct ttm_device for field bdev. 19062306a36Sopenharmony_ci * @bdev: the TTM BO device 19162306a36Sopenharmony_ci * 19262306a36Sopenharmony_ci * Returns: 19362306a36Sopenharmony_ci * The containing instance of &struct drm_vram_mm 19462306a36Sopenharmony_ci */ 19562306a36Sopenharmony_cistatic inline struct drm_vram_mm *drm_vram_mm_of_bdev( 19662306a36Sopenharmony_ci struct ttm_device *bdev) 19762306a36Sopenharmony_ci{ 19862306a36Sopenharmony_ci return container_of(bdev, struct drm_vram_mm, bdev); 19962306a36Sopenharmony_ci} 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_civoid drm_vram_mm_debugfs_init(struct drm_minor *minor); 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci/* 20462306a36Sopenharmony_ci * Helpers for integration with struct drm_device 20562306a36Sopenharmony_ci */ 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ciint drmm_vram_helper_init(struct drm_device *dev, uint64_t vram_base, 20862306a36Sopenharmony_ci size_t vram_size); 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci/* 21162306a36Sopenharmony_ci * Mode-config helpers 21262306a36Sopenharmony_ci */ 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_cienum drm_mode_status 21562306a36Sopenharmony_cidrm_vram_helper_mode_valid(struct drm_device *dev, 21662306a36Sopenharmony_ci const struct drm_display_mode *mode); 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci#endif 219