Skip to content

Commit

Permalink
drivers/accel: define kconfig and register a new major
Browse files Browse the repository at this point in the history
Add a new Kconfig for the accel subsystem. The Kconfig currently
contains only the basic CONFIG_DRM_ACCEL option that will be used to
decide whether to compile the accel registration code. Therefore, the
kconfig option is defined as bool.

The accel code will be compiled as part of drm.ko and will be called
directly from the DRM core code. The reason we compile it as part of
drm.ko and not as a separate module is because of cyclic dependency
between drm.ko and the separate module (if it would have existed).
This is due to the fact that DRM core code calls accel functions and
vice-versa.

The accelerator devices will be exposed to the user space with a new,
dedicated major number - 261.

The accel init function registers the new major number as a char device
and create corresponding sysfs and debugfs root entries, similar to
what is done in DRM init function.

I added a new header called drm_accel.h to include/drm/, that will hold
the prototypes of the drm_accel.c functions. In case CONFIG_DRM_ACCEL
is set to 'N', that header will contain empty inline implementations of
those functions, to allow DRM core code to compile successfully
without dependency on CONFIG_DRM_ACCEL.

I Updated the MAINTAINERS file accordingly with the newly added folder
and I have taken the liberty to appropriate the dri-devel mailing list
and the dri-devel IRC channel for the accel subsystem.

Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jeffrey Hugo <quic_jhugo@quicinc.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
Acked-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Tested-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Reviewed-by: Melissa Wen <mwen@igalia.com>
  • Loading branch information
Oded Gabbay committed Nov 22, 2022
1 parent fc58764 commit 8bf4889
Show file tree
Hide file tree
Showing 7 changed files with 155 additions and 0 deletions.
5 changes: 5 additions & 0 deletions Documentation/admin-guide/devices.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3080,6 +3080,11 @@
...
255 = /dev/osd255 256th OSD Device

261 char Compute Acceleration Devices
0 = /dev/accel/accel0 First acceleration device
1 = /dev/accel/accel1 Second acceleration device
...

384-511 char RESERVED FOR DYNAMIC ASSIGNMENT
Character devices that request a dynamic allocation of major
number will take numbers starting from 511 and downward,
Expand Down
8 changes: 8 additions & 0 deletions MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -6833,6 +6833,14 @@ F: include/drm/drm*
F: include/linux/vga*
F: include/uapi/drm/drm*

DRM COMPUTE ACCELERATORS DRIVERS AND FRAMEWORK
M: Oded Gabbay <ogabbay@kernel.org>
L: dri-devel@lists.freedesktop.org
S: Maintained
C: irc://irc.oftc.net/dri-devel
T: git https://git.kernel.org/pub/scm/linux/kernel/git/ogabbay/accel.git
F: drivers/accel/

DRM DRIVERS FOR ALLWINNER A10
M: Maxime Ripard <mripard@kernel.org>
M: Chen-Yu Tsai <wens@csie.org>
Expand Down
2 changes: 2 additions & 0 deletions drivers/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,8 @@ source "drivers/media/Kconfig"

source "drivers/video/Kconfig"

source "drivers/accel/Kconfig"

source "sound/Kconfig"

source "drivers/hid/Kconfig"
Expand Down
24 changes: 24 additions & 0 deletions drivers/accel/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# SPDX-License-Identifier: GPL-2.0-only
#
# Compute Acceleration device configuration
#
# This framework provides support for compute acceleration devices, such
# as, but not limited to, Machine-Learning and Deep-Learning acceleration
# devices
#
menuconfig DRM_ACCEL
bool "Compute Acceleration Framework"
depends on DRM
help
Framework for device drivers of compute acceleration devices, such
as, but not limited to, Machine-Learning and Deep-Learning
acceleration devices.
If you say Y here, you need to select the module that's right for
your acceleration device from the list below.
This framework is integrated with the DRM subsystem as compute
accelerators and GPUs share a lot in common and can use almost the
same infrastructure code.
Having said that, acceleration devices will have a different
major number than GPUs, and will be exposed to user-space using
different device files, called accel/accel* (in /dev, sysfs
and debugfs).
83 changes: 83 additions & 0 deletions drivers/accel/drm_accel.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
// SPDX-License-Identifier: GPL-2.0

/*
* Copyright 2022 HabanaLabs, Ltd.
* All Rights Reserved.
*
*/

#include <linux/debugfs.h>
#include <linux/device.h>

#include <drm/drm_accel.h>
#include <drm/drm_ioctl.h>
#include <drm/drm_print.h>

static struct dentry *accel_debugfs_root;
static struct class *accel_class;

static char *accel_devnode(struct device *dev, umode_t *mode)
{
return kasprintf(GFP_KERNEL, "accel/%s", dev_name(dev));
}

static int accel_sysfs_init(void)
{
accel_class = class_create(THIS_MODULE, "accel");
if (IS_ERR(accel_class))
return PTR_ERR(accel_class);

accel_class->devnode = accel_devnode;

return 0;
}

static void accel_sysfs_destroy(void)
{
if (IS_ERR_OR_NULL(accel_class))
return;
class_destroy(accel_class);
accel_class = NULL;
}

static int accel_stub_open(struct inode *inode, struct file *filp)
{
return -EOPNOTSUPP;
}

static const struct file_operations accel_stub_fops = {
.owner = THIS_MODULE,
.open = accel_stub_open,
.llseek = noop_llseek,
};

void accel_core_exit(void)
{
unregister_chrdev(ACCEL_MAJOR, "accel");
debugfs_remove(accel_debugfs_root);
accel_sysfs_destroy();
}

int __init accel_core_init(void)
{
int ret;

ret = accel_sysfs_init();
if (ret < 0) {
DRM_ERROR("Cannot create ACCEL class: %d\n", ret);
goto error;
}

accel_debugfs_root = debugfs_create_dir("accel", NULL);

ret = register_chrdev(ACCEL_MAJOR, "accel", &accel_stub_fops);
if (ret < 0)
DRM_ERROR("Cannot register ACCEL major: %d\n", ret);

error:
/*
* Any cleanup due to errors will be done in drm_core_exit() that
* will call accel_core_exit()
*/
return ret;
}
1 change: 1 addition & 0 deletions drivers/gpu/drm/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ drm-$(CONFIG_DRM_LOAD_EDID_FIRMWARE) += drm_edid_load.o
drm-$(CONFIG_DRM_PRIVACY_SCREEN) += \
drm_privacy_screen.o \
drm_privacy_screen_x86.o
drm-$(CONFIG_DRM_ACCEL) += ../../accel/drm_accel.o
obj-$(CONFIG_DRM) += drm.o

obj-$(CONFIG_DRM_PANEL_ORIENTATION_QUIRKS) += drm_panel_orientation_quirks.o
Expand Down
32 changes: 32 additions & 0 deletions include/drm/drm_accel.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/* SPDX-License-Identifier: GPL-2.0
*
* Copyright 2022 HabanaLabs, Ltd.
* All Rights Reserved.
*
*/

#ifndef DRM_ACCEL_H_
#define DRM_ACCEL_H_

#define ACCEL_MAJOR 261

#if IS_ENABLED(CONFIG_DRM_ACCEL)

void accel_core_exit(void);
int accel_core_init(void);

#else

static inline void accel_core_exit(void)
{
}

static inline int __init accel_core_init(void)
{
/* Return 0 to allow drm_core_init to complete successfully */
return 0;
}

#endif /* IS_ENABLED(CONFIG_DRM_ACCEL) */

#endif /* DRM_ACCEL_H_ */

0 comments on commit 8bf4889

Please sign in to comment.