drm_drv.c 32.6 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>
35
#include <linux/srcu.h>
D
Daniel Vetter 已提交
36

37
#include <drm/drm_client.h>
S
Sam Ravnborg 已提交
38
#include <drm/drm_color_mgmt.h>
D
Daniel Vetter 已提交
39
#include <drm/drm_drv.h>
S
Sam Ravnborg 已提交
40 41 42
#include <drm/drm_file.h>
#include <drm/drm_mode_object.h>
#include <drm/drm_print.h>
D
Daniel Vetter 已提交
43

44
#include "drm_crtc_internal.h"
45
#include "drm_internal.h"
S
Sam Ravnborg 已提交
46
#include "drm_legacy.h"
L
Linus Torvalds 已提交
47

48 49
/*
 * drm_debug: Enable debug output.
S
Sam Ravnborg 已提交
50
 * Bitmask of DRM_UT_x. See include/drm/drm_print.h for details.
51 52
 */
unsigned int drm_debug = 0;
L
Linus Torvalds 已提交
53 54
EXPORT_SYMBOL(drm_debug);

D
David Herrmann 已提交
55 56
MODULE_AUTHOR("Gareth Hughes, Leif Delgass, José Fonseca, Jon Smirl");
MODULE_DESCRIPTION("DRM shared core routines");
L
Linus Torvalds 已提交
57
MODULE_LICENSE("GPL and additional rights");
58
MODULE_PARM_DESC(debug, "Enable debug output, where each bit enables a debug category.\n"
59 60 61 62 63 64 65 66
"\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"
"\t\tBit 5 (0x20)  will enable VBL messages (vblank code)\n"
"\t\tBit 7 (0x80)  will enable LEASE messages (leasing code)\n"
"\t\tBit 8 (0x100) will enable DP messages (displayport code)");
67
module_param_named(debug, drm_debug, int, 0600);
L
Linus Torvalds 已提交
68

69
static DEFINE_SPINLOCK(drm_minor_lock);
70
static struct idr drm_minors_idr;
71

72 73 74 75 76 77 78 79 80
/*
 * 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;

81
static struct dentry *drm_debugfs_root;
J
Joe Perches 已提交
82

83 84
DEFINE_STATIC_SRCU(drm_unplug_srcu);

85 86 87 88 89
/*
 * 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 已提交
90
 *
91 92 93 94 95
 * 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 已提交
96
 */
97

D
David Herrmann 已提交
98 99 100 101
static struct drm_minor **drm_minor_get_slot(struct drm_device *dev,
					     unsigned int type)
{
	switch (type) {
102
	case DRM_MINOR_PRIMARY:
D
David Herrmann 已提交
103 104 105 106
		return &dev->primary;
	case DRM_MINOR_RENDER:
		return &dev->render;
	default:
107
		BUG();
D
David Herrmann 已提交
108 109 110 111 112 113
	}
}

static int drm_minor_alloc(struct drm_device *dev, unsigned int type)
{
	struct drm_minor *minor;
114 115
	unsigned long flags;
	int r;
D
David Herrmann 已提交
116 117 118 119 120 121 122 123

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

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

124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
	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;

139 140 141 142 143 144
	minor->kdev = drm_sysfs_minor_alloc(minor);
	if (IS_ERR(minor->kdev)) {
		r = PTR_ERR(minor->kdev);
		goto err_index;
	}

D
David Herrmann 已提交
145 146
	*drm_minor_get_slot(dev, type) = minor;
	return 0;
147

148 149 150 151
err_index:
	spin_lock_irqsave(&drm_minor_lock, flags);
	idr_remove(&drm_minors_idr, minor->index);
	spin_unlock_irqrestore(&drm_minor_lock, flags);
152 153 154
err_free:
	kfree(minor);
	return r;
D
David Herrmann 已提交
155 156
}

