Loading drivers/video/msm/mdss/mdss.h +1 −0 Original line number Diff line number Diff line Loading @@ -124,6 +124,7 @@ enum mdss_bus_clients { enum mdss_hw_quirk { MDSS_QUIRK_BWCPANIC, MDSS_QUIRK_DOWNSCALE_HANG, MDSS_QUIRK_DOWNSCALE_HFLIP_MDPCLK, MDSS_QUIRK_MAX, }; Loading drivers/video/msm/mdss/mdss_mdp.c +3 −0 Original line number Diff line number Diff line Loading @@ -1189,11 +1189,13 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) case MDSS_MDP_HW_REV_105: case MDSS_MDP_HW_REV_109: mdss_set_quirk(mdata, MDSS_QUIRK_BWCPANIC); mdss_set_quirk(mdata, MDSS_QUIRK_DOWNSCALE_HFLIP_MDPCLK); mdata->max_target_zorder = 7; /* excluding base layer */ mdata->max_cursor_size = 128; break; case MDSS_MDP_HW_REV_110: mdss_set_quirk(mdata, MDSS_QUIRK_BWCPANIC); mdss_set_quirk(mdata, MDSS_QUIRK_DOWNSCALE_HFLIP_MDPCLK); mdata->max_target_zorder = 4; /* excluding base layer */ mdata->max_cursor_size = 128; mdata->min_prefill_lines = 12; Loading @@ -1205,6 +1207,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) mdata->min_prefill_lines = 21; break; default: mdss_set_quirk(mdata, MDSS_QUIRK_DOWNSCALE_HFLIP_MDPCLK); mdata->max_target_zorder = 4; /* excluding base layer */ mdata->max_cursor_size = 64; } Loading drivers/video/msm/mdss/mdss_mdp_ctl.c +22 −0 Original line number Diff line number Diff line Loading @@ -622,6 +622,28 @@ int mdss_mdp_perf_calc_pipe(struct mdss_mdp_pipe *pipe, } perf->bw_overlap = quota; /* apply fudge factor if hflip and high downscaling */ if (mdss_has_quirk(mdata, MDSS_QUIRK_DOWNSCALE_HFLIP_MDPCLK) && (pipe->src_fmt->bpp == 4) && (pipe->flags & MDP_FLIP_LR)) { u32 src_w = DECIMATED_DIMENSION(src.w, pipe->horz_deci); u32 h_dwnscale = mult_frac(src_w, 1000, dst.w); u32 h_overfetch = pipe->scale.left_ftch[0] + pipe->scale.right_ftch[0]; pr_debug("pxl_ext:%d, h_overfetch:%d\n", pipe->scale.enable_pxl_ext, h_overfetch); if (h_dwnscale > (8 * 1000 / 3) && (!pipe->scale.enable_pxl_ext || (((src_w + h_overfetch) % 4) != 0))) { u32 hflip_dwnscale_factor = mult_frac(src_w, (3 * 1000), (dst.w * 8)); rate = mult_frac(rate, hflip_dwnscale_factor, 1000); pr_debug("hflip clk factor:%d, rate:%d\n", hflip_dwnscale_factor, rate); } } if (flags & PERF_CALC_PIPE_APPLY_CLK_FUDGE) perf->mdp_clk_rate = mdss_mdp_clk_fudge_factor(mixer, rate); else Loading Loading
drivers/video/msm/mdss/mdss.h +1 −0 Original line number Diff line number Diff line Loading @@ -124,6 +124,7 @@ enum mdss_bus_clients { enum mdss_hw_quirk { MDSS_QUIRK_BWCPANIC, MDSS_QUIRK_DOWNSCALE_HANG, MDSS_QUIRK_DOWNSCALE_HFLIP_MDPCLK, MDSS_QUIRK_MAX, }; Loading
drivers/video/msm/mdss/mdss_mdp.c +3 −0 Original line number Diff line number Diff line Loading @@ -1189,11 +1189,13 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) case MDSS_MDP_HW_REV_105: case MDSS_MDP_HW_REV_109: mdss_set_quirk(mdata, MDSS_QUIRK_BWCPANIC); mdss_set_quirk(mdata, MDSS_QUIRK_DOWNSCALE_HFLIP_MDPCLK); mdata->max_target_zorder = 7; /* excluding base layer */ mdata->max_cursor_size = 128; break; case MDSS_MDP_HW_REV_110: mdss_set_quirk(mdata, MDSS_QUIRK_BWCPANIC); mdss_set_quirk(mdata, MDSS_QUIRK_DOWNSCALE_HFLIP_MDPCLK); mdata->max_target_zorder = 4; /* excluding base layer */ mdata->max_cursor_size = 128; mdata->min_prefill_lines = 12; Loading @@ -1205,6 +1207,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) mdata->min_prefill_lines = 21; break; default: mdss_set_quirk(mdata, MDSS_QUIRK_DOWNSCALE_HFLIP_MDPCLK); mdata->max_target_zorder = 4; /* excluding base layer */ mdata->max_cursor_size = 64; } Loading
drivers/video/msm/mdss/mdss_mdp_ctl.c +22 −0 Original line number Diff line number Diff line Loading @@ -622,6 +622,28 @@ int mdss_mdp_perf_calc_pipe(struct mdss_mdp_pipe *pipe, } perf->bw_overlap = quota; /* apply fudge factor if hflip and high downscaling */ if (mdss_has_quirk(mdata, MDSS_QUIRK_DOWNSCALE_HFLIP_MDPCLK) && (pipe->src_fmt->bpp == 4) && (pipe->flags & MDP_FLIP_LR)) { u32 src_w = DECIMATED_DIMENSION(src.w, pipe->horz_deci); u32 h_dwnscale = mult_frac(src_w, 1000, dst.w); u32 h_overfetch = pipe->scale.left_ftch[0] + pipe->scale.right_ftch[0]; pr_debug("pxl_ext:%d, h_overfetch:%d\n", pipe->scale.enable_pxl_ext, h_overfetch); if (h_dwnscale > (8 * 1000 / 3) && (!pipe->scale.enable_pxl_ext || (((src_w + h_overfetch) % 4) != 0))) { u32 hflip_dwnscale_factor = mult_frac(src_w, (3 * 1000), (dst.w * 8)); rate = mult_frac(rate, hflip_dwnscale_factor, 1000); pr_debug("hflip clk factor:%d, rate:%d\n", hflip_dwnscale_factor, rate); } } if (flags & PERF_CALC_PIPE_APPLY_CLK_FUDGE) perf->mdp_clk_rate = mdss_mdp_clk_fudge_factor(mixer, rate); else Loading