diff options
Diffstat (limited to 'drivers/gpu/drm/nouveau/nv50_display.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nv50_display.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c index 5c41612723b4..b244d9968c5d 100644 --- a/drivers/gpu/drm/nouveau/nv50_display.c +++ b/drivers/gpu/drm/nouveau/nv50_display.c | |||
@@ -646,7 +646,30 @@ nv50_display_script_select(struct drm_device *dev, struct dcb_entry *dcb, | |||
646 | static void | 646 | static void |
647 | nv50_display_vblank_crtc_handler(struct drm_device *dev, int crtc) | 647 | nv50_display_vblank_crtc_handler(struct drm_device *dev, int crtc) |
648 | { | 648 | { |
649 | nouveau_software_vblank(dev, crtc); | 649 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
650 | struct nouveau_software_priv *psw = nv_engine(dev, NVOBJ_ENGINE_SW); | ||
651 | struct nouveau_software_chan *pch, *tmp; | ||
652 | |||
653 | list_for_each_entry_safe(pch, tmp, &psw->vblank, vblank.list) { | ||
654 | if (pch->vblank.head != crtc) | ||
655 | continue; | ||
656 | |||
657 | spin_lock(&psw->peephole_lock); | ||
658 | nv_wr32(dev, 0x001704, pch->vblank.channel); | ||
659 | nv_wr32(dev, 0x001710, 0x80000000 | pch->vblank.ctxdma); | ||
660 | if (dev_priv->chipset == 0x50) { | ||
661 | nv_wr32(dev, 0x001570, pch->vblank.offset); | ||
662 | nv_wr32(dev, 0x001574, pch->vblank.value); | ||
663 | } else { | ||
664 | nv_wr32(dev, 0x060010, pch->vblank.offset); | ||
665 | nv_wr32(dev, 0x060014, pch->vblank.value); | ||
666 | } | ||
667 | spin_unlock(&psw->peephole_lock); | ||
668 | |||
669 | list_del(&pch->vblank.list); | ||
670 | drm_vblank_put(dev, crtc); | ||
671 | } | ||
672 | |||
650 | drm_handle_vblank(dev, crtc); | 673 | drm_handle_vblank(dev, crtc); |
651 | } | 674 | } |
652 | 675 | ||