Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1f6197d5 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: mdss: fix underruns during hflip and downscaling scenarios"

parents db87c7f5 dc6edc78
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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,
};

+3 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;
	}
+22 −0
Original line number Diff line number Diff line
@@ -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