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

Commit b84fa971 authored by Kalyan Thota's avatar Kalyan Thota
Browse files

msm: mdss: add support for secure display on msm8953.



On msm8953 SMMU map is necessary for secure display add
support for the same.

Change-Id: I7c49584c90c1b3c4792dccbc08e4d87c9c7974ef
Signed-off-by: default avatarKalyan Thota <kalyant@codeaurora.org>
parent d3068532
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -161,6 +161,7 @@ enum mdss_hw_quirk {
	MDSS_QUIRK_DMA_BI_DIR,
	MDSS_QUIRK_MIN_BUS_VOTE,
	MDSS_QUIRK_FMT_PACK_PATTERN,
	MDSS_QUIRK_NEED_SECURE_MAP,
	MDSS_QUIRK_MAX,
};

+7 −1
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@
#define RES_UHD			(3840*2160)

struct mdss_data_type *mdss_res;
static u32 mem_protect_sd_ctrl_id;

static int mdss_fb_mem_get_iommu_domain(void)
{
@@ -1403,6 +1404,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata)
	/* clock gating feature is enabled by default */
	mdata->enable_gate = true;
	mdata->pixel_ram_size = 0;
	mem_protect_sd_ctrl_id = MEM_PROTECT_SD_CTRL_FLAT;

	mdss_mdp_hw_rev_debug_caps_init(mdata);

@@ -1472,6 +1474,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata)
		mdata->pixel_ram_size = 40 * 1024;
		mdata->apply_post_scale_bytes = false;
		mdata->hflip_buffer_reused = false;
		mem_protect_sd_ctrl_id = MEM_PROTECT_SD_CTRL;
		set_bit(MDSS_QOS_OVERHEAD_FACTOR, mdata->mdss_qos_map);
		set_bit(MDSS_QOS_CDP, mdata->mdss_qos_map);
		set_bit(MDSS_QOS_PER_PIPE_LUT, mdata->mdss_qos_map);
@@ -1481,6 +1484,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata)
		set_bit(MDSS_QOS_OTLIM, mdata->mdss_qos_map);
		mdss_set_quirk(mdata, MDSS_QUIRK_DMA_BI_DIR);
		mdss_set_quirk(mdata, MDSS_QUIRK_MIN_BUS_VOTE);
		mdss_set_quirk(mdata, MDSS_QUIRK_NEED_SECURE_MAP);
		break;
	case MDSS_MDP_HW_REV_115:
		mdata->max_target_zorder = 4; /* excluding base layer */
@@ -1492,6 +1496,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata)
		mdata->hflip_buffer_reused = false;
		/* disable ECG for 28nm PHY platform */
		mdata->enable_gate = false;
		mem_protect_sd_ctrl_id = MEM_PROTECT_SD_CTRL;
		set_bit(MDSS_QOS_CDP, mdata->mdss_qos_map);
		set_bit(MDSS_QOS_PER_PIPE_LUT, mdata->mdss_qos_map);
		set_bit(MDSS_QOS_SIMPLIFIED_PREFILL, mdata->mdss_qos_map);
@@ -1501,6 +1506,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata)
		set_bit(MDSS_QOS_OTLIM, mdata->mdss_qos_map);
		mdss_set_quirk(mdata, MDSS_QUIRK_DMA_BI_DIR);
		mdss_set_quirk(mdata, MDSS_QUIRK_MIN_BUS_VOTE);
		mdss_set_quirk(mdata, MDSS_QUIRK_NEED_SECURE_MAP);
		break;
	case MDSS_MDP_HW_REV_300:
	case MDSS_MDP_HW_REV_301:
@@ -4501,7 +4507,7 @@ int mdss_mdp_secure_display_ctrl(unsigned int enable)
			&request, sizeof(request), &resp, sizeof(resp));
	} else {
		ret = scm_call2(SCM_SIP_FNID(SCM_SVC_MP,
				MEM_PROTECT_SD_CTRL_FLAT), &desc);
				mem_protect_sd_ctrl_id), &desc);
		resp = desc.ret[0];
	}

+14 −0
Original line number Diff line number Diff line
@@ -1297,6 +1297,20 @@ static inline bool mdss_mdp_is_lineptr_supported(struct mdss_mdp_ctl *ctl)
			&& (pinfo->te.tear_check_en)) ? true : false);
}

static inline bool mdss_mdp_is_map_needed(struct mdss_data_type *mdata,
						struct mdss_mdp_img_data *data)
{
	u32 is_secure_ui = data->flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION;

