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; };