drm_drv.c 27.7 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6
/*
 * Created: Fri Jan 19 10:48:35 2001 by faith@acm.org
 *
 * Copyright 2001 VA Linux Systems, Inc., Sunnyvale, California.
 * All Rights Reserved.
 *
7 8
 * Author Rickard E. (Rik) Faith <faith@valinux.com>
 *
L
Linus Torvalds 已提交
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

29
#include <linux/debugfs.h>
30
#include <linux/fs.h>
L
Linus Torvalds 已提交
31 32
#include <linux/module.h>
#include <linux/moduleparam.h>
33
#include <linux/mount.h>
34
#include <linux/slab.h>
D
Daniel Vetter 已提交
35 36

#include <drm/drm_drv.h>
37
#include <drm/drmP.h>
D
Daniel Vetter 已提交
38

39
#include "drm_crtc_internal.h"
40
#include "drm_legacy.h"
41
#include "drm_internal.h"
D
Daniel Vetter 已提交
42
#include "drm_crtc_internal.h"
L
Linus Torvalds 已提交
43

44 45 46 47 48
/*
 * drm_debug: Enable debug output.
 * Bitmask of DRM_UT_x. See include/drm/drmP.h for details.
 */
unsigned int drm_debug = 0;
L
Linus Torvalds 已提交
49 50
EXPORT_SYMBOL(drm_debug);

D
David Herrmann 已提交
51 52
MODULE_AUTHOR("Gareth Hughes, Leif Delgass, José Fonseca, Jon Smirl");
MODULE_DESCRIPTION("DRM shared core routines");
L
Linus Torvalds 已提交
53
MODULE_LICENSE("GPL and additional rights");
54 55 56 57 58 59
MODULE_PARM_DESC(debug, "Enable debug output, where each bit enables a debug category.\n"
"\t\tBit 0 (0x01) will enable CORE messages (drm core code)\n"
"\t\tBit 1 (0x02) will enable DRIVER messages (drm controller code)\n"
"\t\tBit 2 (0x04) will enable KMS messages (modesetting code)\n"
"\t\tBit 3 (0x08) will enable PRIME messages (prime code)\n"
"\t\tBit 4 (0x10) will enable ATOMIC messages (atomic code)\n"
K
Keith Packard 已提交
60 61
"\t\tBit 5 (0x20) will enable VBL messages (vblank code)\n"
"\t\tBit 7 (0x80) will enable LEASE messages (leasing code)");
62
module_param_named(debug, drm_debug, int, 0600);
L
Linus Torvalds 已提交
63

64
static DEFINE_SPINLOCK(drm_minor_lock);
65
static struct idr drm_minors_idr;
66

67 68 69 70 71 72 73 74 75
/*
 * If the drm core fails to init for whatever reason,
 * we should prevent any drivers from registering with it.
 * It's best to check this at drm_dev_init(), as some drivers
 * prefer to embed struct drm_device into their own device
 * structure and call drm_dev_init() themselves.
 */
static bool drm_core_init_complete = false;

76
static struct dentry *drm_debugfs_root;
J
Joe Perches 已提交
77

78 79 80 81 82
#define DRM_PRINTK_FMT "[" DRM_NAME ":%s]%s %pV"

void drm_dev_printk(const struct device *dev, const char *level,
		    unsigned int category, const char *function_name,
		    const char *prefix, const char *format, ...)
J
Joe Perches 已提交
83 84 85 86
{
	struct va_format vaf;
	va_list args;

87 88
	if (category != DRM_UT_NONE && !(drm_debug & category))
		return;
J
Joe Perches 已提交
89

90
	va_start(args, format);
J
Joe Perches 已提交
91 92 93
	vaf.fmt = format;
	vaf.va = &args;

94 95 96 97 98
	if (dev)
		dev_printk(level, dev, DRM_PRINTK_FMT, function_name, prefix,
			   &vaf);
	else
		printk("%s" DRM_PRINTK_FMT, level, function_name, prefix, &vaf);
J
Joe Perches 已提交
99 100 101

	va_end(args);
}
102
EXPORT_SYMBOL(drm_dev_printk);
J
Joe Perches 已提交
103

104 105
void drm_printk(const char *level, unsigned int category,
		const char *format, ...)
106
{
D
Daniel Vetter 已提交
107
	struct va_format vaf;
108
	va_list args;
L
Linus Torvalds 已提交
109

110 111 112
	if (category != DRM_UT_NONE && !(drm_debug & category))
		return;

113 114 115 116
	va_start(args, format);
	vaf.fmt = format;
	vaf.va = &args;

117 118 119
	printk("%s" "[" DRM_NAME ":%ps]%s %pV",
	       level, __builtin_return_address(0),
	       strcmp(level, KERN_ERR) == 0 ? " *ERROR*" : "", &vaf);
120 121

	va_end(args);
122
}
123
EXPORT_SYMBOL(drm_printk);
J
Joe Perches 已提交
124

