Procházet zdrojové kódy

msm: camera: sync: Add support to invoke synx recover

If ICP FW is to be redowloaded, issue a synx recover for
this ICP core so that IPC/synx for the previous session
can be cleaned up prior to the next ICP cold boot.

CRs-Fixed: 3448052
Change-Id: I9f8f772730f7e4a8873b6dbdcf7a896ad6193150
Signed-off-by: Karthik Anantha Ram <[email protected]>
Karthik Anantha Ram před 2 roky
rodič
revize
267f259a72

+ 17 - 0
drivers/cam_icp/icp_hw/icp_hw_mgr/cam_icp_hw_mgr.c

@@ -4048,6 +4048,9 @@ static void cam_icp_mgr_proc_shutdown(struct cam_icp_hw_mgr *hw_mgr)
 	icp_dev_intf->hw_ops.deinit(icp_dev_intf->hw_priv,
 		&send_freq_info, sizeof(send_freq_info));
 
+	if (hw_mgr->synx_signaling_en)
+		cam_sync_synx_core_recovery(hw_mgr->synx_core_id);
+
 	hw_mgr->icp_resumed = false;
 }
 
@@ -8075,6 +8078,20 @@ int cam_icp_hw_mgr_init(struct device_node *of_node, uint64_t *hw_mgr_hdl,
 	if (rc)
 		goto icp_get_svs_clk_failed;
 
+	if (hw_mgr->synx_signaling_en) {
+		switch (hw_mgr->hw_mgr_id) {
+		case 0:
+			hw_mgr->synx_core_id = CAM_ICP_0_SYNX_CORE;
+			break;
+		case 1:
+			hw_mgr->synx_core_id = CAM_ICP_1_SYNX_CORE;
+			break;
+		default:
+			hw_mgr->synx_core_id = CAM_INVALID_SYNX_CORE;
+			break;
+		}
+	}
+
 	g_icp_hw_mgr[device_idx] = hw_mgr;
 
 	CAM_DBG(CAM_ICP, "Done hw mgr[%u] init: icp name:%s",

+ 2 - 0
drivers/cam_icp/icp_hw/icp_hw_mgr/cam_icp_hw_mgr.h

@@ -420,6 +420,7 @@ struct cam_icp_hw_ctx_data {
  * @iommu_hdl: Non secure IOMMU handle
  * @iommu_sec_hdl: Secure IOMMU handle
  * @hfi_handle: hfi handle for this ICP hw mgr
+ * @synx_core_id: Synx core ID if applicable
  * @hfi_mem: Memory for hfi
  * @cmd_work: Work queue for hfi commands
  * @msg_work: Work queue for hfi messages
@@ -473,6 +474,7 @@ struct cam_icp_hw_mgr {
 	int32_t iommu_hdl;
 	int32_t iommu_sec_hdl;
 	int32_t hfi_handle;
+	enum cam_sync_synx_supported_cores synx_core_id;
 	struct icp_hfi_mem_info hfi_mem;
 	struct cam_req_mgr_core_workq *cmd_work;
 	struct cam_req_mgr_core_workq *msg_work;

+ 12 - 0
drivers/cam_sync/cam_sync.c

@@ -1437,6 +1437,18 @@ static int cam_generic_fence_process_dma_fence_cmd(
 	return rc;
 }
 
+int cam_sync_synx_core_recovery(
+	enum cam_sync_synx_supported_cores core_id)
+{
+	int rc = -EOPNOTSUPP;
+
+#if IS_ENABLED(CONFIG_TARGET_SYNX_ENABLE)
+	  rc = cam_synx_core_recovery(core_id);
+#endif
+
+	return rc;
+}
+
 #if IS_ENABLED(CONFIG_TARGET_SYNX_ENABLE)
 static int cam_generic_fence_validate_signal_input_info_util(
 	int32_t fence_type,

+ 17 - 0
drivers/cam_sync/cam_sync_api.h

@@ -16,6 +16,12 @@
 #define SYNC_DEBUG_NAME_LEN 63
 typedef void (*sync_callback)(int32_t sync_obj, int status, void *data);
 
+enum cam_sync_synx_supported_cores {
+	CAM_ICP_0_SYNX_CORE = 1,
+	CAM_ICP_1_SYNX_CORE,
+	CAM_INVALID_SYNX_CORE,
+};
+
 /* Kernel APIs */
 
 /**
@@ -153,6 +159,17 @@ int cam_sync_wait(int32_t sync_obj, uint64_t timeout_ms);
  */
 int cam_sync_check_valid(int32_t sync_obj);
 
+/**
+ * @brief: Synx recovery for a given core
+ *
+ * @param core_id: Core ID we want to recover for
+ *
+ * @return Status of operation. Zero in case of success
+ * -EINVAL if core_id is invalid
+ */
+int cam_sync_synx_core_recovery(
+	enum cam_sync_synx_supported_cores core_id);
+
 /**
  * @brief : API to register SYNC to platform framework.
  *

+ 30 - 0
drivers/cam_sync/cam_sync_synx.c

@@ -722,6 +722,36 @@ monitor_dump:
 	return rc;
 }
 
+int cam_synx_core_recovery(
+	enum cam_sync_synx_supported_cores cam_core_id)
+{
+	int rc;
+	enum synx_client_id client_id = SYNX_CLIENT_MAX;
+
+	switch (cam_core_id) {
+	case CAM_ICP_0_SYNX_CORE:
+		client_id = SYNX_CLIENT_ICP_CTX0;
+		break;
+	default:
+		rc = -EINVAL;
+		goto err;
+	}
+
+	rc = synx_recover(client_id);
+	if (rc)
+		goto err;
+
+	CAM_DBG(CAM_SYNX, "Synx recovery for synx_client: %d[%d] success",
+		client_id, cam_core_id);
+
+	return rc;
+
+err:
+	CAM_ERR(CAM_SYNX, "Failed to recover for synx_client: %d rc: %d",
+			client_id, rc);
+	return rc;
+}
+
 int __cam_synx_init_session(void)
 {
 	struct synx_queue_desc queue_desc;

+ 12 - 0
drivers/cam_sync/cam_sync_synx.h

@@ -10,6 +10,7 @@
 #include <linux/bitmap.h>
 #include <synx_api.h>
 
+#include "cam_sync_api.h"
 #include "cam_sync.h"
 #include "cam_debug_util.h"
 
@@ -138,6 +139,17 @@ int cam_synx_obj_signal_obj(struct cam_synx_obj_signal *signal_synx_obj);
 int cam_synx_obj_register_cb(int32_t *sync_obj, int32_t row_idx,
 	cam_sync_callback_for_synx_obj sync_cb);
 
+/**
+ * @brief: Synx recovery for a given core
+ *
+ * @param core_id: Core ID we want to recover for
+ *
+ * @return Status of operation. Zero in case of success
+ * -EINVAL if core_id is invalid
+ */
+int cam_synx_core_recovery(
+	enum cam_sync_synx_supported_cores core_id);
+
 /**
  * @brief: cam synx driver open
  *