From 5fcdbf95f3cc037e6a0f18043db95642dac2e13f Mon Sep 17 00:00:00 2001 From: Depeng Shao Date: Tue, 29 Dec 2020 10:53:23 +0800 Subject: [PATCH] msm: camera: reqmgr: Mask re-apply for SHDR usecase SHDR case has two ISP instances, if one of them apply req failed sometimes, but the other one is good and the buf done has been handled successfully, then we don't need to apply the req again for the successful ISP. CRs-Fixed: 2842495 Change-Id: I3dfbb455244daa0d155858dd59f4a661fd3b87cd Signed-off-by: Depeng Shao --- drivers/cam_isp/cam_isp_context.c | 22 +++++++++++----------- drivers/cam_req_mgr/cam_req_mgr_core.c | 13 +++++++++++++ 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/drivers/cam_isp/cam_isp_context.c b/drivers/cam_isp/cam_isp_context.c index 2f6e9b7a97c4..38f5489d9aa4 100644 --- a/drivers/cam_isp/cam_isp_context.c +++ b/drivers/cam_isp/cam_isp_context.c @@ -3069,6 +3069,17 @@ static int __cam_isp_ctx_apply_req_in_activated_state( struct cam_isp_context *ctx_isp = NULL; struct cam_hw_config_args cfg = {0}; + ctx_isp = (struct cam_isp_context *) ctx->ctx_priv; + + if (apply->re_apply) + if (apply->request_id <= ctx_isp->last_applied_req_id) { + CAM_INFO_RATE_LIMIT(CAM_ISP, + "ctx_id:%d Trying to reapply the same request %llu again", + ctx->ctx_id, + apply->request_id); + return 0; + } + if (list_empty(&ctx->pending_req_list)) { CAM_ERR_RATE_LIMIT(CAM_ISP, "ctx_id:%d No available request for Apply id %lld", @@ -3084,8 +3095,6 @@ static int __cam_isp_ctx_apply_req_in_activated_state( * The maximum number of request allowed to be outstanding is 2. * */ - ctx_isp = (struct cam_isp_context *) ctx->ctx_priv; - if (atomic_read(&ctx_isp->process_bubble)) { CAM_INFO_RATE_LIMIT(CAM_ISP, "ctx_id:%d Processing bubble cannot apply Request Id %llu", @@ -3095,15 +3104,6 @@ static int __cam_isp_ctx_apply_req_in_activated_state( goto end; } - if (apply->re_apply) - if (apply->request_id <= ctx_isp->last_applied_req_id) { - CAM_INFO_RATE_LIMIT(CAM_ISP, - "ctx_id:%d Trying to reapply the same request %llu again", - ctx->ctx_id, - apply->request_id); - return 0; - } - spin_lock_bh(&ctx->lock); req = list_first_entry(&ctx->pending_req_list, struct cam_ctx_request, list); diff --git a/drivers/cam_req_mgr/cam_req_mgr_core.c b/drivers/cam_req_mgr/cam_req_mgr_core.c index 5439c344e069..d4516ad63884 100644 --- a/drivers/cam_req_mgr/cam_req_mgr_core.c +++ b/drivers/cam_req_mgr/cam_req_mgr_core.c @@ -929,6 +929,19 @@ static int __cam_req_mgr_send_req(struct cam_req_mgr_core_link *link, apply_req.report_if_bubble = in_q->slot[idx].recover; + /* + * If it is dual trigger usecase, need to tell + * devices that the req is re-applied, then the + * devices need to skip applying if the req has + * been handled. + * e.x. ISP device + */ + if (link->retry_cnt > 0) { + if (!apply_req.report_if_bubble && + link->dual_trigger) + apply_req.re_apply = true; + } + if ((slot->ops.dev_hdl == dev->dev_hdl) && (slot->ops.is_applied)) { slot->ops.is_applied = false;