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
|