Loading drivers/video/msm/mdss/mdss_mdp.h +2 −2 Original line number Diff line number Diff line Loading @@ -610,7 +610,7 @@ int mdss_mdp_overlay_get_buf(struct msm_fb_data_type *mfd, u32 flags); int mdss_mdp_overlay_pipe_setup(struct msm_fb_data_type *mfd, struct mdp_overlay *req, struct mdss_mdp_pipe **ppipe, struct mdss_mdp_pipe *left_blend_pipe); struct mdss_mdp_pipe *left_blend_pipe, bool is_single_layer); void mdss_mdp_handoff_cleanup_pipes(struct msm_fb_data_type *mfd, u32 type); int mdss_mdp_overlay_release(struct msm_fb_data_type *mfd, int ndx); Loading Loading @@ -646,7 +646,7 @@ int mdss_mdp_perf_bw_check_pipe(struct mdss_mdp_perf_params *perf, struct mdss_mdp_pipe *pipe); int mdss_mdp_perf_calc_pipe(struct mdss_mdp_pipe *pipe, struct mdss_mdp_perf_params *perf, struct mdss_rect *roi, bool apply_fudge); bool apply_fudge, bool is_single_layer); u32 mdss_mdp_get_mdp_clk_rate(struct mdss_data_type *mdata); int mdss_mdp_ctl_notify(struct mdss_mdp_ctl *ctl, int event); void mdss_mdp_ctl_notifier_register(struct mdss_mdp_ctl *ctl, Loading drivers/video/msm/mdss/mdss_mdp_ctl.c +22 −28 Original line number Diff line number Diff line Loading @@ -335,32 +335,14 @@ u32 mdss_mdp_perf_calc_pipe_prefill_single(struct mdss_mdp_prefill_params return prefill_bytes; } static inline bool mdss_mdp_is_single_pipe_per_mixer( struct mdss_mdp_mixer *mixer) { bool is_single = true; int cnt = 0; int i; for (i = 0; i < MAX_PIPES_PER_LM; i++) { struct mdss_mdp_pipe *pipe = mixer->stage_pipe[i]; if (pipe) { cnt++; if (cnt > 1) { is_single = false; break; } } } return is_single; } /** * mdss_mdp_perf_calc_pipe() - calculate performance numbers required by pipe * @pipe: Source pipe struct containing updated pipe params * @perf: Structure containing values that should be updated for * performance tuning * @apply_fudge: Boolean to determine if mdp clock fudge is applicable * @is_single_layer: Indicate if the calculation is for a single pipe staged * in the layer mixer * * Function calculates the minimum required performance calculations in order * to avoid MDP underflow. The calculations are based on the way MDP Loading @@ -369,7 +351,7 @@ static inline bool mdss_mdp_is_single_pipe_per_mixer( */ int mdss_mdp_perf_calc_pipe(struct mdss_mdp_pipe *pipe, struct mdss_mdp_perf_params *perf, struct mdss_rect *roi, bool apply_fudge) bool apply_fudge, bool is_single_layer) { struct mdss_mdp_mixer *mixer; int fps = DEFAULT_FRAME_RATE; Loading Loading @@ -480,7 +462,7 @@ int mdss_mdp_perf_calc_pipe(struct mdss_mdp_pipe *pipe, prefill_params.is_hflip = pipe->flags & MDP_FLIP_LR; prefill_params.is_cmd = !mixer->ctl->is_video_mode; if (mdss_mdp_is_single_pipe_per_mixer(mixer)) if (is_single_layer) perf->prefill_bytes = mdss_mdp_perf_calc_pipe_prefill_single(&prefill_params); else if (!prefill_params.is_cmd) Loading Loading @@ -602,7 +584,7 @@ static void mdss_mdp_perf_calc_mixer(struct mdss_mdp_mixer *mixer, continue; if (mdss_mdp_perf_calc_pipe(pipe, &tmp, &mixer->roi, apply_fudge)) apply_fudge, (num_pipes == 1))) continue; prefill_bytes += tmp.prefill_bytes; Loading Loading @@ -816,14 +798,26 @@ int mdss_mdp_perf_bw_check_pipe(struct mdss_mdp_perf_params *perf, static void mdss_mdp_perf_calc_ctl(struct mdss_mdp_ctl *ctl, struct mdss_mdp_perf_params *perf) { struct mdss_mdp_pipe **left_plist, **right_plist; struct mdss_mdp_pipe *left_plist[MAX_PIPES_PER_LM]; struct mdss_mdp_pipe *right_plist[MAX_PIPES_PER_LM]; int i, left_cnt = 0, right_cnt = 0; left_plist = ctl->mixer_left ? ctl->mixer_left->stage_pipe : NULL; right_plist = ctl->mixer_right ? ctl->mixer_right->stage_pipe : NULL; for (i = 0; i < MAX_PIPES_PER_LM; i++) { if (ctl->mixer_left && ctl->mixer_left->stage_pipe[i]) { left_plist[left_cnt] = ctl->mixer_left->stage_pipe[i]; left_cnt++; } if (ctl->mixer_right && ctl->mixer_right->stage_pipe[i]) { right_plist[right_cnt] = ctl->mixer_right->stage_pipe[i]; right_cnt++; } } __mdss_mdp_perf_calc_ctl_helper(ctl, perf, left_plist, (left_plist ? MAX_PIPES_PER_LM : 0), right_plist, (right_plist ? MAX_PIPES_PER_LM : 0)); left_plist, left_cnt, right_plist, right_cnt); if (ctl->is_video_mode) { if (perf->bw_overlap > perf->bw_prefill) Loading drivers/video/msm/mdss/mdss_mdp_intf_writeback.c +1 −1 Original line number Diff line number Diff line Loading @@ -467,7 +467,7 @@ static bool mdss_mdp_traffic_shaper_helper(struct mdss_mdp_ctl *ctl, if (enable) { if (mdss_mdp_perf_calc_pipe(pipe, &perf, &mixer->roi, false)) false, true)) continue; clk_rate = max(mdss_mdp_get_mdp_clk_rate(ctl->mdata), Loading drivers/video/msm/mdss/mdss_mdp_overlay.c +33 −10 Original line number Diff line number Diff line Loading @@ -401,14 +401,16 @@ int mdss_mdp_overlay_req_check(struct msm_fb_data_type *mfd, return 0; } static int __mdp_pipe_tune_perf(struct mdss_mdp_pipe *pipe) static int __mdp_pipe_tune_perf(struct mdss_mdp_pipe *pipe, bool is_single_layer) { struct mdss_data_type *mdata = pipe->mixer_left->ctl->mdata; struct mdss_mdp_perf_params perf; int rc; for (;;) { rc = mdss_mdp_perf_calc_pipe(pipe, &perf, NULL, true); rc = mdss_mdp_perf_calc_pipe(pipe, &perf, NULL, true, is_single_layer); if (!rc && (perf.mdp_clk_rate <= mdata->max_mdp_clk_rate)) { rc = mdss_mdp_perf_bw_check_pipe(&perf, pipe); Loading Loading @@ -499,7 +501,7 @@ static inline void __mdss_mdp_overlay_set_chroma_sample( int mdss_mdp_overlay_pipe_setup(struct msm_fb_data_type *mfd, struct mdp_overlay *req, struct mdss_mdp_pipe **ppipe, struct mdss_mdp_pipe *left_blend_pipe) struct mdss_mdp_pipe *left_blend_pipe, bool is_single_layer) { struct mdss_mdp_format_params *fmt; struct mdss_mdp_pipe *pipe; Loading Loading @@ -868,7 +870,7 @@ int mdss_mdp_overlay_pipe_setup(struct msm_fb_data_type *mfd, } } ret = __mdp_pipe_tune_perf(pipe); ret = __mdp_pipe_tune_perf(pipe, is_single_layer); if (ret) { pr_debug("unable to satisfy performance. ret=%d\n", ret); goto exit_fail; Loading Loading @@ -946,7 +948,7 @@ static int mdss_mdp_overlay_set(struct msm_fb_data_type *mfd, /* userspace zorder start with stage 0 */ req->z_order += MDSS_MDP_STAGE_0; ret = mdss_mdp_overlay_pipe_setup(mfd, req, &pipe, NULL); ret = mdss_mdp_overlay_pipe_setup(mfd, req, &pipe, NULL, false); req->z_order -= MDSS_MDP_STAGE_0; } Loading Loading @@ -1270,7 +1272,7 @@ static int __overlay_queue_pipes(struct msm_fb_data_type *mfd) (ctl->mdata->wfd_mode == MDSS_MDP_WFD_SHARED))) { if (ctl->mdata->mixer_switched) { ret = mdss_mdp_overlay_pipe_setup(mfd, &pipe->req_data, &pipe, NULL); &pipe->req_data, &pipe, NULL, false); pr_debug("reseting DMA pipe for ctl=%d", ctl->num); } Loading Loading @@ -1778,7 +1780,8 @@ static int mdss_mdp_overlay_get_fb_pipe(struct msm_fb_data_type *mfd, pr_debug("allocating base pipe mux=%d\n", mixer_mux); ret = mdss_mdp_overlay_pipe_setup(mfd, &req, &pipe, NULL); ret = mdss_mdp_overlay_pipe_setup(mfd, &req, &pipe, NULL, false); if (ret) return ret; } Loading Loading @@ -2764,6 +2767,8 @@ static int __handle_overlay_prepare(struct msm_fb_data_type *mfd, int new_reqs = 0, left_cnt = 0, right_cnt = 0; int num_ovs = ovlist->num_overlays; u32 left_lm_w = left_lm_w_from_mfd(mfd); u32 left_lm_ovs = 0, right_lm_ovs = 0; bool is_single_layer = false; struct mdss_data_type *mdata = mfd_to_mdata(mfd); struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); Loading Loading @@ -2803,6 +2808,17 @@ static int __handle_overlay_prepare(struct msm_fb_data_type *mfd, pr_debug("prepare fb%d num_ovs=%d\n", mfd->index, num_ovs); for (i = 0; i < num_ovs; i++) { if (IS_RIGHT_MIXER_OV(ip_ovs[i].flags, ip_ovs[i].dst_rect.x, left_lm_w)) right_lm_ovs++; else left_lm_ovs++; if ((left_lm_ovs > 1) && (right_lm_ovs > 1)) break; } for (i = 0; i < num_ovs; i++) { left_blend_pipe = NULL; Loading @@ -2825,9 +2841,15 @@ static int __handle_overlay_prepare(struct msm_fb_data_type *mfd, req = &ip_ovs[i]; } if (IS_RIGHT_MIXER_OV(ip_ovs[i].flags, ip_ovs[i].dst_rect.x, left_lm_w)) is_single_layer = (right_lm_ovs == 1); else is_single_layer = (left_lm_ovs == 1); req->z_order += MDSS_MDP_STAGE_0; ret = mdss_mdp_overlay_pipe_setup(mfd, req, &pipe, left_blend_pipe); left_blend_pipe, is_single_layer); req->z_order -= MDSS_MDP_STAGE_0; if (IS_ERR_VALUE(ret)) Loading Loading @@ -2871,8 +2893,9 @@ validate_exit: ovlist->processed_overlays = i; if (IS_ERR_VALUE(ret)) { pr_debug("err=%d total_ovs:%d processed:%d\n", ret, num_ovs, ovlist->processed_overlays); pr_debug("err=%d total_ovs:%d processed:%d left:%d right:%d\n", ret, num_ovs, ovlist->processed_overlays, left_lm_ovs, right_lm_ovs); mdss_mdp_overlay_release(mfd, new_reqs); } mutex_unlock(&mdp5_data->ov_lock); Loading drivers/video/msm/mdss/mdss_mdp_splash_logo.c +1 −1 Original line number Diff line number Diff line Loading @@ -261,7 +261,7 @@ static struct mdss_mdp_pipe *mdss_mdp_splash_get_pipe( uint32_t image_size = SPLASH_IMAGE_WIDTH * SPLASH_IMAGE_HEIGHT * SPLASH_IMAGE_BPP; ret = mdss_mdp_overlay_pipe_setup(mfd, req, &pipe, NULL); ret = mdss_mdp_overlay_pipe_setup(mfd, req, &pipe, NULL, true); if (ret) return NULL; Loading Loading
drivers/video/msm/mdss/mdss_mdp.h +2 −2 Original line number Diff line number Diff line Loading @@ -610,7 +610,7 @@ int mdss_mdp_overlay_get_buf(struct msm_fb_data_type *mfd, u32 flags); int mdss_mdp_overlay_pipe_setup(struct msm_fb_data_type *mfd, struct mdp_overlay *req, struct mdss_mdp_pipe **ppipe, struct mdss_mdp_pipe *left_blend_pipe); struct mdss_mdp_pipe *left_blend_pipe, bool is_single_layer); void mdss_mdp_handoff_cleanup_pipes(struct msm_fb_data_type *mfd, u32 type); int mdss_mdp_overlay_release(struct msm_fb_data_type *mfd, int ndx); Loading Loading @@ -646,7 +646,7 @@ int mdss_mdp_perf_bw_check_pipe(struct mdss_mdp_perf_params *perf, struct mdss_mdp_pipe *pipe); int mdss_mdp_perf_calc_pipe(struct mdss_mdp_pipe *pipe, struct mdss_mdp_perf_params *perf, struct mdss_rect *roi, bool apply_fudge); bool apply_fudge, bool is_single_layer); u32 mdss_mdp_get_mdp_clk_rate(struct mdss_data_type *mdata); int mdss_mdp_ctl_notify(struct mdss_mdp_ctl *ctl, int event); void mdss_mdp_ctl_notifier_register(struct mdss_mdp_ctl *ctl, Loading
drivers/video/msm/mdss/mdss_mdp_ctl.c +22 −28 Original line number Diff line number Diff line Loading @@ -335,32 +335,14 @@ u32 mdss_mdp_perf_calc_pipe_prefill_single(struct mdss_mdp_prefill_params return prefill_bytes; } static inline bool mdss_mdp_is_single_pipe_per_mixer( struct mdss_mdp_mixer *mixer) { bool is_single = true; int cnt = 0; int i; for (i = 0; i < MAX_PIPES_PER_LM; i++) { struct mdss_mdp_pipe *pipe = mixer->stage_pipe[i]; if (pipe) { cnt++; if (cnt > 1) { is_single = false; break; } } } return is_single; } /** * mdss_mdp_perf_calc_pipe() - calculate performance numbers required by pipe * @pipe: Source pipe struct containing updated pipe params * @perf: Structure containing values that should be updated for * performance tuning * @apply_fudge: Boolean to determine if mdp clock fudge is applicable * @is_single_layer: Indicate if the calculation is for a single pipe staged * in the layer mixer * * Function calculates the minimum required performance calculations in order * to avoid MDP underflow. The calculations are based on the way MDP Loading @@ -369,7 +351,7 @@ static inline bool mdss_mdp_is_single_pipe_per_mixer( */ int mdss_mdp_perf_calc_pipe(struct mdss_mdp_pipe *pipe, struct mdss_mdp_perf_params *perf, struct mdss_rect *roi, bool apply_fudge) bool apply_fudge, bool is_single_layer) { struct mdss_mdp_mixer *mixer; int fps = DEFAULT_FRAME_RATE; Loading Loading @@ -480,7 +462,7 @@ int mdss_mdp_perf_calc_pipe(struct mdss_mdp_pipe *pipe, prefill_params.is_hflip = pipe->flags & MDP_FLIP_LR; prefill_params.is_cmd = !mixer->ctl->is_video_mode; if (mdss_mdp_is_single_pipe_per_mixer(mixer)) if (is_single_layer) perf->prefill_bytes = mdss_mdp_perf_calc_pipe_prefill_single(&prefill_params); else if (!prefill_params.is_cmd) Loading Loading @@ -602,7 +584,7 @@ static void mdss_mdp_perf_calc_mixer(struct mdss_mdp_mixer *mixer, continue; if (mdss_mdp_perf_calc_pipe(pipe, &tmp, &mixer->roi, apply_fudge)) apply_fudge, (num_pipes == 1))) continue; prefill_bytes += tmp.prefill_bytes; Loading Loading @@ -816,14 +798,26 @@ int mdss_mdp_perf_bw_check_pipe(struct mdss_mdp_perf_params *perf, static void mdss_mdp_perf_calc_ctl(struct mdss_mdp_ctl *ctl, struct mdss_mdp_perf_params *perf) { struct mdss_mdp_pipe **left_plist, **right_plist; struct mdss_mdp_pipe *left_plist[MAX_PIPES_PER_LM]; struct mdss_mdp_pipe *right_plist[MAX_PIPES_PER_LM]; int i, left_cnt = 0, right_cnt = 0; left_plist = ctl->mixer_left ? ctl->mixer_left->stage_pipe : NULL; right_plist = ctl->mixer_right ? ctl->mixer_right->stage_pipe : NULL; for (i = 0; i < MAX_PIPES_PER_LM; i++) { if (ctl->mixer_left && ctl->mixer_left->stage_pipe[i]) { left_plist[left_cnt] = ctl->mixer_left->stage_pipe[i]; left_cnt++; } if (ctl->mixer_right && ctl->mixer_right->stage_pipe[i]) { right_plist[right_cnt] = ctl->mixer_right->stage_pipe[i]; right_cnt++; } } __mdss_mdp_perf_calc_ctl_helper(ctl, perf, left_plist, (left_plist ? MAX_PIPES_PER_LM : 0), right_plist, (right_plist ? MAX_PIPES_PER_LM : 0)); left_plist, left_cnt, right_plist, right_cnt); if (ctl->is_video_mode) { if (perf->bw_overlap > perf->bw_prefill) Loading
drivers/video/msm/mdss/mdss_mdp_intf_writeback.c +1 −1 Original line number Diff line number Diff line Loading @@ -467,7 +467,7 @@ static bool mdss_mdp_traffic_shaper_helper(struct mdss_mdp_ctl *ctl, if (enable) { if (mdss_mdp_perf_calc_pipe(pipe, &perf, &mixer->roi, false)) false, true)) continue; clk_rate = max(mdss_mdp_get_mdp_clk_rate(ctl->mdata), Loading
drivers/video/msm/mdss/mdss_mdp_overlay.c +33 −10 Original line number Diff line number Diff line Loading @@ -401,14 +401,16 @@ int mdss_mdp_overlay_req_check(struct msm_fb_data_type *mfd, return 0; } static int __mdp_pipe_tune_perf(struct mdss_mdp_pipe *pipe) static int __mdp_pipe_tune_perf(struct mdss_mdp_pipe *pipe, bool is_single_layer) { struct mdss_data_type *mdata = pipe->mixer_left->ctl->mdata; struct mdss_mdp_perf_params perf; int rc; for (;;) { rc = mdss_mdp_perf_calc_pipe(pipe, &perf, NULL, true); rc = mdss_mdp_perf_calc_pipe(pipe, &perf, NULL, true, is_single_layer); if (!rc && (perf.mdp_clk_rate <= mdata->max_mdp_clk_rate)) { rc = mdss_mdp_perf_bw_check_pipe(&perf, pipe); Loading Loading @@ -499,7 +501,7 @@ static inline void __mdss_mdp_overlay_set_chroma_sample( int mdss_mdp_overlay_pipe_setup(struct msm_fb_data_type *mfd, struct mdp_overlay *req, struct mdss_mdp_pipe **ppipe, struct mdss_mdp_pipe *left_blend_pipe) struct mdss_mdp_pipe *left_blend_pipe, bool is_single_layer) { struct mdss_mdp_format_params *fmt; struct mdss_mdp_pipe *pipe; Loading Loading @@ -868,7 +870,7 @@ int mdss_mdp_overlay_pipe_setup(struct msm_fb_data_type *mfd, } } ret = __mdp_pipe_tune_perf(pipe); ret = __mdp_pipe_tune_perf(pipe, is_single_layer); if (ret) { pr_debug("unable to satisfy performance. ret=%d\n", ret); goto exit_fail; Loading Loading @@ -946,7 +948,7 @@ static int mdss_mdp_overlay_set(struct msm_fb_data_type *mfd, /* userspace zorder start with stage 0 */ req->z_order += MDSS_MDP_STAGE_0; ret = mdss_mdp_overlay_pipe_setup(mfd, req, &pipe, NULL); ret = mdss_mdp_overlay_pipe_setup(mfd, req, &pipe, NULL, false); req->z_order -= MDSS_MDP_STAGE_0; } Loading Loading @@ -1270,7 +1272,7 @@ static int __overlay_queue_pipes(struct msm_fb_data_type *mfd) (ctl->mdata->wfd_mode == MDSS_MDP_WFD_SHARED))) { if (ctl->mdata->mixer_switched) { ret = mdss_mdp_overlay_pipe_setup(mfd, &pipe->req_data, &pipe, NULL); &pipe->req_data, &pipe, NULL, false); pr_debug("reseting DMA pipe for ctl=%d", ctl->num); } Loading Loading @@ -1778,7 +1780,8 @@ static int mdss_mdp_overlay_get_fb_pipe(struct msm_fb_data_type *mfd, pr_debug("allocating base pipe mux=%d\n", mixer_mux); ret = mdss_mdp_overlay_pipe_setup(mfd, &req, &pipe, NULL); ret = mdss_mdp_overlay_pipe_setup(mfd, &req, &pipe, NULL, false); if (ret) return ret; } Loading Loading @@ -2764,6 +2767,8 @@ static int __handle_overlay_prepare(struct msm_fb_data_type *mfd, int new_reqs = 0, left_cnt = 0, right_cnt = 0; int num_ovs = ovlist->num_overlays; u32 left_lm_w = left_lm_w_from_mfd(mfd); u32 left_lm_ovs = 0, right_lm_ovs = 0; bool is_single_layer = false; struct mdss_data_type *mdata = mfd_to_mdata(mfd); struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); Loading Loading @@ -2803,6 +2808,17 @@ static int __handle_overlay_prepare(struct msm_fb_data_type *mfd, pr_debug("prepare fb%d num_ovs=%d\n", mfd->index, num_ovs); for (i = 0; i < num_ovs; i++) { if (IS_RIGHT_MIXER_OV(ip_ovs[i].flags, ip_ovs[i].dst_rect.x, left_lm_w)) right_lm_ovs++; else left_lm_ovs++; if ((left_lm_ovs > 1) && (right_lm_ovs > 1)) break; } for (i = 0; i < num_ovs; i++) { left_blend_pipe = NULL; Loading @@ -2825,9 +2841,15 @@ static int __handle_overlay_prepare(struct msm_fb_data_type *mfd, req = &ip_ovs[i]; } if (IS_RIGHT_MIXER_OV(ip_ovs[i].flags, ip_ovs[i].dst_rect.x, left_lm_w)) is_single_layer = (right_lm_ovs == 1); else is_single_layer = (left_lm_ovs == 1); req->z_order += MDSS_MDP_STAGE_0; ret = mdss_mdp_overlay_pipe_setup(mfd, req, &pipe, left_blend_pipe); left_blend_pipe, is_single_layer); req->z_order -= MDSS_MDP_STAGE_0; if (IS_ERR_VALUE(ret)) Loading Loading @@ -2871,8 +2893,9 @@ validate_exit: ovlist->processed_overlays = i; if (IS_ERR_VALUE(ret)) { pr_debug("err=%d total_ovs:%d processed:%d\n", ret, num_ovs, ovlist->processed_overlays); pr_debug("err=%d total_ovs:%d processed:%d left:%d right:%d\n", ret, num_ovs, ovlist->processed_overlays, left_lm_ovs, right_lm_ovs); mdss_mdp_overlay_release(mfd, new_reqs); } mutex_unlock(&mdp5_data->ov_lock); Loading
drivers/video/msm/mdss/mdss_mdp_splash_logo.c +1 −1 Original line number Diff line number Diff line Loading @@ -261,7 +261,7 @@ static struct mdss_mdp_pipe *mdss_mdp_splash_get_pipe( uint32_t image_size = SPLASH_IMAGE_WIDTH * SPLASH_IMAGE_HEIGHT * SPLASH_IMAGE_BPP; ret = mdss_mdp_overlay_pipe_setup(mfd, req, &pipe, NULL); ret = mdss_mdp_overlay_pipe_setup(mfd, req, &pipe, NULL, true); if (ret) return NULL; Loading