Add a new attribute to connector to change its type. This is mostly cosmetic and don't have direct effect in VKMS behavior.
Signed-off-by: Louis Chauvet <[email protected]> --- Documentation/gpu/vkms.rst | 3 +- drivers/gpu/drm/vkms/vkms_configfs.c | 64 ++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index d4ad4af45414..97ea11a86bd1 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -135,10 +135,11 @@ Last but not least, create one or more connectors:: sudo mkdir /config/vkms/my-vkms/connectors/connector0 -Connectors have 1 configurable attribute: +Connectors have 2 configurable attribute: - status: Connection status: 1 connected, 2 disconnected, 3 unknown (same values as those exposed by the "status" property of a connector) +- type: Type of connector. Same values as exposed by the "type" field in drm_connector. To finish the configuration, link the different pipeline items:: diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c index fd1be7292058..0cf7cee4eb0f 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1123,10 +1123,74 @@ static ssize_t connector_status_store(struct config_item *item, return (ssize_t)count; } +static ssize_t connector_type_show(struct config_item *item, char *page) +{ + struct vkms_configfs_connector *connector; + int type; + + connector = connector_item_to_vkms_configfs_connector(item); + + scoped_guard(mutex, &connector->dev->lock) { + type = vkms_config_connector_get_type(connector->config); + } + + return sprintf(page, "%u", type); +} + +static ssize_t connector_type_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_connector *connector; + int val, ret; + + connector = connector_item_to_vkms_configfs_connector(item); + + ret = kstrtouint(page, 10, &val); + + if (ret) + return ret; + + switch (val) { + case DRM_MODE_CONNECTOR_Unknown: + case DRM_MODE_CONNECTOR_VGA: + case DRM_MODE_CONNECTOR_DVII: + case DRM_MODE_CONNECTOR_DVID: + case DRM_MODE_CONNECTOR_DVIA: + case DRM_MODE_CONNECTOR_Composite: + case DRM_MODE_CONNECTOR_SVIDEO: + case DRM_MODE_CONNECTOR_LVDS: + case DRM_MODE_CONNECTOR_Component: + case DRM_MODE_CONNECTOR_9PinDIN: + case DRM_MODE_CONNECTOR_DisplayPort: + case DRM_MODE_CONNECTOR_HDMIA: + case DRM_MODE_CONNECTOR_HDMIB: + case DRM_MODE_CONNECTOR_TV: + case DRM_MODE_CONNECTOR_eDP: + case DRM_MODE_CONNECTOR_VIRTUAL: + case DRM_MODE_CONNECTOR_DSI: + case DRM_MODE_CONNECTOR_DPI: + case DRM_MODE_CONNECTOR_SPI: + case DRM_MODE_CONNECTOR_USB: + break; + default: + return -EINVAL; + } + + scoped_guard(mutex, &connector->dev->lock) { + if (connector->dev->enabled) + return -EINVAL; + vkms_config_connector_set_type(connector->config, val); + } + + return count; +} + CONFIGFS_ATTR(connector_, status); +CONFIGFS_ATTR(connector_, type); static struct configfs_attribute *connector_item_attrs[] = { &connector_attr_status, + &connector_attr_type, NULL, }; -- 2.51.0
