소스 검색

msm: camera: reqmgr: skip re_apply of ISP for buf_done request

crm applied both sensor and isp packets,sensor packet failed to
apply due to CCI timeout error. In the meantime ISP packet applied
and that request of ISP moved to free_list.In the next epoch crm
trying to reapply both the packets of sensor and isp again.In this
case ISP always reporting an apply failure because its pending queue
doesn’t have that request.To handle this we are skipping to re-apply
the ISP successful buf_done request and trying to apply only sensor
packet in this scenario.

CRs-Fixed: 2599186
Change-Id: Id7e72fc016a75782b57f05558c615b069b416ffe
Signed-off-by: Mangalaram ARCHANA <[email protected]>
Mangalaram ARCHANA 5 년 전
부모
커밋
1f40c7a467

+ 8 - 0
drivers/cam_isp/cam_isp_context.c

@@ -2485,6 +2485,14 @@ 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(CAM_ISP,
+				"Trying to reapply the same request %llu again",
+				apply->request_id);
+			return 0;
+		}
+
 	spin_lock_bh(&ctx->lock);
 	req = list_first_entry(&ctx->pending_req_list, struct cam_ctx_request,
 		list);

+ 5 - 0
drivers/cam_req_mgr/cam_req_mgr_core.c

@@ -659,6 +659,11 @@ static int __cam_req_mgr_send_req(struct cam_req_mgr_core_link *link,
 
 	apply_req.link_hdl = link->link_hdl;
 	apply_req.report_if_bubble = 0;
+	apply_req.re_apply = false;
+	if (link->retry_cnt > 0) {
+		if (g_crm_core_dev->recovery_on_apply_fail)
+			apply_req.re_apply = true;
+	}
 
 	for (i = 0; i < link->num_devs; i++) {
 		dev = &link->l_dev[i];

+ 2 - 0
drivers/cam_req_mgr/cam_req_mgr_core.h

@@ -406,10 +406,12 @@ struct cam_req_mgr_core_session {
  * - Core camera request manager data struct
  * @session_head : list head holding sessions
  * @crm_lock     : mutex lock to protect session creation & destruction
+ * @recovery_on_apply_fail : Recovery on apply failure using debugfs.
  */
 struct cam_req_mgr_core_device {
 	struct list_head             session_head;
 	struct mutex                 crm_lock;
+	bool                         recovery_on_apply_fail;
 };
 
 /**

+ 8 - 1
drivers/cam_req_mgr/cam_req_mgr_debug.c

@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
  */
 
 #include "cam_req_mgr_debug.h"
@@ -128,5 +128,12 @@ int cam_req_mgr_debug_register(struct cam_req_mgr_core_device *core_dev)
 		debugfs_root, core_dev, &bubble_recovery))
 		return -ENOMEM;
 
+	if (!debugfs_create_bool("recovery_on_apply_fail",
+		0644,
+		debugfs_root,
+		&core_dev->recovery_on_apply_fail)) {
+		return -ENOMEM;
+	}
+
 	return 0;
 }

+ 2 - 0
drivers/cam_req_mgr/cam_req_mgr_interface.h

@@ -320,6 +320,7 @@ struct cam_req_mgr_core_dev_link_setup {
  * @request_id       : request id settings to apply
  * @report_if_bubble : report to crm if failure in applying
  * @trigger_point    : the trigger point of this apply
+ * @re_apply         : to skip re_apply for buf_done request
  *
  */
 struct cam_req_mgr_apply_request {
@@ -328,6 +329,7 @@ struct cam_req_mgr_apply_request {
 	uint64_t   request_id;
 	int32_t    report_if_bubble;
 	uint32_t   trigger_point;
+	bool       re_apply;
 };
 
 /**