125 126 127 128 129
/*
 * DRM Minors
 * A DRM device can provide several char-dev interfaces on the DRM-Major. Each
 * of them is represented by a drm_minor object. Depending on the capabilities
 * of the device-driver, different interfaces are registered.
L
Linus Torvalds 已提交
130
 *
131 132 133 134 135
 * Minors can be accessed via dev->$minor_name. This pointer is either
 * NULL or a valid drm_minor pointer and stays valid as long as the device is
 * valid. This means, DRM minors have the same life-time as the underlying
 * device. However, this doesn't mean that the minor is active. Minors are
 * registered and unregistered dynamically according to device-state.
L
Linus Torvalds 已提交
136
 */
137

D
David Herrmann 已提交
138 139 140 141
static struct drm_minor **drm_minor_get_slot(struct drm_device *dev,
					     unsigned int type)
{
	switch (type) {
142
	case DRM_MINOR_PRIMARY:
D
David Herrmann 已提交
143 144 145 146 147 148 149 150 151 152 153 154 155
		return &dev->primary;
	case DRM_MINOR_RENDER:
		return &dev->render;
	case DRM_MINOR_CONTROL:
		return &dev->control;
	default:
		return NULL;
	}
}

static int drm_minor_alloc(struct drm_device *dev, unsigned int type)
{
	struct drm_minor *minor;
156 157
	unsigned long flags;
	int r;
D
David Herrmann 已提交
158 159 160 161 162 163 164 165

	minor = kzalloc(sizeof(*minor), GFP_KERNEL);
	if (!minor)
		return -ENOMEM;

	minor->type = type;
	minor->dev = dev;

166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
	idr_preload(GFP_KERNEL);
	spin_lock_irqsave(&drm_minor_lock, flags);
	r = idr_alloc(&drm_minors_idr,
		      NULL,
		      64 * type,
		      64 * (type + 1),
		      GFP_NOWAIT);
	spin_unlock_irqrestore(&drm_minor_lock, flags);
	idr_preload_end();

	if (r < 0)
		goto err_free;

	minor->index = r;

181 182 183 184 185 186
	minor->kdev = drm_sysfs_minor_alloc(minor);
	if (IS_ERR(minor->kdev)) {
		r = PTR_ERR(minor->kdev);
		goto err_index;
	}

D
David Herrmann 已提交
187 188
	*drm_minor_get_slot(dev, type) = minor;
	return 0;
189

190 191 192 193
err_index:
	spin_lock_irqsave(&drm_minor_lock, flags);
	idr_remove(&drm_minors_idr, minor->index);
	spin_unlock_irqrestore(&drm_minor_lock, flags);
194 195 196
err_free:
	kfree(minor);
	return r;
D
David Herrmann 已提交
197 198
}

199 200
static void drm_minor_free(struct drm_device *dev, unsigned int type)
{
201 202
	struct drm_minor **slot, *minor;
	unsigned long flags;
203 204

	slot = drm_minor_get_slot(dev, type);
205 206 207 208
	minor = *slot;
	if (!minor)
		return;

209
	put_device(minor->kdev);
210 211 212 213 214 215 216

	spin_lock_irqsave(&drm_minor_lock, flags);
	idr_remove(&drm_minors_idr, minor->index);
	spin_unlock_irqrestore(&drm_minor_lock, flags);

	kfree(minor);
	*slot = NULL;
217 218
}

219
static int drm_minor_register(struct drm_device *dev, unsigned int type)
L
Linus Torvalds 已提交
220
{
221
	struct drm_minor *minor;
222
	unsigned long flags;
L
Linus Torvalds 已提交
223 224 225 226
	int ret;

	DRM_DEBUG("\n");

227 228
	minor = *drm_minor_get_slot(dev, type);
	if (!minor)
D
David Herrmann 已提交
229 230
		return 0;

231
	ret = drm_debugfs_init(minor, minor->index, drm_debugfs_root);
232
	if (ret) {
233
		DRM_ERROR("DRM: Failed to initialize /sys/kernel/debug/dri.\n");
234
		goto err_debugfs;
235
	}
236

237 238
	ret = device_add(minor->kdev);
	if (ret)
D
Daniel Vetter 已提交
239
		goto err_debugfs;
240

241 242
	/* replace NULL with @minor so lookups will succeed from now on */
	spin_lock_irqsave(&drm_minor_lock, flags);
243
	idr_replace(&drm_minors_idr, minor, minor->index);
244
	spin_unlock_irqrestore(&drm_minor_lock, flags);
245

246
	DRM_DEBUG("new minor registered %d\n", minor->index);
247 248
	return 0;

D
Daniel Vetter 已提交
249
err_debugfs:
250
	drm_debugfs_cleanup(minor);
L
Linus Torvalds 已提交
251 252
	return ret;
}
D
Dave Airlie 已提交
253

