public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v5 00/16] drm/vkms: Add configfs support
@ 2025-05-07 13:54 José Expósito
  2025-05-07 13:54 ` [PATCH v5 01/16] drm/vkms: Expose device creation and destruction José Expósito
                   ` (17 more replies)
  0 siblings, 18 replies; 23+ messages in thread
From: José Expósito @ 2025-05-07 13:54 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 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 and 13: New option to skip the default device creation and to-do
    cleanup.

  - Patches 14, 15 and 16: 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.

The process of configuring a VKMS device is documented in "vkms.rst".

Finally, the code is thoroughly tested by a collection of IGT tests [1].

Best wishes,
José Expósito

[1] https://lists.freedesktop.org/archives/igt-dev/2025-February/086071.html

Changes in v5:

  - Added Reviewed-by tags, thanks Louis!
  - Rebased on top of drm-misc-next
  - Link to v4: https://lore.kernel.org/dri-devel/20250407081425.6420-1-jose.exposito89@gmail.com/

Changes in v4:

  - Since Louis and I worked on this together, set him as the author of some of
    the patches and me as co-developed-by to reflect this joint effort.
  - Rebased on top of drm-misc-next
  - Link to v3: https://lore.kernel.org/all/20250307163353.5896-1-jose.exposito89@gmail.com/

Changes in v3:

  - Applied review comments by Louis Chauvet: (thanks!!)
    - Use scoped_guard() instead of guard(mutex)(...)
    - Fix a use-after-free error in the connector hot-plug code
  - Rebased on top of drm-misc-next
  - Link to v2: https://lore.kernel.org/all/20250225175936.7223-1-jose.exposito89@gmail.com/

Changes in v2:

  - Applied review comments by Louis Chauvet:
    - Use guard(mutex)(...) instead of lock/unlock
    - Return -EBUSY when trying to modify a enabled device
    - Move the connector hot-plug related patches to the end
  - Rebased on top of drm-misc-next
  - Link to v1: https://lore.kernel.org/dri-devel/20250218170808.9507-1-jose.exposito89@gmail.com/T/

José Expósito (6):
  drm/vkms: Expose device creation and destruction
  drm/vkms: Allow to configure the default device creation
  drm/vkms: Remove completed task from the TODO list
  drm/vkms: Allow to configure connector status
  drm/vkms: Allow to update the connector status
  drm/vkms: Allow to configure connector status via configfs

Louis Chauvet (10):
  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

 Documentation/gpu/vkms.rst                    | 100 ++-
 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          | 833 ++++++++++++++++++
 drivers/gpu/drm/vkms/vkms_configfs.h          |   8 +
 drivers/gpu/drm/vkms/vkms_connector.c         |  35 +
 drivers/gpu/drm/vkms/vkms_connector.h         |   9 +
 drivers/gpu/drm/vkms/vkms_drv.c               |  18 +-
 drivers/gpu/drm/vkms/vkms_drv.h               |  20 +
 12 files changed, 1072 insertions(+), 13 deletions(-)
 create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.c
 create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.h


base-commit: a6c0a91ccb257eaec2aee080df06863ce7601315
-- 
2.49.0


^ permalink raw reply	[flat|nested] 23+ messages in thread

* [PATCH v5 01/16] drm/vkms: Expose device creation and destruction
  2025-05-07 13:54 [PATCH v5 00/16] drm/vkms: Add configfs support José Expósito
@ 2025-05-07 13:54 ` José Expósito
  2025-05-07 13:54 ` [PATCH v5 02/16] drm/vkms: Add and remove VKMS instances via configfs José Expósito
                   ` (16 subsequent siblings)
  17 siblings, 0 replies; 23+ messages in thread
From: José Expósito @ 2025-05-07 13:54 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().

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
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 | 20 ++++++++++++++++++++
 2 files changed, 22 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..2ad8e3da3b7b 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -223,6 +223,26 @@ struct vkms_device {
 #define to_vkms_plane_state(target)\
 	container_of(target, struct vkms_plane_state, base.base)
 
+/**
+ * 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 on success or an error.
+ */
+int vkms_create(struct vkms_config *config);
+
+/**
+ * vkms_destroy() - Destroy a device
+ * @config: Config from which the device was created
+ *
+ * The device is completely removed, but the @config is not freed. It can be
+ * reused or destroyed with vkms_config_destroy().
+ */
+void vkms_destroy(struct vkms_config *config);
+
 /**
  * vkms_crtc_init() - Initialize a CRTC for VKMS
  * @dev: DRM device associated with the VKMS buffer
-- 
2.49.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v5 02/16] drm/vkms: Add and remove VKMS instances via configfs
  2025-05-07 13:54 [PATCH v5 00/16] drm/vkms: Add configfs support José Expósito
  2025-05-07 13:54 ` [PATCH v5 01/16] drm/vkms: Expose device creation and destruction José Expósito
@ 2025-05-07 13:54 ` José Expósito
  2025-05-07 13:54 ` [PATCH v5 03/16] drm/vkms: Allow to configure multiple planes " José Expósito
                   ` (15 subsequent siblings)
  17 siblings, 0 replies; 23+ messages in thread
From: José Expósito @ 2025-05-07 13:54 UTC (permalink / raw)
  To: louis.chauvet
  Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
	tzimmermann, airlied, dri-devel, linux-kernel,
	José Expósito

From: Louis Chauvet <louis.chauvet@bootlin.com>

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.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Co-developed-by: José Expósito <jose.exposito89@gmail.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 | 172 +++++++++++++++++++++++++++
 drivers/gpu/drm/vkms/vkms_configfs.h |   8 ++
 drivers/gpu/drm/vkms/vkms_drv.c      |   7 ++
 6 files changed, 222 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..ee186952971b
--- /dev/null
+++ b/drivers/gpu/drm/vkms/vkms_configfs.c
@@ -0,0 +1,172 @@
+// SPDX-License-Identifier: GPL-2.0+
+#include <linux/cleanup.h>
+#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);
+
+	scoped_guard(mutex, &dev->lock)
+		enabled = dev->enabled;
+
+	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;
+
+	scoped_guard(mutex, &dev->lock) {
+		if (!dev->enabled && enabled) {
+			if (!vkms_config_is_valid(dev->config))
+				return -EINVAL;
+
+			ret = vkms_create(dev->config);
+			if (ret)
+				return ret;
+		} else if (dev->enabled && !enabled) {
+			vkms_destroy(dev->config);
+		}
+
+		dev->enabled = enabled;
+	}
+
+	return (ssize_t)count;
+}
+
+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.49.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v5 03/16] drm/vkms: Allow to configure multiple planes via configfs
  2025-05-07 13:54 [PATCH v5 00/16] drm/vkms: Add configfs support José Expósito
  2025-05-07 13:54 ` [PATCH v5 01/16] drm/vkms: Expose device creation and destruction José Expósito
  2025-05-07 13:54 ` [PATCH v5 02/16] drm/vkms: Add and remove VKMS instances via configfs José Expósito
@ 2025-05-07 13:54 ` José Expósito
  2025-05-07 13:54 ` [PATCH v5 04/16] drm/vkms: Allow to configure the plane type " José Expósito
                   ` (14 subsequent siblings)
  17 siblings, 0 replies; 23+ messages in thread
From: José Expósito @ 2025-05-07 13:54 UTC (permalink / raw)
  To: louis.chauvet
  Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
	tzimmermann, airlied, dri-devel, linux-kernel,
	José Expósito

From: Louis Chauvet <louis.chauvet@bootlin.com>

Create a default subgroup at /config/vkms/planes to allow to create as
many planes as required.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Co-developed-by: José Expósito <jose.exposito89@gmail.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 Documentation/gpu/vkms.rst           | 16 ++++-
 drivers/gpu/drm/vkms/vkms_configfs.c | 88 ++++++++++++++++++++++++++++
 2 files changed, 103 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 ee186952971b..a7c705e00e4c 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"
  * @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
@@ -23,16 +24,99 @@ 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;
+
+	scoped_guard(mutex, lock) {
+		vkms_config_destroy_plane(plane->config);
+		kfree(plane);
+	}
+}
+
+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;
+
+	dev = child_group_to_vkms_configfs_device(group);
+
+	scoped_guard(mutex, &dev->lock) {
+		if (dev->enabled)
+			return ERR_PTR(-EBUSY);
+
+		plane = kzalloc(sizeof(*plane), GFP_KERNEL);
+		if (!plane)
+			return ERR_PTR(-ENOMEM);
+
+		plane->dev = dev;
+
+		plane->config = vkms_config_create_plane(dev->config);
+		if (IS_ERR(plane->config)) {
+			kfree(plane);
+			return ERR_CAST(plane->config);
+		}
+
+		config_group_init_type_name(&plane->group, name, &plane_item_type);
+	}
+
+	return &plane->group;
+}
+
+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;
@@ -128,6 +212,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.49.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v5 04/16] drm/vkms: Allow to configure the plane type via configfs
  2025-05-07 13:54 [PATCH v5 00/16] drm/vkms: Add configfs support José Expósito
                   ` (2 preceding siblings ...)
  2025-05-07 13:54 ` [PATCH v5 03/16] drm/vkms: Allow to configure multiple planes " José Expósito
