diff options
author | Deepak Nibade <dnibade@nvidia.com> | 2015-04-23 07:40:42 -0400 |
---|---|---|
committer | Ishan Mittal <imittal@nvidia.com> | 2015-05-18 02:03:48 -0400 |
commit | 7ddd6e261ed620dbb388202be89ca4e6843e3947 (patch) | |
tree | fd8483ccec9dc619fb651f60aa40f725e87c8527 /drivers/gpu | |
parent | d65a93b80c60bb677fbc13b7180e0f31b7f97f84 (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')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gk20a.c | 19 |
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 | ||
1123 | static void gk20a_pm_shutdown(struct platform_device *pdev) | 1123 | static 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 |