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