@ 2025-05-07 13:54 ` José Expósito
  2025-05-07 13:54 ` [PATCH v5 05/16] drm/vkms: Allow to configure multiple CRTCs " José Expósito
                   ` (13 subsequent siblings)
  17 siblings, 0 replies; 23+ messages in thread
From: José Expósito @ 2025-05-07 13:54 UTC (permalink / raw)
  To: louis.chauvet
  Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
	tzimmermann, airlied, dri-devel, linux-kernel,
	José Expósito

From: Louis Chauvet <louis.chauvet@bootlin.com>

When a plane is created, add a `type` file to allow to set the type:

 - 0 overlay
 - 1 primary
 - 2 cursor

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Co-developed-by: José Expósito <jose.exposito89@gmail.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 Documentation/gpu/vkms.rst           |  5 +++
 drivers/gpu/drm/vkms/vkms_configfs.c | 46 ++++++++++++++++++++++++++++
 2 files changed, 51 insertions(+)

diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index bf23d0da33fe..a87e0925bebb 100644
--- a/Documentation/gpu/vkms.rst
+++ b/Documentation/gpu/vkms.rst
@@ -84,6 +84,11 @@ 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 (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 a7c705e00e4c..398755127759 100644
--- a/drivers/gpu/drm/vkms/vkms_configfs.c
+++ b/drivers/gpu/drm/vkms/vkms_configfs.c
@@ -55,6 +55,51 @@ 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);
+
+	scoped_guard(mutex, &plane->dev->lock)
+		type = vkms_config_plane_get_type(plane->config);
+
+	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;
+
+	scoped_guard(mutex, &plane->dev->lock) {
+		if (plane->dev->enabled)
+			return -EBUSY;
+
+		vkms_config_plane_set_type(plane->config, type);
+	}
+
+	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;
@@ -74,6 +119,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.49.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v5 05/16] drm/vkms: Allow to configure multiple CRTCs via configfs
  2025-05-07 13:54 [PATCH v5 00/16] drm/vkms: Add configfs support José Expósito
                   ` (3 preceding siblings ...)
  2025-05-07 13:54 ` [PATCH v5 04/16] drm/vkms: Allow to configure the plane type " José Expósito
@ 2025-05-07 13:54 ` José Expósito
  2025-05-07 13:54 ` [PATCH v5 06/16] drm/vkms: Allow to configure CRTC writeback support " José Expósito
                   ` (12 subsequent siblings)
  17 siblings, 0 replies; 23+ messages in thread
From: José Expósito @ 2025-05-07 13:54 UTC (permalink / raw)
  To: louis.chauvet
  Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
	tzimmermann, airlied, dri-devel, linux-kernel,
	José Expósito

From: Louis Chauvet <louis.chauvet@bootlin.com>

Create a default subgroup at /config/vkms/crtcs to allow to create as
many CRTCs as required.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Co-developed-by: José Expósito <jose.exposito89@gmail.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 Documentation/gpu/vkms.rst           |  6 ++
 drivers/gpu/drm/vkms/vkms_configfs.c | 85 ++++++++++++++++++++++++++++
 2 files changed, 91 insertions(+)

diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index a87e0925bebb..e0699603ef53 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
 
@@ -89,6 +90,10 @@ Planes have 1 configurable attribute:
 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those
   exposed by the "type" property of a plane)
 
+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
@@ -100,6 +105,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 398755127759..62a82366791d 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;
  * @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
@@ -25,6 +26,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;
@@ -45,6 +47,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)
@@ -55,6 +71,71 @@ 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;
+
+	scoped_guard(mutex, lock) {
+		vkms_config_destroy_crtc(crtc->dev->config, crtc->config);
+		kfree(crtc);
+	}
+}
+
+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;
+
+	dev = child_group_to_vkms_configfs_device(group);
+
+	scoped_guard(mutex, &dev->lock) {
+		if (dev->enabled)
+			return ERR_PTR(-EBUSY);
+
+		crtc = kzalloc(sizeof(*crtc), GFP_KERNEL);
+		if (!crtc)
+			return ERR_PTR(-ENOMEM);
+
+		crtc->dev = dev;
+
+		crtc->config = vkms_config_create_crtc(dev->config);
+		if (IS_ERR(crtc->config)) {
+			kfree(crtc);
+			return ERR_CAST(crtc->config);
+		}
+
+		config_group_init_type_name(&crtc->group, name, &crtc_item_type);
+	}
+
+	return &crtc->group;
+}
+
+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;
@@ -262,6 +343,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.49.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v5 06/16] drm/vkms: Allow to configure CRTC writeback support via configfs
  2025-05-07 13:54 [PATCH v5 00/16] drm/vkms: Add configfs support José Expósito
                   ` (4 preceding siblings ...)
  2025-05-07 13:54 ` [PATCH v5 05/16] drm/vkms: Allow to configure multiple CRTCs " José Expósito
@ 2025-05-07 13:54 ` José Expósito
  2025-05-07 13:54 ` [PATCH v5 07/16] drm/vkms: Allow to attach planes and CRTCs " José Expósito
                   ` (11 subsequent siblings)
  17 siblings, 0 replies; 23+ messages in thread
From: José Expósito @ 2025-05-07 13:54 UTC (permalink / raw)
  To: louis.chauvet
  Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
	tzimmermann, airlied, dri-devel, linux-kernel,
	José Expósito

From: Louis Chauvet <louis.chauvet@bootlin.com>

When a CRTC is created, add a `writeback` file to allow to enable or
disable writeback connector support

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Co-developed-by: José Expósito <jose.exposito89@gmail.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 Documentation/gpu/vkms.rst           |  4 +++
 drivers/gpu/drm/vkms/vkms_configfs.c | 42 ++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+)

diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index e0699603ef53..abe7a0f5a4ab 100644
--- a/Documentation/gpu/vkms.rst
+++ b/Documentation/gpu/vkms.rst
@@ -94,6 +94,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 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 62a82366791d..e9f445043268 100644
--- a/drivers/gpu/drm/vkms/vkms_configfs.c
+++ b/drivers/gpu/drm/vkms/vkms_configfs.c
@@ -74,6 +74,47 @@ 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);
+
+	scoped_guard(mutex, &crtc->dev->lock)
+		writeback = vkms_config_crtc_get_writeback(crtc->config);
+
+	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;
+
+	scoped_guard(mutex, &crtc->dev->lock) {
+		if (crtc->dev->enabled)
+			return -EBUSY;
+
+		vkms_config_crtc_set_writeback(crtc->config, writeback);
+	}
+
+	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;
@@ -93,6 +134,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.49.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v5 07/16] drm/vkms: Allow to attach planes and CRTCs via configfs
  2025-05-07 13:54 [PATCH v5 00/16] drm/vkms: Add configfs support José Expósito
                   ` (5 preceding siblings ...)
  2025-05-07 13:54 ` [PATCH v5 06/16] drm/vkms: Allow to configure CRTC writeback support " José Expósito
@ 2025-05-07 13:54 ` José Expósito
  2025-05-07 13:54 ` [PATCH v5 08/16] drm/vkms: Allow to configure multiple encoders " José Expósito
                   ` (10 subsequent siblings)
  17 siblings, 0 replies; 23+ messages in thread
From: José Expósito @ 2025-05-07 13:54 UTC (permalink / raw)
  To: louis.chauvet
  Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
	tzimmermann, airlied, dri-devel, linux-kernel,
	José Expósito

From: Louis Chauvet <louis.chauvet@bootlin.com>

Create a default subgroup at /config/vkms/planes/plane/possible_crtcs
that will contain symbolic links to the possible CRTCs for the plane.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Co-developed-by: José Expósito <jose.exposito89@gmail.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 Documentation/gpu/vkms.rst           |  9 +++++
 drivers/gpu/drm/vkms/vkms_configfs.c | 58 ++++++++++++++++++++++++++++
 2 files changed, 67 insertions(+)

diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index abe7a0f5a4ab..13b96837a266 100644
--- a/Documentation/gpu/vkms.rst
+++ b/Documentation/gpu/vkms.rst
@@ -98,6 +98,14 @@ CRTCs have 1 configurable attribute:
 
 - writeback: Enable or disable writeback connector support by writing 1 or 0
 
+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
@@ -108,6 +116,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 e9f445043268..2cf97c2b6203 100644
--- a/drivers/gpu/drm/vkms/vkms_configfs.c
+++ b/drivers/gpu/drm/vkms/vkms_configfs.c
@@ -38,11 +38,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;
 };
@@ -71,6 +73,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)
 
@@ -178,6 +184,52 @@ 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);
+
+	scoped_guard(mutex, &plane->dev->lock) {
+		if (plane->dev->enabled)
+			return -EBUSY;
+
+		ret = vkms_config_plane_attach_crtc(plane->config, crtc->config);
+	}
+
+	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);
+
+	scoped_guard(mutex, &plane->dev->lock)
+		vkms_config_plane_detach_crtc(plane->config, crtc->config);
+}
+
+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;
@@ -272,6 +324,12 @@ 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);
 	}
 
 	return &plane->group;
-- 
2.49.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v5 08/16] drm/vkms: Allow to configure multiple encoders via configfs
  2025-05-07 13:54 [PATCH v5 00/16] drm/vkms: Add configfs support José Expósito
                   ` (6 preceding siblings ...)
  2025-05-07 13:54 ` [PATCH v5 07/16] drm/vkms: Allow to attach planes and CRTCs " José Expósito
