Merge "msm: mdss: Disable secure session after Flush for video mode panels"
This commit is contained in:
commit
8d7423e396
2 changed files with 79 additions and 24 deletions
|
@ -164,6 +164,14 @@ enum mdss_mdp_mixer_mux {
|
||||||
MDSS_MDP_MIXER_MUX_RIGHT,
|
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)
|
static inline enum mdss_mdp_sspp_index get_pipe_num_from_ndx(u32 ndx)
|
||||||
{
|
{
|
||||||
u32 id;
|
u32 id;
|
||||||
|
@ -953,6 +961,8 @@ struct mdss_overlay_private {
|
||||||
struct kthread_worker worker;
|
struct kthread_worker worker;
|
||||||
struct kthread_work vsync_work;
|
struct kthread_work vsync_work;
|
||||||
struct task_struct *thread;
|
struct task_struct *thread;
|
||||||
|
|
||||||
|
u8 secure_transition_state;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mdss_mdp_set_ot_params {
|
struct mdss_mdp_set_ot_params {
|
||||||
|
|
|
@ -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_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
|
||||||
struct mdss_mdp_ctl *ctl = mfd_to_ctl(mfd);
|
|
||||||
struct mdss_mdp_pipe *pipe;
|
struct mdss_mdp_pipe *pipe;
|
||||||
int ret = 0;
|
|
||||||
int sd_in_pipe = 0;
|
int sd_in_pipe = 0;
|
||||||
int sc_in_pipe = 0;
|
int sc_in_pipe = 0;
|
||||||
u64 pipes_flags = 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->sd_enabled, sd_in_pipe,
|
||||||
mdp5_data->sc_enabled, sc_in_pipe, pipes_flags);
|
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
|
* 1. All the features are already disabled and state remains
|
||||||
* disabled for the pipes.
|
* disabled for the pipes.
|
||||||
* 2. One of the features is already enabled and state remains
|
* 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 &&
|
if (!sd_in_pipe && !mdp5_data->sd_enabled &&
|
||||||
!sc_in_pipe && !mdp5_data->sc_enabled)
|
!sc_in_pipe && !mdp5_data->sc_enabled)
|
||||||
return ret;
|
return;
|
||||||
else if ((sd_in_pipe && mdp5_data->sd_enabled) ||
|
else if ((sd_in_pipe && mdp5_data->sd_enabled) ||
|
||||||
(sc_in_pipe && mdp5_data->sc_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;
|
return ret;
|
||||||
|
|
||||||
/* Secure Display */
|
/* 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()) {
|
if (!mdss_get_sd_client_cnt()) {
|
||||||
MDSS_XLOG(0x11);
|
MDSS_XLOG(0x11);
|
||||||
/*wait for ping pong done */
|
/*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;
|
mdp5_data->sd_enabled = 1;
|
||||||
mdss_update_sd_client(mdp5_data->mdata, true);
|
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 */
|
/* disable the secure display on last client */
|
||||||
if (mdss_get_sd_client_cnt() == 1) {
|
if (mdss_get_sd_client_cnt() == 1) {
|
||||||
MDSS_XLOG(0x22);
|
MDSS_XLOG(0x22);
|
||||||
|
@ -2408,11 +2435,9 @@ static int __overlay_secure_ctrl(struct msm_fb_data_type *mfd)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Secure Camera */
|
/* 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()) {
|
if (!mdss_get_sc_client_cnt()) {
|
||||||
MDSS_XLOG(0x33);
|
MDSS_XLOG(0x33);
|
||||||
if (ctl->ops.wait_pingpong)
|
|
||||||
mdss_mdp_display_wait4pingpong(ctl, true);
|
|
||||||
ret = mdss_mdp_secure_session_ctrl(1,
|
ret = mdss_mdp_secure_session_ctrl(1,
|
||||||
MDP_SECURE_CAMERA_OVERLAY_SESSION);
|
MDP_SECURE_CAMERA_OVERLAY_SESSION);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -2422,7 +2447,8 @@ static int __overlay_secure_ctrl(struct msm_fb_data_type *mfd)
|
||||||
}
|
}
|
||||||
mdp5_data->sc_enabled = 1;
|
mdp5_data->sc_enabled = 1;
|
||||||
mdss_update_sc_client(mdp5_data->mdata, true);
|
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 */
|
/* disable the secure camera on last client */
|
||||||
if (mdss_get_sc_client_cnt() == 1) {
|
if (mdss_get_sc_client_cnt() == 1) {
|
||||||
MDSS_XLOG(0x44);
|
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);
|
list_move(&pipe->list, &mdp5_data->pipes_destroy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__overlay_set_secure_transition_state(mfd);
|
||||||
/*
|
/*
|
||||||
* go to secure state if required, this should be done
|
* go to secure state if required, this should be done
|
||||||
* after moving the buffers from the previous commit to
|
* 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);
|
ret = __overlay_secure_ctrl(mfd);
|
||||||
if (IS_ERR_VALUE(ret)) {
|
if (IS_ERR_VALUE(ret)) {
|
||||||
pr_err("secure operation failed %d\n", ret);
|
pr_err("secure operation failed %d\n", ret);
|
||||||
goto commit_fail;
|
goto commit_fail;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* call this function before any registers programming */
|
/* call this function before any registers programming */
|
||||||
if (ctl->ops.pre_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);
|
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);
|
mdss_fb_update_notify_update(mfd);
|
||||||
commit_fail:
|
commit_fail:
|
||||||
ATRACE_BEGIN("overlay_cleanup");
|
ATRACE_BEGIN("overlay_cleanup");
|
||||||
|
|
Loading…
Add table
Reference in a new issue