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