254
static void drm_minor_unregister(struct drm_device *dev, unsigned int type)
255
{
256
	struct drm_minor *minor;
257
	unsigned long flags;
258 259

	minor = *drm_minor_get_slot(dev, type);
260
	if (!minor || !device_is_registered(minor->kdev))
261 262
		return;

263
	/* replace @minor with NULL so lookups will fail from now on */
264
	spin_lock_irqsave(&drm_minor_lock, flags);
265
	idr_replace(&drm_minors_idr, NULL, minor->index);
266
	spin_unlock_irqrestore(&drm_minor_lock, flags);
267

268 269
	device_del(minor->kdev);
	dev_set_drvdata(minor->kdev, NULL); /* safety belt */
270
	drm_debugfs_cleanup(minor);
271 272
}

D
Daniel Vetter 已提交
273
/*
274 275 276 277 278 279 280
 * Looks up the given minor-ID and returns the respective DRM-minor object. The
 * refence-count of the underlying device is increased so you must release this
 * object with drm_minor_release().
 *
 * As long as you hold this minor, it is guaranteed that the object and the
 * minor->dev pointer will stay valid! However, the device may get unplugged and
 * unregistered while you hold the minor.
L
Linus Torvalds 已提交
281
 */
282
struct drm_minor *drm_minor_acquire(unsigned int minor_id)
L
Linus Torvalds 已提交
283
{
284
	struct drm_minor *minor;
285
	unsigned long flags;
286

287
	spin_lock_irqsave(&drm_minor_lock, flags);
288
	minor = idr_find(&drm_minors_idr, minor_id);
289
	if (minor)
290
		drm_dev_get(minor->dev);
291 292 293 294
	spin_unlock_irqrestore(&drm_minor_lock, flags);

	if (!minor) {
		return ERR_PTR(-ENODEV);
295
	} else if (drm_dev_is_unplugged(minor->dev)) {
296
		drm_dev_put(minor->dev);
297
		return ERR_PTR(-ENODEV);
298
	}
299

300 301
	return minor;
}
D
Dave Airlie 已提交
302

303 304
void drm_minor_release(struct drm_minor *minor)
{
305
	drm_dev_put(minor->dev);
L
Linus Torvalds 已提交
306
}
307

308 309 310
/**
 * DOC: driver instance overview
 *
311
 * A device instance for a drm driver is represented by &struct drm_device. This
312 313 314 315
 * is allocated with drm_dev_alloc(), usually from bus-specific ->probe()
 * callbacks implemented by the driver. The driver then needs to initialize all
 * the various subsystems for the drm device like memory management, vblank
 * handling, modesetting support and intial output configuration plus obviously
G
Gerd Hoffmann 已提交
316 317 318 319
 * initialize all the corresponding hardware bits. An important part of this is
 * also calling drm_dev_set_unique() to set the userspace-visible unique name of
 * this device instance. Finally when everything is up and running and ready for
 * userspace the device instance can be published using drm_dev_register().
320 321
 *
 * There is also deprecated support for initalizing device instances using
322
 * bus-specific helpers and the &drm_driver.load callback. But due to
323 324 325 326 327 328 329
 * backwards-compatibility needs the device instance have to be published too
 * early, which requires unpretty global locking to make safe and is therefore
 * only support for existing drivers not yet converted to the new scheme.
 *
 * When cleaning up a device instance everything needs to be done in reverse:
 * First unpublish the device instance with drm_dev_unregister(). Then clean up
 * any other resources allocated at device initialization and drop the driver's
330
 * reference to &drm_device using drm_dev_put().
331 332 333
 *
 * Note that the lifetime rules for &drm_device instance has still a lot of
 * historical baggage. Hence use the reference counting provided by
334
 * drm_dev_get() and drm_dev_put() only carefully.
335
 *
336
 * It is recommended that drivers embed &struct drm_device into their own device
337
 * structure, which is supported through drm_dev_init().
338 339
 */

