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

Commit b1beed57 authored by Sumalatha Malothu's avatar Sumalatha Malothu Committed by Gerrit - the friendly Code Review server
Browse files

msm: camera: Send topology and stream status to TZ



In secure camera mode, publish topology and stream
start and stop events to TZ for it to reset the
modules, which adds to the security of the data.

Change-Id: If7f4b85199e628846a1a416530f43ad4afa786ac
Signed-off-by: default avatarVijay kumar Tumati <vtumati@codeaurora.org>
Signed-off-by: default avatarShadul Shaikh <sshadu@codeaurora.org>
Signed-off-by: default avatarSumalatha Malothu <smalot@codeaurora.org>
parent 3d3d8da4
Loading
Loading
Loading
Loading
+139 −4
Original line number Original line Diff line number Diff line
@@ -62,7 +62,14 @@
#define SOF_DEBUG_DISABLE                    0
#define SOF_DEBUG_DISABLE                    0


#define SCM_SVC_CAMERASS                     0x18
#define SCM_SVC_CAMERASS                     0x18
#define SECURE_SYSCALL_ID                    0x6
#define SECURE_SYSCALL_ID                    0x7
#define TOPOLOGY_SYSCALL_ID                  0x8
#define STREAM_NOTIF_SYSCALL_ID              0x9

#define CSIPHY_0_LANES_MASK                  0x000f
#define CSIPHY_1_LANES_MASK                  0x00f0
#define CSIPHY_2_LANES_MASK                  0x0f00
#define CSIPHY_3_LANES_MASK                  0xf000


#define TRUE   1
#define TRUE   1
#define FALSE  0
#define FALSE  0
@@ -73,6 +80,13 @@
#undef CDBG
#undef CDBG
#define CDBG(fmt, args...) pr_debug(fmt, ##args)
#define CDBG(fmt, args...) pr_debug(fmt, ##args)


static const uint32_t CSIPHY_LANES_MASKS[] = {
	CSIPHY_0_LANES_MASK,
	CSIPHY_1_LANES_MASK,
	CSIPHY_2_LANES_MASK,
	CSIPHY_3_LANES_MASK,
};

static struct camera_vreg_t csid_vreg_info[] = {
static struct camera_vreg_t csid_vreg_info[] = {
	{"qcom,mipi-csi-vdd", 0, 0, 12000},
	{"qcom,mipi-csi-vdd", 0, 0, 12000},
};
};
@@ -340,6 +354,63 @@ static bool msm_csid_find_max_clk_rate(struct csid_device *csid_dev)
	}
	}
	return ret;
	return ret;
}
}

static int msm_csid_seccam_send_topology(struct csid_device *csid_dev,
	struct msm_camera_csid_params *csid_params)
{
	void __iomem *csidbase;
	struct scm_desc desc = {0};

	csidbase = csid_dev->base;
	if (!csidbase || !csid_params) {
		pr_err("%s:%d csidbase %pK, csid params %pK\n", __func__,
			__LINE__, csidbase, csid_params);
		return -EINVAL;
	}

	desc.arginfo = SCM_ARGS(2, SCM_VAL, SCM_VAL);
	desc.args[0] = csid_params->phy_sel;
	desc.args[1] = csid_params->topology;

	CDBG("phy_sel %d, topology %d\n",
		csid_params->phy_sel, csid_params->topology);
	if (scm_call2(SCM_SIP_FNID(SCM_SVC_CAMERASS,
		TOPOLOGY_SYSCALL_ID), &desc)) {
		pr_err("%s:%d scm call to hypervisor failed\n",
			__func__, __LINE__);
		return -EINVAL;
	}
	return 0;
}

static int msm_csid_seccam_reset_pipeline(struct csid_device *csid_dev,
	struct msm_camera_csid_params *csid_params)
{
	void __iomem *csidbase;
	struct scm_desc desc = {0};

	csidbase = csid_dev->base;
	if (!csidbase || !csid_params) {
		pr_err("%s:%d csidbase %pK, csid params %pK\n", __func__,
			__LINE__, csidbase, csid_params);
		return -EINVAL;
	}

	desc.arginfo = SCM_ARGS(2, SCM_VAL, SCM_VAL);
	desc.args[0] = csid_params->phy_sel;
	desc.args[1] = csid_params->is_streamon;

	CDBG("phy_sel %d, is_streamon %d\n",
		csid_params->phy_sel, csid_params->is_streamon);
	if (scm_call2(SCM_SIP_FNID(SCM_SVC_CAMERASS,
		STREAM_NOTIF_SYSCALL_ID), &desc)) {
		pr_err("%s:%d scm call to hypervisor failed\n",
			__func__, __LINE__);
		return -EINVAL;
	}
	return 0;
}