@ 2025-05-07 13:54 ` José Expósito
  2025-05-07 13:54 ` [PATCH v5 09/16] drm/vkms: Allow to attach encoders and CRTCs " José Expósito
                   ` (9 subsequent siblings)
  17 siblings, 0 replies; 23+ messages in thread
From: José Expósito @ 2025-05-07 13:54 UTC (permalink / raw)
  To: louis.chauvet
  Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
	tzimmermann, airlied, dri-devel, linux-kernel,
	José Expósito

From: Louis Chauvet <louis.chauvet@bootlin.com>

Create a default subgroup at /config/vkms/encoders to allow to create as
many encoders as required.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Co-developed-by: José Expósito <jose.exposito89@gmail.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 Documentation/gpu/vkms.rst           |  6 ++
 drivers/gpu/drm/vkms/vkms_configfs.c | 87 ++++++++++++++++++++++++++++
 2 files changed, 93 insertions(+)

diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index 13b96837a266..e24767448775 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
@@ -98,6 +99,10 @@ CRTCs have 1 configurable attribute:
 
 - writeback: Enable or disable writeback connector support by writing 1 or 0
 
+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
@@ -119,6 +124,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 2cf97c2b6203..0df86e63570a 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;
  * 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
@@ -27,6 +28,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;
@@ -63,6 +65,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)
@@ -80,6 +96,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;
@@ -344,6 +364,69 @@ 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;
+
+	scoped_guard(mutex, lock) {
+		vkms_config_destroy_encoder(encoder->dev->config, encoder->config);
+		kfree(encoder);
+	}
+}
+
+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;
+
+	dev = child_group_to_vkms_configfs_device(group);
+
+	scoped_guard(mutex, &dev->lock) {
+		if (dev->enabled)
+			return ERR_PTR(-EBUSY);
+
+		encoder = kzalloc(sizeof(*encoder), GFP_KERNEL);
+		if (!encoder)
+			return ERR_PTR(-ENOMEM);
+
+		encoder->dev = dev;
+
+		encoder->config = vkms_config_create_encoder(dev->config);
+		if (IS_ERR(encoder->config)) {
+			kfree(encoder);
+			return ERR_CAST(encoder->config);
+		}
+
+		config_group_init_type_name(&encoder->group, name,
+					    &encoder_item_type);
+	}
+
+	return &encoder->group;
+}
+
+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;
@@ -447,6 +530,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.49.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v5 09/16] drm/vkms: Allow to attach encoders and CRTCs via configfs
  2025-05-07 13:54 [PATCH v5 00/16] drm/vkms: Add configfs support José Expósito
                   ` (7 preceding siblings ...)
  2025-05-07 13:54 ` [PATCH v5 08/16] drm/vkms: Allow to configure multiple encoders " José Expósito
@ 2025-05-07 13:54 ` José Expósito
  2025-05-07 13:54 ` [PATCH v5 10/16] drm/vkms: Allow to configure multiple connectors " José Expósito
                   ` (8 subsequent siblings)
  17 siblings, 0 replies; 23+ messages in thread
From: José Expósito @ 2025-05-07 13:54 UTC (permalink / raw)
  To: louis.chauvet
  Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
	tzimmermann, airlied, dri-devel, linux-kernel,
	José Expósito

From: Louis Chauvet <louis.chauvet@bootlin.com>

Create a default subgroup at
/config/vkms/encoders/encoder/possible_crtcs that will contain symbolic
links to the possible CRTCs for the encoder.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Co-developed-by: José Expósito <jose.exposito89@gmail.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 Documentation/gpu/vkms.rst           |  2 +
 drivers/gpu/drm/vkms/vkms_configfs.c | 58 ++++++++++++++++++++++++++++
 2 files changed, 60 insertions(+)

diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index e24767448775..650dbfa76f59 100644
--- a/Documentation/gpu/vkms.rst
+++ b/Documentation/gpu/vkms.rst
@@ -106,6 +106,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::
 
@@ -122,6 +123,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 0df86e63570a..7de601e39d2b 100644
--- a/drivers/gpu/drm/vkms/vkms_configfs.c
+++ b/drivers/gpu/drm/vkms/vkms_configfs.c
@@ -70,11 +70,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;
 };
@@ -100,6 +102,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;
@@ -364,6 +370,52 @@ 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);
+
+	scoped_guard(mutex, &encoder->dev->lock) {
+		if (encoder->dev->enabled)
+			return -EBUSY;
+
+		ret = vkms_config_encoder_attach_crtc(encoder->config, crtc->config);
+	}
+
+	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);
+
+	scoped_guard(mutex, &encoder->dev->lock)
+		vkms_config_encoder_detach_crtc(encoder->config, crtc->config);
+}
+
+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;
@@ -413,6 +465,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);
 	}
 
 	return &encoder->group;
-- 
2.49.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v5 10/16] drm/vkms: Allow to configure multiple connectors via configfs
  2025-05-07 13:54 [PATCH v5 00/16] drm/vkms: Add configfs support José Expósito
                   ` (8 preceding siblings ...)
  2025-05-07 13:54 ` [PATCH v5 09/16] drm/vkms: Allow to attach encoders and CRTCs " José Expósito
@ 2025-05-07 13:54 ` José Expósito
  2025-05-07 13:54 ` [PATCH v5 11/16] drm/vkms: Allow to attach connectors and encoders " José Expósito
                   ` (7 subsequent siblings)
  17 siblings, 0 replies; 23+ messages in thread
From: José Expósito @ 2025-05-07 13:54 UTC (permalink / raw)
  To: louis.chauvet
  Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
	tzimmermann, airlied, dri-devel, linux-kernel,
	José Expósito

From: Louis Chauvet <louis.chauvet@bootlin.com>

Create a default subgroup at
/config/vkms/connectors to allow to create as many connectors as
required.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Co-developed-by: José Expósito <jose.exposito89@gmail.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 Documentation/gpu/vkms.rst           |  6 ++
 drivers/gpu/drm/vkms/vkms_configfs.c | 87 ++++++++++++++++++++++++++++
 2 files changed, 93 insertions(+)

diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index 650dbfa76f59..744e2355db23 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
@@ -103,6 +104,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
@@ -127,6 +132,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 7de601e39d2b..692e1b708012 100644
--- a/drivers/gpu/drm/vkms/vkms_configfs.c
+++ b/drivers/gpu/drm/vkms/vkms_configfs.c
@@ -19,6 +19,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
@@ -29,6 +30,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;
@@ -81,6 +83,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)
@@ -106,6 +122,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;
@@ -485,6 +505,69 @@ 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;
+
+	scoped_guard(mutex, lock) {
+		vkms_config_destroy_connector(connector->config);
+		kfree(connector);
+	}
+}
+
+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;
+
+	dev = child_group_to_vkms_configfs_device(group);
+
+	scoped_guard(mutex, &dev->lock) {
+		if (dev->enabled)
+			return ERR_PTR(-EBUSY);
+
+		connector = kzalloc(sizeof(*connector), GFP_KERNEL);
+		if (!connector)
+			return ERR_PTR(-ENOMEM);
+
+		connector->dev = dev;
+
+		connector->config = vkms_config_create_connector(dev->config);
+		if (IS_ERR(connector->config)) {
+			kfree(connector);
+			return ERR_CAST(connector->config);
+		}
+
+		config_group_init_type_name(&connector->group, name,
+					    &connector_item_type);
+	}
+
+	return &connector->group;
+}
+
+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;
@@ -592,6 +675,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.49.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v5 11/16] drm/vkms: Allow to attach connectors and encoders via configfs
  2025-05-07 13:54 [PATCH v5 00/16] drm/vkms: Add configfs support José Expósito
                   ` (9 preceding siblings ...)
  2025-05-07 13:54 ` [PATCH v5 10/16] drm/vkms: Allow to configure multiple connectors " José Expósito
@ 2025-05-07 13:54 ` José Expósito
  2025-05-07 13:54 ` [PATCH v5 12/16] drm/vkms: Allow to configure the default device creation José Expósito
                   ` (6 subsequent siblings)
  17 siblings, 0 replies; 23+ messages in thread
From: José Expósito @ 2025-05-07 13:54 UTC (permalink / raw)
  To: louis.chauvet
  Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
	tzimmermann, airlied, dri-devel, linux-kernel,
	José Expósito

From: Louis Chauvet <louis.chauvet@bootlin.com>

Create a default subgroup at
/config/vkms/connectors/connector/possible_encoders that will contain
symbolic links to the possible encoders for the connector.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Co-developed-by: José Expósito <jose.exposito89@gmail.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 Documentation/gpu/vkms.rst           |  2 +
 drivers/gpu/drm/vkms/vkms_configfs.c | 62 ++++++++++++++++++++++++++++
 2 files changed, 64 insertions(+)

diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index 744e2355db23..74126d2e32e4 100644
--- a/Documentation/gpu/vkms.rst
+++ b/Documentation/gpu/vkms.rst
@@ -112,6 +112,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::
 
@@ -129,6 +130,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 692e1b708012..8e90acbebd6a 100644
--- a/drivers/gpu/drm/vkms/vkms_configfs.c
+++ b/drivers/gpu/drm/vkms/vkms_configfs.c
@@ -88,11 +88,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;
 };
@@ -126,6 +129,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;
@@ -528,6 +535,55 @@ 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);
+
+	scoped_guard(mutex, &connector->dev->lock) {
+		if (connector->dev->enabled)
+			return -EBUSY;
+
+		ret = vkms_config_connector_attach_encoder(connector->config,
+							   encoder->config);
+	}
+
+	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);
+
+	scoped_guard(mutex, &connector->dev->lock) {
+		vkms_config_connector_detach_encoder(connector->config,
+						     encoder->config);
+	}
+}
+
+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)
 {
@@ -554,6 +610,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);
 	}
 
 	return &connector->group;
-- 
2.49.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v5 12/16] drm/vkms: Allow to configure the default device creation
  2025-05-07 13:54 [PATCH v5 00/16] drm/vkms: Add configfs support José Expósito
                   ` (10 preceding siblings ...)
  2025-05-07 13:54 ` [PATCH v5 11/16] drm/vkms: Allow to attach connectors and encoders " José Expósito
@ 2025-05-07 13:54 ` José Expósito
  2025-05-07 13:54 ` [PATCH v5 13/16] drm/vkms: Remove completed task from the TODO list José Expósito
                   ` (5 subsequent siblings)
  17 siblings, 0 replies; 23+ messages in thread
From: José Expósito @ 2025-05-07 13:54 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.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
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.49.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v5 13/16] drm/vkms: Remove completed task from the TODO list
  2025-05-07 13:54 [PATCH v5 00/16] drm/vkms: Add configfs support José Expósito
                   ` (11 preceding siblings ...)
  2025-05-07 13:54 ` [PATCH v5 12/16] drm/vkms: Allow to configure the default device creation José Expósito
@ 2025-05-07 13:54 ` José Expósito
  2025-05-07 13:54 ` [PATCH v5 14/16] drm/vkms: Allow to configure connector status José Expósito
                   ` (4 subsequent siblings)
  17 siblings, 0 replies; 23+ messages in thread