340
/**
341 342
 * drm_put_dev - Unregister and release a DRM device
 * @dev: DRM device
343
 *
344
 * Called at module unload time or when a PCI device is unplugged.
345
 *
346
 * Cleans up all DRM device, calling drm_lastclose().
347 348
 *
 * Note: Use of this function is deprecated. It will eventually go away
349
 * completely.  Please use drm_dev_unregister() and drm_dev_put() explicitly
350 351 352
 * instead to make sure that the device isn't userspace accessible any more
 * while teardown is in progress, ensuring that userspace can't access an
 * inconsistent state.
353 354 355 356 357 358 359 360 361 362
 */
void drm_put_dev(struct drm_device *dev)
{
	DRM_DEBUG("\n");

	if (!dev) {
		DRM_ERROR("cleanup called no dev\n");
		return;
	}

363
	drm_dev_unregister(dev);
364
	drm_dev_put(dev);
365 366
}
EXPORT_SYMBOL(drm_put_dev);
367

368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383
static void drm_device_set_unplugged(struct drm_device *dev)
{
	smp_wmb();
	atomic_set(&dev->unplugged, 1);
}

/**
 * drm_dev_unplug - unplug a DRM device
 * @dev: DRM device
 *
 * This unplugs a hotpluggable DRM device, which makes it inaccessible to
 * userspace operations. Entry-points can use drm_dev_is_unplugged(). This
 * essentially unregisters the device like drm_dev_unregister(), but can be
 * called while there are still open users of @dev.
 */
void drm_dev_unplug(struct drm_device *dev)
384
{
D
Daniel Vetter 已提交
385
	drm_dev_unregister(dev);
386 387 388

	mutex_lock(&drm_global_mutex);
	drm_device_set_unplugged(dev);
D
Daniel Vetter 已提交
389
	if (dev->open_count == 0)
390
		drm_dev_put(dev);
391 392
	mutex_unlock(&drm_global_mutex);
}
393
EXPORT_SYMBOL(drm_dev_unplug);
D
David Herrmann 已提交
394

395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466
/*
 * DRM internal mount
 * We want to be able to allocate our own "struct address_space" to control
 * memory-mappings in VRAM (or stolen RAM, ...). However, core MM does not allow
 * stand-alone address_space objects, so we need an underlying inode. As there
 * is no way to allocate an independent inode easily, we need a fake internal
 * VFS mount-point.
 *
 * The drm_fs_inode_new() function allocates a new inode, drm_fs_inode_free()
 * frees it again. You are allowed to use iget() and iput() to get references to
 * the inode. But each drm_fs_inode_new() call must be paired with exactly one
 * drm_fs_inode_free() call (which does not have to be the last iput()).
 * We use drm_fs_inode_*() to manage our internal VFS mount-point and share it
 * between multiple inode-users. You could, technically, call
 * iget() + drm_fs_inode_free() directly after alloc and sometime later do an
 * iput(), but this way you'd end up with a new vfsmount for each inode.
 */

static int drm_fs_cnt;
static struct vfsmount *drm_fs_mnt;

static const struct dentry_operations drm_fs_dops = {
	.d_dname	= simple_dname,
};

static const struct super_operations drm_fs_sops = {
	.statfs		= simple_statfs,
};

static struct dentry *drm_fs_mount(struct file_system_type *fs_type, int flags,
				   const char *dev_name, void *data)
{
	return mount_pseudo(fs_type,
			    "drm:",
			    &drm_fs_sops,
			    &drm_fs_dops,
			    0x010203ff);
}

static struct file_system_type drm_fs_type = {
	.name		= "drm",
	.owner		= THIS_MODULE,
	.mount		= drm_fs_mount,
	.kill_sb	= kill_anon_super,
};

static struct inode *drm_fs_inode_new(void)
{
	struct inode *inode;
	int r;

	r = simple_pin_fs(&drm_fs_type, &drm_fs_mnt, &drm_fs_cnt);
	if (r < 0) {
		DRM_ERROR("Cannot mount pseudo fs: %d\n", r);
		return ERR_PTR(r);
	}

	inode = alloc_anon_inode(drm_fs_mnt->mnt_sb);
	if (IS_ERR(inode))
		simple_release_fs(&drm_fs_mnt, &drm_fs_cnt);

	return inode;
}

static void drm_fs_inode_free(struct inode *inode)
{
	if (inode) {
		iput(inode);
		simple_release_fs(&drm_fs_mnt, &drm_fs_cnt);
	}
}

