From 08aaaecc61036749fd3f0ec073c949a99f71b09d Mon Sep 17 00:00:00 2001 From: Sagar Kamble Date: Wed, 27 Feb 2019 17:17:42 +0530 Subject: [PATCH] gpu: nvgpu: add EMEM support enabled flag and EMEM mutex Access to falcon's EMEM has to be synchronized to ensure atomic access to EMEM control and data registers. Add this locking. Not all falcons support EMEM hence handle mutex based on the enabled flag emem_supported that is set only for TU104 currently. JIRA NVGPU-1993 Change-Id: Idaedfb564ea0068d4690a2717d7983eb2384a69f Signed-off-by: Sagar Kamble Reviewed-on: https://git-master.nvidia.com/r/2030618 GVS: Gerrit_Virtual_Submit Reviewed-by: Mahantesh Kumbar Reviewed-by: Vijayakumar Subbu Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/falcon/falcon.c | 18 ++++++++++++++++++ .../gpu/nvgpu/common/falcon/falcon_sw_tu104.c | 1 + drivers/gpu/nvgpu/include/nvgpu/falcon.h | 2 ++ 3 files changed, 21 insertions(+) diff --git a/drivers/gpu/nvgpu/common/falcon/falcon.c b/drivers/gpu/nvgpu/common/falcon/falcon.c index 9561c6802..eb7f52dd8 100644 --- a/drivers/gpu/nvgpu/common/falcon/falcon.c +++ b/drivers/gpu/nvgpu/common/falcon/falcon.c @@ -251,7 +251,9 @@ int nvgpu_falcon_copy_from_emem(struct nvgpu_falcon *flcn, flcn_dops = &flcn->flcn_engine_dep_ops; if (flcn_dops->copy_from_emem != NULL) { + nvgpu_mutex_acquire(&flcn->emem_lock); status = flcn_dops->copy_from_emem(g, src, dst, size, port); + nvgpu_mutex_release(&flcn->emem_lock); } else { nvgpu_warn(g, "Invalid op on falcon 0x%x ", flcn->flcn_id); @@ -284,7 +286,9 @@ int nvgpu_falcon_copy_to_emem(struct nvgpu_falcon *flcn, flcn_dops = &flcn->flcn_engine_dep_ops; if (flcn_dops->copy_to_emem != NULL) { + nvgpu_mutex_acquire(&flcn->emem_lock); status = flcn_dops->copy_to_emem(g, dst, src, size, port); + nvgpu_mutex_release(&flcn->emem_lock); } else { nvgpu_warn(g, "Invalid op on falcon 0x%x ", flcn->flcn_id); @@ -822,6 +826,17 @@ int nvgpu_falcon_sw_init(struct gk20a *g, u32 flcn_id) return err; } + if (flcn->emem_supported) { + err = nvgpu_mutex_init(&flcn->emem_lock); + if (err != 0) { + nvgpu_err(g, "Error in flcn.emem_lock " + "mutex initialization"); + nvgpu_mutex_destroy(&flcn->dmem_lock); + nvgpu_mutex_destroy(&flcn->imem_lock); + return err; + } + } + return 0; } @@ -842,6 +857,9 @@ void nvgpu_falcon_sw_free(struct gk20a *g, u32 flcn_id) return; } + if (flcn->emem_supported) { + nvgpu_mutex_destroy(&flcn->emem_lock); + } nvgpu_mutex_destroy(&flcn->dmem_lock); nvgpu_mutex_destroy(&flcn->imem_lock); } diff --git a/drivers/gpu/nvgpu/common/falcon/falcon_sw_tu104.c b/drivers/gpu/nvgpu/common/falcon/falcon_sw_tu104.c index 7f36fc0ed..f98fff78a 100644 --- a/drivers/gpu/nvgpu/common/falcon/falcon_sw_tu104.c +++ b/drivers/gpu/nvgpu/common/falcon/falcon_sw_tu104.c @@ -56,6 +56,7 @@ void tu104_falcon_sw_init(struct nvgpu_falcon *flcn) flcn->flcn_base = g->ops.sec2.falcon_base_addr(); flcn->is_falcon_supported = true; flcn->is_interrupt_enabled = true; + flcn->emem_supported = true; break; case FALCON_ID_NVDEC: flcn->flcn_base = g->ops.nvdec.falcon_base_addr(); diff --git a/drivers/gpu/nvgpu/include/nvgpu/falcon.h b/drivers/gpu/nvgpu/include/nvgpu/falcon.h index 24616cf0e..48e210c0e 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/falcon.h +++ b/drivers/gpu/nvgpu/include/nvgpu/falcon.h @@ -108,8 +108,10 @@ struct nvgpu_falcon { u32 flcn_base; bool is_falcon_supported; bool is_interrupt_enabled; + bool emem_supported; struct nvgpu_mutex imem_lock; struct nvgpu_mutex dmem_lock; + struct nvgpu_mutex emem_lock; struct nvgpu_falcon_engine_dependency_ops flcn_engine_dep_ops; };