diff --git a/drivers/gpu/nvgpu/common/falcon/falcon.c b/drivers/gpu/nvgpu/common/falcon/falcon.c index 59a1f3daa..681ff105e 100644 --- a/drivers/gpu/nvgpu/common/falcon/falcon.c +++ b/drivers/gpu/nvgpu/common/falcon/falcon.c @@ -280,7 +280,9 @@ int nvgpu_falcon_copy_from_dmem(struct nvgpu_falcon *flcn, flcn_ops = &flcn->flcn_ops; if (flcn_ops->copy_from_dmem != NULL) { + nvgpu_mutex_acquire(&flcn->copy_lock); status = flcn_ops->copy_from_dmem(flcn, src, dst, size, port); + nvgpu_mutex_release(&flcn->copy_lock); } else { nvgpu_warn(flcn->g, "Invalid op on falcon 0x%x ", flcn->flcn_id); @@ -302,7 +304,9 @@ int nvgpu_falcon_copy_to_dmem(struct nvgpu_falcon *flcn, flcn_ops = &flcn->flcn_ops; if (flcn_ops->copy_to_dmem != NULL) { + nvgpu_mutex_acquire(&flcn->copy_lock); status = flcn_ops->copy_to_dmem(flcn, dst, src, size, port); + nvgpu_mutex_release(&flcn->copy_lock); } else { nvgpu_warn(flcn->g, "Invalid op on falcon 0x%x ", flcn->flcn_id); @@ -324,7 +328,9 @@ int nvgpu_falcon_copy_from_imem(struct nvgpu_falcon *flcn, flcn_ops = &flcn->flcn_ops; if (flcn_ops->copy_from_imem != NULL) { + nvgpu_mutex_acquire(&flcn->copy_lock); status = flcn_ops->copy_from_imem(flcn, src, dst, size, port); + nvgpu_mutex_release(&flcn->copy_lock); } else { nvgpu_warn(flcn->g, "Invalid op on falcon 0x%x ", flcn->flcn_id); @@ -346,8 +352,10 @@ int nvgpu_falcon_copy_to_imem(struct nvgpu_falcon *flcn, flcn_ops = &flcn->flcn_ops; if (flcn_ops->copy_to_imem != NULL) { + nvgpu_mutex_acquire(&flcn->copy_lock); status = flcn_ops->copy_to_imem(flcn, dst, src, size, port, sec, tag); + nvgpu_mutex_release(&flcn->copy_lock); } else { nvgpu_warn(flcn->g, "Invalid op on falcon 0x%x ", flcn->flcn_id); @@ -609,6 +617,7 @@ int nvgpu_falcon_sw_init(struct gk20a *g, u32 flcn_id) { struct nvgpu_falcon **flcn_p = NULL, *flcn = NULL; struct gpu_ops *gops = &g->ops; + int err; flcn_p = falcon_get_instance(g, flcn_id); if (flcn_p == NULL) { @@ -622,6 +631,13 @@ int nvgpu_falcon_sw_init(struct gk20a *g, u32 flcn_id) return -ENOMEM; } + err = nvgpu_mutex_init(&flcn->copy_lock); + if (err != 0) { + nvgpu_err(g, "Error in flcn.copy_lock mutex initialization"); + nvgpu_kfree(g, flcn); + return err; + } + flcn->flcn_id = flcn_id; flcn->g = g; @@ -633,7 +649,7 @@ int nvgpu_falcon_sw_init(struct gk20a *g, u32 flcn_id) void nvgpu_falcon_sw_free(struct gk20a *g, u32 flcn_id) { - struct nvgpu_falcon **flcn_p = NULL; + struct nvgpu_falcon **flcn_p = NULL, *flcn = NULL; struct gpu_ops *gops = &g->ops; flcn_p = falcon_get_instance(g, flcn_id); @@ -641,7 +657,9 @@ void nvgpu_falcon_sw_free(struct gk20a *g, u32 flcn_id) return; } - gops->falcon.falcon_hal_sw_free(*flcn_p); - nvgpu_kfree(g, *flcn_p); + flcn = *flcn_p; + gops->falcon.falcon_hal_sw_free(flcn); + nvgpu_mutex_destroy(&flcn->copy_lock); + nvgpu_kfree(g, flcn); *flcn_p = NULL; } diff --git a/drivers/gpu/nvgpu/common/falcon/falcon_gk20a.c b/drivers/gpu/nvgpu/common/falcon/falcon_gk20a.c index 08d4829f5..6dd56fb2c 100644 --- a/drivers/gpu/nvgpu/common/falcon/falcon_gk20a.c +++ b/drivers/gpu/nvgpu/common/falcon/falcon_gk20a.c @@ -207,8 +207,6 @@ static int gk20a_falcon_copy_from_dmem(struct nvgpu_falcon *flcn, return -EINVAL; } - nvgpu_mutex_acquire(&flcn->copy_lock); - words = size >> 2; bytes = size & 0x3U; @@ -232,7 +230,6 @@ static int gk20a_falcon_copy_from_dmem(struct nvgpu_falcon *flcn, } } - nvgpu_mutex_release(&flcn->copy_lock); return 0; } @@ -252,8 +249,6 @@ static int gk20a_falcon_copy_to_dmem(struct nvgpu_falcon *flcn, return -EINVAL; } - nvgpu_mutex_acquire(&flcn->copy_lock); - words = size >> 2; bytes = size & 0x3U; @@ -286,8 +281,6 @@ static int gk20a_falcon_copy_to_dmem(struct nvgpu_falcon *flcn, data - dst, size); } - nvgpu_mutex_release(&flcn->copy_lock); - return 0; } @@ -310,8 +303,6 @@ static int gk20a_falcon_copy_from_imem(struct nvgpu_falcon *flcn, u32 src, return -EINVAL; } - nvgpu_mutex_acquire(&flcn->copy_lock); - words = size >> 2; bytes = size & 0x3U; blk = src >> 8; @@ -336,8 +327,6 @@ static int gk20a_falcon_copy_from_imem(struct nvgpu_falcon *flcn, u32 src, } } - nvgpu_mutex_release(&flcn->copy_lock); - return 0; } @@ -358,8 +347,6 @@ static int gk20a_falcon_copy_to_imem(struct nvgpu_falcon *flcn, u32 dst, return -EINVAL; } - nvgpu_mutex_acquire(&flcn->copy_lock); - words = size >> 2; blk = dst >> 8; @@ -391,8 +378,6 @@ static int gk20a_falcon_copy_to_imem(struct nvgpu_falcon *flcn, u32 dst, i++; } - nvgpu_mutex_release(&flcn->copy_lock); - return 0; } @@ -753,12 +738,7 @@ int gk20a_falcon_hal_sw_init(struct nvgpu_falcon *flcn) } if (flcn->is_falcon_supported) { - err = nvgpu_mutex_init(&flcn->copy_lock); - if (err != 0) { - nvgpu_err(g, "Error in flcn.copy_lock mutex initialization"); - } else { - gk20a_falcon_ops(flcn); - } + gk20a_falcon_ops(flcn); } else { nvgpu_log_info(g, "falcon 0x%x not supported on %s", flcn->flcn_id, g->name); @@ -772,7 +752,6 @@ void gk20a_falcon_hal_sw_free(struct nvgpu_falcon *flcn) struct gk20a *g = flcn->g; if (flcn->is_falcon_supported) { - nvgpu_mutex_destroy(&flcn->copy_lock); flcn->is_falcon_supported = false; } else { nvgpu_log_info(g, "falcon 0x%x not supported on %s", diff --git a/drivers/gpu/nvgpu/common/falcon/falcon_gp106.c b/drivers/gpu/nvgpu/common/falcon/falcon_gp106.c index 321028db0..deaa5ac7a 100644 --- a/drivers/gpu/nvgpu/common/falcon/falcon_gp106.c +++ b/drivers/gpu/nvgpu/common/falcon/falcon_gp106.c @@ -90,12 +90,7 @@ int gp106_falcon_hal_sw_init(struct nvgpu_falcon *flcn) } if (flcn->is_falcon_supported) { - err = nvgpu_mutex_init(&flcn->copy_lock); - if (err != 0) { - nvgpu_err(g, "Error in copy_lock mutex initialization"); - } else { - gp106_falcon_ops(flcn); - } + gp106_falcon_ops(flcn); } else { nvgpu_info(g, "falcon 0x%x not supported on %s", flcn->flcn_id, g->name); diff --git a/drivers/gpu/nvgpu/common/falcon/falcon_gv100.c b/drivers/gpu/nvgpu/common/falcon/falcon_gv100.c index e907ca0f5..bfc31ec02 100644 --- a/drivers/gpu/nvgpu/common/falcon/falcon_gv100.c +++ b/drivers/gpu/nvgpu/common/falcon/falcon_gv100.c @@ -70,12 +70,7 @@ int gv100_falcon_hal_sw_init(struct nvgpu_falcon *flcn) } if (flcn->is_falcon_supported) { - err = nvgpu_mutex_init(&flcn->copy_lock); - if (err != 0) { - nvgpu_err(g, "Error in flcn.copy_lock mutex initialization"); - } else { - gv100_falcon_ops(flcn); - } + gv100_falcon_ops(flcn); } else { /* * Forward call to previous chips HAL diff --git a/drivers/gpu/nvgpu/common/falcon/falcon_tu104.c b/drivers/gpu/nvgpu/common/falcon/falcon_tu104.c index 5be1c69a6..fb55ca45e 100644 --- a/drivers/gpu/nvgpu/common/falcon/falcon_tu104.c +++ b/drivers/gpu/nvgpu/common/falcon/falcon_tu104.c @@ -79,12 +79,7 @@ int tu104_falcon_hal_sw_init(struct nvgpu_falcon *flcn) } if (flcn->is_falcon_supported) { - err = nvgpu_mutex_init(&flcn->copy_lock); - if (err != 0) { - nvgpu_err(g, "Error in flcn.copy_lock mutex initialization"); - } else { - tu104_falcon_ops(flcn); - } + tu104_falcon_ops(flcn); } else { /* * Forward call to previous chips HAL