From: José Expósito @ 2025-05-07 13:54 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.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
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 74126d2e32e4..c551241fe873 100644
--- a/Documentation/gpu/vkms.rst
+++ b/Documentation/gpu/vkms.rst
@@ -222,21 +222,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.49.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v5 14/16] drm/vkms: Allow to configure connector status
  2025-05-07 13:54 [PATCH v5 00/16] drm/vkms: Add configfs support José Expósito
                   ` (12 preceding siblings ...)
  2025-05-07 13:54 ` [PATCH v5 13/16] drm/vkms: Remove completed task from the TODO list José Expósito
@ 2025-05-07 13:54 ` José Expósito
  2025-05-07 13:54 ` [PATCH v5 15/16] drm/vkms: Allow to update the " José Expósito
                   ` (3 subsequent siblings)
  17 siblings, 0 replies; 23+ messages in thread
From: José Expósito @ 2025-05-07 13:54 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.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
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.49.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v5 15/16] drm/vkms: Allow to update the connector status
  2025-05-07 13:54 [PATCH v5 00/16] drm/vkms: Add configfs support José Expósito
                   ` (13 preceding siblings ...)
  2025-05-07 13:54 ` [PATCH v5 14/16] drm/vkms: Allow to configure connector status José Expósito
@ 2025-05-07 13:54 ` José Expósito
  2025-05-07 13:54 ` [PATCH v5 16/16] drm/vkms: Allow to configure connector status via configfs José Expósito
                   ` (2 subsequent siblings)
  17 siblings, 0 replies; 23+ messages in thread
From: José Expósito @ 2025-05-07 13:54 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.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 drivers/gpu/drm/vkms/vkms_connector.c | 28 +++++++++++++++++++++++++++
 drivers/gpu/drm/vkms/vkms_connector.h |  3 +++
 2 files changed, 31 insertions(+)

diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/vkms_connector.c
index 48b10cba322a..89fa8d9d739b 100644
--- a/drivers/gpu/drm/vkms/vkms_connector.c
+++ b/drivers/gpu/drm/vkms/vkms_connector.c
@@ -5,9 +5,37 @@
 #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 drm_device *dev = connector->dev;