157 158
static void drm_minor_free(struct drm_device *dev, unsigned int type)
{
159 160
	struct drm_minor **slot, *minor;
	unsigned long flags;
161 162

	slot = drm_minor_get_slot(dev, type);
163 164 165 166
	minor = *slot;
	if (!minor)
		return;

167
	put_device(minor->kdev);
168 169 170 171 172 173 174

	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;
175 176
}

177
static int drm_minor_register(struct drm_device *dev, unsigned int type)
L
Linus Torvalds 已提交
178
{
179
	struct drm_minor *minor;
180
	unsigned long flags;
L
Linus Torvalds 已提交
181 182 183 184
	int ret;

	DRM_DEBUG("\n");

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

189
	ret = drm_debugfs_init(minor, minor->index, drm_debugfs_root);
190
	if (ret) {
191
		DRM_ERROR("DRM: Failed to initialize /sys/kernel/debug/dri.\n");
192
		goto err_debugfs;
193
	}
194

195 196
	ret = device_add(minor->kdev);
	if (ret)
D
Daniel Vetter 已提交
197
		goto err_debugfs;
198

199 200
	/* replace NULL with @minor so lookups will succeed from now on */
	spin_lock_irqsave(&drm_minor_lock, flags);
201
	idr_replace(&drm_minors_idr, minor, minor->index);
202
	spin_unlock_irqrestore(&drm_minor_lock, flags);
203

204
	DRM_DEBUG("new minor registered %d\n", minor->index);
205 206
	return 0;

D
Daniel Vetter 已提交
207
err_debugfs:
208
	drm_debugfs_cleanup(minor);
L
Linus Torvalds 已提交
209 210
	return ret;
}
D
Dave Airlie 已提交
211

212
static void drm_minor_unregister(struct drm_device *dev, unsigned int type)
213
{
214
	struct drm_minor *minor;
215
	unsigned long flags;
216 217

	minor = *drm_minor_get_slot(dev, type);
218
	if (!minor || !device_is_registered(minor->kdev))
219 220
		return;

221
	/* replace @minor with NULL so lookups will fail from now on */
222
	spin_lock_irqsave(&drm_minor_lock, flags);
223
	idr_replace(&drm_minors_idr, NULL, minor->index);
224
	spin_unlock_irqrestore(&drm_minor_lock, flags);
225

226 227
	device_del(minor->kdev);
	dev_set_drvdata(minor->kdev, NULL); /* safety belt */
228
	drm_debugfs_cleanup(minor);
229 230
}

D
Daniel Vetter 已提交
231
/*
232 233 234 235 236 237 238
 * 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 已提交
239
 */
240
struct drm_minor *drm_minor_acquire(unsigned int minor_id)
L
Linus Torvalds 已提交
241
{
242
	struct drm_minor *minor;
243
	unsigned long flags;
244

245
	spin_lock_irqsave(&drm_minor_lock, flags);
246
	minor = idr_find(&drm_minors_idr, minor_id);
247
	if (minor)
248
		drm_dev_get(minor->dev);
249 250 251 252
	spin_unlock_irqrestore(&drm_minor_lock, flags);

	if (!minor) {
		return ERR_PTR(-ENODEV);
253
	} else if (drm_dev_is_unplugged(minor->dev)) {
254
		drm_dev_put(minor->dev);
255
		return ERR_PTR(-ENODEV);
256
	}
257

258 259
	return minor;
}
D
Dave Airlie 已提交
260

261 262
void drm_minor_release(struct drm_minor *minor)
{
263
	drm_dev_put(minor->dev);
L
Linus Torvalds 已提交
264
}
265

