summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c')
-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