diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/drm/Kbuild | 2 | ||||
-rw-r--r-- | include/drm/drm.h | 24 | ||||
-rw-r--r-- | include/drm/drmP.h | 108 | ||||
-rw-r--r-- | include/drm/drm_crtc.h | 733 | ||||
-rw-r--r-- | include/drm/drm_crtc_helper.h | 124 | ||||
-rw-r--r-- | include/drm/drm_edid.h | 202 | ||||
-rw-r--r-- | include/drm/drm_mode.h | 271 | ||||
-rw-r--r-- | include/drm/drm_sarea.h | 6 | ||||
-rw-r--r-- | include/drm/i915_drm.h | 41 | ||||
-rw-r--r-- | include/linux/console.h | 4 |
10 files changed, 1494 insertions, 21 deletions
diff --git a/include/drm/Kbuild b/include/drm/Kbuild index 82b6983b7fbb..b940fdfa3b25 100644 --- a/include/drm/Kbuild +++ b/include/drm/Kbuild | |||
@@ -1,4 +1,4 @@ | |||
1 | unifdef-y += drm.h drm_sarea.h | 1 | unifdef-y += drm.h drm_sarea.h drm_mode.h |
2 | unifdef-y += i810_drm.h | 2 | unifdef-y += i810_drm.h |
3 | unifdef-y += i830_drm.h | 3 | unifdef-y += i830_drm.h |
4 | unifdef-y += i915_drm.h | 4 | unifdef-y += i915_drm.h |
diff --git a/include/drm/drm.h b/include/drm/drm.h index f46ba4b57da4..32e5096554e9 100644 --- a/include/drm/drm.h +++ b/include/drm/drm.h | |||
@@ -173,6 +173,7 @@ enum drm_map_type { | |||
173 | _DRM_AGP = 3, /**< AGP/GART */ | 173 | _DRM_AGP = 3, /**< AGP/GART */ |
174 | _DRM_SCATTER_GATHER = 4, /**< Scatter/gather memory for PCI DMA */ | 174 | _DRM_SCATTER_GATHER = 4, /**< Scatter/gather memory for PCI DMA */ |
175 | _DRM_CONSISTENT = 5, /**< Consistent memory for PCI DMA */ | 175 | _DRM_CONSISTENT = 5, /**< Consistent memory for PCI DMA */ |
176 | _DRM_GEM = 6, /**< GEM object */ | ||
176 | }; | 177 | }; |
177 | 178 | ||
178 | /** | 179 | /** |
@@ -598,6 +599,8 @@ struct drm_gem_open { | |||
598 | uint64_t size; | 599 | uint64_t size; |
599 | }; | 600 | }; |
600 | 601 | ||
602 | #include "drm_mode.h" | ||
603 | |||
601 | #define DRM_IOCTL_BASE 'd' | 604 | #define DRM_IOCTL_BASE 'd' |
602 | #define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr) | 605 | #define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr) |
603 | #define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE,nr,type) | 606 | #define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE,nr,type) |
@@ -634,6 +637,9 @@ struct drm_gem_open { | |||
634 | #define DRM_IOCTL_SET_SAREA_CTX DRM_IOW( 0x1c, struct drm_ctx_priv_map) | 637 | #define DRM_IOCTL_SET_SAREA_CTX DRM_IOW( 0x1c, struct drm_ctx_priv_map) |
635 | #define DRM_IOCTL_GET_SAREA_CTX DRM_IOWR(0x1d, struct drm_ctx_priv_map) | 638 | #define DRM_IOCTL_GET_SAREA_CTX DRM_IOWR(0x1d, struct drm_ctx_priv_map) |
636 | 639 | ||
640 | #define DRM_IOCTL_SET_MASTER DRM_IO(0x1e) | ||
641 | #define DRM_IOCTL_DROP_MASTER DRM_IO(0x1f) | ||
642 | |||
637 | #define DRM_IOCTL_ADD_CTX DRM_IOWR(0x20, struct drm_ctx) | 643 | #define DRM_IOCTL_ADD_CTX DRM_IOWR(0x20, struct drm_ctx) |
638 | #define DRM_IOCTL_RM_CTX DRM_IOWR(0x21, struct drm_ctx) | 644 | #define DRM_IOCTL_RM_CTX DRM_IOWR(0x21, struct drm_ctx) |
639 | #define DRM_IOCTL_MOD_CTX DRM_IOW( 0x22, struct drm_ctx) | 645 | #define DRM_IOCTL_MOD_CTX DRM_IOW( 0x22, struct drm_ctx) |
@@ -664,6 +670,24 @@ struct drm_gem_open { | |||
664 | 670 | ||
665 | #define DRM_IOCTL_UPDATE_DRAW DRM_IOW(0x3f, struct drm_update_draw) | 671 | #define DRM_IOCTL_UPDATE_DRAW DRM_IOW(0x3f, struct drm_update_draw) |
666 | 672 | ||
673 | #define DRM_IOCTL_MODE_GETRESOURCES DRM_IOWR(0xA0, struct drm_mode_card_res) | ||
674 | #define DRM_IOCTL_MODE_GETCRTC DRM_IOWR(0xA1, struct drm_mode_crtc) | ||
675 | #define DRM_IOCTL_MODE_SETCRTC DRM_IOWR(0xA2, struct drm_mode_crtc) | ||
676 | #define DRM_IOCTL_MODE_CURSOR DRM_IOWR(0xA3, struct drm_mode_cursor) | ||
677 | #define DRM_IOCTL_MODE_GETGAMMA DRM_IOWR(0xA4, struct drm_mode_crtc_lut) | ||
678 | #define DRM_IOCTL_MODE_SETGAMMA DRM_IOWR(0xA5, struct drm_mode_crtc_lut) | ||
679 | #define DRM_IOCTL_MODE_GETENCODER DRM_IOWR(0xA6, struct drm_mode_get_encoder) | ||
680 | #define DRM_IOCTL_MODE_GETCONNECTOR DRM_IOWR(0xA7, struct drm_mode_get_connector) | ||
681 | #define DRM_IOCTL_MODE_ATTACHMODE DRM_IOWR(0xA8, struct drm_mode_mode_cmd) | ||
682 | #define DRM_IOCTL_MODE_DETACHMODE DRM_IOWR(0xA9, struct drm_mode_mode_cmd) | ||
683 | |||
684 | #define DRM_IOCTL_MODE_GETPROPERTY DRM_IOWR(0xAA, struct drm_mode_get_property) | ||
685 | #define DRM_IOCTL_MODE_SETPROPERTY DRM_IOWR(0xAB, struct drm_mode_connector_set_property) | ||
686 | #define DRM_IOCTL_MODE_GETPROPBLOB DRM_IOWR(0xAC, struct drm_mode_get_blob) | ||
687 | #define DRM_IOCTL_MODE_GETFB DRM_IOWR(0xAD, struct drm_mode_fb_cmd) | ||
688 | #define DRM_IOCTL_MODE_ADDFB DRM_IOWR(0xAE, struct drm_mode_fb_cmd) | ||
689 | #define DRM_IOCTL_MODE_RMFB DRM_IOWR(0xAF, unsigned int) | ||
690 | |||
667 | /** | 691 | /** |
668 | * Device specific ioctls should only be in their respective headers | 692 | * Device specific ioctls should only be in their respective headers |
669 | * The device specific ioctl range is from 0x40 to 0x99. | 693 | * The device specific ioctl range is from 0x40 to 0x99. |
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index d5e8e5c89548..afb7858c068d 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h | |||
@@ -105,6 +105,7 @@ struct drm_device; | |||
105 | #define DRIVER_FB_DMA 0x400 | 105 | #define DRIVER_FB_DMA 0x400 |
106 | #define DRIVER_IRQ_VBL2 0x800 | 106 | #define DRIVER_IRQ_VBL2 0x800 |
107 | #define DRIVER_GEM 0x1000 | 107 | #define DRIVER_GEM 0x1000 |
108 | #define DRIVER_MODESET 0x2000 | ||
108 | 109 | ||
109 | /***********************************************************************/ | 110 | /***********************************************************************/ |
110 | /** \name Begin the DRM... */ | 111 | /** \name Begin the DRM... */ |
@@ -238,11 +239,11 @@ struct drm_device; | |||
238 | */ | 239 | */ |
239 | #define LOCK_TEST_WITH_RETURN( dev, file_priv ) \ | 240 | #define LOCK_TEST_WITH_RETURN( dev, file_priv ) \ |
240 | do { \ | 241 | do { \ |
241 | if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) || \ | 242 | if (!_DRM_LOCK_IS_HELD(file_priv->master->lock.hw_lock->lock) || \ |
242 | dev->lock.file_priv != file_priv ) { \ | 243 | file_priv->master->lock.file_priv != file_priv) { \ |
243 | DRM_ERROR( "%s called without lock held, held %d owner %p %p\n",\ | 244 | DRM_ERROR( "%s called without lock held, held %d owner %p %p\n",\ |
244 | __func__, _DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ),\ | 245 | __func__, _DRM_LOCK_IS_HELD(file_priv->master->lock.hw_lock->lock),\ |
245 | dev->lock.file_priv, file_priv ); \ | 246 | file_priv->master->lock.file_priv, file_priv); \ |
246 | return -EINVAL; \ | 247 | return -EINVAL; \ |
247 | } \ | 248 | } \ |
248 | } while (0) | 249 | } while (0) |
@@ -276,6 +277,7 @@ typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd, | |||
276 | #define DRM_AUTH 0x1 | 277 | #define DRM_AUTH 0x1 |
277 | #define DRM_MASTER 0x2 | 278 | #define DRM_MASTER 0x2 |
278 | #define DRM_ROOT_ONLY 0x4 | 279 | #define DRM_ROOT_ONLY 0x4 |
280 | #define DRM_CONTROL_ALLOW 0x8 | ||
279 | 281 | ||
280 | struct drm_ioctl_desc { | 282 | struct drm_ioctl_desc { |
281 | unsigned int cmd; | 283 | unsigned int cmd; |
@@ -379,21 +381,26 @@ struct drm_buf_entry { | |||
379 | /** File private data */ | 381 | /** File private data */ |
380 | struct drm_file { | 382 | struct drm_file { |
381 | int authenticated; | 383 | int authenticated; |
382 | int master; | ||
383 | pid_t pid; | 384 | pid_t pid; |
384 | uid_t uid; | 385 | uid_t uid; |
385 | drm_magic_t magic; | 386 | drm_magic_t magic; |
386 | unsigned long ioctl_count; | 387 | unsigned long ioctl_count; |
387 | struct list_head lhead; | 388 | struct list_head lhead; |
388 | struct drm_minor *minor; | 389 | struct drm_minor *minor; |
389 | int remove_auth_on_close; | ||
390 | unsigned long lock_count; | 390 | unsigned long lock_count; |
391 | |||
391 | /** Mapping of mm object handles to object pointers. */ | 392 | /** Mapping of mm object handles to object pointers. */ |
392 | struct idr object_idr; | 393 | struct idr object_idr; |
393 | /** Lock for synchronization of access to object_idr. */ | 394 | /** Lock for synchronization of access to object_idr. */ |
394 | spinlock_t table_lock; | 395 | spinlock_t table_lock; |
396 | |||
395 | struct file *filp; | 397 | struct file *filp; |
396 | void *driver_priv; | 398 | void *driver_priv; |
399 | |||
400 | int is_master; /* this file private is a master for a minor */ | ||
401 | struct drm_master *master; /* master this node is currently associated with | ||
402 | N.B. not always minor->master */ | ||
403 | struct list_head fbs; | ||
397 | }; | 404 | }; |
398 | 405 | ||
399 | /** Wait queue */ | 406 | /** Wait queue */ |
@@ -523,6 +530,8 @@ struct drm_map_list { | |||
523 | struct drm_hash_item hash; | 530 | struct drm_hash_item hash; |
524 | struct drm_map *map; /**< mapping */ | 531 | struct drm_map *map; /**< mapping */ |
525 | uint64_t user_token; | 532 | uint64_t user_token; |
533 | struct drm_master *master; | ||
534 | struct drm_mm_node *file_offset_node; /**< fake offset */ | ||
526 | }; | 535 | }; |
527 | 536 | ||
528 | typedef struct drm_map drm_local_map_t; | 537 | typedef struct drm_map drm_local_map_t; |
@@ -563,6 +572,14 @@ struct drm_ati_pcigart_info { | |||
563 | }; | 572 | }; |
564 | 573 | ||
565 | /** | 574 | /** |
575 | * GEM specific mm private for tracking GEM objects | ||
576 | */ | ||
577 | struct drm_gem_mm { | ||
578 | struct drm_mm offset_manager; /**< Offset mgmt for buffer objects */ | ||
579 | struct drm_open_hash offset_hash; /**< User token hash table for maps */ | ||
580 | }; | ||
581 | |||
582 | /** | ||
566 | * This structure defines the drm_mm memory object, which will be used by the | 583 | * This structure defines the drm_mm memory object, which will be used by the |
567 | * DRM for its buffer objects. | 584 | * DRM for its buffer objects. |
568 | */ | 585 | */ |
@@ -579,6 +596,9 @@ struct drm_gem_object { | |||
579 | /** File representing the shmem storage */ | 596 | /** File representing the shmem storage */ |
580 | struct file *filp; | 597 | struct file *filp; |
581 | 598 | ||
599 | /* Mapping info for this object */ | ||
600 | struct drm_map_list map_list; | ||
601 | |||
582 | /** | 602 | /** |
583 | * Size of the object, in bytes. Immutable over the object's | 603 | * Size of the object, in bytes. Immutable over the object's |
584 | * lifetime. | 604 | * lifetime. |
@@ -612,6 +632,33 @@ struct drm_gem_object { | |||
612 | void *driver_private; | 632 | void *driver_private; |
613 | }; | 633 | }; |
614 | 634 | ||
635 | #include "drm_crtc.h" | ||
636 | |||
637 | /* per-master structure */ | ||
638 | struct drm_master { | ||
639 | |||
640 | struct kref refcount; /* refcount for this master */ | ||
641 | |||
642 | struct list_head head; /**< each minor contains a list of masters */ | ||
643 | struct drm_minor *minor; /**< link back to minor we are a master for */ | ||
644 | |||
645 | char *unique; /**< Unique identifier: e.g., busid */ | ||
646 | int unique_len; /**< Length of unique field */ | ||
647 | int unique_size; /**< amount allocated */ | ||
648 | |||
649 | int blocked; /**< Blocked due to VC switch? */ | ||
650 | |||
651 | /** \name Authentication */ | ||
652 | /*@{ */ | ||
653 | struct drm_open_hash magiclist; | ||
654 | struct list_head magicfree; | ||
655 | /*@} */ | ||
656 | |||
657 | struct drm_lock_data lock; /**< Information on hardware lock */ | ||
658 | |||
659 | void *driver_priv; /**< Private structure for driver to use */ | ||
660 | }; | ||
661 | |||
615 | /** | 662 | /** |
616 | * DRM driver structure. This structure represent the common code for | 663 | * DRM driver structure. This structure represent the common code for |
617 | * a family of cards. There will one drm_device for each card present | 664 | * a family of cards. There will one drm_device for each card present |
@@ -712,6 +759,10 @@ struct drm_driver { | |||
712 | void (*set_version) (struct drm_device *dev, | 759 | void (*set_version) (struct drm_device *dev, |
713 | struct drm_set_version *sv); | 760 | struct drm_set_version *sv); |
714 | 761 | ||
762 | /* Master routines */ | ||
763 | int (*master_create)(struct drm_device *dev, struct drm_master *master); | ||
764 | void (*master_destroy)(struct drm_device *dev, struct drm_master *master); | ||
765 | |||
715 | int (*proc_init)(struct drm_minor *minor); | 766 | int (*proc_init)(struct drm_minor *minor); |
716 | void (*proc_cleanup)(struct drm_minor *minor); | 767 | void (*proc_cleanup)(struct drm_minor *minor); |
717 | 768 | ||
@@ -724,6 +775,9 @@ struct drm_driver { | |||
724 | int (*gem_init_object) (struct drm_gem_object *obj); | 775 | int (*gem_init_object) (struct drm_gem_object *obj); |
725 | void (*gem_free_object) (struct drm_gem_object *obj); | 776 | void (*gem_free_object) (struct drm_gem_object *obj); |
726 | 777 | ||
778 | /* Driver private ops for this object */ | ||
779 | struct vm_operations_struct *gem_vm_ops; | ||
780 | |||
727 | int major; | 781 | int major; |
728 | int minor; | 782 | int minor; |
729 | int patchlevel; | 783 | int patchlevel; |
@@ -737,10 +791,14 @@ struct drm_driver { | |||
737 | int num_ioctls; | 791 | int num_ioctls; |
738 | struct file_operations fops; | 792 | struct file_operations fops; |
739 | struct pci_driver pci_driver; | 793 | struct pci_driver pci_driver; |
794 | /* List of devices hanging off this driver */ | ||
795 | struct list_head device_list; | ||
740 | }; | 796 | }; |
741 | 797 | ||
742 | #define DRM_MINOR_UNASSIGNED 0 | 798 | #define DRM_MINOR_UNASSIGNED 0 |
743 | #define DRM_MINOR_LEGACY 1 | 799 | #define DRM_MINOR_LEGACY 1 |
800 | #define DRM_MINOR_CONTROL 2 | ||
801 | #define DRM_MINOR_RENDER 3 | ||
744 | 802 | ||
745 | /** | 803 | /** |
746 | * DRM minor structure. This structure represents a drm minor number. | 804 | * DRM minor structure. This structure represents a drm minor number. |
@@ -752,6 +810,9 @@ struct drm_minor { | |||
752 | struct device kdev; /**< Linux device */ | 810 | struct device kdev; /**< Linux device */ |
753 | struct drm_device *dev; | 811 | struct drm_device *dev; |
754 | struct proc_dir_entry *dev_root; /**< proc directory entry */ | 812 | struct proc_dir_entry *dev_root; /**< proc directory entry */ |
813 | struct drm_master *master; /* currently active master for this node */ | ||
814 | struct list_head master_list; | ||
815 | struct drm_mode_group mode_group; | ||
755 | }; | 816 | }; |
756 | 817 | ||
757 | /** | 818 | /** |
@@ -759,13 +820,10 @@ struct drm_minor { | |||
759 | * may contain multiple heads. | 820 | * may contain multiple heads. |
760 | */ | 821 | */ |
761 | struct drm_device { | 822 | struct drm_device { |
762 | char *unique; /**< Unique identifier: e.g., busid */ | 823 | struct list_head driver_item; /**< list of devices per driver */ |
763 | int unique_len; /**< Length of unique field */ | ||
764 | char *devname; /**< For /proc/interrupts */ | 824 | char *devname; /**< For /proc/interrupts */ |
765 | int if_version; /**< Highest interface version set */ | 825 | int if_version; /**< Highest interface version set */ |
766 | 826 | ||
767 | int blocked; /**< Blocked due to VC switch? */ | ||
768 | |||
769 | /** \name Locks */ | 827 | /** \name Locks */ |
770 | /*@{ */ | 828 | /*@{ */ |
771 | spinlock_t count_lock; /**< For inuse, drm_device::open_count, drm_device::buf_use */ | 829 | spinlock_t count_lock; /**< For inuse, drm_device::open_count, drm_device::buf_use */ |
@@ -788,12 +846,7 @@ struct drm_device { | |||
788 | atomic_t counts[15]; | 846 | atomic_t counts[15]; |
789 | /*@} */ | 847 | /*@} */ |
790 | 848 | ||
791 | /** \name Authentication */ | ||
792 | /*@{ */ | ||
793 | struct list_head filelist; | 849 | struct list_head filelist; |
794 | struct drm_open_hash magiclist; /**< magic hash table */ | ||
795 | struct list_head magicfree; | ||
796 | /*@} */ | ||
797 | 850 | ||
798 | /** \name Memory management */ | 851 | /** \name Memory management */ |
799 | /*@{ */ | 852 | /*@{ */ |
@@ -810,7 +863,7 @@ struct drm_device { | |||
810 | struct idr ctx_idr; | 863 | struct idr ctx_idr; |
811 | 864 | ||
812 | struct list_head vmalist; /**< List of vmas (for debugging) */ | 865 | struct list_head vmalist; /**< List of vmas (for debugging) */ |
813 | struct drm_lock_data lock; /**< Information on hardware lock */ | 866 | |
814 | /*@} */ | 867 | /*@} */ |
815 | 868 | ||
816 | /** \name DMA queues (contexts) */ | 869 | /** \name DMA queues (contexts) */ |
@@ -858,6 +911,7 @@ struct drm_device { | |||
858 | int *vblank_enabled; /* so we don't call enable more than | 911 | int *vblank_enabled; /* so we don't call enable more than |
859 | once per disable */ | 912 | once per disable */ |
860 | int *vblank_inmodeset; /* Display driver is setting mode */ | 913 | int *vblank_inmodeset; /* Display driver is setting mode */ |
914 | u32 *last_vblank_wait; /* Last vblank seqno waited per CRTC */ | ||
861 | struct timer_list vblank_disable_timer; | 915 | struct timer_list vblank_disable_timer; |
862 | 916 | ||
863 | u32 max_vblank_count; /**< size of vblank counter register */ | 917 | u32 max_vblank_count; /**< size of vblank counter register */ |
@@ -881,12 +935,15 @@ struct drm_device { | |||
881 | struct drm_sg_mem *sg; /**< Scatter gather memory */ | 935 | struct drm_sg_mem *sg; /**< Scatter gather memory */ |
882 | int num_crtcs; /**< Number of CRTCs on this device */ | 936 | int num_crtcs; /**< Number of CRTCs on this device */ |
883 | void *dev_private; /**< device private data */ | 937 | void *dev_private; /**< device private data */ |
938 | void *mm_private; | ||
939 | struct address_space *dev_mapping; | ||
884 | struct drm_sigdata sigdata; /**< For block_all_signals */ | 940 | struct drm_sigdata sigdata; /**< For block_all_signals */ |
885 | sigset_t sigmask; | 941 | sigset_t sigmask; |
886 | 942 | ||
887 | struct drm_driver *driver; | 943 | struct drm_driver *driver; |
888 | drm_local_map_t *agp_buffer_map; | 944 | drm_local_map_t *agp_buffer_map; |
889 | unsigned int agp_buffer_token; | 945 | unsigned int agp_buffer_token; |
946 | struct drm_minor *control; /**< Control node for card */ | ||
890 | struct drm_minor *primary; /**< render type primary screen head */ | 947 | struct drm_minor *primary; /**< render type primary screen head */ |
891 | 948 | ||
892 | /** \name Drawable information */ | 949 | /** \name Drawable information */ |
@@ -895,6 +952,8 @@ struct drm_device { | |||
895 | struct idr drw_idr; | 952 | struct idr drw_idr; |
896 | /*@} */ | 953 | /*@} */ |
897 | 954 | ||
955 | struct drm_mode_config mode_config; /**< Current mode config */ | ||
956 | |||
898 | /** \name GEM information */ | 957 | /** \name GEM information */ |
899 | /*@{ */ | 958 | /*@{ */ |
900 | spinlock_t object_name_lock; | 959 | spinlock_t object_name_lock; |
@@ -997,6 +1056,8 @@ extern int drm_release(struct inode *inode, struct file *filp); | |||
997 | 1056 | ||
998 | /* Mapping support (drm_vm.h) */ | 1057 | /* Mapping support (drm_vm.h) */ |
999 | extern int drm_mmap(struct file *filp, struct vm_area_struct *vma); | 1058 | extern int drm_mmap(struct file *filp, struct vm_area_struct *vma); |
1059 | extern int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma); | ||
1060 | extern void drm_vm_open_locked(struct vm_area_struct *vma); | ||
1000 | extern unsigned long drm_core_get_map_ofs(struct drm_map * map); | 1061 | extern unsigned long drm_core_get_map_ofs(struct drm_map * map); |
1001 | extern unsigned long drm_core_get_reg_ofs(struct drm_device *dev); | 1062 | extern unsigned long drm_core_get_reg_ofs(struct drm_device *dev); |
1002 | extern unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait); | 1063 | extern unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait); |
@@ -1153,6 +1214,8 @@ extern int drm_vblank_get(struct drm_device *dev, int crtc); | |||
1153 | extern void drm_vblank_put(struct drm_device *dev, int crtc); | 1214 | extern void drm_vblank_put(struct drm_device *dev, int crtc); |
1154 | extern void drm_vblank_cleanup(struct drm_device *dev); | 1215 | extern void drm_vblank_cleanup(struct drm_device *dev); |
1155 | /* Modesetting support */ | 1216 | /* Modesetting support */ |
1217 | extern void drm_vblank_pre_modeset(struct drm_device *dev, int crtc); | ||
1218 | extern void drm_vblank_post_modeset(struct drm_device *dev, int crtc); | ||
1156 | extern int drm_modeset_ctl(struct drm_device *dev, void *data, | 1219 | extern int drm_modeset_ctl(struct drm_device *dev, void *data, |
1157 | struct drm_file *file_priv); | 1220 | struct drm_file *file_priv); |
1158 | 1221 | ||
@@ -1189,6 +1252,13 @@ extern int drm_agp_unbind_memory(DRM_AGP_MEM * handle); | |||
1189 | extern void drm_agp_chipset_flush(struct drm_device *dev); | 1252 | extern void drm_agp_chipset_flush(struct drm_device *dev); |
1190 | 1253 | ||
1191 | /* Stub support (drm_stub.h) */ | 1254 | /* Stub support (drm_stub.h) */ |
1255 | extern int drm_setmaster_ioctl(struct drm_device *dev, void *data, | ||
1256 | struct drm_file *file_priv); | ||
1257 | extern int drm_dropmaster_ioctl(struct drm_device *dev, void *data, | ||
1258 | struct drm_file *file_priv); | ||
1259 | struct drm_master *drm_master_create(struct drm_minor *minor); | ||
1260 | extern struct drm_master *drm_master_get(struct drm_master *master); | ||
1261 | extern void drm_master_put(struct drm_master **master); | ||
1192 | extern int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent, | 1262 | extern int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent, |
1193 | struct drm_driver *driver); | 1263 | struct drm_driver *driver); |
1194 | extern int drm_put_dev(struct drm_device *dev); | 1264 | extern int drm_put_dev(struct drm_device *dev); |
@@ -1231,7 +1301,11 @@ struct drm_sysfs_class; | |||
1231 | extern struct class *drm_sysfs_create(struct module *owner, char *name); | 1301 | extern struct class *drm_sysfs_create(struct module *owner, char *name); |
1232 | extern void drm_sysfs_destroy(void); | 1302 | extern void drm_sysfs_destroy(void); |
1233 | extern int drm_sysfs_device_add(struct drm_minor *minor); | 1303 | extern int drm_sysfs_device_add(struct drm_minor *minor); |
1304 | extern void drm_sysfs_hotplug_event(struct drm_device *dev); | ||
1234 | extern void drm_sysfs_device_remove(struct drm_minor *minor); | 1305 | extern void drm_sysfs_device_remove(struct drm_minor *minor); |
1306 | extern char *drm_get_connector_status_name(enum drm_connector_status status); | ||
1307 | extern int drm_sysfs_connector_add(struct drm_connector *connector); | ||
1308 | extern void drm_sysfs_connector_remove(struct drm_connector *connector); | ||
1235 | 1309 | ||
1236 | /* | 1310 | /* |
1237 | * Basic memory manager support (drm_mm.c) | 1311 | * Basic memory manager support (drm_mm.c) |
@@ -1251,10 +1325,12 @@ extern int drm_mm_add_space_to_tail(struct drm_mm *mm, unsigned long size); | |||
1251 | 1325 | ||
1252 | /* Graphics Execution Manager library functions (drm_gem.c) */ | 1326 | /* Graphics Execution Manager library functions (drm_gem.c) */ |
1253 | int drm_gem_init(struct drm_device *dev); | 1327 | int drm_gem_init(struct drm_device *dev); |
1328 | void drm_gem_destroy(struct drm_device *dev); | ||
1254 | void drm_gem_object_free(struct kref *kref); | 1329 | void drm_gem_object_free(struct kref *kref); |
1255 | struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev, | 1330 | struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev, |
1256 | size_t size); | 1331 | size_t size); |
1257 | void drm_gem_object_handle_free(struct kref *kref); | 1332 | void drm_gem_object_handle_free(struct kref *kref); |
1333 | int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma); | ||
1258 | 1334 | ||
1259 | static inline void | 1335 | static inline void |
1260 | drm_gem_object_reference(struct drm_gem_object *obj) | 1336 | drm_gem_object_reference(struct drm_gem_object *obj) |
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h new file mode 100644 index 000000000000..0acb07f31fa4 --- /dev/null +++ b/include/drm/drm_crtc.h | |||
@@ -0,0 +1,733 @@ | |||
1 | /* | ||
2 | * Copyright © 2006 Keith Packard | ||
3 | * Copyright © 2007-2008 Dave Airlie | ||
4 | * Copyright © 2007-2008 Intel Corporation | ||
5 | * Jesse Barnes <jesse.barnes@intel.com> | ||
6 | * | ||
7 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
8 | * copy of this software and associated documentation files (the "Software"), | ||
9 | * to deal in the Software without restriction, including without limitation | ||
10 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
11 | * and/or sell copies of the Software, and to permit persons to whom the | ||
12 | * Software is furnished to do so, subject to the following conditions: | ||
13 | * | ||
14 | * The above copyright notice and this permission notice shall be included in | ||
15 | * all copies or substantial portions of the Software. | ||
16 | * | ||
17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
20 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
23 | * OTHER DEALINGS IN THE SOFTWARE. | ||
24 | */ | ||
25 | #ifndef __DRM_CRTC_H__ | ||
26 | #define __DRM_CRTC_H__ | ||
27 | |||
28 | #include <linux/i2c.h> | ||
29 | #include <linux/spinlock.h> | ||
30 | #include <linux/types.h> | ||
31 | #include <linux/idr.h> | ||
32 | |||
33 | #include <linux/fb.h> | ||
34 | |||
35 | struct drm_device; | ||
36 | struct drm_mode_set; | ||
37 | struct drm_framebuffer; | ||
38 | |||
39 | |||
40 | #define DRM_MODE_OBJECT_CRTC 0xcccccccc | ||
41 | #define DRM_MODE_OBJECT_CONNECTOR 0xc0c0c0c0 | ||
42 | #define DRM_MODE_OBJECT_ENCODER 0xe0e0e0e0 | ||
43 | #define DRM_MODE_OBJECT_MODE 0xdededede | ||
44 | #define DRM_MODE_OBJECT_PROPERTY 0xb0b0b0b0 | ||
45 | #define DRM_MODE_OBJECT_FB 0xfbfbfbfb | ||
46 | #define DRM_MODE_OBJECT_BLOB 0xbbbbbbbb | ||
47 | |||
48 | struct drm_mode_object { | ||
49 | uint32_t id; | ||
50 | uint32_t type; | ||
51 | }; | ||
52 | |||
53 | /* | ||
54 | * Note on terminology: here, for brevity and convenience, we refer to connector | ||
55 | * control chips as 'CRTCs'. They can control any type of connector, VGA, LVDS, | ||
56 | * DVI, etc. And 'screen' refers to the whole of the visible display, which | ||
57 | * may span multiple monitors (and therefore multiple CRTC and connector | ||
58 | * structures). | ||
59 | */ | ||
60 | |||
61 | enum drm_mode_status { | ||
62 | MODE_OK = 0, /* Mode OK */ | ||
63 | MODE_HSYNC, /* hsync out of range */ | ||
64 | MODE_VSYNC, /* vsync out of range */ | ||
65 | MODE_H_ILLEGAL, /* mode has illegal horizontal timings */ | ||
66 | MODE_V_ILLEGAL, /* mode has illegal horizontal timings */ | ||
67 | MODE_BAD_WIDTH, /* requires an unsupported linepitch */ | ||
68 | MODE_NOMODE, /* no mode with a maching name */ | ||
69 | MODE_NO_INTERLACE, /* interlaced mode not supported */ | ||
70 | MODE_NO_DBLESCAN, /* doublescan mode not supported */ | ||
71 | MODE_NO_VSCAN, /* multiscan mode not supported */ | ||
72 | MODE_MEM, /* insufficient video memory */ | ||
73 | MODE_VIRTUAL_X, /* mode width too large for specified virtual size */ | ||
74 | MODE_VIRTUAL_Y, /* mode height too large for specified virtual size */ | ||
75 | MODE_MEM_VIRT, /* insufficient video memory given virtual size */ | ||
76 | MODE_NOCLOCK, /* no fixed clock available */ | ||
77 | MODE_CLOCK_HIGH, /* clock required is too high */ | ||
78 | MODE_CLOCK_LOW, /* clock required is too low */ | ||
79 | MODE_CLOCK_RANGE, /* clock/mode isn't in a ClockRange */ | ||
80 | MODE_BAD_HVALUE, /* horizontal timing was out of range */ | ||
81 | MODE_BAD_VVALUE, /* vertical timing was out of range */ | ||
82 | MODE_BAD_VSCAN, /* VScan value out of range */ | ||
83 | MODE_HSYNC_NARROW, /* horizontal sync too narrow */ | ||
84 | MODE_HSYNC_WIDE, /* horizontal sync too wide */ | ||
85 | MODE_HBLANK_NARROW, /* horizontal blanking too narrow */ | ||
86 | MODE_HBLANK_WIDE, /* horizontal blanking too wide */ | ||
87 | MODE_VSYNC_NARROW, /* vertical sync too narrow */ | ||
88 | MODE_VSYNC_WIDE, /* vertical sync too wide */ | ||
89 | MODE_VBLANK_NARROW, /* vertical blanking too narrow */ | ||
90 | MODE_VBLANK_WIDE, /* vertical blanking too wide */ | ||
91 | MODE_PANEL, /* exceeds panel dimensions */ | ||
92 | MODE_INTERLACE_WIDTH, /* width too large for interlaced mode */ | ||
93 | MODE_ONE_WIDTH, /* only one width is supported */ | ||
94 | MODE_ONE_HEIGHT, /* only one height is supported */ | ||
95 | MODE_ONE_SIZE, /* only one resolution is supported */ | ||
96 | MODE_NO_REDUCED, /* monitor doesn't accept reduced blanking */ | ||
97 | MODE_UNVERIFIED = -3, /* mode needs to reverified */ | ||
98 | MODE_BAD = -2, /* unspecified reason */ | ||
99 | MODE_ERROR = -1 /* error condition */ | ||
100 | }; | ||
101 | |||
102 | #define DRM_MODE_TYPE_CLOCK_CRTC_C (DRM_MODE_TYPE_CLOCK_C | \ | ||
103 | DRM_MODE_TYPE_CRTC_C) | ||
104 | |||
105 | #define DRM_MODE(nm, t, c, hd, hss, hse, ht, hsk, vd, vss, vse, vt, vs, f) \ | ||
106 | .name = nm, .status = 0, .type = (t), .clock = (c), \ | ||
107 | .hdisplay = (hd), .hsync_start = (hss), .hsync_end = (hse), \ | ||
108 | .htotal = (ht), .hskew = (hsk), .vdisplay = (vd), \ | ||
109 | .vsync_start = (vss), .vsync_end = (vse), .vtotal = (vt), \ | ||
110 | .vscan = (vs), .flags = (f), .vrefresh = 0 | ||
111 | |||
112 | #define CRTC_INTERLACE_HALVE_V 0x1 /* halve V values for interlacing */ | ||
113 | |||
114 | struct drm_display_mode { | ||
115 | /* Header */ | ||
116 | struct list_head head; | ||
117 | struct drm_mode_object base; | ||
118 | |||
119 | char name[DRM_DISPLAY_MODE_LEN]; | ||
120 | |||
121 | int connector_count; | ||
122 | enum drm_mode_status status; | ||
123 | int type; | ||
124 | |||
125 | /* Proposed mode values */ | ||
126 | int clock; | ||
127 | int hdisplay; | ||
128 | int hsync_start; | ||
129 | int hsync_end; | ||
130 | int htotal; | ||
131 | int hskew; | ||
132 | int vdisplay; | ||
133 | int vsync_start; | ||
134 | int vsync_end; | ||
135 | int vtotal; | ||
136 | int vscan; | ||
137 | unsigned int flags; | ||
138 | |||
139 | /* Addressable image size (may be 0 for projectors, etc.) */ | ||
140 | int width_mm; | ||
141 | int height_mm; | ||
142 | |||
143 | /* Actual mode we give to hw */ | ||
144 | int clock_index; | ||
145 | int synth_clock; | ||
146 | int crtc_hdisplay; | ||
147 | int crtc_hblank_start; | ||
148 | int crtc_hblank_end; | ||
149 | int crtc_hsync_start; | ||
150 | int crtc_hsync_end; | ||
151 | int crtc_htotal; | ||
152 | int crtc_hskew; | ||
153 | int crtc_vdisplay; | ||
154 | int crtc_vblank_start; | ||
155 | int crtc_vblank_end; | ||
156 | int crtc_vsync_start; | ||
157 | int crtc_vsync_end; | ||
158 | int crtc_vtotal; | ||
159 | int crtc_hadjusted; | ||
160 | int crtc_vadjusted; | ||
161 | |||
162 | /* Driver private mode info */ | ||
163 | int private_size; | ||
164 | int *private; | ||
165 | int private_flags; | ||
166 | |||
167 | int vrefresh; | ||
168 | float hsync; | ||
169 | }; | ||
170 | |||
171 | enum drm_connector_status { | ||
172 | connector_status_connected = 1, | ||
173 | connector_status_disconnected = 2, | ||
174 | connector_status_unknown = 3, | ||
175 | }; | ||
176 | |||
177 | enum subpixel_order { | ||
178 | SubPixelUnknown = 0, | ||
179 | SubPixelHorizontalRGB, | ||
180 | SubPixelHorizontalBGR, | ||
181 | SubPixelVerticalRGB, | ||
182 | SubPixelVerticalBGR, | ||
183 | SubPixelNone, | ||
184 | }; | ||
185 | |||
186 | |||
187 | /* | ||
188 | * Describes a given display (e.g. CRT or flat panel) and its limitations. | ||
189 | */ | ||
190 | struct drm_display_info { | ||
191 | char name[DRM_DISPLAY_INFO_LEN]; | ||
192 | /* Input info */ | ||
193 | bool serration_vsync; | ||
194 | bool sync_on_green; | ||
195 | bool composite_sync; | ||
196 | bool separate_syncs; | ||
197 | bool blank_to_black; | ||
198 | unsigned char video_level; | ||
199 | bool digital; | ||
200 | /* Physical size */ | ||
201 | unsigned int width_mm; | ||
202 | unsigned int height_mm; | ||
203 | |||
204 | /* Display parameters */ | ||
205 | unsigned char gamma; /* FIXME: storage format */ | ||
206 | bool gtf_supported; | ||
207 | bool standard_color; | ||
208 | enum { | ||
209 | monochrome = 0, | ||
210 | rgb, | ||
211 | other, | ||
212 | unknown, | ||
213 | } display_type; | ||
214 | bool active_off_supported; | ||
215 | bool suspend_supported; | ||
216 | bool standby_supported; | ||
217 | |||
218 | /* Color info FIXME: storage format */ | ||
219 | unsigned short redx, redy; | ||
220 | unsigned short greenx, greeny; | ||
221 | unsigned short bluex, bluey; | ||
222 | unsigned short whitex, whitey; | ||
223 | |||
224 | /* Clock limits FIXME: storage format */ | ||
225 | unsigned int min_vfreq, max_vfreq; | ||
226 | unsigned int min_hfreq, max_hfreq; | ||
227 | unsigned int pixel_clock; | ||
228 | |||
229 | /* White point indices FIXME: storage format */ | ||
230 | unsigned int wpx1, wpy1; | ||
231 | unsigned int wpgamma1; | ||
232 | unsigned int wpx2, wpy2; | ||
233 | unsigned int wpgamma2; | ||
234 | |||
235 | enum subpixel_order subpixel_order; | ||
236 | |||
237 | char *raw_edid; /* if any */ | ||
238 | }; | ||
239 | |||
240 | struct drm_framebuffer_funcs { | ||
241 | void (*destroy)(struct drm_framebuffer *framebuffer); | ||
242 | int (*create_handle)(struct drm_framebuffer *fb, | ||
243 | struct drm_file *file_priv, | ||
244 | unsigned int *handle); | ||
245 | }; | ||
246 | |||
247 | struct drm_framebuffer { | ||
248 | struct drm_device *dev; | ||
249 | struct list_head head; | ||
250 | struct drm_mode_object base; | ||
251 | const struct drm_framebuffer_funcs *funcs; | ||
252 | unsigned int pitch; | ||
253 | unsigned int width; | ||
254 | unsigned int height; | ||
255 | /* depth can be 15 or 16 */ | ||
256 | unsigned int depth; | ||
257 | int bits_per_pixel; | ||
258 | int flags; | ||
259 | void *fbdev; | ||
260 | u32 pseudo_palette[17]; | ||
261 | struct list_head filp_head; | ||
262 | }; | ||
263 | |||
264 | struct drm_property_blob { | ||
265 | struct drm_mode_object base; | ||
266 | struct list_head head; | ||
267 | unsigned int length; | ||
268 | void *data; | ||
269 | }; | ||
270 | |||
271 | struct drm_property_enum { | ||
272 | uint64_t value; | ||
273 | struct list_head head; | ||
274 | char name[DRM_PROP_NAME_LEN]; | ||
275 | }; | ||
276 | |||
277 | struct drm_property { | ||
278 | struct list_head head; | ||
279 | struct drm_mode_object base; | ||
280 | uint32_t flags; | ||
281 | char name[DRM_PROP_NAME_LEN]; | ||
282 | uint32_t num_values; | ||
283 | uint64_t *values; | ||
284 | |||
285 | struct list_head enum_blob_list; | ||
286 | }; | ||
287 | |||
288 | struct drm_crtc; | ||
289 | struct drm_connector; | ||
290 | struct drm_encoder; | ||
291 | |||
292 | /** | ||
293 | * drm_crtc_funcs - control CRTCs for a given device | ||
294 | * @dpms: control display power levels | ||
295 | * @save: save CRTC state | ||
296 | * @resore: restore CRTC state | ||
297 | * @lock: lock the CRTC | ||
298 | * @unlock: unlock the CRTC | ||
299 | * @shadow_allocate: allocate shadow pixmap | ||
300 | * @shadow_create: create shadow pixmap for rotation support | ||
301 | * @shadow_destroy: free shadow pixmap | ||
302 | * @mode_fixup: fixup proposed mode | ||
303 | * @mode_set: set the desired mode on the CRTC | ||
304 | * @gamma_set: specify color ramp for CRTC | ||
305 | * @destroy: deinit and free object. | ||
306 | * | ||
307 | * The drm_crtc_funcs structure is the central CRTC management structure | ||
308 | * in the DRM. Each CRTC controls one or more connectors (note that the name | ||
309 | * CRTC is simply historical, a CRTC may control LVDS, VGA, DVI, TV out, etc. | ||
310 | * connectors, not just CRTs). | ||
311 | * | ||
312 | * Each driver is responsible for filling out this structure at startup time, | ||
313 | * in addition to providing other modesetting features, like i2c and DDC | ||
314 | * bus accessors. | ||
315 | */ | ||
316 | struct drm_crtc_funcs { | ||
317 | /* Save CRTC state */ | ||
318 | void (*save)(struct drm_crtc *crtc); /* suspend? */ | ||
319 | /* Restore CRTC state */ | ||
320 | void (*restore)(struct drm_crtc *crtc); /* resume? */ | ||
321 | |||
322 | /* cursor controls */ | ||
323 | int (*cursor_set)(struct drm_crtc *crtc, struct drm_file *file_priv, | ||
324 | uint32_t handle, uint32_t width, uint32_t height); | ||
325 | int (*cursor_move)(struct drm_crtc *crtc, int x, int y); | ||
326 | |||
327 | /* Set gamma on the CRTC */ | ||
328 | void (*gamma_set)(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b, | ||
329 | uint32_t size); | ||
330 | /* Object destroy routine */ | ||
331 | void (*destroy)(struct drm_crtc *crtc); | ||
332 | |||
333 | int (*set_config)(struct drm_mode_set *set); | ||
334 | }; | ||
335 | |||
336 | /** | ||
337 | * drm_crtc - central CRTC control structure | ||
338 | * @enabled: is this CRTC enabled? | ||
339 | * @x: x position on screen | ||
340 | * @y: y position on screen | ||
341 | * @desired_mode: new desired mode | ||
342 | * @desired_x: desired x for desired_mode | ||
343 | * @desired_y: desired y for desired_mode | ||
344 | * @funcs: CRTC control functions | ||
345 | * | ||
346 | * Each CRTC may have one or more connectors associated with it. This structure | ||
347 | * allows the CRTC to be controlled. | ||
348 | */ | ||
349 | struct drm_crtc { | ||
350 | struct drm_device *dev; | ||
351 | struct list_head head; | ||
352 | |||
353 | struct drm_mode_object base; | ||
354 | |||
355 | /* framebuffer the connector is currently bound to */ | ||
356 | struct drm_framebuffer *fb; | ||
357 | |||
358 | bool enabled; | ||
359 | |||
360 | struct drm_display_mode mode; | ||
361 | |||
362 | int x, y; | ||
363 | struct drm_display_mode *desired_mode; | ||
364 | int desired_x, desired_y; | ||
365 | const struct drm_crtc_funcs *funcs; | ||
366 | |||
367 | /* CRTC gamma size for reporting to userspace */ | ||
368 | uint32_t gamma_size; | ||
369 | uint16_t *gamma_store; | ||
370 | |||
371 | /* if you are using the helper */ | ||
372 | void *helper_private; | ||
373 | }; | ||
374 | |||
375 | |||
376 | /** | ||
377 | * drm_connector_funcs - control connectors on a given device | ||
378 | * @dpms: set power state (see drm_crtc_funcs above) | ||
379 | * @save: save connector state | ||
380 | * @restore: restore connector state | ||
381 | * @mode_valid: is this mode valid on the given connector? | ||
382 | * @mode_fixup: try to fixup proposed mode for this connector | ||
383 | * @mode_set: set this mode | ||
384 | * @detect: is this connector active? | ||
385 | * @get_modes: get mode list for this connector | ||
386 | * @set_property: property for this connector may need update | ||
387 | * @destroy: make object go away | ||
388 | * | ||
389 | * Each CRTC may have one or more connectors attached to it. The functions | ||
390 | * below allow the core DRM code to control connectors, enumerate available modes, | ||
391 | * etc. | ||
392 | */ | ||
393 | struct drm_connector_funcs { | ||
394 | void (*dpms)(struct drm_connector *connector, int mode); | ||
395 | void (*save)(struct drm_connector *connector); | ||
396 | void (*restore)(struct drm_connector *connector); | ||
397 | enum drm_connector_status (*detect)(struct drm_connector *connector); | ||
398 | void (*fill_modes)(struct drm_connector *connector, uint32_t max_width, uint32_t max_height); | ||
399 | int (*set_property)(struct drm_connector *connector, struct drm_property *property, | ||
400 | uint64_t val); | ||
401 | void (*destroy)(struct drm_connector *connector); | ||
402 | }; | ||
403 | |||
404 | struct drm_encoder_funcs { | ||
405 | void (*destroy)(struct drm_encoder *encoder); | ||
406 | }; | ||
407 | |||
408 | #define DRM_CONNECTOR_MAX_UMODES 16 | ||
409 | #define DRM_CONNECTOR_MAX_PROPERTY 16 | ||
410 | #define DRM_CONNECTOR_LEN 32 | ||
411 | #define DRM_CONNECTOR_MAX_ENCODER 2 | ||
412 | |||
413 | /** | ||
414 | * drm_encoder - central DRM encoder structure | ||
415 | */ | ||
416 | struct drm_encoder { | ||
417 | struct drm_device *dev; | ||
418 | struct list_head head; | ||
419 | |||
420 | struct drm_mode_object base; | ||
421 | int encoder_type; | ||
422 | uint32_t possible_crtcs; | ||
423 | uint32_t possible_clones; | ||
424 | |||
425 | struct drm_crtc *crtc; | ||
426 | const struct drm_encoder_funcs *funcs; | ||
427 | void *helper_private; | ||
428 | }; | ||
429 | |||
430 | /** | ||
431 | * drm_connector - central DRM connector control structure | ||
432 | * @crtc: CRTC this connector is currently connected to, NULL if none | ||
433 | * @interlace_allowed: can this connector handle interlaced modes? | ||
434 | * @doublescan_allowed: can this connector handle doublescan? | ||
435 | * @available_modes: modes available on this connector (from get_modes() + user) | ||
436 | * @initial_x: initial x position for this connector | ||
437 | * @initial_y: initial y position for this connector | ||
438 | * @status: connector connected? | ||
439 | * @funcs: connector control functions | ||
440 | * | ||
441 | * Each connector may be connected to one or more CRTCs, or may be clonable by | ||
442 | * another connector if they can share a CRTC. Each connector also has a specific | ||
443 | * position in the broader display (referred to as a 'screen' though it could | ||
444 | * span multiple monitors). | ||
445 | */ | ||
446 | struct drm_connector { | ||
447 | struct drm_device *dev; | ||
448 | struct device kdev; | ||
449 | struct device_attribute *attr; | ||
450 | struct list_head head; | ||
451 | |||
452 | struct drm_mode_object base; | ||
453 | |||
454 | int connector_type; | ||
455 | int connector_type_id; | ||
456 | bool interlace_allowed; | ||
457 | bool doublescan_allowed; | ||
458 | struct list_head modes; /* list of modes on this connector */ | ||
459 | |||
460 | int initial_x, initial_y; | ||
461 | enum drm_connector_status status; | ||
462 | |||
463 | /* these are modes added by probing with DDC or the BIOS */ | ||
464 | struct list_head probed_modes; | ||
465 | |||
466 | struct drm_display_info display_info; | ||
467 | const struct drm_connector_funcs *funcs; | ||
468 | |||
469 | struct list_head user_modes; | ||
470 | struct drm_property_blob *edid_blob_ptr; | ||
471 | u32 property_ids[DRM_CONNECTOR_MAX_PROPERTY]; | ||
472 | uint64_t property_values[DRM_CONNECTOR_MAX_PROPERTY]; | ||
473 | |||
474 | void *helper_private; | ||
475 | |||
476 | uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER]; | ||
477 | uint32_t force_encoder_id; | ||
478 | struct drm_encoder *encoder; /* currently active encoder */ | ||
479 | }; | ||
480 | |||
481 | /** | ||
482 | * struct drm_mode_set | ||
483 | * | ||
484 | * Represents a single crtc the connectors that it drives with what mode | ||
485 | * and from which framebuffer it scans out from. | ||
486 | * | ||
487 | * This is used to set modes. | ||
488 | */ | ||
489 | struct drm_mode_set { | ||
490 | struct list_head head; | ||
491 | |||
492 | struct drm_framebuffer *fb; | ||
493 | struct drm_crtc *crtc; | ||
494 | struct drm_display_mode *mode; | ||
495 | |||
496 | uint32_t x; | ||
497 | uint32_t y; | ||
498 | |||
499 | struct drm_connector **connectors; | ||
500 | size_t num_connectors; | ||
501 | }; | ||
502 | |||
503 | /** | ||
504 | * struct drm_mode_config_funcs - configure CRTCs for a given screen layout | ||
505 | * @resize: adjust CRTCs as necessary for the proposed layout | ||
506 | * | ||
507 | * Currently only a resize hook is available. DRM will call back into the | ||
508 | * driver with a new screen width and height. If the driver can't support | ||
509 | * the proposed size, it can return false. Otherwise it should adjust | ||
510 | * the CRTC<->connector mappings as needed and update its view of the screen. | ||
511 | */ | ||
512 | struct drm_mode_config_funcs { | ||
513 | struct drm_framebuffer *(*fb_create)(struct drm_device *dev, struct drm_file *file_priv, struct drm_mode_fb_cmd *mode_cmd); | ||
514 | int (*fb_changed)(struct drm_device *dev); | ||
515 | }; | ||
516 | |||
517 | struct drm_mode_group { | ||
518 | uint32_t num_crtcs; | ||
519 | uint32_t num_encoders; | ||
520 | uint32_t num_connectors; | ||
521 | |||
522 | /* list of object IDs for this group */ | ||
523 | uint32_t *id_list; | ||
524 | }; | ||
525 | |||
526 | /** | ||
527 | * drm_mode_config - Mode configuration control structure | ||
528 | * | ||
529 | */ | ||
530 | struct drm_mode_config { | ||
531 | struct mutex mutex; /* protects configuration and IDR */ | ||
532 | struct idr crtc_idr; /* use this idr for all IDs, fb, crtc, connector, modes - just makes life easier */ | ||
533 | /* this is limited to one for now */ | ||
534 | int num_fb; | ||
535 | struct list_head fb_list; | ||
536 | int num_connector; | ||
537 | struct list_head connector_list; | ||
538 | int num_encoder; | ||
539 | struct list_head encoder_list; | ||
540 | |||
541 | int num_crtc; | ||
542 | struct list_head crtc_list; | ||
543 | |||
544 | struct list_head property_list; | ||
545 | |||
546 | /* in-kernel framebuffers - hung of filp_head in drm_framebuffer */ | ||
547 | struct list_head fb_kernel_list; | ||
548 | |||
549 | int min_width, min_height; | ||
550 | int max_width, max_height; | ||
551 | struct drm_mode_config_funcs *funcs; | ||
552 | unsigned long fb_base; | ||
553 | |||
554 | /* pointers to standard properties */ | ||
555 | struct list_head property_blob_list; | ||
556 | struct drm_property *edid_property; | ||
557 | struct drm_property *dpms_property; | ||
558 | |||
559 | /* DVI-I properties */ | ||
560 | struct drm_property *dvi_i_subconnector_property; | ||
561 | struct drm_property *dvi_i_select_subconnector_property; | ||
562 | |||
563 | /* TV properties */ | ||
564 | struct drm_property *tv_subconnector_property; | ||
565 | struct drm_property *tv_select_subconnector_property; | ||
566 | struct drm_property *tv_mode_property; | ||
567 | struct drm_property *tv_left_margin_property; | ||
568 | struct drm_property *tv_right_margin_property; | ||
569 | struct drm_property *tv_top_margin_property; | ||
570 | struct drm_property *tv_bottom_margin_property; | ||
571 | |||
572 | /* Optional properties */ | ||
573 | struct drm_property *scaling_mode_property; | ||
574 | struct drm_property *dithering_mode_property; | ||
575 | }; | ||
576 | |||
577 | #define obj_to_crtc(x) container_of(x, struct drm_crtc, base) | ||
578 | #define obj_to_connector(x) container_of(x, struct drm_connector, base) | ||
579 | #define obj_to_encoder(x) container_of(x, struct drm_encoder, base) | ||
580 | #define obj_to_mode(x) container_of(x, struct drm_display_mode, base) | ||
581 | #define obj_to_fb(x) container_of(x, struct drm_framebuffer, base) | ||
582 | #define obj_to_property(x) container_of(x, struct drm_property, base) | ||
583 | #define obj_to_blob(x) container_of(x, struct drm_property_blob, base) | ||
584 | |||
585 | |||
586 | extern void drm_crtc_init(struct drm_device *dev, | ||
587 | struct drm_crtc *crtc, | ||
588 | const struct drm_crtc_funcs *funcs); | ||
589 | extern void drm_crtc_cleanup(struct drm_crtc *crtc); | ||
590 | |||
591 | extern void drm_connector_init(struct drm_device *dev, | ||
592 | struct drm_connector *connector, | ||
593 | const struct drm_connector_funcs *funcs, | ||
594 | int connector_type); | ||
595 | |||
596 | extern void drm_connector_cleanup(struct drm_connector *connector); | ||
597 | |||
598 | extern void drm_encoder_init(struct drm_device *dev, | ||
599 | struct drm_encoder *encoder, | ||
600 | const struct drm_encoder_funcs *funcs, | ||
601 | int encoder_type); | ||
602 | |||
603 | extern void drm_encoder_cleanup(struct drm_encoder *encoder); | ||
604 | |||
605 | extern char *drm_get_connector_name(struct drm_connector *connector); | ||
606 | extern char *drm_get_dpms_name(int val); | ||
607 | extern char *drm_get_dvi_i_subconnector_name(int val); | ||
608 | extern char *drm_get_dvi_i_select_name(int val); | ||
609 | extern char *drm_get_tv_subconnector_name(int val); | ||
610 | extern char *drm_get_tv_select_name(int val); | ||
611 | extern void drm_fb_release(struct file *filp); | ||
612 | extern int drm_mode_group_init_legacy_group(struct drm_device *dev, struct drm_mode_group *group); | ||
613 | extern struct edid *drm_get_edid(struct drm_connector *connector, | ||
614 | struct i2c_adapter *adapter); | ||
615 | extern unsigned char *drm_do_probe_ddc_edid(struct i2c_adapter *adapter); | ||
616 | extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid); | ||
617 | extern void drm_mode_probed_add(struct drm_connector *connector, struct drm_display_mode *mode); | ||
618 | extern void drm_mode_remove(struct drm_connector *connector, struct drm_display_mode *mode); | ||
619 | extern struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev, | ||
620 | struct drm_display_mode *mode); | ||
621 | extern void drm_mode_debug_printmodeline(struct drm_display_mode *mode); | ||
622 | extern void drm_mode_config_init(struct drm_device *dev); | ||
623 | extern void drm_mode_config_cleanup(struct drm_device *dev); | ||
624 | extern void drm_mode_set_name(struct drm_display_mode *mode); | ||
625 | extern bool drm_mode_equal(struct drm_display_mode *mode1, struct drm_display_mode *mode2); | ||
626 | extern int drm_mode_width(struct drm_display_mode *mode); | ||
627 | extern int drm_mode_height(struct drm_display_mode *mode); | ||
628 | |||
629 | /* for us by fb module */ | ||
630 | extern int drm_mode_attachmode_crtc(struct drm_device *dev, | ||
631 | struct drm_crtc *crtc, | ||
632 | struct drm_display_mode *mode); | ||
633 | extern int drm_mode_detachmode_crtc(struct drm_device *dev, struct drm_display_mode *mode); | ||
634 | |||
635 | extern struct drm_display_mode *drm_mode_create(struct drm_device *dev); | ||
636 | extern void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode); | ||
637 | extern void drm_mode_list_concat(struct list_head *head, | ||
638 | struct list_head *new); | ||
639 | extern void drm_mode_validate_size(struct drm_device *dev, | ||
640 | struct list_head *mode_list, | ||
641 | int maxX, int maxY, int maxPitch); | ||
642 | extern void drm_mode_prune_invalid(struct drm_device *dev, | ||
643 | struct list_head *mode_list, bool verbose); | ||
644 | extern void drm_mode_sort(struct list_head *mode_list); | ||
645 | extern int drm_mode_vrefresh(struct drm_display_mode *mode); | ||
646 | extern void drm_mode_set_crtcinfo(struct drm_display_mode *p, | ||
647 | int adjust_flags); | ||
648 | extern void drm_mode_connector_list_update(struct drm_connector *connector); | ||
649 | extern int drm_mode_connector_update_edid_property(struct drm_connector *connector, | ||
650 | struct edid *edid); | ||
651 | extern int drm_connector_property_set_value(struct drm_connector *connector, | ||
652 | struct drm_property *property, | ||
653 | uint64_t value); | ||
654 | extern int drm_connector_property_get_value(struct drm_connector *connector, | ||
655 | struct drm_property *property, | ||
656 | uint64_t *value); | ||
657 | extern struct drm_display_mode *drm_crtc_mode_create(struct drm_device *dev); | ||
658 | extern void drm_framebuffer_set_object(struct drm_device *dev, | ||
659 | unsigned long handle); | ||
660 | extern int drm_framebuffer_init(struct drm_device *dev, | ||
661 | struct drm_framebuffer *fb, | ||
662 | const struct drm_framebuffer_funcs *funcs); | ||
663 | extern void drm_framebuffer_cleanup(struct drm_framebuffer *fb); | ||
664 | extern int drmfb_probe(struct drm_device *dev, struct drm_crtc *crtc); | ||
665 | extern int drmfb_remove(struct drm_device *dev, struct drm_framebuffer *fb); | ||
666 | extern void drm_crtc_probe_connector_modes(struct drm_device *dev, int maxX, int maxY); | ||
667 | extern bool drm_crtc_in_use(struct drm_crtc *crtc); | ||
668 | |||
669 | extern int drm_connector_attach_property(struct drm_connector *connector, | ||
670 | struct drm_property *property, uint64_t init_val); | ||
671 | extern struct drm_property *drm_property_create(struct drm_device *dev, int flags, | ||
672 | const char *name, int num_values); | ||
673 | extern void drm_property_destroy(struct drm_device *dev, struct drm_property *property); | ||
674 | extern int drm_property_add_enum(struct drm_property *property, int index, | ||
675 | uint64_t value, const char *name); | ||
676 | extern int drm_mode_create_dvi_i_properties(struct drm_device *dev); | ||
677 | extern int drm_mode_create_tv_properties(struct drm_device *dev, int num_formats, | ||
678 | char *formats[]); | ||
679 | extern int drm_mode_create_scaling_mode_property(struct drm_device *dev); | ||
680 | extern int drm_mode_create_dithering_property(struct drm_device *dev); | ||
681 | extern char *drm_get_encoder_name(struct drm_encoder *encoder); | ||
682 | |||
683 | extern int drm_mode_connector_attach_encoder(struct drm_connector *connector, | ||
684 | struct drm_encoder *encoder); | ||
685 | extern void drm_mode_connector_detach_encoder(struct drm_connector *connector, | ||
686 | struct drm_encoder *encoder); | ||
687 | extern bool drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc, | ||
688 | int gamma_size); | ||
689 | extern void *drm_mode_object_find(struct drm_device *dev, uint32_t id, uint32_t type); | ||
690 | /* IOCTLs */ | ||
691 | extern int drm_mode_getresources(struct drm_device *dev, | ||
692 | void *data, struct drm_file *file_priv); | ||
693 | |||
694 | extern int drm_mode_getcrtc(struct drm_device *dev, | ||
695 | void *data, struct drm_file *file_priv); | ||
696 | extern int drm_mode_getconnector(struct drm_device *dev, | ||
697 | void *data, struct drm_file *file_priv); | ||
698 | extern int drm_mode_setcrtc(struct drm_device *dev, | ||
699 | void *data, struct drm_file *file_priv); | ||
700 | extern int drm_mode_cursor_ioctl(struct drm_device *dev, | ||
701 | void *data, struct drm_file *file_priv); | ||
702 | extern int drm_mode_addfb(struct drm_device *dev, | ||
703 | void *data, struct drm_file *file_priv); | ||
704 | extern int drm_mode_rmfb(struct drm_device *dev, | ||
705 | void *data, struct drm_file *file_priv); | ||
706 | extern int drm_mode_getfb(struct drm_device *dev, | ||
707 | void *data, struct drm_file *file_priv); | ||
708 | extern int drm_mode_addmode_ioctl(struct drm_device *dev, | ||
709 | void *data, struct drm_file *file_priv); | ||
710 | extern int drm_mode_rmmode_ioctl(struct drm_device *dev, | ||
711 | void *data, struct drm_file *file_priv); | ||
712 | extern int drm_mode_attachmode_ioctl(struct drm_device *dev, | ||
713 | void *data, struct drm_file *file_priv); | ||
714 | extern int drm_mode_detachmode_ioctl(struct drm_device *dev, | ||
715 | void *data, struct drm_file *file_priv); | ||
716 | |||
717 | extern int drm_mode_getproperty_ioctl(struct drm_device *dev, | ||
718 | void *data, struct drm_file *file_priv); | ||
719 | extern int drm_mode_getblob_ioctl(struct drm_device *dev, | ||
720 | void *data, struct drm_file *file_priv); | ||
721 | extern int drm_mode_connector_property_set_ioctl(struct drm_device *dev, | ||
722 | void *data, struct drm_file *file_priv); | ||
723 | extern int drm_mode_hotplug_ioctl(struct drm_device *dev, | ||
724 | void *data, struct drm_file *file_priv); | ||
725 | extern int drm_mode_replacefb(struct drm_device *dev, | ||
726 | void *data, struct drm_file *file_priv); | ||
727 | extern int drm_mode_getencoder(struct drm_device *dev, | ||
728 | void *data, struct drm_file *file_priv); | ||
729 | extern int drm_mode_gamma_get_ioctl(struct drm_device *dev, | ||
730 | void *data, struct drm_file *file_priv); | ||
731 | extern int drm_mode_gamma_set_ioctl(struct drm_device *dev, | ||
732 | void *data, struct drm_file *file_priv); | ||
733 | #endif /* __DRM_CRTC_H__ */ | ||
diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h new file mode 100644 index 000000000000..4bc04cf460a7 --- /dev/null +++ b/include/drm/drm_crtc_helper.h | |||
@@ -0,0 +1,124 @@ | |||
1 | /* | ||
2 | * Copyright © 2006 Keith Packard | ||
3 | * Copyright © 2007-2008 Dave Airlie | ||
4 | * Copyright © 2007-2008 Intel Corporation | ||
5 | * Jesse Barnes <jesse.barnes@intel.com> | ||
6 | * | ||
7 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
8 | * copy of this software and associated documentation files (the "Software"), | ||
9 | * to deal in the Software without restriction, including without limitation | ||
10 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
11 | * and/or sell copies of the Software, and to permit persons to whom the | ||
12 | * Software is furnished to do so, subject to the following conditions: | ||
13 | * | ||
14 | * The above copyright notice and this permission notice shall be included in | ||
15 | * all copies or substantial portions of the Software. | ||
16 | * | ||
17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
20 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
23 | * OTHER DEALINGS IN THE SOFTWARE. | ||
24 | */ | ||
25 | |||
26 | /* | ||
27 | * The DRM mode setting helper functions are common code for drivers to use if | ||
28 | * they wish. Drivers are not forced to use this code in their | ||
29 | * implementations but it would be useful if they code they do use at least | ||
30 | * provides a consistent interface and operation to userspace | ||
31 | */ | ||
32 | |||
33 | #ifndef __DRM_CRTC_HELPER_H__ | ||
34 | #define __DRM_CRTC_HELPER_H__ | ||
35 | |||
36 | #include <linux/i2c.h> | ||
37 | #include <linux/spinlock.h> | ||
38 | #include <linux/types.h> | ||
39 | #include <linux/idr.h> | ||
40 | |||
41 | #include <linux/fb.h> | ||
42 | |||
43 | struct drm_crtc_helper_funcs { | ||
44 | /* | ||
45 | * Control power levels on the CRTC. If the mode passed in is | ||
46 | * unsupported, the provider must use the next lowest power level. | ||
47 | */ | ||
48 | void (*dpms)(struct drm_crtc *crtc, int mode); | ||
49 | void (*prepare)(struct drm_crtc *crtc); | ||
50 | void (*commit)(struct drm_crtc *crtc); | ||
51 | |||
52 | /* Provider can fixup or change mode timings before modeset occurs */ | ||
53 | bool (*mode_fixup)(struct drm_crtc *crtc, | ||
54 | struct drm_display_mode *mode, | ||
55 | struct drm_display_mode *adjusted_mode); | ||
56 | /* Actually set the mode */ | ||
57 | void (*mode_set)(struct drm_crtc *crtc, struct drm_display_mode *mode, | ||
58 | struct drm_display_mode *adjusted_mode, int x, int y, | ||
59 | struct drm_framebuffer *old_fb); | ||
60 | |||
61 | /* Move the crtc on the current fb to the given position *optional* */ | ||
62 | void (*mode_set_base)(struct drm_crtc *crtc, int x, int y, | ||
63 | struct drm_framebuffer *old_fb); | ||
64 | }; | ||
65 | |||
66 | struct drm_encoder_helper_funcs { | ||
67 | void (*dpms)(struct drm_encoder *encoder, int mode); | ||
68 | void (*save)(struct drm_encoder *encoder); | ||
69 | void (*restore)(struct drm_encoder *encoder); | ||
70 | |||
71 | bool (*mode_fixup)(struct drm_encoder *encoder, | ||
72 | struct drm_display_mode *mode, | ||
73 | struct drm_display_mode *adjusted_mode); | ||
74 | void (*prepare)(struct drm_encoder *encoder); | ||
75 | void (*commit)(struct drm_encoder *encoder); | ||
76 | void (*mode_set)(struct drm_encoder *encoder, | ||
77 | struct drm_display_mode *mode, | ||
78 | struct drm_display_mode *adjusted_mode); | ||
79 | /* detect for DAC style encoders */ | ||
80 | enum drm_connector_status (*detect)(struct drm_encoder *encoder, | ||
81 | struct drm_connector *connector); | ||
82 | }; | ||
83 | |||
84 | struct drm_connector_helper_funcs { | ||
85 | int (*get_modes)(struct drm_connector *connector); | ||
86 | int (*mode_valid)(struct drm_connector *connector, | ||
87 | struct drm_display_mode *mode); | ||
88 | struct drm_encoder *(*best_encoder)(struct drm_connector *connector); | ||
89 | }; | ||
90 | |||
91 | extern void drm_helper_probe_single_connector_modes(struct drm_connector *connector, uint32_t maxX, uint32_t maxY); | ||
92 | extern void drm_helper_disable_unused_functions(struct drm_device *dev); | ||
93 | extern int drm_helper_hotplug_stage_two(struct drm_device *dev); | ||
94 | extern bool drm_helper_initial_config(struct drm_device *dev, bool can_grow); | ||
95 | extern int drm_crtc_helper_set_config(struct drm_mode_set *set); | ||
96 | extern bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, | ||
97 | struct drm_display_mode *mode, | ||
98 | int x, int y, | ||
99 | struct drm_framebuffer *old_fb); | ||
100 | extern bool drm_helper_crtc_in_use(struct drm_crtc *crtc); | ||
101 | |||
102 | extern int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, | ||
103 | struct drm_mode_fb_cmd *mode_cmd); | ||
104 | |||
105 | static inline void drm_crtc_helper_add(struct drm_crtc *crtc, | ||
106 | const struct drm_crtc_helper_funcs *funcs) | ||
107 | { | ||
108 | crtc->helper_private = (void *)funcs; | ||
109 | } | ||
110 | |||
111 | static inline void drm_encoder_helper_add(struct drm_encoder *encoder, | ||
112 | const struct drm_encoder_helper_funcs *funcs) | ||
113 | { | ||
114 | encoder->helper_private = (void *)funcs; | ||
115 | } | ||
116 | |||
117 | static inline void drm_connector_helper_add(struct drm_connector *connector, | ||
118 | const struct drm_connector_helper_funcs *funcs) | ||
119 | { | ||
120 | connector->helper_private = (void *)funcs; | ||
121 | } | ||
122 | |||
123 | extern int drm_helper_resume_force_mode(struct drm_device *dev); | ||
124 | #endif | ||
diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h new file mode 100644 index 000000000000..c707c15f5164 --- /dev/null +++ b/include/drm/drm_edid.h | |||
@@ -0,0 +1,202 @@ | |||
1 | /* | ||
2 | * Copyright © 2007-2008 Intel Corporation | ||
3 | * Jesse Barnes <jesse.barnes@intel.com> | ||
4 | * | ||
5 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
6 | * copy of this software and associated documentation files (the "Software"), | ||
7 | * to deal in the Software without restriction, including without limitation | ||
8 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
9 | * and/or sell copies of the Software, and to permit persons to whom the | ||
10 | * Software is furnished to do so, subject to the following conditions: | ||
11 | * | ||
12 | * The above copyright notice and this permission notice shall be included in | ||
13 | * all copies or substantial portions of the Software. | ||
14 | * | ||
15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
18 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
19 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
20 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
21 | * OTHER DEALINGS IN THE SOFTWARE. | ||
22 | */ | ||
23 | #ifndef __DRM_EDID_H__ | ||
24 | #define __DRM_EDID_H__ | ||
25 | |||
26 | #include <linux/types.h> | ||
27 | |||
28 | #define EDID_LENGTH 128 | ||
29 | #define DDC_ADDR 0x50 | ||
30 | |||
31 | #ifdef BIG_ENDIAN | ||
32 | #error "EDID structure is little endian, need big endian versions" | ||
33 | #else | ||
34 | |||
35 | struct est_timings { | ||
36 | u8 t1; | ||
37 | u8 t2; | ||
38 | u8 mfg_rsvd; | ||
39 | } __attribute__((packed)); | ||
40 | |||
41 | struct std_timing { | ||
42 | u8 hsize; /* need to multiply by 8 then add 248 */ | ||
43 | u8 vfreq:6; /* need to add 60 */ | ||
44 | u8 aspect_ratio:2; /* 00=16:10, 01=4:3, 10=5:4, 11=16:9 */ | ||
45 | } __attribute__((packed)); | ||
46 | |||
47 | /* If detailed data is pixel timing */ | ||
48 | struct detailed_pixel_timing { | ||
49 | u8 hactive_lo; | ||
50 | u8 hblank_lo; | ||
51 | u8 hblank_hi:4; | ||
52 | u8 hactive_hi:4; | ||
53 | u8 vactive_lo; | ||
54 | u8 vblank_lo; | ||
55 | u8 vblank_hi:4; | ||
56 | u8 vactive_hi:4; | ||
57 | u8 hsync_offset_lo; | ||
58 | u8 hsync_pulse_width_lo; | ||
59 | u8 vsync_pulse_width_lo:4; | ||
60 | u8 vsync_offset_lo:4; | ||
61 | u8 hsync_pulse_width_hi:2; | ||
62 | u8 hsync_offset_hi:2; | ||
63 | u8 vsync_pulse_width_hi:2; | ||
64 | u8 vsync_offset_hi:2; | ||
65 | u8 width_mm_lo; | ||
66 | u8 height_mm_lo; | ||
67 | u8 height_mm_hi:4; | ||
68 | u8 width_mm_hi:4; | ||
69 | u8 hborder; | ||
70 | u8 vborder; | ||
71 | u8 unknown0:1; | ||
72 | u8 vsync_positive:1; | ||
73 | u8 hsync_positive:1; | ||
74 | u8 separate_sync:2; | ||
75 | u8 stereo:1; | ||
76 | u8 unknown6:1; | ||
77 | u8 interlaced:1; | ||
78 | } __attribute__((packed)); | ||
79 | |||
80 | /* If it's not pixel timing, it'll be one of the below */ | ||
81 | struct detailed_data_string { | ||
82 | u8 str[13]; | ||
83 | } __attribute__((packed)); | ||
84 | |||
85 | struct detailed_data_monitor_range { | ||
86 | u8 min_vfreq; | ||
87 | u8 max_vfreq; | ||
88 | u8 min_hfreq_khz; | ||
89 | u8 max_hfreq_khz; | ||
90 | u8 pixel_clock_mhz; /* need to multiply by 10 */ | ||
91 | u16 sec_gtf_toggle; /* A000=use above, 20=use below */ /* FIXME: byte order */ | ||
92 | u8 hfreq_start_khz; /* need to multiply by 2 */ | ||
93 | u8 c; /* need to divide by 2 */ | ||
94 | u16 m; /* FIXME: byte order */ | ||
95 | u8 k; | ||
96 | u8 j; /* need to divide by 2 */ | ||
97 | } __attribute__((packed)); | ||
98 | |||
99 | struct detailed_data_wpindex { | ||
100 | u8 white_y_lo:2; | ||
101 | u8 white_x_lo:2; | ||
102 | u8 pad:4; | ||
103 | u8 white_x_hi; | ||
104 | u8 white_y_hi; | ||
105 | u8 gamma; /* need to divide by 100 then add 1 */ | ||
106 | } __attribute__((packed)); | ||
107 | |||
108 | struct detailed_data_color_point { | ||
109 | u8 windex1; | ||
110 | u8 wpindex1[3]; | ||
111 | u8 windex2; | ||
112 | u8 wpindex2[3]; | ||
113 | } __attribute__((packed)); | ||
114 | |||
115 | struct detailed_non_pixel { | ||
116 | u8 pad1; | ||
117 | u8 type; /* ff=serial, fe=string, fd=monitor range, fc=monitor name | ||
118 | fb=color point data, fa=standard timing data, | ||
119 | f9=undefined, f8=mfg. reserved */ | ||
120 | u8 pad2; | ||
121 | union { | ||
122 | struct detailed_data_string str; | ||
123 | struct detailed_data_monitor_range range; | ||
124 | struct detailed_data_wpindex color; | ||
125 | struct std_timing timings[5]; | ||
126 | } data; | ||
127 | } __attribute__((packed)); | ||
128 | |||
129 | #define EDID_DETAIL_STD_MODES 0xfa | ||
130 | #define EDID_DETAIL_MONITOR_CPDATA 0xfb | ||
131 | #define EDID_DETAIL_MONITOR_NAME 0xfc | ||
132 | #define EDID_DETAIL_MONITOR_RANGE 0xfd | ||
133 | #define EDID_DETAIL_MONITOR_STRING 0xfe | ||
134 | #define EDID_DETAIL_MONITOR_SERIAL 0xff | ||
135 | |||
136 | struct detailed_timing { | ||
137 | u16 pixel_clock; /* need to multiply by 10 KHz */ /* FIXME: byte order */ | ||
138 | union { | ||
139 | struct detailed_pixel_timing pixel_data; | ||
140 | struct detailed_non_pixel other_data; | ||
141 | } data; | ||
142 | } __attribute__((packed)); | ||
143 | |||
144 | struct edid { | ||
145 | u8 header[8]; | ||
146 | /* Vendor & product info */ | ||
147 | u8 mfg_id[2]; | ||
148 | u8 prod_code[2]; | ||
149 | u32 serial; /* FIXME: byte order */ | ||
150 | u8 mfg_week; | ||
151 | u8 mfg_year; | ||
152 | /* EDID version */ | ||
153 | u8 version; | ||
154 | u8 revision; | ||
155 | /* Display info: */ | ||
156 | /* input definition */ | ||
157 | u8 serration_vsync:1; | ||
158 | u8 sync_on_green:1; | ||
159 | u8 composite_sync:1; | ||
160 | u8 separate_syncs:1; | ||
161 | u8 blank_to_black:1; | ||
162 | u8 video_level:2; | ||
163 | u8 digital:1; /* bits below must be zero if set */ | ||
164 | u8 width_cm; | ||
165 | u8 height_cm; | ||
166 | u8 gamma; | ||
167 | /* feature support */ | ||
168 | u8 default_gtf:1; | ||
169 | u8 preferred_timing:1; | ||
170 | u8 standard_color:1; | ||
171 | u8 display_type:2; /* 00=mono, 01=rgb, 10=non-rgb, 11=unknown */ | ||
172 | u8 pm_active_off:1; | ||
173 | u8 pm_suspend:1; | ||
174 | u8 pm_standby:1; | ||
175 | /* Color characteristics */ | ||
176 | u8 red_green_lo; | ||
177 | u8 black_white_lo; | ||
178 | u8 red_x; | ||
179 | u8 red_y; | ||
180 | u8 green_x; | ||
181 | u8 green_y; | ||
182 | u8 blue_x; | ||
183 | u8 blue_y; | ||
184 | u8 white_x; | ||
185 | u8 white_y; | ||
186 | /* Est. timings and mfg rsvd timings*/ | ||
187 | struct est_timings established_timings; | ||
188 | /* Standard timings 1-8*/ | ||
189 | struct std_timing standard_timings[8]; | ||
190 | /* Detailing timings 1-4 */ | ||
191 | struct detailed_timing detailed_timings[4]; | ||
192 | /* Number of 128 byte ext. blocks */ | ||
193 | u8 extensions; | ||
194 | /* Checksum */ | ||
195 | u8 checksum; | ||
196 | } __attribute__((packed)); | ||
197 | |||
198 | #endif /* little endian structs */ | ||
199 | |||
200 | #define EDID_PRODUCT_ID(e) ((e)->prod_code[0] | ((e)->prod_code[1] << 8)) | ||
201 | |||
202 | #endif /* __DRM_EDID_H__ */ | ||
diff --git a/include/drm/drm_mode.h b/include/drm/drm_mode.h new file mode 100644 index 000000000000..601d2bd839f6 --- /dev/null +++ b/include/drm/drm_mode.h | |||
@@ -0,0 +1,271 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2007 Dave Airlie <airlied@linux.ie> | ||
3 | * Copyright (c) 2007 Jakob Bornecrantz <wallbraker@gmail.com> | ||
4 | * Copyright (c) 2008 Red Hat Inc. | ||
5 | * Copyright (c) 2007-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA | ||
6 | * Copyright (c) 2007-2008 Intel Corporation | ||
7 | * | ||
8 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
9 | * copy of this software and associated documentation files (the "Software"), | ||
10 | * to deal in the Software without restriction, including without limitation | ||
11 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
12 | * and/or sell copies of the Software, and to permit persons to whom the | ||
13 | * Software is furnished to do so, subject to the following conditions: | ||
14 | * | ||
15 | * The above copyright notice and this permission notice shall be included in | ||
16 | * all copies or substantial portions of the Software. | ||
17 | * | ||
18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
19 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
20 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
21 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
22 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
23 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | ||
24 | * IN THE SOFTWARE. | ||
25 | */ | ||
26 | |||
27 | #ifndef _DRM_MODE_H | ||
28 | #define _DRM_MODE_H | ||
29 | |||
30 | #if !defined(__KERNEL__) && !defined(_KERNEL) | ||
31 | #include <stdint.h> | ||
32 | #else | ||
33 | #include <linux/kernel.h> | ||
34 | #endif | ||
35 | |||
36 | #define DRM_DISPLAY_INFO_LEN 32 | ||
37 | #define DRM_CONNECTOR_NAME_LEN 32 | ||
38 | #define DRM_DISPLAY_MODE_LEN 32 | ||
39 | #define DRM_PROP_NAME_LEN 32 | ||
40 | |||
41 | #define DRM_MODE_TYPE_BUILTIN (1<<0) | ||
42 | #define DRM_MODE_TYPE_CLOCK_C ((1<<1) | DRM_MODE_TYPE_BUILTIN) | ||
43 | #define DRM_MODE_TYPE_CRTC_C ((1<<2) | DRM_MODE_TYPE_BUILTIN) | ||
44 | #define DRM_MODE_TYPE_PREFERRED (1<<3) | ||
45 | #define DRM_MODE_TYPE_DEFAULT (1<<4) | ||
46 | #define DRM_MODE_TYPE_USERDEF (1<<5) | ||
47 | #define DRM_MODE_TYPE_DRIVER (1<<6) | ||
48 | |||
49 | /* Video mode flags */ | ||
50 | /* bit compatible with the xorg definitions. */ | ||
51 | #define DRM_MODE_FLAG_PHSYNC (1<<0) | ||
52 | #define DRM_MODE_FLAG_NHSYNC (1<<1) | ||
53 | #define DRM_MODE_FLAG_PVSYNC (1<<2) | ||
54 | #define DRM_MODE_FLAG_NVSYNC (1<<3) | ||
55 | #define DRM_MODE_FLAG_INTERLACE (1<<4) | ||
56 | #define DRM_MODE_FLAG_DBLSCAN (1<<5) | ||
57 | #define DRM_MODE_FLAG_CSYNC (1<<6) | ||
58 | #define DRM_MODE_FLAG_PCSYNC (1<<7) | ||
59 | #define DRM_MODE_FLAG_NCSYNC (1<<8) | ||
60 | #define DRM_MODE_FLAG_HSKEW (1<<9) /* hskew provided */ | ||
61 | #define DRM_MODE_FLAG_BCAST (1<<10) | ||
62 | #define DRM_MODE_FLAG_PIXMUX (1<<11) | ||
63 | #define DRM_MODE_FLAG_DBLCLK (1<<12) | ||
64 | #define DRM_MODE_FLAG_CLKDIV2 (1<<13) | ||
65 | |||
66 | /* DPMS flags */ | ||
67 | /* bit compatible with the xorg definitions. */ | ||
68 | #define DRM_MODE_DPMS_ON 0 | ||
69 | #define DRM_MODE_DPMS_STANDBY 1 | ||
70 | #define DRM_MODE_DPMS_SUSPEND 2 | ||
71 | #define DRM_MODE_DPMS_OFF 3 | ||
72 | |||
73 | /* Scaling mode options */ | ||
74 | #define DRM_MODE_SCALE_NON_GPU 0 | ||
75 | #define DRM_MODE_SCALE_FULLSCREEN 1 | ||
76 | #define DRM_MODE_SCALE_NO_SCALE 2 | ||
77 | #define DRM_MODE_SCALE_ASPECT 3 | ||
78 | |||
79 | /* Dithering mode options */ | ||
80 | #define DRM_MODE_DITHERING_OFF 0 | ||
81 | #define DRM_MODE_DITHERING_ON 1 | ||
82 | |||
83 | struct drm_mode_modeinfo { | ||
84 | uint32_t clock; | ||
85 | uint16_t hdisplay, hsync_start, hsync_end, htotal, hskew; | ||
86 | uint16_t vdisplay, vsync_start, vsync_end, vtotal, vscan; | ||
87 | |||
88 | uint32_t vrefresh; /* vertical refresh * 1000 */ | ||
89 | |||
90 | uint32_t flags; | ||
91 | uint32_t type; | ||
92 | char name[DRM_DISPLAY_MODE_LEN]; | ||
93 | }; | ||
94 | |||
95 | struct drm_mode_card_res { | ||
96 | uint64_t fb_id_ptr; | ||
97 | uint64_t crtc_id_ptr; | ||
98 | uint64_t connector_id_ptr; | ||
99 | uint64_t encoder_id_ptr; | ||
100 | uint32_t count_fbs; | ||
101 | uint32_t count_crtcs; | ||
102 | uint32_t count_connectors; | ||
103 | uint32_t count_encoders; | ||
104 | uint32_t min_width, max_width; | ||
105 | uint32_t min_height, max_height; | ||
106 | }; | ||
107 | |||
108 | struct drm_mode_crtc { | ||
109 | uint64_t set_connectors_ptr; | ||
110 | uint32_t count_connectors; | ||
111 | |||
112 | uint32_t crtc_id; /**< Id */ | ||
113 | uint32_t fb_id; /**< Id of framebuffer */ | ||
114 | |||
115 | uint32_t x, y; /**< Position on the frameuffer */ | ||
116 | |||
117 | uint32_t gamma_size; | ||
118 | uint32_t mode_valid; | ||
119 | struct drm_mode_modeinfo mode; | ||
120 | }; | ||
121 | |||
122 | #define DRM_MODE_ENCODER_NONE 0 | ||
123 | #define DRM_MODE_ENCODER_DAC 1 | ||
124 | #define DRM_MODE_ENCODER_TMDS 2 | ||
125 | #define DRM_MODE_ENCODER_LVDS 3 | ||
126 | #define DRM_MODE_ENCODER_TVDAC 4 | ||
127 | |||
128 | struct drm_mode_get_encoder { | ||
129 | uint32_t encoder_id; | ||
130 | uint32_t encoder_type; | ||
131 | |||
132 | uint32_t crtc_id; /**< Id of crtc */ | ||
133 | |||
134 | uint32_t possible_crtcs; | ||
135 | uint32_t possible_clones; | ||
136 | }; | ||
137 | |||
138 | /* This is for connectors with multiple signal types. */ | ||
139 | /* Try to match DRM_MODE_CONNECTOR_X as closely as possible. */ | ||
140 | #define DRM_MODE_SUBCONNECTOR_Automatic 0 | ||
141 | #define DRM_MODE_SUBCONNECTOR_Unknown 0 | ||
142 | #define DRM_MODE_SUBCONNECTOR_DVID 3 | ||
143 | #define DRM_MODE_SUBCONNECTOR_DVIA 4 | ||
144 | #define DRM_MODE_SUBCONNECTOR_Composite 5 | ||
145 | #define DRM_MODE_SUBCONNECTOR_SVIDEO 6 | ||
146 | #define DRM_MODE_SUBCONNECTOR_Component 8 | ||
147 | |||
148 | #define DRM_MODE_CONNECTOR_Unknown 0 | ||
149 | #define DRM_MODE_CONNECTOR_VGA 1 | ||
150 | #define DRM_MODE_CONNECTOR_DVII 2 | ||
151 | #define DRM_MODE_CONNECTOR_DVID 3 | ||
152 | #define DRM_MODE_CONNECTOR_DVIA 4 | ||
153 | #define DRM_MODE_CONNECTOR_Composite 5 | ||
154 | #define DRM_MODE_CONNECTOR_SVIDEO 6 | ||
155 | #define DRM_MODE_CONNECTOR_LVDS 7 | ||
156 | #define DRM_MODE_CONNECTOR_Component 8 | ||
157 | #define DRM_MODE_CONNECTOR_9PinDIN 9 | ||
158 | #define DRM_MODE_CONNECTOR_DisplayPort 10 | ||
159 | #define DRM_MODE_CONNECTOR_HDMIA 11 | ||
160 | #define DRM_MODE_CONNECTOR_HDMIB 12 | ||
161 | |||
162 | struct drm_mode_get_connector { | ||
163 | |||
164 | uint64_t encoders_ptr; | ||
165 | uint64_t modes_ptr; | ||
166 | uint64_t props_ptr; | ||
167 | uint64_t prop_values_ptr; | ||
168 | |||
169 | uint32_t count_modes; | ||
170 | uint32_t count_props; | ||
171 | uint32_t count_encoders; | ||
172 | |||
173 | uint32_t encoder_id; /**< Current Encoder */ | ||
174 | uint32_t connector_id; /**< Id */ | ||
175 | uint32_t connector_type; | ||
176 | uint32_t connector_type_id; | ||
177 | |||
178 | uint32_t connection; | ||
179 | uint32_t mm_width, mm_height; /**< HxW in millimeters */ | ||
180 | uint32_t subpixel; | ||
181 | }; | ||
182 | |||
183 | #define DRM_MODE_PROP_PENDING (1<<0) | ||
184 | #define DRM_MODE_PROP_RANGE (1<<1) | ||
185 | #define DRM_MODE_PROP_IMMUTABLE (1<<2) | ||
186 | #define DRM_MODE_PROP_ENUM (1<<3) /* enumerated type with text strings */ | ||
187 | #define DRM_MODE_PROP_BLOB (1<<4) | ||
188 | |||
189 | struct drm_mode_property_enum { | ||
190 | uint64_t value; | ||
191 | char name[DRM_PROP_NAME_LEN]; | ||
192 | }; | ||
193 | |||
194 | struct drm_mode_get_property { | ||
195 | uint64_t values_ptr; /* values and blob lengths */ | ||
196 | uint64_t enum_blob_ptr; /* enum and blob id ptrs */ | ||
197 | |||
198 | uint32_t prop_id; | ||
199 | uint32_t flags; | ||
200 | char name[DRM_PROP_NAME_LEN]; | ||
201 | |||
202 | uint32_t count_values; | ||
203 | uint32_t count_enum_blobs; | ||
204 | }; | ||
205 | |||
206 | struct drm_mode_connector_set_property { | ||
207 | uint64_t value; | ||
208 | uint32_t prop_id; | ||
209 | uint32_t connector_id; | ||
210 | }; | ||
211 | |||
212 | struct drm_mode_get_blob { | ||
213 | uint32_t blob_id; | ||
214 | uint32_t length; | ||
215 | uint64_t data; | ||
216 | }; | ||
217 | |||
218 | struct drm_mode_fb_cmd { | ||
219 | uint32_t fb_id; | ||
220 | uint32_t width, height; | ||
221 | uint32_t pitch; | ||
222 | uint32_t bpp; | ||
223 | uint32_t depth; | ||
224 | /* driver specific handle */ | ||
225 | uint32_t handle; | ||
226 | }; | ||
227 | |||
228 | struct drm_mode_mode_cmd { | ||
229 | uint32_t connector_id; | ||
230 | struct drm_mode_modeinfo mode; | ||
231 | }; | ||
232 | |||
233 | #define DRM_MODE_CURSOR_BO (1<<0) | ||
234 | #define DRM_MODE_CURSOR_MOVE (1<<1) | ||
235 | |||
236 | /* | ||
237 | * depending on the value in flags diffrent members are used. | ||
238 | * | ||
239 | * CURSOR_BO uses | ||
240 | * crtc | ||
241 | * width | ||
242 | * height | ||
243 | * handle - if 0 turns the cursor of | ||
244 | * | ||
245 | * CURSOR_MOVE uses | ||
246 | * crtc | ||
247 | * x | ||
248 | * y | ||
249 | */ | ||
250 | struct drm_mode_cursor { | ||
251 | uint32_t flags; | ||
252 | uint32_t crtc_id; | ||
253 | int32_t x; | ||
254 | int32_t y; | ||
255 | uint32_t width; | ||
256 | uint32_t height; | ||
257 | /* driver specific handle */ | ||
258 | uint32_t handle; | ||
259 | }; | ||
260 | |||
261 | struct drm_mode_crtc_lut { | ||
262 | uint32_t crtc_id; | ||
263 | uint32_t gamma_size; | ||
264 | |||
265 | /* pointers to arrays */ | ||
266 | uint64_t red; | ||
267 | uint64_t green; | ||
268 | uint64_t blue; | ||
269 | }; | ||
270 | |||
271 | #endif | ||
diff --git a/include/drm/drm_sarea.h b/include/drm/drm_sarea.h index 480037331e4e..ee5389d22c64 100644 --- a/include/drm/drm_sarea.h +++ b/include/drm/drm_sarea.h | |||
@@ -36,12 +36,12 @@ | |||
36 | 36 | ||
37 | /* SAREA area needs to be at least a page */ | 37 | /* SAREA area needs to be at least a page */ |
38 | #if defined(__alpha__) | 38 | #if defined(__alpha__) |
39 | #define SAREA_MAX 0x2000 | 39 | #define SAREA_MAX 0x2000U |
40 | #elif defined(__ia64__) | 40 | #elif defined(__ia64__) |
41 | #define SAREA_MAX 0x10000 /* 64kB */ | 41 | #define SAREA_MAX 0x10000U /* 64kB */ |
42 | #else | 42 | #else |
43 | /* Intel 830M driver needs at least 8k SAREA */ | 43 | /* Intel 830M driver needs at least 8k SAREA */ |
44 | #define SAREA_MAX 0x2000 | 44 | #define SAREA_MAX 0x2000U |
45 | #endif | 45 | #endif |
46 | 46 | ||
47 | /** Maximum number of drawables in the SAREA */ | 47 | /** Maximum number of drawables in the SAREA */ |
diff --git a/include/drm/i915_drm.h b/include/drm/i915_drm.h index 152b34da927c..b3bcf72dc656 100644 --- a/include/drm/i915_drm.h +++ b/include/drm/i915_drm.h | |||
@@ -113,8 +113,31 @@ typedef struct _drm_i915_sarea { | |||
113 | int pipeB_y; | 113 | int pipeB_y; |
114 | int pipeB_w; | 114 | int pipeB_w; |
115 | int pipeB_h; | 115 | int pipeB_h; |
116 | |||
117 | /* fill out some space for old userspace triple buffer */ | ||
118 | drm_handle_t unused_handle; | ||
119 | uint32_t unused1, unused2, unused3; | ||
120 | |||
121 | /* buffer object handles for static buffers. May change | ||
122 | * over the lifetime of the client. | ||
123 | */ | ||
124 | uint32_t front_bo_handle; | ||
125 | uint32_t back_bo_handle; | ||
126 | uint32_t unused_bo_handle; | ||
127 | uint32_t depth_bo_handle; | ||
128 | |||
116 | } drm_i915_sarea_t; | 129 | } drm_i915_sarea_t; |
117 | 130 | ||
131 | /* due to userspace building against these headers we need some compat here */ | ||
132 | #define planeA_x pipeA_x | ||
133 | #define planeA_y pipeA_y | ||
134 | #define planeA_w pipeA_w | ||
135 | #define planeA_h pipeA_h | ||
136 | #define planeB_x pipeB_x | ||
137 | #define planeB_y pipeB_y | ||
138 | #define planeB_w pipeB_w | ||
139 | #define planeB_h pipeB_h | ||
140 | |||
118 | /* Flags for perf_boxes | 141 | /* Flags for perf_boxes |
119 | */ | 142 | */ |
120 | #define I915_BOX_RING_EMPTY 0x1 | 143 | #define I915_BOX_RING_EMPTY 0x1 |
@@ -160,6 +183,7 @@ typedef struct _drm_i915_sarea { | |||
160 | #define DRM_I915_GEM_SET_TILING 0x21 | 183 | #define DRM_I915_GEM_SET_TILING 0x21 |
161 | #define DRM_I915_GEM_GET_TILING 0x22 | 184 | #define DRM_I915_GEM_GET_TILING 0x22 |
162 | #define DRM_I915_GEM_GET_APERTURE 0x23 | 185 | #define DRM_I915_GEM_GET_APERTURE 0x23 |
186 | #define DRM_I915_GEM_MMAP_GTT 0x24 | ||
163 | 187 | ||
164 | #define DRM_IOCTL_I915_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t) | 188 | #define DRM_IOCTL_I915_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t) |
165 | #define DRM_IOCTL_I915_FLUSH DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLUSH) | 189 | #define DRM_IOCTL_I915_FLUSH DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLUSH) |
@@ -177,6 +201,8 @@ typedef struct _drm_i915_sarea { | |||
177 | #define DRM_IOCTL_I915_SET_VBLANK_PIPE DRM_IOW( DRM_COMMAND_BASE + DRM_I915_SET_VBLANK_PIPE, drm_i915_vblank_pipe_t) | 201 | #define DRM_IOCTL_I915_SET_VBLANK_PIPE DRM_IOW( DRM_COMMAND_BASE + DRM_I915_SET_VBLANK_PIPE, drm_i915_vblank_pipe_t) |
178 | #define DRM_IOCTL_I915_GET_VBLANK_PIPE DRM_IOR( DRM_COMMAND_BASE + DRM_I915_GET_VBLANK_PIPE, drm_i915_vblank_pipe_t) | 202 | #define DRM_IOCTL_I915_GET_VBLANK_PIPE DRM_IOR( DRM_COMMAND_BASE + DRM_I915_GET_VBLANK_PIPE, drm_i915_vblank_pipe_t) |
179 | #define DRM_IOCTL_I915_VBLANK_SWAP DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_VBLANK_SWAP, drm_i915_vblank_swap_t) | 203 | #define DRM_IOCTL_I915_VBLANK_SWAP DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_VBLANK_SWAP, drm_i915_vblank_swap_t) |
204 | #define DRM_IOCTL_I915_GEM_INIT DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_INIT, struct drm_i915_gem_init) | ||
205 | #define DRM_IOCTL_I915_GEM_EXECBUFFER DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_EXECBUFFER, struct drm_i915_gem_execbuffer) | ||
180 | #define DRM_IOCTL_I915_GEM_PIN DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_PIN, struct drm_i915_gem_pin) | 206 | #define DRM_IOCTL_I915_GEM_PIN DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_PIN, struct drm_i915_gem_pin) |
181 | #define DRM_IOCTL_I915_GEM_UNPIN DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_UNPIN, struct drm_i915_gem_unpin) | 207 | #define DRM_IOCTL_I915_GEM_UNPIN DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_UNPIN, struct drm_i915_gem_unpin) |
182 | #define DRM_IOCTL_I915_GEM_BUSY DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_BUSY, struct drm_i915_gem_busy) | 208 | #define DRM_IOCTL_I915_GEM_BUSY DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_BUSY, struct drm_i915_gem_busy) |
@@ -187,6 +213,7 @@ typedef struct _drm_i915_sarea { | |||
187 | #define DRM_IOCTL_I915_GEM_PREAD DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PREAD, struct drm_i915_gem_pread) | 213 | #define DRM_IOCTL_I915_GEM_PREAD DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PREAD, struct drm_i915_gem_pread) |
188 | #define DRM_IOCTL_I915_GEM_PWRITE DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PWRITE, struct drm_i915_gem_pwrite) | 214 | #define DRM_IOCTL_I915_GEM_PWRITE DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PWRITE, struct drm_i915_gem_pwrite) |
189 | #define DRM_IOCTL_I915_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP, struct drm_i915_gem_mmap) | 215 | #define DRM_IOCTL_I915_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP, struct drm_i915_gem_mmap) |
216 | #define DRM_IOCTL_I915_GEM_MMAP_GTT DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP_GTT, struct drm_i915_gem_mmap_gtt) | ||
190 | #define DRM_IOCTL_I915_GEM_SET_DOMAIN DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_SET_DOMAIN, struct drm_i915_gem_set_domain) | 217 | #define DRM_IOCTL_I915_GEM_SET_DOMAIN DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_SET_DOMAIN, struct drm_i915_gem_set_domain) |
191 | #define DRM_IOCTL_I915_GEM_SW_FINISH DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_SW_FINISH, struct drm_i915_gem_sw_finish) | 218 | #define DRM_IOCTL_I915_GEM_SW_FINISH DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_SW_FINISH, struct drm_i915_gem_sw_finish) |
192 | #define DRM_IOCTL_I915_GEM_SET_TILING DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_SET_TILING, struct drm_i915_gem_set_tiling) | 219 | #define DRM_IOCTL_I915_GEM_SET_TILING DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_SET_TILING, struct drm_i915_gem_set_tiling) |
@@ -196,7 +223,7 @@ typedef struct _drm_i915_sarea { | |||
196 | /* Allow drivers to submit batchbuffers directly to hardware, relying | 223 | /* Allow drivers to submit batchbuffers directly to hardware, relying |
197 | * on the security mechanisms provided by hardware. | 224 | * on the security mechanisms provided by hardware. |
198 | */ | 225 | */ |
199 | typedef struct _drm_i915_batchbuffer { | 226 | typedef struct drm_i915_batchbuffer { |
200 | int start; /* agp offset */ | 227 | int start; /* agp offset */ |
201 | int used; /* nr bytes in use */ | 228 | int used; /* nr bytes in use */ |
202 | int DR1; /* hw flags for GFX_OP_DRAWRECT_INFO */ | 229 | int DR1; /* hw flags for GFX_OP_DRAWRECT_INFO */ |
@@ -382,6 +409,18 @@ struct drm_i915_gem_mmap { | |||
382 | uint64_t addr_ptr; | 409 | uint64_t addr_ptr; |
383 | }; | 410 | }; |
384 | 411 | ||
412 | struct drm_i915_gem_mmap_gtt { | ||
413 | /** Handle for the object being mapped. */ | ||
414 | uint32_t handle; | ||
415 | uint32_t pad; | ||
416 | /** | ||
417 | * Fake offset to use for subsequent mmap call | ||
418 | * | ||
419 | * This is a fixed-size type for 32/64 compatibility. | ||
420 | */ | ||
421 | uint64_t offset; | ||
422 | }; | ||
423 | |||
385 | struct drm_i915_gem_set_domain { | 424 | struct drm_i915_gem_set_domain { |
386 | /** Handle for the object */ | 425 | /** Handle for the object */ |
387 | uint32_t handle; | 426 | uint32_t handle; |
diff --git a/include/linux/console.h b/include/linux/console.h index 248e6e3b9b73..a67a90cf8268 100644 --- a/include/linux/console.h +++ b/include/linux/console.h | |||
@@ -153,4 +153,8 @@ void vcs_remove_sysfs(struct tty_struct *tty); | |||
153 | #define VESA_HSYNC_SUSPEND 2 | 153 | #define VESA_HSYNC_SUSPEND 2 |
154 | #define VESA_POWERDOWN 3 | 154 | #define VESA_POWERDOWN 3 |
155 | 155 | ||
156 | #ifdef CONFIG_VGA_CONSOLE | ||
157 | extern bool vgacon_text_force(void); | ||
158 | #endif | ||
159 | |||
156 | #endif /* _LINUX_CONSOLE_H */ | 160 | #endif /* _LINUX_CONSOLE_H */ |