aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_drv.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/drm_drv.c')
-rw-r--r--drivers/gpu/drm/drm_drv.c49
1 files changed, 24 insertions, 25 deletions
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index 32a83b41ab61..ea4941da9b27 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -34,6 +34,7 @@
34#include <linux/slab.h> 34#include <linux/slab.h>
35#include <linux/srcu.h> 35#include <linux/srcu.h>
36 36
37#include <drm/drm_client.h>
37#include <drm/drm_drv.h> 38#include <drm/drm_drv.h>
38#include <drm/drmP.h> 39#include <drm/drmP.h>
39 40
@@ -53,13 +54,14 @@ MODULE_AUTHOR("Gareth Hughes, Leif Delgass, José Fonseca, Jon Smirl");
53MODULE_DESCRIPTION("DRM shared core routines"); 54MODULE_DESCRIPTION("DRM shared core routines");
54MODULE_LICENSE("GPL and additional rights"); 55MODULE_LICENSE("GPL and additional rights");
55MODULE_PARM_DESC(debug, "Enable debug output, where each bit enables a debug category.\n" 56MODULE_PARM_DESC(debug, "Enable debug output, where each bit enables a debug category.\n"
56"\t\tBit 0 (0x01) will enable CORE messages (drm core code)\n" 57"\t\tBit 0 (0x01) will enable CORE messages (drm core code)\n"
57"\t\tBit 1 (0x02) will enable DRIVER messages (drm controller code)\n" 58"\t\tBit 1 (0x02) will enable DRIVER messages (drm controller code)\n"
58"\t\tBit 2 (0x04) will enable KMS messages (modesetting code)\n" 59"\t\tBit 2 (0x04) will enable KMS messages (modesetting code)\n"
59"\t\tBit 3 (0x08) will enable PRIME messages (prime code)\n" 60"\t\tBit 3 (0x08) will enable PRIME messages (prime code)\n"
60"\t\tBit 4 (0x10) will enable ATOMIC messages (atomic code)\n" 61"\t\tBit 4 (0x10) will enable ATOMIC messages (atomic code)\n"
61"\t\tBit 5 (0x20) will enable VBL messages (vblank code)\n" 62"\t\tBit 5 (0x20) will enable VBL messages (vblank code)\n"
62"\t\tBit 7 (0x80) will enable LEASE messages (leasing code)"); 63"\t\tBit 7 (0x80) will enable LEASE messages (leasing code)\n"
64"\t\tBit 8 (0x100) will enable DP messages (displayport code)");
63module_param_named(debug, drm_debug, int, 0600); 65module_param_named(debug, drm_debug, int, 0600);
64 66
65static DEFINE_SPINLOCK(drm_minor_lock); 67static DEFINE_SPINLOCK(drm_minor_lock);
@@ -99,8 +101,6 @@ static struct drm_minor **drm_minor_get_slot(struct drm_device *dev,
99 return &dev->primary; 101 return &dev->primary;
100 case DRM_MINOR_RENDER: 102 case DRM_MINOR_RENDER:
101 return &dev->render; 103 return &dev->render;
102 case DRM_MINOR_CONTROL:
103 return &dev->control;
104 default: 104 default:
105 BUG(); 105 BUG();
106 } 106 }
@@ -371,13 +371,6 @@ EXPORT_SYMBOL(drm_dev_exit);
371 */ 371 */
372void drm_dev_unplug(struct drm_device *dev) 372void drm_dev_unplug(struct drm_device *dev)
373{ 373{
374 drm_dev_unregister(dev);
375
376 mutex_lock(&drm_global_mutex);
377 if (dev->open_count == 0)
378 drm_dev_put(dev);
379 mutex_unlock(&drm_global_mutex);
380
381 /* 374 /*
382 * After synchronizing any critical read section is guaranteed to see 375 * After synchronizing any critical read section is guaranteed to see
383 * the new value of ->unplugged, and any critical section which might 376 * the new value of ->unplugged, and any critical section which might
@@ -386,6 +379,13 @@ void drm_dev_unplug(struct drm_device *dev)
386 */ 379 */
387 dev->unplugged = true; 380 dev->unplugged = true;
388 synchronize_srcu(&drm_unplug_srcu); 381 synchronize_srcu(&drm_unplug_srcu);
382
383 drm_dev_unregister(dev);
384
385 mutex_lock(&drm_global_mutex);
386 if (dev->open_count == 0)
387 drm_dev_put(dev);
388 mutex_unlock(&drm_global_mutex);
389} 389}
390EXPORT_SYMBOL(drm_dev_unplug); 390EXPORT_SYMBOL(drm_dev_unplug);
391 391
@@ -507,6 +507,8 @@ int drm_dev_init(struct drm_device *dev,
507 dev->driver = driver; 507 dev->driver = driver;
508 508
509 INIT_LIST_HEAD(&dev->filelist); 509 INIT_LIST_HEAD(&dev->filelist);
510 INIT_LIST_HEAD(&dev->filelist_internal);
511 INIT_LIST_HEAD(&dev->clientlist);
510 INIT_LIST_HEAD(&dev->ctxlist); 512 INIT_LIST_HEAD(&dev->ctxlist);
511 INIT_LIST_HEAD(&dev->vmalist); 513 INIT_LIST_HEAD(&dev->vmalist);
512 INIT_LIST_HEAD(&dev->maplist); 514 INIT_LIST_HEAD(&dev->maplist);
@@ -516,6 +518,7 @@ int drm_dev_init(struct drm_device *dev,
516 spin_lock_init(&dev->event_lock); 518 spin_lock_init(&dev->event_lock);
517 mutex_init(&dev->struct_mutex); 519 mutex_init(&dev->struct_mutex);
518 mutex_init(&dev->filelist_mutex); 520 mutex_init(&dev->filelist_mutex);
521 mutex_init(&dev->clientlist_mutex);
519 mutex_init(&dev->ctxlist_mutex); 522 mutex_init(&dev->ctxlist_mutex);
520 mutex_init(&dev->master_mutex); 523 mutex_init(&dev->master_mutex);
521 524
@@ -567,11 +570,11 @@ err_ctxbitmap:
567err_minors: 570err_minors:
568 drm_minor_free(dev, DRM_MINOR_PRIMARY); 571 drm_minor_free(dev, DRM_MINOR_PRIMARY);
569 drm_minor_free(dev, DRM_MINOR_RENDER); 572 drm_minor_free(dev, DRM_MINOR_RENDER);
570 drm_minor_free(dev, DRM_MINOR_CONTROL);
571 drm_fs_inode_free(dev->anon_inode); 573 drm_fs_inode_free(dev->anon_inode);
572err_free: 574err_free:
573 mutex_destroy(&dev->master_mutex); 575 mutex_destroy(&dev->master_mutex);
574 mutex_destroy(&dev->ctxlist_mutex); 576 mutex_destroy(&dev->ctxlist_mutex);
577 mutex_destroy(&dev->clientlist_mutex);
575 mutex_destroy(&dev->filelist_mutex); 578 mutex_destroy(&dev->filelist_mutex);
576 mutex_destroy(&dev->struct_mutex); 579 mutex_destroy(&dev->struct_mutex);
577 return ret; 580 return ret;
@@ -603,10 +606,10 @@ void drm_dev_fini(struct drm_device *dev)
603 606
604 drm_minor_free(dev, DRM_MINOR_PRIMARY); 607 drm_minor_free(dev, DRM_MINOR_PRIMARY);
605 drm_minor_free(dev, DRM_MINOR_RENDER); 608 drm_minor_free(dev, DRM_MINOR_RENDER);
606 drm_minor_free(dev, DRM_MINOR_CONTROL);
607 609
608 mutex_destroy(&dev->master_mutex); 610 mutex_destroy(&dev->master_mutex);
609 mutex_destroy(&dev->ctxlist_mutex); 611 mutex_destroy(&dev->ctxlist_mutex);
612 mutex_destroy(&dev->clientlist_mutex);
610 mutex_destroy(&dev->filelist_mutex); 613 mutex_destroy(&dev->filelist_mutex);
611 mutex_destroy(&dev->struct_mutex); 614 mutex_destroy(&dev->struct_mutex);
612 kfree(dev->unique); 615 kfree(dev->unique);
@@ -760,7 +763,7 @@ static void remove_compat_control_link(struct drm_device *dev)
760 if (!minor) 763 if (!minor)
761 return; 764 return;
762 765
763 name = kasprintf(GFP_KERNEL, "controlD%d", minor->index); 766 name = kasprintf(GFP_KERNEL, "controlD%d", minor->index + 64);
764 if (!name) 767 if (!name)
765 return; 768 return;
766 769
@@ -796,10 +799,6 @@ int drm_dev_register(struct drm_device *dev, unsigned long flags)
796 799
797 mutex_lock(&drm_global_mutex); 800 mutex_lock(&drm_global_mutex);
798 801
799 ret = drm_minor_register(dev, DRM_MINOR_CONTROL);
800 if (ret)
801 goto err_minors;
802
803 ret = drm_minor_register(dev, DRM_MINOR_RENDER); 802 ret = drm_minor_register(dev, DRM_MINOR_RENDER);
804 if (ret) 803 if (ret)
805 goto err_minors; 804 goto err_minors;
@@ -837,7 +836,6 @@ err_minors:
837 remove_compat_control_link(dev); 836 remove_compat_control_link(dev);
838 drm_minor_unregister(dev, DRM_MINOR_PRIMARY); 837 drm_minor_unregister(dev, DRM_MINOR_PRIMARY);
839 drm_minor_unregister(dev, DRM_MINOR_RENDER); 838 drm_minor_unregister(dev, DRM_MINOR_RENDER);
840 drm_minor_unregister(dev, DRM_MINOR_CONTROL);
841out_unlock: 839out_unlock:
842 mutex_unlock(&drm_global_mutex); 840 mutex_unlock(&drm_global_mutex);
843 return ret; 841 return ret;
@@ -867,6 +865,8 @@ void drm_dev_unregister(struct drm_device *dev)
867 865
868 dev->registered = false; 866 dev->registered = false;
869 867
868 drm_client_dev_unregister(dev);
869
870 if (drm_core_check_feature(dev, DRIVER_MODESET)) 870 if (drm_core_check_feature(dev, DRIVER_MODESET))
871 drm_modeset_unregister_all(dev); 871 drm_modeset_unregister_all(dev);
872 872
@@ -882,7 +882,6 @@ void drm_dev_unregister(struct drm_device *dev)
882 remove_compat_control_link(dev); 882 remove_compat_control_link(dev);
883 drm_minor_unregister(dev, DRM_MINOR_PRIMARY); 883 drm_minor_unregister(dev, DRM_MINOR_PRIMARY);
884 drm_minor_unregister(dev, DRM_MINOR_RENDER); 884 drm_minor_unregister(dev, DRM_MINOR_RENDER);
885 drm_minor_unregister(dev, DRM_MINOR_CONTROL);
886} 885}
887EXPORT_SYMBOL(drm_dev_unregister); 886EXPORT_SYMBOL(drm_dev_unregister);
888 887