D
David Herrmann 已提交
467
/**
468 469 470
 * drm_dev_init - Initialise new DRM device
 * @dev: DRM device
 * @driver: DRM driver
D
David Herrmann 已提交
471 472
 * @parent: Parent device object
 *
473
 * Initialize a new DRM device. No device registration is done.
474
 * Call drm_dev_register() to advertice the device to user space and register it
475 476 477
 * with other core subsystems. This should be done last in the device
 * initialization sequence to make sure userspace can't access an inconsistent
 * state.
D
David Herrmann 已提交
478
 *
479 480
 * The initial ref-count of the object is 1. Use drm_dev_get() and
 * drm_dev_put() to take and drop further ref-counts.
D
David Herrmann 已提交
481
 *
482 483
 * Note that for purely virtual devices @parent can be NULL.
 *
484
 * Drivers that do not want to allocate their own device struct
485 486
 * embedding &struct drm_device can call drm_dev_alloc() instead. For drivers
 * that do embed &struct drm_device it must be placed first in the overall
487 488
 * structure, and the overall structure must be allocated using kmalloc(): The
 * drm core's release function unconditionally calls kfree() on the @dev pointer
489 490 491 492
 * when the final reference is released. To override this behaviour, and so
 * allow embedding of the drm_device inside the driver's device struct at an
 * arbitrary offset, you must supply a &drm_driver.release callback and control
 * the finalization explicitly.
493
 *
D
David Herrmann 已提交
494
 * RETURNS:
495
 * 0 on success, or error code on failure.
D
David Herrmann 已提交
496
 */
497 498 499
int drm_dev_init(struct drm_device *dev,
		 struct drm_driver *driver,
		 struct device *parent)
D
David Herrmann 已提交
500 501 502
{
	int ret;

503 504 505 506 507
	if (!drm_core_init_complete) {
		DRM_ERROR("DRM core is not initialized\n");
		return -ENODEV;
	}

D
David Herrmann 已提交
508
	kref_init(&dev->ref);
D
David Herrmann 已提交
509 510 511 512 513 514 515 516 517
	dev->dev = parent;
	dev->driver = driver;

	INIT_LIST_HEAD(&dev->filelist);
	INIT_LIST_HEAD(&dev->ctxlist);
	INIT_LIST_HEAD(&dev->vmalist);
	INIT_LIST_HEAD(&dev->maplist);
	INIT_LIST_HEAD(&dev->vblank_event_list);

518
	spin_lock_init(&dev->buf_lock);
D
David Herrmann 已提交
519 520
	spin_lock_init(&dev->event_lock);
	mutex_init(&dev->struct_mutex);
521
	mutex_init(&dev->filelist_mutex);
D
David Herrmann 已提交
522
	mutex_init(&dev->ctxlist_mutex);
523
	mutex_init(&dev->master_mutex);
D
David Herrmann 已提交
524

525 526 527 528
	dev->anon_inode = drm_fs_inode_new();
	if (IS_ERR(dev->anon_inode)) {
		ret = PTR_ERR(dev->anon_inode);
		DRM_ERROR("Cannot allocate anonymous inode: %d\n", ret);
D
David Herrmann 已提交
529
		goto err_free;
530 531
	}

532
	if (drm_core_check_feature(dev, DRIVER_RENDER)) {
D
David Herrmann 已提交
533 534 535 536 537
		ret = drm_minor_alloc(dev, DRM_MINOR_RENDER);
		if (ret)
			goto err_minors;
	}

538
	ret = drm_minor_alloc(dev, DRM_MINOR_PRIMARY);
D
David Herrmann 已提交
539 540 541
	if (ret)
		goto err_minors;

542 543
	ret = drm_ht_create(&dev->map_hash, 12);
	if (ret)
D
David Herrmann 已提交
544
		goto err_minors;
D
David Herrmann 已提交
545

546
	drm_legacy_ctxbitmap_init(dev);
D
David Herrmann 已提交
547

548
	if (drm_core_check_feature(dev, DRIVER_GEM)) {
D
David Herrmann 已提交
549 550 551 552 553 554 555
		ret = drm_gem_init(dev);
		if (ret) {
			DRM_ERROR("Cannot initialize graphics execution manager (GEM)\n");
			goto err_ctxbitmap;
		}
	}

556 557 558 559 560
	/* Use the parent device name as DRM device unique identifier, but fall
	 * back to the driver name for virtual devices like vgem. */
	ret = drm_dev_set_unique(dev, parent ? dev_name(parent) : driver->name);
	if (ret)
		goto err_setunique;
561

562
	return 0;
D
David Herrmann 已提交
563

564 565 566
err_setunique:
	if (drm_core_check_feature(dev, DRIVER_GEM))
		drm_gem_destroy(dev);
D
David Herrmann 已提交
567
err_ctxbitmap:
568
	drm_legacy_ctxbitmap_cleanup(dev);
D
David Herrmann 已提交
569
	drm_ht_remove(&dev->map_hash);
D
David Herrmann 已提交
570
err_minors:
571
	drm_minor_free(dev, DRM_MINOR_PRIMARY);
572 573
	drm_minor_free(dev, DRM_MINOR_RENDER);
	drm_minor_free(dev, DRM_MINOR_CONTROL);
574
	drm_fs_inode_free(dev->anon_inode);
D
David Herrmann 已提交
575
err_free:
576
	mutex_destroy(&dev->master_mutex);
577 578 579
	mutex_destroy(&dev->ctxlist_mutex);
	mutex_destroy(&dev->filelist_mutex);
	mutex_destroy(&dev->struct_mutex);
580 581 582 583
	return ret;
}
EXPORT_SYMBOL(drm_dev_init);

