gpu: nvgpu: wait for running jobs to finish before shutdown

In gk20a_pm_shutdown(), we currently call __pm_runtime_disable()
which prevents h/w access to new requests made after shutdown() call
Also, once gk20a_pm_shutdown() completes, platform code will
just rail gate the GPU

But it is possible that some other thread is already accessing
h/w while shutdown() was triggered and this can result in hang

Hence, wait until all currently executing jobs are finished
before returning from gk20a_pm_shutdown()

Also, we need to wait for GPU's usage count to become 1 since
platform code will increase the usage count and then call
shutdown(). Hence usage count of 1 indicates that GPU is idle

Bug 200099940

Change-Id: I1f2457829e2737c07302d13f355353a30c3b4e67
Signed-off-by: Deepak Nibade <dnibade@nvidia.com>
Reviewed-on: http://git-master/r/734920
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Tested-by: Bharat Nihalani <bnihalani@nvidia.com>
This commit is contained in:
Deepak Nibade
2015-04-23 17:10:42 +05:30
committed by Ishan Mittal
parent d65a93b80c
commit 7ddd6e261e

View File

@@ -1122,8 +1122,27 @@ static int gk20a_pm_disable_clk(struct device *dev)
static void gk20a_pm_shutdown(struct platform_device *pdev)
{
#ifdef CONFIG_PM_RUNTIME
unsigned long timeout = jiffies +
msecs_to_jiffies(GK20A_WAIT_FOR_IDLE_MS);
int ref_cnt;
#endif
dev_info(&pdev->dev, "shutting down");
#ifdef CONFIG_PM_RUNTIME
/* Prevent more requests by disabling Runtime PM */
__pm_runtime_disable(&pdev->dev, false);
/* Wait until current running requests are finished */
while (time_before(jiffies, timeout)) {
ref_cnt = atomic_read(&pdev->dev.power.usage_count);
if (ref_cnt > 1)
msleep(1);
else
break;
}
#endif
}
#ifdef CONFIG_PM