xref: /linux/drivers/gpu/drm/sysfb/drm_sysfb_helper.h (revision 68ab3253df1312bc22257cc217d77cdaef14186a)
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 
9*68ab3253SThomas 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;
31b5626f6fSThomas Zimmermann 
32b5626f6fSThomas Zimmermann 	/* hardware-framebuffer kernel address */
33b5626f6fSThomas Zimmermann 	struct iosys_map fb_addr;
34b5626f6fSThomas Zimmermann };
35b5626f6fSThomas Zimmermann 
36b5626f6fSThomas Zimmermann static inline struct drm_sysfb_device *to_drm_sysfb_device(struct drm_device *dev)
37b5626f6fSThomas Zimmermann {
38b5626f6fSThomas Zimmermann 	return container_of(dev, struct drm_sysfb_device, dev);
39b5626f6fSThomas Zimmermann }
40b5626f6fSThomas Zimmermann 
41559d105fSThomas Zimmermann /*
42*68ab3253SThomas Zimmermann  * CRTC
43*68ab3253SThomas Zimmermann  */
44*68ab3253SThomas Zimmermann 
45*68ab3253SThomas Zimmermann struct drm_sysfb_crtc_state {
46*68ab3253SThomas Zimmermann 	struct drm_crtc_state base;
47*68ab3253SThomas Zimmermann 
48*68ab3253SThomas Zimmermann 	/* Primary-plane format; required for color mgmt. */
49*68ab3253SThomas Zimmermann 	const struct drm_format_info *format;
50*68ab3253SThomas Zimmermann };
51*68ab3253SThomas Zimmermann 
52*68ab3253SThomas Zimmermann static inline struct drm_sysfb_crtc_state *
53*68ab3253SThomas Zimmermann to_drm_sysfb_crtc_state(struct drm_crtc_state *base)
54*68ab3253SThomas Zimmermann {
55*68ab3253SThomas Zimmermann 	return container_of(base, struct drm_sysfb_crtc_state, base);
56*68ab3253SThomas Zimmermann }
57*68ab3253SThomas Zimmermann 
58*68ab3253SThomas Zimmermann void drm_sysfb_crtc_reset(struct drm_crtc *crtc);
59*68ab3253SThomas Zimmermann struct drm_crtc_state *drm_sysfb_crtc_atomic_duplicate_state(struct drm_crtc *crtc);
60*68ab3253SThomas Zimmermann void drm_sysfb_crtc_atomic_destroy_state(struct drm_crtc *crtc, struct drm_crtc_state *crtc_state);
61*68ab3253SThomas Zimmermann 
62*68ab3253SThomas Zimmermann #define DRM_SYSFB_CRTC_FUNCS \
63*68ab3253SThomas Zimmermann 	.reset = drm_sysfb_crtc_reset, \
64*68ab3253SThomas Zimmermann 	.set_config = drm_atomic_helper_set_config, \
65*68ab3253SThomas Zimmermann 	.page_flip = drm_atomic_helper_page_flip, \
66*68ab3253SThomas Zimmermann 	.atomic_duplicate_state = drm_sysfb_crtc_atomic_duplicate_state, \
67*68ab3253SThomas Zimmermann 	.atomic_destroy_state = drm_sysfb_crtc_atomic_destroy_state
68*68ab3253SThomas Zimmermann 
69*68ab3253SThomas Zimmermann /*
7001e48e52SThomas Zimmermann  * Connector
7101e48e52SThomas Zimmermann  */
7201e48e52SThomas Zimmermann 
7301e48e52SThomas Zimmermann int drm_sysfb_connector_helper_get_modes(struct drm_connector *connector);
7401e48e52SThomas Zimmermann 
7501e48e52SThomas Zimmermann #define DRM_SYSFB_CONNECTOR_HELPER_FUNCS \
7601e48e52SThomas Zimmermann 	.get_modes = drm_sysfb_connector_helper_get_modes
7701e48e52SThomas Zimmermann 
7801e48e52SThomas Zimmermann #define DRM_SYSFB_CONNECTOR_FUNCS \
7901e48e52SThomas Zimmermann 	.reset = drm_atomic_helper_connector_reset, \
8001e48e52SThomas Zimmermann 	.fill_modes = drm_helper_probe_single_connector_modes, \
8101e48e52SThomas Zimmermann 	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, \
8201e48e52SThomas Zimmermann 	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state
8301e48e52SThomas Zimmermann 
8401e48e52SThomas Zimmermann /*
85559d105fSThomas Zimmermann  * Mode config
86559d105fSThomas Zimmermann  */
87559d105fSThomas Zimmermann 
88559d105fSThomas Zimmermann #define DRM_SYSFB_MODE_CONFIG_FUNCS \
89559d105fSThomas Zimmermann 	.fb_create = drm_gem_fb_create_with_dirty, \
90559d105fSThomas Zimmermann 	.atomic_check = drm_atomic_helper_check, \
91559d105fSThomas Zimmermann 	.atomic_commit = drm_atomic_helper_commit
92559d105fSThomas Zimmermann 
93b5626f6fSThomas Zimmermann #endif
94