From bba0b1cfa90594e750784d653b1cd4aa490fdbff Mon Sep 17 00:00:00 2001 From: ming_qian Date: Fri, 30 Aug 2019 10:47:47 +0800 Subject: [PATCH] MLK-22526: VPU: synchronize sending message to MU use a spinlock to synchronize sending message to MU Signed-off-by: ming_qian Reviewed-by: Shijie Qin --- drivers/mxc/vpu_malone/vpu_b0.c | 9 ++++++--- drivers/mxc/vpu_malone/vpu_b0.h | 2 +- drivers/mxc/vpu_windsor/vpu_encoder_b0.c | 9 +++++---- drivers/mxc/vpu_windsor/vpu_encoder_b0.h | 2 +- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/drivers/mxc/vpu_malone/vpu_b0.c b/drivers/mxc/vpu_malone/vpu_b0.c index c7ddb95f64e4..7cde829bcaf2 100644 --- a/drivers/mxc/vpu_malone/vpu_b0.c +++ b/drivers/mxc/vpu_malone/vpu_b0.c @@ -2663,11 +2663,12 @@ static void do_send_cmd_to_firmware(struct vpu_ctx *ctx, vpu_log_cmd(cmdid, idx); count_cmd(&ctx->statistic, cmdid); record_log_info(ctx, LOG_COMMAND, cmdid, 0); - mutex_lock(&ctx->dev->cmd_mutex); + + spin_lock(&ctx->dev->cmd_spinlock); rpc_send_cmd_buf(&ctx->dev->shared_mem, idx, cmdid, cmdnum, local_cmddata); - mutex_unlock(&ctx->dev->cmd_mutex); mb(); MU_SendMessage(ctx->dev->mu_base_virtaddr, 0, COMMAND); + spin_unlock(&ctx->dev->cmd_spinlock); } static struct vpu_dec_cmd_request vpu_dec_cmds[] = { @@ -4518,6 +4519,7 @@ static irqreturn_t fsl_vpu_mu_isr(int irq, void *This) VPU_REG_BASE); /*CM0 use relative address*/ + spin_lock(&dev->cmd_spinlock); MU_sendMesgToFW(dev->mu_base_virtaddr, RPC_BUF_OFFSET, vpu_dec_cpu_phy_to_mu(dev, dev->m0_rpc_phy)); @@ -4525,6 +4527,7 @@ static irqreturn_t fsl_vpu_mu_isr(int irq, void *This) BOOT_ADDRESS, dev->m0_p_fw_space_phy); MU_sendMesgToFW(dev->mu_base_virtaddr, INIT_DONE, 2); + spin_unlock(&dev->cmd_spinlock); } else if (msg == 0x55) { dev->firmware_started = true; @@ -6184,7 +6187,7 @@ static int init_vpudev_parameters(struct vpu_dev *dev) return -EINVAL; mutex_init(&dev->dev_mutex); - mutex_init(&dev->cmd_mutex); + spin_lock_init(&dev->cmd_spinlock); mutex_init(&dev->fw_flow_mutex); init_completion(&dev->start_cmp); init_completion(&dev->snap_done_cmp); diff --git a/drivers/mxc/vpu_malone/vpu_b0.h b/drivers/mxc/vpu_malone/vpu_b0.h index 8009eff499b9..2d746f109e24 100644 --- a/drivers/mxc/vpu_malone/vpu_b0.h +++ b/drivers/mxc/vpu_malone/vpu_b0.h @@ -256,7 +256,7 @@ struct vpu_dev { u_int32 m0_rpc_phy; u_int32 m0_rpc_size; struct mutex dev_mutex; - struct mutex cmd_mutex; + spinlock_t cmd_spinlock; struct mutex fw_flow_mutex; bool fw_is_ready; bool firmware_started; diff --git a/drivers/mxc/vpu_windsor/vpu_encoder_b0.c b/drivers/mxc/vpu_windsor/vpu_encoder_b0.c index f9f49567417c..dca615b6a06b 100644 --- a/drivers/mxc/vpu_windsor/vpu_encoder_b0.c +++ b/drivers/mxc/vpu_windsor/vpu_encoder_b0.c @@ -1616,12 +1616,12 @@ static void vpu_core_send_cmd(struct core_device *core, u32 idx, vpu_log_cmd(cmdid, idx); count_cmd(&core->attr[idx], cmdid); - mutex_lock(&core->cmd_mutex); + spin_lock(&core->cmd_spinlock); rpc_send_cmd_buf_encoder(&core->shared_mem, idx, cmdid, cmdnum, local_cmddata); mb(); MU_SendMessage(core->mu_base_virtaddr, 0, COMMAND); - mutex_unlock(&core->cmd_mutex); + spin_unlock(&core->cmd_spinlock); } static void vpu_ctx_send_cmd(struct vpu_ctx *ctx, uint32_t cmdid, @@ -2849,11 +2849,12 @@ static void enable_mu(struct core_device *dev) dev->print_buf = dev->m0_rpc_virt + dev->rpc_buf_size; mu_addr = cpu_phy_to_mu(dev, dev->m0_rpc_phy); + spin_lock(&dev->cmd_spinlock); MU_sendMesgToFW(dev->mu_base_virtaddr, RPC_BUF_OFFSET, mu_addr); - MU_sendMesgToFW(dev->mu_base_virtaddr, BOOT_ADDRESS, dev->m0_p_fw_space_phy); MU_sendMesgToFW(dev->mu_base_virtaddr, INIT_DONE, 2); + spin_unlock(&dev->cmd_spinlock); } static void get_core_supported_instance_count(struct core_device *core) @@ -5245,7 +5246,7 @@ static int init_vpu_core_dev(struct core_device *core_dev) if (!core_dev) return -EINVAL; - mutex_init(&core_dev->cmd_mutex); + spin_lock_init(&core_dev->cmd_spinlock); init_completion(&core_dev->start_cmp); init_completion(&core_dev->snap_done_cmp); diff --git a/drivers/mxc/vpu_windsor/vpu_encoder_b0.h b/drivers/mxc/vpu_windsor/vpu_encoder_b0.h index 14aedd5d8b9f..1661108845bf 100644 --- a/drivers/mxc/vpu_windsor/vpu_encoder_b0.h +++ b/drivers/mxc/vpu_windsor/vpu_encoder_b0.h @@ -281,7 +281,7 @@ struct core_device { u32 rpc_actual_size; struct print_buf_desc *print_buf; - struct mutex cmd_mutex; + spinlock_t cmd_spinlock; bool fw_is_ready; bool firmware_started; struct completion start_cmp; -- 2.17.1