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
30
31
32
33
34
35#ifndef _DRM_P_H_
36#define _DRM_P_H_
37
38#ifdef __KERNEL__
39#ifdef __alpha__
40
41
42
43#include <asm/current.h>
44#endif
45#include <linux/kernel.h>
46#include <linux/miscdevice.h>
47#include <linux/fs.h>
48#include <linux/proc_fs.h>
49#include <linux/init.h>
50#include <linux/file.h>
51#include <linux/platform_device.h>
52#include <linux/pci.h>
53#include <linux/jiffies.h>
54#include <linux/dma-mapping.h>
55#include <linux/mm.h>
56#include <linux/cdev.h>
57#include <linux/mutex.h>
58#include <linux/slab.h>
59#if defined(__alpha__) || defined(__powerpc__)
60#include <asm/pgtable.h>
61#endif
62#include <asm/io.h>
63#include <asm/mman.h>
64#include <asm/uaccess.h>
65#ifdef CONFIG_MTRR
66#include <asm/mtrr.h>
67#endif
68#if defined(CONFIG_AGP) || defined(CONFIG_AGP_MODULE)
69#include <linux/types.h>
70#include <linux/agp_backend.h>
71#endif
72#include <linux/workqueue.h>
73#include <linux/poll.h>
74#include <asm/pgalloc.h>
75#include <drm/drm.h>
76#include <drm/drm_sarea.h>
77
78#include <linux/idr.h>
79
80#define __OS_HAS_AGP (defined(CONFIG_AGP) || (defined(CONFIG_AGP_MODULE) && defined(MODULE)))
81#define __OS_HAS_MTRR (defined(CONFIG_MTRR))
82
83struct module;
84
85struct drm_file;
86struct drm_device;
87
88#include <drm/drm_os_linux.h>
89#include <drm/drm_hashtab.h>
90#include <drm/drm_mm.h>
91
92#define DRM_UT_CORE 0x01
93#define DRM_UT_DRIVER 0x02
94#define DRM_UT_KMS 0x04
95#define DRM_UT_PRIME 0x08
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128extern __printf(4, 5)
129void drm_ut_debug_printk(unsigned int request_level,
130 const char *prefix,
131 const char *function_name,
132 const char *format, ...);
133extern __printf(2, 3)
134int drm_err(const char *func, const char *format, ...);
135
136
137
138
139
140
141#define DRIVER_USE_AGP 0x1
142#define DRIVER_REQUIRE_AGP 0x2
143#define DRIVER_USE_MTRR 0x4
144#define DRIVER_PCI_DMA 0x8
145#define DRIVER_SG 0x10
146#define DRIVER_HAVE_DMA 0x20
147#define DRIVER_HAVE_IRQ 0x40
148#define DRIVER_IRQ_SHARED 0x80
149#define DRIVER_IRQ_VBL 0x100
150#define DRIVER_DMA_QUEUE 0x200
151#define DRIVER_FB_DMA 0x400
152#define DRIVER_IRQ_VBL2 0x800
153#define DRIVER_GEM 0x1000
154#define DRIVER_MODESET 0x2000
155#define DRIVER_PRIME 0x4000
156
157#define DRIVER_BUS_PCI 0x1
158#define DRIVER_BUS_PLATFORM 0x2
159#define DRIVER_BUS_USB 0x3
160
161
162
163
164
165#define DRM_DEBUG_CODE 2
166
167
168#define DRM_MAGIC_HASH_ORDER 4
169#define DRM_KERNEL_CONTEXT 0
170#define DRM_RESERVED_CONTEXTS 1
171#define DRM_LOOPING_LIMIT 5000000
172#define DRM_TIME_SLICE (HZ/20)
173#define DRM_LOCK_SLICE 1
174
175#define DRM_FLAG_DEBUG 0x01
176
177#define DRM_MAX_CTXBITMAP (PAGE_SIZE * 8)
178#define DRM_MAP_HASH_OFFSET 0x10000000
179
180
181
182
183
184
185
186
187
188
189
190
191
192#define DRM_ERROR(fmt, ...) \
193 drm_err(__func__, fmt, ##__VA_ARGS__)
194
195#define DRM_INFO(fmt, ...) \
196 printk(KERN_INFO "[" DRM_NAME "] " fmt, ##__VA_ARGS__)
197
198
199
200
201
202
203
204#if DRM_DEBUG_CODE
205#define DRM_DEBUG(fmt, args...) \
206 do { \
207 drm_ut_debug_printk(DRM_UT_CORE, DRM_NAME, \
208 __func__, fmt, ##args); \
209 } while (0)
210
211#define DRM_DEBUG_DRIVER(fmt, args...) \
212 do { \
213 drm_ut_debug_printk(DRM_UT_DRIVER, DRM_NAME, \
214 __func__, fmt, ##args); \
215 } while (0)
216#define DRM_DEBUG_KMS(fmt, args...) \
217 do { \
218 drm_ut_debug_printk(DRM_UT_KMS, DRM_NAME, \
219 __func__, fmt, ##args); \
220 } while (0)
221#define DRM_DEBUG_PRIME(fmt, args...) \
222 do { \
223 drm_ut_debug_printk(DRM_UT_PRIME, DRM_NAME, \
224 __func__, fmt, ##args); \
225 } while (0)
226#define DRM_LOG(fmt, args...) \
227 do { \
228 drm_ut_debug_printk(DRM_UT_CORE, NULL, \
229 NULL, fmt, ##args); \
230 } while (0)
231#define DRM_LOG_KMS(fmt, args...) \
232 do { \
233 drm_ut_debug_printk(DRM_UT_KMS, NULL, \
234 NULL, fmt, ##args); \
235 } while (0)
236#define DRM_LOG_MODE(fmt, args...) \
237 do { \
238 drm_ut_debug_printk(DRM_UT_MODE, NULL, \
239 NULL, fmt, ##args); \
240 } while (0)
241#define DRM_LOG_DRIVER(fmt, args...) \
242 do { \
243 drm_ut_debug_printk(DRM_UT_DRIVER, NULL, \
244 NULL, fmt, ##args); \
245 } while (0)
246#else
247#define DRM_DEBUG_DRIVER(fmt, args...) do { } while (0)
248#define DRM_DEBUG_KMS(fmt, args...) do { } while (0)
249#define DRM_DEBUG_PRIME(fmt, args...) do { } while (0)
250#define DRM_DEBUG(fmt, arg...) do { } while (0)
251#define DRM_LOG(fmt, arg...) do { } while (0)
252#define DRM_LOG_KMS(fmt, args...) do { } while (0)
253#define DRM_LOG_MODE(fmt, arg...) do { } while (0)
254#define DRM_LOG_DRIVER(fmt, arg...) do { } while (0)
255
256#endif
257
258
259
260
261
262
263
264#define DRM_ARRAY_SIZE(x) ARRAY_SIZE(x)
265
266#define DRM_LEFTCOUNT(x) (((x)->rp + (x)->count - (x)->wp) % ((x)->count + 1))
267#define DRM_BUFCOUNT(x) ((x)->count - DRM_LEFTCOUNT(x))
268
269#define DRM_IF_VERSION(maj, min) (maj << 16 | min)
270
271
272
273
274
275
276
277#define LOCK_TEST_WITH_RETURN( dev, _file_priv ) \
278do { \
279 if (!_DRM_LOCK_IS_HELD(_file_priv->master->lock.hw_lock->lock) || \
280 _file_priv->master->lock.file_priv != _file_priv) { \
281 DRM_ERROR( "%s called without lock held, held %d owner %p %p\n",\
282 __func__, _DRM_LOCK_IS_HELD(_file_priv->master->lock.hw_lock->lock),\
283 _file_priv->master->lock.file_priv, _file_priv); \
284 return -EINVAL; \
285 } \
286} while (0)
287
288
289
290
291
292
293
294
295
296typedef int drm_ioctl_t(struct drm_device *dev, void *data,
297 struct drm_file *file_priv);
298
299typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd,
300 unsigned long arg);
301
302#define DRM_IOCTL_NR(n) _IOC_NR(n)
303#define DRM_MAJOR 226
304
305#define DRM_AUTH 0x1
306#define DRM_MASTER 0x2
307#define DRM_ROOT_ONLY 0x4
308#define DRM_CONTROL_ALLOW 0x8
309#define DRM_UNLOCKED 0x10
310
311struct drm_ioctl_desc {
312 unsigned int cmd;
313 int flags;
314 drm_ioctl_t *func;
315 unsigned int cmd_drv;
316};
317
318
319
320
321
322
323#define DRM_IOCTL_DEF_DRV(ioctl, _func, _flags) \
324 [DRM_IOCTL_NR(DRM_##ioctl)] = {.cmd = DRM_##ioctl, .func = _func, .flags = _flags, .cmd_drv = DRM_IOCTL_##ioctl}
325
326struct drm_magic_entry {
327 struct list_head head;
328 struct drm_hash_item hash_item;
329 struct drm_file *priv;
330};
331
332struct drm_vma_entry {
333 struct list_head head;
334 struct vm_area_struct *vma;
335 pid_t pid;
336};
337
338
339
340
341struct drm_buf {
342 int idx;
343 int total;
344 int order;
345 int used;
346 unsigned long offset;
347 void *address;
348 unsigned long bus_address;
349 struct drm_buf *next;
350 __volatile__ int waiting;
351 __volatile__ int pending;
352 struct drm_file *file_priv;
353 int context;
354 int while_locked;
355 enum {
356 DRM_LIST_NONE = 0,
357 DRM_LIST_FREE = 1,
358 DRM_LIST_WAIT = 2,
359 DRM_LIST_PEND = 3,
360 DRM_LIST_PRIO = 4,
361 DRM_LIST_RECLAIM = 5
362 } list;
363
364 int dev_priv_size;
365 void *dev_private;
366};
367
368
369struct drm_waitlist {
370 int count;
371 struct drm_buf **bufs;
372 struct drm_buf **rp;
373 struct drm_buf **wp;
374 struct drm_buf **end;
375 spinlock_t read_lock;
376 spinlock_t write_lock;
377};
378
379struct drm_freelist {
380 int initialized;
381 atomic_t count;
382 struct drm_buf *next;
383
384 wait_queue_head_t waiting;
385 int low_mark;
386 int high_mark;
387 atomic_t wfh;
388 spinlock_t lock;
389};
390
391typedef struct drm_dma_handle {
392 dma_addr_t busaddr;
393 void *vaddr;
394 size_t size;
395} drm_dma_handle_t;
396
397
398
399
400struct drm_buf_entry {
401 int buf_size;
402 int buf_count;
403 struct drm_buf *buflist;
404 int seg_count;
405 int page_order;
406 struct drm_dma_handle **seglist;
407
408 struct drm_freelist freelist;
409};
410
411
412struct drm_pending_event {
413 struct drm_event *event;
414 struct list_head link;
415 struct drm_file *file_priv;
416 pid_t pid;
417
418 void (*destroy)(struct drm_pending_event *event);
419};
420
421
422struct drm_prime_file_private {
423 struct list_head head;
424 struct mutex lock;
425};
426
427
428struct drm_file {
429 int authenticated;
430 struct pid *pid;
431 kuid_t uid;
432 drm_magic_t magic;
433 unsigned long ioctl_count;
434 struct list_head lhead;
435 struct drm_minor *minor;
436 unsigned long lock_count;
437
438
439 struct idr object_idr;
440
441 spinlock_t table_lock;
442
443 struct file *filp;
444 void *driver_priv;
445
446 int is_master;
447 struct drm_master *master;
448
449 struct list_head fbs;
450
451 wait_queue_head_t event_wait;
452 struct list_head event_list;
453 int event_space;
454
455 struct drm_prime_file_private prime;
456};
457
458
459struct drm_queue {
460 atomic_t use_count;
461 atomic_t finalization;
462 atomic_t block_count;
463 atomic_t block_read;
464 wait_queue_head_t read_queue;
465 atomic_t block_write;
466 wait_queue_head_t write_queue;
467 atomic_t total_queued;
468 atomic_t total_flushed;
469 atomic_t total_locks;
470 enum drm_ctx_flags flags;
471 struct drm_waitlist waitlist;
472 wait_queue_head_t flush_queue;
473};
474
475
476
477
478struct drm_lock_data {
479 struct drm_hw_lock *hw_lock;
480
481 struct drm_file *file_priv;
482 wait_queue_head_t lock_queue;
483 unsigned long lock_time;
484 spinlock_t spinlock;
485 uint32_t kernel_waiters;
486 uint32_t user_waiters;
487 int idle_has_lock;
488};
489
490
491
492
493struct drm_device_dma {
494
495 struct drm_buf_entry bufs[DRM_MAX_ORDER + 1];
496 int buf_count;
497 struct drm_buf **buflist;
498 int seg_count;
499 int page_count;
500 unsigned long *pagelist;
501 unsigned long byte_count;
502 enum {
503 _DRM_DMA_USE_AGP = 0x01,
504 _DRM_DMA_USE_SG = 0x02,
505 _DRM_DMA_USE_FB = 0x04,
506 _DRM_DMA_USE_PCI_RO = 0x08
507 } flags;
508
509};
510
511
512
513
514struct drm_agp_mem {
515 unsigned long handle;
516 DRM_AGP_MEM *memory;
517 unsigned long bound;
518 int pages;
519 struct list_head head;
520};
521
522
523
524
525
526
527struct drm_agp_head {
528 DRM_AGP_KERN agp_info;
529 struct list_head memory;
530 unsigned long mode;
531 struct agp_bridge_data *bridge;
532 int enabled;
533 int acquired;
534 unsigned long base;
535 int agp_mtrr;
536 int cant_use_aperture;
537 unsigned long page_mask;
538};
539
540
541
542
543struct drm_sg_mem {
544 unsigned long handle;
545 void *virtual;
546 int pages;
547 struct page **pagelist;
548 dma_addr_t *busaddr;
549};
550
551struct drm_sigdata {
552 int context;
553 struct drm_hw_lock *lock;
554};
555
556
557
558
559
560struct drm_local_map {
561 resource_size_t offset;
562 unsigned long size;
563 enum drm_map_type type;
564 enum drm_map_flags flags;
565 void *handle;
566
567 int mtrr;
568};
569
570typedef struct drm_local_map drm_local_map_t;
571
572
573
574
575struct drm_map_list {
576 struct list_head head;
577 struct drm_hash_item hash;
578 struct drm_local_map *map;
579 uint64_t user_token;
580 struct drm_master *master;
581 struct drm_mm_node *file_offset_node;
582};
583
584
585
586
587struct drm_ctx_list {
588 struct list_head head;
589 drm_context_t handle;
590 struct drm_file *tag;
591};
592
593
594#define DRM_ATI_GART_MAIN 1
595#define DRM_ATI_GART_FB 2
596
597#define DRM_ATI_GART_PCI 1
598#define DRM_ATI_GART_PCIE 2
599#define DRM_ATI_GART_IGP 3
600
601struct drm_ati_pcigart_info {
602 int gart_table_location;
603 int gart_reg_if;
604 void *addr;
605 dma_addr_t bus_addr;
606 dma_addr_t table_mask;
607 struct drm_dma_handle *table_handle;
608 struct drm_local_map mapping;
609 int table_size;
610};
611
612
613
614
615struct drm_gem_mm {
616 struct drm_mm offset_manager;
617 struct drm_open_hash offset_hash;
618};
619
620
621
622
623
624struct drm_gem_object {
625
626 struct kref refcount;
627
628
629 atomic_t handle_count;
630
631
632 struct drm_device *dev;
633
634
635 struct file *filp;
636
637
638 struct drm_map_list map_list;
639
640
641
642
643
644 size_t size;
645
646
647
648
649
650 int name;
651
652
653
654
655
656
657
658 uint32_t read_domains;
659 uint32_t write_domain;
660
661
662
663
664
665
666
667 uint32_t pending_read_domains;
668 uint32_t pending_write_domain;
669
670 void *driver_private;
671
672
673 struct dma_buf *export_dma_buf;
674
675
676 struct dma_buf_attachment *import_attach;
677};
678
679#include <drm/drm_crtc.h>
680
681
682struct drm_master {
683
684 struct kref refcount;
685
686 struct list_head head;
687 struct drm_minor *minor;
688
689 char *unique;
690 int unique_len;
691 int unique_size;
692
693 int blocked;
694
695
696
697 struct drm_open_hash magiclist;
698 struct list_head magicfree;
699
700
701 struct drm_lock_data lock;
702
703 void *driver_priv;
704};
705
706
707
708
709#define DRM_VBLANKTIME_RBSIZE 2
710
711
712#define DRM_CALLED_FROM_VBLIRQ 1
713#define DRM_VBLANKTIME_SCANOUTPOS_METHOD (1 << 0)
714#define DRM_VBLANKTIME_INVBL (1 << 1)
715
716
717#define DRM_SCANOUTPOS_VALID (1 << 0)
718#define DRM_SCANOUTPOS_INVBL (1 << 1)
719#define DRM_SCANOUTPOS_ACCURATE (1 << 2)
720
721struct drm_bus {
722 int bus_type;
723 int (*get_irq)(struct drm_device *dev);
724 const char *(*get_name)(struct drm_device *dev);
725 int (*set_busid)(struct drm_device *dev, struct drm_master *master);
726 int (*set_unique)(struct drm_device *dev, struct drm_master *master,
727 struct drm_unique *unique);
728 int (*irq_by_busid)(struct drm_device *dev, struct drm_irq_busid *p);
729
730 int (*agp_init)(struct drm_device *dev);
731
732};
733
734
735
736
737
738
739struct drm_driver {
740 int (*load) (struct drm_device *, unsigned long flags);
741 int (*firstopen) (struct drm_device *);
742 int (*open) (struct drm_device *, struct drm_file *);
743 void (*preclose) (struct drm_device *, struct drm_file *file_priv);
744 void (*postclose) (struct drm_device *, struct drm_file *);
745 void (*lastclose) (struct drm_device *);
746 int (*unload) (struct drm_device *);
747 int (*suspend) (struct drm_device *, pm_message_t state);
748 int (*resume) (struct drm_device *);
749 int (*dma_ioctl) (struct drm_device *dev, void *data, struct drm_file *file_priv);
750 int (*dma_quiescent) (struct drm_device *);
751 int (*context_dtor) (struct drm_device *dev, int context);
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770 u32 (*get_vblank_counter) (struct drm_device *dev, int crtc);
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785 int (*enable_vblank) (struct drm_device *dev, int crtc);
786
787
788
789
790
791
792
793
794
795
796 void (*disable_vblank) (struct drm_device *dev, int crtc);
797
798
799
800
801
802
803
804
805
806
807
808
809 int (*device_is_agp) (struct drm_device *dev);
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835 int (*get_scanout_position) (struct drm_device *dev, int crtc,
836 int *vpos, int *hpos);
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868 int (*get_vblank_timestamp) (struct drm_device *dev, int crtc,
869 int *max_error,
870 struct timeval *vblank_time,
871 unsigned flags);
872
873
874
875 irqreturn_t(*irq_handler) (DRM_IRQ_ARGS);
876 void (*irq_preinstall) (struct drm_device *dev);
877 int (*irq_postinstall) (struct drm_device *dev);
878 void (*irq_uninstall) (struct drm_device *dev);
879 void (*set_version) (struct drm_device *dev,
880 struct drm_set_version *sv);
881
882
883 int (*master_create)(struct drm_device *dev, struct drm_master *master);
884 void (*master_destroy)(struct drm_device *dev, struct drm_master *master);
885
886
887
888
889
890 int (*master_set)(struct drm_device *dev, struct drm_file *file_priv,
891 bool from_open);
892 void (*master_drop)(struct drm_device *dev, struct drm_file *file_priv,
893 bool from_release);
894
895 int (*debugfs_init)(struct drm_minor *minor);
896 void (*debugfs_cleanup)(struct drm_minor *minor);
897
898
899
900
901
902
903
904 int (*gem_init_object) (struct drm_gem_object *obj);
905 void (*gem_free_object) (struct drm_gem_object *obj);
906 int (*gem_open_object) (struct drm_gem_object *, struct drm_file *);
907 void (*gem_close_object) (struct drm_gem_object *, struct drm_file *);
908
909
910
911 int (*prime_handle_to_fd)(struct drm_device *dev, struct drm_file *file_priv,
912 uint32_t handle, uint32_t flags, int *prime_fd);
913
914 int (*prime_fd_to_handle)(struct drm_device *dev, struct drm_file *file_priv,
915 int prime_fd, uint32_t *handle);
916
917 struct dma_buf * (*gem_prime_export)(struct drm_device *dev,
918 struct drm_gem_object *obj, int flags);
919
920 struct drm_gem_object * (*gem_prime_import)(struct drm_device *dev,
921 struct dma_buf *dma_buf);
922
923
924 void (*vgaarb_irq)(struct drm_device *dev, bool state);
925
926
927 int (*dumb_create)(struct drm_file *file_priv,
928 struct drm_device *dev,
929 struct drm_mode_create_dumb *args);
930 int (*dumb_map_offset)(struct drm_file *file_priv,
931 struct drm_device *dev, uint32_t handle,
932 uint64_t *offset);
933 int (*dumb_destroy)(struct drm_file *file_priv,
934 struct drm_device *dev,
935 uint32_t handle);
936
937
938 const struct vm_operations_struct *gem_vm_ops;
939
940 int major;
941 int minor;
942 int patchlevel;
943 char *name;
944 char *desc;
945 char *date;
946
947 u32 driver_features;
948 int dev_priv_size;
949 struct drm_ioctl_desc *ioctls;
950 int num_ioctls;
951 const struct file_operations *fops;
952 union {
953 struct pci_driver *pci;
954 struct platform_device *platform_device;
955 struct usb_driver *usb;
956 } kdriver;
957 struct drm_bus *bus;
958
959
960 struct list_head device_list;
961};
962
963#define DRM_MINOR_UNASSIGNED 0
964#define DRM_MINOR_LEGACY 1
965#define DRM_MINOR_CONTROL 2
966#define DRM_MINOR_RENDER 3
967
968
969
970
971
972
973struct drm_debugfs_list {
974 const char *name;
975 int (*show)(struct seq_file*, void*);
976 u32 driver_features;
977};
978
979
980
981
982struct drm_debugfs_node {
983 struct list_head list;
984 struct drm_minor *minor;
985 struct drm_debugfs_list *debugfs_ent;
986 struct dentry *dent;
987};
988
989
990
991
992
993struct drm_info_list {
994 const char *name;
995 int (*show)(struct seq_file*, void*);
996 u32 driver_features;
997 void *data;
998};
999
1000
1001
1002
1003struct drm_info_node {
1004 struct list_head list;
1005 struct drm_minor *minor;
1006 struct drm_info_list *info_ent;
1007 struct dentry *dent;
1008};
1009
1010
1011
1012
1013struct drm_minor {
1014 int index;
1015 int type;
1016 dev_t device;
1017 struct device kdev;
1018 struct drm_device *dev;
1019
1020 struct proc_dir_entry *proc_root;
1021 struct drm_info_node proc_nodes;
1022 struct dentry *debugfs_root;
1023
1024 struct list_head debugfs_list;
1025 struct mutex debugfs_lock;
1026
1027 struct drm_master *master;
1028 struct list_head master_list;
1029 struct drm_mode_group mode_group;
1030};
1031
1032
1033struct drm_cmdline_mode {
1034 bool specified;
1035 bool refresh_specified;
1036 bool bpp_specified;
1037 int xres, yres;
1038 int bpp;
1039 int refresh;
1040 bool rb;
1041 bool interlace;
1042 bool cvt;
1043 bool margins;
1044 enum drm_connector_force force;
1045};
1046
1047
1048struct drm_pending_vblank_event {
1049 struct drm_pending_event base;
1050 int pipe;
1051 struct drm_event_vblank event;
1052};
1053
1054
1055
1056
1057
1058struct drm_device {
1059 struct list_head driver_item;
1060 char *devname;
1061 int if_version;
1062
1063
1064
1065 spinlock_t count_lock;
1066 struct mutex struct_mutex;
1067
1068
1069
1070
1071 int open_count;
1072 atomic_t ioctl_count;
1073 atomic_t vma_count;
1074 int buf_use;
1075 atomic_t buf_alloc;
1076
1077
1078
1079
1080 unsigned long counters;
1081 enum drm_stat_type types[15];
1082 atomic_t counts[15];
1083
1084
1085 struct list_head filelist;
1086
1087
1088
1089 struct list_head maplist;
1090 int map_count;
1091 struct drm_open_hash map_hash;
1092
1093
1094
1095 struct list_head ctxlist;
1096 int ctx_count;
1097 struct mutex ctxlist_mutex;
1098
1099 struct idr ctx_idr;
1100
1101 struct list_head vmalist;
1102
1103
1104
1105
1106
1107 struct drm_device_dma *dma;
1108
1109
1110
1111
1112 int irq_enabled;
1113 __volatile__ long context_flag;
1114 __volatile__ long interrupt_flag;
1115 __volatile__ long dma_flag;
1116 wait_queue_head_t context_wait;
1117 int last_checked;
1118 int last_context;
1119 unsigned long last_switch;
1120
1121
1122 struct work_struct work;
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132 int vblank_disable_allowed;
1133
1134 wait_queue_head_t *vbl_queue;
1135 atomic_t *_vblank_count;
1136 struct timeval *_vblank_time;
1137 spinlock_t vblank_time_lock;
1138 spinlock_t vbl_lock;
1139 atomic_t *vblank_refcount;
1140 u32 *last_vblank;
1141
1142 int *vblank_enabled;
1143
1144 int *vblank_inmodeset;
1145 u32 *last_vblank_wait;
1146 struct timer_list vblank_disable_timer;
1147
1148 u32 max_vblank_count;
1149
1150
1151
1152
1153 struct list_head vblank_event_list;
1154 spinlock_t event_lock;
1155
1156
1157 cycles_t ctx_start;
1158 cycles_t lck_start;
1159
1160 struct fasync_struct *buf_async;
1161 wait_queue_head_t buf_readers;
1162 wait_queue_head_t buf_writers;
1163
1164 struct drm_agp_head *agp;
1165
1166 struct device *dev;
1167 struct pci_dev *pdev;
1168 int pci_vendor;
1169 int pci_device;
1170#ifdef __alpha__
1171 struct pci_controller *hose;
1172#endif
1173
1174 struct platform_device *platformdev;
1175 struct usb_device *usbdev;
1176
1177 struct drm_sg_mem *sg;
1178 unsigned int num_crtcs;
1179 void *dev_private;
1180 void *mm_private;
1181 struct address_space *dev_mapping;
1182 struct drm_sigdata sigdata;
1183 sigset_t sigmask;
1184
1185 struct drm_driver *driver;
1186 struct drm_local_map *agp_buffer_map;
1187 unsigned int agp_buffer_token;
1188 struct drm_minor *control;
1189 struct drm_minor *primary;
1190
1191 struct drm_mode_config mode_config;
1192
1193
1194
1195 spinlock_t object_name_lock;
1196 struct idr object_name_idr;
1197
1198 int switch_power_state;
1199
1200 atomic_t unplugged;
1201};
1202
1203#define DRM_SWITCH_POWER_ON 0
1204#define DRM_SWITCH_POWER_OFF 1
1205#define DRM_SWITCH_POWER_CHANGING 2
1206
1207static __inline__ int drm_core_check_feature(struct drm_device *dev,
1208 int feature)
1209{
1210 return ((dev->driver->driver_features & feature) ? 1 : 0);
1211}
1212
1213static inline int drm_dev_to_irq(struct drm_device *dev)
1214{
1215 return dev->driver->bus->get_irq(dev);
1216}
1217
1218
1219#if __OS_HAS_AGP
1220static inline int drm_core_has_AGP(struct drm_device *dev)
1221{
1222 return drm_core_check_feature(dev, DRIVER_USE_AGP);
1223}
1224#else
1225#define drm_core_has_AGP(dev) (0)
1226#endif
1227
1228#if __OS_HAS_MTRR
1229static inline int drm_core_has_MTRR(struct drm_device *dev)
1230{
1231 return drm_core_check_feature(dev, DRIVER_USE_MTRR);
1232}
1233
1234#define DRM_MTRR_WC MTRR_TYPE_WRCOMB
1235
1236static inline int drm_mtrr_add(unsigned long offset, unsigned long size,
1237 unsigned int flags)
1238{
1239 return mtrr_add(offset, size, flags, 1);
1240}
1241
1242static inline int drm_mtrr_del(int handle, unsigned long offset,
1243 unsigned long size, unsigned int flags)
1244{
1245 return mtrr_del(handle, offset, size);
1246}
1247
1248#else
1249#define drm_core_has_MTRR(dev) (0)
1250
1251#define DRM_MTRR_WC 0
1252
1253static inline int drm_mtrr_add(unsigned long offset, unsigned long size,
1254 unsigned int flags)
1255{
1256 return 0;
1257}
1258
1259static inline int drm_mtrr_del(int handle, unsigned long offset,
1260 unsigned long size, unsigned int flags)
1261{
1262 return 0;
1263}
1264#endif
1265
1266static inline void drm_device_set_unplugged(struct drm_device *dev)
1267{
1268 smp_wmb();
1269 atomic_set(&dev->unplugged, 1);
1270}
1271
1272static inline int drm_device_is_unplugged(struct drm_device *dev)
1273{
1274 int ret = atomic_read(&dev->unplugged);
1275 smp_rmb();
1276 return ret;
1277}
1278
1279
1280
1281
1282
1283
1284extern long drm_ioctl(struct file *filp,
1285 unsigned int cmd, unsigned long arg);
1286extern long drm_compat_ioctl(struct file *filp,
1287 unsigned int cmd, unsigned long arg);
1288extern int drm_lastclose(struct drm_device *dev);
1289
1290
1291extern struct mutex drm_global_mutex;
1292extern int drm_open(struct inode *inode, struct file *filp);
1293extern int drm_stub_open(struct inode *inode, struct file *filp);
1294extern int drm_fasync(int fd, struct file *filp, int on);
1295extern ssize_t drm_read(struct file *filp, char __user *buffer,
1296 size_t count, loff_t *offset);
1297extern int drm_release(struct inode *inode, struct file *filp);
1298
1299
1300extern int drm_mmap(struct file *filp, struct vm_area_struct *vma);
1301extern int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma);
1302extern void drm_vm_open_locked(struct drm_device *dev, struct vm_area_struct *vma);
1303extern void drm_vm_close_locked(struct drm_device *dev, struct vm_area_struct *vma);
1304extern unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait);
1305
1306
1307#include <drm/drm_memory.h>
1308extern void drm_free_agp(DRM_AGP_MEM * handle, int pages);
1309extern int drm_bind_agp(DRM_AGP_MEM * handle, unsigned int start);
1310extern DRM_AGP_MEM *drm_agp_bind_pages(struct drm_device *dev,
1311 struct page **pages,
1312 unsigned long num_pages,
1313 uint32_t gtt_offset,
1314 uint32_t type);
1315extern int drm_unbind_agp(DRM_AGP_MEM * handle);
1316
1317
1318extern int drm_irq_by_busid(struct drm_device *dev, void *data,
1319 struct drm_file *file_priv);
1320extern int drm_getunique(struct drm_device *dev, void *data,
1321 struct drm_file *file_priv);
1322extern int drm_setunique(struct drm_device *dev, void *data,
1323 struct drm_file *file_priv);
1324extern int drm_getmap(struct drm_device *dev, void *data,
1325 struct drm_file *file_priv);
1326extern int drm_getclient(struct drm_device *dev, void *data,
1327 struct drm_file *file_priv);
1328extern int drm_getstats(struct drm_device *dev, void *data,
1329 struct drm_file *file_priv);
1330extern int drm_getcap(struct drm_device *dev, void *data,
1331 struct drm_file *file_priv);
1332extern int drm_setversion(struct drm_device *dev, void *data,
1333 struct drm_file *file_priv);
1334extern int drm_noop(struct drm_device *dev, void *data,
1335 struct drm_file *file_priv);
1336
1337
1338extern int drm_resctx(struct drm_device *dev, void *data,
1339 struct drm_file *file_priv);
1340extern int drm_addctx(struct drm_device *dev, void *data,
1341 struct drm_file *file_priv);
1342extern int drm_modctx(struct drm_device *dev, void *data,
1343 struct drm_file *file_priv);
1344extern int drm_getctx(struct drm_device *dev, void *data,
1345 struct drm_file *file_priv);
1346extern int drm_switchctx(struct drm_device *dev, void *data,
1347 struct drm_file *file_priv);
1348extern int drm_newctx(struct drm_device *dev, void *data,
1349 struct drm_file *file_priv);
1350extern int drm_rmctx(struct drm_device *dev, void *data,
1351 struct drm_file *file_priv);
1352
1353extern int drm_ctxbitmap_init(struct drm_device *dev);
1354extern void drm_ctxbitmap_cleanup(struct drm_device *dev);
1355extern void drm_ctxbitmap_free(struct drm_device *dev, int ctx_handle);
1356
1357extern int drm_setsareactx(struct drm_device *dev, void *data,
1358 struct drm_file *file_priv);
1359extern int drm_getsareactx(struct drm_device *dev, void *data,
1360 struct drm_file *file_priv);
1361
1362
1363extern int drm_getmagic(struct drm_device *dev, void *data,
1364 struct drm_file *file_priv);
1365extern int drm_authmagic(struct drm_device *dev, void *data,
1366 struct drm_file *file_priv);
1367extern int drm_remove_magic(struct drm_master *master, drm_magic_t magic);
1368
1369
1370void drm_clflush_pages(struct page *pages[], unsigned long num_pages);
1371void drm_clflush_sg(struct sg_table *st);
1372void drm_clflush_virt_range(char *addr, unsigned long length);
1373
1374
1375extern int drm_lock(struct drm_device *dev, void *data,
1376 struct drm_file *file_priv);
1377extern int drm_unlock(struct drm_device *dev, void *data,
1378 struct drm_file *file_priv);
1379extern int drm_lock_free(struct drm_lock_data *lock_data, unsigned int context);
1380extern void drm_idlelock_take(struct drm_lock_data *lock_data);
1381extern void drm_idlelock_release(struct drm_lock_data *lock_data);
1382
1383
1384
1385
1386
1387
1388extern int drm_i_have_hw_lock(struct drm_device *dev, struct drm_file *file_priv);
1389
1390
1391extern int drm_addbufs_agp(struct drm_device *dev, struct drm_buf_desc * request);
1392extern int drm_addbufs_pci(struct drm_device *dev, struct drm_buf_desc * request);
1393extern int drm_addmap(struct drm_device *dev, resource_size_t offset,
1394 unsigned int size, enum drm_map_type type,
1395 enum drm_map_flags flags, struct drm_local_map **map_ptr);
1396extern int drm_addmap_ioctl(struct drm_device *dev, void *data,
1397 struct drm_file *file_priv);
1398extern int drm_rmmap(struct drm_device *dev, struct drm_local_map *map);
1399extern int drm_rmmap_locked(struct drm_device *dev, struct drm_local_map *map);
1400extern int drm_rmmap_ioctl(struct drm_device *dev, void *data,
1401 struct drm_file *file_priv);
1402extern int drm_addbufs(struct drm_device *dev, void *data,
1403 struct drm_file *file_priv);
1404extern int drm_infobufs(struct drm_device *dev, void *data,
1405 struct drm_file *file_priv);
1406extern int drm_markbufs(struct drm_device *dev, void *data,
1407 struct drm_file *file_priv);
1408extern int drm_freebufs(struct drm_device *dev, void *data,
1409 struct drm_file *file_priv);
1410extern int drm_mapbufs(struct drm_device *dev, void *data,
1411 struct drm_file *file_priv);
1412extern int drm_order(unsigned long size);
1413
1414
1415extern int drm_dma_setup(struct drm_device *dev);
1416extern void drm_dma_takedown(struct drm_device *dev);
1417extern void drm_free_buffer(struct drm_device *dev, struct drm_buf * buf);
1418extern void drm_core_reclaim_buffers(struct drm_device *dev,
1419 struct drm_file *filp);
1420
1421
1422extern int drm_control(struct drm_device *dev, void *data,
1423 struct drm_file *file_priv);
1424extern int drm_irq_install(struct drm_device *dev);
1425extern int drm_irq_uninstall(struct drm_device *dev);
1426
1427extern int drm_vblank_init(struct drm_device *dev, int num_crtcs);
1428extern int drm_wait_vblank(struct drm_device *dev, void *data,
1429 struct drm_file *filp);
1430extern int drm_vblank_wait(struct drm_device *dev, unsigned int *vbl_seq);
1431extern u32 drm_vblank_count(struct drm_device *dev, int crtc);
1432extern u32 drm_vblank_count_and_time(struct drm_device *dev, int crtc,
1433 struct timeval *vblanktime);
1434extern void drm_send_vblank_event(struct drm_device *dev, int crtc,
1435 struct drm_pending_vblank_event *e);
1436extern bool drm_handle_vblank(struct drm_device *dev, int crtc);
1437extern int drm_vblank_get(struct drm_device *dev, int crtc);
1438extern void drm_vblank_put(struct drm_device *dev, int crtc);
1439extern void drm_vblank_off(struct drm_device *dev, int crtc);
1440extern void drm_vblank_cleanup(struct drm_device *dev);
1441extern u32 drm_get_last_vbltimestamp(struct drm_device *dev, int crtc,
1442 struct timeval *tvblank, unsigned flags);
1443extern int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
1444 int crtc, int *max_error,
1445 struct timeval *vblank_time,
1446 unsigned flags,
1447 struct drm_crtc *refcrtc);
1448extern void drm_calc_timestamping_constants(struct drm_crtc *crtc);
1449
1450extern bool
1451drm_mode_parse_command_line_for_connector(const char *mode_option,
1452 struct drm_connector *connector,
1453 struct drm_cmdline_mode *mode);
1454
1455extern struct drm_display_mode *
1456drm_mode_create_from_cmdline_mode(struct drm_device *dev,
1457 struct drm_cmdline_mode *cmd);
1458
1459
1460extern void drm_vblank_pre_modeset(struct drm_device *dev, int crtc);
1461extern void drm_vblank_post_modeset(struct drm_device *dev, int crtc);
1462extern int drm_modeset_ctl(struct drm_device *dev, void *data,
1463 struct drm_file *file_priv);
1464
1465
1466extern struct drm_agp_head *drm_agp_init(struct drm_device *dev);
1467extern int drm_agp_acquire(struct drm_device *dev);
1468extern int drm_agp_acquire_ioctl(struct drm_device *dev, void *data,
1469 struct drm_file *file_priv);
1470extern int drm_agp_release(struct drm_device *dev);
1471extern int drm_agp_release_ioctl(struct drm_device *dev, void *data,
1472 struct drm_file *file_priv);
1473extern int drm_agp_enable(struct drm_device *dev, struct drm_agp_mode mode);
1474extern int drm_agp_enable_ioctl(struct drm_device *dev, void *data,
1475 struct drm_file *file_priv);
1476extern int drm_agp_info(struct drm_device *dev, struct drm_agp_info *info);
1477extern int drm_agp_info_ioctl(struct drm_device *dev, void *data,
1478 struct drm_file *file_priv);
1479extern int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request);
1480extern int drm_agp_alloc_ioctl(struct drm_device *dev, void *data,
1481 struct drm_file *file_priv);
1482extern int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request);
1483extern int drm_agp_free_ioctl(struct drm_device *dev, void *data,
1484 struct drm_file *file_priv);
1485extern int drm_agp_unbind(struct drm_device *dev, struct drm_agp_binding *request);
1486extern int drm_agp_unbind_ioctl(struct drm_device *dev, void *data,
1487 struct drm_file *file_priv);
1488extern int drm_agp_bind(struct drm_device *dev, struct drm_agp_binding *request);
1489extern int drm_agp_bind_ioctl(struct drm_device *dev, void *data,
1490 struct drm_file *file_priv);
1491
1492
1493extern int drm_setmaster_ioctl(struct drm_device *dev, void *data,
1494 struct drm_file *file_priv);
1495extern int drm_dropmaster_ioctl(struct drm_device *dev, void *data,
1496 struct drm_file *file_priv);
1497struct drm_master *drm_master_create(struct drm_minor *minor);
1498extern struct drm_master *drm_master_get(struct drm_master *master);
1499extern void drm_master_put(struct drm_master **master);
1500
1501extern void drm_put_dev(struct drm_device *dev);
1502extern int drm_put_minor(struct drm_minor **minor);
1503extern void drm_unplug_dev(struct drm_device *dev);
1504extern unsigned int drm_debug;
1505
1506extern unsigned int drm_vblank_offdelay;
1507extern unsigned int drm_timestamp_precision;
1508extern unsigned int drm_timestamp_monotonic;
1509
1510extern struct class *drm_class;
1511extern struct proc_dir_entry *drm_proc_root;
1512extern struct dentry *drm_debugfs_root;
1513
1514extern struct idr drm_minors_idr;
1515
1516extern struct drm_local_map *drm_getsarea(struct drm_device *dev);
1517
1518
1519extern int drm_proc_init(struct drm_minor *minor, int minor_id,
1520 struct proc_dir_entry *root);
1521extern int drm_proc_cleanup(struct drm_minor *minor, struct proc_dir_entry *root);
1522
1523
1524#if defined(CONFIG_DEBUG_FS)
1525extern int drm_debugfs_init(struct drm_minor *minor, int minor_id,
1526 struct dentry *root);
1527extern int drm_debugfs_create_files(struct drm_info_list *files, int count,
1528 struct dentry *root, struct drm_minor *minor);
1529extern int drm_debugfs_remove_files(struct drm_info_list *files, int count,
1530 struct drm_minor *minor);
1531extern int drm_debugfs_cleanup(struct drm_minor *minor);
1532#endif
1533
1534
1535extern int drm_name_info(struct seq_file *m, void *data);
1536extern int drm_vm_info(struct seq_file *m, void *data);
1537extern int drm_bufs_info(struct seq_file *m, void *data);
1538extern int drm_vblank_info(struct seq_file *m, void *data);
1539extern int drm_clients_info(struct seq_file *m, void* data);
1540extern int drm_gem_name_info(struct seq_file *m, void *data);
1541
1542
1543extern int drm_gem_prime_handle_to_fd(struct drm_device *dev,
1544 struct drm_file *file_priv, uint32_t handle, uint32_t flags,
1545 int *prime_fd);
1546extern int drm_gem_prime_fd_to_handle(struct drm_device *dev,
1547 struct drm_file *file_priv, int prime_fd, uint32_t *handle);
1548
1549extern int drm_prime_handle_to_fd_ioctl(struct drm_device *dev, void *data,
1550 struct drm_file *file_priv);
1551extern int drm_prime_fd_to_handle_ioctl(struct drm_device *dev, void *data,
1552 struct drm_file *file_priv);
1553
1554extern int drm_prime_sg_to_page_addr_arrays(struct sg_table *sgt, struct page **pages,
1555 dma_addr_t *addrs, int max_pages);
1556extern struct sg_table *drm_prime_pages_to_sg(struct page **pages, int nr_pages);
1557extern void drm_prime_gem_destroy(struct drm_gem_object *obj, struct sg_table *sg);
1558
1559
1560void drm_prime_init_file_private(struct drm_prime_file_private *prime_fpriv);
1561void drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv);
1562int drm_prime_add_imported_buf_handle(struct drm_prime_file_private *prime_fpriv, struct dma_buf *dma_buf, uint32_t handle);
1563int drm_prime_lookup_imported_buf_handle(struct drm_prime_file_private *prime_fpriv, struct dma_buf *dma_buf, uint32_t *handle);
1564void drm_prime_remove_imported_buf_handle(struct drm_prime_file_private *prime_fpriv, struct dma_buf *dma_buf);
1565
1566int drm_prime_add_dma_buf(struct drm_device *dev, struct drm_gem_object *obj);
1567int drm_prime_lookup_obj(struct drm_device *dev, struct dma_buf *buf,
1568 struct drm_gem_object **obj);
1569
1570#if DRM_DEBUG_CODE
1571extern int drm_vma_info(struct seq_file *m, void *data);
1572#endif
1573
1574
1575extern void drm_sg_cleanup(struct drm_sg_mem * entry);
1576extern int drm_sg_alloc_ioctl(struct drm_device *dev, void *data,
1577 struct drm_file *file_priv);
1578extern int drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather * request);
1579extern int drm_sg_free(struct drm_device *dev, void *data,
1580 struct drm_file *file_priv);
1581
1582
1583extern int drm_ati_pcigart_init(struct drm_device *dev,
1584 struct drm_ati_pcigart_info * gart_info);
1585extern int drm_ati_pcigart_cleanup(struct drm_device *dev,
1586 struct drm_ati_pcigart_info * gart_info);
1587
1588extern drm_dma_handle_t *drm_pci_alloc(struct drm_device *dev, size_t size,
1589 size_t align);
1590extern void __drm_pci_free(struct drm_device *dev, drm_dma_handle_t * dmah);
1591extern void drm_pci_free(struct drm_device *dev, drm_dma_handle_t * dmah);
1592
1593
1594struct drm_sysfs_class;
1595extern struct class *drm_sysfs_create(struct module *owner, char *name);
1596extern void drm_sysfs_destroy(void);
1597extern int drm_sysfs_device_add(struct drm_minor *minor);
1598extern void drm_sysfs_hotplug_event(struct drm_device *dev);
1599extern void drm_sysfs_device_remove(struct drm_minor *minor);
1600extern char *drm_get_connector_status_name(enum drm_connector_status status);
1601extern int drm_sysfs_connector_add(struct drm_connector *connector);
1602extern void drm_sysfs_connector_remove(struct drm_connector *connector);
1603
1604
1605int drm_gem_init(struct drm_device *dev);
1606void drm_gem_destroy(struct drm_device *dev);
1607void drm_gem_object_release(struct drm_gem_object *obj);
1608void drm_gem_object_free(struct kref *kref);
1609struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev,
1610 size_t size);
1611int drm_gem_object_init(struct drm_device *dev,
1612 struct drm_gem_object *obj, size_t size);
1613int drm_gem_private_object_init(struct drm_device *dev,
1614 struct drm_gem_object *obj, size_t size);
1615void drm_gem_object_handle_free(struct drm_gem_object *obj);
1616void drm_gem_vm_open(struct vm_area_struct *vma);
1617void drm_gem_vm_close(struct vm_area_struct *vma);
1618int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
1619
1620#include <drm/drm_global.h>
1621
1622static inline void
1623drm_gem_object_reference(struct drm_gem_object *obj)
1624{
1625 kref_get(&obj->refcount);
1626}
1627
1628static inline void
1629drm_gem_object_unreference(struct drm_gem_object *obj)
1630{
1631 if (obj != NULL)
1632 kref_put(&obj->refcount, drm_gem_object_free);
1633}
1634
1635static inline void
1636drm_gem_object_unreference_unlocked(struct drm_gem_object *obj)
1637{
1638 if (obj != NULL) {
1639 struct drm_device *dev = obj->dev;
1640 mutex_lock(&dev->struct_mutex);
1641 kref_put(&obj->refcount, drm_gem_object_free);
1642 mutex_unlock(&dev->struct_mutex);
1643 }
1644}
1645
1646int drm_gem_handle_create(struct drm_file *file_priv,
1647 struct drm_gem_object *obj,
1648 u32 *handlep);
1649int drm_gem_handle_delete(struct drm_file *filp, u32 handle);
1650
1651static inline void
1652drm_gem_object_handle_reference(struct drm_gem_object *obj)
1653{
1654 drm_gem_object_reference(obj);
1655 atomic_inc(&obj->handle_count);
1656}
1657
1658static inline void
1659drm_gem_object_handle_unreference(struct drm_gem_object *obj)
1660{
1661 if (obj == NULL)
1662 return;
1663
1664 if (atomic_read(&obj->handle_count) == 0)
1665 return;
1666
1667
1668
1669
1670
1671 if (atomic_dec_and_test(&obj->handle_count))
1672 drm_gem_object_handle_free(obj);
1673 drm_gem_object_unreference(obj);
1674}
1675
1676static inline void
1677drm_gem_object_handle_unreference_unlocked(struct drm_gem_object *obj)
1678{
1679 if (obj == NULL)
1680 return;
1681
1682 if (atomic_read(&obj->handle_count) == 0)
1683 return;
1684
1685
1686
1687
1688
1689
1690
1691 if (atomic_dec_and_test(&obj->handle_count))
1692 drm_gem_object_handle_free(obj);
1693 drm_gem_object_unreference_unlocked(obj);
1694}
1695
1696void drm_gem_free_mmap_offset(struct drm_gem_object *obj);
1697int drm_gem_create_mmap_offset(struct drm_gem_object *obj);
1698
1699struct drm_gem_object *drm_gem_object_lookup(struct drm_device *dev,
1700 struct drm_file *filp,
1701 u32 handle);
1702int drm_gem_close_ioctl(struct drm_device *dev, void *data,
1703 struct drm_file *file_priv);
1704int drm_gem_flink_ioctl(struct drm_device *dev, void *data,
1705 struct drm_file *file_priv);
1706int drm_gem_open_ioctl(struct drm_device *dev, void *data,
1707 struct drm_file *file_priv);
1708void drm_gem_open(struct drm_device *dev, struct drm_file *file_private);
1709void drm_gem_release(struct drm_device *dev, struct drm_file *file_private);
1710
1711extern void drm_core_ioremap(struct drm_local_map *map, struct drm_device *dev);
1712extern void drm_core_ioremap_wc(struct drm_local_map *map, struct drm_device *dev);
1713extern void drm_core_ioremapfree(struct drm_local_map *map, struct drm_device *dev);
1714
1715static __inline__ struct drm_local_map *drm_core_findmap(struct drm_device *dev,
1716 unsigned int token)
1717{
1718 struct drm_map_list *_entry;
1719 list_for_each_entry(_entry, &dev->maplist, head)
1720 if (_entry->user_token == token)
1721 return _entry->map;
1722 return NULL;
1723}
1724
1725static __inline__ void drm_core_dropmap(struct drm_local_map *map)
1726{
1727}
1728
1729#include <drm/drm_mem_util.h>
1730
1731extern int drm_fill_in_dev(struct drm_device *dev,
1732 const struct pci_device_id *ent,
1733 struct drm_driver *driver);
1734int drm_get_minor(struct drm_device *dev, struct drm_minor **minor, int type);
1735
1736
1737
1738static __inline__ int drm_pci_device_is_agp(struct drm_device *dev)
1739{
1740 if (dev->driver->device_is_agp != NULL) {
1741 int err = (*dev->driver->device_is_agp) (dev);
1742
1743 if (err != 2) {
1744 return err;
1745 }
1746 }
1747
1748 return pci_find_capability(dev->pdev, PCI_CAP_ID_AGP);
1749}
1750
1751extern int drm_pci_init(struct drm_driver *driver, struct pci_driver *pdriver);
1752extern void drm_pci_exit(struct drm_driver *driver, struct pci_driver *pdriver);
1753extern int drm_get_pci_dev(struct pci_dev *pdev,
1754 const struct pci_device_id *ent,
1755 struct drm_driver *driver);
1756
1757#define DRM_PCIE_SPEED_25 1
1758#define DRM_PCIE_SPEED_50 2
1759#define DRM_PCIE_SPEED_80 4
1760
1761extern int drm_pcie_get_speed_cap_mask(struct drm_device *dev, u32 *speed_mask);
1762
1763
1764extern int drm_platform_init(struct drm_driver *driver, struct platform_device *platform_device);
1765extern void drm_platform_exit(struct drm_driver *driver, struct platform_device *platform_device);
1766
1767extern int drm_get_platform_dev(struct platform_device *pdev,
1768 struct drm_driver *driver);
1769
1770
1771static __inline__ bool drm_can_sleep(void)
1772{
1773 if (in_atomic() || in_dbg_master() || irqs_disabled())
1774 return false;
1775 return true;
1776}
1777
1778#endif
1779#endif
1780