Loading Documentation/devicetree/bindings/fb/mdss-mdp.txt +4 −0 Original line number Diff line number Diff line Loading @@ -307,6 +307,10 @@ Fudge Factors: Fudge factors are used to boost demand for FUDGE(x, a, b) = ((x * a) / b) - qcom,mdss-ib-factor: This fudge factor is applied to calculated ib values in default conditions. - qcom,mdss-ib-factor-overlap: This fudge factor is applied to calculated ib values when the overlap bandwidth is the predominant value compared to prefill bandwidth value. - qcom,mdss-clk-factor: This fudge factor is applied to calculated mdp clk rate in default conditions. Loading drivers/video/msm/mdss/mdss.h +1 −0 Original line number Diff line number Diff line Loading @@ -152,6 +152,7 @@ struct mdss_data_type { struct mdss_fudge_factor ab_factor; struct mdss_fudge_factor ib_factor; struct mdss_fudge_factor ib_factor_overlap; struct mdss_fudge_factor clk_factor; struct mdss_hw_settings *hw_settings; Loading drivers/video/msm/mdss/mdss_mdp.c +11 −0 Original line number Diff line number Diff line Loading @@ -2349,6 +2349,17 @@ static int mdss_mdp_parse_dt_misc(struct platform_device *pdev) mdss_mdp_parse_dt_fudge_factors(pdev, "qcom,mdss-ib-factor", &mdata->ib_factor); /* * Set overlap ib value equal to ib by default. This value can * be tuned in device tree to be different from ib. * This factor apply when the max bandwidth per pipe * is the overlap BW. */ mdata->ib_factor_overlap.numer = mdata->ib_factor.numer; mdata->ib_factor_overlap.denom = mdata->ib_factor.denom; mdss_mdp_parse_dt_fudge_factors(pdev, "qcom,mdss-ib-factor-overlap", &mdata->ib_factor_overlap); mdata->clk_factor.numer = 1; mdata->clk_factor.denom = 1; mdss_mdp_parse_dt_fudge_factors(pdev, "qcom,mdss-clk-factor", Loading drivers/video/msm/mdss/mdss_mdp_ctl.c +18 −15 Original line number Diff line number Diff line Loading @@ -30,14 +30,11 @@ static inline u64 fudge_factor(u64 val, u32 numer, u32 denom) return result; } #define AB_FUDGE_FACTOR(val) fudge_factor((val), \ (mdss_res->ab_factor.numer), (mdss_res->ab_factor.denom)) #define IB_FUDGE_FACTOR(val) fudge_factor((val), \ (mdss_res->ib_factor.numer), (mdss_res->ib_factor.denom)) #define CLK_FUDGE_FACTOR(val) fudge_factor((val), \ (mdss_res->clk_factor.numer), (mdss_res->clk_factor.denom)) static inline u64 apply_fudge_factor(u64 val, struct mdss_fudge_factor *factor) { return fudge_factor(val, factor->numer, factor->denom); } static DEFINE_MUTEX(mdss_mdp_ctl_lock); Loading @@ -58,7 +55,7 @@ static inline u32 mdss_mdp_clk_fudge_factor(struct mdss_mdp_mixer *mixer, { struct mdss_panel_info *pinfo = &mixer->ctl->panel_data->panel_info; rate = CLK_FUDGE_FACTOR(rate); rate = apply_fudge_factor(rate, &mdss_res->clk_factor); /* * If the panel is video mode and its back porch period is Loading @@ -67,7 +64,7 @@ static inline u32 mdss_mdp_clk_fudge_factor(struct mdss_mdp_mixer *mixer, */ if (mixer->ctl->is_video_mode && pinfo && (pinfo->lcdc.v_back_porch < MDP_MIN_VBP)) rate = CLK_FUDGE_FACTOR(rate); rate = apply_fudge_factor(rate, &mdss_res->clk_factor); return rate; } Loading Loading @@ -735,11 +732,16 @@ static void mdss_mdp_perf_calc_ctl(struct mdss_mdp_ctl *ctl, left_plist, (left_plist ? MAX_PIPES_PER_LM : 0), right_plist, (right_plist ? MAX_PIPES_PER_LM : 0)); if (ctl->is_video_mode) perf->bw_ctl = IB_FUDGE_FACTOR(perf->bw_ctl); if (ctl->is_video_mode) { if (perf->bw_overlap > perf->bw_prefill) perf->bw_ctl = apply_fudge_factor(perf->bw_ctl, &mdss_res->ib_factor_overlap); else perf->bw_ctl = apply_fudge_factor(perf->bw_ctl, &mdss_res->ib_factor); } pr_debug("ctl=%d clk_rate=%u\n", ctl->num, perf->mdp_clk_rate); pr_debug("bw_overlap=%llu bw_prefill=%llu prefill_byptes=%d\n", pr_debug("bw_overlap=%llu bw_prefill=%llu prefill_bytes=%d\n", perf->bw_overlap, perf->bw_prefill, perf->prefill_bytes); } Loading Loading @@ -863,7 +865,8 @@ static inline void mdss_mdp_ctl_perf_update_bus(struct mdss_mdp_ctl *ctl) } } bus_ib_quota = bw_sum_of_intfs; bus_ab_quota = AB_FUDGE_FACTOR(bw_sum_of_intfs); bus_ab_quota = apply_fudge_factor(bw_sum_of_intfs, &mdss_res->ab_factor); mdss_mdp_bus_scale_set_quota(bus_ab_quota, bus_ib_quota); pr_debug("ab=%llu ib=%llu\n", bus_ab_quota, bus_ib_quota); } Loading Loading
Documentation/devicetree/bindings/fb/mdss-mdp.txt +4 −0 Original line number Diff line number Diff line Loading @@ -307,6 +307,10 @@ Fudge Factors: Fudge factors are used to boost demand for FUDGE(x, a, b) = ((x * a) / b) - qcom,mdss-ib-factor: This fudge factor is applied to calculated ib values in default conditions. - qcom,mdss-ib-factor-overlap: This fudge factor is applied to calculated ib values when the overlap bandwidth is the predominant value compared to prefill bandwidth value. - qcom,mdss-clk-factor: This fudge factor is applied to calculated mdp clk rate in default conditions. Loading
drivers/video/msm/mdss/mdss.h +1 −0 Original line number Diff line number Diff line Loading @@ -152,6 +152,7 @@ struct mdss_data_type { struct mdss_fudge_factor ab_factor; struct mdss_fudge_factor ib_factor; struct mdss_fudge_factor ib_factor_overlap; struct mdss_fudge_factor clk_factor; struct mdss_hw_settings *hw_settings; Loading
drivers/video/msm/mdss/mdss_mdp.c +11 −0 Original line number Diff line number Diff line Loading @@ -2349,6 +2349,17 @@ static int mdss_mdp_parse_dt_misc(struct platform_device *pdev) mdss_mdp_parse_dt_fudge_factors(pdev, "qcom,mdss-ib-factor", &mdata->ib_factor); /* * Set overlap ib value equal to ib by default. This value can * be tuned in device tree to be different from ib. * This factor apply when the max bandwidth per pipe * is the overlap BW. */ mdata->ib_factor_overlap.numer = mdata->ib_factor.numer; mdata->ib_factor_overlap.denom = mdata->ib_factor.denom; mdss_mdp_parse_dt_fudge_factors(pdev, "qcom,mdss-ib-factor-overlap", &mdata->ib_factor_overlap); mdata->clk_factor.numer = 1; mdata->clk_factor.denom = 1; mdss_mdp_parse_dt_fudge_factors(pdev, "qcom,mdss-clk-factor", Loading
drivers/video/msm/mdss/mdss_mdp_ctl.c +18 −15 Original line number Diff line number Diff line Loading @@ -30,14 +30,11 @@ static inline u64 fudge_factor(u64 val, u32 numer, u32 denom) return result; } #define AB_FUDGE_FACTOR(val) fudge_factor((val), \ (mdss_res->ab_factor.numer), (mdss_res->ab_factor.denom)) #define IB_FUDGE_FACTOR(val) fudge_factor((val), \ (mdss_res->ib_factor.numer), (mdss_res->ib_factor.denom)) #define CLK_FUDGE_FACTOR(val) fudge_factor((val), \ (mdss_res->clk_factor.numer), (mdss_res->clk_factor.denom)) static inline u64 apply_fudge_factor(u64 val, struct mdss_fudge_factor *factor) { return fudge_factor(val, factor->numer, factor->denom); } static DEFINE_MUTEX(mdss_mdp_ctl_lock); Loading @@ -58,7 +55,7 @@ static inline u32 mdss_mdp_clk_fudge_factor(struct mdss_mdp_mixer *mixer, { struct mdss_panel_info *pinfo = &mixer->ctl->panel_data->panel_info; rate = CLK_FUDGE_FACTOR(rate); rate = apply_fudge_factor(rate, &mdss_res->clk_factor); /* * If the panel is video mode and its back porch period is Loading @@ -67,7 +64,7 @@ static inline u32 mdss_mdp_clk_fudge_factor(struct mdss_mdp_mixer *mixer, */ if (mixer->ctl->is_video_mode && pinfo && (pinfo->lcdc.v_back_porch < MDP_MIN_VBP)) rate = CLK_FUDGE_FACTOR(rate); rate = apply_fudge_factor(rate, &mdss_res->clk_factor); return rate; } Loading Loading @@ -735,11 +732,16 @@ static void mdss_mdp_perf_calc_ctl(struct mdss_mdp_ctl *ctl, left_plist, (left_plist ? MAX_PIPES_PER_LM : 0), right_plist, (right_plist ? MAX_PIPES_PER_LM : 0)); if (ctl->is_video_mode) perf->bw_ctl = IB_FUDGE_FACTOR(perf->bw_ctl); if (ctl->is_video_mode) { if (perf->bw_overlap > perf->bw_prefill) perf->bw_ctl = apply_fudge_factor(perf->bw_ctl, &mdss_res->ib_factor_overlap); else perf->bw_ctl = apply_fudge_factor(perf->bw_ctl, &mdss_res->ib_factor); } pr_debug("ctl=%d clk_rate=%u\n", ctl->num, perf->mdp_clk_rate); pr_debug("bw_overlap=%llu bw_prefill=%llu prefill_byptes=%d\n", pr_debug("bw_overlap=%llu bw_prefill=%llu prefill_bytes=%d\n", perf->bw_overlap, perf->bw_prefill, perf->prefill_bytes); } Loading Loading @@ -863,7 +865,8 @@ static inline void mdss_mdp_ctl_perf_update_bus(struct mdss_mdp_ctl *ctl) } } bus_ib_quota = bw_sum_of_intfs; bus_ab_quota = AB_FUDGE_FACTOR(bw_sum_of_intfs); bus_ab_quota = apply_fudge_factor(bw_sum_of_intfs, &mdss_res->ab_factor); mdss_mdp_bus_scale_set_quota(bus_ab_quota, bus_ib_quota); pr_debug("ab=%llu ib=%llu\n", bus_ab_quota, bus_ib_quota); } Loading