dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [RFC][PATCH 00/10] drm: Add DRM module helpers for existing PCI drivers
@ 2021-12-17 14:46 Thomas Zimmermann
  2021-12-17 14:46 ` [PATCH 01/10] drm: Provide PCI module-init macros Thomas Zimmermann
                   ` (10 more replies)
  0 siblings, 11 replies; 12+ messages in thread
From: Thomas Zimmermann @ 2021-12-17 14:46 UTC (permalink / raw)
  To: javierm, daniel, airlied, mripard, maarten.lankhorst
  Cc: spice-devel, Thomas Zimmermann, dri-devel, virtualization

This is an RFC patchset to complement the helper macros provided
in [1]. The module helpers create module init and exit helpers that
respect the kernel parameters that enable/disable DRM drivers.

There's one more patch that prepares qxl by moving some code around.
It's required to make use of the helpers from within qxl.

Javier, please see if you find anything useful here and cherry-pick
into your patchset. The driver changes should complement the ones
in your patchset. The module macros are similar to yours and should
be easily mergable.

I tested the macros with ast.

[1] https://patchwork.freedesktop.org/series/98162/

Thomas Zimmermann (10):
  drm: Provide PCI module-init macros
  drm/ast: Replace module-init boiler-plate code with DRM helpers
  drm/bochs: Replace module-init boiler-plate code with DRM helpers
  drm/cirrus: Replace module-init boiler-plate code with DRM helpers
  drm/hisilicon/hibmc: Replace module initialization with DRM helpers
  drm/mgag200: Replace module-init boiler-plate code with DRM helpers
  drm/qxl: Move ioctl array next to its only user
  drm/qxl: Replace module-init boiler-plate code with DRM helpers
  drm/vboxvideo: Replace module-init boiler-plate code with DRM helpers
  drm/vmwgfx: Replace module-init boiler-plate code with DRM helpers

 Documentation/gpu/drm-internals.rst           |  6 ++
 drivers/gpu/drm/ast/ast_drv.c                 | 18 +---
 .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c   |  3 +-
 drivers/gpu/drm/mgag200/mgag200_drv.c         | 20 +---
 drivers/gpu/drm/qxl/qxl_drv.c                 | 31 +++---
 drivers/gpu/drm/qxl/qxl_drv.h                 | 13 ++-
 drivers/gpu/drm/qxl/qxl_ioctl.c               | 41 ++------
 drivers/gpu/drm/tiny/bochs.c                  | 20 +---
 drivers/gpu/drm/tiny/cirrus.c                 | 17 +---
 drivers/gpu/drm/vboxvideo/vbox_drv.c          | 20 +---
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c           | 24 +----
 include/drm/drm_module.h                      | 95 +++++++++++++++++++
 12 files changed, 145 insertions(+), 163 deletions(-)
 create mode 100644 include/drm/drm_module.h


base-commit: 3f422828221d9ceefcddef0be33561b1646a1cbe
--
2.34.1


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

* [PATCH 01/10] drm: Provide PCI module-init macros
  2021-12-17 14:46 [RFC][PATCH 00/10] drm: Add DRM module helpers for existing PCI drivers Thomas Zimmermann
