drm: move module initialization to drm_stub.c
Most of the new DRM management functions are nowadays in drm_stub.c. By moving the core module initialization to drm_stub.c we can make several global variables static and keep the stub-open helper local. The core files now look like this: drm_stub.c: Core management drm_drv.c: Ioctl dispatcher drm_ioctl.c: Actual ioctl backends drm_fops.c: Char-dev file-operations A follow-up patch will move what is left from drm_drv.c into drm_ioctl.c. Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
This commit is contained in:
parent
3cb01a9804
commit
1b7199fe98
@ -171,65 +171,6 @@ static const struct drm_ioctl_desc drm_ioctls[] = {
|
|||||||
|
|
||||||
#define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls )
|
#define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls )
|
||||||
|
|
||||||
/** File operations structure */
|
|
||||||
static const struct file_operations drm_stub_fops = {
|
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.open = drm_stub_open,
|
|
||||||
.llseek = noop_llseek,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init drm_core_init(void)
|
|
||||||
{
|
|
||||||
int ret = -ENOMEM;
|
|
||||||
|
|
||||||
drm_global_init();
|
|
||||||
drm_connector_ida_init();
|
|
||||||
idr_init(&drm_minors_idr);
|
|
||||||
|
|
||||||
if (register_chrdev(DRM_MAJOR, "drm", &drm_stub_fops))
|
|
||||||
goto err_p1;
|
|
||||||
|
|
||||||
drm_class = drm_sysfs_create(THIS_MODULE, "drm");
|
|
||||||
if (IS_ERR(drm_class)) {
|
|
||||||
printk(KERN_ERR "DRM: Error creating drm class.\n");
|
|
||||||
ret = PTR_ERR(drm_class);
|
|
||||||
goto err_p2;
|
|
||||||
}
|
|
||||||
|
|
||||||
drm_debugfs_root = debugfs_create_dir("dri", NULL);
|
|
||||||
if (!drm_debugfs_root) {
|
|
||||||
DRM_ERROR("Cannot create /sys/kernel/debug/dri\n");
|
|
||||||
ret = -1;
|
|
||||||
goto err_p3;
|
|
||||||
}
|
|
||||||
|
|
||||||
DRM_INFO("Initialized %s %d.%d.%d %s\n",
|
|
||||||
CORE_NAME, CORE_MAJOR, CORE_MINOR, CORE_PATCHLEVEL, CORE_DATE);
|
|
||||||
return 0;
|
|
||||||
err_p3:
|
|
||||||
drm_sysfs_destroy();
|
|
||||||
err_p2:
|
|
||||||
unregister_chrdev(DRM_MAJOR, "drm");
|
|
||||||
|
|
||||||
idr_destroy(&drm_minors_idr);
|
|
||||||
err_p1:
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __exit drm_core_exit(void)
|
|
||||||
{
|
|
||||||
debugfs_remove(drm_debugfs_root);
|
|
||||||
drm_sysfs_destroy();
|
|
||||||
|
|
||||||
unregister_chrdev(DRM_MAJOR, "drm");
|
|
||||||
|
|
||||||
drm_connector_ida_destroy();
|
|
||||||
idr_destroy(&drm_minors_idr);
|
|
||||||
}
|
|
||||||
|
|
||||||
module_init(drm_core_init);
|
|
||||||
module_exit(drm_core_exit);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Copy and IOCTL return string to user space
|
* Copy and IOCTL return string to user space
|
||||||
*/
|
*/
|
||||||
|
@ -111,45 +111,6 @@ err_undo:
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(drm_open);
|
EXPORT_SYMBOL(drm_open);
|
||||||
|
|
||||||
/**
|
|
||||||
* File \c open operation.
|
|
||||||
*
|
|
||||||
* \param inode device inode.
|
|
||||||
* \param filp file pointer.
|
|
||||||
*
|
|
||||||
* Puts the dev->fops corresponding to the device minor number into
|
|
||||||
* \p filp, call the \c open method, and restore the file operations.
|
|
||||||
*/
|
|
||||||
int drm_stub_open(struct inode *inode, struct file *filp)
|
|
||||||
{
|
|
||||||
struct drm_device *dev;
|
|
||||||
struct drm_minor *minor;
|
|
||||||
int err = -ENODEV;
|
|
||||||
const struct file_operations *new_fops;
|
|
||||||
|
|
||||||
DRM_DEBUG("\n");
|
|
||||||
|
|
||||||
mutex_lock(&drm_global_mutex);
|
|
||||||
minor = drm_minor_acquire(iminor(inode));
|
|
||||||
if (IS_ERR(minor))
|
|
||||||
goto out_unlock;
|
|
||||||
|
|
||||||
dev = minor->dev;
|
|
||||||
new_fops = fops_get(dev->driver->fops);
|
|
||||||
if (!new_fops)
|
|
||||||
goto out_release;
|
|
||||||
|
|
||||||
replace_fops(filp, new_fops);
|
|
||||||
if (filp->f_op->open)
|
|
||||||
err = filp->f_op->open(inode, filp);
|
|
||||||
|
|
||||||
out_release:
|
|
||||||
drm_minor_release(minor);
|
|
||||||
out_unlock:
|
|
||||||
mutex_unlock(&drm_global_mutex);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check whether DRI will run on this CPU.
|
* Check whether DRI will run on this CPU.
|
||||||
*
|
*
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
* DEALINGS IN THE SOFTWARE.
|
* DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/debugfs.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/moduleparam.h>
|
#include <linux/moduleparam.h>
|
||||||
@ -61,10 +62,10 @@ module_param_named(timestamp_precision_usec, drm_timestamp_precision, int, 0600)
|
|||||||
module_param_named(timestamp_monotonic, drm_timestamp_monotonic, int, 0600);
|
module_param_named(timestamp_monotonic, drm_timestamp_monotonic, int, 0600);
|
||||||
|
|
||||||
static DEFINE_SPINLOCK(drm_minor_lock);
|
static DEFINE_SPINLOCK(drm_minor_lock);
|
||||||
struct idr drm_minors_idr;
|
static struct idr drm_minors_idr;
|
||||||
|
|
||||||
struct class *drm_class;
|
struct class *drm_class;
|
||||||
struct dentry *drm_debugfs_root;
|
static struct dentry *drm_debugfs_root;
|
||||||
|
|
||||||
int drm_err(const char *func, const char *format, ...)
|
int drm_err(const char *func, const char *format, ...)
|
||||||
{
|
{
|
||||||
@ -787,3 +788,115 @@ int drm_dev_set_unique(struct drm_device *dev, const char *fmt, ...)
|
|||||||
return dev->unique ? 0 : -ENOMEM;
|
return dev->unique ? 0 : -ENOMEM;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(drm_dev_set_unique);
|
EXPORT_SYMBOL(drm_dev_set_unique);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* DRM Core
|
||||||
|
* The DRM core module initializes all global DRM objects and makes them
|
||||||
|
* available to drivers. Once setup, drivers can probe their respective
|
||||||
|
* devices.
|
||||||
|
* Currently, core management includes:
|
||||||
|
* - The "DRM-Global" key/value database
|
||||||
|
* - Global ID management for connectors
|
||||||
|
* - DRM major number allocation
|
||||||
|
* - DRM minor management
|
||||||
|
* - DRM sysfs class
|
||||||
|
* - DRM debugfs root
|
||||||
|
*
|
||||||
|
* Furthermore, the DRM core provides dynamic char-dev lookups. For each
|
||||||
|
* interface registered on a DRM device, you can request minor numbers from DRM
|
||||||
|
* core. DRM core takes care of major-number management and char-dev
|
||||||
|
* registration. A stub ->open() callback forwards any open() requests to the
|
||||||
|
* registered minor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int drm_stub_open(struct inode *inode, struct file *filp)
|
||||||
|
{
|
||||||
|
const struct file_operations *new_fops;
|
||||||
|
struct drm_minor *minor;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
DRM_DEBUG("\n");
|
||||||
|
|
||||||
|
mutex_lock(&drm_global_mutex);
|
||||||
|
minor = drm_minor_acquire(iminor(inode));
|
||||||
|
if (IS_ERR(minor)) {
|
||||||
|
err = PTR_ERR(minor);
|
||||||
|
goto out_unlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
new_fops = fops_get(minor->dev->driver->fops);
|
||||||
|
if (!new_fops) {
|
||||||
|
err = -ENODEV;
|
||||||
|
goto out_release;
|
||||||
|
}
|
||||||
|
|
||||||
|
replace_fops(filp, new_fops);
|
||||||
|
if (filp->f_op->open)
|
||||||
|
err = filp->f_op->open(inode, filp);
|
||||||
|
else
|
||||||
|
err = 0;
|
||||||
|
|
||||||
|
out_release:
|
||||||
|
drm_minor_release(minor);
|
||||||
|
out_unlock:
|
||||||
|
mutex_unlock(&drm_global_mutex);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct file_operations drm_stub_fops = {
|
||||||
|
.owner = THIS_MODULE,
|
||||||
|
.open = drm_stub_open,
|
||||||
|
.llseek = noop_llseek,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init drm_core_init(void)
|
||||||
|
{
|
||||||
|
int ret = -ENOMEM;
|
||||||
|
|
||||||
|
drm_global_init();
|
||||||
|
drm_connector_ida_init();
|
||||||
|
idr_init(&drm_minors_idr);
|
||||||
|
|
||||||
|
if (register_chrdev(DRM_MAJOR, "drm", &drm_stub_fops))
|
||||||
|
goto err_p1;
|
||||||
|
|
||||||
|
drm_class = drm_sysfs_create(THIS_MODULE, "drm");
|
||||||
|
if (IS_ERR(drm_class)) {
|
||||||
|
printk(KERN_ERR "DRM: Error creating drm class.\n");
|
||||||
|
ret = PTR_ERR(drm_class);
|
||||||
|
goto err_p2;
|
||||||
|
}
|
||||||
|
|
||||||
|
drm_debugfs_root = debugfs_create_dir("dri", NULL);
|
||||||
|
if (!drm_debugfs_root) {
|
||||||
|
DRM_ERROR("Cannot create /sys/kernel/debug/dri\n");
|
||||||
|
ret = -1;
|
||||||
|
goto err_p3;
|
||||||
|
}
|
||||||
|
|
||||||
|
DRM_INFO("Initialized %s %d.%d.%d %s\n",
|
||||||
|
CORE_NAME, CORE_MAJOR, CORE_MINOR, CORE_PATCHLEVEL, CORE_DATE);
|
||||||
|
return 0;
|
||||||
|
err_p3:
|
||||||
|
drm_sysfs_destroy();
|
||||||
|
err_p2:
|
||||||
|
unregister_chrdev(DRM_MAJOR, "drm");
|
||||||
|
|
||||||
|
idr_destroy(&drm_minors_idr);
|
||||||
|
err_p1:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __exit drm_core_exit(void)
|
||||||
|
{
|
||||||
|
debugfs_remove(drm_debugfs_root);
|
||||||
|
drm_sysfs_destroy();
|
||||||
|
|
||||||
|
unregister_chrdev(DRM_MAJOR, "drm");
|
||||||
|
|
||||||
|
drm_connector_ida_destroy();
|
||||||
|
idr_destroy(&drm_minors_idr);
|
||||||
|
}
|
||||||
|
|
||||||
|
module_init(drm_core_init);
|
||||||
|
module_exit(drm_core_exit);
|
||||||
|
@ -1199,7 +1199,6 @@ extern bool drm_ioctl_flags(unsigned int nr, unsigned int *flags);
|
|||||||
/* Device support (drm_fops.h) */
|
/* Device support (drm_fops.h) */
|
||||||
extern struct mutex drm_global_mutex;
|
extern struct mutex drm_global_mutex;
|
||||||
extern int drm_open(struct inode *inode, struct file *filp);
|
extern int drm_open(struct inode *inode, struct file *filp);
|
||||||
extern int drm_stub_open(struct inode *inode, struct file *filp);
|
|
||||||
extern ssize_t drm_read(struct file *filp, char __user *buffer,
|
extern ssize_t drm_read(struct file *filp, char __user *buffer,
|
||||||
size_t count, loff_t *offset);
|
size_t count, loff_t *offset);
|
||||||
extern int drm_release(struct inode *inode, struct file *filp);
|
extern int drm_release(struct inode *inode, struct file *filp);
|
||||||
@ -1386,9 +1385,6 @@ extern unsigned int drm_timestamp_precision;
|
|||||||
extern unsigned int drm_timestamp_monotonic;
|
extern unsigned int drm_timestamp_monotonic;
|
||||||
|
|
||||||
extern struct class *drm_class;
|
extern struct class *drm_class;
|
||||||
extern struct dentry *drm_debugfs_root;
|
|
||||||
|
|
||||||
extern struct idr drm_minors_idr;
|
|
||||||
|
|
||||||
extern struct drm_local_map *drm_getsarea(struct drm_device *dev);
|
extern struct drm_local_map *drm_getsarea(struct drm_device *dev);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user