Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5cbff44a authored by Prakasha Nayak's avatar Prakasha Nayak
Browse files

msm: camera: isp: Add epd Blob support



This change adds blob support to disable CSID EOT IRQ
in case of high data rate sensors which sends
EPD instead of EOT.

CRs-Fixed: 2566158
Change-Id: I8ac6d2281a6510d3702f3b651e2c7ca2391afe6c
Signed-off-by: default avatarPrakasha Nayak <pnayak@codeaurora.org>
parent 1189e7ac
Loading
Loading
Loading
Loading
+61 −6
Original line number Diff line number Diff line
@@ -5163,6 +5163,51 @@ static int cam_isp_blob_vfe_out_update(
	return rc;
}

static int cam_isp_blob_csid_config_update(
	uint32_t                               blob_type,
	struct cam_isp_generic_blob_info      *blob_info,
	struct cam_isp_csid_epd_config        *epd_config,
	struct cam_hw_prepare_update_args     *prepare)
{
	struct cam_ife_hw_mgr_ctx                   *ctx = NULL;
	struct cam_ife_hw_mgr_res                   *hw_mgr_res;
	struct cam_hw_intf                          *hw_intf;
	struct cam_ife_csid_epd_update_args         epd_update_args;
	int                                         rc = -EINVAL;
	uint32_t                                    i = 0;

	ctx = prepare->ctxt_to_hw_map;

	list_for_each_entry(hw_mgr_res, &ctx->res_list_ife_csid, list) {
		for (i = 0; i < CAM_ISP_HW_SPLIT_MAX; i++) {
			if (!hw_mgr_res->hw_res[i])
				continue;

			hw_intf = hw_mgr_res->hw_res[i]->hw_intf;
			if (hw_intf && hw_intf->hw_ops.process_cmd) {
				epd_update_args.epd_supported =
					epd_config->is_epd_supported;

				rc = hw_intf->hw_ops.process_cmd(
					hw_intf->hw_priv,
					CAM_IFE_CSID_SET_CONFIG,
					&epd_update_args,
					sizeof(
					struct cam_ife_csid_epd_update_args)
					);
				if (rc)
					CAM_ERR(CAM_ISP,
						"Failed to epd config:%d",
						epd_config->is_epd_supported);
			} else {
				CAM_WARN(CAM_ISP, "NULL hw_intf!");
			}

		}
	}