static int msm_csid_config(struct csid_device *csid_dev,
static int msm_csid_config(struct csid_device *csid_dev,
	struct msm_camera_csid_params *csid_params)
	struct msm_camera_csid_params *csid_params)
{
{
@@ -377,17 +448,19 @@ static int msm_csid_config(struct csid_device *csid_dev,


		desc.arginfo = SCM_ARGS(2, SCM_VAL, SCM_VAL);
		desc.arginfo = SCM_ARGS(2, SCM_VAL, SCM_VAL);
		desc.args[0] = csid_params->is_secure;
		desc.args[0] = csid_params->is_secure;
		desc.args[1] = csid_params->phy_sel;
		desc.args[1] = CSIPHY_LANES_MASKS[csid_params->phy_sel];


		CDBG("phy_sel : %d, secure : %d\n",
		CDBG("phy_sel : %d, secure : %d\n",
			csid_params->phy_sel, csid_params->is_secure);
			csid_params->phy_sel, csid_params->is_secure);

		msm_camera_tz_clear_tzbsp_status();

		if (scm_call2(SCM_SIP_FNID(SCM_SVC_CAMERASS,
		if (scm_call2(SCM_SIP_FNID(SCM_SVC_CAMERASS,
			SECURE_SYSCALL_ID), &desc)) {
			SECURE_SYSCALL_ID), &desc)) {
			pr_err("%s:%d scm call to hypervisor failed\n",
			pr_err("%s:%d scm call to hypervisor failed\n",
				__func__, __LINE__);
				__func__, __LINE__);
			return -EINVAL;
			return -EINVAL;
		}
		}
		msm_camera_tz_clear_tzbsp_status();
	}
	}


	csid_dev->csid_lane_cnt = csid_params->lane_cnt;
	csid_dev->csid_lane_cnt = csid_params->lane_cnt;
@@ -757,7 +830,8 @@ static int msm_csid_release(struct csid_device *csid_dev)


		desc.arginfo = SCM_ARGS(2, SCM_VAL, SCM_VAL);
		desc.arginfo = SCM_ARGS(2, SCM_VAL, SCM_VAL);
		desc.args[0] = 0;
		desc.args[0] = 0;
		desc.args[1] = csid_dev->current_csid_params.phy_sel;
		desc.args[1] = CSIPHY_LANES_MASKS[
				csid_dev->current_csid_params.phy_sel];


		if (scm_call2(SCM_SIP_FNID(SCM_SVC_CAMERASS,
		if (scm_call2(SCM_SIP_FNID(SCM_SVC_CAMERASS,
			SECURE_SYSCALL_ID), &desc)) {
			SECURE_SYSCALL_ID), &desc)) {
@@ -886,6 +960,32 @@ static int32_t msm_csid_cmd(struct csid_device *csid_dev, void *arg)
			kfree(csid_params.lut_params.vc_cfg[i]);
			kfree(csid_params.lut_params.vc_cfg[i]);
		break;
		break;
	}
	}
	case CSID_SECCAM_TOPOLOGY: {
		struct msm_camera_csid_params csid_params;

		if (copy_from_user(&csid_params,
			(void __user *)cdata->cfg.csid_params,
			sizeof(struct msm_camera_csid_params))) {
			pr_err("%s: %d failed\n", __func__, __LINE__);
			rc = -EFAULT;
			break;
		}
		rc = msm_csid_seccam_send_topology(csid_dev, &csid_params);
		break;
	}
	case CSID_SECCAM_RESET: {
		struct msm_camera_csid_params csid_params;

		if (copy_from_user(&csid_params,
			(void __user *)cdata->cfg.csid_params,
			sizeof(struct msm_camera_csid_params))) {
			pr_err("%s: %d failed\n", __func__, __LINE__);
			rc = -EFAULT;
			break;
		}
		rc = msm_csid_seccam_reset_pipeline(csid_dev, &csid_params);
		break;
	}
	case CSID_RELEASE:
	case CSID_RELEASE:
		rc = msm_csid_release(csid_dev);
		rc = msm_csid_release(csid_dev);
		break;
		break;
@@ -1058,6 +1158,41 @@ static int32_t msm_csid_cmd32(struct csid_device *csid_dev, void *arg)
		}
		}
		break;
		break;
	}
	}
	case CSID_SECCAM_TOPOLOGY: {
		struct msm_camera_csid_params csid_params;
		struct msm_camera_csid_params32 csid_params32;

		if (copy_from_user(&csid_params32,
			(void __user *)compat_ptr(arg32->cfg.csid_params),
			sizeof(struct msm_camera_csid_params32))) {
			pr_err("%s: %d failed\n", __func__, __LINE__);
			rc = -EFAULT;
			break;
		}

		csid_params.topology = csid_params32.topology;
		csid_params.phy_sel = csid_params32.phy_sel;

		rc = msm_csid_seccam_send_topology(csid_dev, &csid_params);
		break;
	}
	case CSID_SECCAM_RESET: {
		struct msm_camera_csid_params csid_params;
		struct msm_camera_csid_params32 csid_params32;

		if (copy_from_user(&csid_params32,
			(void __user *)compat_ptr(arg32->cfg.csid_params),
			sizeof(struct msm_camera_csid_params32))) {
			pr_err("%s: %d failed\n", __func__, __LINE__);
			rc = -EFAULT;
			break;
		}

		csid_params.is_streamon = csid_params32.is_streamon;
		csid_params.phy_sel = csid_params32.phy_sel;
		rc = msm_csid_seccam_reset_pipeline(csid_dev, &csid_params);
		break;
	}
	case CSID_RELEASE:
	case CSID_RELEASE:
		rc = msm_csid_release(csid_dev);
		rc = msm_csid_release(csid_dev);
		break;
		break;