@ 2021-12-17 14:46 ` Thomas Zimmermann
  2021-12-17 14:46 ` [PATCH 02/10] drm/ast: Replace module-init boiler-plate code with DRM helpers Thomas Zimmermann
                   ` (9 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Thomas Zimmermann @ 2021-12-17 14:46 UTC (permalink / raw)
  To: javierm, daniel, airlied, mripard, maarten.lankhorst
  Cc: spice-devel, Thomas Zimmermann, dri-devel, virtualization

Provide helper macros to register PCI-based DRM drivers. The new
macros behave like module_pci_driver() with an additional test if
DRM modesetting has been enabled.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 Documentation/gpu/drm-internals.rst |  6 ++
 include/drm/drm_module.h            | 95 +++++++++++++++++++++++++++++
 2 files changed, 101 insertions(+)
 create mode 100644 include/drm/drm_module.h

diff --git a/Documentation/gpu/drm-internals.rst b/Documentation/gpu/drm-internals.rst
index 607f78f0f189..38afed24a75c 100644
--- a/Documentation/gpu/drm-internals.rst
+++ b/Documentation/gpu/drm-internals.rst
@@ -75,6 +75,12 @@ update it, its value is mostly useless. The DRM core prints it to the
 kernel log at initialization time and passes it to userspace through the
 DRM_IOCTL_VERSION ioctl.
 
+Module Initialization
+---------------------
+
+.. kernel-doc:: include/drm/drm_module.h
+   :doc: overview
+
 Managing Ownership of the Framebuffer Aperture
 ----------------------------------------------
 
diff --git a/include/drm/drm_module.h b/include/drm/drm_module.h
new file mode 100644
index 000000000000..eb3fd7bcbec9
--- /dev/null
+++ b/include/drm/drm_module.h
@@ -0,0 +1,95 @@
+/* SPDX-License-Identifier: MIT */
+
+#ifndef DRM_MODULE_H
+#define DRM_MODULE_H
+
+#include <linux/pci.h>
+
+#include <drm/drm_drv.h>
+
+/**
+ * DOC: overview
+ *
+ * This library provides helpers registering DRM drivers during module
+ * initialization and shutdown. The provided helpers act like bus-specific
+ * module helpers, such as module_pci_driver(), but respect additional
+ * parameters that control DRM driver registration.
+ *
+ * Below is an example of initializing a DRM driver for a device on the
+ * PCI bus.
+ *
+ * .. code-block:: c
+ *
+ *	struct pci_driver my_pci_drv = {
+ *	};
+ *
+ *	drm_module_pci_driver(my_pci_drv);
+ *
+ * The generated code will test if DRM drivers are enabled and register
+ * the PCI driver my_pci_drv. For more complex module initialization, you
+ * can still use module_init() and module_exit() in your driver.
+ */
+
+/*
+ * PCI drivers
+ */
+
+static inline int __init drm_pci_register_driver(struct pci_driver *pci_drv)
+{
+	if (drm_firmware_drivers_only())
+		return -ENODEV;
+
+	return pci_register_driver(pci_drv);
+}
+
+/**
+ * drm_module_pci_driver - Register a DRM driver for PCI-based devices
+ * @__pci_drv: the PCI driver structure
+ *
+ * Registers a DRM driver for devices on the PCI bus. The helper
+ * macro behaves like module_pci_driver() but tests the state of
+ * drm_firmware_drivers_only(). For more complex module initialization,
+ * use module_init() and module_exit() directly.
+ *
+ * Each module may only use this macro once. Calling it replaces
+ * module_init() and module_exit().
+ */
+#define drm_module_pci_driver(__pci_drv) \
+	module_driver(__pci_drv, drm_pci_register_driver, pci_unregister_driver)
+
+static inline int __init
+drm_pci_register_driver_if_modeset(struct pci_driver *pci_drv, int modeset)
+{
+	if (drm_firmware_drivers_only() && modeset == -1)
+		return -ENODEV;
+	if (modeset == 0)
+		return -ENODEV;
+
+	return pci_register_driver(pci_drv);
+}
+
+static inline void __exit
+drm_pci_unregister_driver_if_modeset(struct pci_driver *pci_drv, int modeset)
+{
+	pci_unregister_driver(pci_drv);
+}
+
+/**
+ * drm_module_pci_driver_if_modeset - Register a DRM driver for PCI-based devices
+ * @__pci_drv: the PCI driver structure
+ * @__modeset: an additional parameter that disables the driver
+ *
+ * This macro is deprecated and only provided for existing drivers. For
+ * new drivers, use drm_module_pci_driver().
+ *
+ * Registers a DRM driver for devices on the PCI bus. The helper macro
+ * behaves like drm_module_pci_driver() with an additional driver-specific
+ * flag. If __modeset is 0, the driver has been disabled, if __modeset is
+ * -1 the driver state depends on the global DRM state. For all other
+ * values, the PCI driver has been enabled. The default should be -1.
+ */
+#define drm_module_pci_driver_if_modeset(__pci_drv, __modeset) \
+	module_driver(__pci_drv, drm_pci_register_driver_if_modeset, \
+		      drm_pci_unregister_driver_if_modeset, __modeset)
+
+#endif
-- 
2.34.1


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

* [PATCH 02/10] drm/ast: Replace module-init boiler-plate code with DRM helpers
  2021-12-17 14:46 [RFC][PATCH 00/10] drm: Add DRM module helpers for existing PCI drivers Thomas Zimmermann
  2021-12-17 14:46 ` [PATCH 01/10] drm: Provide PCI module-init macros Thomas Zimmermann
@ 2021-12-17 14:46 ` Thomas Zimmermann
  2021-12-17 14:46 ` [PATCH 03/10] drm/bochs: " Thomas Zimmermann
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Thomas Zimmermann @ 2021-12-17 14:46 UTC (permalink / raw)
  To: javierm, daniel, airlied, mripard, maarten.lankhorst
  Cc: spice-devel, Thomas Zimmermann, dri-devel, virtualization

Remove custom ast_init() and ast_exit() functions and initialize the
module with DRM module helpers.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/ast/ast_drv.c | 18 ++----------------
 1 file changed, 2 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/ast/ast_drv.c b/drivers/gpu/drm/ast/ast_drv.c
index 6d8613f6fe1c..7465c4f0156a 100644
--- a/drivers/gpu/drm/ast/ast_drv.c
+++ b/drivers/gpu/drm/ast/ast_drv.c
@@ -34,6 +34,7 @@
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_gem_vram_helper.h>
+#include <drm/drm_module.h>
 #include <drm/drm_probe_helper.h>
 
 #include "ast_drv.h"
@@ -230,22 +231,7 @@ static struct pci_driver ast_pci_driver = {
 	.driver.pm = &ast_pm_ops,
 };
 
-static int __init ast_init(void)
-{
-	if (drm_firmware_drivers_only() && ast_modeset == -1)
-		return -EINVAL;
-
-	if (ast_modeset == 0)
-		return -EINVAL;
-	return pci_register_driver(&ast_pci_driver);
-}
-static void __exit ast_exit(void)
-{
-	pci_unregister_driver(&ast_pci_driver);
-}
-
-module_init(ast_init);
-module_exit(ast_exit);
+drm_module_pci_driver_if_modeset(ast_pci_driver, ast_modeset);
 
 MODULE_AUTHOR(DRIVER_AUTHOR);
 MODULE_DESCRIPTION(DRIVER_DESC);
