[PATCH v6 16/16] drm/vkms: Allow to configure connector status via configfs

José Expósito posted 16 patches 3 months, 1 week ago
There is a newer version of this series
[PATCH v6 16/16] drm/vkms: Allow to configure connector status via configfs
Posted by José Expósito 3 months, 1 week ago
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: Mark Yacoub <markyacoub@google.com>
Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 Documentation/gpu/vkms.rst            |  5 +++
 drivers/gpu/drm/vkms/vkms_configfs.c  | 48 +++++++++++++++++++++++++++
 drivers/gpu/drm/vkms/vkms_connector.c |  7 ++++
 drivers/gpu/drm/vkms/vkms_connector.h |  6 ++++
 4 files changed, 66 insertions(+)

diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index 364b574a8cae..3574e01b928d 100644
--- a/Documentation/gpu/vkms.rst
+++ b/Documentation/gpu/vkms.rst
@@ -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
diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c
index 8e90acbebd6a..07ab794e1052 100644
--- a/drivers/gpu/drm/vkms/vkms_configfs.c
+++ b/drivers/gpu/drm/vkms/vkms_configfs.c
@@ -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,
 };
diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/vkms_connector.c
index 89fa8d9d739b..b0a6b212d3f4 100644
--- a/drivers/gpu/drm/vkms/vkms_connector.c
+++ b/drivers/gpu/drm/vkms/vkms_connector.c
@@ -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);
+}
diff --git a/drivers/gpu/drm/vkms/vkms_connector.h b/drivers/gpu/drm/vkms/vkms_connector.h
index 90f835f70b3b..35f2adf97e32 100644
--- a/drivers/gpu/drm/vkms/vkms_connector.h
+++ b/drivers/gpu/drm/vkms/vkms_connector.h
@@ -26,4 +26,10 @@ struct vkms_connector {
  */
 struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev);
 
+/**
+ * struct vkms_device *vkmsdev() - Update the device's connectors status
+ * @vkmsdev: VKMS device to update
+ */
+void vkms_trigger_connector_hotplug(struct vkms_device *vkmsdev);
+
 #endif /* _VKMS_CONNECTOR_H_ */
-- 
2.51.0

Re: [PATCH v6 16/16] drm/vkms: Allow to configure connector status via configfs
Posted by Harry Wentland 2 months, 2 weeks ago

On 2025-09-01 08:25, José Expósito wrote:
> 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: Mark Yacoub <markyacoub@google.com>
> Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
>   Documentation/gpu/vkms.rst            |  5 +++
>   drivers/gpu/drm/vkms/vkms_configfs.c  | 48 +++++++++++++++++++++++++++
>   drivers/gpu/drm/vkms/vkms_connector.c |  7 ++++
>   drivers/gpu/drm/vkms/vkms_connector.h |  6 ++++
>   4 files changed, 66 insertions(+)
> 
> diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
> index 364b574a8cae..3574e01b928d 100644
> --- a/Documentation/gpu/vkms.rst
> +++ b/Documentation/gpu/vkms.rst
> @@ -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
> diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c
> index 8e90acbebd6a..07ab794e1052 100644
> --- a/drivers/gpu/drm/vkms/vkms_configfs.c
> +++ b/drivers/gpu/drm/vkms/vkms_configfs.c
> @@ -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,
>   };
> diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/vkms_connector.c
> index 89fa8d9d739b..b0a6b212d3f4 100644
> --- a/drivers/gpu/drm/vkms/vkms_connector.c
> +++ b/drivers/gpu/drm/vkms/vkms_connector.c
> @@ -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);
> +}
> diff --git a/drivers/gpu/drm/vkms/vkms_connector.h b/drivers/gpu/drm/vkms/vkms_connector.h
> index 90f835f70b3b..35f2adf97e32 100644
> --- a/drivers/gpu/drm/vkms/vkms_connector.h
> +++ b/drivers/gpu/drm/vkms/vkms_connector.h
> @@ -26,4 +26,10 @@ struct vkms_connector {
>    */
>   struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev);
>   
> +/**
> + * struct vkms_device *vkmsdev() - Update the device's connectors status

vkms_trigger_connector_hotplug()

(or something like that)

After fixing I recommend running 'make htmldocs' and checking for 
errors/warnings in the new changes.

Harry

> + * @vkmsdev: VKMS device to update
> + */
> +void vkms_trigger_connector_hotplug(struct vkms_device *vkmsdev);
> +
>   #endif /* _VKMS_CONNECTOR_H_ */