summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/gk20a.c
diff options
context:
space:
mode:
authorDeepak Nibade <dnibade@nvidia.com>2015-04-23 07:40:42 -0400
committerIshan Mittal <imittal@nvidia.com>2015-05-18 02:03:48 -0400
commit7ddd6e261ed620dbb388202be89ca4e6843e3947 (patch)
treefd8483ccec9dc619fb651f60aa40f725e87c8527 /drivers/gpu/nvgpu/gk20a/gk20a.c
parentd65a93b80c60bb677fbc13b7180e0f31b7f97f84 (diff)
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>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.c b/drivers/gpu/nvgpu/gk20a/gk20a.c
index 8e7fbae0..f3b5544f 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gk20a.c
@@ -1122,8 +1122,27 @@ static int gk20a_pm_disable_clk(struct device *dev)
1122 1122
1123static void gk20a_pm_shutdown(struct platform_device *pdev) 1123static void gk20a_pm_shutdown(struct platform_device *pdev)
1124{ 1124{
1125#ifdef CONFIG_PM_RUNTIME
1126 unsigned long timeout = jiffies +
1127 msecs_to_jiffies(GK20A_WAIT_FOR_IDLE_MS);
1128 int ref_cnt;
1129#endif
1130
1125 dev_info(&pdev->dev, "shutting down"); 1131 dev_info(&pdev->dev, "shutting down");
1132
1133#ifdef CONFIG_PM_RUNTIME
1134 /* Prevent more requests by disabling Runtime PM */
1126 __pm_runtime_disable(&pdev->dev, false); 1135 __pm_runtime_disable(&pdev->dev, false);
1136
1137 /* Wait until current running requests are finished */
1138 while (time_before(jiffies, timeout)) {
1139 ref_cnt = atomic_read(&pdev->dev.power.usage_count);
1140 if (ref_cnt > 1)
1141 msleep(1);
1142 else
1143 break;
1144 }
1145#endif
1127} 1146}
1128 1147
1129#ifdef CONFIG_PM 1148#ifdef CONFIG_PM