+	struct vkms_device *vkmsdev = drm_device_to_vkms_device(dev);
+	struct vkms_connector *vkms_connector;
+	enum drm_connector_status status;
+	struct vkms_config_connector *connector_cfg;
+
+	vkms_connector = drm_connector_to_vkms_connector(connector);
+
+	/*
+	 * The connector configuration might not exist if its configfs directory
+	 * was deleted. Therefore, use the configuration if present or keep the
+	 * current status if we can not access it anymore.
+	 */
+	status = connector->status;
+
+	vkms_config_for_each_connector(vkmsdev->config, connector_cfg) {
+		if (connector_cfg->connector == vkms_connector)
+			status = vkms_config_connector_get_status(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,
diff --git a/drivers/gpu/drm/vkms/vkms_connector.h b/drivers/gpu/drm/vkms/vkms_connector.h
index c9149c1b7af0..90f835f70b3b 100644
--- a/drivers/gpu/drm/vkms/vkms_connector.h
+++ b/drivers/gpu/drm/vkms/vkms_connector.h
@@ -5,6 +5,9 @@
 
 #include "vkms_drv.h"
 
+#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
  *
-- 
2.49.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v5 16/16] drm/vkms: Allow to configure connector status via configfs
  2025-05-07 13:54 [PATCH v5 00/16] drm/vkms: Add configfs support José Expósito
                   ` (14 preceding siblings ...)
  2025-05-07 13:54 ` [PATCH v5 15/16] drm/vkms: Allow to update the " José Expósito
@ 2025-05-07 13:54 ` José Expósito
  2025-05-23 12:32 ` [PATCH v5 00/16] drm/vkms: Add configfs support Louis Chauvet
  2025-07-17 16:37 ` Louis Chauvet
  17 siblings, 0 replies; 23+ messages in thread
From: José Expósito @ 2025-05-07 13:54 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.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 Documentation/gpu/vkms.rst            |  5 +++
 drivers/gpu/drm/vkms/vkms_configfs.c  | 48 +++++++++++++++++++++++++++
 drivers/gpu/drm/vkms/vkms_connector.c |  7 ++++
 drivers/gpu/drm/vkms/vkms_connector.h |  6 ++++
 4 files changed, 66 insertions(+)

diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
index c551241fe873..7c54099b1dc6 100644
--- a/Documentation/gpu/vkms.rst
+++ b/Documentation/gpu/vkms.rst
@@ -108,6 +108,11 @@ Last but not least, create one or more connectors::
 
   sudo mkdir /config/vkms/my-vkms/connectors/connector0
 
+Connectors have 1 configurable attribute:
+
+- status: Connection status: 1 connected, 2 disconnected, 3 unknown (same values
+  as those exposed by the "status" property of a connector)
+
 To finish the configuration, link the different pipeline items::
 
   sudo ln -s /config/vkms/my-vkms/crtcs/crtc0 /config/vkms/my-vkms/planes/plane0/possible_crtcs
diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vkms_configfs.c
index 8e90acbebd6a..07ab794e1052 100644
--- a/drivers/gpu/drm/vkms/vkms_configfs.c
+++ b/drivers/gpu/drm/vkms/vkms_configfs.c
@@ -7,6 +7,7 @@
 #include "vkms_drv.h"
 #include "vkms_config.h"
 #include "vkms_configfs.h"
+#include "vkms_connector.h"
 
 /* To avoid registering configfs more than once or unregistering on error */
 static bool is_configfs_registered;
@@ -512,6 +513,52 @@ static const struct config_item_type encoder_group_type = {
 	.ct_owner	= THIS_MODULE,
 };
 
+static ssize_t connector_status_show(struct config_item *item, char *page)
+{
+	struct vkms_configfs_connector *connector;
+	enum drm_connector_status status;
+
+	connector = connector_item_to_vkms_configfs_connector(item);
+
+	scoped_guard(mutex, &connector->dev->lock)
+		status = vkms_config_connector_get_status(connector->config);
+
+	return sprintf(page, "%u", status);
+}
+
+static ssize_t connector_status_store(struct config_item *item,
+				      const char *page, size_t count)
+{
+	struct vkms_configfs_connector *connector;
+	enum drm_connector_status status;
+
+	connector = connector_item_to_vkms_configfs_connector(item);
+
+	if (kstrtouint(page, 10, &status))
+		return -EINVAL;
+
+	if (status != connector_status_connected &&
+	    status != connector_status_disconnected &&
+	    status != connector_status_unknown)
+		return -EINVAL;
+
+	scoped_guard(mutex, &connector->dev->lock) {
+		vkms_config_connector_set_status(connector->config, status);
+
+		if (connector->dev->enabled)
+			vkms_trigger_connector_hotplug(connector->dev->config->dev);
+	}
+
+	return (ssize_t)count;
+}
+
+CONFIGFS_ATTR(connector_, status);
+
+static struct configfs_attribute *connector_item_attrs[] = {
+	&connector_attr_status,
+	NULL,
+};
+
 static void connector_release(struct config_item *item)
 {
 	struct vkms_configfs_connector *connector;
@@ -531,6 +578,7 @@ static struct configfs_item_operations connector_item_operations = {
 };
 
 static const struct config_item_type connector_item_type = {
+	.ct_attrs	= connector_item_attrs,
 	.ct_item_ops	= &connector_item_operations,
 	.ct_owner	= THIS_MODULE,
 };
diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/vkms_connector.c
index 89fa8d9d739b..b0a6b212d3f4 100644
--- a/drivers/gpu/drm/vkms/vkms_connector.c
+++ b/drivers/gpu/drm/vkms/vkms_connector.c
@@ -87,3 +87,10 @@ struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev)
 
 	return connector;
 }
+
+void vkms_trigger_connector_hotplug(struct vkms_device *vkmsdev)
+{
+	struct drm_device *dev = &vkmsdev->drm;
+
+	drm_kms_helper_hotplug_event(dev);
+}
diff --git a/drivers/gpu/drm/vkms/vkms_connector.h b/drivers/gpu/drm/vkms/vkms_connector.h
index 90f835f70b3b..35f2adf97e32 100644
--- a/drivers/gpu/drm/vkms/vkms_connector.h
+++ b/drivers/gpu/drm/vkms/vkms_connector.h
@@ -26,4 +26,10 @@ struct vkms_connector {
  */
 struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev);
 
+/**
+ * struct vkms_device *vkmsdev() - Update the device's connectors status
+ * @vkmsdev: VKMS device to update
+ */
+void vkms_trigger_connector_hotplug(struct vkms_device *vkmsdev);
+
 #endif /* _VKMS_CONNECTOR_H_ */
-- 
2.49.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* Re: [PATCH v5 00/16] drm/vkms: Add configfs support
  2025-05-07 13:54 [PATCH v5 00/16] drm/vkms: Add configfs support José Expósito
                   ` (15 preceding siblings ...)
  2025-05-07 13:54 ` [PATCH v5 16/16] drm/vkms: Allow to configure connector status via configfs José Expósito
@ 2025-05-23 12:32 ` Louis Chauvet
  2025-07-17 16:37 ` Louis Chauvet
  17 siblings, 0 replies; 23+ messages in thread
From: Louis Chauvet @ 2025-05-23 12:32 UTC (permalink / raw)
  To: José Expósito
  Cc: hamohammed.sa, simona, melissa.srw, maarten.lankhorst, mripard,
	tzimmermann, airlied, dri-devel, linux-kernel

Hi everyone,

I have reviewed all the series, but I would appreciate an additional 
review for two important reasons:
- This series introduces a new uAPI, and I believe it is crucial to have 
at least a third perspective before merging.
- I was heavily involved in the creation of these patches, so an 
external review would be very valuable.

Could someone please look at it so we can move forward? We have many new 
parameters to introduce, such as plane configuration and dynamic 
connectors, but everything depends on this series.

Thank you very much for your help!

Best regards,
Louis Chauvet


Le 07/05/2025 à 15:54, José Expósito a écrit :
> Hi everyone,
> 
> This series 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 and 13: New option to skip the default device creation and to-do
>      cleanup.
> 
>    - Patches 14, 15 and 16: 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.
> 
> The process of configuring a VKMS device is documented in "vkms.rst".
> 
> Finally, the code is thoroughly tested by a collection of IGT tests [1].
> 
> Best wishes,
> José Expósito
> 
> [1] https://lists.freedesktop.org/archives/igt-dev/2025-February/086071.html
> 
> Changes in v5:
> 
>    - Added Reviewed-by tags, thanks Louis!
>    - Rebased on top of drm-misc-next
>    - Link to v4: https://lore.kernel.org/dri-devel/20250407081425.6420-1-jose.exposito89@gmail.com/
> 
> Changes in v4:
> 
>    - Since Louis and I worked on this together, set him as the author of some of
>      the patches and me as co-developed-by to reflect this joint effort.
>    - Rebased on top of drm-misc-next
>    - Link to v3: https://lore.kernel.org/all/20250307163353.5896-1-jose.exposito89@gmail.com/
> 
> Changes in v3:
> 
>    - Applied review comments by Louis Chauvet: (thanks!!)
>      - Use scoped_guard() instead of guard(mutex)(...)
>      - Fix a use-after-free error in the connector hot-plug code
>    - Rebased on top of drm-misc-next
>    - Link to v2: https://lore.kernel.org/all/20250225175936.7223-1-jose.exposito89@gmail.com/
> 
> Changes in v2:
> 
>    - Applied review comments by Louis Chauvet:
>      - Use guard(mutex)(...) instead of lock/unlock
>      - Return -EBUSY when trying to modify a enabled device
>      - Move the connector hot-plug related patches to the end
>    - Rebased on top of drm-misc-next
>    - Link to v1: https://lore.kernel.org/dri-devel/20250218170808.9507-1-jose.exposito89@gmail.com/T/
> 
> José Expósito (6):
>    drm/vkms: Expose device creation and destruction
>    drm/vkms: Allow to configure the default device creation
>    drm/vkms: Remove completed task from the TODO list
>    drm/vkms: Allow to configure connector status
>    drm/vkms: Allow to update the connector status
>    drm/vkms: Allow to configure connector status via configfs
> 
> Louis Chauvet (10):
>    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
> 
>   Documentation/gpu/vkms.rst                    | 100 ++-
>   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          | 833 ++++++++++++++++++
>   drivers/gpu/drm/vkms/vkms_configfs.h          |   8 +
>   drivers/gpu/drm/vkms/vkms_connector.c         |  35 +
>   drivers/gpu/drm/vkms/vkms_connector.h         |   9 +
>   drivers/gpu/drm/vkms/vkms_drv.c               |  18 +-
>   drivers/gpu/drm/vkms/vkms_drv.h               |  20 +
>   12 files changed, 1072 insertions(+), 13 deletions(-)
>   create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.c
>   create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.h
> 
> 
> base-commit: a6c0a91ccb257eaec2aee080df06863ce7601315

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


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v5 00/16] drm/vkms: Add configfs support
  2025-05-07 13:54 [PATCH v5 00/16] drm/vkms: Add configfs support José Expósito
                   ` (16 preceding siblings ...)
  2025-05-23 12:32 ` [PATCH v5 00/16] drm/vkms: Add configfs support Louis Chauvet
@ 2025-07-17 16:37 ` Louis Chauvet
  2025-07-17 16:51   ` Mark Yacoub
  2025-07-18 13:03   ` Marius Vlad
  17 siblings, 2 replies; 23+ messages in thread
From: Louis Chauvet @ 2025-07-17 16:37 UTC (permalink / raw)
  To: José Expósito, tzimmermann, mripard, simona,
	sebastian.wick, victoria, Mark Yacoub, xaver.hugl
  Cc: hamohammed.sa, melissa.srw, maarten.lankhorst, airlied, dri-devel,
	linux-kernel

+CC: Mark (Google), Sebastian (Mutter), Xaver (KWin), Victoria (Cosmic)

Hi everyone,

Last week, I presented this work at the Display Next Hackfest, and the 
feedback from compositors was very positive. At least KWin, Mutter, and 
Cosmic are interested in integrating it into their tests, so it would be 
great if someone could review it.

Sebastian quickly tested this work (using [2] for full features) with 
their existing VKMS tests [1], and it worked. From what I understand, 
the tests are quite basic —just sanity checks— but we were able to 
reproduce the default vkms device using ConfigFS.

If another compositor wants to test the ConfigFS interface (I will try 
to keep [2] updated), that would be amazing. Feel free to send feedback!

A small note: This series has a minor conflict since the conversion to 
the faux device, but it can be applied using `b4 am -3 ... && git am -3 
...`.
@josé, if you send a new iteration, can you add markyacoub@google.com in 
copy, and maybe Sebastian, Xaver, Victoria if they want to follow the 
upstreaming?

Thank you,
Louis Chauvet

[1]:https://gitlab.gnome.org/swick/mutter/-/commit/88a7354942d9728dae06fb83cc4f2d2c7b08b694
[2]:https://github.com/Fomys/linux/tree/configfs-everything



Le 07/05/2025 à 15:54, José Expósito a écrit :
> Hi everyone,
> 
> This series 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 and 13: New option to skip the default device creation and to-do
>      cleanup.
> 
>    - Patches 14, 15 and 16: 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.
> 
> The process of configuring a VKMS device is documented in "vkms.rst".
> 
> Finally, the code is thoroughly tested by a collection of IGT tests [1].
> 
> Best wishes,
> José Expósito
> 
> [1] https://lists.freedesktop.org/archives/igt-dev/2025-February/086071.html
> 
> Changes in v5:
> 
>    - Added Reviewed-by tags, thanks Louis!
>    - Rebased on top of drm-misc-next
>    - Link to v4: https://lore.kernel.org/dri-devel/20250407081425.6420-1-jose.exposito89@gmail.com/
> 
> Changes in v4:
> 
>    - Since Louis and I worked on this together, set him as the author of some of
>      the patches and me as co-developed-by to reflect this joint effort.
>    - Rebased on top of drm-misc-next
>    - Link to v3: https://lore.kernel.org/all/20250307163353.5896-1-jose.exposito89@gmail.com/
> 
> Changes in v3:
> 
>    - Applied review comments by Louis Chauvet: (thanks!!)
>      - Use scoped_guard() instead of guard(mutex)(...)
>      - Fix a use-after-free error in the connector hot-plug code
>    - Rebased on top of drm-misc-next
>    - Link to v2: https://lore.kernel.org/all/20250225175936.7223-1-jose.exposito89@gmail.com/
> 
> Changes in v2:
> 
>    - Applied review comments by Louis Chauvet:
>      - Use guard(mutex)(...) instead of lock/unlock
>      - Return -EBUSY when trying to modify a enabled device
>      - Move the connector hot-plug related patches to the end
>    - Rebased on top of drm-misc-next
>    - Link to v1: https://lore.kernel.org/dri-devel/20250218170808.9507-1-jose.exposito89@gmail.com/T/
> 
> José Expósito (6):
>    drm/vkms: Expose device creation and destruction
>    drm/vkms: Allow to configure the default device creation
>    drm/vkms: Remove completed task from the TODO list
>    drm/vkms: Allow to configure connector status
>    drm/vkms: Allow to update the connector status
>    drm/vkms: Allow to configure connector status via configfs
> 
> Louis Chauvet (10):
>    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
> 
>   Documentation/gpu/vkms.rst                    | 100 ++-
>   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          | 833 ++++++++++++++++++
>   drivers/gpu/drm/vkms/vkms_configfs.h          |   8 +
>   drivers/gpu/drm/vkms/vkms_connector.c         |  35 +
>   drivers/gpu/drm/vkms/vkms_connector.h         |   9 +
>   drivers/gpu/drm/vkms/vkms_drv.c               |  18 +-
>   drivers/gpu/drm/vkms/vkms_drv.h               |  20 +
>   12 files changed, 1072 insertions(+), 13 deletions(-)
>   create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.c
>   create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.h
> 
> 
> base-commit: a6c0a91ccb257eaec2aee080df06863ce7601315

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


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v5 00/16] drm/vkms: Add configfs support
  2025-07-17 16:37 ` Louis Chauvet
@ 2025-07-17 16:51   ` Mark Yacoub
  2025-07-18 13:03   ` Marius Vlad
  1 sibling, 0 replies; 23+ messages in thread
From: Mark Yacoub @ 2025-07-17 16:51 UTC (permalink / raw)
  To: Louis Chauvet
  Cc: José Expósito, tzimmermann, mripard, simona,
	sebastian.wick, victoria, xaver.hugl, hamohammed.sa, melissa.srw,
	maarten.lankhorst, airlied, dri-devel, linux-kernel

Merged into Android tree:
https://android-review.git.corp.google.com/c/kernel/common-modules/virtual-device/+/3661920
I'm able to use configfs as expected.

Tested-by: Mark Yacoub <markyacoub@google.com>


On Thu, Jul 17, 2025 at 12:37 PM Louis Chauvet
<louis.chauvet@bootlin.com> wrote:
>
> +CC: Mark (Google), Sebastian (Mutter), Xaver (KWin), Victoria (Cosmic)
>
> Hi everyone,
>
> Last week, I presented this work at the Display Next Hackfest, and the
> feedback from compositors was very positive. At least KWin, Mutter, and
> Cosmic are interested in integrating it into their tests, so it would be
> great if someone could review it.
>
> Sebastian quickly tested this work (using [2] for full features) with
> their existing VKMS tests [1], and it worked. From what I understand,
> the tests are quite basic —just sanity checks— but we were able to
> reproduce the default vkms device using ConfigFS.
>
> If another compositor wants to test the ConfigFS interface (I will try
> to keep [2] updated), that would be amazing. Feel free to send feedback!
>
> A small note: This series has a minor conflict since the conversion to
> the faux device, but it can be applied using `b4 am -3 ... && git am -3
> ...`.
> @josé, if you send a new iteration, can you add markyacoub@google.com in
> copy, and maybe Sebastian, Xaver, Victoria if they want to follow the
> upstreaming?
>
> Thank you,
> Louis Chauvet
>
> [1]:https://gitlab.gnome.org/swick/mutter/-/commit/88a7354942d9728dae06fb83cc4f2d2c7b08b694
> [2]:https://github.com/Fomys/linux/tree/configfs-everything
>
>
>
> Le 07/05/2025 à 15:54, José Expósito a écrit :
> > Hi everyone,
> >
> > This series 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 and 13: New option to skip the default device creation and to-do
> >      cleanup.
> >
> >    - Patches 14, 15 and 16: 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.
> >
> > The process of configuring a VKMS device is documented in "vkms.rst".
> >
> > Finally, the code is thoroughly tested by a collection of IGT tests [1].
> >
> > Best wishes,
> > José Expósito
> >
> > [1] https://lists.freedesktop.org/archives/igt-dev/2025-February/086071.html
> >
> > Changes in v5:
> >
> >    - Added Reviewed-by tags, thanks Louis!
> >    - Rebased on top of drm-misc-next
> >    - Link to v4: https://lore.kernel.org/dri-devel/20250407081425.6420-1-jose.exposito89@gmail.com/
> >
> > Changes in v4:
> >
> >    - Since Louis and I worked on this together, set him as the author of some of
> >      the patches and me as co-developed-by to reflect this joint effort.
> >    - Rebased on top of drm-misc-next
> >    - Link to v3: https://lore.kernel.org/all/20250307163353.5896-1-jose.exposito89@gmail.com/
> >
> > Changes in v3:
> >
> >    - Applied review comments by Louis Chauvet: (thanks!!)
> >      - Use scoped_guard() instead of guard(mutex)(...)
> >      - Fix a use-after-free error in the connector hot-plug code
> >    - Rebased on top of drm-misc-next
> >    - Link to v2: https://lore.kernel.org/all/20250225175936.7223-1-jose.exposito89@gmail.com/
> >
> > Changes in v2:
> >
> >    - Applied review comments by Louis Chauvet:
> >      - Use guard(mutex)(...) instead of lock/unlock
> >      - Return -EBUSY when trying to modify a enabled device
> >      - Move the connector hot-plug related patches to the end
> >    - Rebased on top of drm-misc-next
> >    - Link to v1: https://lore.kernel.org/dri-devel/20250218170808.9507-1-jose.exposito89@gmail.com/T/
> >
> > José Expósito (6):
> >    drm/vkms: Expose device creation and destruction
> >    drm/vkms: Allow to configure the default device creation
> >    drm/vkms: Remove completed task from the TODO list
> >    drm/vkms: Allow to configure connector status
> >    drm/vkms: Allow to update the connector status
> >    drm/vkms: Allow to configure connector status via configfs
> >
> > Louis Chauvet (10):
> >    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
> >
> >   Documentation/gpu/vkms.rst                    | 100 ++-
> >   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          | 833 ++++++++++++++++++
> >   drivers/gpu/drm/vkms/vkms_configfs.h          |   8 +
> >   drivers/gpu/drm/vkms/vkms_connector.c         |  35 +
> >   drivers/gpu/drm/vkms/vkms_connector.h         |   9 +
> >   drivers/gpu/drm/vkms/vkms_drv.c               |  18 +-
> >   drivers/gpu/drm/vkms/vkms_drv.h               |  20 +
> >   12 files changed, 1072 insertions(+), 13 deletions(-)
> >   create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.c
> >   create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.h
> >
> >
> > base-commit: a6c0a91ccb257eaec2aee080df06863ce7601315
>
> --
> Louis Chauvet, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com
>

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v5 00/16] drm/vkms: Add configfs support
  2025-07-17 16:37 ` Louis Chauvet
  2025-07-17 16:51   ` Mark Yacoub
@ 2025-07-18 13:03   ` Marius Vlad
  2025-07-18 15:51     ` Louis Chauvet
  1 sibling, 1 reply; 23+ messages in thread
From: Marius Vlad @ 2025-07-18 13:03 UTC (permalink / raw)
  To: Louis Chauvet
  Cc: José Expósito, tzimmermann, mripard, simona,
	sebastian.wick, victoria, Mark Yacoub, xaver.hugl, hamohammed.sa,
	melissa.srw, maarten.lankhorst, airlied, dri-devel, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 6843 bytes --]

Hi,

FWIW, we (Weston) also use vkms in CI and we have in plan to make use of
these changes to exercise some internal code paths and enhance our tests. 
Look forward to getting these into the tree and have it a in release. We
tend to follow with a branch/stable release so I suppose that's going be
a while. Just wanted to also say thanks a lot for driving this.

Just curios, in the current form would it be possible to configure the
plane's zpos position? Apart from testing underlay/overlay in the same
time, some drivers today allows the primary to be independently
positioned. Simulating these type of configurations would allow see what
architectural changes we might need to do to transition towards a place
where we can use any other plane as a (fallback) compositing one like we
do today with the primary one.

On Thu, Jul 17, 2025 at 06:37:17PM +0200, Louis Chauvet wrote:
> +CC: Mark (Google), Sebastian (Mutter), Xaver (KWin), Victoria (Cosmic)
> 
> Hi everyone,
> 
> Last week, I presented this work at the Display Next Hackfest, and the
> feedback from compositors was very positive. At least KWin, Mutter, and
> Cosmic are interested in integrating it into their tests, so it would be
> great if someone could review it.
> 
> Sebastian quickly tested this work (using [2] for full features) with their
> existing VKMS tests [1], and it worked. From what I understand, the tests
> are quite basic —just sanity checks— but we were able to reproduce the
> default vkms device using ConfigFS.
> 
> If another compositor wants to test the ConfigFS interface (I will try to
> keep [2] updated), that would be amazing. Feel free to send feedback!
> 
> A small note: This series has a minor conflict since the conversion to the
> faux device, but it can be applied using `b4 am -3 ... && git am -3 ...`.
> @josé, if you send a new iteration, can you add markyacoub@google.com in
> copy, and maybe Sebastian, Xaver, Victoria if they want to follow the
> upstreaming?
> 
> Thank you,
> Louis Chauvet
> 
> [1]:https://gitlab.gnome.org/swick/mutter/-/commit/88a7354942d9728dae06fb83cc4f2d2c7b08b694
> [2]:https://github.com/Fomys/linux/tree/configfs-everything
> 
> 
> 
> Le 07/05/2025 à 15:54, José Expósito a écrit :
> > Hi everyone,
> > 
> > This series 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 and 13: New option to skip the default device creation and to-do
> >      cleanup.
> > 
> >    - Patches 14, 15 and 16: 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.
> > 
> > The process of configuring a VKMS device is documented in "vkms.rst".
> > 
> > Finally, the code is thoroughly tested by a collection of IGT tests [1].
> > 
> > Best wishes,
> > José Expósito
> > 
> > [1] https://lists.freedesktop.org/archives/igt-dev/2025-February/086071.html
> > 
> > Changes in v5:
> > 
> >    - Added Reviewed-by tags, thanks Louis!
> >    - Rebased on top of drm-misc-next
> >    - Link to v4: https://lore.kernel.org/dri-devel/20250407081425.6420-1-jose.exposito89@gmail.com/
> > 
> > Changes in v4:
> > 
> >    - Since Louis and I worked on this together, set him as the author of some of
> >      the patches and me as co-developed-by to reflect this joint effort.
> >    - Rebased on top of drm-misc-next
> >    - Link to v3: https://lore.kernel.org/all/20250307163353.5896-1-jose.exposito89@gmail.com/
> > 
> > Changes in v3:
> > 
> >    - Applied review comments by Louis Chauvet: (thanks!!)
> >      - Use scoped_guard() instead of guard(mutex)(...)
> >      - Fix a use-after-free error in the connector hot-plug code
> >    - Rebased on top of drm-misc-next
> >    - Link to v2: https://lore.kernel.org/all/20250225175936.7223-1-jose.exposito89@gmail.com/
> > 
> > Changes in v2:
> > 
> >    - Applied review comments by Louis Chauvet:
> >      - Use guard(mutex)(...) instead of lock/unlock
> >      - Return -EBUSY when trying to modify a enabled device
> >      - Move the connector hot-plug related patches to the end
> >    - Rebased on top of drm-misc-next
> >    - Link to v1: https://lore.kernel.org/dri-devel/20250218170808.9507-1-jose.exposito89@gmail.com/T/
> > 
> > José Expósito (6):
> >    drm/vkms: Expose device creation and destruction
> >    drm/vkms: Allow to configure the default device creation
> >    drm/vkms: Remove completed task from the TODO list
> >    drm/vkms: Allow to configure connector status
> >    drm/vkms: Allow to update the connector status
> >    drm/vkms: Allow to configure connector status via configfs
> > 
> > Louis Chauvet (10):
> >    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
> > 
> >   Documentation/gpu/vkms.rst                    | 100 ++-
> >   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          | 833 ++++++++++++++++++
> >   drivers/gpu/drm/vkms/vkms_configfs.h          |   8 +
> >   drivers/gpu/drm/vkms/vkms_connector.c         |  35 +
> >   drivers/gpu/drm/vkms/vkms_connector.h         |   9 +
> >   drivers/gpu/drm/vkms/vkms_drv.c               |  18 +-
> >   drivers/gpu/drm/vkms/vkms_drv.h               |  20 +
> >   12 files changed, 1072 insertions(+), 13 deletions(-)
> >   create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.c
> >   create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.h
> > 
> > 
> > base-commit: a6c0a91ccb257eaec2aee080df06863ce7601315
> 
> -- 
> Louis Chauvet, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v5 00/16] drm/vkms: Add configfs support
  2025-07-18 13:03   ` Marius Vlad
