cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

drm_connector.c (100018B)


      1/*
      2 * Copyright (c) 2016 Intel Corporation
      3 *
      4 * Permission to use, copy, modify, distribute, and sell this software and its
      5 * documentation for any purpose is hereby granted without fee, provided that
      6 * the above copyright notice appear in all copies and that both that copyright
      7 * notice and this permission notice appear in supporting documentation, and
      8 * that the name of the copyright holders not be used in advertising or
      9 * publicity pertaining to distribution of the software without specific,
     10 * written prior permission.  The copyright holders make no representations
     11 * about the suitability of this software for any purpose.  It is provided "as
     12 * is" without express or implied warranty.
     13 *
     14 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
     15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
     16 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
     17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
     18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
     19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
     20 * OF THIS SOFTWARE.
     21 */
     22
     23#include <drm/drm_auth.h>
     24#include <drm/drm_connector.h>
     25#include <drm/drm_edid.h>
     26#include <drm/drm_encoder.h>
     27#include <drm/drm_utils.h>
     28#include <drm/drm_print.h>
     29#include <drm/drm_drv.h>
     30#include <drm/drm_file.h>
     31#include <drm/drm_privacy_screen_consumer.h>
     32#include <drm/drm_sysfs.h>
     33
     34#include <linux/uaccess.h>
     35
     36#include "drm_crtc_internal.h"
     37#include "drm_internal.h"
     38
     39/**
     40 * DOC: overview
     41 *
     42 * In DRM connectors are the general abstraction for display sinks, and include
     43 * also fixed panels or anything else that can display pixels in some form. As
     44 * opposed to all other KMS objects representing hardware (like CRTC, encoder or
     45 * plane abstractions) connectors can be hotplugged and unplugged at runtime.
     46 * Hence they are reference-counted using drm_connector_get() and
     47 * drm_connector_put().
     48 *
     49 * KMS driver must create, initialize, register and attach at a &struct
     50 * drm_connector for each such sink. The instance is created as other KMS
     51 * objects and initialized by setting the following fields. The connector is
     52 * initialized with a call to drm_connector_init() with a pointer to the
     53 * &struct drm_connector_funcs and a connector type, and then exposed to
     54 * userspace with a call to drm_connector_register().
     55 *
     56 * Connectors must be attached to an encoder to be used. For devices that map
     57 * connectors to encoders 1:1, the connector should be attached at
     58 * initialization time with a call to drm_connector_attach_encoder(). The
     59 * driver must also set the &drm_connector.encoder field to point to the
     60 * attached encoder.
     61 *
     62 * For connectors which are not fixed (like built-in panels) the driver needs to
     63 * support hotplug notifications. The simplest way to do that is by using the
     64 * probe helpers, see drm_kms_helper_poll_init() for connectors which don't have
     65 * hardware support for hotplug interrupts. Connectors with hardware hotplug
     66 * support can instead use e.g. drm_helper_hpd_irq_event().
     67 */
     68
     69/*
     70 * Global connector list for drm_connector_find_by_fwnode().
     71 * Note drm_connector_[un]register() first take connector->lock and then
     72 * take the connector_list_lock.
     73 */
     74static DEFINE_MUTEX(connector_list_lock);
     75static LIST_HEAD(connector_list);
     76
     77struct drm_conn_prop_enum_list {
     78	int type;
     79	const char *name;
     80	struct ida ida;
     81};
     82
     83/*
     84 * Connector and encoder types.
     85 */
     86static struct drm_conn_prop_enum_list drm_connector_enum_list[] = {
     87	{ DRM_MODE_CONNECTOR_Unknown, "Unknown" },
     88	{ DRM_MODE_CONNECTOR_VGA, "VGA" },
     89	{ DRM_MODE_CONNECTOR_DVII, "DVI-I" },
     90	{ DRM_MODE_CONNECTOR_DVID, "DVI-D" },
     91	{ DRM_MODE_CONNECTOR_DVIA, "DVI-A" },
     92	{ DRM_MODE_CONNECTOR_Composite, "Composite" },
     93	{ DRM_MODE_CONNECTOR_SVIDEO, "SVIDEO" },
     94	{ DRM_MODE_CONNECTOR_LVDS, "LVDS" },
     95	{ DRM_MODE_CONNECTOR_Component, "Component" },
     96	{ DRM_MODE_CONNECTOR_9PinDIN, "DIN" },
     97	{ DRM_MODE_CONNECTOR_DisplayPort, "DP" },
     98	{ DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" },
     99	{ DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" },
    100	{ DRM_MODE_CONNECTOR_TV, "TV" },
    101	{ DRM_MODE_CONNECTOR_eDP, "eDP" },
    102	{ DRM_MODE_CONNECTOR_VIRTUAL, "Virtual" },
    103	{ DRM_MODE_CONNECTOR_DSI, "DSI" },
    104	{ DRM_MODE_CONNECTOR_DPI, "DPI" },
    105	{ DRM_MODE_CONNECTOR_WRITEBACK, "Writeback" },
    106	{ DRM_MODE_CONNECTOR_SPI, "SPI" },
    107	{ DRM_MODE_CONNECTOR_USB, "USB" },
    108};
    109
    110void drm_connector_ida_init(void)
    111{
    112	int i;
    113
    114	for (i = 0; i < ARRAY_SIZE(drm_connector_enum_list); i++)
    115		ida_init(&drm_connector_enum_list[i].ida);
    116}
    117
    118void drm_connector_ida_destroy(void)
    119{
    120	int i;
    121
    122	for (i = 0; i < ARRAY_SIZE(drm_connector_enum_list); i++)
    123		ida_destroy(&drm_connector_enum_list[i].ida);
    124}
    125
    126/**
    127 * drm_get_connector_type_name - return a string for connector type
    128 * @type: The connector type (DRM_MODE_CONNECTOR_*)
    129 *
    130 * Returns: the name of the connector type, or NULL if the type is not valid.
    131 */
    132const char *drm_get_connector_type_name(unsigned int type)
    133{
    134	if (type < ARRAY_SIZE(drm_connector_enum_list))
    135		return drm_connector_enum_list[type].name;
    136
    137	return NULL;
    138}
    139EXPORT_SYMBOL(drm_get_connector_type_name);
    140
    141/**
    142 * drm_connector_get_cmdline_mode - reads the user's cmdline mode
    143 * @connector: connector to query
    144 *
    145 * The kernel supports per-connector configuration of its consoles through
    146 * use of the video= parameter. This function parses that option and
    147 * extracts the user's specified mode (or enable/disable status) for a
    148 * particular connector. This is typically only used during the early fbdev
    149 * setup.
    150 */
    151static void drm_connector_get_cmdline_mode(struct drm_connector *connector)
    152{
    153	struct drm_cmdline_mode *mode = &connector->cmdline_mode;
    154	char *option = NULL;
    155
    156	if (fb_get_options(connector->name, &option))
    157		return;
    158
    159	if (!drm_mode_parse_command_line_for_connector(option,
    160						       connector,
    161						       mode))
    162		return;
    163
    164	if (mode->force) {
    165		DRM_INFO("forcing %s connector %s\n", connector->name,
    166			 drm_get_connector_force_name(mode->force));
    167		connector->force = mode->force;
    168	}
    169
    170	if (mode->panel_orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN) {
    171		DRM_INFO("cmdline forces connector %s panel_orientation to %d\n",
    172			 connector->name, mode->panel_orientation);
    173		drm_connector_set_panel_orientation(connector,
    174						    mode->panel_orientation);
    175	}
    176
    177	DRM_DEBUG_KMS("cmdline mode for connector %s %s %dx%d@%dHz%s%s%s\n",
    178		      connector->name, mode->name,
    179		      mode->xres, mode->yres,
    180		      mode->refresh_specified ? mode->refresh : 60,
    181		      mode->rb ? " reduced blanking" : "",
    182		      mode->margins ? " with margins" : "",
    183		      mode->interlace ?  " interlaced" : "");
    184}
    185
    186static void drm_connector_free(struct kref *kref)
    187{
    188	struct drm_connector *connector =
    189		container_of(kref, struct drm_connector, base.refcount);
    190	struct drm_device *dev = connector->dev;
    191
    192	drm_mode_object_unregister(dev, &connector->base);
    193	connector->funcs->destroy(connector);
    194}
    195
    196void drm_connector_free_work_fn(struct work_struct *work)
    197{
    198	struct drm_connector *connector, *n;
    199	struct drm_device *dev =
    200		container_of(work, struct drm_device, mode_config.connector_free_work);
    201	struct drm_mode_config *config = &dev->mode_config;
    202	unsigned long flags;
    203	struct llist_node *freed;
    204
    205	spin_lock_irqsave(&config->connector_list_lock, flags);
    206	freed = llist_del_all(&config->connector_free_list);
    207	spin_unlock_irqrestore(&config->connector_list_lock, flags);
    208
    209	llist_for_each_entry_safe(connector, n, freed, free_node) {
    210		drm_mode_object_unregister(dev, &connector->base);
    211		connector->funcs->destroy(connector);
    212	}
    213}
    214
    215/**
    216 * drm_connector_init - Init a preallocated connector
    217 * @dev: DRM device
    218 * @connector: the connector to init
    219 * @funcs: callbacks for this connector
    220 * @connector_type: user visible type of the connector
    221 *
    222 * Initialises a preallocated connector. Connectors should be
    223 * subclassed as part of driver connector objects.
    224 *
    225 * Returns:
    226 * Zero on success, error code on failure.
    227 */
    228int drm_connector_init(struct drm_device *dev,
    229		       struct drm_connector *connector,
    230		       const struct drm_connector_funcs *funcs,
    231		       int connector_type)
    232{
    233	struct drm_mode_config *config = &dev->mode_config;
    234	int ret;
    235	struct ida *connector_ida =
    236		&drm_connector_enum_list[connector_type].ida;
    237
    238	WARN_ON(drm_drv_uses_atomic_modeset(dev) &&
    239		(!funcs->atomic_destroy_state ||
    240		 !funcs->atomic_duplicate_state));
    241
    242	ret = __drm_mode_object_add(dev, &connector->base,
    243				    DRM_MODE_OBJECT_CONNECTOR,
    244				    false, drm_connector_free);
    245	if (ret)
    246		return ret;
    247
    248	connector->base.properties = &connector->properties;
    249	connector->dev = dev;
    250	connector->funcs = funcs;
    251
    252	/* connector index is used with 32bit bitmasks */
    253	ret = ida_simple_get(&config->connector_ida, 0, 32, GFP_KERNEL);
    254	if (ret < 0) {
    255		DRM_DEBUG_KMS("Failed to allocate %s connector index: %d\n",
    256			      drm_connector_enum_list[connector_type].name,
    257			      ret);
    258		goto out_put;
    259	}
    260	connector->index = ret;
    261	ret = 0;
    262
    263	connector->connector_type = connector_type;
    264	connector->connector_type_id =
    265		ida_simple_get(connector_ida, 1, 0, GFP_KERNEL);
    266	if (connector->connector_type_id < 0) {
    267		ret = connector->connector_type_id;
    268		goto out_put_id;
    269	}
    270	connector->name =
    271		kasprintf(GFP_KERNEL, "%s-%d",
    272			  drm_connector_enum_list[connector_type].name,
    273			  connector->connector_type_id);
    274	if (!connector->name) {
    275		ret = -ENOMEM;
    276		goto out_put_type_id;
    277	}
    278
    279	INIT_LIST_HEAD(&connector->global_connector_list_entry);
    280	INIT_LIST_HEAD(&connector->probed_modes);
    281	INIT_LIST_HEAD(&connector->modes);
    282	mutex_init(&connector->mutex);
    283	connector->edid_blob_ptr = NULL;
    284	connector->epoch_counter = 0;
    285	connector->tile_blob_ptr = NULL;
    286	connector->status = connector_status_unknown;
    287	connector->display_info.panel_orientation =
    288		DRM_MODE_PANEL_ORIENTATION_UNKNOWN;
    289
    290	drm_connector_get_cmdline_mode(connector);
    291
    292	/* We should add connectors at the end to avoid upsetting the connector
    293	 * index too much.
    294	 */
    295	spin_lock_irq(&config->connector_list_lock);
    296	list_add_tail(&connector->head, &config->connector_list);
    297	config->num_connector++;
    298	spin_unlock_irq(&config->connector_list_lock);
    299
    300	if (connector_type != DRM_MODE_CONNECTOR_VIRTUAL &&
    301	    connector_type != DRM_MODE_CONNECTOR_WRITEBACK)
    302		drm_connector_attach_edid_property(connector);
    303
    304	drm_object_attach_property(&connector->base,
    305				      config->dpms_property, 0);
    306
    307	drm_object_attach_property(&connector->base,
    308				   config->link_status_property,
    309				   0);
    310
    311	drm_object_attach_property(&connector->base,
    312				   config->non_desktop_property,
    313				   0);
    314	drm_object_attach_property(&connector->base,
    315				   config->tile_property,
    316				   0);
    317
    318	if (drm_core_check_feature(dev, DRIVER_ATOMIC)) {
    319		drm_object_attach_property(&connector->base, config->prop_crtc_id, 0);
    320	}
    321
    322	connector->debugfs_entry = NULL;
    323out_put_type_id:
    324	if (ret)
    325		ida_simple_remove(connector_ida, connector->connector_type_id);
    326out_put_id:
    327	if (ret)
    328		ida_simple_remove(&config->connector_ida, connector->index);
    329out_put:
    330	if (ret)
    331		drm_mode_object_unregister(dev, &connector->base);
    332
    333	return ret;
    334}
    335EXPORT_SYMBOL(drm_connector_init);
    336
    337/**
    338 * drm_connector_init_with_ddc - Init a preallocated connector
    339 * @dev: DRM device
    340 * @connector: the connector to init
    341 * @funcs: callbacks for this connector
    342 * @connector_type: user visible type of the connector
    343 * @ddc: pointer to the associated ddc adapter
    344 *
    345 * Initialises a preallocated connector. Connectors should be
    346 * subclassed as part of driver connector objects.
    347 *
    348 * Ensures that the ddc field of the connector is correctly set.
    349 *
    350 * Returns:
    351 * Zero on success, error code on failure.
    352 */
    353int drm_connector_init_with_ddc(struct drm_device *dev,
    354				struct drm_connector *connector,
    355				const struct drm_connector_funcs *funcs,
    356				int connector_type,
    357				struct i2c_adapter *ddc)
    358{
    359	int ret;
    360
    361	ret = drm_connector_init(dev, connector, funcs, connector_type);
    362	if (ret)
    363		return ret;
    364
    365	/* provide ddc symlink in sysfs */
    366	connector->ddc = ddc;
    367
    368	return ret;
    369}
    370EXPORT_SYMBOL(drm_connector_init_with_ddc);
    371
    372/**
    373 * drm_connector_attach_edid_property - attach edid property.
    374 * @connector: the connector
    375 *
    376 * Some connector types like DRM_MODE_CONNECTOR_VIRTUAL do not get a
    377 * edid property attached by default.  This function can be used to
    378 * explicitly enable the edid property in these cases.
    379 */
    380void drm_connector_attach_edid_property(struct drm_connector *connector)
    381{
    382	struct drm_mode_config *config = &connector->dev->mode_config;
    383
    384	drm_object_attach_property(&connector->base,
    385				   config->edid_property,
    386				   0);
    387}
    388EXPORT_SYMBOL(drm_connector_attach_edid_property);
    389
    390/**
    391 * drm_connector_attach_encoder - attach a connector to an encoder
    392 * @connector: connector to attach
    393 * @encoder: encoder to attach @connector to
    394 *
    395 * This function links up a connector to an encoder. Note that the routing
    396 * restrictions between encoders and crtcs are exposed to userspace through the
    397 * possible_clones and possible_crtcs bitmasks.
    398 *
    399 * Returns:
    400 * Zero on success, negative errno on failure.
    401 */
    402int drm_connector_attach_encoder(struct drm_connector *connector,
    403				 struct drm_encoder *encoder)
    404{
    405	/*
    406	 * In the past, drivers have attempted to model the static association
    407	 * of connector to encoder in simple connector/encoder devices using a
    408	 * direct assignment of connector->encoder = encoder. This connection
    409	 * is a logical one and the responsibility of the core, so drivers are
    410	 * expected not to mess with this.
    411	 *
    412	 * Note that the error return should've been enough here, but a large
    413	 * majority of drivers ignores the return value, so add in a big WARN
    414	 * to get people's attention.
    415	 */
    416	if (WARN_ON(connector->encoder))
    417		return -EINVAL;
    418
    419	connector->possible_encoders |= drm_encoder_mask(encoder);
    420
    421	return 0;
    422}
    423EXPORT_SYMBOL(drm_connector_attach_encoder);
    424
    425/**
    426 * drm_connector_has_possible_encoder - check if the connector and encoder are
    427 * associated with each other
    428 * @connector: the connector
    429 * @encoder: the encoder
    430 *
    431 * Returns:
    432 * True if @encoder is one of the possible encoders for @connector.
    433 */
    434bool drm_connector_has_possible_encoder(struct drm_connector *connector,
    435					struct drm_encoder *encoder)
    436{
    437	return connector->possible_encoders & drm_encoder_mask(encoder);
    438}
    439EXPORT_SYMBOL(drm_connector_has_possible_encoder);
    440
    441static void drm_mode_remove(struct drm_connector *connector,
    442			    struct drm_display_mode *mode)
    443{
    444	list_del(&mode->head);
    445	drm_mode_destroy(connector->dev, mode);
    446}
    447
    448/**
    449 * drm_connector_cleanup - cleans up an initialised connector
    450 * @connector: connector to cleanup
    451 *
    452 * Cleans up the connector but doesn't free the object.
    453 */
    454void drm_connector_cleanup(struct drm_connector *connector)
    455{
    456	struct drm_device *dev = connector->dev;
    457	struct drm_display_mode *mode, *t;
    458
    459	/* The connector should have been removed from userspace long before
    460	 * it is finally destroyed.
    461	 */
    462	if (WARN_ON(connector->registration_state ==
    463		    DRM_CONNECTOR_REGISTERED))
    464		drm_connector_unregister(connector);
    465
    466	if (connector->privacy_screen) {
    467		drm_privacy_screen_put(connector->privacy_screen);
    468		connector->privacy_screen = NULL;
    469	}
    470
    471	if (connector->tile_group) {
    472		drm_mode_put_tile_group(dev, connector->tile_group);
    473		connector->tile_group = NULL;
    474	}
    475
    476	list_for_each_entry_safe(mode, t, &connector->probed_modes, head)
    477		drm_mode_remove(connector, mode);
    478
    479	list_for_each_entry_safe(mode, t, &connector->modes, head)
    480		drm_mode_remove(connector, mode);
    481
    482	ida_simple_remove(&drm_connector_enum_list[connector->connector_type].ida,
    483			  connector->connector_type_id);
    484
    485	ida_simple_remove(&dev->mode_config.connector_ida,
    486			  connector->index);
    487
    488	kfree(connector->display_info.bus_formats);
    489	drm_mode_object_unregister(dev, &connector->base);
    490	kfree(connector->name);
    491	connector->name = NULL;
    492	fwnode_handle_put(connector->fwnode);
    493	connector->fwnode = NULL;
    494	spin_lock_irq(&dev->mode_config.connector_list_lock);
    495	list_del(&connector->head);
    496	dev->mode_config.num_connector--;
    497	spin_unlock_irq(&dev->mode_config.connector_list_lock);
    498
    499	WARN_ON(connector->state && !connector->funcs->atomic_destroy_state);
    500	if (connector->state && connector->funcs->atomic_destroy_state)
    501		connector->funcs->atomic_destroy_state(connector,
    502						       connector->state);
    503
    504	mutex_destroy(&connector->mutex);
    505
    506	memset(connector, 0, sizeof(*connector));
    507}
    508EXPORT_SYMBOL(drm_connector_cleanup);
    509
    510/**
    511 * drm_connector_register - register a connector
    512 * @connector: the connector to register
    513 *
    514 * Register userspace interfaces for a connector. Only call this for connectors
    515 * which can be hotplugged after drm_dev_register() has been called already,
    516 * e.g. DP MST connectors. All other connectors will be registered automatically
    517 * when calling drm_dev_register().
    518 *
    519 * Returns:
    520 * Zero on success, error code on failure.
    521 */
    522int drm_connector_register(struct drm_connector *connector)
    523{
    524	int ret = 0;
    525
    526	if (!connector->dev->registered)
    527		return 0;
    528
    529	mutex_lock(&connector->mutex);
    530	if (connector->registration_state != DRM_CONNECTOR_INITIALIZING)
    531		goto unlock;
    532
    533	ret = drm_sysfs_connector_add(connector);
    534	if (ret)
    535		goto unlock;
    536
    537	drm_debugfs_connector_add(connector);
    538
    539	if (connector->funcs->late_register) {
    540		ret = connector->funcs->late_register(connector);
    541		if (ret)
    542			goto err_debugfs;
    543	}
    544
    545	drm_mode_object_register(connector->dev, &connector->base);
    546
    547	connector->registration_state = DRM_CONNECTOR_REGISTERED;
    548
    549	/* Let userspace know we have a new connector */
    550	drm_sysfs_connector_hotplug_event(connector);
    551
    552	if (connector->privacy_screen)
    553		drm_privacy_screen_register_notifier(connector->privacy_screen,
    554					   &connector->privacy_screen_notifier);
    555
    556	mutex_lock(&connector_list_lock);
    557	list_add_tail(&connector->global_connector_list_entry, &connector_list);
    558	mutex_unlock(&connector_list_lock);
    559	goto unlock;
    560
    561err_debugfs:
    562	drm_debugfs_connector_remove(connector);
    563	drm_sysfs_connector_remove(connector);
    564unlock:
    565	mutex_unlock(&connector->mutex);
    566	return ret;
    567}
    568EXPORT_SYMBOL(drm_connector_register);
    569
    570/**
    571 * drm_connector_unregister - unregister a connector
    572 * @connector: the connector to unregister
    573 *
    574 * Unregister userspace interfaces for a connector. Only call this for
    575 * connectors which have registered explicitly by calling drm_dev_register(),
    576 * since connectors are unregistered automatically when drm_dev_unregister() is
    577 * called.
    578 */
    579void drm_connector_unregister(struct drm_connector *connector)
    580{
    581	mutex_lock(&connector->mutex);
    582	if (connector->registration_state != DRM_CONNECTOR_REGISTERED) {
    583		mutex_unlock(&connector->mutex);
    584		return;
    585	}
    586
    587	mutex_lock(&connector_list_lock);
    588	list_del_init(&connector->global_connector_list_entry);
    589	mutex_unlock(&connector_list_lock);
    590
    591	if (connector->privacy_screen)
    592		drm_privacy_screen_unregister_notifier(
    593					connector->privacy_screen,
    594					&connector->privacy_screen_notifier);
    595
    596	if (connector->funcs->early_unregister)
    597		connector->funcs->early_unregister(connector);
    598
    599	drm_sysfs_connector_remove(connector);
    600	drm_debugfs_connector_remove(connector);
    601
    602	connector->registration_state = DRM_CONNECTOR_UNREGISTERED;
    603	mutex_unlock(&connector->mutex);
    604}
    605EXPORT_SYMBOL(drm_connector_unregister);
    606
    607void drm_connector_unregister_all(struct drm_device *dev)
    608{
    609	struct drm_connector *connector;
    610	struct drm_connector_list_iter conn_iter;
    611
    612	drm_connector_list_iter_begin(dev, &conn_iter);
    613	drm_for_each_connector_iter(connector, &conn_iter)
    614		drm_connector_unregister(connector);
    615	drm_connector_list_iter_end(&conn_iter);
    616}
    617
    618int drm_connector_register_all(struct drm_device *dev)
    619{
    620	struct drm_connector *connector;
    621	struct drm_connector_list_iter conn_iter;
    622	int ret = 0;
    623
    624	drm_connector_list_iter_begin(dev, &conn_iter);
    625	drm_for_each_connector_iter(connector, &conn_iter) {
    626		ret = drm_connector_register(connector);
    627		if (ret)
    628			break;
    629	}
    630	drm_connector_list_iter_end(&conn_iter);
    631
    632	if (ret)
    633		drm_connector_unregister_all(dev);
    634	return ret;
    635}
    636
    637/**
    638 * drm_get_connector_status_name - return a string for connector status
    639 * @status: connector status to compute name of
    640 *
    641 * In contrast to the other drm_get_*_name functions this one here returns a
    642 * const pointer and hence is threadsafe.
    643 *
    644 * Returns: connector status string
    645 */
    646const char *drm_get_connector_status_name(enum drm_connector_status status)
    647{
    648	if (status == connector_status_connected)
    649		return "connected";
    650	else if (status == connector_status_disconnected)
    651		return "disconnected";
    652	else
    653		return "unknown";
    654}
    655EXPORT_SYMBOL(drm_get_connector_status_name);
    656
    657/**
    658 * drm_get_connector_force_name - return a string for connector force
    659 * @force: connector force to get name of
    660 *
    661 * Returns: const pointer to name.
    662 */
    663const char *drm_get_connector_force_name(enum drm_connector_force force)
    664{
    665	switch (force) {
    666	case DRM_FORCE_UNSPECIFIED:
    667		return "unspecified";
    668	case DRM_FORCE_OFF:
    669		return "off";
    670	case DRM_FORCE_ON:
    671		return "on";
    672	case DRM_FORCE_ON_DIGITAL:
    673		return "digital";
    674	default:
    675		return "unknown";
    676	}
    677}
    678
    679#ifdef CONFIG_LOCKDEP
    680static struct lockdep_map connector_list_iter_dep_map = {
    681	.name = "drm_connector_list_iter"
    682};
    683#endif
    684
    685/**
    686 * drm_connector_list_iter_begin - initialize a connector_list iterator
    687 * @dev: DRM device
    688 * @iter: connector_list iterator
    689 *
    690 * Sets @iter up to walk the &drm_mode_config.connector_list of @dev. @iter
    691 * must always be cleaned up again by calling drm_connector_list_iter_end().
    692 * Iteration itself happens using drm_connector_list_iter_next() or
    693 * drm_for_each_connector_iter().
    694 */
    695void drm_connector_list_iter_begin(struct drm_device *dev,
    696				   struct drm_connector_list_iter *iter)
    697{
    698	iter->dev = dev;
    699	iter->conn = NULL;
    700	lock_acquire_shared_recursive(&connector_list_iter_dep_map, 0, 1, NULL, _RET_IP_);
    701}
    702EXPORT_SYMBOL(drm_connector_list_iter_begin);
    703
    704/*
    705 * Extra-safe connector put function that works in any context. Should only be
    706 * used from the connector_iter functions, where we never really expect to
    707 * actually release the connector when dropping our final reference.
    708 */
    709static void
    710__drm_connector_put_safe(struct drm_connector *conn)
    711{
    712	struct drm_mode_config *config = &conn->dev->mode_config;
    713
    714	lockdep_assert_held(&config->connector_list_lock);
    715
    716	if (!refcount_dec_and_test(&conn->base.refcount.refcount))
    717		return;
    718
    719	llist_add(&conn->free_node, &config->connector_free_list);
    720	schedule_work(&config->connector_free_work);
    721}
    722
    723/**
    724 * drm_connector_list_iter_next - return next connector
    725 * @iter: connector_list iterator
    726 *
    727 * Returns: the next connector for @iter, or NULL when the list walk has
    728 * completed.
    729 */
    730struct drm_connector *
    731drm_connector_list_iter_next(struct drm_connector_list_iter *iter)
    732{
    733	struct drm_connector *old_conn = iter->conn;
    734	struct drm_mode_config *config = &iter->dev->mode_config;
    735	struct list_head *lhead;
    736	unsigned long flags;
    737
    738	spin_lock_irqsave(&config->connector_list_lock, flags);
    739	lhead = old_conn ? &old_conn->head : &config->connector_list;
    740
    741	do {
    742		if (lhead->next == &config->connector_list) {
    743			iter->conn = NULL;
    744			break;
    745		}
    746
    747		lhead = lhead->next;
    748		iter->conn = list_entry(lhead, struct drm_connector, head);
    749
    750		/* loop until it's not a zombie connector */
    751	} while (!kref_get_unless_zero(&iter->conn->base.refcount));
    752
    753	if (old_conn)
    754		__drm_connector_put_safe(old_conn);
    755	spin_unlock_irqrestore(&config->connector_list_lock, flags);
    756
    757	return iter->conn;
    758}
    759EXPORT_SYMBOL(drm_connector_list_iter_next);
    760
    761/**
    762 * drm_connector_list_iter_end - tear down a connector_list iterator
    763 * @iter: connector_list iterator
    764 *
    765 * Tears down @iter and releases any resources (like &drm_connector references)
    766 * acquired while walking the list. This must always be called, both when the
    767 * iteration completes fully or when it was aborted without walking the entire
    768 * list.
    769 */
    770void drm_connector_list_iter_end(struct drm_connector_list_iter *iter)
    771{
    772	struct drm_mode_config *config = &iter->dev->mode_config;
    773	unsigned long flags;
    774
    775	iter->dev = NULL;
    776	if (iter->conn) {
    777		spin_lock_irqsave(&config->connector_list_lock, flags);
    778		__drm_connector_put_safe(iter->conn);
    779		spin_unlock_irqrestore(&config->connector_list_lock, flags);
    780	}
    781	lock_release(&connector_list_iter_dep_map, _RET_IP_);
    782}
    783EXPORT_SYMBOL(drm_connector_list_iter_end);
    784
    785static const struct drm_prop_enum_list drm_subpixel_enum_list[] = {
    786	{ SubPixelUnknown, "Unknown" },
    787	{ SubPixelHorizontalRGB, "Horizontal RGB" },
    788	{ SubPixelHorizontalBGR, "Horizontal BGR" },
    789	{ SubPixelVerticalRGB, "Vertical RGB" },
    790	{ SubPixelVerticalBGR, "Vertical BGR" },
    791	{ SubPixelNone, "None" },
    792};
    793
    794/**
    795 * drm_get_subpixel_order_name - return a string for a given subpixel enum
    796 * @order: enum of subpixel_order
    797 *
    798 * Note you could abuse this and return something out of bounds, but that
    799 * would be a caller error.  No unscrubbed user data should make it here.
    800 *
    801 * Returns: string describing an enumerated subpixel property
    802 */
    803const char *drm_get_subpixel_order_name(enum subpixel_order order)
    804{
    805	return drm_subpixel_enum_list[order].name;
    806}
    807EXPORT_SYMBOL(drm_get_subpixel_order_name);
    808
    809static const struct drm_prop_enum_list drm_dpms_enum_list[] = {
    810	{ DRM_MODE_DPMS_ON, "On" },
    811	{ DRM_MODE_DPMS_STANDBY, "Standby" },
    812	{ DRM_MODE_DPMS_SUSPEND, "Suspend" },
    813	{ DRM_MODE_DPMS_OFF, "Off" }
    814};
    815DRM_ENUM_NAME_FN(drm_get_dpms_name, drm_dpms_enum_list)
    816
    817static const struct drm_prop_enum_list drm_link_status_enum_list[] = {
    818	{ DRM_MODE_LINK_STATUS_GOOD, "Good" },
    819	{ DRM_MODE_LINK_STATUS_BAD, "Bad" },
    820};
    821
    822/**
    823 * drm_display_info_set_bus_formats - set the supported bus formats
    824 * @info: display info to store bus formats in
    825 * @formats: array containing the supported bus formats
    826 * @num_formats: the number of entries in the fmts array
    827 *
    828 * Store the supported bus formats in display info structure.
    829 * See MEDIA_BUS_FMT_* definitions in include/uapi/linux/media-bus-format.h for
    830 * a full list of available formats.
    831 *
    832 * Returns:
    833 * 0 on success or a negative error code on failure.
    834 */
    835int drm_display_info_set_bus_formats(struct drm_display_info *info,
    836				     const u32 *formats,
    837				     unsigned int num_formats)
    838{
    839	u32 *fmts = NULL;
    840
    841	if (!formats && num_formats)
    842		return -EINVAL;
    843
    844	if (formats && num_formats) {
    845		fmts = kmemdup(formats, sizeof(*formats) * num_formats,
    846			       GFP_KERNEL);
    847		if (!fmts)
    848			return -ENOMEM;
    849	}
    850
    851	kfree(info->bus_formats);
    852	info->bus_formats = fmts;
    853	info->num_bus_formats = num_formats;
    854
    855	return 0;
    856}
    857EXPORT_SYMBOL(drm_display_info_set_bus_formats);
    858
    859/* Optional connector properties. */
    860static const struct drm_prop_enum_list drm_scaling_mode_enum_list[] = {
    861	{ DRM_MODE_SCALE_NONE, "None" },
    862	{ DRM_MODE_SCALE_FULLSCREEN, "Full" },
    863	{ DRM_MODE_SCALE_CENTER, "Center" },
    864	{ DRM_MODE_SCALE_ASPECT, "Full aspect" },
    865};
    866
    867static const struct drm_prop_enum_list drm_aspect_ratio_enum_list[] = {
    868	{ DRM_MODE_PICTURE_ASPECT_NONE, "Automatic" },
    869	{ DRM_MODE_PICTURE_ASPECT_4_3, "4:3" },
    870	{ DRM_MODE_PICTURE_ASPECT_16_9, "16:9" },
    871};
    872
    873static const struct drm_prop_enum_list drm_content_type_enum_list[] = {
    874	{ DRM_MODE_CONTENT_TYPE_NO_DATA, "No Data" },
    875	{ DRM_MODE_CONTENT_TYPE_GRAPHICS, "Graphics" },
    876	{ DRM_MODE_CONTENT_TYPE_PHOTO, "Photo" },
    877	{ DRM_MODE_CONTENT_TYPE_CINEMA, "Cinema" },
    878	{ DRM_MODE_CONTENT_TYPE_GAME, "Game" },
    879};
    880
    881static const struct drm_prop_enum_list drm_panel_orientation_enum_list[] = {
    882	{ DRM_MODE_PANEL_ORIENTATION_NORMAL,	"Normal"	},
    883	{ DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP,	"Upside Down"	},
    884	{ DRM_MODE_PANEL_ORIENTATION_LEFT_UP,	"Left Side Up"	},
    885	{ DRM_MODE_PANEL_ORIENTATION_RIGHT_UP,	"Right Side Up"	},
    886};
    887
    888static const struct drm_prop_enum_list drm_dvi_i_select_enum_list[] = {
    889	{ DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I and TV-out */
    890	{ DRM_MODE_SUBCONNECTOR_DVID,      "DVI-D"     }, /* DVI-I  */
    891	{ DRM_MODE_SUBCONNECTOR_DVIA,      "DVI-A"     }, /* DVI-I  */
    892};
    893DRM_ENUM_NAME_FN(drm_get_dvi_i_select_name, drm_dvi_i_select_enum_list)
    894
    895static const struct drm_prop_enum_list drm_dvi_i_subconnector_enum_list[] = {
    896	{ DRM_MODE_SUBCONNECTOR_Unknown,   "Unknown"   }, /* DVI-I, TV-out and DP */
    897	{ DRM_MODE_SUBCONNECTOR_DVID,      "DVI-D"     }, /* DVI-I  */
    898	{ DRM_MODE_SUBCONNECTOR_DVIA,      "DVI-A"     }, /* DVI-I  */
    899};
    900DRM_ENUM_NAME_FN(drm_get_dvi_i_subconnector_name,
    901		 drm_dvi_i_subconnector_enum_list)
    902
    903static const struct drm_prop_enum_list drm_tv_select_enum_list[] = {
    904	{ DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I and TV-out */
    905	{ DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */
    906	{ DRM_MODE_SUBCONNECTOR_SVIDEO,    "SVIDEO"    }, /* TV-out */
    907	{ DRM_MODE_SUBCONNECTOR_Component, "Component" }, /* TV-out */
    908	{ DRM_MODE_SUBCONNECTOR_SCART,     "SCART"     }, /* TV-out */
    909};
    910DRM_ENUM_NAME_FN(drm_get_tv_select_name, drm_tv_select_enum_list)
    911
    912static const struct drm_prop_enum_list drm_tv_subconnector_enum_list[] = {
    913	{ DRM_MODE_SUBCONNECTOR_Unknown,   "Unknown"   }, /* DVI-I, TV-out and DP */
    914	{ DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */
    915	{ DRM_MODE_SUBCONNECTOR_SVIDEO,    "SVIDEO"    }, /* TV-out */
    916	{ DRM_MODE_SUBCONNECTOR_Component, "Component" }, /* TV-out */
    917	{ DRM_MODE_SUBCONNECTOR_SCART,     "SCART"     }, /* TV-out */
    918};
    919DRM_ENUM_NAME_FN(drm_get_tv_subconnector_name,
    920		 drm_tv_subconnector_enum_list)
    921
    922static const struct drm_prop_enum_list drm_dp_subconnector_enum_list[] = {
    923	{ DRM_MODE_SUBCONNECTOR_Unknown,     "Unknown"   }, /* DVI-I, TV-out and DP */
    924	{ DRM_MODE_SUBCONNECTOR_VGA,	     "VGA"       }, /* DP */
    925	{ DRM_MODE_SUBCONNECTOR_DVID,	     "DVI-D"     }, /* DP */
    926	{ DRM_MODE_SUBCONNECTOR_HDMIA,	     "HDMI"      }, /* DP */
    927	{ DRM_MODE_SUBCONNECTOR_DisplayPort, "DP"        }, /* DP */
    928	{ DRM_MODE_SUBCONNECTOR_Wireless,    "Wireless"  }, /* DP */
    929	{ DRM_MODE_SUBCONNECTOR_Native,	     "Native"    }, /* DP */
    930};
    931
    932DRM_ENUM_NAME_FN(drm_get_dp_subconnector_name,
    933		 drm_dp_subconnector_enum_list)
    934
    935static const struct drm_prop_enum_list hdmi_colorspaces[] = {
    936	/* For Default case, driver will set the colorspace */
    937	{ DRM_MODE_COLORIMETRY_DEFAULT, "Default" },
    938	/* Standard Definition Colorimetry based on CEA 861 */
    939	{ DRM_MODE_COLORIMETRY_SMPTE_170M_YCC, "SMPTE_170M_YCC" },
    940	{ DRM_MODE_COLORIMETRY_BT709_YCC, "BT709_YCC" },
    941	/* Standard Definition Colorimetry based on IEC 61966-2-4 */
    942	{ DRM_MODE_COLORIMETRY_XVYCC_601, "XVYCC_601" },
    943	/* High Definition Colorimetry based on IEC 61966-2-4 */
    944	{ DRM_MODE_COLORIMETRY_XVYCC_709, "XVYCC_709" },
    945	/* Colorimetry based on IEC 61966-2-1/Amendment 1 */
    946	{ DRM_MODE_COLORIMETRY_SYCC_601, "SYCC_601" },
    947	/* Colorimetry based on IEC 61966-2-5 [33] */
    948	{ DRM_MODE_COLORIMETRY_OPYCC_601, "opYCC_601" },
    949	/* Colorimetry based on IEC 61966-2-5 */
    950	{ DRM_MODE_COLORIMETRY_OPRGB, "opRGB" },
    951	/* Colorimetry based on ITU-R BT.2020 */
    952	{ DRM_MODE_COLORIMETRY_BT2020_CYCC, "BT2020_CYCC" },
    953	/* Colorimetry based on ITU-R BT.2020 */
    954	{ DRM_MODE_COLORIMETRY_BT2020_RGB, "BT2020_RGB" },
    955	/* Colorimetry based on ITU-R BT.2020 */
    956	{ DRM_MODE_COLORIMETRY_BT2020_YCC, "BT2020_YCC" },
    957	/* Added as part of Additional Colorimetry Extension in 861.G */
    958	{ DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65, "DCI-P3_RGB_D65" },
    959	{ DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER, "DCI-P3_RGB_Theater" },
    960};
    961
    962/*
    963 * As per DP 1.4a spec, 2.2.5.7.5 VSC SDP Payload for Pixel Encoding/Colorimetry
    964 * Format Table 2-120
    965 */
    966static const struct drm_prop_enum_list dp_colorspaces[] = {
    967	/* For Default case, driver will set the colorspace */
    968	{ DRM_MODE_COLORIMETRY_DEFAULT, "Default" },
    969	{ DRM_MODE_COLORIMETRY_RGB_WIDE_FIXED, "RGB_Wide_Gamut_Fixed_Point" },
    970	/* Colorimetry based on scRGB (IEC 61966-2-2) */
    971	{ DRM_MODE_COLORIMETRY_RGB_WIDE_FLOAT, "RGB_Wide_Gamut_Floating_Point" },
    972	/* Colorimetry based on IEC 61966-2-5 */
    973	{ DRM_MODE_COLORIMETRY_OPRGB, "opRGB" },
    974	/* Colorimetry based on SMPTE RP 431-2 */
    975	{ DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65, "DCI-P3_RGB_D65" },
    976	/* Colorimetry based on ITU-R BT.2020 */
    977	{ DRM_MODE_COLORIMETRY_BT2020_RGB, "BT2020_RGB" },
    978	{ DRM_MODE_COLORIMETRY_BT601_YCC, "BT601_YCC" },
    979	{ DRM_MODE_COLORIMETRY_BT709_YCC, "BT709_YCC" },
    980	/* Standard Definition Colorimetry based on IEC 61966-2-4 */
    981	{ DRM_MODE_COLORIMETRY_XVYCC_601, "XVYCC_601" },
    982	/* High Definition Colorimetry based on IEC 61966-2-4 */
    983	{ DRM_MODE_COLORIMETRY_XVYCC_709, "XVYCC_709" },
    984	/* Colorimetry based on IEC 61966-2-1/Amendment 1 */
    985	{ DRM_MODE_COLORIMETRY_SYCC_601, "SYCC_601" },
    986	/* Colorimetry based on IEC 61966-2-5 [33] */
    987	{ DRM_MODE_COLORIMETRY_OPYCC_601, "opYCC_601" },
    988	/* Colorimetry based on ITU-R BT.2020 */
    989	{ DRM_MODE_COLORIMETRY_BT2020_CYCC, "BT2020_CYCC" },
    990	/* Colorimetry based on ITU-R BT.2020 */
    991	{ DRM_MODE_COLORIMETRY_BT2020_YCC, "BT2020_YCC" },
    992};
    993
    994/**
    995 * DOC: standard connector properties
    996 *
    997 * DRM connectors have a few standardized properties:
    998 *
    999 * EDID:
   1000 * 	Blob property which contains the current EDID read from the sink. This
   1001 * 	is useful to parse sink identification information like vendor, model
   1002 * 	and serial. Drivers should update this property by calling
   1003 * 	drm_connector_update_edid_property(), usually after having parsed
   1004 * 	the EDID using drm_add_edid_modes(). Userspace cannot change this
   1005 * 	property.
   1006 *
   1007 * 	User-space should not parse the EDID to obtain information exposed via
   1008 * 	other KMS properties (because the kernel might apply limits, quirks or
   1009 * 	fixups to the EDID). For instance, user-space should not try to parse
   1010 * 	mode lists from the EDID.
   1011 * DPMS:
   1012 * 	Legacy property for setting the power state of the connector. For atomic
   1013 * 	drivers this is only provided for backwards compatibility with existing
   1014 * 	drivers, it remaps to controlling the "ACTIVE" property on the CRTC the
   1015 * 	connector is linked to. Drivers should never set this property directly,
   1016 * 	it is handled by the DRM core by calling the &drm_connector_funcs.dpms
   1017 * 	callback. For atomic drivers the remapping to the "ACTIVE" property is
   1018 * 	implemented in the DRM core.
   1019 *
   1020 * 	Note that this property cannot be set through the MODE_ATOMIC ioctl,
   1021 * 	userspace must use "ACTIVE" on the CRTC instead.
   1022 *
   1023 * 	WARNING:
   1024 *
   1025 * 	For userspace also running on legacy drivers the "DPMS" semantics are a
   1026 * 	lot more complicated. First, userspace cannot rely on the "DPMS" value
   1027 * 	returned by the GETCONNECTOR actually reflecting reality, because many
   1028 * 	drivers fail to update it. For atomic drivers this is taken care of in
   1029 * 	drm_atomic_helper_update_legacy_modeset_state().
   1030 *
   1031 * 	The second issue is that the DPMS state is only well-defined when the
   1032 * 	connector is connected to a CRTC. In atomic the DRM core enforces that
   1033 * 	"ACTIVE" is off in such a case, no such checks exists for "DPMS".
   1034 *
   1035 * 	Finally, when enabling an output using the legacy SETCONFIG ioctl then
   1036 * 	"DPMS" is forced to ON. But see above, that might not be reflected in
   1037 * 	the software value on legacy drivers.
   1038 *
   1039 * 	Summarizing: Only set "DPMS" when the connector is known to be enabled,
   1040 * 	assume that a successful SETCONFIG call also sets "DPMS" to on, and
   1041 * 	never read back the value of "DPMS" because it can be incorrect.
   1042 * PATH:
   1043 * 	Connector path property to identify how this sink is physically
   1044 * 	connected. Used by DP MST. This should be set by calling
   1045 * 	drm_connector_set_path_property(), in the case of DP MST with the
   1046 * 	path property the MST manager created. Userspace cannot change this
   1047 * 	property.
   1048 * TILE:
   1049 * 	Connector tile group property to indicate how a set of DRM connector
   1050 * 	compose together into one logical screen. This is used by both high-res
   1051 * 	external screens (often only using a single cable, but exposing multiple
   1052 * 	DP MST sinks), or high-res integrated panels (like dual-link DSI) which
   1053 * 	are not gen-locked. Note that for tiled panels which are genlocked, like
   1054 * 	dual-link LVDS or dual-link DSI, the driver should try to not expose the
   1055 * 	tiling and virtualise both &drm_crtc and &drm_plane if needed. Drivers
   1056 * 	should update this value using drm_connector_set_tile_property().
   1057 * 	Userspace cannot change this property.
   1058 * link-status:
   1059 *      Connector link-status property to indicate the status of link. The
   1060 *      default value of link-status is "GOOD". If something fails during or
   1061 *      after modeset, the kernel driver may set this to "BAD" and issue a
   1062 *      hotplug uevent. Drivers should update this value using
   1063 *      drm_connector_set_link_status_property().
   1064 *
   1065 *      When user-space receives the hotplug uevent and detects a "BAD"
   1066 *      link-status, the sink doesn't receive pixels anymore (e.g. the screen
   1067 *      becomes completely black). The list of available modes may have
   1068 *      changed. User-space is expected to pick a new mode if the current one
   1069 *      has disappeared and perform a new modeset with link-status set to
   1070 *      "GOOD" to re-enable the connector.
   1071 *
   1072 *      If multiple connectors share the same CRTC and one of them gets a "BAD"
   1073 *      link-status, the other are unaffected (ie. the sinks still continue to
   1074 *      receive pixels).
   1075 *
   1076 *      When user-space performs an atomic commit on a connector with a "BAD"
   1077 *      link-status without resetting the property to "GOOD", the sink may
   1078 *      still not receive pixels. When user-space performs an atomic commit
   1079 *      which resets the link-status property to "GOOD" without the
   1080 *      ALLOW_MODESET flag set, it might fail because a modeset is required.
   1081 *
   1082 *      User-space can only change link-status to "GOOD", changing it to "BAD"
   1083 *      is a no-op.
   1084 *
   1085 *      For backwards compatibility with non-atomic userspace the kernel
   1086 *      tries to automatically set the link-status back to "GOOD" in the
   1087 *      SETCRTC IOCTL. This might fail if the mode is no longer valid, similar
   1088 *      to how it might fail if a different screen has been connected in the
   1089 *      interim.
   1090 * non_desktop:
   1091 * 	Indicates the output should be ignored for purposes of displaying a
   1092 * 	standard desktop environment or console. This is most likely because
   1093 * 	the output device is not rectilinear.
   1094 * Content Protection:
   1095 *	This property is used by userspace to request the kernel protect future
   1096 *	content communicated over the link. When requested, kernel will apply
   1097 *	the appropriate means of protection (most often HDCP), and use the
   1098 *	property to tell userspace the protection is active.
   1099 *
   1100 *	Drivers can set this up by calling
   1101 *	drm_connector_attach_content_protection_property() on initialization.
   1102 *
   1103 *	The value of this property can be one of the following:
   1104 *
   1105 *	DRM_MODE_CONTENT_PROTECTION_UNDESIRED = 0
   1106 *		The link is not protected, content is transmitted in the clear.
   1107 *	DRM_MODE_CONTENT_PROTECTION_DESIRED = 1
   1108 *		Userspace has requested content protection, but the link is not
   1109 *		currently protected. When in this state, kernel should enable
   1110 *		Content Protection as soon as possible.
   1111 *	DRM_MODE_CONTENT_PROTECTION_ENABLED = 2
   1112 *		Userspace has requested content protection, and the link is
   1113 *		protected. Only the driver can set the property to this value.
   1114 *		If userspace attempts to set to ENABLED, kernel will return
   1115 *		-EINVAL.
   1116 *
   1117 *	A few guidelines:
   1118 *
   1119 *	- DESIRED state should be preserved until userspace de-asserts it by
   1120 *	  setting the property to UNDESIRED. This means ENABLED should only
   1121 *	  transition to UNDESIRED when the user explicitly requests it.
   1122 *	- If the state is DESIRED, kernel should attempt to re-authenticate the
   1123 *	  link whenever possible. This includes across disable/enable, dpms,
   1124 *	  hotplug, downstream device changes, link status failures, etc..
   1125 *	- Kernel sends uevent with the connector id and property id through
   1126 *	  @drm_hdcp_update_content_protection, upon below kernel triggered
   1127 *	  scenarios:
   1128 *
   1129 *		- DESIRED -> ENABLED (authentication success)
   1130 *		- ENABLED -> DESIRED (termination of authentication)
   1131 *	- Please note no uevents for userspace triggered property state changes,
   1132 *	  which can't fail such as
   1133 *
   1134 *		- DESIRED/ENABLED -> UNDESIRED
   1135 *		- UNDESIRED -> DESIRED
   1136 *	- Userspace is responsible for polling the property or listen to uevents
   1137 *	  to determine when the value transitions from ENABLED to DESIRED.
   1138 *	  This signifies the link is no longer protected and userspace should
   1139 *	  take appropriate action (whatever that might be).
   1140 *
   1141 * HDCP Content Type:
   1142 *	This Enum property is used by the userspace to declare the content type
   1143 *	of the display stream, to kernel. Here display stream stands for any
   1144 *	display content that userspace intended to display through HDCP
   1145 *	encryption.
   1146 *
   1147 *	Content Type of a stream is decided by the owner of the stream, as
   1148 *	"HDCP Type0" or "HDCP Type1".
   1149 *
   1150 *	The value of the property can be one of the below:
   1151 *	  - "HDCP Type0": DRM_MODE_HDCP_CONTENT_TYPE0 = 0
   1152 *	  - "HDCP Type1": DRM_MODE_HDCP_CONTENT_TYPE1 = 1
   1153 *
   1154 *	When kernel starts the HDCP authentication (see "Content Protection"
   1155 *	for details), it uses the content type in "HDCP Content Type"
   1156 *	for performing the HDCP authentication with the display sink.
   1157 *
   1158 *	Please note in HDCP spec versions, a link can be authenticated with
   1159 *	HDCP 2.2 for Content Type 0/Content Type 1. Where as a link can be
   1160 *	authenticated with HDCP1.4 only for Content Type 0(though it is implicit
   1161 *	in nature. As there is no reference for Content Type in HDCP1.4).
   1162 *
   1163 *	HDCP2.2 authentication protocol itself takes the "Content Type" as a
   1164 *	parameter, which is a input for the DP HDCP2.2 encryption algo.
   1165 *
   1166 *	In case of Type 0 content protection request, kernel driver can choose
   1167 *	either of HDCP spec versions 1.4 and 2.2. When HDCP2.2 is used for
   1168 *	"HDCP Type 0", a HDCP 2.2 capable repeater in the downstream can send
   1169 *	that content to a HDCP 1.4 authenticated HDCP sink (Type0 link).
   1170 *	But if the content is classified as "HDCP Type 1", above mentioned
   1171 *	HDCP 2.2 repeater wont send the content to the HDCP sink as it can't
   1172 *	authenticate the HDCP1.4 capable sink for "HDCP Type 1".
   1173 *
   1174 *	Please note userspace can be ignorant of the HDCP versions used by the
   1175 *	kernel driver to achieve the "HDCP Content Type".
   1176 *
   1177 *	At current scenario, classifying a content as Type 1 ensures that the
   1178 *	content will be displayed only through the HDCP2.2 encrypted link.
   1179 *
   1180 *	Note that the HDCP Content Type property is introduced at HDCP 2.2, and
   1181 *	defaults to type 0. It is only exposed by drivers supporting HDCP 2.2
   1182 *	(hence supporting Type 0 and Type 1). Based on how next versions of
   1183 *	HDCP specs are defined content Type could be used for higher versions
   1184 *	too.
   1185 *
   1186 *	If content type is changed when "Content Protection" is not UNDESIRED,
   1187 *	then kernel will disable the HDCP and re-enable with new type in the
   1188 *	same atomic commit. And when "Content Protection" is ENABLED, it means
   1189 *	that link is HDCP authenticated and encrypted, for the transmission of
   1190 *	the Type of stream mentioned at "HDCP Content Type".
   1191 *
   1192 * HDR_OUTPUT_METADATA:
   1193 *	Connector property to enable userspace to send HDR Metadata to
   1194 *	driver. This metadata is based on the composition and blending
   1195 *	policies decided by user, taking into account the hardware and
   1196 *	sink capabilities. The driver gets this metadata and creates a
   1197 *	Dynamic Range and Mastering Infoframe (DRM) in case of HDMI,
   1198 *	SDP packet (Non-audio INFOFRAME SDP v1.3) for DP. This is then
   1199 *	sent to sink. This notifies the sink of the upcoming frame's Color
   1200 *	Encoding and Luminance parameters.
   1201 *
   1202 *	Userspace first need to detect the HDR capabilities of sink by
   1203 *	reading and parsing the EDID. Details of HDR metadata for HDMI
   1204 *	are added in CTA 861.G spec. For DP , its defined in VESA DP
   1205 *	Standard v1.4. It needs to then get the metadata information
   1206 *	of the video/game/app content which are encoded in HDR (basically
   1207 *	using HDR transfer functions). With this information it needs to
   1208 *	decide on a blending policy and compose the relevant
   1209 *	layers/overlays into a common format. Once this blending is done,
   1210 *	userspace will be aware of the metadata of the composed frame to
   1211 *	be send to sink. It then uses this property to communicate this
   1212 *	metadata to driver which then make a Infoframe packet and sends
   1213 *	to sink based on the type of encoder connected.
   1214 *
   1215 *	Userspace will be responsible to do Tone mapping operation in case:
   1216 *		- Some layers are HDR and others are SDR
   1217 *		- HDR layers luminance is not same as sink
   1218 *
   1219 *	It will even need to do colorspace conversion and get all layers
   1220 *	to one common colorspace for blending. It can use either GL, Media
   1221 *	or display engine to get this done based on the capabilities of the
   1222 *	associated hardware.
   1223 *
   1224 *	Driver expects metadata to be put in &struct hdr_output_metadata
   1225 *	structure from userspace. This is received as blob and stored in
   1226 *	&drm_connector_state.hdr_output_metadata. It parses EDID and saves the
   1227 *	sink metadata in &struct hdr_sink_metadata, as
   1228 *	&drm_connector.hdr_sink_metadata.  Driver uses
   1229 *	drm_hdmi_infoframe_set_hdr_metadata() helper to set the HDR metadata,
   1230 *	hdmi_drm_infoframe_pack() to pack the infoframe as per spec, in case of
   1231 *	HDMI encoder.
   1232 *
   1233 * max bpc:
   1234 *	This range property is used by userspace to limit the bit depth. When
   1235 *	used the driver would limit the bpc in accordance with the valid range
   1236 *	supported by the hardware and sink. Drivers to use the function
   1237 *	drm_connector_attach_max_bpc_property() to create and attach the
   1238 *	property to the connector during initialization.
   1239 *
   1240 * Connectors also have one standardized atomic property:
   1241 *
   1242 * CRTC_ID:
   1243 * 	Mode object ID of the &drm_crtc this connector should be connected to.
   1244 *
   1245 * Connectors for LCD panels may also have one standardized property:
   1246 *
   1247 * panel orientation:
   1248 *	On some devices the LCD panel is mounted in the casing in such a way
   1249 *	that the up/top side of the panel does not match with the top side of
   1250 *	the device. Userspace can use this property to check for this.
   1251 *	Note that input coordinates from touchscreens (input devices with
   1252 *	INPUT_PROP_DIRECT) will still map 1:1 to the actual LCD panel
   1253 *	coordinates, so if userspace rotates the picture to adjust for
   1254 *	the orientation it must also apply the same transformation to the
   1255 *	touchscreen input coordinates. This property is initialized by calling
   1256 *	drm_connector_set_panel_orientation() or
   1257 *	drm_connector_set_panel_orientation_with_quirk()
   1258 *
   1259 * scaling mode:
   1260 *	This property defines how a non-native mode is upscaled to the native
   1261 *	mode of an LCD panel:
   1262 *
   1263 *	None:
   1264 *		No upscaling happens, scaling is left to the panel. Not all
   1265 *		drivers expose this mode.
   1266 *	Full:
   1267 *		The output is upscaled to the full resolution of the panel,
   1268 *		ignoring the aspect ratio.
   1269 *	Center:
   1270 *		No upscaling happens, the output is centered within the native
   1271 *		resolution the panel.
   1272 *	Full aspect:
   1273 *		The output is upscaled to maximize either the width or height
   1274 *		while retaining the aspect ratio.
   1275 *
   1276 *	This property should be set up by calling
   1277 *	drm_connector_attach_scaling_mode_property(). Note that drivers
   1278 *	can also expose this property to external outputs, in which case they
   1279 *	must support "None", which should be the default (since external screens
   1280 *	have a built-in scaler).
   1281 *
   1282 * subconnector:
   1283 *	This property is used by DVI-I, TVout and DisplayPort to indicate different
   1284 *	connector subtypes. Enum values more or less match with those from main
   1285 *	connector types.
   1286 *	For DVI-I and TVout there is also a matching property "select subconnector"
   1287 *	allowing to switch between signal types.
   1288 *	DP subconnector corresponds to a downstream port.
   1289 *
   1290 * privacy-screen sw-state, privacy-screen hw-state:
   1291 *	These 2 optional properties can be used to query the state of the
   1292 *	electronic privacy screen that is available on some displays; and in
   1293 *	some cases also control the state. If a driver implements these
   1294 *	properties then both properties must be present.
   1295 *
   1296 *	"privacy-screen hw-state" is read-only and reflects the actual state
   1297 *	of the privacy-screen, possible values: "Enabled", "Disabled,
   1298 *	"Enabled-locked", "Disabled-locked". The locked states indicate
   1299 *	that the state cannot be changed through the DRM API. E.g. there
   1300 *	might be devices where the firmware-setup options, or a hardware
   1301 *	slider-switch, offer always on / off modes.
   1302 *
   1303 *	"privacy-screen sw-state" can be set to change the privacy-screen state
   1304 *	when not locked. In this case the driver must update the hw-state
   1305 *	property to reflect the new state on completion of the commit of the
   1306 *	sw-state property. Setting the sw-state property when the hw-state is
   1307 *	locked must be interpreted by the driver as a request to change the
   1308 *	state to the set state when the hw-state becomes unlocked. E.g. if
   1309 *	"privacy-screen hw-state" is "Enabled-locked" and the sw-state
   1310 *	gets set to "Disabled" followed by the user unlocking the state by
   1311 *	changing the slider-switch position, then the driver must set the
   1312 *	state to "Disabled" upon receiving the unlock event.
   1313 *
   1314 *	In some cases the privacy-screen's actual state might change outside of
   1315 *	control of the DRM code. E.g. there might be a firmware handled hotkey
   1316 *	which toggles the actual state, or the actual state might be changed
   1317 *	through another userspace API such as writing /proc/acpi/ibm/lcdshadow.
   1318 *	In this case the driver must update both the hw-state and the sw-state
   1319 *	to reflect the new value, overwriting any pending state requests in the
   1320 *	sw-state. Any pending sw-state requests are thus discarded.
   1321 *
   1322 *	Note that the ability for the state to change outside of control of
   1323 *	the DRM master process means that userspace must not cache the value
   1324 *	of the sw-state. Caching the sw-state value and including it in later
   1325 *	atomic commits may lead to overriding a state change done through e.g.
   1326 *	a firmware handled hotkey. Therefor userspace must not include the
   1327 *	privacy-screen sw-state in an atomic commit unless it wants to change
   1328 *	its value.
   1329 */
   1330
   1331int drm_connector_create_standard_properties(struct drm_device *dev)
   1332{
   1333	struct drm_property *prop;
   1334
   1335	prop = drm_property_create(dev, DRM_MODE_PROP_BLOB |
   1336				   DRM_MODE_PROP_IMMUTABLE,
   1337				   "EDID", 0);
   1338	if (!prop)
   1339		return -ENOMEM;
   1340	dev->mode_config.edid_property = prop;
   1341
   1342	prop = drm_property_create_enum(dev, 0,
   1343				   "DPMS", drm_dpms_enum_list,
   1344				   ARRAY_SIZE(drm_dpms_enum_list));
   1345	if (!prop)
   1346		return -ENOMEM;
   1347	dev->mode_config.dpms_property = prop;
   1348
   1349	prop = drm_property_create(dev,
   1350				   DRM_MODE_PROP_BLOB |
   1351				   DRM_MODE_PROP_IMMUTABLE,
   1352				   "PATH", 0);
   1353	if (!prop)
   1354		return -ENOMEM;
   1355	dev->mode_config.path_property = prop;
   1356
   1357	prop = drm_property_create(dev,
   1358				   DRM_MODE_PROP_BLOB |
   1359				   DRM_MODE_PROP_IMMUTABLE,
   1360				   "TILE", 0);
   1361	if (!prop)
   1362		return -ENOMEM;
   1363	dev->mode_config.tile_property = prop;
   1364
   1365	prop = drm_property_create_enum(dev, 0, "link-status",
   1366					drm_link_status_enum_list,
   1367					ARRAY_SIZE(drm_link_status_enum_list));
   1368	if (!prop)
   1369		return -ENOMEM;
   1370	dev->mode_config.link_status_property = prop;
   1371
   1372	prop = drm_property_create_bool(dev, DRM_MODE_PROP_IMMUTABLE, "non-desktop");
   1373	if (!prop)
   1374		return -ENOMEM;
   1375	dev->mode_config.non_desktop_property = prop;
   1376
   1377	prop = drm_property_create(dev, DRM_MODE_PROP_BLOB,
   1378				   "HDR_OUTPUT_METADATA", 0);
   1379	if (!prop)
   1380		return -ENOMEM;
   1381	dev->mode_config.hdr_output_metadata_property = prop;
   1382
   1383	return 0;
   1384}
   1385
   1386/**
   1387 * drm_mode_create_dvi_i_properties - create DVI-I specific connector properties
   1388 * @dev: DRM device
   1389 *
   1390 * Called by a driver the first time a DVI-I connector is made.
   1391 *
   1392 * Returns: %0
   1393 */
   1394int drm_mode_create_dvi_i_properties(struct drm_device *dev)
   1395{
   1396	struct drm_property *dvi_i_selector;
   1397	struct drm_property *dvi_i_subconnector;
   1398
   1399	if (dev->mode_config.dvi_i_select_subconnector_property)
   1400		return 0;
   1401
   1402	dvi_i_selector =
   1403		drm_property_create_enum(dev, 0,
   1404				    "select subconnector",
   1405				    drm_dvi_i_select_enum_list,
   1406				    ARRAY_SIZE(drm_dvi_i_select_enum_list));
   1407	dev->mode_config.dvi_i_select_subconnector_property = dvi_i_selector;
   1408
   1409	dvi_i_subconnector = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
   1410				    "subconnector",
   1411				    drm_dvi_i_subconnector_enum_list,
   1412				    ARRAY_SIZE(drm_dvi_i_subconnector_enum_list));
   1413	dev->mode_config.dvi_i_subconnector_property = dvi_i_subconnector;
   1414
   1415	return 0;
   1416}
   1417EXPORT_SYMBOL(drm_mode_create_dvi_i_properties);
   1418
   1419/**
   1420 * drm_connector_attach_dp_subconnector_property - create subconnector property for DP
   1421 * @connector: drm_connector to attach property
   1422 *
   1423 * Called by a driver when DP connector is created.
   1424 */
   1425void drm_connector_attach_dp_subconnector_property(struct drm_connector *connector)
   1426{
   1427	struct drm_mode_config *mode_config = &connector->dev->mode_config;
   1428
   1429	if (!mode_config->dp_subconnector_property)
   1430		mode_config->dp_subconnector_property =
   1431			drm_property_create_enum(connector->dev,
   1432				DRM_MODE_PROP_IMMUTABLE,
   1433				"subconnector",
   1434				drm_dp_subconnector_enum_list,
   1435				ARRAY_SIZE(drm_dp_subconnector_enum_list));
   1436
   1437	drm_object_attach_property(&connector->base,
   1438				   mode_config->dp_subconnector_property,
   1439				   DRM_MODE_SUBCONNECTOR_Unknown);
   1440}
   1441EXPORT_SYMBOL(drm_connector_attach_dp_subconnector_property);
   1442
   1443/**
   1444 * DOC: HDMI connector properties
   1445 *
   1446 * content type (HDMI specific):
   1447 *	Indicates content type setting to be used in HDMI infoframes to indicate
   1448 *	content type for the external device, so that it adjusts its display
   1449 *	settings accordingly.
   1450 *
   1451 *	The value of this property can be one of the following:
   1452 *
   1453 *	No Data:
   1454 *		Content type is unknown
   1455 *	Graphics:
   1456 *		Content type is graphics
   1457 *	Photo:
   1458 *		Content type is photo
   1459 *	Cinema:
   1460 *		Content type is cinema
   1461 *	Game:
   1462 *		Content type is game
   1463 *
   1464 *	The meaning of each content type is defined in CTA-861-G table 15.
   1465 *
   1466 *	Drivers can set up this property by calling
   1467 *	drm_connector_attach_content_type_property(). Decoding to
   1468 *	infoframe values is done through drm_hdmi_avi_infoframe_content_type().
   1469 */
   1470
   1471/**
   1472 * drm_connector_attach_content_type_property - attach content-type property
   1473 * @connector: connector to attach content type property on.
   1474 *
   1475 * Called by a driver the first time a HDMI connector is made.
   1476 *
   1477 * Returns: %0
   1478 */
   1479int drm_connector_attach_content_type_property(struct drm_connector *connector)
   1480{
   1481	if (!drm_mode_create_content_type_property(connector->dev))
   1482		drm_object_attach_property(&connector->base,
   1483					   connector->dev->mode_config.content_type_property,
   1484					   DRM_MODE_CONTENT_TYPE_NO_DATA);
   1485	return 0;
   1486}
   1487EXPORT_SYMBOL(drm_connector_attach_content_type_property);
   1488
   1489/**
   1490 * drm_connector_attach_tv_margin_properties - attach TV connector margin
   1491 * 	properties
   1492 * @connector: DRM connector
   1493 *
   1494 * Called by a driver when it needs to attach TV margin props to a connector.
   1495 * Typically used on SDTV and HDMI connectors.
   1496 */
   1497void drm_connector_attach_tv_margin_properties(struct drm_connector *connector)
   1498{
   1499	struct drm_device *dev = connector->dev;
   1500
   1501	drm_object_attach_property(&connector->base,
   1502				   dev->mode_config.tv_left_margin_property,
   1503				   0);
   1504	drm_object_attach_property(&connector->base,
   1505				   dev->mode_config.tv_right_margin_property,
   1506				   0);
   1507	drm_object_attach_property(&connector->base,
   1508				   dev->mode_config.tv_top_margin_property,
   1509				   0);
   1510	drm_object_attach_property(&connector->base,
   1511				   dev->mode_config.tv_bottom_margin_property,
   1512				   0);
   1513}
   1514EXPORT_SYMBOL(drm_connector_attach_tv_margin_properties);
   1515
   1516/**
   1517 * drm_mode_create_tv_margin_properties - create TV connector margin properties
   1518 * @dev: DRM device
   1519 *
   1520 * Called by a driver's HDMI connector initialization routine, this function
   1521 * creates the TV margin properties for a given device. No need to call this
   1522 * function for an SDTV connector, it's already called from
   1523 * drm_mode_create_tv_properties().
   1524 *
   1525 * Returns:
   1526 * 0 on success or a negative error code on failure.
   1527 */
   1528int drm_mode_create_tv_margin_properties(struct drm_device *dev)
   1529{
   1530	if (dev->mode_config.tv_left_margin_property)
   1531		return 0;
   1532
   1533	dev->mode_config.tv_left_margin_property =
   1534		drm_property_create_range(dev, 0, "left margin", 0, 100);
   1535	if (!dev->mode_config.tv_left_margin_property)
   1536		return -ENOMEM;
   1537
   1538	dev->mode_config.tv_right_margin_property =
   1539		drm_property_create_range(dev, 0, "right margin", 0, 100);
   1540	if (!dev->mode_config.tv_right_margin_property)
   1541		return -ENOMEM;
   1542
   1543	dev->mode_config.tv_top_margin_property =
   1544		drm_property_create_range(dev, 0, "top margin", 0, 100);
   1545	if (!dev->mode_config.tv_top_margin_property)
   1546		return -ENOMEM;
   1547
   1548	dev->mode_config.tv_bottom_margin_property =
   1549		drm_property_create_range(dev, 0, "bottom margin", 0, 100);
   1550	if (!dev->mode_config.tv_bottom_margin_property)
   1551		return -ENOMEM;
   1552
   1553	return 0;
   1554}
   1555EXPORT_SYMBOL(drm_mode_create_tv_margin_properties);
   1556
   1557/**
   1558 * drm_mode_create_tv_properties - create TV specific connector properties
   1559 * @dev: DRM device
   1560 * @num_modes: number of different TV formats (modes) supported
   1561 * @modes: array of pointers to strings containing name of each format
   1562 *
   1563 * Called by a driver's TV initialization routine, this function creates
   1564 * the TV specific connector properties for a given device.  Caller is
   1565 * responsible for allocating a list of format names and passing them to
   1566 * this routine.
   1567 *
   1568 * Returns:
   1569 * 0 on success or a negative error code on failure.
   1570 */
   1571int drm_mode_create_tv_properties(struct drm_device *dev,
   1572				  unsigned int num_modes,
   1573				  const char * const modes[])
   1574{
   1575	struct drm_property *tv_selector;
   1576	struct drm_property *tv_subconnector;
   1577	unsigned int i;
   1578
   1579	if (dev->mode_config.tv_select_subconnector_property)
   1580		return 0;
   1581
   1582	/*
   1583	 * Basic connector properties
   1584	 */
   1585	tv_selector = drm_property_create_enum(dev, 0,
   1586					  "select subconnector",
   1587					  drm_tv_select_enum_list,
   1588					  ARRAY_SIZE(drm_tv_select_enum_list));
   1589	if (!tv_selector)
   1590		goto nomem;
   1591
   1592	dev->mode_config.tv_select_subconnector_property = tv_selector;
   1593
   1594	tv_subconnector =
   1595		drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
   1596				    "subconnector",
   1597				    drm_tv_subconnector_enum_list,
   1598				    ARRAY_SIZE(drm_tv_subconnector_enum_list));
   1599	if (!tv_subconnector)
   1600		goto nomem;
   1601	dev->mode_config.tv_subconnector_property = tv_subconnector;
   1602
   1603	/*
   1604	 * Other, TV specific properties: margins & TV modes.
   1605	 */
   1606	if (drm_mode_create_tv_margin_properties(dev))
   1607		goto nomem;
   1608
   1609	dev->mode_config.tv_mode_property =
   1610		drm_property_create(dev, DRM_MODE_PROP_ENUM,
   1611				    "mode", num_modes);
   1612	if (!dev->mode_config.tv_mode_property)
   1613		goto nomem;
   1614
   1615	for (i = 0; i < num_modes; i++)
   1616		drm_property_add_enum(dev->mode_config.tv_mode_property,
   1617				      i, modes[i]);
   1618
   1619	dev->mode_config.tv_brightness_property =
   1620		drm_property_create_range(dev, 0, "brightness", 0, 100);
   1621	if (!dev->mode_config.tv_brightness_property)
   1622		goto nomem;
   1623
   1624	dev->mode_config.tv_contrast_property =
   1625		drm_property_create_range(dev, 0, "contrast", 0, 100);
   1626	if (!dev->mode_config.tv_contrast_property)
   1627		goto nomem;
   1628
   1629	dev->mode_config.tv_flicker_reduction_property =
   1630		drm_property_create_range(dev, 0, "flicker reduction", 0, 100);
   1631	if (!dev->mode_config.tv_flicker_reduction_property)
   1632		goto nomem;
   1633
   1634	dev->mode_config.tv_overscan_property =
   1635		drm_property_create_range(dev, 0, "overscan", 0, 100);
   1636	if (!dev->mode_config.tv_overscan_property)
   1637		goto nomem;
   1638
   1639	dev->mode_config.tv_saturation_property =
   1640		drm_property_create_range(dev, 0, "saturation", 0, 100);
   1641	if (!dev->mode_config.tv_saturation_property)
   1642		goto nomem;
   1643
   1644	dev->mode_config.tv_hue_property =
   1645		drm_property_create_range(dev, 0, "hue", 0, 100);
   1646	if (!dev->mode_config.tv_hue_property)
   1647		goto nomem;
   1648
   1649	return 0;
   1650nomem:
   1651	return -ENOMEM;
   1652}
   1653EXPORT_SYMBOL(drm_mode_create_tv_properties);
   1654
   1655/**
   1656 * drm_mode_create_scaling_mode_property - create scaling mode property
   1657 * @dev: DRM device
   1658 *
   1659 * Called by a driver the first time it's needed, must be attached to desired
   1660 * connectors.
   1661 *
   1662 * Atomic drivers should use drm_connector_attach_scaling_mode_property()
   1663 * instead to correctly assign &drm_connector_state.scaling_mode
   1664 * in the atomic state.
   1665 *
   1666 * Returns: %0
   1667 */
   1668int drm_mode_create_scaling_mode_property(struct drm_device *dev)
   1669{
   1670	struct drm_property *scaling_mode;
   1671
   1672	if (dev->mode_config.scaling_mode_property)
   1673		return 0;
   1674
   1675	scaling_mode =
   1676		drm_property_create_enum(dev, 0, "scaling mode",
   1677				drm_scaling_mode_enum_list,
   1678				    ARRAY_SIZE(drm_scaling_mode_enum_list));
   1679
   1680	dev->mode_config.scaling_mode_property = scaling_mode;
   1681
   1682	return 0;
   1683}
   1684EXPORT_SYMBOL(drm_mode_create_scaling_mode_property);
   1685
   1686/**
   1687 * DOC: Variable refresh properties
   1688 *
   1689 * Variable refresh rate capable displays can dynamically adjust their
   1690 * refresh rate by extending the duration of their vertical front porch
   1691 * until page flip or timeout occurs. This can reduce or remove stuttering
   1692 * and latency in scenarios where the page flip does not align with the
   1693 * vblank interval.
   1694 *
   1695 * An example scenario would be an application flipping at a constant rate
   1696 * of 48Hz on a 60Hz display. The page flip will frequently miss the vblank
   1697 * interval and the same contents will be displayed twice. This can be
   1698 * observed as stuttering for content with motion.
   1699 *
   1700 * If variable refresh rate was active on a display that supported a
   1701 * variable refresh range from 35Hz to 60Hz no stuttering would be observable
   1702 * for the example scenario. The minimum supported variable refresh rate of
   1703 * 35Hz is below the page flip frequency and the vertical front porch can
   1704 * be extended until the page flip occurs. The vblank interval will be
   1705 * directly aligned to the page flip rate.
   1706 *
   1707 * Not all userspace content is suitable for use with variable refresh rate.
   1708 * Large and frequent changes in vertical front porch duration may worsen
   1709 * perceived stuttering for input sensitive applications.
   1710 *
   1711 * Panel brightness will also vary with vertical front porch duration. Some
   1712 * panels may have noticeable differences in brightness between the minimum
   1713 * vertical front porch duration and the maximum vertical front porch duration.
   1714 * Large and frequent changes in vertical front porch duration may produce
   1715 * observable flickering for such panels.
   1716 *
   1717 * Userspace control for variable refresh rate is supported via properties
   1718 * on the &drm_connector and &drm_crtc objects.
   1719 *
   1720 * "vrr_capable":
   1721 *	Optional &drm_connector boolean property that drivers should attach
   1722 *	with drm_connector_attach_vrr_capable_property() on connectors that
   1723 *	could support variable refresh rates. Drivers should update the
   1724 *	property value by calling drm_connector_set_vrr_capable_property().
   1725 *
   1726 *	Absence of the property should indicate absence of support.
   1727 *
   1728 * "VRR_ENABLED":
   1729 *	Default &drm_crtc boolean property that notifies the driver that the
   1730 *	content on the CRTC is suitable for variable refresh rate presentation.
   1731 *	The driver will take this property as a hint to enable variable
   1732 *	refresh rate support if the receiver supports it, ie. if the
   1733 *	"vrr_capable" property is true on the &drm_connector object. The
   1734 *	vertical front porch duration will be extended until page-flip or
   1735 *	timeout when enabled.
   1736 *
   1737 *	The minimum vertical front porch duration is defined as the vertical
   1738 *	front porch duration for the current mode.
   1739 *
   1740 *	The maximum vertical front porch duration is greater than or equal to
   1741 *	the minimum vertical front porch duration. The duration is derived
   1742 *	from the minimum supported variable refresh rate for the connector.
   1743 *
   1744 *	The driver may place further restrictions within these minimum
   1745 *	and maximum bounds.
   1746 */
   1747
   1748/**
   1749 * drm_connector_attach_vrr_capable_property - creates the
   1750 * vrr_capable property
   1751 * @connector: connector to create the vrr_capable property on.
   1752 *
   1753 * This is used by atomic drivers to add support for querying
   1754 * variable refresh rate capability for a connector.
   1755 *
   1756 * Returns:
   1757 * Zero on success, negative errno on failure.
   1758 */
   1759int drm_connector_attach_vrr_capable_property(
   1760	struct drm_connector *connector)
   1761{
   1762	struct drm_device *dev = connector->dev;
   1763	struct drm_property *prop;
   1764
   1765	if (!connector->vrr_capable_property) {
   1766		prop = drm_property_create_bool(dev, DRM_MODE_PROP_IMMUTABLE,
   1767			"vrr_capable");
   1768		if (!prop)
   1769			return -ENOMEM;
   1770
   1771		connector->vrr_capable_property = prop;
   1772		drm_object_attach_property(&connector->base, prop, 0);
   1773	}
   1774
   1775	return 0;
   1776}
   1777EXPORT_SYMBOL(drm_connector_attach_vrr_capable_property);
   1778
   1779/**
   1780 * drm_connector_attach_scaling_mode_property - attach atomic scaling mode property
   1781 * @connector: connector to attach scaling mode property on.
   1782 * @scaling_mode_mask: or'ed mask of BIT(%DRM_MODE_SCALE_\*).
   1783 *
   1784 * This is used to add support for scaling mode to atomic drivers.
   1785 * The scaling mode will be set to &drm_connector_state.scaling_mode
   1786 * and can be used from &drm_connector_helper_funcs->atomic_check for validation.
   1787 *
   1788 * This is the atomic version of drm_mode_create_scaling_mode_property().
   1789 *
   1790 * Returns:
   1791 * Zero on success, negative errno on failure.
   1792 */
   1793int drm_connector_attach_scaling_mode_property(struct drm_connector *connector,
   1794					       u32 scaling_mode_mask)
   1795{
   1796	struct drm_device *dev = connector->dev;
   1797	struct drm_property *scaling_mode_property;
   1798	int i;
   1799	const unsigned valid_scaling_mode_mask =
   1800		(1U << ARRAY_SIZE(drm_scaling_mode_enum_list)) - 1;
   1801
   1802	if (WARN_ON(hweight32(scaling_mode_mask) < 2 ||
   1803		    scaling_mode_mask & ~valid_scaling_mode_mask))
   1804		return -EINVAL;
   1805
   1806	scaling_mode_property =
   1807		drm_property_create(dev, DRM_MODE_PROP_ENUM, "scaling mode",
   1808				    hweight32(scaling_mode_mask));
   1809
   1810	if (!scaling_mode_property)
   1811		return -ENOMEM;
   1812
   1813	for (i = 0; i < ARRAY_SIZE(drm_scaling_mode_enum_list); i++) {
   1814		int ret;
   1815
   1816		if (!(BIT(i) & scaling_mode_mask))
   1817			continue;
   1818
   1819		ret = drm_property_add_enum(scaling_mode_property,
   1820					    drm_scaling_mode_enum_list[i].type,
   1821					    drm_scaling_mode_enum_list[i].name);
   1822
   1823		if (ret) {
   1824			drm_property_destroy(dev, scaling_mode_property);
   1825
   1826			return ret;
   1827		}
   1828	}
   1829
   1830	drm_object_attach_property(&connector->base,
   1831				   scaling_mode_property, 0);
   1832
   1833	connector->scaling_mode_property = scaling_mode_property;
   1834
   1835	return 0;
   1836}
   1837EXPORT_SYMBOL(drm_connector_attach_scaling_mode_property);
   1838
   1839/**
   1840 * drm_mode_create_aspect_ratio_property - create aspect ratio property
   1841 * @dev: DRM device
   1842 *
   1843 * Called by a driver the first time it's needed, must be attached to desired
   1844 * connectors.
   1845 *
   1846 * Returns:
   1847 * Zero on success, negative errno on failure.
   1848 */
   1849int drm_mode_create_aspect_ratio_property(struct drm_device *dev)
   1850{
   1851	if (dev->mode_config.aspect_ratio_property)
   1852		return 0;
   1853
   1854	dev->mode_config.aspect_ratio_property =
   1855		drm_property_create_enum(dev, 0, "aspect ratio",
   1856				drm_aspect_ratio_enum_list,
   1857				ARRAY_SIZE(drm_aspect_ratio_enum_list));
   1858
   1859	if (dev->mode_config.aspect_ratio_property == NULL)
   1860		return -ENOMEM;
   1861
   1862	return 0;
   1863}
   1864EXPORT_SYMBOL(drm_mode_create_aspect_ratio_property);
   1865
   1866/**
   1867 * DOC: standard connector properties
   1868 *
   1869 * Colorspace:
   1870 *     This property helps select a suitable colorspace based on the sink
   1871 *     capability. Modern sink devices support wider gamut like BT2020.
   1872 *     This helps switch to BT2020 mode if the BT2020 encoded video stream
   1873 *     is being played by the user, same for any other colorspace. Thereby
   1874 *     giving a good visual experience to users.
   1875 *
   1876 *     The expectation from userspace is that it should parse the EDID
   1877 *     and get supported colorspaces. Use this property and switch to the
   1878 *     one supported. Sink supported colorspaces should be retrieved by
   1879 *     userspace from EDID and driver will not explicitly expose them.
   1880 *
   1881 *     Basically the expectation from userspace is:
   1882 *      - Set up CRTC DEGAMMA/CTM/GAMMA to convert to some sink
   1883 *        colorspace
   1884 *      - Set this new property to let the sink know what it
   1885 *        converted the CRTC output to.
   1886 *      - This property is just to inform sink what colorspace
   1887 *        source is trying to drive.
   1888 *
   1889 * Because between HDMI and DP have different colorspaces,
   1890 * drm_mode_create_hdmi_colorspace_property() is used for HDMI connector and
   1891 * drm_mode_create_dp_colorspace_property() is used for DP connector.
   1892 */
   1893
   1894/**
   1895 * drm_mode_create_hdmi_colorspace_property - create hdmi colorspace property
   1896 * @connector: connector to create the Colorspace property on.
   1897 *
   1898 * Called by a driver the first time it's needed, must be attached to desired
   1899 * HDMI connectors.
   1900 *
   1901 * Returns:
   1902 * Zero on success, negative errno on failure.
   1903 */
   1904int drm_mode_create_hdmi_colorspace_property(struct drm_connector *connector)
   1905{
   1906	struct drm_device *dev = connector->dev;
   1907
   1908	if (connector->colorspace_property)
   1909		return 0;
   1910
   1911	connector->colorspace_property =
   1912		drm_property_create_enum(dev, DRM_MODE_PROP_ENUM, "Colorspace",
   1913					 hdmi_colorspaces,
   1914					 ARRAY_SIZE(hdmi_colorspaces));
   1915
   1916	if (!connector->colorspace_property)
   1917		return -ENOMEM;
   1918
   1919	return 0;
   1920}
   1921EXPORT_SYMBOL(drm_mode_create_hdmi_colorspace_property);
   1922
   1923/**
   1924 * drm_mode_create_dp_colorspace_property - create dp colorspace property
   1925 * @connector: connector to create the Colorspace property on.
   1926 *
   1927 * Called by a driver the first time it's needed, must be attached to desired
   1928 * DP connectors.
   1929 *
   1930 * Returns:
   1931 * Zero on success, negative errno on failure.
   1932 */
   1933int drm_mode_create_dp_colorspace_property(struct drm_connector *connector)
   1934{
   1935	struct drm_device *dev = connector->dev;
   1936
   1937	if (connector->colorspace_property)
   1938		return 0;
   1939
   1940	connector->colorspace_property =
   1941		drm_property_create_enum(dev, DRM_MODE_PROP_ENUM, "Colorspace",
   1942					 dp_colorspaces,
   1943					 ARRAY_SIZE(dp_colorspaces));
   1944
   1945	if (!connector->colorspace_property)
   1946		return -ENOMEM;
   1947
   1948	return 0;
   1949}
   1950EXPORT_SYMBOL(drm_mode_create_dp_colorspace_property);
   1951
   1952/**
   1953 * drm_mode_create_content_type_property - create content type property
   1954 * @dev: DRM device
   1955 *
   1956 * Called by a driver the first time it's needed, must be attached to desired
   1957 * connectors.
   1958 *
   1959 * Returns:
   1960 * Zero on success, negative errno on failure.
   1961 */
   1962int drm_mode_create_content_type_property(struct drm_device *dev)
   1963{
   1964	if (dev->mode_config.content_type_property)
   1965		return 0;
   1966
   1967	dev->mode_config.content_type_property =
   1968		drm_property_create_enum(dev, 0, "content type",
   1969					 drm_content_type_enum_list,
   1970					 ARRAY_SIZE(drm_content_type_enum_list));
   1971
   1972	if (dev->mode_config.content_type_property == NULL)
   1973		return -ENOMEM;
   1974
   1975	return 0;
   1976}
   1977EXPORT_SYMBOL(drm_mode_create_content_type_property);
   1978
   1979/**
   1980 * drm_mode_create_suggested_offset_properties - create suggests offset properties
   1981 * @dev: DRM device
   1982 *
   1983 * Create the suggested x/y offset property for connectors.
   1984 *
   1985 * Returns:
   1986 * 0 on success or a negative error code on failure.
   1987 */
   1988int drm_mode_create_suggested_offset_properties(struct drm_device *dev)
   1989{
   1990	if (dev->mode_config.suggested_x_property && dev->mode_config.suggested_y_property)
   1991		return 0;
   1992
   1993	dev->mode_config.suggested_x_property =
   1994		drm_property_create_range(dev, DRM_MODE_PROP_IMMUTABLE, "suggested X", 0, 0xffffffff);
   1995
   1996	dev->mode_config.suggested_y_property =
   1997		drm_property_create_range(dev, DRM_MODE_PROP_IMMUTABLE, "suggested Y", 0, 0xffffffff);
   1998
   1999	if (dev->mode_config.suggested_x_property == NULL ||
   2000	    dev->mode_config.suggested_y_property == NULL)
   2001		return -ENOMEM;
   2002	return 0;
   2003}
   2004EXPORT_SYMBOL(drm_mode_create_suggested_offset_properties);
   2005
   2006/**
   2007 * drm_connector_set_path_property - set tile property on connector
   2008 * @connector: connector to set property on.
   2009 * @path: path to use for property; must not be NULL.
   2010 *
   2011 * This creates a property to expose to userspace to specify a
   2012 * connector path. This is mainly used for DisplayPort MST where
   2013 * connectors have a topology and we want to allow userspace to give
   2014 * them more meaningful names.
   2015 *
   2016 * Returns:
   2017 * Zero on success, negative errno on failure.
   2018 */
   2019int drm_connector_set_path_property(struct drm_connector *connector,
   2020				    const char *path)
   2021{
   2022	struct drm_device *dev = connector->dev;
   2023	int ret;
   2024
   2025	ret = drm_property_replace_global_blob(dev,
   2026					       &connector->path_blob_ptr,
   2027					       strlen(path) + 1,
   2028					       path,
   2029					       &connector->base,
   2030					       dev->mode_config.path_property);
   2031	return ret;
   2032}
   2033EXPORT_SYMBOL(drm_connector_set_path_property);
   2034
   2035/**
   2036 * drm_connector_set_tile_property - set tile property on connector
   2037 * @connector: connector to set property on.
   2038 *
   2039 * This looks up the tile information for a connector, and creates a
   2040 * property for userspace to parse if it exists. The property is of
   2041 * the form of 8 integers using ':' as a separator.
   2042 * This is used for dual port tiled displays with DisplayPort SST
   2043 * or DisplayPort MST connectors.
   2044 *
   2045 * Returns:
   2046 * Zero on success, errno on failure.
   2047 */
   2048int drm_connector_set_tile_property(struct drm_connector *connector)
   2049{
   2050	struct drm_device *dev = connector->dev;
   2051	char tile[256];
   2052	int ret;
   2053
   2054	if (!connector->has_tile) {
   2055		ret  = drm_property_replace_global_blob(dev,
   2056							&connector->tile_blob_ptr,
   2057							0,
   2058							NULL,
   2059							&connector->base,
   2060							dev->mode_config.tile_property);
   2061		return ret;
   2062	}
   2063
   2064	snprintf(tile, 256, "%d:%d:%d:%d:%d:%d:%d:%d",
   2065		 connector->tile_group->id, connector->tile_is_single_monitor,
   2066		 connector->num_h_tile, connector->num_v_tile,
   2067		 connector->tile_h_loc, connector->tile_v_loc,
   2068		 connector->tile_h_size, connector->tile_v_size);
   2069
   2070	ret = drm_property_replace_global_blob(dev,
   2071					       &connector->tile_blob_ptr,
   2072					       strlen(tile) + 1,
   2073					       tile,
   2074					       &connector->base,
   2075					       dev->mode_config.tile_property);
   2076	return ret;
   2077}
   2078EXPORT_SYMBOL(drm_connector_set_tile_property);
   2079
   2080/**
   2081 * drm_connector_update_edid_property - update the edid property of a connector
   2082 * @connector: drm connector
   2083 * @edid: new value of the edid property
   2084 *
   2085 * This function creates a new blob modeset object and assigns its id to the
   2086 * connector's edid property.
   2087 * Since we also parse tile information from EDID's displayID block, we also
   2088 * set the connector's tile property here. See drm_connector_set_tile_property()
   2089 * for more details.
   2090 *
   2091 * Returns:
   2092 * Zero on success, negative errno on failure.
   2093 */
   2094int drm_connector_update_edid_property(struct drm_connector *connector,
   2095				       const struct edid *edid)
   2096{
   2097	struct drm_device *dev = connector->dev;
   2098	size_t size = 0;
   2099	int ret;
   2100	const struct edid *old_edid;
   2101
   2102	/* ignore requests to set edid when overridden */
   2103	if (connector->override_edid)
   2104		return 0;
   2105
   2106	if (edid)
   2107		size = EDID_LENGTH * (1 + edid->extensions);
   2108
   2109	/* Set the display info, using edid if available, otherwise
   2110	 * resetting the values to defaults. This duplicates the work
   2111	 * done in drm_add_edid_modes, but that function is not
   2112	 * consistently called before this one in all drivers and the
   2113	 * computation is cheap enough that it seems better to
   2114	 * duplicate it rather than attempt to ensure some arbitrary
   2115	 * ordering of calls.
   2116	 */
   2117	if (edid)
   2118		drm_add_display_info(connector, edid);
   2119	else
   2120		drm_reset_display_info(connector);
   2121
   2122	drm_update_tile_info(connector, edid);
   2123
   2124	if (connector->edid_blob_ptr) {
   2125		old_edid = (const struct edid *)connector->edid_blob_ptr->data;
   2126		if (old_edid) {
   2127			if (!drm_edid_are_equal(edid, old_edid)) {
   2128				DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Edid was changed.\n",
   2129					      connector->base.id, connector->name);
   2130
   2131				connector->epoch_counter += 1;
   2132				DRM_DEBUG_KMS("Updating change counter to %llu\n",
   2133					      connector->epoch_counter);
   2134			}
   2135		}
   2136	}
   2137
   2138	drm_object_property_set_value(&connector->base,
   2139				      dev->mode_config.non_desktop_property,
   2140				      connector->display_info.non_desktop);
   2141
   2142	ret = drm_property_replace_global_blob(dev,
   2143					       &connector->edid_blob_ptr,
   2144					       size,
   2145					       edid,
   2146					       &connector->base,
   2147					       dev->mode_config.edid_property);
   2148	if (ret)
   2149		return ret;
   2150	return drm_connector_set_tile_property(connector);
   2151}
   2152EXPORT_SYMBOL(drm_connector_update_edid_property);
   2153
   2154/**
   2155 * drm_connector_set_link_status_property - Set link status property of a connector
   2156 * @connector: drm connector
   2157 * @link_status: new value of link status property (0: Good, 1: Bad)
   2158 *
   2159 * In usual working scenario, this link status property will always be set to
   2160 * "GOOD". If something fails during or after a mode set, the kernel driver
   2161 * may set this link status property to "BAD". The caller then needs to send a
   2162 * hotplug uevent for userspace to re-check the valid modes through
   2163 * GET_CONNECTOR_IOCTL and retry modeset.
   2164 *
   2165 * Note: Drivers cannot rely on userspace to support this property and
   2166 * issue a modeset. As such, they may choose to handle issues (like
   2167 * re-training a link) without userspace's intervention.
   2168 *
   2169 * The reason for adding this property is to handle link training failures, but
   2170 * it is not limited to DP or link training. For example, if we implement
   2171 * asynchronous setcrtc, this property can be used to report any failures in that.
   2172 */
   2173void drm_connector_set_link_status_property(struct drm_connector *connector,
   2174					    uint64_t link_status)
   2175{
   2176	struct drm_device *dev = connector->dev;
   2177
   2178	drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
   2179	connector->state->link_status = link_status;
   2180	drm_modeset_unlock(&dev->mode_config.connection_mutex);
   2181}
   2182EXPORT_SYMBOL(drm_connector_set_link_status_property);
   2183
   2184/**
   2185 * drm_connector_attach_max_bpc_property - attach "max bpc" property
   2186 * @connector: connector to attach max bpc property on.
   2187 * @min: The minimum bit depth supported by the connector.
   2188 * @max: The maximum bit depth supported by the connector.
   2189 *
   2190 * This is used to add support for limiting the bit depth on a connector.
   2191 *
   2192 * Returns:
   2193 * Zero on success, negative errno on failure.
   2194 */
   2195int drm_connector_attach_max_bpc_property(struct drm_connector *connector,
   2196					  int min, int max)
   2197{
   2198	struct drm_device *dev = connector->dev;
   2199	struct drm_property *prop;
   2200
   2201	prop = connector->max_bpc_property;
   2202	if (!prop) {
   2203		prop = drm_property_create_range(dev, 0, "max bpc", min, max);
   2204		if (!prop)
   2205			return -ENOMEM;
   2206
   2207		connector->max_bpc_property = prop;
   2208	}
   2209
   2210	drm_object_attach_property(&connector->base, prop, max);
   2211	connector->state->max_requested_bpc = max;
   2212	connector->state->max_bpc = max;
   2213
   2214	return 0;
   2215}
   2216EXPORT_SYMBOL(drm_connector_attach_max_bpc_property);
   2217
   2218/**
   2219 * drm_connector_attach_hdr_output_metadata_property - attach "HDR_OUTPUT_METADA" property
   2220 * @connector: connector to attach the property on.
   2221 *
   2222 * This is used to allow the userspace to send HDR Metadata to the
   2223 * driver.
   2224 *
   2225 * Returns:
   2226 * Zero on success, negative errno on failure.
   2227 */
   2228int drm_connector_attach_hdr_output_metadata_property(struct drm_connector *connector)
   2229{
   2230	struct drm_device *dev = connector->dev;
   2231	struct drm_property *prop = dev->mode_config.hdr_output_metadata_property;
   2232
   2233	drm_object_attach_property(&connector->base, prop, 0);
   2234
   2235	return 0;
   2236}
   2237EXPORT_SYMBOL(drm_connector_attach_hdr_output_metadata_property);
   2238
   2239/**
   2240 * drm_connector_attach_colorspace_property - attach "Colorspace" property
   2241 * @connector: connector to attach the property on.
   2242 *
   2243 * This is used to allow the userspace to signal the output colorspace
   2244 * to the driver.
   2245 *
   2246 * Returns:
   2247 * Zero on success, negative errno on failure.
   2248 */
   2249int drm_connector_attach_colorspace_property(struct drm_connector *connector)
   2250{
   2251	struct drm_property *prop = connector->colorspace_property;
   2252
   2253	drm_object_attach_property(&connector->base, prop, DRM_MODE_COLORIMETRY_DEFAULT);
   2254
   2255	return 0;
   2256}
   2257EXPORT_SYMBOL(drm_connector_attach_colorspace_property);
   2258
   2259/**
   2260 * drm_connector_atomic_hdr_metadata_equal - checks if the hdr metadata changed
   2261 * @old_state: old connector state to compare
   2262 * @new_state: new connector state to compare
   2263 *
   2264 * This is used by HDR-enabled drivers to test whether the HDR metadata
   2265 * have changed between two different connector state (and thus probably
   2266 * requires a full blown mode change).
   2267 *
   2268 * Returns:
   2269 * True if the metadata are equal, False otherwise
   2270 */
   2271bool drm_connector_atomic_hdr_metadata_equal(struct drm_connector_state *old_state,
   2272					     struct drm_connector_state *new_state)
   2273{
   2274	struct drm_property_blob *old_blob = old_state->hdr_output_metadata;
   2275	struct drm_property_blob *new_blob = new_state->hdr_output_metadata;
   2276
   2277	if (!old_blob || !new_blob)
   2278		return old_blob == new_blob;
   2279
   2280	if (old_blob->length != new_blob->length)
   2281		return false;
   2282
   2283	return !memcmp(old_blob->data, new_blob->data, old_blob->length);
   2284}
   2285EXPORT_SYMBOL(drm_connector_atomic_hdr_metadata_equal);
   2286
   2287/**
   2288 * drm_connector_set_vrr_capable_property - sets the variable refresh rate
   2289 * capable property for a connector
   2290 * @connector: drm connector
   2291 * @capable: True if the connector is variable refresh rate capable
   2292 *
   2293 * Should be used by atomic drivers to update the indicated support for
   2294 * variable refresh rate over a connector.
   2295 */
   2296void drm_connector_set_vrr_capable_property(
   2297		struct drm_connector *connector, bool capable)
   2298{
   2299	if (!connector->vrr_capable_property)
   2300		return;
   2301
   2302	drm_object_property_set_value(&connector->base,
   2303				      connector->vrr_capable_property,
   2304				      capable);
   2305}
   2306EXPORT_SYMBOL(drm_connector_set_vrr_capable_property);
   2307
   2308/**
   2309 * drm_connector_set_panel_orientation - sets the connector's panel_orientation
   2310 * @connector: connector for which to set the panel-orientation property.
   2311 * @panel_orientation: drm_panel_orientation value to set
   2312 *
   2313 * This function sets the connector's panel_orientation and attaches
   2314 * a "panel orientation" property to the connector.
   2315 *
   2316 * Calling this function on a connector where the panel_orientation has
   2317 * already been set is a no-op (e.g. the orientation has been overridden with
   2318 * a kernel commandline option).
   2319 *
   2320 * It is allowed to call this function with a panel_orientation of
   2321 * DRM_MODE_PANEL_ORIENTATION_UNKNOWN, in which case it is a no-op.
   2322 *
   2323 * Returns:
   2324 * Zero on success, negative errno on failure.
   2325 */
   2326int drm_connector_set_panel_orientation(
   2327	struct drm_connector *connector,
   2328	enum drm_panel_orientation panel_orientation)
   2329{
   2330	struct drm_device *dev = connector->dev;
   2331	struct drm_display_info *info = &connector->display_info;
   2332	struct drm_property *prop;
   2333
   2334	/* Already set? */
   2335	if (info->panel_orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN)
   2336		return 0;
   2337
   2338	/* Don't attach the property if the orientation is unknown */
   2339	if (panel_orientation == DRM_MODE_PANEL_ORIENTATION_UNKNOWN)
   2340		return 0;
   2341
   2342	info->panel_orientation = panel_orientation;
   2343
   2344	prop = dev->mode_config.panel_orientation_property;
   2345	if (!prop) {
   2346		prop = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
   2347				"panel orientation",
   2348				drm_panel_orientation_enum_list,
   2349				ARRAY_SIZE(drm_panel_orientation_enum_list));
   2350		if (!prop)
   2351			return -ENOMEM;
   2352
   2353		dev->mode_config.panel_orientation_property = prop;
   2354	}
   2355
   2356	drm_object_attach_property(&connector->base, prop,
   2357				   info->panel_orientation);
   2358	return 0;
   2359}
   2360EXPORT_SYMBOL(drm_connector_set_panel_orientation);
   2361
   2362/**
   2363 * drm_connector_set_panel_orientation_with_quirk - set the
   2364 *	connector's panel_orientation after checking for quirks
   2365 * @connector: connector for which to init the panel-orientation property.
   2366 * @panel_orientation: drm_panel_orientation value to set
   2367 * @width: width in pixels of the panel, used for panel quirk detection
   2368 * @height: height in pixels of the panel, used for panel quirk detection
   2369 *
   2370 * Like drm_connector_set_panel_orientation(), but with a check for platform
   2371 * specific (e.g. DMI based) quirks overriding the passed in panel_orientation.
   2372 *
   2373 * Returns:
   2374 * Zero on success, negative errno on failure.
   2375 */
   2376int drm_connector_set_panel_orientation_with_quirk(
   2377	struct drm_connector *connector,
   2378	enum drm_panel_orientation panel_orientation,
   2379	int width, int height)
   2380{
   2381	int orientation_quirk;
   2382
   2383	orientation_quirk = drm_get_panel_orientation_quirk(width, height);
   2384	if (orientation_quirk != DRM_MODE_PANEL_ORIENTATION_UNKNOWN)
   2385		panel_orientation = orientation_quirk;
   2386
   2387	return drm_connector_set_panel_orientation(connector,
   2388						   panel_orientation);
   2389}
   2390EXPORT_SYMBOL(drm_connector_set_panel_orientation_with_quirk);
   2391
   2392static const struct drm_prop_enum_list privacy_screen_enum[] = {
   2393	{ PRIVACY_SCREEN_DISABLED,		"Disabled" },
   2394	{ PRIVACY_SCREEN_ENABLED,		"Enabled" },
   2395	{ PRIVACY_SCREEN_DISABLED_LOCKED,	"Disabled-locked" },
   2396	{ PRIVACY_SCREEN_ENABLED_LOCKED,	"Enabled-locked" },
   2397};
   2398
   2399/**
   2400 * drm_connector_create_privacy_screen_properties - create the drm connecter's
   2401 *    privacy-screen properties.
   2402 * @connector: connector for which to create the privacy-screen properties
   2403 *
   2404 * This function creates the "privacy-screen sw-state" and "privacy-screen
   2405 * hw-state" properties for the connector. They are not attached.
   2406 */
   2407void
   2408drm_connector_create_privacy_screen_properties(struct drm_connector *connector)
   2409{
   2410	if (connector->privacy_screen_sw_state_property)
   2411		return;
   2412
   2413	/* Note sw-state only supports the first 2 values of the enum */
   2414	connector->privacy_screen_sw_state_property =
   2415		drm_property_create_enum(connector->dev, DRM_MODE_PROP_ENUM,
   2416				"privacy-screen sw-state",
   2417				privacy_screen_enum, 2);
   2418
   2419	connector->privacy_screen_hw_state_property =
   2420		drm_property_create_enum(connector->dev,
   2421				DRM_MODE_PROP_IMMUTABLE | DRM_MODE_PROP_ENUM,
   2422				"privacy-screen hw-state",
   2423				privacy_screen_enum,
   2424				ARRAY_SIZE(privacy_screen_enum));
   2425}
   2426EXPORT_SYMBOL(drm_connector_create_privacy_screen_properties);
   2427
   2428/**
   2429 * drm_connector_attach_privacy_screen_properties - attach the drm connecter's
   2430 *    privacy-screen properties.
   2431 * @connector: connector on which to attach the privacy-screen properties
   2432 *
   2433 * This function attaches the "privacy-screen sw-state" and "privacy-screen
   2434 * hw-state" properties to the connector. The initial state of both is set
   2435 * to "Disabled".
   2436 */
   2437void
   2438drm_connector_attach_privacy_screen_properties(struct drm_connector *connector)
   2439{
   2440	if (!connector->privacy_screen_sw_state_property)
   2441		return;
   2442
   2443	drm_object_attach_property(&connector->base,
   2444				   connector->privacy_screen_sw_state_property,
   2445				   PRIVACY_SCREEN_DISABLED);
   2446
   2447	drm_object_attach_property(&connector->base,
   2448				   connector->privacy_screen_hw_state_property,
   2449				   PRIVACY_SCREEN_DISABLED);
   2450}
   2451EXPORT_SYMBOL(drm_connector_attach_privacy_screen_properties);
   2452
   2453static void drm_connector_update_privacy_screen_properties(
   2454	struct drm_connector *connector, bool set_sw_state)
   2455{
   2456	enum drm_privacy_screen_status sw_state, hw_state;
   2457
   2458	drm_privacy_screen_get_state(connector->privacy_screen,
   2459				     &sw_state, &hw_state);
   2460
   2461	if (set_sw_state)
   2462		connector->state->privacy_screen_sw_state = sw_state;
   2463	drm_object_property_set_value(&connector->base,
   2464			connector->privacy_screen_hw_state_property, hw_state);
   2465}
   2466
   2467static int drm_connector_privacy_screen_notifier(
   2468	struct notifier_block *nb, unsigned long action, void *data)
   2469{
   2470	struct drm_connector *connector =
   2471		container_of(nb, struct drm_connector, privacy_screen_notifier);
   2472	struct drm_device *dev = connector->dev;
   2473
   2474	drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
   2475	drm_connector_update_privacy_screen_properties(connector, true);
   2476	drm_modeset_unlock(&dev->mode_config.connection_mutex);
   2477
   2478	drm_sysfs_connector_status_event(connector,
   2479				connector->privacy_screen_sw_state_property);
   2480	drm_sysfs_connector_status_event(connector,
   2481				connector->privacy_screen_hw_state_property);
   2482
   2483	return NOTIFY_DONE;
   2484}
   2485
   2486/**
   2487 * drm_connector_attach_privacy_screen_provider - attach a privacy-screen to
   2488 *    the connector
   2489 * @connector: connector to attach the privacy-screen to
   2490 * @priv: drm_privacy_screen to attach
   2491 *
   2492 * Create and attach the standard privacy-screen properties and register
   2493 * a generic notifier for generating sysfs-connector-status-events
   2494 * on external changes to the privacy-screen status.
   2495 * This function takes ownership of the passed in drm_privacy_screen and will
   2496 * call drm_privacy_screen_put() on it when the connector is destroyed.
   2497 */
   2498void drm_connector_attach_privacy_screen_provider(
   2499	struct drm_connector *connector, struct drm_privacy_screen *priv)
   2500{
   2501	connector->privacy_screen = priv;
   2502	connector->privacy_screen_notifier.notifier_call =
   2503		drm_connector_privacy_screen_notifier;
   2504
   2505	drm_connector_create_privacy_screen_properties(connector);
   2506	drm_connector_update_privacy_screen_properties(connector, true);
   2507	drm_connector_attach_privacy_screen_properties(connector);
   2508}
   2509EXPORT_SYMBOL(drm_connector_attach_privacy_screen_provider);
   2510
   2511/**
   2512 * drm_connector_update_privacy_screen - update connector's privacy-screen sw-state
   2513 * @connector_state: connector-state to update the privacy-screen for
   2514 *
   2515 * This function calls drm_privacy_screen_set_sw_state() on the connector's
   2516 * privacy-screen.
   2517 *
   2518 * If the connector has no privacy-screen, then this is a no-op.
   2519 */
   2520void drm_connector_update_privacy_screen(const struct drm_connector_state *connector_state)
   2521{
   2522	struct drm_connector *connector = connector_state->connector;
   2523	int ret;
   2524
   2525	if (!connector->privacy_screen)
   2526		return;
   2527
   2528	ret = drm_privacy_screen_set_sw_state(connector->privacy_screen,
   2529					      connector_state->privacy_screen_sw_state);
   2530	if (ret) {
   2531		drm_err(connector->dev, "Error updating privacy-screen sw_state\n");
   2532		return;
   2533	}
   2534
   2535	/* The hw_state property value may have changed, update it. */
   2536	drm_connector_update_privacy_screen_properties(connector, false);
   2537}
   2538EXPORT_SYMBOL(drm_connector_update_privacy_screen);
   2539
   2540int drm_connector_set_obj_prop(struct drm_mode_object *obj,
   2541				    struct drm_property *property,
   2542				    uint64_t value)
   2543{
   2544	int ret = -EINVAL;
   2545	struct drm_connector *connector = obj_to_connector(obj);
   2546
   2547	/* Do DPMS ourselves */
   2548	if (property == connector->dev->mode_config.dpms_property) {
   2549		ret = (*connector->funcs->dpms)(connector, (int)value);
   2550	} else if (connector->funcs->set_property)
   2551		ret = connector->funcs->set_property(connector, property, value);
   2552
   2553	if (!ret)
   2554		drm_object_property_set_value(&connector->base, property, value);
   2555	return ret;
   2556}
   2557
   2558int drm_connector_property_set_ioctl(struct drm_device *dev,
   2559				     void *data, struct drm_file *file_priv)
   2560{
   2561	struct drm_mode_connector_set_property *conn_set_prop = data;
   2562	struct drm_mode_obj_set_property obj_set_prop = {
   2563		.value = conn_set_prop->value,
   2564		.prop_id = conn_set_prop->prop_id,
   2565		.obj_id = conn_set_prop->connector_id,
   2566		.obj_type = DRM_MODE_OBJECT_CONNECTOR
   2567	};
   2568
   2569	/* It does all the locking and checking we need */
   2570	return drm_mode_obj_set_property_ioctl(dev, &obj_set_prop, file_priv);
   2571}
   2572
   2573static struct drm_encoder *drm_connector_get_encoder(struct drm_connector *connector)
   2574{
   2575	/* For atomic drivers only state objects are synchronously updated and
   2576	 * protected by modeset locks, so check those first.
   2577	 */
   2578	if (connector->state)
   2579		return connector->state->best_encoder;
   2580	return connector->encoder;
   2581}
   2582
   2583static bool
   2584drm_mode_expose_to_userspace(const struct drm_display_mode *mode,
   2585			     const struct list_head *modes,
   2586			     const struct drm_file *file_priv)
   2587{
   2588	/*
   2589	 * If user-space hasn't configured the driver to expose the stereo 3D
   2590	 * modes, don't expose them.
   2591	 */
   2592	if (!file_priv->stereo_allowed && drm_mode_is_stereo(mode))
   2593		return false;
   2594	/*
   2595	 * If user-space hasn't configured the driver to expose the modes
   2596	 * with aspect-ratio, don't expose them. However if such a mode
   2597	 * is unique, let it be exposed, but reset the aspect-ratio flags
   2598	 * while preparing the list of user-modes.
   2599	 */
   2600	if (!file_priv->aspect_ratio_allowed) {
   2601		const struct drm_display_mode *mode_itr;
   2602
   2603		list_for_each_entry(mode_itr, modes, head) {
   2604			if (mode_itr->expose_to_userspace &&
   2605			    drm_mode_match(mode_itr, mode,
   2606					   DRM_MODE_MATCH_TIMINGS |
   2607					   DRM_MODE_MATCH_CLOCK |
   2608					   DRM_MODE_MATCH_FLAGS |
   2609					   DRM_MODE_MATCH_3D_FLAGS))
   2610				return false;
   2611		}
   2612	}
   2613
   2614	return true;
   2615}
   2616
   2617int drm_mode_getconnector(struct drm_device *dev, void *data,
   2618			  struct drm_file *file_priv)
   2619{
   2620	struct drm_mode_get_connector *out_resp = data;
   2621	struct drm_connector *connector;
   2622	struct drm_encoder *encoder;
   2623	struct drm_display_mode *mode;
   2624	int mode_count = 0;
   2625	int encoders_count = 0;
   2626	int ret = 0;
   2627	int copied = 0;
   2628	struct drm_mode_modeinfo u_mode;
   2629	struct drm_mode_modeinfo __user *mode_ptr;
   2630	uint32_t __user *encoder_ptr;
   2631	bool is_current_master;
   2632
   2633	if (!drm_core_check_feature(dev, DRIVER_MODESET))
   2634		return -EOPNOTSUPP;
   2635
   2636	memset(&u_mode, 0, sizeof(struct drm_mode_modeinfo));
   2637
   2638	connector = drm_connector_lookup(dev, file_priv, out_resp->connector_id);
   2639	if (!connector)
   2640		return -ENOENT;
   2641
   2642	encoders_count = hweight32(connector->possible_encoders);
   2643
   2644	if ((out_resp->count_encoders >= encoders_count) && encoders_count) {
   2645		copied = 0;
   2646		encoder_ptr = (uint32_t __user *)(unsigned long)(out_resp->encoders_ptr);
   2647
   2648		drm_connector_for_each_possible_encoder(connector, encoder) {
   2649			if (put_user(encoder->base.id, encoder_ptr + copied)) {
   2650				ret = -EFAULT;
   2651				goto out;
   2652			}
   2653			copied++;
   2654		}
   2655	}
   2656	out_resp->count_encoders = encoders_count;
   2657
   2658	out_resp->connector_id = connector->base.id;
   2659	out_resp->connector_type = connector->connector_type;
   2660	out_resp->connector_type_id = connector->connector_type_id;
   2661
   2662	is_current_master = drm_is_current_master(file_priv);
   2663
   2664	mutex_lock(&dev->mode_config.mutex);
   2665	if (out_resp->count_modes == 0) {
   2666		if (is_current_master)
   2667			connector->funcs->fill_modes(connector,
   2668						     dev->mode_config.max_width,
   2669						     dev->mode_config.max_height);
   2670		else
   2671			drm_dbg_kms(dev, "User-space requested a forced probe on [CONNECTOR:%d:%s] but is not the DRM master, demoting to read-only probe",
   2672				    connector->base.id, connector->name);
   2673	}
   2674
   2675	out_resp->mm_width = connector->display_info.width_mm;
   2676	out_resp->mm_height = connector->display_info.height_mm;
   2677	out_resp->subpixel = connector->display_info.subpixel_order;
   2678	out_resp->connection = connector->status;
   2679
   2680	/* delayed so we get modes regardless of pre-fill_modes state */
   2681	list_for_each_entry(mode, &connector->modes, head) {
   2682		WARN_ON(mode->expose_to_userspace);
   2683
   2684		if (drm_mode_expose_to_userspace(mode, &connector->modes,
   2685						 file_priv)) {
   2686			mode->expose_to_userspace = true;
   2687			mode_count++;
   2688		}
   2689	}
   2690
   2691	/*
   2692	 * This ioctl is called twice, once to determine how much space is
   2693	 * needed, and the 2nd time to fill it.
   2694	 */
   2695	if ((out_resp->count_modes >= mode_count) && mode_count) {
   2696		copied = 0;
   2697		mode_ptr = (struct drm_mode_modeinfo __user *)(unsigned long)out_resp->modes_ptr;
   2698		list_for_each_entry(mode, &connector->modes, head) {
   2699			if (!mode->expose_to_userspace)
   2700				continue;
   2701
   2702			/* Clear the tag for the next time around */
   2703			mode->expose_to_userspace = false;
   2704
   2705			drm_mode_convert_to_umode(&u_mode, mode);
   2706			/*
   2707			 * Reset aspect ratio flags of user-mode, if modes with
   2708			 * aspect-ratio are not supported.
   2709			 */
   2710			if (!file_priv->aspect_ratio_allowed)
   2711				u_mode.flags &= ~DRM_MODE_FLAG_PIC_AR_MASK;
   2712			if (copy_to_user(mode_ptr + copied,
   2713					 &u_mode, sizeof(u_mode))) {
   2714				ret = -EFAULT;
   2715
   2716				/*
   2717				 * Clear the tag for the rest of
   2718				 * the modes for the next time around.
   2719				 */
   2720				list_for_each_entry_continue(mode, &connector->modes, head)
   2721					mode->expose_to_userspace = false;
   2722
   2723				mutex_unlock(&dev->mode_config.mutex);
   2724
   2725				goto out;
   2726			}
   2727			copied++;
   2728		}
   2729	} else {
   2730		/* Clear the tag for the next time around */
   2731		list_for_each_entry(mode, &connector->modes, head)
   2732			mode->expose_to_userspace = false;
   2733	}
   2734
   2735	out_resp->count_modes = mode_count;
   2736	mutex_unlock(&dev->mode_config.mutex);
   2737
   2738	drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
   2739	encoder = drm_connector_get_encoder(connector);
   2740	if (encoder)
   2741		out_resp->encoder_id = encoder->base.id;
   2742	else
   2743		out_resp->encoder_id = 0;
   2744
   2745	/* Only grab properties after probing, to make sure EDID and other
   2746	 * properties reflect the latest status.
   2747	 */
   2748	ret = drm_mode_object_get_properties(&connector->base, file_priv->atomic,
   2749			(uint32_t __user *)(unsigned long)(out_resp->props_ptr),
   2750			(uint64_t __user *)(unsigned long)(out_resp->prop_values_ptr),
   2751			&out_resp->count_props);
   2752	drm_modeset_unlock(&dev->mode_config.connection_mutex);
   2753
   2754out:
   2755	drm_connector_put(connector);
   2756
   2757	return ret;
   2758}
   2759
   2760/**
   2761 * drm_connector_find_by_fwnode - Find a connector based on the associated fwnode
   2762 * @fwnode: fwnode for which to find the matching drm_connector
   2763 *
   2764 * This functions looks up a drm_connector based on its associated fwnode. When
   2765 * a connector is found a reference to the connector is returned. The caller must
   2766 * call drm_connector_put() to release this reference when it is done with the
   2767 * connector.
   2768 *
   2769 * Returns: A reference to the found connector or an ERR_PTR().
   2770 */
   2771struct drm_connector *drm_connector_find_by_fwnode(struct fwnode_handle *fwnode)
   2772{
   2773	struct drm_connector *connector, *found = ERR_PTR(-ENODEV);
   2774
   2775	if (!fwnode)
   2776		return ERR_PTR(-ENODEV);
   2777
   2778	mutex_lock(&connector_list_lock);
   2779
   2780	list_for_each_entry(connector, &connector_list, global_connector_list_entry) {
   2781		if (connector->fwnode == fwnode ||
   2782		    (connector->fwnode && connector->fwnode->secondary == fwnode)) {
   2783			drm_connector_get(connector);
   2784			found = connector;
   2785			break;
   2786		}
   2787	}
   2788
   2789	mutex_unlock(&connector_list_lock);
   2790
   2791	return found;
   2792}
   2793
   2794/**
   2795 * drm_connector_oob_hotplug_event - Report out-of-band hotplug event to connector
   2796 * @connector_fwnode: fwnode_handle to report the event on
   2797 *
   2798 * On some hardware a hotplug event notification may come from outside the display
   2799 * driver / device. An example of this is some USB Type-C setups where the hardware
   2800 * muxes the DisplayPort data and aux-lines but does not pass the altmode HPD
   2801 * status bit to the GPU's DP HPD pin.
   2802 *
   2803 * This function can be used to report these out-of-band events after obtaining
   2804 * a drm_connector reference through calling drm_connector_find_by_fwnode().
   2805 */
   2806void drm_connector_oob_hotplug_event(struct fwnode_handle *connector_fwnode)
   2807{
   2808	struct drm_connector *connector;
   2809
   2810	connector = drm_connector_find_by_fwnode(connector_fwnode);
   2811	if (IS_ERR(connector))
   2812		return;
   2813
   2814	if (connector->funcs->oob_hotplug_event)
   2815		connector->funcs->oob_hotplug_event(connector);
   2816
   2817	drm_connector_put(connector);
   2818}
   2819EXPORT_SYMBOL(drm_connector_oob_hotplug_event);
   2820
   2821
   2822/**
   2823 * DOC: Tile group
   2824 *
   2825 * Tile groups are used to represent tiled monitors with a unique integer
   2826 * identifier. Tiled monitors using DisplayID v1.3 have a unique 8-byte handle,
   2827 * we store this in a tile group, so we have a common identifier for all tiles
   2828 * in a monitor group. The property is called "TILE". Drivers can manage tile
   2829 * groups using drm_mode_create_tile_group(), drm_mode_put_tile_group() and
   2830 * drm_mode_get_tile_group(). But this is only needed for internal panels where
   2831 * the tile group information is exposed through a non-standard way.
   2832 */
   2833
   2834static void drm_tile_group_free(struct kref *kref)
   2835{
   2836	struct drm_tile_group *tg = container_of(kref, struct drm_tile_group, refcount);
   2837	struct drm_device *dev = tg->dev;
   2838
   2839	mutex_lock(&dev->mode_config.idr_mutex);
   2840	idr_remove(&dev->mode_config.tile_idr, tg->id);
   2841	mutex_unlock(&dev->mode_config.idr_mutex);
   2842	kfree(tg);
   2843}
   2844
   2845/**
   2846 * drm_mode_put_tile_group - drop a reference to a tile group.
   2847 * @dev: DRM device
   2848 * @tg: tile group to drop reference to.
   2849 *
   2850 * drop reference to tile group and free if 0.
   2851 */
   2852void drm_mode_put_tile_group(struct drm_device *dev,
   2853			     struct drm_tile_group *tg)
   2854{
   2855	kref_put(&tg->refcount, drm_tile_group_free);
   2856}
   2857EXPORT_SYMBOL(drm_mode_put_tile_group);
   2858
   2859/**
   2860 * drm_mode_get_tile_group - get a reference to an existing tile group
   2861 * @dev: DRM device
   2862 * @topology: 8-bytes unique per monitor.
   2863 *
   2864 * Use the unique bytes to get a reference to an existing tile group.
   2865 *
   2866 * RETURNS:
   2867 * tile group or NULL if not found.
   2868 */
   2869struct drm_tile_group *drm_mode_get_tile_group(struct drm_device *dev,
   2870					       const char topology[8])
   2871{
   2872	struct drm_tile_group *tg;
   2873	int id;
   2874
   2875	mutex_lock(&dev->mode_config.idr_mutex);
   2876	idr_for_each_entry(&dev->mode_config.tile_idr, tg, id) {
   2877		if (!memcmp(tg->group_data, topology, 8)) {
   2878			if (!kref_get_unless_zero(&tg->refcount))
   2879				tg = NULL;
   2880			mutex_unlock(&dev->mode_config.idr_mutex);
   2881			return tg;
   2882		}
   2883	}
   2884	mutex_unlock(&dev->mode_config.idr_mutex);
   2885	return NULL;
   2886}
   2887EXPORT_SYMBOL(drm_mode_get_tile_group);
   2888
   2889/**
   2890 * drm_mode_create_tile_group - create a tile group from a displayid description
   2891 * @dev: DRM device
   2892 * @topology: 8-bytes unique per monitor.
   2893 *
   2894 * Create a tile group for the unique monitor, and get a unique
   2895 * identifier for the tile group.
   2896 *
   2897 * RETURNS:
   2898 * new tile group or NULL.
   2899 */
   2900struct drm_tile_group *drm_mode_create_tile_group(struct drm_device *dev,
   2901						  const char topology[8])
   2902{
   2903	struct drm_tile_group *tg;
   2904	int ret;
   2905
   2906	tg = kzalloc(sizeof(*tg), GFP_KERNEL);
   2907	if (!tg)
   2908		return NULL;
   2909
   2910	kref_init(&tg->refcount);
   2911	memcpy(tg->group_data, topology, 8);
   2912	tg->dev = dev;
   2913
   2914	mutex_lock(&dev->mode_config.idr_mutex);
   2915	ret = idr_alloc(&dev->mode_config.tile_idr, tg, 1, 0, GFP_KERNEL);
   2916	if (ret >= 0) {
   2917		tg->id = ret;
   2918	} else {
   2919		kfree(tg);
   2920		tg = NULL;
   2921	}
   2922
   2923	mutex_unlock(&dev->mode_config.idr_mutex);
   2924	return tg;
   2925}
   2926EXPORT_SYMBOL(drm_mode_create_tile_group);