1 /* SPDX-License-Identifier: MIT */
3 * Copyright 2020 Noralf Trønnes
9 #include <linux/types.h>
12 * struct gud_display_descriptor_req - Display descriptor
13 * @magic: Magic value GUD_DISPLAY_MAGIC
14 * @version: Protocol version
16 * - STATUS_ON_SET: Always do a status request after a SET request.
17 * This is used by the Linux gadget driver since it has
18 * no way to control the status stage of a control OUT
19 * request that has a payload.
20 * - FULL_UPDATE: Always send the entire framebuffer when flushing changes.
21 * The GUD_REQ_SET_BUFFER request will not be sent
22 * before each bulk transfer, it will only be sent if the
23 * previous bulk transfer had failed. This gives the device
24 * a chance to reset its state machine if needed.
25 * This flag can not be used in combination with compression.
26 * @compression: Supported compression types
27 * - GUD_COMPRESSION_LZ4: LZ4 lossless compression.
28 * @max_buffer_size: Maximum buffer size the device can handle (optional).
29 * This is useful for devices that don't have a big enough
30 * buffer to decompress the entire framebuffer in one go.
31 * @min_width: Minimum pixel width the controller can handle
32 * @max_width: Maximum width
33 * @min_height: Minimum height
34 * @max_height: Maximum height
36 * Devices that have only one display mode will have min_width == max_width
37 * and min_height == max_height.
39 struct gud_display_descriptor_req {
41 #define GUD_DISPLAY_MAGIC 0x1d50614d
44 #define GUD_DISPLAY_FLAG_STATUS_ON_SET BIT(0)
45 #define GUD_DISPLAY_FLAG_FULL_UPDATE BIT(1)
47 #define GUD_COMPRESSION_LZ4 BIT(0)
48 __le32 max_buffer_size;
56 * struct gud_property_req - Property
60 struct gud_property_req {
66 * struct gud_display_mode_req - Display mode
67 * @clock: Pixel clock in kHz
68 * @hdisplay: Horizontal display size
69 * @hsync_start: Horizontal sync start
70 * @hsync_end: Horizontal sync end
71 * @htotal: Horizontal total size
72 * @vdisplay: Vertical display size
73 * @vsync_start: Vertical sync start
74 * @vsync_end: Vertical sync end
75 * @vtotal: Vertical total size
76 * @flags: Bits 0-13 are the same as in the RandR protocol and also what DRM uses.
77 * The deprecated bits are reused for internal protocol flags leaving us
78 * free to follow DRM for the other bits in the future.
79 * - FLAG_PREFERRED: Set on the preferred display mode.
81 struct gud_display_mode_req {
92 #define GUD_DISPLAY_MODE_FLAG_PHSYNC BIT(0)
93 #define GUD_DISPLAY_MODE_FLAG_NHSYNC BIT(1)
94 #define GUD_DISPLAY_MODE_FLAG_PVSYNC BIT(2)
95 #define GUD_DISPLAY_MODE_FLAG_NVSYNC BIT(3)
96 #define GUD_DISPLAY_MODE_FLAG_INTERLACE BIT(4)
97 #define GUD_DISPLAY_MODE_FLAG_DBLSCAN BIT(5)
98 #define GUD_DISPLAY_MODE_FLAG_CSYNC BIT(6)
99 #define GUD_DISPLAY_MODE_FLAG_PCSYNC BIT(7)
100 #define GUD_DISPLAY_MODE_FLAG_NCSYNC BIT(8)
101 #define GUD_DISPLAY_MODE_FLAG_HSKEW BIT(9)
102 /* BCast and PixelMultiplex are deprecated */
103 #define GUD_DISPLAY_MODE_FLAG_DBLCLK BIT(12)
104 #define GUD_DISPLAY_MODE_FLAG_CLKDIV2 BIT(13)
105 #define GUD_DISPLAY_MODE_FLAG_USER_MASK \
106 (GUD_DISPLAY_MODE_FLAG_PHSYNC | GUD_DISPLAY_MODE_FLAG_NHSYNC | \
107 GUD_DISPLAY_MODE_FLAG_PVSYNC | GUD_DISPLAY_MODE_FLAG_NVSYNC | \
108 GUD_DISPLAY_MODE_FLAG_INTERLACE | GUD_DISPLAY_MODE_FLAG_DBLSCAN | \
109 GUD_DISPLAY_MODE_FLAG_CSYNC | GUD_DISPLAY_MODE_FLAG_PCSYNC | \
110 GUD_DISPLAY_MODE_FLAG_NCSYNC | GUD_DISPLAY_MODE_FLAG_HSKEW | \
111 GUD_DISPLAY_MODE_FLAG_DBLCLK | GUD_DISPLAY_MODE_FLAG_CLKDIV2)
112 /* Internal protocol flags */
113 #define GUD_DISPLAY_MODE_FLAG_PREFERRED BIT(10)
117 * struct gud_connector_descriptor_req - Connector descriptor
118 * @connector_type: Connector type (GUD_CONNECTOR_TYPE_*).
119 * If the host doesn't support the type it should fall back to PANEL.
121 * - POLL_STATUS: Connector status can change (polled every 10 seconds)
122 * - INTERLACE: Interlaced modes are supported
123 * - DOUBLESCAN: Doublescan modes are supported
125 struct gud_connector_descriptor_req {
127 #define GUD_CONNECTOR_TYPE_PANEL 0
128 #define GUD_CONNECTOR_TYPE_VGA 1
129 #define GUD_CONNECTOR_TYPE_COMPOSITE 2
130 #define GUD_CONNECTOR_TYPE_SVIDEO 3
131 #define GUD_CONNECTOR_TYPE_COMPONENT 4
132 #define GUD_CONNECTOR_TYPE_DVI 5
133 #define GUD_CONNECTOR_TYPE_DISPLAYPORT 6
134 #define GUD_CONNECTOR_TYPE_HDMI 7
136 #define GUD_CONNECTOR_FLAGS_POLL_STATUS BIT(0)
137 #define GUD_CONNECTOR_FLAGS_INTERLACE BIT(1)
138 #define GUD_CONNECTOR_FLAGS_DOUBLESCAN BIT(2)
142 * struct gud_set_buffer_req - Set buffer transfer info
143 * @x: X position of rectangle
145 * @width: Pixel width of rectangle
146 * @height: Pixel height
147 * @length: Buffer length in bytes
148 * @compression: Transfer compression
149 * @compressed_length: Compressed buffer length
151 * This request is issued right before the bulk transfer.
152 * @x, @y, @width and @height specifies the rectangle where the buffer should be
153 * placed inside the framebuffer.
155 struct gud_set_buffer_req {
162 __le32 compressed_length;
166 * struct gud_state_req - Display state
167 * @mode: Display mode
168 * @format: Pixel format GUD_PIXEL_FORMAT_*
169 * @connector: Connector index
170 * @properties: Array of properties
172 * The entire state is transferred each time there's a change.
174 struct gud_state_req {
175 struct gud_display_mode_req mode;
178 struct gud_property_req properties[];
181 /* List of supported connector properties: */
183 /* Margins in pixels to deal with overscan, range 0-100 */
184 #define GUD_PROPERTY_TV_LEFT_MARGIN 1
185 #define GUD_PROPERTY_TV_RIGHT_MARGIN 2
186 #define GUD_PROPERTY_TV_TOP_MARGIN 3
187 #define GUD_PROPERTY_TV_BOTTOM_MARGIN 4
188 #define GUD_PROPERTY_TV_MODE 5
189 /* Brightness in percent, range 0-100 */
190 #define GUD_PROPERTY_TV_BRIGHTNESS 6
191 /* Contrast in percent, range 0-100 */
192 #define GUD_PROPERTY_TV_CONTRAST 7
193 /* Flicker reduction in percent, range 0-100 */
194 #define GUD_PROPERTY_TV_FLICKER_REDUCTION 8
195 /* Overscan in percent, range 0-100 */
196 #define GUD_PROPERTY_TV_OVERSCAN 9
197 /* Saturation in percent, range 0-100 */
198 #define GUD_PROPERTY_TV_SATURATION 10
199 /* Hue in percent, range 0-100 */
200 #define GUD_PROPERTY_TV_HUE 11
203 * Backlight brightness is in the range 0-100 inclusive. The value represents the human perceptual
204 * brightness and not a linear PWM value. 0 is minimum brightness which should not turn the
205 * backlight completely off. The DPMS connector property should be used to control power which will
206 * trigger a GUD_REQ_SET_DISPLAY_ENABLE request.
208 * This does not map to a DRM property, it is used with the backlight device.
210 #define GUD_PROPERTY_BACKLIGHT_BRIGHTNESS 12
212 /* List of supported properties that are not connector propeties: */
215 * Plane rotation. Should return the supported bitmask on
216 * GUD_REQ_GET_PROPERTIES. GUD_ROTATION_0 is mandatory.
218 * Note: This is not display rotation so 90/270 will need scaling to make it fit (unless squared).
220 #define GUD_PROPERTY_ROTATION 50
221 #define GUD_ROTATION_0 BIT(0)
222 #define GUD_ROTATION_90 BIT(1)
223 #define GUD_ROTATION_180 BIT(2)
224 #define GUD_ROTATION_270 BIT(3)
225 #define GUD_ROTATION_REFLECT_X BIT(4)
226 #define GUD_ROTATION_REFLECT_Y BIT(5)
227 #define GUD_ROTATION_MASK (GUD_ROTATION_0 | GUD_ROTATION_90 | \
228 GUD_ROTATION_180 | GUD_ROTATION_270 | \
229 GUD_ROTATION_REFLECT_X | GUD_ROTATION_REFLECT_Y)
231 /* USB Control requests: */
233 /* Get status from the last GET/SET control request. Value is u8. */
234 #define GUD_REQ_GET_STATUS 0x00
236 #define GUD_STATUS_OK 0x00
237 #define GUD_STATUS_BUSY 0x01
238 #define GUD_STATUS_REQUEST_NOT_SUPPORTED 0x02
239 #define GUD_STATUS_PROTOCOL_ERROR 0x03
240 #define GUD_STATUS_INVALID_PARAMETER 0x04
241 #define GUD_STATUS_ERROR 0x05
243 /* Get display descriptor as a &gud_display_descriptor_req */
244 #define GUD_REQ_GET_DESCRIPTOR 0x01
246 /* Get supported pixel formats as a byte array of GUD_PIXEL_FORMAT_* */
247 #define GUD_REQ_GET_FORMATS 0x40
248 #define GUD_FORMATS_MAX_NUM 32
249 /* R1 is a 1-bit monochrome transfer format presented to userspace as XRGB8888 */
250 #define GUD_PIXEL_FORMAT_R1 0x01
251 #define GUD_PIXEL_FORMAT_XRGB1111 0x20
252 #define GUD_PIXEL_FORMAT_RGB565 0x40
253 #define GUD_PIXEL_FORMAT_XRGB8888 0x80
254 #define GUD_PIXEL_FORMAT_ARGB8888 0x81
257 * Get supported properties that are not connector propeties as a &gud_property_req array.
258 * gud_property_req.val often contains the initial value for the property.
260 #define GUD_REQ_GET_PROPERTIES 0x41
261 #define GUD_PROPERTIES_MAX_NUM 32
263 /* Connector requests have the connector index passed in the wValue field */
265 /* Get connector descriptors as an array of &gud_connector_descriptor_req */
266 #define GUD_REQ_GET_CONNECTORS 0x50
267 #define GUD_CONNECTORS_MAX_NUM 32
270 * Get properties supported by the connector as a &gud_property_req array.
271 * gud_property_req.val often contains the initial value for the property.
273 #define GUD_REQ_GET_CONNECTOR_PROPERTIES 0x51
274 #define GUD_CONNECTOR_PROPERTIES_MAX_NUM 32
277 * Issued when there's a TV_MODE property present.
278 * Gets an array of the supported TV_MODE names each entry of length
279 * GUD_CONNECTOR_TV_MODE_NAME_LEN. Names must be NUL-terminated.
281 #define GUD_REQ_GET_CONNECTOR_TV_MODE_VALUES 0x52
282 #define GUD_CONNECTOR_TV_MODE_NAME_LEN 16
283 #define GUD_CONNECTOR_TV_MODE_MAX_NUM 16
285 /* When userspace checks connector status, this is issued first, not used for poll requests. */
286 #define GUD_REQ_SET_CONNECTOR_FORCE_DETECT 0x53
289 * Get connector status. Value is u8.
291 * Userspace will get a HOTPLUG uevent if one of the following is true:
292 * - Connection status has changed since last
295 #define GUD_REQ_GET_CONNECTOR_STATUS 0x54
296 #define GUD_CONNECTOR_STATUS_DISCONNECTED 0x00
297 #define GUD_CONNECTOR_STATUS_CONNECTED 0x01
298 #define GUD_CONNECTOR_STATUS_UNKNOWN 0x02
299 #define GUD_CONNECTOR_STATUS_CONNECTED_MASK 0x03
300 #define GUD_CONNECTOR_STATUS_CHANGED BIT(7)
303 * Display modes can be fetched as either EDID data or an array of &gud_display_mode_req.
305 * If GUD_REQ_GET_CONNECTOR_MODES returns zero, EDID is used to create display modes.
306 * If both display modes and EDID are returned, EDID is just passed on to userspace
307 * in the EDID connector property.
310 /* Get &gud_display_mode_req array of supported display modes */
311 #define GUD_REQ_GET_CONNECTOR_MODES 0x55
312 #define GUD_CONNECTOR_MAX_NUM_MODES 128
314 /* Get Extended Display Identification Data */
315 #define GUD_REQ_GET_CONNECTOR_EDID 0x56
316 #define GUD_CONNECTOR_MAX_EDID_LEN 2048
318 /* Set buffer properties before bulk transfer as &gud_set_buffer_req */
319 #define GUD_REQ_SET_BUFFER 0x60
321 /* Check display configuration as &gud_state_req */
322 #define GUD_REQ_SET_STATE_CHECK 0x61
324 /* Apply the previous STATE_CHECK configuration */
325 #define GUD_REQ_SET_STATE_COMMIT 0x62
327 /* Enable/disable the display controller, value is u8: 0/1 */
328 #define GUD_REQ_SET_CONTROLLER_ENABLE 0x63
330 /* Enable/disable display/output (DPMS), value is u8: 0/1 */
331 #define GUD_REQ_SET_DISPLAY_ENABLE 0x64