Commit f97180f0 authored by José Expósito's avatar José Expósito Committed by Luca Ceresoli
Browse files

drm/vkms: Allow to configure connector status via configfs



When a connector is created, add a `status` file to allow to update the
connector status to:

 - 1 connector_status_connected
 - 2 connector_status_disconnected
 - 3 connector_status_unknown

If the device is enabled, updating the status hot-plug or unplugs the
connector.

Tested-by: default avatarMark Yacoub <markyacoub@google.com>
Reviewed-by: default avatarLouis Chauvet <louis.chauvet@bootlin.com>
Reviewed-by: default avatarHarry Wentland <harry.wentland@amd.com>
Reviewed-by: default avatarLuca Ceresoli <luca.ceresoli@bootlin.com>
Signed-off-by: default avatarJosé Expósito <jose.exposito89@gmail.com>
Link: https://lore.kernel.org/r/20251016175618.10051-17-jose.exposito89@gmail.com


Signed-off-by: default avatarLuca Ceresoli <luca.ceresoli@bootlin.com>
parent 466f4388
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -108,6 +108,11 @@ Last but not least, create one or more connectors::

  sudo mkdir /config/vkms/my-vkms/connectors/connector0

Connectors have 1 configurable attribute:

- status: Connection status: 1 connected, 2 disconnected, 3 unknown (same values
  as those exposed by the "status" property of a connector)

To finish the configuration, link the different pipeline items::

  sudo ln -s /config/vkms/my-vkms/crtcs/crtc0 /config/vkms/my-vkms/planes/plane0/possible_crtcs
+48 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
#include "vkms_drv.h"
#include "vkms_config.h"
#include "vkms_configfs.h"
#include "vkms_connector.h"

/* To avoid registering configfs more than once or unregistering on error */
static bool is_configfs_registered;
@@ -512,6 +513,52 @@ static const struct config_item_type encoder_group_type = {
	.ct_owner	= THIS_MODULE,
};

static ssize_t connector_status_show(struct config_item *item, char *page)
{
	struct vkms_configfs_connector *connector;
	enum drm_connector_status status;

	connector = connector_item_to_vkms_configfs_connector(item);

	scoped_guard(mutex, &connector->dev->lock)
		status = vkms_config_connector_get_status(connector->config);

	return sprintf(page, "%u", status);
}

static ssize_t connector_status_store(struct config_item *item,
				      const char *page, size_t count)
{
	struct vkms_configfs_connector *connector;
	enum drm_connector_status status;

	connector = connector_item_to_vkms_configfs_connector(item);

	if (kstrtouint(page, 10, &status))
		return -EINVAL;

	if (status != connector_status_connected &&
	    status != connector_status_disconnected &&
	    status != connector_status_unknown)
		return -EINVAL;

	scoped_guard(mutex, &connector->dev->lock) {
		vkms_config_connector_set_status(connector->config, status);

		if (connector->dev->enabled)
			vkms_trigger_connector_hotplug(connector->dev->config->dev);
	}

	return (ssize_t)count;
}

CONFIGFS_ATTR(connector_, status);

static struct configfs_attribute *connector_item_attrs[] = {
	&connector_attr_status,
	NULL,
};

static void connector_release(struct config_item *item)
{
	struct vkms_configfs_connector *connector;
@@ -531,6 +578,7 @@ static struct configfs_item_operations connector_item_operations = {
};

static const struct config_item_type connector_item_type = {
	.ct_attrs	= connector_item_attrs,
	.ct_item_ops	= &connector_item_operations,
	.ct_owner	= THIS_MODULE,
};
+7 −0
Original line number Diff line number Diff line
@@ -87,3 +87,10 @@ struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev)

	return connector;
}

void vkms_trigger_connector_hotplug(struct vkms_device *vkmsdev)
{
	struct drm_device *dev = &vkmsdev->drm;

	drm_kms_helper_hotplug_event(dev);
}
+6 −0
Original line number Diff line number Diff line
@@ -26,4 +26,10 @@ struct vkms_connector {
 */
struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev);

/**
 * vkms_trigger_connector_hotplug() - Update the device's connectors status
 * @vkmsdev: VKMS device to update
 */
void vkms_trigger_connector_hotplug(struct vkms_device *vkmsdev);

#endif /* _VKMS_CONNECTOR_H_ */