LCOV - code coverage report
Current view: top level - include/drm - drm_connector.h (source / functions) Hit Total Coverage
Test: combined.info Lines: 0 16 0.0 %
Date: 2022-04-01 14:17:54 Functions: 0 0 -
Branches: 0 20 0.0 %

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

Generated by: LCOV version 1.14