162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#ifndef __DRM_GEM_ATOMIC_HELPER_H__
462306a36Sopenharmony_ci#define __DRM_GEM_ATOMIC_HELPER_H__
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/iosys-map.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <drm/drm_fourcc.h>
962306a36Sopenharmony_ci#include <drm/drm_plane.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistruct drm_simple_display_pipe;
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci/*
1462306a36Sopenharmony_ci * Plane Helpers
1562306a36Sopenharmony_ci */
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ciint drm_gem_plane_helper_prepare_fb(struct drm_plane *plane, struct drm_plane_state *state);
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/*
2062306a36Sopenharmony_ci * Helpers for planes with shadow buffers
2162306a36Sopenharmony_ci */
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci/**
2462306a36Sopenharmony_ci * DRM_SHADOW_PLANE_MAX_WIDTH - Maximum width of a plane's shadow buffer in pixels
2562306a36Sopenharmony_ci *
2662306a36Sopenharmony_ci * For drivers with shadow planes, the maximum width of the framebuffer is
2762306a36Sopenharmony_ci * usually independent from hardware limitations. Drivers can initialize struct
2862306a36Sopenharmony_ci * drm_mode_config.max_width from DRM_SHADOW_PLANE_MAX_WIDTH.
2962306a36Sopenharmony_ci */
3062306a36Sopenharmony_ci#define DRM_SHADOW_PLANE_MAX_WIDTH	(4096u)
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci/**
3362306a36Sopenharmony_ci * DRM_SHADOW_PLANE_MAX_HEIGHT - Maximum height of a plane's shadow buffer in scanlines
3462306a36Sopenharmony_ci *
3562306a36Sopenharmony_ci * For drivers with shadow planes, the maximum height of the framebuffer is
3662306a36Sopenharmony_ci * usually independent from hardware limitations. Drivers can initialize struct
3762306a36Sopenharmony_ci * drm_mode_config.max_height from DRM_SHADOW_PLANE_MAX_HEIGHT.
3862306a36Sopenharmony_ci */
3962306a36Sopenharmony_ci#define DRM_SHADOW_PLANE_MAX_HEIGHT	(4096u)
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci/**
4262306a36Sopenharmony_ci * struct drm_shadow_plane_state - plane state for planes with shadow buffers
4362306a36Sopenharmony_ci *
4462306a36Sopenharmony_ci * For planes that use a shadow buffer, struct drm_shadow_plane_state
4562306a36Sopenharmony_ci * provides the regular plane state plus mappings of the shadow buffer
4662306a36Sopenharmony_ci * into kernel address space.
4762306a36Sopenharmony_ci */
4862306a36Sopenharmony_cistruct drm_shadow_plane_state {
4962306a36Sopenharmony_ci	/** @base: plane state */
5062306a36Sopenharmony_ci	struct drm_plane_state base;
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci	/* Transitional state - do not export or duplicate */
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	/**
5562306a36Sopenharmony_ci	 * @map: Mappings of the plane's framebuffer BOs in to kernel address space
5662306a36Sopenharmony_ci	 *
5762306a36Sopenharmony_ci	 * The memory mappings stored in map should be established in the plane's
5862306a36Sopenharmony_ci	 * prepare_fb callback and removed in the cleanup_fb callback.
5962306a36Sopenharmony_ci	 */
6062306a36Sopenharmony_ci	struct iosys_map map[DRM_FORMAT_MAX_PLANES];
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci	/**
6362306a36Sopenharmony_ci	 * @data: Address of each framebuffer BO's data
6462306a36Sopenharmony_ci	 *
6562306a36Sopenharmony_ci	 * The address of the data stored in each mapping. This is different
6662306a36Sopenharmony_ci	 * for framebuffers with non-zero offset fields.
6762306a36Sopenharmony_ci	 */
6862306a36Sopenharmony_ci	struct iosys_map data[DRM_FORMAT_MAX_PLANES];
6962306a36Sopenharmony_ci};
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci/**
7262306a36Sopenharmony_ci * to_drm_shadow_plane_state - upcasts from struct drm_plane_state
7362306a36Sopenharmony_ci * @state: the plane state
7462306a36Sopenharmony_ci */
7562306a36Sopenharmony_cistatic inline struct drm_shadow_plane_state *
7662306a36Sopenharmony_cito_drm_shadow_plane_state(struct drm_plane_state *state)
7762306a36Sopenharmony_ci{
7862306a36Sopenharmony_ci	return container_of(state, struct drm_shadow_plane_state, base);
7962306a36Sopenharmony_ci}
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_civoid __drm_gem_duplicate_shadow_plane_state(struct drm_plane *plane,
8262306a36Sopenharmony_ci					    struct drm_shadow_plane_state *new_shadow_plane_state);
8362306a36Sopenharmony_civoid __drm_gem_destroy_shadow_plane_state(struct drm_shadow_plane_state *shadow_plane_state);
8462306a36Sopenharmony_civoid __drm_gem_reset_shadow_plane(struct drm_plane *plane,
8562306a36Sopenharmony_ci				  struct drm_shadow_plane_state *shadow_plane_state);
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_civoid drm_gem_reset_shadow_plane(struct drm_plane *plane);
8862306a36Sopenharmony_cistruct drm_plane_state *drm_gem_duplicate_shadow_plane_state(struct drm_plane *plane);
8962306a36Sopenharmony_civoid drm_gem_destroy_shadow_plane_state(struct drm_plane *plane,
9062306a36Sopenharmony_ci					struct drm_plane_state *plane_state);
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci/**
9362306a36Sopenharmony_ci * DRM_GEM_SHADOW_PLANE_FUNCS -
9462306a36Sopenharmony_ci *	Initializes struct drm_plane_funcs for shadow-buffered planes
9562306a36Sopenharmony_ci *
9662306a36Sopenharmony_ci * Drivers may use GEM BOs as shadow buffers over the framebuffer memory. This
9762306a36Sopenharmony_ci * macro initializes struct drm_plane_funcs to use the rsp helper functions.
9862306a36Sopenharmony_ci */
9962306a36Sopenharmony_ci#define DRM_GEM_SHADOW_PLANE_FUNCS \
10062306a36Sopenharmony_ci	.reset = drm_gem_reset_shadow_plane, \
10162306a36Sopenharmony_ci	.atomic_duplicate_state = drm_gem_duplicate_shadow_plane_state, \
10262306a36Sopenharmony_ci	.atomic_destroy_state = drm_gem_destroy_shadow_plane_state
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ciint drm_gem_begin_shadow_fb_access(struct drm_plane *plane, struct drm_plane_state *plane_state);
10562306a36Sopenharmony_civoid drm_gem_end_shadow_fb_access(struct drm_plane *plane, struct drm_plane_state *plane_state);
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci/**
10862306a36Sopenharmony_ci * DRM_GEM_SHADOW_PLANE_HELPER_FUNCS -
10962306a36Sopenharmony_ci *	Initializes struct drm_plane_helper_funcs for shadow-buffered planes
11062306a36Sopenharmony_ci *
11162306a36Sopenharmony_ci * Drivers may use GEM BOs as shadow buffers over the framebuffer memory. This
11262306a36Sopenharmony_ci * macro initializes struct drm_plane_helper_funcs to use the rsp helper
11362306a36Sopenharmony_ci * functions.
11462306a36Sopenharmony_ci */
11562306a36Sopenharmony_ci#define DRM_GEM_SHADOW_PLANE_HELPER_FUNCS \
11662306a36Sopenharmony_ci	.begin_fb_access = drm_gem_begin_shadow_fb_access, \
11762306a36Sopenharmony_ci	.end_fb_access = drm_gem_end_shadow_fb_access
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ciint drm_gem_simple_kms_begin_shadow_fb_access(struct drm_simple_display_pipe *pipe,
12062306a36Sopenharmony_ci					      struct drm_plane_state *plane_state);
12162306a36Sopenharmony_civoid drm_gem_simple_kms_end_shadow_fb_access(struct drm_simple_display_pipe *pipe,
12262306a36Sopenharmony_ci					     struct drm_plane_state *plane_state);
12362306a36Sopenharmony_civoid drm_gem_simple_kms_reset_shadow_plane(struct drm_simple_display_pipe *pipe);
12462306a36Sopenharmony_cistruct drm_plane_state *
12562306a36Sopenharmony_cidrm_gem_simple_kms_duplicate_shadow_plane_state(struct drm_simple_display_pipe *pipe);
12662306a36Sopenharmony_civoid drm_gem_simple_kms_destroy_shadow_plane_state(struct drm_simple_display_pipe *pipe,
12762306a36Sopenharmony_ci						   struct drm_plane_state *plane_state);
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci/**
13062306a36Sopenharmony_ci * DRM_GEM_SIMPLE_DISPLAY_PIPE_SHADOW_PLANE_FUNCS -
13162306a36Sopenharmony_ci *	Initializes struct drm_simple_display_pipe_funcs for shadow-buffered planes
13262306a36Sopenharmony_ci *
13362306a36Sopenharmony_ci * Drivers may use GEM BOs as shadow buffers over the framebuffer memory. This
13462306a36Sopenharmony_ci * macro initializes struct drm_simple_display_pipe_funcs to use the rsp helper
13562306a36Sopenharmony_ci * functions.
13662306a36Sopenharmony_ci */
13762306a36Sopenharmony_ci#define DRM_GEM_SIMPLE_DISPLAY_PIPE_SHADOW_PLANE_FUNCS \
13862306a36Sopenharmony_ci	.begin_fb_access = drm_gem_simple_kms_begin_shadow_fb_access, \
13962306a36Sopenharmony_ci	.end_fb_access = drm_gem_simple_kms_end_shadow_fb_access, \
14062306a36Sopenharmony_ci	.reset_plane = drm_gem_simple_kms_reset_shadow_plane, \
14162306a36Sopenharmony_ci	.duplicate_plane_state = drm_gem_simple_kms_duplicate_shadow_plane_state, \
14262306a36Sopenharmony_ci	.destroy_plane_state = drm_gem_simple_kms_destroy_shadow_plane_state
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci#endif /* __DRM_GEM_ATOMIC_HELPER_H__ */
145