On Tue, Oct 10, 2017 at 05:45:13PM -0700, Keith Packard wrote: > Place drm_event_vblank in a new union that includes that and a bare > drm_event structure. This will allow new members of that union to be > added in the future without changing code related to the existing vbl > event type. > > Assignments to the crtc_id field are now done when the event is > allocated, rather than when delievered. This way, delivery doesn't > need to have the crtc ID available. > > v2: > * Remove 'dev' argument from create_vblank_event > > It wasn't being used anyways, and if we need it in the future, > we can always get it from crtc->dev. > > * Check for MODESETTING before looking for crtc in queue_vblank_event > > UMS drivers will oops if we try to get a crtc, so make sure > we're modesetting before we try to find a crtc_id to fill into > the event. > > Signed-off-by: Keith Packard <keithp@xxxxxxxxxx> Reviewed-by: Sean Paul <seanpaul@xxxxxxxxxxxx> > --- > drivers/gpu/drm/drm_atomic.c | 7 ++++--- > drivers/gpu/drm/drm_plane.c | 2 +- > drivers/gpu/drm/drm_vblank.c | 30 ++++++++++++++++++------------ > drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c | 4 ++-- > drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c | 4 ++-- > include/drm/drm_vblank.h | 8 +++++++- > 6 files changed, 34 insertions(+), 21 deletions(-) > > diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c > index 366c56fe5f58..08ff1b023f7b 100644 > --- a/drivers/gpu/drm/drm_atomic.c > +++ b/drivers/gpu/drm/drm_atomic.c > @@ -1815,7 +1815,7 @@ int drm_atomic_debugfs_init(struct drm_minor *minor) > */ > > static struct drm_pending_vblank_event *create_vblank_event( > - struct drm_device *dev, uint64_t user_data) > + struct drm_crtc *crtc, uint64_t user_data) > { > struct drm_pending_vblank_event *e = NULL; > > @@ -1825,7 +1825,8 @@ static struct drm_pending_vblank_event *create_vblank_event( > > e->event.base.type = DRM_EVENT_FLIP_COMPLETE; > e->event.base.length = sizeof(e->event); > - e->event.user_data = user_data; > + e->event.vbl.crtc_id = crtc->base.id; > + e->event.vbl.user_data = user_data; > > return e; > } > @@ -2079,7 +2080,7 @@ static int prepare_crtc_signaling(struct drm_device *dev, > if (arg->flags & DRM_MODE_PAGE_FLIP_EVENT || fence_ptr) { > struct drm_pending_vblank_event *e; > > - e = create_vblank_event(dev, arg->user_data); > + e = create_vblank_event(crtc, arg->user_data); > if (!e) > return -ENOMEM; > > diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c > index 72cba9805edc..192071209baa 100644 > --- a/drivers/gpu/drm/drm_plane.c > +++ b/drivers/gpu/drm/drm_plane.c > @@ -1039,7 +1039,7 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev, > } > e->event.base.type = DRM_EVENT_FLIP_COMPLETE; > e->event.base.length = sizeof(e->event); > - e->event.user_data = page_flip->user_data; > + e->event.vbl.user_data = page_flip->user_data; > ret = drm_event_reserve_init(dev, file_priv, &e->base, &e->event.base); > if (ret) { > kfree(e); > diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c > index 8c3f2fdd821a..7d2674e0362a 100644 > --- a/drivers/gpu/drm/drm_vblank.c > +++ b/drivers/gpu/drm/drm_vblank.c > @@ -823,14 +823,16 @@ static void send_vblank_event(struct drm_device *dev, > { > struct timeval tv; > > - tv = ktime_to_timeval(now); > - e->event.sequence = seq; > - e->event.tv_sec = tv.tv_sec; > - e->event.tv_usec = tv.tv_usec; > - > - trace_drm_vblank_event_delivered(e->base.file_priv, e->pipe, > - e->event.sequence); > - > + switch (e->event.base.type) { > + case DRM_EVENT_VBLANK: > + case DRM_EVENT_FLIP_COMPLETE: > + tv = ktime_to_timeval(now); > + e->event.vbl.sequence = seq; > + e->event.vbl.tv_sec = tv.tv_sec; > + e->event.vbl.tv_usec = tv.tv_usec; > + break; > + } > + trace_drm_vblank_event_delivered(e->base.file_priv, e->pipe, seq); > drm_send_event_locked(dev, &e->base); > } > > @@ -882,7 +884,6 @@ void drm_crtc_arm_vblank_event(struct drm_crtc *crtc, > > e->pipe = pipe; > e->sequence = drm_vblank_count(dev, pipe); > - e->event.crtc_id = crtc->base.id; > list_add_tail(&e->base.link, &dev->vblank_event_list); > } > EXPORT_SYMBOL(drm_crtc_arm_vblank_event); > @@ -913,7 +914,6 @@ void drm_crtc_send_vblank_event(struct drm_crtc *crtc, > now = get_drm_timestamp(); > } > e->pipe = pipe; > - e->event.crtc_id = crtc->base.id; > send_vblank_event(dev, e, seq, now); > } > EXPORT_SYMBOL(drm_crtc_send_vblank_event); > @@ -1347,8 +1347,14 @@ static int drm_queue_vblank_event(struct drm_device *dev, unsigned int pipe, > > e->pipe = pipe; > e->event.base.type = DRM_EVENT_VBLANK; > - e->event.base.length = sizeof(e->event); > - e->event.user_data = vblwait->request.signal; > + e->event.base.length = sizeof(e->event.vbl); > + e->event.vbl.user_data = vblwait->request.signal; > + e->event.vbl.crtc_id = 0; > + if (drm_core_check_feature(dev, DRIVER_MODESET)) { > + struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe); > + if (crtc) > + e->event.vbl.crtc_id = crtc->base.id; > + } > > spin_lock_irqsave(&dev->event_lock, flags); > > diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c > index d1552d3e0652..bc5f6026573d 100644 > --- a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c > +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c > @@ -360,8 +360,8 @@ static int vmw_sou_crtc_page_flip(struct drm_crtc *crtc, > > ret = vmw_event_fence_action_queue(file_priv, fence, > &event->base, > - &event->event.tv_sec, > - &event->event.tv_usec, > + &event->event.vbl.tv_sec, > + &event->event.vbl.tv_usec, > true); > } > > diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c > index ca3afae2db1f..90b5437fd787 100644 > --- a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c > +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c > @@ -549,8 +549,8 @@ static int vmw_stdu_crtc_page_flip(struct drm_crtc *crtc, > > ret = vmw_event_fence_action_queue(file_priv, fence, > &event->base, > - &event->event.tv_sec, > - &event->event.tv_usec, > + &event->event.vbl.tv_sec, > + &event->event.vbl.tv_usec, > true); > vmw_fence_obj_unreference(&fence); > } else { > diff --git a/include/drm/drm_vblank.h b/include/drm/drm_vblank.h > index cce53130510f..bf8e07035a0a 100644 > --- a/include/drm/drm_vblank.h > +++ b/include/drm/drm_vblank.h > @@ -54,7 +54,10 @@ struct drm_pending_vblank_event { > /** > * @event: Actual event which will be sent to userspace. > */ > - struct drm_event_vblank event; > + union { > + struct drm_event base; > + struct drm_event_vblank vbl; > + } event; > }; > > /** > @@ -163,6 +166,9 @@ void drm_crtc_send_vblank_event(struct drm_crtc *crtc, > struct drm_pending_vblank_event *e); > void drm_crtc_arm_vblank_event(struct drm_crtc *crtc, > struct drm_pending_vblank_event *e); > +void drm_vblank_set_event(struct drm_pending_vblank_event *e, > + u64 *seq, > + ktime_t *now); > bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe); > bool drm_crtc_handle_vblank(struct drm_crtc *crtc); > int drm_crtc_vblank_get(struct drm_crtc *crtc); > -- > 2.13.3 > > _______________________________________________ > dri-devel mailing list > dri-devel@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel