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

Commit 8d7423e3 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: Disable secure session after Flush for video mode panels"

parents ba87e6c3 7f07fcf3
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -164,6 +164,14 @@ enum mdss_mdp_mixer_mux {
	MDSS_MDP_MIXER_MUX_RIGHT,
};

enum mdss_secure_transition {
	SECURE_TRANSITION_NONE,
	SD_NON_SECURE_TO_SECURE,
	SD_SECURE_TO_NON_SECURE,
	SC_NON_SECURE_TO_SECURE,
	SC_SECURE_TO_NON_SECURE,
};

static inline enum mdss_mdp_sspp_index get_pipe_num_from_ndx(u32 ndx)
{
	u32 id;
@@ -953,6 +961,8 @@ struct mdss_overlay_private {
	struct kthread_worker worker;
	struct kthread_work vsync_work;
	struct task_struct *thread;

	u8 secure_transition_state;
};

struct mdss_mdp_set_ot_params {
+69 −24
Original line number Diff line number Diff line
@@ -2322,14 +2322,12 @@ set_roi:
}

/*
 * Enables/disable secure (display or camera) sessions
 * Check if there is any change in secure state and store it.
 */
static int __overlay_secure_ctrl(struct msm_fb_data_type *mfd)
static void __overlay_set_secure_transition_state(struct msm_fb_data_type *mfd)
{
	struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
	struct mdss_mdp_ctl *ctl = mfd_to_ctl(mfd);
	struct mdss_mdp_pipe *pipe;
	int ret = 0;
	int sd_in_pipe = 0;
	int sc_in_pipe = 0;
	u64 pipes_flags = 0;
@@ -2353,8 +2351,11 @@ static int __overlay_secure_ctrl(struct msm_fb_data_type *mfd)
			mdp5_data->sd_enabled, sd_in_pipe,
			mdp5_data->sc_enabled, sc_in_pipe, pipes_flags);

	/* Reset the secure transition state */
	mdp5_data->secure_transition_state = SECURE_TRANSITION_NONE;

	/*
	* Return early in only two conditions:
	 * Secure transition would be NONE in two conditions:
	 * 1. All the features are already disabled and state remains
	 *    disabled for the pipes.
	 * 2. One of the features is already enabled and state remains
@@ -2362,13 +2363,38 @@ static int __overlay_secure_ctrl(struct msm_fb_data_type *mfd)
	 */
	if (!sd_in_pipe && !mdp5_data->sd_enabled &&
			!sc_in_pipe && !mdp5_data->sc_enabled)
		return ret;
		return;
	else if ((sd_in_pipe && mdp5_data->sd_enabled) ||
			(sc_in_pipe && mdp5_data->sc_enabled))
		return;

	/* Secure Display */
	if (!mdp5_data->sd_enabled && sd_in_pipe)
		mdp5_data->secure_transition_state |= SD_NON_SECURE_TO_SECURE;
	else if (mdp5_data->sd_enabled && !sd_in_pipe)
		mdp5_data->secure_transition_state |= SD_SECURE_TO_NON_SECURE;

	/* Secure Camera */
	if (!mdp5_data->sc_enabled && sc_in_pipe)
		mdp5_data->secure_transition_state |= SC_NON_SECURE_TO_SECURE;
	else if (mdp5_data->sc_enabled && !sc_in_pipe)
		mdp5_data->secure_transition_state |= SC_SECURE_TO_NON_SECURE;
}

/*
 * Enable/disable secure (display or camera) sessions
 */
