MLK-22526: VPU: synchronize sending message to MU
authorming_qian <ming.qian@nxp.com>
Fri, 30 Aug 2019 02:47:47 +0000 (10:47 +0800)
committerming_qian <ming.qian@nxp.com>
Fri, 30 Aug 2019 07:49:48 +0000 (15:49 +0800)
use a spinlock to synchronize sending message to MU

Signed-off-by: ming_qian <ming.qian@nxp.com>
Reviewed-by: Shijie Qin <shijie.qin@nxp.com>
drivers/mxc/vpu_malone/vpu_b0.c
drivers/mxc/vpu_malone/vpu_b0.h
drivers/mxc/vpu_windsor/vpu_encoder_b0.c
drivers/mxc/vpu_windsor/vpu_encoder_b0.h

index c7ddb95..7cde829 100644 (file)
@@ -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);
index 8009eff..2d746f1 100644 (file)
@@ -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;
index f9f4956..dca615b 100644 (file)
@@ -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);
 
index 14aedd5..1661108 100644 (file)
@@ -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;