/* SPDX-License-Identifier: MIT */ /* * Copyright 2020 Noralf Trønnes */ #ifndef __LINUX_GUD_H #define __LINUX_GUD_H #include <linux/types.h> /* * struct gud_display_descriptor_req - Display descriptor * @magic: Magic value GUD_DISPLAY_MAGIC * @version: Protocol version * @flags: Flags * - STATUS_ON_SET: Always do a status request after a SET request. * This is used by the Linux gadget driver since it has * no way to control the status stage of a control OUT * request that has a payload. * - FULL_UPDATE: Always send the entire framebuffer when flushing changes. * The GUD_REQ_SET_BUFFER request will not be sent * before each bulk transfer, it will only be sent if the * previous bulk transfer had failed. This gives the device * a chance to reset its state machine if needed. * This flag can not be used in combination with compression. * @compression: Supported compression types * - GUD_COMPRESSION_LZ4: LZ4 lossless compression. * @max_buffer_size: Maximum buffer size the device can handle (optional). * This is useful for devices that don't have a big enough * buffer to decompress the entire framebuffer in one go. * @min_width: Minimum pixel width the controller can handle * @max_width: Maximum width * @min_height: Minimum height * @max_height: Maximum height * * Devices that have only one display mode will have min_width == max_width * and min_height == max_height. */ struct gud_display_descriptor_req { … } __packed; /* * struct gud_property_req - Property * @prop: Property * @val: Value */ struct gud_property_req { … } __packed; /* * struct gud_display_mode_req - Display mode * @clock: Pixel clock in kHz * @hdisplay: Horizontal display size * @hsync_start: Horizontal sync start * @hsync_end: Horizontal sync end * @htotal: Horizontal total size * @vdisplay: Vertical display size * @vsync_start: Vertical sync start * @vsync_end: Vertical sync end * @vtotal: Vertical total size * @flags: Bits 0-13 are the same as in the RandR protocol and also what DRM uses. * The deprecated bits are reused for internal protocol flags leaving us * free to follow DRM for the other bits in the future. * - FLAG_PREFERRED: Set on the preferred display mode. */ struct gud_display_mode_req { … } __packed; /* * struct gud_connector_descriptor_req - Connector descriptor * @connector_type: Connector type (GUD_CONNECTOR_TYPE_*). * If the host doesn't support the type it should fall back to PANEL. * @flags: Flags * - POLL_STATUS: Connector status can change (polled every 10 seconds) * - INTERLACE: Interlaced modes are supported * - DOUBLESCAN: Doublescan modes are supported */ struct gud_connector_descriptor_req { … } __packed; /* * struct gud_set_buffer_req - Set buffer transfer info * @x: X position of rectangle * @y: Y position * @width: Pixel width of rectangle * @height: Pixel height * @length: Buffer length in bytes * @compression: Transfer compression * @compressed_length: Compressed buffer length * * This request is issued right before the bulk transfer. * @x, @y, @width and @height specifies the rectangle where the buffer should be * placed inside the framebuffer. */ struct gud_set_buffer_req { … } __packed; /* * struct gud_state_req - Display state * @mode: Display mode * @format: Pixel format GUD_PIXEL_FORMAT_* * @connector: Connector index * @properties: Array of properties * * The entire state is transferred each time there's a change. */ struct gud_state_req { … } __packed; /* List of supported connector properties: */ /* Margins in pixels to deal with overscan, range 0-100 */ #define GUD_PROPERTY_TV_LEFT_MARGIN … #define GUD_PROPERTY_TV_RIGHT_MARGIN … #define GUD_PROPERTY_TV_TOP_MARGIN … #define GUD_PROPERTY_TV_BOTTOM_MARGIN … #define GUD_PROPERTY_TV_MODE … /* Brightness in percent, range 0-100 */ #define GUD_PROPERTY_TV_BRIGHTNESS … /* Contrast in percent, range 0-100 */ #define GUD_PROPERTY_TV_CONTRAST … /* Flicker reduction in percent, range 0-100 */ #define GUD_PROPERTY_TV_FLICKER_REDUCTION … /* Overscan in percent, range 0-100 */ #define GUD_PROPERTY_TV_OVERSCAN … /* Saturation in percent, range 0-100 */ #define GUD_PROPERTY_TV_SATURATION … /* Hue in percent, range 0-100 */ #define GUD_PROPERTY_TV_HUE … /* * Backlight brightness is in the range 0-100 inclusive. The value represents the human perceptual * brightness and not a linear PWM value. 0 is minimum brightness which should not turn the * backlight completely off. The DPMS connector property should be used to control power which will * trigger a GUD_REQ_SET_DISPLAY_ENABLE request. * * This does not map to a DRM property, it is used with the backlight device. */ #define GUD_PROPERTY_BACKLIGHT_BRIGHTNESS … /* List of supported properties that are not connector propeties: */ /* * Plane rotation. Should return the supported bitmask on * GUD_REQ_GET_PROPERTIES. GUD_ROTATION_0 is mandatory. * * Note: This is not display rotation so 90/270 will need scaling to make it fit (unless squared). */ #define GUD_PROPERTY_ROTATION … #define GUD_ROTATION_0 … #define GUD_ROTATION_90 … #define GUD_ROTATION_180 … #define GUD_ROTATION_270 … #define GUD_ROTATION_REFLECT_X … #define GUD_ROTATION_REFLECT_Y … #define GUD_ROTATION_MASK … /* USB Control requests: */ /* Get status from the last GET/SET control request. Value is u8. */ #define GUD_REQ_GET_STATUS … /* Status values: */ #define GUD_STATUS_OK … #define GUD_STATUS_BUSY … #define GUD_STATUS_REQUEST_NOT_SUPPORTED … #define GUD_STATUS_PROTOCOL_ERROR … #define GUD_STATUS_INVALID_PARAMETER … #define GUD_STATUS_ERROR … /* Get display descriptor as a &gud_display_descriptor_req */ #define GUD_REQ_GET_DESCRIPTOR … /* Get supported pixel formats as a byte array of GUD_PIXEL_FORMAT_* */ #define GUD_REQ_GET_FORMATS … #define GUD_FORMATS_MAX_NUM … #define GUD_PIXEL_FORMAT_R1 … #define GUD_PIXEL_FORMAT_R8 … #define GUD_PIXEL_FORMAT_XRGB1111 … #define GUD_PIXEL_FORMAT_RGB332 … #define GUD_PIXEL_FORMAT_RGB565 … #define GUD_PIXEL_FORMAT_RGB888 … #define GUD_PIXEL_FORMAT_XRGB8888 … #define GUD_PIXEL_FORMAT_ARGB8888 … /* * Get supported properties that are not connector propeties as a &gud_property_req array. * gud_property_req.val often contains the initial value for the property. */ #define GUD_REQ_GET_PROPERTIES … #define GUD_PROPERTIES_MAX_NUM … /* Connector requests have the connector index passed in the wValue field */ /* Get connector descriptors as an array of &gud_connector_descriptor_req */ #define GUD_REQ_GET_CONNECTORS … #define GUD_CONNECTORS_MAX_NUM … /* * Get properties supported by the connector as a &gud_property_req array. * gud_property_req.val often contains the initial value for the property. */ #define GUD_REQ_GET_CONNECTOR_PROPERTIES … #define GUD_CONNECTOR_PROPERTIES_MAX_NUM … /* * Issued when there's a TV_MODE property present. * Gets an array of the supported TV_MODE names each entry of length * GUD_CONNECTOR_TV_MODE_NAME_LEN. Names must be NUL-terminated. */ #define GUD_REQ_GET_CONNECTOR_TV_MODE_VALUES … #define GUD_CONNECTOR_TV_MODE_NAME_LEN … #define GUD_CONNECTOR_TV_MODE_MAX_NUM … /* When userspace checks connector status, this is issued first, not used for poll requests. */ #define GUD_REQ_SET_CONNECTOR_FORCE_DETECT … /* * Get connector status. Value is u8. * * Userspace will get a HOTPLUG uevent if one of the following is true: * - Connection status has changed since last * - CHANGED is set */ #define GUD_REQ_GET_CONNECTOR_STATUS … #define GUD_CONNECTOR_STATUS_DISCONNECTED … #define GUD_CONNECTOR_STATUS_CONNECTED … #define GUD_CONNECTOR_STATUS_UNKNOWN … #define GUD_CONNECTOR_STATUS_CONNECTED_MASK … #define GUD_CONNECTOR_STATUS_CHANGED … /* * Display modes can be fetched as either EDID data or an array of &gud_display_mode_req. * * If GUD_REQ_GET_CONNECTOR_MODES returns zero, EDID is used to create display modes. * If both display modes and EDID are returned, EDID is just passed on to userspace * in the EDID connector property. */ /* Get &gud_display_mode_req array of supported display modes */ #define GUD_REQ_GET_CONNECTOR_MODES … #define GUD_CONNECTOR_MAX_NUM_MODES … /* Get Extended Display Identification Data */ #define GUD_REQ_GET_CONNECTOR_EDID … #define GUD_CONNECTOR_MAX_EDID_LEN … /* Set buffer properties before bulk transfer as &gud_set_buffer_req */ #define GUD_REQ_SET_BUFFER … /* Check display configuration as &gud_state_req */ #define GUD_REQ_SET_STATE_CHECK … /* Apply the previous STATE_CHECK configuration */ #define GUD_REQ_SET_STATE_COMMIT … /* Enable/disable the display controller, value is u8: 0/1 */ #define GUD_REQ_SET_CONTROLLER_ENABLE … /* Enable/disable display/output (DPMS), value is u8: 0/1 */ #define GUD_REQ_SET_DISPLAY_ENABLE … #endif