diff options
Diffstat (limited to 'drivers/gpu/drm/drm_drv.c')
-rw-r--r-- | drivers/gpu/drm/drm_drv.c | 49 |
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"); | |||
53 | MODULE_DESCRIPTION("DRM shared core routines"); | 54 | MODULE_DESCRIPTION("DRM shared core routines"); |
54 | MODULE_LICENSE("GPL and additional rights"); | 55 | MODULE_LICENSE("GPL and additional rights"); |
55 | MODULE_PARM_DESC(debug, "Enable debug output, where each bit enables a debug category.\n" | 56 | MODULE_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)"); | ||
63 | module_param_named(debug, drm_debug, int, 0600); | 65 | module_param_named(debug, drm_debug, int, 0600); |
64 | 66 | ||
65 | static DEFINE_SPINLOCK(drm_minor_lock); | 67 | static 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 | */ |
372 | void drm_dev_unplug(struct drm_device *dev) | 372 | void 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 | } |
390 | EXPORT_SYMBOL(drm_dev_unplug); | 390 | EXPORT_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: | |||
567 | err_minors: | 570 | err_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); |
572 | err_free: | 574 | err_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); | ||
841 | out_unlock: | 839 | out_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 | } |
887 | EXPORT_SYMBOL(drm_dev_unregister); | 886 | EXPORT_SYMBOL(drm_dev_unregister); |
888 | 887 | ||