diff options
Diffstat (limited to 'drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c')
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c | 22 |
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 | ||
222 | done: | 226 | done: |
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 | ||