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

Commit 1641c0a6 authored by Veera Sundaram Sankaran's avatar Veera Sundaram Sankaran
Browse files

msm: mdss: add WB support to use 2 LM for 4k usecase



Fix writeback to use 2 LM for resolution width more than 2048.
And update the pinfo and var data structures when the writeback
output resolution is changed.

CRs-fixed: 930504
Change-Id: Id096511a26845a962c30c6ebf2102ffcb0c18a5f
Signed-off-by: default avatarVeera Sundaram Sankaran <veeras@codeaurora.org>
parent 74240891
Loading
Loading
Loading
Loading
+65 −1
Original line number Diff line number Diff line
@@ -3114,13 +3114,60 @@ static int __ioctl_transition_dyn_mode_state(struct msm_fb_data_type *mfd,
	return 0;
}

static inline bool mdss_fb_is_wb_config_same(struct msm_fb_data_type *mfd,
		struct mdp_output_layer *output_layer)
{
	struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
	struct msm_mdp_interface *mdp5_interface = &mfd->mdp;

	if (!mdp5_data->wfd
		|| (mdp5_interface->is_config_same
		&& !mdp5_interface->is_config_same(mfd, output_layer)))
		return false;
	return true;
}

/* update pinfo and var for WB on config change */
static void mdss_fb_update_resolution(struct msm_fb_data_type *mfd,
		u32 xres, u32 yres, u32 format)
{
	struct mdss_panel_info *pinfo = mfd->panel_info;
	struct fb_var_screeninfo *var = &mfd->fbi->var;
	struct fb_fix_screeninfo *fix = &mfd->fbi->fix;
	struct mdss_mdp_format_params *fmt = NULL;

	pinfo->xres = xres;
	pinfo->yres = yres;
	mfd->fb_imgType = format;
	if (mfd->mdp.get_format_params) {
		fmt = mfd->mdp.get_format_params(format);
		if (fmt) {
			pinfo->bpp = fmt->bpp;
			var->bits_per_pixel = fmt->bpp * 8;
		}
		if (mfd->mdp.fb_stride)
			fix->line_length = mfd->mdp.fb_stride(mfd->index,
						var->xres,
						var->bits_per_pixel / 8);
		else
			fix->line_length = var->xres * var->bits_per_pixel / 8;

	}
	var->xres_virtual = var->xres;
	var->yres_virtual = pinfo->yres * mfd->fb_page;
	mdss_panelinfo_to_fb_var(pinfo, var);
}

int mdss_fb_atomic_commit(struct fb_info *info,
	struct mdp_layer_commit  *commit, struct file *file)
{
	struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)info->par;
	struct mdp_layer_commit_v1 *commit_v1;
	bool wait_for_finish;
	struct mdp_output_layer *output_layer;
	struct mdss_panel_info *pinfo;
	bool wait_for_finish, wb_change = false;
	int ret = -EPERM;
	u32 old_xres, old_yres, old_format;

	if (!mfd || (!mfd->op_enable)) {
		pr_err("mfd is NULL or operation not permitted\n");
@@ -3133,6 +3180,7 @@ int mdss_fb_atomic_commit(struct fb_info *info,
		pr_err("commit is not supported when interface is in off state\n");
		goto end;
	}
	pinfo = mfd->panel_info;

	/* only supports version 1.0 */
	if (commit->version != MDP_COMMIT_VERSION_1_0) {
@@ -3153,6 +3201,20 @@ int mdss_fb_atomic_commit(struct fb_info *info,
		} else {
			__ioctl_transition_dyn_mode_state(mfd,
				MSMFB_ATOMIC_COMMIT, 1);
			if (mfd->panel.type == WRITEBACK_PANEL) {
				output_layer = commit_v1->output_layer;
				wb_change = !mdss_fb_is_wb_config_same(mfd,
						commit_v1->output_layer);
				if (wb_change) {
					old_xres = pinfo->xres;
					old_yres = pinfo->yres;
					old_format = mfd->fb_imgType;
					mdss_fb_update_resolution(mfd,
						output_layer->buffer.width,
						output_layer->buffer.height,
						output_layer->buffer.format);
				}
			}
			ret = mfd->mdp.atomic_validate(mfd, file, commit_v1);
			if (!ret)
				mfd->atomic_commit_pending = true;
@@ -3188,6 +3250,8 @@ int mdss_fb_atomic_commit(struct fb_info *info,
		ret = mdss_fb_pan_idle(mfd);

end:
	if (ret && (mfd->panel.type == WRITEBACK_PANEL) && wb_change)
		mdss_fb_update_resolution(mfd, old_xres, old_yres, old_format);
	return ret;
}

+3 −0
Original line number Diff line number Diff line
@@ -209,6 +209,8 @@ struct msm_mdp_interface {
					struct mdp_display_commit *data);
	int (*atomic_validate)(struct msm_fb_data_type *mfd, struct file *file,
				struct mdp_layer_commit_v1 *commit);
	bool (*is_config_same)(struct msm_fb_data_type *mfd,
				struct mdp_output_layer *layer);
	int (*pre_commit)(struct msm_fb_data_type *mfd, struct file *file,
				struct mdp_layer_commit_v1 *commit);
	int (*pre_commit_fnc)(struct msm_fb_data_type *mfd);
@@ -225,6 +227,7 @@ struct msm_mdp_interface {
		int *bl_out, bool *bl_out_notify);
	int (*panel_register_done)(struct mdss_panel_data *pdata);
	u32 (*fb_stride)(u32 fb_index, u32 xres, int bpp);
	struct mdss_mdp_format_params *(*get_format_params)(u32 format);
	int (*splash_init_fnc)(struct msm_fb_data_type *mfd);
	struct msm_sync_pt_data *(*get_sync_fnc)(struct msm_fb_data_type *mfd,
				const struct mdp_buf_sync *buf_sync);
+1 −0
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ struct msm_mdp_interface mdp5 = {
	.fb_mem_get_iommu_domain = mdss_fb_mem_get_iommu_domain,
	.fb_stride = mdss_mdp_fb_stride,
	.check_dsi_status = mdss_check_dsi_ctrl_status,
	.get_format_params = mdss_mdp_get_format_params,
};

#define DEFAULT_TOTAL_RGB_PIPES 3
+2 −0
Original line number Diff line number Diff line
@@ -1206,6 +1206,8 @@ int mdss_mdp_layer_atomic_validate_wfd(struct msm_fb_data_type *mfd,
	struct file *file, struct mdp_layer_commit_v1 *ov_commit);
int mdss_mdp_layer_pre_commit_wfd(struct msm_fb_data_type *mfd,
	struct file *file, struct mdp_layer_commit_v1 *ov_commit);
bool mdss_mdp_wfd_is_config_same(struct msm_fb_data_type *mfd,
	struct mdp_output_layer *layer);

int mdss_mdp_async_position_update(struct msm_fb_data_type *mfd,
		struct mdp_position_update *update_pos);
+1 −0
Original line number Diff line number Diff line
@@ -5123,6 +5123,7 @@ int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd)
		mdp5_interface->atomic_validate =
			mdss_mdp_layer_atomic_validate_wfd;
		mdp5_interface->pre_commit = mdss_mdp_layer_pre_commit_wfd;
		mdp5_interface->is_config_same = mdss_mdp_wfd_is_config_same;
	} else {
		mdp5_interface->atomic_validate =
			mdss_mdp_layer_atomic_validate;
Loading