Le 07/04/2025 à 10:14, José Expósito a écrit :
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.


Reviewed-by: Louis Chauvet <[email protected]>

Signed-off-by: José Expósito <[email protected]>
---
  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 c551241fe873..7c54099b1dc6 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_ */

--
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

Reply via email to