Lines Matching +full:dual +full:- +full:dsi +full:- +full:mode
45 * Hence they are reference-counted using drm_connector_get() and
61 * For connectors which are not fixed (like built-in panels) the driver needs to
80 { DRM_MODE_CONNECTOR_DVII, "DVI-I" },
81 { DRM_MODE_CONNECTOR_DVID, "DVI-D" },
82 { DRM_MODE_CONNECTOR_DVIA, "DVI-A" },
89 { DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" },
90 { DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" },
94 { DRM_MODE_CONNECTOR_DSI, "DSI" },
118 * drm_get_connector_type_name - return a string for connector type
133 * drm_connector_get_cmdline_mode - reads the user's cmdline mode
136 * The kernel supports per-connector configuration of its consoles through
138 * extracts the user's specified mode (or enable/disable status) for a
144 struct drm_cmdline_mode *mode = &connector->cmdline_mode; in drm_connector_get_cmdline_mode() local
147 if (fb_get_options(connector->name, &option)) in drm_connector_get_cmdline_mode()
152 mode)) in drm_connector_get_cmdline_mode()
155 if (mode->force) { in drm_connector_get_cmdline_mode()
156 DRM_INFO("forcing %s connector %s\n", connector->name, in drm_connector_get_cmdline_mode()
157 drm_get_connector_force_name(mode->force)); in drm_connector_get_cmdline_mode()
158 connector->force = mode->force; in drm_connector_get_cmdline_mode()
161 if (mode->panel_orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN) { in drm_connector_get_cmdline_mode()
163 connector->name, mode->panel_orientation); in drm_connector_get_cmdline_mode()
165 mode->panel_orientation); in drm_connector_get_cmdline_mode()
168 DRM_DEBUG_KMS("cmdline mode for connector %s %s %dx%d@%dHz%s%s%s\n", in drm_connector_get_cmdline_mode()
169 connector->name, mode->name, in drm_connector_get_cmdline_mode()
170 mode->xres, mode->yres, in drm_connector_get_cmdline_mode()
171 mode->refresh_specified ? mode->refresh : 60, in drm_connector_get_cmdline_mode()
172 mode->rb ? " reduced blanking" : "", in drm_connector_get_cmdline_mode()
173 mode->margins ? " with margins" : "", in drm_connector_get_cmdline_mode()
174 mode->interlace ? " interlaced" : ""); in drm_connector_get_cmdline_mode()
181 struct drm_device *dev = connector->dev; in drm_connector_free()
183 drm_mode_object_unregister(dev, &connector->base); in drm_connector_free()
184 connector->funcs->destroy(connector); in drm_connector_free()
192 struct drm_mode_config *config = &dev->mode_config; in drm_connector_free_work_fn()
196 spin_lock_irqsave(&config->connector_list_lock, flags); in drm_connector_free_work_fn()
197 freed = llist_del_all(&config->connector_free_list); in drm_connector_free_work_fn()
198 spin_unlock_irqrestore(&config->connector_list_lock, flags); in drm_connector_free_work_fn()
201 drm_mode_object_unregister(dev, &connector->base); in drm_connector_free_work_fn()
202 connector->funcs->destroy(connector); in drm_connector_free_work_fn()
207 * drm_connector_init - Init a preallocated connector
224 struct drm_mode_config *config = &dev->mode_config; in drm_connector_init()
230 (!funcs->atomic_destroy_state || in drm_connector_init()
231 !funcs->atomic_duplicate_state)); in drm_connector_init()
233 ret = __drm_mode_object_add(dev, &connector->base, in drm_connector_init()
239 connector->base.properties = &connector->properties; in drm_connector_init()
240 connector->dev = dev; in drm_connector_init()
241 connector->funcs = funcs; in drm_connector_init()
244 ret = ida_simple_get(&config->connector_ida, 0, 32, GFP_KERNEL); in drm_connector_init()
251 connector->index = ret; in drm_connector_init()
254 connector->connector_type = connector_type; in drm_connector_init()
255 connector->connector_type_id = in drm_connector_init()
257 if (connector->connector_type_id < 0) { in drm_connector_init()
258 ret = connector->connector_type_id; in drm_connector_init()
261 connector->name = in drm_connector_init()
262 kasprintf(GFP_KERNEL, "%s-%d", in drm_connector_init()
264 connector->connector_type_id); in drm_connector_init()
265 if (!connector->name) { in drm_connector_init()
266 ret = -ENOMEM; in drm_connector_init()
270 INIT_LIST_HEAD(&connector->probed_modes); in drm_connector_init()
271 INIT_LIST_HEAD(&connector->modes); in drm_connector_init()
272 mutex_init(&connector->mutex); in drm_connector_init()
273 connector->edid_blob_ptr = NULL; in drm_connector_init()
274 connector->epoch_counter = 0; in drm_connector_init()
275 connector->tile_blob_ptr = NULL; in drm_connector_init()
276 connector->status = connector_status_unknown; in drm_connector_init()
277 connector->display_info.panel_orientation = in drm_connector_init()
285 spin_lock_irq(&config->connector_list_lock); in drm_connector_init()
286 list_add_tail(&connector->head, &config->connector_list); in drm_connector_init()
287 config->num_connector++; in drm_connector_init()
288 spin_unlock_irq(&config->connector_list_lock); in drm_connector_init()
294 drm_object_attach_property(&connector->base, in drm_connector_init()
295 config->dpms_property, 0); in drm_connector_init()
297 drm_object_attach_property(&connector->base, in drm_connector_init()
298 config->link_status_property, in drm_connector_init()
301 drm_object_attach_property(&connector->base, in drm_connector_init()
302 config->non_desktop_property, in drm_connector_init()
304 drm_object_attach_property(&connector->base, in drm_connector_init()
305 config->tile_property, in drm_connector_init()
309 drm_object_attach_property(&connector->base, config->prop_crtc_id, 0); in drm_connector_init()
312 connector->debugfs_entry = NULL; in drm_connector_init()
315 ida_simple_remove(connector_ida, connector->connector_type_id); in drm_connector_init()
318 ida_simple_remove(&config->connector_ida, connector->index); in drm_connector_init()
321 drm_mode_object_unregister(dev, &connector->base); in drm_connector_init()
328 * drm_connector_init_with_ddc - Init a preallocated connector
356 connector->ddc = ddc; in drm_connector_init_with_ddc()
363 * drm_connector_attach_edid_property - attach edid property.
372 struct drm_mode_config *config = &connector->dev->mode_config; in drm_connector_attach_edid_property()
374 drm_object_attach_property(&connector->base, in drm_connector_attach_edid_property()
375 config->edid_property, in drm_connector_attach_edid_property()
381 * drm_connector_attach_encoder - attach a connector to an encoder
398 * direct assignment of connector->encoder = encoder. This connection in drm_connector_attach_encoder()
406 if (WARN_ON(connector->encoder)) in drm_connector_attach_encoder()
407 return -EINVAL; in drm_connector_attach_encoder()
409 connector->possible_encoders |= drm_encoder_mask(encoder); in drm_connector_attach_encoder()
416 * drm_connector_has_possible_encoder - check if the connector and encoder are
427 return connector->possible_encoders & drm_encoder_mask(encoder); in drm_connector_has_possible_encoder()
432 struct drm_display_mode *mode) in drm_mode_remove() argument
434 list_del(&mode->head); in drm_mode_remove()
435 drm_mode_destroy(connector->dev, mode); in drm_mode_remove()
439 * drm_connector_cleanup - cleans up an initialised connector
446 struct drm_device *dev = connector->dev; in drm_connector_cleanup()
447 struct drm_display_mode *mode, *t; in drm_connector_cleanup() local
452 if (WARN_ON(connector->registration_state == in drm_connector_cleanup()
456 if (connector->tile_group) { in drm_connector_cleanup()
457 drm_mode_put_tile_group(dev, connector->tile_group); in drm_connector_cleanup()
458 connector->tile_group = NULL; in drm_connector_cleanup()
461 list_for_each_entry_safe(mode, t, &connector->probed_modes, head) in drm_connector_cleanup()
462 drm_mode_remove(connector, mode); in drm_connector_cleanup()
464 list_for_each_entry_safe(mode, t, &connector->modes, head) in drm_connector_cleanup()
465 drm_mode_remove(connector, mode); in drm_connector_cleanup()
467 ida_simple_remove(&drm_connector_enum_list[connector->connector_type].ida, in drm_connector_cleanup()
468 connector->connector_type_id); in drm_connector_cleanup()
470 ida_simple_remove(&dev->mode_config.connector_ida, in drm_connector_cleanup()
471 connector->index); in drm_connector_cleanup()
473 kfree(connector->display_info.bus_formats); in drm_connector_cleanup()
474 drm_mode_object_unregister(dev, &connector->base); in drm_connector_cleanup()
475 kfree(connector->name); in drm_connector_cleanup()
476 connector->name = NULL; in drm_connector_cleanup()
477 spin_lock_irq(&dev->mode_config.connector_list_lock); in drm_connector_cleanup()
478 list_del(&connector->head); in drm_connector_cleanup()
479 dev->mode_config.num_connector--; in drm_connector_cleanup()
480 spin_unlock_irq(&dev->mode_config.connector_list_lock); in drm_connector_cleanup()
482 WARN_ON(connector->state && !connector->funcs->atomic_destroy_state); in drm_connector_cleanup()
483 if (connector->state && connector->funcs->atomic_destroy_state) in drm_connector_cleanup()
484 connector->funcs->atomic_destroy_state(connector, in drm_connector_cleanup()
485 connector->state); in drm_connector_cleanup()
487 mutex_destroy(&connector->mutex); in drm_connector_cleanup()
494 * drm_connector_register - register a connector
509 if (!connector->dev->registered) in drm_connector_register()
512 mutex_lock(&connector->mutex); in drm_connector_register()
513 if (connector->registration_state != DRM_CONNECTOR_INITIALIZING) in drm_connector_register()
522 if (connector->funcs->late_register) { in drm_connector_register()
523 ret = connector->funcs->late_register(connector); in drm_connector_register()
528 drm_mode_object_register(connector->dev, &connector->base); in drm_connector_register()
530 connector->registration_state = DRM_CONNECTOR_REGISTERED; in drm_connector_register()
533 drm_sysfs_hotplug_event(connector->dev); in drm_connector_register()
541 mutex_unlock(&connector->mutex); in drm_connector_register()
547 * drm_connector_unregister - unregister a connector
557 mutex_lock(&connector->mutex); in drm_connector_unregister()
558 if (connector->registration_state != DRM_CONNECTOR_REGISTERED) { in drm_connector_unregister()
559 mutex_unlock(&connector->mutex); in drm_connector_unregister()
563 if (connector->funcs->early_unregister) in drm_connector_unregister()
564 connector->funcs->early_unregister(connector); in drm_connector_unregister()
569 connector->registration_state = DRM_CONNECTOR_UNREGISTERED; in drm_connector_unregister()
570 mutex_unlock(&connector->mutex); in drm_connector_unregister()
605 * drm_get_connector_status_name - return a string for connector status
623 * drm_get_connector_force_name - return a string for connector force
651 * drm_connector_list_iter_begin - initialize a connector_list iterator
663 iter->dev = dev; in drm_connector_list_iter_begin()
664 iter->conn = NULL; in drm_connector_list_iter_begin()
670 * Extra-safe connector put function that works in any context. Should only be
677 struct drm_mode_config *config = &conn->dev->mode_config; in __drm_connector_put_safe()
679 lockdep_assert_held(&config->connector_list_lock); in __drm_connector_put_safe()
681 if (!refcount_dec_and_test(&conn->base.refcount.refcount)) in __drm_connector_put_safe()
684 llist_add(&conn->free_node, &config->connector_free_list); in __drm_connector_put_safe()
685 schedule_work(&config->connector_free_work); in __drm_connector_put_safe()
689 * drm_connector_list_iter_next - return next connector
698 struct drm_connector *old_conn = iter->conn; in drm_connector_list_iter_next()
699 struct drm_mode_config *config = &iter->dev->mode_config; in drm_connector_list_iter_next()
703 spin_lock_irqsave(&config->connector_list_lock, flags); in drm_connector_list_iter_next()
704 lhead = old_conn ? &old_conn->head : &config->connector_list; in drm_connector_list_iter_next()
707 if (lhead->next == &config->connector_list) { in drm_connector_list_iter_next()
708 iter->conn = NULL; in drm_connector_list_iter_next()
712 lhead = lhead->next; in drm_connector_list_iter_next()
713 iter->conn = list_entry(lhead, struct drm_connector, head); in drm_connector_list_iter_next()
716 } while (!kref_get_unless_zero(&iter->conn->base.refcount)); in drm_connector_list_iter_next()
720 spin_unlock_irqrestore(&config->connector_list_lock, flags); in drm_connector_list_iter_next()
722 return iter->conn; in drm_connector_list_iter_next()
727 * drm_connector_list_iter_end - tear down a connector_list iterator
737 struct drm_mode_config *config = &iter->dev->mode_config; in drm_connector_list_iter_end()
740 iter->dev = NULL; in drm_connector_list_iter_end()
741 if (iter->conn) { in drm_connector_list_iter_end()
742 spin_lock_irqsave(&config->connector_list_lock, flags); in drm_connector_list_iter_end()
743 __drm_connector_put_safe(iter->conn); in drm_connector_list_iter_end()
744 spin_unlock_irqrestore(&config->connector_list_lock, flags); in drm_connector_list_iter_end()
760 * drm_get_subpixel_order_name - return a string for a given subpixel enum
786 * drm_display_info_set_bus_formats - set the supported bus formats
792 * See MEDIA_BUS_FMT_* definitions in include/uapi/linux/media-bus-format.h for
802 return -EINVAL; in drm_display_info_set_bus_formats()
808 return -ENOMEM; in drm_display_info_set_bus_formats()
811 kfree(info->bus_formats); in drm_display_info_set_bus_formats()
812 info->bus_formats = fmts; in drm_display_info_set_bus_formats()
813 info->num_bus_formats = num_formats; in drm_display_info_set_bus_formats()
849 { DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I and TV-out */
850 { DRM_MODE_SUBCONNECTOR_DVID, "DVI-D" }, /* DVI-I */
851 { DRM_MODE_SUBCONNECTOR_DVIA, "DVI-A" }, /* DVI-I */
856 { DRM_MODE_SUBCONNECTOR_Unknown, "Unknown" }, /* DVI-I, TV-out and DP */
857 { DRM_MODE_SUBCONNECTOR_DVID, "DVI-D" }, /* DVI-I */
858 { DRM_MODE_SUBCONNECTOR_DVIA, "DVI-A" }, /* DVI-I */
864 { DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I and TV-out */
865 { DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */
866 { DRM_MODE_SUBCONNECTOR_SVIDEO, "SVIDEO" }, /* TV-out */
867 { DRM_MODE_SUBCONNECTOR_Component, "Component" }, /* TV-out */
868 { DRM_MODE_SUBCONNECTOR_SCART, "SCART" }, /* TV-out */
873 { DRM_MODE_SUBCONNECTOR_Unknown, "Unknown" }, /* DVI-I, TV-out and DP */
874 { DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */
875 { DRM_MODE_SUBCONNECTOR_SVIDEO, "SVIDEO" }, /* TV-out */
876 { DRM_MODE_SUBCONNECTOR_Component, "Component" }, /* TV-out */
877 { DRM_MODE_SUBCONNECTOR_SCART, "SCART" }, /* TV-out */
883 { DRM_MODE_SUBCONNECTOR_Unknown, "Unknown" }, /* DVI-I, TV-out and DP */
885 { DRM_MODE_SUBCONNECTOR_DVID, "DVI-D" }, /* DP */
901 /* Standard Definition Colorimetry based on IEC 61966-2-4 */
903 /* High Definition Colorimetry based on IEC 61966-2-4 */
905 /* Colorimetry based on IEC 61966-2-1/Amendment 1 */
907 /* Colorimetry based on IEC 61966-2-5 [33] */
909 /* Colorimetry based on IEC 61966-2-5 */
911 /* Colorimetry based on ITU-R BT.2020 */
913 /* Colorimetry based on ITU-R BT.2020 */
915 /* Colorimetry based on ITU-R BT.2020 */
918 { DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65, "DCI-P3_RGB_D65" },
919 { DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER, "DCI-P3_RGB_Theater" },
924 * Format Table 2-120
930 /* Colorimetry based on scRGB (IEC 61966-2-2) */
932 /* Colorimetry based on IEC 61966-2-5 */
934 /* Colorimetry based on SMPTE RP 431-2 */
935 { DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65, "DCI-P3_RGB_D65" },
936 /* Colorimetry based on ITU-R BT.2020 */
940 /* Standard Definition Colorimetry based on IEC 61966-2-4 */
942 /* High Definition Colorimetry based on IEC 61966-2-4 */
944 /* Colorimetry based on IEC 61966-2-1/Amendment 1 */
946 /* Colorimetry based on IEC 61966-2-5 [33] */
948 /* Colorimetry based on ITU-R BT.2020 */
950 /* Colorimetry based on ITU-R BT.2020 */
967 * User-space should not parse the EDID to obtain information exposed via
969 * fixups to the EDID). For instance, user-space should not try to parse
970 * mode lists from the EDID.
991 * The second issue is that the DPMS state is only well-defined when the
1010 * compose together into one logical screen. This is used by both high-res
1012 * DP MST sinks), or high-res integrated panels (like dual-link DSI) which
1013 * are not gen-locked. Note that for tiled panels which are genlocked, like
1014 * dual-link LVDS or dual-link DSI, the driver should try to not expose the
1018 * link-status:
1019 * Connector link-status property to indicate the status of link. The
1020 * default value of link-status is "GOOD". If something fails during or
1025 * When user-space receives the hotplug uevent and detects a "BAD"
1026 * link-status, the sink doesn't receive pixels anymore (e.g. the screen
1028 * changed. User-space is expected to pick a new mode if the current one
1029 * has disappeared and perform a new modeset with link-status set to
1030 * "GOOD" to re-enable the connector.
1033 * link-status, the other are unaffected (ie. the sinks still continue to
1036 * When user-space performs an atomic commit on a connector with a "BAD"
1037 * link-status without resetting the property to "GOOD", the sink may
1038 * still not receive pixels. When user-space performs an atomic commit
1039 * which resets the link-status property to "GOOD" without the
1042 * User-space can only change link-status to "GOOD", changing it to "BAD"
1043 * is a no-op.
1045 * For backwards compatibility with non-atomic userspace the kernel
1046 * tries to automatically set the link-status back to "GOOD" in the
1047 * SETCRTC IOCTL. This might fail if the mode is no longer valid, similar
1075 * -EINVAL.
1079 * - DESIRED state should be preserved until userspace de-asserts it by
1082 * - If the state is DESIRED, kernel should attempt to re-authenticate the
1085 * - Kernel sends uevent with the connector id and property id through
1089 * - DESIRED -> ENABLED (authentication success)
1090 * - ENABLED -> DESIRED (termination of authentication)
1091 * - Please note no uevents for userspace triggered property state changes,
1094 * - DESIRED/ENABLED -> UNDESIRED
1095 * - UNDESIRED -> DESIRED
1096 * - Userspace is responsible for polling the property or listen to uevents
1111 * - "HDCP Type0": DRM_MODE_HDCP_CONTENT_TYPE0 = 0
1112 * - "HDCP Type1": DRM_MODE_HDCP_CONTENT_TYPE1 = 1
1147 * then kernel will disable the HDCP and re-enable with new type in the
1158 * SDP packet (Non-audio INFOFRAME SDP v1.3) for DP. This is then
1176 * - Some layers are HDR and others are SDR
1177 * - HDR layers luminance is not same as sink
1203 * Mode object ID of the &drm_crtc this connector should be connected to.
1219 * scaling mode:
1220 * This property defines how a non-native mode is upscaled to the native
1221 * mode of an LCD panel:
1225 * drivers expose this mode.
1240 * have a built-in scaler).
1243 * This property is used by DVI-I, TVout and DisplayPort to indicate different
1246 * For DVI-I and TVout there is also a matching property "select subconnector"
1259 return -ENOMEM; in drm_connector_create_standard_properties()
1260 dev->mode_config.edid_property = prop; in drm_connector_create_standard_properties()
1266 return -ENOMEM; in drm_connector_create_standard_properties()
1267 dev->mode_config.dpms_property = prop; in drm_connector_create_standard_properties()
1274 return -ENOMEM; in drm_connector_create_standard_properties()
1275 dev->mode_config.path_property = prop; in drm_connector_create_standard_properties()
1282 return -ENOMEM; in drm_connector_create_standard_properties()
1283 dev->mode_config.tile_property = prop; in drm_connector_create_standard_properties()
1285 prop = drm_property_create_enum(dev, 0, "link-status", in drm_connector_create_standard_properties()
1289 return -ENOMEM; in drm_connector_create_standard_properties()
1290 dev->mode_config.link_status_property = prop; in drm_connector_create_standard_properties()
1292 prop = drm_property_create_bool(dev, DRM_MODE_PROP_IMMUTABLE, "non-desktop"); in drm_connector_create_standard_properties()
1294 return -ENOMEM; in drm_connector_create_standard_properties()
1295 dev->mode_config.non_desktop_property = prop; in drm_connector_create_standard_properties()
1300 return -ENOMEM; in drm_connector_create_standard_properties()
1301 dev->mode_config.hdr_output_metadata_property = prop; in drm_connector_create_standard_properties()
1307 * drm_mode_create_dvi_i_properties - create DVI-I specific connector properties
1310 * Called by a driver the first time a DVI-I connector is made.
1317 if (dev->mode_config.dvi_i_select_subconnector_property) in drm_mode_create_dvi_i_properties()
1325 dev->mode_config.dvi_i_select_subconnector_property = dvi_i_selector; in drm_mode_create_dvi_i_properties()
1331 dev->mode_config.dvi_i_subconnector_property = dvi_i_subconnector; in drm_mode_create_dvi_i_properties()
1338 * drm_connector_attach_dp_subconnector_property - create subconnector property for DP
1345 struct drm_mode_config *mode_config = &connector->dev->mode_config; in drm_connector_attach_dp_subconnector_property()
1347 if (!mode_config->dp_subconnector_property) in drm_connector_attach_dp_subconnector_property()
1348 mode_config->dp_subconnector_property = in drm_connector_attach_dp_subconnector_property()
1349 drm_property_create_enum(connector->dev, in drm_connector_attach_dp_subconnector_property()
1355 drm_object_attach_property(&connector->base, in drm_connector_attach_dp_subconnector_property()
1356 mode_config->dp_subconnector_property, in drm_connector_attach_dp_subconnector_property()
1388 * drm_connector_attach_content_type_property - attach content-type property
1395 if (!drm_mode_create_content_type_property(connector->dev)) in drm_connector_attach_content_type_property()
1396 drm_object_attach_property(&connector->base, in drm_connector_attach_content_type_property()
1397 connector->dev->mode_config.content_type_property, in drm_connector_attach_content_type_property()
1405 * drm_hdmi_avi_infoframe_content_type() - fill the HDMI AVI infoframe
1415 switch (conn_state->content_type) { in drm_hdmi_avi_infoframe_content_type()
1417 frame->content_type = HDMI_CONTENT_TYPE_GRAPHICS; in drm_hdmi_avi_infoframe_content_type()
1420 frame->content_type = HDMI_CONTENT_TYPE_CINEMA; in drm_hdmi_avi_infoframe_content_type()
1423 frame->content_type = HDMI_CONTENT_TYPE_GAME; in drm_hdmi_avi_infoframe_content_type()
1426 frame->content_type = HDMI_CONTENT_TYPE_PHOTO; in drm_hdmi_avi_infoframe_content_type()
1430 frame->content_type = HDMI_CONTENT_TYPE_GRAPHICS; in drm_hdmi_avi_infoframe_content_type()
1433 frame->itc = conn_state->content_type != DRM_MODE_CONTENT_TYPE_NO_DATA; in drm_hdmi_avi_infoframe_content_type()
1438 * drm_connector_attach_tv_margin_properties - attach TV connector margin
1447 struct drm_device *dev = connector->dev; in drm_connector_attach_tv_margin_properties()
1449 drm_object_attach_property(&connector->base, in drm_connector_attach_tv_margin_properties()
1450 dev->mode_config.tv_left_margin_property, in drm_connector_attach_tv_margin_properties()
1452 drm_object_attach_property(&connector->base, in drm_connector_attach_tv_margin_properties()
1453 dev->mode_config.tv_right_margin_property, in drm_connector_attach_tv_margin_properties()
1455 drm_object_attach_property(&connector->base, in drm_connector_attach_tv_margin_properties()
1456 dev->mode_config.tv_top_margin_property, in drm_connector_attach_tv_margin_properties()
1458 drm_object_attach_property(&connector->base, in drm_connector_attach_tv_margin_properties()
1459 dev->mode_config.tv_bottom_margin_property, in drm_connector_attach_tv_margin_properties()
1465 * drm_mode_create_tv_margin_properties - create TV connector margin properties
1475 if (dev->mode_config.tv_left_margin_property) in drm_mode_create_tv_margin_properties()
1478 dev->mode_config.tv_left_margin_property = in drm_mode_create_tv_margin_properties()
1480 if (!dev->mode_config.tv_left_margin_property) in drm_mode_create_tv_margin_properties()
1481 return -ENOMEM; in drm_mode_create_tv_margin_properties()
1483 dev->mode_config.tv_right_margin_property = in drm_mode_create_tv_margin_properties()
1485 if (!dev->mode_config.tv_right_margin_property) in drm_mode_create_tv_margin_properties()
1486 return -ENOMEM; in drm_mode_create_tv_margin_properties()
1488 dev->mode_config.tv_top_margin_property = in drm_mode_create_tv_margin_properties()
1490 if (!dev->mode_config.tv_top_margin_property) in drm_mode_create_tv_margin_properties()
1491 return -ENOMEM; in drm_mode_create_tv_margin_properties()
1493 dev->mode_config.tv_bottom_margin_property = in drm_mode_create_tv_margin_properties()
1495 if (!dev->mode_config.tv_bottom_margin_property) in drm_mode_create_tv_margin_properties()
1496 return -ENOMEM; in drm_mode_create_tv_margin_properties()
1503 * drm_mode_create_tv_properties - create TV specific connector properties
1521 if (dev->mode_config.tv_select_subconnector_property) in drm_mode_create_tv_properties()
1534 dev->mode_config.tv_select_subconnector_property = tv_selector; in drm_mode_create_tv_properties()
1543 dev->mode_config.tv_subconnector_property = tv_subconnector; in drm_mode_create_tv_properties()
1551 dev->mode_config.tv_mode_property = in drm_mode_create_tv_properties()
1553 "mode", num_modes); in drm_mode_create_tv_properties()
1554 if (!dev->mode_config.tv_mode_property) in drm_mode_create_tv_properties()
1558 drm_property_add_enum(dev->mode_config.tv_mode_property, in drm_mode_create_tv_properties()
1561 dev->mode_config.tv_brightness_property = in drm_mode_create_tv_properties()
1563 if (!dev->mode_config.tv_brightness_property) in drm_mode_create_tv_properties()
1566 dev->mode_config.tv_contrast_property = in drm_mode_create_tv_properties()
1568 if (!dev->mode_config.tv_contrast_property) in drm_mode_create_tv_properties()
1571 dev->mode_config.tv_flicker_reduction_property = in drm_mode_create_tv_properties()
1573 if (!dev->mode_config.tv_flicker_reduction_property) in drm_mode_create_tv_properties()
1576 dev->mode_config.tv_overscan_property = in drm_mode_create_tv_properties()
1578 if (!dev->mode_config.tv_overscan_property) in drm_mode_create_tv_properties()
1581 dev->mode_config.tv_saturation_property = in drm_mode_create_tv_properties()
1583 if (!dev->mode_config.tv_saturation_property) in drm_mode_create_tv_properties()
1586 dev->mode_config.tv_hue_property = in drm_mode_create_tv_properties()
1588 if (!dev->mode_config.tv_hue_property) in drm_mode_create_tv_properties()
1593 return -ENOMEM; in drm_mode_create_tv_properties()
1598 * drm_mode_create_scaling_mode_property - create scaling mode property
1612 if (dev->mode_config.scaling_mode_property) in drm_mode_create_scaling_mode_property()
1616 drm_property_create_enum(dev, 0, "scaling mode", in drm_mode_create_scaling_mode_property()
1620 dev->mode_config.scaling_mode_property = scaling_mode; in drm_mode_create_scaling_mode_property()
1674 * vertical front porch duration will be extended until page-flip or
1678 * front porch duration for the current mode.
1689 * drm_connector_attach_vrr_capable_property - creates the
1702 struct drm_device *dev = connector->dev; in drm_connector_attach_vrr_capable_property()
1705 if (!connector->vrr_capable_property) { in drm_connector_attach_vrr_capable_property()
1709 return -ENOMEM; in drm_connector_attach_vrr_capable_property()
1711 connector->vrr_capable_property = prop; in drm_connector_attach_vrr_capable_property()
1712 drm_object_attach_property(&connector->base, prop, 0); in drm_connector_attach_vrr_capable_property()
1720 * drm_connector_attach_scaling_mode_property - attach atomic scaling mode property
1721 * @connector: connector to attach scaling mode property on.
1724 * This is used to add support for scaling mode to atomic drivers.
1725 * The scaling mode will be set to &drm_connector_state.picture_aspect_ratio
1726 * and can be used from &drm_connector_helper_funcs->atomic_check for validation.
1736 struct drm_device *dev = connector->dev; in drm_connector_attach_scaling_mode_property()
1740 (1U << ARRAY_SIZE(drm_scaling_mode_enum_list)) - 1; in drm_connector_attach_scaling_mode_property()
1744 return -EINVAL; in drm_connector_attach_scaling_mode_property()
1747 drm_property_create(dev, DRM_MODE_PROP_ENUM, "scaling mode", in drm_connector_attach_scaling_mode_property()
1751 return -ENOMEM; in drm_connector_attach_scaling_mode_property()
1770 drm_object_attach_property(&connector->base, in drm_connector_attach_scaling_mode_property()
1773 connector->scaling_mode_property = scaling_mode_property; in drm_connector_attach_scaling_mode_property()
1780 * drm_mode_create_aspect_ratio_property - create aspect ratio property
1791 if (dev->mode_config.aspect_ratio_property) in drm_mode_create_aspect_ratio_property()
1794 dev->mode_config.aspect_ratio_property = in drm_mode_create_aspect_ratio_property()
1799 if (dev->mode_config.aspect_ratio_property == NULL) in drm_mode_create_aspect_ratio_property()
1800 return -ENOMEM; in drm_mode_create_aspect_ratio_property()
1812 * This helps switch to BT2020 mode if the BT2020 encoded video stream
1822 * - Set up CRTC DEGAMMA/CTM/GAMMA to convert to some sink
1824 * - Set this new property to let the sink know what it
1826 * - This property is just to inform sink what colorspace
1835 * drm_mode_create_hdmi_colorspace_property - create hdmi colorspace property
1846 struct drm_device *dev = connector->dev; in drm_mode_create_hdmi_colorspace_property()
1848 if (connector->colorspace_property) in drm_mode_create_hdmi_colorspace_property()
1851 connector->colorspace_property = in drm_mode_create_hdmi_colorspace_property()
1856 if (!connector->colorspace_property) in drm_mode_create_hdmi_colorspace_property()
1857 return -ENOMEM; in drm_mode_create_hdmi_colorspace_property()
1864 * drm_mode_create_dp_colorspace_property - create dp colorspace property
1875 struct drm_device *dev = connector->dev; in drm_mode_create_dp_colorspace_property()
1877 if (connector->colorspace_property) in drm_mode_create_dp_colorspace_property()
1880 connector->colorspace_property = in drm_mode_create_dp_colorspace_property()
1885 if (!connector->colorspace_property) in drm_mode_create_dp_colorspace_property()
1886 return -ENOMEM; in drm_mode_create_dp_colorspace_property()
1893 * drm_mode_create_content_type_property - create content type property
1904 if (dev->mode_config.content_type_property) in drm_mode_create_content_type_property()
1907 dev->mode_config.content_type_property = in drm_mode_create_content_type_property()
1912 if (dev->mode_config.content_type_property == NULL) in drm_mode_create_content_type_property()
1913 return -ENOMEM; in drm_mode_create_content_type_property()
1920 * drm_mode_create_suggested_offset_properties - create suggests offset properties
1927 if (dev->mode_config.suggested_x_property && dev->mode_config.suggested_y_property) in drm_mode_create_suggested_offset_properties()
1930 dev->mode_config.suggested_x_property = in drm_mode_create_suggested_offset_properties()
1933 dev->mode_config.suggested_y_property = in drm_mode_create_suggested_offset_properties()
1936 if (dev->mode_config.suggested_x_property == NULL || in drm_mode_create_suggested_offset_properties()
1937 dev->mode_config.suggested_y_property == NULL) in drm_mode_create_suggested_offset_properties()
1938 return -ENOMEM; in drm_mode_create_suggested_offset_properties()
1944 * drm_connector_set_path_property - set tile property on connector
1959 struct drm_device *dev = connector->dev; in drm_connector_set_path_property()
1963 &connector->path_blob_ptr, in drm_connector_set_path_property()
1966 &connector->base, in drm_connector_set_path_property()
1967 dev->mode_config.path_property); in drm_connector_set_path_property()
1973 * drm_connector_set_tile_property - set tile property on connector
1979 * This is used for dual port tiled displays with DisplayPort SST
1987 struct drm_device *dev = connector->dev; in drm_connector_set_tile_property()
1991 if (!connector->has_tile) { in drm_connector_set_tile_property()
1993 &connector->tile_blob_ptr, in drm_connector_set_tile_property()
1996 &connector->base, in drm_connector_set_tile_property()
1997 dev->mode_config.tile_property); in drm_connector_set_tile_property()
2002 connector->tile_group->id, connector->tile_is_single_monitor, in drm_connector_set_tile_property()
2003 connector->num_h_tile, connector->num_v_tile, in drm_connector_set_tile_property()
2004 connector->tile_h_loc, connector->tile_v_loc, in drm_connector_set_tile_property()
2005 connector->tile_h_size, connector->tile_v_size); in drm_connector_set_tile_property()
2008 &connector->tile_blob_ptr, in drm_connector_set_tile_property()
2011 &connector->base, in drm_connector_set_tile_property()
2012 dev->mode_config.tile_property); in drm_connector_set_tile_property()
2018 * drm_connector_update_edid_property - update the edid property of a connector
2034 struct drm_device *dev = connector->dev; in drm_connector_update_edid_property()
2040 if (connector->override_edid) in drm_connector_update_edid_property()
2044 size = EDID_LENGTH * (1 + edid->extensions); in drm_connector_update_edid_property()
2061 if (connector->edid_blob_ptr) { in drm_connector_update_edid_property()
2062 old_edid = (const struct edid *)connector->edid_blob_ptr->data; in drm_connector_update_edid_property()
2066 connector->base.id, connector->name); in drm_connector_update_edid_property()
2068 connector->epoch_counter += 1; in drm_connector_update_edid_property()
2070 connector->epoch_counter); in drm_connector_update_edid_property()
2075 drm_object_property_set_value(&connector->base, in drm_connector_update_edid_property()
2076 dev->mode_config.non_desktop_property, in drm_connector_update_edid_property()
2077 connector->display_info.non_desktop); in drm_connector_update_edid_property()
2080 &connector->edid_blob_ptr, in drm_connector_update_edid_property()
2083 &connector->base, in drm_connector_update_edid_property()
2084 dev->mode_config.edid_property); in drm_connector_update_edid_property()
2092 * drm_connector_set_link_status_property - Set link status property of a connector
2097 * "GOOD". If something fails during or after a mode set, the kernel driver
2099 * hotplug uevent for userspace to re-check the valid modes through
2104 * re-training a link) without userspace's intervention.
2113 struct drm_device *dev = connector->dev; in drm_connector_set_link_status_property()
2115 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); in drm_connector_set_link_status_property()
2116 connector->state->link_status = link_status; in drm_connector_set_link_status_property()
2117 drm_modeset_unlock(&dev->mode_config.connection_mutex); in drm_connector_set_link_status_property()
2122 * drm_connector_attach_max_bpc_property - attach "max bpc" property
2135 struct drm_device *dev = connector->dev; in drm_connector_attach_max_bpc_property()
2138 prop = connector->max_bpc_property; in drm_connector_attach_max_bpc_property()
2142 return -ENOMEM; in drm_connector_attach_max_bpc_property()
2144 connector->max_bpc_property = prop; in drm_connector_attach_max_bpc_property()
2147 drm_object_attach_property(&connector->base, prop, max); in drm_connector_attach_max_bpc_property()
2148 connector->state->max_requested_bpc = max; in drm_connector_attach_max_bpc_property()
2149 connector->state->max_bpc = max; in drm_connector_attach_max_bpc_property()
2156 * drm_connector_attach_hdr_output_metadata_property - attach "HDR_OUTPUT_METADA" property
2167 struct drm_device *dev = connector->dev; in drm_connector_attach_hdr_output_metadata_property()
2168 struct drm_property *prop = dev->mode_config.hdr_output_metadata_property; in drm_connector_attach_hdr_output_metadata_property()
2170 drm_object_attach_property(&connector->base, prop, 0); in drm_connector_attach_hdr_output_metadata_property()
2177 * drm_connector_attach_colorspace_property - attach "Colorspace" property
2188 struct drm_property *prop = connector->colorspace_property; in drm_connector_attach_colorspace_property()
2190 drm_object_attach_property(&connector->base, prop, DRM_MODE_COLORIMETRY_DEFAULT); in drm_connector_attach_colorspace_property()
2197 * drm_connector_atomic_hdr_metadata_equal - checks if the hdr metadata changed
2201 * This is used by HDR-enabled drivers to test whether the HDR metadata
2203 * requires a full blown mode change).
2211 struct drm_property_blob *old_blob = old_state->hdr_output_metadata; in drm_connector_atomic_hdr_metadata_equal()
2212 struct drm_property_blob *new_blob = new_state->hdr_output_metadata; in drm_connector_atomic_hdr_metadata_equal()
2217 if (old_blob->length != new_blob->length) in drm_connector_atomic_hdr_metadata_equal()
2220 return !memcmp(old_blob->data, new_blob->data, old_blob->length); in drm_connector_atomic_hdr_metadata_equal()
2225 * drm_connector_set_vrr_capable_property - sets the variable refresh rate
2236 drm_object_property_set_value(&connector->base, in drm_connector_set_vrr_capable_property()
2237 connector->vrr_capable_property, in drm_connector_set_vrr_capable_property()
2243 * drm_connector_set_panel_orientation - sets the connector's panel_orientation
2244 * @connector: connector for which to set the panel-orientation property.
2251 * already been set is a no-op (e.g. the orientation has been overridden with
2255 * DRM_MODE_PANEL_ORIENTATION_UNKNOWN, in which case it is a no-op.
2264 struct drm_device *dev = connector->dev; in drm_connector_set_panel_orientation()
2265 struct drm_display_info *info = &connector->display_info; in drm_connector_set_panel_orientation()
2269 if (info->panel_orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN) in drm_connector_set_panel_orientation()
2276 info->panel_orientation = panel_orientation; in drm_connector_set_panel_orientation()
2278 prop = dev->mode_config.panel_orientation_property; in drm_connector_set_panel_orientation()
2285 return -ENOMEM; in drm_connector_set_panel_orientation()
2287 dev->mode_config.panel_orientation_property = prop; in drm_connector_set_panel_orientation()
2290 drm_object_attach_property(&connector->base, prop, in drm_connector_set_panel_orientation()
2291 info->panel_orientation); in drm_connector_set_panel_orientation()
2297 * drm_connector_set_panel_orientation_with_quirk -
2299 * @connector: connector for which to init the panel-orientation property.
2330 int ret = -EINVAL; in drm_connector_set_obj_prop()
2334 if (property == connector->dev->mode_config.dpms_property) { in drm_connector_set_obj_prop()
2335 ret = (*connector->funcs->dpms)(connector, (int)value); in drm_connector_set_obj_prop()
2336 } else if (connector->funcs->set_property) in drm_connector_set_obj_prop()
2337 ret = connector->funcs->set_property(connector, property, value); in drm_connector_set_obj_prop()
2340 drm_object_property_set_value(&connector->base, property, value); in drm_connector_set_obj_prop()
2349 .value = conn_set_prop->value, in drm_connector_property_set_ioctl()
2350 .prop_id = conn_set_prop->prop_id, in drm_connector_property_set_ioctl()
2351 .obj_id = conn_set_prop->connector_id, in drm_connector_property_set_ioctl()
2364 if (connector->state) in drm_connector_get_encoder()
2365 return connector->state->best_encoder; in drm_connector_get_encoder()
2366 return connector->encoder; in drm_connector_get_encoder()
2370 drm_mode_expose_to_userspace(const struct drm_display_mode *mode, in drm_mode_expose_to_userspace() argument
2375 * If user-space hasn't configured the driver to expose the stereo 3D in drm_mode_expose_to_userspace()
2378 if (!file_priv->stereo_allowed && drm_mode_is_stereo(mode)) in drm_mode_expose_to_userspace()
2381 * If user-space hasn't configured the driver to expose the modes in drm_mode_expose_to_userspace()
2382 * with aspect-ratio, don't expose them. However if such a mode in drm_mode_expose_to_userspace()
2383 * is unique, let it be exposed, but reset the aspect-ratio flags in drm_mode_expose_to_userspace()
2384 * while preparing the list of user-modes. in drm_mode_expose_to_userspace()
2386 if (!file_priv->aspect_ratio_allowed) { in drm_mode_expose_to_userspace()
2390 if (mode_itr->expose_to_userspace && in drm_mode_expose_to_userspace()
2391 drm_mode_match(mode_itr, mode, in drm_mode_expose_to_userspace()
2409 struct drm_display_mode *mode; in drm_mode_getconnector() local
2420 return -EOPNOTSUPP; in drm_mode_getconnector()
2424 connector = drm_connector_lookup(dev, file_priv, out_resp->connector_id); in drm_mode_getconnector()
2426 return -ENOENT; in drm_mode_getconnector()
2428 encoders_count = hweight32(connector->possible_encoders); in drm_mode_getconnector()
2430 if ((out_resp->count_encoders >= encoders_count) && encoders_count) { in drm_mode_getconnector()
2432 encoder_ptr = (uint32_t __user *)(unsigned long)(out_resp->encoders_ptr); in drm_mode_getconnector()
2435 if (put_user(encoder->base.id, encoder_ptr + copied)) { in drm_mode_getconnector()
2436 ret = -EFAULT; in drm_mode_getconnector()
2442 out_resp->count_encoders = encoders_count; in drm_mode_getconnector()
2444 out_resp->connector_id = connector->base.id; in drm_mode_getconnector()
2445 out_resp->connector_type = connector->connector_type; in drm_mode_getconnector()
2446 out_resp->connector_type_id = connector->connector_type_id; in drm_mode_getconnector()
2450 mutex_lock(&dev->mode_config.mutex); in drm_mode_getconnector()
2451 if (out_resp->count_modes == 0) { in drm_mode_getconnector()
2453 connector->funcs->fill_modes(connector, in drm_mode_getconnector()
2454 dev->mode_config.max_width, in drm_mode_getconnector()
2455 dev->mode_config.max_height); in drm_mode_getconnector()
2457 …drm_dbg_kms(dev, "User-space requested a forced probe on [CONNECTOR:%d:%s] but is not the DRM mast… in drm_mode_getconnector()
2458 connector->base.id, connector->name); in drm_mode_getconnector()
2461 out_resp->mm_width = connector->display_info.width_mm; in drm_mode_getconnector()
2462 out_resp->mm_height = connector->display_info.height_mm; in drm_mode_getconnector()
2463 out_resp->subpixel = connector->display_info.subpixel_order; in drm_mode_getconnector()
2464 out_resp->connection = connector->status; in drm_mode_getconnector()
2466 /* delayed so we get modes regardless of pre-fill_modes state */ in drm_mode_getconnector()
2467 list_for_each_entry(mode, &connector->modes, head) { in drm_mode_getconnector()
2468 WARN_ON(mode->expose_to_userspace); in drm_mode_getconnector()
2470 if (drm_mode_expose_to_userspace(mode, &connector->modes, in drm_mode_getconnector()
2472 mode->expose_to_userspace = true; in drm_mode_getconnector()
2481 if ((out_resp->count_modes >= mode_count) && mode_count) { in drm_mode_getconnector()
2483 mode_ptr = (struct drm_mode_modeinfo __user *)(unsigned long)out_resp->modes_ptr; in drm_mode_getconnector()
2484 list_for_each_entry(mode, &connector->modes, head) { in drm_mode_getconnector()
2485 if (!mode->expose_to_userspace) in drm_mode_getconnector()
2489 mode->expose_to_userspace = false; in drm_mode_getconnector()
2491 drm_mode_convert_to_umode(&u_mode, mode); in drm_mode_getconnector()
2493 * Reset aspect ratio flags of user-mode, if modes with in drm_mode_getconnector()
2494 * aspect-ratio are not supported. in drm_mode_getconnector()
2496 if (!file_priv->aspect_ratio_allowed) in drm_mode_getconnector()
2500 ret = -EFAULT; in drm_mode_getconnector()
2506 list_for_each_entry_continue(mode, &connector->modes, head) in drm_mode_getconnector()
2507 mode->expose_to_userspace = false; in drm_mode_getconnector()
2509 mutex_unlock(&dev->mode_config.mutex); in drm_mode_getconnector()
2517 list_for_each_entry(mode, &connector->modes, head) in drm_mode_getconnector()
2518 mode->expose_to_userspace = false; in drm_mode_getconnector()
2521 out_resp->count_modes = mode_count; in drm_mode_getconnector()
2522 mutex_unlock(&dev->mode_config.mutex); in drm_mode_getconnector()
2524 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); in drm_mode_getconnector()
2527 out_resp->encoder_id = encoder->base.id; in drm_mode_getconnector()
2529 out_resp->encoder_id = 0; in drm_mode_getconnector()
2534 ret = drm_mode_object_get_properties(&connector->base, file_priv->atomic, in drm_mode_getconnector()
2535 (uint32_t __user *)(unsigned long)(out_resp->props_ptr), in drm_mode_getconnector()
2536 (uint64_t __user *)(unsigned long)(out_resp->prop_values_ptr), in drm_mode_getconnector()
2537 &out_resp->count_props); in drm_mode_getconnector()
2538 drm_modeset_unlock(&dev->mode_config.connection_mutex); in drm_mode_getconnector()
2551 * identifier. Tiled monitors using DisplayID v1.3 have a unique 8-byte handle,
2556 * the tile group information is exposed through a non-standard way.
2562 struct drm_device *dev = tg->dev; in drm_tile_group_free()
2564 mutex_lock(&dev->mode_config.idr_mutex); in drm_tile_group_free()
2565 idr_remove(&dev->mode_config.tile_idr, tg->id); in drm_tile_group_free()
2566 mutex_unlock(&dev->mode_config.idr_mutex); in drm_tile_group_free()
2571 * drm_mode_put_tile_group - drop a reference to a tile group.
2580 kref_put(&tg->refcount, drm_tile_group_free); in drm_mode_put_tile_group()
2585 * drm_mode_get_tile_group - get a reference to an existing tile group
2587 * @topology: 8-bytes unique per monitor.
2600 mutex_lock(&dev->mode_config.idr_mutex); in drm_mode_get_tile_group()
2601 idr_for_each_entry(&dev->mode_config.tile_idr, tg, id) { in drm_mode_get_tile_group()
2602 if (!memcmp(tg->group_data, topology, 8)) { in drm_mode_get_tile_group()
2603 if (!kref_get_unless_zero(&tg->refcount)) in drm_mode_get_tile_group()
2605 mutex_unlock(&dev->mode_config.idr_mutex); in drm_mode_get_tile_group()
2609 mutex_unlock(&dev->mode_config.idr_mutex); in drm_mode_get_tile_group()
2615 * drm_mode_create_tile_group - create a tile group from a displayid description
2617 * @topology: 8-bytes unique per monitor.
2635 kref_init(&tg->refcount); in drm_mode_create_tile_group()
2636 memcpy(tg->group_data, topology, 8); in drm_mode_create_tile_group()
2637 tg->dev = dev; in drm_mode_create_tile_group()
2639 mutex_lock(&dev->mode_config.idr_mutex); in drm_mode_create_tile_group()
2640 ret = idr_alloc(&dev->mode_config.tile_idr, tg, 1, 0, GFP_KERNEL); in drm_mode_create_tile_group()
2642 tg->id = ret; in drm_mode_create_tile_group()
2648 mutex_unlock(&dev->mode_config.idr_mutex); in drm_mode_create_tile_group()