-- 
2.34.1


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

* [PATCH 03/10] drm/bochs: Replace module-init boiler-plate code with DRM helpers
  2021-12-17 14:46 [RFC][PATCH 00/10] drm: Add DRM module helpers for existing PCI drivers Thomas Zimmermann
  2021-12-17 14:46 ` [PATCH 01/10] drm: Provide PCI module-init macros Thomas Zimmermann
  2021-12-17 14:46 ` [PATCH 02/10] drm/ast: Replace module-init boiler-plate code with DRM helpers Thomas Zimmermann
@ 2021-12-17 14:46 ` Thomas Zimmermann
  2021-12-17 14:46 ` [PATCH 04/10] drm/cirrus: " Thomas Zimmermann
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Thomas Zimmermann @ 2021-12-17 14:46 UTC (permalink / raw)
  To: javierm, daniel, airlied, mripard, maarten.lankhorst
  Cc: spice-devel, Thomas Zimmermann, dri-devel, virtualization

Remove custom bochs_init() and bochs_exit() functions and initialize
the module with DRM module helpers.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/tiny/bochs.c | 20 ++------------------
 1 file changed, 2 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/tiny/bochs.c b/drivers/gpu/drm/tiny/bochs.c
index fc26a1ce11ee..ed971c8bb446 100644
--- a/drivers/gpu/drm/tiny/bochs.c
+++ b/drivers/gpu/drm/tiny/bochs.c
@@ -10,6 +10,7 @@
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_gem_vram_helper.h>
 #include <drm/drm_managed.h>
+#include <drm/drm_module.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/drm_simple_kms_helper.h>
 