266 267 268
/**
 * DOC: driver instance overview
 *
269
 * A device instance for a drm driver is represented by &struct drm_device. This
270
 * is initialized with drm_dev_init(), usually from bus-specific ->probe()
271 272 273
 * 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
274 275 276
 * initialize all the corresponding hardware bits. Finally when everything is up
 * and running and ready for userspace the device instance can be published
 * using drm_dev_register().
277 278
 *
 * There is also deprecated support for initalizing device instances using
279
 * bus-specific helpers and the &drm_driver.load callback. But due to
280 281 282 283 284 285 286
 * 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
287
 * reference to &drm_device using drm_dev_put().
288 289 290
 *
 * Note that the lifetime rules for &drm_device instance has still a lot of
 * historical baggage. Hence use the reference counting provided by
291
 * drm_dev_get() and drm_dev_put() only carefully.
292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 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
 *
 * Display driver example
 * ~~~~~~~~~~~~~~~~~~~~~~
 *
 * The following example shows a typical structure of a DRM display driver.
 * The example focus on the probe() function and the other functions that is
 * almost always present and serves as a demonstration of devm_drm_dev_init()
 * usage with its accompanying drm_driver->release callback.
 *
 * .. code-block:: c
 *
 *	struct driver_device {
 *		struct drm_device drm;
 *		void *userspace_facing;
 *		struct clk *pclk;
 *	};
 *
 *	static void driver_drm_release(struct drm_device *drm)
 *	{
 *		struct driver_device *priv = container_of(...);
 *
 *		drm_mode_config_cleanup(drm);
 *		drm_dev_fini(drm);
 *		kfree(priv->userspace_facing);
 *		kfree(priv);
 *	}
 *
 *	static struct drm_driver driver_drm_driver = {
 *		[...]
 *		.release = driver_drm_release,
 *	};
 *
 *	static int driver_probe(struct platform_device *pdev)
 *	{
 *		struct driver_device *priv;
 *		struct drm_device *drm;
 *		int ret;
 *
 *		[
 *		  devm_kzalloc() can't be used here because the drm_device
 *		  lifetime can exceed the device lifetime if driver unbind
 *		  happens when userspace still has open file descriptors.
 *		]
 *		priv = kzalloc(sizeof(*priv), GFP_KERNEL);
 *		if (!priv)
 *			return -ENOMEM;
 *
 *		drm = &priv->drm;
 *
 *		ret = devm_drm_dev_init(&pdev->dev, drm, &driver_drm_driver);
 *		if (ret) {
 *			kfree(drm);
 *			return ret;
 *		}
 *
 *		drm_mode_config_init(drm);
 *
 *		priv->userspace_facing = kzalloc(..., GFP_KERNEL);
 *		if (!priv->userspace_facing)
 *			return -ENOMEM;
 *
 *		priv->pclk = devm_clk_get(dev, "PCLK");
 *		if (IS_ERR(priv->pclk))
 *			return PTR_ERR(priv->pclk);
 *
 *		[ Further setup, display pipeline etc ]
 *
 *		platform_set_drvdata(pdev, drm);
 *
 *		drm_mode_config_reset(drm);
 *
 *		ret = drm_dev_register(drm);
 *		if (ret)
 *			return ret;
 *
 *		drm_fbdev_generic_setup(drm, 32);
 *
 *		return 0;
 *	}
 *
 *	[ This function is called before the devm_ resources are released ]
 *	static int driver_remove(struct platform_device *pdev)
 *	{
 *		struct drm_device *drm = platform_get_drvdata(pdev);
 *
 *		drm_dev_unregister(drm);
 *		drm_atomic_helper_shutdown(drm)
 *
 *		return 0;
 *	}
 *
 *	[ This function is called on kernel restart and shutdown ]
 *	static void driver_shutdown(struct platform_device *pdev)
 *	{
 *		drm_atomic_helper_shutdown(platform_get_drvdata(pdev));
 *	}
 *
 *	static int __maybe_unused driver_pm_suspend(struct device *dev)
 *	{
 *		return drm_mode_config_helper_suspend(dev_get_drvdata(dev));
 *	}
 *
 *	static int __maybe_unused driver_pm_resume(struct device *dev)
 *	{
 *		drm_mode_config_helper_resume(dev_get_drvdata(dev));
 *
 *		return 0;
 *	}
 *
 *	static const struct dev_pm_ops driver_pm_ops = {
 *		SET_SYSTEM_SLEEP_PM_OPS(driver_pm_suspend, driver_pm_resume)
 *	};
 *
 *	static struct platform_driver driver_driver = {
 *		.driver = {
 *			[...]
 *			.pm = &driver_pm_ops,
 *		},
 *		.probe = driver_probe,
 *		.remove = driver_remove,
 *		.shutdown = driver_shutdown,
 *	};
 *	module_platform_driver(driver_driver);
 *
 * Drivers that want to support device unplugging (USB, DT overlay unload) should
 * use drm_dev_unplug() instead of drm_dev_unregister(). The driver must protect
 * regions that is accessing device resources to prevent use after they're
 * released. This is done using drm_dev_enter() and drm_dev_exit(). There is one
 * shortcoming however, drm_dev_unplug() marks the drm_device as unplugged before
 * drm_atomic_helper_shutdown() is called. This means that if the disable code
 * paths are protected, they will not run on regular driver module unload,
 * possibily leaving the hardware enabled.
424 425
 */

