Skip to content

Commit f97180f

Browse files
JoseExpositolucaceresoli
authored andcommitted
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: Mark Yacoub <markyacoub@google.com> Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com> Reviewed-by: Harry Wentland <harry.wentland@amd.com> Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com> Signed-off-by: José Expósito <jose.exposito89@gmail.com> Link: https://lore.kernel.org/r/20251016175618.10051-17-jose.exposito89@gmail.com Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
1 parent 466f438 commit f97180f

4 files changed

Lines changed: 66 additions & 0 deletions

File tree

Documentation/gpu/vkms.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,11 @@ Last but not least, create one or more connectors::
108108

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

111+
Connectors have 1 configurable attribute:
112+
113+
- status: Connection status: 1 connected, 2 disconnected, 3 unknown (same values
114+
as those exposed by the "status" property of a connector)
115+
111116
To finish the configuration, link the different pipeline items::
112117

113118
sudo ln -s /config/vkms/my-vkms/crtcs/crtc0 /config/vkms/my-vkms/planes/plane0/possible_crtcs

drivers/gpu/drm/vkms/vkms_configfs.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "vkms_drv.h"
88
#include "vkms_config.h"
99
#include "vkms_configfs.h"
10+
#include "vkms_connector.h"
1011

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

516+
static ssize_t connector_status_show(struct config_item *item, char *page)
517+
{
518+
struct vkms_configfs_connector *connector;
519+
enum drm_connector_status status;
520+
521+
connector = connector_item_to_vkms_configfs_connector(item);
522+
523+
scoped_guard(mutex, &connector->dev->lock)
524+
status = vkms_config_connector_get_status(connector->config);
525+
526+
return sprintf(page, "%u", status);
527+
}
528+
529+
static ssize_t connector_status_store(struct config_item *item,
530+
const char *page, size_t count)
531+
{
532+
struct vkms_configfs_connector *connector;
533+
enum drm_connector_status status;
534+
535+
connector = connector_item_to_vkms_configfs_connector(item);
536+
537+
if (kstrtouint(page, 10, &status))
538+
return -EINVAL;
539+
540+
if (status != connector_status_connected &&
541+
status != connector_status_disconnected &&
542+
status != connector_status_unknown)
543+
return -EINVAL;
544+
545+
scoped_guard(mutex, &connector->dev->lock) {
546+
vkms_config_connector_set_status(connector->config, status);
547+
548+
if (connector->dev->enabled)
549+
vkms_trigger_connector_hotplug(connector->dev->config->dev);
550+
}
551+
552+
return (ssize_t)count;
553+
}
554+
555+
CONFIGFS_ATTR(connector_, status);
556+
557+
static struct configfs_attribute *connector_item_attrs[] = {
558+
&connector_attr_status,
559+
NULL,
560+
};
561+
515562
static void connector_release(struct config_item *item)
516563
{
517564
struct vkms_configfs_connector *connector;
@@ -531,6 +578,7 @@ static struct configfs_item_operations connector_item_operations = {
531578
};
532579

533580
static const struct config_item_type connector_item_type = {
581+
.ct_attrs = connector_item_attrs,
534582
.ct_item_ops = &connector_item_operations,
535583
.ct_owner = THIS_MODULE,
536584
};

drivers/gpu/drm/vkms/vkms_connector.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,10 @@ struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev)
8787

8888
return connector;
8989
}
90+
91+
void vkms_trigger_connector_hotplug(struct vkms_device *vkmsdev)
92+
{
93+
struct drm_device *dev = &vkmsdev->drm;
94+
95+
drm_kms_helper_hotplug_event(dev);
96+
}

drivers/gpu/drm/vkms/vkms_connector.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,10 @@ struct vkms_connector {
2626
*/
2727
struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev);
2828

29+
/**
30+
* vkms_trigger_connector_hotplug() - Update the device's connectors status
31+
* @vkmsdev: VKMS device to update
32+
*/
33+
void vkms_trigger_connector_hotplug(struct vkms_device *vkmsdev);
34+
2935
#endif /* _VKMS_CONNECTOR_H_ */

0 commit comments

Comments
 (0)