Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit af4870e4 authored by Mario Kleiner's avatar Mario Kleiner Committed by Ben Skeggs
Browse files

drm/nouveau/kms/nv04-nv40: fix pageflip events via special case.



Cards with nv04 display engine can't reliably use vblank
counts and timestamps computed via drm_handle_vblank(), as
the function gets invoked after sending the pageflip events.

Fix this by defaulting to the old crtcid = -1 fallback path
on <= NV-50 cards, and only using the precise path on NV-50
and later.

Signed-off-by: default avatarMario Kleiner <mario.kleiner.de@gmail.com>
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
Cc: <stable@vger.kernel.org> # 3.13+
parent dcfb1009
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -798,6 +798,7 @@ nouveau_finish_page_flip(struct nouveau_channel *chan,
	struct drm_device *dev = drm->dev;
	struct nouveau_page_flip_state *s;
	unsigned long flags;
	int crtcid = -1;

	spin_lock_irqsave(&dev->event_lock, flags);

@@ -808,8 +809,13 @@ nouveau_finish_page_flip(struct nouveau_channel *chan,
	}

	s = list_first_entry(&fctx->flip, struct nouveau_page_flip_state, head);
	if (s->event)
		drm_send_vblank_event(dev, s->crtc, s->event);
	if (s->event) {
		/* Vblank timestamps/counts are only correct on >= NV-50 */
		if (nv_device(drm->device)->card_type >= NV_50)
			crtcid = s->crtc;

		drm_send_vblank_event(dev, crtcid, s->event);
	}

	list_del(&s->head);
	if (ps)