426
/**
427 428
 * drm_put_dev - Unregister and release a DRM device
 * @dev: DRM device
429
 *
430
 * Called at module unload time or when a PCI device is unplugged.
431
 *
432
 * Cleans up all DRM device, calling drm_lastclose().
433 434
 *
 * Note: Use of this function is deprecated. It will eventually go away
435
 * completely.  Please use drm_dev_unregister() and drm_dev_put() explicitly
436 437 438
 * 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.
439 440 441 442 443 444 445 446 447 448
 */
void drm_put_dev(struct drm_device *dev)
{
	DRM_DEBUG("\n");

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

449
	drm_dev_unregister(dev);
450
	drm_dev_put(dev);
451 452
}
EXPORT_SYMBOL(drm_put_dev);
453

454 455 456 457 458 459 460 461 462 463 464 465 466
/**
 * drm_dev_enter - Enter device critical section
 * @dev: DRM device
 * @idx: Pointer to index that will be passed to the matching drm_dev_exit()
 *
 * This function marks and protects the beginning of a section that should not
 * be entered after the device has been unplugged. The section end is marked
 * with drm_dev_exit(). Calls to this function can be nested.
 *
 * Returns:
 * True if it is OK to enter the section, false otherwise.
 */
bool drm_dev_enter(struct drm_device *dev, int *idx)
467
{
468 469 470 471 472 473 474 475
	*idx = srcu_read_lock(&drm_unplug_srcu);

	if (dev->unplugged) {
		srcu_read_unlock(&drm_unplug_srcu, *idx);
		return false;
	}

	return true;
476
}
477 478 479 480 481 482 483 484 485 486
EXPORT_SYMBOL(drm_dev_enter);

/**
 * drm_dev_exit - Exit device critical section
 * @idx: index returned from drm_dev_enter()
 *
 * This function marks the end of a section that should not be entered after
 * the device has been unplugged.
 */
void drm_dev_exit(int idx)
487
{
488
	srcu_read_unlock(&drm_unplug_srcu, idx);
489
}
490
EXPORT_SYMBOL(drm_dev_exit);
491 492 493 494 495 496

/**
 * drm_dev_unplug - unplug a DRM device
 * @dev: DRM device
 *
 * This unplugs a hotpluggable DRM device, which makes it inaccessible to
497 498
 * userspace operations. Entry-points can use drm_dev_enter() and
 * drm_dev_exit() to protect device resources in a race free manner. This
499 500 501 502
 * 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)
503
{
504 505 506 507 508 509 510 511
	/*
	 * After synchronizing any critical read section is guaranteed to see
	 * the new value of ->unplugged, and any critical section which might
	 * still have seen the old value of ->unplugged is guaranteed to have
	 * finished.
	 */
	dev->unplugged = true;
	synchronize_srcu(&drm_unplug_srcu);
512 513

	drm_dev_unregister(dev);
