Lines Matching +full:flip +full:- +full:vertical

53  * Hence they are reference-counted using drm_connector_get() and
69 * For connectors which are not fixed (like built-in panels) the driver needs to
78 * Note drm_connector_[un]register() first take connector->lock and then
96 { DRM_MODE_CONNECTOR_DVII, "DVI-I" },
97 { DRM_MODE_CONNECTOR_DVID, "DVI-D" },
98 { DRM_MODE_CONNECTOR_DVIA, "DVI-A" },
105 { DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" },
106 { DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" },
134 * drm_get_connector_type_name - return a string for connector type
149 * drm_connector_get_cmdline_mode - reads the user's cmdline mode
152 * The kernel supports per-connector configuration of its consoles through
160 struct drm_cmdline_mode *mode = &connector->cmdline_mode; in drm_connector_get_cmdline_mode()
163 option = video_get_options(connector->name); in drm_connector_get_cmdline_mode()
172 if (mode->force) { in drm_connector_get_cmdline_mode()
173 DRM_INFO("forcing %s connector %s\n", connector->name, in drm_connector_get_cmdline_mode()
174 drm_get_connector_force_name(mode->force)); in drm_connector_get_cmdline_mode()
175 connector->force = mode->force; in drm_connector_get_cmdline_mode()
178 if (mode->panel_orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN) { in drm_connector_get_cmdline_mode()
180 connector->name, mode->panel_orientation); in drm_connector_get_cmdline_mode()
182 mode->panel_orientation); in drm_connector_get_cmdline_mode()
186 connector->name, mode->name, in drm_connector_get_cmdline_mode()
187 mode->xres, mode->yres, in drm_connector_get_cmdline_mode()
188 mode->refresh_specified ? mode->refresh : 60, in drm_connector_get_cmdline_mode()
189 mode->rb ? " reduced blanking" : "", in drm_connector_get_cmdline_mode()
190 mode->margins ? " with margins" : "", in drm_connector_get_cmdline_mode()
191 mode->interlace ? " interlaced" : ""); in drm_connector_get_cmdline_mode()
198 struct drm_device *dev = connector->dev; in drm_connector_free()
200 drm_mode_object_unregister(dev, &connector->base); in drm_connector_free()
201 connector->funcs->destroy(connector); in drm_connector_free()
209 struct drm_mode_config *config = &dev->mode_config; in drm_connector_free_work_fn()
213 spin_lock_irqsave(&config->connector_list_lock, flags); in drm_connector_free_work_fn()
214 freed = llist_del_all(&config->connector_free_list); in drm_connector_free_work_fn()
215 spin_unlock_irqrestore(&config->connector_list_lock, flags); in drm_connector_free_work_fn()
218 drm_mode_object_unregister(dev, &connector->base); in drm_connector_free_work_fn()
219 connector->funcs->destroy(connector); in drm_connector_free_work_fn()
229 struct drm_mode_config *config = &dev->mode_config; in drm_connector_init_only()
235 (!funcs->atomic_destroy_state || in drm_connector_init_only()
236 !funcs->atomic_duplicate_state)); in drm_connector_init_only()
238 ret = __drm_mode_object_add(dev, &connector->base, in drm_connector_init_only()
244 connector->base.properties = &connector->properties; in drm_connector_init_only()
245 connector->dev = dev; in drm_connector_init_only()
246 connector->funcs = funcs; in drm_connector_init_only()
249 ret = ida_alloc_max(&config->connector_ida, 31, GFP_KERNEL); in drm_connector_init_only()
256 connector->index = ret; in drm_connector_init_only()
259 connector->connector_type = connector_type; in drm_connector_init_only()
260 connector->connector_type_id = in drm_connector_init_only()
262 if (connector->connector_type_id < 0) { in drm_connector_init_only()
263 ret = connector->connector_type_id; in drm_connector_init_only()
266 connector->name = in drm_connector_init_only()
267 kasprintf(GFP_KERNEL, "%s-%d", in drm_connector_init_only()
269 connector->connector_type_id); in drm_connector_init_only()
270 if (!connector->name) { in drm_connector_init_only()
271 ret = -ENOMEM; in drm_connector_init_only()
276 connector->ddc = ddc; in drm_connector_init_only()
278 INIT_LIST_HEAD(&connector->head); in drm_connector_init_only()
279 INIT_LIST_HEAD(&connector->global_connector_list_entry); in drm_connector_init_only()
280 INIT_LIST_HEAD(&connector->probed_modes); in drm_connector_init_only()
281 INIT_LIST_HEAD(&connector->modes); in drm_connector_init_only()
282 mutex_init(&connector->mutex); in drm_connector_init_only()
283 mutex_init(&connector->cec.mutex); in drm_connector_init_only()
284 mutex_init(&connector->eld_mutex); in drm_connector_init_only()
285 mutex_init(&connector->edid_override_mutex); in drm_connector_init_only()
286 mutex_init(&connector->hdmi.infoframes.lock); in drm_connector_init_only()
287 mutex_init(&connector->hdmi_audio.lock); in drm_connector_init_only()
288 connector->edid_blob_ptr = NULL; in drm_connector_init_only()
289 connector->epoch_counter = 0; in drm_connector_init_only()
290 connector->tile_blob_ptr = NULL; in drm_connector_init_only()
291 connector->status = connector_status_unknown; in drm_connector_init_only()
292 connector->display_info.panel_orientation = in drm_connector_init_only()
301 drm_object_attach_property(&connector->base, in drm_connector_init_only()
302 config->dpms_property, 0); in drm_connector_init_only()
304 drm_object_attach_property(&connector->base, in drm_connector_init_only()
305 config->link_status_property, in drm_connector_init_only()
308 drm_object_attach_property(&connector->base, in drm_connector_init_only()
309 config->non_desktop_property, in drm_connector_init_only()
311 drm_object_attach_property(&connector->base, in drm_connector_init_only()
312 config->tile_property, in drm_connector_init_only()
316 drm_object_attach_property(&connector->base, config->prop_crtc_id, 0); in drm_connector_init_only()
319 connector->debugfs_entry = NULL; in drm_connector_init_only()
322 ida_free(connector_ida, connector->connector_type_id); in drm_connector_init_only()
325 ida_free(&config->connector_ida, connector->index); in drm_connector_init_only()
328 drm_mode_object_unregister(dev, &connector->base); in drm_connector_init_only()
335 struct drm_device *dev = connector->dev; in drm_connector_add()
336 struct drm_mode_config *config = &dev->mode_config; in drm_connector_add()
338 if (drm_WARN_ON(dev, !list_empty(&connector->head))) in drm_connector_add()
341 spin_lock_irq(&config->connector_list_lock); in drm_connector_add()
342 list_add_tail(&connector->head, &config->connector_list); in drm_connector_add()
343 config->num_connector++; in drm_connector_add()
344 spin_unlock_irq(&config->connector_list_lock); in drm_connector_add()
349 struct drm_device *dev = connector->dev; in drm_connector_remove()
355 if (list_empty(&connector->head)) in drm_connector_remove()
358 spin_lock_irq(&dev->mode_config.connector_list_lock); in drm_connector_remove()
359 list_del_init(&connector->head); in drm_connector_remove()
360 dev->mode_config.num_connector--; in drm_connector_remove()
361 spin_unlock_irq(&dev->mode_config.connector_list_lock); in drm_connector_remove()
382 * drm_connector_init - Init a preallocated connector
407 if (drm_WARN_ON(dev, !(funcs && funcs->destroy))) in drm_connector_init()
408 return -EINVAL; in drm_connector_init()
415 * drm_connector_dynamic_init - Init a preallocated dynamic connector
428 * For all other - static - connectors, drivers should call one of the
448 if (drm_WARN_ON(dev, !(funcs && funcs->destroy))) in drm_connector_dynamic_init()
449 return -EINVAL; in drm_connector_dynamic_init()
456 * drm_connector_init_with_ddc - Init a preallocated connector
485 if (drm_WARN_ON(dev, !(funcs && funcs->destroy))) in drm_connector_init_with_ddc()
486 return -EINVAL; in drm_connector_init_with_ddc()
501 * drmm_connector_init - Init a preallocated connector
512 * drm_connector_cleanup() in a DRM-managed action.
529 if (drm_WARN_ON(dev, funcs && funcs->destroy)) in drmm_connector_init()
530 return -EINVAL; in drmm_connector_init()
546 * drmm_connector_hdmi_init - Init a preallocated HDMI connector
552 * @hdmi_funcs: HDMI-related callbacks for this connector
562 * drm_connector_cleanup() in a DRM-managed action.
584 return -EINVAL; in drmm_connector_hdmi_init()
588 return -EINVAL; in drmm_connector_hdmi_init()
592 return -EINVAL; in drmm_connector_hdmi_init()
595 return -EINVAL; in drmm_connector_hdmi_init()
597 if (connector->ycbcr_420_allowed != !!(supported_formats & BIT(HDMI_COLORSPACE_YUV420))) in drmm_connector_hdmi_init()
598 return -EINVAL; in drmm_connector_hdmi_init()
601 return -EINVAL; in drmm_connector_hdmi_init()
607 connector->hdmi.supported_formats = supported_formats; in drmm_connector_hdmi_init()
608 strtomem_pad(connector->hdmi.vendor, vendor, 0); in drmm_connector_hdmi_init()
609 strtomem_pad(connector->hdmi.product, product, 0); in drmm_connector_hdmi_init()
615 if (connector->funcs->reset) in drmm_connector_hdmi_init()
616 connector->funcs->reset(connector); in drmm_connector_hdmi_init()
619 connector->max_bpc = max_bpc; in drmm_connector_hdmi_init()
624 connector->hdmi.funcs = hdmi_funcs; in drmm_connector_hdmi_init()
631 * drm_connector_attach_edid_property - attach edid property.
640 struct drm_mode_config *config = &connector->dev->mode_config; in drm_connector_attach_edid_property()
642 drm_object_attach_property(&connector->base, in drm_connector_attach_edid_property()
643 config->edid_property, in drm_connector_attach_edid_property()
649 * drm_connector_attach_encoder - attach a connector to an encoder
666 * direct assignment of connector->encoder = encoder. This connection in drm_connector_attach_encoder()
674 if (WARN_ON(connector->encoder)) in drm_connector_attach_encoder()
675 return -EINVAL; in drm_connector_attach_encoder()
677 connector->possible_encoders |= drm_encoder_mask(encoder); in drm_connector_attach_encoder()
684 * drm_connector_has_possible_encoder - check if the connector and encoder are
695 return connector->possible_encoders & drm_encoder_mask(encoder); in drm_connector_has_possible_encoder()
702 list_del(&mode->head); in drm_mode_remove()
703 drm_mode_destroy(connector->dev, mode); in drm_mode_remove()
707 * drm_connector_cec_phys_addr_invalidate - invalidate CEC physical address
714 mutex_lock(&connector->cec.mutex); in drm_connector_cec_phys_addr_invalidate()
716 if (connector->cec.funcs && in drm_connector_cec_phys_addr_invalidate()
717 connector->cec.funcs->phys_addr_invalidate) in drm_connector_cec_phys_addr_invalidate()
718 connector->cec.funcs->phys_addr_invalidate(connector); in drm_connector_cec_phys_addr_invalidate()
720 mutex_unlock(&connector->cec.mutex); in drm_connector_cec_phys_addr_invalidate()
725 * drm_connector_cec_phys_addr_set - propagate CEC physical address
734 mutex_lock(&connector->cec.mutex); in drm_connector_cec_phys_addr_set()
736 addr = connector->display_info.source_physical_address; in drm_connector_cec_phys_addr_set()
738 if (connector->cec.funcs && in drm_connector_cec_phys_addr_set()
739 connector->cec.funcs->phys_addr_set) in drm_connector_cec_phys_addr_set()
740 connector->cec.funcs->phys_addr_set(connector, addr); in drm_connector_cec_phys_addr_set()
742 mutex_unlock(&connector->cec.mutex); in drm_connector_cec_phys_addr_set()
747 * drm_connector_cleanup - cleans up an initialised connector
754 struct drm_device *dev = connector->dev; in drm_connector_cleanup()
760 if (WARN_ON(connector->registration_state == in drm_connector_cleanup()
764 platform_device_unregister(connector->hdmi_audio.codec_pdev); in drm_connector_cleanup()
766 if (connector->privacy_screen) { in drm_connector_cleanup()
767 drm_privacy_screen_put(connector->privacy_screen); in drm_connector_cleanup()
768 connector->privacy_screen = NULL; in drm_connector_cleanup()
771 if (connector->tile_group) { in drm_connector_cleanup()
772 drm_mode_put_tile_group(dev, connector->tile_group); in drm_connector_cleanup()
773 connector->tile_group = NULL; in drm_connector_cleanup()
776 list_for_each_entry_safe(mode, t, &connector->probed_modes, head) in drm_connector_cleanup()
779 list_for_each_entry_safe(mode, t, &connector->modes, head) in drm_connector_cleanup()
782 ida_free(&drm_connector_enum_list[connector->connector_type].ida, in drm_connector_cleanup()
783 connector->connector_type_id); in drm_connector_cleanup()
785 ida_free(&dev->mode_config.connector_ida, connector->index); in drm_connector_cleanup()
787 kfree(connector->display_info.bus_formats); in drm_connector_cleanup()
788 kfree(connector->display_info.vics); in drm_connector_cleanup()
789 drm_mode_object_unregister(dev, &connector->base); in drm_connector_cleanup()
790 kfree(connector->name); in drm_connector_cleanup()
791 connector->name = NULL; in drm_connector_cleanup()
792 fwnode_handle_put(connector->fwnode); in drm_connector_cleanup()
793 connector->fwnode = NULL; in drm_connector_cleanup()
797 WARN_ON(connector->state && !connector->funcs->atomic_destroy_state); in drm_connector_cleanup()
798 if (connector->state && connector->funcs->atomic_destroy_state) in drm_connector_cleanup()
799 connector->funcs->atomic_destroy_state(connector, in drm_connector_cleanup()
800 connector->state); in drm_connector_cleanup()
802 mutex_destroy(&connector->hdmi_audio.lock); in drm_connector_cleanup()
803 mutex_destroy(&connector->hdmi.infoframes.lock); in drm_connector_cleanup()
804 mutex_destroy(&connector->mutex); in drm_connector_cleanup()
808 if (dev->registered) in drm_connector_cleanup()
814 * drm_connector_register - register a connector
835 if (!connector->dev->registered) in drm_connector_register()
838 mutex_lock(&connector->mutex); in drm_connector_register()
839 if (connector->registration_state != DRM_CONNECTOR_INITIALIZING) in drm_connector_register()
848 if (connector->funcs->late_register) { in drm_connector_register()
849 ret = connector->funcs->late_register(connector); in drm_connector_register()
858 drm_mode_object_register(connector->dev, &connector->base); in drm_connector_register()
860 connector->registration_state = DRM_CONNECTOR_REGISTERED; in drm_connector_register()
865 if (connector->privacy_screen) in drm_connector_register()
866 drm_privacy_screen_register_notifier(connector->privacy_screen, in drm_connector_register()
867 &connector->privacy_screen_notifier); in drm_connector_register()
870 list_add_tail(&connector->global_connector_list_entry, &connector_list); in drm_connector_register()
875 if (connector->funcs->early_unregister) in drm_connector_register()
876 connector->funcs->early_unregister(connector); in drm_connector_register()
881 mutex_unlock(&connector->mutex); in drm_connector_register()
887 * drm_connector_dynamic_register - register a dynamic connector
903 if (WARN_ON(!(connector->funcs && connector->funcs->destroy))) in drm_connector_dynamic_register()
904 return -EINVAL; in drm_connector_dynamic_register()
913 * drm_connector_unregister - unregister a connector
918 * calling drm_connector_dynamic_register(). All other - static - connectors
927 mutex_lock(&connector->mutex); in drm_connector_unregister()
928 if (connector->registration_state != DRM_CONNECTOR_REGISTERED) { in drm_connector_unregister()
929 mutex_unlock(&connector->mutex); in drm_connector_unregister()
934 list_del_init(&connector->global_connector_list_entry); in drm_connector_unregister()
937 if (connector->privacy_screen) in drm_connector_unregister()
939 connector->privacy_screen, in drm_connector_unregister()
940 &connector->privacy_screen_notifier); in drm_connector_unregister()
944 if (connector->funcs->early_unregister) in drm_connector_unregister()
945 connector->funcs->early_unregister(connector); in drm_connector_unregister()
950 connector->registration_state = DRM_CONNECTOR_UNREGISTERED; in drm_connector_unregister()
951 mutex_unlock(&connector->mutex); in drm_connector_unregister()
986 * drm_get_connector_status_name - return a string for connector status
1006 * drm_get_connector_force_name - return a string for connector force
1034 * drm_connector_list_iter_begin - initialize a connector_list iterator
1046 iter->dev = dev; in drm_connector_list_iter_begin()
1047 iter->conn = NULL; in drm_connector_list_iter_begin()
1053 * Extra-safe connector put function that works in any context. Should only be
1060 struct drm_mode_config *config = &conn->dev->mode_config; in __drm_connector_put_safe()
1062 lockdep_assert_held(&config->connector_list_lock); in __drm_connector_put_safe()
1064 if (!refcount_dec_and_test(&conn->base.refcount.refcount)) in __drm_connector_put_safe()
1067 llist_add(&conn->free_node, &config->connector_free_list); in __drm_connector_put_safe()
1068 schedule_work(&config->connector_free_work); in __drm_connector_put_safe()
1072 * drm_connector_list_iter_next - return next connector
1081 struct drm_connector *old_conn = iter->conn; in drm_connector_list_iter_next()
1082 struct drm_mode_config *config = &iter->dev->mode_config; in drm_connector_list_iter_next()
1086 spin_lock_irqsave(&config->connector_list_lock, flags); in drm_connector_list_iter_next()
1087 lhead = old_conn ? &old_conn->head : &config->connector_list; in drm_connector_list_iter_next()
1090 if (lhead->next == &config->connector_list) { in drm_connector_list_iter_next()
1091 iter->conn = NULL; in drm_connector_list_iter_next()
1095 lhead = lhead->next; in drm_connector_list_iter_next()
1096 iter->conn = list_entry(lhead, struct drm_connector, head); in drm_connector_list_iter_next()
1099 } while (!kref_get_unless_zero(&iter->conn->base.refcount)); in drm_connector_list_iter_next()
1103 spin_unlock_irqrestore(&config->connector_list_lock, flags); in drm_connector_list_iter_next()
1105 return iter->conn; in drm_connector_list_iter_next()
1110 * drm_connector_list_iter_end - tear down a connector_list iterator
1120 struct drm_mode_config *config = &iter->dev->mode_config; in drm_connector_list_iter_end()
1123 iter->dev = NULL; in drm_connector_list_iter_end()
1124 if (iter->conn) { in drm_connector_list_iter_end()
1125 spin_lock_irqsave(&config->connector_list_lock, flags); in drm_connector_list_iter_end()
1126 __drm_connector_put_safe(iter->conn); in drm_connector_list_iter_end()
1127 spin_unlock_irqrestore(&config->connector_list_lock, flags); in drm_connector_list_iter_end()
1137 { SubPixelVerticalRGB, "Vertical RGB" },
1138 { SubPixelVerticalBGR, "Vertical BGR" },
1143 * drm_get_subpixel_order_name - return a string for a given subpixel enum
1171 * drm_display_info_set_bus_formats - set the supported bus formats
1177 * See MEDIA_BUS_FMT_* definitions in include/uapi/linux/media-bus-format.h for
1190 return -EINVAL; in drm_display_info_set_bus_formats()
1196 return -ENOMEM; in drm_display_info_set_bus_formats()
1199 kfree(info->bus_formats); in drm_display_info_set_bus_formats()
1200 info->bus_formats = fmts; in drm_display_info_set_bus_formats()
1201 info->num_bus_formats = num_formats; in drm_display_info_set_bus_formats()
1237 { DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I and TV-out */
1238 { DRM_MODE_SUBCONNECTOR_DVID, "DVI-D" }, /* DVI-I */
1239 { DRM_MODE_SUBCONNECTOR_DVIA, "DVI-A" }, /* DVI-I */
1244 { DRM_MODE_SUBCONNECTOR_Unknown, "Unknown" }, /* DVI-I, TV-out and DP */
1245 { DRM_MODE_SUBCONNECTOR_DVID, "DVI-D" }, /* DVI-I */
1246 { DRM_MODE_SUBCONNECTOR_DVIA, "DVI-A" }, /* DVI-I */
1253 { DRM_MODE_TV_MODE_NTSC_443, "NTSC-443" },
1254 { DRM_MODE_TV_MODE_NTSC_J, "NTSC-J" },
1256 { DRM_MODE_TV_MODE_PAL_M, "PAL-M" },
1257 { DRM_MODE_TV_MODE_PAL_N, "PAL-N" },
1264 * drm_get_tv_mode_from_name - Translates a TV mode name into its enum value in DRM_ENUM_NAME_FN()
1279 if (strlen(item->name) == len && !strncmp(item->name, name, len)) in DRM_ENUM_NAME_FN()
1280 return item->type; in DRM_ENUM_NAME_FN()
1283 return -EINVAL; in DRM_ENUM_NAME_FN()
1288 { DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I and TV-out */
1289 { DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */
1290 { DRM_MODE_SUBCONNECTOR_SVIDEO, "SVIDEO" }, /* TV-out */
1291 { DRM_MODE_SUBCONNECTOR_Component, "Component" }, /* TV-out */
1292 { DRM_MODE_SUBCONNECTOR_SCART, "SCART" }, /* TV-out */
1297 { DRM_MODE_SUBCONNECTOR_Unknown, "Unknown" }, /* DVI-I, TV-out and DP */
1298 { DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */
1299 { DRM_MODE_SUBCONNECTOR_SVIDEO, "SVIDEO" }, /* TV-out */
1300 { DRM_MODE_SUBCONNECTOR_Component, "Component" }, /* TV-out */
1301 { DRM_MODE_SUBCONNECTOR_SCART, "SCART" }, /* TV-out */
1307 { DRM_MODE_SUBCONNECTOR_Unknown, "Unknown" }, /* DVI-I, TV-out and DP */
1309 { DRM_MODE_SUBCONNECTOR_DVID, "DVI-D" }, /* DP */
1326 /* Standard Definition Colorimetry based on IEC 61966-2-4 */
1328 /* High Definition Colorimetry based on IEC 61966-2-4 */
1330 /* Colorimetry based on IEC 61966-2-1/Amendment 1 */
1332 /* Colorimetry based on IEC 61966-2-5 [33] */
1334 /* Colorimetry based on IEC 61966-2-5 */
1336 /* Colorimetry based on ITU-R BT.2020 */
1338 /* Colorimetry based on ITU-R BT.2020 */
1340 /* Colorimetry based on ITU-R BT.2020 */
1343 [DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65] = "DCI-P3_RGB_D65",
1344 [DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER] = "DCI-P3_RGB_Theater",
1346 /* Colorimetry based on scRGB (IEC 61966-2-2) */
1352 * drm_get_colorspace_name - return a string for color encoding
1382 * Format Table 2-120
1406 …* drm_hdmi_connector_get_broadcast_rgb_name - Return a string for HDMI connector RGB broadcast sel…
1430 * drm_hdmi_connector_get_output_format_name() - Return a string for HDMI connector output format
1459 * User-space should not parse the EDID to obtain information exposed via
1461 * fixups to the EDID). For instance, user-space should not try to parse
1487 * The second issue is that the DPMS state is only well-defined when the
1506 * ``mst:<parent>-<ports>`` where ``<parent>`` is the KMS object ID of the
1507 * parent connector and ``<ports>`` is a hyphen-separated list of DP MST
1512 * compose together into one logical screen. This is used by both high-res
1514 * DP MST sinks), or high-res integrated panels (like dual-link DSI) which
1515 * are not gen-locked. Note that for tiled panels which are genlocked, like
1516 * dual-link LVDS or dual-link DSI, the driver should try to not expose the
1520 * link-status:
1521 * Connector link-status property to indicate the status of link. The
1522 * default value of link-status is "GOOD". If something fails during or
1527 * When user-space receives the hotplug uevent and detects a "BAD"
1528 * link-status, the sink doesn't receive pixels anymore (e.g. the screen
1530 * changed. User-space is expected to pick a new mode if the current one
1531 * has disappeared and perform a new modeset with link-status set to
1532 * "GOOD" to re-enable the connector.
1535 * link-status, the other are unaffected (ie. the sinks still continue to
1538 * When user-space performs an atomic commit on a connector with a "BAD"
1539 * link-status without resetting the property to "GOOD", the sink may
1540 * still not receive pixels. When user-space performs an atomic commit
1541 * which resets the link-status property to "GOOD" without the
1544 * User-space can only change link-status to "GOOD", changing it to "BAD"
1545 * is a no-op.
1547 * For backwards compatibility with non-atomic userspace the kernel
1548 * tries to automatically set the link-status back to "GOOD" in the
1577 * -EINVAL.
1581 * - DESIRED state should be preserved until userspace de-asserts it by
1584 * - If the state is DESIRED, kernel should attempt to re-authenticate the
1587 * - Kernel sends uevent with the connector id and property id through
1591 * - DESIRED -> ENABLED (authentication success)
1592 * - ENABLED -> DESIRED (termination of authentication)
1593 * - Please note no uevents for userspace triggered property state changes,
1596 * - DESIRED/ENABLED -> UNDESIRED
1597 * - UNDESIRED -> DESIRED
1598 * - Userspace is responsible for polling the property or listen to uevents
1613 * - "HDCP Type0": DRM_MODE_HDCP_CONTENT_TYPE0 = 0
1614 * - "HDCP Type1": DRM_MODE_HDCP_CONTENT_TYPE1 = 1
1649 * then kernel will disable the HDCP and re-enable with new type in the
1660 * SDP packet (Non-audio INFOFRAME SDP v1.3) for DP. This is then
1678 * - Some layers are HDR and others are SDR
1679 * - HDR layers luminance is not same as sink
1722 * This property defines how a non-native mode is upscaled to the native
1742 * have a built-in scaler).
1745 * This property is used by DVI-I, TVout and DisplayPort to indicate different
1748 * For DVI-I and TVout there is also a matching property "select subconnector"
1752 * privacy-screen sw-state, privacy-screen hw-state:
1758 * "privacy-screen hw-state" is read-only and reflects the actual state
1759 * of the privacy-screen, possible values: "Enabled", "Disabled,
1760 * "Enabled-locked", "Disabled-locked". The locked states indicate
1762 * might be devices where the firmware-setup options, or a hardware
1763 * slider-switch, offer always on / off modes.
1765 * "privacy-screen sw-state" can be set to change the privacy-screen state
1766 * when not locked. In this case the driver must update the hw-state
1768 * sw-state property. Setting the sw-state property when the hw-state is
1770 * state to the set state when the hw-state becomes unlocked. E.g. if
1771 * "privacy-screen hw-state" is "Enabled-locked" and the sw-state
1773 * changing the slider-switch position, then the driver must set the
1776 * In some cases the privacy-screen's actual state might change outside of
1780 * In this case the driver must update both the hw-state and the sw-state
1782 * sw-state. Any pending sw-state requests are thus discarded.
1786 * of the sw-state. Caching the sw-state value and including it in later
1789 * privacy-screen sw-state in an atomic commit unless it wants to change
1815 return -ENOMEM; in drm_connector_create_standard_properties()
1816 dev->mode_config.edid_property = prop; in drm_connector_create_standard_properties()
1822 return -ENOMEM; in drm_connector_create_standard_properties()
1823 dev->mode_config.dpms_property = prop; in drm_connector_create_standard_properties()
1830 return -ENOMEM; in drm_connector_create_standard_properties()
1831 dev->mode_config.path_property = prop; in drm_connector_create_standard_properties()
1838 return -ENOMEM; in drm_connector_create_standard_properties()
1839 dev->mode_config.tile_property = prop; in drm_connector_create_standard_properties()
1841 prop = drm_property_create_enum(dev, 0, "link-status", in drm_connector_create_standard_properties()
1845 return -ENOMEM; in drm_connector_create_standard_properties()
1846 dev->mode_config.link_status_property = prop; in drm_connector_create_standard_properties()
1848 prop = drm_property_create_bool(dev, DRM_MODE_PROP_IMMUTABLE, "non-desktop"); in drm_connector_create_standard_properties()
1850 return -ENOMEM; in drm_connector_create_standard_properties()
1851 dev->mode_config.non_desktop_property = prop; in drm_connector_create_standard_properties()
1856 return -ENOMEM; in drm_connector_create_standard_properties()
1857 dev->mode_config.hdr_output_metadata_property = prop; in drm_connector_create_standard_properties()
1863 * drm_mode_create_dvi_i_properties - create DVI-I specific connector properties
1866 * Called by a driver the first time a DVI-I connector is made.
1875 if (dev->mode_config.dvi_i_select_subconnector_property) in drm_mode_create_dvi_i_properties()
1883 dev->mode_config.dvi_i_select_subconnector_property = dvi_i_selector; in drm_mode_create_dvi_i_properties()
1889 dev->mode_config.dvi_i_subconnector_property = dvi_i_subconnector; in drm_mode_create_dvi_i_properties()
1896 * drm_connector_attach_dp_subconnector_property - create subconnector property for DP
1903 struct drm_mode_config *mode_config = &connector->dev->mode_config; in drm_connector_attach_dp_subconnector_property()
1905 if (!mode_config->dp_subconnector_property) in drm_connector_attach_dp_subconnector_property()
1906 mode_config->dp_subconnector_property = in drm_connector_attach_dp_subconnector_property()
1907 drm_property_create_enum(connector->dev, in drm_connector_attach_dp_subconnector_property()
1913 drm_object_attach_property(&connector->base, in drm_connector_attach_dp_subconnector_property()
1914 mode_config->dp_subconnector_property, in drm_connector_attach_dp_subconnector_property()
1930 * The CRTC attached to the connector must be configured by user-space to
1931 * always produce full-range pixels.
1937 * mode according to the HDMI specifications (HDMI 1.4b - Section
1938 * 6.6 - Video Quantization Ranges).
1945 * this works for any number of bits-per-component.
1972 * The meaning of each content type is defined in CTA-861-G table 15.
1981 * - brightness
1982 * - contrast
1983 * - flicker reduction
1984 * - hue
1985 * - mode
1986 * - overscan
1987 * - saturation
1988 * - select subconnector
1998 * TV Mode is CCIR System M (aka 525-lines) together with
2001 * NTSC-443:
2003 * TV Mode is CCIR System M (aka 525-lines) together with
2007 * NTSC-J:
2009 * TV Mode is CCIR System M (aka 525-lines) together with
2015 * TV Mode is CCIR System B (aka 625-lines) together with
2018 * PAL-M:
2020 * TV Mode is CCIR System M (aka 525-lines) together with
2023 * PAL-N:
2032 * TV Mode is CCIR System B (aka 625-lines) together with
2038 * equalizing pulses for a 525-line or 625-line mode,
2046 * drm_connector_attach_content_type_property - attach content-type property
2055 if (!drm_mode_create_content_type_property(connector->dev)) in drm_connector_attach_content_type_property()
2056 drm_object_attach_property(&connector->base, in drm_connector_attach_content_type_property()
2057 connector->dev->mode_config.content_type_property, in drm_connector_attach_content_type_property()
2064 * drm_connector_attach_tv_margin_properties - attach TV connector margin
2073 struct drm_device *dev = connector->dev; in drm_connector_attach_tv_margin_properties()
2075 drm_object_attach_property(&connector->base, in drm_connector_attach_tv_margin_properties()
2076 dev->mode_config.tv_left_margin_property, in drm_connector_attach_tv_margin_properties()
2078 drm_object_attach_property(&connector->base, in drm_connector_attach_tv_margin_properties()
2079 dev->mode_config.tv_right_margin_property, in drm_connector_attach_tv_margin_properties()
2081 drm_object_attach_property(&connector->base, in drm_connector_attach_tv_margin_properties()
2082 dev->mode_config.tv_top_margin_property, in drm_connector_attach_tv_margin_properties()
2084 drm_object_attach_property(&connector->base, in drm_connector_attach_tv_margin_properties()
2085 dev->mode_config.tv_bottom_margin_property, in drm_connector_attach_tv_margin_properties()
2091 * drm_mode_create_tv_margin_properties - create TV connector margin properties
2104 if (dev->mode_config.tv_left_margin_property) in drm_mode_create_tv_margin_properties()
2107 dev->mode_config.tv_left_margin_property = in drm_mode_create_tv_margin_properties()
2109 if (!dev->mode_config.tv_left_margin_property) in drm_mode_create_tv_margin_properties()
2110 return -ENOMEM; in drm_mode_create_tv_margin_properties()
2112 dev->mode_config.tv_right_margin_property = in drm_mode_create_tv_margin_properties()
2114 if (!dev->mode_config.tv_right_margin_property) in drm_mode_create_tv_margin_properties()
2115 return -ENOMEM; in drm_mode_create_tv_margin_properties()
2117 dev->mode_config.tv_top_margin_property = in drm_mode_create_tv_margin_properties()
2119 if (!dev->mode_config.tv_top_margin_property) in drm_mode_create_tv_margin_properties()
2120 return -ENOMEM; in drm_mode_create_tv_margin_properties()
2122 dev->mode_config.tv_bottom_margin_property = in drm_mode_create_tv_margin_properties()
2124 if (!dev->mode_config.tv_bottom_margin_property) in drm_mode_create_tv_margin_properties()
2125 return -ENOMEM; in drm_mode_create_tv_margin_properties()
2132 * drm_mode_create_tv_properties_legacy - create TV specific connector properties
2157 if (dev->mode_config.tv_select_subconnector_property) in drm_mode_create_tv_properties_legacy()
2170 dev->mode_config.tv_select_subconnector_property = tv_selector; in drm_mode_create_tv_properties_legacy()
2179 dev->mode_config.tv_subconnector_property = tv_subconnector; in drm_mode_create_tv_properties_legacy()
2188 dev->mode_config.legacy_tv_mode_property = in drm_mode_create_tv_properties_legacy()
2191 if (!dev->mode_config.legacy_tv_mode_property) in drm_mode_create_tv_properties_legacy()
2195 drm_property_add_enum(dev->mode_config.legacy_tv_mode_property, in drm_mode_create_tv_properties_legacy()
2199 dev->mode_config.tv_brightness_property = in drm_mode_create_tv_properties_legacy()
2201 if (!dev->mode_config.tv_brightness_property) in drm_mode_create_tv_properties_legacy()
2204 dev->mode_config.tv_contrast_property = in drm_mode_create_tv_properties_legacy()
2206 if (!dev->mode_config.tv_contrast_property) in drm_mode_create_tv_properties_legacy()
2209 dev->mode_config.tv_flicker_reduction_property = in drm_mode_create_tv_properties_legacy()
2211 if (!dev->mode_config.tv_flicker_reduction_property) in drm_mode_create_tv_properties_legacy()
2214 dev->mode_config.tv_overscan_property = in drm_mode_create_tv_properties_legacy()
2216 if (!dev->mode_config.tv_overscan_property) in drm_mode_create_tv_properties_legacy()
2219 dev->mode_config.tv_saturation_property = in drm_mode_create_tv_properties_legacy()
2221 if (!dev->mode_config.tv_saturation_property) in drm_mode_create_tv_properties_legacy()
2224 dev->mode_config.tv_hue_property = in drm_mode_create_tv_properties_legacy()
2226 if (!dev->mode_config.tv_hue_property) in drm_mode_create_tv_properties_legacy()
2231 return -ENOMEM; in drm_mode_create_tv_properties_legacy()
2236 * drm_mode_create_tv_properties - create TV specific connector properties
2253 if (dev->mode_config.tv_mode_property) in drm_mode_create_tv_properties()
2268 return -ENOMEM; in drm_mode_create_tv_properties()
2270 dev->mode_config.tv_mode_property = tv_mode; in drm_mode_create_tv_properties()
2277 * drm_mode_create_scaling_mode_property - create scaling mode property
2293 if (dev->mode_config.scaling_mode_property) in drm_mode_create_scaling_mode_property()
2301 dev->mode_config.scaling_mode_property = scaling_mode; in drm_mode_create_scaling_mode_property()
2311 * refresh rate by extending the duration of their vertical front porch
2312 * until page flip or timeout occurs. This can reduce or remove stuttering
2313 * and latency in scenarios where the page flip does not align with the
2317 * of 48Hz on a 60Hz display. The page flip will frequently miss the vblank
2324 * 35Hz is below the page flip frequency and the vertical front porch can
2325 * be extended until the page flip occurs. The vblank interval will be
2326 * directly aligned to the page flip rate.
2329 * Large and frequent changes in vertical front porch duration may worsen
2332 * Panel brightness will also vary with vertical front porch duration. Some
2334 * vertical front porch duration and the maximum vertical front porch duration.
2335 * Large and frequent changes in vertical front porch duration may produce
2355 * vertical front porch duration will be extended until page-flip or
2358 * The minimum vertical front porch duration is defined as the vertical
2361 * The maximum vertical front porch duration is greater than or equal to
2362 * the minimum vertical front porch duration. The duration is derived
2370 * drm_connector_attach_vrr_capable_property - creates the
2383 struct drm_device *dev = connector->dev; in drm_connector_attach_vrr_capable_property()
2386 if (!connector->vrr_capable_property) { in drm_connector_attach_vrr_capable_property()
2390 return -ENOMEM; in drm_connector_attach_vrr_capable_property()
2392 connector->vrr_capable_property = prop; in drm_connector_attach_vrr_capable_property()
2393 drm_object_attach_property(&connector->base, prop, 0); in drm_connector_attach_vrr_capable_property()
2401 * drm_connector_attach_scaling_mode_property - attach atomic scaling mode property
2407 * and can be used from &drm_connector_helper_funcs->atomic_check for validation.
2417 struct drm_device *dev = connector->dev; in drm_connector_attach_scaling_mode_property()
2421 (1U << ARRAY_SIZE(drm_scaling_mode_enum_list)) - 1; in drm_connector_attach_scaling_mode_property()
2425 return -EINVAL; in drm_connector_attach_scaling_mode_property()
2432 return -ENOMEM; in drm_connector_attach_scaling_mode_property()
2451 drm_object_attach_property(&connector->base, in drm_connector_attach_scaling_mode_property()
2454 connector->scaling_mode_property = scaling_mode_property; in drm_connector_attach_scaling_mode_property()
2461 * drm_mode_create_aspect_ratio_property - create aspect ratio property
2472 if (dev->mode_config.aspect_ratio_property) in drm_mode_create_aspect_ratio_property()
2475 dev->mode_config.aspect_ratio_property = in drm_mode_create_aspect_ratio_property()
2480 if (dev->mode_config.aspect_ratio_property == NULL) in drm_mode_create_aspect_ratio_property()
2481 return -ENOMEM; in drm_mode_create_aspect_ratio_property()
2513 * The behavior is driver-specific.
2519 * RGB content with Rec. ITU-R BT.2020 colorimetry, Rec.
2520 * ITU-R BT.2020 (Table 4, RGB) transfer characteristics and full
2523 * transfer characteristics to PQ (Rec. ITU-R BT.2100 Table 4) or
2524 * HLG (Rec. ITU-R BT.2100 Table 5) in which case, user space
2528 * ITU-R BT.2020 R'G'B' and Rec. ITU-R BT.2020 Y'C'BC'R
2531 * sink to expect Rec. ITU-R BT.2020 R'G'B' colorimetry and convert
2534 * sink to expect Rec. ITU-R BT.2020 Y'C'BC'R colorimetry, convert
2535 * to YCbCr using the Rec. ITU-R BT.2020 non-constant luminance
2549 * DCI-P3_RGB_D65:
2550 * DCI-P3_RGB_Theater:
2565 struct drm_device *dev = connector->dev; in drm_mode_create_colorspace_property()
2570 if (connector->colorspace_property) in drm_mode_create_colorspace_property()
2575 connector->base.id, connector->name); in drm_mode_create_colorspace_property()
2576 return -EINVAL; in drm_mode_create_colorspace_property()
2579 if ((supported_colorspaces & -BIT(DRM_MODE_COLORIMETRY_COUNT)) != 0) { in drm_mode_create_colorspace_property()
2581 connector->base.id, connector->name); in drm_mode_create_colorspace_property()
2582 return -EINVAL; in drm_mode_create_colorspace_property()
2595 connector->colorspace_property = in drm_mode_create_colorspace_property()
2600 if (!connector->colorspace_property) in drm_mode_create_colorspace_property()
2601 return -ENOMEM; in drm_mode_create_colorspace_property()
2607 * drm_mode_create_hdmi_colorspace_property - create hdmi colorspace property
2632 * drm_mode_create_dp_colorspace_property - create dp colorspace property
2657 * drm_mode_create_content_type_property - create content type property
2668 if (dev->mode_config.content_type_property) in drm_mode_create_content_type_property()
2671 dev->mode_config.content_type_property = in drm_mode_create_content_type_property()
2676 if (dev->mode_config.content_type_property == NULL) in drm_mode_create_content_type_property()
2677 return -ENOMEM; in drm_mode_create_content_type_property()
2684 * drm_mode_create_suggested_offset_properties - create suggests offset properties
2694 if (dev->mode_config.suggested_x_property && dev->mode_config.suggested_y_property) in drm_mode_create_suggested_offset_properties()
2697 dev->mode_config.suggested_x_property = in drm_mode_create_suggested_offset_properties()
2700 dev->mode_config.suggested_y_property = in drm_mode_create_suggested_offset_properties()
2703 if (dev->mode_config.suggested_x_property == NULL || in drm_mode_create_suggested_offset_properties()
2704 dev->mode_config.suggested_y_property == NULL) in drm_mode_create_suggested_offset_properties()
2705 return -ENOMEM; in drm_mode_create_suggested_offset_properties()
2711 * drm_connector_set_path_property - set tile property on connector
2726 struct drm_device *dev = connector->dev; in drm_connector_set_path_property()
2730 &connector->path_blob_ptr, in drm_connector_set_path_property()
2733 &connector->base, in drm_connector_set_path_property()
2734 dev->mode_config.path_property); in drm_connector_set_path_property()
2740 * drm_connector_set_tile_property - set tile property on connector
2754 struct drm_device *dev = connector->dev; in drm_connector_set_tile_property()
2758 if (!connector->has_tile) { in drm_connector_set_tile_property()
2760 &connector->tile_blob_ptr, in drm_connector_set_tile_property()
2763 &connector->base, in drm_connector_set_tile_property()
2764 dev->mode_config.tile_property); in drm_connector_set_tile_property()
2769 connector->tile_group->id, connector->tile_is_single_monitor, in drm_connector_set_tile_property()
2770 connector->num_h_tile, connector->num_v_tile, in drm_connector_set_tile_property()
2771 connector->tile_h_loc, connector->tile_v_loc, in drm_connector_set_tile_property()
2772 connector->tile_h_size, connector->tile_v_size); in drm_connector_set_tile_property()
2775 &connector->tile_blob_ptr, in drm_connector_set_tile_property()
2778 &connector->base, in drm_connector_set_tile_property()
2779 dev->mode_config.tile_property); in drm_connector_set_tile_property()
2785 * drm_connector_set_link_status_property - Set link status property of a connector
2792 * hotplug uevent for userspace to re-check the valid modes through
2797 * re-training a link) without userspace's intervention.
2806 struct drm_device *dev = connector->dev; in drm_connector_set_link_status_property()
2808 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); in drm_connector_set_link_status_property()
2809 connector->state->link_status = link_status; in drm_connector_set_link_status_property()
2810 drm_modeset_unlock(&dev->mode_config.connection_mutex); in drm_connector_set_link_status_property()
2815 * drm_connector_attach_max_bpc_property - attach "max bpc" property
2828 struct drm_device *dev = connector->dev; in drm_connector_attach_max_bpc_property()
2831 prop = connector->max_bpc_property; in drm_connector_attach_max_bpc_property()
2835 return -ENOMEM; in drm_connector_attach_max_bpc_property()
2837 connector->max_bpc_property = prop; in drm_connector_attach_max_bpc_property()
2840 drm_object_attach_property(&connector->base, prop, max); in drm_connector_attach_max_bpc_property()
2841 connector->state->max_requested_bpc = max; in drm_connector_attach_max_bpc_property()
2842 connector->state->max_bpc = max; in drm_connector_attach_max_bpc_property()
2849 * drm_connector_attach_hdr_output_metadata_property - attach "HDR_OUTPUT_METADA" property
2860 struct drm_device *dev = connector->dev; in drm_connector_attach_hdr_output_metadata_property()
2861 struct drm_property *prop = dev->mode_config.hdr_output_metadata_property; in drm_connector_attach_hdr_output_metadata_property()
2863 drm_object_attach_property(&connector->base, prop, 0); in drm_connector_attach_hdr_output_metadata_property()
2870 * drm_connector_attach_broadcast_rgb_property - attach "Broadcast RGB" property
2880 struct drm_device *dev = connector->dev; in drm_connector_attach_broadcast_rgb_property()
2883 prop = connector->broadcast_rgb_property; in drm_connector_attach_broadcast_rgb_property()
2890 return -EINVAL; in drm_connector_attach_broadcast_rgb_property()
2892 connector->broadcast_rgb_property = prop; in drm_connector_attach_broadcast_rgb_property()
2895 drm_object_attach_property(&connector->base, prop, in drm_connector_attach_broadcast_rgb_property()
2903 * drm_connector_attach_colorspace_property - attach "Colorspace" property
2914 struct drm_property *prop = connector->colorspace_property; in drm_connector_attach_colorspace_property()
2916 drm_object_attach_property(&connector->base, prop, DRM_MODE_COLORIMETRY_DEFAULT); in drm_connector_attach_colorspace_property()
2923 * drm_connector_atomic_hdr_metadata_equal - checks if the hdr metadata changed
2927 * This is used by HDR-enabled drivers to test whether the HDR metadata
2937 struct drm_property_blob *old_blob = old_state->hdr_output_metadata; in drm_connector_atomic_hdr_metadata_equal()
2938 struct drm_property_blob *new_blob = new_state->hdr_output_metadata; in drm_connector_atomic_hdr_metadata_equal()
2943 if (old_blob->length != new_blob->length) in drm_connector_atomic_hdr_metadata_equal()
2946 return !memcmp(old_blob->data, new_blob->data, old_blob->length); in drm_connector_atomic_hdr_metadata_equal()
2951 * drm_connector_set_vrr_capable_property - sets the variable refresh rate
2962 if (!connector->vrr_capable_property) in drm_connector_set_vrr_capable_property()
2965 drm_object_property_set_value(&connector->base, in drm_connector_set_vrr_capable_property()
2966 connector->vrr_capable_property, in drm_connector_set_vrr_capable_property()
2972 * drm_connector_set_panel_orientation - sets the connector's panel_orientation
2973 * @connector: connector for which to set the panel-orientation property.
2980 * already been set is a no-op (e.g. the orientation has been overridden with
2984 * DRM_MODE_PANEL_ORIENTATION_UNKNOWN, in which case it is a no-op.
2996 struct drm_device *dev = connector->dev; in drm_connector_set_panel_orientation()
2997 struct drm_display_info *info = &connector->display_info; in drm_connector_set_panel_orientation()
3001 if (info->panel_orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN) in drm_connector_set_panel_orientation()
3008 info->panel_orientation = panel_orientation; in drm_connector_set_panel_orientation()
3010 prop = dev->mode_config.panel_orientation_property; in drm_connector_set_panel_orientation()
3017 return -ENOMEM; in drm_connector_set_panel_orientation()
3019 dev->mode_config.panel_orientation_property = prop; in drm_connector_set_panel_orientation()
3022 drm_object_attach_property(&connector->base, prop, in drm_connector_set_panel_orientation()
3023 info->panel_orientation); in drm_connector_set_panel_orientation()
3029 * drm_connector_set_panel_orientation_with_quirk - set the
3031 * @connector: connector for which to init the panel-orientation property.
3059 * drm_connector_set_orientation_from_panel -
3061 * @connector: connector for which to init the panel-orientation property.
3076 if (panel && panel->funcs && panel->funcs->get_orientation) in drm_connector_set_orientation_from_panel()
3077 orientation = panel->funcs->get_orientation(panel); in drm_connector_set_orientation_from_panel()
3088 { PRIVACY_SCREEN_DISABLED_LOCKED, "Disabled-locked" },
3089 { PRIVACY_SCREEN_ENABLED_LOCKED, "Enabled-locked" },
3093 * drm_connector_create_privacy_screen_properties - create the drm connecter's
3094 * privacy-screen properties.
3095 * @connector: connector for which to create the privacy-screen properties
3097 * This function creates the "privacy-screen sw-state" and "privacy-screen
3098 * hw-state" properties for the connector. They are not attached.
3103 if (connector->privacy_screen_sw_state_property) in drm_connector_create_privacy_screen_properties()
3106 /* Note sw-state only supports the first 2 values of the enum */ in drm_connector_create_privacy_screen_properties()
3107 connector->privacy_screen_sw_state_property = in drm_connector_create_privacy_screen_properties()
3108 drm_property_create_enum(connector->dev, DRM_MODE_PROP_ENUM, in drm_connector_create_privacy_screen_properties()
3109 "privacy-screen sw-state", in drm_connector_create_privacy_screen_properties()
3112 connector->privacy_screen_hw_state_property = in drm_connector_create_privacy_screen_properties()
3113 drm_property_create_enum(connector->dev, in drm_connector_create_privacy_screen_properties()
3115 "privacy-screen hw-state", in drm_connector_create_privacy_screen_properties()
3122 * drm_connector_attach_privacy_screen_properties - attach the drm connecter's
3123 * privacy-screen properties.
3124 * @connector: connector on which to attach the privacy-screen properties
3126 * This function attaches the "privacy-screen sw-state" and "privacy-screen
3127 * hw-state" properties to the connector. The initial state of both is set
3133 if (!connector->privacy_screen_sw_state_property) in drm_connector_attach_privacy_screen_properties()
3136 drm_object_attach_property(&connector->base, in drm_connector_attach_privacy_screen_properties()
3137 connector->privacy_screen_sw_state_property, in drm_connector_attach_privacy_screen_properties()
3140 drm_object_attach_property(&connector->base, in drm_connector_attach_privacy_screen_properties()
3141 connector->privacy_screen_hw_state_property, in drm_connector_attach_privacy_screen_properties()
3151 drm_privacy_screen_get_state(connector->privacy_screen, in drm_connector_update_privacy_screen_properties()
3155 connector->state->privacy_screen_sw_state = sw_state; in drm_connector_update_privacy_screen_properties()
3156 drm_object_property_set_value(&connector->base, in drm_connector_update_privacy_screen_properties()
3157 connector->privacy_screen_hw_state_property, hw_state); in drm_connector_update_privacy_screen_properties()
3165 struct drm_device *dev = connector->dev; in drm_connector_privacy_screen_notifier()
3167 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); in drm_connector_privacy_screen_notifier()
3169 drm_modeset_unlock(&dev->mode_config.connection_mutex); in drm_connector_privacy_screen_notifier()
3172 connector->privacy_screen_sw_state_property); in drm_connector_privacy_screen_notifier()
3174 connector->privacy_screen_hw_state_property); in drm_connector_privacy_screen_notifier()
3180 * drm_connector_attach_privacy_screen_provider - attach a privacy-screen to
3182 * @connector: connector to attach the privacy-screen to
3185 * Create and attach the standard privacy-screen properties and register
3186 * a generic notifier for generating sysfs-connector-status-events
3187 * on external changes to the privacy-screen status.
3194 connector->privacy_screen = priv; in drm_connector_attach_privacy_screen_provider()
3195 connector->privacy_screen_notifier.notifier_call = in drm_connector_attach_privacy_screen_provider()
3205 * drm_connector_update_privacy_screen - update connector's privacy-screen sw-state
3206 * @connector_state: connector-state to update the privacy-screen for
3209 * privacy-screen.
3211 * If the connector has no privacy-screen, then this is a no-op.
3215 struct drm_connector *connector = connector_state->connector; in drm_connector_update_privacy_screen()
3218 if (!connector->privacy_screen) in drm_connector_update_privacy_screen()
3221 ret = drm_privacy_screen_set_sw_state(connector->privacy_screen, in drm_connector_update_privacy_screen()
3222 connector_state->privacy_screen_sw_state); in drm_connector_update_privacy_screen()
3224 drm_err(connector->dev, "Error updating privacy-screen sw_state\n"); in drm_connector_update_privacy_screen()
3237 int ret = -EINVAL; in drm_connector_set_obj_prop()
3241 if (property == connector->dev->mode_config.dpms_property) { in drm_connector_set_obj_prop()
3242 ret = (*connector->funcs->dpms)(connector, (int)value); in drm_connector_set_obj_prop()
3243 } else if (connector->funcs->set_property) in drm_connector_set_obj_prop()
3244 ret = connector->funcs->set_property(connector, property, value); in drm_connector_set_obj_prop()
3247 drm_object_property_set_value(&connector->base, property, value); in drm_connector_set_obj_prop()
3256 .value = conn_set_prop->value, in drm_connector_property_set_ioctl()
3257 .prop_id = conn_set_prop->prop_id, in drm_connector_property_set_ioctl()
3258 .obj_id = conn_set_prop->connector_id, in drm_connector_property_set_ioctl()
3271 if (connector->state) in drm_connector_get_encoder()
3272 return connector->state->best_encoder; in drm_connector_get_encoder()
3273 return connector->encoder; in drm_connector_get_encoder()
3282 * If user-space hasn't configured the driver to expose the stereo 3D in drm_mode_expose_to_userspace()
3285 if (!file_priv->stereo_allowed && drm_mode_is_stereo(mode)) in drm_mode_expose_to_userspace()
3288 * If user-space hasn't configured the driver to expose the modes in drm_mode_expose_to_userspace()
3289 * with aspect-ratio, don't expose them. However if such a mode in drm_mode_expose_to_userspace()
3290 * is unique, let it be exposed, but reset the aspect-ratio flags in drm_mode_expose_to_userspace()
3291 * while preparing the list of user-modes. in drm_mode_expose_to_userspace()
3293 if (!file_priv->aspect_ratio_allowed) { in drm_mode_expose_to_userspace()
3297 if (mode_itr->expose_to_userspace && in drm_mode_expose_to_userspace()
3327 return -EOPNOTSUPP; in drm_mode_getconnector()
3331 connector = drm_connector_lookup(dev, file_priv, out_resp->connector_id); in drm_mode_getconnector()
3333 return -ENOENT; in drm_mode_getconnector()
3335 encoders_count = hweight32(connector->possible_encoders); in drm_mode_getconnector()
3337 if ((out_resp->count_encoders >= encoders_count) && encoders_count) { in drm_mode_getconnector()
3339 encoder_ptr = (uint32_t __user *)(unsigned long)(out_resp->encoders_ptr); in drm_mode_getconnector()
3342 if (put_user(encoder->base.id, encoder_ptr + copied)) { in drm_mode_getconnector()
3343 ret = -EFAULT; in drm_mode_getconnector()
3349 out_resp->count_encoders = encoders_count; in drm_mode_getconnector()
3351 out_resp->connector_id = connector->base.id; in drm_mode_getconnector()
3352 out_resp->connector_type = connector->connector_type; in drm_mode_getconnector()
3353 out_resp->connector_type_id = connector->connector_type_id; in drm_mode_getconnector()
3357 mutex_lock(&dev->mode_config.mutex); in drm_mode_getconnector()
3358 if (out_resp->count_modes == 0) { in drm_mode_getconnector()
3360 connector->funcs->fill_modes(connector, in drm_mode_getconnector()
3361 dev->mode_config.max_width, in drm_mode_getconnector()
3362 dev->mode_config.max_height); in drm_mode_getconnector()
3364 …drm_dbg_kms(dev, "User-space requested a forced probe on [CONNECTOR:%d:%s] but is not the DRM mast… in drm_mode_getconnector()
3365 connector->base.id, connector->name); in drm_mode_getconnector()
3368 out_resp->mm_width = connector->display_info.width_mm; in drm_mode_getconnector()
3369 out_resp->mm_height = connector->display_info.height_mm; in drm_mode_getconnector()
3370 out_resp->subpixel = connector->display_info.subpixel_order; in drm_mode_getconnector()
3371 out_resp->connection = connector->status; in drm_mode_getconnector()
3373 /* delayed so we get modes regardless of pre-fill_modes state */ in drm_mode_getconnector()
3374 list_for_each_entry(mode, &connector->modes, head) { in drm_mode_getconnector()
3375 WARN_ON(mode->expose_to_userspace); in drm_mode_getconnector()
3377 if (drm_mode_expose_to_userspace(mode, &connector->modes, in drm_mode_getconnector()
3379 mode->expose_to_userspace = true; in drm_mode_getconnector()
3388 if ((out_resp->count_modes >= mode_count) && mode_count) { in drm_mode_getconnector()
3390 mode_ptr = (struct drm_mode_modeinfo __user *)(unsigned long)out_resp->modes_ptr; in drm_mode_getconnector()
3391 list_for_each_entry(mode, &connector->modes, head) { in drm_mode_getconnector()
3392 if (!mode->expose_to_userspace) in drm_mode_getconnector()
3396 mode->expose_to_userspace = false; in drm_mode_getconnector()
3400 * Reset aspect ratio flags of user-mode, if modes with in drm_mode_getconnector()
3401 * aspect-ratio are not supported. in drm_mode_getconnector()
3403 if (!file_priv->aspect_ratio_allowed) in drm_mode_getconnector()
3407 ret = -EFAULT; in drm_mode_getconnector()
3413 list_for_each_entry_continue(mode, &connector->modes, head) in drm_mode_getconnector()
3414 mode->expose_to_userspace = false; in drm_mode_getconnector()
3416 mutex_unlock(&dev->mode_config.mutex); in drm_mode_getconnector()
3424 list_for_each_entry(mode, &connector->modes, head) in drm_mode_getconnector()
3425 mode->expose_to_userspace = false; in drm_mode_getconnector()
3428 out_resp->count_modes = mode_count; in drm_mode_getconnector()
3429 mutex_unlock(&dev->mode_config.mutex); in drm_mode_getconnector()
3431 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); in drm_mode_getconnector()
3434 out_resp->encoder_id = encoder->base.id; in drm_mode_getconnector()
3436 out_resp->encoder_id = 0; in drm_mode_getconnector()
3441 ret = drm_mode_object_get_properties(&connector->base, file_priv->atomic, in drm_mode_getconnector()
3442 file_priv->plane_color_pipeline, in drm_mode_getconnector()
3443 (uint32_t __user *)(unsigned long)(out_resp->props_ptr), in drm_mode_getconnector()
3444 (uint64_t __user *)(unsigned long)(out_resp->prop_values_ptr), in drm_mode_getconnector()
3445 &out_resp->count_props); in drm_mode_getconnector()
3446 drm_modeset_unlock(&dev->mode_config.connection_mutex); in drm_mode_getconnector()
3455 * drm_connector_find_by_fwnode - Find a connector based on the associated fwnode
3467 struct drm_connector *connector, *found = ERR_PTR(-ENODEV); in drm_connector_find_by_fwnode()
3470 return ERR_PTR(-ENODEV); in drm_connector_find_by_fwnode()
3475 if (connector->fwnode == fwnode || in drm_connector_find_by_fwnode()
3476 (connector->fwnode && connector->fwnode->secondary == fwnode)) { in drm_connector_find_by_fwnode()
3489 * drm_connector_oob_hotplug_event - Report out-of-band hotplug event to connector
3494 * driver / device. An example of this is some USB Type-C setups where the hardware
3495 * muxes the DisplayPort data and aux-lines but does not pass the altmode HPD
3498 * This function can be used to report these out-of-band events after obtaining
3510 if (connector->funcs->oob_hotplug_event) in drm_connector_oob_hotplug_event()
3511 connector->funcs->oob_hotplug_event(connector, status); in drm_connector_oob_hotplug_event()
3522 * identifier. Tiled monitors using DisplayID v1.3 have a unique 8-byte handle,
3527 * the tile group information is exposed through a non-standard way.
3533 struct drm_device *dev = tg->dev; in drm_tile_group_free()
3535 mutex_lock(&dev->mode_config.idr_mutex); in drm_tile_group_free()
3536 idr_remove(&dev->mode_config.tile_idr, tg->id); in drm_tile_group_free()
3537 mutex_unlock(&dev->mode_config.idr_mutex); in drm_tile_group_free()
3542 * drm_mode_put_tile_group - drop a reference to a tile group.
3551 kref_put(&tg->refcount, drm_tile_group_free); in drm_mode_put_tile_group()
3556 * drm_mode_get_tile_group - get a reference to an existing tile group
3558 * @topology: 8-bytes unique per monitor.
3571 mutex_lock(&dev->mode_config.idr_mutex); in drm_mode_get_tile_group()
3572 idr_for_each_entry(&dev->mode_config.tile_idr, tg, id) { in drm_mode_get_tile_group()
3573 if (!memcmp(tg->group_data, topology, 8)) { in drm_mode_get_tile_group()
3574 if (!kref_get_unless_zero(&tg->refcount)) in drm_mode_get_tile_group()
3576 mutex_unlock(&dev->mode_config.idr_mutex); in drm_mode_get_tile_group()
3580 mutex_unlock(&dev->mode_config.idr_mutex); in drm_mode_get_tile_group()
3586 * drm_mode_create_tile_group - create a tile group from a displayid description
3588 * @topology: 8-bytes unique per monitor.
3606 kref_init(&tg->refcount); in drm_mode_create_tile_group()
3607 memcpy(tg->group_data, topology, 8); in drm_mode_create_tile_group()
3608 tg->dev = dev; in drm_mode_create_tile_group()
3610 mutex_lock(&dev->mode_config.idr_mutex); in drm_mode_create_tile_group()
3611 ret = idr_alloc(&dev->mode_config.tile_idr, tg, 1, 0, GFP_KERNEL); in drm_mode_create_tile_group()
3613 tg->id = ret; in drm_mode_create_tile_group()
3619 mutex_unlock(&dev->mode_config.idr_mutex); in drm_mode_create_tile_group()