diff options
author | Francisco Jerez <currojerez@riseup.net> | 2010-10-21 12:19:29 -0400 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2010-12-03 00:11:11 -0500 |
commit | 042206c0cd4924879c4292c5ffa2bf1e8023ae5a (patch) | |
tree | c775b823b4e3d598e4fc41023a96e2e4b3126c20 /drivers/gpu/drm/nouveau/nv50_display.c | |
parent | 63f7fcfebd2ff1995b649101d6120b60fa0e5b06 (diff) |
drm/nouveau: Implement the vblank DRM hooks.
Signed-off-by: Francisco Jerez <currojerez@riseup.net>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/nv50_display.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nv50_display.c | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c index 99871e304d1..17b950abf20 100644 --- a/drivers/gpu/drm/nouveau/nv50_display.c +++ b/drivers/gpu/drm/nouveau/nv50_display.c | |||
@@ -428,31 +428,29 @@ static void | |||
428 | nv50_display_vblank_crtc_handler(struct drm_device *dev, int crtc) | 428 | nv50_display_vblank_crtc_handler(struct drm_device *dev, int crtc) |
429 | { | 429 | { |
430 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 430 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
431 | struct nouveau_channel *chan; | 431 | struct nouveau_channel *chan, *tmp; |
432 | struct list_head *entry, *tmp; | ||
433 | |||
434 | list_for_each_safe(entry, tmp, &dev_priv->vbl_waiting) { | ||
435 | chan = list_entry(entry, struct nouveau_channel, nvsw.vbl_wait); | ||
436 | 432 | ||
433 | list_for_each_entry_safe(chan, tmp, &dev_priv->vbl_waiting, | ||
434 | nvsw.vbl_wait) { | ||
437 | nouveau_bo_wr32(chan->notifier_bo, chan->nvsw.vblsem_offset, | 435 | nouveau_bo_wr32(chan->notifier_bo, chan->nvsw.vblsem_offset, |
438 | chan->nvsw.vblsem_rval); | 436 | chan->nvsw.vblsem_rval); |
439 | list_del(&chan->nvsw.vbl_wait); | 437 | list_del(&chan->nvsw.vbl_wait); |
438 | drm_vblank_put(dev, crtc); | ||
440 | } | 439 | } |
440 | |||
441 | drm_handle_vblank(dev, crtc); | ||
441 | } | 442 | } |
442 | 443 | ||
443 | static void | 444 | static void |
444 | nv50_display_vblank_handler(struct drm_device *dev, uint32_t intr) | 445 | nv50_display_vblank_handler(struct drm_device *dev, uint32_t intr) |
445 | { | 446 | { |
446 | intr &= NV50_PDISPLAY_INTR_1_VBLANK_CRTC; | ||
447 | |||
448 | if (intr & NV50_PDISPLAY_INTR_1_VBLANK_CRTC_0) | 447 | if (intr & NV50_PDISPLAY_INTR_1_VBLANK_CRTC_0) |
449 | nv50_display_vblank_crtc_handler(dev, 0); | 448 | nv50_display_vblank_crtc_handler(dev, 0); |
450 | 449 | ||
451 | if (intr & NV50_PDISPLAY_INTR_1_VBLANK_CRTC_1) | 450 | if (intr & NV50_PDISPLAY_INTR_1_VBLANK_CRTC_1) |
452 | nv50_display_vblank_crtc_handler(dev, 1); | 451 | nv50_display_vblank_crtc_handler(dev, 1); |
453 | 452 | ||
454 | nv_mask(dev, NV50_PDISPLAY_INTR_EN_1, intr, 0x00000000); | 453 | nv_wr32(dev, NV50_PDISPLAY_INTR_1, NV50_PDISPLAY_INTR_1_VBLANK_CRTC); |
455 | nv_wr32(dev, NV50_PDISPLAY_INTR_1, intr); | ||
456 | } | 454 | } |
457 | 455 | ||
458 | static void | 456 | static void |