Lines Matching +full:itu +full:- +full:r
49 * Hence they are reference-counted using drm_connector_get() and
65 * For connectors which are not fixed (like built-in panels) the driver needs to
74 * Note drm_connector_[un]register() first take connector->lock and then
92 { DRM_MODE_CONNECTOR_DVII, "DVI-I" },
93 { DRM_MODE_CONNECTOR_DVID, "DVI-D" },
94 { DRM_MODE_CONNECTOR_DVIA, "DVI-A" },
101 { DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" },
102 { DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" },
130 * drm_get_connector_type_name - return a string for connector type
145 * drm_connector_get_cmdline_mode - reads the user's cmdline mode
148 * The kernel supports per-connector configuration of its consoles through
156 struct drm_cmdline_mode *mode = &connector->cmdline_mode; in drm_connector_get_cmdline_mode()
159 if (fb_get_options(connector->name, &option)) in drm_connector_get_cmdline_mode()
167 if (mode->force) { in drm_connector_get_cmdline_mode()
168 DRM_INFO("forcing %s connector %s\n", connector->name, in drm_connector_get_cmdline_mode()
169 drm_get_connector_force_name(mode->force)); in drm_connector_get_cmdline_mode()
170 connector->force = mode->force; in drm_connector_get_cmdline_mode()
173 if (mode->panel_orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN) { in drm_connector_get_cmdline_mode()
175 connector->name, mode->panel_orientation); in drm_connector_get_cmdline_mode()
177 mode->panel_orientation); in drm_connector_get_cmdline_mode()
181 connector->name, mode->name, in drm_connector_get_cmdline_mode()
182 mode->xres, mode->yres, in drm_connector_get_cmdline_mode()
183 mode->refresh_specified ? mode->refresh : 60, in drm_connector_get_cmdline_mode()
184 mode->rb ? " reduced blanking" : "", in drm_connector_get_cmdline_mode()
185 mode->margins ? " with margins" : "", in drm_connector_get_cmdline_mode()
186 mode->interlace ? " interlaced" : ""); in drm_connector_get_cmdline_mode()
193 struct drm_device *dev = connector->dev; in drm_connector_free()
195 drm_mode_object_unregister(dev, &connector->base); in drm_connector_free()
196 connector->funcs->destroy(connector); in drm_connector_free()
204 struct drm_mode_config *config = &dev->mode_config; in drm_connector_free_work_fn()
208 spin_lock_irqsave(&config->connector_list_lock, flags); in drm_connector_free_work_fn()
209 freed = llist_del_all(&config->connector_free_list); in drm_connector_free_work_fn()
210 spin_unlock_irqrestore(&config->connector_list_lock, flags); in drm_connector_free_work_fn()
213 drm_mode_object_unregister(dev, &connector->base); in drm_connector_free_work_fn()
214 connector->funcs->destroy(connector); in drm_connector_free_work_fn()
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_alloc_max(&config->connector_ida, 31, 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()
271 connector->ddc = ddc; in __drm_connector_init()
273 INIT_LIST_HEAD(&connector->global_connector_list_entry); in __drm_connector_init()
274 INIT_LIST_HEAD(&connector->probed_modes); in __drm_connector_init()
275 INIT_LIST_HEAD(&connector->modes); in __drm_connector_init()
276 mutex_init(&connector->mutex); in __drm_connector_init()
277 connector->edid_blob_ptr = NULL; in __drm_connector_init()
278 connector->epoch_counter = 0; in __drm_connector_init()
279 connector->tile_blob_ptr = NULL; in __drm_connector_init()
280 connector->status = connector_status_unknown; in __drm_connector_init()
281 connector->display_info.panel_orientation = in __drm_connector_init()
289 spin_lock_irq(&config->connector_list_lock); in __drm_connector_init()
290 list_add_tail(&connector->head, &config->connector_list); in __drm_connector_init()
291 config->num_connector++; in __drm_connector_init()
292 spin_unlock_irq(&config->connector_list_lock); in __drm_connector_init()
298 drm_object_attach_property(&connector->base, in __drm_connector_init()
299 config->dpms_property, 0); in __drm_connector_init()
301 drm_object_attach_property(&connector->base, in __drm_connector_init()
302 config->link_status_property, in __drm_connector_init()
305 drm_object_attach_property(&connector->base, in __drm_connector_init()
306 config->non_desktop_property, in __drm_connector_init()
308 drm_object_attach_property(&connector->base, in __drm_connector_init()
309 config->tile_property, in __drm_connector_init()
313 drm_object_attach_property(&connector->base, config->prop_crtc_id, 0); in __drm_connector_init()
316 connector->debugfs_entry = NULL; in __drm_connector_init()
319 ida_free(connector_ida, connector->connector_type_id); in __drm_connector_init()
322 ida_free(&config->connector_ida, connector->index); in __drm_connector_init()
325 drm_mode_object_unregister(dev, &connector->base); in __drm_connector_init()
331 * drm_connector_init - Init a preallocated connector
356 if (drm_WARN_ON(dev, !(funcs && funcs->destroy))) in drm_connector_init()
357 return -EINVAL; in drm_connector_init()
364 * drm_connector_init_with_ddc - Init a preallocated connector
393 if (drm_WARN_ON(dev, !(funcs && funcs->destroy))) in drm_connector_init_with_ddc()
394 return -EINVAL; in drm_connector_init_with_ddc()
409 * drmm_connector_init - Init a preallocated connector
420 * drm_connector_cleanup() in a DRM-managed action.
435 if (drm_WARN_ON(dev, funcs && funcs->destroy)) in drmm_connector_init()
436 return -EINVAL; in drmm_connector_init()
452 * drm_connector_attach_edid_property - attach edid property.
461 struct drm_mode_config *config = &connector->dev->mode_config; in drm_connector_attach_edid_property()
463 drm_object_attach_property(&connector->base, in drm_connector_attach_edid_property()
464 config->edid_property, in drm_connector_attach_edid_property()
470 * drm_connector_attach_encoder - attach a connector to an encoder
487 * direct assignment of connector->encoder = encoder. This connection in drm_connector_attach_encoder()
495 if (WARN_ON(connector->encoder)) in drm_connector_attach_encoder()
496 return -EINVAL; in drm_connector_attach_encoder()
498 connector->possible_encoders |= drm_encoder_mask(encoder); in drm_connector_attach_encoder()
505 * drm_connector_has_possible_encoder - check if the connector and encoder are
516 return connector->possible_encoders & drm_encoder_mask(encoder); in drm_connector_has_possible_encoder()
523 list_del(&mode->head); in drm_mode_remove()
524 drm_mode_destroy(connector->dev, mode); in drm_mode_remove()
528 * drm_connector_cleanup - cleans up an initialised connector
535 struct drm_device *dev = connector->dev; in drm_connector_cleanup()
541 if (WARN_ON(connector->registration_state == in drm_connector_cleanup()
545 if (connector->privacy_screen) { in drm_connector_cleanup()
546 drm_privacy_screen_put(connector->privacy_screen); in drm_connector_cleanup()
547 connector->privacy_screen = NULL; in drm_connector_cleanup()
550 if (connector->tile_group) { in drm_connector_cleanup()
551 drm_mode_put_tile_group(dev, connector->tile_group); in drm_connector_cleanup()
552 connector->tile_group = NULL; in drm_connector_cleanup()
555 list_for_each_entry_safe(mode, t, &connector->probed_modes, head) in drm_connector_cleanup()
558 list_for_each_entry_safe(mode, t, &connector->modes, head) in drm_connector_cleanup()
561 ida_free(&drm_connector_enum_list[connector->connector_type].ida, in drm_connector_cleanup()
562 connector->connector_type_id); in drm_connector_cleanup()
564 ida_free(&dev->mode_config.connector_ida, connector->index); in drm_connector_cleanup()
566 kfree(connector->display_info.bus_formats); in drm_connector_cleanup()
567 drm_mode_object_unregister(dev, &connector->base); in drm_connector_cleanup()
568 kfree(connector->name); in drm_connector_cleanup()
569 connector->name = NULL; in drm_connector_cleanup()
570 fwnode_handle_put(connector->fwnode); in drm_connector_cleanup()
571 connector->fwnode = NULL; in drm_connector_cleanup()
572 spin_lock_irq(&dev->mode_config.connector_list_lock); in drm_connector_cleanup()
573 list_del(&connector->head); in drm_connector_cleanup()
574 dev->mode_config.num_connector--; in drm_connector_cleanup()
575 spin_unlock_irq(&dev->mode_config.connector_list_lock); in drm_connector_cleanup()
577 WARN_ON(connector->state && !connector->funcs->atomic_destroy_state); in drm_connector_cleanup()
578 if (connector->state && connector->funcs->atomic_destroy_state) in drm_connector_cleanup()
579 connector->funcs->atomic_destroy_state(connector, in drm_connector_cleanup()
580 connector->state); in drm_connector_cleanup()
582 mutex_destroy(&connector->mutex); in drm_connector_cleanup()
589 * drm_connector_register - register a connector
607 if (!connector->dev->registered) in drm_connector_register()
610 mutex_lock(&connector->mutex); in drm_connector_register()
611 if (connector->registration_state != DRM_CONNECTOR_INITIALIZING) in drm_connector_register()
620 if (connector->funcs->late_register) { in drm_connector_register()
621 ret = connector->funcs->late_register(connector); in drm_connector_register()
626 drm_mode_object_register(connector->dev, &connector->base); in drm_connector_register()
628 connector->registration_state = DRM_CONNECTOR_REGISTERED; in drm_connector_register()
633 if (connector->privacy_screen) in drm_connector_register()
634 drm_privacy_screen_register_notifier(connector->privacy_screen, in drm_connector_register()
635 &connector->privacy_screen_notifier); in drm_connector_register()
638 list_add_tail(&connector->global_connector_list_entry, &connector_list); in drm_connector_register()
646 mutex_unlock(&connector->mutex); in drm_connector_register()
652 * drm_connector_unregister - unregister a connector
661 mutex_lock(&connector->mutex); in drm_connector_unregister()
662 if (connector->registration_state != DRM_CONNECTOR_REGISTERED) { in drm_connector_unregister()
663 mutex_unlock(&connector->mutex); in drm_connector_unregister()
668 list_del_init(&connector->global_connector_list_entry); in drm_connector_unregister()
671 if (connector->privacy_screen) in drm_connector_unregister()
673 connector->privacy_screen, in drm_connector_unregister()
674 &connector->privacy_screen_notifier); in drm_connector_unregister()
676 if (connector->funcs->early_unregister) in drm_connector_unregister()
677 connector->funcs->early_unregister(connector); in drm_connector_unregister()
682 connector->registration_state = DRM_CONNECTOR_UNREGISTERED; in drm_connector_unregister()
683 mutex_unlock(&connector->mutex); in drm_connector_unregister()
718 * drm_get_connector_status_name - return a string for connector status
738 * drm_get_connector_force_name - return a string for connector force
766 * drm_connector_list_iter_begin - initialize a connector_list iterator
778 iter->dev = dev; in drm_connector_list_iter_begin()
779 iter->conn = NULL; in drm_connector_list_iter_begin()
785 * Extra-safe connector put function that works in any context. Should only be
792 struct drm_mode_config *config = &conn->dev->mode_config; in __drm_connector_put_safe()
794 lockdep_assert_held(&config->connector_list_lock); in __drm_connector_put_safe()
796 if (!refcount_dec_and_test(&conn->base.refcount.refcount)) in __drm_connector_put_safe()
799 llist_add(&conn->free_node, &config->connector_free_list); in __drm_connector_put_safe()
800 schedule_work(&config->connector_free_work); in __drm_connector_put_safe()
804 * drm_connector_list_iter_next - return next connector
813 struct drm_connector *old_conn = iter->conn; in drm_connector_list_iter_next()
814 struct drm_mode_config *config = &iter->dev->mode_config; in drm_connector_list_iter_next()
818 spin_lock_irqsave(&config->connector_list_lock, flags); in drm_connector_list_iter_next()
819 lhead = old_conn ? &old_conn->head : &config->connector_list; in drm_connector_list_iter_next()
822 if (lhead->next == &config->connector_list) { in drm_connector_list_iter_next()
823 iter->conn = NULL; in drm_connector_list_iter_next()
827 lhead = lhead->next; in drm_connector_list_iter_next()
828 iter->conn = list_entry(lhead, struct drm_connector, head); in drm_connector_list_iter_next()
831 } while (!kref_get_unless_zero(&iter->conn->base.refcount)); in drm_connector_list_iter_next()
835 spin_unlock_irqrestore(&config->connector_list_lock, flags); in drm_connector_list_iter_next()
837 return iter->conn; in drm_connector_list_iter_next()
842 * drm_connector_list_iter_end - tear down a connector_list iterator
852 struct drm_mode_config *config = &iter->dev->mode_config; in drm_connector_list_iter_end()
855 iter->dev = NULL; in drm_connector_list_iter_end()
856 if (iter->conn) { in drm_connector_list_iter_end()
857 spin_lock_irqsave(&config->connector_list_lock, flags); in drm_connector_list_iter_end()
858 __drm_connector_put_safe(iter->conn); in drm_connector_list_iter_end()
859 spin_unlock_irqrestore(&config->connector_list_lock, flags); in drm_connector_list_iter_end()
875 * drm_get_subpixel_order_name - return a string for a given subpixel enum
903 * drm_display_info_set_bus_formats - set the supported bus formats
909 * See MEDIA_BUS_FMT_* definitions in include/uapi/linux/media-bus-format.h for
922 return -EINVAL; in drm_display_info_set_bus_formats()
928 return -ENOMEM; in drm_display_info_set_bus_formats()
931 kfree(info->bus_formats); in drm_display_info_set_bus_formats()
932 info->bus_formats = fmts; in drm_display_info_set_bus_formats()
933 info->num_bus_formats = num_formats; in drm_display_info_set_bus_formats()
969 { DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I and TV-out */
970 { DRM_MODE_SUBCONNECTOR_DVID, "DVI-D" }, /* DVI-I */
971 { DRM_MODE_SUBCONNECTOR_DVIA, "DVI-A" }, /* DVI-I */
976 { DRM_MODE_SUBCONNECTOR_Unknown, "Unknown" }, /* DVI-I, TV-out and DP */
977 { DRM_MODE_SUBCONNECTOR_DVID, "DVI-D" }, /* DVI-I */
978 { DRM_MODE_SUBCONNECTOR_DVIA, "DVI-A" }, /* DVI-I */
984 { DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I and TV-out */
985 { DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */
986 { DRM_MODE_SUBCONNECTOR_SVIDEO, "SVIDEO" }, /* TV-out */
987 { DRM_MODE_SUBCONNECTOR_Component, "Component" }, /* TV-out */
988 { DRM_MODE_SUBCONNECTOR_SCART, "SCART" }, /* TV-out */
993 { DRM_MODE_SUBCONNECTOR_Unknown, "Unknown" }, /* DVI-I, TV-out and DP */
994 { DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */
995 { DRM_MODE_SUBCONNECTOR_SVIDEO, "SVIDEO" }, /* TV-out */
996 { DRM_MODE_SUBCONNECTOR_Component, "Component" }, /* TV-out */
997 { DRM_MODE_SUBCONNECTOR_SCART, "SCART" }, /* TV-out */
1003 { DRM_MODE_SUBCONNECTOR_Unknown, "Unknown" }, /* DVI-I, TV-out and DP */
1005 { DRM_MODE_SUBCONNECTOR_DVID, "DVI-D" }, /* DP */
1021 /* Standard Definition Colorimetry based on IEC 61966-2-4 */
1023 /* High Definition Colorimetry based on IEC 61966-2-4 */
1025 /* Colorimetry based on IEC 61966-2-1/Amendment 1 */
1027 /* Colorimetry based on IEC 61966-2-5 [33] */
1029 /* Colorimetry based on IEC 61966-2-5 */
1031 /* Colorimetry based on ITU-R BT.2020 */
1033 /* Colorimetry based on ITU-R BT.2020 */
1035 /* Colorimetry based on ITU-R BT.2020 */
1038 { DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65, "DCI-P3_RGB_D65" },
1039 { DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER, "DCI-P3_RGB_Theater" },
1044 * Format Table 2-120
1050 /* Colorimetry based on scRGB (IEC 61966-2-2) */
1052 /* Colorimetry based on IEC 61966-2-5 */
1054 /* Colorimetry based on SMPTE RP 431-2 */
1055 { DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65, "DCI-P3_RGB_D65" },
1056 /* Colorimetry based on ITU-R BT.2020 */
1060 /* Standard Definition Colorimetry based on IEC 61966-2-4 */
1062 /* High Definition Colorimetry based on IEC 61966-2-4 */
1064 /* Colorimetry based on IEC 61966-2-1/Amendment 1 */
1066 /* Colorimetry based on IEC 61966-2-5 [33] */
1068 /* Colorimetry based on ITU-R BT.2020 */
1070 /* Colorimetry based on ITU-R BT.2020 */
1087 * User-space should not parse the EDID to obtain information exposed via
1089 * fixups to the EDID). For instance, user-space should not try to parse
1111 * The second issue is that the DPMS state is only well-defined when the
1130 * compose together into one logical screen. This is used by both high-res
1132 * DP MST sinks), or high-res integrated panels (like dual-link DSI) which
1133 * are not gen-locked. Note that for tiled panels which are genlocked, like
1134 * dual-link LVDS or dual-link DSI, the driver should try to not expose the
1138 * link-status:
1139 * Connector link-status property to indicate the status of link. The
1140 * default value of link-status is "GOOD". If something fails during or
1145 * When user-space receives the hotplug uevent and detects a "BAD"
1146 * link-status, the sink doesn't receive pixels anymore (e.g. the screen
1148 * changed. User-space is expected to pick a new mode if the current one
1149 * has disappeared and perform a new modeset with link-status set to
1150 * "GOOD" to re-enable the connector.
1153 * link-status, the other are unaffected (ie. the sinks still continue to
1156 * When user-space performs an atomic commit on a connector with a "BAD"
1157 * link-status without resetting the property to "GOOD", the sink may
1158 * still not receive pixels. When user-space performs an atomic commit
1159 * which resets the link-status property to "GOOD" without the
1162 * User-space can only change link-status to "GOOD", changing it to "BAD"
1163 * is a no-op.
1165 * For backwards compatibility with non-atomic userspace the kernel
1166 * tries to automatically set the link-status back to "GOOD" in the
1195 * -EINVAL.
1199 * - DESIRED state should be preserved until userspace de-asserts it by
1202 * - If the state is DESIRED, kernel should attempt to re-authenticate the
1205 * - Kernel sends uevent with the connector id and property id through
1209 * - DESIRED -> ENABLED (authentication success)
1210 * - ENABLED -> DESIRED (termination of authentication)
1211 * - Please note no uevents for userspace triggered property state changes,
1214 * - DESIRED/ENABLED -> UNDESIRED
1215 * - UNDESIRED -> DESIRED
1216 * - Userspace is responsible for polling the property or listen to uevents
1231 * - "HDCP Type0": DRM_MODE_HDCP_CONTENT_TYPE0 = 0
1232 * - "HDCP Type1": DRM_MODE_HDCP_CONTENT_TYPE1 = 1
1267 * then kernel will disable the HDCP and re-enable with new type in the
1278 * SDP packet (Non-audio INFOFRAME SDP v1.3) for DP. This is then
1296 * - Some layers are HDR and others are SDR
1297 * - HDR layers luminance is not same as sink
1340 * This property defines how a non-native mode is upscaled to the native
1360 * have a built-in scaler).
1363 * This property is used by DVI-I, TVout and DisplayPort to indicate different
1366 * For DVI-I and TVout there is also a matching property "select subconnector"
1370 * privacy-screen sw-state, privacy-screen hw-state:
1376 * "privacy-screen hw-state" is read-only and reflects the actual state
1377 * of the privacy-screen, possible values: "Enabled", "Disabled,
1378 * "Enabled-locked", "Disabled-locked". The locked states indicate
1380 * might be devices where the firmware-setup options, or a hardware
1381 * slider-switch, offer always on / off modes.
1383 * "privacy-screen sw-state" can be set to change the privacy-screen state
1384 * when not locked. In this case the driver must update the hw-state
1386 * sw-state property. Setting the sw-state property when the hw-state is
1388 * state to the set state when the hw-state becomes unlocked. E.g. if
1389 * "privacy-screen hw-state" is "Enabled-locked" and the sw-state
1391 * changing the slider-switch position, then the driver must set the
1394 * In some cases the privacy-screen's actual state might change outside of
1398 * In this case the driver must update both the hw-state and the sw-state
1400 * sw-state. Any pending sw-state requests are thus discarded.
1404 * of the sw-state. Caching the sw-state value and including it in later
1407 * privacy-screen sw-state in an atomic commit unless it wants to change
1419 return -ENOMEM; in drm_connector_create_standard_properties()
1420 dev->mode_config.edid_property = prop; in drm_connector_create_standard_properties()
1426 return -ENOMEM; in drm_connector_create_standard_properties()
1427 dev->mode_config.dpms_property = prop; in drm_connector_create_standard_properties()
1434 return -ENOMEM; in drm_connector_create_standard_properties()
1435 dev->mode_config.path_property = prop; in drm_connector_create_standard_properties()
1442 return -ENOMEM; in drm_connector_create_standard_properties()
1443 dev->mode_config.tile_property = prop; in drm_connector_create_standard_properties()
1445 prop = drm_property_create_enum(dev, 0, "link-status", in drm_connector_create_standard_properties()
1449 return -ENOMEM; in drm_connector_create_standard_properties()
1450 dev->mode_config.link_status_property = prop; in drm_connector_create_standard_properties()
1452 prop = drm_property_create_bool(dev, DRM_MODE_PROP_IMMUTABLE, "non-desktop"); in drm_connector_create_standard_properties()
1454 return -ENOMEM; in drm_connector_create_standard_properties()
1455 dev->mode_config.non_desktop_property = prop; in drm_connector_create_standard_properties()
1460 return -ENOMEM; in drm_connector_create_standard_properties()
1461 dev->mode_config.hdr_output_metadata_property = prop; in drm_connector_create_standard_properties()
1467 * drm_mode_create_dvi_i_properties - create DVI-I specific connector properties
1470 * Called by a driver the first time a DVI-I connector is made.
1479 if (dev->mode_config.dvi_i_select_subconnector_property) in drm_mode_create_dvi_i_properties()
1487 dev->mode_config.dvi_i_select_subconnector_property = dvi_i_selector; in drm_mode_create_dvi_i_properties()
1493 dev->mode_config.dvi_i_subconnector_property = dvi_i_subconnector; in drm_mode_create_dvi_i_properties()
1500 * drm_connector_attach_dp_subconnector_property - create subconnector property for DP
1507 struct drm_mode_config *mode_config = &connector->dev->mode_config; in drm_connector_attach_dp_subconnector_property()
1509 if (!mode_config->dp_subconnector_property) in drm_connector_attach_dp_subconnector_property()
1510 mode_config->dp_subconnector_property = in drm_connector_attach_dp_subconnector_property()
1511 drm_property_create_enum(connector->dev, in drm_connector_attach_dp_subconnector_property()
1517 drm_object_attach_property(&connector->base, in drm_connector_attach_dp_subconnector_property()
1518 mode_config->dp_subconnector_property, in drm_connector_attach_dp_subconnector_property()
1544 * The meaning of each content type is defined in CTA-861-G table 15.
1552 * drm_connector_attach_content_type_property - attach content-type property
1561 if (!drm_mode_create_content_type_property(connector->dev)) in drm_connector_attach_content_type_property()
1562 drm_object_attach_property(&connector->base, in drm_connector_attach_content_type_property()
1563 connector->dev->mode_config.content_type_property, in drm_connector_attach_content_type_property()
1570 * drm_connector_attach_tv_margin_properties - attach TV connector margin
1579 struct drm_device *dev = connector->dev; in drm_connector_attach_tv_margin_properties()
1581 drm_object_attach_property(&connector->base, in drm_connector_attach_tv_margin_properties()
1582 dev->mode_config.tv_left_margin_property, in drm_connector_attach_tv_margin_properties()
1584 drm_object_attach_property(&connector->base, in drm_connector_attach_tv_margin_properties()
1585 dev->mode_config.tv_right_margin_property, in drm_connector_attach_tv_margin_properties()
1587 drm_object_attach_property(&connector->base, in drm_connector_attach_tv_margin_properties()
1588 dev->mode_config.tv_top_margin_property, in drm_connector_attach_tv_margin_properties()
1590 drm_object_attach_property(&connector->base, in drm_connector_attach_tv_margin_properties()
1591 dev->mode_config.tv_bottom_margin_property, in drm_connector_attach_tv_margin_properties()
1597 * drm_mode_create_tv_margin_properties - create TV connector margin properties
1610 if (dev->mode_config.tv_left_margin_property) in drm_mode_create_tv_margin_properties()
1613 dev->mode_config.tv_left_margin_property = in drm_mode_create_tv_margin_properties()
1615 if (!dev->mode_config.tv_left_margin_property) in drm_mode_create_tv_margin_properties()
1616 return -ENOMEM; in drm_mode_create_tv_margin_properties()
1618 dev->mode_config.tv_right_margin_property = in drm_mode_create_tv_margin_properties()
1620 if (!dev->mode_config.tv_right_margin_property) in drm_mode_create_tv_margin_properties()
1621 return -ENOMEM; in drm_mode_create_tv_margin_properties()
1623 dev->mode_config.tv_top_margin_property = in drm_mode_create_tv_margin_properties()
1625 if (!dev->mode_config.tv_top_margin_property) in drm_mode_create_tv_margin_properties()
1626 return -ENOMEM; in drm_mode_create_tv_margin_properties()
1628 dev->mode_config.tv_bottom_margin_property = in drm_mode_create_tv_margin_properties()
1630 if (!dev->mode_config.tv_bottom_margin_property) in drm_mode_create_tv_margin_properties()
1631 return -ENOMEM; in drm_mode_create_tv_margin_properties()
1638 * drm_mode_create_tv_properties - create TV specific connector properties
1659 if (dev->mode_config.tv_select_subconnector_property) in drm_mode_create_tv_properties()
1672 dev->mode_config.tv_select_subconnector_property = tv_selector; in drm_mode_create_tv_properties()
1681 dev->mode_config.tv_subconnector_property = tv_subconnector; in drm_mode_create_tv_properties()
1689 dev->mode_config.tv_mode_property = in drm_mode_create_tv_properties()
1692 if (!dev->mode_config.tv_mode_property) in drm_mode_create_tv_properties()
1696 drm_property_add_enum(dev->mode_config.tv_mode_property, in drm_mode_create_tv_properties()
1699 dev->mode_config.tv_brightness_property = in drm_mode_create_tv_properties()
1701 if (!dev->mode_config.tv_brightness_property) in drm_mode_create_tv_properties()
1704 dev->mode_config.tv_contrast_property = in drm_mode_create_tv_properties()
1706 if (!dev->mode_config.tv_contrast_property) in drm_mode_create_tv_properties()
1709 dev->mode_config.tv_flicker_reduction_property = in drm_mode_create_tv_properties()
1711 if (!dev->mode_config.tv_flicker_reduction_property) in drm_mode_create_tv_properties()
1714 dev->mode_config.tv_overscan_property = in drm_mode_create_tv_properties()
1716 if (!dev->mode_config.tv_overscan_property) in drm_mode_create_tv_properties()
1719 dev->mode_config.tv_saturation_property = in drm_mode_create_tv_properties()
1721 if (!dev->mode_config.tv_saturation_property) in drm_mode_create_tv_properties()
1724 dev->mode_config.tv_hue_property = in drm_mode_create_tv_properties()
1726 if (!dev->mode_config.tv_hue_property) in drm_mode_create_tv_properties()
1731 return -ENOMEM; in drm_mode_create_tv_properties()
1736 * drm_mode_create_scaling_mode_property - create scaling mode property
1752 if (dev->mode_config.scaling_mode_property) in drm_mode_create_scaling_mode_property()
1760 dev->mode_config.scaling_mode_property = scaling_mode; in drm_mode_create_scaling_mode_property()
1814 * vertical front porch duration will be extended until page-flip or
1829 * drm_connector_attach_vrr_capable_property - creates the
1842 struct drm_device *dev = connector->dev; in drm_connector_attach_vrr_capable_property()
1845 if (!connector->vrr_capable_property) { in drm_connector_attach_vrr_capable_property()
1849 return -ENOMEM; in drm_connector_attach_vrr_capable_property()
1851 connector->vrr_capable_property = prop; in drm_connector_attach_vrr_capable_property()
1852 drm_object_attach_property(&connector->base, prop, 0); in drm_connector_attach_vrr_capable_property()
1860 * drm_connector_attach_scaling_mode_property - attach atomic scaling mode property
1866 * and can be used from &drm_connector_helper_funcs->atomic_check for validation.
1876 struct drm_device *dev = connector->dev; in drm_connector_attach_scaling_mode_property()
1880 (1U << ARRAY_SIZE(drm_scaling_mode_enum_list)) - 1; in drm_connector_attach_scaling_mode_property()
1884 return -EINVAL; in drm_connector_attach_scaling_mode_property()
1891 return -ENOMEM; in drm_connector_attach_scaling_mode_property()
1910 drm_object_attach_property(&connector->base, in drm_connector_attach_scaling_mode_property()
1913 connector->scaling_mode_property = scaling_mode_property; in drm_connector_attach_scaling_mode_property()
1920 * drm_mode_create_aspect_ratio_property - create aspect ratio property
1931 if (dev->mode_config.aspect_ratio_property) in drm_mode_create_aspect_ratio_property()
1934 dev->mode_config.aspect_ratio_property = in drm_mode_create_aspect_ratio_property()
1939 if (dev->mode_config.aspect_ratio_property == NULL) in drm_mode_create_aspect_ratio_property()
1940 return -ENOMEM; in drm_mode_create_aspect_ratio_property()
1962 * - Set up CRTC DEGAMMA/CTM/GAMMA to convert to some sink
1964 * - Set this new property to let the sink know what it
1966 * - This property is just to inform sink what colorspace
1975 * drm_mode_create_hdmi_colorspace_property - create hdmi colorspace property
1986 struct drm_device *dev = connector->dev; in drm_mode_create_hdmi_colorspace_property()
1988 if (connector->colorspace_property) in drm_mode_create_hdmi_colorspace_property()
1991 connector->colorspace_property = in drm_mode_create_hdmi_colorspace_property()
1996 if (!connector->colorspace_property) in drm_mode_create_hdmi_colorspace_property()
1997 return -ENOMEM; in drm_mode_create_hdmi_colorspace_property()
2004 * drm_mode_create_dp_colorspace_property - create dp colorspace property
2015 struct drm_device *dev = connector->dev; in drm_mode_create_dp_colorspace_property()
2017 if (connector->colorspace_property) in drm_mode_create_dp_colorspace_property()
2020 connector->colorspace_property = in drm_mode_create_dp_colorspace_property()
2025 if (!connector->colorspace_property) in drm_mode_create_dp_colorspace_property()
2026 return -ENOMEM; in drm_mode_create_dp_colorspace_property()
2033 * drm_mode_create_content_type_property - create content type property
2044 if (dev->mode_config.content_type_property) in drm_mode_create_content_type_property()
2047 dev->mode_config.content_type_property = in drm_mode_create_content_type_property()
2052 if (dev->mode_config.content_type_property == NULL) in drm_mode_create_content_type_property()
2053 return -ENOMEM; in drm_mode_create_content_type_property()
2060 * drm_mode_create_suggested_offset_properties - create suggests offset properties
2070 if (dev->mode_config.suggested_x_property && dev->mode_config.suggested_y_property) in drm_mode_create_suggested_offset_properties()
2073 dev->mode_config.suggested_x_property = in drm_mode_create_suggested_offset_properties()
2076 dev->mode_config.suggested_y_property = in drm_mode_create_suggested_offset_properties()
2079 if (dev->mode_config.suggested_x_property == NULL || in drm_mode_create_suggested_offset_properties()
2080 dev->mode_config.suggested_y_property == NULL) in drm_mode_create_suggested_offset_properties()
2081 return -ENOMEM; in drm_mode_create_suggested_offset_properties()
2087 * drm_connector_set_path_property - set tile property on connector
2102 struct drm_device *dev = connector->dev; in drm_connector_set_path_property()
2106 &connector->path_blob_ptr, in drm_connector_set_path_property()
2109 &connector->base, in drm_connector_set_path_property()
2110 dev->mode_config.path_property); in drm_connector_set_path_property()
2116 * drm_connector_set_tile_property - set tile property on connector
2130 struct drm_device *dev = connector->dev; in drm_connector_set_tile_property()
2134 if (!connector->has_tile) { in drm_connector_set_tile_property()
2136 &connector->tile_blob_ptr, in drm_connector_set_tile_property()
2139 &connector->base, in drm_connector_set_tile_property()
2140 dev->mode_config.tile_property); in drm_connector_set_tile_property()
2145 connector->tile_group->id, connector->tile_is_single_monitor, in drm_connector_set_tile_property()
2146 connector->num_h_tile, connector->num_v_tile, in drm_connector_set_tile_property()
2147 connector->tile_h_loc, connector->tile_v_loc, in drm_connector_set_tile_property()
2148 connector->tile_h_size, connector->tile_v_size); in drm_connector_set_tile_property()
2151 &connector->tile_blob_ptr, in drm_connector_set_tile_property()
2154 &connector->base, in drm_connector_set_tile_property()
2155 dev->mode_config.tile_property); in drm_connector_set_tile_property()
2161 * drm_connector_set_link_status_property - Set link status property of a connector
2168 * hotplug uevent for userspace to re-check the valid modes through
2173 * re-training a link) without userspace's intervention.
2182 struct drm_device *dev = connector->dev; in drm_connector_set_link_status_property()
2184 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); in drm_connector_set_link_status_property()
2185 connector->state->link_status = link_status; in drm_connector_set_link_status_property()
2186 drm_modeset_unlock(&dev->mode_config.connection_mutex); in drm_connector_set_link_status_property()
2191 * drm_connector_attach_max_bpc_property - attach "max bpc" property
2204 struct drm_device *dev = connector->dev; in drm_connector_attach_max_bpc_property()
2207 prop = connector->max_bpc_property; in drm_connector_attach_max_bpc_property()
2211 return -ENOMEM; in drm_connector_attach_max_bpc_property()
2213 connector->max_bpc_property = prop; in drm_connector_attach_max_bpc_property()
2216 drm_object_attach_property(&connector->base, prop, max); in drm_connector_attach_max_bpc_property()
2217 connector->state->max_requested_bpc = max; in drm_connector_attach_max_bpc_property()
2218 connector->state->max_bpc = max; in drm_connector_attach_max_bpc_property()
2225 * drm_connector_attach_hdr_output_metadata_property - attach "HDR_OUTPUT_METADA" property
2236 struct drm_device *dev = connector->dev; in drm_connector_attach_hdr_output_metadata_property()
2237 struct drm_property *prop = dev->mode_config.hdr_output_metadata_property; in drm_connector_attach_hdr_output_metadata_property()
2239 drm_object_attach_property(&connector->base, prop, 0); in drm_connector_attach_hdr_output_metadata_property()
2246 * drm_connector_attach_colorspace_property - attach "Colorspace" property
2257 struct drm_property *prop = connector->colorspace_property; in drm_connector_attach_colorspace_property()
2259 drm_object_attach_property(&connector->base, prop, DRM_MODE_COLORIMETRY_DEFAULT); in drm_connector_attach_colorspace_property()
2266 * drm_connector_atomic_hdr_metadata_equal - checks if the hdr metadata changed
2270 * This is used by HDR-enabled drivers to test whether the HDR metadata
2280 struct drm_property_blob *old_blob = old_state->hdr_output_metadata; in drm_connector_atomic_hdr_metadata_equal()
2281 struct drm_property_blob *new_blob = new_state->hdr_output_metadata; in drm_connector_atomic_hdr_metadata_equal()
2286 if (old_blob->length != new_blob->length) in drm_connector_atomic_hdr_metadata_equal()
2289 return !memcmp(old_blob->data, new_blob->data, old_blob->length); in drm_connector_atomic_hdr_metadata_equal()
2294 * drm_connector_set_vrr_capable_property - sets the variable refresh rate
2305 if (!connector->vrr_capable_property) in drm_connector_set_vrr_capable_property()
2308 drm_object_property_set_value(&connector->base, in drm_connector_set_vrr_capable_property()
2309 connector->vrr_capable_property, in drm_connector_set_vrr_capable_property()
2315 * drm_connector_set_panel_orientation - sets the connector's panel_orientation
2316 * @connector: connector for which to set the panel-orientation property.
2323 * already been set is a no-op (e.g. the orientation has been overridden with
2327 * DRM_MODE_PANEL_ORIENTATION_UNKNOWN, in which case it is a no-op.
2339 struct drm_device *dev = connector->dev; in drm_connector_set_panel_orientation()
2340 struct drm_display_info *info = &connector->display_info; in drm_connector_set_panel_orientation()
2344 if (info->panel_orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN) in drm_connector_set_panel_orientation()
2351 info->panel_orientation = panel_orientation; in drm_connector_set_panel_orientation()
2353 prop = dev->mode_config.panel_orientation_property; in drm_connector_set_panel_orientation()
2360 return -ENOMEM; in drm_connector_set_panel_orientation()
2362 dev->mode_config.panel_orientation_property = prop; in drm_connector_set_panel_orientation()
2365 drm_object_attach_property(&connector->base, prop, in drm_connector_set_panel_orientation()
2366 info->panel_orientation); in drm_connector_set_panel_orientation()
2372 * drm_connector_set_panel_orientation_with_quirk - set the
2374 * @connector: connector for which to init the panel-orientation property.
2402 * drm_connector_set_orientation_from_panel -
2404 * @connector: connector for which to init the panel-orientation property.
2419 if (panel && panel->funcs && panel->funcs->get_orientation) in drm_connector_set_orientation_from_panel()
2420 orientation = panel->funcs->get_orientation(panel); in drm_connector_set_orientation_from_panel()
2431 { PRIVACY_SCREEN_DISABLED_LOCKED, "Disabled-locked" },
2432 { PRIVACY_SCREEN_ENABLED_LOCKED, "Enabled-locked" },
2436 * drm_connector_create_privacy_screen_properties - create the drm connecter's
2437 * privacy-screen properties.
2438 * @connector: connector for which to create the privacy-screen properties
2440 * This function creates the "privacy-screen sw-state" and "privacy-screen
2441 * hw-state" properties for the connector. They are not attached.
2446 if (connector->privacy_screen_sw_state_property) in drm_connector_create_privacy_screen_properties()
2449 /* Note sw-state only supports the first 2 values of the enum */ in drm_connector_create_privacy_screen_properties()
2450 connector->privacy_screen_sw_state_property = in drm_connector_create_privacy_screen_properties()
2451 drm_property_create_enum(connector->dev, DRM_MODE_PROP_ENUM, in drm_connector_create_privacy_screen_properties()
2452 "privacy-screen sw-state", in drm_connector_create_privacy_screen_properties()
2455 connector->privacy_screen_hw_state_property = in drm_connector_create_privacy_screen_properties()
2456 drm_property_create_enum(connector->dev, in drm_connector_create_privacy_screen_properties()
2458 "privacy-screen hw-state", in drm_connector_create_privacy_screen_properties()
2465 * drm_connector_attach_privacy_screen_properties - attach the drm connecter's
2466 * privacy-screen properties.
2467 * @connector: connector on which to attach the privacy-screen properties
2469 * This function attaches the "privacy-screen sw-state" and "privacy-screen
2470 * hw-state" properties to the connector. The initial state of both is set
2476 if (!connector->privacy_screen_sw_state_property) in drm_connector_attach_privacy_screen_properties()
2479 drm_object_attach_property(&connector->base, in drm_connector_attach_privacy_screen_properties()
2480 connector->privacy_screen_sw_state_property, in drm_connector_attach_privacy_screen_properties()
2483 drm_object_attach_property(&connector->base, in drm_connector_attach_privacy_screen_properties()
2484 connector->privacy_screen_hw_state_property, in drm_connector_attach_privacy_screen_properties()
2494 drm_privacy_screen_get_state(connector->privacy_screen, in drm_connector_update_privacy_screen_properties()
2498 connector->state->privacy_screen_sw_state = sw_state; in drm_connector_update_privacy_screen_properties()
2499 drm_object_property_set_value(&connector->base, in drm_connector_update_privacy_screen_properties()
2500 connector->privacy_screen_hw_state_property, hw_state); in drm_connector_update_privacy_screen_properties()
2508 struct drm_device *dev = connector->dev; in drm_connector_privacy_screen_notifier()
2510 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); in drm_connector_privacy_screen_notifier()
2512 drm_modeset_unlock(&dev->mode_config.connection_mutex); in drm_connector_privacy_screen_notifier()
2515 connector->privacy_screen_sw_state_property); in drm_connector_privacy_screen_notifier()
2517 connector->privacy_screen_hw_state_property); in drm_connector_privacy_screen_notifier()
2523 * drm_connector_attach_privacy_screen_provider - attach a privacy-screen to
2525 * @connector: connector to attach the privacy-screen to
2528 * Create and attach the standard privacy-screen properties and register
2529 * a generic notifier for generating sysfs-connector-status-events
2530 * on external changes to the privacy-screen status.
2537 connector->privacy_screen = priv; in drm_connector_attach_privacy_screen_provider()
2538 connector->privacy_screen_notifier.notifier_call = in drm_connector_attach_privacy_screen_provider()
2548 * drm_connector_update_privacy_screen - update connector's privacy-screen sw-state
2549 * @connector_state: connector-state to update the privacy-screen for
2552 * privacy-screen.
2554 * If the connector has no privacy-screen, then this is a no-op.
2558 struct drm_connector *connector = connector_state->connector; in drm_connector_update_privacy_screen()
2561 if (!connector->privacy_screen) in drm_connector_update_privacy_screen()
2564 ret = drm_privacy_screen_set_sw_state(connector->privacy_screen, in drm_connector_update_privacy_screen()
2565 connector_state->privacy_screen_sw_state); in drm_connector_update_privacy_screen()
2567 drm_err(connector->dev, "Error updating privacy-screen sw_state\n"); in drm_connector_update_privacy_screen()
2580 int ret = -EINVAL; in drm_connector_set_obj_prop()
2584 if (property == connector->dev->mode_config.dpms_property) { in drm_connector_set_obj_prop()
2585 ret = (*connector->funcs->dpms)(connector, (int)value); in drm_connector_set_obj_prop()
2586 } else if (connector->funcs->set_property) in drm_connector_set_obj_prop()
2587 ret = connector->funcs->set_property(connector, property, value); in drm_connector_set_obj_prop()
2590 drm_object_property_set_value(&connector->base, property, value); in drm_connector_set_obj_prop()
2599 .value = conn_set_prop->value, in drm_connector_property_set_ioctl()
2600 .prop_id = conn_set_prop->prop_id, in drm_connector_property_set_ioctl()
2601 .obj_id = conn_set_prop->connector_id, in drm_connector_property_set_ioctl()
2614 if (connector->state) in drm_connector_get_encoder()
2615 return connector->state->best_encoder; in drm_connector_get_encoder()
2616 return connector->encoder; in drm_connector_get_encoder()
2625 * If user-space hasn't configured the driver to expose the stereo 3D in drm_mode_expose_to_userspace()
2628 if (!file_priv->stereo_allowed && drm_mode_is_stereo(mode)) in drm_mode_expose_to_userspace()
2631 * If user-space hasn't configured the driver to expose the modes in drm_mode_expose_to_userspace()
2632 * with aspect-ratio, don't expose them. However if such a mode in drm_mode_expose_to_userspace()
2633 * is unique, let it be exposed, but reset the aspect-ratio flags in drm_mode_expose_to_userspace()
2634 * while preparing the list of user-modes. in drm_mode_expose_to_userspace()
2636 if (!file_priv->aspect_ratio_allowed) { in drm_mode_expose_to_userspace()
2640 if (mode_itr->expose_to_userspace && in drm_mode_expose_to_userspace()
2670 return -EOPNOTSUPP; in drm_mode_getconnector()
2674 connector = drm_connector_lookup(dev, file_priv, out_resp->connector_id); in drm_mode_getconnector()
2676 return -ENOENT; in drm_mode_getconnector()
2678 encoders_count = hweight32(connector->possible_encoders); in drm_mode_getconnector()
2680 if ((out_resp->count_encoders >= encoders_count) && encoders_count) { in drm_mode_getconnector()
2682 encoder_ptr = (uint32_t __user *)(unsigned long)(out_resp->encoders_ptr); in drm_mode_getconnector()
2685 if (put_user(encoder->base.id, encoder_ptr + copied)) { in drm_mode_getconnector()
2686 ret = -EFAULT; in drm_mode_getconnector()
2692 out_resp->count_encoders = encoders_count; in drm_mode_getconnector()
2694 out_resp->connector_id = connector->base.id; in drm_mode_getconnector()
2695 out_resp->connector_type = connector->connector_type; in drm_mode_getconnector()
2696 out_resp->connector_type_id = connector->connector_type_id; in drm_mode_getconnector()
2700 mutex_lock(&dev->mode_config.mutex); in drm_mode_getconnector()
2701 if (out_resp->count_modes == 0) { in drm_mode_getconnector()
2703 connector->funcs->fill_modes(connector, in drm_mode_getconnector()
2704 dev->mode_config.max_width, in drm_mode_getconnector()
2705 dev->mode_config.max_height); in drm_mode_getconnector()
2707 …drm_dbg_kms(dev, "User-space requested a forced probe on [CONNECTOR:%d:%s] but is not the DRM mast… in drm_mode_getconnector()
2708 connector->base.id, connector->name); in drm_mode_getconnector()
2711 out_resp->mm_width = connector->display_info.width_mm; in drm_mode_getconnector()
2712 out_resp->mm_height = connector->display_info.height_mm; in drm_mode_getconnector()
2713 out_resp->subpixel = connector->display_info.subpixel_order; in drm_mode_getconnector()
2714 out_resp->connection = connector->status; in drm_mode_getconnector()
2716 /* delayed so we get modes regardless of pre-fill_modes state */ in drm_mode_getconnector()
2717 list_for_each_entry(mode, &connector->modes, head) { in drm_mode_getconnector()
2718 WARN_ON(mode->expose_to_userspace); in drm_mode_getconnector()
2720 if (drm_mode_expose_to_userspace(mode, &connector->modes, in drm_mode_getconnector()
2722 mode->expose_to_userspace = true; in drm_mode_getconnector()
2731 if ((out_resp->count_modes >= mode_count) && mode_count) { in drm_mode_getconnector()
2733 mode_ptr = (struct drm_mode_modeinfo __user *)(unsigned long)out_resp->modes_ptr; in drm_mode_getconnector()
2734 list_for_each_entry(mode, &connector->modes, head) { in drm_mode_getconnector()
2735 if (!mode->expose_to_userspace) in drm_mode_getconnector()
2739 mode->expose_to_userspace = false; in drm_mode_getconnector()
2743 * Reset aspect ratio flags of user-mode, if modes with in drm_mode_getconnector()
2744 * aspect-ratio are not supported. in drm_mode_getconnector()
2746 if (!file_priv->aspect_ratio_allowed) in drm_mode_getconnector()
2750 ret = -EFAULT; in drm_mode_getconnector()
2756 list_for_each_entry_continue(mode, &connector->modes, head) in drm_mode_getconnector()
2757 mode->expose_to_userspace = false; in drm_mode_getconnector()
2759 mutex_unlock(&dev->mode_config.mutex); in drm_mode_getconnector()
2767 list_for_each_entry(mode, &connector->modes, head) in drm_mode_getconnector()
2768 mode->expose_to_userspace = false; in drm_mode_getconnector()
2771 out_resp->count_modes = mode_count; in drm_mode_getconnector()
2772 mutex_unlock(&dev->mode_config.mutex); in drm_mode_getconnector()
2774 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); in drm_mode_getconnector()
2777 out_resp->encoder_id = encoder->base.id; in drm_mode_getconnector()
2779 out_resp->encoder_id = 0; in drm_mode_getconnector()
2784 ret = drm_mode_object_get_properties(&connector->base, file_priv->atomic, in drm_mode_getconnector()
2785 (uint32_t __user *)(unsigned long)(out_resp->props_ptr), in drm_mode_getconnector()
2786 (uint64_t __user *)(unsigned long)(out_resp->prop_values_ptr), in drm_mode_getconnector()
2787 &out_resp->count_props); in drm_mode_getconnector()
2788 drm_modeset_unlock(&dev->mode_config.connection_mutex); in drm_mode_getconnector()
2797 * drm_connector_find_by_fwnode - Find a connector based on the associated fwnode
2809 struct drm_connector *connector, *found = ERR_PTR(-ENODEV); in drm_connector_find_by_fwnode()
2812 return ERR_PTR(-ENODEV); in drm_connector_find_by_fwnode()
2817 if (connector->fwnode == fwnode || in drm_connector_find_by_fwnode()
2818 (connector->fwnode && connector->fwnode->secondary == fwnode)) { in drm_connector_find_by_fwnode()
2831 * drm_connector_oob_hotplug_event - Report out-of-band hotplug event to connector
2835 * driver / device. An example of this is some USB Type-C setups where the hardware
2836 * muxes the DisplayPort data and aux-lines but does not pass the altmode HPD
2839 * This function can be used to report these out-of-band events after obtaining
2850 if (connector->funcs->oob_hotplug_event) in drm_connector_oob_hotplug_event()
2851 connector->funcs->oob_hotplug_event(connector); in drm_connector_oob_hotplug_event()
2862 * identifier. Tiled monitors using DisplayID v1.3 have a unique 8-byte handle,
2867 * the tile group information is exposed through a non-standard way.
2873 struct drm_device *dev = tg->dev; in drm_tile_group_free()
2875 mutex_lock(&dev->mode_config.idr_mutex); in drm_tile_group_free()
2876 idr_remove(&dev->mode_config.tile_idr, tg->id); in drm_tile_group_free()
2877 mutex_unlock(&dev->mode_config.idr_mutex); in drm_tile_group_free()
2882 * drm_mode_put_tile_group - drop a reference to a tile group.
2891 kref_put(&tg->refcount, drm_tile_group_free); in drm_mode_put_tile_group()
2896 * drm_mode_get_tile_group - get a reference to an existing tile group
2898 * @topology: 8-bytes unique per monitor.
2911 mutex_lock(&dev->mode_config.idr_mutex); in drm_mode_get_tile_group()
2912 idr_for_each_entry(&dev->mode_config.tile_idr, tg, id) { in drm_mode_get_tile_group()
2913 if (!memcmp(tg->group_data, topology, 8)) { in drm_mode_get_tile_group()
2914 if (!kref_get_unless_zero(&tg->refcount)) in drm_mode_get_tile_group()
2916 mutex_unlock(&dev->mode_config.idr_mutex); in drm_mode_get_tile_group()
2920 mutex_unlock(&dev->mode_config.idr_mutex); in drm_mode_get_tile_group()
2926 * drm_mode_create_tile_group - create a tile group from a displayid description
2928 * @topology: 8-bytes unique per monitor.
2946 kref_init(&tg->refcount); in drm_mode_create_tile_group()
2947 memcpy(tg->group_data, topology, 8); in drm_mode_create_tile_group()
2948 tg->dev = dev; in drm_mode_create_tile_group()
2950 mutex_lock(&dev->mode_config.idr_mutex); in drm_mode_create_tile_group()
2951 ret = idr_alloc(&dev->mode_config.tile_idr, tg, 1, 0, GFP_KERNEL); in drm_mode_create_tile_group()
2953 tg->id = ret; in drm_mode_create_tile_group()
2959 mutex_unlock(&dev->mode_config.idr_mutex); in drm_mode_create_tile_group()