Lines Matching +full:int +full:- +full:property

44  * Hence they are reference-counted using drm_connector_get() and
60 * For connectors which are not fixed (like built-in panels) the driver needs to
68 int type;
79 { DRM_MODE_CONNECTOR_DVII, "DVI-I" },
80 { DRM_MODE_CONNECTOR_DVID, "DVI-D" },
81 { DRM_MODE_CONNECTOR_DVIA, "DVI-A" },
88 { DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" },
89 { DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" },
101 int i; in drm_connector_ida_init()
109 int i; in drm_connector_ida_destroy()
116 * drm_get_connector_type_name - return a string for connector type
121 const char *drm_get_connector_type_name(unsigned int type) in drm_get_connector_type_name()
131 * drm_connector_get_cmdline_mode - reads the user's cmdline mode
134 * The kernel supports per-connector configuration of its consoles through
142 struct drm_cmdline_mode *mode = &connector->cmdline_mode; in drm_connector_get_cmdline_mode()
145 if (fb_get_options(connector->name, &option)) in drm_connector_get_cmdline_mode()
153 if (mode->force) { in drm_connector_get_cmdline_mode()
154 DRM_INFO("forcing %s connector %s\n", connector->name, in drm_connector_get_cmdline_mode()
155 drm_get_connector_force_name(mode->force)); in drm_connector_get_cmdline_mode()
156 connector->force = mode->force; in drm_connector_get_cmdline_mode()
159 if (mode->panel_orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN) { in drm_connector_get_cmdline_mode()
161 connector->name, mode->panel_orientation); in drm_connector_get_cmdline_mode()
163 mode->panel_orientation); in drm_connector_get_cmdline_mode()
167 connector->name, mode->name, in drm_connector_get_cmdline_mode()
168 mode->xres, mode->yres, in drm_connector_get_cmdline_mode()
169 mode->refresh_specified ? mode->refresh : 60, in drm_connector_get_cmdline_mode()
170 mode->rb ? " reduced blanking" : "", in drm_connector_get_cmdline_mode()
171 mode->margins ? " with margins" : "", in drm_connector_get_cmdline_mode()
172 mode->interlace ? " interlaced" : ""); in drm_connector_get_cmdline_mode()
179 struct drm_device *dev = connector->dev; in drm_connector_free()
181 drm_mode_object_unregister(dev, &connector->base); in drm_connector_free()
182 connector->funcs->destroy(connector); in drm_connector_free()
190 struct drm_mode_config *config = &dev->mode_config; in drm_connector_free_work_fn()
194 spin_lock_irqsave(&config->connector_list_lock, flags); in drm_connector_free_work_fn()
195 freed = llist_del_all(&config->connector_free_list); in drm_connector_free_work_fn()
196 spin_unlock_irqrestore(&config->connector_list_lock, flags); in drm_connector_free_work_fn()
199 drm_mode_object_unregister(dev, &connector->base); in drm_connector_free_work_fn()
200 connector->funcs->destroy(connector); in drm_connector_free_work_fn()
205 * drm_connector_init - Init a preallocated connector
217 int drm_connector_init(struct drm_device *dev, in drm_connector_init()
220 int connector_type) in drm_connector_init()
222 struct drm_mode_config *config = &dev->mode_config; in drm_connector_init()
223 int ret; in drm_connector_init()
228 (!funcs->atomic_destroy_state || in drm_connector_init()
229 !funcs->atomic_duplicate_state)); in drm_connector_init()
231 ret = __drm_mode_object_add(dev, &connector->base, in drm_connector_init()
237 connector->base.properties = &connector->properties; in drm_connector_init()
238 connector->dev = dev; in drm_connector_init()
239 connector->funcs = funcs; in drm_connector_init()
242 ret = ida_simple_get(&config->connector_ida, 0, 32, GFP_KERNEL); in drm_connector_init()
249 connector->index = ret; in drm_connector_init()
252 connector->connector_type = connector_type; in drm_connector_init()
253 connector->connector_type_id = in drm_connector_init()
255 if (connector->connector_type_id < 0) { in drm_connector_init()
256 ret = connector->connector_type_id; in drm_connector_init()
259 connector->name = in drm_connector_init()
260 kasprintf(GFP_KERNEL, "%s-%d", in drm_connector_init()
262 connector->connector_type_id); in drm_connector_init()
263 if (!connector->name) { in drm_connector_init()
264 ret = -ENOMEM; in drm_connector_init()
268 INIT_LIST_HEAD(&connector->probed_modes); in drm_connector_init()
269 INIT_LIST_HEAD(&connector->modes); in drm_connector_init()
270 mutex_init(&connector->mutex); in drm_connector_init()
271 connector->edid_blob_ptr = NULL; in drm_connector_init()
272 connector->epoch_counter = 0; in drm_connector_init()
273 connector->tile_blob_ptr = NULL; in drm_connector_init()
274 connector->status = connector_status_unknown; in drm_connector_init()
275 connector->display_info.panel_orientation = in drm_connector_init()
282 spin_lock_irq(&config->connector_list_lock); in drm_connector_init()
283 list_add_tail(&connector->head, &config->connector_list); in drm_connector_init()
284 config->num_connector++; in drm_connector_init()
285 spin_unlock_irq(&config->connector_list_lock); in drm_connector_init()
291 drm_object_attach_property(&connector->base, in drm_connector_init()
292 config->dpms_property, 0); in drm_connector_init()
294 drm_object_attach_property(&connector->base, in drm_connector_init()
295 config->link_status_property, in drm_connector_init()
298 drm_object_attach_property(&connector->base, in drm_connector_init()
299 config->non_desktop_property, in drm_connector_init()
301 drm_object_attach_property(&connector->base, in drm_connector_init()
302 config->tile_property, in drm_connector_init()
306 drm_object_attach_property(&connector->base, config->prop_crtc_id, 0); in drm_connector_init()
309 connector->debugfs_entry = NULL; in drm_connector_init()
312 ida_simple_remove(connector_ida, connector->connector_type_id); in drm_connector_init()
315 ida_simple_remove(&config->connector_ida, connector->index); in drm_connector_init()
318 drm_mode_object_unregister(dev, &connector->base); in drm_connector_init()
325 * drm_connector_init_with_ddc - Init a preallocated connector
340 int drm_connector_init_with_ddc(struct drm_device *dev, in drm_connector_init_with_ddc()
343 int connector_type, in drm_connector_init_with_ddc()
346 int ret; in drm_connector_init_with_ddc()
353 connector->ddc = ddc; in drm_connector_init_with_ddc()
360 * drm_connector_attach_edid_property - attach edid property.
364 * edid property attached by default. This function can be used to
365 * explicitly enable the edid property in these cases.
369 struct drm_mode_config *config = &connector->dev->mode_config; in drm_connector_attach_edid_property()
371 drm_object_attach_property(&connector->base, in drm_connector_attach_edid_property()
372 config->edid_property, in drm_connector_attach_edid_property()
378 * drm_connector_attach_encoder - attach a connector to an encoder
389 int drm_connector_attach_encoder(struct drm_connector *connector, in drm_connector_attach_encoder()
395 * direct assignment of connector->encoder = encoder. This connection in drm_connector_attach_encoder()
403 if (WARN_ON(connector->encoder)) in drm_connector_attach_encoder()
404 return -EINVAL; in drm_connector_attach_encoder()
406 connector->possible_encoders |= drm_encoder_mask(encoder); in drm_connector_attach_encoder()
413 * drm_connector_has_possible_encoder - check if the connector and encoder are
424 return connector->possible_encoders & drm_encoder_mask(encoder); in drm_connector_has_possible_encoder()
431 list_del(&mode->head); in drm_mode_remove()
432 drm_mode_destroy(connector->dev, mode); in drm_mode_remove()
436 * drm_connector_cleanup - cleans up an initialised connector
443 struct drm_device *dev = connector->dev; in drm_connector_cleanup()
449 if (WARN_ON(connector->registration_state == in drm_connector_cleanup()
453 if (connector->tile_group) { in drm_connector_cleanup()
454 drm_mode_put_tile_group(dev, connector->tile_group); in drm_connector_cleanup()
455 connector->tile_group = NULL; in drm_connector_cleanup()
458 list_for_each_entry_safe(mode, t, &connector->probed_modes, head) in drm_connector_cleanup()
461 list_for_each_entry_safe(mode, t, &connector->modes, head) in drm_connector_cleanup()
464 ida_simple_remove(&drm_connector_enum_list[connector->connector_type].ida, in drm_connector_cleanup()
465 connector->connector_type_id); in drm_connector_cleanup()
467 ida_simple_remove(&dev->mode_config.connector_ida, in drm_connector_cleanup()
468 connector->index); in drm_connector_cleanup()
470 kfree(connector->display_info.bus_formats); in drm_connector_cleanup()
471 drm_mode_object_unregister(dev, &connector->base); in drm_connector_cleanup()
472 kfree(connector->name); in drm_connector_cleanup()
473 connector->name = NULL; in drm_connector_cleanup()
474 spin_lock_irq(&dev->mode_config.connector_list_lock); in drm_connector_cleanup()
475 list_del(&connector->head); in drm_connector_cleanup()
476 dev->mode_config.num_connector--; in drm_connector_cleanup()
477 spin_unlock_irq(&dev->mode_config.connector_list_lock); in drm_connector_cleanup()
479 WARN_ON(connector->state && !connector->funcs->atomic_destroy_state); in drm_connector_cleanup()
480 if (connector->state && connector->funcs->atomic_destroy_state) in drm_connector_cleanup()
481 connector->funcs->atomic_destroy_state(connector, in drm_connector_cleanup()
482 connector->state); in drm_connector_cleanup()
484 mutex_destroy(&connector->mutex); in drm_connector_cleanup()
491 * drm_connector_register - register a connector
502 int drm_connector_register(struct drm_connector *connector) in drm_connector_register()
504 int ret = 0; in drm_connector_register()
506 if (!connector->dev->registered) in drm_connector_register()
509 mutex_lock(&connector->mutex); in drm_connector_register()
510 if (connector->registration_state != DRM_CONNECTOR_INITIALIZING) in drm_connector_register()
519 if (connector->funcs->late_register) { in drm_connector_register()
520 ret = connector->funcs->late_register(connector); in drm_connector_register()
525 drm_mode_object_register(connector->dev, &connector->base); in drm_connector_register()
527 connector->registration_state = DRM_CONNECTOR_REGISTERED; in drm_connector_register()
530 drm_sysfs_hotplug_event(connector->dev); in drm_connector_register()
538 mutex_unlock(&connector->mutex); in drm_connector_register()
544 * drm_connector_unregister - unregister a connector
554 mutex_lock(&connector->mutex); in drm_connector_unregister()
555 if (connector->registration_state != DRM_CONNECTOR_REGISTERED) { in drm_connector_unregister()
556 mutex_unlock(&connector->mutex); in drm_connector_unregister()
560 if (connector->funcs->early_unregister) in drm_connector_unregister()
561 connector->funcs->early_unregister(connector); in drm_connector_unregister()
566 connector->registration_state = DRM_CONNECTOR_UNREGISTERED; in drm_connector_unregister()
567 mutex_unlock(&connector->mutex); in drm_connector_unregister()
582 int drm_connector_register_all(struct drm_device *dev) in drm_connector_register_all()
586 int ret = 0; in drm_connector_register_all()
602 * drm_get_connector_status_name - return a string for connector status
620 * drm_get_connector_force_name - return a string for connector force
648 * drm_connector_list_iter_begin - initialize a connector_list iterator
660 iter->dev = dev; in drm_connector_list_iter_begin()
661 iter->conn = NULL; in drm_connector_list_iter_begin()
667 * Extra-safe connector put function that works in any context. Should only be
674 struct drm_mode_config *config = &conn->dev->mode_config; in __drm_connector_put_safe()
676 lockdep_assert_held(&config->connector_list_lock); in __drm_connector_put_safe()
678 if (!refcount_dec_and_test(&conn->base.refcount.refcount)) in __drm_connector_put_safe()
681 llist_add(&conn->free_node, &config->connector_free_list); in __drm_connector_put_safe()
682 schedule_work(&config->connector_free_work); in __drm_connector_put_safe()
686 * drm_connector_list_iter_next - return next connector
695 struct drm_connector *old_conn = iter->conn; in drm_connector_list_iter_next()
696 struct drm_mode_config *config = &iter->dev->mode_config; in drm_connector_list_iter_next()
700 spin_lock_irqsave(&config->connector_list_lock, flags); in drm_connector_list_iter_next()
701 lhead = old_conn ? &old_conn->head : &config->connector_list; in drm_connector_list_iter_next()
704 if (lhead->next == &config->connector_list) { in drm_connector_list_iter_next()
705 iter->conn = NULL; in drm_connector_list_iter_next()
709 lhead = lhead->next; in drm_connector_list_iter_next()
710 iter->conn = list_entry(lhead, struct drm_connector, head); in drm_connector_list_iter_next()
713 } while (!kref_get_unless_zero(&iter->conn->base.refcount)); in drm_connector_list_iter_next()
717 spin_unlock_irqrestore(&config->connector_list_lock, flags); in drm_connector_list_iter_next()
719 return iter->conn; in drm_connector_list_iter_next()
724 * drm_connector_list_iter_end - tear down a connector_list iterator
734 struct drm_mode_config *config = &iter->dev->mode_config; in drm_connector_list_iter_end()
737 iter->dev = NULL; in drm_connector_list_iter_end()
738 if (iter->conn) { in drm_connector_list_iter_end()
739 spin_lock_irqsave(&config->connector_list_lock, flags); in drm_connector_list_iter_end()
740 __drm_connector_put_safe(iter->conn); in drm_connector_list_iter_end()
741 spin_unlock_irqrestore(&config->connector_list_lock, flags); in drm_connector_list_iter_end()
757 * drm_get_subpixel_order_name - return a string for a given subpixel enum
783 * drm_display_info_set_bus_formats - set the supported bus formats
789 * See MEDIA_BUS_FMT_* definitions in include/uapi/linux/media-bus-format.h for
792 int drm_display_info_set_bus_formats(struct drm_display_info *info, in drm_display_info_set_bus_formats()
794 unsigned int num_formats) in drm_display_info_set_bus_formats()
799 return -EINVAL; in drm_display_info_set_bus_formats()
805 return -ENOMEM; in drm_display_info_set_bus_formats()
808 kfree(info->bus_formats); in drm_display_info_set_bus_formats()
809 info->bus_formats = fmts; in drm_display_info_set_bus_formats()
810 info->num_bus_formats = num_formats; in drm_display_info_set_bus_formats()
846 { DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I and TV-out */
847 { DRM_MODE_SUBCONNECTOR_DVID, "DVI-D" }, /* DVI-I */
848 { DRM_MODE_SUBCONNECTOR_DVIA, "DVI-A" }, /* DVI-I */
853 { DRM_MODE_SUBCONNECTOR_Unknown, "Unknown" }, /* DVI-I, TV-out and DP */
854 { DRM_MODE_SUBCONNECTOR_DVID, "DVI-D" }, /* DVI-I */
855 { DRM_MODE_SUBCONNECTOR_DVIA, "DVI-A" }, /* DVI-I */
861 { DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I and TV-out */
862 { DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */
863 { DRM_MODE_SUBCONNECTOR_SVIDEO, "SVIDEO" }, /* TV-out */
864 { DRM_MODE_SUBCONNECTOR_Component, "Component" }, /* TV-out */
865 { DRM_MODE_SUBCONNECTOR_SCART, "SCART" }, /* TV-out */
870 { DRM_MODE_SUBCONNECTOR_Unknown, "Unknown" }, /* DVI-I, TV-out and DP */
871 { DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */
872 { DRM_MODE_SUBCONNECTOR_SVIDEO, "SVIDEO" }, /* TV-out */
873 { DRM_MODE_SUBCONNECTOR_Component, "Component" }, /* TV-out */
874 { DRM_MODE_SUBCONNECTOR_SCART, "SCART" }, /* TV-out */
880 { DRM_MODE_SUBCONNECTOR_Unknown, "Unknown" }, /* DVI-I, TV-out and DP */
882 { DRM_MODE_SUBCONNECTOR_DVID, "DVI-D" }, /* DP */
898 /* Standard Definition Colorimetry based on IEC 61966-2-4 */
900 /* High Definition Colorimetry based on IEC 61966-2-4 */
902 /* Colorimetry based on IEC 61966-2-1/Amendment 1 */
904 /* Colorimetry based on IEC 61966-2-5 [33] */
906 /* Colorimetry based on IEC 61966-2-5 */
908 /* Colorimetry based on ITU-R BT.2020 */
910 /* Colorimetry based on ITU-R BT.2020 */
912 /* Colorimetry based on ITU-R BT.2020 */
915 { DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65, "DCI-P3_RGB_D65" },
916 { DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER, "DCI-P3_RGB_Theater" },
921 * Format Table 2-120
927 /* Colorimetry based on scRGB (IEC 61966-2-2) */
929 /* Colorimetry based on IEC 61966-2-5 */
931 /* Colorimetry based on SMPTE RP 431-2 */
932 { DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65, "DCI-P3_RGB_D65" },
933 /* Colorimetry based on ITU-R BT.2020 */
937 /* Standard Definition Colorimetry based on IEC 61966-2-4 */
939 /* High Definition Colorimetry based on IEC 61966-2-4 */
941 /* Colorimetry based on IEC 61966-2-1/Amendment 1 */
943 /* Colorimetry based on IEC 61966-2-5 [33] */
945 /* Colorimetry based on ITU-R BT.2020 */
947 /* Colorimetry based on ITU-R BT.2020 */
957 * Blob property which contains the current EDID read from the sink. This
959 * and serial. Drivers should update this property by calling
962 * property.
964 * Legacy property for setting the power state of the connector. For atomic
966 * drivers, it remaps to controlling the "ACTIVE" property on the CRTC the
967 * connector is linked to. Drivers should never set this property directly,
969 * callback. For atomic drivers the remapping to the "ACTIVE" property is
972 * Note that this property cannot be set through the MODE_ATOMIC ioctl,
983 * The second issue is that the DPMS state is only well-defined when the
995 * Connector path property to identify how this sink is physically
998 * path property the MST manager created. Userspace cannot change this
999 * property.
1001 * Connector tile group property to indicate how a set of DRM connector
1002 * compose together into one logical screen. This is used by both high-res
1004 * DP MST sinks), or high-res integrated panels (like dual-link DSI) which
1005 * are not gen-locked. Note that for tiled panels which are genlocked, like
1006 * dual-link LVDS or dual-link DSI, the driver should try to not expose the
1009 * Userspace cannot change this property.
1010 * link-status:
1011 * Connector link-status property to indicate the status of link. The
1012 * default value of link-status is "GOOD". If something fails during or
1017 * When user-space receives the hotplug uevent and detects a "BAD"
1018 * link-status, the sink doesn't receive pixels anymore (e.g. the screen
1020 * changed. User-space is expected to pick a new mode if the current one
1021 * has disappeared and perform a new modeset with link-status set to
1022 * "GOOD" to re-enable the connector.
1025 * link-status, the other are unaffected (ie. the sinks still continue to
1028 * When user-space performs an atomic commit on a connector with a "BAD"
1029 * link-status without resetting the property to "GOOD", the sink may
1030 * still not receive pixels. When user-space performs an atomic commit
1031 * which resets the link-status property to "GOOD" without the
1034 * User-space can only change link-status to "GOOD", changing it to "BAD"
1035 * is a no-op.
1037 * For backwards compatibility with non-atomic userspace the kernel
1038 * tries to automatically set the link-status back to "GOOD" in the
1047 * This property is used by userspace to request the kernel protect future
1050 * property to tell userspace the protection is active.
1055 * The value of this property can be one of the following:
1065 * protected. Only the driver can set the property to this value.
1067 * -EINVAL.
1071 * - DESIRED state should be preserved until userspace de-asserts it by
1072 * setting the property to UNDESIRED. This means ENABLED should only
1074 * - If the state is DESIRED, kernel should attempt to re-authenticate the
1077 * - Kernel sends uevent with the connector id and property id through
1081 * - DESIRED -> ENABLED (authentication success)
1082 * - ENABLED -> DESIRED (termination of authentication)
1083 * - Please note no uevents for userspace triggered property state changes,
1086 * - DESIRED/ENABLED -> UNDESIRED
1087 * - UNDESIRED -> DESIRED
1088 * - Userspace is responsible for polling the property or listen to uevents
1094 * This Enum property is used by the userspace to declare the content type
1102 * The value of the property can be one of the below:
1103 * - "HDCP Type0": DRM_MODE_HDCP_CONTENT_TYPE0 = 0
1104 * - "HDCP Type1": DRM_MODE_HDCP_CONTENT_TYPE1 = 1
1132 * Note that the HDCP Content Type property is introduced at HDCP 2.2, and
1139 * then kernel will disable the HDCP and re-enable with new type in the
1145 * Connector property to enable userspace to send HDR Metadata to
1150 * SDP packet (Non-audio INFOFRAME SDP v1.3) for DP. This is then
1163 * be send to sink. It then uses this property to communicate this
1168 * - Some layers are HDR and others are SDR
1169 * - HDR layers luminance is not same as sink
1186 * This range property is used by userspace to limit the bit depth. When
1190 * property to the connector during initialization.
1192 * Connectors also have one standardized atomic property:
1197 * Connectors for LCD panels may also have one standardized property:
1202 * the device. Userspace can use this property to check for this.
1207 * touchscreen input coordinates. This property is initialized by calling
1212 * This property defines how a non-native mode is upscaled to the native
1228 * This property should be set up by calling
1230 * can also expose this property to external outputs, in which case they
1232 * have a built-in scaler).
1235 * This property is used by DVI-I, TVout and DisplayPort to indicate different
1238 * For DVI-I and TVout there is also a matching property "select subconnector"
1243 int drm_connector_create_standard_properties(struct drm_device *dev) in drm_connector_create_standard_properties()
1251 return -ENOMEM; in drm_connector_create_standard_properties()
1252 dev->mode_config.edid_property = prop; in drm_connector_create_standard_properties()
1258 return -ENOMEM; in drm_connector_create_standard_properties()
1259 dev->mode_config.dpms_property = prop; in drm_connector_create_standard_properties()
1266 return -ENOMEM; in drm_connector_create_standard_properties()
1267 dev->mode_config.path_property = prop; in drm_connector_create_standard_properties()
1274 return -ENOMEM; in drm_connector_create_standard_properties()
1275 dev->mode_config.tile_property = prop; in drm_connector_create_standard_properties()
1277 prop = drm_property_create_enum(dev, 0, "link-status", in drm_connector_create_standard_properties()
1281 return -ENOMEM; in drm_connector_create_standard_properties()
1282 dev->mode_config.link_status_property = prop; in drm_connector_create_standard_properties()
1284 prop = drm_property_create_bool(dev, DRM_MODE_PROP_IMMUTABLE, "non-desktop"); in drm_connector_create_standard_properties()
1286 return -ENOMEM; in drm_connector_create_standard_properties()
1287 dev->mode_config.non_desktop_property = prop; in drm_connector_create_standard_properties()
1292 return -ENOMEM; in drm_connector_create_standard_properties()
1293 dev->mode_config.hdr_output_metadata_property = prop; in drm_connector_create_standard_properties()
1299 * drm_mode_create_dvi_i_properties - create DVI-I specific connector properties
1302 * Called by a driver the first time a DVI-I connector is made.
1304 int drm_mode_create_dvi_i_properties(struct drm_device *dev) in drm_mode_create_dvi_i_properties()
1309 if (dev->mode_config.dvi_i_select_subconnector_property) in drm_mode_create_dvi_i_properties()
1317 dev->mode_config.dvi_i_select_subconnector_property = dvi_i_selector; in drm_mode_create_dvi_i_properties()
1323 dev->mode_config.dvi_i_subconnector_property = dvi_i_subconnector; in drm_mode_create_dvi_i_properties()
1330 * drm_connector_attach_dp_subconnector_property - create subconnector property for DP
1331 * @connector: drm_connector to attach property
1337 struct drm_mode_config *mode_config = &connector->dev->mode_config; in drm_connector_attach_dp_subconnector_property()
1339 if (!mode_config->dp_subconnector_property) in drm_connector_attach_dp_subconnector_property()
1340 mode_config->dp_subconnector_property = in drm_connector_attach_dp_subconnector_property()
1341 drm_property_create_enum(connector->dev, in drm_connector_attach_dp_subconnector_property()
1347 drm_object_attach_property(&connector->base, in drm_connector_attach_dp_subconnector_property()
1348 mode_config->dp_subconnector_property, in drm_connector_attach_dp_subconnector_property()
1361 * The value of this property can be one of the following:
1374 * Drivers can set up this property by calling
1380 * drm_connector_attach_content_type_property - attach content-type property
1381 * @connector: connector to attach content type property on.
1385 int drm_connector_attach_content_type_property(struct drm_connector *connector) in drm_connector_attach_content_type_property()
1387 if (!drm_mode_create_content_type_property(connector->dev)) in drm_connector_attach_content_type_property()
1388 drm_object_attach_property(&connector->base, in drm_connector_attach_content_type_property()
1389 connector->dev->mode_config.content_type_property, in drm_connector_attach_content_type_property()
1397 * drm_hdmi_avi_infoframe_content_type() - fill the HDMI AVI infoframe
1399 * on correspondent DRM property.
1407 switch (conn_state->content_type) { in drm_hdmi_avi_infoframe_content_type()
1409 frame->content_type = HDMI_CONTENT_TYPE_GRAPHICS; in drm_hdmi_avi_infoframe_content_type()
1412 frame->content_type = HDMI_CONTENT_TYPE_CINEMA; in drm_hdmi_avi_infoframe_content_type()
1415 frame->content_type = HDMI_CONTENT_TYPE_GAME; in drm_hdmi_avi_infoframe_content_type()
1418 frame->content_type = HDMI_CONTENT_TYPE_PHOTO; in drm_hdmi_avi_infoframe_content_type()
1422 frame->content_type = HDMI_CONTENT_TYPE_GRAPHICS; in drm_hdmi_avi_infoframe_content_type()
1425 frame->itc = conn_state->content_type != DRM_MODE_CONTENT_TYPE_NO_DATA; in drm_hdmi_avi_infoframe_content_type()
1430 * drm_mode_attach_tv_margin_properties - attach TV connector margin properties
1438 struct drm_device *dev = connector->dev; in drm_connector_attach_tv_margin_properties()
1440 drm_object_attach_property(&connector->base, in drm_connector_attach_tv_margin_properties()
1441 dev->mode_config.tv_left_margin_property, in drm_connector_attach_tv_margin_properties()
1443 drm_object_attach_property(&connector->base, in drm_connector_attach_tv_margin_properties()
1444 dev->mode_config.tv_right_margin_property, in drm_connector_attach_tv_margin_properties()
1446 drm_object_attach_property(&connector->base, in drm_connector_attach_tv_margin_properties()
1447 dev->mode_config.tv_top_margin_property, in drm_connector_attach_tv_margin_properties()
1449 drm_object_attach_property(&connector->base, in drm_connector_attach_tv_margin_properties()
1450 dev->mode_config.tv_bottom_margin_property, in drm_connector_attach_tv_margin_properties()
1456 * drm_mode_create_tv_margin_properties - create TV connector margin properties
1464 int drm_mode_create_tv_margin_properties(struct drm_device *dev) in drm_mode_create_tv_margin_properties()
1466 if (dev->mode_config.tv_left_margin_property) in drm_mode_create_tv_margin_properties()
1469 dev->mode_config.tv_left_margin_property = in drm_mode_create_tv_margin_properties()
1471 if (!dev->mode_config.tv_left_margin_property) in drm_mode_create_tv_margin_properties()
1472 return -ENOMEM; in drm_mode_create_tv_margin_properties()
1474 dev->mode_config.tv_right_margin_property = in drm_mode_create_tv_margin_properties()
1476 if (!dev->mode_config.tv_right_margin_property) in drm_mode_create_tv_margin_properties()
1477 return -ENOMEM; in drm_mode_create_tv_margin_properties()
1479 dev->mode_config.tv_top_margin_property = in drm_mode_create_tv_margin_properties()
1481 if (!dev->mode_config.tv_top_margin_property) in drm_mode_create_tv_margin_properties()
1482 return -ENOMEM; in drm_mode_create_tv_margin_properties()
1484 dev->mode_config.tv_bottom_margin_property = in drm_mode_create_tv_margin_properties()
1486 if (!dev->mode_config.tv_bottom_margin_property) in drm_mode_create_tv_margin_properties()
1487 return -ENOMEM; in drm_mode_create_tv_margin_properties()
1494 * drm_mode_create_tv_properties - create TV specific connector properties
1504 int drm_mode_create_tv_properties(struct drm_device *dev, in drm_mode_create_tv_properties()
1505 unsigned int num_modes, in drm_mode_create_tv_properties()
1510 unsigned int i; in drm_mode_create_tv_properties()
1512 if (dev->mode_config.tv_select_subconnector_property) in drm_mode_create_tv_properties()
1525 dev->mode_config.tv_select_subconnector_property = tv_selector; in drm_mode_create_tv_properties()
1534 dev->mode_config.tv_subconnector_property = tv_subconnector; in drm_mode_create_tv_properties()
1542 dev->mode_config.tv_mode_property = in drm_mode_create_tv_properties()
1545 if (!dev->mode_config.tv_mode_property) in drm_mode_create_tv_properties()
1549 drm_property_add_enum(dev->mode_config.tv_mode_property, in drm_mode_create_tv_properties()
1552 dev->mode_config.tv_brightness_property = in drm_mode_create_tv_properties()
1554 if (!dev->mode_config.tv_brightness_property) in drm_mode_create_tv_properties()
1557 dev->mode_config.tv_contrast_property = in drm_mode_create_tv_properties()
1559 if (!dev->mode_config.tv_contrast_property) in drm_mode_create_tv_properties()
1562 dev->mode_config.tv_flicker_reduction_property = in drm_mode_create_tv_properties()
1564 if (!dev->mode_config.tv_flicker_reduction_property) in drm_mode_create_tv_properties()
1567 dev->mode_config.tv_overscan_property = in drm_mode_create_tv_properties()
1569 if (!dev->mode_config.tv_overscan_property) in drm_mode_create_tv_properties()
1572 dev->mode_config.tv_saturation_property = in drm_mode_create_tv_properties()
1574 if (!dev->mode_config.tv_saturation_property) in drm_mode_create_tv_properties()
1577 dev->mode_config.tv_hue_property = in drm_mode_create_tv_properties()
1579 if (!dev->mode_config.tv_hue_property) in drm_mode_create_tv_properties()
1584 return -ENOMEM; in drm_mode_create_tv_properties()
1589 * drm_mode_create_scaling_mode_property - create scaling mode property
1599 int drm_mode_create_scaling_mode_property(struct drm_device *dev) in drm_mode_create_scaling_mode_property()
1603 if (dev->mode_config.scaling_mode_property) in drm_mode_create_scaling_mode_property()
1611 dev->mode_config.scaling_mode_property = scaling_mode; in drm_mode_create_scaling_mode_property()
1652 * Optional &drm_connector boolean property that drivers should attach
1655 * property value by calling drm_connector_set_vrr_capable_property().
1657 * Absence of the property should indicate absence of support.
1660 * Default &drm_crtc boolean property that notifies the driver that the
1662 * The driver will take this property as a hint to enable variable
1664 * "vrr_capable" property is true on the &drm_connector object. The
1665 * vertical front porch duration will be extended until page-flip or
1680 * drm_connector_attach_vrr_capable_property - creates the
1681 * vrr_capable property
1682 * @connector: connector to create the vrr_capable property on.
1690 int drm_connector_attach_vrr_capable_property( in drm_connector_attach_vrr_capable_property()
1693 struct drm_device *dev = connector->dev; in drm_connector_attach_vrr_capable_property()
1696 if (!connector->vrr_capable_property) { in drm_connector_attach_vrr_capable_property()
1700 return -ENOMEM; in drm_connector_attach_vrr_capable_property()
1702 connector->vrr_capable_property = prop; in drm_connector_attach_vrr_capable_property()
1703 drm_object_attach_property(&connector->base, prop, 0); in drm_connector_attach_vrr_capable_property()
1711 * drm_connector_attach_scaling_mode_property - attach atomic scaling mode property
1712 * @connector: connector to attach scaling mode property on.
1717 * and can be used from &drm_connector_helper_funcs->atomic_check for validation.
1724 int drm_connector_attach_scaling_mode_property(struct drm_connector *connector, in drm_connector_attach_scaling_mode_property()
1727 struct drm_device *dev = connector->dev; in drm_connector_attach_scaling_mode_property()
1729 int i; in drm_connector_attach_scaling_mode_property()
1731 (1U << ARRAY_SIZE(drm_scaling_mode_enum_list)) - 1; in drm_connector_attach_scaling_mode_property()
1735 return -EINVAL; in drm_connector_attach_scaling_mode_property()
1742 return -ENOMEM; in drm_connector_attach_scaling_mode_property()
1745 int ret; in drm_connector_attach_scaling_mode_property()
1761 drm_object_attach_property(&connector->base, in drm_connector_attach_scaling_mode_property()
1764 connector->scaling_mode_property = scaling_mode_property; in drm_connector_attach_scaling_mode_property()
1771 * drm_mode_create_aspect_ratio_property - create aspect ratio property
1780 int drm_mode_create_aspect_ratio_property(struct drm_device *dev) in drm_mode_create_aspect_ratio_property()
1782 if (dev->mode_config.aspect_ratio_property) in drm_mode_create_aspect_ratio_property()
1785 dev->mode_config.aspect_ratio_property = in drm_mode_create_aspect_ratio_property()
1790 if (dev->mode_config.aspect_ratio_property == NULL) in drm_mode_create_aspect_ratio_property()
1791 return -ENOMEM; in drm_mode_create_aspect_ratio_property()
1801 * This property helps select a suitable colorspace based on the sink
1808 * and get supported colorspaces. Use this property and switch to the
1813 * - Set up CRTC DEGAMMA/CTM/GAMMA to convert to some sink
1815 * - Set this new property to let the sink know what it
1817 * - This property is just to inform sink what colorspace
1826 * drm_mode_create_hdmi_colorspace_property - create hdmi colorspace property
1827 * @connector: connector to create the Colorspace property on.
1835 int drm_mode_create_hdmi_colorspace_property(struct drm_connector *connector) in drm_mode_create_hdmi_colorspace_property()
1837 struct drm_device *dev = connector->dev; in drm_mode_create_hdmi_colorspace_property()
1839 if (connector->colorspace_property) in drm_mode_create_hdmi_colorspace_property()
1842 connector->colorspace_property = in drm_mode_create_hdmi_colorspace_property()
1847 if (!connector->colorspace_property) in drm_mode_create_hdmi_colorspace_property()
1848 return -ENOMEM; in drm_mode_create_hdmi_colorspace_property()
1855 * drm_mode_create_dp_colorspace_property - create dp colorspace property
1856 * @connector: connector to create the Colorspace property on.
1864 int drm_mode_create_dp_colorspace_property(struct drm_connector *connector) in drm_mode_create_dp_colorspace_property()
1866 struct drm_device *dev = connector->dev; in drm_mode_create_dp_colorspace_property()
1868 if (connector->colorspace_property) in drm_mode_create_dp_colorspace_property()
1871 connector->colorspace_property = in drm_mode_create_dp_colorspace_property()
1876 if (!connector->colorspace_property) in drm_mode_create_dp_colorspace_property()
1877 return -ENOMEM; in drm_mode_create_dp_colorspace_property()
1884 * drm_mode_create_content_type_property - create content type property
1893 int drm_mode_create_content_type_property(struct drm_device *dev) in drm_mode_create_content_type_property()
1895 if (dev->mode_config.content_type_property) in drm_mode_create_content_type_property()
1898 dev->mode_config.content_type_property = in drm_mode_create_content_type_property()
1903 if (dev->mode_config.content_type_property == NULL) in drm_mode_create_content_type_property()
1904 return -ENOMEM; in drm_mode_create_content_type_property()
1911 * drm_mode_create_suggested_offset_properties - create suggests offset properties
1914 * Create the suggested x/y offset property for connectors.
1916 int drm_mode_create_suggested_offset_properties(struct drm_device *dev) in drm_mode_create_suggested_offset_properties()
1918 if (dev->mode_config.suggested_x_property && dev->mode_config.suggested_y_property) in drm_mode_create_suggested_offset_properties()
1921 dev->mode_config.suggested_x_property = in drm_mode_create_suggested_offset_properties()
1924 dev->mode_config.suggested_y_property = in drm_mode_create_suggested_offset_properties()
1927 if (dev->mode_config.suggested_x_property == NULL || in drm_mode_create_suggested_offset_properties()
1928 dev->mode_config.suggested_y_property == NULL) in drm_mode_create_suggested_offset_properties()
1929 return -ENOMEM; in drm_mode_create_suggested_offset_properties()
1935 * drm_connector_set_path_property - set tile property on connector
1936 * @connector: connector to set property on.
1937 * @path: path to use for property; must not be NULL.
1939 * This creates a property to expose to userspace to specify a
1947 int drm_connector_set_path_property(struct drm_connector *connector, in drm_connector_set_path_property()
1950 struct drm_device *dev = connector->dev; in drm_connector_set_path_property()
1951 int ret; in drm_connector_set_path_property()
1954 &connector->path_blob_ptr, in drm_connector_set_path_property()
1957 &connector->base, in drm_connector_set_path_property()
1958 dev->mode_config.path_property); in drm_connector_set_path_property()
1964 * drm_connector_set_tile_property - set tile property on connector
1965 * @connector: connector to set property on.
1968 * property for userspace to parse if it exists. The property is of
1976 int drm_connector_set_tile_property(struct drm_connector *connector) in drm_connector_set_tile_property()
1978 struct drm_device *dev = connector->dev; in drm_connector_set_tile_property()
1980 int ret; in drm_connector_set_tile_property()
1982 if (!connector->has_tile) { in drm_connector_set_tile_property()
1984 &connector->tile_blob_ptr, in drm_connector_set_tile_property()
1987 &connector->base, in drm_connector_set_tile_property()
1988 dev->mode_config.tile_property); in drm_connector_set_tile_property()
1993 connector->tile_group->id, connector->tile_is_single_monitor, in drm_connector_set_tile_property()
1994 connector->num_h_tile, connector->num_v_tile, in drm_connector_set_tile_property()
1995 connector->tile_h_loc, connector->tile_v_loc, in drm_connector_set_tile_property()
1996 connector->tile_h_size, connector->tile_v_size); in drm_connector_set_tile_property()
1999 &connector->tile_blob_ptr, in drm_connector_set_tile_property()
2002 &connector->base, in drm_connector_set_tile_property()
2003 dev->mode_config.tile_property); in drm_connector_set_tile_property()
2009 * drm_connector_update_edid_property - update the edid property of a connector
2011 * @edid: new value of the edid property
2014 * connector's edid property.
2016 * set the connector's tile property here. See drm_connector_set_tile_property()
2022 int drm_connector_update_edid_property(struct drm_connector *connector, in drm_connector_update_edid_property()
2025 struct drm_device *dev = connector->dev; in drm_connector_update_edid_property()
2027 int ret; in drm_connector_update_edid_property()
2031 if (connector->override_edid) in drm_connector_update_edid_property()
2035 size = EDID_LENGTH * (1 + edid->extensions); in drm_connector_update_edid_property()
2052 if (connector->edid_blob_ptr) { in drm_connector_update_edid_property()
2053 old_edid = (const struct edid *)connector->edid_blob_ptr->data; in drm_connector_update_edid_property()
2057 connector->base.id, connector->name); in drm_connector_update_edid_property()
2059 connector->epoch_counter += 1; in drm_connector_update_edid_property()
2061 connector->epoch_counter); in drm_connector_update_edid_property()
2066 drm_object_property_set_value(&connector->base, in drm_connector_update_edid_property()
2067 dev->mode_config.non_desktop_property, in drm_connector_update_edid_property()
2068 connector->display_info.non_desktop); in drm_connector_update_edid_property()
2071 &connector->edid_blob_ptr, in drm_connector_update_edid_property()
2074 &connector->base, in drm_connector_update_edid_property()
2075 dev->mode_config.edid_property); in drm_connector_update_edid_property()
2083 * drm_connector_set_link_status_property - Set link status property of a connector
2085 * @link_status: new value of link status property (0: Good, 1: Bad)
2087 * In usual working scenario, this link status property will always be set to
2089 * may set this link status property to "BAD". The caller then needs to send a
2090 * hotplug uevent for userspace to re-check the valid modes through
2093 * Note: Drivers cannot rely on userspace to support this property and
2095 * re-training a link) without userspace's intervention.
2097 * The reason for adding this property is to handle link training failures, but
2099 * asynchronous setcrtc, this property can be used to report any failures in that.
2104 struct drm_device *dev = connector->dev; in drm_connector_set_link_status_property()
2106 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); in drm_connector_set_link_status_property()
2107 connector->state->link_status = link_status; in drm_connector_set_link_status_property()
2108 drm_modeset_unlock(&dev->mode_config.connection_mutex); in drm_connector_set_link_status_property()
2113 * drm_connector_attach_max_bpc_property - attach "max bpc" property
2114 * @connector: connector to attach max bpc property on.
2123 int drm_connector_attach_max_bpc_property(struct drm_connector *connector, in drm_connector_attach_max_bpc_property()
2124 int min, int max) in drm_connector_attach_max_bpc_property()
2126 struct drm_device *dev = connector->dev; in drm_connector_attach_max_bpc_property()
2129 prop = connector->max_bpc_property; in drm_connector_attach_max_bpc_property()
2133 return -ENOMEM; in drm_connector_attach_max_bpc_property()
2135 connector->max_bpc_property = prop; in drm_connector_attach_max_bpc_property()
2138 drm_object_attach_property(&connector->base, prop, max); in drm_connector_attach_max_bpc_property()
2139 connector->state->max_requested_bpc = max; in drm_connector_attach_max_bpc_property()
2140 connector->state->max_bpc = max; in drm_connector_attach_max_bpc_property()
2147 * drm_connector_set_vrr_capable_property - sets the variable refresh rate
2148 * capable property for a connector
2158 drm_object_property_set_value(&connector->base, in drm_connector_set_vrr_capable_property()
2159 connector->vrr_capable_property, in drm_connector_set_vrr_capable_property()
2165 * drm_connector_set_panel_orientation - sets the connector's panel_orientation
2166 * @connector: connector for which to set the panel-orientation property.
2170 * a "panel orientation" property to the connector.
2173 * already been set is a no-op (e.g. the orientation has been overridden with
2177 * DRM_MODE_PANEL_ORIENTATION_UNKNOWN, in which case it is a no-op.
2182 int drm_connector_set_panel_orientation( in drm_connector_set_panel_orientation()
2186 struct drm_device *dev = connector->dev; in drm_connector_set_panel_orientation()
2187 struct drm_display_info *info = &connector->display_info; in drm_connector_set_panel_orientation()
2191 if (info->panel_orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN) in drm_connector_set_panel_orientation()
2194 /* Don't attach the property if the orientation is unknown */ in drm_connector_set_panel_orientation()
2198 info->panel_orientation = panel_orientation; in drm_connector_set_panel_orientation()
2200 prop = dev->mode_config.panel_orientation_property; in drm_connector_set_panel_orientation()
2207 return -ENOMEM; in drm_connector_set_panel_orientation()
2209 dev->mode_config.panel_orientation_property = prop; in drm_connector_set_panel_orientation()
2212 drm_object_attach_property(&connector->base, prop, in drm_connector_set_panel_orientation()
2213 info->panel_orientation); in drm_connector_set_panel_orientation()
2219 * drm_connector_set_panel_orientation_with_quirk -
2221 * @connector: connector for which to init the panel-orientation property.
2232 int drm_connector_set_panel_orientation_with_quirk( in drm_connector_set_panel_orientation_with_quirk()
2235 int width, int height) in drm_connector_set_panel_orientation_with_quirk()
2237 int orientation_quirk; in drm_connector_set_panel_orientation_with_quirk()
2248 int drm_connector_set_obj_prop(struct drm_mode_object *obj, in drm_connector_set_obj_prop()
2249 struct drm_property *property, in drm_connector_set_obj_prop() argument
2252 int ret = -EINVAL; in drm_connector_set_obj_prop()
2256 if (property == connector->dev->mode_config.dpms_property) { in drm_connector_set_obj_prop()
2257 ret = (*connector->funcs->dpms)(connector, (int)value); in drm_connector_set_obj_prop()
2258 } else if (connector->funcs->set_property) in drm_connector_set_obj_prop()
2259 ret = connector->funcs->set_property(connector, property, value); in drm_connector_set_obj_prop()
2262 drm_object_property_set_value(&connector->base, property, value); in drm_connector_set_obj_prop()
2266 int drm_connector_property_set_ioctl(struct drm_device *dev, in drm_connector_property_set_ioctl()
2271 .value = conn_set_prop->value, in drm_connector_property_set_ioctl()
2272 .prop_id = conn_set_prop->prop_id, in drm_connector_property_set_ioctl()
2273 .obj_id = conn_set_prop->connector_id, in drm_connector_property_set_ioctl()
2285 if (connector->state) in drm_connector_get_encoder()
2286 return connector->state->best_encoder; in drm_connector_get_encoder()
2287 return connector->encoder; in drm_connector_get_encoder()
2296 * If user-space hasn't configured the driver to expose the stereo 3D in drm_mode_expose_to_userspace()
2299 if (!file_priv->stereo_allowed && drm_mode_is_stereo(mode)) in drm_mode_expose_to_userspace()
2302 * If user-space hasn't configured the driver to expose the modes in drm_mode_expose_to_userspace()
2303 * with aspect-ratio, don't expose them. However if such a mode in drm_mode_expose_to_userspace()
2304 * is unique, let it be exposed, but reset the aspect-ratio flags in drm_mode_expose_to_userspace()
2305 * while preparing the list of user-modes. in drm_mode_expose_to_userspace()
2307 if (!file_priv->aspect_ratio_allowed) { in drm_mode_expose_to_userspace()
2311 if (mode_itr->expose_to_userspace && in drm_mode_expose_to_userspace()
2324 int drm_mode_getconnector(struct drm_device *dev, void *data, in drm_mode_getconnector()
2331 int mode_count = 0; in drm_mode_getconnector()
2332 int encoders_count = 0; in drm_mode_getconnector()
2333 int ret = 0; in drm_mode_getconnector()
2334 int copied = 0; in drm_mode_getconnector()
2340 return -EOPNOTSUPP; in drm_mode_getconnector()
2344 connector = drm_connector_lookup(dev, file_priv, out_resp->connector_id); in drm_mode_getconnector()
2346 return -ENOENT; in drm_mode_getconnector()
2348 encoders_count = hweight32(connector->possible_encoders); in drm_mode_getconnector()
2350 if ((out_resp->count_encoders >= encoders_count) && encoders_count) { in drm_mode_getconnector()
2352 encoder_ptr = (uint32_t __user *)(unsigned long)(out_resp->encoders_ptr); in drm_mode_getconnector()
2355 if (put_user(encoder->base.id, encoder_ptr + copied)) { in drm_mode_getconnector()
2356 ret = -EFAULT; in drm_mode_getconnector()
2362 out_resp->count_encoders = encoders_count; in drm_mode_getconnector()
2364 out_resp->connector_id = connector->base.id; in drm_mode_getconnector()
2365 out_resp->connector_type = connector->connector_type; in drm_mode_getconnector()
2366 out_resp->connector_type_id = connector->connector_type_id; in drm_mode_getconnector()
2368 mutex_lock(&dev->mode_config.mutex); in drm_mode_getconnector()
2369 if (out_resp->count_modes == 0) { in drm_mode_getconnector()
2370 connector->funcs->fill_modes(connector, in drm_mode_getconnector()
2371 dev->mode_config.max_width, in drm_mode_getconnector()
2372 dev->mode_config.max_height); in drm_mode_getconnector()
2375 out_resp->mm_width = connector->display_info.width_mm; in drm_mode_getconnector()
2376 out_resp->mm_height = connector->display_info.height_mm; in drm_mode_getconnector()
2377 out_resp->subpixel = connector->display_info.subpixel_order; in drm_mode_getconnector()
2378 out_resp->connection = connector->status; in drm_mode_getconnector()
2380 /* delayed so we get modes regardless of pre-fill_modes state */ in drm_mode_getconnector()
2381 list_for_each_entry(mode, &connector->modes, head) { in drm_mode_getconnector()
2382 WARN_ON(mode->expose_to_userspace); in drm_mode_getconnector()
2384 if (drm_mode_expose_to_userspace(mode, &connector->modes, in drm_mode_getconnector()
2386 mode->expose_to_userspace = true; in drm_mode_getconnector()
2395 if ((out_resp->count_modes >= mode_count) && mode_count) { in drm_mode_getconnector()
2397 mode_ptr = (struct drm_mode_modeinfo __user *)(unsigned long)out_resp->modes_ptr; in drm_mode_getconnector()
2398 list_for_each_entry(mode, &connector->modes, head) { in drm_mode_getconnector()
2399 if (!mode->expose_to_userspace) in drm_mode_getconnector()
2403 mode->expose_to_userspace = false; in drm_mode_getconnector()
2407 * Reset aspect ratio flags of user-mode, if modes with in drm_mode_getconnector()
2408 * aspect-ratio are not supported. in drm_mode_getconnector()
2410 if (!file_priv->aspect_ratio_allowed) in drm_mode_getconnector()
2414 ret = -EFAULT; in drm_mode_getconnector()
2420 list_for_each_entry_continue(mode, &connector->modes, head) in drm_mode_getconnector()
2421 mode->expose_to_userspace = false; in drm_mode_getconnector()
2423 mutex_unlock(&dev->mode_config.mutex); in drm_mode_getconnector()
2431 list_for_each_entry(mode, &connector->modes, head) in drm_mode_getconnector()
2432 mode->expose_to_userspace = false; in drm_mode_getconnector()
2435 out_resp->count_modes = mode_count; in drm_mode_getconnector()
2436 mutex_unlock(&dev->mode_config.mutex); in drm_mode_getconnector()
2438 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); in drm_mode_getconnector()
2441 out_resp->encoder_id = encoder->base.id; in drm_mode_getconnector()
2443 out_resp->encoder_id = 0; in drm_mode_getconnector()
2447 ret = drm_mode_object_get_properties(&connector->base, file_priv->atomic, in drm_mode_getconnector()
2448 (uint32_t __user *)(unsigned long)(out_resp->props_ptr), in drm_mode_getconnector()
2449 (uint64_t __user *)(unsigned long)(out_resp->prop_values_ptr), in drm_mode_getconnector()
2450 &out_resp->count_props); in drm_mode_getconnector()
2451 drm_modeset_unlock(&dev->mode_config.connection_mutex); in drm_mode_getconnector()
2464 * identifier. Tiled monitors using DisplayID v1.3 have a unique 8-byte handle,
2466 * in a monitor group. The property is called "TILE". Drivers can manage tile
2469 * the tile group information is exposed through a non-standard way.
2475 struct drm_device *dev = tg->dev; in drm_tile_group_free()
2477 mutex_lock(&dev->mode_config.idr_mutex); in drm_tile_group_free()
2478 idr_remove(&dev->mode_config.tile_idr, tg->id); in drm_tile_group_free()
2479 mutex_unlock(&dev->mode_config.idr_mutex); in drm_tile_group_free()
2484 * drm_mode_put_tile_group - drop a reference to a tile group.
2493 kref_put(&tg->refcount, drm_tile_group_free); in drm_mode_put_tile_group()
2498 * drm_mode_get_tile_group - get a reference to an existing tile group
2500 * @topology: 8-bytes unique per monitor.
2511 int id; in drm_mode_get_tile_group()
2513 mutex_lock(&dev->mode_config.idr_mutex); in drm_mode_get_tile_group()
2514 idr_for_each_entry(&dev->mode_config.tile_idr, tg, id) { in drm_mode_get_tile_group()
2515 if (!memcmp(tg->group_data, topology, 8)) { in drm_mode_get_tile_group()
2516 if (!kref_get_unless_zero(&tg->refcount)) in drm_mode_get_tile_group()
2518 mutex_unlock(&dev->mode_config.idr_mutex); in drm_mode_get_tile_group()
2522 mutex_unlock(&dev->mode_config.idr_mutex); in drm_mode_get_tile_group()
2528 * drm_mode_create_tile_group - create a tile group from a displayid description
2530 * @topology: 8-bytes unique per monitor.
2542 int ret; in drm_mode_create_tile_group()
2548 kref_init(&tg->refcount); in drm_mode_create_tile_group()
2549 memcpy(tg->group_data, topology, 8); in drm_mode_create_tile_group()
2550 tg->dev = dev; in drm_mode_create_tile_group()
2552 mutex_lock(&dev->mode_config.idr_mutex); in drm_mode_create_tile_group()
2553 ret = idr_alloc(&dev->mode_config.tile_idr, tg, 1, 0, GFP_KERNEL); in drm_mode_create_tile_group()
2555 tg->id = ret; in drm_mode_create_tile_group()
2561 mutex_unlock(&dev->mode_config.idr_mutex); in drm_mode_create_tile_group()