     /*
      * For ULT Targets we need SMMU Map, to issue map call for secure Display.
      */
	if (is_secure_ui && !mdss_has_quirk(mdata, MDSS_QUIRK_NEED_SECURE_MAP))
		return false;

	return true;
}

irqreturn_t mdss_mdp_isr(int irq, void *ptr);
void mdss_mdp_irq_clear(struct mdss_data_type *mdata,
		u32 intr_type, u32 intf_num);
+80 −72
Original line number Diff line number Diff line
@@ -1237,6 +1237,10 @@ static int mdss_mdp_put_img(struct mdss_mdp_img_data *data, bool rotator,
		/*
		 * skip memory unmapping - secure display uses physical
		 * address which does not require buffer unmapping
		 *
		 * For LT targets in secure display usecase, srcp_dma_buf will
		 * be filled due to map call which will be unmapped above.
		 *
		 */
		pr_debug("skip memory unmapping for secure display content\n");
	} else {
@@ -1257,6 +1261,7 @@ static int mdss_mdp_get_img(struct msmfb_data *img,
	u32 domain;
	dma_addr_t *start;
	struct ion_client *iclient = mdss_get_ionclient();
	struct mdss_data_type *mdata = mdss_mdp_get_mdata();

	start = &data->addr;
	len = &data->len;
@@ -1280,8 +1285,8 @@ static int mdss_mdp_get_img(struct msmfb_data *img,
			pr_err("invalid FB_MAJOR\n");
			ret = -1;
		}
	} else if (iclient &&
			!(data->flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION)) {
	} else if (iclient) {
		if (mdss_mdp_is_map_needed(mdata, data)) {
			data->srcp_dma_buf = dma_buf_get(img->memory_id);
			if (IS_ERR(data->srcp_dma_buf)) {
				pr_err("error on ion_import_fd\n");
@@ -1289,11 +1294,12 @@ static int mdss_mdp_get_img(struct msmfb_data *img,
				data->srcp_dma_buf = NULL;
				return ret;
			}
		domain = mdss_smmu_get_domain_type(data->flags, rotator);
			domain = mdss_smmu_get_domain_type(data->flags,
							   rotator);

			data->srcp_attachment =
			mdss_smmu_dma_buf_attach(data->srcp_dma_buf, dev,
					domain);
				mdss_smmu_dma_buf_attach(data->srcp_dma_buf,
							 dev, domain);
			if (IS_ERR(data->srcp_attachment)) {
				ret = PTR_ERR(data->srcp_attachment);
				goto err_put;
@@ -1312,15 +1318,15 @@ static int mdss_mdp_get_img(struct msmfb_data *img,
			data->mapped = false;
			data->skip_detach = false;
			/* return early, mapping will be done later */

		return 0;
	} else if (iclient &&
			(data->flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION)) {
			ret = 0;
			goto done;
		} else {
			struct ion_handle *ihandle = NULL;
			struct sg_table *sg_ptr = NULL;

			do {
			ihandle = ion_import_dma_buf(iclient, img->memory_id);
				ihandle = ion_import_dma_buf(iclient,
							     img->memory_id);
				if (IS_ERR_OR_NULL(ihandle)) {
					ret = -EINVAL;
					pr_err("ion import buffer failed\n");
@@ -1357,7 +1363,7 @@ static int mdss_mdp_get_img(struct msmfb_data *img,
				ion_free(iclient, ihandle);
			return ret;
		}

	}
	if (!*start) {
		pr_err("start address is zero!\n");
		mdss_mdp_put_img(data, rotator, dir);
@@ -1380,6 +1386,7 @@ err_detach:
	dma_buf_detach(data->srcp_dma_buf, data->srcp_attachment);
err_put:
	dma_buf_put(data->srcp_dma_buf);
done:
	return ret;
}

@@ -1388,13 +1395,14 @@ static int mdss_mdp_map_buffer(struct mdss_mdp_img_data *data, bool rotator,
{
	int ret = -EINVAL;
	int domain;
	struct mdss_data_type *mdata = mdss_mdp_get_mdata();

	if (data->addr && data->len)
		return 0;

	if (!IS_ERR_OR_NULL(data->srcp_dma_buf)) {
		if (mdss_res->mdss_util->iommu_attached() &&
			!(data->flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION)) {
			(mdss_mdp_is_map_needed(mdata, data))) {
			domain = mdss_smmu_get_domain_type(data->flags,
					rotator);
			data->dir = dir;