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

Commit e2b33dfb authored by Jayant Shekhar's avatar Jayant Shekhar
Browse files

msm: mdss: Cleanup iommu ref count implementation



With current iommu ref count implementation, iommu is
attached at points when only needed and detached once
finished. Iommu reference count in overlay pan display
path is currently missing hence add it. Also remove
code repetitions and unnecessary error checks while
decreasing iommu ref counts in overlay and writeback
path.

Change-Id: If1aed768e5d704dd6c9d4bfd17c1ec368c8d8711
Signed-off-by: default avatarJayant Shekhar <jshekhar@codeaurora.org>
parent e9b6c820
Loading
Loading
Loading
Loading
+1 −5
Original line number Diff line number Diff line
@@ -2834,11 +2834,7 @@ int mdss_mdp_footswitch_ctrl_idle_pc(int on, struct device *dev)
			return rc;
		}
		mdss_hw_init(mdata);
		rc = mdss_iommu_ctrl(0);
		if (IS_ERR_VALUE(rc)) {
			pr_err("iommu dettach failed ret=%d\n", rc);
			return rc;
		}
		mdss_iommu_ctrl(0);
		mdata->idle_pc = false;
	} else {
		mdata->idle_pc = true;
+4 −12
Original line number Diff line number Diff line
@@ -200,28 +200,20 @@ static inline void mdss_mdp_cmd_clk_on(struct mdss_mdp_cmd_ctx *ctx)
		if (cancel_delayed_work_sync(&ctx->pc_work))
			pr_debug("deleted pending power collapse work\n");

		rc = mdss_iommu_ctrl(1);
		if (IS_ERR_VALUE(rc))
			pr_err("IOMMU attach failed\n");

		if (ctx->idle_pc) {
			mdss_mdp_footswitch_ctrl_idle_pc(1,
				&ctx->ctl->mfd->pdev->dev);
			mdss_mdp_ctl_restore(ctx->ctl);
			rc = mdss_iommu_ctrl(1);
			if (IS_ERR_VALUE(rc)) {
				pr_err("IOMMU attach failed\n");
				mutex_unlock(&ctx->clk_mtx);
				return;
			}
			mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON, false);

			if (mdss_mdp_cmd_tearcheck_setup(ctx->ctl))
				pr_warn("tearcheck setup failed\n");
			ctx->idle_pc = false;
		} else {
			rc = mdss_iommu_ctrl(1);
			if (IS_ERR_VALUE(rc)) {
				pr_err("IOMMU attach failed\n");
				mutex_unlock(&ctx->clk_mtx);
				return;
			}
			mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON, false);
		}

+22 −26
Original line number Diff line number Diff line
@@ -965,15 +965,15 @@ int mdss_mdp_overlay_get_buf(struct msm_fb_data_type *mfd,
					   int num_planes,
					   u32 flags)
{
	int i, rc, ret;
	int i, rc;

	if ((num_planes <= 0) || (num_planes > MAX_PLANES))
		return -EINVAL;

	ret = mdss_iommu_ctrl(1);
	if (IS_ERR_VALUE(ret)) {
	rc = mdss_iommu_ctrl(1);
	if (IS_ERR_VALUE(rc)) {
		pr_err("Iommu attach failed");
		return ret;
		goto end;
	}

	memset(data, 0, sizeof(*data));
@@ -990,13 +990,9 @@ int mdss_mdp_overlay_get_buf(struct msm_fb_data_type *mfd,
		}
	}

	ret = mdss_iommu_ctrl(0);
	if (IS_ERR_VALUE(ret)) {
		pr_err("Iommu dettach failed");
		return ret;
	}

	mdss_iommu_ctrl(0);
	data->num_planes = i;
end:
	return rc;
}

@@ -1013,12 +1009,7 @@ int mdss_mdp_overlay_free_buf(struct mdss_mdp_data *data)
	for (i = 0; i < data->num_planes && data->p[i].len; i++)
		mdss_mdp_put_img(&data->p[i]);

	rc = mdss_iommu_ctrl(0);
	if (IS_ERR_VALUE(rc)) {
		pr_err("Iommu dettach failed");
		return rc;
	}

	mdss_iommu_ctrl(0);
	data->num_planes = 0;
	return 0;
}
@@ -1172,7 +1163,7 @@ void mdss_mdp_handoff_cleanup_pipes(struct msm_fb_data_type *mfd,
 */
int mdss_mdp_overlay_start(struct msm_fb_data_type *mfd)
{
	int rc, ret;
	int rc;
	struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
	struct mdss_mdp_ctl *ctl = mdp5_data->ctl;

@@ -1207,17 +1198,13 @@ int mdss_mdp_overlay_start(struct msm_fb_data_type *mfd)
	 */
	if (!is_mdss_iommu_attached()) {
		if (!mfd->panel_info->cont_splash_enabled) {
			ret = mdss_iommu_ctrl(1);
			if (IS_ERR_VALUE(ret)) {
				pr_err("iommu attach failed ret=%d\n", ret);
				return ret;
			rc = mdss_iommu_ctrl(1);
			if (IS_ERR_VALUE(rc)) {
				pr_err("iommu attach failed rc=%d\n", rc);
				return rc;
			}
			mdss_hw_init(mdss_res);
			ret = mdss_iommu_ctrl(0);
			if (IS_ERR_VALUE(ret)) {
				pr_err("iommu dettach failed ret=%d\n", ret);
				return ret;
			}
			mdss_iommu_ctrl(0);
		}
	}

@@ -1841,6 +1828,13 @@ static void mdss_mdp_overlay_pan_display(struct msm_fb_data_type *mfd)
	}

	mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON, false);

	ret = mdss_iommu_ctrl(1);
	if (IS_ERR_VALUE(ret)) {
		pr_err("IOMMU attach failed\n");
		goto pan_display_error;
	}

	bpp = fbi->var.bits_per_pixel / 8;
	offset = fbi->var.xoffset * bpp +
		 fbi->var.yoffset * fbi->fix.line_length;
@@ -1909,10 +1903,12 @@ static void mdss_mdp_overlay_pan_display(struct msm_fb_data_type *mfd)
	    (fbi->var.activate & FB_ACTIVATE_FORCE))
		mfd->mdp.kickoff_fnc(mfd, NULL);

	mdss_iommu_ctrl(0);
	mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_OFF, false);
	return;