@ 2025-07-18 15:51     ` Louis Chauvet
  2025-08-04 14:29       ` José Expósito
  0 siblings, 1 reply; 23+ messages in thread
From: Louis Chauvet @ 2025-07-18 15:51 UTC (permalink / raw)
  To: Marius Vlad
  Cc: José Expósito, tzimmermann, mripard, simona,
	sebastian.wick, victoria, Mark Yacoub, xaver.hugl, hamohammed.sa,
	melissa.srw, maarten.lankhorst, airlied, dri-devel, linux-kernel



Le 18/07/2025 à 15:03, Marius Vlad a écrit :
> Hi,
> 
> FWIW, we (Weston) also use vkms in CI and we have in plan to make use of
> these changes to exercise some internal code paths and enhance our tests.
> Look forward to getting these into the tree and have it a in release. We
> tend to follow with a branch/stable release so I suppose that's going be
> a while. Just wanted to also say thanks a lot for driving this.

Hi,

Thanks a lot for this positive feedback!

> Just curios, in the current form would it be possible to configure the
> plane's zpos position? Apart from testing underlay/overlay in the same
> time, some drivers today allows the primary to be independently
> positioned. Simulating these type of configurations would allow see what
> architectural changes we might need to do to transition towards a place
> where we can use any other plane as a (fallback) compositing one like we
> do today with the primary one.