584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618
/**
 * drm_dev_fini - Finalize a dead DRM device
 * @dev: DRM device
 *
 * Finalize a dead DRM device. This is the converse to drm_dev_init() and
 * frees up all data allocated by it. All driver private data should be
 * finalized first. Note that this function does not free the @dev, that is
 * left to the caller.
 *
 * The ref-count of @dev must be zero, and drm_dev_fini() should only be called
 * from a &drm_driver.release callback.
 */
void drm_dev_fini(struct drm_device *dev)
{
	drm_vblank_cleanup(dev);

	if (drm_core_check_feature(dev, DRIVER_GEM))
		drm_gem_destroy(dev);

	drm_legacy_ctxbitmap_cleanup(dev);
	drm_ht_remove(&dev->map_hash);
	drm_fs_inode_free(dev->anon_inode);

	drm_minor_free(dev, DRM_MINOR_PRIMARY);
	drm_minor_free(dev, DRM_MINOR_RENDER);
	drm_minor_free(dev, DRM_MINOR_CONTROL);

	mutex_destroy(&dev->master_mutex);
	mutex_destroy(&dev->ctxlist_mutex);
	mutex_destroy(&dev->filelist_mutex);
	mutex_destroy(&dev->struct_mutex);
	kfree(dev->unique);
}
EXPORT_SYMBOL(drm_dev_fini);

619 620 621 622 623 624 625 626 627 628 629
/**
 * drm_dev_alloc - Allocate new DRM device
 * @driver: DRM driver to allocate device for
 * @parent: Parent device object
 *
 * Allocate and initialize a new DRM device. No device registration is done.
 * Call drm_dev_register() to advertice the device to user space and register it
 * with other core subsystems. This should be done last in the device
 * initialization sequence to make sure userspace can't access an inconsistent
 * state.
 *
630 631
 * The initial ref-count of the object is 1. Use drm_dev_get() and
 * drm_dev_put() to take and drop further ref-counts.
632 633 634
 *
 * Note that for purely virtual devices @parent can be NULL.
 *
635
 * Drivers that wish to subclass or embed &struct drm_device into their
636 637 638
 * own struct should look at using drm_dev_init() instead.
 *
 * RETURNS:
639
 * Pointer to new DRM device, or ERR_PTR on failure.
640 641 642 643 644 645 646 647 648
 */
struct drm_device *drm_dev_alloc(struct drm_driver *driver,
				 struct device *parent)
{
	struct drm_device *dev;
	int ret;

	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
	if (!dev)
649
		return ERR_PTR(-ENOMEM);
650 651 652 653

	ret = drm_dev_init(dev, driver, parent);
	if (ret) {
		kfree(dev);
654
		return ERR_PTR(ret);
655 656 657
	}

	return dev;
D
David Herrmann 已提交
658 659
}
EXPORT_SYMBOL(drm_dev_alloc);
660

D
David Herrmann 已提交
661
static void drm_dev_release(struct kref *ref)
662
{
D
David Herrmann 已提交
663
	struct drm_device *dev = container_of(ref, struct drm_device, ref);
664

665 666 667 668 669 670
	if (dev->driver->release) {
		dev->driver->release(dev);
	} else {
		drm_dev_fini(dev);
		kfree(dev);
	}
671
}
D
David Herrmann 已提交
672 673

/**
674
 * drm_dev_get - Take reference of a DRM device
D
David Herrmann 已提交
675 676 677
 * @dev: device to take reference of or NULL
 *
 * This increases the ref-count of @dev by one. You *must* already own a
678
 * reference when calling this. Use drm_dev_put() to drop this reference
D
David Herrmann 已提交
679 680 681 682 683 684
 * again.
 *
 * This function never fails. However, this function does not provide *any*
 * guarantee whether the device is alive or running. It only provides a
 * reference to the object and the memory associated with it.
 */
685
void drm_dev_get(struct drm_device *dev)
D
David Herrmann 已提交
686 687 688 689
{
	if (dev)
		kref_get(&dev->ref);
}
690
EXPORT_SYMBOL(drm_dev_get);
D
David Herrmann 已提交
691 692

