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

Commit 89bafe85 authored by Ramesh V's avatar Ramesh V
Browse files

msm: camera: smmu: combine image and stats context bank as one



make common context bank for image and stats buffers.

Change-Id: Ie31f8c2a9242992640c8879bc7bb5319581a6f46
Signed-off-by: default avatarRamesh V <ramev@codeaurora.org>
parent 480330c3
Loading
Loading
Loading
Loading
+17 −76
Original line number Diff line number Diff line
@@ -148,18 +148,12 @@ static int msm_isp_prepare_v4l2_buf(struct msm_isp_buf_mgr *buf_mgr,
	int i, rc = -1;
	int ret;
	struct msm_isp_buffer_mapped_info *mapped_info;
	int iommu_hdl;
	uint32_t accu_length = 0;

	if (stream_id & ISP_STATS_STREAM_BIT)
		iommu_hdl = buf_mgr->stats_iommu_hdl;
	else
		iommu_hdl = buf_mgr->img_iommu_hdl;

	for (i = 0; i < qbuf_buf->num_planes; i++) {
		mapped_info = &buf_info->mapped_info[i];
		mapped_info->buf_fd = qbuf_buf->planes[i].addr;
		ret = cam_smmu_get_phy_addr(iommu_hdl,
		ret = cam_smmu_get_phy_addr(buf_mgr->iommu_hdl,
					mapped_info->buf_fd,
					CAM_SMMU_MAP_RW,
					&(mapped_info->paddr),
@@ -193,7 +187,6 @@ static void msm_isp_unprepare_v4l2_buf(
	int i;
	struct msm_isp_buffer_mapped_info *mapped_info;
	struct msm_isp_bufq *bufq = NULL;
	int iommu_hdl;

	if (!buf_mgr || !buf_info) {
		pr_err("%s: NULL ptr %p %p\n", __func__,
@@ -208,15 +201,10 @@ static void msm_isp_unprepare_v4l2_buf(
		return;
	}

	if (stream_id & ISP_STATS_STREAM_BIT)
		iommu_hdl = buf_mgr->stats_iommu_hdl;
	else
		iommu_hdl = buf_mgr->img_iommu_hdl;

	for (i = 0; i < buf_info->num_planes; i++) {
		mapped_info = &buf_info->mapped_info[i];

		cam_smmu_put_phy_addr(iommu_hdl, mapped_info->buf_fd);
		cam_smmu_put_phy_addr(buf_mgr->iommu_hdl, mapped_info->buf_fd);
	}
	return;
}
@@ -1047,27 +1035,22 @@ static void msm_isp_release_all_bufq(
 */
static int msm_isp_buf_put_scratch(struct msm_isp_buf_mgr *buf_mgr)
{
	int rc, ret;
	int rc;

	if (!buf_mgr->scratch_buf_addr)
		return 0;

	rc = cam_smmu_put_phy_addr_scratch(buf_mgr->img_iommu_hdl,
	rc = cam_smmu_put_phy_addr_scratch(buf_mgr->iommu_hdl,
				buf_mgr->scratch_buf_addr);
	if (rc)
		pr_err("%s: failed to put scratch buffer to img iommu: %d\n",
			__func__, rc);

	ret = cam_smmu_put_phy_addr_scratch(buf_mgr->stats_iommu_hdl,
				buf_mgr->scratch_buf_addr);
	if (ret)
		pr_err("%s: failed to put scratch buffer to stats iommu: %d\n",
			__func__, ret);

	if (!rc && !ret)
	if (!rc)
		buf_mgr->scratch_buf_addr = 0;

	return rc | ret;
	return rc;
}

/**
@@ -1082,14 +1065,13 @@ static int msm_isp_buf_put_scratch(struct msm_isp_buf_mgr *buf_mgr)
static int msm_isp_buf_get_scratch(struct msm_isp_buf_mgr *buf_mgr)
{
	int rc;
	dma_addr_t scratch_buf_addr;

	if (buf_mgr->scratch_buf_addr || !buf_mgr->scratch_buf_range)
		/* already mapped or not supported */
		return 0;

	rc = cam_smmu_get_phy_addr_scratch(
				buf_mgr->img_iommu_hdl,
				buf_mgr->iommu_hdl,
				CAM_SMMU_MAP_RW,
				&buf_mgr->scratch_buf_addr,
				buf_mgr->scratch_buf_range,
@@ -1099,26 +1081,6 @@ static int msm_isp_buf_get_scratch(struct msm_isp_buf_mgr *buf_mgr)
			__func__, rc);
		return rc;
	}
	rc = cam_smmu_get_phy_addr_scratch(
				buf_mgr->stats_iommu_hdl,
				CAM_SMMU_MAP_RW,
				&scratch_buf_addr,
				buf_mgr->scratch_buf_range,
				SZ_4K);
	if (rc) {
		pr_err("%s: failed to map scratch buffer to stats iommu: %d\n",
			__func__, rc);
		cam_smmu_put_phy_addr_scratch(buf_mgr->img_iommu_hdl,
				buf_mgr->scratch_buf_addr);
		return rc;
	}

	if (scratch_buf_addr != buf_mgr->scratch_buf_addr) {
		pr_err("%s: Scratch addr differ: %pa/%pa\n",
		__func__, &scratch_buf_addr, &buf_mgr->scratch_buf_addr);
		rc = -EINVAL;
		msm_isp_buf_put_scratch(buf_mgr);
	}
	return rc;
}

@@ -1138,25 +1100,18 @@ int msm_isp_smmu_attach(struct msm_isp_buf_mgr *buf_mgr,
		 * non-secure mode
		 */
		if (buf_mgr->attach_ref_cnt == 0) {
			rc = cam_smmu_ops(buf_mgr->img_iommu_hdl,
			rc = cam_smmu_ops(buf_mgr->iommu_hdl,
				CAM_SMMU_ATTACH);
			if (rc < 0) {
				pr_err("%s: img smmu attach error, rc :%d\n",
					__func__, rc);
			goto err1;
			}
			rc = cam_smmu_ops(buf_mgr->stats_iommu_hdl,
				CAM_SMMU_ATTACH);
			if (rc < 0) {
				pr_err("%s: stats smmu attach error, rc :%d\n",
					__func__, rc);
				goto err2;
			}
		}
		buf_mgr->attach_ref_cnt++;
		rc = msm_isp_buf_get_scratch(buf_mgr);
		if (rc)
			goto err3;
			goto err2;
	} else {
		if (buf_mgr->attach_ref_cnt > 0)
			buf_mgr->attach_ref_cnt--;
@@ -1166,9 +1121,7 @@ int msm_isp_smmu_attach(struct msm_isp_buf_mgr *buf_mgr,

		if (buf_mgr->attach_ref_cnt == 0) {
			rc = msm_isp_buf_put_scratch(buf_mgr);
			rc |= cam_smmu_ops(buf_mgr->img_iommu_hdl,
				CAM_SMMU_DETACH);
			rc |= cam_smmu_ops(buf_mgr->stats_iommu_hdl,
			rc |= cam_smmu_ops(buf_mgr->iommu_hdl,
				CAM_SMMU_DETACH);
			if (rc < 0) {
				pr_err("%s: img/stats smmu detach error, rc :%d\n",
@@ -1180,11 +1133,8 @@ int msm_isp_smmu_attach(struct msm_isp_buf_mgr *buf_mgr,
	mutex_unlock(&buf_mgr->lock);
	return rc;

err3:
	if (cam_smmu_ops(buf_mgr->stats_iommu_hdl, CAM_SMMU_DETACH))
		pr_err("%s: stats iommu detach fail\n", __func__);
err2:
	if (cam_smmu_ops(buf_mgr->img_iommu_hdl, CAM_SMMU_DETACH))
	if (cam_smmu_ops(buf_mgr->iommu_hdl, CAM_SMMU_DETACH))
		pr_err("%s: img smmu detach error\n", __func__);
err1:
	mutex_unlock(&buf_mgr->lock);
@@ -1209,15 +1159,10 @@ static int msm_isp_init_isp_buf_mgr(struct msm_isp_buf_mgr *buf_mgr,
	buf_mgr->num_buf_q = BUF_MGR_NUM_BUF_Q;
	memset(buf_mgr->bufq, 0, sizeof(buf_mgr->bufq));

	rc = cam_smmu_get_handle("vfe_image", &buf_mgr->img_iommu_hdl);
	if (rc < 0) {
		pr_err("vfe get image handle failed\n");
		goto get_handle_error1;
	}
	rc = cam_smmu_get_handle("vfe_stats", &buf_mgr->stats_iommu_hdl);
	rc = cam_smmu_get_handle("vfe", &buf_mgr->iommu_hdl);
	if (rc < 0) {
		pr_err("vfe get stats handle failed\n");
		goto get_handle_error2;
		pr_err("vfe get handle failed\n");
		goto get_handle_error;
	}

	for (i = 0; i < BUF_MGR_NUM_BUF_Q; i++)
@@ -1229,9 +1174,7 @@ static int msm_isp_init_isp_buf_mgr(struct msm_isp_buf_mgr *buf_mgr,
	mutex_unlock(&buf_mgr->lock);
	return 0;

get_handle_error2:
	cam_smmu_destroy_handle(buf_mgr->img_iommu_hdl);
get_handle_error1:
get_handle_error:
	mutex_unlock(&buf_mgr->lock);
	return rc;
}
@@ -1252,10 +1195,8 @@ static int msm_isp_deinit_isp_buf_mgr(
	buf_mgr->pagefault_debug_disable = 0;

	msm_isp_buf_put_scratch(buf_mgr);
	cam_smmu_ops(buf_mgr->img_iommu_hdl, CAM_SMMU_DETACH);
	cam_smmu_ops(buf_mgr->stats_iommu_hdl, CAM_SMMU_DETACH);
	cam_smmu_destroy_handle(buf_mgr->img_iommu_hdl);
	cam_smmu_destroy_handle(buf_mgr->stats_iommu_hdl);
	cam_smmu_ops(buf_mgr->iommu_hdl, CAM_SMMU_DETACH);
	cam_smmu_destroy_handle(buf_mgr->iommu_hdl);

	buf_mgr->attach_ref_cnt = 0;
	mutex_unlock(&buf_mgr->lock);
+1 −2
Original line number Diff line number Diff line
@@ -176,8 +176,7 @@ struct msm_isp_buf_mgr {
	struct msm_sd_req_vb2_q *vb2_ops;

	/*IOMMU driver*/
	int img_iommu_hdl;
	int stats_iommu_hdl;
	int iommu_hdl;

	/*Add secure mode*/
	int secure_enable;
+2 −8
Original line number Diff line number Diff line
@@ -2145,10 +2145,7 @@ int msm_isp_open_node(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
	/* Register page fault handler */
	vfe_dev->buf_mgr->pagefault_debug_disable = 0;
	cam_smmu_reg_client_page_fault_handler(
			vfe_dev->buf_mgr->img_iommu_hdl,
			msm_vfe_iommu_fault_handler, vfe_dev);
	cam_smmu_reg_client_page_fault_handler(
			vfe_dev->buf_mgr->stats_iommu_hdl,
			vfe_dev->buf_mgr->iommu_hdl,
			msm_vfe_iommu_fault_handler, vfe_dev);
	mutex_unlock(&vfe_dev->core_mutex);
	mutex_unlock(&vfe_dev->realtime_mutex);
@@ -2192,10 +2189,7 @@ int msm_isp_close_node(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
	}
	/* Unregister page fault handler */
	cam_smmu_reg_client_page_fault_handler(
		vfe_dev->buf_mgr->img_iommu_hdl,
		NULL, vfe_dev);
	cam_smmu_reg_client_page_fault_handler(
		vfe_dev->buf_mgr->stats_iommu_hdl,
		vfe_dev->buf_mgr->iommu_hdl,
		NULL, vfe_dev);

	rc = vfe_dev->hw_info->vfe_ops.axi_ops.halt(vfe_dev, 1);