drm/nouveau: Fix merge commit

The most recent merge commit in airlied/drm-next has problems with
confusing old_crtc_state and new_crtc_state. Use the
for_each_oldnew_crtc_in_state macros to clean up the confusion,
and explicitly look at the correct state instead of looking at
asyh->state.

With these fixes it becomes more obvious what the code is trying to do,
which will hopefully prevent future confusion.

Cc: Dave Airlie <airlied@redhat.com>
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Maarten Lankhorst 2017-08-15 10:52:50 +02:00 committed by Dave Airlie
parent 0c697fafc6
commit efa479352f
1 changed files with 10 additions and 9 deletions

View File

@ -3897,7 +3897,7 @@ static void
nv50_disp_atomic_commit_tail(struct drm_atomic_state *state) nv50_disp_atomic_commit_tail(struct drm_atomic_state *state)
{ {
struct drm_device *dev = state->dev; struct drm_device *dev = state->dev;
struct drm_crtc_state *new_crtc_state; struct drm_crtc_state *new_crtc_state, *old_crtc_state;
struct drm_crtc *crtc; struct drm_crtc *crtc;
struct drm_plane_state *new_plane_state; struct drm_plane_state *new_plane_state;
struct drm_plane *plane; struct drm_plane *plane;
@ -3918,13 +3918,13 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state)
mutex_lock(&disp->mutex); mutex_lock(&disp->mutex);
/* Disable head(s). */ /* Disable head(s). */
for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) { for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
struct nv50_head_atom *asyh = nv50_head_atom(new_crtc_state); struct nv50_head_atom *asyh = nv50_head_atom(new_crtc_state);
struct nv50_head *head = nv50_head(crtc); struct nv50_head *head = nv50_head(crtc);
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 (new_crtc_state->active && !asyh->state.active) if (old_crtc_state->active && !new_crtc_state->active)
drm_crtc_vblank_off(crtc); drm_crtc_vblank_off(crtc);
if (asyh->clr.mask) { if (asyh->clr.mask) {
@ -4000,7 +4000,7 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state)
} }
/* Update head(s). */ /* Update head(s). */
for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) { for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
struct nv50_head_atom *asyh = nv50_head_atom(new_crtc_state); struct nv50_head_atom *asyh = nv50_head_atom(new_crtc_state);
struct nv50_head *head = nv50_head(crtc); struct nv50_head *head = nv50_head(crtc);
@ -4012,10 +4012,10 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state)
interlock_core = 1; interlock_core = 1;
} }
if (asyh->state.active) { if (new_crtc_state->active) {
if (!new_crtc_state->active) if (!old_crtc_state->active)
drm_crtc_vblank_on(crtc); drm_crtc_vblank_on(crtc);
if (asyh->state.event) if (new_crtc_state->event)
drm_crtc_vblank_get(crtc); drm_crtc_vblank_get(crtc);
} }
} }
@ -4064,13 +4064,14 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state)
if (new_crtc_state->event) { if (new_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 */
if (crtc->state->active) if (new_crtc_state->active)
drm_crtc_accurate_vblank_count(crtc); drm_crtc_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, new_crtc_state->event); drm_crtc_send_vblank_event(crtc, new_crtc_state->event);
spin_unlock_irqrestore(&crtc->dev->event_lock, flags); spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
new_crtc_state->event = NULL; new_crtc_state->event = NULL;
if (crtc->state->active) if (new_crtc_state->active)
drm_crtc_vblank_put(crtc); drm_crtc_vblank_put(crtc);
} }
} }