/**
693
 * drm_dev_put - Drop reference of a DRM device
D
David Herrmann 已提交
694 695 696 697 698
 * @dev: device to drop reference of or NULL
 *
 * This decreases the ref-count of @dev by one. The device is destroyed if the
 * ref-count drops to zero.
 */
699
void drm_dev_put(struct drm_device *dev)
D
David Herrmann 已提交
700 701 702 703
{
	if (dev)
		kref_put(&dev->ref, drm_dev_release);
}
704 705 706 707 708 709 710 711 712 713 714 715 716
EXPORT_SYMBOL(drm_dev_put);

/**
 * drm_dev_unref - Drop reference of a DRM device
 * @dev: device to drop reference of or NULL
 *
 * This is a compatibility alias for drm_dev_put() and should not be used by new
 * code.
 */
void drm_dev_unref(struct drm_device *dev)
{
	drm_dev_put(dev);
}
D
David Herrmann 已提交
717
EXPORT_SYMBOL(drm_dev_unref);
718

719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774
static int create_compat_control_link(struct drm_device *dev)
{
	struct drm_minor *minor;
	char *name;
	int ret;

	if (!drm_core_check_feature(dev, DRIVER_MODESET))
		return 0;

	minor = *drm_minor_get_slot(dev, DRM_MINOR_PRIMARY);
	if (!minor)
		return 0;

	/*
	 * Some existing userspace out there uses the existing of the controlD*
	 * sysfs files to figure out whether it's a modeset driver. It only does
	 * readdir, hence a symlink is sufficient (and the least confusing
	 * option). Otherwise controlD* is entirely unused.
	 *
	 * Old controlD chardev have been allocated in the range
	 * 64-127.
	 */
	name = kasprintf(GFP_KERNEL, "controlD%d", minor->index + 64);
	if (!name)
		return -ENOMEM;

	ret = sysfs_create_link(minor->kdev->kobj.parent,
				&minor->kdev->kobj,
				name);

	kfree(name);

	return ret;
}

static void remove_compat_control_link(struct drm_device *dev)
{
	struct drm_minor *minor;
	char *name;

	if (!drm_core_check_feature(dev, DRIVER_MODESET))
		return;

	minor = *drm_minor_get_slot(dev, DRM_MINOR_PRIMARY);
	if (!minor)
		return;

	name = kasprintf(GFP_KERNEL, "controlD%d", minor->index);
	if (!name)
		return;

	sysfs_remove_link(minor->kdev->kobj.parent, name);

	kfree(name);
}

775 776 777
/**
 * drm_dev_register - Register DRM device
 * @dev: Device to register
778
 * @flags: Flags passed to the driver's .load() function
779 780 781
 *
 * Register the DRM device @dev with the system, advertise device to user-space
 * and start normal device operation. @dev must be allocated via drm_dev_alloc()
782
 * previously.
783 784 785
 *
 * Never call this twice on any device!
 *
786
 * NOTE: To ensure backward compatibility with existing drivers method this
787 788 789
 * function calls the &drm_driver.load method after registering the device
 * nodes, creating race conditions. Usage of the &drm_driver.load methods is
 * therefore deprecated, drivers must perform all initialization before calling
790 791
 * drm_dev_register().
 *
792 793 794 795 796
 * RETURNS:
 * 0 on success, negative error code on failure.
 */
int drm_dev_register(struct drm_device *dev, unsigned long flags)
{
797
	struct drm_driver *driver = dev->driver;
798 799 800 801
	int ret;

	mutex_lock(&drm_global_mutex);

802
	ret = drm_minor_register(dev, DRM_MINOR_CONTROL);
D
David Herrmann 已提交
803 804
	if (ret)
		goto err_minors;
805

806
	ret = drm_minor_register(dev, DRM_MINOR_RENDER);
D
David Herrmann 已提交
807 808
	if (ret)
		goto err_minors;
809

810
	ret = drm_minor_register(dev, DRM_MINOR_PRIMARY);
811
	if (ret)
D
David Herrmann 已提交
812
		goto err_minors;
813

814 815 816 817
	ret = create_compat_control_link(dev);
	if (ret)
		goto err_minors;

818 819
	dev->registered = true;

820 821 822
	if (dev->driver->load) {
		ret = dev->driver->load(dev, flags);
		if (ret)
D
David Herrmann 已提交
823
			goto err_minors;
824 825
	}

826
	if (drm_core_check_feature(dev, DRIVER_MODESET))
827
		drm_modeset_register_all(dev);
828

829
	ret = 0;
830 831 832

	DRM_INFO("Initialized %s %d.%d.%d %s for %s on minor %d\n",
		 driver->name, driver->major, driver->minor,
833 834
		 driver->patchlevel, driver->date,
		 dev->dev ? dev_name(dev->dev) : "virtual device",
835 836
		 dev->primary->index);

837 838
	goto out_unlock;

D
David Herrmann 已提交
839
err_minors:
840
	remove_compat_control_link(dev);
841
	drm_minor_unregister(dev, DRM_MINOR_PRIMARY);
842 843
	drm_minor_unregister(dev, DRM_MINOR_RENDER);
	drm_minor_unregister(dev, DRM_MINOR_CONTROL);
844 845 846 847 848
out_unlock:
	mutex_unlock(&drm_global_mutex);
	return ret;
}
EXPORT_SYMBOL(drm_dev_register);
849 850 851 852 853 854 855

