mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-27 09:02:06 +00:00
drm/nv86/fifo: suspend fix
This fix is a backport from the reworked nouveau driver. It masks off the engines we're not expecting to use before attempting a channel kickoff. Signed-off-by: Maxim Levitsky <maximlevitsky@gmail.com> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
fe0aac129c
commit
2064db725c
1 changed files with 9 additions and 0 deletions
|
@ -117,17 +117,22 @@ nv84_fifo_context_del(struct nouveau_channel *chan, int engine)
|
||||||
struct drm_device *dev = chan->dev;
|
struct drm_device *dev = chan->dev;
|
||||||
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
u32 save;
|
||||||
|
|
||||||
/* remove channel from playlist, will context switch if active */
|
/* remove channel from playlist, will context switch if active */
|
||||||
spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
|
spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
|
||||||
nv_mask(dev, 0x002600 + (chan->id * 4), 0x80000000, 0x00000000);
|
nv_mask(dev, 0x002600 + (chan->id * 4), 0x80000000, 0x00000000);
|
||||||
nv50_fifo_playlist_update(dev);
|
nv50_fifo_playlist_update(dev);
|
||||||
|
|
||||||
|
save = nv_mask(dev, 0x002520, 0x0000003f, 0x15);
|
||||||
|
|
||||||
/* tell any engines on this channel to unload their contexts */
|
/* tell any engines on this channel to unload their contexts */
|
||||||
nv_wr32(dev, 0x0032fc, chan->ramin->vinst >> 12);
|
nv_wr32(dev, 0x0032fc, chan->ramin->vinst >> 12);
|
||||||
if (!nv_wait_ne(dev, 0x0032fc, 0xffffffff, 0xffffffff))
|
if (!nv_wait_ne(dev, 0x0032fc, 0xffffffff, 0xffffffff))
|
||||||
NV_INFO(dev, "PFIFO: channel %d unload timeout\n", chan->id);
|
NV_INFO(dev, "PFIFO: channel %d unload timeout\n", chan->id);
|
||||||
|
|
||||||
|
nv_wr32(dev, 0x002520, save);
|
||||||
|
|
||||||
nv_wr32(dev, 0x002600 + (chan->id * 4), 0x00000000);
|
nv_wr32(dev, 0x002600 + (chan->id * 4), 0x00000000);
|
||||||
spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
|
spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
|
||||||
|
|
||||||
|
@ -184,10 +189,13 @@ nv84_fifo_fini(struct drm_device *dev, int engine, bool suspend)
|
||||||
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
||||||
struct nv84_fifo_priv *priv = nv_engine(dev, engine);
|
struct nv84_fifo_priv *priv = nv_engine(dev, engine);
|
||||||
int i;
|
int i;
|
||||||
|
u32 save;
|
||||||
|
|
||||||
/* set playlist length to zero, fifo will unload context */
|
/* set playlist length to zero, fifo will unload context */
|
||||||
nv_wr32(dev, 0x0032ec, 0);
|
nv_wr32(dev, 0x0032ec, 0);
|
||||||
|
|
||||||
|
save = nv_mask(dev, 0x002520, 0x0000003f, 0x15);
|
||||||
|
|
||||||
/* tell all connected engines to unload their contexts */
|
/* tell all connected engines to unload their contexts */
|
||||||
for (i = 0; i < priv->base.channels; i++) {
|
for (i = 0; i < priv->base.channels; i++) {
|
||||||
struct nouveau_channel *chan = dev_priv->channels.ptr[i];
|
struct nouveau_channel *chan = dev_priv->channels.ptr[i];
|
||||||
|
@ -199,6 +207,7 @@ nv84_fifo_fini(struct drm_device *dev, int engine, bool suspend)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nv_wr32(dev, 0x002520, save);
|
||||||
nv_wr32(dev, 0x002140, 0);
|
nv_wr32(dev, 0x002140, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue