xref: /linux/drivers/gpu/drm/sysfb/drm_sysfb_helper.h (revision 177dfbdb7e67db24d86dbd41cde20813d6e820cc)
1b5626f6fSThomas Zimmermann /* SPDX-License-Identifier: GPL-2.0-only */
2b5626f6fSThomas Zimmermann 
3b5626f6fSThomas Zimmermann #ifndef DRM_SYSFB_HELPER_H
4b5626f6fSThomas Zimmermann #define DRM_SYSFB_HELPER_H
5b5626f6fSThomas Zimmermann 
6b5626f6fSThomas Zimmermann #include <linux/container_of.h>
7b5626f6fSThomas Zimmermann #include <linux/iosys-map.h>
8b5626f6fSThomas Zimmermann 
968ab3253SThomas Zimmermann #include <drm/drm_crtc.h>
10b5626f6fSThomas Zimmermann #include <drm/drm_device.h>
11b5626f6fSThomas Zimmermann #include <drm/drm_modes.h>
12b5626f6fSThomas Zimmermann 
13b5626f6fSThomas Zimmermann struct drm_format_info;
14b5626f6fSThomas Zimmermann 
15333376e9SThomas Zimmermann struct drm_display_mode drm_sysfb_mode(unsigned int width,
16333376e9SThomas Zimmermann 				       unsigned int height,
17333376e9SThomas Zimmermann 				       unsigned int width_mm,
18333376e9SThomas Zimmermann 				       unsigned int height_mm);
19333376e9SThomas Zimmermann 
20b5626f6fSThomas Zimmermann /*
21b5626f6fSThomas Zimmermann  * Device
22b5626f6fSThomas Zimmermann  */
23b5626f6fSThomas Zimmermann 
24b5626f6fSThomas Zimmermann struct drm_sysfb_device {
25b5626f6fSThomas Zimmermann 	struct drm_device dev;
26b5626f6fSThomas Zimmermann 
27b5626f6fSThomas Zimmermann 	/* hardware settings */
28b5626f6fSThomas Zimmermann 	struct drm_display_mode fb_mode;
29b5626f6fSThomas Zimmermann 	const struct drm_format_info *fb_format;
30b5626f6fSThomas Zimmermann 	unsigned int fb_pitch;
31ea86aba4SThomas Zimmermann 	unsigned int fb_gamma_lut_size;
32b5626f6fSThomas Zimmermann 
33b5626f6fSThomas Zimmermann 	/* hardware-framebuffer kernel address */
34b5626f6fSThomas Zimmermann 	struct iosys_map fb_addr;
35b5626f6fSThomas Zimmermann };
36b5626f6fSThomas Zimmermann 
37b5626f6fSThomas Zimmermann static inline struct drm_sysfb_device *to_drm_sysfb_device(struct drm_device *dev)
38b5626f6fSThomas Zimmermann {
39b5626f6fSThomas Zimmermann 	return container_of(dev, struct drm_sysfb_device, dev);
40b5626f6fSThomas Zimmermann }
41b5626f6fSThomas Zimmermann 
42559d105fSThomas Zimmermann /*
43*177dfbdbSThomas Zimmermann  * Plane
44*177dfbdbSThomas Zimmermann  */
45*177dfbdbSThomas Zimmermann 
46*177dfbdbSThomas Zimmermann int drm_sysfb_plane_helper_atomic_check(struct drm_plane *plane,
47*177dfbdbSThomas Zimmermann 					struct drm_atomic_state *new_state);
48*177dfbdbSThomas Zimmermann void drm_sysfb_plane_helper_atomic_update(struct drm_plane *plane,
49*177dfbdbSThomas Zimmermann 					  struct drm_atomic_state *state);
50*177dfbdbSThomas Zimmermann void drm_sysfb_plane_helper_atomic_disable(struct drm_plane *plane,
51*177dfbdbSThomas Zimmermann 					   struct drm_atomic_state *state);
52*177dfbdbSThomas Zimmermann int drm_sysfb_plane_helper_get_scanout_buffer(struct drm_plane *plane,
53*177dfbdbSThomas Zimmermann 					      struct drm_scanout_buffer *sb);
54*177dfbdbSThomas Zimmermann 
55*177dfbdbSThomas Zimmermann #define DRM_SYSFB_PLANE_NFORMATS(_num_native) \
56*177dfbdbSThomas Zimmermann 	((_num_native) + 1)
57*177dfbdbSThomas Zimmermann 
58*177dfbdbSThomas Zimmermann #define DRM_SYSFB_PLANE_FORMAT_MODIFIERS \
59*177dfbdbSThomas Zimmermann 	DRM_FORMAT_MOD_LINEAR, \
60*177dfbdbSThomas Zimmermann 	DRM_FORMAT_MOD_INVALID
61*177dfbdbSThomas Zimmermann 
62*177dfbdbSThomas Zimmermann #define DRM_SYSFB_PLANE_HELPER_FUNCS \
63*177dfbdbSThomas Zimmermann 	DRM_GEM_SHADOW_PLANE_HELPER_FUNCS, \
64*177dfbdbSThomas Zimmermann 	.atomic_check = drm_sysfb_plane_helper_atomic_check, \
65*177dfbdbSThomas Zimmermann 	.atomic_update = drm_sysfb_plane_helper_atomic_update, \
66*177dfbdbSThomas Zimmermann 	.atomic_disable = drm_sysfb_plane_helper_atomic_disable, \
67*177dfbdbSThomas Zimmermann 	.get_scanout_buffer = drm_sysfb_plane_helper_get_scanout_buffer
68*177dfbdbSThomas Zimmermann 
69*177dfbdbSThomas Zimmermann #define DRM_SYSFB_PLANE_FUNCS \
70*177dfbdbSThomas Zimmermann 	.update_plane = drm_atomic_helper_update_plane, \
71*177dfbdbSThomas Zimmermann 	.disable_plane = drm_atomic_helper_disable_plane, \
72*177dfbdbSThomas Zimmermann 	DRM_GEM_SHADOW_PLANE_FUNCS
73*177dfbdbSThomas Zimmermann 
74*177dfbdbSThomas Zimmermann /*
7568ab3253SThomas Zimmermann  * CRTC
7668ab3253SThomas Zimmermann  */
7768ab3253SThomas Zimmermann 
7868ab3253SThomas Zimmermann struct drm_sysfb_crtc_state {
7968ab3253SThomas Zimmermann 	struct drm_crtc_state base;
8068ab3253SThomas Zimmermann 
8168ab3253SThomas Zimmermann 	/* Primary-plane format; required for color mgmt. */
8268ab3253SThomas Zimmermann 	const struct drm_format_info *format;
8368ab3253SThomas Zimmermann };
8468ab3253SThomas Zimmermann 
8568ab3253SThomas Zimmermann static inline struct drm_sysfb_crtc_state *
8668ab3253SThomas Zimmermann to_drm_sysfb_crtc_state(struct drm_crtc_state *base)
8768ab3253SThomas Zimmermann {
8868ab3253SThomas Zimmermann 	return container_of(base, struct drm_sysfb_crtc_state, base);
8968ab3253SThomas Zimmermann }
9068ab3253SThomas Zimmermann 
91ea86aba4SThomas Zimmermann enum drm_mode_status drm_sysfb_crtc_helper_mode_valid(struct drm_crtc *crtc,
92ea86aba4SThomas Zimmermann 						      const struct drm_display_mode *mode);
93ea86aba4SThomas Zimmermann int drm_sysfb_crtc_helper_atomic_check(struct drm_crtc *crtc, struct drm_atomic_state *new_state);
94ea86aba4SThomas Zimmermann 
95ea86aba4SThomas Zimmermann #define DRM_SYSFB_CRTC_HELPER_FUNCS \
96ea86aba4SThomas Zimmermann 	.mode_valid = drm_sysfb_crtc_helper_mode_valid, \
97ea86aba4SThomas Zimmermann 	.atomic_check = drm_sysfb_crtc_helper_atomic_check
98ea86aba4SThomas Zimmermann 
9968ab3253SThomas Zimmermann void drm_sysfb_crtc_reset(struct drm_crtc *crtc);
10068ab3253SThomas Zimmermann struct drm_crtc_state *drm_sysfb_crtc_atomic_duplicate_state(struct drm_crtc *crtc);
10168ab3253SThomas Zimmermann void drm_sysfb_crtc_atomic_destroy_state(struct drm_crtc *crtc, struct drm_crtc_state *crtc_state);
10268ab3253SThomas Zimmermann 
10368ab3253SThomas Zimmermann #define DRM_SYSFB_CRTC_FUNCS \
10468ab3253SThomas Zimmermann 	.reset = drm_sysfb_crtc_reset, \
10568ab3253SThomas Zimmermann 	.set_config = drm_atomic_helper_set_config, \
10668ab3253SThomas Zimmermann 	.page_flip = drm_atomic_helper_page_flip, \
10768ab3253SThomas Zimmermann 	.atomic_duplicate_state = drm_sysfb_crtc_atomic_duplicate_state, \
10868ab3253SThomas Zimmermann 	.atomic_destroy_state = drm_sysfb_crtc_atomic_destroy_state
10968ab3253SThomas Zimmermann 
11068ab3253SThomas Zimmermann /*
11101e48e52SThomas Zimmermann  * Connector
11201e48e52SThomas Zimmermann  */
11301e48e52SThomas Zimmermann 
11401e48e52SThomas Zimmermann int drm_sysfb_connector_helper_get_modes(struct drm_connector *connector);
11501e48e52SThomas Zimmermann 
11601e48e52SThomas Zimmermann #define DRM_SYSFB_CONNECTOR_HELPER_FUNCS \
11701e48e52SThomas Zimmermann 	.get_modes = drm_sysfb_connector_helper_get_modes
11801e48e52SThomas Zimmermann 
11901e48e52SThomas Zimmermann #define DRM_SYSFB_CONNECTOR_FUNCS \
12001e48e52SThomas Zimmermann 	.reset = drm_atomic_helper_connector_reset, \
12101e48e52SThomas Zimmermann 	.fill_modes = drm_helper_probe_single_connector_modes, \
12201e48e52SThomas Zimmermann 	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, \
12301e48e52SThomas Zimmermann 	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state
12401e48e52SThomas Zimmermann 
12501e48e52SThomas Zimmermann /*
126559d105fSThomas Zimmermann  * Mode config
127559d105fSThomas Zimmermann  */
128559d105fSThomas Zimmermann 
129559d105fSThomas Zimmermann #define DRM_SYSFB_MODE_CONFIG_FUNCS \
130559d105fSThomas Zimmermann 	.fb_create = drm_gem_fb_create_with_dirty, \
131559d105fSThomas Zimmermann 	.atomic_check = drm_atomic_helper_check, \
132559d105fSThomas Zimmermann 	.atomic_commit = drm_atomic_helper_commit
133559d105fSThomas Zimmermann 
134b5626f6fSThomas Zimmermann #endif
135