aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/nouveau/nv50_display.c
diff options
context:
space:
mode:
authorFrancisco Jerez <currojerez@riseup.net>2010-10-21 12:19:29 -0400
committerBen Skeggs <bskeggs@redhat.com>2010-12-03 00:11:11 -0500
commit042206c0cd4924879c4292c5ffa2bf1e8023ae5a (patch)
treec775b823b4e3d598e4fc41023a96e2e4b3126c20 /drivers/gpu/drm/nouveau/nv50_display.c
parent63f7fcfebd2ff1995b649101d6120b60fa0e5b06 (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.c16
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
428nv50_display_vblank_crtc_handler(struct drm_device *dev, int crtc) 428nv50_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
443static void 444static void
444nv50_display_vblank_handler(struct drm_device *dev, uint32_t intr) 445nv50_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
458static void 456static void