From abee20f08a78c5b9441f2d8c4b6d50641d3d2dda Mon Sep 17 00:00:00 2001 From: Vikram Sharma Date: Tue, 28 Sep 2021 22:05:01 +0530 Subject: [PATCH] msm: camera: isp: Add handling for flush in flushed state This change handles race condition in which flush is handled in flushed state. CRs-Fixed: 3038297 Change-Id: I8be1f8c70431c77366f8846d8ccab3414f3ede3e Signed-off-by: Vikram Sharma --- drivers/cam_isp/cam_isp_context.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/cam_isp/cam_isp_context.c b/drivers/cam_isp/cam_isp_context.c index acd4c1acad93..87779aea1a16 100644 --- a/drivers/cam_isp/cam_isp_context.c +++ b/drivers/cam_isp/cam_isp_context.c @@ -3541,6 +3541,19 @@ hw_dump: return rc; } +static int __cam_isp_ctx_flush_req_in_flushed_state( + struct cam_context *ctx, + struct cam_req_mgr_flush_request *flush_req) +{ + if (flush_req->type == CAM_REQ_MGR_FLUSH_TYPE_ALL) { + CAM_INFO(CAM_ISP, "Flush in flushed state req id %lld ctx_id:%d", + flush_req->req_id, ctx->ctx_id); + ctx->last_flush_req = flush_req->req_id; + } + + return 0; +} + static int __cam_isp_ctx_flush_req(struct cam_context *ctx, struct list_head *req_list, struct cam_req_mgr_flush_request *flush_req) { @@ -4637,6 +4650,14 @@ static int __cam_isp_ctx_config_dev_in_top_state( packet->header.request_id); rc = -EBADR; goto free_req; + } else if ((packet_opcode == CAM_ISP_PACKET_INIT_DEV) + && (packet->header.request_id <= ctx->last_flush_req) + && ctx->last_flush_req && packet->header.request_id) { + CAM_WARN(CAM_ISP, + "last flushed req is %lld, config dev(init) for req %lld", + ctx->last_flush_req, packet->header.request_id); + rc = -EBADR; + goto free_req; } cfg.packet = packet; @@ -5927,6 +5948,7 @@ static struct cam_ctx_ops .crm_ops = { .unlink = __cam_isp_ctx_unlink_in_ready, .process_evt = __cam_isp_ctx_process_evt, + .flush_req = __cam_isp_ctx_flush_req_in_flushed_state, }, .irq_ops = NULL, .pagefault_ops = cam_isp_context_dump_requests,