diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2017-07-23 21:01:52 -0400 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2017-07-23 22:15:24 -0400 |
commit | 4a5431af19bc52c4dd491e989543c66a52380f00 (patch) | |
tree | 330e7753d55be582d6abbfcbce5215b9e889aaf0 | |
parent | 587f577e0beb4d20ee60bac8d21134b4c5a9fd29 (diff) |
drm/nouveau/kms/nv50: update vblank state in response to modeset actions
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r-- | drivers/gpu/drm/nouveau/nv50_display.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c index 06b9670005bb..2bc0dc985214 100644 --- a/drivers/gpu/drm/nouveau/nv50_display.c +++ b/drivers/gpu/drm/nouveau/nv50_display.c | |||
@@ -3940,6 +3940,8 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state) | |||
3940 | 3940 | ||
3941 | NV_ATOMIC(drm, "%s: clr %04x (set %04x)\n", crtc->name, | 3941 | NV_ATOMIC(drm, "%s: clr %04x (set %04x)\n", crtc->name, |
3942 | asyh->clr.mask, asyh->set.mask); | 3942 | asyh->clr.mask, asyh->set.mask); |
3943 | if (crtc_state->active && !asyh->state.active) | ||
3944 | drm_crtc_vblank_off(crtc); | ||
3943 | 3945 | ||
3944 | if (asyh->clr.mask) { | 3946 | if (asyh->clr.mask) { |
3945 | nv50_head_flush_clr(head, asyh, atom->flush_disable); | 3947 | nv50_head_flush_clr(head, asyh, atom->flush_disable); |
@@ -4025,11 +4027,13 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state) | |||
4025 | nv50_head_flush_set(head, asyh); | 4027 | nv50_head_flush_set(head, asyh); |
4026 | interlock_core = 1; | 4028 | interlock_core = 1; |
4027 | } | 4029 | } |
4028 | } | ||
4029 | 4030 | ||
4030 | for_each_crtc_in_state(state, crtc, crtc_state, i) { | 4031 | if (asyh->state.active) { |
4031 | if (crtc->state->event) | 4032 | if (!crtc_state->active) |
4032 | drm_crtc_vblank_get(crtc); | 4033 | drm_crtc_vblank_on(crtc); |
4034 | if (asyh->state.event) | ||
4035 | drm_crtc_vblank_get(crtc); | ||
4036 | } | ||
4033 | } | 4037 | } |
4034 | 4038 | ||
4035 | /* Update plane(s). */ | 4039 | /* Update plane(s). */ |
@@ -4076,12 +4080,14 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state) | |||
4076 | if (crtc->state->event) { | 4080 | if (crtc->state->event) { |
4077 | unsigned long flags; | 4081 | unsigned long flags; |
4078 | /* Get correct count/ts if racing with vblank irq */ | 4082 | /* Get correct count/ts if racing with vblank irq */ |
4079 | drm_accurate_vblank_count(crtc); | 4083 | if (crtc->state->active) |
4084 | drm_accurate_vblank_count(crtc); | ||
4080 | spin_lock_irqsave(&crtc->dev->event_lock, flags); | 4085 | spin_lock_irqsave(&crtc->dev->event_lock, flags); |
4081 | drm_crtc_send_vblank_event(crtc, crtc->state->event); | 4086 | drm_crtc_send_vblank_event(crtc, crtc->state->event); |
4082 | spin_unlock_irqrestore(&crtc->dev->event_lock, flags); | 4087 | spin_unlock_irqrestore(&crtc->dev->event_lock, flags); |
4083 | crtc->state->event = NULL; | 4088 | crtc->state->event = NULL; |
4084 | drm_crtc_vblank_put(crtc); | 4089 | if (crtc->state->active) |
4090 | drm_crtc_vblank_put(crtc); | ||
4085 | } | 4091 | } |
4086 | } | 4092 | } |
4087 | 4093 | ||