static int __overlay_secure_ctrl(struct msm_fb_data_type *mfd)
{
	struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
	struct mdss_mdp_ctl *ctl = mfd_to_ctl(mfd);
	int ret = 0;

	if (mdp5_data->secure_transition_state == SECURE_TRANSITION_NONE)
		return ret;

	/* Secure Display */
	if (!mdp5_data->sd_enabled && sd_in_pipe) {
	if (mdp5_data->secure_transition_state == SD_NON_SECURE_TO_SECURE) {
		if (!mdss_get_sd_client_cnt()) {
			MDSS_XLOG(0x11);
			/*wait for ping pong done */
@@ -2390,7 +2416,8 @@ static int __overlay_secure_ctrl(struct msm_fb_data_type *mfd)
		}
		mdp5_data->sd_enabled = 1;
		mdss_update_sd_client(mdp5_data->mdata, true);
	} else if (mdp5_data->sd_enabled && !sd_in_pipe) {
	} else if (mdp5_data->secure_transition_state ==
			SD_SECURE_TO_NON_SECURE) {
		/* disable the secure display on last client */
		if (mdss_get_sd_client_cnt() == 1) {
			MDSS_XLOG(0x22);
@@ -2408,11 +2435,9 @@ static int __overlay_secure_ctrl(struct msm_fb_data_type *mfd)
	}

	/* Secure Camera */
	if (!mdp5_data->sc_enabled && sc_in_pipe) {
	if (mdp5_data->secure_transition_state == SC_NON_SECURE_TO_SECURE) {
		if (!mdss_get_sc_client_cnt()) {
			MDSS_XLOG(0x33);
			if (ctl->ops.wait_pingpong)
				mdss_mdp_display_wait4pingpong(ctl, true);
			ret = mdss_mdp_secure_session_ctrl(1,
					MDP_SECURE_CAMERA_OVERLAY_SESSION);
			if (ret) {
@@ -2422,7 +2447,8 @@ static int __overlay_secure_ctrl(struct msm_fb_data_type *mfd)
		}
		mdp5_data->sc_enabled = 1;
		mdss_update_sc_client(mdp5_data->mdata, true);
	} else if (mdp5_data->sc_enabled && !sc_in_pipe) {
	} else if (mdp5_data->secure_transition_state ==
			SC_SECURE_TO_NON_SECURE) {
		/* disable the secure camera on last client */
		if (mdss_get_sc_client_cnt() == 1) {
			MDSS_XLOG(0x44);
@@ -2501,16 +2527,24 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd,
		list_move(&pipe->list, &mdp5_data->pipes_destroy);
	}

	__overlay_set_secure_transition_state(mfd);
	/*
	 * go to secure state if required, this should be done
	 * after moving the buffers from the previous commit to
	 * destroy list
	 * destroy list.
	 * For video mode panels, secure display/camera should be disabled
	 * after flushing the new buffer. Skip secure disable here for those
	 * cases.
	 */
	if (!((mfd->panel_info->type == MIPI_VIDEO_PANEL) &&
	    ((mdp5_data->secure_transition_state == SD_SECURE_TO_NON_SECURE) ||
	    (mdp5_data->secure_transition_state == SC_SECURE_TO_NON_SECURE)))) {
		ret = __overlay_secure_ctrl(mfd);
		if (IS_ERR_VALUE(ret)) {
			pr_err("secure operation failed %d\n", ret);
			goto commit_fail;
		}
	}

	/* call this function before any registers programming */
	if (ctl->ops.pre_programming)
@@ -2581,6 +2615,17 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd,

	mutex_lock(&mdp5_data->ov_lock);

	/* Disable secure display/camera for video mode panels */
	if ((mfd->panel_info->type == MIPI_VIDEO_PANEL) &&
	    ((mdp5_data->secure_transition_state == SD_SECURE_TO_NON_SECURE) ||
	    (mdp5_data->secure_transition_state == SC_SECURE_TO_NON_SECURE))) {
		ret = __overlay_secure_ctrl(mfd);
		if (IS_ERR_VALUE(ret)) {
			pr_err("secure operation failed %d\n", ret);
			goto commit_fail;
		}
	}

	mdss_fb_update_notify_update(mfd);
commit_fail:
	ATRACE_BEGIN("overlay_cleanup");