	return rc;
}
static int cam_isp_packet_generic_blob_handler(void *user_data,
	uint32_t blob_type, uint32_t blob_size, uint8_t *blob_data)
{
@@ -5177,12 +5222,6 @@ static int cam_isp_packet_generic_blob_handler(void *user_data,
		return -EINVAL;
	}

	if (blob_type >= CAM_ISP_GENERIC_BLOB_TYPE_MAX) {
		CAM_ERR(CAM_ISP, "Invalid Blob Type %d Max %d", blob_type,
			CAM_ISP_GENERIC_BLOB_TYPE_MAX);
		return -EINVAL;
	}

	prepare = blob_info->prepare;
	if (!prepare || !prepare->ctxt_to_hw_map) {
		CAM_ERR(CAM_ISP, "Failed. prepare is NULL, blob_type %d",
@@ -5632,7 +5671,23 @@ static int cam_isp_packet_generic_blob_handler(void *user_data,
			CAM_ERR(CAM_ISP, "VFE out update failed rc: %d", rc);
	}
		break;
	case CAM_ISP_GENERIC_BLOB_TYPE_CSID_CONFIG: {
		struct cam_isp_csid_epd_config *epd_config;

		if (blob_size < sizeof(struct cam_isp_csid_epd_config)) {
			CAM_ERR(CAM_ISP,
				"Invalid epd config blob size %u expected %u",
				blob_size,
				sizeof(struct cam_isp_csid_epd_config));
			return -EINVAL;
		}
		epd_config = (struct cam_isp_csid_epd_config *)blob_data;
		rc = cam_isp_blob_csid_config_update(blob_type, blob_info,
			epd_config, prepare);
		if (rc)
			CAM_ERR(CAM_ISP, "CSID Config failed rc: %d", rc);
	}
		break;
	default:
		CAM_WARN(CAM_ISP, "Invalid blob type %d", blob_type);
		break;
+28 −1
Original line number Diff line number Diff line
@@ -518,6 +518,7 @@ static int cam_ife_csid_global_reset(struct cam_ife_csid_hw *csid_hw)
			csid_hw->hw_intf->hw_idx, val);
	csid_hw->error_irq_count = 0;
	csid_hw->prev_boot_timestamp = 0;
	csid_hw->epd_supported = 0;

end:
	return rc;
@@ -1356,6 +1357,7 @@ static int cam_ife_csid_disable_hw(struct cam_ife_csid_hw *csid_hw)
	csid_hw->hw_info->hw_state = CAM_HW_STATE_POWER_DOWN;
	csid_hw->error_irq_count = 0;
	csid_hw->prev_boot_timestamp = 0;
	csid_hw->epd_supported = 0;

	return rc;
}
@@ -1591,7 +1593,6 @@ static int cam_ife_csid_enable_csi2(
		CSID_CSI2_RX_ERROR_LANE1_FIFO_OVERFLOW |
		CSID_CSI2_RX_ERROR_LANE2_FIFO_OVERFLOW |
		CSID_CSI2_RX_ERROR_LANE3_FIFO_OVERFLOW |
		CSID_CSI2_RX_ERROR_CPHY_EOT_RECEPTION |
		CSID_CSI2_RX_ERROR_CPHY_SOT_RECEPTION |
		CSID_CSI2_RX_ERROR_CRC |
		CSID_CSI2_RX_ERROR_ECC |
@@ -1600,6 +1601,12 @@ static int cam_ife_csid_enable_csi2(
		CSID_CSI2_RX_ERROR_UNBOUNDED_FRAME |
		CSID_CSI2_RX_ERROR_CPHY_PH_CRC;

	if (csid_hw->epd_supported == 1)
		CAM_INFO(CAM_ISP,
			"Disable CSID_CSI2_RX_ERROR_CPHY_EOT_RECEPTION for EPD");
	else
		val = val | CSID_CSI2_RX_ERROR_CPHY_EOT_RECEPTION;

	/* Enable the interrupt based on csid debug info set */
	if (csid_hw->csid_debug & CSID_DEBUG_ENABLE_SOT_IRQ)
		val |= CSID_CSI2_RX_INFO_PHY_DL0_SOT_CAPTURED |
@@ -3862,6 +3869,23 @@ static int cam_ife_csid_dump_hw(
	return 0;
}

static int cam_ife_csid_set_epd_config(
	struct cam_ife_csid_hw *csid_hw, void *cmd_args)
{
	struct cam_ife_csid_epd_update_args *epd_update = NULL;

	if ((!csid_hw) || (!cmd_args))
		return -EINVAL;

	epd_update =
		(struct cam_ife_csid_epd_update_args *)cmd_args;

	csid_hw->epd_supported = epd_update->epd_supported;
	CAM_DBG(CAM_ISP, "CSID EPD supported %d", csid_hw->epd_supported);

	return 0;
}

static int cam_ife_csid_process_cmd(void *hw_priv,
	uint32_t cmd_type, void *cmd_args, uint32_t arg_size)
{
@@ -3902,6 +3926,9 @@ static int cam_ife_csid_process_cmd(void *hw_priv,
	case CAM_ISP_HW_CMD_DUMP_HW:
		rc = cam_ife_csid_dump_hw(csid_hw, cmd_args);
		break;
	case CAM_IFE_CSID_SET_CONFIG:
		rc = cam_ife_csid_set_epd_config(csid_hw, cmd_args);
		break;
	default:
		CAM_ERR(CAM_ISP, "CSID:%d unsupported cmd:%d",
			csid_hw->hw_intf->hw_idx, cmd_type);
+2 −1
Original line number Diff line number Diff line
@@ -552,9 +552,9 @@ struct cam_ife_csid_path_cfg {
 *                            need to stop the CSID and mask interrupts.
 * @binning_enable            Flag is set if hardware supports QCFA binning
 * @binning_supported         Flag is set if sensor supports QCFA binning
 *
 * @first_sof_ts              first bootime stamp at the start
 * @prev_qtimer_ts            stores csid timestamp
 * @epd_supported             Flag is set if sensor supports EPD
 */
struct cam_ife_csid_hw {
	struct cam_hw_intf              *hw_intf;
@@ -588,6 +588,7 @@ struct cam_ife_csid_hw {
	uint32_t                         binning_supported;
	uint64_t                         prev_boot_timestamp;
	uint64_t                         prev_qtimer_ts;
	uint32_t                         epd_supported;
};

int cam_ife_csid_hw_probe_init(struct cam_hw_intf  *csid_hw_intf,
+9 −0
Original line number Diff line number Diff line
@@ -205,6 +205,7 @@ enum cam_ife_csid_cmd_type {
	CAM_IFE_CSID_CMD_GET_TIME_STAMP,
	CAM_IFE_CSID_SET_CSID_DEBUG,
	CAM_IFE_CSID_SOF_IRQ_DEBUG,
	CAM_IFE_CSID_SET_CONFIG,
	CAM_IFE_CSID_CMD_MAX,
};

@@ -237,5 +238,13 @@ struct cam_ife_csid_qcfa_update_args {
	uint32_t                           qcfa_binning;
};

/*
 * struct cam_ife_csid_epd_update_args:
 *
 * @epd_supported:                flag to check epd supported or not
 */
struct cam_ife_csid_epd_update_args {
	uint32_t                           epd_supported;
};

#endif /* _CAM_CSID_HW_INTF_H_ */
+11 −1
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
/*
 * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
 */

#ifndef __UAPI_CAM_ISP_H__
@@ -102,6 +102,7 @@
#define CAM_ISP_GENERIC_BLOB_TYPE_IFE_CORE_CONFIG     7
#define CAM_ISP_GENERIC_BLOB_TYPE_VFE_OUT_CONFIG      8
#define CAM_ISP_GENERIC_BLOB_TYPE_BW_CONFIG_V2        9
#define CAM_ISP_GENERIC_BLOB_TYPE_CSID_CONFIG         10
#define CAM_ISP_GENERIC_BLOB_TYPE_CSID_QCFA_CONFIG    12

#define CAM_ISP_VC_DT_CFG    4
@@ -697,6 +698,15 @@ struct cam_isp_vfe_out_config {
	struct cam_isp_vfe_wm_config  wm_config[1];
};

/**
 * struct cam_isp_csid_epd_config  -  Support for EPD Packet config
 *
 * @is_epd_sensor      : flag to check if epd supported
 */
struct cam_isp_csid_epd_config {
	uint32_t                      is_epd_supported;
};

#define CAM_ISP_ACQUIRE_COMMON_VER0         0x1000

#define CAM_ISP_ACQUIRE_COMMON_SIZE_VER0    0x0