514
}
515
EXPORT_SYMBOL(drm_dev_unplug);
D
David Herrmann 已提交
516

517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588
/*
 * 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);
	}
}

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
/**
 * DOC: component helper usage recommendations
 *
 * DRM drivers that drive hardware where a logical device consists of a pile of
 * independent hardware blocks are recommended to use the :ref:`component helper
 * library<component>`. For consistency and better options for code reuse the
 * following guidelines apply:
 *
 *  - The entire device initialization procedure should be run from the
 *    &component_master_ops.master_bind callback, starting with drm_dev_init(),
 *    then binding all components with component_bind_all() and finishing with
 *    drm_dev_register().
 *
 *  - The opaque pointer passed to all components through component_bind_all()
 *    should point at &struct drm_device of the device instance, not some driver
 *    specific private structure.
 *
 *  - The component helper fills the niche where further standardization of
 *    interfaces is not practical. When there already is, or will be, a
 *    standardized interface like &drm_bridge or &drm_panel, providing its own
 *    functions to find such components at driver load time, like
 *    drm_of_find_panel_or_bridge(), then the component helper should not be
 *    used.
 */

D
David Herrmann 已提交
614
/**
615 616 617
 * drm_dev_init - Initialise new DRM device
 * @dev: DRM device
 * @driver: DRM driver
D
David Herrmann 已提交
618 619
 * @parent: Parent device object
 *
620
 * Initialize a new DRM device. No device registration is done.
621
 * Call drm_dev_register() to advertice the device to user space and register it
622 623 624
 * 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 已提交
625
 *
626 627
 * 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 已提交
628
 *
629 630 631
 * It is recommended that drivers embed &struct drm_device into their own device
 * structure.
 *
632
 * Drivers that do not want to allocate their own device struct
633 634
 * 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
635 636
 * structure, and the overall structure must be allocated using kmalloc(): The
 * drm core's release function unconditionally calls kfree() on the @dev pointer
637 638 639 640
 * 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.
641
 *
D
David Herrmann 已提交
642
 * RETURNS:
643
 * 0 on success, or error code on failure.
D
David Herrmann 已提交
644
 */
645 646 647
int drm_dev_init(struct drm_device *dev,
		 struct drm_driver *driver,
		 struct device *parent)
D
David Herrmann 已提交
648 649 650
{
	int ret;

651 652 653 654 655
	if (!drm_core_init_complete) {
		DRM_ERROR("DRM core is not initialized\n");
		return -ENODEV;
	}

656 657
	BUG_ON(!parent);

D
David Herrmann 已提交
658
	kref_init(&dev->ref);
659
	dev->dev = get_device(parent);
D
David Herrmann 已提交
660 661
	dev->driver = driver;

662 663 664
	/* no per-device feature limits by default */
	dev->driver_features = ~0u;

665
	drm_legacy_init_members(dev);
D
David Herrmann 已提交
666
	INIT_LIST_HEAD(&dev->filelist);
667 668
	INIT_LIST_HEAD(&dev->filelist_internal);
	INIT_LIST_HEAD(&dev->clientlist);
D
David Herrmann 已提交
669 670 671 672
	INIT_LIST_HEAD(&dev->vblank_event_list);

	spin_lock_init(&dev->event_lock);
	mutex_init(&dev->struct_mutex);
673
	mutex_init(&dev->filelist_mutex);
674
	mutex_init(&dev->clientlist_mutex);
675
	mutex_init(&dev->master_mutex);
D
David Herrmann 已提交
676

677 678 679 680
	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 已提交
681
		goto err_free;
682 683
	}

684
	if (drm_core_check_feature(dev, DRIVER_RENDER)) {
D
David Herrmann 已提交
685 686 687 688 689
		ret = drm_minor_alloc(dev, DRM_MINOR_RENDER);
		if (ret)
			goto err_minors;
	}

690
	ret = drm_minor_alloc(dev, DRM_MINOR_PRIMARY);
D
David Herrmann 已提交
691 692 693
	if (ret)
		goto err_minors;