@@ -716,24 +717,7 @@ static struct pci_driver bochs_pci_driver = {
 /* ---------------------------------------------------------------------- */
 /* module init/exit                                                       */
 
-static int __init bochs_init(void)
-{
-	if (drm_firmware_drivers_only() && bochs_modeset == -1)
-		return -EINVAL;
-
-	if (bochs_modeset == 0)
-		return -EINVAL;
-
-	return pci_register_driver(&bochs_pci_driver);
-}
-
-static void __exit bochs_exit(void)
-{
-	pci_unregister_driver(&bochs_pci_driver);
-}
-
-module_init(bochs_init);
-module_exit(bochs_exit);
+drm_module_pci_driver_if_modeset(bochs_pci_driver, bochs_modeset);
 
 MODULE_DEVICE_TABLE(pci, bochs_pci_tbl);
 MODULE_AUTHOR("Gerd Hoffmann <kraxel@redhat.com>");
-- 
2.34.1


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

* [PATCH 04/10] drm/cirrus: Replace module-init boiler-plate code with DRM helpers
  2021-12-17 14:46 [RFC][PATCH 00/10] drm: Add DRM module helpers for existing PCI drivers Thomas Zimmermann
                   ` (2 preceding siblings ...)
  2021-12-17 14:46 ` [PATCH 03/10] drm/bochs: " Thomas Zimmermann
@ 2021-12-17 14:46 ` Thomas Zimmermann
  2021-12-17 14:46 ` [PATCH 05/10] drm/hisilicon/hibmc: Replace module initialization " Thomas Zimmermann
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Thomas Zimmermann @ 2021-12-17 14:46 UTC (permalink / raw)
  To: javierm, daniel, airlied, mripard, maarten.lankhorst
  Cc: spice-devel, Thomas Zimmermann, dri-devel, virtualization

Remove custom cirrus_init() and cirrus_exit() functions and initialize
the module with DRM module helpers.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/tiny/cirrus.c | 17 ++---------------
 1 file changed, 2 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/tiny/cirrus.c b/drivers/gpu/drm/tiny/cirrus.c
index c95d9ff7d600..ecf2475d0f16 100644
--- a/drivers/gpu/drm/tiny/cirrus.c
+++ b/drivers/gpu/drm/tiny/cirrus.c
@@ -39,6 +39,7 @@
 #include <drm/drm_ioctl.h>
 #include <drm/drm_managed.h>
 #include <drm/drm_modeset_helper_vtables.h>
+#include <drm/drm_module.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/drm_simple_kms_helper.h>
 
@@ -633,21 +634,7 @@ static struct pci_driver cirrus_pci_driver = {
 	.remove = cirrus_pci_remove,
 };
 
-static int __init cirrus_init(void)
-{
-	if (drm_firmware_drivers_only())
-		return -EINVAL;
-
-	return pci_register_driver(&cirrus_pci_driver);
-}
-
-static void __exit cirrus_exit(void)
-{
-	pci_unregister_driver(&cirrus_pci_driver);
-}
-
-module_init(cirrus_init);
-module_exit(cirrus_exit);
+drm_module_pci_driver(cirrus_pci_driver)
 
 MODULE_DEVICE_TABLE(pci, pciidlist);
 MODULE_LICENSE("GPL");
-- 
2.34.1


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

* [PATCH 05/10] drm/hisilicon/hibmc: Replace module initialization with DRM helpers
  2021-12-17 14:46 [RFC][PATCH 00/10] drm: Add DRM module helpers for existing PCI drivers Thomas Zimmermann
                   ` (3 preceding siblings ...)
  2021-12-17 14:46 ` [PATCH 04/10] drm/cirrus: " Thomas Zimmermann
@ 2021-12-17 14:46 ` Thomas Zimmermann
  2021-12-17 14:46 ` [PATCH 06/10] drm/mgag200: Replace module-init boiler-plate code " Thomas Zimmermann
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Thomas Zimmermann @ 2021-12-17 14:46 UTC (permalink / raw)
  To: javierm, daniel, airlied, mripard, maarten.lankhorst
  Cc: spice-devel, Thomas Zimmermann, dri-devel, virtualization

Replace module_pci_driver() with drm_module_pci_driver(). The DRM macro
respects drm_firmware_drivers_only() and fails if the flag has been set.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
index 610fc8e135f9..fe4269c5aa0a 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
@@ -20,6 +20,7 @@
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_gem_vram_helper.h>
 #include <drm/drm_managed.h>
+#include <drm/drm_module.h>
 #include <drm/drm_vblank.h>
 
 #include "hibmc_drm_drv.h"
@@ -379,7 +380,7 @@ static struct pci_driver hibmc_pci_driver = {
 	.driver.pm =    &hibmc_pm_ops,
 };
 
-module_pci_driver(hibmc_pci_driver);
+drm_module_pci_driver(hibmc_pci_driver);
 
 MODULE_DEVICE_TABLE(pci, hibmc_pci_table);
 MODULE_AUTHOR("RongrongZou <zourongrong@huawei.com>");
-- 
2.34.1


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

* [PATCH 06/10] drm/mgag200: Replace module-init boiler-plate code with DRM helpers
  2021-12-17 14:46 [RFC][PATCH 00/10] drm: Add DRM module helpers for existing PCI drivers Thomas Zimmermann
                   ` (4 preceding siblings ...)
  2021-12-17 14:46 ` [PATCH 05/10] drm/hisilicon/hibmc: Replace module initialization " Thomas Zimmermann
@ 2021-12-17 14:46 ` Thomas Zimmermann
  2021-12-17 14:46 ` [PATCH 07/10] drm/qxl: Move ioctl array next to its only user Thomas Zimmermann
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Thomas Zimmermann @ 2021-12-17 14:46 UTC (permalink / raw)
  To: javierm, daniel, airlied, mripard, maarten.lankhorst
  Cc: spice-devel, Thomas Zimmermann, dri-devel, virtualization

Remove custom mgag200_init() and mgag200_exit() functions and initialize
the module with DRM_module helpers.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/mgag200/mgag200_drv.c | 20 ++------------------
 1 file changed, 2 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.c b/drivers/gpu/drm/mgag200/mgag200_drv.c
index 740108a006ba..217844d71ab5 100644
--- a/drivers/gpu/drm/mgag200/mgag200_drv.c
+++ b/drivers/gpu/drm/mgag200/mgag200_drv.c
@@ -14,6 +14,7 @@
 #include <drm/drm_drv.h>
 #include <drm/drm_file.h>
 #include <drm/drm_ioctl.h>
+#include <drm/drm_module.h>
 #include <drm/drm_pciids.h>
 
 #include "mgag200_drv.h"
@@ -375,24 +376,7 @@ static struct pci_driver mgag200_pci_driver = {
 	.remove = mgag200_pci_remove,
 };
 
-static int __init mgag200_init(void)
-{
-	if (drm_firmware_drivers_only() && mgag200_modeset == -1)
-		return -EINVAL;
-
-	if (mgag200_modeset == 0)
-		return -EINVAL;
-
-	return pci_register_driver(&mgag200_pci_driver);
-}
-
-static void __exit mgag200_exit(void)
-{
-	pci_unregister_driver(&mgag200_pci_driver);
-}
-
-module_init(mgag200_init);
-module_exit(mgag200_exit);
+drm_module_pci_driver_if_modeset(mgag200_pci_driver, mgag200_modeset);
 
 MODULE_AUTHOR(DRIVER_AUTHOR);
 MODULE_DESCRIPTION(DRIVER_DESC);
-- 
2.34.1


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

* [PATCH 07/10] drm/qxl: Move ioctl array next to its only user
  2021-12-17 14:46 [RFC][PATCH 00/10] drm: Add DRM module helpers for existing PCI drivers Thomas Zimmermann
                   ` (5 preceding siblings ...)
  2021-12-17 14:46 ` [PATCH 06/10] drm/mgag200: Replace module-init boiler-plate code " Thomas Zimmermann
@ 2021-12-17 14:46 ` Thomas Zimmermann
  2021-12-17 14:46 ` [PATCH 08/10] drm/qxl: Replace module-init boiler-plate code with DRM helpers Thomas Zimmermann
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Thomas Zimmermann @ 2021-12-17 14:46 UTC (permalink / raw)
  To: javierm, daniel, airlied, mripard, maarten.lankhorst
  Cc: spice-devel, Thomas Zimmermann, dri-devel, virtualization

Move the array qxl_ioctl to qxl_drv.c and initialize the num_ioctls
field of struct drm_driver at runtime. Replaces the current fragile
ioctl setup and allows for generating the module init/exit code.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/qxl/qxl_drv.c   | 12 +++++++++-
 drivers/gpu/drm/qxl/qxl_drv.h   | 13 +++++++----
 drivers/gpu/drm/qxl/qxl_ioctl.c | 41 ++++++---------------------------
 3 files changed, 27 insertions(+), 39 deletions(-)

diff --git a/drivers/gpu/drm/qxl/qxl_drv.c b/drivers/gpu/drm/qxl/qxl_drv.c
index e4b16421500b..323671e9cfc8 100644
--- a/drivers/gpu/drm/qxl/qxl_drv.c
+++ b/drivers/gpu/drm/qxl/qxl_drv.c
@@ -269,6 +269,16 @@ static struct pci_driver qxl_pci_driver = {
 	 .driver.pm = &qxl_pm_ops,
 };
 
+static const struct drm_ioctl_desc qxl_ioctls[] = {
+	DRM_IOCTL_DEF_DRV(QXL_ALLOC, qxl_alloc_ioctl, DRM_AUTH),
+	DRM_IOCTL_DEF_DRV(QXL_MAP, qxl_map_ioctl, DRM_AUTH),
+	DRM_IOCTL_DEF_DRV(QXL_EXECBUFFER, qxl_execbuffer_ioctl, DRM_AUTH),
+	DRM_IOCTL_DEF_DRV(QXL_UPDATE_AREA, qxl_update_area_ioctl, DRM_AUTH),
+	DRM_IOCTL_DEF_DRV(QXL_GETPARAM, qxl_getparam_ioctl, DRM_AUTH),
+	DRM_IOCTL_DEF_DRV(QXL_CLIENTCAP, qxl_clientcap_ioctl, DRM_AUTH),
+	DRM_IOCTL_DEF_DRV(QXL_ALLOC_SURF, qxl_alloc_surf_ioctl, DRM_AUTH),
+};
+
 static struct drm_driver qxl_driver = {
 	.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 
@@ -282,6 +292,7 @@ static struct drm_driver qxl_driver = {
 	.gem_prime_import_sg_table = qxl_gem_prime_import_sg_table,
 	.fops = &qxl_fops,
 	.ioctls = qxl_ioctls,
+	.num_ioctls = ARRAY_SIZE(qxl_ioctls),
 	.name = DRIVER_NAME,
 	.desc = DRIVER_DESC,
 	.date = DRIVER_DATE,
@@ -299,7 +310,6 @@ static int __init qxl_init(void)
 
 	if (qxl_modeset == 0)
 		return -EINVAL;
-	qxl_driver.num_ioctls = qxl_max_ioctls;
 	return pci_register_driver(&qxl_pci_driver);
 }
 
diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
index 359266d9e860..29641ceaab7d 100644
--- a/drivers/gpu/drm/qxl/qxl_drv.h
+++ b/drivers/gpu/drm/qxl/qxl_drv.h
@@ -65,7 +65,6 @@ struct dma_buf_map;
 #define QXL_DEBUGFS_MAX_COMPONENTS		32
 
 extern int qxl_num_crtc;
-extern int qxl_max_ioctls;
 
 #define QXL_INTERRUPT_MASK (\
 	QXL_INTERRUPT_DISPLAY |\
@@ -261,9 +260,6 @@ struct qxl_device {
 
 int qxl_debugfs_fence_init(struct qxl_device *rdev);
 
-extern const struct drm_ioctl_desc qxl_ioctls[];
-extern int qxl_max_ioctl;
-
 int qxl_device_init(struct qxl_device *qdev, struct pci_dev *pdev);
 void qxl_device_fini(struct qxl_device *qdev);
 
@@ -457,4 +453,13 @@ struct qxl_drv_surface *
 qxl_surface_lookup(struct drm_device *dev, int surface_id);
 void qxl_surface_evict(struct qxl_device *qdev, struct qxl_bo *surf, bool freeing);
 
+/* qxl_ioctl.c */
+int qxl_alloc_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
+int qxl_map_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
+int qxl_execbuffer_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
+int qxl_update_area_ioctl(struct drm_device *dev, void *data, struct drm_file *file);
+int qxl_getparam_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
+int qxl_clientcap_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
+int qxl_alloc_surf_ioctl(struct drm_device *dev, void *data, struct drm_file *file);
+
 #endif
diff --git a/drivers/gpu/drm/qxl/qxl_ioctl.c b/drivers/gpu/drm/qxl/qxl_ioctl.c
index 38aabcbe2238..30f58b21372a 100644
--- a/drivers/gpu/drm/qxl/qxl_ioctl.c
+++ b/drivers/gpu/drm/qxl/qxl_ioctl.c
@@ -33,8 +33,7 @@
  * TODO: allocating a new gem(in qxl_bo) for each request.
  * This is wasteful since bo's are page aligned.
  */
-static int qxl_alloc_ioctl(struct drm_device *dev, void *data,
-			   struct drm_file *file_priv)
+int qxl_alloc_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
 {
 	struct qxl_device *qdev = to_qxl(dev);
 	struct drm_qxl_alloc *qxl_alloc = data;
@@ -61,8 +60,7 @@ static int qxl_alloc_ioctl(struct drm_device *dev, void *data,
 	return 0;
 }
 
-static int qxl_map_ioctl(struct drm_device *dev, void *data,
-			 struct drm_file *file_priv)
+int qxl_map_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
 {
 	struct qxl_device *qdev = to_qxl(dev);
 	struct drm_qxl_map *qxl_map = data;
@@ -272,8 +270,7 @@ static int qxl_process_single_command(struct qxl_device *qdev,
 	return ret;
 }
 
-static int qxl_execbuffer_ioctl(struct drm_device *dev, void *data,
-				struct drm_file *file_priv)
+int qxl_execbuffer_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
 {
 	struct qxl_device *qdev = to_qxl(dev);
 	struct drm_qxl_execbuffer *execbuffer = data;
@@ -297,8 +294,7 @@ static int qxl_execbuffer_ioctl(struct drm_device *dev, void *data,
 	return 0;
 }
 
-static int qxl_update_area_ioctl(struct drm_device *dev, void *data,
-				 struct drm_file *file)
+int qxl_update_area_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
 {
 	struct qxl_device *qdev = to_qxl(dev);
 	struct drm_qxl_update_area *update_area = data;
@@ -347,8 +343,7 @@ static int qxl_update_area_ioctl(struct drm_device *dev, void *data,
 	return ret;
 }
 
-static int qxl_getparam_ioctl(struct drm_device *dev, void *data,
-		       struct drm_file *file_priv)
+int qxl_getparam_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
 {
 	struct qxl_device *qdev = to_qxl(dev);
 	struct drm_qxl_getparam *param = data;
@@ -366,8 +361,7 @@ static int qxl_getparam_ioctl(struct drm_device *dev, void *data,
 	return 0;
 }
 
-static int qxl_clientcap_ioctl(struct drm_device *dev, void *data,
-				  struct drm_file *file_priv)
+int qxl_clientcap_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
 {
 	struct qxl_device *qdev = to_qxl(dev);
 	struct pci_dev *pdev = to_pci_dev(dev->dev);
@@ -388,8 +382,7 @@ static int qxl_clientcap_ioctl(struct drm_device *dev, void *data,
 	return -ENOSYS;
 }
 
-static int qxl_alloc_surf_ioctl(struct drm_device *dev, void *data,
-				struct drm_file *file)
+int qxl_alloc_surf_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
 {
 	struct qxl_device *qdev = to_qxl(dev);
 	struct drm_qxl_alloc_surf *param = data;
@@ -422,23 +415,3 @@ static int qxl_alloc_surf_ioctl(struct drm_device *dev, void *data,
 		param->handle = handle;
 	return ret;
 }
-
-const struct drm_ioctl_desc qxl_ioctls[] = {
-	DRM_IOCTL_DEF_DRV(QXL_ALLOC, qxl_alloc_ioctl, DRM_AUTH),
-
-	DRM_IOCTL_DEF_DRV(QXL_MAP, qxl_map_ioctl, DRM_AUTH),
-
-	DRM_IOCTL_DEF_DRV(QXL_EXECBUFFER, qxl_execbuffer_ioctl,
-							DRM_AUTH),
-	DRM_IOCTL_DEF_DRV(QXL_UPDATE_AREA, qxl_update_area_ioctl,
-							DRM_AUTH),
-	DRM_IOCTL_DEF_DRV(QXL_GETPARAM, qxl_getparam_ioctl,
-							DRM_AUTH),
-	DRM_IOCTL_DEF_DRV(QXL_CLIENTCAP, qxl_clientcap_ioctl,
-							DRM_AUTH),
-
-	DRM_IOCTL_DEF_DRV(QXL_ALLOC_SURF, qxl_alloc_surf_ioctl,
-			  DRM_AUTH),
-};
-
-int qxl_max_ioctls = ARRAY_SIZE(qxl_ioctls);
-- 
2.34.1


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

* [PATCH 08/10] drm/qxl: Replace module-init boiler-plate code with DRM helpers
  2021-12-17 14:46 [RFC][PATCH 00/10] drm: Add DRM module helpers for existing PCI drivers Thomas Zimmermann
                   ` (6 preceding siblings ...)
  2021-12-17 14:46 ` [PATCH 07/10] drm/qxl: Move ioctl array next to its only user Thomas Zimmermann
@ 2021-12-17 14:46 ` Thomas Zimmermann
  2021-12-17 14:46 ` [PATCH 09/10] drm/vboxvideo: " Thomas Zimmermann
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Thomas Zimmermann @ 2021-12-17 14:46 UTC (permalink / raw)
  To: javierm, daniel, airlied, mripard, maarten.lankhorst
  Cc: spice-devel, Thomas Zimmermann, dri-devel, virtualization

Remove custom qxl_init() and qxl_exit() functions and initialize
the module with DRM module helpers.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/qxl/qxl_drv.c | 19 ++-----------------
 1 file changed, 2 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/qxl/qxl_drv.c b/drivers/gpu/drm/qxl/qxl_drv.c
index 323671e9cfc8..1cb6f0c224bb 100644
--- a/drivers/gpu/drm/qxl/qxl_drv.c
+++ b/drivers/gpu/drm/qxl/qxl_drv.c
@@ -39,6 +39,7 @@
 #include <drm/drm_drv.h>
 #include <drm/drm_file.h>
 #include <drm/drm_gem_ttm_helper.h>
+#include <drm/drm_module.h>
 #include <drm/drm_modeset_helper.h>
 #include <drm/drm_prime.h>
 #include <drm/drm_probe_helper.h>
@@ -303,23 +304,7 @@ static struct drm_driver qxl_driver = {
 	.release = qxl_drm_release,
 };
 
-static int __init qxl_init(void)
-{
-	if (drm_firmware_drivers_only() && qxl_modeset == -1)
-		return -EINVAL;
-
-	if (qxl_modeset == 0)
-		return -EINVAL;
-	return pci_register_driver(&qxl_pci_driver);
-}
-
-static void __exit qxl_exit(void)
-{
-	pci_unregister_driver(&qxl_pci_driver);
-}
-
-module_init(qxl_init);
-module_exit(qxl_exit);
+drm_module_pci_driver_if_modeset(qxl_pci_driver, qxl_modeset);
 
 MODULE_AUTHOR(DRIVER_AUTHOR);
 MODULE_DESCRIPTION(DRIVER_DESC);
-- 
2.34.1


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

* [PATCH 09/10] drm/vboxvideo: Replace module-init boiler-plate code with DRM helpers
  2021-12-17 14:46 [RFC][PATCH 00/10] drm: Add DRM module helpers for existing PCI drivers Thomas Zimmermann
                   ` (7 preceding siblings ...)
  2021-12-17 14:46 ` [PATCH 08/10] drm/qxl: Replace module-init boiler-plate code with DRM helpers Thomas Zimmermann
@ 2021-12-17 14:46 ` Thomas Zimmermann
  2021-12-17 14:46 ` [PATCH 10/10] drm/vmwgfx: " Thomas Zimmermann
  2022-01-27 18:26 ` [RFC][PATCH 00/10] drm: Add DRM module helpers for existing PCI drivers Javier Martinez Canillas
  10 siblings, 0 replies; 12+ messages in thread
From: Thomas Zimmermann @ 2021-12-17 14:46 UTC (permalink / raw)
  To: javierm, daniel, airlied, mripard, maarten.lankhorst
  Cc: spice-devel, Thomas Zimmermann, dri-devel, virtualization

Remove custom vbox_init() and vbox_exit() functions and initialize
the module with DRM module helpers.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/vboxvideo/vbox_drv.c | 20 ++------------------
 1 file changed, 2 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/vboxvideo/vbox_drv.c b/drivers/gpu/drm/vboxvideo/vbox_drv.c
index f35d9e44c6b7..f4f2bd79a7cb 100644
--- a/drivers/gpu/drm/vboxvideo/vbox_drv.c
+++ b/drivers/gpu/drm/vboxvideo/vbox_drv.c
@@ -18,6 +18,7 @@
 #include <drm/drm_file.h>
 #include <drm/drm_ioctl.h>
 #include <drm/drm_managed.h>
+#include <drm/drm_module.h>
 
 #include "vbox_drv.h"
 
@@ -190,24 +191,7 @@ static const struct drm_driver driver = {
 	DRM_GEM_VRAM_DRIVER,
 };
 
-static int __init vbox_init(void)
-{
-	if (drm_firmware_drivers_only() && vbox_modeset == -1)
-		return -EINVAL;
-
-	if (vbox_modeset == 0)
-		return -EINVAL;
-
-	return pci_register_driver(&vbox_pci_driver);
-}
-
-static void __exit vbox_exit(void)
-{
-	pci_unregister_driver(&vbox_pci_driver);
-}
-
-module_init(vbox_init);
-module_exit(vbox_exit);
+drm_module_pci_driver_if_modeset(vbox_pci_driver, vbox_modeset);
 
 MODULE_AUTHOR("Oracle Corporation");
 MODULE_AUTHOR("Hans de Goede <hdegoede@redhat.com>");
-- 
2.34.1


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

* [PATCH 10/10] drm/vmwgfx: Replace module-init boiler-plate code with DRM helpers
  2021-12-17 14:46 [RFC][PATCH 00/10] drm: Add DRM module helpers for existing PCI drivers Thomas Zimmermann
                   ` (8 preceding siblings ...)
  2021-12-17 14:46 ` [PATCH 09/10] drm/vboxvideo: " Thomas Zimmermann
@ 2021-12-17 14:46 ` Thomas Zimmermann
  2022-01-27 18:26 ` [RFC][PATCH 00/10] drm: Add DRM module helpers for existing PCI drivers Javier Martinez Canillas
  10 siblings, 0 replies; 12+ messages in thread
From: Thomas Zimmermann @ 2021-12-17 14:46 UTC (permalink / raw)
  To: javierm, daniel, airlied, mripard, maarten.lankhorst
  Cc: spice-devel, Thomas Zimmermann, dri-devel, virtualization

Remove custom vmwgfx_init() and vmwgfx_exit() functions and initialize
the module with DRM_module helpers.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 24 +++---------------------
 1 file changed, 3 insertions(+), 21 deletions(-)

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index 2d59bdad0373..0c1ccf174787 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -32,9 +32,10 @@
 
 #include <drm/drm_aperture.h>
 #include <drm/drm_drv.h>
+#include <drm/drm_gem_ttm_helper.h>
 #include <drm/drm_ioctl.h>
+#include <drm/drm_module.h>
 #include <drm/drm_sysfs.h>
-#include <drm/drm_gem_ttm_helper.h>
 #include <drm/ttm/ttm_bo_driver.h>
 #include <drm/ttm/ttm_range_manager.h>
 #include <drm/ttm/ttm_placement.h>
@@ -1651,26 +1652,7 @@ static int vmw_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	return ret;
 }
 
-static int __init vmwgfx_init(void)
-{
-	int ret;
-
-	if (drm_firmware_drivers_only())
-		return -EINVAL;
-
-	ret = pci_register_driver(&vmw_pci_driver);
-	if (ret)
-		DRM_ERROR("Failed initializing DRM.\n");
-	return ret;
-}
-
-static void __exit vmwgfx_exit(void)
-{
-	pci_unregister_driver(&vmw_pci_driver);
-}
-
-module_init(vmwgfx_init);
-module_exit(vmwgfx_exit);
+drm_module_pci_driver(vmw_pci_driver);
 
 MODULE_AUTHOR("VMware Inc. and others");
 MODULE_DESCRIPTION("Standalone drm driver for the VMware SVGA device");
-- 
2.34.1


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

* Re: [RFC][PATCH 00/10] drm: Add DRM module helpers for existing PCI drivers
  2021-12-17 14:46 [RFC][PATCH 00/10] drm: Add DRM module helpers for existing PCI drivers Thomas Zimmermann
                   ` (9 preceding siblings ...)
  2021-12-17 14:46 ` [PATCH 10/10] drm/vmwgfx: " Thomas Zimmermann
@ 2022-01-27 18:26 ` Javier Martinez Canillas
  10 siblings, 0 replies; 12+ messages in thread
From: Javier Martinez Canillas @ 2022-01-27 18:26 UTC (permalink / raw)
  To: Thomas Zimmermann, daniel, airlied, mripard, maarten.lankhorst
  Cc: spice-devel, dri-devel, virtualization

On 12/17/21 15:46, Thomas Zimmermann wrote:
> This is an RFC patchset to complement the helper macros provided
> in [1]. The module helpers create module init and exit helpers that
> respect the kernel parameters that enable/disable DRM drivers.
> 
> There's one more patch that prepares qxl by moving some code around.
> It's required to make use of the helpers from within qxl.
> 
> Javier, please see if you find anything useful here and cherry-pick
> into your patchset. The driver changes should complement the ones
> in your patchset. The module macros are similar to yours and should
> be easily mergable.
> 
> I tested the macros with ast.
> 
> [1] https://patchwork.freedesktop.org/series/98162/
> 
> Thomas Zimmermann (10):
>   drm: Provide PCI module-init macros
>   drm/ast: Replace module-init boiler-plate code with DRM helpers
>   drm/bochs: Replace module-init boiler-plate code with DRM helpers
>   drm/cirrus: Replace module-init boiler-plate code with DRM helpers
>   drm/hisilicon/hibmc: Replace module initialization with DRM helpers
>   drm/mgag200: Replace module-init boiler-plate code with DRM helpers
>   drm/qxl: Move ioctl array next to its only user
>   drm/qxl: Replace module-init boiler-plate code with DRM helpers
>   drm/vboxvideo: Replace module-init boiler-plate code with DRM helpers
>   drm/vmwgfx: Replace module-init boiler-plate code with DRM helpers
> 

Pushed the remaining of these patches to drm-misc-next. Thanks!

Best regards,
-- 
Javier Martinez Canillas
Linux Engineering
Red Hat


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

end of thread, other threads:[~2022-01-27 18:26 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-17 14:46 [RFC][PATCH 00/10] drm: Add DRM module helpers for existing PCI drivers Thomas Zimmermann
2021-12-17 14:46 ` [PATCH 01/10] drm: Provide PCI module-init macros Thomas Zimmermann
2021-12-17 14:46 ` [PATCH 02/10] drm/ast: Replace module-init boiler-plate code with DRM helpers Thomas Zimmermann
2021-12-17 14:46 ` [PATCH 03/10] drm/bochs: " Thomas Zimmermann
2021-12-17 14:46 ` [PATCH 04/10] drm/cirrus: " Thomas Zimmermann
2021-12-17 14:46 ` [PATCH 05/10] drm/hisilicon/hibmc: Replace module initialization " Thomas Zimmermann
2021-12-17 14:46 ` [PATCH 06/10] drm/mgag200: Replace module-init boiler-plate code " Thomas Zimmermann
2021-12-17 14:46 ` [PATCH 07/10] drm/qxl: Move ioctl array next to its only user Thomas Zimmermann
2021-12-17 14:46 ` [PATCH 08/10] drm/qxl: Replace module-init boiler-plate code with DRM helpers Thomas Zimmermann
2021-12-17 14:46 ` [PATCH 09/10] drm/vboxvideo: " Thomas Zimmermann
2021-12-17 14:46 ` [PATCH 10/10] drm/vmwgfx: " Thomas Zimmermann
2022-01-27 18:26 ` [RFC][PATCH 00/10] drm: Add DRM module helpers for existing PCI drivers Javier Martinez Canillas

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).