Currently nothing is done to do a proper z-pos managment, and even 
worse: the z-order is not really predictable (order of creation in 
configfs, so if userspace creates cursor-primary, the cursor will be 
behind the primary plane).

We need to change this before merging ConfigFS. Fir the first iteration, 
we can simply: make primary plane always at the back (zpos=0), overlay 
with undefined ordering (zpos=1), cursor on top (zpos=2) directly in 
vkms_plane_init. I need to check if this will be a uAPI break if we add 
later some configfs attributes like default_zpos / zpos_min / zpos_max.

Even with this, we need to fix [1] to compose planes in the correct 
order (I don't think this is broken right now because we create primary 
then overlays then cursor, so the composition order will be correct).

[1]:https://elixir.bootlin.com/linux/v6.15.6/source/drivers/gpu/drm/vkms/vkms_composer.c#L392-L394

@José, I will fix the vkms_composer to use plane->state->zpos or 
normalized_zpos.

Thanks a lot for this suggestion which showed a flaw in the current 
implementation!

Louis Chauvet

> On Thu, Jul 17, 2025 at 06:37:17PM +0200, Louis Chauvet wrote:
>> +CC: Mark (Google), Sebastian (Mutter), Xaver (KWin), Victoria (Cosmic)
>>
>> Hi everyone,
>>
>> Last week, I presented this work at the Display Next Hackfest, and the
>> feedback from compositors was very positive. At least KWin, Mutter, and
>> Cosmic are interested in integrating it into their tests, so it would be
>> great if someone could review it.
>>
>> Sebastian quickly tested this work (using [2] for full features) with their
>> existing VKMS tests [1], and it worked. From what I understand, the tests
>> are quite basic —just sanity checks— but we were able to reproduce the
>> default vkms device using ConfigFS.
>>
>> If another compositor wants to test the ConfigFS interface (I will try to
>> keep [2] updated), that would be amazing. Feel free to send feedback!
>>
>> A small note: This series has a minor conflict since the conversion to the
>> faux device, but it can be applied using `b4 am -3 ... && git am -3 ...`.
>> @josé, if you send a new iteration, can you add markyacoub@google.com in
>> copy, and maybe Sebastian, Xaver, Victoria if they want to follow the
>> upstreaming?
>>
>> Thank you,
>> Louis Chauvet
>>
>> [1]:https://gitlab.gnome.org/swick/mutter/-/commit/88a7354942d9728dae06fb83cc4f2d2c7b08b694
>> [2]:https://github.com/Fomys/linux/tree/configfs-everything
>>
>>
>>
>> Le 07/05/2025 à 15:54, José Expósito a écrit :
>>> Hi everyone,
>>>
>>> This series 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 and 13: New option to skip the default device creation and to-do
>>>       cleanup.
>>>
>>>     - Patches 14, 15 and 16: 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.
>>>
>>> The process of configuring a VKMS device is documented in "vkms.rst".
>>>
>>> Finally, the code is thoroughly tested by a collection of IGT tests [1].
>>>
>>> Best wishes,
>>> José Expósito
>>>
>>> [1] https://lists.freedesktop.org/archives/igt-dev/2025-February/086071.html
>>>
>>> Changes in v5:
>>>
>>>     - Added Reviewed-by tags, thanks Louis!
>>>     - Rebased on top of drm-misc-next
>>>     - Link to v4: https://lore.kernel.org/dri-devel/20250407081425.6420-1-jose.exposito89@gmail.com/
>>>
>>> Changes in v4:
>>>
>>>     - Since Louis and I worked on this together, set him as the author of some of
>>>       the patches and me as co-developed-by to reflect this joint effort.
>>>     - Rebased on top of drm-misc-next
>>>     - Link to v3: https://lore.kernel.org/all/20250307163353.5896-1-jose.exposito89@gmail.com/
>>>
>>> Changes in v3:
>>>
>>>     - Applied review comments by Louis Chauvet: (thanks!!)
>>>       - Use scoped_guard() instead of guard(mutex)(...)
>>>       - Fix a use-after-free error in the connector hot-plug code
>>>     - Rebased on top of drm-misc-next
>>>     - Link to v2: https://lore.kernel.org/all/20250225175936.7223-1-jose.exposito89@gmail.com/
>>>
>>> Changes in v2:
>>>
>>>     - Applied review comments by Louis Chauvet:
>>>       - Use guard(mutex)(...) instead of lock/unlock
>>>       - Return -EBUSY when trying to modify a enabled device
>>>       - Move the connector hot-plug related patches to the end
>>>     - Rebased on top of drm-misc-next
>>>     - Link to v1: https://lore.kernel.org/dri-devel/20250218170808.9507-1-jose.exposito89@gmail.com/T/
>>>
>>> José Expósito (6):
>>>     drm/vkms: Expose device creation and destruction
>>>     drm/vkms: Allow to configure the default device creation
>>>     drm/vkms: Remove completed task from the TODO list
>>>     drm/vkms: Allow to configure connector status
>>>     drm/vkms: Allow to update the connector status
>>>     drm/vkms: Allow to configure connector status via configfs
>>>
>>> Louis Chauvet (10):
>>>     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
>>>
>>>    Documentation/gpu/vkms.rst                    | 100 ++-
>>>    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          | 833 ++++++++++++++++++
>>>    drivers/gpu/drm/vkms/vkms_configfs.h          |   8 +
>>>    drivers/gpu/drm/vkms/vkms_connector.c         |  35 +
>>>    drivers/gpu/drm/vkms/vkms_connector.h         |   9 +
>>>    drivers/gpu/drm/vkms/vkms_drv.c               |  18 +-
>>>    drivers/gpu/drm/vkms/vkms_drv.h               |  20 +
>>>    12 files changed, 1072 insertions(+), 13 deletions(-)
>>>    create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.c
>>>    create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.h
>>>
>>>
>>> base-commit: a6c0a91ccb257eaec2aee080df06863ce7601315
>>
>> -- 
>> Louis Chauvet, Bootlin
>> Embedded Linux and Kernel engineering
>> https://bootlin.com
>>

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


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v5 00/16] drm/vkms: Add configfs support
  2025-07-18 15:51     ` Louis Chauvet
@ 2025-08-04 14:29       ` José Expósito
  0 siblings, 0 replies; 23+ messages in thread
From: José Expósito @ 2025-08-04 14:29 UTC (permalink / raw)
  To: Louis Chauvet
  Cc: Marius Vlad, tzimmermann, mripard, simona, sebastian.wick,
	victoria, Mark Yacoub, xaver.hugl, hamohammed.sa, melissa.srw,
	maarten.lankhorst, airlied, dri-devel, linux-kernel

Hi everyone,

On Fri, Jul 18, 2025 at 05:51:40PM +0200, Louis Chauvet wrote:
> 
> 
> Le 18/07/2025 à 15:03, Marius Vlad a écrit :
> > Hi,
> > 
> > FWIW, we (Weston) also use vkms in CI and we have in plan to make use of
> > these changes to exercise some internal code paths and enhance our tests.
> > Look forward to getting these into the tree and have it a in release. We
> > tend to follow with a branch/stable release so I suppose that's going be
> > a while. Just wanted to also say thanks a lot for driving this.
> 
> Hi,
> 
> Thanks a lot for this positive feedback!
> 
> > Just curios, in the current form would it be possible to configure the
> > plane's zpos position? Apart from testing underlay/overlay in the same
> > time, some drivers today allows the primary to be independently
> > positioned. Simulating these type of configurations would allow see what
> > architectural changes we might need to do to transition towards a place
> > where we can use any other plane as a (fallback) compositing one like we
> > do today with the primary one.
> 
> Currently nothing is done to do a proper z-pos managment, and even worse:
> the z-order is not really predictable (order of creation in configfs, so if
> userspace creates cursor-primary, the cursor will be behind the primary
> plane).