694
	ret = drm_legacy_create_map_hash(dev);
695
	if (ret)
D
David Herrmann 已提交
696
		goto err_minors;
D
David Herrmann 已提交
697

698
	drm_legacy_ctxbitmap_init(dev);
D
David Herrmann 已提交
699

700
	if (drm_core_check_feature(dev, DRIVER_GEM)) {
D
David Herrmann 已提交
701 702 703 704 705 706 707
		ret = drm_gem_init(dev);
		if (ret) {
			DRM_ERROR("Cannot initialize graphics execution manager (GEM)\n");
			goto err_ctxbitmap;
		}
	}

708
	ret = drm_dev_set_unique(dev, dev_name(parent));
709 710
	if (ret)
		goto err_setunique;
711

712
	return 0;
D
David Herrmann 已提交
713

714 715 716
err_setunique:
	if (drm_core_check_feature(dev, DRIVER_GEM))
		drm_gem_destroy(dev);
D
David Herrmann 已提交
717
err_ctxbitmap:
718
	drm_legacy_ctxbitmap_cleanup(dev);
719
	drm_legacy_remove_map_hash(dev);
D
David Herrmann 已提交
720
err_minors:
721
	drm_minor_free(dev, DRM_MINOR_PRIMARY);
722
	drm_minor_free(dev, DRM_MINOR_RENDER);
723
	drm_fs_inode_free(dev->anon_inode);
D
David Herrmann 已提交
724
err_free:
725
	put_device(dev->dev);
726
	mutex_destroy(&dev->master_mutex);
727
	mutex_destroy(&dev->clientlist_mutex);
728 729
	mutex_destroy(&dev->filelist_mutex);
	mutex_destroy(&dev->struct_mutex);
730
	drm_legacy_destroy_members(dev);
731 732 733 734
	return ret;
}
EXPORT_SYMBOL(drm_dev_init);

N
Noralf Trønnes 已提交
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
static void devm_drm_dev_init_release(void *data)
{
	drm_dev_put(data);
}

/**
 * devm_drm_dev_init - Resource managed drm_dev_init()
 * @parent: Parent device object
 * @dev: DRM device
 * @driver: DRM driver
 *
 * Managed drm_dev_init(). The DRM device initialized with this function is
 * automatically put on driver detach using drm_dev_put(). You must supply a
 * &drm_driver.release callback to control the finalization explicitly.
 *
 * RETURNS:
 * 0 on success, or error code on failure.
 */
int devm_drm_dev_init(struct device *parent,
		      struct drm_device *dev,
		      struct drm_driver *driver)
{
	int ret;

	if (WARN_ON(!parent || !driver->release))
		return -EINVAL;

	ret = drm_dev_init(dev, driver, parent);
	if (ret)
		return ret;

	ret = devm_add_action(parent, devm_drm_dev_init_release, dev);
	if (ret)
		devm_drm_dev_init_release(dev);

	return ret;
}
EXPORT_SYMBOL(devm_drm_dev_init);

774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793
/**
 * 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);
794
	drm_legacy_remove_map_hash(dev);
795 796 797 798 799
	drm_fs_inode_free(dev->anon_inode);

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

800 801
	put_device(dev->dev);

802
	mutex_destroy(&dev->master_mutex);
803
	mutex_destroy(&dev->clientlist_mutex);
804 805
	mutex_destroy(&dev->filelist_mutex);
	mutex_destroy(&dev->struct_mutex);
806
	drm_legacy_destroy_members(dev);
807 808 809 810
	kfree(dev->unique);
}
EXPORT_SYMBOL(drm_dev_fini);

811 812 813 814 815 816 817 818 819 820 821
/**
 * 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.
 *
822 823
 * The initial ref-count of the object is 1. Use drm_dev_get() and
 * drm_dev_put() to take and drop further ref-counts.
824 825 826
 *
 * Note that for purely virtual devices @parent can be NULL.
 *
827
 * Drivers that wish to subclass or embed &struct drm_device into their
828 829 830
 * own struct should look at using drm_dev_init() instead.
 *
 * RETURNS:
831
 * Pointer to new DRM device, or ERR_PTR on failure.
832 833 834 835 836 837 838 839 840
 */
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)
841
		return ERR_PTR(-ENOMEM);
