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

Commit ea2b113b authored by Abhijit Kulkarni's avatar Abhijit Kulkarni
Browse files

msm: sde: fix calculating the mapped buffer size



This change calculates the total size of the mapped buffer by
traversing the scatter gather list and adds the size of each
element to get the size. This change is required with the new
version of iommu driver.

Change-Id: I19982615908a1cc85162cd5cc0a1af66f8aae106
Signed-off-by: default avatarAbhijit Kulkarni <kabhijit@codeaurora.org>
parent b2bdf7dc
Loading
Loading
Loading
Loading
+16 −28
Original line number Original line Diff line number Diff line
@@ -890,6 +890,7 @@ static int sde_mdp_map_buffer(struct sde_mdp_img_data *data, bool rotator,
{
{
	int ret = -EINVAL;
	int ret = -EINVAL;
	struct scatterlist *sg;
	struct scatterlist *sg;
	struct sg_table *sgt = NULL;
	unsigned int i;
	unsigned int i;
	unsigned long flags = 0;
	unsigned long flags = 0;


@@ -925,19 +926,23 @@ static int sde_mdp_map_buffer(struct sde_mdp_img_data *data, bool rotator,
			}
			}
		}
		}


		if (sde_mdp_is_map_needed(data)) {
		sgt = dma_buf_map_attachment(
			data->srcp_table =
				data->srcp_attachment, dir);
				dma_buf_map_attachment(data->srcp_attachment,
		if (IS_ERR_OR_NULL(sgt) ||
						dir);
				IS_ERR_OR_NULL(sgt->sgl)) {
			if (IS_ERR_OR_NULL(data->srcp_table) ||
			SDEROT_ERR("Failed to map attachment\n");
					IS_ERR_OR_NULL(data->srcp_table->sgl)) {
			ret = PTR_ERR(sgt);
				SDEROT_ERR("%d Failed to map attachment\n",
						__LINE__);
				ret = PTR_ERR(data->srcp_table);
			goto err_detach;
			goto err_detach;
		}
		}
		data->srcp_table = sgt;

		data->len = 0;
		for_each_sg(sgt->sgl, sg, sgt->nents, i) {
			data->len += sg->length;
		}

		if (sde_mdp_is_map_needed(data)) {
			data->addr = data->srcp_table->sgl->dma_address;
			data->addr = data->srcp_table->sgl->dma_address;
			data->len = data->srcp_table->sgl->dma_length;
			SDEROT_DBG("map %pad/%lx f:%x\n",
			SDEROT_DBG("map %pad/%lx f:%x\n",
					&data->addr,
					&data->addr,
					data->len,
					data->len,
@@ -945,19 +950,6 @@ static int sde_mdp_map_buffer(struct sde_mdp_img_data *data, bool rotator,
			data->mapped = true;
			data->mapped = true;
			ret = 0;
			ret = 0;
		} else {
		} else {
			struct sg_table *sgt = NULL;

			data->srcp_table = dma_buf_map_attachment(
					data->srcp_attachment, dir);
			if (IS_ERR_OR_NULL(data->srcp_table) ||
					IS_ERR_OR_NULL(data->srcp_table->sgl)) {
				SDEROT_ERR(
					"Failed to map attachment for secure camera\n");
				ret = PTR_ERR(data->srcp_table);
				goto err_detach;
			}
			sgt = data->srcp_table;

			if (sgt->nents != 1) {
			if (sgt->nents != 1) {
				SDEROT_ERR(
				SDEROT_ERR(
					"Fail ion buffer mapping for secure camera\n");
					"Fail ion buffer mapping for secure camera\n");
@@ -975,10 +967,6 @@ static int sde_mdp_map_buffer(struct sde_mdp_img_data *data, bool rotator,
			}
			}


			data->addr = sg_phys(data->srcp_table->sgl);
			data->addr = sg_phys(data->srcp_table->sgl);
			data->len = 0;
			for_each_sg(sgt->sgl, sg, sgt->nents, i) {
				data->len += sg->length;
			}
			ret = 0;
			ret = 0;
		}
		}
	}
	}