* [PATCH 00/16] drm/vkms: Add configfs support
@ 2025-02-18 17:07 José Expósito
2025-02-18 17:07 ` [PATCH 01/16] drm/vkms: Expose device creation and destruction José Expósito
` (16 more replies)
0 siblings, 17 replies; 30+ messages in thread
From: José Expósito @ 2025-02-18 17:07 UTC (permalink / raw)
To: louis.chauvet
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel,
José Expósito
Hi everyone,
This series, to be applied on top of [1], allow to configure one or more VKMS
instances without having to reload the driver using configfs.
The series is structured in 3 blocks:
- Patches 1..11: Basic device configuration. For simplicity, I kept the
available options as minimal as possible.
- Patches 12, 13 and 14: Allow to hot-plug and unplug connectors. This is not
part of the minimal set of options, but I included in this series so it can
be used as a template/example of how new configurations can be added.
- Patches 15 and 16: New option to skip the default device creation and to-do
cleanup.
The process of configuring a VKMS device is documented in "vkms.rst".
Finally, the code is thoroughly tested by a collection of IGT tests [2].
Best wishes,
José Expósito
[1] https://lore.kernel.org/all/20250218101214.5790-1-jose.exposito89@gmail.com/
[2] It is not in patchwork yet, but it'll appear here eventually:
https://patchwork.freedesktop.org/project/igt/patches/?submitter=19782&state=*&q=&archive=both&delegate=
José Expósito (16):
drm/vkms: Expose device creation and destruction
drm/vkms: Add and remove VKMS instances via configfs
drm/vkms: Allow to configure multiple planes via configfs
drm/vkms: Allow to configure the plane type via configfs
drm/vkms: Allow to configure multiple CRTCs via configfs
drm/vkms: Allow to configure CRTC writeback support via configfs
drm/vkms: Allow to attach planes and CRTCs via configfs
drm/vkms: Allow to configure multiple encoders via configfs
drm/vkms: Allow to attach encoders and CRTCs via configfs
drm/vkms: Allow to configure multiple connectors via configfs
drm/vkms: Allow to attach connectors and encoders via configfs
drm/vkms: Allow to configure connector status
drm/vkms: Allow to update the connector status
drm/vkms: Allow to configure connector status via configfs
drm/vkms: Allow to configure the default device creation
drm/vkms: Remove completed task from the TODO list
Documentation/gpu/vkms.rst | 98 +-
drivers/gpu/drm/vkms/Kconfig | 1 +
drivers/gpu/drm/vkms/Makefile | 3 +-
drivers/gpu/drm/vkms/tests/vkms_config_test.c | 24 +
drivers/gpu/drm/vkms/vkms_config.c | 8 +-
drivers/gpu/drm/vkms/vkms_config.h | 26 +
drivers/gpu/drm/vkms/vkms_configfs.c | 918 ++++++++++++++++++
drivers/gpu/drm/vkms/vkms_configfs.h | 8 +
drivers/gpu/drm/vkms/vkms_connector.c | 26 +-
drivers/gpu/drm/vkms/vkms_connector.h | 18 +-
drivers/gpu/drm/vkms/vkms_drv.c | 18 +-
drivers/gpu/drm/vkms/vkms_drv.h | 4 +
drivers/gpu/drm/vkms/vkms_output.c | 2 +-
13 files changed, 1138 insertions(+), 16 deletions(-)
create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.c
create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.h
base-commit: 9b6c03cb96b9e19bce2c2764d2c6dd4ccbd06c5d
prerequisite-patch-id: 1bff7bbc4ef0e29266265ac3dc009011c046f745
prerequisite-patch-id: 74a284d40a426a0038a7054068192238f7658187
prerequisite-patch-id: c3e34e88ad6a0acf7d9ded0cdb4745a87cf6fd82
prerequisite-patch-id: 9cd0dfaf8e21a811edbe5a2da7185b6f9055d42d
prerequisite-patch-id: f50c41578b639370a5d610af6f25c2077321a886
prerequisite-patch-id: 5a7219a51e42de002b8dbf94ec8af96320043489
prerequisite-patch-id: 67ea5d4e21b4ce4acbd6fc3ce83017f55811c49b
prerequisite-patch-id: 37a7fab113a32581f053c09f45efb137afd75a1b
prerequisite-patch-id: 475bcdc6267f4b02fb1bb2379145529c33684e4f
prerequisite-patch-id: d3114f0b3da3d8b5ad64692df761f1cf42fbdf12
prerequisite-patch-id: d1d9280fb056130df2050a09b7ea7e7ddde007c5
prerequisite-patch-id: 2c370f3de6d227fa8881212207978cce7bbb18ba
prerequisite-patch-id: 938b8fe5437e5f7bc22bffc55ae249a27d399d66
prerequisite-patch-id: ab0a510994fbe9985dc46a3d35e6d0574ddbb633
--
2.48.1
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 01/16] drm/vkms: Expose device creation and destruction
2025-02-18 17:07 [PATCH 00/16] drm/vkms: Add configfs support José Expósito
@ 2025-02-18 17:07 ` José Expósito
2025-02-25 11:02 ` Louis Chauvet
2025-02-18 17:07 ` [PATCH 02/16] drm/vkms: Add and remove VKMS instances via configfs José Expósito
` (15 subsequent siblings)
16 siblings, 1 reply; 30+ messages in thread
From: José Expósito @ 2025-02-18 17:07 UTC (permalink / raw)
To: louis.chauvet
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel,
José Expósito
In preparation for configfs support, expose vkms_create() and
vkms_destroy().
Co-developed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
drivers/gpu/drm/vkms/vkms_drv.c | 4 ++--
drivers/gpu/drm/vkms/vkms_drv.h | 4 ++++
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
index a24d1655f7b8..23817c7b997e 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.c
+++ b/drivers/gpu/drm/vkms/vkms_drv.c
@@ -146,7 +146,7 @@ static int vkms_modeset_init(struct vkms_device *vkmsdev)
return vkms_output_init(vkmsdev);
}
-static int vkms_create(struct vkms_config *config)
+int vkms_create(struct vkms_config *config)
{
int ret;
struct platform_device *pdev;
@@ -229,7 +229,7 @@ static int __init vkms_init(void)
return 0;
}
-static void vkms_destroy(struct vkms_config *config)
+void vkms_destroy(struct vkms_config *config)
{
struct platform_device *pdev;
diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index a74a7fc3a056..0fe08cd0c461 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -223,6 +223,10 @@ struct vkms_device {
#define to_vkms_plane_state(target)\
container_of(target, struct vkms_plane_state, base.base)
+/* VKMS device */
+int vkms_create(struct vkms_config *config);
+void vkms_destroy(struct vkms_config *config);
+
/**
* vkms_crtc_init() - Initialize a CRTC for VKMS
* @dev: DRM device associated with the VKMS buffer
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 02/16] drm/vkms: Add and remove VKMS instances via configfs
2025-02-18 17:07 [PATCH 00/16] drm/vkms: Add configfs support José Expósito
2025-02-18 17:07 ` [PATCH 01/16] drm/vkms: Expose device creation and destruction José Expósito
@ 2025-02-18 17:07 ` José Expósito
2025-02-25 11:02 ` Louis Chauvet
2025-02-18 17:07 ` [PATCH 03/16] drm/vkms: Allow to configure multiple planes " José Expósito
` (14 subsequent siblings)
16 siblings, 1 reply; 30+ messages in thread
From: José Expósito @ 2025-02-18 17:07 UTC (permalink / raw)
To: louis.chauvet
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel,
José Expósito
Allow to create, enable, disable and destroy VKMS instances using
configfs.
For the moment, it is not possible to add pipeline items, so trying to
enable the device will fail printing an informative error to the log.
Co-developed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
Documentation/gpu/vkms.rst | 32 +++++
drivers/gpu/drm/vkms/Kconfig | 1 +
drivers/gpu/drm/vkms/Makefile | 3 +-
drivers/gpu/drm/vkms/vkms_configfs.c | 181 +++++++++++++++++++++++++++
drivers/gpu/drm/vkms/vkms_configfs.h | 8 ++
drivers/gpu/drm/vkms/vkms_drv.c | 7 ++
6 files changed, 231 insertions(+), 1 deletion(-)
create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.c
create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.h
diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index ba04ac7c2167..423bdf86b5b1 100644
--- a/Documentation/gpu/vkms.rst
+++ b/Documentation/gpu/vkms.rst
@@ -51,6 +51,38 @@ To disable the driver, use ::
sudo modprobe -r vkms
+Configuring With Configfs
+=========================
+
+It is possible to create and configure multiple VKMS instances via configfs.
+
+Start by mounting configfs and loading VKMS::
+
+ sudo mount -t configfs none /config
+ sudo modprobe vkms
+
+Once VKMS is loaded, ``/config/vkms`` is created automatically. Each directory
+under ``/config/vkms`` represents a VKMS instance, create a new one::
+
+ sudo mkdir /config/vkms/my-vkms
+
+By default, the instance is disabled::
+
+ cat /config/vkms/my-vkms/enabled
+ 0
+
+Once you are done configuring the VKMS instance, enable it::
+
+ echo "1" | sudo tee /config/vkms/my-vkms/enabled
+
+Finally, you can remove the VKMS instance disabling it::
+
+ echo "0" | sudo tee /config/vkms/my-vkms/enabled
+
+And removing the top level directory::
+
+ sudo rmdir /config/vkms/my-vkms
+
Testing With IGT
================
diff --git a/drivers/gpu/drm/vkms/Kconfig b/drivers/gpu/drm/vkms/Kconfig
index 3c02f928ffe6..3977bbb99f7d 100644
--- a/drivers/gpu/drm/vkms/Kconfig
+++ b/drivers/gpu/drm/vkms/Kconfig
@@ -7,6 +7,7 @@ config DRM_VKMS
select DRM_KMS_HELPER
select DRM_GEM_SHMEM_HELPER
select CRC32
+ select CONFIGFS_FS
default n
help
Virtual Kernel Mode-Setting (VKMS) is used for testing or for
diff --git a/drivers/gpu/drm/vkms/Makefile b/drivers/gpu/drm/vkms/Makefile
index d657865e573f..939991fc8233 100644
--- a/drivers/gpu/drm/vkms/Makefile
+++ b/drivers/gpu/drm/vkms/Makefile
@@ -8,7 +8,8 @@ vkms-y := \
vkms_composer.o \
vkms_writeback.o \
vkms_connector.o \
- vkms_config.o
+ vkms_config.o \
+ vkms_configfs.o
obj-$(CONFIG_DRM_VKMS) += vkms.o
obj-$(CONFIG_DRM_VKMS_KUNIT_TEST) += tests/
diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c
new file mode 100644
index 000000000000..306f571559b7
--- /dev/null
+++ b/drivers/gpu/drm/vkms/vkms_configfs.c
@@ -0,0 +1,181 @@
+// SPDX-License-Identifier: GPL-2.0+
+#include <linux/configfs.h>
+#include <linux/mutex.h>
+#include <linux/slab.h>
+
+#include "vkms_drv.h"
+#include "vkms_config.h"
+#include "vkms_configfs.h"
+
+/* To avoid registering configfs more than once or unregistering on error */
+static bool is_configfs_registered;
+
+/**
+ * struct vkms_configfs_device - Configfs representation of a VKMS device
+ *
+ * @group: Top level configuration group that represents a VKMS device.
+ * Initialized when a new directory is created under "/config/vkms/"
+ * @lock: Lock used to project concurrent access to the configuration attributes
+ * @config: Protected by @lock. Configuration of the VKMS device
+ * @enabled: Protected by @lock. The device is created or destroyed when this
+ * option changes
+ */
+struct vkms_configfs_device {
+ struct config_group group;
+
+ struct mutex lock;
+ struct vkms_config *config;
+ bool enabled;
+};
+
+#define device_item_to_vkms_configfs_device(item) \
+ container_of(to_config_group((item)), struct vkms_configfs_device, \
+ group)
+
+static ssize_t device_enabled_show(struct config_item *item, char *page)
+{
+ struct vkms_configfs_device *dev;
+ bool enabled;
+
+ dev = device_item_to_vkms_configfs_device(item);
+
+ mutex_lock(&dev->lock);
+ enabled = dev->enabled;
+ mutex_unlock(&dev->lock);
+
+ return sprintf(page, "%d\n", enabled);
+}
+
+static ssize_t device_enabled_store(struct config_item *item, const char *page,
+ size_t count)
+{
+ struct vkms_configfs_device *dev;
+ bool enabled;
+ int ret = 0;
+
+ dev = device_item_to_vkms_configfs_device(item);
+
+ if (kstrtobool(page, &enabled))
+ return -EINVAL;
+
+ mutex_lock(&dev->lock);
+
+ if (!dev->enabled && enabled) {
+ if (!vkms_config_is_valid(dev->config)) {
+ ret = -EINVAL;
+ goto err_unlock;
+ }
+
+ ret = vkms_create(dev->config);
+ } else if (dev->enabled && !enabled) {
+ vkms_destroy(dev->config);
+ }
+
+ if (ret)
+ goto err_unlock;
+
+ dev->enabled = enabled;
+
+ mutex_unlock(&dev->lock);
+
+ return (ssize_t)count;
+
+err_unlock:
+ mutex_unlock(&dev->lock);
+ return ret;
+}
+
+CONFIGFS_ATTR(device_, enabled);
+
+static struct configfs_attribute *device_item_attrs[] = {
+ &device_attr_enabled,
+ NULL,
+};
+
+static void device_release(struct config_item *item)
+{
+ struct vkms_configfs_device *dev;
+
+ dev = device_item_to_vkms_configfs_device(item);
+
+ if (dev->enabled)
+ vkms_destroy(dev->config);
+
+ mutex_destroy(&dev->lock);
+ vkms_config_destroy(dev->config);
+ kfree(dev);
+}
+
+static struct configfs_item_operations device_item_operations = {
+ .release = &device_release,
+};
+
+static const struct config_item_type device_item_type = {
+ .ct_attrs = device_item_attrs,
+ .ct_item_ops = &device_item_operations,
+ .ct_owner = THIS_MODULE,
+};
+
+static struct config_group *make_device_group(struct config_group *group,
+ const char *name)
+{
+ struct vkms_configfs_device *dev;
+
+ if (strcmp(name, DEFAULT_DEVICE_NAME) == 0)
+ return ERR_PTR(-EINVAL);
+
+ dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+ if (!dev)
+ return ERR_PTR(-ENOMEM);
+
+ dev->config = vkms_config_create(name);
+ if (IS_ERR(dev->config)) {
+ kfree(dev);
+ return ERR_CAST(dev->config);
+ }
+
+ config_group_init_type_name(&dev->group, name, &device_item_type);
+ mutex_init(&dev->lock);
+
+ return &dev->group;
+}
+
+static struct configfs_group_operations device_group_ops = {
+ .make_group = &make_device_group,
+};
+
+static const struct config_item_type device_group_type = {
+ .ct_group_ops = &device_group_ops,
+ .ct_owner = THIS_MODULE,
+};
+
+static struct configfs_subsystem vkms_subsys = {
+ .su_group = {
+ .cg_item = {
+ .ci_name = "vkms",
+ .ci_type = &device_group_type,
+ },
+ },
+ .su_mutex = __MUTEX_INITIALIZER(vkms_subsys.su_mutex),
+};
+
+int vkms_configfs_register(void)
+{
+ int ret;
+
+ if (is_configfs_registered)
+ return 0;
+
+ config_group_init(&vkms_subsys.su_group);
+ ret = configfs_register_subsystem(&vkms_subsys);
+
+ is_configfs_registered = ret == 0;
+
+ return ret;
+}
+
+void vkms_configfs_unregister(void)
+{
+ if (is_configfs_registered)
+ configfs_unregister_subsystem(&vkms_subsys);
+}
diff --git a/drivers/gpu/drm/vkms/vkms_configfs.h b/drivers/gpu/drm/vkms/vkms_configfs.h
new file mode 100644
index 000000000000..e9020b0043db
--- /dev/null
+++ b/drivers/gpu/drm/vkms/vkms_configfs.h
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+#ifndef _VKMS_CONFIGFS_H_
+#define _VKMS_CONFIGFS_H_
+
+int vkms_configfs_register(void);
+void vkms_configfs_unregister(void);
+
+#endif /* _VKMS_CONFIGFS_H_ */
diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
index 23817c7b997e..5bcfbcb6c0c5 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.c
+++ b/drivers/gpu/drm/vkms/vkms_drv.c
@@ -28,6 +28,7 @@
#include <drm/drm_vblank.h>
#include "vkms_config.h"
+#include "vkms_configfs.h"
#include "vkms_drv.h"
#define DRIVER_NAME "vkms"
@@ -214,6 +215,10 @@ static int __init vkms_init(void)
int ret;
struct vkms_config *config;
+ ret = vkms_configfs_register();
+ if (ret)
+ return ret;
+
config = vkms_config_default_create(enable_cursor, enable_writeback, enable_overlay);
if (IS_ERR(config))
return PTR_ERR(config);
@@ -250,6 +255,8 @@ void vkms_destroy(struct vkms_config *config)
static void __exit vkms_exit(void)
{
+ vkms_configfs_unregister();
+
if (!default_config)
return;
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 03/16] drm/vkms: Allow to configure multiple planes via configfs
2025-02-18 17:07 [PATCH 00/16] drm/vkms: Add configfs support José Expósito
2025-02-18 17:07 ` [PATCH 01/16] drm/vkms: Expose device creation and destruction José Expósito
2025-02-18 17:07 ` [PATCH 02/16] drm/vkms: Add and remove VKMS instances via configfs José Expósito
@ 2025-02-18 17:07 ` José Expósito
2025-02-25 11:01 ` Louis Chauvet
2025-02-25 11:02 ` Louis Chauvet
2025-02-18 17:07 ` [PATCH 04/16] drm/vkms: Allow to configure the plane type " José Expósito
` (13 subsequent siblings)
16 siblings, 2 replies; 30+ messages in thread
From: José Expósito @ 2025-02-18 17:07 UTC (permalink / raw)
To: louis.chauvet
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel,
José Expósito
Create a default subgroup at /config/vkms/planes to allow to create as
many planes as required.
Co-developed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
Documentation/gpu/vkms.rst | 16 ++++-
drivers/gpu/drm/vkms/vkms_configfs.c | 101 +++++++++++++++++++++++++++
2 files changed, 116 insertions(+), 1 deletion(-)
diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index 423bdf86b5b1..bf23d0da33fe 100644
--- a/Documentation/gpu/vkms.rst
+++ b/Documentation/gpu/vkms.rst
@@ -71,6 +71,19 @@ By default, the instance is disabled::
cat /config/vkms/my-vkms/enabled
0
+And directories are created for each configurable item of the display pipeline::
+
+ tree /config/vkms/my-vkms
+ ├── enabled
+ └── planes
+
+To add items to the display pipeline, create one or more directories under the
+available paths.
+
+Start by creating one or more planes::
+
+ sudo mkdir /config/vkms/my-vkms/planes/plane0
+
Once you are done configuring the VKMS instance, enable it::
echo "1" | sudo tee /config/vkms/my-vkms/enabled
@@ -79,8 +92,9 @@ Finally, you can remove the VKMS instance disabling it::
echo "0" | sudo tee /config/vkms/my-vkms/enabled
-And removing the top level directory::
+And removing the top level directory and its subdirectories::
+ sudo rmdir /config/vkms/my-vkms/planes/*
sudo rmdir /config/vkms/my-vkms
Testing With IGT
diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c
index 306f571559b7..dd9dfe51eb3a 100644
--- a/drivers/gpu/drm/vkms/vkms_configfs.c
+++ b/drivers/gpu/drm/vkms/vkms_configfs.c
@@ -15,6 +15,7 @@ static bool is_configfs_registered;
*
* @group: Top level configuration group that represents a VKMS device.
* Initialized when a new directory is created under "/config/vkms/"
+ * @planes_group: Default subgroup of @group at "/config/vkms/planes"
* @lock: Lock used to project concurrent access to the configuration attributes
* @config: Protected by @lock. Configuration of the VKMS device
* @enabled: Protected by @lock. The device is created or destroyed when this
@@ -22,16 +23,112 @@ static bool is_configfs_registered;
*/
struct vkms_configfs_device {
struct config_group group;
+ struct config_group planes_group;
struct mutex lock;
struct vkms_config *config;
bool enabled;
};
+/**
+ * struct vkms_configfs_plane - Configfs representation of a plane
+ *
+ * @group: Top level configuration group that represents a plane.
+ * Initialized when a new directory is created under "/config/vkms/planes"
+ * @dev: The vkms_configfs_device this plane belongs to
+ * @config: Configuration of the VKMS plane
+ */
+struct vkms_configfs_plane {
+ struct config_group group;
+ struct vkms_configfs_device *dev;
+ struct vkms_config_plane *config;
+};
+
#define device_item_to_vkms_configfs_device(item) \
container_of(to_config_group((item)), struct vkms_configfs_device, \
group)
+#define child_group_to_vkms_configfs_device(group) \
+ device_item_to_vkms_configfs_device((&(group)->cg_item)->ci_parent)
+
+#define plane_item_to_vkms_configfs_plane(item) \
+ container_of(to_config_group((item)), struct vkms_configfs_plane, group)
+
+static void plane_release(struct config_item *item)
+{
+ struct vkms_configfs_plane *plane;
+ struct mutex *lock;
+
+ plane = plane_item_to_vkms_configfs_plane(item);
+ lock = &plane->dev->lock;
+
+ mutex_lock(lock);
+ vkms_config_destroy_plane(plane->config);
+ kfree(plane);
+ mutex_unlock(lock);
+}
+
+static struct configfs_item_operations plane_item_operations = {
+ .release = &plane_release,
+};
+
+static const struct config_item_type plane_item_type = {
+ .ct_item_ops = &plane_item_operations,
+ .ct_owner = THIS_MODULE,
+};
+
+static struct config_group *make_plane_group(struct config_group *group,
+ const char *name)
+{
+ struct vkms_configfs_device *dev;
+ struct vkms_configfs_plane *plane;
+ int ret;
+
+ dev = child_group_to_vkms_configfs_device(group);
+
+ mutex_lock(&dev->lock);
+
+ if (dev->enabled) {
+ ret = -EINVAL;
+ goto err_unlock;
+ }
+
+ plane = kzalloc(sizeof(*plane), GFP_KERNEL);
+ if (!plane) {
+ ret = -ENOMEM;
+ goto err_unlock;
+ }
+
+ plane->dev = dev;
+
+ plane->config = vkms_config_create_plane(dev->config);
+ if (IS_ERR(plane->config)) {
+ ret = PTR_ERR(plane->config);
+ goto err_free;
+ }
+
+ config_group_init_type_name(&plane->group, name, &plane_item_type);
+
+ mutex_unlock(&dev->lock);
+
+ return &plane->group;
+
+err_free:
+ kfree(plane);
+err_unlock:
+ mutex_unlock(&dev->lock);
+ return ERR_PTR(ret);
+}
+
+static struct configfs_group_operations planes_group_operations = {
+ .make_group = &make_plane_group,
+};
+
+static const struct config_item_type plane_group_type = {
+ .ct_group_ops = &planes_group_operations,
+ .ct_owner = THIS_MODULE,
+};
+
static ssize_t device_enabled_show(struct config_item *item, char *page)
{
struct vkms_configfs_device *dev;
@@ -137,6 +234,10 @@ static struct config_group *make_device_group(struct config_group *group,
config_group_init_type_name(&dev->group, name, &device_item_type);
mutex_init(&dev->lock);
+ config_group_init_type_name(&dev->planes_group, "planes",
+ &plane_group_type);
+ configfs_add_default_group(&dev->planes_group, &dev->group);
+
return &dev->group;
}
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 04/16] drm/vkms: Allow to configure the plane type via configfs
2025-02-18 17:07 [PATCH 00/16] drm/vkms: Add configfs support José Expósito
` (2 preceding siblings ...)
2025-02-18 17:07 ` [PATCH 03/16] drm/vkms: Allow to configure multiple planes " José Expósito
@ 2025-02-18 17:07 ` José Expósito
2025-02-25 11:02 ` Louis Chauvet
2025-02-18 17:07 ` [PATCH 05/16] drm/vkms: Allow to configure multiple CRTCs " José Expósito
` (12 subsequent siblings)
16 siblings, 1 reply; 30+ messages in thread
From: José Expósito @ 2025-02-18 17:07 UTC (permalink / raw)
To: louis.chauvet
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel,
José Expósito
When a plane is created, add a `type` file to allow to set the type:
- 0 overlay
- 1 primary
- 2 cursor
Co-developed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
Documentation/gpu/vkms.rst | 4 +++
drivers/gpu/drm/vkms/vkms_configfs.c | 51 ++++++++++++++++++++++++++++
2 files changed, 55 insertions(+)
diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index bf23d0da33fe..d95f228de05b 100644
--- a/Documentation/gpu/vkms.rst
+++ b/Documentation/gpu/vkms.rst
@@ -84,6 +84,10 @@ Start by creating one or more planes::
sudo mkdir /config/vkms/my-vkms/planes/plane0
+Planes have 1 configurable attribute:
+
+- type: Plane type: 0 overlay, 1 primary, 2 cursor
+
Once you are done configuring the VKMS instance, enable it::
echo "1" | sudo tee /config/vkms/my-vkms/enabled
diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c
index dd9dfe51eb3a..093735f47858 100644
--- a/drivers/gpu/drm/vkms/vkms_configfs.c
+++ b/drivers/gpu/drm/vkms/vkms_configfs.c
@@ -54,6 +54,56 @@ struct vkms_configfs_plane {
#define plane_item_to_vkms_configfs_plane(item) \
container_of(to_config_group((item)), struct vkms_configfs_plane, group)
+static ssize_t plane_type_show(struct config_item *item, char *page)
+{
+ struct vkms_configfs_plane *plane;
+ enum drm_plane_type type;
+
+ plane = plane_item_to_vkms_configfs_plane(item);
+
+ mutex_lock(&plane->dev->lock);
+ type = vkms_config_plane_get_type(plane->config);
+ mutex_unlock(&plane->dev->lock);
+
+ return sprintf(page, "%u", type);
+}
+
+static ssize_t plane_type_store(struct config_item *item, const char *page,
+ size_t count)
+{
+ struct vkms_configfs_plane *plane;
+ enum drm_plane_type type;
+
+ plane = plane_item_to_vkms_configfs_plane(item);
+
+ if (kstrtouint(page, 10, &type))
+ return -EINVAL;
+
+ if (type != DRM_PLANE_TYPE_OVERLAY && type != DRM_PLANE_TYPE_PRIMARY &&
+ type != DRM_PLANE_TYPE_CURSOR)
+ return -EINVAL;
+
+ mutex_lock(&plane->dev->lock);
+
+ if (plane->dev->enabled) {
+ mutex_unlock(&plane->dev->lock);
+ return -EPERM;
+ }
+
+ vkms_config_plane_set_type(plane->config, type);
+
+ mutex_unlock(&plane->dev->lock);
+
+ return (ssize_t)count;
+}
+
+CONFIGFS_ATTR(plane_, type);
+
+static struct configfs_attribute *plane_item_attrs[] = {
+ &plane_attr_type,
+ NULL,
+};
+
static void plane_release(struct config_item *item)
{
struct vkms_configfs_plane *plane;
@@ -73,6 +123,7 @@ static struct configfs_item_operations plane_item_operations = {
};
static const struct config_item_type plane_item_type = {
+ .ct_attrs = plane_item_attrs,
.ct_item_ops = &plane_item_operations,
.ct_owner = THIS_MODULE,
};
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 05/16] drm/vkms: Allow to configure multiple CRTCs via configfs
2025-02-18 17:07 [PATCH 00/16] drm/vkms: Add configfs support José Expósito
` (3 preceding siblings ...)
2025-02-18 17:07 ` [PATCH 04/16] drm/vkms: Allow to configure the plane type " José Expósito
@ 2025-02-18 17:07 ` José Expósito
2025-02-25 11:02 ` Louis Chauvet
2025-02-18 17:07 ` [PATCH 06/16] drm/vkms: Allow to configure CRTC writeback support " José Expósito
` (11 subsequent siblings)
16 siblings, 1 reply; 30+ messages in thread
From: José Expósito @ 2025-02-18 17:07 UTC (permalink / raw)
To: louis.chauvet
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel,
José Expósito
Create a default subgroup at /config/vkms/crtcs to allow to create as
many CRTCs as required.
Co-developed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
Documentation/gpu/vkms.rst | 6 ++
drivers/gpu/drm/vkms/vkms_configfs.c | 98 ++++++++++++++++++++++++++++
2 files changed, 104 insertions(+)
diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index d95f228de05b..da5157adfd79 100644
--- a/Documentation/gpu/vkms.rst
+++ b/Documentation/gpu/vkms.rst
@@ -74,6 +74,7 @@ By default, the instance is disabled::
And directories are created for each configurable item of the display pipeline::
tree /config/vkms/my-vkms
+ ├── crtcs
├── enabled
└── planes
@@ -88,6 +89,10 @@ Planes have 1 configurable attribute:
- type: Plane type: 0 overlay, 1 primary, 2 cursor
+Continue by creating one or more CRTCs::
+
+ sudo mkdir /config/vkms/my-vkms/crtcs/crtc0
+
Once you are done configuring the VKMS instance, enable it::
echo "1" | sudo tee /config/vkms/my-vkms/enabled
@@ -99,6 +104,7 @@ Finally, you can remove the VKMS instance disabling it::
And removing the top level directory and its subdirectories::
sudo rmdir /config/vkms/my-vkms/planes/*
+ sudo rmdir /config/vkms/my-vkms/crtcs/*
sudo rmdir /config/vkms/my-vkms
Testing With IGT
diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c
index 093735f47858..52205a8a9cb4 100644
--- a/drivers/gpu/drm/vkms/vkms_configfs.c
+++ b/drivers/gpu/drm/vkms/vkms_configfs.c
@@ -16,6 +16,7 @@ static bool is_configfs_registered;
* @group: Top level configuration group that represents a VKMS device.
* Initialized when a new directory is created under "/config/vkms/"
* @planes_group: Default subgroup of @group at "/config/vkms/planes"
+ * @crtcs_group: Default subgroup of @group at "/config/vkms/crtcs"
* @lock: Lock used to project concurrent access to the configuration attributes
* @config: Protected by @lock. Configuration of the VKMS device
* @enabled: Protected by @lock. The device is created or destroyed when this
@@ -24,6 +25,7 @@ static bool is_configfs_registered;
struct vkms_configfs_device {
struct config_group group;
struct config_group planes_group;
+ struct config_group crtcs_group;
struct mutex lock;
struct vkms_config *config;
@@ -44,6 +46,20 @@ struct vkms_configfs_plane {
struct vkms_config_plane *config;
};
+/**
+ * struct vkms_configfs_crtc - Configfs representation of a CRTC
+ *
+ * @group: Top level configuration group that represents a CRTC.
+ * Initialized when a new directory is created under "/config/vkms/crtcs"
+ * @dev: The vkms_configfs_device this CRTC belongs to
+ * @config: Configuration of the VKMS CRTC
+ */
+struct vkms_configfs_crtc {
+ struct config_group group;
+ struct vkms_configfs_device *dev;
+ struct vkms_config_crtc *config;
+};
+
#define device_item_to_vkms_configfs_device(item) \
container_of(to_config_group((item)), struct vkms_configfs_device, \
group)
@@ -54,6 +70,84 @@ struct vkms_configfs_plane {
#define plane_item_to_vkms_configfs_plane(item) \
container_of(to_config_group((item)), struct vkms_configfs_plane, group)
+#define crtc_item_to_vkms_configfs_crtc(item) \
+ container_of(to_config_group((item)), struct vkms_configfs_crtc, group)
+
+static void crtc_release(struct config_item *item)
+{
+ struct vkms_configfs_crtc *crtc;
+ struct mutex *lock;
+
+ crtc = crtc_item_to_vkms_configfs_crtc(item);
+ lock = &crtc->dev->lock;
+
+ mutex_lock(lock);
+ vkms_config_destroy_crtc(crtc->dev->config, crtc->config);
+ kfree(crtc);
+ mutex_unlock(lock);
+}
+
+static struct configfs_item_operations crtc_item_operations = {
+ .release = &crtc_release,
+};
+
+static const struct config_item_type crtc_item_type = {
+ .ct_item_ops = &crtc_item_operations,
+ .ct_owner = THIS_MODULE,
+};
+
+static struct config_group *make_crtc_group(struct config_group *group,
+ const char *name)
+{
+ struct vkms_configfs_device *dev;
+ struct vkms_configfs_crtc *crtc;
+ int ret;
+
+ dev = child_group_to_vkms_configfs_device(group);
+
+ mutex_lock(&dev->lock);
+
+ if (dev->enabled) {
+ ret = -EINVAL;
+ goto err_unlock;
+ }
+
+ crtc = kzalloc(sizeof(*crtc), GFP_KERNEL);
+ if (!crtc) {
+ ret = -ENOMEM;
+ goto err_unlock;
+ }
+
+ crtc->dev = dev;
+
+ crtc->config = vkms_config_create_crtc(dev->config);
+ if (IS_ERR(crtc->config)) {
+ ret = PTR_ERR(crtc->config);
+ goto err_free;
+ }
+
+ config_group_init_type_name(&crtc->group, name, &crtc_item_type);
+
+ mutex_unlock(&dev->lock);
+
+ return &crtc->group;
+
+err_free:
+ kfree(crtc);
+err_unlock:
+ mutex_unlock(&dev->lock);
+ return ERR_PTR(ret);
+}
+
+static struct configfs_group_operations crtcs_group_operations = {
+ .make_group = &make_crtc_group,
+};
+
+static const struct config_item_type crtc_group_type = {
+ .ct_group_ops = &crtcs_group_operations,
+ .ct_owner = THIS_MODULE,
+};
+
static ssize_t plane_type_show(struct config_item *item, char *page)
{
struct vkms_configfs_plane *plane;
@@ -289,6 +383,10 @@ static struct config_group *make_device_group(struct config_group *group,
&plane_group_type);
configfs_add_default_group(&dev->planes_group, &dev->group);
+ config_group_init_type_name(&dev->crtcs_group, "crtcs",
+ &crtc_group_type);
+ configfs_add_default_group(&dev->crtcs_group, &dev->group);
+
return &dev->group;
}
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 06/16] drm/vkms: Allow to configure CRTC writeback support via configfs
2025-02-18 17:07 [PATCH 00/16] drm/vkms: Add configfs support José Expósito
` (4 preceding siblings ...)
2025-02-18 17:07 ` [PATCH 05/16] drm/vkms: Allow to configure multiple CRTCs " José Expósito
@ 2025-02-18 17:07 ` José Expósito
2025-02-25 11:02 ` Louis Chauvet
2025-02-18 17:07 ` [PATCH 07/16] drm/vkms: Allow to attach planes and CRTCs " José Expósito
` (10 subsequent siblings)
16 siblings, 1 reply; 30+ messages in thread
From: José Expósito @ 2025-02-18 17:07 UTC (permalink / raw)
To: louis.chauvet
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel,
José Expósito
When a CRTC is created, add a `writeback` file to allow to enable or
disable writeback connector support
Co-developed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
Documentation/gpu/vkms.rst | 4 +++
drivers/gpu/drm/vkms/vkms_configfs.c | 47 ++++++++++++++++++++++++++++
2 files changed, 51 insertions(+)
diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index da5157adfd79..4e87d8a81844 100644
--- a/Documentation/gpu/vkms.rst
+++ b/Documentation/gpu/vkms.rst
@@ -93,6 +93,10 @@ Continue by creating one or more CRTCs::
sudo mkdir /config/vkms/my-vkms/crtcs/crtc0
+CRTCs have 1 configurable attribute:
+
+- writeback: Enable or disable writeback connector support
+
Once you are done configuring the VKMS instance, enable it::
echo "1" | sudo tee /config/vkms/my-vkms/enabled
diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c
index 52205a8a9cb4..88037a57a138 100644
--- a/drivers/gpu/drm/vkms/vkms_configfs.c
+++ b/drivers/gpu/drm/vkms/vkms_configfs.c
@@ -73,6 +73,52 @@ struct vkms_configfs_crtc {
#define crtc_item_to_vkms_configfs_crtc(item) \
container_of(to_config_group((item)), struct vkms_configfs_crtc, group)
+static ssize_t crtc_writeback_show(struct config_item *item, char *page)
+{
+ struct vkms_configfs_crtc *crtc;
+ bool writeback;
+
+ crtc = crtc_item_to_vkms_configfs_crtc(item);
+
+ mutex_lock(&crtc->dev->lock);
+ writeback = vkms_config_crtc_get_writeback(crtc->config);
+ mutex_unlock(&crtc->dev->lock);
+
+ return sprintf(page, "%d\n", writeback);
+}
+
+static ssize_t crtc_writeback_store(struct config_item *item, const char *page,
+ size_t count)
+{
+ struct vkms_configfs_crtc *crtc;
+ bool writeback;
+
+ crtc = crtc_item_to_vkms_configfs_crtc(item);
+
+ if (kstrtobool(page, &writeback))
+ return -EINVAL;
+
+ mutex_lock(&crtc->dev->lock);
+
+ if (crtc->dev->enabled) {
+ mutex_unlock(&crtc->dev->lock);
+ return -EPERM;
+ }
+
+ vkms_config_crtc_set_writeback(crtc->config, writeback);
+
+ mutex_unlock(&crtc->dev->lock);
+
+ return (ssize_t)count;
+}
+
+CONFIGFS_ATTR(crtc_, writeback);
+
+static struct configfs_attribute *crtc_item_attrs[] = {
+ &crtc_attr_writeback,
+ NULL,
+};
+
static void crtc_release(struct config_item *item)
{
struct vkms_configfs_crtc *crtc;
@@ -92,6 +138,7 @@ static struct configfs_item_operations crtc_item_operations = {
};
static const struct config_item_type crtc_item_type = {
+ .ct_attrs = crtc_item_attrs,
.ct_item_ops = &crtc_item_operations,
.ct_owner = THIS_MODULE,
};
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 07/16] drm/vkms: Allow to attach planes and CRTCs via configfs
2025-02-18 17:07 [PATCH 00/16] drm/vkms: Add configfs support José Expósito
` (5 preceding siblings ...)
2025-02-18 17:07 ` [PATCH 06/16] drm/vkms: Allow to configure CRTC writeback support " José Expósito
@ 2025-02-18 17:07 ` José Expósito
2025-02-18 17:08 ` [PATCH 08/16] drm/vkms: Allow to configure multiple encoders " José Expósito
` (9 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: José Expósito @ 2025-02-18 17:07 UTC (permalink / raw)
To: louis.chauvet
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel,
José Expósito
Create a default subgroup at /config/vkms/planes/plane/possible_crtcs
that will contain symbolic links to the possible CRTCs for the plane.
Co-developed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
Documentation/gpu/vkms.rst | 9 ++++
drivers/gpu/drm/vkms/vkms_configfs.c | 61 ++++++++++++++++++++++++++++
2 files changed, 70 insertions(+)
diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index 4e87d8a81844..3c9d72bdb65a 100644
--- a/Documentation/gpu/vkms.rst
+++ b/Documentation/gpu/vkms.rst
@@ -97,6 +97,14 @@ CRTCs have 1 configurable attribute:
- writeback: Enable or disable writeback connector support
+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
+
+Since at least one primary plane is required, make sure to set the right type::
+
+ echo "1" | sudo tee /config/vkms/my-vkms/planes/plane0/type
+
Once you are done configuring the VKMS instance, enable it::
echo "1" | sudo tee /config/vkms/my-vkms/enabled
@@ -107,6 +115,7 @@ Finally, you can remove the VKMS instance disabling it::
And removing the top level directory and its subdirectories::
+ sudo rm /config/vkms/my-vkms/planes/*/possible_crtcs/*
sudo rmdir /config/vkms/my-vkms/planes/*
sudo rmdir /config/vkms/my-vkms/crtcs/*
sudo rmdir /config/vkms/my-vkms
diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c
index 88037a57a138..7d5ebdd45d53 100644
--- a/drivers/gpu/drm/vkms/vkms_configfs.c
+++ b/drivers/gpu/drm/vkms/vkms_configfs.c
@@ -37,11 +37,13 @@ struct vkms_configfs_device {
*
* @group: Top level configuration group that represents a plane.
* Initialized when a new directory is created under "/config/vkms/planes"
+ * @possible_crtcs_group: Default subgroup of @group at "plane/possible_crtcs"
* @dev: The vkms_configfs_device this plane belongs to
* @config: Configuration of the VKMS plane
*/
struct vkms_configfs_plane {
struct config_group group;
+ struct config_group possible_crtcs_group;
struct vkms_configfs_device *dev;
struct vkms_config_plane *config;
};
@@ -70,6 +72,10 @@ struct vkms_configfs_crtc {
#define plane_item_to_vkms_configfs_plane(item) \
container_of(to_config_group((item)), struct vkms_configfs_plane, group)
+#define plane_possible_crtcs_item_to_vkms_configfs_plane(item) \
+ container_of(to_config_group((item)), struct vkms_configfs_plane, \
+ possible_crtcs_group)
+
#define crtc_item_to_vkms_configfs_crtc(item) \
container_of(to_config_group((item)), struct vkms_configfs_crtc, group)
@@ -195,6 +201,56 @@ static const struct config_item_type crtc_group_type = {
.ct_owner = THIS_MODULE,
};
+static int plane_possible_crtcs_allow_link(struct config_item *src,
+ struct config_item *target)
+{
+ struct vkms_configfs_plane *plane;
+ struct vkms_configfs_crtc *crtc;
+ int ret;
+
+ if (target->ci_type != &crtc_item_type)
+ return -EINVAL;
+
+ plane = plane_possible_crtcs_item_to_vkms_configfs_plane(src);
+ crtc = crtc_item_to_vkms_configfs_crtc(target);
+
+ mutex_lock(&plane->dev->lock);
+
+ if (plane->dev->enabled) {
+ mutex_unlock(&plane->dev->lock);
+ return -EPERM;
+ }
+
+ ret = vkms_config_plane_attach_crtc(plane->config, crtc->config);
+ mutex_unlock(&plane->dev->lock);
+
+ return ret;
+}
+
+static void plane_possible_crtcs_drop_link(struct config_item *src,
+ struct config_item *target)
+{
+ struct vkms_configfs_plane *plane;
+ struct vkms_configfs_crtc *crtc;
+
+ plane = plane_possible_crtcs_item_to_vkms_configfs_plane(src);
+ crtc = crtc_item_to_vkms_configfs_crtc(target);
+
+ mutex_lock(&plane->dev->lock);
+ vkms_config_plane_detach_crtc(plane->config, crtc->config);
+ mutex_unlock(&plane->dev->lock);
+}
+
+static struct configfs_item_operations plane_possible_crtcs_item_operations = {
+ .allow_link = plane_possible_crtcs_allow_link,
+ .drop_link = plane_possible_crtcs_drop_link,
+};
+
+static const struct config_item_type plane_possible_crtcs_group_type = {
+ .ct_item_ops = &plane_possible_crtcs_item_operations,
+ .ct_owner = THIS_MODULE,
+};
+
static ssize_t plane_type_show(struct config_item *item, char *page)
{
struct vkms_configfs_plane *plane;
@@ -301,6 +357,11 @@ static struct config_group *make_plane_group(struct config_group *group,
config_group_init_type_name(&plane->group, name, &plane_item_type);
+ config_group_init_type_name(&plane->possible_crtcs_group,
+ "possible_crtcs",
+ &plane_possible_crtcs_group_type);
+ configfs_add_default_group(&plane->possible_crtcs_group, &plane->group);
+
mutex_unlock(&dev->lock);
return &plane->group;
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 08/16] drm/vkms: Allow to configure multiple encoders via configfs
2025-02-18 17:07 [PATCH 00/16] drm/vkms: Add configfs support José Expósito
` (6 preceding siblings ...)
2025-02-18 17:07 ` [PATCH 07/16] drm/vkms: Allow to attach planes and CRTCs " José Expósito
@ 2025-02-18 17:08 ` José Expósito
2025-02-25 11:02 ` Louis Chauvet
2025-02-18 17:08 ` [PATCH 09/16] drm/vkms: Allow to attach encoders and CRTCs " José Expósito
` (8 subsequent siblings)
16 siblings, 1 reply; 30+ messages in thread
From: José Expósito @ 2025-02-18 17:08 UTC (permalink / raw)
To: louis.chauvet
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel,
José Expósito
Create a default subgroup at /config/vkms/encoders to allow to create as
many encoders as required.
Co-developed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
Documentation/gpu/vkms.rst | 6 ++
drivers/gpu/drm/vkms/vkms_configfs.c | 99 ++++++++++++++++++++++++++++
2 files changed, 105 insertions(+)
diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index 3c9d72bdb65a..24f40128e8f3 100644
--- a/Documentation/gpu/vkms.rst
+++ b/Documentation/gpu/vkms.rst
@@ -76,6 +76,7 @@ And directories are created for each configurable item of the display pipeline::
tree /config/vkms/my-vkms
├── crtcs
├── enabled
+ ├── encoders
└── planes
To add items to the display pipeline, create one or more directories under the
@@ -97,6 +98,10 @@ CRTCs have 1 configurable attribute:
- writeback: Enable or disable writeback connector support
+Next, create one or more encoders::
+
+ sudo mkdir /config/vkms/my-vkms/encoders/encoder0
+
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
@@ -118,6 +123,7 @@ And removing the top level directory and its subdirectories::
sudo rm /config/vkms/my-vkms/planes/*/possible_crtcs/*
sudo rmdir /config/vkms/my-vkms/planes/*
sudo rmdir /config/vkms/my-vkms/crtcs/*
+ sudo rmdir /config/vkms/my-vkms/encoders/*
sudo rmdir /config/vkms/my-vkms
Testing With IGT
diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c
index 7d5ebdd45d53..d7efa50a3fba 100644
--- a/drivers/gpu/drm/vkms/vkms_configfs.c
+++ b/drivers/gpu/drm/vkms/vkms_configfs.c
@@ -17,6 +17,7 @@ static bool is_configfs_registered;
* Initialized when a new directory is created under "/config/vkms/"
* @planes_group: Default subgroup of @group at "/config/vkms/planes"
* @crtcs_group: Default subgroup of @group at "/config/vkms/crtcs"
+ * @encoders_group: Default subgroup of @group at "/config/vkms/encoders"
* @lock: Lock used to project concurrent access to the configuration attributes
* @config: Protected by @lock. Configuration of the VKMS device
* @enabled: Protected by @lock. The device is created or destroyed when this
@@ -26,6 +27,7 @@ struct vkms_configfs_device {
struct config_group group;
struct config_group planes_group;
struct config_group crtcs_group;
+ struct config_group encoders_group;
struct mutex lock;
struct vkms_config *config;
@@ -62,6 +64,20 @@ struct vkms_configfs_crtc {
struct vkms_config_crtc *config;
};
+/**
+ * struct vkms_configfs_encoder - Configfs representation of a encoder
+ *
+ * @group: Top level configuration group that represents a encoder.
+ * Initialized when a new directory is created under "/config/vkms/encoders"
+ * @dev: The vkms_configfs_device this encoder belongs to
+ * @config: Configuration of the VKMS encoder
+ */
+struct vkms_configfs_encoder {
+ struct config_group group;
+ struct vkms_configfs_device *dev;
+ struct vkms_config_encoder *config;
+};
+
#define device_item_to_vkms_configfs_device(item) \
container_of(to_config_group((item)), struct vkms_configfs_device, \
group)
@@ -79,6 +95,10 @@ struct vkms_configfs_crtc {
#define crtc_item_to_vkms_configfs_crtc(item) \
container_of(to_config_group((item)), struct vkms_configfs_crtc, group)
+#define encoder_item_to_vkms_configfs_encoder(item) \
+ container_of(to_config_group((item)), struct vkms_configfs_encoder, \
+ group)
+
static ssize_t crtc_writeback_show(struct config_item *item, char *page)
{
struct vkms_configfs_crtc *crtc;
@@ -382,6 +402,81 @@ static const struct config_item_type plane_group_type = {
.ct_owner = THIS_MODULE,
};
+static void encoder_release(struct config_item *item)
+{
+ struct vkms_configfs_encoder *encoder;
+ struct mutex *lock;
+
+ encoder = encoder_item_to_vkms_configfs_encoder(item);
+ lock = &encoder->dev->lock;
+
+ mutex_lock(lock);
+ vkms_config_destroy_encoder(encoder->dev->config, encoder->config);
+ kfree(encoder);
+ mutex_unlock(lock);
+}
+
+static struct configfs_item_operations encoder_item_operations = {
+ .release = &encoder_release,
+};
+
+static const struct config_item_type encoder_item_type = {
+ .ct_item_ops = &encoder_item_operations,
+ .ct_owner = THIS_MODULE,
+};
+
+static struct config_group *make_encoder_group(struct config_group *group,
+ const char *name)
+{
+ struct vkms_configfs_device *dev;
+ struct vkms_configfs_encoder *encoder;
+ int ret;
+
+ dev = child_group_to_vkms_configfs_device(group);
+
+ mutex_lock(&dev->lock);
+
+ if (dev->enabled) {
+ ret = -EINVAL;
+ goto err_unlock;
+ }
+
+ encoder = kzalloc(sizeof(*encoder), GFP_KERNEL);
+ if (!encoder) {
+ ret = -ENOMEM;
+ goto err_unlock;
+ }
+
+ encoder->dev = dev;
+
+ encoder->config = vkms_config_create_encoder(dev->config);
+ if (IS_ERR(encoder->config)) {
+ ret = PTR_ERR(encoder->config);
+ goto err_free;
+ }
+
+ config_group_init_type_name(&encoder->group, name, &encoder_item_type);
+
+ mutex_unlock(&dev->lock);
+
+ return &encoder->group;
+
+err_free:
+ kfree(encoder);
+err_unlock:
+ mutex_unlock(&dev->lock);
+ return ERR_PTR(ret);
+}
+
+static struct configfs_group_operations encoders_group_operations = {
+ .make_group = &make_encoder_group,
+};
+
+static const struct config_item_type encoder_group_type = {
+ .ct_group_ops = &encoders_group_operations,
+ .ct_owner = THIS_MODULE,
+};
+
static ssize_t device_enabled_show(struct config_item *item, char *page)
{
struct vkms_configfs_device *dev;
@@ -495,6 +590,10 @@ static struct config_group *make_device_group(struct config_group *group,
&crtc_group_type);
configfs_add_default_group(&dev->crtcs_group, &dev->group);
+ config_group_init_type_name(&dev->encoders_group, "encoders",
+ &encoder_group_type);
+ configfs_add_default_group(&dev->encoders_group, &dev->group);
+
return &dev->group;
}
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 09/16] drm/vkms: Allow to attach encoders and CRTCs via configfs
2025-02-18 17:07 [PATCH 00/16] drm/vkms: Add configfs support José Expósito
` (7 preceding siblings ...)
2025-02-18 17:08 ` [PATCH 08/16] drm/vkms: Allow to configure multiple encoders " José Expósito
@ 2025-02-18 17:08 ` José Expósito
2025-02-18 17:08 ` [PATCH 10/16] drm/vkms: Allow to configure multiple connectors " José Expósito
` (7 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: José Expósito @ 2025-02-18 17:08 UTC (permalink / raw)
To: louis.chauvet
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel,
José Expósito
Create a default subgroup at
/config/vkms/encoders/encoder/possible_crtcs that will contain symbolic
links to the possible CRTCs for the encoder.
Co-developed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
Documentation/gpu/vkms.rst | 2 +
drivers/gpu/drm/vkms/vkms_configfs.c | 63 ++++++++++++++++++++++++++++
2 files changed, 65 insertions(+)
diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index 24f40128e8f3..6a15af0b7317 100644
--- a/Documentation/gpu/vkms.rst
+++ b/Documentation/gpu/vkms.rst
@@ -105,6 +105,7 @@ Next, create one or more encoders::
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
+ sudo ln -s /config/vkms/my-vkms/crtcs/crtc0 /config/vkms/my-vkms/encoders/encoder0/possible_crtcs
Since at least one primary plane is required, make sure to set the right type::
@@ -121,6 +122,7 @@ Finally, you can remove the VKMS instance disabling it::
And removing the top level directory and its subdirectories::
sudo rm /config/vkms/my-vkms/planes/*/possible_crtcs/*
+ sudo rm /config/vkms/my-vkms/encoders/*/possible_crtcs/*
sudo rmdir /config/vkms/my-vkms/planes/*
sudo rmdir /config/vkms/my-vkms/crtcs/*
sudo rmdir /config/vkms/my-vkms/encoders/*
diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c
index d7efa50a3fba..66c8a66f7b2b 100644
--- a/drivers/gpu/drm/vkms/vkms_configfs.c
+++ b/drivers/gpu/drm/vkms/vkms_configfs.c
@@ -69,11 +69,13 @@ struct vkms_configfs_crtc {
*
* @group: Top level configuration group that represents a encoder.
* Initialized when a new directory is created under "/config/vkms/encoders"
+ * @possible_crtcs_group: Default subgroup of @group at "encoder/possible_crtcs"
* @dev: The vkms_configfs_device this encoder belongs to
* @config: Configuration of the VKMS encoder
*/
struct vkms_configfs_encoder {
struct config_group group;
+ struct config_group possible_crtcs_group;
struct vkms_configfs_device *dev;
struct vkms_config_encoder *config;
};
@@ -99,6 +101,10 @@ struct vkms_configfs_encoder {
container_of(to_config_group((item)), struct vkms_configfs_encoder, \
group)
+#define encoder_possible_crtcs_item_to_vkms_configfs_encoder(item) \
+ container_of(to_config_group((item)), struct vkms_configfs_encoder, \
+ possible_crtcs_group)
+
static ssize_t crtc_writeback_show(struct config_item *item, char *page)
{
struct vkms_configfs_crtc *crtc;
@@ -402,6 +408,57 @@ static const struct config_item_type plane_group_type = {
.ct_owner = THIS_MODULE,
};
+static int encoder_possible_crtcs_allow_link(struct config_item *src,
+ struct config_item *target)
+{
+ struct vkms_configfs_encoder *encoder;
+ struct vkms_configfs_crtc *crtc;
+ int ret;
+
+ if (target->ci_type != &crtc_item_type)
+ return -EINVAL;
+
+ encoder = encoder_possible_crtcs_item_to_vkms_configfs_encoder(src);
+ crtc = crtc_item_to_vkms_configfs_crtc(target);
+
+ mutex_lock(&encoder->dev->lock);
+
+ if (encoder->dev->enabled) {
+ mutex_unlock(&encoder->dev->lock);
+ return -EPERM;
+ }
+
+ ret = vkms_config_encoder_attach_crtc(encoder->config, crtc->config);
+
+ mutex_unlock(&encoder->dev->lock);
+
+ return ret;
+}
+
+static void encoder_possible_crtcs_drop_link(struct config_item *src,
+ struct config_item *target)
+{
+ struct vkms_configfs_encoder *encoder;
+ struct vkms_configfs_crtc *crtc;
+
+ encoder = encoder_possible_crtcs_item_to_vkms_configfs_encoder(src);
+ crtc = crtc_item_to_vkms_configfs_crtc(target);
+
+ mutex_lock(&encoder->dev->lock);
+ vkms_config_encoder_detach_crtc(encoder->config, crtc->config);
+ mutex_unlock(&encoder->dev->lock);
+}
+
+static struct configfs_item_operations encoder_possible_crtcs_item_operations = {
+ .allow_link = encoder_possible_crtcs_allow_link,
+ .drop_link = encoder_possible_crtcs_drop_link,
+};
+
+static const struct config_item_type encoder_possible_crtcs_group_type = {
+ .ct_item_ops = &encoder_possible_crtcs_item_operations,
+ .ct_owner = THIS_MODULE,
+};
+
static void encoder_release(struct config_item *item)
{
struct vkms_configfs_encoder *encoder;
@@ -457,6 +514,12 @@ static struct config_group *make_encoder_group(struct config_group *group,
config_group_init_type_name(&encoder->group, name, &encoder_item_type);
+ config_group_init_type_name(&encoder->possible_crtcs_group,
+ "possible_crtcs",
+ &encoder_possible_crtcs_group_type);
+ configfs_add_default_group(&encoder->possible_crtcs_group,
+ &encoder->group);
+
mutex_unlock(&dev->lock);
return &encoder->group;
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 10/16] drm/vkms: Allow to configure multiple connectors via configfs
2025-02-18 17:07 [PATCH 00/16] drm/vkms: Add configfs support José Expósito
` (8 preceding siblings ...)
2025-02-18 17:08 ` [PATCH 09/16] drm/vkms: Allow to attach encoders and CRTCs " José Expósito
@ 2025-02-18 17:08 ` José Expósito
2025-02-25 11:02 ` Louis Chauvet
2025-02-18 17:08 ` [PATCH 11/16] drm/vkms: Allow to attach connectors and encoders " José Expósito
` (6 subsequent siblings)
16 siblings, 1 reply; 30+ messages in thread
From: José Expósito @ 2025-02-18 17:08 UTC (permalink / raw)
To: louis.chauvet
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel,
José Expósito
Create a default subgroup at
/config/vkms/connectors to allow to create as many connectors as
required.
Co-developed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
Documentation/gpu/vkms.rst | 6 ++
drivers/gpu/drm/vkms/vkms_configfs.c | 100 +++++++++++++++++++++++++++
2 files changed, 106 insertions(+)
diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index 6a15af0b7317..3dd55c3e8900 100644
--- a/Documentation/gpu/vkms.rst
+++ b/Documentation/gpu/vkms.rst
@@ -74,6 +74,7 @@ By default, the instance is disabled::
And directories are created for each configurable item of the display pipeline::
tree /config/vkms/my-vkms
+ ├── connectors
├── crtcs
├── enabled
├── encoders
@@ -102,6 +103,10 @@ Next, create one or more encoders::
sudo mkdir /config/vkms/my-vkms/encoders/encoder0
+Last but not least, create one or more connectors::
+
+ sudo mkdir /config/vkms/my-vkms/connectors/connector0
+
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
@@ -126,6 +131,7 @@ And removing the top level directory and its subdirectories::
sudo rmdir /config/vkms/my-vkms/planes/*
sudo rmdir /config/vkms/my-vkms/crtcs/*
sudo rmdir /config/vkms/my-vkms/encoders/*
+ sudo rmdir /config/vkms/my-vkms/connectors/*
sudo rmdir /config/vkms/my-vkms
Testing With IGT
diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c
index 66c8a66f7b2b..cd8a164bda3d 100644
--- a/drivers/gpu/drm/vkms/vkms_configfs.c
+++ b/drivers/gpu/drm/vkms/vkms_configfs.c
@@ -18,6 +18,7 @@ static bool is_configfs_registered;
* @planes_group: Default subgroup of @group at "/config/vkms/planes"
* @crtcs_group: Default subgroup of @group at "/config/vkms/crtcs"
* @encoders_group: Default subgroup of @group at "/config/vkms/encoders"
+ * @connectors_group: Default subgroup of @group at "/config/vkms/connectors"
* @lock: Lock used to project concurrent access to the configuration attributes
* @config: Protected by @lock. Configuration of the VKMS device
* @enabled: Protected by @lock. The device is created or destroyed when this
@@ -28,6 +29,7 @@ struct vkms_configfs_device {
struct config_group planes_group;
struct config_group crtcs_group;
struct config_group encoders_group;
+ struct config_group connectors_group;
struct mutex lock;
struct vkms_config *config;
@@ -80,6 +82,20 @@ struct vkms_configfs_encoder {
struct vkms_config_encoder *config;
};
+/**
+ * struct vkms_configfs_connector - Configfs representation of a connector
+ *
+ * @group: Top level configuration group that represents a connector.
+ * Initialized when a new directory is created under "/config/vkms/connectors"
+ * @dev: The vkms_configfs_device this connector belongs to
+ * @config: Configuration of the VKMS connector
+ */
+struct vkms_configfs_connector {
+ struct config_group group;
+ struct vkms_configfs_device *dev;
+ struct vkms_config_connector *config;
+};
+
#define device_item_to_vkms_configfs_device(item) \
container_of(to_config_group((item)), struct vkms_configfs_device, \
group)
@@ -105,6 +121,10 @@ struct vkms_configfs_encoder {
container_of(to_config_group((item)), struct vkms_configfs_encoder, \
possible_crtcs_group)
+#define connector_item_to_vkms_configfs_connector(item) \
+ container_of(to_config_group((item)), struct vkms_configfs_connector, \
+ group)
+
static ssize_t crtc_writeback_show(struct config_item *item, char *page)
{
struct vkms_configfs_crtc *crtc;
@@ -540,6 +560,82 @@ static const struct config_item_type encoder_group_type = {
.ct_owner = THIS_MODULE,
};
+static void connector_release(struct config_item *item)
+{
+ struct vkms_configfs_connector *connector;
+ struct mutex *lock;
+
+ connector = connector_item_to_vkms_configfs_connector(item);
+ lock = &connector->dev->lock;
+
+ mutex_lock(lock);
+ vkms_config_destroy_connector(connector->config);
+ kfree(connector);
+ mutex_unlock(lock);
+}
+
+static struct configfs_item_operations connector_item_operations = {
+ .release = &connector_release,
+};
+
+static const struct config_item_type connector_item_type = {
+ .ct_item_ops = &connector_item_operations,
+ .ct_owner = THIS_MODULE,
+};
+
+static struct config_group *make_connector_group(struct config_group *group,
+ const char *name)
+{
+ struct vkms_configfs_device *dev;
+ struct vkms_configfs_connector *connector;
+ int ret;
+
+ dev = child_group_to_vkms_configfs_device(group);
+
+ mutex_lock(&dev->lock);
+
+ if (dev->enabled) {
+ ret = -EINVAL;
+ goto err_unlock;
+ }
+
+ connector = kzalloc(sizeof(*connector), GFP_KERNEL);
+ if (!connector) {
+ ret = -ENOMEM;
+ goto err_unlock;
+ }
+
+ connector->dev = dev;
+
+ connector->config = vkms_config_create_connector(dev->config);
+ if (IS_ERR(connector->config)) {
+ ret = PTR_ERR(connector->config);
+ goto err_free;
+ }
+
+ config_group_init_type_name(&connector->group, name,
+ &connector_item_type);
+
+ mutex_unlock(&dev->lock);
+
+ return &connector->group;
+
+err_free:
+ kfree(connector);
+err_unlock:
+ mutex_unlock(&dev->lock);
+ return ERR_PTR(ret);
+}
+
+static struct configfs_group_operations connectors_group_operations = {
+ .make_group = &make_connector_group,
+};
+
+static const struct config_item_type connector_group_type = {
+ .ct_group_ops = &connectors_group_operations,
+ .ct_owner = THIS_MODULE,
+};
+
static ssize_t device_enabled_show(struct config_item *item, char *page)
{
struct vkms_configfs_device *dev;
@@ -657,6 +753,10 @@ static struct config_group *make_device_group(struct config_group *group,
&encoder_group_type);
configfs_add_default_group(&dev->encoders_group, &dev->group);
+ config_group_init_type_name(&dev->connectors_group, "connectors",
+ &connector_group_type);
+ configfs_add_default_group(&dev->connectors_group, &dev->group);
+
return &dev->group;
}
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 11/16] drm/vkms: Allow to attach connectors and encoders via configfs
2025-02-18 17:07 [PATCH 00/16] drm/vkms: Add configfs support José Expósito
` (9 preceding siblings ...)
2025-02-18 17:08 ` [PATCH 10/16] drm/vkms: Allow to configure multiple connectors " José Expósito
@ 2025-02-18 17:08 ` José Expósito
2025-02-18 17:08 ` [PATCH 12/16] drm/vkms: Allow to configure connector status José Expósito
` (5 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: José Expósito @ 2025-02-18 17:08 UTC (permalink / raw)
To: louis.chauvet
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel,
José Expósito
Create a default subgroup at
/config/vkms/connectors/connector/possible_encoders that will contain
symbolic links to the possible encoders for the connector.
Co-developed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
Documentation/gpu/vkms.rst | 2 +
drivers/gpu/drm/vkms/vkms_configfs.c | 66 ++++++++++++++++++++++++++++
2 files changed, 68 insertions(+)
diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index 3dd55c3e8900..0212e99e12dd 100644
--- a/Documentation/gpu/vkms.rst
+++ b/Documentation/gpu/vkms.rst
@@ -111,6 +111,7 @@ 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
sudo ln -s /config/vkms/my-vkms/crtcs/crtc0 /config/vkms/my-vkms/encoders/encoder0/possible_crtcs
+ sudo ln -s /config/vkms/my-vkms/encoders/encoder0 /config/vkms/my-vkms/connectors/connector0/possible_encoders
Since at least one primary plane is required, make sure to set the right type::
@@ -128,6 +129,7 @@ And removing the top level directory and its subdirectories::
sudo rm /config/vkms/my-vkms/planes/*/possible_crtcs/*
sudo rm /config/vkms/my-vkms/encoders/*/possible_crtcs/*
+ sudo rm /config/vkms/my-vkms/connectors/*/possible_encoders/*
sudo rmdir /config/vkms/my-vkms/planes/*
sudo rmdir /config/vkms/my-vkms/crtcs/*
sudo rmdir /config/vkms/my-vkms/encoders/*
diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c
index cd8a164bda3d..9036d9983078 100644
--- a/drivers/gpu/drm/vkms/vkms_configfs.c
+++ b/drivers/gpu/drm/vkms/vkms_configfs.c
@@ -87,11 +87,14 @@ struct vkms_configfs_encoder {
*
* @group: Top level configuration group that represents a connector.
* Initialized when a new directory is created under "/config/vkms/connectors"
+ * @possible_encoders_group: Default subgroup of @group at
+ * "connector/possible_encoders"
* @dev: The vkms_configfs_device this connector belongs to
* @config: Configuration of the VKMS connector
*/
struct vkms_configfs_connector {
struct config_group group;
+ struct config_group possible_encoders_group;
struct vkms_configfs_device *dev;
struct vkms_config_connector *config;
};
@@ -125,6 +128,10 @@ struct vkms_configfs_connector {
container_of(to_config_group((item)), struct vkms_configfs_connector, \
group)
+#define connector_possible_encoders_item_to_vkms_configfs_connector(item) \
+ container_of(to_config_group((item)), struct vkms_configfs_connector, \
+ possible_encoders_group)
+
static ssize_t crtc_writeback_show(struct config_item *item, char *page)
{
struct vkms_configfs_crtc *crtc;
@@ -583,6 +590,59 @@ static const struct config_item_type connector_item_type = {
.ct_owner = THIS_MODULE,
};
+static int connector_possible_encoders_allow_link(struct config_item *src,
+ struct config_item *target)
+{
+ struct vkms_configfs_connector *connector;
+ struct vkms_configfs_encoder *encoder;
+ int ret;
+
+ if (target->ci_type != &encoder_item_type)
+ return -EINVAL;
+
+ connector = connector_possible_encoders_item_to_vkms_configfs_connector(src);
+ encoder = encoder_item_to_vkms_configfs_encoder(target);
+
+ mutex_lock(&connector->dev->lock);
+
+ if (connector->dev->enabled) {
+ mutex_unlock(&connector->dev->lock);
+ return -EPERM;
+ }
+
+ ret = vkms_config_connector_attach_encoder(connector->config,
+ encoder->config);
+
+ mutex_unlock(&connector->dev->lock);
+
+ return ret;
+}
+
+static void connector_possible_encoders_drop_link(struct config_item *src,
+ struct config_item *target)
+{
+ struct vkms_configfs_connector *connector;
+ struct vkms_configfs_encoder *encoder;
+
+ connector = connector_possible_encoders_item_to_vkms_configfs_connector(src);
+ encoder = encoder_item_to_vkms_configfs_encoder(target);
+
+ mutex_lock(&connector->dev->lock);
+ vkms_config_connector_detach_encoder(connector->config,
+ encoder->config);
+ mutex_unlock(&connector->dev->lock);
+}
+
+static struct configfs_item_operations connector_possible_encoders_item_operations = {
+ .allow_link = connector_possible_encoders_allow_link,
+ .drop_link = connector_possible_encoders_drop_link,
+};
+
+static const struct config_item_type connector_possible_encoders_group_type = {
+ .ct_item_ops = &connector_possible_encoders_item_operations,
+ .ct_owner = THIS_MODULE,
+};
+
static struct config_group *make_connector_group(struct config_group *group,
const char *name)
{
@@ -616,6 +676,12 @@ static struct config_group *make_connector_group(struct config_group *group,
config_group_init_type_name(&connector->group, name,
&connector_item_type);
+ config_group_init_type_name(&connector->possible_encoders_group,
+ "possible_encoders",
+ &connector_possible_encoders_group_type);
+ configfs_add_default_group(&connector->possible_encoders_group,
+ &connector->group);
+
mutex_unlock(&dev->lock);
return &connector->group;
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 12/16] drm/vkms: Allow to configure connector status
2025-02-18 17:07 [PATCH 00/16] drm/vkms: Add configfs support José Expósito
` (10 preceding siblings ...)
2025-02-18 17:08 ` [PATCH 11/16] drm/vkms: Allow to attach connectors and encoders " José Expósito
@ 2025-02-18 17:08 ` José Expósito
2025-02-18 17:08 ` [PATCH 13/16] drm/vkms: Allow to update the " José Expósito
` (4 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: José Expósito @ 2025-02-18 17:08 UTC (permalink / raw)
To: louis.chauvet
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel,
José Expósito
Allow to store the connector status in vkms_config_connector and add a
getter and a setter functions as well a KUnit test.
This change only adds the configuration, the connector status is not
used yet.
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
drivers/gpu/drm/vkms/tests/vkms_config_test.c | 24 +++++++++++++++++
drivers/gpu/drm/vkms/vkms_config.c | 8 ++++--
drivers/gpu/drm/vkms/vkms_config.h | 26 +++++++++++++++++++
3 files changed, 56 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/drm/vkms/tests/vkms_config_test.c
index ff4566cf9925..3574a829a6ed 100644
--- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c
+++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c
@@ -916,6 +916,29 @@ static void vkms_config_test_connector_get_possible_encoders(struct kunit *test)
vkms_config_destroy(config);
}
+static void vkms_config_test_connector_status(struct kunit *test)
+{
+ struct vkms_config *config;
+ struct vkms_config_connector *connector_cfg;
+ enum drm_connector_status status;
+
+ config = vkms_config_create("test");
+ KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
+
+ connector_cfg = vkms_config_create_connector(config);
+ KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg);
+
+ status = vkms_config_connector_get_status(connector_cfg);
+ KUNIT_EXPECT_EQ(test, status, connector_status_connected);
+
+ vkms_config_connector_set_status(connector_cfg,
+ connector_status_disconnected);
+ status = vkms_config_connector_get_status(connector_cfg);
+ KUNIT_EXPECT_EQ(test, status, connector_status_disconnected);
+
+ vkms_config_destroy(config);
+}
+
static struct kunit_case vkms_config_test_cases[] = {
KUNIT_CASE(vkms_config_test_empty_config),
KUNIT_CASE_PARAM(vkms_config_test_default_config,
@@ -937,6 +960,7 @@ static struct kunit_case vkms_config_test_cases[] = {
KUNIT_CASE(vkms_config_test_plane_get_possible_crtcs),
KUNIT_CASE(vkms_config_test_encoder_get_possible_crtcs),
KUNIT_CASE(vkms_config_test_connector_get_possible_encoders),
+ KUNIT_CASE(vkms_config_test_connector_status),
{}
};
diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms_config.c
index a1df5659b0fb..f8394a063ecf 100644
--- a/drivers/gpu/drm/vkms/vkms_config.c
+++ b/drivers/gpu/drm/vkms/vkms_config.c
@@ -361,8 +361,11 @@ static int vkms_config_show(struct seq_file *m, void *data)
vkms_config_for_each_encoder(vkmsdev->config, encoder_cfg)
seq_puts(m, "encoder\n");
- vkms_config_for_each_connector(vkmsdev->config, connector_cfg)
- seq_puts(m, "connector\n");
+ vkms_config_for_each_connector(vkmsdev->config, connector_cfg) {
+ seq_puts(m, "connector:\n");
+ seq_printf(m, "\tstatus=%d\n",
+ vkms_config_connector_get_status(connector_cfg));
+ }
return 0;
}
@@ -588,6 +591,7 @@ struct vkms_config_connector *vkms_config_create_connector(struct vkms_config *c
return ERR_PTR(-ENOMEM);
connector_cfg->config = config;
+ connector_cfg->status = connector_status_connected;
xa_init_flags(&connector_cfg->possible_encoders, XA_FLAGS_ALLOC);
list_add_tail(&connector_cfg->link, &config->connectors);
diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms_config.h
index 0118e3f99706..e202b5a84ddd 100644
--- a/drivers/gpu/drm/vkms/vkms_config.h
+++ b/drivers/gpu/drm/vkms/vkms_config.h
@@ -7,6 +7,8 @@
#include <linux/types.h>
#include <linux/xarray.h>
+#include <drm/drm_connector.h>
+
#include "vkms_drv.h"
/**
@@ -99,6 +101,7 @@ struct vkms_config_encoder {
*
* @link: Link to the others connector in vkms_config
* @config: The vkms_config this connector belongs to
+ * @status: Status (connected, disconnected...) of the connector
* @possible_encoders: Array of encoders that can be used with this connector
* @connector: Internal usage. This pointer should never be considered as valid.
* It can be used to store a temporary reference to a VKMS connector
@@ -109,6 +112,7 @@ struct vkms_config_connector {
struct list_head link;
struct vkms_config *config;
+ enum drm_connector_status status;
struct xarray possible_encoders;
/* Internal usage */
@@ -434,4 +438,26 @@ int __must_check vkms_config_connector_attach_encoder(struct vkms_config_connect
void vkms_config_connector_detach_encoder(struct vkms_config_connector *connector_cfg,
struct vkms_config_encoder *encoder_cfg);
+/**
+ * vkms_config_connector_get_status() - Return the status of the connector
+ * @connector_cfg: Connector to get the status from
+ */
+static inline enum drm_connector_status
+vkms_config_connector_get_status(struct vkms_config_connector *connector_cfg)
+{
+ return connector_cfg->status;
+}
+
+/**
+ * vkms_config_crtc_set_writeback() - If a writeback connector will be created
+ * @crtc_cfg: Target CRTC
+ * @writeback: Enable or disable the writeback connector
+ */
+static inline void
+vkms_config_connector_set_status(struct vkms_config_connector *connector_cfg,
+ enum drm_connector_status status)
+{
+ connector_cfg->status = status;
+}
+
#endif /* _VKMS_CONFIG_H_ */
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 13/16] drm/vkms: Allow to update the connector status
2025-02-18 17:07 [PATCH 00/16] drm/vkms: Add configfs support José Expósito
` (11 preceding siblings ...)
2025-02-18 17:08 ` [PATCH 12/16] drm/vkms: Allow to configure connector status José Expósito
@ 2025-02-18 17:08 ` José Expósito
2025-02-18 17:08 ` [PATCH 14/16] drm/vkms: Allow to configure connector status via configfs José Expósito
` (3 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: José Expósito @ 2025-02-18 17:08 UTC (permalink / raw)
To: louis.chauvet
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel,
José Expósito
Implement the drm_connector_funcs.detect() callback to update the
connector status by returning the status stored in the configuration.
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
drivers/gpu/drm/vkms/vkms_connector.c | 19 ++++++++++++++++++-
drivers/gpu/drm/vkms/vkms_connector.h | 12 +++++++++++-
drivers/gpu/drm/vkms/vkms_output.c | 2 +-
3 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/vkms_connector.c
index 48b10cba322a..b03a00b5803a 100644
--- a/drivers/gpu/drm/vkms/vkms_connector.c
+++ b/drivers/gpu/drm/vkms/vkms_connector.c
@@ -5,9 +5,23 @@
#include <drm/drm_managed.h>
#include <drm/drm_probe_helper.h>
+#include "vkms_config.h"
#include "vkms_connector.h"
+static enum drm_connector_status vkms_connector_detect(struct drm_connector *connector,
+ bool force)
+{
+ struct vkms_connector *vkms_connector;
+ enum drm_connector_status status;
+
+ vkms_connector = drm_connector_to_vkms_connector(connector);
+ status = vkms_config_connector_get_status(vkms_connector->connector_cfg);
+
+ return status;
+}
+
static const struct drm_connector_funcs vkms_connector_funcs = {
+ .detect = vkms_connector_detect,
.fill_modes = drm_helper_probe_single_connector_modes,
.reset = drm_atomic_helper_connector_reset,
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
@@ -40,7 +54,8 @@ static const struct drm_connector_helper_funcs vkms_conn_helper_funcs = {
.best_encoder = vkms_conn_best_encoder,
};
-struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev)
+struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev,
+ struct vkms_config_connector *connector_cfg)
{
struct drm_device *dev = &vkmsdev->drm;
struct vkms_connector *connector;
@@ -50,6 +65,8 @@ struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev)
if (!connector)
return ERR_PTR(-ENOMEM);
+ connector->connector_cfg = connector_cfg;
+
ret = drmm_connector_init(dev, &connector->base, &vkms_connector_funcs,
DRM_MODE_CONNECTOR_VIRTUAL, NULL);
if (ret)
diff --git a/drivers/gpu/drm/vkms/vkms_connector.h b/drivers/gpu/drm/vkms/vkms_connector.h
index c9149c1b7af0..5ab8a6d65182 100644
--- a/drivers/gpu/drm/vkms/vkms_connector.h
+++ b/drivers/gpu/drm/vkms/vkms_connector.h
@@ -5,22 +5,32 @@
#include "vkms_drv.h"
+struct vkms_config_connector;
+
+#define drm_connector_to_vkms_connector(target) \
+ container_of(target, struct vkms_connector, base)
+
/**
* struct vkms_connector - VKMS custom type wrapping around the DRM connector
*
* @drm: Base DRM connector
+ * @connector_cfg: Connector configuration
*/
struct vkms_connector {
struct drm_connector base;
+
+ struct vkms_config_connector *connector_cfg;
};
/**
* vkms_connector_init() - Initialize a connector
* @vkmsdev: VKMS device containing the connector
+ * @connector_cfg: Configuration for the connector
*
* Returns:
* The connector or an error on failure.
*/
-struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev);
+struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev,
+ struct vkms_config_connector *connector_cfg);
#endif /* _VKMS_CONNECTOR_H_ */
diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms_output.c
index 8d7ca0cdd79f..3af95983026e 100644
--- a/drivers/gpu/drm/vkms/vkms_output.c
+++ b/drivers/gpu/drm/vkms/vkms_output.c
@@ -87,7 +87,7 @@ int vkms_output_init(struct vkms_device *vkmsdev)
struct vkms_config_encoder *possible_encoder;
unsigned long idx = 0;
- connector_cfg->connector = vkms_connector_init(vkmsdev);
+ connector_cfg->connector = vkms_connector_init(vkmsdev, connector_cfg);
if (IS_ERR(connector_cfg->connector)) {
DRM_ERROR("Failed to init connector\n");
return PTR_ERR(connector_cfg->connector);
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 14/16] drm/vkms: Allow to configure connector status via configfs
2025-02-18 17:07 [PATCH 00/16] drm/vkms: Add configfs support José Expósito
` (12 preceding siblings ...)
2025-02-18 17:08 ` [PATCH 13/16] drm/vkms: Allow to update the " José Expósito
@ 2025-02-18 17:08 ` José Expósito
2025-02-18 17:08 ` [PATCH 15/16] drm/vkms: Allow to configure the default device creation José Expósito
` (2 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: José Expósito @ 2025-02-18 17:08 UTC (permalink / raw)
To: louis.chauvet
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel,
José Expósito
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.
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
Documentation/gpu/vkms.rst | 4 +++
drivers/gpu/drm/vkms/vkms_configfs.c | 51 +++++++++++++++++++++++++++
drivers/gpu/drm/vkms/vkms_connector.c | 7 ++++
drivers/gpu/drm/vkms/vkms_connector.h | 6 ++++
4 files changed, 68 insertions(+)
diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index 0212e99e12dd..3068879ce1fc 100644
--- a/Documentation/gpu/vkms.rst
+++ b/Documentation/gpu/vkms.rst
@@ -107,6 +107,10 @@ 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
+
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 9036d9983078..f0813536be12 100644
--- a/drivers/gpu/drm/vkms/vkms_configfs.c
+++ b/drivers/gpu/drm/vkms/vkms_configfs.c
@@ -6,6 +6,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;
@@ -567,6 +568,55 @@ 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);
+
+ mutex_lock(&connector->dev->lock);
+ status = vkms_config_connector_get_status(connector->config);
+ mutex_unlock(&connector->dev->lock);
+
+ 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;
+
+ mutex_lock(&connector->dev->lock);
+
+ vkms_config_connector_set_status(connector->config, status);
+
+ if (connector->dev->enabled)
+ vkms_trigger_connector_hotplug(connector->dev->config->dev);
+
+ mutex_unlock(&connector->dev->lock);
+
+ 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;
@@ -586,6 +636,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 b03a00b5803a..ed99270c590f 100644
--- a/drivers/gpu/drm/vkms/vkms_connector.c
+++ b/drivers/gpu/drm/vkms/vkms_connector.c
@@ -76,3 +76,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 5ab8a6d65182..7865f54a313c 100644
--- a/drivers/gpu/drm/vkms/vkms_connector.h
+++ b/drivers/gpu/drm/vkms/vkms_connector.h
@@ -33,4 +33,10 @@ struct vkms_connector {
struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev,
struct vkms_config_connector *connector_cfg);
+/**
+ * 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.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 15/16] drm/vkms: Allow to configure the default device creation
2025-02-18 17:07 [PATCH 00/16] drm/vkms: Add configfs support José Expósito
` (13 preceding siblings ...)
2025-02-18 17:08 ` [PATCH 14/16] drm/vkms: Allow to configure connector status via configfs José Expósito
@ 2025-02-18 17:08 ` José Expósito
2025-02-25 11:02 ` Louis Chauvet
2025-02-18 17:08 ` [PATCH 16/16] drm/vkms: Remove completed task from the TODO list José Expósito
2025-02-25 11:01 ` [PATCH 00/16] drm/vkms: Add configfs support Louis Chauvet
16 siblings, 1 reply; 30+ messages in thread
From: José Expósito @ 2025-02-18 17:08 UTC (permalink / raw)
To: louis.chauvet
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel,
José Expósito
Add a new module param to allow to create or not the default VKMS
instance. Useful when combined with configfs to avoid having additional
VKMS instances.
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
drivers/gpu/drm/vkms/vkms_drv.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
index 5bcfbcb6c0c5..b4ed19c97576 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.c
+++ b/drivers/gpu/drm/vkms/vkms_drv.c
@@ -50,6 +50,10 @@ static bool enable_overlay;
module_param_named(enable_overlay, enable_overlay, bool, 0444);
MODULE_PARM_DESC(enable_overlay, "Enable/Disable overlay support");
+static bool create_default_dev = true;
+module_param_named(create_default_dev, create_default_dev, bool, 0444);
+MODULE_PARM_DESC(create_default_dev, "Create or not the default VKMS device");
+
DEFINE_DRM_GEM_FOPS(vkms_driver_fops);
static void vkms_atomic_commit_tail(struct drm_atomic_state *old_state)
@@ -219,6 +223,9 @@ static int __init vkms_init(void)
if (ret)
return ret;
+ if (!create_default_dev)
+ return 0;
+
config = vkms_config_default_create(enable_cursor, enable_writeback, enable_overlay);
if (IS_ERR(config))
return PTR_ERR(config);
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 16/16] drm/vkms: Remove completed task from the TODO list
2025-02-18 17:07 [PATCH 00/16] drm/vkms: Add configfs support José Expósito
` (14 preceding siblings ...)
2025-02-18 17:08 ` [PATCH 15/16] drm/vkms: Allow to configure the default device creation José Expósito
@ 2025-02-18 17:08 ` José Expósito
2025-02-25 11:01 ` Louis Chauvet
2025-02-25 11:01 ` [PATCH 00/16] drm/vkms: Add configfs support Louis Chauvet
16 siblings, 1 reply; 30+ messages in thread
From: José Expósito @ 2025-02-18 17:08 UTC (permalink / raw)
To: louis.chauvet
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel,
José Expósito
Remove the configfs related TODO items from the "Runtime Configuration"
section.
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
Documentation/gpu/vkms.rst | 9 +--------
1 file changed, 1 insertion(+), 8 deletions(-)
diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index 3068879ce1fc..0a5fcf0b3114 100644
--- a/Documentation/gpu/vkms.rst
+++ b/Documentation/gpu/vkms.rst
@@ -225,21 +225,14 @@ Runtime Configuration
---------------------
We want to be able to reconfigure vkms instance without having to reload the
-module. Use/Test-cases:
+module through configfs. Use/Test-cases:
- Hotplug/hotremove connectors on the fly (to be able to test DP MST handling
of compositors).
-- Configure planes/crtcs/connectors (we'd need some code to have more than 1 of
- them first).
-
- Change output configuration: Plug/unplug screens, change EDID, allow changing
the refresh rate.
-The currently proposed solution is to expose vkms configuration through
-configfs. All existing module options should be supported through configfs
-too.
-
Writeback support
-----------------
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* Re: [PATCH 00/16] drm/vkms: Add configfs support
2025-02-18 17:07 [PATCH 00/16] drm/vkms: Add configfs support José Expósito
` (15 preceding siblings ...)
2025-02-18 17:08 ` [PATCH 16/16] drm/vkms: Remove completed task from the TODO list José Expósito
@ 2025-02-25 11:01 ` Louis Chauvet
2025-02-25 17:56 ` José Expósito
16 siblings, 1 reply; 30+ messages in thread
From: Louis Chauvet @ 2025-02-25 11:01 UTC (permalink / raw)
To: José Expósito
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel
On 18/02/25 - 18:07, José Expósito wrote:
> Hi everyone,
>
> This series, to be applied on top of [1], allow to configure one or more VKMS
> instances without having to reload the driver using configfs.
>
> The series is structured in 3 blocks:
>
> - Patches 1..11: Basic device configuration. For simplicity, I kept the
> available options as minimal as possible.
Thanks for this series, it is really nice!
I did some review, that can be sumarized in two point:
- Do we want to use scoped_guard?
- -EPERM, -EINVAL or -EBUSY when attempting to do something while the
device is enabled
> - Patches 12, 13 and 14: Allow to hot-plug and unplug connectors. This is not
> part of the minimal set of options, but I included in this series so it can
> be used as a template/example of how new configurations can be added.
>
> - Patches 15 and 16: New option to skip the default device creation and to-do
> cleanup.
For the next iteration, can you move those patch before 12, 13, 14, so
1..11 could be merged before 12..14 (I need to think about the connector
API to check if it will works with dynamic connector)?
> The process of configuring a VKMS device is documented in "vkms.rst".
This is a really good documentation!
> Finally, the code is thoroughly tested by a collection of IGT tests [2].
I quickly looked on them, it seems nice! Thank you for this huge
improvment!
Louis Chauvet
> Best wishes,
> José Expósito
>
> [1] https://lore.kernel.org/all/20250218101214.5790-1-jose.exposito89@gmail.com/
> [2] It is not in patchwork yet, but it'll appear here eventually:
> https://patchwork.freedesktop.org/project/igt/patches/?submitter=19782&state=*&q=&archive=both&delegate=
>
> José Expósito (16):
> drm/vkms: Expose device creation and destruction
> drm/vkms: Add and remove VKMS instances via configfs
> drm/vkms: Allow to configure multiple planes via configfs
> drm/vkms: Allow to configure the plane type via configfs
> drm/vkms: Allow to configure multiple CRTCs via configfs
> drm/vkms: Allow to configure CRTC writeback support via configfs
> drm/vkms: Allow to attach planes and CRTCs via configfs
> drm/vkms: Allow to configure multiple encoders via configfs
> drm/vkms: Allow to attach encoders and CRTCs via configfs
> drm/vkms: Allow to configure multiple connectors via configfs
> drm/vkms: Allow to attach connectors and encoders via configfs
> drm/vkms: Allow to configure connector status
> drm/vkms: Allow to update the connector status
> drm/vkms: Allow to configure connector status via configfs
> drm/vkms: Allow to configure the default device creation
> drm/vkms: Remove completed task from the TODO list
>
> Documentation/gpu/vkms.rst | 98 +-
> drivers/gpu/drm/vkms/Kconfig | 1 +
> drivers/gpu/drm/vkms/Makefile | 3 +-
> drivers/gpu/drm/vkms/tests/vkms_config_test.c | 24 +
> drivers/gpu/drm/vkms/vkms_config.c | 8 +-
> drivers/gpu/drm/vkms/vkms_config.h | 26 +
> drivers/gpu/drm/vkms/vkms_configfs.c | 918 ++++++++++++++++++
> drivers/gpu/drm/vkms/vkms_configfs.h | 8 +
> drivers/gpu/drm/vkms/vkms_connector.c | 26 +-
> drivers/gpu/drm/vkms/vkms_connector.h | 18 +-
> drivers/gpu/drm/vkms/vkms_drv.c | 18 +-
> drivers/gpu/drm/vkms/vkms_drv.h | 4 +
> drivers/gpu/drm/vkms/vkms_output.c | 2 +-
> 13 files changed, 1138 insertions(+), 16 deletions(-)
> create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.c
> create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.h
>
>
> base-commit: 9b6c03cb96b9e19bce2c2764d2c6dd4ccbd06c5d
> prerequisite-patch-id: 1bff7bbc4ef0e29266265ac3dc009011c046f745
> prerequisite-patch-id: 74a284d40a426a0038a7054068192238f7658187
> prerequisite-patch-id: c3e34e88ad6a0acf7d9ded0cdb4745a87cf6fd82
> prerequisite-patch-id: 9cd0dfaf8e21a811edbe5a2da7185b6f9055d42d
> prerequisite-patch-id: f50c41578b639370a5d610af6f25c2077321a886
> prerequisite-patch-id: 5a7219a51e42de002b8dbf94ec8af96320043489
> prerequisite-patch-id: 67ea5d4e21b4ce4acbd6fc3ce83017f55811c49b
> prerequisite-patch-id: 37a7fab113a32581f053c09f45efb137afd75a1b
> prerequisite-patch-id: 475bcdc6267f4b02fb1bb2379145529c33684e4f
> prerequisite-patch-id: d3114f0b3da3d8b5ad64692df761f1cf42fbdf12
> prerequisite-patch-id: d1d9280fb056130df2050a09b7ea7e7ddde007c5
> prerequisite-patch-id: 2c370f3de6d227fa8881212207978cce7bbb18ba
> prerequisite-patch-id: 938b8fe5437e5f7bc22bffc55ae249a27d399d66
> prerequisite-patch-id: ab0a510994fbe9985dc46a3d35e6d0574ddbb633
> --
> 2.48.1
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 16/16] drm/vkms: Remove completed task from the TODO list
2025-02-18 17:08 ` [PATCH 16/16] drm/vkms: Remove completed task from the TODO list José Expósito
@ 2025-02-25 11:01 ` Louis Chauvet
0 siblings, 0 replies; 30+ messages in thread
From: Louis Chauvet @ 2025-02-25 11:01 UTC (permalink / raw)
To: José Expósito
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel
On 18/02/25 - 18:08, José Expósito wrote:
> Remove the configfs related TODO items from the "Runtime Configuration"
> section.
>
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 03/16] drm/vkms: Allow to configure multiple planes via configfs
2025-02-18 17:07 ` [PATCH 03/16] drm/vkms: Allow to configure multiple planes " José Expósito
@ 2025-02-25 11:01 ` Louis Chauvet
2025-02-25 11:02 ` Louis Chauvet
1 sibling, 0 replies; 30+ messages in thread
From: Louis Chauvet @ 2025-02-25 11:01 UTC (permalink / raw)
To: José Expósito
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel
On 18/02/25 - 18:07, José Expósito wrote:
> Create a default subgroup at /config/vkms/planes to allow to create as
> many planes as required.
>
> Co-developed-by: Louis Chauvet <louis.chauvet@bootlin.com>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
> Documentation/gpu/vkms.rst | 16 ++++-
> drivers/gpu/drm/vkms/vkms_configfs.c | 101 +++++++++++++++++++++++++++
> 2 files changed, 116 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
> index 423bdf86b5b1..bf23d0da33fe 100644
> --- a/Documentation/gpu/vkms.rst
> +++ b/Documentation/gpu/vkms.rst
> @@ -71,6 +71,19 @@ By default, the instance is disabled::
> cat /config/vkms/my-vkms/enabled
> 0
>
> +And directories are created for each configurable item of the display pipeline::
> +
> + tree /config/vkms/my-vkms
> + ├── enabled
> + └── planes
> +
> +To add items to the display pipeline, create one or more directories under the
> +available paths.
> +
> +Start by creating one or more planes::
> +
> + sudo mkdir /config/vkms/my-vkms/planes/plane0
> +
> Once you are done configuring the VKMS instance, enable it::
>
> echo "1" | sudo tee /config/vkms/my-vkms/enabled
> @@ -79,8 +92,9 @@ Finally, you can remove the VKMS instance disabling it::
>
> echo "0" | sudo tee /config/vkms/my-vkms/enabled
>
> -And removing the top level directory::
> +And removing the top level directory and its subdirectories::
>
> + sudo rmdir /config/vkms/my-vkms/planes/*
> sudo rmdir /config/vkms/my-vkms
>
> Testing With IGT
> diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c
> index 306f571559b7..dd9dfe51eb3a 100644
> --- a/drivers/gpu/drm/vkms/vkms_configfs.c
> +++ b/drivers/gpu/drm/vkms/vkms_configfs.c
> @@ -15,6 +15,7 @@ static bool is_configfs_registered;
> *
> * @group: Top level configuration group that represents a VKMS device.
> * Initialized when a new directory is created under "/config/vkms/"
> + * @planes_group: Default subgroup of @group at "/config/vkms/planes"
> * @lock: Lock used to project concurrent access to the configuration attributes
> * @config: Protected by @lock. Configuration of the VKMS device
> * @enabled: Protected by @lock. The device is created or destroyed when this
> @@ -22,16 +23,112 @@ static bool is_configfs_registered;
> */
> struct vkms_configfs_device {
> struct config_group group;
> + struct config_group planes_group;
>
> struct mutex lock;
> struct vkms_config *config;
> bool enabled;
> };
>
> +/**
> + * struct vkms_configfs_plane - Configfs representation of a plane
> + *
> + * @group: Top level configuration group that represents a plane.
> + * Initialized when a new directory is created under "/config/vkms/planes"
> + * @dev: The vkms_configfs_device this plane belongs to
> + * @config: Configuration of the VKMS plane
> + */
> +struct vkms_configfs_plane {
> + struct config_group group;
> + struct vkms_configfs_device *dev;
> + struct vkms_config_plane *config;
> +};
> +
> #define device_item_to_vkms_configfs_device(item) \
> container_of(to_config_group((item)), struct vkms_configfs_device, \
> group)
>
> +#define child_group_to_vkms_configfs_device(group) \
> + device_item_to_vkms_configfs_device((&(group)->cg_item)->ci_parent)
> +
> +#define plane_item_to_vkms_configfs_plane(item) \
> + container_of(to_config_group((item)), struct vkms_configfs_plane, group)
> +
> +static void plane_release(struct config_item *item)
> +{
> + struct vkms_configfs_plane *plane;
> + struct mutex *lock;
> +
> + plane = plane_item_to_vkms_configfs_plane(item);
> + lock = &plane->dev->lock;
> +
> + mutex_lock(lock);
> + vkms_config_destroy_plane(plane->config);
> + kfree(plane);
> + mutex_unlock(lock);
scoped_guard here?
> +}
> +
> +static struct configfs_item_operations plane_item_operations = {
> + .release = &plane_release,
> +};
> +
> +static const struct config_item_type plane_item_type = {
> + .ct_item_ops = &plane_item_operations,
> + .ct_owner = THIS_MODULE,
> +};
> +
> +static struct config_group *make_plane_group(struct config_group *group,
> + const char *name)
> +{
> + struct vkms_configfs_device *dev;
> + struct vkms_configfs_plane *plane;
> + int ret;
> +
> + dev = child_group_to_vkms_configfs_device(group);
> +
> + mutex_lock(&dev->lock);
> +
> + if (dev->enabled) {
> + ret = -EINVAL;
Why not -EPERM/-EBUSY?
> + goto err_unlock;
> + }
> +
> + plane = kzalloc(sizeof(*plane), GFP_KERNEL);
> + if (!plane) {
> + ret = -ENOMEM;
> + goto err_unlock;
> + }
> +
> + plane->dev = dev;
> +
> + plane->config = vkms_config_create_plane(dev->config);
> + if (IS_ERR(plane->config)) {
> + ret = PTR_ERR(plane->config);
> + goto err_free;
> + }
> +
> + config_group_init_type_name(&plane->group, name, &plane_item_type);
> +
> + mutex_unlock(&dev->lock);
> +
> + return &plane->group;
> +
> +err_free:
> + kfree(plane);
> +err_unlock:
> + mutex_unlock(&dev->lock);
> + return ERR_PTR(ret);
> +}
scoped_guard?
> +
> +static struct configfs_group_operations planes_group_operations = {
> + .make_group = &make_plane_group,
> +};
> +
> +static const struct config_item_type plane_group_type = {
> + .ct_group_ops = &planes_group_operations,
> + .ct_owner = THIS_MODULE,
> +};
> +
> static ssize_t device_enabled_show(struct config_item *item, char *page)
> {
> struct vkms_configfs_device *dev;
> @@ -137,6 +234,10 @@ static struct config_group *make_device_group(struct config_group *group,
> config_group_init_type_name(&dev->group, name, &device_item_type);
> mutex_init(&dev->lock);
>
> + config_group_init_type_name(&dev->planes_group, "planes",
> + &plane_group_type);
> + configfs_add_default_group(&dev->planes_group, &dev->group);
> +
> return &dev->group;
> }
>
> --
> 2.48.1
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 15/16] drm/vkms: Allow to configure the default device creation
2025-02-18 17:08 ` [PATCH 15/16] drm/vkms: Allow to configure the default device creation José Expósito
@ 2025-02-25 11:02 ` Louis Chauvet
0 siblings, 0 replies; 30+ messages in thread
From: Louis Chauvet @ 2025-02-25 11:02 UTC (permalink / raw)
To: José Expósito
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel
On 18/02/25 - 18:08, José Expósito wrote:
> Add a new module param to allow to create or not the default VKMS
> instance. Useful when combined with configfs to avoid having additional
> VKMS instances.
>
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
> ---
> drivers/gpu/drm/vkms/vkms_drv.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
> index 5bcfbcb6c0c5..b4ed19c97576 100644
> --- a/drivers/gpu/drm/vkms/vkms_drv.c
> +++ b/drivers/gpu/drm/vkms/vkms_drv.c
> @@ -50,6 +50,10 @@ static bool enable_overlay;
> module_param_named(enable_overlay, enable_overlay, bool, 0444);
> MODULE_PARM_DESC(enable_overlay, "Enable/Disable overlay support");
>
> +static bool create_default_dev = true;
> +module_param_named(create_default_dev, create_default_dev, bool, 0444);
> +MODULE_PARM_DESC(create_default_dev, "Create or not the default VKMS device");
> +
> DEFINE_DRM_GEM_FOPS(vkms_driver_fops);
>
> static void vkms_atomic_commit_tail(struct drm_atomic_state *old_state)
> @@ -219,6 +223,9 @@ static int __init vkms_init(void)
> if (ret)
> return ret;
>
> + if (!create_default_dev)
> + return 0;
> +
> config = vkms_config_default_create(enable_cursor, enable_writeback, enable_overlay);
> if (IS_ERR(config))
> return PTR_ERR(config);
> --
> 2.48.1
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 08/16] drm/vkms: Allow to configure multiple encoders via configfs
2025-02-18 17:08 ` [PATCH 08/16] drm/vkms: Allow to configure multiple encoders " José Expósito
@ 2025-02-25 11:02 ` Louis Chauvet
0 siblings, 0 replies; 30+ messages in thread
From: Louis Chauvet @ 2025-02-25 11:02 UTC (permalink / raw)
To: José Expósito
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel
On 18/02/25 - 18:08, José Expósito wrote:
> Create a default subgroup at /config/vkms/encoders to allow to create as
> many encoders as required.
>
> Co-developed-by: Louis Chauvet <louis.chauvet@bootlin.com>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
> Documentation/gpu/vkms.rst | 6 ++
> drivers/gpu/drm/vkms/vkms_configfs.c | 99 ++++++++++++++++++++++++++++
> 2 files changed, 105 insertions(+)
>
> diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
> index 3c9d72bdb65a..24f40128e8f3 100644
> --- a/Documentation/gpu/vkms.rst
> +++ b/Documentation/gpu/vkms.rst
> @@ -76,6 +76,7 @@ And directories are created for each configurable item of the display pipeline::
> tree /config/vkms/my-vkms
> ├── crtcs
> ├── enabled
> + ├── encoders
> └── planes
>
> To add items to the display pipeline, create one or more directories under the
> @@ -97,6 +98,10 @@ CRTCs have 1 configurable attribute:
>
> - writeback: Enable or disable writeback connector support
>
> +Next, create one or more encoders::
> +
> + sudo mkdir /config/vkms/my-vkms/encoders/encoder0
> +
> 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
> @@ -118,6 +123,7 @@ And removing the top level directory and its subdirectories::
> sudo rm /config/vkms/my-vkms/planes/*/possible_crtcs/*
> sudo rmdir /config/vkms/my-vkms/planes/*
> sudo rmdir /config/vkms/my-vkms/crtcs/*
> + sudo rmdir /config/vkms/my-vkms/encoders/*
> sudo rmdir /config/vkms/my-vkms
>
> Testing With IGT
> diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c
> index 7d5ebdd45d53..d7efa50a3fba 100644
> --- a/drivers/gpu/drm/vkms/vkms_configfs.c
> +++ b/drivers/gpu/drm/vkms/vkms_configfs.c
> @@ -17,6 +17,7 @@ static bool is_configfs_registered;
> * Initialized when a new directory is created under "/config/vkms/"
> * @planes_group: Default subgroup of @group at "/config/vkms/planes"
> * @crtcs_group: Default subgroup of @group at "/config/vkms/crtcs"
> + * @encoders_group: Default subgroup of @group at "/config/vkms/encoders"
> * @lock: Lock used to project concurrent access to the configuration attributes
> * @config: Protected by @lock. Configuration of the VKMS device
> * @enabled: Protected by @lock. The device is created or destroyed when this
> @@ -26,6 +27,7 @@ struct vkms_configfs_device {
> struct config_group group;
> struct config_group planes_group;
> struct config_group crtcs_group;
> + struct config_group encoders_group;
>
> struct mutex lock;
> struct vkms_config *config;
> @@ -62,6 +64,20 @@ struct vkms_configfs_crtc {
> struct vkms_config_crtc *config;
> };
>
> +/**
> + * struct vkms_configfs_encoder - Configfs representation of a encoder
> + *
> + * @group: Top level configuration group that represents a encoder.
> + * Initialized when a new directory is created under "/config/vkms/encoders"
> + * @dev: The vkms_configfs_device this encoder belongs to
> + * @config: Configuration of the VKMS encoder
> + */
> +struct vkms_configfs_encoder {
> + struct config_group group;
> + struct vkms_configfs_device *dev;
> + struct vkms_config_encoder *config;
> +};
> +
> #define device_item_to_vkms_configfs_device(item) \
> container_of(to_config_group((item)), struct vkms_configfs_device, \
> group)
> @@ -79,6 +95,10 @@ struct vkms_configfs_crtc {
> #define crtc_item_to_vkms_configfs_crtc(item) \
> container_of(to_config_group((item)), struct vkms_configfs_crtc, group)
>
> +#define encoder_item_to_vkms_configfs_encoder(item) \
> + container_of(to_config_group((item)), struct vkms_configfs_encoder, \
> + group)
> +
> static ssize_t crtc_writeback_show(struct config_item *item, char *page)
> {
> struct vkms_configfs_crtc *crtc;
> @@ -382,6 +402,81 @@ static const struct config_item_type plane_group_type = {
> .ct_owner = THIS_MODULE,
> };
>
> +static void encoder_release(struct config_item *item)
> +{
> + struct vkms_configfs_encoder *encoder;
> + struct mutex *lock;
> +
> + encoder = encoder_item_to_vkms_configfs_encoder(item);
> + lock = &encoder->dev->lock;
> +
> + mutex_lock(lock);
> + vkms_config_destroy_encoder(encoder->dev->config, encoder->config);
> + kfree(encoder);
> + mutex_unlock(lock);
> +}
> +
> +static struct configfs_item_operations encoder_item_operations = {
> + .release = &encoder_release,
> +};
> +
> +static const struct config_item_type encoder_item_type = {
> + .ct_item_ops = &encoder_item_operations,
> + .ct_owner = THIS_MODULE,
> +};
> +
> +static struct config_group *make_encoder_group(struct config_group *group,
> + const char *name)
> +{
> + struct vkms_configfs_device *dev;
> + struct vkms_configfs_encoder *encoder;
> + int ret;
> +
> + dev = child_group_to_vkms_configfs_device(group);
> +
> + mutex_lock(&dev->lock);
> +
> + if (dev->enabled) {
> + ret = -EINVAL;
-EPERM/-EBUSY?
> + goto err_unlock;
> + }
> +
> + encoder = kzalloc(sizeof(*encoder), GFP_KERNEL);
> + if (!encoder) {
> + ret = -ENOMEM;
> + goto err_unlock;
> + }
> +
> + encoder->dev = dev;
> +
> + encoder->config = vkms_config_create_encoder(dev->config);
> + if (IS_ERR(encoder->config)) {
> + ret = PTR_ERR(encoder->config);
> + goto err_free;
> + }
> +
> + config_group_init_type_name(&encoder->group, name, &encoder_item_type);
> +
> + mutex_unlock(&dev->lock);
> +
> + return &encoder->group;
> +
> +err_free:
> + kfree(encoder);
> +err_unlock:
> + mutex_unlock(&dev->lock);
> + return ERR_PTR(ret);
> +}
> +
> +static struct configfs_group_operations encoders_group_operations = {
> + .make_group = &make_encoder_group,
> +};
> +
> +static const struct config_item_type encoder_group_type = {
> + .ct_group_ops = &encoders_group_operations,
> + .ct_owner = THIS_MODULE,
> +};
> +
> static ssize_t device_enabled_show(struct config_item *item, char *page)
> {
> struct vkms_configfs_device *dev;
> @@ -495,6 +590,10 @@ static struct config_group *make_device_group(struct config_group *group,
> &crtc_group_type);
> configfs_add_default_group(&dev->crtcs_group, &dev->group);
>
> + config_group_init_type_name(&dev->encoders_group, "encoders",
> + &encoder_group_type);
> + configfs_add_default_group(&dev->encoders_group, &dev->group);
> +
> return &dev->group;
> }
>
> --
> 2.48.1
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 10/16] drm/vkms: Allow to configure multiple connectors via configfs
2025-02-18 17:08 ` [PATCH 10/16] drm/vkms: Allow to configure multiple connectors " José Expósito
@ 2025-02-25 11:02 ` Louis Chauvet
0 siblings, 0 replies; 30+ messages in thread
From: Louis Chauvet @ 2025-02-25 11:02 UTC (permalink / raw)
To: José Expósito
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel
On 18/02/25 - 18:08, José Expósito wrote:
> Create a default subgroup at
> /config/vkms/connectors to allow to create as many connectors as
> required.
>
> Co-developed-by: Louis Chauvet <louis.chauvet@bootlin.com>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
> Documentation/gpu/vkms.rst | 6 ++
> drivers/gpu/drm/vkms/vkms_configfs.c | 100 +++++++++++++++++++++++++++
> 2 files changed, 106 insertions(+)
>
> diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
> index 6a15af0b7317..3dd55c3e8900 100644
> --- a/Documentation/gpu/vkms.rst
> +++ b/Documentation/gpu/vkms.rst
> @@ -74,6 +74,7 @@ By default, the instance is disabled::
> And directories are created for each configurable item of the display pipeline::
>
> tree /config/vkms/my-vkms
> + ├── connectors
> ├── crtcs
> ├── enabled
> ├── encoders
> @@ -102,6 +103,10 @@ Next, create one or more encoders::
>
> sudo mkdir /config/vkms/my-vkms/encoders/encoder0
>
> +Last but not least, create one or more connectors::
> +
> + sudo mkdir /config/vkms/my-vkms/connectors/connector0
> +
> 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
> @@ -126,6 +131,7 @@ And removing the top level directory and its subdirectories::
> sudo rmdir /config/vkms/my-vkms/planes/*
> sudo rmdir /config/vkms/my-vkms/crtcs/*
> sudo rmdir /config/vkms/my-vkms/encoders/*
> + sudo rmdir /config/vkms/my-vkms/connectors/*
> sudo rmdir /config/vkms/my-vkms
>
> Testing With IGT
> diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c
> index 66c8a66f7b2b..cd8a164bda3d 100644
> --- a/drivers/gpu/drm/vkms/vkms_configfs.c
> +++ b/drivers/gpu/drm/vkms/vkms_configfs.c
> @@ -18,6 +18,7 @@ static bool is_configfs_registered;
> * @planes_group: Default subgroup of @group at "/config/vkms/planes"
> * @crtcs_group: Default subgroup of @group at "/config/vkms/crtcs"
> * @encoders_group: Default subgroup of @group at "/config/vkms/encoders"
> + * @connectors_group: Default subgroup of @group at "/config/vkms/connectors"
> * @lock: Lock used to project concurrent access to the configuration attributes
> * @config: Protected by @lock. Configuration of the VKMS device
> * @enabled: Protected by @lock. The device is created or destroyed when this
> @@ -28,6 +29,7 @@ struct vkms_configfs_device {
> struct config_group planes_group;
> struct config_group crtcs_group;
> struct config_group encoders_group;
> + struct config_group connectors_group;
>
> struct mutex lock;
> struct vkms_config *config;
> @@ -80,6 +82,20 @@ struct vkms_configfs_encoder {
> struct vkms_config_encoder *config;
> };
>
> +/**
> + * struct vkms_configfs_connector - Configfs representation of a connector
> + *
> + * @group: Top level configuration group that represents a connector.
> + * Initialized when a new directory is created under "/config/vkms/connectors"
> + * @dev: The vkms_configfs_device this connector belongs to
> + * @config: Configuration of the VKMS connector
> + */
> +struct vkms_configfs_connector {
> + struct config_group group;
> + struct vkms_configfs_device *dev;
> + struct vkms_config_connector *config;
> +};
> +
> #define device_item_to_vkms_configfs_device(item) \
> container_of(to_config_group((item)), struct vkms_configfs_device, \
> group)
> @@ -105,6 +121,10 @@ struct vkms_configfs_encoder {
> container_of(to_config_group((item)), struct vkms_configfs_encoder, \
> possible_crtcs_group)
>
> +#define connector_item_to_vkms_configfs_connector(item) \
> + container_of(to_config_group((item)), struct vkms_configfs_connector, \
> + group)
> +
> static ssize_t crtc_writeback_show(struct config_item *item, char *page)
> {
> struct vkms_configfs_crtc *crtc;
> @@ -540,6 +560,82 @@ static const struct config_item_type encoder_group_type = {
> .ct_owner = THIS_MODULE,
> };
>
> +static void connector_release(struct config_item *item)
> +{
> + struct vkms_configfs_connector *connector;
> + struct mutex *lock;
> +
> + connector = connector_item_to_vkms_configfs_connector(item);
> + lock = &connector->dev->lock;
> +
> + mutex_lock(lock);
> + vkms_config_destroy_connector(connector->config);
> + kfree(connector);
> + mutex_unlock(lock);
> +}
> +
> +static struct configfs_item_operations connector_item_operations = {
> + .release = &connector_release,
> +};
> +
> +static const struct config_item_type connector_item_type = {
> + .ct_item_ops = &connector_item_operations,
> + .ct_owner = THIS_MODULE,
> +};
> +
> +static struct config_group *make_connector_group(struct config_group *group,
> + const char *name)
> +{
> + struct vkms_configfs_device *dev;
> + struct vkms_configfs_connector *connector;
> + int ret;
> +
> + dev = child_group_to_vkms_configfs_device(group);
> +
> + mutex_lock(&dev->lock);
> +
> + if (dev->enabled) {
> + ret = -EINVAL;
> + goto err_unlock;
> + }
> +
> + connector = kzalloc(sizeof(*connector), GFP_KERNEL);
> + if (!connector) {
> + ret = -ENOMEM;
-EPERM/-EBUSY?
> + goto err_unlock;
> + }
> +
> + connector->dev = dev;
> +
> + connector->config = vkms_config_create_connector(dev->config);
> + if (IS_ERR(connector->config)) {
> + ret = PTR_ERR(connector->config);
> + goto err_free;
> + }
> +
> + config_group_init_type_name(&connector->group, name,
> + &connector_item_type);
> +
> + mutex_unlock(&dev->lock);
> +
> + return &connector->group;
> +
> +err_free:
> + kfree(connector);
> +err_unlock:
> + mutex_unlock(&dev->lock);
> + return ERR_PTR(ret);
> +}
> +
> +static struct configfs_group_operations connectors_group_operations = {
> + .make_group = &make_connector_group,
> +};
> +
> +static const struct config_item_type connector_group_type = {
> + .ct_group_ops = &connectors_group_operations,
> + .ct_owner = THIS_MODULE,
> +};
> +
> static ssize_t device_enabled_show(struct config_item *item, char *page)
> {
> struct vkms_configfs_device *dev;
> @@ -657,6 +753,10 @@ static struct config_group *make_device_group(struct config_group *group,
> &encoder_group_type);
> configfs_add_default_group(&dev->encoders_group, &dev->group);
>
> + config_group_init_type_name(&dev->connectors_group, "connectors",
> + &connector_group_type);
> + configfs_add_default_group(&dev->connectors_group, &dev->group);
> +
> return &dev->group;
> }
>
> --
> 2.48.1
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 06/16] drm/vkms: Allow to configure CRTC writeback support via configfs
2025-02-18 17:07 ` [PATCH 06/16] drm/vkms: Allow to configure CRTC writeback support " José Expósito
@ 2025-02-25 11:02 ` Louis Chauvet
0 siblings, 0 replies; 30+ messages in thread
From: Louis Chauvet @ 2025-02-25 11:02 UTC (permalink / raw)
To: José Expósito
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel
On 18/02/25 - 18:07, José Expósito wrote:
> When a CRTC is created, add a `writeback` file to allow to enable or
> disable writeback connector support
>
> Co-developed-by: Louis Chauvet <louis.chauvet@bootlin.com>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
> Documentation/gpu/vkms.rst | 4 +++
> drivers/gpu/drm/vkms/vkms_configfs.c | 47 ++++++++++++++++++++++++++++
> 2 files changed, 51 insertions(+)
>
> diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
> index da5157adfd79..4e87d8a81844 100644
> --- a/Documentation/gpu/vkms.rst
> +++ b/Documentation/gpu/vkms.rst
> @@ -93,6 +93,10 @@ Continue by creating one or more CRTCs::
>
> sudo mkdir /config/vkms/my-vkms/crtcs/crtc0
>
> +CRTCs have 1 configurable attribute:
> +
> +- writeback: Enable or disable writeback connector support
Can we add: "by writing 1 or 0"?
> +
> Once you are done configuring the VKMS instance, enable it::
>
> echo "1" | sudo tee /config/vkms/my-vkms/enabled
> diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c
> index 52205a8a9cb4..88037a57a138 100644
> --- a/drivers/gpu/drm/vkms/vkms_configfs.c
> +++ b/drivers/gpu/drm/vkms/vkms_configfs.c
> @@ -73,6 +73,52 @@ struct vkms_configfs_crtc {
> #define crtc_item_to_vkms_configfs_crtc(item) \
> container_of(to_config_group((item)), struct vkms_configfs_crtc, group)
>
> +static ssize_t crtc_writeback_show(struct config_item *item, char *page)
> +{
> + struct vkms_configfs_crtc *crtc;
> + bool writeback;
> +
> + crtc = crtc_item_to_vkms_configfs_crtc(item);
> +
> + mutex_lock(&crtc->dev->lock);
> + writeback = vkms_config_crtc_get_writeback(crtc->config);
> + mutex_unlock(&crtc->dev->lock);
> +
> + return sprintf(page, "%d\n", writeback);
> +}
> +
> +static ssize_t crtc_writeback_store(struct config_item *item, const char *page,
> + size_t count)
> +{
> + struct vkms_configfs_crtc *crtc;
> + bool writeback;
> +
> + crtc = crtc_item_to_vkms_configfs_crtc(item);
> +
> + if (kstrtobool(page, &writeback))
> + return -EINVAL;
> +
> + mutex_lock(&crtc->dev->lock);
> +
> + if (crtc->dev->enabled) {
> + mutex_unlock(&crtc->dev->lock);
> + return -EPERM;
> + }
> +
> + vkms_config_crtc_set_writeback(crtc->config, writeback);
> +
> + mutex_unlock(&crtc->dev->lock);
> +
> + return (ssize_t)count;
> +}
> +
> +CONFIGFS_ATTR(crtc_, writeback);
> +
> +static struct configfs_attribute *crtc_item_attrs[] = {
> + &crtc_attr_writeback,
> + NULL,
> +};
> +
> static void crtc_release(struct config_item *item)
> {
> struct vkms_configfs_crtc *crtc;
> @@ -92,6 +138,7 @@ static struct configfs_item_operations crtc_item_operations = {
> };
>
> static const struct config_item_type crtc_item_type = {
> + .ct_attrs = crtc_item_attrs,
> .ct_item_ops = &crtc_item_operations,
> .ct_owner = THIS_MODULE,
> };
> --
> 2.48.1
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 05/16] drm/vkms: Allow to configure multiple CRTCs via configfs
2025-02-18 17:07 ` [PATCH 05/16] drm/vkms: Allow to configure multiple CRTCs " José Expósito
@ 2025-02-25 11:02 ` Louis Chauvet
0 siblings, 0 replies; 30+ messages in thread
From: Louis Chauvet @ 2025-02-25 11:02 UTC (permalink / raw)
To: José Expósito
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel
On 18/02/25 - 18:07, José Expósito wrote:
> Create a default subgroup at /config/vkms/crtcs to allow to create as
> many CRTCs as required.
>
> Co-developed-by: Louis Chauvet <louis.chauvet@bootlin.com>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
> Documentation/gpu/vkms.rst | 6 ++
> drivers/gpu/drm/vkms/vkms_configfs.c | 98 ++++++++++++++++++++++++++++
> 2 files changed, 104 insertions(+)
>
> diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
> index d95f228de05b..da5157adfd79 100644
> --- a/Documentation/gpu/vkms.rst
> +++ b/Documentation/gpu/vkms.rst
> @@ -74,6 +74,7 @@ By default, the instance is disabled::
> And directories are created for each configurable item of the display pipeline::
>
> tree /config/vkms/my-vkms
> + ├── crtcs
> ├── enabled
> └── planes
>
> @@ -88,6 +89,10 @@ Planes have 1 configurable attribute:
>
> - type: Plane type: 0 overlay, 1 primary, 2 cursor
>
> +Continue by creating one or more CRTCs::
> +
> + sudo mkdir /config/vkms/my-vkms/crtcs/crtc0
> +
> Once you are done configuring the VKMS instance, enable it::
>
> echo "1" | sudo tee /config/vkms/my-vkms/enabled
> @@ -99,6 +104,7 @@ Finally, you can remove the VKMS instance disabling it::
> And removing the top level directory and its subdirectories::
>
> sudo rmdir /config/vkms/my-vkms/planes/*
> + sudo rmdir /config/vkms/my-vkms/crtcs/*
> sudo rmdir /config/vkms/my-vkms
>
> Testing With IGT
> diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c
> index 093735f47858..52205a8a9cb4 100644
> --- a/drivers/gpu/drm/vkms/vkms_configfs.c
> +++ b/drivers/gpu/drm/vkms/vkms_configfs.c
> @@ -16,6 +16,7 @@ static bool is_configfs_registered;
> * @group: Top level configuration group that represents a VKMS device.
> * Initialized when a new directory is created under "/config/vkms/"
> * @planes_group: Default subgroup of @group at "/config/vkms/planes"
> + * @crtcs_group: Default subgroup of @group at "/config/vkms/crtcs"
> * @lock: Lock used to project concurrent access to the configuration attributes
> * @config: Protected by @lock. Configuration of the VKMS device
> * @enabled: Protected by @lock. The device is created or destroyed when this
> @@ -24,6 +25,7 @@ static bool is_configfs_registered;
> struct vkms_configfs_device {
> struct config_group group;
> struct config_group planes_group;
> + struct config_group crtcs_group;
>
> struct mutex lock;
> struct vkms_config *config;
> @@ -44,6 +46,20 @@ struct vkms_configfs_plane {
> struct vkms_config_plane *config;
> };
>
> +/**
> + * struct vkms_configfs_crtc - Configfs representation of a CRTC
> + *
> + * @group: Top level configuration group that represents a CRTC.
> + * Initialized when a new directory is created under "/config/vkms/crtcs"
> + * @dev: The vkms_configfs_device this CRTC belongs to
> + * @config: Configuration of the VKMS CRTC
> + */
> +struct vkms_configfs_crtc {
> + struct config_group group;
> + struct vkms_configfs_device *dev;
> + struct vkms_config_crtc *config;
> +};
> +
> #define device_item_to_vkms_configfs_device(item) \
> container_of(to_config_group((item)), struct vkms_configfs_device, \
> group)
> @@ -54,6 +70,84 @@ struct vkms_configfs_plane {
> #define plane_item_to_vkms_configfs_plane(item) \
> container_of(to_config_group((item)), struct vkms_configfs_plane, group)
>
> +#define crtc_item_to_vkms_configfs_crtc(item) \
> + container_of(to_config_group((item)), struct vkms_configfs_crtc, group)
> +
> +static void crtc_release(struct config_item *item)
> +{
> + struct vkms_configfs_crtc *crtc;
> + struct mutex *lock;
> +
> + crtc = crtc_item_to_vkms_configfs_crtc(item);
> + lock = &crtc->dev->lock;
> +
> + mutex_lock(lock);
> + vkms_config_destroy_crtc(crtc->dev->config, crtc->config);
> + kfree(crtc);
> + mutex_unlock(lock);
> +}
> +
> +static struct configfs_item_operations crtc_item_operations = {
> + .release = &crtc_release,
> +};
> +
> +static const struct config_item_type crtc_item_type = {
> + .ct_item_ops = &crtc_item_operations,
> + .ct_owner = THIS_MODULE,
> +};
> +
> +static struct config_group *make_crtc_group(struct config_group *group,
> + const char *name)
> +{
> + struct vkms_configfs_device *dev;
> + struct vkms_configfs_crtc *crtc;
> + int ret;
> +
> + dev = child_group_to_vkms_configfs_device(group);
> +
> + mutex_lock(&dev->lock);
> +
> + if (dev->enabled) {
> + ret = -EINVAL;
Why not -EPERM/-EBUSY?
> + goto err_unlock;
> + }
> +
> + crtc = kzalloc(sizeof(*crtc), GFP_KERNEL);
> + if (!crtc) {
> + ret = -ENOMEM;
> + goto err_unlock;
> + }
> +
> + crtc->dev = dev;
> +
> + crtc->config = vkms_config_create_crtc(dev->config);
> + if (IS_ERR(crtc->config)) {
> + ret = PTR_ERR(crtc->config);
> + goto err_free;
> + }
> +
> + config_group_init_type_name(&crtc->group, name, &crtc_item_type);
> +
> + mutex_unlock(&dev->lock);
> +
> + return &crtc->group;
> +
> +err_free:
> + kfree(crtc);
> +err_unlock:
> + mutex_unlock(&dev->lock);
> + return ERR_PTR(ret);
> +}
> +
> +static struct configfs_group_operations crtcs_group_operations = {
> + .make_group = &make_crtc_group,
> +};
> +
> +static const struct config_item_type crtc_group_type = {
> + .ct_group_ops = &crtcs_group_operations,
> + .ct_owner = THIS_MODULE,
> +};
> +
> static ssize_t plane_type_show(struct config_item *item, char *page)
> {
> struct vkms_configfs_plane *plane;
> @@ -289,6 +383,10 @@ static struct config_group *make_device_group(struct config_group *group,
> &plane_group_type);
> configfs_add_default_group(&dev->planes_group, &dev->group);
>
> + config_group_init_type_name(&dev->crtcs_group, "crtcs",
> + &crtc_group_type);
> + configfs_add_default_group(&dev->crtcs_group, &dev->group);
> +
> return &dev->group;
> }
>
> --
> 2.48.1
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 04/16] drm/vkms: Allow to configure the plane type via configfs
2025-02-18 17:07 ` [PATCH 04/16] drm/vkms: Allow to configure the plane type " José Expósito
@ 2025-02-25 11:02 ` Louis Chauvet
0 siblings, 0 replies; 30+ messages in thread
From: Louis Chauvet @ 2025-02-25 11:02 UTC (permalink / raw)
To: José Expósito
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel
On 18/02/25 - 18:07, José Expósito wrote:
> When a plane is created, add a `type` file to allow to set the type:
>
> - 0 overlay
> - 1 primary
> - 2 cursor
>
> Co-developed-by: Louis Chauvet <louis.chauvet@bootlin.com>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
> Documentation/gpu/vkms.rst | 4 +++
> drivers/gpu/drm/vkms/vkms_configfs.c | 51 ++++++++++++++++++++++++++++
> 2 files changed, 55 insertions(+)
>
> diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
> index bf23d0da33fe..d95f228de05b 100644
> --- a/Documentation/gpu/vkms.rst
> +++ b/Documentation/gpu/vkms.rst
> @@ -84,6 +84,10 @@ Start by creating one or more planes::
>
> sudo mkdir /config/vkms/my-vkms/planes/plane0
>
> +Planes have 1 configurable attribute:
> +
> +- type: Plane type: 0 overlay, 1 primary, 2 cursor
> +
Maybe we can say:
- type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those
exposed by the "type" property of a plane)
> Once you are done configuring the VKMS instance, enable it::
>
> echo "1" | sudo tee /config/vkms/my-vkms/enabled
> diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c
> index dd9dfe51eb3a..093735f47858 100644
> --- a/drivers/gpu/drm/vkms/vkms_configfs.c
> +++ b/drivers/gpu/drm/vkms/vkms_configfs.c
> @@ -54,6 +54,56 @@ struct vkms_configfs_plane {
> #define plane_item_to_vkms_configfs_plane(item) \
> container_of(to_config_group((item)), struct vkms_configfs_plane, group)
>
> +static ssize_t plane_type_show(struct config_item *item, char *page)
> +{
> + struct vkms_configfs_plane *plane;
> + enum drm_plane_type type;
> +
> + plane = plane_item_to_vkms_configfs_plane(item);
> +
> + mutex_lock(&plane->dev->lock);
> + type = vkms_config_plane_get_type(plane->config);
> + mutex_unlock(&plane->dev->lock);
I think we should consider using scoped_gard instead of mutex_lock/unlock.
This may avoid issues (in many other functions there are early returns,
where a scoped_guard may help).
I am not against "pure" mutex_lock/unlock (I am not 100% sure that
scoped_guard really improve the readability), but I think we should be
consistent: if we want to profit from scoped_guard in some functions, we
should use it everywhere in this file.
(all my R-by are valid with or without scoped_guard)
> +
> + return sprintf(page, "%u", type);
> +}
> +
> +static ssize_t plane_type_store(struct config_item *item, const char *page,
> + size_t count)
> +{
> + struct vkms_configfs_plane *plane;
> + enum drm_plane_type type;
> +
> + plane = plane_item_to_vkms_configfs_plane(item);
> +
> + if (kstrtouint(page, 10, &type))
> + return -EINVAL;
> +
> + if (type != DRM_PLANE_TYPE_OVERLAY && type != DRM_PLANE_TYPE_PRIMARY &&
> + type != DRM_PLANE_TYPE_CURSOR)
> + return -EINVAL;
> +
> + mutex_lock(&plane->dev->lock);
> +
> + if (plane->dev->enabled) {
> + mutex_unlock(&plane->dev->lock);
> + return -EPERM;
I just tough about it, but is -EPERM also the return value when you don't
have the right to write on the file? What do you think about -EBUSY? It
also describe a bit better the situation (Device or resource busy vs
Operation not permitted).
Thanks,
Louis Chauvet
> + }
> +
> + vkms_config_plane_set_type(plane->config, type);
> +
> + mutex_unlock(&plane->dev->lock);
> +
> + return (ssize_t)count;
> +}
> +
> +CONFIGFS_ATTR(plane_, type);
> +
> +static struct configfs_attribute *plane_item_attrs[] = {
> + &plane_attr_type,
> + NULL,
> +};
> +
> static void plane_release(struct config_item *item)
> {
> struct vkms_configfs_plane *plane;
> @@ -73,6 +123,7 @@ static struct configfs_item_operations plane_item_operations = {
> };
>
> static const struct config_item_type plane_item_type = {
> + .ct_attrs = plane_item_attrs,
> .ct_item_ops = &plane_item_operations,
> .ct_owner = THIS_MODULE,
> };
> --
> 2.48.1
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 03/16] drm/vkms: Allow to configure multiple planes via configfs
2025-02-18 17:07 ` [PATCH 03/16] drm/vkms: Allow to configure multiple planes " José Expósito
2025-02-25 11:01 ` Louis Chauvet
@ 2025-02-25 11:02 ` Louis Chauvet
1 sibling, 0 replies; 30+ messages in thread
From: Louis Chauvet @ 2025-02-25 11:02 UTC (permalink / raw)
To: José Expósito
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel
On 18/02/25 - 18:07, José Expósito wrote:
> Create a default subgroup at /config/vkms/planes to allow to create as
> many planes as required.
>
> Co-developed-by: Louis Chauvet <louis.chauvet@bootlin.com>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
> ---
> Documentation/gpu/vkms.rst | 16 ++++-
> drivers/gpu/drm/vkms/vkms_configfs.c | 101 +++++++++++++++++++++++++++
> 2 files changed, 116 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
> index 423bdf86b5b1..bf23d0da33fe 100644
> --- a/Documentation/gpu/vkms.rst
> +++ b/Documentation/gpu/vkms.rst
> @@ -71,6 +71,19 @@ By default, the instance is disabled::
> cat /config/vkms/my-vkms/enabled
> 0
>
> +And directories are created for each configurable item of the display pipeline::
> +
> + tree /config/vkms/my-vkms
> + ├── enabled
> + └── planes
> +
> +To add items to the display pipeline, create one or more directories under the
> +available paths.
> +
> +Start by creating one or more planes::
> +
> + sudo mkdir /config/vkms/my-vkms/planes/plane0
> +
> Once you are done configuring the VKMS instance, enable it::
>
> echo "1" | sudo tee /config/vkms/my-vkms/enabled
> @@ -79,8 +92,9 @@ Finally, you can remove the VKMS instance disabling it::
>
> echo "0" | sudo tee /config/vkms/my-vkms/enabled
>
> -And removing the top level directory::
> +And removing the top level directory and its subdirectories::
>
> + sudo rmdir /config/vkms/my-vkms/planes/*
> sudo rmdir /config/vkms/my-vkms
>
> Testing With IGT
> diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c
> index 306f571559b7..dd9dfe51eb3a 100644
> --- a/drivers/gpu/drm/vkms/vkms_configfs.c
> +++ b/drivers/gpu/drm/vkms/vkms_configfs.c
> @@ -15,6 +15,7 @@ static bool is_configfs_registered;
> *
> * @group: Top level configuration group that represents a VKMS device.
> * Initialized when a new directory is created under "/config/vkms/"
> + * @planes_group: Default subgroup of @group at "/config/vkms/planes"
> * @lock: Lock used to project concurrent access to the configuration attributes
> * @config: Protected by @lock. Configuration of the VKMS device
> * @enabled: Protected by @lock. The device is created or destroyed when this
> @@ -22,16 +23,112 @@ static bool is_configfs_registered;
> */
> struct vkms_configfs_device {
> struct config_group group;
> + struct config_group planes_group;
>
> struct mutex lock;
> struct vkms_config *config;
> bool enabled;
> };
>
> +/**
> + * struct vkms_configfs_plane - Configfs representation of a plane
> + *
> + * @group: Top level configuration group that represents a plane.
> + * Initialized when a new directory is created under "/config/vkms/planes"
> + * @dev: The vkms_configfs_device this plane belongs to
> + * @config: Configuration of the VKMS plane
> + */
> +struct vkms_configfs_plane {
> + struct config_group group;
> + struct vkms_configfs_device *dev;
> + struct vkms_config_plane *config;
> +};
> +
> #define device_item_to_vkms_configfs_device(item) \
> container_of(to_config_group((item)), struct vkms_configfs_device, \
> group)
>
> +#define child_group_to_vkms_configfs_device(group) \
> + device_item_to_vkms_configfs_device((&(group)->cg_item)->ci_parent)
> +
> +#define plane_item_to_vkms_configfs_plane(item) \
> + container_of(to_config_group((item)), struct vkms_configfs_plane, group)
> +
> +static void plane_release(struct config_item *item)
> +{
> + struct vkms_configfs_plane *plane;
> + struct mutex *lock;
> +
> + plane = plane_item_to_vkms_configfs_plane(item);
> + lock = &plane->dev->lock;
> +
> + mutex_lock(lock);
> + vkms_config_destroy_plane(plane->config);
> + kfree(plane);
> + mutex_unlock(lock);
> +}
> +
> +static struct configfs_item_operations plane_item_operations = {
> + .release = &plane_release,
> +};
> +
> +static const struct config_item_type plane_item_type = {
> + .ct_item_ops = &plane_item_operations,
> + .ct_owner = THIS_MODULE,
> +};
> +
> +static struct config_group *make_plane_group(struct config_group *group,
> + const char *name)
> +{
> + struct vkms_configfs_device *dev;
> + struct vkms_configfs_plane *plane;
> + int ret;
> +
> + dev = child_group_to_vkms_configfs_device(group);
> +
> + mutex_lock(&dev->lock);
> +
> + if (dev->enabled) {
> + ret = -EINVAL;
> + goto err_unlock;
> + }
> +
> + plane = kzalloc(sizeof(*plane), GFP_KERNEL);
> + if (!plane) {
> + ret = -ENOMEM;
> + goto err_unlock;
> + }
> +
> + plane->dev = dev;
> +
> + plane->config = vkms_config_create_plane(dev->config);
> + if (IS_ERR(plane->config)) {
> + ret = PTR_ERR(plane->config);
> + goto err_free;
> + }
> +
> + config_group_init_type_name(&plane->group, name, &plane_item_type);
> +
> + mutex_unlock(&dev->lock);
> +
> + return &plane->group;
> +
> +err_free:
> + kfree(plane);
> +err_unlock:
> + mutex_unlock(&dev->lock);
> + return ERR_PTR(ret);
> +}
> +
> +static struct configfs_group_operations planes_group_operations = {
> + .make_group = &make_plane_group,
> +};
> +
> +static const struct config_item_type plane_group_type = {
> + .ct_group_ops = &planes_group_operations,
> + .ct_owner = THIS_MODULE,
> +};
> +
> static ssize_t device_enabled_show(struct config_item *item, char *page)
> {
> struct vkms_configfs_device *dev;
> @@ -137,6 +234,10 @@ static struct config_group *make_device_group(struct config_group *group,
> config_group_init_type_name(&dev->group, name, &device_item_type);
> mutex_init(&dev->lock);
>
> + config_group_init_type_name(&dev->planes_group, "planes",
> + &plane_group_type);
> + configfs_add_default_group(&dev->planes_group, &dev->group);
> +
> return &dev->group;
> }
>
> --
> 2.48.1
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 02/16] drm/vkms: Add and remove VKMS instances via configfs
2025-02-18 17:07 ` [PATCH 02/16] drm/vkms: Add and remove VKMS instances via configfs José Expósito
@ 2025-02-25 11:02 ` Louis Chauvet
0 siblings, 0 replies; 30+ messages in thread
From: Louis Chauvet @ 2025-02-25 11:02 UTC (permalink / raw)
To: José Expósito
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel
On 18/02/25 - 18:07, José Expósito wrote:
> Allow to create, enable, disable and destroy VKMS instances using
> configfs.
>
> For the moment, it is not possible to add pipeline items, so trying to
> enable the device will fail printing an informative error to the log.
>
> Co-developed-by: Louis Chauvet <louis.chauvet@bootlin.com>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
> ---
> Documentation/gpu/vkms.rst | 32 +++++
> drivers/gpu/drm/vkms/Kconfig | 1 +
> drivers/gpu/drm/vkms/Makefile | 3 +-
> drivers/gpu/drm/vkms/vkms_configfs.c | 181 +++++++++++++++++++++++++++
> drivers/gpu/drm/vkms/vkms_configfs.h | 8 ++
> drivers/gpu/drm/vkms/vkms_drv.c | 7 ++
> 6 files changed, 231 insertions(+), 1 deletion(-)
> create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.c
> create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.h
>
> diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
> index ba04ac7c2167..423bdf86b5b1 100644
> --- a/Documentation/gpu/vkms.rst
> +++ b/Documentation/gpu/vkms.rst
> @@ -51,6 +51,38 @@ To disable the driver, use ::
>
> sudo modprobe -r vkms
>
> +Configuring With Configfs
> +=========================
> +
> +It is possible to create and configure multiple VKMS instances via configfs.
> +
> +Start by mounting configfs and loading VKMS::
> +
> + sudo mount -t configfs none /config
> + sudo modprobe vkms
> +
> +Once VKMS is loaded, ``/config/vkms`` is created automatically. Each directory
> +under ``/config/vkms`` represents a VKMS instance, create a new one::
> +
> + sudo mkdir /config/vkms/my-vkms
> +
> +By default, the instance is disabled::
> +
> + cat /config/vkms/my-vkms/enabled
> + 0
> +
> +Once you are done configuring the VKMS instance, enable it::
> +
> + echo "1" | sudo tee /config/vkms/my-vkms/enabled
> +
> +Finally, you can remove the VKMS instance disabling it::
> +
> + echo "0" | sudo tee /config/vkms/my-vkms/enabled
> +
> +And removing the top level directory::
> +
> + sudo rmdir /config/vkms/my-vkms
> +
> Testing With IGT
> ================
>
> diff --git a/drivers/gpu/drm/vkms/Kconfig b/drivers/gpu/drm/vkms/Kconfig
> index 3c02f928ffe6..3977bbb99f7d 100644
> --- a/drivers/gpu/drm/vkms/Kconfig
> +++ b/drivers/gpu/drm/vkms/Kconfig
> @@ -7,6 +7,7 @@ config DRM_VKMS
> select DRM_KMS_HELPER
> select DRM_GEM_SHMEM_HELPER
> select CRC32
> + select CONFIGFS_FS
> default n
> help
> Virtual Kernel Mode-Setting (VKMS) is used for testing or for
> diff --git a/drivers/gpu/drm/vkms/Makefile b/drivers/gpu/drm/vkms/Makefile
> index d657865e573f..939991fc8233 100644
> --- a/drivers/gpu/drm/vkms/Makefile
> +++ b/drivers/gpu/drm/vkms/Makefile
> @@ -8,7 +8,8 @@ vkms-y := \
> vkms_composer.o \
> vkms_writeback.o \
> vkms_connector.o \
> - vkms_config.o
> + vkms_config.o \
> + vkms_configfs.o
>
> obj-$(CONFIG_DRM_VKMS) += vkms.o
> obj-$(CONFIG_DRM_VKMS_KUNIT_TEST) += tests/
> diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c
> new file mode 100644
> index 000000000000..306f571559b7
> --- /dev/null
> +++ b/drivers/gpu/drm/vkms/vkms_configfs.c
> @@ -0,0 +1,181 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +#include <linux/configfs.h>
> +#include <linux/mutex.h>
> +#include <linux/slab.h>
> +
> +#include "vkms_drv.h"
> +#include "vkms_config.h"
> +#include "vkms_configfs.h"
> +
> +/* To avoid registering configfs more than once or unregistering on error */
> +static bool is_configfs_registered;
> +
> +/**
> + * struct vkms_configfs_device - Configfs representation of a VKMS device
> + *
> + * @group: Top level configuration group that represents a VKMS device.
> + * Initialized when a new directory is created under "/config/vkms/"
> + * @lock: Lock used to project concurrent access to the configuration attributes
> + * @config: Protected by @lock. Configuration of the VKMS device
> + * @enabled: Protected by @lock. The device is created or destroyed when this
> + * option changes
> + */
> +struct vkms_configfs_device {
> + struct config_group group;
> +
> + struct mutex lock;
> + struct vkms_config *config;
> + bool enabled;
> +};
> +
> +#define device_item_to_vkms_configfs_device(item) \
> + container_of(to_config_group((item)), struct vkms_configfs_device, \
> + group)
> +
> +static ssize_t device_enabled_show(struct config_item *item, char *page)
> +{
> + struct vkms_configfs_device *dev;
> + bool enabled;
> +
> + dev = device_item_to_vkms_configfs_device(item);
> +
> + mutex_lock(&dev->lock);
> + enabled = dev->enabled;
> + mutex_unlock(&dev->lock);
> +
> + return sprintf(page, "%d\n", enabled);
> +}
> +
> +static ssize_t device_enabled_store(struct config_item *item, const char *page,
> + size_t count)
> +{
> + struct vkms_configfs_device *dev;
> + bool enabled;
> + int ret = 0;
> +
> + dev = device_item_to_vkms_configfs_device(item);
> +
> + if (kstrtobool(page, &enabled))
> + return -EINVAL;
> +
> + mutex_lock(&dev->lock);
> +
> + if (!dev->enabled && enabled) {
> + if (!vkms_config_is_valid(dev->config)) {
> + ret = -EINVAL;
> + goto err_unlock;
> + }
> +
> + ret = vkms_create(dev->config);
> + } else if (dev->enabled && !enabled) {
> + vkms_destroy(dev->config);
> + }
> +
> + if (ret)
> + goto err_unlock;
> +
> + dev->enabled = enabled;
> +
> + mutex_unlock(&dev->lock);
> +
> + return (ssize_t)count;
> +
> +err_unlock:
> + mutex_unlock(&dev->lock);
> + return ret;
> +}
> +
> +CONFIGFS_ATTR(device_, enabled);
> +
> +static struct configfs_attribute *device_item_attrs[] = {
> + &device_attr_enabled,
> + NULL,
> +};
> +
> +static void device_release(struct config_item *item)
> +{
> + struct vkms_configfs_device *dev;
> +
> + dev = device_item_to_vkms_configfs_device(item);
> +
> + if (dev->enabled)
> + vkms_destroy(dev->config);
> +
> + mutex_destroy(&dev->lock);
> + vkms_config_destroy(dev->config);
> + kfree(dev);
> +}
> +
> +static struct configfs_item_operations device_item_operations = {
> + .release = &device_release,
> +};
> +
> +static const struct config_item_type device_item_type = {
> + .ct_attrs = device_item_attrs,
> + .ct_item_ops = &device_item_operations,
> + .ct_owner = THIS_MODULE,
> +};
> +
> +static struct config_group *make_device_group(struct config_group *group,
> + const char *name)
> +{
> + struct vkms_configfs_device *dev;
> +
> + if (strcmp(name, DEFAULT_DEVICE_NAME) == 0)
> + return ERR_PTR(-EINVAL);
> +
> + dev = kzalloc(sizeof(*dev), GFP_KERNEL);
> + if (!dev)
> + return ERR_PTR(-ENOMEM);
> +
> + dev->config = vkms_config_create(name);
> + if (IS_ERR(dev->config)) {
> + kfree(dev);
> + return ERR_CAST(dev->config);
> + }
> +
> + config_group_init_type_name(&dev->group, name, &device_item_type);
> + mutex_init(&dev->lock);
> +
> + return &dev->group;
> +}
> +
> +static struct configfs_group_operations device_group_ops = {
> + .make_group = &make_device_group,
> +};
> +
> +static const struct config_item_type device_group_type = {
> + .ct_group_ops = &device_group_ops,
> + .ct_owner = THIS_MODULE,
> +};
> +
> +static struct configfs_subsystem vkms_subsys = {
> + .su_group = {
> + .cg_item = {
> + .ci_name = "vkms",
> + .ci_type = &device_group_type,
> + },
> + },
> + .su_mutex = __MUTEX_INITIALIZER(vkms_subsys.su_mutex),
> +};
> +
> +int vkms_configfs_register(void)
> +{
> + int ret;
> +
> + if (is_configfs_registered)
> + return 0;
> +
> + config_group_init(&vkms_subsys.su_group);
> + ret = configfs_register_subsystem(&vkms_subsys);
> +
> + is_configfs_registered = ret == 0;
> +
> + return ret;
> +}
> +
> +void vkms_configfs_unregister(void)
> +{
> + if (is_configfs_registered)
> + configfs_unregister_subsystem(&vkms_subsys);
> +}
> diff --git a/drivers/gpu/drm/vkms/vkms_configfs.h b/drivers/gpu/drm/vkms/vkms_configfs.h
> new file mode 100644
> index 000000000000..e9020b0043db
> --- /dev/null
> +++ b/drivers/gpu/drm/vkms/vkms_configfs.h
> @@ -0,0 +1,8 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +#ifndef _VKMS_CONFIGFS_H_
> +#define _VKMS_CONFIGFS_H_
> +
> +int vkms_configfs_register(void);
> +void vkms_configfs_unregister(void);
> +
> +#endif /* _VKMS_CONFIGFS_H_ */
> diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
> index 23817c7b997e..5bcfbcb6c0c5 100644
> --- a/drivers/gpu/drm/vkms/vkms_drv.c
> +++ b/drivers/gpu/drm/vkms/vkms_drv.c
> @@ -28,6 +28,7 @@
> #include <drm/drm_vblank.h>
>
> #include "vkms_config.h"
> +#include "vkms_configfs.h"
> #include "vkms_drv.h"
>
> #define DRIVER_NAME "vkms"
> @@ -214,6 +215,10 @@ static int __init vkms_init(void)
> int ret;
> struct vkms_config *config;
>
> + ret = vkms_configfs_register();
> + if (ret)
> + return ret;
> +
> config = vkms_config_default_create(enable_cursor, enable_writeback, enable_overlay);
> if (IS_ERR(config))
> return PTR_ERR(config);
> @@ -250,6 +255,8 @@ void vkms_destroy(struct vkms_config *config)
>
> static void __exit vkms_exit(void)
> {
> + vkms_configfs_unregister();
> +
> if (!default_config)
> return;
>
> --
> 2.48.1
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 01/16] drm/vkms: Expose device creation and destruction
2025-02-18 17:07 ` [PATCH 01/16] drm/vkms: Expose device creation and destruction José Expósito
@ 2025-02-25 11:02 ` Louis Chauvet
0 siblings, 0 replies; 30+ messages in thread
From: Louis Chauvet @ 2025-02-25 11:02 UTC (permalink / raw)
To: José Expósito
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel
On 18/02/25 - 18:07, José Expósito wrote:
> In preparation for configfs support, expose vkms_create() and
> vkms_destroy().
>
> Co-developed-by: Louis Chauvet <louis.chauvet@bootlin.com>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
Hi José,
First, thanks a lot for this series! I am very happy to see this moving, I
hope we will merge it soon!
> ---
> drivers/gpu/drm/vkms/vkms_drv.c | 4 ++--
> drivers/gpu/drm/vkms/vkms_drv.h | 4 ++++
> 2 files changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
> index a24d1655f7b8..23817c7b997e 100644
> --- a/drivers/gpu/drm/vkms/vkms_drv.c
> +++ b/drivers/gpu/drm/vkms/vkms_drv.c
> @@ -146,7 +146,7 @@ static int vkms_modeset_init(struct vkms_device *vkmsdev)
> return vkms_output_init(vkmsdev);
> }
>
> -static int vkms_create(struct vkms_config *config)
> +int vkms_create(struct vkms_config *config)
> {
> int ret;
> struct platform_device *pdev;
> @@ -229,7 +229,7 @@ static int __init vkms_init(void)
> return 0;
> }
>
> -static void vkms_destroy(struct vkms_config *config)
> +void vkms_destroy(struct vkms_config *config)
> {
> struct platform_device *pdev;
>
> diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
> index a74a7fc3a056..0fe08cd0c461 100644
> --- a/drivers/gpu/drm/vkms/vkms_drv.h
> +++ b/drivers/gpu/drm/vkms/vkms_drv.h
> @@ -223,6 +223,10 @@ struct vkms_device {
> #define to_vkms_plane_state(target)\
> container_of(target, struct vkms_plane_state, base.base)
>
> +/* VKMS device */
> +int vkms_create(struct vkms_config *config);
> +void vkms_destroy(struct vkms_config *config);
Can we add some documentation?
/**
* vkms_create - Create a device from a configuration
* @config: Config used to configure the new device
*
* A pointer to the created vkms_device is stored in @config
* Returns 0 in case of success.
*/
/**
* vkms_destroy - Destroy a device
* @config: Config from which the device was created
*
* The device is completly removed, but the @config pointers remains valid
* and can be reused for new devices.
*/
With this kind of documentation:
Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
> +
> /**
> * vkms_crtc_init() - Initialize a CRTC for VKMS
> * @dev: DRM device associated with the VKMS buffer
> --
> 2.48.1
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 00/16] drm/vkms: Add configfs support
2025-02-25 11:01 ` [PATCH 00/16] drm/vkms: Add configfs support Louis Chauvet
@ 2025-02-25 17:56 ` José Expósito
0 siblings, 0 replies; 30+ messages in thread
From: José Expósito @ 2025-02-25 17:56 UTC (permalink / raw)
To: Louis Chauvet
Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
tzimmermann, airlied, dri-devel, linux-kernel
Hi Louis,
Thanks a lot for the super fast review, you are the best!
On Tue, Feb 25, 2025 at 12:01:58PM +0100, Louis Chauvet wrote:
> On 18/02/25 - 18:07, José Expósito wrote:
> > Hi everyone,
> >
> > This series, to be applied on top of [1], allow to configure one or more VKMS
> > instances without having to reload the driver using configfs.
> >
> > The series is structured in 3 blocks:
> >
> > - Patches 1..11: Basic device configuration. For simplicity, I kept the
> > available options as minimal as possible.
>
> Thanks for this series, it is really nice!
>
> I did some review, that can be sumarized in two point:
> - Do we want to use scoped_guard?
Since all mutex locks were unlock at the end of the file, I replaced
mutex_lock/unlock with guard(mutex)(...). The resulting code is now
much cleaner.
Thanks for pointing me to cleanup.h, my Linux kernel books are too
old to include these helpers and I wasn't aware of them.
> - -EPERM, -EINVAL or -EBUSY when attempting to do something while the
> device is enabled
I replaced all the cases with EBUSY, thanks!
> > - Patches 12, 13 and 14: Allow to hot-plug and unplug connectors. This is not
> > part of the minimal set of options, but I included in this series so it can
> > be used as a template/example of how new configurations can be added.
> >
> > - Patches 15 and 16: New option to skip the default device creation and to-do
> > cleanup.
>
> For the next iteration, can you move those patch before 12, 13, 14, so
> 1..11 could be merged before 12..14 (I need to think about the connector
> API to check if it will works with dynamic connector)?
Sure, I moved them to the end in v2.
I experimented with dynamic connectors a little bit and I think that it is
possible to make it backwards compatible:
- We could add a "enabled" file for connectors
- At the moment, connectors can only be created while the device is disabled.
To keep compatibility, if the device is disabled, we need to set
connector->enabled to 1 by default.
- If the device is enabled, we'd need to set connector->enabled to 0. This
would allow the user to configure the connector before it is hot-added.
- We'd need to store if the connector is static or dynamic to allow hot-remove
only dynamic connectors.
I believe that, if we implemented it like this, we'd be able to keep compatibility.
> > The process of configuring a VKMS device is documented in "vkms.rst".
>
> This is a really good documentation!
>
> > Finally, the code is thoroughly tested by a collection of IGT tests [2].
>
> I quickly looked on them, it seems nice! Thank you for this huge
> improvment!
If you could comment on that mailing list, I'm sure that a LGTM from the
maintainer will help :)
Thanks a lot for your work Louis.
Sending v2,
Jose
> Louis Chauvet
>
> > Best wishes,
> > José Expósito
> >
> > [1] https://lore.kernel.org/all/20250218101214.5790-1-jose.exposito89@gmail.com/
> > [2] It is not in patchwork yet, but it'll appear here eventually:
> > https://patchwork.freedesktop.org/project/igt/patches/?submitter=19782&state=*&q=&archive=both&delegate=
> >
> > José Expósito (16):
> > drm/vkms: Expose device creation and destruction
> > drm/vkms: Add and remove VKMS instances via configfs
> > drm/vkms: Allow to configure multiple planes via configfs
> > drm/vkms: Allow to configure the plane type via configfs
> > drm/vkms: Allow to configure multiple CRTCs via configfs
> > drm/vkms: Allow to configure CRTC writeback support via configfs
> > drm/vkms: Allow to attach planes and CRTCs via configfs
> > drm/vkms: Allow to configure multiple encoders via configfs
> > drm/vkms: Allow to attach encoders and CRTCs via configfs
> > drm/vkms: Allow to configure multiple connectors via configfs
> > drm/vkms: Allow to attach connectors and encoders via configfs
> > drm/vkms: Allow to configure connector status
> > drm/vkms: Allow to update the connector status
> > drm/vkms: Allow to configure connector status via configfs
> > drm/vkms: Allow to configure the default device creation
> > drm/vkms: Remove completed task from the TODO list
> >
> > Documentation/gpu/vkms.rst | 98 +-
> > drivers/gpu/drm/vkms/Kconfig | 1 +
> > drivers/gpu/drm/vkms/Makefile | 3 +-
> > drivers/gpu/drm/vkms/tests/vkms_config_test.c | 24 +
> > drivers/gpu/drm/vkms/vkms_config.c | 8 +-
> > drivers/gpu/drm/vkms/vkms_config.h | 26 +
> > drivers/gpu/drm/vkms/vkms_configfs.c | 918 ++++++++++++++++++
> > drivers/gpu/drm/vkms/vkms_configfs.h | 8 +
> > drivers/gpu/drm/vkms/vkms_connector.c | 26 +-
> > drivers/gpu/drm/vkms/vkms_connector.h | 18 +-
> > drivers/gpu/drm/vkms/vkms_drv.c | 18 +-
> > drivers/gpu/drm/vkms/vkms_drv.h | 4 +
> > drivers/gpu/drm/vkms/vkms_output.c | 2 +-
> > 13 files changed, 1138 insertions(+), 16 deletions(-)
> > create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.c
> > create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.h
> >
> >
> > base-commit: 9b6c03cb96b9e19bce2c2764d2c6dd4ccbd06c5d
> > prerequisite-patch-id: 1bff7bbc4ef0e29266265ac3dc009011c046f745
> > prerequisite-patch-id: 74a284d40a426a0038a7054068192238f7658187
> > prerequisite-patch-id: c3e34e88ad6a0acf7d9ded0cdb4745a87cf6fd82
> > prerequisite-patch-id: 9cd0dfaf8e21a811edbe5a2da7185b6f9055d42d
> > prerequisite-patch-id: f50c41578b639370a5d610af6f25c2077321a886
> > prerequisite-patch-id: 5a7219a51e42de002b8dbf94ec8af96320043489
> > prerequisite-patch-id: 67ea5d4e21b4ce4acbd6fc3ce83017f55811c49b
> > prerequisite-patch-id: 37a7fab113a32581f053c09f45efb137afd75a1b
> > prerequisite-patch-id: 475bcdc6267f4b02fb1bb2379145529c33684e4f
> > prerequisite-patch-id: d3114f0b3da3d8b5ad64692df761f1cf42fbdf12
> > prerequisite-patch-id: d1d9280fb056130df2050a09b7ea7e7ddde007c5
> > prerequisite-patch-id: 2c370f3de6d227fa8881212207978cce7bbb18ba
> > prerequisite-patch-id: 938b8fe5437e5f7bc22bffc55ae249a27d399d66
> > prerequisite-patch-id: ab0a510994fbe9985dc46a3d35e6d0574ddbb633
> > --
> > 2.48.1
> >
^ permalink raw reply [flat|nested] 30+ messages in thread
end of thread, other threads:[~2025-02-25 17:56 UTC | newest]
Thread overview: 30+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-18 17:07 [PATCH 00/16] drm/vkms: Add configfs support José Expósito
2025-02-18 17:07 ` [PATCH 01/16] drm/vkms: Expose device creation and destruction José Expósito
2025-02-25 11:02 ` Louis Chauvet
2025-02-18 17:07 ` [PATCH 02/16] drm/vkms: Add and remove VKMS instances via configfs José Expósito
2025-02-25 11:02 ` Louis Chauvet
2025-02-18 17:07 ` [PATCH 03/16] drm/vkms: Allow to configure multiple planes " José Expósito
2025-02-25 11:01 ` Louis Chauvet
2025-02-25 11:02 ` Louis Chauvet
2025-02-18 17:07 ` [PATCH 04/16] drm/vkms: Allow to configure the plane type " José Expósito
2025-02-25 11:02 ` Louis Chauvet
2025-02-18 17:07 ` [PATCH 05/16] drm/vkms: Allow to configure multiple CRTCs " José Expósito
2025-02-25 11:02 ` Louis Chauvet
2025-02-18 17:07 ` [PATCH 06/16] drm/vkms: Allow to configure CRTC writeback support " José Expósito
2025-02-25 11:02 ` Louis Chauvet
2025-02-18 17:07 ` [PATCH 07/16] drm/vkms: Allow to attach planes and CRTCs " José Expósito
2025-02-18 17:08 ` [PATCH 08/16] drm/vkms: Allow to configure multiple encoders " José Expósito
2025-02-25 11:02 ` Louis Chauvet
2025-02-18 17:08 ` [PATCH 09/16] drm/vkms: Allow to attach encoders and CRTCs " José Expósito
2025-02-18 17:08 ` [PATCH 10/16] drm/vkms: Allow to configure multiple connectors " José Expósito
2025-02-25 11:02 ` Louis Chauvet
2025-02-18 17:08 ` [PATCH 11/16] drm/vkms: Allow to attach connectors and encoders " José Expósito
2025-02-18 17:08 ` [PATCH 12/16] drm/vkms: Allow to configure connector status José Expósito
2025-02-18 17:08 ` [PATCH 13/16] drm/vkms: Allow to update the " José Expósito
2025-02-18 17:08 ` [PATCH 14/16] drm/vkms: Allow to configure connector status via configfs José Expósito
2025-02-18 17:08 ` [PATCH 15/16] drm/vkms: Allow to configure the default device creation José Expósito
2025-02-25 11:02 ` Louis Chauvet
2025-02-18 17:08 ` [PATCH 16/16] drm/vkms: Remove completed task from the TODO list José Expósito
2025-02-25 11:01 ` Louis Chauvet
2025-02-25 11:01 ` [PATCH 00/16] drm/vkms: Add configfs support Louis Chauvet
2025-02-25 17:56 ` José Expósito
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox