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

Commit 21bf0392 authored by Shivaraj Shetty's avatar Shivaraj Shetty
Browse files

msm: mdss: Update the dma stride value on mdp3



The frame buffer is allocated from user space. And it may have some
special alignment requirement. Rather than assuming the alignment in
the driver, this change is to use the value passed in from the
user space to configure the dma stride register.

CRs-fixed: 582796
Change-Id: Ic3884ee0a530ed1ab83b6df26ba180fd21257ae0
Signed-off-by: default avatarShivaraj Shetty <shivaraj@codeaurora.org>
parent 2c8ba2e7
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -836,6 +836,14 @@ static int mdp3_overlay_set(struct msm_fb_data_type *mfd,
{
	int rc = 0;
	struct mdp3_session_data *mdp3_session = mfd->mdp.private1;
	struct fb_var_screeninfo *var;
	struct fb_fix_screeninfo *fix;
	struct fb_info *fbi = mfd->fbi;
	int stride;

	fix = &fbi->fix;
	var = &fbi->var;
	stride = req->src.width * var->bits_per_pixel/8;

	mutex_lock(&mdp3_session->lock);

@@ -844,6 +852,9 @@ static int mdp3_overlay_set(struct msm_fb_data_type *mfd,

	mdp3_session->overlay = *req;
	if (req->id == MSMFB_NEW_REQUEST) {
		if (fix->line_length != stride)
			mdp3_session->dma->config_stride(
						mdp3_session->dma, stride);
		mdp3_session->overlay.id = 1;
		req->id = 1;
	}
@@ -857,10 +868,15 @@ static int mdp3_overlay_unset(struct msm_fb_data_type *mfd, int ndx)
{
	int rc = 0;
	struct mdp3_session_data *mdp3_session = mfd->mdp.private1;
	struct fb_info *fbi = mfd->fbi;
	struct fb_fix_screeninfo *fix;

	fix = &fbi->fix;
	mutex_lock(&mdp3_session->lock);

	if (mdp3_session->overlay.id == ndx && ndx == 1) {
		mdp3_session->dma->config_stride(mdp3_session->dma,
							fix->line_length);
		mdp3_session->overlay.id = MSMFB_NEW_REQUEST;
		mdp3_bufq_deinit(&mdp3_session->bufq_in);
	} else {
+19 −0
Original line number Diff line number Diff line
@@ -268,6 +268,23 @@ static int mdp3_dma_sync_config(struct mdp3_dma *dma,
	return 0;
}

static void mdp3_dma_stride_config(struct mdp3_dma *dma, int stride)
{
	struct mdp3_dma_source *source_config;
	u32 dma_stride_offset;

	if (dma->dma_sel == MDP3_DMA_P)
		dma_stride_offset = MDP3_REG_DMA_P_IBUF_Y_STRIDE;
	else
		dma_stride_offset = MDP3_REG_DMA_S_IBUF_Y_STRIDE;

	source_config = &dma->source_config;
	source_config->stride = stride;
	pr_debug("%s: Update the fb stride for DMA to %d", __func__,
						(u32)source_config->stride);
	MDP3_REG_WRITE(dma_stride_offset, source_config->stride);
}

static int mdp3_dmap_config(struct mdp3_dma *dma,
			struct mdp3_dma_source *source_config,
			struct mdp3_dma_output_config *output_config)
@@ -855,6 +872,7 @@ int mdp3_dma_init(struct mdp3_dma *dma)
		dma->vsync_enable = mdp3_dma_vsync_enable;
		dma->start = mdp3_dma_start;
		dma->stop = mdp3_dma_stop;
		dma->config_stride = mdp3_dma_stride_config;
		break;
	case MDP3_DMA_S:
		dma->dma_config = mdp3_dmas_config;
@@ -869,6 +887,7 @@ int mdp3_dma_init(struct mdp3_dma *dma)
		dma->vsync_enable = mdp3_dma_vsync_enable;
		dma->start = mdp3_dma_start;
		dma->stop = mdp3_dma_stop;
		dma->config_stride = mdp3_dma_stride_config;
		break;
	case MDP3_DMA_E:
	default:
+2 −0
Original line number Diff line number Diff line
@@ -287,6 +287,8 @@ struct mdp3_dma {

	int (*histo_op)(struct mdp3_dma *dma, u32 op);

	void (*config_stride)(struct mdp3_dma *dma, int stride);

	void (*vsync_enable)(struct mdp3_dma *dma,
			struct mdp3_vsync_notification *vsync_client);
};