aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOded Gabbay <ogabbay@kernel.org>2022-10-22 14:06:44 +0300
committerOded Gabbay <ogabbay@kernel.org>2022-11-02 22:08:07 +0200
commit7a37425bbba700d5e51d60b24f7111d46f397cad (patch)
tree6619f9d41efa7a9986bb3b5fe206493e04c1a766
parent333bd190581fe3bc8291ebe799699d593ffcfc80 (diff)
downloadlinux-accel_v2.tar.gz
accel: add accel dummy driveraccel_v2
This commit is only intended as a reference of how to add a new accelerator driver. It is not intended to be merged. The dummy driver defines the new DRIVER_COMPUTE_ACCEL flag as its feature and registers to the drm subsystem. Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
-rw-r--r--drivers/accel/Kconfig2
-rw-r--r--drivers/accel/Makefile3
-rw-r--r--drivers/accel/dummy/Kconfig15
-rw-r--r--drivers/accel/dummy/Makefile5
-rw-r--r--drivers/accel/dummy/dummy_drv.c119
5 files changed, 144 insertions, 0 deletions
diff --git a/drivers/accel/Kconfig b/drivers/accel/Kconfig
index 282ea24f90c571..588f311094459c 100644
--- a/drivers/accel/Kconfig
+++ b/drivers/accel/Kconfig
@@ -22,3 +22,5 @@ menuconfig ACCEL
major number than GPUs, and will be exposed to user-space using
different device files, called accel/accel* (in /dev, sysfs
and debugfs)
+
+source "drivers/accel/dummy/Kconfig"
diff --git a/drivers/accel/Makefile b/drivers/accel/Makefile
index b5b7d812a8ef1b..171191ed6ab167 100644
--- a/drivers/accel/Makefile
+++ b/drivers/accel/Makefile
@@ -8,3 +8,6 @@ accel-y := \
accel_drv.o
obj-$(CONFIG_ACCEL) += accel.o
+
+obj-$(CONFIG_ACCEL_DUMMY) += dummy/
+
diff --git a/drivers/accel/dummy/Kconfig b/drivers/accel/dummy/Kconfig
new file mode 100644
index 00000000000000..7723d4cd8ce899
--- /dev/null
+++ b/drivers/accel/dummy/Kconfig
@@ -0,0 +1,15 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+config ACCEL_DUMMY
+ tristate "Drive for a dummy compute accelerator"
+ depends on ACCEL
+ help
+ An example of a compute accelerator driver that registers with drm
+ as a compute accelerator.
+
+ This driver does not actually do anything.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called accel_dummy.
diff --git a/drivers/accel/dummy/Makefile b/drivers/accel/dummy/Makefile
new file mode 100644
index 00000000000000..c2b9706bffe50f
--- /dev/null
+++ b/drivers/accel/dummy/Makefile
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0-only
+
+accel_dummy-y += dummy_drv.o
+
+obj-$(CONFIG_ACCEL_DUMMY) := accel_dummy.o
diff --git a/drivers/accel/dummy/dummy_drv.c b/drivers/accel/dummy/dummy_drv.c
new file mode 100644
index 00000000000000..da516f7f9b4f18
--- /dev/null
+++ b/drivers/accel/dummy/dummy_drv.c
@@ -0,0 +1,119 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+
+#include <drm/drm_accel.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_ioctl.h>
+#include <drm/drm_print.h>
+
+#define DRIVER_NAME "accel_dummy"
+#define DRIVER_DESC "Driver for a dummy compute accelerator"
+#define DRIVER_DATE "20221022"
+#define DRIVER_MAJOR 1
+#define DRIVER_MINOR 0
+
+MODULE_AUTHOR("Oded Gabbay");
+MODULE_DESCRIPTION("Driver for a dummy compute accelerator");
+MODULE_LICENSE("GPL");
+
+struct accel_dummy_device {
+ struct drm_device drm;
+ struct platform_device *platform;
+};
+
+static struct accel_dummy_device *add;
+
+static void accel_dummy_release(struct drm_device *dev)
+{
+ DRM_INFO("%s called", __func__);
+}
+
+static void accel_dummy_debugfs_init(struct drm_minor *minor)
+{
+ DRM_INFO("%s called", __func__);
+}
+
+static const struct file_operations accel_dummy_driver_fops = {
+ .owner = THIS_MODULE,
+ .open = accel_open,
+ .release = drm_release,
+ .unlocked_ioctl = drm_ioctl,
+ .poll = drm_poll,
+ .read = drm_read,
+ .llseek = noop_llseek
+};
+
+static const struct drm_driver accel_dummy_driver = {
+ .driver_features = DRIVER_COMPUTE_ACCEL,
+ .release = accel_dummy_release,
+ .fops = &accel_dummy_driver_fops,
+ .debugfs_init = accel_dummy_debugfs_init,
+ .name = DRIVER_NAME,
+ .desc = DRIVER_DESC,
+ .date = DRIVER_DATE,
+ .major = DRIVER_MAJOR,
+ .minor = DRIVER_MINOR,
+};
+
+static void __exit accel_dummy_exit(void)
+{
+ struct platform_device *pdev;
+
+ DRM_INFO("%s called", __func__);
+
+ if (IS_ERR_OR_NULL(add)) {
+ DRM_INFO("accel_dummy_device wasn't initialized\n");
+ return;
+ }
+
+ pdev = add->platform;
+
+ drm_dev_unregister(&add->drm);
+ devres_release_group(&pdev->dev, NULL);
+ platform_device_unregister(pdev);
+
+ kfree(add);
+ add = NULL;
+}
+
+static int __init accel_dummy_init(void)
+{
+ struct platform_device *pdev;
+ int ret;
+
+ DRM_INFO("%s called", __func__);
+
+ pdev = platform_device_register_simple(DRIVER_NAME, -1, NULL, 0);
+ if (IS_ERR(pdev))
+ return PTR_ERR(pdev);
+
+ if (!devres_open_group(&pdev->dev, NULL, GFP_KERNEL)) {
+ ret = -ENOMEM;
+ goto out_unregister;
+ }
+
+ add = devm_drm_dev_alloc(&pdev->dev, &accel_dummy_driver,
+ struct accel_dummy_device, drm);
+ if (IS_ERR(add)) {
+ ret = PTR_ERR(add);
+ goto out_devres;
+ }
+ add->platform = pdev;
+
+ ret = drm_dev_register(&add->drm, 0);
+ if (ret)
+ goto out_devres;
+
+ return 0;
+
+out_devres:
+ devres_release_group(&pdev->dev, NULL);
+out_unregister:
+ platform_device_unregister(pdev);
+ return ret;
+}
+
+module_init(accel_dummy_init);
+module_exit(accel_dummy_exit);