aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnder Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>2017-04-04 12:52:21 -0400
committerDaniel Stone <daniels@collabora.com>2017-04-04 15:59:12 -0400
commit5db06a8a98f515f67446a69c57577c4c363ec65d (patch)
treed9c5720e05dd7727bb2ed4ca2a1e8504be88d450
parent1bbfe9d1a315bb573d4f10bbf443b68b5ddac473 (diff)
drm: Pass CRTC ID in userspace vblank events
With the atomic API, it is possible that a single commit affects multiple crtcs. If the user requests an event with that commit, one event will be sent for each CRTC, but it is not possible to distinguish which crtc an event is for in user space. To solve this, the reserved field in struct drm_vblank_event is repurposed to include the crtc_id which the event is for. The DRM_CAP_CRTC_IN_VBLANK_EVENT is added to allow userspace to query if the crtc field will be set properly. [daniels: Rebased, using Maarten's forward-port.] Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com> Signed-off-by: Daniel Stone <daniels@collabora.com> Cc: Maarten Lankhorst <maarten.lankhorst@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20170404165221.28240-2-daniels@collabora.com
-rw-r--r--drivers/gpu/drm/drm_ioctl.c3
-rw-r--r--drivers/gpu/drm/drm_irq.c2
-rw-r--r--include/uapi/drm/drm.h3
3 files changed, 7 insertions, 1 deletions
diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
index 9f4241f0dd9c..865e3ee4d743 100644
--- a/drivers/gpu/drm/drm_ioctl.c
+++ b/drivers/gpu/drm/drm_ioctl.c
@@ -286,6 +286,9 @@ static int drm_getcap(struct drm_device *dev, void *data, struct drm_file *file_
286 case DRM_CAP_ADDFB2_MODIFIERS: 286 case DRM_CAP_ADDFB2_MODIFIERS:
287 req->value = dev->mode_config.allow_fb_modifiers; 287 req->value = dev->mode_config.allow_fb_modifiers;
288 break; 288 break;
289 case DRM_CAP_CRTC_IN_VBLANK_EVENT:
290 req->value = 1;
291 break;
289 default: 292 default:
290 return -EINVAL; 293 return -EINVAL;
291 } 294 }
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
index dac1b2593cb1..8c866cac62dd 100644
--- a/drivers/gpu/drm/drm_irq.c
+++ b/drivers/gpu/drm/drm_irq.c
@@ -1026,6 +1026,7 @@ void drm_crtc_arm_vblank_event(struct drm_crtc *crtc,
1026 1026
1027 e->pipe = pipe; 1027 e->pipe = pipe;
1028 e->event.sequence = drm_vblank_count(dev, pipe); 1028 e->event.sequence = drm_vblank_count(dev, pipe);
1029 e->event.crtc_id = crtc->base.id;
1029 list_add_tail(&e->base.link, &dev->vblank_event_list); 1030 list_add_tail(&e->base.link, &dev->vblank_event_list);
1030} 1031}
1031EXPORT_SYMBOL(drm_crtc_arm_vblank_event); 1032EXPORT_SYMBOL(drm_crtc_arm_vblank_event);
@@ -1056,6 +1057,7 @@ void drm_crtc_send_vblank_event(struct drm_crtc *crtc,
1056 now = get_drm_timestamp(); 1057 now = get_drm_timestamp();
1057 } 1058 }
1058 e->pipe = pipe; 1059 e->pipe = pipe;
1060 e->event.crtc_id = crtc->base.id;
1059 send_vblank_event(dev, e, seq, &now); 1061 send_vblank_event(dev, e, seq, &now);
1060} 1062}
1061EXPORT_SYMBOL(drm_crtc_send_vblank_event); 1063EXPORT_SYMBOL(drm_crtc_send_vblank_event);
diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
index b2c52843bc70..42d9f64ce416 100644
--- a/include/uapi/drm/drm.h
+++ b/include/uapi/drm/drm.h
@@ -647,6 +647,7 @@ struct drm_gem_open {
647#define DRM_CAP_CURSOR_HEIGHT 0x9 647#define DRM_CAP_CURSOR_HEIGHT 0x9
648#define DRM_CAP_ADDFB2_MODIFIERS 0x10 648#define DRM_CAP_ADDFB2_MODIFIERS 0x10
649#define DRM_CAP_PAGE_FLIP_TARGET 0x11 649#define DRM_CAP_PAGE_FLIP_TARGET 0x11
650#define DRM_CAP_CRTC_IN_VBLANK_EVENT 0x12
650 651
651/** DRM_IOCTL_GET_CAP ioctl argument type */ 652/** DRM_IOCTL_GET_CAP ioctl argument type */
652struct drm_get_cap { 653struct drm_get_cap {
@@ -851,7 +852,7 @@ struct drm_event_vblank {
851 __u32 tv_sec; 852 __u32 tv_sec;
852 __u32 tv_usec; 853 __u32 tv_usec;
853 __u32 sequence; 854 __u32 sequence;
854 __u32 reserved; 855 __u32 crtc_id; /* 0 on older kernels that do not support this */
855}; 856};
856 857
857/* typedef area */ 858/* typedef area */