+4 −0
Original line number Original line Diff line number Diff line
@@ -18,6 +18,8 @@


#include <linux/compat.h>
#include <linux/compat.h>


#define SECURE_CAM_RST_MODULES

#ifdef CONFIG_COMPAT
#ifdef CONFIG_COMPAT


struct msm_sensor_power_setting32 {
struct msm_sensor_power_setting32 {
@@ -85,6 +87,8 @@ struct msm_camera_csid_params32 {
	struct msm_camera_csid_lut_params32 lut_params;
	struct msm_camera_csid_lut_params32 lut_params;
	uint8_t csi_3p_sel;
	uint8_t csi_3p_sel;
	uint8_t is_secure;
	uint8_t is_secure;
	uint32_t topology;
	uint8_t is_streamon;
};
};


struct msm_camera_csi2_params32 {
struct msm_camera_csi2_params32 {
+2 −0
Original line number Original line Diff line number Diff line
@@ -155,6 +155,8 @@ enum csid_cfg_type_t {
	CSID_CFG,
	CSID_CFG,
	CSID_TESTMODE_CFG,
	CSID_TESTMODE_CFG,
	CSID_RELEASE,
	CSID_RELEASE,
	CSID_SECCAM_TOPOLOGY,
	CSID_SECCAM_RESET,
};
};


enum csiphy_cfg_type_t {
enum csiphy_cfg_type_t {
+3 −0
Original line number Original line Diff line number Diff line
@@ -1367,6 +1367,7 @@ struct msm_camera_csid_params {
	uint8_t lane_cnt;
	uint8_t lane_cnt;
	uint16_t lane_assign;
	uint16_t lane_assign;
	uint8_t phy_sel;
	uint8_t phy_sel;
	uint32_t topology;
	struct msm_camera_csid_lut_params lut_params;
	struct msm_camera_csid_lut_params lut_params;
};
};


@@ -1411,6 +1412,8 @@ struct csic_cfg_data {
enum csid_cfg_type_t {
enum csid_cfg_type_t {
	CSID_INIT,
	CSID_INIT,
	CSID_CFG,
	CSID_CFG,
	CSID_SECCAM_TOPOLOGY,
	CSID_SECCAM_RESET,
};
};


struct csid_cfg_data {
struct csid_cfg_data {
+4 −0
Original line number Original line Diff line number Diff line
@@ -54,6 +54,8 @@


#define SECURE_CAMERA
#define SECURE_CAMERA


#define SECURE_CAM_RST_MODULES

enum msm_sensor_camera_id_t {
enum msm_sensor_camera_id_t {
	CAMERA_0,
	CAMERA_0,
	CAMERA_1,
	CAMERA_1,
@@ -355,6 +357,8 @@ struct msm_camera_csid_params {
	struct msm_camera_csid_lut_params lut_params;
	struct msm_camera_csid_lut_params lut_params;
	unsigned char csi_3p_sel;
	unsigned char csi_3p_sel;
	unsigned char is_secure;
	unsigned char is_secure;
	uint32_t topology;
	unsigned char is_streamon;
};
};


struct msm_camera_csid_testmode_parms {
struct msm_camera_csid_testmode_parms {