18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * Copyright (c) 2016 Intel Corporation 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Permission to use, copy, modify, distribute, and sell this software and its 58c2ecf20Sopenharmony_ci * documentation for any purpose is hereby granted without fee, provided that 68c2ecf20Sopenharmony_ci * the above copyright notice appear in all copies and that both that copyright 78c2ecf20Sopenharmony_ci * notice and this permission notice appear in supporting documentation, and 88c2ecf20Sopenharmony_ci * that the name of the copyright holders not be used in advertising or 98c2ecf20Sopenharmony_ci * publicity pertaining to distribution of the software without specific, 108c2ecf20Sopenharmony_ci * written prior permission. The copyright holders make no representations 118c2ecf20Sopenharmony_ci * about the suitability of this software for any purpose. It is provided "as 128c2ecf20Sopenharmony_ci * is" without express or implied warranty. 138c2ecf20Sopenharmony_ci * 148c2ecf20Sopenharmony_ci * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 158c2ecf20Sopenharmony_ci * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 168c2ecf20Sopenharmony_ci * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 178c2ecf20Sopenharmony_ci * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 188c2ecf20Sopenharmony_ci * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 198c2ecf20Sopenharmony_ci * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 208c2ecf20Sopenharmony_ci * OF THIS SOFTWARE. 218c2ecf20Sopenharmony_ci */ 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci#ifndef __DRM_CONNECTOR_H__ 248c2ecf20Sopenharmony_ci#define __DRM_CONNECTOR_H__ 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci#include <linux/list.h> 278c2ecf20Sopenharmony_ci#include <linux/llist.h> 288c2ecf20Sopenharmony_ci#include <linux/ctype.h> 298c2ecf20Sopenharmony_ci#include <linux/hdmi.h> 308c2ecf20Sopenharmony_ci#include <drm/drm_mode_object.h> 318c2ecf20Sopenharmony_ci#include <drm/drm_util.h> 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci#include <uapi/drm/drm_mode.h> 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_cistruct drm_connector_helper_funcs; 368c2ecf20Sopenharmony_cistruct drm_modeset_acquire_ctx; 378c2ecf20Sopenharmony_cistruct drm_device; 388c2ecf20Sopenharmony_cistruct drm_crtc; 398c2ecf20Sopenharmony_cistruct drm_encoder; 408c2ecf20Sopenharmony_cistruct drm_property; 418c2ecf20Sopenharmony_cistruct drm_property_blob; 428c2ecf20Sopenharmony_cistruct drm_printer; 438c2ecf20Sopenharmony_cistruct edid; 448c2ecf20Sopenharmony_cistruct i2c_adapter; 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_cienum drm_connector_force { 478c2ecf20Sopenharmony_ci DRM_FORCE_UNSPECIFIED, 488c2ecf20Sopenharmony_ci DRM_FORCE_OFF, 498c2ecf20Sopenharmony_ci DRM_FORCE_ON, /* force on analog part normally */ 508c2ecf20Sopenharmony_ci DRM_FORCE_ON_DIGITAL, /* for DVI-I use digital connector */ 518c2ecf20Sopenharmony_ci}; 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci/** 548c2ecf20Sopenharmony_ci * enum drm_connector_status - status for a &drm_connector 558c2ecf20Sopenharmony_ci * 568c2ecf20Sopenharmony_ci * This enum is used to track the connector status. There are no separate 578c2ecf20Sopenharmony_ci * #defines for the uapi! 588c2ecf20Sopenharmony_ci */ 598c2ecf20Sopenharmony_cienum drm_connector_status { 608c2ecf20Sopenharmony_ci /** 618c2ecf20Sopenharmony_ci * @connector_status_connected: The connector is definitely connected to 628c2ecf20Sopenharmony_ci * a sink device, and can be enabled. 638c2ecf20Sopenharmony_ci */ 648c2ecf20Sopenharmony_ci connector_status_connected = 1, 658c2ecf20Sopenharmony_ci /** 668c2ecf20Sopenharmony_ci * @connector_status_disconnected: The connector isn't connected to a 678c2ecf20Sopenharmony_ci * sink device which can be autodetect. For digital outputs like DP or 688c2ecf20Sopenharmony_ci * HDMI (which can be realiable probed) this means there's really 698c2ecf20Sopenharmony_ci * nothing there. It is driver-dependent whether a connector with this 708c2ecf20Sopenharmony_ci * status can be lit up or not. 718c2ecf20Sopenharmony_ci */ 728c2ecf20Sopenharmony_ci connector_status_disconnected = 2, 738c2ecf20Sopenharmony_ci /** 748c2ecf20Sopenharmony_ci * @connector_status_unknown: The connector's status could not be 758c2ecf20Sopenharmony_ci * reliably detected. This happens when probing would either cause 768c2ecf20Sopenharmony_ci * flicker (like load-detection when the connector is in use), or when a 778c2ecf20Sopenharmony_ci * hardware resource isn't available (like when load-detection needs a 788c2ecf20Sopenharmony_ci * free CRTC). It should be possible to light up the connector with one 798c2ecf20Sopenharmony_ci * of the listed fallback modes. For default configuration userspace 808c2ecf20Sopenharmony_ci * should only try to light up connectors with unknown status when 818c2ecf20Sopenharmony_ci * there's not connector with @connector_status_connected. 828c2ecf20Sopenharmony_ci */ 838c2ecf20Sopenharmony_ci connector_status_unknown = 3, 848c2ecf20Sopenharmony_ci}; 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci/** 878c2ecf20Sopenharmony_ci * enum drm_connector_registration_status - userspace registration status for 888c2ecf20Sopenharmony_ci * a &drm_connector 898c2ecf20Sopenharmony_ci * 908c2ecf20Sopenharmony_ci * This enum is used to track the status of initializing a connector and 918c2ecf20Sopenharmony_ci * registering it with userspace, so that DRM can prevent bogus modesets on 928c2ecf20Sopenharmony_ci * connectors that no longer exist. 938c2ecf20Sopenharmony_ci */ 948c2ecf20Sopenharmony_cienum drm_connector_registration_state { 958c2ecf20Sopenharmony_ci /** 968c2ecf20Sopenharmony_ci * @DRM_CONNECTOR_INITIALIZING: The connector has just been created, 978c2ecf20Sopenharmony_ci * but has yet to be exposed to userspace. There should be no 988c2ecf20Sopenharmony_ci * additional restrictions to how the state of this connector may be 998c2ecf20Sopenharmony_ci * modified. 1008c2ecf20Sopenharmony_ci */ 1018c2ecf20Sopenharmony_ci DRM_CONNECTOR_INITIALIZING = 0, 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci /** 1048c2ecf20Sopenharmony_ci * @DRM_CONNECTOR_REGISTERED: The connector has been fully initialized 1058c2ecf20Sopenharmony_ci * and registered with sysfs, as such it has been exposed to 1068c2ecf20Sopenharmony_ci * userspace. There should be no additional restrictions to how the 1078c2ecf20Sopenharmony_ci * state of this connector may be modified. 1088c2ecf20Sopenharmony_ci */ 1098c2ecf20Sopenharmony_ci DRM_CONNECTOR_REGISTERED = 1, 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_ci /** 1128c2ecf20Sopenharmony_ci * @DRM_CONNECTOR_UNREGISTERED: The connector has either been exposed 1138c2ecf20Sopenharmony_ci * to userspace and has since been unregistered and removed from 1148c2ecf20Sopenharmony_ci * userspace, or the connector was unregistered before it had a chance 1158c2ecf20Sopenharmony_ci * to be exposed to userspace (e.g. still in the 1168c2ecf20Sopenharmony_ci * @DRM_CONNECTOR_INITIALIZING state). When a connector is 1178c2ecf20Sopenharmony_ci * unregistered, there are additional restrictions to how its state 1188c2ecf20Sopenharmony_ci * may be modified: 1198c2ecf20Sopenharmony_ci * 1208c2ecf20Sopenharmony_ci * - An unregistered connector may only have its DPMS changed from 1218c2ecf20Sopenharmony_ci * On->Off. Once DPMS is changed to Off, it may not be switched back 1228c2ecf20Sopenharmony_ci * to On. 1238c2ecf20Sopenharmony_ci * - Modesets are not allowed on unregistered connectors, unless they 1248c2ecf20Sopenharmony_ci * would result in disabling its assigned CRTCs. This means 1258c2ecf20Sopenharmony_ci * disabling a CRTC on an unregistered connector is OK, but enabling 1268c2ecf20Sopenharmony_ci * one is not. 1278c2ecf20Sopenharmony_ci * - Removing a CRTC from an unregistered connector is OK, but new 1288c2ecf20Sopenharmony_ci * CRTCs may never be assigned to an unregistered connector. 1298c2ecf20Sopenharmony_ci */ 1308c2ecf20Sopenharmony_ci DRM_CONNECTOR_UNREGISTERED = 2, 1318c2ecf20Sopenharmony_ci}; 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_cienum subpixel_order { 1348c2ecf20Sopenharmony_ci SubPixelUnknown = 0, 1358c2ecf20Sopenharmony_ci SubPixelHorizontalRGB, 1368c2ecf20Sopenharmony_ci SubPixelHorizontalBGR, 1378c2ecf20Sopenharmony_ci SubPixelVerticalRGB, 1388c2ecf20Sopenharmony_ci SubPixelVerticalBGR, 1398c2ecf20Sopenharmony_ci SubPixelNone, 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ci}; 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_ci/** 1448c2ecf20Sopenharmony_ci * struct drm_scrambling: sink's scrambling support. 1458c2ecf20Sopenharmony_ci */ 1468c2ecf20Sopenharmony_cistruct drm_scrambling { 1478c2ecf20Sopenharmony_ci /** 1488c2ecf20Sopenharmony_ci * @supported: scrambling supported for rates > 340 Mhz. 1498c2ecf20Sopenharmony_ci */ 1508c2ecf20Sopenharmony_ci bool supported; 1518c2ecf20Sopenharmony_ci /** 1528c2ecf20Sopenharmony_ci * @low_rates: scrambling supported for rates <= 340 Mhz. 1538c2ecf20Sopenharmony_ci */ 1548c2ecf20Sopenharmony_ci bool low_rates; 1558c2ecf20Sopenharmony_ci}; 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_ci/* 1588c2ecf20Sopenharmony_ci * struct drm_scdc - Information about scdc capabilities of a HDMI 2.0 sink 1598c2ecf20Sopenharmony_ci * 1608c2ecf20Sopenharmony_ci * Provides SCDC register support and capabilities related information on a 1618c2ecf20Sopenharmony_ci * HDMI 2.0 sink. In case of a HDMI 1.4 sink, all parameter must be 0. 1628c2ecf20Sopenharmony_ci */ 1638c2ecf20Sopenharmony_cistruct drm_scdc { 1648c2ecf20Sopenharmony_ci /** 1658c2ecf20Sopenharmony_ci * @supported: status control & data channel present. 1668c2ecf20Sopenharmony_ci */ 1678c2ecf20Sopenharmony_ci bool supported; 1688c2ecf20Sopenharmony_ci /** 1698c2ecf20Sopenharmony_ci * @read_request: sink is capable of generating scdc read request. 1708c2ecf20Sopenharmony_ci */ 1718c2ecf20Sopenharmony_ci bool read_request; 1728c2ecf20Sopenharmony_ci /** 1738c2ecf20Sopenharmony_ci * @scrambling: sink's scrambling capabilities 1748c2ecf20Sopenharmony_ci */ 1758c2ecf20Sopenharmony_ci struct drm_scrambling scrambling; 1768c2ecf20Sopenharmony_ci}; 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_ci 1798c2ecf20Sopenharmony_ci/** 1808c2ecf20Sopenharmony_ci * struct drm_hdmi_info - runtime information about the connected HDMI sink 1818c2ecf20Sopenharmony_ci * 1828c2ecf20Sopenharmony_ci * Describes if a given display supports advanced HDMI 2.0 features. 1838c2ecf20Sopenharmony_ci * This information is available in CEA-861-F extension blocks (like HF-VSDB). 1848c2ecf20Sopenharmony_ci */ 1858c2ecf20Sopenharmony_cistruct drm_hdmi_info { 1868c2ecf20Sopenharmony_ci /** @scdc: sink's scdc support and capabilities */ 1878c2ecf20Sopenharmony_ci struct drm_scdc scdc; 1888c2ecf20Sopenharmony_ci 1898c2ecf20Sopenharmony_ci /** 1908c2ecf20Sopenharmony_ci * @y420_vdb_modes: bitmap of modes which can support ycbcr420 1918c2ecf20Sopenharmony_ci * output only (not normal RGB/YCBCR444/422 outputs). The max VIC 1928c2ecf20Sopenharmony_ci * defined by the CEA-861-G spec is 219, so the size is 256 bits to map 1938c2ecf20Sopenharmony_ci * up to 256 VICs. 1948c2ecf20Sopenharmony_ci */ 1958c2ecf20Sopenharmony_ci unsigned long y420_vdb_modes[BITS_TO_LONGS(256)]; 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_ci /** 1988c2ecf20Sopenharmony_ci * @y420_cmdb_modes: bitmap of modes which can support ycbcr420 1998c2ecf20Sopenharmony_ci * output also, along with normal HDMI outputs. The max VIC defined by 2008c2ecf20Sopenharmony_ci * the CEA-861-G spec is 219, so the size is 256 bits to map up to 256 2018c2ecf20Sopenharmony_ci * VICs. 2028c2ecf20Sopenharmony_ci */ 2038c2ecf20Sopenharmony_ci unsigned long y420_cmdb_modes[BITS_TO_LONGS(256)]; 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_ci /** @y420_cmdb_map: bitmap of SVD index, to extraxt vcb modes */ 2068c2ecf20Sopenharmony_ci u64 y420_cmdb_map; 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_ci /** @y420_dc_modes: bitmap of deep color support index */ 2098c2ecf20Sopenharmony_ci u8 y420_dc_modes; 2108c2ecf20Sopenharmony_ci}; 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_ci/** 2138c2ecf20Sopenharmony_ci * enum drm_link_status - connector's link_status property value 2148c2ecf20Sopenharmony_ci * 2158c2ecf20Sopenharmony_ci * This enum is used as the connector's link status property value. 2168c2ecf20Sopenharmony_ci * It is set to the values defined in uapi. 2178c2ecf20Sopenharmony_ci * 2188c2ecf20Sopenharmony_ci * @DRM_LINK_STATUS_GOOD: DP Link is Good as a result of successful 2198c2ecf20Sopenharmony_ci * link training 2208c2ecf20Sopenharmony_ci * @DRM_LINK_STATUS_BAD: DP Link is BAD as a result of link training 2218c2ecf20Sopenharmony_ci * failure 2228c2ecf20Sopenharmony_ci */ 2238c2ecf20Sopenharmony_cienum drm_link_status { 2248c2ecf20Sopenharmony_ci DRM_LINK_STATUS_GOOD = DRM_MODE_LINK_STATUS_GOOD, 2258c2ecf20Sopenharmony_ci DRM_LINK_STATUS_BAD = DRM_MODE_LINK_STATUS_BAD, 2268c2ecf20Sopenharmony_ci}; 2278c2ecf20Sopenharmony_ci 2288c2ecf20Sopenharmony_ci/** 2298c2ecf20Sopenharmony_ci * enum drm_panel_orientation - panel_orientation info for &drm_display_info 2308c2ecf20Sopenharmony_ci * 2318c2ecf20Sopenharmony_ci * This enum is used to track the (LCD) panel orientation. There are no 2328c2ecf20Sopenharmony_ci * separate #defines for the uapi! 2338c2ecf20Sopenharmony_ci * 2348c2ecf20Sopenharmony_ci * @DRM_MODE_PANEL_ORIENTATION_UNKNOWN: The drm driver has not provided any 2358c2ecf20Sopenharmony_ci * panel orientation information (normal 2368c2ecf20Sopenharmony_ci * for non panels) in this case the "panel 2378c2ecf20Sopenharmony_ci * orientation" connector prop will not be 2388c2ecf20Sopenharmony_ci * attached. 2398c2ecf20Sopenharmony_ci * @DRM_MODE_PANEL_ORIENTATION_NORMAL: The top side of the panel matches the 2408c2ecf20Sopenharmony_ci * top side of the device's casing. 2418c2ecf20Sopenharmony_ci * @DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP: The top side of the panel matches the 2428c2ecf20Sopenharmony_ci * bottom side of the device's casing, iow 2438c2ecf20Sopenharmony_ci * the panel is mounted upside-down. 2448c2ecf20Sopenharmony_ci * @DRM_MODE_PANEL_ORIENTATION_LEFT_UP: The left side of the panel matches the 2458c2ecf20Sopenharmony_ci * top side of the device's casing. 2468c2ecf20Sopenharmony_ci * @DRM_MODE_PANEL_ORIENTATION_RIGHT_UP: The right side of the panel matches the 2478c2ecf20Sopenharmony_ci * top side of the device's casing. 2488c2ecf20Sopenharmony_ci */ 2498c2ecf20Sopenharmony_cienum drm_panel_orientation { 2508c2ecf20Sopenharmony_ci DRM_MODE_PANEL_ORIENTATION_UNKNOWN = -1, 2518c2ecf20Sopenharmony_ci DRM_MODE_PANEL_ORIENTATION_NORMAL = 0, 2528c2ecf20Sopenharmony_ci DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP, 2538c2ecf20Sopenharmony_ci DRM_MODE_PANEL_ORIENTATION_LEFT_UP, 2548c2ecf20Sopenharmony_ci DRM_MODE_PANEL_ORIENTATION_RIGHT_UP, 2558c2ecf20Sopenharmony_ci}; 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_ci/** 2588c2ecf20Sopenharmony_ci * struct drm_monitor_range_info - Panel's Monitor range in EDID for 2598c2ecf20Sopenharmony_ci * &drm_display_info 2608c2ecf20Sopenharmony_ci * 2618c2ecf20Sopenharmony_ci * This struct is used to store a frequency range supported by panel 2628c2ecf20Sopenharmony_ci * as parsed from EDID's detailed monitor range descriptor block. 2638c2ecf20Sopenharmony_ci * 2648c2ecf20Sopenharmony_ci * @min_vfreq: This is the min supported refresh rate in Hz from 2658c2ecf20Sopenharmony_ci * EDID's detailed monitor range. 2668c2ecf20Sopenharmony_ci * @max_vfreq: This is the max supported refresh rate in Hz from 2678c2ecf20Sopenharmony_ci * EDID's detailed monitor range 2688c2ecf20Sopenharmony_ci */ 2698c2ecf20Sopenharmony_cistruct drm_monitor_range_info { 2708c2ecf20Sopenharmony_ci u8 min_vfreq; 2718c2ecf20Sopenharmony_ci u8 max_vfreq; 2728c2ecf20Sopenharmony_ci}; 2738c2ecf20Sopenharmony_ci 2748c2ecf20Sopenharmony_ci/* 2758c2ecf20Sopenharmony_ci * This is a consolidated colorimetry list supported by HDMI and 2768c2ecf20Sopenharmony_ci * DP protocol standard. The respective connectors will register 2778c2ecf20Sopenharmony_ci * a property with the subset of this list (supported by that 2788c2ecf20Sopenharmony_ci * respective protocol). Userspace will set the colorspace through 2798c2ecf20Sopenharmony_ci * a colorspace property which will be created and exposed to 2808c2ecf20Sopenharmony_ci * userspace. 2818c2ecf20Sopenharmony_ci */ 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_ci/* For Default case, driver will set the colorspace */ 2848c2ecf20Sopenharmony_ci#define DRM_MODE_COLORIMETRY_DEFAULT 0 2858c2ecf20Sopenharmony_ci/* CEA 861 Normal Colorimetry options */ 2868c2ecf20Sopenharmony_ci#define DRM_MODE_COLORIMETRY_NO_DATA 0 2878c2ecf20Sopenharmony_ci#define DRM_MODE_COLORIMETRY_SMPTE_170M_YCC 1 2888c2ecf20Sopenharmony_ci#define DRM_MODE_COLORIMETRY_BT709_YCC 2 2898c2ecf20Sopenharmony_ci/* CEA 861 Extended Colorimetry Options */ 2908c2ecf20Sopenharmony_ci#define DRM_MODE_COLORIMETRY_XVYCC_601 3 2918c2ecf20Sopenharmony_ci#define DRM_MODE_COLORIMETRY_XVYCC_709 4 2928c2ecf20Sopenharmony_ci#define DRM_MODE_COLORIMETRY_SYCC_601 5 2938c2ecf20Sopenharmony_ci#define DRM_MODE_COLORIMETRY_OPYCC_601 6 2948c2ecf20Sopenharmony_ci#define DRM_MODE_COLORIMETRY_OPRGB 7 2958c2ecf20Sopenharmony_ci#define DRM_MODE_COLORIMETRY_BT2020_CYCC 8 2968c2ecf20Sopenharmony_ci#define DRM_MODE_COLORIMETRY_BT2020_RGB 9 2978c2ecf20Sopenharmony_ci#define DRM_MODE_COLORIMETRY_BT2020_YCC 10 2988c2ecf20Sopenharmony_ci/* Additional Colorimetry extension added as part of CTA 861.G */ 2998c2ecf20Sopenharmony_ci#define DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65 11 3008c2ecf20Sopenharmony_ci#define DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER 12 3018c2ecf20Sopenharmony_ci/* Additional Colorimetry Options added for DP 1.4a VSC Colorimetry Format */ 3028c2ecf20Sopenharmony_ci#define DRM_MODE_COLORIMETRY_RGB_WIDE_FIXED 13 3038c2ecf20Sopenharmony_ci#define DRM_MODE_COLORIMETRY_RGB_WIDE_FLOAT 14 3048c2ecf20Sopenharmony_ci#define DRM_MODE_COLORIMETRY_BT601_YCC 15 3058c2ecf20Sopenharmony_ci 3068c2ecf20Sopenharmony_ci/** 3078c2ecf20Sopenharmony_ci * enum drm_bus_flags - bus_flags info for &drm_display_info 3088c2ecf20Sopenharmony_ci * 3098c2ecf20Sopenharmony_ci * This enum defines signal polarities and clock edge information for signals on 3108c2ecf20Sopenharmony_ci * a bus as bitmask flags. 3118c2ecf20Sopenharmony_ci * 3128c2ecf20Sopenharmony_ci * The clock edge information is conveyed by two sets of symbols, 3138c2ecf20Sopenharmony_ci * DRM_BUS_FLAGS_*_DRIVE_\* and DRM_BUS_FLAGS_*_SAMPLE_\*. When this enum is 3148c2ecf20Sopenharmony_ci * used to describe a bus from the point of view of the transmitter, the 3158c2ecf20Sopenharmony_ci * \*_DRIVE_\* flags should be used. When used from the point of view of the 3168c2ecf20Sopenharmony_ci * receiver, the \*_SAMPLE_\* flags should be used. The \*_DRIVE_\* and 3178c2ecf20Sopenharmony_ci * \*_SAMPLE_\* flags alias each other, with the \*_SAMPLE_POSEDGE and 3188c2ecf20Sopenharmony_ci * \*_SAMPLE_NEGEDGE flags being equal to \*_DRIVE_NEGEDGE and \*_DRIVE_POSEDGE 3198c2ecf20Sopenharmony_ci * respectively. This simplifies code as signals are usually sampled on the 3208c2ecf20Sopenharmony_ci * opposite edge of the driving edge. Transmitters and receivers may however 3218c2ecf20Sopenharmony_ci * need to take other signal timings into account to convert between driving 3228c2ecf20Sopenharmony_ci * and sample edges. 3238c2ecf20Sopenharmony_ci */ 3248c2ecf20Sopenharmony_cienum drm_bus_flags { 3258c2ecf20Sopenharmony_ci /** 3268c2ecf20Sopenharmony_ci * @DRM_BUS_FLAG_DE_LOW: 3278c2ecf20Sopenharmony_ci * 3288c2ecf20Sopenharmony_ci * The Data Enable signal is active low 3298c2ecf20Sopenharmony_ci */ 3308c2ecf20Sopenharmony_ci DRM_BUS_FLAG_DE_LOW = BIT(0), 3318c2ecf20Sopenharmony_ci 3328c2ecf20Sopenharmony_ci /** 3338c2ecf20Sopenharmony_ci * @DRM_BUS_FLAG_DE_HIGH: 3348c2ecf20Sopenharmony_ci * 3358c2ecf20Sopenharmony_ci * The Data Enable signal is active high 3368c2ecf20Sopenharmony_ci */ 3378c2ecf20Sopenharmony_ci DRM_BUS_FLAG_DE_HIGH = BIT(1), 3388c2ecf20Sopenharmony_ci 3398c2ecf20Sopenharmony_ci /** 3408c2ecf20Sopenharmony_ci * @DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE: 3418c2ecf20Sopenharmony_ci * 3428c2ecf20Sopenharmony_ci * Data is driven on the rising edge of the pixel clock 3438c2ecf20Sopenharmony_ci */ 3448c2ecf20Sopenharmony_ci DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE = BIT(2), 3458c2ecf20Sopenharmony_ci 3468c2ecf20Sopenharmony_ci /** 3478c2ecf20Sopenharmony_ci * @DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE: 3488c2ecf20Sopenharmony_ci * 3498c2ecf20Sopenharmony_ci * Data is driven on the falling edge of the pixel clock 3508c2ecf20Sopenharmony_ci */ 3518c2ecf20Sopenharmony_ci DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE = BIT(3), 3528c2ecf20Sopenharmony_ci 3538c2ecf20Sopenharmony_ci /** 3548c2ecf20Sopenharmony_ci * @DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE: 3558c2ecf20Sopenharmony_ci * 3568c2ecf20Sopenharmony_ci * Data is sampled on the rising edge of the pixel clock 3578c2ecf20Sopenharmony_ci */ 3588c2ecf20Sopenharmony_ci DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE = DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE, 3598c2ecf20Sopenharmony_ci 3608c2ecf20Sopenharmony_ci /** 3618c2ecf20Sopenharmony_ci * @DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE: 3628c2ecf20Sopenharmony_ci * 3638c2ecf20Sopenharmony_ci * Data is sampled on the falling edge of the pixel clock 3648c2ecf20Sopenharmony_ci */ 3658c2ecf20Sopenharmony_ci DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE = DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE, 3668c2ecf20Sopenharmony_ci 3678c2ecf20Sopenharmony_ci /** 3688c2ecf20Sopenharmony_ci * @DRM_BUS_FLAG_DATA_MSB_TO_LSB: 3698c2ecf20Sopenharmony_ci * 3708c2ecf20Sopenharmony_ci * Data is transmitted MSB to LSB on the bus 3718c2ecf20Sopenharmony_ci */ 3728c2ecf20Sopenharmony_ci DRM_BUS_FLAG_DATA_MSB_TO_LSB = BIT(4), 3738c2ecf20Sopenharmony_ci 3748c2ecf20Sopenharmony_ci /** 3758c2ecf20Sopenharmony_ci * @DRM_BUS_FLAG_DATA_LSB_TO_MSB: 3768c2ecf20Sopenharmony_ci * 3778c2ecf20Sopenharmony_ci * Data is transmitted LSB to MSB on the bus 3788c2ecf20Sopenharmony_ci */ 3798c2ecf20Sopenharmony_ci DRM_BUS_FLAG_DATA_LSB_TO_MSB = BIT(5), 3808c2ecf20Sopenharmony_ci 3818c2ecf20Sopenharmony_ci /** 3828c2ecf20Sopenharmony_ci * @DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE: 3838c2ecf20Sopenharmony_ci * 3848c2ecf20Sopenharmony_ci * Sync signals are driven on the rising edge of the pixel clock 3858c2ecf20Sopenharmony_ci */ 3868c2ecf20Sopenharmony_ci DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE = BIT(6), 3878c2ecf20Sopenharmony_ci 3888c2ecf20Sopenharmony_ci /** 3898c2ecf20Sopenharmony_ci * @DRM_BUS_FLAG_SYNC_DRIVE_NEGEDGE: 3908c2ecf20Sopenharmony_ci * 3918c2ecf20Sopenharmony_ci * Sync signals are driven on the falling edge of the pixel clock 3928c2ecf20Sopenharmony_ci */ 3938c2ecf20Sopenharmony_ci DRM_BUS_FLAG_SYNC_DRIVE_NEGEDGE = BIT(7), 3948c2ecf20Sopenharmony_ci 3958c2ecf20Sopenharmony_ci /** 3968c2ecf20Sopenharmony_ci * @DRM_BUS_FLAG_SYNC_SAMPLE_POSEDGE: 3978c2ecf20Sopenharmony_ci * 3988c2ecf20Sopenharmony_ci * Sync signals are sampled on the rising edge of the pixel clock 3998c2ecf20Sopenharmony_ci */ 4008c2ecf20Sopenharmony_ci DRM_BUS_FLAG_SYNC_SAMPLE_POSEDGE = DRM_BUS_FLAG_SYNC_DRIVE_NEGEDGE, 4018c2ecf20Sopenharmony_ci 4028c2ecf20Sopenharmony_ci /** 4038c2ecf20Sopenharmony_ci * @DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE: 4048c2ecf20Sopenharmony_ci * 4058c2ecf20Sopenharmony_ci * Sync signals are sampled on the falling edge of the pixel clock 4068c2ecf20Sopenharmony_ci */ 4078c2ecf20Sopenharmony_ci DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE = DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE, 4088c2ecf20Sopenharmony_ci 4098c2ecf20Sopenharmony_ci /** 4108c2ecf20Sopenharmony_ci * @DRM_BUS_FLAG_SHARP_SIGNALS: 4118c2ecf20Sopenharmony_ci * 4128c2ecf20Sopenharmony_ci * Set if the Sharp-specific signals (SPL, CLS, PS, REV) must be used 4138c2ecf20Sopenharmony_ci */ 4148c2ecf20Sopenharmony_ci DRM_BUS_FLAG_SHARP_SIGNALS = BIT(8), 4158c2ecf20Sopenharmony_ci}; 4168c2ecf20Sopenharmony_ci 4178c2ecf20Sopenharmony_ci/** 4188c2ecf20Sopenharmony_ci * struct drm_display_info - runtime data about the connected sink 4198c2ecf20Sopenharmony_ci * 4208c2ecf20Sopenharmony_ci * Describes a given display (e.g. CRT or flat panel) and its limitations. For 4218c2ecf20Sopenharmony_ci * fixed display sinks like built-in panels there's not much difference between 4228c2ecf20Sopenharmony_ci * this and &struct drm_connector. But for sinks with a real cable this 4238c2ecf20Sopenharmony_ci * structure is meant to describe all the things at the other end of the cable. 4248c2ecf20Sopenharmony_ci * 4258c2ecf20Sopenharmony_ci * For sinks which provide an EDID this can be filled out by calling 4268c2ecf20Sopenharmony_ci * drm_add_edid_modes(). 4278c2ecf20Sopenharmony_ci */ 4288c2ecf20Sopenharmony_cistruct drm_display_info { 4298c2ecf20Sopenharmony_ci /** 4308c2ecf20Sopenharmony_ci * @width_mm: Physical width in mm. 4318c2ecf20Sopenharmony_ci */ 4328c2ecf20Sopenharmony_ci unsigned int width_mm; 4338c2ecf20Sopenharmony_ci 4348c2ecf20Sopenharmony_ci /** 4358c2ecf20Sopenharmony_ci * @height_mm: Physical height in mm. 4368c2ecf20Sopenharmony_ci */ 4378c2ecf20Sopenharmony_ci unsigned int height_mm; 4388c2ecf20Sopenharmony_ci 4398c2ecf20Sopenharmony_ci /** 4408c2ecf20Sopenharmony_ci * @bpc: Maximum bits per color channel. Used by HDMI and DP outputs. 4418c2ecf20Sopenharmony_ci */ 4428c2ecf20Sopenharmony_ci unsigned int bpc; 4438c2ecf20Sopenharmony_ci 4448c2ecf20Sopenharmony_ci /** 4458c2ecf20Sopenharmony_ci * @subpixel_order: Subpixel order of LCD panels. 4468c2ecf20Sopenharmony_ci */ 4478c2ecf20Sopenharmony_ci enum subpixel_order subpixel_order; 4488c2ecf20Sopenharmony_ci 4498c2ecf20Sopenharmony_ci#define DRM_COLOR_FORMAT_RGB444 (1<<0) 4508c2ecf20Sopenharmony_ci#define DRM_COLOR_FORMAT_YCRCB444 (1<<1) 4518c2ecf20Sopenharmony_ci#define DRM_COLOR_FORMAT_YCRCB422 (1<<2) 4528c2ecf20Sopenharmony_ci#define DRM_COLOR_FORMAT_YCRCB420 (1<<3) 4538c2ecf20Sopenharmony_ci 4548c2ecf20Sopenharmony_ci /** 4558c2ecf20Sopenharmony_ci * @panel_orientation: Read only connector property for built-in panels, 4568c2ecf20Sopenharmony_ci * indicating the orientation of the panel vs the device's casing. 4578c2ecf20Sopenharmony_ci * drm_connector_init() sets this to DRM_MODE_PANEL_ORIENTATION_UNKNOWN. 4588c2ecf20Sopenharmony_ci * When not UNKNOWN this gets used by the drm_fb_helpers to rotate the 4598c2ecf20Sopenharmony_ci * fb to compensate and gets exported as prop to userspace. 4608c2ecf20Sopenharmony_ci */ 4618c2ecf20Sopenharmony_ci int panel_orientation; 4628c2ecf20Sopenharmony_ci 4638c2ecf20Sopenharmony_ci /** 4648c2ecf20Sopenharmony_ci * @color_formats: HDMI Color formats, selects between RGB and YCrCb 4658c2ecf20Sopenharmony_ci * modes. Used DRM_COLOR_FORMAT\_ defines, which are _not_ the same ones 4668c2ecf20Sopenharmony_ci * as used to describe the pixel format in framebuffers, and also don't 4678c2ecf20Sopenharmony_ci * match the formats in @bus_formats which are shared with v4l. 4688c2ecf20Sopenharmony_ci */ 4698c2ecf20Sopenharmony_ci u32 color_formats; 4708c2ecf20Sopenharmony_ci 4718c2ecf20Sopenharmony_ci /** 4728c2ecf20Sopenharmony_ci * @bus_formats: Pixel data format on the wire, somewhat redundant with 4738c2ecf20Sopenharmony_ci * @color_formats. Array of size @num_bus_formats encoded using 4748c2ecf20Sopenharmony_ci * MEDIA_BUS_FMT\_ defines shared with v4l and media drivers. 4758c2ecf20Sopenharmony_ci */ 4768c2ecf20Sopenharmony_ci const u32 *bus_formats; 4778c2ecf20Sopenharmony_ci /** 4788c2ecf20Sopenharmony_ci * @num_bus_formats: Size of @bus_formats array. 4798c2ecf20Sopenharmony_ci */ 4808c2ecf20Sopenharmony_ci unsigned int num_bus_formats; 4818c2ecf20Sopenharmony_ci 4828c2ecf20Sopenharmony_ci /** 4838c2ecf20Sopenharmony_ci * @bus_flags: Additional information (like pixel signal polarity) for 4848c2ecf20Sopenharmony_ci * the pixel data on the bus, using &enum drm_bus_flags values 4858c2ecf20Sopenharmony_ci * DRM_BUS_FLAGS\_. 4868c2ecf20Sopenharmony_ci */ 4878c2ecf20Sopenharmony_ci u32 bus_flags; 4888c2ecf20Sopenharmony_ci 4898c2ecf20Sopenharmony_ci /** 4908c2ecf20Sopenharmony_ci * @max_tmds_clock: Maximum TMDS clock rate supported by the 4918c2ecf20Sopenharmony_ci * sink in kHz. 0 means undefined. 4928c2ecf20Sopenharmony_ci */ 4938c2ecf20Sopenharmony_ci int max_tmds_clock; 4948c2ecf20Sopenharmony_ci 4958c2ecf20Sopenharmony_ci /** 4968c2ecf20Sopenharmony_ci * @dvi_dual: Dual-link DVI sink? 4978c2ecf20Sopenharmony_ci */ 4988c2ecf20Sopenharmony_ci bool dvi_dual; 4998c2ecf20Sopenharmony_ci 5008c2ecf20Sopenharmony_ci /** 5018c2ecf20Sopenharmony_ci * @is_hdmi: True if the sink is an HDMI device. 5028c2ecf20Sopenharmony_ci * 5038c2ecf20Sopenharmony_ci * This field shall be used instead of calling 5048c2ecf20Sopenharmony_ci * drm_detect_hdmi_monitor() when possible. 5058c2ecf20Sopenharmony_ci */ 5068c2ecf20Sopenharmony_ci bool is_hdmi; 5078c2ecf20Sopenharmony_ci 5088c2ecf20Sopenharmony_ci /** 5098c2ecf20Sopenharmony_ci * @has_hdmi_infoframe: Does the sink support the HDMI infoframe? 5108c2ecf20Sopenharmony_ci */ 5118c2ecf20Sopenharmony_ci bool has_hdmi_infoframe; 5128c2ecf20Sopenharmony_ci 5138c2ecf20Sopenharmony_ci /** 5148c2ecf20Sopenharmony_ci * @rgb_quant_range_selectable: Does the sink support selecting 5158c2ecf20Sopenharmony_ci * the RGB quantization range? 5168c2ecf20Sopenharmony_ci */ 5178c2ecf20Sopenharmony_ci bool rgb_quant_range_selectable; 5188c2ecf20Sopenharmony_ci 5198c2ecf20Sopenharmony_ci /** 5208c2ecf20Sopenharmony_ci * @edid_hdmi_dc_modes: Mask of supported hdmi deep color modes. Even 5218c2ecf20Sopenharmony_ci * more stuff redundant with @bus_formats. 5228c2ecf20Sopenharmony_ci */ 5238c2ecf20Sopenharmony_ci u8 edid_hdmi_dc_modes; 5248c2ecf20Sopenharmony_ci 5258c2ecf20Sopenharmony_ci /** 5268c2ecf20Sopenharmony_ci * @cea_rev: CEA revision of the HDMI sink. 5278c2ecf20Sopenharmony_ci */ 5288c2ecf20Sopenharmony_ci u8 cea_rev; 5298c2ecf20Sopenharmony_ci 5308c2ecf20Sopenharmony_ci /** 5318c2ecf20Sopenharmony_ci * @hdmi: advance features of a HDMI sink. 5328c2ecf20Sopenharmony_ci */ 5338c2ecf20Sopenharmony_ci struct drm_hdmi_info hdmi; 5348c2ecf20Sopenharmony_ci 5358c2ecf20Sopenharmony_ci /** 5368c2ecf20Sopenharmony_ci * @non_desktop: Non desktop display (HMD). 5378c2ecf20Sopenharmony_ci */ 5388c2ecf20Sopenharmony_ci bool non_desktop; 5398c2ecf20Sopenharmony_ci 5408c2ecf20Sopenharmony_ci /** 5418c2ecf20Sopenharmony_ci * @monitor_range: Frequency range supported by monitor range descriptor 5428c2ecf20Sopenharmony_ci */ 5438c2ecf20Sopenharmony_ci struct drm_monitor_range_info monitor_range; 5448c2ecf20Sopenharmony_ci}; 5458c2ecf20Sopenharmony_ci 5468c2ecf20Sopenharmony_ciint drm_display_info_set_bus_formats(struct drm_display_info *info, 5478c2ecf20Sopenharmony_ci const u32 *formats, 5488c2ecf20Sopenharmony_ci unsigned int num_formats); 5498c2ecf20Sopenharmony_ci 5508c2ecf20Sopenharmony_ci/** 5518c2ecf20Sopenharmony_ci * struct drm_connector_tv_margins - TV connector related margins 5528c2ecf20Sopenharmony_ci * 5538c2ecf20Sopenharmony_ci * Describes the margins in pixels to put around the image on TV 5548c2ecf20Sopenharmony_ci * connectors to deal with overscan. 5558c2ecf20Sopenharmony_ci */ 5568c2ecf20Sopenharmony_cistruct drm_connector_tv_margins { 5578c2ecf20Sopenharmony_ci /** 5588c2ecf20Sopenharmony_ci * @bottom: Bottom margin in pixels. 5598c2ecf20Sopenharmony_ci */ 5608c2ecf20Sopenharmony_ci unsigned int bottom; 5618c2ecf20Sopenharmony_ci 5628c2ecf20Sopenharmony_ci /** 5638c2ecf20Sopenharmony_ci * @left: Left margin in pixels. 5648c2ecf20Sopenharmony_ci */ 5658c2ecf20Sopenharmony_ci unsigned int left; 5668c2ecf20Sopenharmony_ci 5678c2ecf20Sopenharmony_ci /** 5688c2ecf20Sopenharmony_ci * @right: Right margin in pixels. 5698c2ecf20Sopenharmony_ci */ 5708c2ecf20Sopenharmony_ci unsigned int right; 5718c2ecf20Sopenharmony_ci 5728c2ecf20Sopenharmony_ci /** 5738c2ecf20Sopenharmony_ci * @top: Top margin in pixels. 5748c2ecf20Sopenharmony_ci */ 5758c2ecf20Sopenharmony_ci unsigned int top; 5768c2ecf20Sopenharmony_ci}; 5778c2ecf20Sopenharmony_ci 5788c2ecf20Sopenharmony_ci/** 5798c2ecf20Sopenharmony_ci * struct drm_tv_connector_state - TV connector related states 5808c2ecf20Sopenharmony_ci * @subconnector: selected subconnector 5818c2ecf20Sopenharmony_ci * @margins: TV margins 5828c2ecf20Sopenharmony_ci * @mode: TV mode 5838c2ecf20Sopenharmony_ci * @brightness: brightness in percent 5848c2ecf20Sopenharmony_ci * @contrast: contrast in percent 5858c2ecf20Sopenharmony_ci * @flicker_reduction: flicker reduction in percent 5868c2ecf20Sopenharmony_ci * @overscan: overscan in percent 5878c2ecf20Sopenharmony_ci * @saturation: saturation in percent 5888c2ecf20Sopenharmony_ci * @hue: hue in percent 5898c2ecf20Sopenharmony_ci */ 5908c2ecf20Sopenharmony_cistruct drm_tv_connector_state { 5918c2ecf20Sopenharmony_ci enum drm_mode_subconnector subconnector; 5928c2ecf20Sopenharmony_ci struct drm_connector_tv_margins margins; 5938c2ecf20Sopenharmony_ci unsigned int mode; 5948c2ecf20Sopenharmony_ci unsigned int brightness; 5958c2ecf20Sopenharmony_ci unsigned int contrast; 5968c2ecf20Sopenharmony_ci unsigned int flicker_reduction; 5978c2ecf20Sopenharmony_ci unsigned int overscan; 5988c2ecf20Sopenharmony_ci unsigned int saturation; 5998c2ecf20Sopenharmony_ci unsigned int hue; 6008c2ecf20Sopenharmony_ci}; 6018c2ecf20Sopenharmony_ci 6028c2ecf20Sopenharmony_ci/** 6038c2ecf20Sopenharmony_ci * struct drm_connector_state - mutable connector state 6048c2ecf20Sopenharmony_ci */ 6058c2ecf20Sopenharmony_cistruct drm_connector_state { 6068c2ecf20Sopenharmony_ci /** @connector: backpointer to the connector */ 6078c2ecf20Sopenharmony_ci struct drm_connector *connector; 6088c2ecf20Sopenharmony_ci 6098c2ecf20Sopenharmony_ci /** 6108c2ecf20Sopenharmony_ci * @crtc: CRTC to connect connector to, NULL if disabled. 6118c2ecf20Sopenharmony_ci * 6128c2ecf20Sopenharmony_ci * Do not change this directly, use drm_atomic_set_crtc_for_connector() 6138c2ecf20Sopenharmony_ci * instead. 6148c2ecf20Sopenharmony_ci */ 6158c2ecf20Sopenharmony_ci struct drm_crtc *crtc; 6168c2ecf20Sopenharmony_ci 6178c2ecf20Sopenharmony_ci /** 6188c2ecf20Sopenharmony_ci * @best_encoder: 6198c2ecf20Sopenharmony_ci * 6208c2ecf20Sopenharmony_ci * Used by the atomic helpers to select the encoder, through the 6218c2ecf20Sopenharmony_ci * &drm_connector_helper_funcs.atomic_best_encoder or 6228c2ecf20Sopenharmony_ci * &drm_connector_helper_funcs.best_encoder callbacks. 6238c2ecf20Sopenharmony_ci * 6248c2ecf20Sopenharmony_ci * This is also used in the atomic helpers to map encoders to their 6258c2ecf20Sopenharmony_ci * current and previous connectors, see 6268c2ecf20Sopenharmony_ci * drm_atomic_get_old_connector_for_encoder() and 6278c2ecf20Sopenharmony_ci * drm_atomic_get_new_connector_for_encoder(). 6288c2ecf20Sopenharmony_ci * 6298c2ecf20Sopenharmony_ci * NOTE: Atomic drivers must fill this out (either themselves or through 6308c2ecf20Sopenharmony_ci * helpers), for otherwise the GETCONNECTOR and GETENCODER IOCTLs will 6318c2ecf20Sopenharmony_ci * not return correct data to userspace. 6328c2ecf20Sopenharmony_ci */ 6338c2ecf20Sopenharmony_ci struct drm_encoder *best_encoder; 6348c2ecf20Sopenharmony_ci 6358c2ecf20Sopenharmony_ci /** 6368c2ecf20Sopenharmony_ci * @link_status: Connector link_status to keep track of whether link is 6378c2ecf20Sopenharmony_ci * GOOD or BAD to notify userspace if retraining is necessary. 6388c2ecf20Sopenharmony_ci */ 6398c2ecf20Sopenharmony_ci enum drm_link_status link_status; 6408c2ecf20Sopenharmony_ci 6418c2ecf20Sopenharmony_ci /** @state: backpointer to global drm_atomic_state */ 6428c2ecf20Sopenharmony_ci struct drm_atomic_state *state; 6438c2ecf20Sopenharmony_ci 6448c2ecf20Sopenharmony_ci /** 6458c2ecf20Sopenharmony_ci * @commit: Tracks the pending commit to prevent use-after-free conditions. 6468c2ecf20Sopenharmony_ci * 6478c2ecf20Sopenharmony_ci * Is only set when @crtc is NULL. 6488c2ecf20Sopenharmony_ci */ 6498c2ecf20Sopenharmony_ci struct drm_crtc_commit *commit; 6508c2ecf20Sopenharmony_ci 6518c2ecf20Sopenharmony_ci /** @tv: TV connector state */ 6528c2ecf20Sopenharmony_ci struct drm_tv_connector_state tv; 6538c2ecf20Sopenharmony_ci 6548c2ecf20Sopenharmony_ci /** 6558c2ecf20Sopenharmony_ci * @self_refresh_aware: 6568c2ecf20Sopenharmony_ci * 6578c2ecf20Sopenharmony_ci * This tracks whether a connector is aware of the self refresh state. 6588c2ecf20Sopenharmony_ci * It should be set to true for those connector implementations which 6598c2ecf20Sopenharmony_ci * understand the self refresh state. This is needed since the crtc 6608c2ecf20Sopenharmony_ci * registers the self refresh helpers and it doesn't know if the 6618c2ecf20Sopenharmony_ci * connectors downstream have implemented self refresh entry/exit. 6628c2ecf20Sopenharmony_ci * 6638c2ecf20Sopenharmony_ci * Drivers should set this to true in atomic_check if they know how to 6648c2ecf20Sopenharmony_ci * handle self_refresh requests. 6658c2ecf20Sopenharmony_ci */ 6668c2ecf20Sopenharmony_ci bool self_refresh_aware; 6678c2ecf20Sopenharmony_ci 6688c2ecf20Sopenharmony_ci /** 6698c2ecf20Sopenharmony_ci * @picture_aspect_ratio: Connector property to control the 6708c2ecf20Sopenharmony_ci * HDMI infoframe aspect ratio setting. 6718c2ecf20Sopenharmony_ci * 6728c2ecf20Sopenharmony_ci * The %DRM_MODE_PICTURE_ASPECT_\* values much match the 6738c2ecf20Sopenharmony_ci * values for &enum hdmi_picture_aspect 6748c2ecf20Sopenharmony_ci */ 6758c2ecf20Sopenharmony_ci enum hdmi_picture_aspect picture_aspect_ratio; 6768c2ecf20Sopenharmony_ci 6778c2ecf20Sopenharmony_ci /** 6788c2ecf20Sopenharmony_ci * @content_type: Connector property to control the 6798c2ecf20Sopenharmony_ci * HDMI infoframe content type setting. 6808c2ecf20Sopenharmony_ci * The %DRM_MODE_CONTENT_TYPE_\* values much 6818c2ecf20Sopenharmony_ci * match the values. 6828c2ecf20Sopenharmony_ci */ 6838c2ecf20Sopenharmony_ci unsigned int content_type; 6848c2ecf20Sopenharmony_ci 6858c2ecf20Sopenharmony_ci /** 6868c2ecf20Sopenharmony_ci * @hdcp_content_type: Connector property to pass the type of 6878c2ecf20Sopenharmony_ci * protected content. This is most commonly used for HDCP. 6888c2ecf20Sopenharmony_ci */ 6898c2ecf20Sopenharmony_ci unsigned int hdcp_content_type; 6908c2ecf20Sopenharmony_ci 6918c2ecf20Sopenharmony_ci /** 6928c2ecf20Sopenharmony_ci * @scaling_mode: Connector property to control the 6938c2ecf20Sopenharmony_ci * upscaling, mostly used for built-in panels. 6948c2ecf20Sopenharmony_ci */ 6958c2ecf20Sopenharmony_ci unsigned int scaling_mode; 6968c2ecf20Sopenharmony_ci 6978c2ecf20Sopenharmony_ci /** 6988c2ecf20Sopenharmony_ci * @content_protection: Connector property to request content 6998c2ecf20Sopenharmony_ci * protection. This is most commonly used for HDCP. 7008c2ecf20Sopenharmony_ci */ 7018c2ecf20Sopenharmony_ci unsigned int content_protection; 7028c2ecf20Sopenharmony_ci 7038c2ecf20Sopenharmony_ci /** 7048c2ecf20Sopenharmony_ci * @colorspace: State variable for Connector property to request 7058c2ecf20Sopenharmony_ci * colorspace change on Sink. This is most commonly used to switch 7068c2ecf20Sopenharmony_ci * to wider color gamuts like BT2020. 7078c2ecf20Sopenharmony_ci */ 7088c2ecf20Sopenharmony_ci u32 colorspace; 7098c2ecf20Sopenharmony_ci 7108c2ecf20Sopenharmony_ci /** 7118c2ecf20Sopenharmony_ci * @writeback_job: Writeback job for writeback connectors 7128c2ecf20Sopenharmony_ci * 7138c2ecf20Sopenharmony_ci * Holds the framebuffer and out-fence for a writeback connector. As 7148c2ecf20Sopenharmony_ci * the writeback completion may be asynchronous to the normal commit 7158c2ecf20Sopenharmony_ci * cycle, the writeback job lifetime is managed separately from the 7168c2ecf20Sopenharmony_ci * normal atomic state by this object. 7178c2ecf20Sopenharmony_ci * 7188c2ecf20Sopenharmony_ci * See also: drm_writeback_queue_job() and 7198c2ecf20Sopenharmony_ci * drm_writeback_signal_completion() 7208c2ecf20Sopenharmony_ci */ 7218c2ecf20Sopenharmony_ci struct drm_writeback_job *writeback_job; 7228c2ecf20Sopenharmony_ci 7238c2ecf20Sopenharmony_ci /** 7248c2ecf20Sopenharmony_ci * @max_requested_bpc: Connector property to limit the maximum bit 7258c2ecf20Sopenharmony_ci * depth of the pixels. 7268c2ecf20Sopenharmony_ci */ 7278c2ecf20Sopenharmony_ci u8 max_requested_bpc; 7288c2ecf20Sopenharmony_ci 7298c2ecf20Sopenharmony_ci /** 7308c2ecf20Sopenharmony_ci * @max_bpc: Connector max_bpc based on the requested max_bpc property 7318c2ecf20Sopenharmony_ci * and the connector bpc limitations obtained from edid. 7328c2ecf20Sopenharmony_ci */ 7338c2ecf20Sopenharmony_ci u8 max_bpc; 7348c2ecf20Sopenharmony_ci 7358c2ecf20Sopenharmony_ci /** 7368c2ecf20Sopenharmony_ci * @hdr_output_metadata: 7378c2ecf20Sopenharmony_ci * DRM blob property for HDR output metadata 7388c2ecf20Sopenharmony_ci */ 7398c2ecf20Sopenharmony_ci struct drm_property_blob *hdr_output_metadata; 7408c2ecf20Sopenharmony_ci}; 7418c2ecf20Sopenharmony_ci 7428c2ecf20Sopenharmony_ci/** 7438c2ecf20Sopenharmony_ci * struct drm_connector_funcs - control connectors on a given device 7448c2ecf20Sopenharmony_ci * 7458c2ecf20Sopenharmony_ci * Each CRTC may have one or more connectors attached to it. The functions 7468c2ecf20Sopenharmony_ci * below allow the core DRM code to control connectors, enumerate available modes, 7478c2ecf20Sopenharmony_ci * etc. 7488c2ecf20Sopenharmony_ci */ 7498c2ecf20Sopenharmony_cistruct drm_connector_funcs { 7508c2ecf20Sopenharmony_ci /** 7518c2ecf20Sopenharmony_ci * @dpms: 7528c2ecf20Sopenharmony_ci * 7538c2ecf20Sopenharmony_ci * Legacy entry point to set the per-connector DPMS state. Legacy DPMS 7548c2ecf20Sopenharmony_ci * is exposed as a standard property on the connector, but diverted to 7558c2ecf20Sopenharmony_ci * this callback in the drm core. Note that atomic drivers don't 7568c2ecf20Sopenharmony_ci * implement the 4 level DPMS support on the connector any more, but 7578c2ecf20Sopenharmony_ci * instead only have an on/off "ACTIVE" property on the CRTC object. 7588c2ecf20Sopenharmony_ci * 7598c2ecf20Sopenharmony_ci * This hook is not used by atomic drivers, remapping of the legacy DPMS 7608c2ecf20Sopenharmony_ci * property is entirely handled in the DRM core. 7618c2ecf20Sopenharmony_ci * 7628c2ecf20Sopenharmony_ci * RETURNS: 7638c2ecf20Sopenharmony_ci * 7648c2ecf20Sopenharmony_ci * 0 on success or a negative error code on failure. 7658c2ecf20Sopenharmony_ci */ 7668c2ecf20Sopenharmony_ci int (*dpms)(struct drm_connector *connector, int mode); 7678c2ecf20Sopenharmony_ci 7688c2ecf20Sopenharmony_ci /** 7698c2ecf20Sopenharmony_ci * @reset: 7708c2ecf20Sopenharmony_ci * 7718c2ecf20Sopenharmony_ci * Reset connector hardware and software state to off. This function isn't 7728c2ecf20Sopenharmony_ci * called by the core directly, only through drm_mode_config_reset(). 7738c2ecf20Sopenharmony_ci * It's not a helper hook only for historical reasons. 7748c2ecf20Sopenharmony_ci * 7758c2ecf20Sopenharmony_ci * Atomic drivers can use drm_atomic_helper_connector_reset() to reset 7768c2ecf20Sopenharmony_ci * atomic state using this hook. 7778c2ecf20Sopenharmony_ci */ 7788c2ecf20Sopenharmony_ci void (*reset)(struct drm_connector *connector); 7798c2ecf20Sopenharmony_ci 7808c2ecf20Sopenharmony_ci /** 7818c2ecf20Sopenharmony_ci * @detect: 7828c2ecf20Sopenharmony_ci * 7838c2ecf20Sopenharmony_ci * Check to see if anything is attached to the connector. The parameter 7848c2ecf20Sopenharmony_ci * force is set to false whilst polling, true when checking the 7858c2ecf20Sopenharmony_ci * connector due to a user request. force can be used by the driver to 7868c2ecf20Sopenharmony_ci * avoid expensive, destructive operations during automated probing. 7878c2ecf20Sopenharmony_ci * 7888c2ecf20Sopenharmony_ci * This callback is optional, if not implemented the connector will be 7898c2ecf20Sopenharmony_ci * considered as always being attached. 7908c2ecf20Sopenharmony_ci * 7918c2ecf20Sopenharmony_ci * FIXME: 7928c2ecf20Sopenharmony_ci * 7938c2ecf20Sopenharmony_ci * Note that this hook is only called by the probe helper. It's not in 7948c2ecf20Sopenharmony_ci * the helper library vtable purely for historical reasons. The only DRM 7958c2ecf20Sopenharmony_ci * core entry point to probe connector state is @fill_modes. 7968c2ecf20Sopenharmony_ci * 7978c2ecf20Sopenharmony_ci * Note that the helper library will already hold 7988c2ecf20Sopenharmony_ci * &drm_mode_config.connection_mutex. Drivers which need to grab additional 7998c2ecf20Sopenharmony_ci * locks to avoid races with concurrent modeset changes need to use 8008c2ecf20Sopenharmony_ci * &drm_connector_helper_funcs.detect_ctx instead. 8018c2ecf20Sopenharmony_ci * 8028c2ecf20Sopenharmony_ci * RETURNS: 8038c2ecf20Sopenharmony_ci * 8048c2ecf20Sopenharmony_ci * drm_connector_status indicating the connector's status. 8058c2ecf20Sopenharmony_ci */ 8068c2ecf20Sopenharmony_ci enum drm_connector_status (*detect)(struct drm_connector *connector, 8078c2ecf20Sopenharmony_ci bool force); 8088c2ecf20Sopenharmony_ci 8098c2ecf20Sopenharmony_ci /** 8108c2ecf20Sopenharmony_ci * @force: 8118c2ecf20Sopenharmony_ci * 8128c2ecf20Sopenharmony_ci * This function is called to update internal encoder state when the 8138c2ecf20Sopenharmony_ci * connector is forced to a certain state by userspace, either through 8148c2ecf20Sopenharmony_ci * the sysfs interfaces or on the kernel cmdline. In that case the 8158c2ecf20Sopenharmony_ci * @detect callback isn't called. 8168c2ecf20Sopenharmony_ci * 8178c2ecf20Sopenharmony_ci * FIXME: 8188c2ecf20Sopenharmony_ci * 8198c2ecf20Sopenharmony_ci * Note that this hook is only called by the probe helper. It's not in 8208c2ecf20Sopenharmony_ci * the helper library vtable purely for historical reasons. The only DRM 8218c2ecf20Sopenharmony_ci * core entry point to probe connector state is @fill_modes. 8228c2ecf20Sopenharmony_ci */ 8238c2ecf20Sopenharmony_ci void (*force)(struct drm_connector *connector); 8248c2ecf20Sopenharmony_ci 8258c2ecf20Sopenharmony_ci /** 8268c2ecf20Sopenharmony_ci * @fill_modes: 8278c2ecf20Sopenharmony_ci * 8288c2ecf20Sopenharmony_ci * Entry point for output detection and basic mode validation. The 8298c2ecf20Sopenharmony_ci * driver should reprobe the output if needed (e.g. when hotplug 8308c2ecf20Sopenharmony_ci * handling is unreliable), add all detected modes to &drm_connector.modes 8318c2ecf20Sopenharmony_ci * and filter out any the device can't support in any configuration. It 8328c2ecf20Sopenharmony_ci * also needs to filter out any modes wider or higher than the 8338c2ecf20Sopenharmony_ci * parameters max_width and max_height indicate. 8348c2ecf20Sopenharmony_ci * 8358c2ecf20Sopenharmony_ci * The drivers must also prune any modes no longer valid from 8368c2ecf20Sopenharmony_ci * &drm_connector.modes. Furthermore it must update 8378c2ecf20Sopenharmony_ci * &drm_connector.status and &drm_connector.edid. If no EDID has been 8388c2ecf20Sopenharmony_ci * received for this output connector->edid must be NULL. 8398c2ecf20Sopenharmony_ci * 8408c2ecf20Sopenharmony_ci * Drivers using the probe helpers should use 8418c2ecf20Sopenharmony_ci * drm_helper_probe_single_connector_modes() to implement this 8428c2ecf20Sopenharmony_ci * function. 8438c2ecf20Sopenharmony_ci * 8448c2ecf20Sopenharmony_ci * RETURNS: 8458c2ecf20Sopenharmony_ci * 8468c2ecf20Sopenharmony_ci * The number of modes detected and filled into &drm_connector.modes. 8478c2ecf20Sopenharmony_ci */ 8488c2ecf20Sopenharmony_ci int (*fill_modes)(struct drm_connector *connector, uint32_t max_width, uint32_t max_height); 8498c2ecf20Sopenharmony_ci 8508c2ecf20Sopenharmony_ci /** 8518c2ecf20Sopenharmony_ci * @set_property: 8528c2ecf20Sopenharmony_ci * 8538c2ecf20Sopenharmony_ci * This is the legacy entry point to update a property attached to the 8548c2ecf20Sopenharmony_ci * connector. 8558c2ecf20Sopenharmony_ci * 8568c2ecf20Sopenharmony_ci * This callback is optional if the driver does not support any legacy 8578c2ecf20Sopenharmony_ci * driver-private properties. For atomic drivers it is not used because 8588c2ecf20Sopenharmony_ci * property handling is done entirely in the DRM core. 8598c2ecf20Sopenharmony_ci * 8608c2ecf20Sopenharmony_ci * RETURNS: 8618c2ecf20Sopenharmony_ci * 8628c2ecf20Sopenharmony_ci * 0 on success or a negative error code on failure. 8638c2ecf20Sopenharmony_ci */ 8648c2ecf20Sopenharmony_ci int (*set_property)(struct drm_connector *connector, struct drm_property *property, 8658c2ecf20Sopenharmony_ci uint64_t val); 8668c2ecf20Sopenharmony_ci 8678c2ecf20Sopenharmony_ci /** 8688c2ecf20Sopenharmony_ci * @late_register: 8698c2ecf20Sopenharmony_ci * 8708c2ecf20Sopenharmony_ci * This optional hook can be used to register additional userspace 8718c2ecf20Sopenharmony_ci * interfaces attached to the connector, light backlight control, i2c, 8728c2ecf20Sopenharmony_ci * DP aux or similar interfaces. It is called late in the driver load 8738c2ecf20Sopenharmony_ci * sequence from drm_connector_register() when registering all the 8748c2ecf20Sopenharmony_ci * core drm connector interfaces. Everything added from this callback 8758c2ecf20Sopenharmony_ci * should be unregistered in the early_unregister callback. 8768c2ecf20Sopenharmony_ci * 8778c2ecf20Sopenharmony_ci * This is called while holding &drm_connector.mutex. 8788c2ecf20Sopenharmony_ci * 8798c2ecf20Sopenharmony_ci * Returns: 8808c2ecf20Sopenharmony_ci * 8818c2ecf20Sopenharmony_ci * 0 on success, or a negative error code on failure. 8828c2ecf20Sopenharmony_ci */ 8838c2ecf20Sopenharmony_ci int (*late_register)(struct drm_connector *connector); 8848c2ecf20Sopenharmony_ci 8858c2ecf20Sopenharmony_ci /** 8868c2ecf20Sopenharmony_ci * @early_unregister: 8878c2ecf20Sopenharmony_ci * 8888c2ecf20Sopenharmony_ci * This optional hook should be used to unregister the additional 8898c2ecf20Sopenharmony_ci * userspace interfaces attached to the connector from 8908c2ecf20Sopenharmony_ci * late_register(). It is called from drm_connector_unregister(), 8918c2ecf20Sopenharmony_ci * early in the driver unload sequence to disable userspace access 8928c2ecf20Sopenharmony_ci * before data structures are torndown. 8938c2ecf20Sopenharmony_ci * 8948c2ecf20Sopenharmony_ci * This is called while holding &drm_connector.mutex. 8958c2ecf20Sopenharmony_ci */ 8968c2ecf20Sopenharmony_ci void (*early_unregister)(struct drm_connector *connector); 8978c2ecf20Sopenharmony_ci 8988c2ecf20Sopenharmony_ci /** 8998c2ecf20Sopenharmony_ci * @destroy: 9008c2ecf20Sopenharmony_ci * 9018c2ecf20Sopenharmony_ci * Clean up connector resources. This is called at driver unload time 9028c2ecf20Sopenharmony_ci * through drm_mode_config_cleanup(). It can also be called at runtime 9038c2ecf20Sopenharmony_ci * when a connector is being hot-unplugged for drivers that support 9048c2ecf20Sopenharmony_ci * connector hotplugging (e.g. DisplayPort MST). 9058c2ecf20Sopenharmony_ci */ 9068c2ecf20Sopenharmony_ci void (*destroy)(struct drm_connector *connector); 9078c2ecf20Sopenharmony_ci 9088c2ecf20Sopenharmony_ci /** 9098c2ecf20Sopenharmony_ci * @atomic_duplicate_state: 9108c2ecf20Sopenharmony_ci * 9118c2ecf20Sopenharmony_ci * Duplicate the current atomic state for this connector and return it. 9128c2ecf20Sopenharmony_ci * The core and helpers guarantee that any atomic state duplicated with 9138c2ecf20Sopenharmony_ci * this hook and still owned by the caller (i.e. not transferred to the 9148c2ecf20Sopenharmony_ci * driver by calling &drm_mode_config_funcs.atomic_commit) will be 9158c2ecf20Sopenharmony_ci * cleaned up by calling the @atomic_destroy_state hook in this 9168c2ecf20Sopenharmony_ci * structure. 9178c2ecf20Sopenharmony_ci * 9188c2ecf20Sopenharmony_ci * This callback is mandatory for atomic drivers. 9198c2ecf20Sopenharmony_ci * 9208c2ecf20Sopenharmony_ci * Atomic drivers which don't subclass &struct drm_connector_state should use 9218c2ecf20Sopenharmony_ci * drm_atomic_helper_connector_duplicate_state(). Drivers that subclass the 9228c2ecf20Sopenharmony_ci * state structure to extend it with driver-private state should use 9238c2ecf20Sopenharmony_ci * __drm_atomic_helper_connector_duplicate_state() to make sure shared state is 9248c2ecf20Sopenharmony_ci * duplicated in a consistent fashion across drivers. 9258c2ecf20Sopenharmony_ci * 9268c2ecf20Sopenharmony_ci * It is an error to call this hook before &drm_connector.state has been 9278c2ecf20Sopenharmony_ci * initialized correctly. 9288c2ecf20Sopenharmony_ci * 9298c2ecf20Sopenharmony_ci * NOTE: 9308c2ecf20Sopenharmony_ci * 9318c2ecf20Sopenharmony_ci * If the duplicate state references refcounted resources this hook must 9328c2ecf20Sopenharmony_ci * acquire a reference for each of them. The driver must release these 9338c2ecf20Sopenharmony_ci * references again in @atomic_destroy_state. 9348c2ecf20Sopenharmony_ci * 9358c2ecf20Sopenharmony_ci * RETURNS: 9368c2ecf20Sopenharmony_ci * 9378c2ecf20Sopenharmony_ci * Duplicated atomic state or NULL when the allocation failed. 9388c2ecf20Sopenharmony_ci */ 9398c2ecf20Sopenharmony_ci struct drm_connector_state *(*atomic_duplicate_state)(struct drm_connector *connector); 9408c2ecf20Sopenharmony_ci 9418c2ecf20Sopenharmony_ci /** 9428c2ecf20Sopenharmony_ci * @atomic_destroy_state: 9438c2ecf20Sopenharmony_ci * 9448c2ecf20Sopenharmony_ci * Destroy a state duplicated with @atomic_duplicate_state and release 9458c2ecf20Sopenharmony_ci * or unreference all resources it references 9468c2ecf20Sopenharmony_ci * 9478c2ecf20Sopenharmony_ci * This callback is mandatory for atomic drivers. 9488c2ecf20Sopenharmony_ci */ 9498c2ecf20Sopenharmony_ci void (*atomic_destroy_state)(struct drm_connector *connector, 9508c2ecf20Sopenharmony_ci struct drm_connector_state *state); 9518c2ecf20Sopenharmony_ci 9528c2ecf20Sopenharmony_ci /** 9538c2ecf20Sopenharmony_ci * @atomic_set_property: 9548c2ecf20Sopenharmony_ci * 9558c2ecf20Sopenharmony_ci * Decode a driver-private property value and store the decoded value 9568c2ecf20Sopenharmony_ci * into the passed-in state structure. Since the atomic core decodes all 9578c2ecf20Sopenharmony_ci * standardized properties (even for extensions beyond the core set of 9588c2ecf20Sopenharmony_ci * properties which might not be implemented by all drivers) this 9598c2ecf20Sopenharmony_ci * requires drivers to subclass the state structure. 9608c2ecf20Sopenharmony_ci * 9618c2ecf20Sopenharmony_ci * Such driver-private properties should really only be implemented for 9628c2ecf20Sopenharmony_ci * truly hardware/vendor specific state. Instead it is preferred to 9638c2ecf20Sopenharmony_ci * standardize atomic extension and decode the properties used to expose 9648c2ecf20Sopenharmony_ci * such an extension in the core. 9658c2ecf20Sopenharmony_ci * 9668c2ecf20Sopenharmony_ci * Do not call this function directly, use 9678c2ecf20Sopenharmony_ci * drm_atomic_connector_set_property() instead. 9688c2ecf20Sopenharmony_ci * 9698c2ecf20Sopenharmony_ci * This callback is optional if the driver does not support any 9708c2ecf20Sopenharmony_ci * driver-private atomic properties. 9718c2ecf20Sopenharmony_ci * 9728c2ecf20Sopenharmony_ci * NOTE: 9738c2ecf20Sopenharmony_ci * 9748c2ecf20Sopenharmony_ci * This function is called in the state assembly phase of atomic 9758c2ecf20Sopenharmony_ci * modesets, which can be aborted for any reason (including on 9768c2ecf20Sopenharmony_ci * userspace's request to just check whether a configuration would be 9778c2ecf20Sopenharmony_ci * possible). Drivers MUST NOT touch any persistent state (hardware or 9788c2ecf20Sopenharmony_ci * software) or data structures except the passed in @state parameter. 9798c2ecf20Sopenharmony_ci * 9808c2ecf20Sopenharmony_ci * Also since userspace controls in which order properties are set this 9818c2ecf20Sopenharmony_ci * function must not do any input validation (since the state update is 9828c2ecf20Sopenharmony_ci * incomplete and hence likely inconsistent). Instead any such input 9838c2ecf20Sopenharmony_ci * validation must be done in the various atomic_check callbacks. 9848c2ecf20Sopenharmony_ci * 9858c2ecf20Sopenharmony_ci * RETURNS: 9868c2ecf20Sopenharmony_ci * 9878c2ecf20Sopenharmony_ci * 0 if the property has been found, -EINVAL if the property isn't 9888c2ecf20Sopenharmony_ci * implemented by the driver (which shouldn't ever happen, the core only 9898c2ecf20Sopenharmony_ci * asks for properties attached to this connector). No other validation 9908c2ecf20Sopenharmony_ci * is allowed by the driver. The core already checks that the property 9918c2ecf20Sopenharmony_ci * value is within the range (integer, valid enum value, ...) the driver 9928c2ecf20Sopenharmony_ci * set when registering the property. 9938c2ecf20Sopenharmony_ci */ 9948c2ecf20Sopenharmony_ci int (*atomic_set_property)(struct drm_connector *connector, 9958c2ecf20Sopenharmony_ci struct drm_connector_state *state, 9968c2ecf20Sopenharmony_ci struct drm_property *property, 9978c2ecf20Sopenharmony_ci uint64_t val); 9988c2ecf20Sopenharmony_ci 9998c2ecf20Sopenharmony_ci /** 10008c2ecf20Sopenharmony_ci * @atomic_get_property: 10018c2ecf20Sopenharmony_ci * 10028c2ecf20Sopenharmony_ci * Reads out the decoded driver-private property. This is used to 10038c2ecf20Sopenharmony_ci * implement the GETCONNECTOR IOCTL. 10048c2ecf20Sopenharmony_ci * 10058c2ecf20Sopenharmony_ci * Do not call this function directly, use 10068c2ecf20Sopenharmony_ci * drm_atomic_connector_get_property() instead. 10078c2ecf20Sopenharmony_ci * 10088c2ecf20Sopenharmony_ci * This callback is optional if the driver does not support any 10098c2ecf20Sopenharmony_ci * driver-private atomic properties. 10108c2ecf20Sopenharmony_ci * 10118c2ecf20Sopenharmony_ci * RETURNS: 10128c2ecf20Sopenharmony_ci * 10138c2ecf20Sopenharmony_ci * 0 on success, -EINVAL if the property isn't implemented by the 10148c2ecf20Sopenharmony_ci * driver (which shouldn't ever happen, the core only asks for 10158c2ecf20Sopenharmony_ci * properties attached to this connector). 10168c2ecf20Sopenharmony_ci */ 10178c2ecf20Sopenharmony_ci int (*atomic_get_property)(struct drm_connector *connector, 10188c2ecf20Sopenharmony_ci const struct drm_connector_state *state, 10198c2ecf20Sopenharmony_ci struct drm_property *property, 10208c2ecf20Sopenharmony_ci uint64_t *val); 10218c2ecf20Sopenharmony_ci 10228c2ecf20Sopenharmony_ci /** 10238c2ecf20Sopenharmony_ci * @atomic_print_state: 10248c2ecf20Sopenharmony_ci * 10258c2ecf20Sopenharmony_ci * If driver subclasses &struct drm_connector_state, it should implement 10268c2ecf20Sopenharmony_ci * this optional hook for printing additional driver specific state. 10278c2ecf20Sopenharmony_ci * 10288c2ecf20Sopenharmony_ci * Do not call this directly, use drm_atomic_connector_print_state() 10298c2ecf20Sopenharmony_ci * instead. 10308c2ecf20Sopenharmony_ci */ 10318c2ecf20Sopenharmony_ci void (*atomic_print_state)(struct drm_printer *p, 10328c2ecf20Sopenharmony_ci const struct drm_connector_state *state); 10338c2ecf20Sopenharmony_ci 10348c2ecf20Sopenharmony_ci /** 10358c2ecf20Sopenharmony_ci * @oob_hotplug_event: 10368c2ecf20Sopenharmony_ci * 10378c2ecf20Sopenharmony_ci * This will get called when a hotplug-event for a drm-connector 10388c2ecf20Sopenharmony_ci * has been received from a source outside the display driver / device. 10398c2ecf20Sopenharmony_ci */ 10408c2ecf20Sopenharmony_ci void (*oob_hotplug_event)(struct drm_connector *connector); 10418c2ecf20Sopenharmony_ci}; 10428c2ecf20Sopenharmony_ci 10438c2ecf20Sopenharmony_ci/** 10448c2ecf20Sopenharmony_ci * struct drm_cmdline_mode - DRM Mode passed through the kernel command-line 10458c2ecf20Sopenharmony_ci * 10468c2ecf20Sopenharmony_ci * Each connector can have an initial mode with additional options 10478c2ecf20Sopenharmony_ci * passed through the kernel command line. This structure allows to 10488c2ecf20Sopenharmony_ci * express those parameters and will be filled by the command-line 10498c2ecf20Sopenharmony_ci * parser. 10508c2ecf20Sopenharmony_ci */ 10518c2ecf20Sopenharmony_cistruct drm_cmdline_mode { 10528c2ecf20Sopenharmony_ci /** 10538c2ecf20Sopenharmony_ci * @name: 10548c2ecf20Sopenharmony_ci * 10558c2ecf20Sopenharmony_ci * Name of the mode. 10568c2ecf20Sopenharmony_ci */ 10578c2ecf20Sopenharmony_ci char name[DRM_DISPLAY_MODE_LEN]; 10588c2ecf20Sopenharmony_ci 10598c2ecf20Sopenharmony_ci /** 10608c2ecf20Sopenharmony_ci * @specified: 10618c2ecf20Sopenharmony_ci * 10628c2ecf20Sopenharmony_ci * Has a mode been read from the command-line? 10638c2ecf20Sopenharmony_ci */ 10648c2ecf20Sopenharmony_ci bool specified; 10658c2ecf20Sopenharmony_ci 10668c2ecf20Sopenharmony_ci /** 10678c2ecf20Sopenharmony_ci * @refresh_specified: 10688c2ecf20Sopenharmony_ci * 10698c2ecf20Sopenharmony_ci * Did the mode have a preferred refresh rate? 10708c2ecf20Sopenharmony_ci */ 10718c2ecf20Sopenharmony_ci bool refresh_specified; 10728c2ecf20Sopenharmony_ci 10738c2ecf20Sopenharmony_ci /** 10748c2ecf20Sopenharmony_ci * @bpp_specified: 10758c2ecf20Sopenharmony_ci * 10768c2ecf20Sopenharmony_ci * Did the mode have a preferred BPP? 10778c2ecf20Sopenharmony_ci */ 10788c2ecf20Sopenharmony_ci bool bpp_specified; 10798c2ecf20Sopenharmony_ci 10808c2ecf20Sopenharmony_ci /** 10818c2ecf20Sopenharmony_ci * @xres: 10828c2ecf20Sopenharmony_ci * 10838c2ecf20Sopenharmony_ci * Active resolution on the X axis, in pixels. 10848c2ecf20Sopenharmony_ci */ 10858c2ecf20Sopenharmony_ci int xres; 10868c2ecf20Sopenharmony_ci 10878c2ecf20Sopenharmony_ci /** 10888c2ecf20Sopenharmony_ci * @yres: 10898c2ecf20Sopenharmony_ci * 10908c2ecf20Sopenharmony_ci * Active resolution on the Y axis, in pixels. 10918c2ecf20Sopenharmony_ci */ 10928c2ecf20Sopenharmony_ci int yres; 10938c2ecf20Sopenharmony_ci 10948c2ecf20Sopenharmony_ci /** 10958c2ecf20Sopenharmony_ci * @bpp: 10968c2ecf20Sopenharmony_ci * 10978c2ecf20Sopenharmony_ci * Bits per pixels for the mode. 10988c2ecf20Sopenharmony_ci */ 10998c2ecf20Sopenharmony_ci int bpp; 11008c2ecf20Sopenharmony_ci 11018c2ecf20Sopenharmony_ci /** 11028c2ecf20Sopenharmony_ci * @refresh: 11038c2ecf20Sopenharmony_ci * 11048c2ecf20Sopenharmony_ci * Refresh rate, in Hertz. 11058c2ecf20Sopenharmony_ci */ 11068c2ecf20Sopenharmony_ci int refresh; 11078c2ecf20Sopenharmony_ci 11088c2ecf20Sopenharmony_ci /** 11098c2ecf20Sopenharmony_ci * @rb: 11108c2ecf20Sopenharmony_ci * 11118c2ecf20Sopenharmony_ci * Do we need to use reduced blanking? 11128c2ecf20Sopenharmony_ci */ 11138c2ecf20Sopenharmony_ci bool rb; 11148c2ecf20Sopenharmony_ci 11158c2ecf20Sopenharmony_ci /** 11168c2ecf20Sopenharmony_ci * @interlace: 11178c2ecf20Sopenharmony_ci * 11188c2ecf20Sopenharmony_ci * The mode is interlaced. 11198c2ecf20Sopenharmony_ci */ 11208c2ecf20Sopenharmony_ci bool interlace; 11218c2ecf20Sopenharmony_ci 11228c2ecf20Sopenharmony_ci /** 11238c2ecf20Sopenharmony_ci * @cvt: 11248c2ecf20Sopenharmony_ci * 11258c2ecf20Sopenharmony_ci * The timings will be calculated using the VESA Coordinated 11268c2ecf20Sopenharmony_ci * Video Timings instead of looking up the mode from a table. 11278c2ecf20Sopenharmony_ci */ 11288c2ecf20Sopenharmony_ci bool cvt; 11298c2ecf20Sopenharmony_ci 11308c2ecf20Sopenharmony_ci /** 11318c2ecf20Sopenharmony_ci * @margins: 11328c2ecf20Sopenharmony_ci * 11338c2ecf20Sopenharmony_ci * Add margins to the mode calculation (1.8% of xres rounded 11348c2ecf20Sopenharmony_ci * down to 8 pixels and 1.8% of yres). 11358c2ecf20Sopenharmony_ci */ 11368c2ecf20Sopenharmony_ci bool margins; 11378c2ecf20Sopenharmony_ci 11388c2ecf20Sopenharmony_ci /** 11398c2ecf20Sopenharmony_ci * @force: 11408c2ecf20Sopenharmony_ci * 11418c2ecf20Sopenharmony_ci * Ignore the hotplug state of the connector, and force its 11428c2ecf20Sopenharmony_ci * state to one of the DRM_FORCE_* values. 11438c2ecf20Sopenharmony_ci */ 11448c2ecf20Sopenharmony_ci enum drm_connector_force force; 11458c2ecf20Sopenharmony_ci 11468c2ecf20Sopenharmony_ci /** 11478c2ecf20Sopenharmony_ci * @rotation_reflection: 11488c2ecf20Sopenharmony_ci * 11498c2ecf20Sopenharmony_ci * Initial rotation and reflection of the mode setup from the 11508c2ecf20Sopenharmony_ci * command line. See DRM_MODE_ROTATE_* and 11518c2ecf20Sopenharmony_ci * DRM_MODE_REFLECT_*. The only rotations supported are 11528c2ecf20Sopenharmony_ci * DRM_MODE_ROTATE_0 and DRM_MODE_ROTATE_180. 11538c2ecf20Sopenharmony_ci */ 11548c2ecf20Sopenharmony_ci unsigned int rotation_reflection; 11558c2ecf20Sopenharmony_ci 11568c2ecf20Sopenharmony_ci /** 11578c2ecf20Sopenharmony_ci * @panel_orientation: 11588c2ecf20Sopenharmony_ci * 11598c2ecf20Sopenharmony_ci * drm-connector "panel orientation" property override value, 11608c2ecf20Sopenharmony_ci * DRM_MODE_PANEL_ORIENTATION_UNKNOWN if not set. 11618c2ecf20Sopenharmony_ci */ 11628c2ecf20Sopenharmony_ci enum drm_panel_orientation panel_orientation; 11638c2ecf20Sopenharmony_ci 11648c2ecf20Sopenharmony_ci /** 11658c2ecf20Sopenharmony_ci * @tv_margins: TV margins to apply to the mode. 11668c2ecf20Sopenharmony_ci */ 11678c2ecf20Sopenharmony_ci struct drm_connector_tv_margins tv_margins; 11688c2ecf20Sopenharmony_ci}; 11698c2ecf20Sopenharmony_ci 11708c2ecf20Sopenharmony_ci/** 11718c2ecf20Sopenharmony_ci * struct drm_connector - central DRM connector control structure 11728c2ecf20Sopenharmony_ci * 11738c2ecf20Sopenharmony_ci * Each connector may be connected to one or more CRTCs, or may be clonable by 11748c2ecf20Sopenharmony_ci * another connector if they can share a CRTC. Each connector also has a specific 11758c2ecf20Sopenharmony_ci * position in the broader display (referred to as a 'screen' though it could 11768c2ecf20Sopenharmony_ci * span multiple monitors). 11778c2ecf20Sopenharmony_ci */ 11788c2ecf20Sopenharmony_cistruct drm_connector { 11798c2ecf20Sopenharmony_ci /** @dev: parent DRM device */ 11808c2ecf20Sopenharmony_ci struct drm_device *dev; 11818c2ecf20Sopenharmony_ci /** @kdev: kernel device for sysfs attributes */ 11828c2ecf20Sopenharmony_ci struct device *kdev; 11838c2ecf20Sopenharmony_ci /** @attr: sysfs attributes */ 11848c2ecf20Sopenharmony_ci struct device_attribute *attr; 11858c2ecf20Sopenharmony_ci /** 11868c2ecf20Sopenharmony_ci * @fwnode: associated fwnode supplied by platform firmware 11878c2ecf20Sopenharmony_ci * 11888c2ecf20Sopenharmony_ci * Drivers can set this to associate a fwnode with a connector, drivers 11898c2ecf20Sopenharmony_ci * are expected to get a reference on the fwnode when setting this. 11908c2ecf20Sopenharmony_ci * drm_connector_cleanup() will call fwnode_handle_put() on this. 11918c2ecf20Sopenharmony_ci */ 11928c2ecf20Sopenharmony_ci struct fwnode_handle *fwnode; 11938c2ecf20Sopenharmony_ci 11948c2ecf20Sopenharmony_ci /** 11958c2ecf20Sopenharmony_ci * @head: 11968c2ecf20Sopenharmony_ci * 11978c2ecf20Sopenharmony_ci * List of all connectors on a @dev, linked from 11988c2ecf20Sopenharmony_ci * &drm_mode_config.connector_list. Protected by 11998c2ecf20Sopenharmony_ci * &drm_mode_config.connector_list_lock, but please only use 12008c2ecf20Sopenharmony_ci * &drm_connector_list_iter to walk this list. 12018c2ecf20Sopenharmony_ci */ 12028c2ecf20Sopenharmony_ci struct list_head head; 12038c2ecf20Sopenharmony_ci 12048c2ecf20Sopenharmony_ci /** 12058c2ecf20Sopenharmony_ci * @global_connector_list_entry: 12068c2ecf20Sopenharmony_ci * 12078c2ecf20Sopenharmony_ci * Connector entry in the global connector-list, used by 12088c2ecf20Sopenharmony_ci * drm_connector_find_by_fwnode(). 12098c2ecf20Sopenharmony_ci */ 12108c2ecf20Sopenharmony_ci struct list_head global_connector_list_entry; 12118c2ecf20Sopenharmony_ci 12128c2ecf20Sopenharmony_ci /** @base: base KMS object */ 12138c2ecf20Sopenharmony_ci struct drm_mode_object base; 12148c2ecf20Sopenharmony_ci 12158c2ecf20Sopenharmony_ci /** @name: human readable name, can be overwritten by the driver */ 12168c2ecf20Sopenharmony_ci char *name; 12178c2ecf20Sopenharmony_ci 12188c2ecf20Sopenharmony_ci /** 12198c2ecf20Sopenharmony_ci * @mutex: Lock for general connector state, but currently only protects 12208c2ecf20Sopenharmony_ci * @registered. Most of the connector state is still protected by 12218c2ecf20Sopenharmony_ci * &drm_mode_config.mutex. 12228c2ecf20Sopenharmony_ci */ 12238c2ecf20Sopenharmony_ci struct mutex mutex; 12248c2ecf20Sopenharmony_ci 12258c2ecf20Sopenharmony_ci /** 12268c2ecf20Sopenharmony_ci * @index: Compacted connector index, which matches the position inside 12278c2ecf20Sopenharmony_ci * the mode_config.list for drivers not supporting hot-add/removing. Can 12288c2ecf20Sopenharmony_ci * be used as an array index. It is invariant over the lifetime of the 12298c2ecf20Sopenharmony_ci * connector. 12308c2ecf20Sopenharmony_ci */ 12318c2ecf20Sopenharmony_ci unsigned index; 12328c2ecf20Sopenharmony_ci 12338c2ecf20Sopenharmony_ci /** 12348c2ecf20Sopenharmony_ci * @connector_type: 12358c2ecf20Sopenharmony_ci * one of the DRM_MODE_CONNECTOR_<foo> types from drm_mode.h 12368c2ecf20Sopenharmony_ci */ 12378c2ecf20Sopenharmony_ci int connector_type; 12388c2ecf20Sopenharmony_ci /** @connector_type_id: index into connector type enum */ 12398c2ecf20Sopenharmony_ci int connector_type_id; 12408c2ecf20Sopenharmony_ci /** 12418c2ecf20Sopenharmony_ci * @interlace_allowed: 12428c2ecf20Sopenharmony_ci * Can this connector handle interlaced modes? Only used by 12438c2ecf20Sopenharmony_ci * drm_helper_probe_single_connector_modes() for mode filtering. 12448c2ecf20Sopenharmony_ci */ 12458c2ecf20Sopenharmony_ci bool interlace_allowed; 12468c2ecf20Sopenharmony_ci /** 12478c2ecf20Sopenharmony_ci * @doublescan_allowed: 12488c2ecf20Sopenharmony_ci * Can this connector handle doublescan? Only used by 12498c2ecf20Sopenharmony_ci * drm_helper_probe_single_connector_modes() for mode filtering. 12508c2ecf20Sopenharmony_ci */ 12518c2ecf20Sopenharmony_ci bool doublescan_allowed; 12528c2ecf20Sopenharmony_ci /** 12538c2ecf20Sopenharmony_ci * @stereo_allowed: 12548c2ecf20Sopenharmony_ci * Can this connector handle stereo modes? Only used by 12558c2ecf20Sopenharmony_ci * drm_helper_probe_single_connector_modes() for mode filtering. 12568c2ecf20Sopenharmony_ci */ 12578c2ecf20Sopenharmony_ci bool stereo_allowed; 12588c2ecf20Sopenharmony_ci 12598c2ecf20Sopenharmony_ci /** 12608c2ecf20Sopenharmony_ci * @ycbcr_420_allowed : This bool indicates if this connector is 12618c2ecf20Sopenharmony_ci * capable of handling YCBCR 420 output. While parsing the EDID 12628c2ecf20Sopenharmony_ci * blocks it's very helpful to know if the source is capable of 12638c2ecf20Sopenharmony_ci * handling YCBCR 420 outputs. 12648c2ecf20Sopenharmony_ci */ 12658c2ecf20Sopenharmony_ci bool ycbcr_420_allowed; 12668c2ecf20Sopenharmony_ci 12678c2ecf20Sopenharmony_ci /** 12688c2ecf20Sopenharmony_ci * @registration_state: Is this connector initializing, exposed 12698c2ecf20Sopenharmony_ci * (registered) with userspace, or unregistered? 12708c2ecf20Sopenharmony_ci * 12718c2ecf20Sopenharmony_ci * Protected by @mutex. 12728c2ecf20Sopenharmony_ci */ 12738c2ecf20Sopenharmony_ci enum drm_connector_registration_state registration_state; 12748c2ecf20Sopenharmony_ci 12758c2ecf20Sopenharmony_ci /** 12768c2ecf20Sopenharmony_ci * @modes: 12778c2ecf20Sopenharmony_ci * Modes available on this connector (from fill_modes() + user). 12788c2ecf20Sopenharmony_ci * Protected by &drm_mode_config.mutex. 12798c2ecf20Sopenharmony_ci */ 12808c2ecf20Sopenharmony_ci struct list_head modes; 12818c2ecf20Sopenharmony_ci 12828c2ecf20Sopenharmony_ci /** 12838c2ecf20Sopenharmony_ci * @status: 12848c2ecf20Sopenharmony_ci * One of the drm_connector_status enums (connected, not, or unknown). 12858c2ecf20Sopenharmony_ci * Protected by &drm_mode_config.mutex. 12868c2ecf20Sopenharmony_ci */ 12878c2ecf20Sopenharmony_ci enum drm_connector_status status; 12888c2ecf20Sopenharmony_ci 12898c2ecf20Sopenharmony_ci /** 12908c2ecf20Sopenharmony_ci * @probed_modes: 12918c2ecf20Sopenharmony_ci * These are modes added by probing with DDC or the BIOS, before 12928c2ecf20Sopenharmony_ci * filtering is applied. Used by the probe helpers. Protected by 12938c2ecf20Sopenharmony_ci * &drm_mode_config.mutex. 12948c2ecf20Sopenharmony_ci */ 12958c2ecf20Sopenharmony_ci struct list_head probed_modes; 12968c2ecf20Sopenharmony_ci 12978c2ecf20Sopenharmony_ci /** 12988c2ecf20Sopenharmony_ci * @display_info: Display information is filled from EDID information 12998c2ecf20Sopenharmony_ci * when a display is detected. For non hot-pluggable displays such as 13008c2ecf20Sopenharmony_ci * flat panels in embedded systems, the driver should initialize the 13018c2ecf20Sopenharmony_ci * &drm_display_info.width_mm and &drm_display_info.height_mm fields 13028c2ecf20Sopenharmony_ci * with the physical size of the display. 13038c2ecf20Sopenharmony_ci * 13048c2ecf20Sopenharmony_ci * Protected by &drm_mode_config.mutex. 13058c2ecf20Sopenharmony_ci */ 13068c2ecf20Sopenharmony_ci struct drm_display_info display_info; 13078c2ecf20Sopenharmony_ci 13088c2ecf20Sopenharmony_ci /** @funcs: connector control functions */ 13098c2ecf20Sopenharmony_ci const struct drm_connector_funcs *funcs; 13108c2ecf20Sopenharmony_ci 13118c2ecf20Sopenharmony_ci /** 13128c2ecf20Sopenharmony_ci * @edid_blob_ptr: DRM property containing EDID if present. Protected by 13138c2ecf20Sopenharmony_ci * &drm_mode_config.mutex. This should be updated only by calling 13148c2ecf20Sopenharmony_ci * drm_connector_update_edid_property(). 13158c2ecf20Sopenharmony_ci */ 13168c2ecf20Sopenharmony_ci struct drm_property_blob *edid_blob_ptr; 13178c2ecf20Sopenharmony_ci 13188c2ecf20Sopenharmony_ci /** @properties: property tracking for this connector */ 13198c2ecf20Sopenharmony_ci struct drm_object_properties properties; 13208c2ecf20Sopenharmony_ci 13218c2ecf20Sopenharmony_ci /** 13228c2ecf20Sopenharmony_ci * @scaling_mode_property: Optional atomic property to control the 13238c2ecf20Sopenharmony_ci * upscaling. See drm_connector_attach_content_protection_property(). 13248c2ecf20Sopenharmony_ci */ 13258c2ecf20Sopenharmony_ci struct drm_property *scaling_mode_property; 13268c2ecf20Sopenharmony_ci 13278c2ecf20Sopenharmony_ci /** 13288c2ecf20Sopenharmony_ci * @vrr_capable_property: Optional property to help userspace 13298c2ecf20Sopenharmony_ci * query hardware support for variable refresh rate on a connector. 13308c2ecf20Sopenharmony_ci * connector. Drivers can add the property to a connector by 13318c2ecf20Sopenharmony_ci * calling drm_connector_attach_vrr_capable_property(). 13328c2ecf20Sopenharmony_ci * 13338c2ecf20Sopenharmony_ci * This should be updated only by calling 13348c2ecf20Sopenharmony_ci * drm_connector_set_vrr_capable_property(). 13358c2ecf20Sopenharmony_ci */ 13368c2ecf20Sopenharmony_ci struct drm_property *vrr_capable_property; 13378c2ecf20Sopenharmony_ci 13388c2ecf20Sopenharmony_ci /** 13398c2ecf20Sopenharmony_ci * @colorspace_property: Connector property to set the suitable 13408c2ecf20Sopenharmony_ci * colorspace supported by the sink. 13418c2ecf20Sopenharmony_ci */ 13428c2ecf20Sopenharmony_ci struct drm_property *colorspace_property; 13438c2ecf20Sopenharmony_ci 13448c2ecf20Sopenharmony_ci /** 13458c2ecf20Sopenharmony_ci * @path_blob_ptr: 13468c2ecf20Sopenharmony_ci * 13478c2ecf20Sopenharmony_ci * DRM blob property data for the DP MST path property. This should only 13488c2ecf20Sopenharmony_ci * be updated by calling drm_connector_set_path_property(). 13498c2ecf20Sopenharmony_ci */ 13508c2ecf20Sopenharmony_ci struct drm_property_blob *path_blob_ptr; 13518c2ecf20Sopenharmony_ci 13528c2ecf20Sopenharmony_ci /** 13538c2ecf20Sopenharmony_ci * @max_bpc_property: Default connector property for the max bpc to be 13548c2ecf20Sopenharmony_ci * driven out of the connector. 13558c2ecf20Sopenharmony_ci */ 13568c2ecf20Sopenharmony_ci struct drm_property *max_bpc_property; 13578c2ecf20Sopenharmony_ci 13588c2ecf20Sopenharmony_ci#define DRM_CONNECTOR_POLL_HPD (1 << 0) 13598c2ecf20Sopenharmony_ci#define DRM_CONNECTOR_POLL_CONNECT (1 << 1) 13608c2ecf20Sopenharmony_ci#define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2) 13618c2ecf20Sopenharmony_ci 13628c2ecf20Sopenharmony_ci /** 13638c2ecf20Sopenharmony_ci * @polled: 13648c2ecf20Sopenharmony_ci * 13658c2ecf20Sopenharmony_ci * Connector polling mode, a combination of 13668c2ecf20Sopenharmony_ci * 13678c2ecf20Sopenharmony_ci * DRM_CONNECTOR_POLL_HPD 13688c2ecf20Sopenharmony_ci * The connector generates hotplug events and doesn't need to be 13698c2ecf20Sopenharmony_ci * periodically polled. The CONNECT and DISCONNECT flags must not 13708c2ecf20Sopenharmony_ci * be set together with the HPD flag. 13718c2ecf20Sopenharmony_ci * 13728c2ecf20Sopenharmony_ci * DRM_CONNECTOR_POLL_CONNECT 13738c2ecf20Sopenharmony_ci * Periodically poll the connector for connection. 13748c2ecf20Sopenharmony_ci * 13758c2ecf20Sopenharmony_ci * DRM_CONNECTOR_POLL_DISCONNECT 13768c2ecf20Sopenharmony_ci * Periodically poll the connector for disconnection, without 13778c2ecf20Sopenharmony_ci * causing flickering even when the connector is in use. DACs should 13788c2ecf20Sopenharmony_ci * rarely do this without a lot of testing. 13798c2ecf20Sopenharmony_ci * 13808c2ecf20Sopenharmony_ci * Set to 0 for connectors that don't support connection status 13818c2ecf20Sopenharmony_ci * discovery. 13828c2ecf20Sopenharmony_ci */ 13838c2ecf20Sopenharmony_ci uint8_t polled; 13848c2ecf20Sopenharmony_ci 13858c2ecf20Sopenharmony_ci /** 13868c2ecf20Sopenharmony_ci * @dpms: Current dpms state. For legacy drivers the 13878c2ecf20Sopenharmony_ci * &drm_connector_funcs.dpms callback must update this. For atomic 13888c2ecf20Sopenharmony_ci * drivers, this is handled by the core atomic code, and drivers must 13898c2ecf20Sopenharmony_ci * only take &drm_crtc_state.active into account. 13908c2ecf20Sopenharmony_ci */ 13918c2ecf20Sopenharmony_ci int dpms; 13928c2ecf20Sopenharmony_ci 13938c2ecf20Sopenharmony_ci /** @helper_private: mid-layer private data */ 13948c2ecf20Sopenharmony_ci const struct drm_connector_helper_funcs *helper_private; 13958c2ecf20Sopenharmony_ci 13968c2ecf20Sopenharmony_ci /** @cmdline_mode: mode line parsed from the kernel cmdline for this connector */ 13978c2ecf20Sopenharmony_ci struct drm_cmdline_mode cmdline_mode; 13988c2ecf20Sopenharmony_ci /** @force: a DRM_FORCE_<foo> state for forced mode sets */ 13998c2ecf20Sopenharmony_ci enum drm_connector_force force; 14008c2ecf20Sopenharmony_ci /** @override_edid: has the EDID been overwritten through debugfs for testing? */ 14018c2ecf20Sopenharmony_ci bool override_edid; 14028c2ecf20Sopenharmony_ci /** @epoch_counter: used to detect any other changes in connector, besides status */ 14038c2ecf20Sopenharmony_ci u64 epoch_counter; 14048c2ecf20Sopenharmony_ci 14058c2ecf20Sopenharmony_ci /** 14068c2ecf20Sopenharmony_ci * @possible_encoders: Bit mask of encoders that can drive this 14078c2ecf20Sopenharmony_ci * connector, drm_encoder_index() determines the index into the bitfield 14088c2ecf20Sopenharmony_ci * and the bits are set with drm_connector_attach_encoder(). 14098c2ecf20Sopenharmony_ci */ 14108c2ecf20Sopenharmony_ci u32 possible_encoders; 14118c2ecf20Sopenharmony_ci 14128c2ecf20Sopenharmony_ci /** 14138c2ecf20Sopenharmony_ci * @encoder: Currently bound encoder driving this connector, if any. 14148c2ecf20Sopenharmony_ci * Only really meaningful for non-atomic drivers. Atomic drivers should 14158c2ecf20Sopenharmony_ci * instead look at &drm_connector_state.best_encoder, and in case they 14168c2ecf20Sopenharmony_ci * need the CRTC driving this output, &drm_connector_state.crtc. 14178c2ecf20Sopenharmony_ci */ 14188c2ecf20Sopenharmony_ci struct drm_encoder *encoder; 14198c2ecf20Sopenharmony_ci 14208c2ecf20Sopenharmony_ci#define MAX_ELD_BYTES 128 14218c2ecf20Sopenharmony_ci /** @eld: EDID-like data, if present */ 14228c2ecf20Sopenharmony_ci uint8_t eld[MAX_ELD_BYTES]; 14238c2ecf20Sopenharmony_ci /** @latency_present: AV delay info from ELD, if found */ 14248c2ecf20Sopenharmony_ci bool latency_present[2]; 14258c2ecf20Sopenharmony_ci /** 14268c2ecf20Sopenharmony_ci * @video_latency: Video latency info from ELD, if found. 14278c2ecf20Sopenharmony_ci * [0]: progressive, [1]: interlaced 14288c2ecf20Sopenharmony_ci */ 14298c2ecf20Sopenharmony_ci int video_latency[2]; 14308c2ecf20Sopenharmony_ci /** 14318c2ecf20Sopenharmony_ci * @audio_latency: audio latency info from ELD, if found 14328c2ecf20Sopenharmony_ci * [0]: progressive, [1]: interlaced 14338c2ecf20Sopenharmony_ci */ 14348c2ecf20Sopenharmony_ci int audio_latency[2]; 14358c2ecf20Sopenharmony_ci 14368c2ecf20Sopenharmony_ci /** 14378c2ecf20Sopenharmony_ci * @ddc: associated ddc adapter. 14388c2ecf20Sopenharmony_ci * A connector usually has its associated ddc adapter. If a driver uses 14398c2ecf20Sopenharmony_ci * this field, then an appropriate symbolic link is created in connector 14408c2ecf20Sopenharmony_ci * sysfs directory to make it easy for the user to tell which i2c 14418c2ecf20Sopenharmony_ci * adapter is for a particular display. 14428c2ecf20Sopenharmony_ci * 14438c2ecf20Sopenharmony_ci * The field should be set by calling drm_connector_init_with_ddc(). 14448c2ecf20Sopenharmony_ci */ 14458c2ecf20Sopenharmony_ci struct i2c_adapter *ddc; 14468c2ecf20Sopenharmony_ci 14478c2ecf20Sopenharmony_ci /** 14488c2ecf20Sopenharmony_ci * @null_edid_counter: track sinks that give us all zeros for the EDID. 14498c2ecf20Sopenharmony_ci * Needed to workaround some HW bugs where we get all 0s 14508c2ecf20Sopenharmony_ci */ 14518c2ecf20Sopenharmony_ci int null_edid_counter; 14528c2ecf20Sopenharmony_ci 14538c2ecf20Sopenharmony_ci /** @bad_edid_counter: track sinks that give us an EDID with invalid checksum */ 14548c2ecf20Sopenharmony_ci unsigned bad_edid_counter; 14558c2ecf20Sopenharmony_ci 14568c2ecf20Sopenharmony_ci /** 14578c2ecf20Sopenharmony_ci * @edid_corrupt: Indicates whether the last read EDID was corrupt. Used 14588c2ecf20Sopenharmony_ci * in Displayport compliance testing - Displayport Link CTS Core 1.2 14598c2ecf20Sopenharmony_ci * rev1.1 4.2.2.6 14608c2ecf20Sopenharmony_ci */ 14618c2ecf20Sopenharmony_ci bool edid_corrupt; 14628c2ecf20Sopenharmony_ci /** 14638c2ecf20Sopenharmony_ci * @real_edid_checksum: real edid checksum for corrupted edid block. 14648c2ecf20Sopenharmony_ci * Required in Displayport 1.4 compliance testing 14658c2ecf20Sopenharmony_ci * rev1.1 4.2.2.6 14668c2ecf20Sopenharmony_ci */ 14678c2ecf20Sopenharmony_ci u8 real_edid_checksum; 14688c2ecf20Sopenharmony_ci 14698c2ecf20Sopenharmony_ci /** @debugfs_entry: debugfs directory for this connector */ 14708c2ecf20Sopenharmony_ci struct dentry *debugfs_entry; 14718c2ecf20Sopenharmony_ci 14728c2ecf20Sopenharmony_ci /** 14738c2ecf20Sopenharmony_ci * @state: 14748c2ecf20Sopenharmony_ci * 14758c2ecf20Sopenharmony_ci * Current atomic state for this connector. 14768c2ecf20Sopenharmony_ci * 14778c2ecf20Sopenharmony_ci * This is protected by &drm_mode_config.connection_mutex. Note that 14788c2ecf20Sopenharmony_ci * nonblocking atomic commits access the current connector state without 14798c2ecf20Sopenharmony_ci * taking locks. Either by going through the &struct drm_atomic_state 14808c2ecf20Sopenharmony_ci * pointers, see for_each_oldnew_connector_in_state(), 14818c2ecf20Sopenharmony_ci * for_each_old_connector_in_state() and 14828c2ecf20Sopenharmony_ci * for_each_new_connector_in_state(). Or through careful ordering of 14838c2ecf20Sopenharmony_ci * atomic commit operations as implemented in the atomic helpers, see 14848c2ecf20Sopenharmony_ci * &struct drm_crtc_commit. 14858c2ecf20Sopenharmony_ci */ 14868c2ecf20Sopenharmony_ci struct drm_connector_state *state; 14878c2ecf20Sopenharmony_ci 14888c2ecf20Sopenharmony_ci /* DisplayID bits. FIXME: Extract into a substruct? */ 14898c2ecf20Sopenharmony_ci 14908c2ecf20Sopenharmony_ci /** 14918c2ecf20Sopenharmony_ci * @tile_blob_ptr: 14928c2ecf20Sopenharmony_ci * 14938c2ecf20Sopenharmony_ci * DRM blob property data for the tile property (used mostly by DP MST). 14948c2ecf20Sopenharmony_ci * This is meant for screens which are driven through separate display 14958c2ecf20Sopenharmony_ci * pipelines represented by &drm_crtc, which might not be running with 14968c2ecf20Sopenharmony_ci * genlocked clocks. For tiled panels which are genlocked, like 14978c2ecf20Sopenharmony_ci * dual-link LVDS or dual-link DSI, the driver should try to not expose 14988c2ecf20Sopenharmony_ci * the tiling and virtualize both &drm_crtc and &drm_plane if needed. 14998c2ecf20Sopenharmony_ci * 15008c2ecf20Sopenharmony_ci * This should only be updated by calling 15018c2ecf20Sopenharmony_ci * drm_connector_set_tile_property(). 15028c2ecf20Sopenharmony_ci */ 15038c2ecf20Sopenharmony_ci struct drm_property_blob *tile_blob_ptr; 15048c2ecf20Sopenharmony_ci 15058c2ecf20Sopenharmony_ci /** @has_tile: is this connector connected to a tiled monitor */ 15068c2ecf20Sopenharmony_ci bool has_tile; 15078c2ecf20Sopenharmony_ci /** @tile_group: tile group for the connected monitor */ 15088c2ecf20Sopenharmony_ci struct drm_tile_group *tile_group; 15098c2ecf20Sopenharmony_ci /** @tile_is_single_monitor: whether the tile is one monitor housing */ 15108c2ecf20Sopenharmony_ci bool tile_is_single_monitor; 15118c2ecf20Sopenharmony_ci 15128c2ecf20Sopenharmony_ci /** @num_h_tile: number of horizontal tiles in the tile group */ 15138c2ecf20Sopenharmony_ci /** @num_v_tile: number of vertical tiles in the tile group */ 15148c2ecf20Sopenharmony_ci uint8_t num_h_tile, num_v_tile; 15158c2ecf20Sopenharmony_ci /** @tile_h_loc: horizontal location of this tile */ 15168c2ecf20Sopenharmony_ci /** @tile_v_loc: vertical location of this tile */ 15178c2ecf20Sopenharmony_ci uint8_t tile_h_loc, tile_v_loc; 15188c2ecf20Sopenharmony_ci /** @tile_h_size: horizontal size of this tile. */ 15198c2ecf20Sopenharmony_ci /** @tile_v_size: vertical size of this tile. */ 15208c2ecf20Sopenharmony_ci uint16_t tile_h_size, tile_v_size; 15218c2ecf20Sopenharmony_ci 15228c2ecf20Sopenharmony_ci /** 15238c2ecf20Sopenharmony_ci * @free_node: 15248c2ecf20Sopenharmony_ci * 15258c2ecf20Sopenharmony_ci * List used only by &drm_connector_list_iter to be able to clean up a 15268c2ecf20Sopenharmony_ci * connector from any context, in conjunction with 15278c2ecf20Sopenharmony_ci * &drm_mode_config.connector_free_work. 15288c2ecf20Sopenharmony_ci */ 15298c2ecf20Sopenharmony_ci struct llist_node free_node; 15308c2ecf20Sopenharmony_ci 15318c2ecf20Sopenharmony_ci /** @hdr_sink_metadata: HDR Metadata Information read from sink */ 15328c2ecf20Sopenharmony_ci struct hdr_sink_metadata hdr_sink_metadata; 15338c2ecf20Sopenharmony_ci}; 15348c2ecf20Sopenharmony_ci 15358c2ecf20Sopenharmony_ci#define obj_to_connector(x) container_of(x, struct drm_connector, base) 15368c2ecf20Sopenharmony_ci 15378c2ecf20Sopenharmony_ciint drm_connector_init(struct drm_device *dev, 15388c2ecf20Sopenharmony_ci struct drm_connector *connector, 15398c2ecf20Sopenharmony_ci const struct drm_connector_funcs *funcs, 15408c2ecf20Sopenharmony_ci int connector_type); 15418c2ecf20Sopenharmony_ciint drm_connector_init_with_ddc(struct drm_device *dev, 15428c2ecf20Sopenharmony_ci struct drm_connector *connector, 15438c2ecf20Sopenharmony_ci const struct drm_connector_funcs *funcs, 15448c2ecf20Sopenharmony_ci int connector_type, 15458c2ecf20Sopenharmony_ci struct i2c_adapter *ddc); 15468c2ecf20Sopenharmony_civoid drm_connector_attach_edid_property(struct drm_connector *connector); 15478c2ecf20Sopenharmony_ciint drm_connector_register(struct drm_connector *connector); 15488c2ecf20Sopenharmony_civoid drm_connector_unregister(struct drm_connector *connector); 15498c2ecf20Sopenharmony_ciint drm_connector_attach_encoder(struct drm_connector *connector, 15508c2ecf20Sopenharmony_ci struct drm_encoder *encoder); 15518c2ecf20Sopenharmony_ci 15528c2ecf20Sopenharmony_civoid drm_connector_cleanup(struct drm_connector *connector); 15538c2ecf20Sopenharmony_ci 15548c2ecf20Sopenharmony_cistatic inline unsigned int drm_connector_index(const struct drm_connector *connector) 15558c2ecf20Sopenharmony_ci{ 15568c2ecf20Sopenharmony_ci return connector->index; 15578c2ecf20Sopenharmony_ci} 15588c2ecf20Sopenharmony_ci 15598c2ecf20Sopenharmony_cistatic inline u32 drm_connector_mask(const struct drm_connector *connector) 15608c2ecf20Sopenharmony_ci{ 15618c2ecf20Sopenharmony_ci return 1 << connector->index; 15628c2ecf20Sopenharmony_ci} 15638c2ecf20Sopenharmony_ci 15648c2ecf20Sopenharmony_ci/** 15658c2ecf20Sopenharmony_ci * drm_connector_lookup - lookup connector object 15668c2ecf20Sopenharmony_ci * @dev: DRM device 15678c2ecf20Sopenharmony_ci * @file_priv: drm file to check for lease against. 15688c2ecf20Sopenharmony_ci * @id: connector object id 15698c2ecf20Sopenharmony_ci * 15708c2ecf20Sopenharmony_ci * This function looks up the connector object specified by id 15718c2ecf20Sopenharmony_ci * add takes a reference to it. 15728c2ecf20Sopenharmony_ci */ 15738c2ecf20Sopenharmony_cistatic inline struct drm_connector *drm_connector_lookup(struct drm_device *dev, 15748c2ecf20Sopenharmony_ci struct drm_file *file_priv, 15758c2ecf20Sopenharmony_ci uint32_t id) 15768c2ecf20Sopenharmony_ci{ 15778c2ecf20Sopenharmony_ci struct drm_mode_object *mo; 15788c2ecf20Sopenharmony_ci mo = drm_mode_object_find(dev, file_priv, id, DRM_MODE_OBJECT_CONNECTOR); 15798c2ecf20Sopenharmony_ci return mo ? obj_to_connector(mo) : NULL; 15808c2ecf20Sopenharmony_ci} 15818c2ecf20Sopenharmony_ci 15828c2ecf20Sopenharmony_ci/** 15838c2ecf20Sopenharmony_ci * drm_connector_get - acquire a connector reference 15848c2ecf20Sopenharmony_ci * @connector: DRM connector 15858c2ecf20Sopenharmony_ci * 15868c2ecf20Sopenharmony_ci * This function increments the connector's refcount. 15878c2ecf20Sopenharmony_ci */ 15888c2ecf20Sopenharmony_cistatic inline void drm_connector_get(struct drm_connector *connector) 15898c2ecf20Sopenharmony_ci{ 15908c2ecf20Sopenharmony_ci drm_mode_object_get(&connector->base); 15918c2ecf20Sopenharmony_ci} 15928c2ecf20Sopenharmony_ci 15938c2ecf20Sopenharmony_ci/** 15948c2ecf20Sopenharmony_ci * drm_connector_put - release a connector reference 15958c2ecf20Sopenharmony_ci * @connector: DRM connector 15968c2ecf20Sopenharmony_ci * 15978c2ecf20Sopenharmony_ci * This function decrements the connector's reference count and frees the 15988c2ecf20Sopenharmony_ci * object if the reference count drops to zero. 15998c2ecf20Sopenharmony_ci */ 16008c2ecf20Sopenharmony_cistatic inline void drm_connector_put(struct drm_connector *connector) 16018c2ecf20Sopenharmony_ci{ 16028c2ecf20Sopenharmony_ci drm_mode_object_put(&connector->base); 16038c2ecf20Sopenharmony_ci} 16048c2ecf20Sopenharmony_ci 16058c2ecf20Sopenharmony_ci/** 16068c2ecf20Sopenharmony_ci * drm_connector_is_unregistered - has the connector been unregistered from 16078c2ecf20Sopenharmony_ci * userspace? 16088c2ecf20Sopenharmony_ci * @connector: DRM connector 16098c2ecf20Sopenharmony_ci * 16108c2ecf20Sopenharmony_ci * Checks whether or not @connector has been unregistered from userspace. 16118c2ecf20Sopenharmony_ci * 16128c2ecf20Sopenharmony_ci * Returns: 16138c2ecf20Sopenharmony_ci * True if the connector was unregistered, false if the connector is 16148c2ecf20Sopenharmony_ci * registered or has not yet been registered with userspace. 16158c2ecf20Sopenharmony_ci */ 16168c2ecf20Sopenharmony_cistatic inline bool 16178c2ecf20Sopenharmony_cidrm_connector_is_unregistered(struct drm_connector *connector) 16188c2ecf20Sopenharmony_ci{ 16198c2ecf20Sopenharmony_ci return READ_ONCE(connector->registration_state) == 16208c2ecf20Sopenharmony_ci DRM_CONNECTOR_UNREGISTERED; 16218c2ecf20Sopenharmony_ci} 16228c2ecf20Sopenharmony_ci 16238c2ecf20Sopenharmony_civoid drm_connector_oob_hotplug_event(struct fwnode_handle *connector_fwnode); 16248c2ecf20Sopenharmony_ciconst char *drm_get_connector_type_name(unsigned int connector_type); 16258c2ecf20Sopenharmony_ciconst char *drm_get_connector_status_name(enum drm_connector_status status); 16268c2ecf20Sopenharmony_ciconst char *drm_get_subpixel_order_name(enum subpixel_order order); 16278c2ecf20Sopenharmony_ciconst char *drm_get_dpms_name(int val); 16288c2ecf20Sopenharmony_ciconst char *drm_get_dvi_i_subconnector_name(int val); 16298c2ecf20Sopenharmony_ciconst char *drm_get_dvi_i_select_name(int val); 16308c2ecf20Sopenharmony_ciconst char *drm_get_tv_subconnector_name(int val); 16318c2ecf20Sopenharmony_ciconst char *drm_get_tv_select_name(int val); 16328c2ecf20Sopenharmony_ciconst char *drm_get_dp_subconnector_name(int val); 16338c2ecf20Sopenharmony_ciconst char *drm_get_content_protection_name(int val); 16348c2ecf20Sopenharmony_ciconst char *drm_get_hdcp_content_type_name(int val); 16358c2ecf20Sopenharmony_ci 16368c2ecf20Sopenharmony_ciint drm_mode_create_dvi_i_properties(struct drm_device *dev); 16378c2ecf20Sopenharmony_civoid drm_connector_attach_dp_subconnector_property(struct drm_connector *connector); 16388c2ecf20Sopenharmony_ci 16398c2ecf20Sopenharmony_ciint drm_mode_create_tv_margin_properties(struct drm_device *dev); 16408c2ecf20Sopenharmony_ciint drm_mode_create_tv_properties(struct drm_device *dev, 16418c2ecf20Sopenharmony_ci unsigned int num_modes, 16428c2ecf20Sopenharmony_ci const char * const modes[]); 16438c2ecf20Sopenharmony_civoid drm_connector_attach_tv_margin_properties(struct drm_connector *conn); 16448c2ecf20Sopenharmony_ciint drm_mode_create_scaling_mode_property(struct drm_device *dev); 16458c2ecf20Sopenharmony_ciint drm_connector_attach_content_type_property(struct drm_connector *dev); 16468c2ecf20Sopenharmony_ciint drm_connector_attach_scaling_mode_property(struct drm_connector *connector, 16478c2ecf20Sopenharmony_ci u32 scaling_mode_mask); 16488c2ecf20Sopenharmony_ciint drm_connector_attach_vrr_capable_property( 16498c2ecf20Sopenharmony_ci struct drm_connector *connector); 16508c2ecf20Sopenharmony_ciint drm_mode_create_aspect_ratio_property(struct drm_device *dev); 16518c2ecf20Sopenharmony_ciint drm_mode_create_hdmi_colorspace_property(struct drm_connector *connector); 16528c2ecf20Sopenharmony_ciint drm_mode_create_dp_colorspace_property(struct drm_connector *connector); 16538c2ecf20Sopenharmony_ciint drm_mode_create_content_type_property(struct drm_device *dev); 16548c2ecf20Sopenharmony_civoid drm_hdmi_avi_infoframe_content_type(struct hdmi_avi_infoframe *frame, 16558c2ecf20Sopenharmony_ci const struct drm_connector_state *conn_state); 16568c2ecf20Sopenharmony_ci 16578c2ecf20Sopenharmony_ciint drm_mode_create_suggested_offset_properties(struct drm_device *dev); 16588c2ecf20Sopenharmony_ci 16598c2ecf20Sopenharmony_ciint drm_connector_set_path_property(struct drm_connector *connector, 16608c2ecf20Sopenharmony_ci const char *path); 16618c2ecf20Sopenharmony_ciint drm_connector_set_tile_property(struct drm_connector *connector); 16628c2ecf20Sopenharmony_ciint drm_connector_update_edid_property(struct drm_connector *connector, 16638c2ecf20Sopenharmony_ci const struct edid *edid); 16648c2ecf20Sopenharmony_civoid drm_connector_set_link_status_property(struct drm_connector *connector, 16658c2ecf20Sopenharmony_ci uint64_t link_status); 16668c2ecf20Sopenharmony_civoid drm_connector_set_vrr_capable_property( 16678c2ecf20Sopenharmony_ci struct drm_connector *connector, bool capable); 16688c2ecf20Sopenharmony_ciint drm_connector_set_panel_orientation( 16698c2ecf20Sopenharmony_ci struct drm_connector *connector, 16708c2ecf20Sopenharmony_ci enum drm_panel_orientation panel_orientation); 16718c2ecf20Sopenharmony_ciint drm_connector_set_panel_orientation_with_quirk( 16728c2ecf20Sopenharmony_ci struct drm_connector *connector, 16738c2ecf20Sopenharmony_ci enum drm_panel_orientation panel_orientation, 16748c2ecf20Sopenharmony_ci int width, int height); 16758c2ecf20Sopenharmony_ciint drm_connector_attach_max_bpc_property(struct drm_connector *connector, 16768c2ecf20Sopenharmony_ci int min, int max); 16778c2ecf20Sopenharmony_ci 16788c2ecf20Sopenharmony_ci/** 16798c2ecf20Sopenharmony_ci * struct drm_tile_group - Tile group metadata 16808c2ecf20Sopenharmony_ci * @refcount: reference count 16818c2ecf20Sopenharmony_ci * @dev: DRM device 16828c2ecf20Sopenharmony_ci * @id: tile group id exposed to userspace 16838c2ecf20Sopenharmony_ci * @group_data: Sink-private data identifying this group 16848c2ecf20Sopenharmony_ci * 16858c2ecf20Sopenharmony_ci * @group_data corresponds to displayid vend/prod/serial for external screens 16868c2ecf20Sopenharmony_ci * with an EDID. 16878c2ecf20Sopenharmony_ci */ 16888c2ecf20Sopenharmony_cistruct drm_tile_group { 16898c2ecf20Sopenharmony_ci struct kref refcount; 16908c2ecf20Sopenharmony_ci struct drm_device *dev; 16918c2ecf20Sopenharmony_ci int id; 16928c2ecf20Sopenharmony_ci u8 group_data[8]; 16938c2ecf20Sopenharmony_ci}; 16948c2ecf20Sopenharmony_ci 16958c2ecf20Sopenharmony_cistruct drm_tile_group *drm_mode_create_tile_group(struct drm_device *dev, 16968c2ecf20Sopenharmony_ci const char topology[8]); 16978c2ecf20Sopenharmony_cistruct drm_tile_group *drm_mode_get_tile_group(struct drm_device *dev, 16988c2ecf20Sopenharmony_ci const char topology[8]); 16998c2ecf20Sopenharmony_civoid drm_mode_put_tile_group(struct drm_device *dev, 17008c2ecf20Sopenharmony_ci struct drm_tile_group *tg); 17018c2ecf20Sopenharmony_ci 17028c2ecf20Sopenharmony_ci/** 17038c2ecf20Sopenharmony_ci * struct drm_connector_list_iter - connector_list iterator 17048c2ecf20Sopenharmony_ci * 17058c2ecf20Sopenharmony_ci * This iterator tracks state needed to be able to walk the connector_list 17068c2ecf20Sopenharmony_ci * within struct drm_mode_config. Only use together with 17078c2ecf20Sopenharmony_ci * drm_connector_list_iter_begin(), drm_connector_list_iter_end() and 17088c2ecf20Sopenharmony_ci * drm_connector_list_iter_next() respectively the convenience macro 17098c2ecf20Sopenharmony_ci * drm_for_each_connector_iter(). 17108c2ecf20Sopenharmony_ci */ 17118c2ecf20Sopenharmony_cistruct drm_connector_list_iter { 17128c2ecf20Sopenharmony_ci/* private: */ 17138c2ecf20Sopenharmony_ci struct drm_device *dev; 17148c2ecf20Sopenharmony_ci struct drm_connector *conn; 17158c2ecf20Sopenharmony_ci}; 17168c2ecf20Sopenharmony_ci 17178c2ecf20Sopenharmony_civoid drm_connector_list_iter_begin(struct drm_device *dev, 17188c2ecf20Sopenharmony_ci struct drm_connector_list_iter *iter); 17198c2ecf20Sopenharmony_cistruct drm_connector * 17208c2ecf20Sopenharmony_cidrm_connector_list_iter_next(struct drm_connector_list_iter *iter); 17218c2ecf20Sopenharmony_civoid drm_connector_list_iter_end(struct drm_connector_list_iter *iter); 17228c2ecf20Sopenharmony_ci 17238c2ecf20Sopenharmony_cibool drm_connector_has_possible_encoder(struct drm_connector *connector, 17248c2ecf20Sopenharmony_ci struct drm_encoder *encoder); 17258c2ecf20Sopenharmony_ci 17268c2ecf20Sopenharmony_ci/** 17278c2ecf20Sopenharmony_ci * drm_for_each_connector_iter - connector_list iterator macro 17288c2ecf20Sopenharmony_ci * @connector: &struct drm_connector pointer used as cursor 17298c2ecf20Sopenharmony_ci * @iter: &struct drm_connector_list_iter 17308c2ecf20Sopenharmony_ci * 17318c2ecf20Sopenharmony_ci * Note that @connector is only valid within the list body, if you want to use 17328c2ecf20Sopenharmony_ci * @connector after calling drm_connector_list_iter_end() then you need to grab 17338c2ecf20Sopenharmony_ci * your own reference first using drm_connector_get(). 17348c2ecf20Sopenharmony_ci */ 17358c2ecf20Sopenharmony_ci#define drm_for_each_connector_iter(connector, iter) \ 17368c2ecf20Sopenharmony_ci while ((connector = drm_connector_list_iter_next(iter))) 17378c2ecf20Sopenharmony_ci 17388c2ecf20Sopenharmony_ci/** 17398c2ecf20Sopenharmony_ci * drm_connector_for_each_possible_encoder - iterate connector's possible encoders 17408c2ecf20Sopenharmony_ci * @connector: &struct drm_connector pointer 17418c2ecf20Sopenharmony_ci * @encoder: &struct drm_encoder pointer used as cursor 17428c2ecf20Sopenharmony_ci */ 17438c2ecf20Sopenharmony_ci#define drm_connector_for_each_possible_encoder(connector, encoder) \ 17448c2ecf20Sopenharmony_ci drm_for_each_encoder_mask(encoder, (connector)->dev, \ 17458c2ecf20Sopenharmony_ci (connector)->possible_encoders) 17468c2ecf20Sopenharmony_ci 17478c2ecf20Sopenharmony_ci#endif 1748