forked from Minki/linux
drm/nvc0/disp: fix regression in vblank semaphore release
Signed-off-by: Kelly Doran <kel.p.doran@gmail.com> Reviewed-by: Maarten Lankhorst <maarten.lankhorst@canonical.com> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
7707b701eb
commit
11d92561c8
@ -22,6 +22,8 @@
|
|||||||
* Authors: Ben Skeggs
|
* Authors: Ben Skeggs
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <subdev/bar.h>
|
||||||
|
|
||||||
#include <engine/software.h>
|
#include <engine/software.h>
|
||||||
#include <engine/disp.h>
|
#include <engine/disp.h>
|
||||||
|
|
||||||
@ -37,6 +39,7 @@ nv50_disp_sclass[] = {
|
|||||||
static void
|
static void
|
||||||
nv50_disp_intr_vblank(struct nv50_disp_priv *priv, int crtc)
|
nv50_disp_intr_vblank(struct nv50_disp_priv *priv, int crtc)
|
||||||
{
|
{
|
||||||
|
struct nouveau_bar *bar = nouveau_bar(priv);
|
||||||
struct nouveau_disp *disp = &priv->base;
|
struct nouveau_disp *disp = &priv->base;
|
||||||
struct nouveau_software_chan *chan, *temp;
|
struct nouveau_software_chan *chan, *temp;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
@ -46,18 +49,19 @@ nv50_disp_intr_vblank(struct nv50_disp_priv *priv, int crtc)
|
|||||||
if (chan->vblank.crtc != crtc)
|
if (chan->vblank.crtc != crtc)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
nv_wr32(priv, 0x001704, chan->vblank.channel);
|
|
||||||
nv_wr32(priv, 0x001710, 0x80000000 | chan->vblank.ctxdma);
|
|
||||||
|
|
||||||
if (nv_device(priv)->chipset == 0x50) {
|
if (nv_device(priv)->chipset == 0x50) {
|
||||||
|
nv_wr32(priv, 0x001704, chan->vblank.channel);
|
||||||
|
nv_wr32(priv, 0x001710, 0x80000000 | chan->vblank.ctxdma);
|
||||||
|
bar->flush(bar);
|
||||||
nv_wr32(priv, 0x001570, chan->vblank.offset);
|
nv_wr32(priv, 0x001570, chan->vblank.offset);
|
||||||
nv_wr32(priv, 0x001574, chan->vblank.value);
|
nv_wr32(priv, 0x001574, chan->vblank.value);
|
||||||
} else {
|
} else {
|
||||||
if (nv_device(priv)->chipset >= 0xc0) {
|
nv_wr32(priv, 0x001718, 0x80000000 | chan->vblank.channel);
|
||||||
nv_wr32(priv, 0x06000c,
|
bar->flush(bar);
|
||||||
upper_32_bits(chan->vblank.offset));
|
nv_wr32(priv, 0x06000c,
|
||||||
}
|
upper_32_bits(chan->vblank.offset));
|
||||||
nv_wr32(priv, 0x060010, chan->vblank.offset);
|
nv_wr32(priv, 0x060010,
|
||||||
|
lower_32_bits(chan->vblank.offset));
|
||||||
nv_wr32(priv, 0x060014, chan->vblank.value);
|
nv_wr32(priv, 0x060014, chan->vblank.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user