842 843 844 845

	ret = drm_dev_init(dev, driver, parent);
	if (ret) {
		kfree(dev);
846
		return ERR_PTR(ret);
847 848 849
	}

	return dev;
D
David Herrmann 已提交
850 851
}
EXPORT_SYMBOL(drm_dev_alloc);
852

D
David Herrmann 已提交
853
static void drm_dev_release(struct kref *ref)
854
{
D
David Herrmann 已提交
855
	struct drm_device *dev = container_of(ref, struct drm_device, ref);
856

857 858 859 860 861 862
	if (dev->driver->release) {
		dev->driver->release(dev);
	} else {
		drm_dev_fini(dev);
		kfree(dev);
	}
863
}
D
David Herrmann 已提交
864 865

/**
866
 * drm_dev_get - Take reference of a DRM device
D
David Herrmann 已提交
867 868 869
 * @dev: device to take reference of or NULL
 *
 * This increases the ref-count of @dev by one. You *must* already own a
870
 * reference when calling this. Use drm_dev_put() to drop this reference
D
David Herrmann 已提交
871 872 873 874 875 876
 * 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.
 */
877
void drm_dev_get(struct drm_device *dev)
D
David Herrmann 已提交
878 879 880 881
{
	if (dev)
		kref_get(&dev->ref);
}
882
EXPORT_SYMBOL(drm_dev_get);
D
David Herrmann 已提交
883 884

/**
885
 * drm_dev_put - Drop reference of a DRM device
D
David Herrmann 已提交
886 887 888 889 890
 * @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.
 */
891
void drm_dev_put(struct drm_device *dev)
D
David Herrmann 已提交
892 893 894 895
{
	if (dev)
		kref_put(&dev->ref, drm_dev_release);
}
896 897
EXPORT_SYMBOL(drm_dev_put);

898 899 900 901 902 903 904 905 906 907 908 909 910 911 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
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;

945
	name = kasprintf(GFP_KERNEL, "controlD%d", minor->index + 64);
946 947 948 949 950 951 952 953
	if (!name)
		return;

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

	kfree(name);
}

954 955 956
/**
 * drm_dev_register - Register DRM device
 * @dev: Device to register
957
 * @flags: Flags passed to the driver's .load() function
958 959
 *
 * Register the DRM device @dev with the system, advertise device to user-space
960
 * and start normal device operation. @dev must be initialized via drm_dev_init()
961
 * previously.
962 963 964
 *
 * Never call this twice on any device!
 *
965
 * NOTE: To ensure backward compatibility with existing drivers method this
966 967 968
 * 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
969 970
 * drm_dev_register().
 *
971 972 973 974 975
 * RETURNS:
 * 0 on success, negative error code on failure.
 */