Back from holiday and catching up on email.

First, thanks for presenting this in the Display Next Hackfest :D
I couldn't attend, is there a link to the presentation?

Back to zpos, as far as I can tell, we do not expose this property
at the moment for any plane type.

3 years ago I sent a patch adding the property and blending following
the zpos order, but it wasn't merged:
https://github.com/JoseExposito/linux/commit/befc79a1341b27eb328b582c3841097d17ccce71

Code has changed since then, but we might be able to reuse some bits.
CC me if you send a patch and I'll review it :)

> We need to change this before merging ConfigFS. Fir the first iteration, we
> can simply: make primary plane always at the back (zpos=0), overlay with
> undefined ordering (zpos=1), cursor on top (zpos=2) directly in
> vkms_plane_init. I need to check if this will be a uAPI break if we add
> later some configfs attributes like default_zpos / zpos_min / zpos_max.

If we don't set the zpos at the moment, I don't think we need to
add it before configfs. I'd prefer to merge configfs as it is and
then support zpos both in the default VKMS device and in the custom
ones. In this way, we might avoid unexpected user-space changes.

Anyway, this is something we can discuss in the series adding zpos
rather than here.

> Even with this, we need to fix [1] to compose planes in the correct order (I
> don't think this is broken right now because we create primary then overlays
> then cursor, so the composition order will be correct).
> 
> [1]:https://elixir.bootlin.com/linux/v6.15.6/source/drivers/gpu/drm/vkms/vkms_composer.c#L392-L394
> 
> @José, I will fix the vkms_composer to use plane->state->zpos or
> normalized_zpos.

Check my patch, it is already done. But for the configs code we might
need a different solution.

Thanks to everyone for your interest in this series,
José Expósito

> Thanks a lot for this suggestion which showed a flaw in the current
> implementation!
> 
> Louis Chauvet
> 
> > On Thu, Jul 17, 2025 at 06:37:17PM +0200, Louis Chauvet wrote:
> > > +CC: Mark (Google), Sebastian (Mutter), Xaver (KWin), Victoria (Cosmic)
> > > 
> > > Hi everyone,
> > > 
> > > Last week, I presented this work at the Display Next Hackfest, and the
> > > feedback from compositors was very positive. At least KWin, Mutter, and
> > > Cosmic are interested in integrating it into their tests, so it would be
> > > great if someone could review it.
> > > 
> > > Sebastian quickly tested this work (using [2] for full features) with their
> > > existing VKMS tests [1], and it worked. From what I understand, the tests
> > > are quite basic —just sanity checks— but we were able to reproduce the
> > > default vkms device using ConfigFS.
> > > 
> > > If another compositor wants to test the ConfigFS interface (I will try to
> > > keep [2] updated), that would be amazing. Feel free to send feedback!
> > > 
> > > A small note: This series has a minor conflict since the conversion to the
> > > faux device, but it can be applied using `b4 am -3 ... && git am -3 ...`.
> > > @josé, if you send a new iteration, can you add markyacoub@google.com in
> > > copy, and maybe Sebastian, Xaver, Victoria if they want to follow the
> > > upstreaming?
> > > 
> > > Thank you,
> > > Louis Chauvet
> > > 
> > > [1]:https://gitlab.gnome.org/swick/mutter/-/commit/88a7354942d9728dae06fb83cc4f2d2c7b08b694
> > > [2]:https://github.com/Fomys/linux/tree/configfs-everything
> > > 
> > > 
> > > 
> > > Le 07/05/2025 à 15:54, José Expósito a écrit :
> > > > Hi everyone,
> > > > 
> > > > This series 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 and 13: New option to skip the default device creation and to-do
> > > >       cleanup.
> > > > 
> > > >     - Patches 14, 15 and 16: 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.
> > > > 
> > > > The process of configuring a VKMS device is documented in "vkms.rst".
> > > > 
> > > > Finally, the code is thoroughly tested by a collection of IGT tests [1].
> > > > 
> > > > Best wishes,
> > > > José Expósito
> > > > 
> > > > [1] https://lists.freedesktop.org/archives/igt-dev/2025-February/086071.html
> > > > 
> > > > Changes in v5:
> > > > 
> > > >     - Added Reviewed-by tags, thanks Louis!
> > > >     - Rebased on top of drm-misc-next
> > > >     - Link to v4: https://lore.kernel.org/dri-devel/20250407081425.6420-1-jose.exposito89@gmail.com/
> > > > 
> > > > Changes in v4:
> > > > 
> > > >     - Since Louis and I worked on this together, set him as the author of some of
> > > >       the patches and me as co-developed-by to reflect this joint effort.
> > > >     - Rebased on top of drm-misc-next
> > > >     - Link to v3: https://lore.kernel.org/all/20250307163353.5896-1-jose.exposito89@gmail.com/
> > > > 
> > > > Changes in v3:
> > > > 
> > > >     - Applied review comments by Louis Chauvet: (thanks!!)
> > > >       - Use scoped_guard() instead of guard(mutex)(...)
> > > >       - Fix a use-after-free error in the connector hot-plug code
> > > >     - Rebased on top of drm-misc-next
> > > >     - Link to v2: https://lore.kernel.org/all/20250225175936.7223-1-jose.exposito89@gmail.com/
> > > > 
> > > > Changes in v2:
> > > > 
> > > >     - Applied review comments by Louis Chauvet:
> > > >       - Use guard(mutex)(...) instead of lock/unlock
> > > >       - Return -EBUSY when trying to modify a enabled device
> > > >       - Move the connector hot-plug related patches to the end
> > > >     - Rebased on top of drm-misc-next
> > > >     - Link to v1: https://lore.kernel.org/dri-devel/20250218170808.9507-1-jose.exposito89@gmail.com/T/
> > > > 
> > > > José Expósito (6):
> > > >     drm/vkms: Expose device creation and destruction
> > > >     drm/vkms: Allow to configure the default device creation
> > > >     drm/vkms: Remove completed task from the TODO list
> > > >     drm/vkms: Allow to configure connector status
> > > >     drm/vkms: Allow to update the connector status
> > > >     drm/vkms: Allow to configure connector status via configfs
> > > > 
> > > > Louis Chauvet (10):
> > > >     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
> > > > 
> > > >    Documentation/gpu/vkms.rst                    | 100 ++-
> > > >    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          | 833 ++++++++++++++++++
> > > >    drivers/gpu/drm/vkms/vkms_configfs.h          |   8 +
> > > >    drivers/gpu/drm/vkms/vkms_connector.c         |  35 +
> > > >    drivers/gpu/drm/vkms/vkms_connector.h         |   9 +
> > > >    drivers/gpu/drm/vkms/vkms_drv.c               |  18 +-
> > > >    drivers/gpu/drm/vkms/vkms_drv.h               |  20 +
> > > >    12 files changed, 1072 insertions(+), 13 deletions(-)
> > > >    create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.c
> > > >    create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.h
> > > > 
> > > > 
> > > > base-commit: a6c0a91ccb257eaec2aee080df06863ce7601315
> > > 
> > > -- 
> > > Louis Chauvet, Bootlin
> > > Embedded Linux and Kernel engineering
> > > https://bootlin.com
> > > 
> 
> -- 
> Louis Chauvet, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com
> 

^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2025-08-04 14:29 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-07 13:54 [PATCH v5 00/16] drm/vkms: Add configfs support José Expósito
2025-05-07 13:54 ` [PATCH v5 01/16] drm/vkms: Expose device creation and destruction José Expósito
2025-05-07 13:54 ` [PATCH v5 02/16] drm/vkms: Add and remove VKMS instances via configfs José Expósito
2025-05-07 13:54 ` [PATCH v5 03/16] drm/vkms: Allow to configure multiple planes " José Expósito
2025-05-07 13:54 ` [PATCH v5 04/16] drm/vkms: Allow to configure the plane type " José Expósito
2025-05-07 13:54 ` [PATCH v5 05/16] drm/vkms: Allow to configure multiple CRTCs " José Expósito
2025-05-07 13:54 ` [PATCH v5 06/16] drm/vkms: Allow to configure CRTC writeback support " José Expósito
2025-05-07 13:54 ` [PATCH v5 07/16] drm/vkms: Allow to attach planes and CRTCs " José Expósito
2025-05-07 13:54 ` [PATCH v5 08/16] drm/vkms: Allow to configure multiple encoders " José Expósito
2025-05-07 13:54 ` [PATCH v5 09/16] drm/vkms: Allow to attach encoders and CRTCs " José Expósito
2025-05-07 13:54 ` [PATCH v5 10/16] drm/vkms: Allow to configure multiple connectors " José Expósito
2025-05-07 13:54 ` [PATCH v5 11/16] drm/vkms: Allow to attach connectors and encoders " José Expósito
2025-05-07 13:54 ` [PATCH v5 12/16] drm/vkms: Allow to configure the default device creation José Expósito
2025-05-07 13:54 ` [PATCH v5 13/16] drm/vkms: Remove completed task from the TODO list José Expósito
2025-05-07 13:54 ` [PATCH v5 14/16] drm/vkms: Allow to configure connector status José Expósito
2025-05-07 13:54 ` [PATCH v5 15/16] drm/vkms: Allow to update the " José Expósito
2025-05-07 13:54 ` [PATCH v5 16/16] drm/vkms: Allow to configure connector status via configfs José Expósito
2025-05-23 12:32 ` [PATCH v5 00/16] drm/vkms: Add configfs support Louis Chauvet
2025-07-17 16:37 ` Louis Chauvet
2025-07-17 16:51   ` Mark Yacoub
2025-07-18 13:03   ` Marius Vlad
2025-07-18 15:51     ` Louis Chauvet
2025-08-04 14:29       ` 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