xref: /linux/drivers/gpu/drm/sysfb/drm_sysfb_helper.h (revision 25489a4f556414445d342951615178368ee45cde)
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 <video/pixel_format.h>
10 
11 #include <drm/drm_crtc.h>
12 #include <drm/drm_device.h>
13 #include <drm/drm_modes.h>
14 
15 struct drm_format_info;
16 struct drm_scanout_buffer;
17 struct screen_info;
18 
19 /*
20  * Input parsing
21  */
22 
23 struct drm_sysfb_format {
24 	struct pixel_format pixel;
25 	u32 fourcc;
26 };
27 
28 int drm_sysfb_get_validated_int(struct drm_device *dev, const char *name,
29 				u64 value, u32 max);
30 int drm_sysfb_get_validated_int0(struct drm_device *dev, const char *name,
31 				 u64 value, u32 max);
32 
33 #if defined(CONFIG_SCREEN_INFO)
34 int drm_sysfb_get_width_si(struct drm_device *dev, const struct screen_info *si);
35 int drm_sysfb_get_height_si(struct drm_device *dev, const struct screen_info *si);
36 struct resource *drm_sysfb_get_memory_si(struct drm_device *dev,
37 					 const struct screen_info *si,
38 					 struct resource *res);
39 int drm_sysfb_get_stride_si(struct drm_device *dev, const struct screen_info *si,
40 			    const struct drm_format_info *format,
41 			    unsigned int width, unsigned int height, u64 size);
42 u64 drm_sysfb_get_visible_size_si(struct drm_device *dev, const struct screen_info *si,
43 				  unsigned int height, unsigned int stride, u64 size);
44 const struct drm_format_info *drm_sysfb_get_format_si(struct drm_device *dev,
45 						      const struct drm_sysfb_format *formats,
46 						      size_t nformats,
47 						      const struct screen_info *si);
48 #endif
49 
50 /*
51  * Input parsing
52  */
53 
54 int drm_sysfb_get_validated_int(struct drm_device *dev, const char *name,
55 				u64 value, u32 max);
56 int drm_sysfb_get_validated_int0(struct drm_device *dev, const char *name,
57 				 u64 value, u32 max);
58 
59 /*
60  * Display modes
61  */
62 
63 struct drm_display_mode drm_sysfb_mode(unsigned int width,
64 				       unsigned int height,
65 				       unsigned int width_mm,
66 				       unsigned int height_mm);
67 
68 /*
69  * Device
70  */
71 
72 struct drm_sysfb_device {
73 	struct drm_device dev;
74 
75 	const u8 *edid; /* can be NULL */
76 
77 	/* hardware settings */
78 	struct drm_display_mode fb_mode;
79 	const struct drm_format_info *fb_format;
80 	unsigned int fb_pitch;
81 	unsigned int fb_gamma_lut_size;
82 
83 	/* hardware-framebuffer kernel address */
84 	struct iosys_map fb_addr;
85 };
86 
87 static inline struct drm_sysfb_device *to_drm_sysfb_device(struct drm_device *dev)
88 {
89 	return container_of(dev, struct drm_sysfb_device, dev);
90 }
91 
92 /*
93  * Plane
94  */
95 
96 int drm_sysfb_plane_helper_atomic_check(struct drm_plane *plane,
97 					struct drm_atomic_state *new_state);
98 void drm_sysfb_plane_helper_atomic_update(struct drm_plane *plane,
99 					  struct drm_atomic_state *state);
100 void drm_sysfb_plane_helper_atomic_disable(struct drm_plane *plane,
101 					   struct drm_atomic_state *state);
102 int drm_sysfb_plane_helper_get_scanout_buffer(struct drm_plane *plane,
103 					      struct drm_scanout_buffer *sb);
104 
105 #define DRM_SYSFB_PLANE_NFORMATS(_num_native) \
106 	((_num_native) + 1)
107 
108 #define DRM_SYSFB_PLANE_FORMAT_MODIFIERS \
109 	DRM_FORMAT_MOD_LINEAR, \
110 	DRM_FORMAT_MOD_INVALID
111 
112 #define DRM_SYSFB_PLANE_HELPER_FUNCS \
113 	DRM_GEM_SHADOW_PLANE_HELPER_FUNCS, \
114 	.atomic_check = drm_sysfb_plane_helper_atomic_check, \
115 	.atomic_update = drm_sysfb_plane_helper_atomic_update, \
116 	.atomic_disable = drm_sysfb_plane_helper_atomic_disable, \
117 	.get_scanout_buffer = drm_sysfb_plane_helper_get_scanout_buffer
118 
119 #define DRM_SYSFB_PLANE_FUNCS \
120 	.update_plane = drm_atomic_helper_update_plane, \
121 	.disable_plane = drm_atomic_helper_disable_plane, \
122 	DRM_GEM_SHADOW_PLANE_FUNCS
123 
124 /*
125  * CRTC
126  */
127 
128 struct drm_sysfb_crtc_state {
129 	struct drm_crtc_state base;
130 
131 	/* Primary-plane format; required for color mgmt. */
132 	const struct drm_format_info *format;
133 };
134 
135 static inline struct drm_sysfb_crtc_state *
136 to_drm_sysfb_crtc_state(struct drm_crtc_state *base)
137 {
138 	return container_of(base, struct drm_sysfb_crtc_state, base);
139 }
140 
141 enum drm_mode_status drm_sysfb_crtc_helper_mode_valid(struct drm_crtc *crtc,
142 						      const struct drm_display_mode *mode);
143 int drm_sysfb_crtc_helper_atomic_check(struct drm_crtc *crtc, struct drm_atomic_state *new_state);
144 
145 #define DRM_SYSFB_CRTC_HELPER_FUNCS \
146 	.mode_valid = drm_sysfb_crtc_helper_mode_valid, \
147 	.atomic_check = drm_sysfb_crtc_helper_atomic_check
148 
149 void drm_sysfb_crtc_reset(struct drm_crtc *crtc);
150 struct drm_crtc_state *drm_sysfb_crtc_atomic_duplicate_state(struct drm_crtc *crtc);
151 void drm_sysfb_crtc_atomic_destroy_state(struct drm_crtc *crtc, struct drm_crtc_state *crtc_state);
152 
153 #define DRM_SYSFB_CRTC_FUNCS \
154 	.reset = drm_sysfb_crtc_reset, \
155 	.set_config = drm_atomic_helper_set_config, \
156 	.page_flip = drm_atomic_helper_page_flip, \
157 	.atomic_duplicate_state = drm_sysfb_crtc_atomic_duplicate_state, \
158 	.atomic_destroy_state = drm_sysfb_crtc_atomic_destroy_state
159 
160 /*
161  * Connector
162  */
163 
164 int drm_sysfb_connector_helper_get_modes(struct drm_connector *connector);
165 
166 #define DRM_SYSFB_CONNECTOR_HELPER_FUNCS \
167 	.get_modes = drm_sysfb_connector_helper_get_modes
168 
169 #define DRM_SYSFB_CONNECTOR_FUNCS \
170 	.reset = drm_atomic_helper_connector_reset, \
171 	.fill_modes = drm_helper_probe_single_connector_modes, \
172 	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, \
173 	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state
174 
175 /*
176  * Mode config
177  */
178 
179 #define DRM_SYSFB_MODE_CONFIG_FUNCS \
180 	.fb_create = drm_gem_fb_create_with_dirty, \
181 	.atomic_check = drm_atomic_helper_check, \
182 	.atomic_commit = drm_atomic_helper_commit
183 
184 #endif
185