From fbc5296e7d8a7eeceba9a904dd4736373c4c6d4e Mon Sep 17 00:00:00 2001 From: Nitin Kumbhar Date: Mon, 17 Sep 2018 15:18:28 +0530 Subject: 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 Reviewed-on: https://git-master.nvidia.com/r/1827812 Reviewed-by: Deepak Nibade Reviewed-by: svc-misra-checker Reviewed-by: Debarshi Dutta Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Alex Waterman Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'drivers/gpu/nvgpu/os/linux/vgpu') 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) { struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g); - nvgpu_mutex_init(&g->poweron_lock); - nvgpu_mutex_init(&g->poweroff_lock); + nvgpu_mutex_init(&g->power_lock); nvgpu_mutex_init(&g->ctxsw_disable_lock); l->regs_saved = l->regs; l->bar1_saved = l->bar1; @@ -142,16 +141,19 @@ int vgpu_pm_prepare_poweroff(struct device *dev) nvgpu_log_fn(g, " "); + nvgpu_mutex_acquire(&g->power_lock); + if (!g->power_on) - return 0; + goto done; if (g->ops.fifo.channel_suspend) ret = g->ops.fifo.channel_suspend(g); - if (ret) - return ret; + goto done; g->power_on = false; + done: + nvgpu_mutex_release(&g->power_lock); return ret; } @@ -160,12 +162,14 @@ int vgpu_pm_finalize_poweron(struct device *dev) { struct gk20a *g = get_gk20a(dev); struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g); - int err; + int err = 0; nvgpu_log_fn(g, " "); + nvgpu_mutex_acquire(&g->power_lock); + if (g->power_on) - return 0; + goto done; g->power_on = true; @@ -220,6 +224,10 @@ int vgpu_pm_finalize_poweron(struct device *dev) g->sw_ready = true; done: + if (err) + g->power_on = false; + + nvgpu_mutex_release(&g->power_lock); return err; } -- cgit v1.2.2