summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/os/linux/vgpu
diff options
context:
space:
mode:
authorNitin Kumbhar <nkumbhar@nvidia.com>2018-09-17 05:48:28 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2018-09-18 13:34:41 -0400
commitfbc5296e7d8a7eeceba9a904dd4736373c4c6d4e (patch)
treeb382453159410f2f9fef0dabcbe292b44c97afd4 /drivers/gpu/nvgpu/os/linux/vgpu
parent1982d050cc8c90ef269476bec87778e8c3ade5f7 (diff)
gpu: nvgpu: use single lock for gpu power on-off
Using two separate locks (poweron_lock and poweroff_lock) allows concurrent gpu power-on and power-off. This shall not happen as driver won't be able to maintain correct gpu state. Use a single power_lock to manage gpu power state. This lock will be used to manage gpu power state from multiple triggers like gpu idle, gpu gc-off, etc. JIRA NVGPU-1100 Change-Id: Ia9b4aeda024a5844ae9f182d453cd6341876680a Signed-off-by: Nitin Kumbhar <nkumbhar@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1827812 Reviewed-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-by: svc-misra-checker <svc-misra-checker@nvidia.com> Reviewed-by: Debarshi Dutta <ddutta@nvidia.com> Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Alex Waterman <alexw@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/os/linux/vgpu')
-rw-r--r--drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c b/drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c
index 3fd944f4..7cf22d9d 100644
--- a/drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c
+++ b/drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c
@@ -72,8 +72,7 @@ static void vgpu_init_vars(struct gk20a *g, struct gk20a_platform *platform)
72{ 72{
73 struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g); 73 struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g);
74 74
75 nvgpu_mutex_init(&g->poweron_lock); 75 nvgpu_mutex_init(&g->power_lock);
76 nvgpu_mutex_init(&g->poweroff_lock);
77 nvgpu_mutex_init(&g->ctxsw_disable_lock); 76 nvgpu_mutex_init(&g->ctxsw_disable_lock);
78 l->regs_saved = l->regs; 77 l->regs_saved = l->regs;
79 l->bar1_saved = l->bar1; 78 l->bar1_saved = l->bar1;
@@ -142,16 +141,19 @@ int vgpu_pm_prepare_poweroff(struct device *dev)
142 141
143 nvgpu_log_fn(g, " "); 142 nvgpu_log_fn(g, " ");
144 143
144 nvgpu_mutex_acquire(&g->power_lock);
145
145 if (!g->power_on) 146 if (!g->power_on)
146 return 0; 147 goto done;
147 148
148 if (g->ops.fifo.channel_suspend) 149 if (g->ops.fifo.channel_suspend)
149 ret = g->ops.fifo.channel_suspend(g); 150 ret = g->ops.fifo.channel_suspend(g);
150
151 if (ret) 151 if (ret)
152 return ret; 152 goto done;
153 153
154 g->power_on = false; 154 g->power_on = false;
155 done:
156 nvgpu_mutex_release(&g->power_lock);
155 157
156 return ret; 158 return ret;
157} 159}
@@ -160,12 +162,14 @@ int vgpu_pm_finalize_poweron(struct device *dev)
160{ 162{
161 struct gk20a *g = get_gk20a(dev); 163 struct gk20a *g = get_gk20a(dev);
162 struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g); 164 struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g);
163 int err; 165 int err = 0;
164 166
165 nvgpu_log_fn(g, " "); 167 nvgpu_log_fn(g, " ");
166 168
169 nvgpu_mutex_acquire(&g->power_lock);
170
167 if (g->power_on) 171 if (g->power_on)
168 return 0; 172 goto done;
169 173
170 g->power_on = true; 174 g->power_on = true;
171 175
@@ -220,6 +224,10 @@ int vgpu_pm_finalize_poweron(struct device *dev)
220 g->sw_ready = true; 224 g->sw_ready = true;
221 225
222done: 226done:
227 if (err)
228 g->power_on = false;
229
230 nvgpu_mutex_release(&g->power_lock);
223 return err; 231 return err;
224} 232}
225 233