Commit 4a5431af authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/kms/nv50: update vblank state in response to modeset actions

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 587f577e
...@@ -3940,6 +3940,8 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state) ...@@ -3940,6 +3940,8 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state)
NV_ATOMIC(drm, "%s: clr %04x (set %04x)\n", crtc->name, NV_ATOMIC(drm, "%s: clr %04x (set %04x)\n", crtc->name,
asyh->clr.mask, asyh->set.mask); asyh->clr.mask, asyh->set.mask);
if (crtc_state->active && !asyh->state.active)
drm_crtc_vblank_off(crtc);
if (asyh->clr.mask) { if (asyh->clr.mask) {
nv50_head_flush_clr(head, asyh, atom->flush_disable); nv50_head_flush_clr(head, asyh, atom->flush_disable);
...@@ -4025,11 +4027,13 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state) ...@@ -4025,11 +4027,13 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state)
nv50_head_flush_set(head, asyh); nv50_head_flush_set(head, asyh);
interlock_core = 1; interlock_core = 1;
} }
}
for_each_crtc_in_state(state, crtc, crtc_state, i) { if (asyh->state.active) {
if (crtc->state->event) if (!crtc_state->active)
drm_crtc_vblank_get(crtc); drm_crtc_vblank_on(crtc);
if (asyh->state.event)
drm_crtc_vblank_get(crtc);
}
} }
/* Update plane(s). */ /* Update plane(s). */
...@@ -4076,12 +4080,14 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state) ...@@ -4076,12 +4080,14 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state)
if (crtc->state->event) { if (crtc->state->event) {
unsigned long flags; unsigned long flags;
/* Get correct count/ts if racing with vblank irq */ /* Get correct count/ts if racing with vblank irq */
drm_accurate_vblank_count(crtc); if (crtc->state->active)
drm_accurate_vblank_count(crtc);
spin_lock_irqsave(&crtc->dev->event_lock, flags); spin_lock_irqsave(&crtc->dev->event_lock, flags);
drm_crtc_send_vblank_event(crtc, crtc->state->event); drm_crtc_send_vblank_event(crtc, crtc->state->event);
spin_unlock_irqrestore(&crtc->dev->event_lock, flags); spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
crtc->state->event = NULL; crtc->state->event = NULL;
drm_crtc_vblank_put(crtc); if (crtc->state->active)
drm_crtc_vblank_put(crtc);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment