Loading drivers/video/fbdev/msm/mdss_mdp.h +10 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 { Loading drivers/video/fbdev/msm/mdss_mdp_overlay.c +69 −24 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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 */ Loading @@ -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); Loading @@ -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) { Loading @@ -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); Loading Loading @@ -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) Loading Loading @@ -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"); Loading Loading
drivers/video/fbdev/msm/mdss_mdp.h +10 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 { Loading
drivers/video/fbdev/msm/mdss_mdp_overlay.c +69 −24 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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 */ Loading @@ -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); Loading @@ -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) { Loading @@ -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); Loading Loading @@ -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) Loading Loading @@ -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"); Loading