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

Commit 2c8327e5 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: Add separate function for mapping"

parents 57acfb57 2d02df76
Loading
Loading
Loading
Loading
+78 −38
Original line number Diff line number Diff line
@@ -163,6 +163,18 @@ void mdss_spi_panel_bl_ctrl_update(struct mdss_panel_data *pdata, u32 bl_level)
}
#endif

static int mdp3_get_domain(u32 flags)
{
	int domain;

	if (flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION)
		domain =  MDSS_IOMMU_DOMAIN_SECURE;
	else
		domain = MDSS_IOMMU_DOMAIN_UNSECURE;

	return domain;
}

static irqreturn_t mdp3_irq_handler(int irq, void *ptr)
{
	int i = 0;
@@ -1829,7 +1841,7 @@ out:
int mdp3_put_img(struct mdp3_img_data *data, int client)
{
	struct ion_client *iclient = mdp3_res->ion_client;
	int dom = (mdp3_res->domains + MDP3_IOMMU_DOMAIN_UNSECURE)->domain_idx;
	int dom = mdp3_get_domain(data->flags);
	int dir = DMA_BIDIRECTIONAL;

	if (data->flags & MDP_MEMORY_ID_TYPE_FB) {
@@ -1837,8 +1849,9 @@ int mdp3_put_img(struct mdp3_img_data *data, int client)
		fdput(data->srcp_f);
		memset(&data->srcp_f, 0, sizeof(struct fd));
	} else if (!IS_ERR_OR_NULL(data->srcp_dma_buf)) {
		pr_debug("ion hdl = %pK buf=0x%pa\n", data->srcp_dma_buf,
							&data->addr);
		pr_debug("ion hdl = %pK buf=0x%pa domain = %d\n",
			data->srcp_dma_buf, &data->addr, dom);

		if (!iclient) {
			pr_err("invalid ion client\n");
			return -ENOMEM;
@@ -1876,15 +1889,69 @@ int mdp3_put_img(struct mdp3_img_data *data, int client)
	return 0;
}

int mdp3_map_layer(struct mdp3_img_data *data, int client)
{
	int ret = 0;
	int dom = mdp3_get_domain(data->flags);

	if (client == MDP3_CLIENT_PPP || client == MDP3_CLIENT_DMA_P) {
		ret = mdss_smmu_map_dma_buf(data->srcp_dma_buf,
			data->tab_clone, dom,
			&data->addr, &data->len,
			DMA_BIDIRECTIONAL);
	} else {
		ret = mdss_smmu_map_dma_buf(data->srcp_dma_buf,
			data->srcp_table, dom, &data->addr,
			&data->len, DMA_BIDIRECTIONAL);
	}

	if (IS_ERR_VALUE(ret)) {
		pr_err("smmu map dma buf failed: (%d)\n", ret);
		goto err_unmap;
	}

	data->mapped = true;

	if (client ==  MDP3_CLIENT_PPP || client == MDP3_CLIENT_DMA_P) {
		data->addr  += data->tab_clone->sgl->length;
		data->len   -= data->tab_clone->sgl->length;
	}

	if (!ret && (data->offset < data->len)) {
		data->addr += data->offset;
		data->len -= data->offset;
		pr_debug("ihdl=%pK buf=0x%pa len=0x%lx domain = %d\n",
			data->srcp_dma_buf, &data->addr, data->len, dom);
	} else {
		mdp3_put_img(data, client);
		return -EINVAL;
	}

	return ret;

err_unmap:
	dma_buf_unmap_attachment(data->srcp_attachment, data->srcp_table,
			mdss_smmu_dma_data_direction(DMA_BIDIRECTIONAL));
	dma_buf_detach(data->srcp_dma_buf, data->srcp_attachment);
	dma_buf_put(data->srcp_dma_buf);

	if (client ==  MDP3_CLIENT_PPP || client == MDP3_CLIENT_DMA_P) {
		vfree(data->tab_clone->sgl);
		kfree(data->tab_clone);
	}
	return ret;
}

int mdp3_get_img(struct msmfb_data *img, struct mdp3_img_data *data, int client)
{
	struct fd f;
	int ret = -EINVAL;
	int ret = 0;
	int fb_num;
	struct ion_client *iclient = mdp3_res->ion_client;
	int dom = (mdp3_res->domains + MDP3_IOMMU_DOMAIN_UNSECURE)->domain_idx;
	int dom = mdp3_get_domain(data->flags);

	data->flags = img->flags;
	data->flags |= img->flags;
	data->offset = img->offset;

	if (img->flags & MDP_MEMORY_ID_TYPE_FB) {
		f = fdget(img->memory_id);
@@ -1956,10 +2023,10 @@ int mdp3_get_img(struct msmfb_data *img, struct mdp3_img_data *data, int client)
						ret = PTR_ERR(data->tab_clone);
					goto clone_err;
				}
				ret = mdss_smmu_map_dma_buf(data->srcp_dma_buf,
					data->tab_clone, dom,
					&data->addr, &data->len,
					DMA_BIDIRECTIONAL);
				data->mapped = false;
				data->skip_detach = false;
				return ret;

			} else if (client == MDP3_CLIENT_SPI) {
					void *vaddr;

@@ -1979,25 +2046,10 @@ int mdp3_get_img(struct msmfb_data *img, struct mdp3_img_data *data, int client)
					data->addr = (dma_addr_t) vaddr;
					data->len -= img->offset;
					return 0;
			} else {
				ret = mdss_smmu_map_dma_buf(data->srcp_dma_buf,
					data->srcp_table, dom, &data->addr,
					&data->len, DMA_BIDIRECTIONAL);
			}

			if (IS_ERR_VALUE(ret)) {
				pr_err("smmu map dma buf failed: (%d)\n", ret);
				goto err_unmap;
		}

		data->mapped = true;
		data->skip_detach = false;
	}
done:
	if (client ==  MDP3_CLIENT_PPP || client == MDP3_CLIENT_DMA_P) {
		data->addr  += data->tab_clone->sgl->length;
		data->len   -= data->tab_clone->sgl->length;
	}
	if (!ret && (img->offset < data->len)) {
		data->addr += img->offset;
		data->len -= img->offset;
@@ -2020,18 +2072,6 @@ err_detach:
err_put:
	dma_buf_put(data->srcp_dma_buf);
	return ret;
err_unmap:
	dma_buf_unmap_attachment(data->srcp_attachment, data->srcp_table,
			mdss_smmu_dma_data_direction(DMA_BIDIRECTIONAL));
	dma_buf_detach(data->srcp_dma_buf, data->srcp_attachment);
	dma_buf_put(data->srcp_dma_buf);

	if (client ==  MDP3_CLIENT_PPP || client == MDP3_CLIENT_DMA_P) {
		vfree(data->tab_clone->sgl);
		kfree(data->tab_clone);
	}
	return ret;

}

int mdp3_iommu_enable(int client)
+1 −0
Original line number Diff line number Diff line
@@ -257,6 +257,7 @@ int mdp3_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota);
int mdp3_put_img(struct mdp3_img_data *data, int client);
int mdp3_get_img(struct msmfb_data *img, struct mdp3_img_data *data,
		int client);
int mdp3_map_layer(struct mdp3_img_data *data, int client);
int mdp3_iommu_enable(int client);
int mdp3_iommu_disable(int client);
int mdp3_iommu_is_attached(void);