Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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
15struct drm_format_info;
16struct drm_scanout_buffer;
17struct screen_info;
18
19/*
20 * Input parsing
21 */
22
23struct drm_sysfb_format {
24 struct pixel_format pixel;
25 u32 fourcc;
26};
27
28int drm_sysfb_get_validated_int(struct drm_device *dev, const char *name,
29 u64 value, u32 max);
30int drm_sysfb_get_validated_int0(struct drm_device *dev, const char *name,
31 u64 value, u32 max);
32
33#if defined(CONFIG_SCREEN_INFO)
34int drm_sysfb_get_width_si(struct drm_device *dev, const struct screen_info *si);
35int drm_sysfb_get_height_si(struct drm_device *dev, const struct screen_info *si);
36struct resource *drm_sysfb_get_memory_si(struct drm_device *dev,
37 const struct screen_info *si,
38 struct resource *res);
39int 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);
42u64 drm_sysfb_get_visible_size_si(struct drm_device *dev, const struct screen_info *si,
43 unsigned int height, unsigned int stride, u64 size);
44const 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
54int drm_sysfb_get_validated_int(struct drm_device *dev, const char *name,
55 u64 value, u32 max);
56int drm_sysfb_get_validated_int0(struct drm_device *dev, const char *name,
57 u64 value, u32 max);
58
59/*
60 * Display modes
61 */
62
63struct 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
72struct 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
87static 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
96int drm_sysfb_plane_helper_atomic_check(struct drm_plane *plane,
97 struct drm_atomic_state *new_state);
98void drm_sysfb_plane_helper_atomic_update(struct drm_plane *plane,
99 struct drm_atomic_state *state);
100void drm_sysfb_plane_helper_atomic_disable(struct drm_plane *plane,
101 struct drm_atomic_state *state);
102int 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
128struct 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
135static inline struct drm_sysfb_crtc_state *
136to_drm_sysfb_crtc_state(struct drm_crtc_state *base)
137{
138 return container_of(base, struct drm_sysfb_crtc_state, base);
139}
140
141enum drm_mode_status drm_sysfb_crtc_helper_mode_valid(struct drm_crtc *crtc,
142 const struct drm_display_mode *mode);
143int 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
149void drm_sysfb_crtc_reset(struct drm_crtc *crtc);
150struct drm_crtc_state *drm_sysfb_crtc_atomic_duplicate_state(struct drm_crtc *crtc);
151void 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
164int 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