/**
 * drm_dev_unregister - Unregister DRM device
 * @dev: Device to unregister
 *
 * Unregister the DRM device from the system. This does the reverse of
 * drm_dev_register() but does not deallocate the device. The caller must call
856
 * drm_dev_put() to drop their final reference.
857
 *
858 859 860
 * A special form of unregistering for hotpluggable devices is drm_dev_unplug(),
 * which can be called while there are still open users of @dev.
 *
861 862
 * This should be called first in the device teardown code to make sure
 * userspace can't access the device instance any more.
863 864 865 866 867
 */
void drm_dev_unregister(struct drm_device *dev)
{
	struct drm_map_list *r_list, *list_temp;

868 869
	if (drm_core_check_feature(dev, DRIVER_LEGACY))
		drm_lastclose(dev);
870

871 872
	dev->registered = false;

873
	if (drm_core_check_feature(dev, DRIVER_MODESET))
874
		drm_modeset_unregister_all(dev);
875

876 877 878
	if (dev->driver->unload)
		dev->driver->unload(dev);

879 880
	if (dev->agp)
		drm_pci_agp_destroy(dev);
881 882

	list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head)
883
		drm_legacy_rmmap(dev, r_list->map);
884

885
	remove_compat_control_link(dev);
886
	drm_minor_unregister(dev, DRM_MINOR_PRIMARY);
887 888
	drm_minor_unregister(dev, DRM_MINOR_RENDER);
	drm_minor_unregister(dev, DRM_MINOR_CONTROL);
889 890
}
EXPORT_SYMBOL(drm_dev_unregister);
891

G
Gerd Hoffmann 已提交
892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911
/**
 * drm_dev_set_unique - Set the unique name of a DRM device
 * @dev: device of which to set the unique name
 * @name: unique name
 *
 * Sets the unique name of a DRM device using the specified string. Drivers
 * can use this at driver probe time if the unique name of the devices they
 * drive is static.
 *
 * Return: 0 on success or a negative error code on failure.
 */
int drm_dev_set_unique(struct drm_device *dev, const char *name)
{
	kfree(dev->unique);
	dev->unique = kstrdup(name, GFP_KERNEL);

	return dev->unique ? 0 : -ENOMEM;
}
EXPORT_SYMBOL(drm_dev_set_unique);

912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971
/*
 * 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,
};

972 973 974 975 976 977 978 979 980 981
static void drm_core_exit(void)
{
	unregister_chrdev(DRM_MAJOR, "drm");
	debugfs_remove(drm_debugfs_root);
	drm_sysfs_destroy();
	idr_destroy(&drm_minors_idr);
	drm_connector_ida_destroy();
	drm_global_release();
}

982 983
static int __init drm_core_init(void)
{
984
	int ret;
985 986 987 988 989

	drm_global_init();
	drm_connector_ida_init();
	idr_init(&drm_minors_idr);

990 991
	ret = drm_sysfs_init();
	if (ret < 0) {
992 993
		DRM_ERROR("Cannot create DRM class: %d\n", ret);
		goto error;
994 995 996 997
	}

	drm_debugfs_root = debugfs_create_dir("dri", NULL);
	if (!drm_debugfs_root) {
998 999 1000
		ret = -ENOMEM;
		DRM_ERROR("Cannot create debugfs-root: %d\n", ret);
		goto error;
1001 1002
	}

1003 1004 1005 1006
	ret = register_chrdev(DRM_MAJOR, "drm", &drm_stub_fops);
	if (ret < 0)
		goto error;

1007 1008
	drm_core_init_complete = true;

1009
	DRM_DEBUG("Initialized\n");
1010 1011
	return 0;

1012 1013
error:
	drm_core_exit();
1014 1015 1016 1017 1018
	return ret;
}

module_init(drm_core_init);
module_exit(drm_core_exit);