LCOV - code coverage report
Current view: top level - include/drm - drm_connector.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 6 0.0 %
Date: 2022-12-09 01:23:36 Functions: 0 0 -

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2016 Intel Corporation
       3             :  *
       4             :  * Permission to use, copy, modify, distribute, and sell this software and its
       5             :  * documentation for any purpose is hereby granted without fee, provided that
       6             :  * the above copyright notice appear in all copies and that both that copyright
       7             :  * notice and this permission notice appear in supporting documentation, and
       8             :  * that the name of the copyright holders not be used in advertising or
       9             :  * publicity pertaining to distribution of the software without specific,
      10             :  * written prior permission.  The copyright holders make no representations
      11             :  * about the suitability of this software for any purpose.  It is provided "as
      12             :  * is" without express or implied warranty.
      13             :  *
      14             :  * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
      15             :  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
      16             :  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
      17             :  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
      18             :  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
      19             :  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
      20             :  * OF THIS SOFTWARE.
      21             :  */
      22             : 
      23             : #ifndef __DRM_CONNECTOR_H__
      24             : #define __DRM_CONNECTOR_H__
      25             : 
      26             : #include <linux/list.h>
      27             : #include <linux/llist.h>
      28             : #include <linux/ctype.h>
      29             : #include <linux/hdmi.h>
      30             : #include <linux/notifier.h>
      31             : #include <drm/drm_mode_object.h>
      32             : #include <drm/drm_util.h>
      33             : 
      34             : #include <uapi/drm/drm_mode.h>
      35             : 
      36             : struct drm_connector_helper_funcs;
      37             : struct drm_modeset_acquire_ctx;
      38             : struct drm_device;
      39             : struct drm_crtc;
      40             : struct drm_encoder;
      41             : struct drm_property;
      42             : struct drm_property_blob;
      43             : struct drm_printer;
      44             : struct drm_privacy_screen;
      45             : struct edid;
      46             : struct i2c_adapter;
      47             : 
      48             : enum drm_connector_force {
      49             :         DRM_FORCE_UNSPECIFIED,
      50             :         DRM_FORCE_OFF,
      51             :         DRM_FORCE_ON,         /* force on analog part normally */
      52             :         DRM_FORCE_ON_DIGITAL, /* for DVI-I use digital connector */
      53             : };
      54             : 
      55             : /**
      56             :  * enum drm_connector_status - status for a &drm_connector
      57             :  *
      58             :  * This enum is used to track the connector status. There are no separate
      59             :  * #defines for the uapi!
      60             :  */
      61             : enum drm_connector_status {
      62             :         /**
      63             :          * @connector_status_connected: The connector is definitely connected to
      64             :          * a sink device, and can be enabled.
      65             :          */
      66             :         connector_status_connected = 1,
      67             :         /**
      68             :          * @connector_status_disconnected: The connector isn't connected to a
      69             :          * sink device which can be autodetect. For digital outputs like DP or
      70             :          * HDMI (which can be realiable probed) this means there's really
      71             :          * nothing there. It is driver-dependent whether a connector with this
      72             :          * status can be lit up or not.
      73             :          */
      74             :         connector_status_disconnected = 2,
      75             :         /**
      76             :          * @connector_status_unknown: The connector's status could not be
      77             :          * reliably detected. This happens when probing would either cause
      78             :          * flicker (like load-detection when the connector is in use), or when a
      79             :          * hardware resource isn't available (like when load-detection needs a
      80             :          * free CRTC). It should be possible to light up the connector with one
      81             :          * of the listed fallback modes. For default configuration userspace
      82             :          * should only try to light up connectors with unknown status when
      83             :          * there's not connector with @connector_status_connected.
      84             :          */
      85             :         connector_status_unknown = 3,
      86             : };
      87             : 
      88             : /**
      89             :  * enum drm_connector_registration_state - userspace registration status for
      90             :  * a &drm_connector
      91             :  *
      92             :  * This enum is used to track the status of initializing a connector and
      93             :  * registering it with userspace, so that DRM can prevent bogus modesets on
      94             :  * connectors that no longer exist.
      95             :  */
      96             : enum drm_connector_registration_state {
      97             :         /**
      98             :          * @DRM_CONNECTOR_INITIALIZING: The connector has just been created,
      99             :          * but has yet to be exposed to userspace. There should be no
     100             :          * additional restrictions to how the state of this connector may be
     101             :          * modified.
     102             :          */
     103             :         DRM_CONNECTOR_INITIALIZING = 0,
     104             : 
     105             :         /**
     106             :          * @DRM_CONNECTOR_REGISTERED: The connector has been fully initialized
     107             :          * and registered with sysfs, as such it has been exposed to
     108             :          * userspace. There should be no additional restrictions to how the
     109             :          * state of this connector may be modified.
     110             :          */
     111             :         DRM_CONNECTOR_REGISTERED = 1,
     112             : 
     113             :         /**
     114             :          * @DRM_CONNECTOR_UNREGISTERED: The connector has either been exposed
     115             :          * to userspace and has since been unregistered and removed from
     116             :          * userspace, or the connector was unregistered before it had a chance
     117             :          * to be exposed to userspace (e.g. still in the
     118             :          * @DRM_CONNECTOR_INITIALIZING state). When a connector is
     119             :          * unregistered, there are additional restrictions to how its state
     120             :          * may be modified:
     121             :          *
     122             :          * - An unregistered connector may only have its DPMS changed from
     123             :          *   On->Off. Once DPMS is changed to Off, it may not be switched back
     124             :          *   to On.
     125             :          * - Modesets are not allowed on unregistered connectors, unless they
     126             :          *   would result in disabling its assigned CRTCs. This means
     127             :          *   disabling a CRTC on an unregistered connector is OK, but enabling
     128             :          *   one is not.
     129             :          * - Removing a CRTC from an unregistered connector is OK, but new
     130             :          *   CRTCs may never be assigned to an unregistered connector.
     131             :          */
     132             :         DRM_CONNECTOR_UNREGISTERED = 2,
     133             : };
     134             : 
     135             : enum subpixel_order {
     136             :         SubPixelUnknown = 0,
     137             :         SubPixelHorizontalRGB,
     138             :         SubPixelHorizontalBGR,
     139             :         SubPixelVerticalRGB,
     140             :         SubPixelVerticalBGR,
     141             :         SubPixelNone,
     142             : 
     143             : };
     144             : 
     145             : /**
     146             :  * struct drm_scrambling: sink's scrambling support.
     147             :  */
     148             : struct drm_scrambling {
     149             :         /**
     150             :          * @supported: scrambling supported for rates > 340 Mhz.
     151             :          */
     152             :         bool supported;
     153             :         /**
     154             :          * @low_rates: scrambling supported for rates <= 340 Mhz.
     155             :          */
     156             :         bool low_rates;
     157             : };
     158             : 
     159             : /*
     160             :  * struct drm_scdc - Information about scdc capabilities of a HDMI 2.0 sink
     161             :  *
     162             :  * Provides SCDC register support and capabilities related information on a
     163             :  * HDMI 2.0 sink. In case of a HDMI 1.4 sink, all parameter must be 0.
     164             :  */
     165             : struct drm_scdc {
     166             :         /**
     167             :          * @supported: status control & data channel present.
     168             :          */
     169             :         bool supported;
     170             :         /**
     171             :          * @read_request: sink is capable of generating scdc read request.
     172             :          */
     173             :         bool read_request;
     174             :         /**
     175             :          * @scrambling: sink's scrambling capabilities
     176             :          */
     177             :         struct drm_scrambling scrambling;
     178             : };
     179             : 
     180             : /**
     181             :  * struct drm_hdmi_dsc_cap - DSC capabilities of HDMI sink
     182             :  *
     183             :  * Describes the DSC support provided by HDMI 2.1 sink.
     184             :  * The information is fetched fom additional HFVSDB blocks defined
     185             :  * for HDMI 2.1.
     186             :  */
     187             : struct drm_hdmi_dsc_cap {
     188             :         /** @v_1p2: flag for dsc1.2 version support by sink */
     189             :         bool v_1p2;
     190             : 
     191             :         /** @native_420: Does sink support DSC with 4:2:0 compression */
     192             :         bool native_420;
     193             : 
     194             :         /**
     195             :          * @all_bpp: Does sink support all bpp with 4:4:4: or 4:2:2
     196             :          * compressed formats
     197             :          */
     198             :         bool all_bpp;
     199             : 
     200             :         /**
     201             :          * @bpc_supported: compressed bpc supported by sink : 10, 12 or 16 bpc
     202             :          */
     203             :         u8 bpc_supported;
     204             : 
     205             :         /** @max_slices: maximum number of Horizontal slices supported by */
     206             :         u8 max_slices;
     207             : 
     208             :         /** @clk_per_slice : max pixel clock in MHz supported per slice */
     209             :         int clk_per_slice;
     210             : 
     211             :         /** @max_lanes : dsc max lanes supported for Fixed rate Link training */
     212             :         u8 max_lanes;
     213             : 
     214             :         /** @max_frl_rate_per_lane : maximum frl rate with DSC per lane */
     215             :         u8 max_frl_rate_per_lane;
     216             : 
     217             :         /** @total_chunk_kbytes: max size of chunks in KBs supported per line*/
     218             :         u8 total_chunk_kbytes;
     219             : };
     220             : 
     221             : /**
     222             :  * struct drm_hdmi_info - runtime information about the connected HDMI sink
     223             :  *
     224             :  * Describes if a given display supports advanced HDMI 2.0 features.
     225             :  * This information is available in CEA-861-F extension blocks (like HF-VSDB).
     226             :  */
     227             : struct drm_hdmi_info {
     228             :         /** @scdc: sink's scdc support and capabilities */
     229             :         struct drm_scdc scdc;
     230             : 
     231             :         /**
     232             :          * @y420_vdb_modes: bitmap of modes which can support ycbcr420
     233             :          * output only (not normal RGB/YCBCR444/422 outputs). The max VIC
     234             :          * defined by the CEA-861-G spec is 219, so the size is 256 bits to map
     235             :          * up to 256 VICs.
     236             :          */
     237             :         unsigned long y420_vdb_modes[BITS_TO_LONGS(256)];
     238             : 
     239             :         /**
     240             :          * @y420_cmdb_modes: bitmap of modes which can support ycbcr420
     241             :          * output also, along with normal HDMI outputs. The max VIC defined by
     242             :          * the CEA-861-G spec is 219, so the size is 256 bits to map up to 256
     243             :          * VICs.
     244             :          */
     245             :         unsigned long y420_cmdb_modes[BITS_TO_LONGS(256)];
     246             : 
     247             :         /** @y420_cmdb_map: bitmap of SVD index, to extraxt vcb modes */
     248             :         u64 y420_cmdb_map;
     249             : 
     250             :         /** @y420_dc_modes: bitmap of deep color support index */
     251             :         u8 y420_dc_modes;
     252             : 
     253             :         /** @max_frl_rate_per_lane: support fixed rate link */
     254             :         u8 max_frl_rate_per_lane;
     255             : 
     256             :         /** @max_lanes: supported by sink */
     257             :         u8 max_lanes;
     258             : 
     259             :         /** @dsc_cap: DSC capabilities of the sink */
     260             :         struct drm_hdmi_dsc_cap dsc_cap;
     261             : };
     262             : 
     263             : /**
     264             :  * enum drm_link_status - connector's link_status property value
     265             :  *
     266             :  * This enum is used as the connector's link status property value.
     267             :  * It is set to the values defined in uapi.
     268             :  *
     269             :  * @DRM_LINK_STATUS_GOOD: DP Link is Good as a result of successful
     270             :  *                        link training
     271             :  * @DRM_LINK_STATUS_BAD: DP Link is BAD as a result of link training
     272             :  *                       failure
     273             :  */
     274             : enum drm_link_status {
     275             :         DRM_LINK_STATUS_GOOD = DRM_MODE_LINK_STATUS_GOOD,
     276             :         DRM_LINK_STATUS_BAD = DRM_MODE_LINK_STATUS_BAD,
     277             : };
     278             : 
     279             : /**
     280             :  * enum drm_panel_orientation - panel_orientation info for &drm_display_info
     281             :  *
     282             :  * This enum is used to track the (LCD) panel orientation. There are no
     283             :  * separate #defines for the uapi!
     284             :  *
     285             :  * @DRM_MODE_PANEL_ORIENTATION_UNKNOWN: The drm driver has not provided any
     286             :  *                                      panel orientation information (normal
     287             :  *                                      for non panels) in this case the "panel
     288             :  *                                      orientation" connector prop will not be
     289             :  *                                      attached.
     290             :  * @DRM_MODE_PANEL_ORIENTATION_NORMAL:  The top side of the panel matches the
     291             :  *                                      top side of the device's casing.
     292             :  * @DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP: The top side of the panel matches the
     293             :  *                                      bottom side of the device's casing, iow
     294             :  *                                      the panel is mounted upside-down.
     295             :  * @DRM_MODE_PANEL_ORIENTATION_LEFT_UP: The left side of the panel matches the
     296             :  *                                      top side of the device's casing.
     297             :  * @DRM_MODE_PANEL_ORIENTATION_RIGHT_UP: The right side of the panel matches the
     298             :  *                                      top side of the device's casing.
     299             :  */
     300             : enum drm_panel_orientation {
     301             :         DRM_MODE_PANEL_ORIENTATION_UNKNOWN = -1,
     302             :         DRM_MODE_PANEL_ORIENTATION_NORMAL = 0,
     303             :         DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP,
     304             :         DRM_MODE_PANEL_ORIENTATION_LEFT_UP,
     305             :         DRM_MODE_PANEL_ORIENTATION_RIGHT_UP,
     306             : };
     307             : 
     308             : /**
     309             :  * struct drm_monitor_range_info - Panel's Monitor range in EDID for
     310             :  * &drm_display_info
     311             :  *
     312             :  * This struct is used to store a frequency range supported by panel
     313             :  * as parsed from EDID's detailed monitor range descriptor block.
     314             :  *
     315             :  * @min_vfreq: This is the min supported refresh rate in Hz from
     316             :  *             EDID's detailed monitor range.
     317             :  * @max_vfreq: This is the max supported refresh rate in Hz from
     318             :  *             EDID's detailed monitor range
     319             :  */
     320             : struct drm_monitor_range_info {
     321             :         u8 min_vfreq;
     322             :         u8 max_vfreq;
     323             : };
     324             : 
     325             : /**
     326             :  * enum drm_privacy_screen_status - privacy screen status
     327             :  *
     328             :  * This enum is used to track and control the state of the integrated privacy
     329             :  * screen present on some display panels, via the "privacy-screen sw-state"
     330             :  * and "privacy-screen hw-state" properties. Note the _LOCKED enum values
     331             :  * are only valid for the "privacy-screen hw-state" property.
     332             :  *
     333             :  * @PRIVACY_SCREEN_DISABLED:
     334             :  *  The privacy-screen on the panel is disabled
     335             :  * @PRIVACY_SCREEN_ENABLED:
     336             :  *  The privacy-screen on the panel is enabled
     337             :  * @PRIVACY_SCREEN_DISABLED_LOCKED:
     338             :  *  The privacy-screen on the panel is disabled and locked (cannot be changed)
     339             :  * @PRIVACY_SCREEN_ENABLED_LOCKED:
     340             :  *  The privacy-screen on the panel is enabled and locked (cannot be changed)
     341             :  */
     342             : enum drm_privacy_screen_status {
     343             :         PRIVACY_SCREEN_DISABLED = 0,
     344             :         PRIVACY_SCREEN_ENABLED,
     345             :         PRIVACY_SCREEN_DISABLED_LOCKED,
     346             :         PRIVACY_SCREEN_ENABLED_LOCKED,
     347             : };
     348             : 
     349             : /*
     350             :  * This is a consolidated colorimetry list supported by HDMI and
     351             :  * DP protocol standard. The respective connectors will register
     352             :  * a property with the subset of this list (supported by that
     353             :  * respective protocol). Userspace will set the colorspace through
     354             :  * a colorspace property which will be created and exposed to
     355             :  * userspace.
     356             :  */
     357             : 
     358             : /* For Default case, driver will set the colorspace */
     359             : #define DRM_MODE_COLORIMETRY_DEFAULT                    0
     360             : /* CEA 861 Normal Colorimetry options */
     361             : #define DRM_MODE_COLORIMETRY_NO_DATA                    0
     362             : #define DRM_MODE_COLORIMETRY_SMPTE_170M_YCC             1
     363             : #define DRM_MODE_COLORIMETRY_BT709_YCC                  2
     364             : /* CEA 861 Extended Colorimetry Options */
     365             : #define DRM_MODE_COLORIMETRY_XVYCC_601                  3
     366             : #define DRM_MODE_COLORIMETRY_XVYCC_709                  4
     367             : #define DRM_MODE_COLORIMETRY_SYCC_601                   5
     368             : #define DRM_MODE_COLORIMETRY_OPYCC_601                  6
     369             : #define DRM_MODE_COLORIMETRY_OPRGB                      7
     370             : #define DRM_MODE_COLORIMETRY_BT2020_CYCC                8
     371             : #define DRM_MODE_COLORIMETRY_BT2020_RGB                 9
     372             : #define DRM_MODE_COLORIMETRY_BT2020_YCC                 10
     373             : /* Additional Colorimetry extension added as part of CTA 861.G */
     374             : #define DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65             11
     375             : #define DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER         12
     376             : /* Additional Colorimetry Options added for DP 1.4a VSC Colorimetry Format */
     377             : #define DRM_MODE_COLORIMETRY_RGB_WIDE_FIXED             13
     378             : #define DRM_MODE_COLORIMETRY_RGB_WIDE_FLOAT             14
     379             : #define DRM_MODE_COLORIMETRY_BT601_YCC                  15
     380             : 
     381             : /**
     382             :  * enum drm_bus_flags - bus_flags info for &drm_display_info
     383             :  *
     384             :  * This enum defines signal polarities and clock edge information for signals on
     385             :  * a bus as bitmask flags.
     386             :  *
     387             :  * The clock edge information is conveyed by two sets of symbols,
     388             :  * DRM_BUS_FLAGS_*_DRIVE_\* and DRM_BUS_FLAGS_*_SAMPLE_\*. When this enum is
     389             :  * used to describe a bus from the point of view of the transmitter, the
     390             :  * \*_DRIVE_\* flags should be used. When used from the point of view of the
     391             :  * receiver, the \*_SAMPLE_\* flags should be used. The \*_DRIVE_\* and
     392             :  * \*_SAMPLE_\* flags alias each other, with the \*_SAMPLE_POSEDGE and
     393             :  * \*_SAMPLE_NEGEDGE flags being equal to \*_DRIVE_NEGEDGE and \*_DRIVE_POSEDGE
     394             :  * respectively. This simplifies code as signals are usually sampled on the
     395             :  * opposite edge of the driving edge. Transmitters and receivers may however
     396             :  * need to take other signal timings into account to convert between driving
     397             :  * and sample edges.
     398             :  */
     399             : enum drm_bus_flags {
     400             :         /**
     401             :          * @DRM_BUS_FLAG_DE_LOW:
     402             :          *
     403             :          * The Data Enable signal is active low
     404             :          */
     405             :         DRM_BUS_FLAG_DE_LOW = BIT(0),
     406             : 
     407             :         /**
     408             :          * @DRM_BUS_FLAG_DE_HIGH:
     409             :          *
     410             :          * The Data Enable signal is active high
     411             :          */
     412             :         DRM_BUS_FLAG_DE_HIGH = BIT(1),
     413             : 
     414             :         /**
     415             :          * @DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE:
     416             :          *
     417             :          * Data is driven on the rising edge of the pixel clock
     418             :          */
     419             :         DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE = BIT(2),
     420             : 
     421             :         /**
     422             :          * @DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE:
     423             :          *
     424             :          * Data is driven on the falling edge of the pixel clock
     425             :          */
     426             :         DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE = BIT(3),
     427             : 
     428             :         /**
     429             :          * @DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE:
     430             :          *
     431             :          * Data is sampled on the rising edge of the pixel clock
     432             :          */
     433             :         DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE = DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE,
     434             : 
     435             :         /**
     436             :          * @DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE:
     437             :          *
     438             :          * Data is sampled on the falling edge of the pixel clock
     439             :          */
     440             :         DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE = DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
     441             : 
     442             :         /**
     443             :          * @DRM_BUS_FLAG_DATA_MSB_TO_LSB:
     444             :          *
     445             :          * Data is transmitted MSB to LSB on the bus
     446             :          */
     447             :         DRM_BUS_FLAG_DATA_MSB_TO_LSB = BIT(4),
     448             : 
     449             :         /**
     450             :          * @DRM_BUS_FLAG_DATA_LSB_TO_MSB:
     451             :          *
     452             :          * Data is transmitted LSB to MSB on the bus
     453             :          */
     454             :         DRM_BUS_FLAG_DATA_LSB_TO_MSB = BIT(5),
     455             : 
     456             :         /**
     457             :          * @DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE:
     458             :          *
     459             :          * Sync signals are driven on the rising edge of the pixel clock
     460             :          */
     461             :         DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE = BIT(6),
     462             : 
     463             :         /**
     464             :          * @DRM_BUS_FLAG_SYNC_DRIVE_NEGEDGE:
     465             :          *
     466             :          * Sync signals are driven on the falling edge of the pixel clock
     467             :          */
     468             :         DRM_BUS_FLAG_SYNC_DRIVE_NEGEDGE = BIT(7),
     469             : 
     470             :         /**
     471             :          * @DRM_BUS_FLAG_SYNC_SAMPLE_POSEDGE:
     472             :          *
     473             :          * Sync signals are sampled on the rising edge of the pixel clock
     474             :          */
     475             :         DRM_BUS_FLAG_SYNC_SAMPLE_POSEDGE = DRM_BUS_FLAG_SYNC_DRIVE_NEGEDGE,
     476             : 
     477             :         /**
     478             :          * @DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE:
     479             :          *
     480             :          * Sync signals are sampled on the falling edge of the pixel clock
     481             :          */
     482             :         DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE = DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE,
     483             : 
     484             :         /**
     485             :          * @DRM_BUS_FLAG_SHARP_SIGNALS:
     486             :          *
     487             :          *  Set if the Sharp-specific signals (SPL, CLS, PS, REV) must be used
     488             :          */
     489             :         DRM_BUS_FLAG_SHARP_SIGNALS = BIT(8),
     490             : };
     491             : 
     492             : /**
     493             :  * struct drm_display_info - runtime data about the connected sink
     494             :  *
     495             :  * Describes a given display (e.g. CRT or flat panel) and its limitations. For
     496             :  * fixed display sinks like built-in panels there's not much difference between
     497             :  * this and &struct drm_connector. But for sinks with a real cable this
     498             :  * structure is meant to describe all the things at the other end of the cable.
     499             :  *
     500             :  * For sinks which provide an EDID this can be filled out by calling
     501             :  * drm_add_edid_modes().
     502             :  */
     503             : struct drm_display_info {
     504             :         /**
     505             :          * @width_mm: Physical width in mm.
     506             :          */
     507             :         unsigned int width_mm;
     508             : 
     509             :         /**
     510             :          * @height_mm: Physical height in mm.
     511             :          */
     512             :         unsigned int height_mm;
     513             : 
     514             :         /**
     515             :          * @bpc: Maximum bits per color channel. Used by HDMI and DP outputs.
     516             :          */
     517             :         unsigned int bpc;
     518             : 
     519             :         /**
     520             :          * @subpixel_order: Subpixel order of LCD panels.
     521             :          */
     522             :         enum subpixel_order subpixel_order;
     523             : 
     524             : #define DRM_COLOR_FORMAT_RGB444         (1<<0)
     525             : #define DRM_COLOR_FORMAT_YCBCR444       (1<<1)
     526             : #define DRM_COLOR_FORMAT_YCBCR422       (1<<2)
     527             : #define DRM_COLOR_FORMAT_YCBCR420       (1<<3)
     528             : 
     529             :         /**
     530             :          * @panel_orientation: Read only connector property for built-in panels,
     531             :          * indicating the orientation of the panel vs the device's casing.
     532             :          * drm_connector_init() sets this to DRM_MODE_PANEL_ORIENTATION_UNKNOWN.
     533             :          * When not UNKNOWN this gets used by the drm_fb_helpers to rotate the
     534             :          * fb to compensate and gets exported as prop to userspace.
     535             :          */
     536             :         int panel_orientation;
     537             : 
     538             :         /**
     539             :          * @color_formats: HDMI Color formats, selects between RGB and YCrCb
     540             :          * modes. Used DRM_COLOR_FORMAT\_ defines, which are _not_ the same ones
     541             :          * as used to describe the pixel format in framebuffers, and also don't
     542             :          * match the formats in @bus_formats which are shared with v4l.
     543             :          */
     544             :         u32 color_formats;
     545             : 
     546             :         /**
     547             :          * @bus_formats: Pixel data format on the wire, somewhat redundant with
     548             :          * @color_formats. Array of size @num_bus_formats encoded using
     549             :          * MEDIA_BUS_FMT\_ defines shared with v4l and media drivers.
     550             :          */
     551             :         const u32 *bus_formats;
     552             :         /**
     553             :          * @num_bus_formats: Size of @bus_formats array.
     554             :          */
     555             :         unsigned int num_bus_formats;
     556             : 
     557             :         /**
     558             :          * @bus_flags: Additional information (like pixel signal polarity) for
     559             :          * the pixel data on the bus, using &enum drm_bus_flags values
     560             :          * DRM_BUS_FLAGS\_.
     561             :          */
     562             :         u32 bus_flags;
     563             : 
     564             :         /**
     565             :          * @max_tmds_clock: Maximum TMDS clock rate supported by the
     566             :          * sink in kHz. 0 means undefined.
     567             :          */
     568             :         int max_tmds_clock;
     569             : 
     570             :         /**
     571             :          * @dvi_dual: Dual-link DVI sink?
     572             :          */
     573             :         bool dvi_dual;
     574             : 
     575             :         /**
     576             :          * @is_hdmi: True if the sink is an HDMI device.
     577             :          *
     578             :          * This field shall be used instead of calling
     579             :          * drm_detect_hdmi_monitor() when possible.
     580             :          */
     581             :         bool is_hdmi;
     582             : 
     583             :         /**
     584             :          * @has_hdmi_infoframe: Does the sink support the HDMI infoframe?
     585             :          */
     586             :         bool has_hdmi_infoframe;
     587             : 
     588             :         /**
     589             :          * @rgb_quant_range_selectable: Does the sink support selecting
     590             :          * the RGB quantization range?
     591             :          */
     592             :         bool rgb_quant_range_selectable;
     593             : 
     594             :         /**
     595             :          * @edid_hdmi_rgb444_dc_modes: Mask of supported hdmi deep color modes
     596             :          * in RGB 4:4:4. Even more stuff redundant with @bus_formats.
     597             :          */
     598             :         u8 edid_hdmi_rgb444_dc_modes;
     599             : 
     600             :         /**
     601             :          * @edid_hdmi_ycbcr444_dc_modes: Mask of supported hdmi deep color
     602             :          * modes in YCbCr 4:4:4. Even more stuff redundant with @bus_formats.
     603             :          */
     604             :         u8 edid_hdmi_ycbcr444_dc_modes;
     605             : 
     606             :         /**
     607             :          * @cea_rev: CEA revision of the HDMI sink.
     608             :          */
     609             :         u8 cea_rev;
     610             : 
     611             :         /**
     612             :          * @hdmi: advance features of a HDMI sink.
     613             :          */
     614             :         struct drm_hdmi_info hdmi;
     615             : 
     616             :         /**
     617             :          * @non_desktop: Non desktop display (HMD).
     618             :          */
     619             :         bool non_desktop;
     620             : 
     621             :         /**
     622             :          * @monitor_range: Frequency range supported by monitor range descriptor
     623             :          */
     624             :         struct drm_monitor_range_info monitor_range;
     625             : 
     626             :         /**
     627             :          * @mso_stream_count: eDP Multi-SST Operation (MSO) stream count from
     628             :          * the DisplayID VESA vendor block. 0 for conventional Single-Stream
     629             :          * Transport (SST), or 2 or 4 MSO streams.
     630             :          */
     631             :         u8 mso_stream_count;
     632             : 
     633             :         /**
     634             :          * @mso_pixel_overlap: eDP MSO segment pixel overlap, 0-8 pixels.
     635             :          */
     636             :         u8 mso_pixel_overlap;
     637             : };
     638             : 
     639             : int drm_display_info_set_bus_formats(struct drm_display_info *info,
     640             :                                      const u32 *formats,
     641             :                                      unsigned int num_formats);
     642             : 
     643             : /**
     644             :  * struct drm_connector_tv_margins - TV connector related margins
     645             :  *
     646             :  * Describes the margins in pixels to put around the image on TV
     647             :  * connectors to deal with overscan.
     648             :  */
     649             : struct drm_connector_tv_margins {
     650             :         /**
     651             :          * @bottom: Bottom margin in pixels.
     652             :          */
     653             :         unsigned int bottom;
     654             : 
     655             :         /**
     656             :          * @left: Left margin in pixels.
     657             :          */
     658             :         unsigned int left;
     659             : 
     660             :         /**
     661             :          * @right: Right margin in pixels.
     662             :          */
     663             :         unsigned int right;
     664             : 
     665             :         /**
     666             :          * @top: Top margin in pixels.
     667             :          */
     668             :         unsigned int top;
     669             : };
     670             : 
     671             : /**
     672             :  * struct drm_tv_connector_state - TV connector related states
     673             :  * @subconnector: selected subconnector
     674             :  * @margins: TV margins
     675             :  * @mode: TV mode
     676             :  * @brightness: brightness in percent
     677             :  * @contrast: contrast in percent
     678             :  * @flicker_reduction: flicker reduction in percent
     679             :  * @overscan: overscan in percent
     680             :  * @saturation: saturation in percent
     681             :  * @hue: hue in percent
     682             :  */
     683             : struct drm_tv_connector_state {
     684             :         enum drm_mode_subconnector subconnector;
     685             :         struct drm_connector_tv_margins margins;
     686             :         unsigned int mode;
     687             :         unsigned int brightness;
     688             :         unsigned int contrast;
     689             :         unsigned int flicker_reduction;
     690             :         unsigned int overscan;
     691             :         unsigned int saturation;
     692             :         unsigned int hue;
     693             : };
     694             : 
     695             : /**
     696             :  * struct drm_connector_state - mutable connector state
     697             :  */
     698             : struct drm_connector_state {
     699             :         /** @connector: backpointer to the connector */
     700             :         struct drm_connector *connector;
     701             : 
     702             :         /**
     703             :          * @crtc: CRTC to connect connector to, NULL if disabled.
     704             :          *
     705             :          * Do not change this directly, use drm_atomic_set_crtc_for_connector()
     706             :          * instead.
     707             :          */
     708             :         struct drm_crtc *crtc;
     709             : 
     710             :         /**
     711             :          * @best_encoder:
     712             :          *
     713             :          * Used by the atomic helpers to select the encoder, through the
     714             :          * &drm_connector_helper_funcs.atomic_best_encoder or
     715             :          * &drm_connector_helper_funcs.best_encoder callbacks.
     716             :          *
     717             :          * This is also used in the atomic helpers to map encoders to their
     718             :          * current and previous connectors, see
     719             :          * drm_atomic_get_old_connector_for_encoder() and
     720             :          * drm_atomic_get_new_connector_for_encoder().
     721             :          *
     722             :          * NOTE: Atomic drivers must fill this out (either themselves or through
     723             :          * helpers), for otherwise the GETCONNECTOR and GETENCODER IOCTLs will
     724             :          * not return correct data to userspace.
     725             :          */
     726             :         struct drm_encoder *best_encoder;
     727             : 
     728             :         /**
     729             :          * @link_status: Connector link_status to keep track of whether link is
     730             :          * GOOD or BAD to notify userspace if retraining is necessary.
     731             :          */
     732             :         enum drm_link_status link_status;
     733             : 
     734             :         /** @state: backpointer to global drm_atomic_state */
     735             :         struct drm_atomic_state *state;
     736             : 
     737             :         /**
     738             :          * @commit: Tracks the pending commit to prevent use-after-free conditions.
     739             :          *
     740             :          * Is only set when @crtc is NULL.
     741             :          */
     742             :         struct drm_crtc_commit *commit;
     743             : 
     744             :         /** @tv: TV connector state */
     745             :         struct drm_tv_connector_state tv;
     746             : 
     747             :         /**
     748             :          * @self_refresh_aware:
     749             :          *
     750             :          * This tracks whether a connector is aware of the self refresh state.
     751             :          * It should be set to true for those connector implementations which
     752             :          * understand the self refresh state. This is needed since the crtc
     753             :          * registers the self refresh helpers and it doesn't know if the
     754             :          * connectors downstream have implemented self refresh entry/exit.
     755             :          *
     756             :          * Drivers should set this to true in atomic_check if they know how to
     757             :          * handle self_refresh requests.
     758             :          */
     759             :         bool self_refresh_aware;
     760             : 
     761             :         /**
     762             :          * @picture_aspect_ratio: Connector property to control the
     763             :          * HDMI infoframe aspect ratio setting.
     764             :          *
     765             :          * The %DRM_MODE_PICTURE_ASPECT_\* values much match the
     766             :          * values for &enum hdmi_picture_aspect
     767             :          */
     768             :         enum hdmi_picture_aspect picture_aspect_ratio;
     769             : 
     770             :         /**
     771             :          * @content_type: Connector property to control the
     772             :          * HDMI infoframe content type setting.
     773             :          * The %DRM_MODE_CONTENT_TYPE_\* values much
     774             :          * match the values.
     775             :          */
     776             :         unsigned int content_type;
     777             : 
     778             :         /**
     779             :          * @hdcp_content_type: Connector property to pass the type of
     780             :          * protected content. This is most commonly used for HDCP.
     781             :          */
     782             :         unsigned int hdcp_content_type;
     783             : 
     784             :         /**
     785             :          * @scaling_mode: Connector property to control the
     786             :          * upscaling, mostly used for built-in panels.
     787             :          */
     788             :         unsigned int scaling_mode;
     789             : 
     790             :         /**
     791             :          * @content_protection: Connector property to request content
     792             :          * protection. This is most commonly used for HDCP.
     793             :          */
     794             :         unsigned int content_protection;
     795             : 
     796             :         /**
     797             :          * @colorspace: State variable for Connector property to request
     798             :          * colorspace change on Sink. This is most commonly used to switch
     799             :          * to wider color gamuts like BT2020.
     800             :          */
     801             :         u32 colorspace;
     802             : 
     803             :         /**
     804             :          * @writeback_job: Writeback job for writeback connectors
     805             :          *
     806             :          * Holds the framebuffer and out-fence for a writeback connector. As
     807             :          * the writeback completion may be asynchronous to the normal commit
     808             :          * cycle, the writeback job lifetime is managed separately from the
     809             :          * normal atomic state by this object.
     810             :          *
     811             :          * See also: drm_writeback_queue_job() and
     812             :          * drm_writeback_signal_completion()
     813             :          */
     814             :         struct drm_writeback_job *writeback_job;
     815             : 
     816             :         /**
     817             :          * @max_requested_bpc: Connector property to limit the maximum bit
     818             :          * depth of the pixels.
     819             :          */
     820             :         u8 max_requested_bpc;
     821             : 
     822             :         /**
     823             :          * @max_bpc: Connector max_bpc based on the requested max_bpc property
     824             :          * and the connector bpc limitations obtained from edid.
     825             :          */
     826             :         u8 max_bpc;
     827             : 
     828             :         /**
     829             :          * @privacy_screen_sw_state: See :ref:`Standard Connector
     830             :          * Properties<standard_connector_properties>`
     831             :          */
     832             :         enum drm_privacy_screen_status privacy_screen_sw_state;
     833             : 
     834             :         /**
     835             :          * @hdr_output_metadata:
     836             :          * DRM blob property for HDR output metadata
     837             :          */
     838             :         struct drm_property_blob *hdr_output_metadata;
     839             : };
     840             : 
     841             : /**
     842             :  * struct drm_connector_funcs - control connectors on a given device
     843             :  *
     844             :  * Each CRTC may have one or more connectors attached to it.  The functions
     845             :  * below allow the core DRM code to control connectors, enumerate available modes,
     846             :  * etc.
     847             :  */
     848             : struct drm_connector_funcs {
     849             :         /**
     850             :          * @dpms:
     851             :          *
     852             :          * Legacy entry point to set the per-connector DPMS state. Legacy DPMS
     853             :          * is exposed as a standard property on the connector, but diverted to
     854             :          * this callback in the drm core. Note that atomic drivers don't
     855             :          * implement the 4 level DPMS support on the connector any more, but
     856             :          * instead only have an on/off "ACTIVE" property on the CRTC object.
     857             :          *
     858             :          * This hook is not used by atomic drivers, remapping of the legacy DPMS
     859             :          * property is entirely handled in the DRM core.
     860             :          *
     861             :          * RETURNS:
     862             :          *
     863             :          * 0 on success or a negative error code on failure.
     864             :          */
     865             :         int (*dpms)(struct drm_connector *connector, int mode);
     866             : 
     867             :         /**
     868             :          * @reset:
     869             :          *
     870             :          * Reset connector hardware and software state to off. This function isn't
     871             :          * called by the core directly, only through drm_mode_config_reset().
     872             :          * It's not a helper hook only for historical reasons.
     873             :          *
     874             :          * Atomic drivers can use drm_atomic_helper_connector_reset() to reset
     875             :          * atomic state using this hook.
     876             :          */
     877             :         void (*reset)(struct drm_connector *connector);
     878             : 
     879             :         /**
     880             :          * @detect:
     881             :          *
     882             :          * Check to see if anything is attached to the connector. The parameter
     883             :          * force is set to false whilst polling, true when checking the
     884             :          * connector due to a user request. force can be used by the driver to
     885             :          * avoid expensive, destructive operations during automated probing.
     886             :          *
     887             :          * This callback is optional, if not implemented the connector will be
     888             :          * considered as always being attached.
     889             :          *
     890             :          * FIXME:
     891             :          *
     892             :          * Note that this hook is only called by the probe helper. It's not in
     893             :          * the helper library vtable purely for historical reasons. The only DRM
     894             :          * core entry point to probe connector state is @fill_modes.
     895             :          *
     896             :          * Note that the helper library will already hold
     897             :          * &drm_mode_config.connection_mutex. Drivers which need to grab additional
     898             :          * locks to avoid races with concurrent modeset changes need to use
     899             :          * &drm_connector_helper_funcs.detect_ctx instead.
     900             :          *
     901             :          * Also note that this callback can be called no matter the
     902             :          * state the connector is in. Drivers that need the underlying
     903             :          * device to be powered to perform the detection will first need
     904             :          * to make sure it's been properly enabled.
     905             :          *
     906             :          * RETURNS:
     907             :          *
     908             :          * drm_connector_status indicating the connector's status.
     909             :          */
     910             :         enum drm_connector_status (*detect)(struct drm_connector *connector,
     911             :                                             bool force);
     912             : 
     913             :         /**
     914             :          * @force:
     915             :          *
     916             :          * This function is called to update internal encoder state when the
     917             :          * connector is forced to a certain state by userspace, either through
     918             :          * the sysfs interfaces or on the kernel cmdline. In that case the
     919             :          * @detect callback isn't called.
     920             :          *
     921             :          * FIXME:
     922             :          *
     923             :          * Note that this hook is only called by the probe helper. It's not in
     924             :          * the helper library vtable purely for historical reasons. The only DRM
     925             :          * core entry point to probe connector state is @fill_modes.
     926             :          */
     927             :         void (*force)(struct drm_connector *connector);
     928             : 
     929             :         /**
     930             :          * @fill_modes:
     931             :          *
     932             :          * Entry point for output detection and basic mode validation. The
     933             :          * driver should reprobe the output if needed (e.g. when hotplug
     934             :          * handling is unreliable), add all detected modes to &drm_connector.modes
     935             :          * and filter out any the device can't support in any configuration. It
     936             :          * also needs to filter out any modes wider or higher than the
     937             :          * parameters max_width and max_height indicate.
     938             :          *
     939             :          * The drivers must also prune any modes no longer valid from
     940             :          * &drm_connector.modes. Furthermore it must update
     941             :          * &drm_connector.status and &drm_connector.edid.  If no EDID has been
     942             :          * received for this output connector->edid must be NULL.
     943             :          *
     944             :          * Drivers using the probe helpers should use
     945             :          * drm_helper_probe_single_connector_modes() to implement this
     946             :          * function.
     947             :          *
     948             :          * RETURNS:
     949             :          *
     950             :          * The number of modes detected and filled into &drm_connector.modes.
     951             :          */
     952             :         int (*fill_modes)(struct drm_connector *connector, uint32_t max_width, uint32_t max_height);
     953             : 
     954             :         /**
     955             :          * @set_property:
     956             :          *
     957             :          * This is the legacy entry point to update a property attached to the
     958             :          * connector.
     959             :          *
     960             :          * This callback is optional if the driver does not support any legacy
     961             :          * driver-private properties. For atomic drivers it is not used because
     962             :          * property handling is done entirely in the DRM core.
     963             :          *
     964             :          * RETURNS:
     965             :          *
     966             :          * 0 on success or a negative error code on failure.
     967             :          */
     968             :         int (*set_property)(struct drm_connector *connector, struct drm_property *property,
     969             :                              uint64_t val);
     970             : 
     971             :         /**
     972             :          * @late_register:
     973             :          *
     974             :          * This optional hook can be used to register additional userspace
     975             :          * interfaces attached to the connector, light backlight control, i2c,
     976             :          * DP aux or similar interfaces. It is called late in the driver load
     977             :          * sequence from drm_connector_register() when registering all the
     978             :          * core drm connector interfaces. Everything added from this callback
     979             :          * should be unregistered in the early_unregister callback.
     980             :          *
     981             :          * This is called while holding &drm_connector.mutex.
     982             :          *
     983             :          * Returns:
     984             :          *
     985             :          * 0 on success, or a negative error code on failure.
     986             :          */
     987             :         int (*late_register)(struct drm_connector *connector);
     988             : 
     989             :         /**
     990             :          * @early_unregister:
     991             :          *
     992             :          * This optional hook should be used to unregister the additional
     993             :          * userspace interfaces attached to the connector from
     994             :          * late_register(). It is called from drm_connector_unregister(),
     995             :          * early in the driver unload sequence to disable userspace access
     996             :          * before data structures are torndown.
     997             :          *
     998             :          * This is called while holding &drm_connector.mutex.
     999             :          */
    1000             :         void (*early_unregister)(struct drm_connector *connector);
    1001             : 
    1002             :         /**
    1003             :          * @destroy:
    1004             :          *
    1005             :          * Clean up connector resources. This is called at driver unload time
    1006             :          * through drm_mode_config_cleanup(). It can also be called at runtime
    1007             :          * when a connector is being hot-unplugged for drivers that support
    1008             :          * connector hotplugging (e.g. DisplayPort MST).
    1009             :          */
    1010             :         void (*destroy)(struct drm_connector *connector);
    1011             : 
    1012             :         /**
    1013             :          * @atomic_duplicate_state:
    1014             :          *
    1015             :          * Duplicate the current atomic state for this connector and return it.
    1016             :          * The core and helpers guarantee that any atomic state duplicated with
    1017             :          * this hook and still owned by the caller (i.e. not transferred to the
    1018             :          * driver by calling &drm_mode_config_funcs.atomic_commit) will be
    1019             :          * cleaned up by calling the @atomic_destroy_state hook in this
    1020             :          * structure.
    1021             :          *
    1022             :          * This callback is mandatory for atomic drivers.
    1023             :          *
    1024             :          * Atomic drivers which don't subclass &struct drm_connector_state should use
    1025             :          * drm_atomic_helper_connector_duplicate_state(). Drivers that subclass the
    1026             :          * state structure to extend it with driver-private state should use
    1027             :          * __drm_atomic_helper_connector_duplicate_state() to make sure shared state is
    1028             :          * duplicated in a consistent fashion across drivers.
    1029             :          *
    1030             :          * It is an error to call this hook before &drm_connector.state has been
    1031             :          * initialized correctly.
    1032             :          *
    1033             :          * NOTE:
    1034             :          *
    1035             :          * If the duplicate state references refcounted resources this hook must
    1036             :          * acquire a reference for each of them. The driver must release these
    1037             :          * references again in @atomic_destroy_state.
    1038             :          *
    1039             :          * RETURNS:
    1040             :          *
    1041             :          * Duplicated atomic state or NULL when the allocation failed.
    1042             :          */
    1043             :         struct drm_connector_state *(*atomic_duplicate_state)(struct drm_connector *connector);
    1044             : 
    1045             :         /**
    1046             :          * @atomic_destroy_state:
    1047             :          *
    1048             :          * Destroy a state duplicated with @atomic_duplicate_state and release
    1049             :          * or unreference all resources it references
    1050             :          *
    1051             :          * This callback is mandatory for atomic drivers.
    1052             :          */
    1053             :         void (*atomic_destroy_state)(struct drm_connector *connector,
    1054             :                                      struct drm_connector_state *state);
    1055             : 
    1056             :         /**
    1057             :          * @atomic_set_property:
    1058             :          *
    1059             :          * Decode a driver-private property value and store the decoded value
    1060             :          * into the passed-in state structure. Since the atomic core decodes all
    1061             :          * standardized properties (even for extensions beyond the core set of
    1062             :          * properties which might not be implemented by all drivers) this
    1063             :          * requires drivers to subclass the state structure.
    1064             :          *
    1065             :          * Such driver-private properties should really only be implemented for
    1066             :          * truly hardware/vendor specific state. Instead it is preferred to
    1067             :          * standardize atomic extension and decode the properties used to expose
    1068             :          * such an extension in the core.
    1069             :          *
    1070             :          * Do not call this function directly, use
    1071             :          * drm_atomic_connector_set_property() instead.
    1072             :          *
    1073             :          * This callback is optional if the driver does not support any
    1074             :          * driver-private atomic properties.
    1075             :          *
    1076             :          * NOTE:
    1077             :          *
    1078             :          * This function is called in the state assembly phase of atomic
    1079             :          * modesets, which can be aborted for any reason (including on
    1080             :          * userspace's request to just check whether a configuration would be
    1081             :          * possible). Drivers MUST NOT touch any persistent state (hardware or
    1082             :          * software) or data structures except the passed in @state parameter.
    1083             :          *
    1084             :          * Also since userspace controls in which order properties are set this
    1085             :          * function must not do any input validation (since the state update is
    1086             :          * incomplete and hence likely inconsistent). Instead any such input
    1087             :          * validation must be done in the various atomic_check callbacks.
    1088             :          *
    1089             :          * RETURNS:
    1090             :          *
    1091             :          * 0 if the property has been found, -EINVAL if the property isn't
    1092             :          * implemented by the driver (which shouldn't ever happen, the core only
    1093             :          * asks for properties attached to this connector). No other validation
    1094             :          * is allowed by the driver. The core already checks that the property
    1095             :          * value is within the range (integer, valid enum value, ...) the driver
    1096             :          * set when registering the property.
    1097             :          */
    1098             :         int (*atomic_set_property)(struct drm_connector *connector,
    1099             :                                    struct drm_connector_state *state,
    1100             :                                    struct drm_property *property,
    1101             :                                    uint64_t val);
    1102             : 
    1103             :         /**
    1104             :          * @atomic_get_property:
    1105             :          *
    1106             :          * Reads out the decoded driver-private property. This is used to
    1107             :          * implement the GETCONNECTOR IOCTL.
    1108             :          *
    1109             :          * Do not call this function directly, use
    1110             :          * drm_atomic_connector_get_property() instead.
    1111             :          *
    1112             :          * This callback is optional if the driver does not support any
    1113             :          * driver-private atomic properties.
    1114             :          *
    1115             :          * RETURNS:
    1116             :          *
    1117             :          * 0 on success, -EINVAL if the property isn't implemented by the
    1118             :          * driver (which shouldn't ever happen, the core only asks for
    1119             :          * properties attached to this connector).
    1120             :          */
    1121             :         int (*atomic_get_property)(struct drm_connector *connector,
    1122             :                                    const struct drm_connector_state *state,
    1123             :                                    struct drm_property *property,
    1124             :                                    uint64_t *val);
    1125             : 
    1126             :         /**
    1127             :          * @atomic_print_state:
    1128             :          *
    1129             :          * If driver subclasses &struct drm_connector_state, it should implement
    1130             :          * this optional hook for printing additional driver specific state.
    1131             :          *
    1132             :          * Do not call this directly, use drm_atomic_connector_print_state()
    1133             :          * instead.
    1134             :          */
    1135             :         void (*atomic_print_state)(struct drm_printer *p,
    1136             :                                    const struct drm_connector_state *state);
    1137             : 
    1138             :         /**
    1139             :          * @oob_hotplug_event:
    1140             :          *
    1141             :          * This will get called when a hotplug-event for a drm-connector
    1142             :          * has been received from a source outside the display driver / device.
    1143             :          */
    1144             :         void (*oob_hotplug_event)(struct drm_connector *connector);
    1145             : 
    1146             :         /**
    1147             :          * @debugfs_init:
    1148             :          *
    1149             :          * Allows connectors to create connector-specific debugfs files.
    1150             :          */
    1151             :         void (*debugfs_init)(struct drm_connector *connector, struct dentry *root);
    1152             : };
    1153             : 
    1154             : /**
    1155             :  * struct drm_cmdline_mode - DRM Mode passed through the kernel command-line
    1156             :  *
    1157             :  * Each connector can have an initial mode with additional options
    1158             :  * passed through the kernel command line. This structure allows to
    1159             :  * express those parameters and will be filled by the command-line
    1160             :  * parser.
    1161             :  */
    1162             : struct drm_cmdline_mode {
    1163             :         /**
    1164             :          * @name:
    1165             :          *
    1166             :          * Name of the mode.
    1167             :          */
    1168             :         char name[DRM_DISPLAY_MODE_LEN];
    1169             : 
    1170             :         /**
    1171             :          * @specified:
    1172             :          *
    1173             :          * Has a mode been read from the command-line?
    1174             :          */
    1175             :         bool specified;
    1176             : 
    1177             :         /**
    1178             :          * @refresh_specified:
    1179             :          *
    1180             :          * Did the mode have a preferred refresh rate?
    1181             :          */
    1182             :         bool refresh_specified;
    1183             : 
    1184             :         /**
    1185             :          * @bpp_specified:
    1186             :          *
    1187             :          * Did the mode have a preferred BPP?
    1188             :          */
    1189             :         bool bpp_specified;
    1190             : 
    1191             :         /**
    1192             :          * @xres:
    1193             :          *
    1194             :          * Active resolution on the X axis, in pixels.
    1195             :          */
    1196             :         int xres;
    1197             : 
    1198             :         /**
    1199             :          * @yres:
    1200             :          *
    1201             :          * Active resolution on the Y axis, in pixels.
    1202             :          */
    1203             :         int yres;
    1204             : 
    1205             :         /**
    1206             :          * @bpp:
    1207             :          *
    1208             :          * Bits per pixels for the mode.
    1209             :          */
    1210             :         int bpp;
    1211             : 
    1212             :         /**
    1213             :          * @refresh:
    1214             :          *
    1215             :          * Refresh rate, in Hertz.
    1216             :          */
    1217             :         int refresh;
    1218             : 
    1219             :         /**
    1220             :          * @rb:
    1221             :          *
    1222             :          * Do we need to use reduced blanking?
    1223             :          */
    1224             :         bool rb;
    1225             : 
    1226             :         /**
    1227             :          * @interlace:
    1228             :          *
    1229             :          * The mode is interlaced.
    1230             :          */
    1231             :         bool interlace;
    1232             : 
    1233             :         /**
    1234             :          * @cvt:
    1235             :          *
    1236             :          * The timings will be calculated using the VESA Coordinated
    1237             :          * Video Timings instead of looking up the mode from a table.
    1238             :          */
    1239             :         bool cvt;
    1240             : 
    1241             :         /**
    1242             :          * @margins:
    1243             :          *
    1244             :          * Add margins to the mode calculation (1.8% of xres rounded
    1245             :          * down to 8 pixels and 1.8% of yres).
    1246             :          */
    1247             :         bool margins;
    1248             : 
    1249             :         /**
    1250             :          * @force:
    1251             :          *
    1252             :          * Ignore the hotplug state of the connector, and force its
    1253             :          * state to one of the DRM_FORCE_* values.
    1254             :          */
    1255             :         enum drm_connector_force force;
    1256             : 
    1257             :         /**
    1258             :          * @rotation_reflection:
    1259             :          *
    1260             :          * Initial rotation and reflection of the mode setup from the
    1261             :          * command line. See DRM_MODE_ROTATE_* and
    1262             :          * DRM_MODE_REFLECT_*. The only rotations supported are
    1263             :          * DRM_MODE_ROTATE_0 and DRM_MODE_ROTATE_180.
    1264             :          */
    1265             :         unsigned int rotation_reflection;
    1266             : 
    1267             :         /**
    1268             :          * @panel_orientation:
    1269             :          *
    1270             :          * drm-connector "panel orientation" property override value,
    1271             :          * DRM_MODE_PANEL_ORIENTATION_UNKNOWN if not set.
    1272             :          */
    1273             :         enum drm_panel_orientation panel_orientation;
    1274             : 
    1275             :         /**
    1276             :          * @tv_margins: TV margins to apply to the mode.
    1277             :          */
    1278             :         struct drm_connector_tv_margins tv_margins;
    1279             : };
    1280             : 
    1281             : /**
    1282             :  * struct drm_connector - central DRM connector control structure
    1283             :  *
    1284             :  * Each connector may be connected to one or more CRTCs, or may be clonable by
    1285             :  * another connector if they can share a CRTC.  Each connector also has a specific
    1286             :  * position in the broader display (referred to as a 'screen' though it could
    1287             :  * span multiple monitors).
    1288             :  */
    1289             : struct drm_connector {
    1290             :         /** @dev: parent DRM device */
    1291             :         struct drm_device *dev;
    1292             :         /** @kdev: kernel device for sysfs attributes */
    1293             :         struct device *kdev;
    1294             :         /** @attr: sysfs attributes */
    1295             :         struct device_attribute *attr;
    1296             :         /**
    1297             :          * @fwnode: associated fwnode supplied by platform firmware
    1298             :          *
    1299             :          * Drivers can set this to associate a fwnode with a connector, drivers
    1300             :          * are expected to get a reference on the fwnode when setting this.
    1301             :          * drm_connector_cleanup() will call fwnode_handle_put() on this.
    1302             :          */
    1303             :         struct fwnode_handle *fwnode;
    1304             : 
    1305             :         /**
    1306             :          * @head:
    1307             :          *
    1308             :          * List of all connectors on a @dev, linked from
    1309             :          * &drm_mode_config.connector_list. Protected by
    1310             :          * &drm_mode_config.connector_list_lock, but please only use
    1311             :          * &drm_connector_list_iter to walk this list.
    1312             :          */
    1313             :         struct list_head head;
    1314             : 
    1315             :         /**
    1316             :          * @global_connector_list_entry:
    1317             :          *
    1318             :          * Connector entry in the global connector-list, used by
    1319             :          * drm_connector_find_by_fwnode().
    1320             :          */
    1321             :         struct list_head global_connector_list_entry;
    1322             : 
    1323             :         /** @base: base KMS object */
    1324             :         struct drm_mode_object base;
    1325             : 
    1326             :         /** @name: human readable name, can be overwritten by the driver */
    1327             :         char *name;
    1328             : 
    1329             :         /**
    1330             :          * @mutex: Lock for general connector state, but currently only protects
    1331             :          * @registered. Most of the connector state is still protected by
    1332             :          * &drm_mode_config.mutex.
    1333             :          */
    1334             :         struct mutex mutex;
    1335             : 
    1336             :         /**
    1337             :          * @index: Compacted connector index, which matches the position inside
    1338             :          * the mode_config.list for drivers not supporting hot-add/removing. Can
    1339             :          * be used as an array index. It is invariant over the lifetime of the
    1340             :          * connector.
    1341             :          */
    1342             :         unsigned index;
    1343             : 
    1344             :         /**
    1345             :          * @connector_type:
    1346             :          * one of the DRM_MODE_CONNECTOR_<foo> types from drm_mode.h
    1347             :          */
    1348             :         int connector_type;
    1349             :         /** @connector_type_id: index into connector type enum */
    1350             :         int connector_type_id;
    1351             :         /**
    1352             :          * @interlace_allowed:
    1353             :          * Can this connector handle interlaced modes? Only used by
    1354             :          * drm_helper_probe_single_connector_modes() for mode filtering.
    1355             :          */
    1356             :         bool interlace_allowed;
    1357             :         /**
    1358             :          * @doublescan_allowed:
    1359             :          * Can this connector handle doublescan? Only used by
    1360             :          * drm_helper_probe_single_connector_modes() for mode filtering.
    1361             :          */
    1362             :         bool doublescan_allowed;
    1363             :         /**
    1364             :          * @stereo_allowed:
    1365             :          * Can this connector handle stereo modes? Only used by
    1366             :          * drm_helper_probe_single_connector_modes() for mode filtering.
    1367             :          */
    1368             :         bool stereo_allowed;
    1369             : 
    1370             :         /**
    1371             :          * @ycbcr_420_allowed : This bool indicates if this connector is
    1372             :          * capable of handling YCBCR 420 output. While parsing the EDID
    1373             :          * blocks it's very helpful to know if the source is capable of
    1374             :          * handling YCBCR 420 outputs.
    1375             :          */
    1376             :         bool ycbcr_420_allowed;
    1377             : 
    1378             :         /**
    1379             :          * @registration_state: Is this connector initializing, exposed
    1380             :          * (registered) with userspace, or unregistered?
    1381             :          *
    1382             :          * Protected by @mutex.
    1383             :          */
    1384             :         enum drm_connector_registration_state registration_state;
    1385             : 
    1386             :         /**
    1387             :          * @modes:
    1388             :          * Modes available on this connector (from fill_modes() + user).
    1389             :          * Protected by &drm_mode_config.mutex.
    1390             :          */
    1391             :         struct list_head modes;
    1392             : 
    1393             :         /**
    1394             :          * @status:
    1395             :          * One of the drm_connector_status enums (connected, not, or unknown).
    1396             :          * Protected by &drm_mode_config.mutex.
    1397             :          */
    1398             :         enum drm_connector_status status;
    1399             : 
    1400             :         /**
    1401             :          * @probed_modes:
    1402             :          * These are modes added by probing with DDC or the BIOS, before
    1403             :          * filtering is applied. Used by the probe helpers. Protected by
    1404             :          * &drm_mode_config.mutex.
    1405             :          */
    1406             :         struct list_head probed_modes;
    1407             : 
    1408             :         /**
    1409             :          * @display_info: Display information is filled from EDID information
    1410             :          * when a display is detected. For non hot-pluggable displays such as
    1411             :          * flat panels in embedded systems, the driver should initialize the
    1412             :          * &drm_display_info.width_mm and &drm_display_info.height_mm fields
    1413             :          * with the physical size of the display.
    1414             :          *
    1415             :          * Protected by &drm_mode_config.mutex.
    1416             :          */
    1417             :         struct drm_display_info display_info;
    1418             : 
    1419             :         /** @funcs: connector control functions */
    1420             :         const struct drm_connector_funcs *funcs;
    1421             : 
    1422             :         /**
    1423             :          * @edid_blob_ptr: DRM property containing EDID if present. Protected by
    1424             :          * &drm_mode_config.mutex. This should be updated only by calling
    1425             :          * drm_connector_update_edid_property().
    1426             :          */
    1427             :         struct drm_property_blob *edid_blob_ptr;
    1428             : 
    1429             :         /** @properties: property tracking for this connector */
    1430             :         struct drm_object_properties properties;
    1431             : 
    1432             :         /**
    1433             :          * @scaling_mode_property: Optional atomic property to control the
    1434             :          * upscaling. See drm_connector_attach_content_protection_property().
    1435             :          */
    1436             :         struct drm_property *scaling_mode_property;
    1437             : 
    1438             :         /**
    1439             :          * @vrr_capable_property: Optional property to help userspace
    1440             :          * query hardware support for variable refresh rate on a connector.
    1441             :          * connector. Drivers can add the property to a connector by
    1442             :          * calling drm_connector_attach_vrr_capable_property().
    1443             :          *
    1444             :          * This should be updated only by calling
    1445             :          * drm_connector_set_vrr_capable_property().
    1446             :          */
    1447             :         struct drm_property *vrr_capable_property;
    1448             : 
    1449             :         /**
    1450             :          * @colorspace_property: Connector property to set the suitable
    1451             :          * colorspace supported by the sink.
    1452             :          */
    1453             :         struct drm_property *colorspace_property;
    1454             : 
    1455             :         /**
    1456             :          * @path_blob_ptr:
    1457             :          *
    1458             :          * DRM blob property data for the DP MST path property. This should only
    1459             :          * be updated by calling drm_connector_set_path_property().
    1460             :          */
    1461             :         struct drm_property_blob *path_blob_ptr;
    1462             : 
    1463             :         /**
    1464             :          * @max_bpc_property: Default connector property for the max bpc to be
    1465             :          * driven out of the connector.
    1466             :          */
    1467             :         struct drm_property *max_bpc_property;
    1468             : 
    1469             :         /** @privacy_screen: drm_privacy_screen for this connector, or NULL. */
    1470             :         struct drm_privacy_screen *privacy_screen;
    1471             : 
    1472             :         /** @privacy_screen_notifier: privacy-screen notifier_block */
    1473             :         struct notifier_block privacy_screen_notifier;
    1474             : 
    1475             :         /**
    1476             :          * @privacy_screen_sw_state_property: Optional atomic property for the
    1477             :          * connector to control the integrated privacy screen.
    1478             :          */
    1479             :         struct drm_property *privacy_screen_sw_state_property;
    1480             : 
    1481             :         /**
    1482             :          * @privacy_screen_hw_state_property: Optional atomic property for the
    1483             :          * connector to report the actual integrated privacy screen state.
    1484             :          */
    1485             :         struct drm_property *privacy_screen_hw_state_property;
    1486             : 
    1487             : #define DRM_CONNECTOR_POLL_HPD (1 << 0)
    1488             : #define DRM_CONNECTOR_POLL_CONNECT (1 << 1)
    1489             : #define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2)
    1490             : 
    1491             :         /**
    1492             :          * @polled:
    1493             :          *
    1494             :          * Connector polling mode, a combination of
    1495             :          *
    1496             :          * DRM_CONNECTOR_POLL_HPD
    1497             :          *     The connector generates hotplug events and doesn't need to be
    1498             :          *     periodically polled. The CONNECT and DISCONNECT flags must not
    1499             :          *     be set together with the HPD flag.
    1500             :          *
    1501             :          * DRM_CONNECTOR_POLL_CONNECT
    1502             :          *     Periodically poll the connector for connection.
    1503             :          *
    1504             :          * DRM_CONNECTOR_POLL_DISCONNECT
    1505             :          *     Periodically poll the connector for disconnection, without
    1506             :          *     causing flickering even when the connector is in use. DACs should
    1507             :          *     rarely do this without a lot of testing.
    1508             :          *
    1509             :          * Set to 0 for connectors that don't support connection status
    1510             :          * discovery.
    1511             :          */
    1512             :         uint8_t polled;
    1513             : 
    1514             :         /**
    1515             :          * @dpms: Current dpms state. For legacy drivers the
    1516             :          * &drm_connector_funcs.dpms callback must update this. For atomic
    1517             :          * drivers, this is handled by the core atomic code, and drivers must
    1518             :          * only take &drm_crtc_state.active into account.
    1519             :          */
    1520             :         int dpms;
    1521             : 
    1522             :         /** @helper_private: mid-layer private data */
    1523             :         const struct drm_connector_helper_funcs *helper_private;
    1524             : 
    1525             :         /** @cmdline_mode: mode line parsed from the kernel cmdline for this connector */
    1526             :         struct drm_cmdline_mode cmdline_mode;
    1527             :         /** @force: a DRM_FORCE_<foo> state for forced mode sets */
    1528             :         enum drm_connector_force force;
    1529             :         /** @override_edid: has the EDID been overwritten through debugfs for testing? */
    1530             :         bool override_edid;
    1531             :         /** @epoch_counter: used to detect any other changes in connector, besides status */
    1532             :         u64 epoch_counter;
    1533             : 
    1534             :         /**
    1535             :          * @possible_encoders: Bit mask of encoders that can drive this
    1536             :          * connector, drm_encoder_index() determines the index into the bitfield
    1537             :          * and the bits are set with drm_connector_attach_encoder().
    1538             :          */
    1539             :         u32 possible_encoders;
    1540             : 
    1541             :         /**
    1542             :          * @encoder: Currently bound encoder driving this connector, if any.
    1543             :          * Only really meaningful for non-atomic drivers. Atomic drivers should
    1544             :          * instead look at &drm_connector_state.best_encoder, and in case they
    1545             :          * need the CRTC driving this output, &drm_connector_state.crtc.
    1546             :          */
    1547             :         struct drm_encoder *encoder;
    1548             : 
    1549             : #define MAX_ELD_BYTES   128
    1550             :         /** @eld: EDID-like data, if present */
    1551             :         uint8_t eld[MAX_ELD_BYTES];
    1552             :         /** @latency_present: AV delay info from ELD, if found */
    1553             :         bool latency_present[2];
    1554             :         /**
    1555             :          * @video_latency: Video latency info from ELD, if found.
    1556             :          * [0]: progressive, [1]: interlaced
    1557             :          */
    1558             :         int video_latency[2];
    1559             :         /**
    1560             :          * @audio_latency: audio latency info from ELD, if found
    1561             :          * [0]: progressive, [1]: interlaced
    1562             :          */
    1563             :         int audio_latency[2];
    1564             : 
    1565             :         /**
    1566             :          * @ddc: associated ddc adapter.
    1567             :          * A connector usually has its associated ddc adapter. If a driver uses
    1568             :          * this field, then an appropriate symbolic link is created in connector
    1569             :          * sysfs directory to make it easy for the user to tell which i2c
    1570             :          * adapter is for a particular display.
    1571             :          *
    1572             :          * The field should be set by calling drm_connector_init_with_ddc().
    1573             :          */
    1574             :         struct i2c_adapter *ddc;
    1575             : 
    1576             :         /**
    1577             :          * @null_edid_counter: track sinks that give us all zeros for the EDID.
    1578             :          * Needed to workaround some HW bugs where we get all 0s
    1579             :          */
    1580             :         int null_edid_counter;
    1581             : 
    1582             :         /** @bad_edid_counter: track sinks that give us an EDID with invalid checksum */
    1583             :         unsigned bad_edid_counter;
    1584             : 
    1585             :         /**
    1586             :          * @edid_corrupt: Indicates whether the last read EDID was corrupt. Used
    1587             :          * in Displayport compliance testing - Displayport Link CTS Core 1.2
    1588             :          * rev1.1 4.2.2.6
    1589             :          */
    1590             :         bool edid_corrupt;
    1591             :         /**
    1592             :          * @real_edid_checksum: real edid checksum for corrupted edid block.
    1593             :          * Required in Displayport 1.4 compliance testing
    1594             :          * rev1.1 4.2.2.6
    1595             :          */
    1596             :         u8 real_edid_checksum;
    1597             : 
    1598             :         /** @debugfs_entry: debugfs directory for this connector */
    1599             :         struct dentry *debugfs_entry;
    1600             : 
    1601             :         /**
    1602             :          * @state:
    1603             :          *
    1604             :          * Current atomic state for this connector.
    1605             :          *
    1606             :          * This is protected by &drm_mode_config.connection_mutex. Note that
    1607             :          * nonblocking atomic commits access the current connector state without
    1608             :          * taking locks. Either by going through the &struct drm_atomic_state
    1609             :          * pointers, see for_each_oldnew_connector_in_state(),
    1610             :          * for_each_old_connector_in_state() and
    1611             :          * for_each_new_connector_in_state(). Or through careful ordering of
    1612             :          * atomic commit operations as implemented in the atomic helpers, see
    1613             :          * &struct drm_crtc_commit.
    1614             :          */
    1615             :         struct drm_connector_state *state;
    1616             : 
    1617             :         /* DisplayID bits. FIXME: Extract into a substruct? */
    1618             : 
    1619             :         /**
    1620             :          * @tile_blob_ptr:
    1621             :          *
    1622             :          * DRM blob property data for the tile property (used mostly by DP MST).
    1623             :          * This is meant for screens which are driven through separate display
    1624             :          * pipelines represented by &drm_crtc, which might not be running with
    1625             :          * genlocked clocks. For tiled panels which are genlocked, like
    1626             :          * dual-link LVDS or dual-link DSI, the driver should try to not expose
    1627             :          * the tiling and virtualize both &drm_crtc and &drm_plane if needed.
    1628             :          *
    1629             :          * This should only be updated by calling
    1630             :          * drm_connector_set_tile_property().
    1631             :          */
    1632             :         struct drm_property_blob *tile_blob_ptr;
    1633             : 
    1634             :         /** @has_tile: is this connector connected to a tiled monitor */
    1635             :         bool has_tile;
    1636             :         /** @tile_group: tile group for the connected monitor */
    1637             :         struct drm_tile_group *tile_group;
    1638             :         /** @tile_is_single_monitor: whether the tile is one monitor housing */
    1639             :         bool tile_is_single_monitor;
    1640             : 
    1641             :         /** @num_h_tile: number of horizontal tiles in the tile group */
    1642             :         /** @num_v_tile: number of vertical tiles in the tile group */
    1643             :         uint8_t num_h_tile, num_v_tile;
    1644             :         /** @tile_h_loc: horizontal location of this tile */
    1645             :         /** @tile_v_loc: vertical location of this tile */
    1646             :         uint8_t tile_h_loc, tile_v_loc;
    1647             :         /** @tile_h_size: horizontal size of this tile. */
    1648             :         /** @tile_v_size: vertical size of this tile. */
    1649             :         uint16_t tile_h_size, tile_v_size;
    1650             : 
    1651             :         /**
    1652             :          * @free_node:
    1653             :          *
    1654             :          * List used only by &drm_connector_list_iter to be able to clean up a
    1655             :          * connector from any context, in conjunction with
    1656             :          * &drm_mode_config.connector_free_work.
    1657             :          */
    1658             :         struct llist_node free_node;
    1659             : 
    1660             :         /** @hdr_sink_metadata: HDR Metadata Information read from sink */
    1661             :         struct hdr_sink_metadata hdr_sink_metadata;
    1662             : };
    1663             : 
    1664             : #define obj_to_connector(x) container_of(x, struct drm_connector, base)
    1665             : 
    1666             : int drm_connector_init(struct drm_device *dev,
    1667             :                        struct drm_connector *connector,
    1668             :                        const struct drm_connector_funcs *funcs,
    1669             :                        int connector_type);
    1670             : int drm_connector_init_with_ddc(struct drm_device *dev,
    1671             :                                 struct drm_connector *connector,
    1672             :                                 const struct drm_connector_funcs *funcs,
    1673             :                                 int connector_type,
    1674             :                                 struct i2c_adapter *ddc);
    1675             : void drm_connector_attach_edid_property(struct drm_connector *connector);
    1676             : int drm_connector_register(struct drm_connector *connector);
    1677             : void drm_connector_unregister(struct drm_connector *connector);
    1678             : int drm_connector_attach_encoder(struct drm_connector *connector,
    1679             :                                       struct drm_encoder *encoder);
    1680             : 
    1681             : void drm_connector_cleanup(struct drm_connector *connector);
    1682             : 
    1683             : static inline unsigned int drm_connector_index(const struct drm_connector *connector)
    1684             : {
    1685             :         return connector->index;
    1686             : }
    1687             : 
    1688             : static inline u32 drm_connector_mask(const struct drm_connector *connector)
    1689             : {
    1690           0 :         return 1 << connector->index;
    1691             : }
    1692             : 
    1693             : /**
    1694             :  * drm_connector_lookup - lookup connector object
    1695             :  * @dev: DRM device
    1696             :  * @file_priv: drm file to check for lease against.
    1697             :  * @id: connector object id
    1698             :  *
    1699             :  * This function looks up the connector object specified by id
    1700             :  * add takes a reference to it.
    1701             :  */
    1702             : static inline struct drm_connector *drm_connector_lookup(struct drm_device *dev,
    1703             :                 struct drm_file *file_priv,
    1704             :                 uint32_t id)
    1705             : {
    1706             :         struct drm_mode_object *mo;
    1707           0 :         mo = drm_mode_object_find(dev, file_priv, id, DRM_MODE_OBJECT_CONNECTOR);
    1708           0 :         return mo ? obj_to_connector(mo) : NULL;
    1709             : }
    1710             : 
    1711             : /**
    1712             :  * drm_connector_get - acquire a connector reference
    1713             :  * @connector: DRM connector
    1714             :  *
    1715             :  * This function increments the connector's refcount.
    1716             :  */
    1717             : static inline void drm_connector_get(struct drm_connector *connector)
    1718             : {
    1719           0 :         drm_mode_object_get(&connector->base);
    1720             : }
    1721             : 
    1722             : /**
    1723             :  * drm_connector_put - release a connector reference
    1724             :  * @connector: DRM connector
    1725             :  *
    1726             :  * This function decrements the connector's reference count and frees the
    1727             :  * object if the reference count drops to zero.
    1728             :  */
    1729             : static inline void drm_connector_put(struct drm_connector *connector)
    1730             : {
    1731           0 :         drm_mode_object_put(&connector->base);
    1732             : }
    1733             : 
    1734             : /**
    1735             :  * drm_connector_is_unregistered - has the connector been unregistered from
    1736             :  * userspace?
    1737             :  * @connector: DRM connector
    1738             :  *
    1739             :  * Checks whether or not @connector has been unregistered from userspace.
    1740             :  *
    1741             :  * Returns:
    1742             :  * True if the connector was unregistered, false if the connector is
    1743             :  * registered or has not yet been registered with userspace.
    1744             :  */
    1745             : static inline bool
    1746             : drm_connector_is_unregistered(struct drm_connector *connector)
    1747             : {
    1748           0 :         return READ_ONCE(connector->registration_state) ==
    1749             :                 DRM_CONNECTOR_UNREGISTERED;
    1750             : }
    1751             : 
    1752             : void drm_connector_oob_hotplug_event(struct fwnode_handle *connector_fwnode);
    1753             : const char *drm_get_connector_type_name(unsigned int connector_type);
    1754             : const char *drm_get_connector_status_name(enum drm_connector_status status);
    1755             : const char *drm_get_subpixel_order_name(enum subpixel_order order);
    1756             : const char *drm_get_dpms_name(int val);
    1757             : const char *drm_get_dvi_i_subconnector_name(int val);
    1758             : const char *drm_get_dvi_i_select_name(int val);
    1759             : const char *drm_get_tv_subconnector_name(int val);
    1760             : const char *drm_get_tv_select_name(int val);
    1761             : const char *drm_get_dp_subconnector_name(int val);
    1762             : const char *drm_get_content_protection_name(int val);
    1763             : const char *drm_get_hdcp_content_type_name(int val);
    1764             : 
    1765             : int drm_mode_create_dvi_i_properties(struct drm_device *dev);
    1766             : void drm_connector_attach_dp_subconnector_property(struct drm_connector *connector);
    1767             : 
    1768             : int drm_mode_create_tv_margin_properties(struct drm_device *dev);
    1769             : int drm_mode_create_tv_properties(struct drm_device *dev,
    1770             :                                   unsigned int num_modes,
    1771             :                                   const char * const modes[]);
    1772             : void drm_connector_attach_tv_margin_properties(struct drm_connector *conn);
    1773             : int drm_mode_create_scaling_mode_property(struct drm_device *dev);
    1774             : int drm_connector_attach_content_type_property(struct drm_connector *dev);
    1775             : int drm_connector_attach_scaling_mode_property(struct drm_connector *connector,
    1776             :                                                u32 scaling_mode_mask);
    1777             : int drm_connector_attach_vrr_capable_property(
    1778             :                 struct drm_connector *connector);
    1779             : int drm_connector_attach_colorspace_property(struct drm_connector *connector);
    1780             : int drm_connector_attach_hdr_output_metadata_property(struct drm_connector *connector);
    1781             : bool drm_connector_atomic_hdr_metadata_equal(struct drm_connector_state *old_state,
    1782             :                                              struct drm_connector_state *new_state);
    1783             : int drm_mode_create_aspect_ratio_property(struct drm_device *dev);
    1784             : int drm_mode_create_hdmi_colorspace_property(struct drm_connector *connector);
    1785             : int drm_mode_create_dp_colorspace_property(struct drm_connector *connector);
    1786             : int drm_mode_create_content_type_property(struct drm_device *dev);
    1787             : int drm_mode_create_suggested_offset_properties(struct drm_device *dev);
    1788             : 
    1789             : int drm_connector_set_path_property(struct drm_connector *connector,
    1790             :                                     const char *path);
    1791             : int drm_connector_set_tile_property(struct drm_connector *connector);
    1792             : int drm_connector_update_edid_property(struct drm_connector *connector,
    1793             :                                        const struct edid *edid);
    1794             : void drm_connector_set_link_status_property(struct drm_connector *connector,
    1795             :                                             uint64_t link_status);
    1796             : void drm_connector_set_vrr_capable_property(
    1797             :                 struct drm_connector *connector, bool capable);
    1798             : int drm_connector_set_panel_orientation(
    1799             :         struct drm_connector *connector,
    1800             :         enum drm_panel_orientation panel_orientation);
    1801             : int drm_connector_set_panel_orientation_with_quirk(
    1802             :         struct drm_connector *connector,
    1803             :         enum drm_panel_orientation panel_orientation,
    1804             :         int width, int height);
    1805             : int drm_connector_attach_max_bpc_property(struct drm_connector *connector,
    1806             :                                           int min, int max);
    1807             : void drm_connector_create_privacy_screen_properties(struct drm_connector *conn);
    1808             : void drm_connector_attach_privacy_screen_properties(struct drm_connector *conn);
    1809             : void drm_connector_attach_privacy_screen_provider(
    1810             :         struct drm_connector *connector, struct drm_privacy_screen *priv);
    1811             : void drm_connector_update_privacy_screen(const struct drm_connector_state *connector_state);
    1812             : 
    1813             : /**
    1814             :  * struct drm_tile_group - Tile group metadata
    1815             :  * @refcount: reference count
    1816             :  * @dev: DRM device
    1817             :  * @id: tile group id exposed to userspace
    1818             :  * @group_data: Sink-private data identifying this group
    1819             :  *
    1820             :  * @group_data corresponds to displayid vend/prod/serial for external screens
    1821             :  * with an EDID.
    1822             :  */
    1823             : struct drm_tile_group {
    1824             :         struct kref refcount;
    1825             :         struct drm_device *dev;
    1826             :         int id;
    1827             :         u8 group_data[8];
    1828             : };
    1829             : 
    1830             : struct drm_tile_group *drm_mode_create_tile_group(struct drm_device *dev,
    1831             :                                                   const char topology[8]);
    1832             : struct drm_tile_group *drm_mode_get_tile_group(struct drm_device *dev,
    1833             :                                                const char topology[8]);
    1834             : void drm_mode_put_tile_group(struct drm_device *dev,
    1835             :                              struct drm_tile_group *tg);
    1836             : 
    1837             : /**
    1838             :  * struct drm_connector_list_iter - connector_list iterator
    1839             :  *
    1840             :  * This iterator tracks state needed to be able to walk the connector_list
    1841             :  * within struct drm_mode_config. Only use together with
    1842             :  * drm_connector_list_iter_begin(), drm_connector_list_iter_end() and
    1843             :  * drm_connector_list_iter_next() respectively the convenience macro
    1844             :  * drm_for_each_connector_iter().
    1845             :  *
    1846             :  * Note that the return value of drm_connector_list_iter_next() is only valid
    1847             :  * up to the next drm_connector_list_iter_next() or
    1848             :  * drm_connector_list_iter_end() call. If you want to use the connector later,
    1849             :  * then you need to grab your own reference first using drm_connector_get().
    1850             :  */
    1851             : struct drm_connector_list_iter {
    1852             : /* private: */
    1853             :         struct drm_device *dev;
    1854             :         struct drm_connector *conn;
    1855             : };
    1856             : 
    1857             : void drm_connector_list_iter_begin(struct drm_device *dev,
    1858             :                                    struct drm_connector_list_iter *iter);
    1859             : struct drm_connector *
    1860             : drm_connector_list_iter_next(struct drm_connector_list_iter *iter);
    1861             : void drm_connector_list_iter_end(struct drm_connector_list_iter *iter);
    1862             : 
    1863             : bool drm_connector_has_possible_encoder(struct drm_connector *connector,
    1864             :                                         struct drm_encoder *encoder);
    1865             : 
    1866             : /**
    1867             :  * drm_for_each_connector_iter - connector_list iterator macro
    1868             :  * @connector: &struct drm_connector pointer used as cursor
    1869             :  * @iter: &struct drm_connector_list_iter
    1870             :  *
    1871             :  * Note that @connector is only valid within the list body, if you want to use
    1872             :  * @connector after calling drm_connector_list_iter_end() then you need to grab
    1873             :  * your own reference first using drm_connector_get().
    1874             :  */
    1875             : #define drm_for_each_connector_iter(connector, iter) \
    1876             :         while ((connector = drm_connector_list_iter_next(iter)))
    1877             : 
    1878             : /**
    1879             :  * drm_connector_for_each_possible_encoder - iterate connector's possible encoders
    1880             :  * @connector: &struct drm_connector pointer
    1881             :  * @encoder: &struct drm_encoder pointer used as cursor
    1882             :  */
    1883             : #define drm_connector_for_each_possible_encoder(connector, encoder) \
    1884             :         drm_for_each_encoder_mask(encoder, (connector)->dev, \
    1885             :                                   (connector)->possible_encoders)
    1886             : 
    1887             : #endif

Generated by: LCOV version 1.14