From ad1842d4a2ad4287a7530c536bf50e7e32d0f9e3 Mon Sep 17 00:00:00 2001 From: Sagar Kamble Date: Wed, 27 Feb 2019 17:10:41 +0530 Subject: [PATCH] gpu: nvgpu: create separate mutex for IMEM and DMEM access Access to IMEM and DMEM can be done parallely as they have separate control and data registers. Hence they need not be synchronized using single copy_lock. Prepare separate mutex locks. JIRA NVGPU-1993 Change-Id: Ie4bfcb6cef0259c6fb98a86bdbcc378ff5725ee5 Signed-off-by: Sagar Kamble Reviewed-on: https://git-master.nvidia.com/r/2030617 Reviewed-by: svc-misra-checker GVS: Gerrit_Virtual_Submit Reviewed-by: Vijayakumar Subbu Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/falcon/falcon.c | 31 ++++++++++++------- drivers/gpu/nvgpu/common/falcon/falcon_priv.h | 3 +- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/nvgpu/common/falcon/falcon.c b/drivers/gpu/nvgpu/common/falcon/falcon.c index 76944f431..e6d948da7 100644 --- a/drivers/gpu/nvgpu/common/falcon/falcon.c +++ b/drivers/gpu/nvgpu/common/falcon/falcon.c @@ -343,9 +343,9 @@ int nvgpu_falcon_copy_from_dmem(struct nvgpu_falcon *flcn, goto exit; } - nvgpu_mutex_acquire(&flcn->copy_lock); + nvgpu_mutex_acquire(&flcn->dmem_lock); status = flcn_ops->copy_from_dmem(flcn, src, dst, size, port); - nvgpu_mutex_release(&flcn->copy_lock); + nvgpu_mutex_release(&flcn->dmem_lock); exit: return status; @@ -374,9 +374,9 @@ int nvgpu_falcon_copy_to_dmem(struct nvgpu_falcon *flcn, goto exit; } - nvgpu_mutex_acquire(&flcn->copy_lock); + nvgpu_mutex_acquire(&flcn->dmem_lock); status = flcn_ops->copy_to_dmem(flcn, dst, src, size, port); - nvgpu_mutex_release(&flcn->copy_lock); + nvgpu_mutex_release(&flcn->dmem_lock); exit: return status; @@ -405,9 +405,9 @@ int nvgpu_falcon_copy_from_imem(struct nvgpu_falcon *flcn, goto exit; } - nvgpu_mutex_acquire(&flcn->copy_lock); + nvgpu_mutex_acquire(&flcn->imem_lock); status = flcn_ops->copy_from_imem(flcn, src, dst, size, port); - nvgpu_mutex_release(&flcn->copy_lock); + nvgpu_mutex_release(&flcn->imem_lock); exit: return status; @@ -436,10 +436,10 @@ int nvgpu_falcon_copy_to_imem(struct nvgpu_falcon *flcn, goto exit; } - nvgpu_mutex_acquire(&flcn->copy_lock); + nvgpu_mutex_acquire(&flcn->imem_lock); status = flcn_ops->copy_to_imem(flcn, dst, src, size, port, sec, tag); - nvgpu_mutex_release(&flcn->copy_lock); + nvgpu_mutex_release(&flcn->imem_lock); exit: return status; @@ -735,9 +735,17 @@ int nvgpu_falcon_sw_init(struct gk20a *g, u32 flcn_id) return -ENOMEM; } - err = nvgpu_mutex_init(&flcn->copy_lock); + err = nvgpu_mutex_init(&flcn->imem_lock); if (err != 0) { - nvgpu_err(g, "Error in flcn.copy_lock mutex initialization"); + nvgpu_err(g, "Error in flcn.imem_lock mutex initialization"); + nvgpu_kfree(g, flcn); + return err; + } + + err = nvgpu_mutex_init(&flcn->dmem_lock); + if (err != 0) { + nvgpu_err(g, "Error in flcn.dmem_lock mutex initialization"); + nvgpu_mutex_destroy(&flcn->imem_lock); nvgpu_kfree(g, flcn); return err; } @@ -763,7 +771,8 @@ void nvgpu_falcon_sw_free(struct gk20a *g, u32 flcn_id) flcn = *flcn_p; gops->falcon.falcon_hal_sw_free(flcn); - nvgpu_mutex_destroy(&flcn->copy_lock); + nvgpu_mutex_destroy(&flcn->dmem_lock); + nvgpu_mutex_destroy(&flcn->imem_lock); nvgpu_kfree(g, flcn); *flcn_p = NULL; } diff --git a/drivers/gpu/nvgpu/common/falcon/falcon_priv.h b/drivers/gpu/nvgpu/common/falcon/falcon_priv.h index 7572d038f..2df365012 100644 --- a/drivers/gpu/nvgpu/common/falcon/falcon_priv.h +++ b/drivers/gpu/nvgpu/common/falcon/falcon_priv.h @@ -114,7 +114,8 @@ struct nvgpu_falcon { u32 flcn_base; bool is_falcon_supported; bool is_interrupt_enabled; - struct nvgpu_mutex copy_lock; + struct nvgpu_mutex imem_lock; + struct nvgpu_mutex dmem_lock; struct nvgpu_falcon_ops flcn_ops; struct nvgpu_falcon_engine_dependency_ops flcn_engine_dep_ops; };