xref: /linux/drivers/gpu/drm/sysfb/drm_sysfb_helper.h (revision 8d2b0853add1d7534dc0794e3c8e0b9e8c4ec640)
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 
9e8c08688SThomas Zimmermann #include <video/pixel_format.h>
10e8c08688SThomas Zimmermann 
1168ab3253SThomas Zimmermann #include <drm/drm_crtc.h>
12b5626f6fSThomas Zimmermann #include <drm/drm_device.h>
13b5626f6fSThomas Zimmermann #include <drm/drm_modes.h>
14b5626f6fSThomas Zimmermann 
15b5626f6fSThomas Zimmermann struct drm_format_info;
16314c45e3SThomas Zimmermann struct drm_scanout_buffer;
17e8c08688SThomas Zimmermann struct screen_info;
18e8c08688SThomas Zimmermann 
19e8c08688SThomas Zimmermann /*
20e8c08688SThomas Zimmermann  * Input parsing
21e8c08688SThomas Zimmermann  */
22e8c08688SThomas Zimmermann 
23e8c08688SThomas Zimmermann struct drm_sysfb_format {
24e8c08688SThomas Zimmermann 	struct pixel_format pixel;
25e8c08688SThomas Zimmermann 	u32 fourcc;
26e8c08688SThomas Zimmermann };
27e8c08688SThomas Zimmermann 
28e8c08688SThomas Zimmermann int drm_sysfb_get_validated_int(struct drm_device *dev, const char *name,
29e8c08688SThomas Zimmermann 				u64 value, u32 max);
30e8c08688SThomas Zimmermann int drm_sysfb_get_validated_int0(struct drm_device *dev, const char *name,
31e8c08688SThomas Zimmermann 				 u64 value, u32 max);
32e8c08688SThomas Zimmermann 
33e8c08688SThomas Zimmermann #if defined(CONFIG_SCREEN_INFO)
34e8c08688SThomas Zimmermann int drm_sysfb_get_width_si(struct drm_device *dev, const struct screen_info *si);
35e8c08688SThomas Zimmermann int drm_sysfb_get_height_si(struct drm_device *dev, const struct screen_info *si);
36e8c08688SThomas Zimmermann struct resource *drm_sysfb_get_memory_si(struct drm_device *dev,
37e8c08688SThomas Zimmermann 					 const struct screen_info *si,
38e8c08688SThomas Zimmermann 					 struct resource *res);
39e8c08688SThomas Zimmermann int drm_sysfb_get_stride_si(struct drm_device *dev, const struct screen_info *si,
40e8c08688SThomas Zimmermann 			    const struct drm_format_info *format,
41e8c08688SThomas Zimmermann 			    unsigned int width, unsigned int height, u64 size);
42e8c08688SThomas Zimmermann u64 drm_sysfb_get_visible_size_si(struct drm_device *dev, const struct screen_info *si,
43e8c08688SThomas Zimmermann 				  unsigned int height, unsigned int stride, u64 size);
44e8c08688SThomas Zimmermann const struct drm_format_info *drm_sysfb_get_format_si(struct drm_device *dev,
45e8c08688SThomas Zimmermann 						      const struct drm_sysfb_format *formats,
46e8c08688SThomas Zimmermann 						      size_t nformats,
47e8c08688SThomas Zimmermann 						      const struct screen_info *si);
48e8c08688SThomas Zimmermann #endif
49314c45e3SThomas Zimmermann 
50314c45e3SThomas Zimmermann /*
516046b49bSThomas Zimmermann  * Input parsing
526046b49bSThomas Zimmermann  */
536046b49bSThomas Zimmermann 
546046b49bSThomas Zimmermann int drm_sysfb_get_validated_int(struct drm_device *dev, const char *name,
556046b49bSThomas Zimmermann 				u64 value, u32 max);
566046b49bSThomas Zimmermann int drm_sysfb_get_validated_int0(struct drm_device *dev, const char *name,
576046b49bSThomas Zimmermann 				 u64 value, u32 max);
586046b49bSThomas Zimmermann 
596046b49bSThomas Zimmermann /*
60314c45e3SThomas Zimmermann  * Display modes
61314c45e3SThomas Zimmermann  */
62b5626f6fSThomas Zimmermann 
63333376e9SThomas Zimmermann struct drm_display_mode drm_sysfb_mode(unsigned int width,
64333376e9SThomas Zimmermann 				       unsigned int height,
65333376e9SThomas Zimmermann 				       unsigned int width_mm,
66333376e9SThomas Zimmermann 				       unsigned int height_mm);
67333376e9SThomas Zimmermann 
68b5626f6fSThomas Zimmermann /*
69b5626f6fSThomas Zimmermann  * Device
70b5626f6fSThomas Zimmermann  */
71b5626f6fSThomas Zimmermann 
72b5626f6fSThomas Zimmermann struct drm_sysfb_device {
73b5626f6fSThomas Zimmermann 	struct drm_device dev;
74b5626f6fSThomas Zimmermann 
75e7f435b3SThomas Zimmermann 	const u8 *edid; /* can be NULL */
76e7f435b3SThomas Zimmermann 
77b5626f6fSThomas Zimmermann 	/* hardware settings */
78b5626f6fSThomas Zimmermann 	struct drm_display_mode fb_mode;
79b5626f6fSThomas Zimmermann 	const struct drm_format_info *fb_format;
80b5626f6fSThomas Zimmermann 	unsigned int fb_pitch;
81ea86aba4SThomas Zimmermann 	unsigned int fb_gamma_lut_size;
82b5626f6fSThomas Zimmermann 
83b5626f6fSThomas Zimmermann 	/* hardware-framebuffer kernel address */
84b5626f6fSThomas Zimmermann 	struct iosys_map fb_addr;
85b5626f6fSThomas Zimmermann };
86b5626f6fSThomas Zimmermann 
87b5626f6fSThomas Zimmermann static inline struct drm_sysfb_device *to_drm_sysfb_device(struct drm_device *dev)
88b5626f6fSThomas Zimmermann {
89b5626f6fSThomas Zimmermann 	return container_of(dev, struct drm_sysfb_device, dev);
90b5626f6fSThomas Zimmermann }
91b5626f6fSThomas Zimmermann 
92559d105fSThomas Zimmermann /*
93177dfbdbSThomas Zimmermann  * Plane
94177dfbdbSThomas Zimmermann  */
95177dfbdbSThomas Zimmermann 
96*1a45ef02SThomas Zimmermann size_t drm_sysfb_build_fourcc_list(struct drm_device *dev,
97*1a45ef02SThomas Zimmermann 				   const u32 *native_fourccs, size_t native_nfourccs,
98*1a45ef02SThomas Zimmermann 				   u32 *fourccs_out, size_t nfourccs_out);
99*1a45ef02SThomas Zimmermann 
100177dfbdbSThomas Zimmermann int drm_sysfb_plane_helper_atomic_check(struct drm_plane *plane,
101177dfbdbSThomas Zimmermann 					struct drm_atomic_state *new_state);
102177dfbdbSThomas Zimmermann void drm_sysfb_plane_helper_atomic_update(struct drm_plane *plane,
103177dfbdbSThomas Zimmermann 					  struct drm_atomic_state *state);
104177dfbdbSThomas Zimmermann void drm_sysfb_plane_helper_atomic_disable(struct drm_plane *plane,
105177dfbdbSThomas Zimmermann 					   struct drm_atomic_state *state);
106177dfbdbSThomas Zimmermann int drm_sysfb_plane_helper_get_scanout_buffer(struct drm_plane *plane,
107177dfbdbSThomas Zimmermann 					      struct drm_scanout_buffer *sb);
108177dfbdbSThomas Zimmermann 
109177dfbdbSThomas Zimmermann #define DRM_SYSFB_PLANE_NFORMATS(_num_native) \
110177dfbdbSThomas Zimmermann 	((_num_native) + 1)
111177dfbdbSThomas Zimmermann 
112177dfbdbSThomas Zimmermann #define DRM_SYSFB_PLANE_FORMAT_MODIFIERS \
113177dfbdbSThomas Zimmermann 	DRM_FORMAT_MOD_LINEAR, \
114177dfbdbSThomas Zimmermann 	DRM_FORMAT_MOD_INVALID
115177dfbdbSThomas Zimmermann 
116177dfbdbSThomas Zimmermann #define DRM_SYSFB_PLANE_HELPER_FUNCS \
117177dfbdbSThomas Zimmermann 	DRM_GEM_SHADOW_PLANE_HELPER_FUNCS, \
118177dfbdbSThomas Zimmermann 	.atomic_check = drm_sysfb_plane_helper_atomic_check, \
119177dfbdbSThomas Zimmermann 	.atomic_update = drm_sysfb_plane_helper_atomic_update, \
120177dfbdbSThomas Zimmermann 	.atomic_disable = drm_sysfb_plane_helper_atomic_disable, \
121177dfbdbSThomas Zimmermann 	.get_scanout_buffer = drm_sysfb_plane_helper_get_scanout_buffer
122177dfbdbSThomas Zimmermann 
123177dfbdbSThomas Zimmermann #define DRM_SYSFB_PLANE_FUNCS \
124177dfbdbSThomas Zimmermann 	.update_plane = drm_atomic_helper_update_plane, \
125177dfbdbSThomas Zimmermann 	.disable_plane = drm_atomic_helper_disable_plane, \
126177dfbdbSThomas Zimmermann 	DRM_GEM_SHADOW_PLANE_FUNCS
127177dfbdbSThomas Zimmermann 
128177dfbdbSThomas Zimmermann /*
12968ab3253SThomas Zimmermann  * CRTC
13068ab3253SThomas Zimmermann  */
13168ab3253SThomas Zimmermann 
13268ab3253SThomas Zimmermann struct drm_sysfb_crtc_state {
13368ab3253SThomas Zimmermann 	struct drm_crtc_state base;
13468ab3253SThomas Zimmermann 
13568ab3253SThomas Zimmermann 	/* Primary-plane format; required for color mgmt. */
13668ab3253SThomas Zimmermann 	const struct drm_format_info *format;
13768ab3253SThomas Zimmermann };
13868ab3253SThomas Zimmermann 
13968ab3253SThomas Zimmermann static inline struct drm_sysfb_crtc_state *
14068ab3253SThomas Zimmermann to_drm_sysfb_crtc_state(struct drm_crtc_state *base)
14168ab3253SThomas Zimmermann {
14268ab3253SThomas Zimmermann 	return container_of(base, struct drm_sysfb_crtc_state, base);
14368ab3253SThomas Zimmermann }
14468ab3253SThomas Zimmermann 
145ea86aba4SThomas Zimmermann enum drm_mode_status drm_sysfb_crtc_helper_mode_valid(struct drm_crtc *crtc,
146ea86aba4SThomas Zimmermann 						      const struct drm_display_mode *mode);
147ea86aba4SThomas Zimmermann int drm_sysfb_crtc_helper_atomic_check(struct drm_crtc *crtc, struct drm_atomic_state *new_state);
148ea86aba4SThomas Zimmermann 
149ea86aba4SThomas Zimmermann #define DRM_SYSFB_CRTC_HELPER_FUNCS \
150ea86aba4SThomas Zimmermann 	.mode_valid = drm_sysfb_crtc_helper_mode_valid, \
151ea86aba4SThomas Zimmermann 	.atomic_check = drm_sysfb_crtc_helper_atomic_check
152ea86aba4SThomas Zimmermann 
15368ab3253SThomas Zimmermann void drm_sysfb_crtc_reset(struct drm_crtc *crtc);
15468ab3253SThomas Zimmermann struct drm_crtc_state *drm_sysfb_crtc_atomic_duplicate_state(struct drm_crtc *crtc);
15568ab3253SThomas Zimmermann void drm_sysfb_crtc_atomic_destroy_state(struct drm_crtc *crtc, struct drm_crtc_state *crtc_state);
15668ab3253SThomas Zimmermann 
15768ab3253SThomas Zimmermann #define DRM_SYSFB_CRTC_FUNCS \
15868ab3253SThomas Zimmermann 	.reset = drm_sysfb_crtc_reset, \
15968ab3253SThomas Zimmermann 	.set_config = drm_atomic_helper_set_config, \
16068ab3253SThomas Zimmermann 	.page_flip = drm_atomic_helper_page_flip, \
16168ab3253SThomas Zimmermann 	.atomic_duplicate_state = drm_sysfb_crtc_atomic_duplicate_state, \
16268ab3253SThomas Zimmermann 	.atomic_destroy_state = drm_sysfb_crtc_atomic_destroy_state
16368ab3253SThomas Zimmermann 
16468ab3253SThomas Zimmermann /*
16501e48e52SThomas Zimmermann  * Connector
16601e48e52SThomas Zimmermann  */
16701e48e52SThomas Zimmermann 
16801e48e52SThomas Zimmermann int drm_sysfb_connector_helper_get_modes(struct drm_connector *connector);
16901e48e52SThomas Zimmermann 
17001e48e52SThomas Zimmermann #define DRM_SYSFB_CONNECTOR_HELPER_FUNCS \
17101e48e52SThomas Zimmermann 	.get_modes = drm_sysfb_connector_helper_get_modes
17201e48e52SThomas Zimmermann 
17301e48e52SThomas Zimmermann #define DRM_SYSFB_CONNECTOR_FUNCS \
17401e48e52SThomas Zimmermann 	.reset = drm_atomic_helper_connector_reset, \
17501e48e52SThomas Zimmermann 	.fill_modes = drm_helper_probe_single_connector_modes, \
17601e48e52SThomas Zimmermann 	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, \
17701e48e52SThomas Zimmermann 	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state
17801e48e52SThomas Zimmermann 
17901e48e52SThomas Zimmermann /*
180559d105fSThomas Zimmermann  * Mode config
181559d105fSThomas Zimmermann  */
182559d105fSThomas Zimmermann 
183559d105fSThomas Zimmermann #define DRM_SYSFB_MODE_CONFIG_FUNCS \
184559d105fSThomas Zimmermann 	.fb_create = drm_gem_fb_create_with_dirty, \
185559d105fSThomas Zimmermann 	.atomic_check = drm_atomic_helper_check, \
186559d105fSThomas Zimmermann 	.atomic_commit = drm_atomic_helper_commit
187559d105fSThomas Zimmermann 
188b5626f6fSThomas Zimmermann #endif
189