aboutsummaryrefslogtreecommitdiffstats
path: root/include/drm/drmP.h
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2009-09-11 14:33:34 -0400
committerDave Airlie <airlied@redhat.com>2009-11-17 19:02:47 -0500
commitc9a9c5e02aedc1a2815877b0268f886d2640b771 (patch)
tree51f69f2ec6dcebb019cd6aa22b9e29ee48c397c1 /include/drm/drmP.h
parent799dd75b1a8380a967c929a4551895788c374b31 (diff)
drm: Add async event synchronization for drmWaitVblank
This patch adds a new flag to the drmWaitVblank ioctl, which asks the drm to return immediately and notify userspace when the specified vblank sequence happens by sending an event back on the drm fd. The event mechanism works with the other flags supported by the ioctls, specifically, the vblank sequence can be specified relatively or absolutely, and works for primary and seconday crtc. The signal field of the vblank request is used to provide user data, which will be sent back to user space in the vblank event. Signed-off-by: Kristian Høgsberg <krh@redhat.com> Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'include/drm/drmP.h')
-rw-r--r--include/drm/drmP.h26
1 files changed, 26 insertions, 0 deletions
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index c8e64bbadbcf..b0b36838ab11 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -426,6 +426,14 @@ struct drm_buf_entry {
426 struct drm_freelist freelist; 426 struct drm_freelist freelist;
427}; 427};
428 428
429/* Event queued up for userspace to read */
430struct drm_pending_event {
431 struct drm_event *event;
432 struct list_head link;
433 struct drm_file *file_priv;
434 void (*destroy)(struct drm_pending_event *event);
435};
436
429/** File private data */ 437/** File private data */
430struct drm_file { 438struct drm_file {
431 int authenticated; 439 int authenticated;
@@ -449,6 +457,10 @@ struct drm_file {
449 struct drm_master *master; /* master this node is currently associated with 457 struct drm_master *master; /* master this node is currently associated with
450 N.B. not always minor->master */ 458 N.B. not always minor->master */
451 struct list_head fbs; 459 struct list_head fbs;
460
461 wait_queue_head_t event_wait;
462 struct list_head event_list;
463 int event_space;
452}; 464};
453 465
454/** Wait queue */ 466/** Wait queue */
@@ -900,6 +912,12 @@ struct drm_minor {
900 struct drm_mode_group mode_group; 912 struct drm_mode_group mode_group;
901}; 913};
902 914
915struct drm_pending_vblank_event {
916 struct drm_pending_event base;
917 int pipe;
918 struct drm_event_vblank event;
919};
920
903/** 921/**
904 * DRM device structure. This structure represent a complete card that 922 * DRM device structure. This structure represent a complete card that
905 * may contain multiple heads. 923 * may contain multiple heads.
@@ -999,6 +1017,12 @@ struct drm_device {
999 1017
1000 u32 max_vblank_count; /**< size of vblank counter register */ 1018 u32 max_vblank_count; /**< size of vblank counter register */
1001 1019
1020 /**
1021 * List of events
1022 */
1023 struct list_head vblank_event_list;
1024 spinlock_t event_lock;
1025
1002 /*@} */ 1026 /*@} */
1003 cycles_t ctx_start; 1027 cycles_t ctx_start;
1004 cycles_t lck_start; 1028 cycles_t lck_start;
@@ -1135,6 +1159,8 @@ extern int drm_lastclose(struct drm_device *dev);
1135extern int drm_open(struct inode *inode, struct file *filp); 1159extern int drm_open(struct inode *inode, struct file *filp);
1136extern int drm_stub_open(struct inode *inode, struct file *filp); 1160extern int drm_stub_open(struct inode *inode, struct file *filp);
1137extern int drm_fasync(int fd, struct file *filp, int on); 1161extern int drm_fasync(int fd, struct file *filp, int on);
1162extern ssize_t drm_read(struct file *filp, char __user *buffer,
1163 size_t count, loff_t *offset);
1138extern int drm_release(struct inode *inode, struct file *filp); 1164extern int drm_release(struct inode *inode, struct file *filp);
1139 1165
1140 /* Mapping support (drm_vm.h) */ 1166 /* Mapping support (drm_vm.h) */