summaryrefslogtreecommitdiffstats
path: root/include/drm/drm_gem_atomic_helper.h
blob: 6e3319e9001a78267f33ef3f465e8c417ec6c7a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/* SPDX-License-Identifier: GPL-2.0-or-later */

#ifndef __DRM_GEM_ATOMIC_HELPER_H__
#define __DRM_GEM_ATOMIC_HELPER_H__

#include <linux/iosys-map.h>

#include <drm/drm_fourcc.h>
#include <drm/drm_plane.h>

struct drm_simple_display_pipe;

/*
 * Plane Helpers
 */

int drm_gem_plane_helper_prepare_fb(struct drm_plane *plane, struct drm_plane_state *state);
int drm_gem_simple_display_pipe_prepare_fb(struct drm_simple_display_pipe *pipe,
					   struct drm_plane_state *plane_state);

/*
 * Helpers for planes with shadow buffers
 */

/**
 * DRM_SHADOW_PLANE_MAX_WIDTH - Maximum width of a plane's shadow buffer in pixels
 *
 * For drivers with shadow planes, the maximum width of the framebuffer is
 * usually independent from hardware limitations. Drivers can initialize struct
 * drm_mode_config.max_width from DRM_SHADOW_PLANE_MAX_WIDTH.
 */
#define DRM_SHADOW_PLANE_MAX_WIDTH	(4096u)

/**
 * DRM_SHADOW_PLANE_MAX_HEIGHT - Maximum height of a plane's shadow buffer in scanlines
 *
 * For drivers with shadow planes, the maximum height of the framebuffer is
 * usually independent from hardware limitations. Drivers can initialize struct
 * drm_mode_config.max_height from DRM_SHADOW_PLANE_MAX_HEIGHT.
 */
#define DRM_SHADOW_PLANE_MAX_HEIGHT	(4096u)

/**
 * struct drm_shadow_plane_state - plane state for planes with shadow buffers
 *
 * For planes that use a shadow buffer, struct drm_shadow_plane_state
 * provides the regular plane state plus mappings of the shadow buffer
 * into kernel address space.
 */
struct drm_shadow_plane_state {
	/** @base: plane state */
	struct drm_plane_state base;

	/* Transitional state - do not export or duplicate */

	/**
	 * @map: Mappings of the plane's framebuffer BOs in to kernel address space
	 *
	 * The memory mappings stored in map should be established in the plane's
	 * prepare_fb callback and removed in the cleanup_fb callback.
	 */
	struct iosys_map map[DRM_FORMAT_MAX_PLANES];

	/**
	 * @data: Address of each framebuffer BO's data
	 *
	 * The address of the data stored in each mapping. This is different
	 * for framebuffers with non-zero offset fields.
	 */
	struct iosys_map data[DRM_FORMAT_MAX_PLANES];
};

/**
 * to_drm_shadow_plane_state - upcasts from struct drm_plane_state
 * @state: the plane state
 */
static inline struct drm_shadow_plane_state *
to_drm_shadow_plane_state(struct drm_plane_state *state)
{
	return container_of(state, struct drm_shadow_plane_state, base);
}

void __drm_gem_duplicate_shadow_plane_state(struct drm_plane *plane,
					    struct drm_shadow_plane_state *new_shadow_plane_state);
void __drm_gem_destroy_shadow_plane_state(struct drm_shadow_plane_state *shadow_plane_state);
void __drm_gem_reset_shadow_plane(struct drm_plane *plane,
				  struct drm_shadow_plane_state *shadow_plane_state);

void drm_gem_reset_shadow_plane(struct drm_plane *plane);
struct drm_plane_state *drm_gem_duplicate_shadow_plane_state(struct drm_plane *plane);
void drm_gem_destroy_shadow_plane_state(struct drm_plane *plane,
					struct drm_plane_state *plane_state);

/**
 * DRM_GEM_SHADOW_PLANE_FUNCS -
 *	Initializes struct drm_plane_funcs for shadow-buffered planes
 *
 * Drivers may use GEM BOs as shadow buffers over the framebuffer memory. This
 * macro initializes struct drm_plane_funcs to use the rsp helper functions.
 */
#define DRM_GEM_SHADOW_PLANE_FUNCS \
	.reset = drm_gem_reset_shadow_plane, \
	.atomic_duplicate_state = drm_gem_duplicate_shadow_plane_state, \
	.atomic_destroy_state = drm_gem_destroy_shadow_plane_state

int drm_gem_prepare_shadow_fb(struct drm_plane *plane, struct drm_plane_state *plane_state);
void drm_gem_cleanup_shadow_fb(struct drm_plane *plane, struct drm_plane_state *plane_state);

/**
 * DRM_GEM_SHADOW_PLANE_HELPER_FUNCS -
 *	Initializes struct drm_plane_helper_funcs for shadow-buffered planes
 *
 * Drivers may use GEM BOs as shadow buffers over the framebuffer memory. This
 * macro initializes struct drm_plane_helper_funcs to use the rsp helper
 * functions.
 */
#define DRM_GEM_SHADOW_PLANE_HELPER_FUNCS \
	.prepare_fb = drm_gem_prepare_shadow_fb, \
	.cleanup_fb = drm_gem_cleanup_shadow_fb

int drm_gem_simple_kms_prepare_shadow_fb(struct drm_simple_display_pipe *pipe,
					 struct drm_plane_state *plane_state);
void drm_gem_simple_kms_cleanup_shadow_fb(struct drm_simple_display_pipe *pipe,
					  struct drm_plane_state *plane_state);
void drm_gem_simple_kms_reset_shadow_plane(struct drm_simple_display_pipe *pipe);
struct drm_plane_state *
drm_gem_simple_kms_duplicate_shadow_plane_state(struct drm_simple_display_pipe *pipe);
void drm_gem_simple_kms_destroy_shadow_plane_state(struct drm_simple_display_pipe *pipe,
						   struct drm_plane_state *plane_state);

/**
 * DRM_GEM_SIMPLE_DISPLAY_PIPE_SHADOW_PLANE_FUNCS -
 *	Initializes struct drm_simple_display_pipe_funcs for shadow-buffered planes
 *
 * Drivers may use GEM BOs as shadow buffers over the framebuffer memory. This
 * macro initializes struct drm_simple_display_pipe_funcs to use the rsp helper
 * functions.
 */
#define DRM_GEM_SIMPLE_DISPLAY_PIPE_SHADOW_PLANE_FUNCS \
	.prepare_fb = drm_gem_simple_kms_prepare_shadow_fb, \
	.cleanup_fb = drm_gem_simple_kms_cleanup_shadow_fb, \
	.reset_plane = drm_gem_simple_kms_reset_shadow_plane, \
	.duplicate_plane_state = drm_gem_simple_kms_duplicate_shadow_plane_state, \
	.destroy_plane_state = drm_gem_simple_kms_destroy_shadow_plane_state

#endif /* __DRM_GEM_ATOMIC_HELPER_H__ */