xref: /linux/drivers/gpu/drm/sysfb/drm_sysfb_helper.h (revision 252c4711973de4e4f3ecddcc18912aecfd4e537c)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #ifndef DRM_SYSFB_HELPER_H
4 #define DRM_SYSFB_HELPER_H
5 
6 #include <linux/container_of.h>
7 #include <linux/iosys-map.h>
8 
9 #include <drm/drm_crtc.h>
10 #include <drm/drm_device.h>
11 #include <drm/drm_modes.h>
12 
13 struct drm_format_info;
14 
15 struct drm_display_mode drm_sysfb_mode(unsigned int width,
16 				       unsigned int height,
17 				       unsigned int width_mm,
18 				       unsigned int height_mm);
19 
20 /*
21  * Device
22  */
23 
24 struct drm_sysfb_device {
25 	struct drm_device dev;
26 
27 	const u8 *edid; /* can be NULL */
28 
29 	/* hardware settings */
30 	struct drm_display_mode fb_mode;
31 	const struct drm_format_info *fb_format;
32 	unsigned int fb_pitch;
33 	unsigned int fb_gamma_lut_size;
34 
35 	/* hardware-framebuffer kernel address */
36 	struct iosys_map fb_addr;
37 };
38 
39 static inline struct drm_sysfb_device *to_drm_sysfb_device(struct drm_device *dev)
40 {
41 	return container_of(dev, struct drm_sysfb_device, dev);
42 }
43 
44 /*
45  * Plane
46  */
47 
48 int drm_sysfb_plane_helper_atomic_check(struct drm_plane *plane,
49 					struct drm_atomic_state *new_state);
50 void drm_sysfb_plane_helper_atomic_update(struct drm_plane *plane,
51 					  struct drm_atomic_state *state);
52 void drm_sysfb_plane_helper_atomic_disable(struct drm_plane *plane,
53 					   struct drm_atomic_state *state);
54 int drm_sysfb_plane_helper_get_scanout_buffer(struct drm_plane *plane,
55 					      struct drm_scanout_buffer *sb);
56 
57 #define DRM_SYSFB_PLANE_NFORMATS(_num_native) \
58 	((_num_native) + 1)
59 
60 #define DRM_SYSFB_PLANE_FORMAT_MODIFIERS \
61 	DRM_FORMAT_MOD_LINEAR, \
62 	DRM_FORMAT_MOD_INVALID
63 
64 #define DRM_SYSFB_PLANE_HELPER_FUNCS \
65 	DRM_GEM_SHADOW_PLANE_HELPER_FUNCS, \
66 	.atomic_check = drm_sysfb_plane_helper_atomic_check, \
67 	.atomic_update = drm_sysfb_plane_helper_atomic_update, \
68 	.atomic_disable = drm_sysfb_plane_helper_atomic_disable, \
69 	.get_scanout_buffer = drm_sysfb_plane_helper_get_scanout_buffer
70 
71 #define DRM_SYSFB_PLANE_FUNCS \
72 	.update_plane = drm_atomic_helper_update_plane, \
73 	.disable_plane = drm_atomic_helper_disable_plane, \
74 	DRM_GEM_SHADOW_PLANE_FUNCS
75 
76 /*
77  * CRTC
78  */
79 
80 struct drm_sysfb_crtc_state {
81 	struct drm_crtc_state base;
82 
83 	/* Primary-plane format; required for color mgmt. */
84 	const struct drm_format_info *format;
85 };
86 
87 static inline struct drm_sysfb_crtc_state *
88 to_drm_sysfb_crtc_state(struct drm_crtc_state *base)
89 {
90 	return container_of(base, struct drm_sysfb_crtc_state, base);
91 }
92 
93 enum drm_mode_status drm_sysfb_crtc_helper_mode_valid(struct drm_crtc *crtc,
94 						      const struct drm_display_mode *mode);
95 int drm_sysfb_crtc_helper_atomic_check(struct drm_crtc *crtc, struct drm_atomic_state *new_state);
96 
97 #define DRM_SYSFB_CRTC_HELPER_FUNCS \
98 	.mode_valid = drm_sysfb_crtc_helper_mode_valid, \
99 	.atomic_check = drm_sysfb_crtc_helper_atomic_check
100 
101 void drm_sysfb_crtc_reset(struct drm_crtc *crtc);
102 struct drm_crtc_state *drm_sysfb_crtc_atomic_duplicate_state(struct drm_crtc *crtc);
103 void drm_sysfb_crtc_atomic_destroy_state(struct drm_crtc *crtc, struct drm_crtc_state *crtc_state);
104 
105 #define DRM_SYSFB_CRTC_FUNCS \
106 	.reset = drm_sysfb_crtc_reset, \
107 	.set_config = drm_atomic_helper_set_config, \
108 	.page_flip = drm_atomic_helper_page_flip, \
109 	.atomic_duplicate_state = drm_sysfb_crtc_atomic_duplicate_state, \
110 	.atomic_destroy_state = drm_sysfb_crtc_atomic_destroy_state
111 
112 /*
113  * Connector
114  */
115 
116 int drm_sysfb_connector_helper_get_modes(struct drm_connector *connector);
117 
118 #define DRM_SYSFB_CONNECTOR_HELPER_FUNCS \
119 	.get_modes = drm_sysfb_connector_helper_get_modes
120 
121 #define DRM_SYSFB_CONNECTOR_FUNCS \
122 	.reset = drm_atomic_helper_connector_reset, \
123 	.fill_modes = drm_helper_probe_single_connector_modes, \
124 	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, \
125 	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state
126 
127 /*
128  * Mode config
129  */
130 
131 #define DRM_SYSFB_MODE_CONFIG_FUNCS \
132 	.fb_create = drm_gem_fb_create_with_dirty, \
133 	.atomic_check = drm_atomic_helper_check, \
134 	.atomic_commit = drm_atomic_helper_commit
135 
136 #endif
137