mirror of
https://github.com/torvalds/linux.git
synced 2024-12-17 00:21:32 +00:00
drm/nv50: Keep track of the head a channel is vsync'ing to.
In a multihead setup vblank interrupts may end up enabled in both heads. In that case we want to ignore the vblank interrupts coming from the wrong CRTC to avoid tearing and unbalanced calls to drm_vblank_get/put (fdo bug 31074). Reported-by: Felix Leimbach <felix.leimbach@gmx.net> Signed-off-by: Francisco Jerez <currojerez@riseup.net> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
1c180fa5bd
commit
1f6d2de2c5
@ -257,6 +257,7 @@ struct nouveau_channel {
|
||||
|
||||
struct {
|
||||
struct nouveau_gpuobj *vblsem;
|
||||
uint32_t vblsem_head;
|
||||
uint32_t vblsem_offset;
|
||||
uint32_t vblsem_rval;
|
||||
struct list_head vbl_wait;
|
||||
|
@ -432,6 +432,9 @@ nv50_display_vblank_crtc_handler(struct drm_device *dev, int crtc)
|
||||
|
||||
list_for_each_entry_safe(chan, tmp, &dev_priv->vbl_waiting,
|
||||
nvsw.vbl_wait) {
|
||||
if (chan->nvsw.vblsem_head != crtc)
|
||||
continue;
|
||||
|
||||
nouveau_bo_wr32(chan->notifier_bo, chan->nvsw.vblsem_offset,
|
||||
chan->nvsw.vblsem_rval);
|
||||
list_del(&chan->nvsw.vbl_wait);
|
||||
|
@ -387,7 +387,10 @@ nv50_graph_nvsw_vblsem_release(struct nouveau_channel *chan,
|
||||
return -EINVAL;
|
||||
|
||||
drm_vblank_get(dev, data);
|
||||
|
||||
chan->nvsw.vblsem_head = data;
|
||||
list_add(&chan->nvsw.vbl_wait, &dev_priv->vbl_waiting);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user