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

Commit 00f144b2 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: mdss: Cleanup iommu ref count implementation"

parents fdd66d86 e2b33dfb
Loading
Loading
Loading
Loading
+1 −5
Original line number Diff line number Diff line
@@ -2908,11 +2908,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
@@ -962,15 +962,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));
@@ -987,13 +987,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;
}

@@ -1010,12 +1006,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;
}
@@ -1169,7 +1160,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;

@@ -1204,17 +1195,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);
		}
	}

@@ -1836,6 +1823,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;
@@ -1904,10 +1898,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;