pan_display_error:
	mdss_iommu_ctrl(0);
	mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_OFF, false);
	mutex_unlock(&mdp5_data->ov_lock);
}
+1 −4
Original line number Diff line number Diff line
@@ -155,7 +155,6 @@ static void mdss_mdp_splash_unmap_splash_mem(struct msm_fb_data_type *mfd)
{
	struct iommu_domain *domain;
	struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
	int ret;

	if (mfd->splash_info.iommu_dynamic_attached) {
		domain = msm_get_iommu_domain(mdss_get_iommu_domain(
@@ -167,9 +166,7 @@ static void mdss_mdp_splash_unmap_splash_mem(struct msm_fb_data_type *mfd)

		iommu_unmap(domain, mdp5_data->splash_mem_addr,
						mdp5_data->splash_mem_size);
		ret = mdss_iommu_ctrl(0);
		if (IS_ERR_VALUE(ret))
			pr_err("mdss iommu dettach failed\n");
		mdss_iommu_ctrl(0);

		mfd->splash_info.iommu_dynamic_attached = false;
	}
+12 −22
Original line number Diff line number Diff line
@@ -413,7 +413,7 @@ static struct mdss_mdp_wb_data *get_user_node(struct msm_fb_data_type *mfd,
	struct mdss_mdp_wb *wb = mfd_to_wb(mfd);
	struct mdss_mdp_wb_data *node;
	struct mdss_mdp_img_data *buf;
	int ret, rc;
	int ret;

	if (!list_empty(&wb->register_queue)) {
		list_for_each_entry(node, &wb->register_queue, registered_entry)
@@ -437,21 +437,20 @@ static struct mdss_mdp_wb_data *get_user_node(struct msm_fb_data_type *mfd,
	buf = &node->buf_data.p[0];
	if (wb->is_secure)
		buf->flags |= MDP_SECURE_OVERLAY_SESSION;
	rc = mdss_iommu_ctrl(1);
	if (IS_ERR_VALUE(rc)) {

	ret = mdss_iommu_ctrl(1);
	if (IS_ERR_VALUE(ret)) {
		pr_err("IOMMU attach failed\n");
		goto register_fail;
	}
	ret = mdss_mdp_get_img(data, buf);
	rc = mdss_iommu_ctrl(0);
	if (IS_ERR_VALUE(rc)) {
		pr_err("IOMMU dettach failed\n");
		goto register_fail;
	}
	if (IS_ERR_VALUE(ret)) {
		pr_err("error getting buffer info\n");
		mdss_iommu_ctrl(0);
		goto register_fail;
	}
	mdss_iommu_ctrl(0);

	memcpy(&node->buf_info, data, sizeof(*data));

	ret = mdss_mdp_wb_register_node(wb, node);
@@ -728,7 +727,6 @@ int mdss_mdp_wb_ioctl_handler(struct msm_fb_data_type *mfd, u32 cmd,
{
	struct msmfb_data data;
	int ret = -ENOSYS, hint = 0;
	int rc;

	switch (cmd) {
	case MSMFB_WRITEBACK_INIT:
@@ -759,17 +757,13 @@ int mdss_mdp_wb_ioctl_handler(struct msm_fb_data_type *mfd, u32 cmd,
		}
		break;
	case MSMFB_WRITEBACK_TERMINATE:
		rc = mdss_iommu_ctrl(1);
		if (IS_ERR_VALUE(rc)) {
		ret = mdss_iommu_ctrl(1);
		if (IS_ERR_VALUE(ret)) {
			pr_err("IOMMU attach failed\n");
			return rc;
			return ret;
		}
		ret = mdss_mdp_wb_terminate(mfd);
		rc = mdss_iommu_ctrl(0);
		if (IS_ERR_VALUE(rc)) {
			pr_err("IOMMU dettach failed\n");
			return rc;
		}
		mdss_iommu_ctrl(0);
		break;
	case MSMFB_WRITEBACK_SET_MIRRORING_HINT:
		if (!copy_from_user(&hint, arg, sizeof(hint))) {
@@ -899,11 +893,7 @@ int msm_fb_writeback_iommu_ref(struct fb_info *info, int enable)
			return ret;
		}
	} else {
		ret = mdss_iommu_ctrl(0);
		if (IS_ERR_VALUE(ret)) {
			pr_err("IOMMU dettach failed\n");
			return ret;
		}
		mdss_iommu_ctrl(0);
	}

	return 0;