From f4d49c6800314a2b9ee9ab832ad6f0933bdcab7d Mon Sep 17 00:00:00 2001 From: George Shen Date: Thu, 21 May 2020 10:18:41 -0700 Subject: [PATCH] msm: cvp: handles dsp error more reliably In case DSP failed to respond to CPU command correctly, cvp driver shall ignore the DSP error other than print error message. It shall keep working normally. Change-Id: Id33c0063b6326bc45527e2b4d60584045ca1e07c Signed-off-by: George Shen --- drivers/media/platform/msm/cvp/msm_cvp_dsp.c | 36 ++++++++------------ drivers/media/platform/msm/cvp/msm_cvp_dsp.h | 2 +- 2 files changed, 15 insertions(+), 23 deletions(-) diff --git a/drivers/media/platform/msm/cvp/msm_cvp_dsp.c b/drivers/media/platform/msm/cvp/msm_cvp_dsp.c index 4d00fe5fcd73..85115e72831a 100644 --- a/drivers/media/platform/msm/cvp/msm_cvp_dsp.c +++ b/drivers/media/platform/msm/cvp/msm_cvp_dsp.c @@ -47,6 +47,7 @@ static int cvp_dsp_send_cmd_sync(struct cvp_dsp_cmd_msg *cmd, uint32_t len) dprintk(CVP_DSP, "%s: cmd = %d\n", __func__, cmd->type); + me->pending_dsp2cpu_rsp.type = cmd->type; rc = cvp_dsp_send_cmd(cmd, len); if (rc) { dprintk(CVP_ERR, "%s: cvp_dsp_send_cmd failed rc=%d\n", @@ -61,9 +62,8 @@ static int cvp_dsp_send_cmd_sync(struct cvp_dsp_cmd_msg *cmd, uint32_t len) goto exit; } - me->pending_dsp2cpu_rsp.type = CVP_INVALID_RPMSG_TYPE; - exit: + me->pending_dsp2cpu_rsp.type = CVP_INVALID_RPMSG_TYPE; return rc; } @@ -181,26 +181,22 @@ static int cvp_dsp_rpmsg_callback(struct rpmsg_device *rpdev, struct cvp_dsp_rsp_msg *rsp = (struct cvp_dsp_rsp_msg *)data; struct cvp_dsp_apps *me = &gfa_cv; - dprintk(CVP_DSP, "%s: type = 0x%x ret = 0x%x\n", - __func__, rsp->type, rsp->ret); + dprintk(CVP_DSP, "%s: type = 0x%x ret = 0x%x len = 0x%x\n", + __func__, rsp->type, rsp->ret, len); - if (rsp->type == CPU2DSP_SUSPEND || - rsp->type == CPU2DSP_RESUME) { - me->pending_dsp2cpu_rsp.type = CVP_INVALID_RPMSG_TYPE; - return 0; - } - - if (rsp->type < CPU2DSP_MAX_CMD) { - if (me->pending_dsp2cpu_rsp.type != CVP_INVALID_RPMSG_TYPE) { + if (rsp->type < CPU2DSP_MAX_CMD && len == sizeof(*rsp)) { + if (me->pending_dsp2cpu_rsp.type == rsp->type) { + memcpy(&me->pending_dsp2cpu_rsp, rsp, + sizeof(struct cvp_dsp_rsp_msg)); + complete(&me->completions[rsp->type]); + } else { dprintk(CVP_ERR, "%s: CPU2DSP resp %d, pending %d\n", __func__, rsp->type, me->pending_dsp2cpu_rsp.type); goto exit; } - memcpy(&me->pending_dsp2cpu_rsp, rsp, - sizeof(struct cvp_dsp_rsp_msg)); - complete(&me->completions[rsp->type]); - } else if (rsp->type < CVP_DSP_MAX_CMD) { + } else if (rsp->type < CVP_DSP_MAX_CMD && + len == sizeof(struct cvp_dsp2cpu_cmd_msg)) { if (me->pending_dsp2cpu_cmd.type != CVP_INVALID_RPMSG_TYPE) { dprintk(CVP_ERR, "%s: DSP2CPU cmd:%d pending %d\n", __func__, rsp->type, @@ -236,12 +232,11 @@ int cvp_dsp_suspend(uint32_t session_flag) goto exit; /* Use cvp_dsp_send_cmd_sync after dsp driver is ready */ - rc = cvp_dsp_send_cmd(&cmd, sizeof(struct cvp_dsp_cmd_msg)); + rc = cvp_dsp_send_cmd_sync(&cmd, sizeof(struct cvp_dsp_cmd_msg)); if (rc) { dprintk(CVP_ERR, "%s: cvp_dsp_send_cmd failed rc = %d\n", __func__, rc); - me->state = DSP_UNINIT; goto exit; } @@ -265,12 +260,11 @@ int cvp_dsp_resume(uint32_t session_flag) goto exit; /* Use cvp_dsp_send_cmd_sync after dsp driver is ready */ - rc = cvp_dsp_send_cmd(&cmd, sizeof(struct cvp_dsp_cmd_msg)); + rc = cvp_dsp_send_cmd_sync(&cmd, sizeof(struct cvp_dsp_cmd_msg)); if (rc) { dprintk(CVP_ERR, "%s: cvp_dsp_send_cmd failed rc = %d\n", __func__, rc); - me->state = DSP_UNINIT; goto exit; } @@ -338,7 +332,6 @@ int cvp_dsp_register_buffer(uint32_t session_id, uint32_t buff_fd, rc = cvp_dsp_send_cmd_sync(&cmd, sizeof(struct cvp_dsp_cmd_msg)); if (rc) { dprintk(CVP_ERR, "%s send failed rc = %d\n", __func__, rc); - me->state = DSP_UNINIT; goto exit; } @@ -376,7 +369,6 @@ int cvp_dsp_deregister_buffer(uint32_t session_id, uint32_t buff_fd, rc = cvp_dsp_send_cmd_sync(&cmd, sizeof(struct cvp_dsp_cmd_msg)); if (rc) { dprintk(CVP_ERR, "%s send failed rc = %d\n", __func__, rc); - me->state = DSP_UNINIT; goto exit; } diff --git a/drivers/media/platform/msm/cvp/msm_cvp_dsp.h b/drivers/media/platform/msm/cvp/msm_cvp_dsp.h index 24be0355a460..0ea8b690f512 100644 --- a/drivers/media/platform/msm/cvp/msm_cvp_dsp.h +++ b/drivers/media/platform/msm/cvp/msm_cvp_dsp.h @@ -18,7 +18,7 @@ #define DSP_VM_NUM 2 #define CVP_DSP_MAX_RESERVED 5 #define CVP_DSP2CPU_RESERVED 8 -#define CVP_DSP_RESPONSE_TIMEOUT 1000 +#define CVP_DSP_RESPONSE_TIMEOUT 300 #define CVP_INVALID_RPMSG_TYPE 0xBADDFACE int cvp_dsp_device_init(void);