int drm_dev_register(struct drm_device *dev, unsigned long flags)
{
976
	struct drm_driver *driver = dev->driver;
977 978 979 980
	int ret;

	mutex_lock(&drm_global_mutex);

981
	ret = drm_minor_register(dev, DRM_MINOR_RENDER);
D
David Herrmann 已提交
982 983
	if (ret)
		goto err_minors;
984

985
	ret = drm_minor_register(dev, DRM_MINOR_PRIMARY);
986
	if (ret)
D
David Herrmann 已提交
987
		goto err_minors;
988

989 990 991 992
	ret = create_compat_control_link(dev);
	if (ret)
		goto err_minors;

993 994 995
	if (dev->driver->load) {
		ret = dev->driver->load(dev, flags);
		if (ret)
D
David Herrmann 已提交
996
			goto err_minors;
997 998
	}

999 1000
	dev->registered = true;

1001
	if (drm_core_check_feature(dev, DRIVER_MODESET))
1002
		drm_modeset_register_all(dev);
1003

1004
	ret = 0;
1005 1006 1007

	DRM_INFO("Initialized %s %d.%d.%d %s for %s on minor %d\n",
		 driver->name, driver->major, driver->minor,
1008 1009
		 driver->patchlevel, driver->date,
		 dev->dev ? dev_name(dev->dev) : "virtual device",
1010 1011
		 dev->primary->index);

1012 1013
	goto out_unlock;

D
David Herrmann 已提交
1014
err_minors:
1015
	remove_compat_control_link(dev);
1016
	drm_minor_unregister(dev, DRM_MINOR_PRIMARY);
1017
	drm_minor_unregister(dev, DRM_MINOR_RENDER);
1018 1019 1020 1021 1022
out_unlock:
	mutex_unlock(&drm_global_mutex);
	return ret;
}
EXPORT_SYMBOL(drm_dev_register);
1023 1024 1025 1026 1027 1028 1029

/**
 * 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
1030
 * drm_dev_put() to drop their final reference.
1031
 *
1032 1033 1034
 * A special form of unregistering for hotpluggable devices is drm_dev_unplug(),
 * which can be called while there are still open users of @dev.
 *
1035 1036
 * This should be called first in the device teardown code to make sure
 * userspace can't access the device instance any more.
1037 1038 1039
 */
void drm_dev_unregister(struct drm_device *dev)
{
1040 1041
	if (drm_core_check_feature(dev, DRIVER_LEGACY))
		drm_lastclose(dev);
1042

1043 1044
	dev->registered = false;

1045 1046
	drm_client_dev_unregister(dev);

1047
	if (drm_core_check_feature(dev, DRIVER_MODESET))
1048
		drm_modeset_unregister_all(dev);
1049

1050 1051 1052
	if (dev->driver->unload)
		dev->driver->unload(dev);

1053 1054
	if (dev->agp)
		drm_pci_agp_destroy(dev);
1055

1056
	drm_legacy_rmmaps(dev);
1057

1058
	remove_compat_control_link(dev);
1059
	drm_minor_unregister(dev, DRM_MINOR_PRIMARY);
1060
	drm_minor_unregister(dev, DRM_MINOR_RENDER);
1061 1062
}
EXPORT_SYMBOL(drm_dev_unregister);
1063

G
Gerd Hoffmann 已提交
1064 1065 1066 1067 1068
/**
 * drm_dev_set_unique - Set the unique name of a DRM device
 * @dev: device of which to set the unique name
 * @name: unique name
 *
1069 1070 1071
 * Sets the unique name of a DRM device using the specified string. This is
 * already done by drm_dev_init(), drivers should only override the default
 * unique name for backwards compatibility reasons.
G
Gerd Hoffmann 已提交
1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083
 *
 * 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);

1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143
/*
 * 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,
};

1144 1145 1146 1147 1148 1149 1150 1151 1152
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();
}

1153 1154
static int __init drm_core_init(void)
{
1155
	int ret;
1156 1157 1158 1159

	drm_connector_ida_init();
	idr_init(&drm_minors_idr);

1160 1161
	ret = drm_sysfs_init();
	if (ret < 0) {
1162 1163
		DRM_ERROR("Cannot create DRM class: %d\n", ret);
		goto error;
1164 1165 1166 1167
	}

	drm_debugfs_root = debugfs_create_dir("dri", NULL);

1168 1169 1170 1171
	ret = register_chrdev(DRM_MAJOR, "drm", &drm_stub_fops);
	if (ret < 0)
		goto error;

1172 1173
	drm_core_init_complete = true;

1174
	DRM_DEBUG("Initialized\n");
1175 1176
	return 0;

1177 1178
error:
	drm_core_exit();
1179 1180 1181 1182 1183
	return ret;
}

module_init(drm_core_init);
module_exit(drm_core_exit);