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 <drm/drmP.h>
36#include <drm/drm_core.h>
37#include "drm_legacy.h"
38#include "drm_internal.h"
39
40unsigned int drm_debug = 0;
41EXPORT_SYMBOL(drm_debug);
42
43MODULE_AUTHOR(CORE_AUTHOR);
44MODULE_DESCRIPTION(CORE_DESC);
45MODULE_LICENSE("GPL and additional rights");
46MODULE_PARM_DESC(debug, "Enable debug output");
47module_param_named(debug, drm_debug, int, 0600);
48
49static DEFINE_SPINLOCK(drm_minor_lock);
50static struct idr drm_minors_idr;
51
52static struct dentry *drm_debugfs_root;
53
54void drm_err(const char *format, ...)
55{
56 struct va_format vaf;
57 va_list args;
58
59 va_start(args, format);
60
61 vaf.fmt = format;
62 vaf.va = &args;
63
64 printk(KERN_ERR "[" DRM_NAME ":%ps] *ERROR* %pV",
65 __builtin_return_address(0), &vaf);
66
67 va_end(args);
68}
69EXPORT_SYMBOL(drm_err);
70
71void drm_ut_debug_printk(const char *function_name, const char *format, ...)
72{
73 struct va_format vaf;
74 va_list args;
75
76 va_start(args, format);
77 vaf.fmt = format;
78 vaf.va = &args;
79
80 printk(KERN_DEBUG "[" DRM_NAME ":%s] %pV", function_name, &vaf);
81
82 va_end(args);
83}
84EXPORT_SYMBOL(drm_ut_debug_printk);
85
86struct drm_master *drm_master_create(struct drm_minor *minor)
87{
88 struct drm_master *master;
89
90 master = kzalloc(sizeof(*master), GFP_KERNEL);
91 if (!master)
92 return NULL;
93
94 kref_init(&master->refcount);
95 spin_lock_init(&master->lock.spinlock);
96 init_waitqueue_head(&master->lock.lock_queue);
97 idr_init(&master->magic_map);
98 master->minor = minor;
99
100 return master;
101}
102
103struct drm_master *drm_master_get(struct drm_master *master)
104{
105 kref_get(&master->refcount);
106 return master;
107}
108EXPORT_SYMBOL(drm_master_get);
109
110static void drm_master_destroy(struct kref *kref)
111{
112 struct drm_master *master = container_of(kref, struct drm_master, refcount);
113 struct drm_device *dev = master->minor->dev;
114 struct drm_map_list *r_list, *list_temp;
115
116 mutex_lock(&dev->struct_mutex);
117 if (dev->driver->master_destroy)
118 dev->driver->master_destroy(dev, master);
119
120 list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) {
121 if (r_list->master == master) {
122 drm_legacy_rmmap_locked(dev, r_list->map);
123 r_list = NULL;
124 }
125 }
126 mutex_unlock(&dev->struct_mutex);
127
128 idr_destroy(&master->magic_map);
129 kfree(master->unique);
130 kfree(master);
131}
132
133void drm_master_put(struct drm_master **master)
134{
135 kref_put(&(*master)->refcount, drm_master_destroy);
136 *master = NULL;
137}
138EXPORT_SYMBOL(drm_master_put);
139
140int drm_setmaster_ioctl(struct drm_device *dev, void *data,
141 struct drm_file *file_priv)
142{
143 int ret = 0;
144
145 mutex_lock(&dev->master_mutex);
146 if (file_priv->is_master)
147 goto out_unlock;
148
149 if (file_priv->minor->master) {
150 ret = -EINVAL;
151 goto out_unlock;
152 }
153
154 if (!file_priv->master) {
155 ret = -EINVAL;
156 goto out_unlock;
157 }
158
159 if (!file_priv->allowed_master) {
160 ret = drm_new_set_master(dev, file_priv);
161 goto out_unlock;
162 }
163
164 file_priv->minor->master = drm_master_get(file_priv->master);
165 file_priv->is_master = 1;
166 if (dev->driver->master_set) {
167 ret = dev->driver->master_set(dev, file_priv, false);
168 if (unlikely(ret != 0)) {
169 file_priv->is_master = 0;
170 drm_master_put(&file_priv->minor->master);
171 }
172 }
173
174out_unlock:
175 mutex_unlock(&dev->master_mutex);
176 return ret;
177}
178
179int drm_dropmaster_ioctl(struct drm_device *dev, void *data,
180 struct drm_file *file_priv)
181{
182 int ret = -EINVAL;
183
184 mutex_lock(&dev->master_mutex);
185 if (!file_priv->is_master)
186 goto out_unlock;
187
188 if (!file_priv->minor->master)
189 goto out_unlock;
190
191 ret = 0;
192 if (dev->driver->master_drop)
193 dev->driver->master_drop(dev, file_priv, false);
194 drm_master_put(&file_priv->minor->master);
195 file_priv->is_master = 0;
196
197out_unlock:
198 mutex_unlock(&dev->master_mutex);
199 return ret;
200}
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215static struct drm_minor **drm_minor_get_slot(struct drm_device *dev,
216 unsigned int type)
217{
218 switch (type) {
219 case DRM_MINOR_LEGACY:
220 return &dev->primary;
221 case DRM_MINOR_RENDER:
222 return &dev->render;
223 case DRM_MINOR_CONTROL:
224 return &dev->control;
225 default:
226 return NULL;
227 }
228}
229
230static int drm_minor_alloc(struct drm_device *dev, unsigned int type)
231{
232 struct drm_minor *minor;
233 unsigned long flags;
234 int r;
235
236 minor = kzalloc(sizeof(*minor), GFP_KERNEL);
237 if (!minor)
238 return -ENOMEM;
239
240 minor->type = type;
241 minor->dev = dev;
242
243 idr_preload(GFP_KERNEL);
244 spin_lock_irqsave(&drm_minor_lock, flags);
245 r = idr_alloc(&drm_minors_idr,
246 NULL,
247 64 * type,
248 64 * (type + 1),
249 GFP_NOWAIT);
250 spin_unlock_irqrestore(&drm_minor_lock, flags);
251 idr_preload_end();
252
253 if (r < 0)
254 goto err_free;
255
256 minor->index = r;
257
258 minor->kdev = drm_sysfs_minor_alloc(minor);
259 if (IS_ERR(minor->kdev)) {
260 r = PTR_ERR(minor->kdev);
261 goto err_index;
262 }
263
264 *drm_minor_get_slot(dev, type) = minor;
265 return 0;
266
267err_index:
268 spin_lock_irqsave(&drm_minor_lock, flags);
269 idr_remove(&drm_minors_idr, minor->index);
270 spin_unlock_irqrestore(&drm_minor_lock, flags);
271err_free:
272 kfree(minor);
273 return r;
274}
275
276static void drm_minor_free(struct drm_device *dev, unsigned int type)
277{
278 struct drm_minor **slot, *minor;
279 unsigned long flags;
280
281 slot = drm_minor_get_slot(dev, type);
282 minor = *slot;
283 if (!minor)
284 return;
285
286 put_device(minor->kdev);
287
288 spin_lock_irqsave(&drm_minor_lock, flags);
289 idr_remove(&drm_minors_idr, minor->index);
290 spin_unlock_irqrestore(&drm_minor_lock, flags);
291
292 kfree(minor);
293 *slot = NULL;
294}
295
296static int drm_minor_register(struct drm_device *dev, unsigned int type)
297{
298 struct drm_minor *minor;
299 unsigned long flags;
300 int ret;
301
302 DRM_DEBUG("\n");
303
304 minor = *drm_minor_get_slot(dev, type);
305 if (!minor)
306 return 0;
307
308 ret = drm_debugfs_init(minor, minor->index, drm_debugfs_root);
309 if (ret) {
310 DRM_ERROR("DRM: Failed to initialize /sys/kernel/debug/dri.\n");
311 return ret;
312 }
313
314 ret = device_add(minor->kdev);
315 if (ret)
316 goto err_debugfs;
317
318
319 spin_lock_irqsave(&drm_minor_lock, flags);
320 idr_replace(&drm_minors_idr, minor, minor->index);
321 spin_unlock_irqrestore(&drm_minor_lock, flags);
322
323 DRM_DEBUG("new minor registered %d\n", minor->index);
324 return 0;
325
326err_debugfs:
327 drm_debugfs_cleanup(minor);
328 return ret;
329}
330
331static void drm_minor_unregister(struct drm_device *dev, unsigned int type)
332{
333 struct drm_minor *minor;
334 unsigned long flags;
335
336 minor = *drm_minor_get_slot(dev, type);
337 if (!minor || !device_is_registered(minor->kdev))
338 return;
339
340
341 spin_lock_irqsave(&drm_minor_lock, flags);
342 idr_replace(&drm_minors_idr, NULL, minor->index);
343 spin_unlock_irqrestore(&drm_minor_lock, flags);
344
345 device_del(minor->kdev);
346 dev_set_drvdata(minor->kdev, NULL);
347 drm_debugfs_cleanup(minor);
348}
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366struct drm_minor *drm_minor_acquire(unsigned int minor_id)
367{
368 struct drm_minor *minor;
369 unsigned long flags;
370
371 spin_lock_irqsave(&drm_minor_lock, flags);
372 minor = idr_find(&drm_minors_idr, minor_id);
373 if (minor)
374 drm_dev_ref(minor->dev);
375 spin_unlock_irqrestore(&drm_minor_lock, flags);
376
377 if (!minor) {
378 return ERR_PTR(-ENODEV);
379 } else if (drm_device_is_unplugged(minor->dev)) {
380 drm_dev_unref(minor->dev);
381 return ERR_PTR(-ENODEV);
382 }
383
384 return minor;
385}
386
387
388
389
390
391
392
393void drm_minor_release(struct drm_minor *minor)
394{
395 drm_dev_unref(minor->dev);
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
445void drm_put_dev(struct drm_device *dev)
446{
447 DRM_DEBUG("\n");
448
449 if (!dev) {
450 DRM_ERROR("cleanup called no dev\n");
451 return;
452 }
453
454 drm_dev_unregister(dev);
455 drm_dev_unref(dev);
456}
457EXPORT_SYMBOL(drm_put_dev);
458
459void drm_unplug_dev(struct drm_device *dev)
460{
461
462 drm_minor_unregister(dev, DRM_MINOR_LEGACY);
463 drm_minor_unregister(dev, DRM_MINOR_RENDER);
464 drm_minor_unregister(dev, DRM_MINOR_CONTROL);
465
466 mutex_lock(&drm_global_mutex);
467
468 drm_device_set_unplugged(dev);
469
470 if (dev->open_count == 0) {
471 drm_put_dev(dev);
472 }
473 mutex_unlock(&drm_global_mutex);
474}
475EXPORT_SYMBOL(drm_unplug_dev);
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495static int drm_fs_cnt;
496static struct vfsmount *drm_fs_mnt;
497
498static const struct dentry_operations drm_fs_dops = {
499 .d_dname = simple_dname,
500};
501
502static const struct super_operations drm_fs_sops = {
503 .statfs = simple_statfs,
504};
505
506static struct dentry *drm_fs_mount(struct file_system_type *fs_type, int flags,
507 const char *dev_name, void *data)
508{
509 return mount_pseudo(fs_type,
510 "drm:",
511 &drm_fs_sops,
512 &drm_fs_dops,
513 0x010203ff);
514}
515
516static struct file_system_type drm_fs_type = {
517 .name = "drm",
518 .owner = THIS_MODULE,
519 .mount = drm_fs_mount,
520 .kill_sb = kill_anon_super,
521};
522
523static struct inode *drm_fs_inode_new(void)
524{
525 struct inode *inode;
526 int r;
527
528 r = simple_pin_fs(&drm_fs_type, &drm_fs_mnt, &drm_fs_cnt);
529 if (r < 0) {
530 DRM_ERROR("Cannot mount pseudo fs: %d\n", r);
531 return ERR_PTR(r);
532 }
533
534 inode = alloc_anon_inode(drm_fs_mnt->mnt_sb);
535 if (IS_ERR(inode))
536 simple_release_fs(&drm_fs_mnt, &drm_fs_cnt);
537
538 return inode;
539}
540
541static void drm_fs_inode_free(struct inode *inode)
542{
543 if (inode) {
544 iput(inode);
545 simple_release_fs(&drm_fs_mnt, &drm_fs_cnt);
546 }
547}
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568struct drm_device *drm_dev_alloc(struct drm_driver *driver,
569 struct device *parent)
570{
571 struct drm_device *dev;
572 int ret;
573
574 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
575 if (!dev)
576 return NULL;
577
578 kref_init(&dev->ref);
579 dev->dev = parent;
580 dev->driver = driver;
581
582 INIT_LIST_HEAD(&dev->filelist);
583 INIT_LIST_HEAD(&dev->ctxlist);
584 INIT_LIST_HEAD(&dev->vmalist);
585 INIT_LIST_HEAD(&dev->maplist);
586 INIT_LIST_HEAD(&dev->vblank_event_list);
587
588 spin_lock_init(&dev->buf_lock);
589 spin_lock_init(&dev->event_lock);
590 mutex_init(&dev->struct_mutex);
591 mutex_init(&dev->ctxlist_mutex);
592 mutex_init(&dev->master_mutex);
593
594 dev->anon_inode = drm_fs_inode_new();
595 if (IS_ERR(dev->anon_inode)) {
596 ret = PTR_ERR(dev->anon_inode);
597 DRM_ERROR("Cannot allocate anonymous inode: %d\n", ret);
598 goto err_free;
599 }
600
601 if (drm_core_check_feature(dev, DRIVER_MODESET)) {
602 ret = drm_minor_alloc(dev, DRM_MINOR_CONTROL);
603 if (ret)
604 goto err_minors;
605
606 WARN_ON(driver->suspend || driver->resume);
607 }
608
609 if (drm_core_check_feature(dev, DRIVER_RENDER)) {
610 ret = drm_minor_alloc(dev, DRM_MINOR_RENDER);
611 if (ret)
612 goto err_minors;
613 }
614
615 ret = drm_minor_alloc(dev, DRM_MINOR_LEGACY);
616 if (ret)
617 goto err_minors;
618
619 if (drm_ht_create(&dev->map_hash, 12))
620 goto err_minors;
621
622 drm_legacy_ctxbitmap_init(dev);
623
624 if (drm_core_check_feature(dev, DRIVER_GEM)) {
625 ret = drm_gem_init(dev);
626 if (ret) {
627 DRM_ERROR("Cannot initialize graphics execution manager (GEM)\n");
628 goto err_ctxbitmap;
629 }
630 }
631
632 if (parent) {
633 ret = drm_dev_set_unique(dev, dev_name(parent));
634 if (ret)
635 goto err_setunique;
636 }
637
638 return dev;
639
640err_setunique:
641 if (drm_core_check_feature(dev, DRIVER_GEM))
642 drm_gem_destroy(dev);
643err_ctxbitmap:
644 drm_legacy_ctxbitmap_cleanup(dev);
645 drm_ht_remove(&dev->map_hash);
646err_minors:
647 drm_minor_free(dev, DRM_MINOR_LEGACY);
648 drm_minor_free(dev, DRM_MINOR_RENDER);
649 drm_minor_free(dev, DRM_MINOR_CONTROL);
650 drm_fs_inode_free(dev->anon_inode);
651err_free:
652 mutex_destroy(&dev->master_mutex);
653 kfree(dev);
654 return NULL;
655}
656EXPORT_SYMBOL(drm_dev_alloc);
657
658static void drm_dev_release(struct kref *ref)
659{
660 struct drm_device *dev = container_of(ref, struct drm_device, ref);
661
662 if (drm_core_check_feature(dev, DRIVER_GEM))
663 drm_gem_destroy(dev);
664
665 drm_legacy_ctxbitmap_cleanup(dev);
666 drm_ht_remove(&dev->map_hash);
667 drm_fs_inode_free(dev->anon_inode);
668
669 drm_minor_free(dev, DRM_MINOR_LEGACY);
670 drm_minor_free(dev, DRM_MINOR_RENDER);
671 drm_minor_free(dev, DRM_MINOR_CONTROL);
672
673 mutex_destroy(&dev->master_mutex);
674 kfree(dev->unique);
675 kfree(dev);
676}
677
678
679
680
681
682
683
684
685
686
687
688
689
690void drm_dev_ref(struct drm_device *dev)
691{
692 if (dev)
693 kref_get(&dev->ref);
694}
695EXPORT_SYMBOL(drm_dev_ref);
696
697
698
699
700
701
702
703
704void drm_dev_unref(struct drm_device *dev)
705{
706 if (dev)
707 kref_put(&dev->ref, drm_dev_release);
708}
709EXPORT_SYMBOL(drm_dev_unref);
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731int drm_dev_register(struct drm_device *dev, unsigned long flags)
732{
733 int ret;
734
735 mutex_lock(&drm_global_mutex);
736
737 ret = drm_minor_register(dev, DRM_MINOR_CONTROL);
738 if (ret)
739 goto err_minors;
740
741 ret = drm_minor_register(dev, DRM_MINOR_RENDER);
742 if (ret)
743 goto err_minors;
744
745 ret = drm_minor_register(dev, DRM_MINOR_LEGACY);
746 if (ret)
747 goto err_minors;
748
749 if (dev->driver->load) {
750 ret = dev->driver->load(dev, flags);
751 if (ret)
752 goto err_minors;
753 }
754
755 ret = 0;
756 goto out_unlock;
757
758err_minors:
759 drm_minor_unregister(dev, DRM_MINOR_LEGACY);
760 drm_minor_unregister(dev, DRM_MINOR_RENDER);
761 drm_minor_unregister(dev, DRM_MINOR_CONTROL);
762out_unlock:
763 mutex_unlock(&drm_global_mutex);
764 return ret;
765}
766EXPORT_SYMBOL(drm_dev_register);
767
768
769
770
771
772
773
774
775
776
777
778
779void drm_dev_unregister(struct drm_device *dev)
780{
781 struct drm_map_list *r_list, *list_temp;
782
783 drm_lastclose(dev);
784
785 if (dev->driver->unload)
786 dev->driver->unload(dev);
787
788 if (dev->agp)
789 drm_pci_agp_destroy(dev);
790
791 drm_vblank_cleanup(dev);
792
793 list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head)
794 drm_legacy_rmmap(dev, r_list->map);
795
796 drm_minor_unregister(dev, DRM_MINOR_LEGACY);
797 drm_minor_unregister(dev, DRM_MINOR_RENDER);
798 drm_minor_unregister(dev, DRM_MINOR_CONTROL);
799}
800EXPORT_SYMBOL(drm_dev_unregister);
801
802
803
804
805
806
807
808
809
810
811
812
813int drm_dev_set_unique(struct drm_device *dev, const char *name)
814{
815 kfree(dev->unique);
816 dev->unique = kstrdup(name, GFP_KERNEL);
817
818 return dev->unique ? 0 : -ENOMEM;
819}
820EXPORT_SYMBOL(drm_dev_set_unique);
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842static int drm_stub_open(struct inode *inode, struct file *filp)
843{
844 const struct file_operations *new_fops;
845 struct drm_minor *minor;
846 int err;
847
848 DRM_DEBUG("\n");
849
850 mutex_lock(&drm_global_mutex);
851 minor = drm_minor_acquire(iminor(inode));
852 if (IS_ERR(minor)) {
853 err = PTR_ERR(minor);
854 goto out_unlock;
855 }
856
857 new_fops = fops_get(minor->dev->driver->fops);
858 if (!new_fops) {
859 err = -ENODEV;
860 goto out_release;
861 }
862
863 replace_fops(filp, new_fops);
864 if (filp->f_op->open)
865 err = filp->f_op->open(inode, filp);
866 else
867 err = 0;
868
869out_release:
870 drm_minor_release(minor);
871out_unlock:
872 mutex_unlock(&drm_global_mutex);
873 return err;
874}
875
876static const struct file_operations drm_stub_fops = {
877 .owner = THIS_MODULE,
878 .open = drm_stub_open,
879 .llseek = noop_llseek,
880};
881
882static int __init drm_core_init(void)
883{
884 int ret = -ENOMEM;
885
886 drm_global_init();
887 drm_connector_ida_init();
888 idr_init(&drm_minors_idr);
889
890 if (register_chrdev(DRM_MAJOR, "drm", &drm_stub_fops))
891 goto err_p1;
892
893 ret = drm_sysfs_init();
894 if (ret < 0) {
895 printk(KERN_ERR "DRM: Error creating drm class.\n");
896 goto err_p2;
897 }
898
899 drm_debugfs_root = debugfs_create_dir("dri", NULL);
900 if (!drm_debugfs_root) {
901 DRM_ERROR("Cannot create /sys/kernel/debug/dri\n");
902 ret = -1;
903 goto err_p3;
904 }
905
906 DRM_INFO("Initialized %s %d.%d.%d %s\n",
907 CORE_NAME, CORE_MAJOR, CORE_MINOR, CORE_PATCHLEVEL, CORE_DATE);
908 return 0;
909err_p3:
910 drm_sysfs_destroy();
911err_p2:
912 unregister_chrdev(DRM_MAJOR, "drm");
913
914 idr_destroy(&drm_minors_idr);
915err_p1:
916 return ret;
917}
918
919static void __exit drm_core_exit(void)
920{
921 debugfs_remove(drm_debugfs_root);
922 drm_sysfs_destroy();
923
924 unregister_chrdev(DRM_MAJOR, "drm");
925
926 drm_connector_ida_destroy();
927 idr_destroy(&drm_minors_idr);
928}
929
930module_init(drm_core_init);
931module_exit(drm_core_exit);
932