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

Commit 4bb3edad authored by Ramkumar Radhakrishnan's avatar Ramkumar Radhakrishnan
Browse files

msm: mdss: fix adaptive variable refresh and dynamic fps concurrency



Store the avr vtotal information computed from the initial timing
information and use it to restore the register values to avoid
flickering issues during suspend/resume usecase.

CRs-Fixed: 1056610
Change-Id: I8c7d27a062b90a3f200904f0ba20fbdb0bb32d70
Signed-off-by: default avatarRamkumar Radhakrishnan <ramkumar@codeaurora.org>
parent e97b6a0e
Loading
Loading
Loading
Loading
+19 −13
Original line number Diff line number Diff line
@@ -411,22 +411,28 @@ static void mdss_mdp_video_avr_vtotal_setup(struct mdss_mdp_ctl *ctl,

	if (test_bit(MDSS_CAPS_AVR_SUPPORTED, mdata->mdss_caps_map)) {
		struct mdss_panel_data *pdata = ctl->panel_data;
		u32 hsync_period = p->hsync_pulse_width + p->h_back_porch +
				p->width + p->h_front_porch;
		u32 vsync_period = p->vsync_pulse_width + p->v_back_porch +
				p->height + p->v_front_porch;
		u32 min_fps = pdata->panel_info.min_fps;
		u32 diff_fps = abs(pdata->panel_info.default_fps - min_fps);
		u32 vtotal = mdss_panel_get_vtotal(&pdata->panel_info);

		struct mdss_panel_info *pinfo = &pdata->panel_info;
		u32 avr_vtotal = pinfo->saved_avr_vtotal;

		if (!pinfo->saved_avr_vtotal) {
			u32 hsync_period = p->hsync_pulse_width +
				p->h_back_porch + p->width + p->h_front_porch;
			u32 vsync_period = p->vsync_pulse_width +
				p->v_back_porch + p->height + p->v_front_porch;
			u32 min_fps = pinfo->min_fps;
			u32 default_fps = mdss_panel_get_framerate(pinfo);
			u32 diff_fps = abs(default_fps - min_fps);
			u32 vtotal = mdss_panel_get_vtotal(pinfo);
			int add_porches = mult_frac(vtotal, diff_fps, min_fps);

			u32 vsync_period_slow = vsync_period + add_porches;
		u32 avr_vtotal = vsync_period_slow * hsync_period;

			avr_vtotal = vsync_period_slow * hsync_period;
			pinfo->saved_avr_vtotal = avr_vtotal;
		}

		mdp_video_write(ctx, MDSS_MDP_REG_INTF_AVR_VTOTAL, avr_vtotal);

		MDSS_XLOG(min_fps, vsync_period, vsync_period_slow, avr_vtotal);
		MDSS_XLOG(pinfo->min_fps, pinfo->default_fps, avr_vtotal);
	}
}

+0 −1
Original line number Diff line number Diff line
@@ -644,7 +644,6 @@ void mdss_panel_info_from_timing(struct mdss_panel_timing *pt,
	pinfo->dsc_enc_total = pt->dsc_enc_total;
	pinfo->fbc = pt->fbc;
	pinfo->compression_mode = pt->compression_mode;
	pinfo->default_fps = pinfo->mipi.frame_rate;

	pinfo->roi_alignment = pt->roi_alignment;
	pinfo->te = pt->te;
+3 −0
Original line number Diff line number Diff line
@@ -722,6 +722,9 @@ struct mdss_panel_info {

	/* debugfs structure for the panel */
	struct mdss_panel_debugfs_info *debugfs_info;

	/* stores initial adaptive variable refresh vtotal value */
	u32 saved_avr_vtotal;
};

struct mdss_panel_timing {