Martin Peres
2010-Sep-30 18:57 UTC
[PATCH 3/3] Idle PGRAPH and PFIFO before changing the clocks v2
Signed-off-by: Martin Peres <martin.peres at ensi-bourges.fr> --- drivers/gpu/drm/nouveau/nouveau_pm.c | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+), 0 deletions(-) diff --git a/drivers/gpu/drm/nouveau/nouveau_pm.c b/drivers/gpu/drm/nouveau/nouveau_pm.c index 1c99c55..fb3681c 100644 --- a/drivers/gpu/drm/nouveau/nouveau_pm.c +++ b/drivers/gpu/drm/nouveau/nouveau_pm.c @@ -68,11 +68,30 @@ nouveau_pm_perflvl_set(struct drm_device *dev, struct nouveau_pm_level *perflvl) } } + /* Pause the engines, if possible */ + if (dev_priv->engine.fifo.pause) { + if (dev_priv->engine.fifo.pause(dev)) + return -EIO; + } + if (dev_priv->engine.graph.pause) { + if (dev_priv->engine.graph.pause(dev)) + return -EIO; + } + nouveau_pm_clock_set(dev, perflvl, PLL_CORE, perflvl->core); nouveau_pm_clock_set(dev, perflvl, PLL_SHADER, perflvl->shader); nouveau_pm_clock_set(dev, perflvl, PLL_MEMORY, perflvl->memory); nouveau_pm_clock_set(dev, perflvl, PLL_UNK05, perflvl->unk05); + /* Wait for PLLs to stabilize */ + udelay(100); + + /* Un-pause the engines, if possible */ + if (dev_priv->engine.fifo.unpause) + dev_priv->engine.fifo.unpause(dev); + if (dev_priv->engine.graph.unpause) + dev_priv->engine.graph.unpause(dev); + pm->cur = perflvl; return 0; } -- 1.7.2 --------------060107090404080201010405--