xref: /linux/drivers/gpu/drm/sysfb/drm_sysfb_helper.h (revision 314c45e39e9abcaf2fe5449a11b6d9ad3b2c7dbc)
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;
14*314c45e3SThomas Zimmermann struct drm_scanout_buffer;
15*314c45e3SThomas Zimmermann 
16*314c45e3SThomas Zimmermann /*
17*314c45e3SThomas Zimmermann  * Display modes
18*314c45e3SThomas Zimmermann  */
19b5626f6fSThomas Zimmermann 
20333376e9SThomas Zimmermann struct drm_display_mode drm_sysfb_mode(unsigned int width,
21333376e9SThomas Zimmermann 				       unsigned int height,
22333376e9SThomas Zimmermann 				       unsigned int width_mm,
23333376e9SThomas Zimmermann 				       unsigned int height_mm);
24333376e9SThomas Zimmermann 
25b5626f6fSThomas Zimmermann /*
26b5626f6fSThomas Zimmermann  * Device
27b5626f6fSThomas Zimmermann  */
28b5626f6fSThomas Zimmermann 
29b5626f6fSThomas Zimmermann struct drm_sysfb_device {
30b5626f6fSThomas Zimmermann 	struct drm_device dev;
31b5626f6fSThomas Zimmermann 
32e7f435b3SThomas Zimmermann 	const u8 *edid; /* can be NULL */
33e7f435b3SThomas Zimmermann 
34b5626f6fSThomas Zimmermann 	/* hardware settings */
35b5626f6fSThomas Zimmermann 	struct drm_display_mode fb_mode;
36b5626f6fSThomas Zimmermann 	const struct drm_format_info *fb_format;
37b5626f6fSThomas Zimmermann 	unsigned int fb_pitch;
38ea86aba4SThomas Zimmermann 	unsigned int fb_gamma_lut_size;
39b5626f6fSThomas Zimmermann 
40b5626f6fSThomas Zimmermann 	/* hardware-framebuffer kernel address */
41b5626f6fSThomas Zimmermann 	struct iosys_map fb_addr;
42b5626f6fSThomas Zimmermann };
43b5626f6fSThomas Zimmermann 
44b5626f6fSThomas Zimmermann static inline struct drm_sysfb_device *to_drm_sysfb_device(struct drm_device *dev)
45b5626f6fSThomas Zimmermann {
46b5626f6fSThomas Zimmermann 	return container_of(dev, struct drm_sysfb_device, dev);
47b5626f6fSThomas Zimmermann }
48b5626f6fSThomas Zimmermann 
49559d105fSThomas Zimmermann /*
50177dfbdbSThomas Zimmermann  * Plane
51177dfbdbSThomas Zimmermann  */
52177dfbdbSThomas Zimmermann 
53177dfbdbSThomas Zimmermann int drm_sysfb_plane_helper_atomic_check(struct drm_plane *plane,
54177dfbdbSThomas Zimmermann 					struct drm_atomic_state *new_state);
55177dfbdbSThomas Zimmermann void drm_sysfb_plane_helper_atomic_update(struct drm_plane *plane,
56177dfbdbSThomas Zimmermann 					  struct drm_atomic_state *state);
57177dfbdbSThomas Zimmermann void drm_sysfb_plane_helper_atomic_disable(struct drm_plane *plane,
58177dfbdbSThomas Zimmermann 					   struct drm_atomic_state *state);
59177dfbdbSThomas Zimmermann int drm_sysfb_plane_helper_get_scanout_buffer(struct drm_plane *plane,
60177dfbdbSThomas Zimmermann 					      struct drm_scanout_buffer *sb);
61177dfbdbSThomas Zimmermann 
62177dfbdbSThomas Zimmermann #define DRM_SYSFB_PLANE_NFORMATS(_num_native) \
63177dfbdbSThomas Zimmermann 	((_num_native) + 1)
64177dfbdbSThomas Zimmermann 
65177dfbdbSThomas Zimmermann #define DRM_SYSFB_PLANE_FORMAT_MODIFIERS \
66177dfbdbSThomas Zimmermann 	DRM_FORMAT_MOD_LINEAR, \
67177dfbdbSThomas Zimmermann 	DRM_FORMAT_MOD_INVALID
68177dfbdbSThomas Zimmermann 
69177dfbdbSThomas Zimmermann #define DRM_SYSFB_PLANE_HELPER_FUNCS \
70177dfbdbSThomas Zimmermann 	DRM_GEM_SHADOW_PLANE_HELPER_FUNCS, \
71177dfbdbSThomas Zimmermann 	.atomic_check = drm_sysfb_plane_helper_atomic_check, \
72177dfbdbSThomas Zimmermann 	.atomic_update = drm_sysfb_plane_helper_atomic_update, \
73177dfbdbSThomas Zimmermann 	.atomic_disable = drm_sysfb_plane_helper_atomic_disable, \
74177dfbdbSThomas Zimmermann 	.get_scanout_buffer = drm_sysfb_plane_helper_get_scanout_buffer
75177dfbdbSThomas Zimmermann 
76177dfbdbSThomas Zimmermann #define DRM_SYSFB_PLANE_FUNCS \
77177dfbdbSThomas Zimmermann 	.update_plane = drm_atomic_helper_update_plane, \
78177dfbdbSThomas Zimmermann 	.disable_plane = drm_atomic_helper_disable_plane, \
79177dfbdbSThomas Zimmermann 	DRM_GEM_SHADOW_PLANE_FUNCS
80177dfbdbSThomas Zimmermann 
81177dfbdbSThomas Zimmermann /*
8268ab3253SThomas Zimmermann  * CRTC
8368ab3253SThomas Zimmermann  */
8468ab3253SThomas Zimmermann 
8568ab3253SThomas Zimmermann struct drm_sysfb_crtc_state {
8668ab3253SThomas Zimmermann 	struct drm_crtc_state base;
8768ab3253SThomas Zimmermann 
8868ab3253SThomas Zimmermann 	/* Primary-plane format; required for color mgmt. */
8968ab3253SThomas Zimmermann 	const struct drm_format_info *format;
9068ab3253SThomas Zimmermann };
9168ab3253SThomas Zimmermann 
9268ab3253SThomas Zimmermann static inline struct drm_sysfb_crtc_state *
9368ab3253SThomas Zimmermann to_drm_sysfb_crtc_state(struct drm_crtc_state *base)
9468ab3253SThomas Zimmermann {
9568ab3253SThomas Zimmermann 	return container_of(base, struct drm_sysfb_crtc_state, base);
9668ab3253SThomas Zimmermann }
9768ab3253SThomas Zimmermann 
98ea86aba4SThomas Zimmermann enum drm_mode_status drm_sysfb_crtc_helper_mode_valid(struct drm_crtc *crtc,
99ea86aba4SThomas Zimmermann 						      const struct drm_display_mode *mode);
100ea86aba4SThomas Zimmermann int drm_sysfb_crtc_helper_atomic_check(struct drm_crtc *crtc, struct drm_atomic_state *new_state);
101ea86aba4SThomas Zimmermann 
102ea86aba4SThomas Zimmermann #define DRM_SYSFB_CRTC_HELPER_FUNCS \
103ea86aba4SThomas Zimmermann 	.mode_valid = drm_sysfb_crtc_helper_mode_valid, \
104ea86aba4SThomas Zimmermann 	.atomic_check = drm_sysfb_crtc_helper_atomic_check
105ea86aba4SThomas Zimmermann 
10668ab3253SThomas Zimmermann void drm_sysfb_crtc_reset(struct drm_crtc *crtc);
10768ab3253SThomas Zimmermann struct drm_crtc_state *drm_sysfb_crtc_atomic_duplicate_state(struct drm_crtc *crtc);
10868ab3253SThomas Zimmermann void drm_sysfb_crtc_atomic_destroy_state(struct drm_crtc *crtc, struct drm_crtc_state *crtc_state);
10968ab3253SThomas Zimmermann 
11068ab3253SThomas Zimmermann #define DRM_SYSFB_CRTC_FUNCS \
11168ab3253SThomas Zimmermann 	.reset = drm_sysfb_crtc_reset, \
11268ab3253SThomas Zimmermann 	.set_config = drm_atomic_helper_set_config, \
11368ab3253SThomas Zimmermann 	.page_flip = drm_atomic_helper_page_flip, \
11468ab3253SThomas Zimmermann 	.atomic_duplicate_state = drm_sysfb_crtc_atomic_duplicate_state, \
11568ab3253SThomas Zimmermann 	.atomic_destroy_state = drm_sysfb_crtc_atomic_destroy_state
11668ab3253SThomas Zimmermann 
11768ab3253SThomas Zimmermann /*
11801e48e52SThomas Zimmermann  * Connector
11901e48e52SThomas Zimmermann  */
12001e48e52SThomas Zimmermann 
12101e48e52SThomas Zimmermann int drm_sysfb_connector_helper_get_modes(struct drm_connector *connector);
12201e48e52SThomas Zimmermann 
12301e48e52SThomas Zimmermann #define DRM_SYSFB_CONNECTOR_HELPER_FUNCS \
12401e48e52SThomas Zimmermann 	.get_modes = drm_sysfb_connector_helper_get_modes
12501e48e52SThomas Zimmermann 
12601e48e52SThomas Zimmermann #define DRM_SYSFB_CONNECTOR_FUNCS \
12701e48e52SThomas Zimmermann 	.reset = drm_atomic_helper_connector_reset, \
12801e48e52SThomas Zimmermann 	.fill_modes = drm_helper_probe_single_connector_modes, \
12901e48e52SThomas Zimmermann 	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, \
13001e48e52SThomas Zimmermann 	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state
13101e48e52SThomas Zimmermann 
13201e48e52SThomas Zimmermann /*
133559d105fSThomas Zimmermann  * Mode config
134559d105fSThomas Zimmermann  */
135559d105fSThomas Zimmermann 
136559d105fSThomas Zimmermann #define DRM_SYSFB_MODE_CONFIG_FUNCS \
137559d105fSThomas Zimmermann 	.fb_create = drm_gem_fb_create_with_dirty, \
138559d105fSThomas Zimmermann 	.atomic_check = drm_atomic_helper_check, \
139559d105fSThomas Zimmermann 	.atomic_commit = drm_atomic_helper_commit
140559d105fSThomas Zimmermann 
141b5626f6fSThomas Zimmermann #endif
142