1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29#include <linux/debugfs.h>
30#include <linux/fs.h>
31#include <linux/module.h>
32#include <linux/moduleparam.h>
33#include <linux/mount.h>
34#include <linux/slab.h>
35#include <linux/srcu.h>
36
37#include <drm/drm_client.h>
38#include <drm/drm_drv.h>
39#include <drm/drmP.h>
40
41#include "drm_crtc_internal.h"
42#include "drm_legacy.h"
43#include "drm_internal.h"
44#include "drm_crtc_internal.h"
45
46
47
48
49
50unsigned int drm_debug = 0;
51EXPORT_SYMBOL(drm_debug);
52
53MODULE_AUTHOR("Gareth Hughes, Leif Delgass, José Fonseca, Jon Smirl");
54MODULE_DESCRIPTION("DRM shared core routines");
55MODULE_LICENSE("GPL and additional rights");
56MODULE_PARM_DESC(debug, "Enable debug output, where each bit enables a debug category.\n"
57"\t\tBit 0 (0x01) will enable CORE messages (drm core code)\n"
58"\t\tBit 1 (0x02) will enable DRIVER messages (drm controller code)\n"
59"\t\tBit 2 (0x04) will enable KMS messages (modesetting code)\n"
60"\t\tBit 3 (0x08) will enable PRIME messages (prime code)\n"
61"\t\tBit 4 (0x10) will enable ATOMIC messages (atomic code)\n"
62"\t\tBit 5 (0x20) will enable VBL messages (vblank code)\n"
63"\t\tBit 7 (0x80) will enable LEASE messages (leasing code)\n"
64"\t\tBit 8 (0x100) will enable DP messages (displayport code)");
65module_param_named(debug, drm_debug, int, 0600);
66
67static DEFINE_SPINLOCK(drm_minor_lock);
68static struct idr drm_minors_idr;
69
70
71
72
73
74
75
76
77static bool drm_core_init_complete = false;
78
79static struct dentry *drm_debugfs_root;
80
81DEFINE_STATIC_SRCU(drm_unplug_srcu);
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96static struct drm_minor **drm_minor_get_slot(struct drm_device *dev,
97 unsigned int type)
98{
99 switch (type) {
100 case DRM_MINOR_PRIMARY:
101 return &dev->primary;
102 case DRM_MINOR_RENDER:
103 return &dev->render;
104 default:
105 BUG();
106 }
107}
108
109static int drm_minor_alloc(struct drm_device *dev, unsigned int type)
110{
111 struct drm_minor *minor;
112 unsigned long flags;
113 int r;
114
115 minor = kzalloc(sizeof(*minor), GFP_KERNEL);
116 if (!minor)
117 return -ENOMEM;
118
119 minor->type = type;
120 minor->dev = dev;
121
122 idr_preload(GFP_KERNEL);
123 spin_lock_irqsave(&drm_minor_lock, flags);
124 r = idr_alloc(&drm_minors_idr,
125 NULL,
126 64 * type,
127 64 * (type + 1),
128 GFP_NOWAIT);
129 spin_unlock_irqrestore(&drm_minor_lock, flags);
130 idr_preload_end();
131
132 if (r < 0)
133 goto err_free;
134
135 minor->index = r;
136
137 minor->kdev = drm_sysfs_minor_alloc(minor);
138 if (IS_ERR(minor->kdev)) {
139 r = PTR_ERR(minor->kdev);
140 goto err_index;
141 }
142
143 *drm_minor_get_slot(dev, type) = minor;
144 return 0;
145
146err_index:
147 spin_lock_irqsave(&drm_minor_lock, flags);
148 idr_remove(&drm_minors_idr, minor->index);
149 spin_unlock_irqrestore(&drm_minor_lock, flags);
150err_free:
151 kfree(minor);
152 return r;
153}
154
155static void drm_minor_free(struct drm_device *dev, unsigned int type)
156{
157 struct drm_minor **slot, *minor;
158 unsigned long flags;
159
160 slot = drm_minor_get_slot(dev, type);
161 minor = *slot;
162 if (!minor)
163 return;
164
165 put_device(minor->kdev);
166
167 spin_lock_irqsave(&drm_minor_lock, flags);
168 idr_remove(&drm_minors_idr, minor->index);
169 spin_unlock_irqrestore(&drm_minor_lock, flags);
170
171 kfree(minor);
172 *slot = NULL;
173}
174
175static int drm_minor_register(struct drm_device *dev, unsigned int type)
176{
177 struct drm_minor *minor;
178 unsigned long flags;
179 int ret;
180
181 DRM_DEBUG("\n");
182
183 minor = *drm_minor_get_slot(dev, type);
184 if (!minor)
185 return 0;
186
187 ret = drm_debugfs_init(minor, minor->index, drm_debugfs_root);
188 if (ret) {
189 DRM_ERROR("DRM: Failed to initialize /sys/kernel/debug/dri.\n");
190 goto err_debugfs;
191 }
192
193 ret = device_add(minor->kdev);
194 if (ret)
195 goto err_debugfs;
196
197
198 spin_lock_irqsave(&drm_minor_lock, flags);
199 idr_replace(&drm_minors_idr, minor, minor->index);
200 spin_unlock_irqrestore(&drm_minor_lock, flags);
201
202 DRM_DEBUG("new minor registered %d\n", minor->index);
203 return 0;
204
205err_debugfs:
206 drm_debugfs_cleanup(minor);
207 return ret;
208}
209
210static void drm_minor_unregister(struct drm_device *dev, unsigned int type)
211{
212 struct drm_minor *minor;
213 unsigned long flags;
214
215 minor = *drm_minor_get_slot(dev, type);
216 if (!minor || !device_is_registered(minor->kdev))
217 return;
218
219
220 spin_lock_irqsave(&drm_minor_lock, flags);
221 idr_replace(&drm_minors_idr, NULL, minor->index);
222 spin_unlock_irqrestore(&drm_minor_lock, flags);
223
224 device_del(minor->kdev);
225 dev_set_drvdata(minor->kdev, NULL);
226 drm_debugfs_cleanup(minor);
227}
228
229
230
231
232
233
234
235
236
237
238struct drm_minor *drm_minor_acquire(unsigned int minor_id)
239{
240 struct drm_minor *minor;
241 unsigned long flags;
242
243 spin_lock_irqsave(&drm_minor_lock, flags);
244 minor = idr_find(&drm_minors_idr, minor_id);
245 if (minor)
246 drm_dev_get(minor->dev);
247 spin_unlock_irqrestore(&drm_minor_lock, flags);
248
249 if (!minor) {
250 return ERR_PTR(-ENODEV);
251 } else if (drm_dev_is_unplugged(minor->dev)) {
252 drm_dev_put(minor->dev);
253 return ERR_PTR(-ENODEV);
254 }
255
256 return minor;
257}
258
259void drm_minor_release(struct drm_minor *minor)
260{
261 drm_dev_put(minor->dev);
262}
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310void drm_put_dev(struct drm_device *dev)
311{
312 DRM_DEBUG("\n");
313
314 if (!dev) {
315 DRM_ERROR("cleanup called no dev\n");
316 return;
317 }
318
319 drm_dev_unregister(dev);
320 drm_dev_put(dev);
321}
322EXPORT_SYMBOL(drm_put_dev);
323
324
325
326
327
328
329
330
331
332
333
334
335
336bool drm_dev_enter(struct drm_device *dev, int *idx)
337{
338 *idx = srcu_read_lock(&drm_unplug_srcu);
339
340 if (dev->unplugged) {
341 srcu_read_unlock(&drm_unplug_srcu, *idx);
342 return false;
343 }
344
345 return true;
346}
347EXPORT_SYMBOL(drm_dev_enter);
348
349
350
351
352
353
354
355
356void drm_dev_exit(int idx)
357{
358 srcu_read_unlock(&drm_unplug_srcu, idx);
359}
360EXPORT_SYMBOL(drm_dev_exit);
361
362
363
364
365
366
367
368
369
370
371
372void drm_dev_unplug(struct drm_device *dev)
373{
374
375
376
377
378
379
380 dev->unplugged = true;
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}
390EXPORT_SYMBOL(drm_dev_unplug);
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410static int drm_fs_cnt;
411static struct vfsmount *drm_fs_mnt;
412
413static const struct dentry_operations drm_fs_dops = {
414 .d_dname = simple_dname,
415};
416
417static const struct super_operations drm_fs_sops = {
418 .statfs = simple_statfs,
419};
420
421static struct dentry *drm_fs_mount(struct file_system_type *fs_type, int flags,
422 const char *dev_name, void *data)
423{
424 return mount_pseudo(fs_type,
425 "drm:",
426 &drm_fs_sops,
427 &drm_fs_dops,
428 0x010203ff);
429}
430
431static struct file_system_type drm_fs_type = {
432 .name = "drm",
433 .owner = THIS_MODULE,
434 .mount = drm_fs_mount,
435 .kill_sb = kill_anon_super,
436};
437
438static struct inode *drm_fs_inode_new(void)
439{
440 struct inode *inode;
441 int r;
442
443 r = simple_pin_fs(&drm_fs_type, &drm_fs_mnt, &drm_fs_cnt);
444 if (r < 0) {
445 DRM_ERROR("Cannot mount pseudo fs: %d\n", r);
446 return ERR_PTR(r);
447 }
448
449 inode = alloc_anon_inode(drm_fs_mnt->mnt_sb);
450 if (IS_ERR(inode))
451 simple_release_fs(&drm_fs_mnt, &drm_fs_cnt);
452
453 return inode;
454}
455
456static void drm_fs_inode_free(struct inode *inode)
457{
458 if (inode) {
459 iput(inode);
460 simple_release_fs(&drm_fs_mnt, &drm_fs_cnt);
461 }
462}
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492int drm_dev_init(struct drm_device *dev,
493 struct drm_driver *driver,
494 struct device *parent)
495{
496 int ret;
497
498 if (!drm_core_init_complete) {
499 DRM_ERROR("DRM core is not initialized\n");
500 return -ENODEV;
501 }
502
503 BUG_ON(!parent);
504
505 kref_init(&dev->ref);
506 dev->dev = parent;
507 dev->driver = driver;
508
509
510 dev->driver_features = ~0u;
511
512 INIT_LIST_HEAD(&dev->filelist);
513 INIT_LIST_HEAD(&dev->filelist_internal);
514 INIT_LIST_HEAD(&dev->clientlist);
515 INIT_LIST_HEAD(&dev->ctxlist);
516 INIT_LIST_HEAD(&dev->vmalist);
517 INIT_LIST_HEAD(&dev->maplist);
518 INIT_LIST_HEAD(&dev->vblank_event_list);
519
520 spin_lock_init(&dev->buf_lock);
521 spin_lock_init(&dev->event_lock);
522 mutex_init(&dev->struct_mutex);
523 mutex_init(&dev->filelist_mutex);
524 mutex_init(&dev->clientlist_mutex);
525 mutex_init(&dev->ctxlist_mutex);
526 mutex_init(&dev->master_mutex);
527
528 dev->anon_inode = drm_fs_inode_new();
529 if (IS_ERR(dev->anon_inode)) {
530 ret = PTR_ERR(dev->anon_inode);
531 DRM_ERROR("Cannot allocate anonymous inode: %d\n", ret);
532 goto err_free;
533 }
534
535 if (drm_core_check_feature(dev, DRIVER_RENDER)) {
536 ret = drm_minor_alloc(dev, DRM_MINOR_RENDER);
537 if (ret)
538 goto err_minors;
539 }
540
541 ret = drm_minor_alloc(dev, DRM_MINOR_PRIMARY);
542 if (ret)
543 goto err_minors;
544
545 ret = drm_ht_create(&dev->map_hash, 12);
546 if (ret)
547 goto err_minors;
548
549 drm_legacy_ctxbitmap_init(dev);
550
551 if (drm_core_check_feature(dev, DRIVER_GEM)) {
552 ret = drm_gem_init(dev);
553 if (ret) {
554 DRM_ERROR("Cannot initialize graphics execution manager (GEM)\n");
555 goto err_ctxbitmap;
556 }
557 }
558
559 ret = drm_dev_set_unique(dev, dev_name(parent));
560 if (ret)
561 goto err_setunique;
562
563 return 0;
564
565err_setunique:
566 if (drm_core_check_feature(dev, DRIVER_GEM))
567 drm_gem_destroy(dev);
568err_ctxbitmap:
569 drm_legacy_ctxbitmap_cleanup(dev);
570 drm_ht_remove(&dev->map_hash);
571err_minors:
572 drm_minor_free(dev, DRM_MINOR_PRIMARY);
573 drm_minor_free(dev, DRM_MINOR_RENDER);
574 drm_fs_inode_free(dev->anon_inode);
575err_free:
576 mutex_destroy(&dev->master_mutex);
577 mutex_destroy(&dev->ctxlist_mutex);
578 mutex_destroy(&dev->clientlist_mutex);
579 mutex_destroy(&dev->filelist_mutex);
580 mutex_destroy(&dev->struct_mutex);
581 return ret;
582}
583EXPORT_SYMBOL(drm_dev_init);
584
585
586
587
588
589
590
591
592
593
594
595
596
597void drm_dev_fini(struct drm_device *dev)
598{
599 drm_vblank_cleanup(dev);
600
601 if (drm_core_check_feature(dev, DRIVER_GEM))
602 drm_gem_destroy(dev);
603
604 drm_legacy_ctxbitmap_cleanup(dev);
605 drm_ht_remove(&dev->map_hash);
606 drm_fs_inode_free(dev->anon_inode);
607
608 drm_minor_free(dev, DRM_MINOR_PRIMARY);
609 drm_minor_free(dev, DRM_MINOR_RENDER);
610
611 mutex_destroy(&dev->master_mutex);
612 mutex_destroy(&dev->ctxlist_mutex);
613 mutex_destroy(&dev->clientlist_mutex);
614 mutex_destroy(&dev->filelist_mutex);
615 mutex_destroy(&dev->struct_mutex);
616 kfree(dev->unique);
617}
618EXPORT_SYMBOL(drm_dev_fini);
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642struct drm_device *drm_dev_alloc(struct drm_driver *driver,
643 struct device *parent)
644{
645 struct drm_device *dev;
646 int ret;
647
648 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
649 if (!dev)
650 return ERR_PTR(-ENOMEM);
651
652 ret = drm_dev_init(dev, driver, parent);
653 if (ret) {
654 kfree(dev);
655 return ERR_PTR(ret);
656 }
657
658 return dev;
659}
660EXPORT_SYMBOL(drm_dev_alloc);
661
662static void drm_dev_release(struct kref *ref)
663{
664 struct drm_device *dev = container_of(ref, struct drm_device, ref);
665
666 if (dev->driver->release) {
667 dev->driver->release(dev);
668 } else {
669 drm_dev_fini(dev);
670 kfree(dev);
671 }
672}
673
674
675
676
677
678
679
680
681
682
683
684
685
686void drm_dev_get(struct drm_device *dev)
687{
688 if (dev)
689 kref_get(&dev->ref);
690}
691EXPORT_SYMBOL(drm_dev_get);
692
693
694
695
696
697
698
699
700void drm_dev_put(struct drm_device *dev)
701{
702 if (dev)
703 kref_put(&dev->ref, drm_dev_release);
704}
705EXPORT_SYMBOL(drm_dev_put);
706
707static int create_compat_control_link(struct drm_device *dev)
708{
709 struct drm_minor *minor;
710 char *name;
711 int ret;
712
713 if (!drm_core_check_feature(dev, DRIVER_MODESET))
714 return 0;
715
716 minor = *drm_minor_get_slot(dev, DRM_MINOR_PRIMARY);
717 if (!minor)
718 return 0;
719
720
721
722
723
724
725
726
727
728
729 name = kasprintf(GFP_KERNEL, "controlD%d", minor->index + 64);
730 if (!name)
731 return -ENOMEM;
732
733 ret = sysfs_create_link(minor->kdev->kobj.parent,
734 &minor->kdev->kobj,
735 name);
736
737 kfree(name);
738
739 return ret;
740}
741
742static void remove_compat_control_link(struct drm_device *dev)
743{
744 struct drm_minor *minor;
745 char *name;
746
747 if (!drm_core_check_feature(dev, DRIVER_MODESET))
748 return;
749
750 minor = *drm_minor_get_slot(dev, DRM_MINOR_PRIMARY);
751 if (!minor)
752 return;
753
754 name = kasprintf(GFP_KERNEL, "controlD%d", minor->index + 64);
755 if (!name)
756 return;
757
758 sysfs_remove_link(minor->kdev->kobj.parent, name);
759
760 kfree(name);
761}
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783int drm_dev_register(struct drm_device *dev, unsigned long flags)
784{
785 struct drm_driver *driver = dev->driver;
786 int ret;
787
788 mutex_lock(&drm_global_mutex);
789
790 ret = drm_minor_register(dev, DRM_MINOR_RENDER);
791 if (ret)
792 goto err_minors;
793
794 ret = drm_minor_register(dev, DRM_MINOR_PRIMARY);
795 if (ret)
796 goto err_minors;
797
798 ret = create_compat_control_link(dev);
799 if (ret)
800 goto err_minors;
801
802 dev->registered = true;
803
804 if (dev->driver->load) {
805 ret = dev->driver->load(dev, flags);
806 if (ret)
807 goto err_minors;
808 }
809
810 if (drm_core_check_feature(dev, DRIVER_MODESET))
811 drm_modeset_register_all(dev);
812
813 ret = 0;
814
815 DRM_INFO("Initialized %s %d.%d.%d %s for %s on minor %d\n",
816 driver->name, driver->major, driver->minor,
817 driver->patchlevel, driver->date,
818 dev->dev ? dev_name(dev->dev) : "virtual device",
819 dev->primary->index);
820
821 goto out_unlock;
822
823err_minors:
824 remove_compat_control_link(dev);
825 drm_minor_unregister(dev, DRM_MINOR_PRIMARY);
826 drm_minor_unregister(dev, DRM_MINOR_RENDER);
827out_unlock:
828 mutex_unlock(&drm_global_mutex);
829 return ret;
830}
831EXPORT_SYMBOL(drm_dev_register);
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847void drm_dev_unregister(struct drm_device *dev)
848{
849 struct drm_map_list *r_list, *list_temp;
850
851 if (drm_core_check_feature(dev, DRIVER_LEGACY))
852 drm_lastclose(dev);
853
854 dev->registered = false;
855
856 drm_client_dev_unregister(dev);
857
858 if (drm_core_check_feature(dev, DRIVER_MODESET))
859 drm_modeset_unregister_all(dev);
860
861 if (dev->driver->unload)
862 dev->driver->unload(dev);
863
864 if (dev->agp)
865 drm_pci_agp_destroy(dev);
866
867 list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head)
868 drm_legacy_rmmap(dev, r_list->map);
869
870 remove_compat_control_link(dev);
871 drm_minor_unregister(dev, DRM_MINOR_PRIMARY);
872 drm_minor_unregister(dev, DRM_MINOR_RENDER);
873}
874EXPORT_SYMBOL(drm_dev_unregister);
875
876
877
878
879
880
881
882
883
884
885
886
887int drm_dev_set_unique(struct drm_device *dev, const char *name)
888{
889 kfree(dev->unique);
890 dev->unique = kstrdup(name, GFP_KERNEL);
891
892 return dev->unique ? 0 : -ENOMEM;
893}
894EXPORT_SYMBOL(drm_dev_set_unique);
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916static int drm_stub_open(struct inode *inode, struct file *filp)
917{
918 const struct file_operations *new_fops;
919 struct drm_minor *minor;
920 int err;
921
922 DRM_DEBUG("\n");
923
924 mutex_lock(&drm_global_mutex);
925 minor = drm_minor_acquire(iminor(inode));
926 if (IS_ERR(minor)) {
927 err = PTR_ERR(minor);
928 goto out_unlock;
929 }
930
931 new_fops = fops_get(minor->dev->driver->fops);
932 if (!new_fops) {
933 err = -ENODEV;
934 goto out_release;
935 }
936
937 replace_fops(filp, new_fops);
938 if (filp->f_op->open)
939 err = filp->f_op->open(inode, filp);
940 else
941 err = 0;
942
943out_release:
944 drm_minor_release(minor);
945out_unlock:
946 mutex_unlock(&drm_global_mutex);
947 return err;
948}
949
950static const struct file_operations drm_stub_fops = {
951 .owner = THIS_MODULE,
952 .open = drm_stub_open,
953 .llseek = noop_llseek,
954};
955
956static void drm_core_exit(void)
957{
958 unregister_chrdev(DRM_MAJOR, "drm");
959 debugfs_remove(drm_debugfs_root);
960 drm_sysfs_destroy();
961 idr_destroy(&drm_minors_idr);
962 drm_connector_ida_destroy();
963}
964
965static int __init drm_core_init(void)
966{
967 int ret;
968
969 drm_connector_ida_init();
970 idr_init(&drm_minors_idr);
971
972 ret = drm_sysfs_init();
973 if (ret < 0) {
974 DRM_ERROR("Cannot create DRM class: %d\n", ret);
975 goto error;
976 }
977
978 drm_debugfs_root = debugfs_create_dir("dri", NULL);
979 if (!drm_debugfs_root) {
980 ret = -ENOMEM;
981 DRM_ERROR("Cannot create debugfs-root: %d\n", ret);
982 goto error;
983 }
984
985 ret = register_chrdev(DRM_MAJOR, "drm", &drm_stub_fops);
986 if (ret < 0)
987 goto error;
988
989 drm_core_init_complete = true;
990
991 DRM_DEBUG("Initialized\n");
992 return 0;
993
994error:
995 drm_core_exit();
996 return ret;
997}
998
999module_init(drm_core_init);
1000module_exit(drm_core_exit);
1001