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

Commit 4fda2bf8 authored by Yujun Zhang's avatar Yujun Zhang Committed by Gerrit - the friendly Code Review server
Browse files

drm/sde: fix smmu fault while running DRM test



DRM test failed in 4K display. It is caused by
wrong configuration of physical pipe and flush
mask for layer mixer.

Change-Id: I0d2d50cf24ba2265c9f5b874526c5e4013e47d9e
CRs-Fixed: 2065974
Signed-off-by: default avatarYujun Zhang <yujunzhang@codeaurora.org>
parent 6f777b23
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -204,10 +204,15 @@ static void _sde_crtc_blend_setup_mixer(struct drm_crtc *crtc,
			idx = left_crtc_zpos_cnt[pstate->stage]++;
		}

		/* stage plane on right LM if it crosses the boundary */
		lm_right = (lm_idx == LEFT_MIXER) &&
		   (plane->state->crtc_x + plane->state->crtc_w >
							crtc_split_width);

		/*
		 * program each mixer with two hw pipes in dual mixer mode,
		 */
		if (sde_crtc->num_mixers == CRTC_DUAL_MIXERS) {
		if (sde_crtc->num_mixers == CRTC_DUAL_MIXERS && lm_right) {
			stage_cfg->stage[LEFT_MIXER][pstate->stage][1] =
				sde_plane_pipe(plane, 1);

@@ -218,10 +223,7 @@ static void _sde_crtc_blend_setup_mixer(struct drm_crtc *crtc,
		flush_mask |= ctl->ops.get_bitmask_sspp(ctl,
				sde_plane_pipe(plane, lm_idx ? 1 : 0));

		/* stage plane on right LM if it crosses the boundary */
		lm_right = (lm_idx == LEFT_MIXER) &&
		   (plane->state->crtc_x + plane->state->crtc_w >
							crtc_split_width);


		stage_cfg->stage[lm_idx][pstate->stage][idx] =
					sde_plane_pipe(plane, lm_idx ? 1 : 0);
+13 −9
Original line number Diff line number Diff line
@@ -1237,8 +1237,10 @@ static int _sde_plane_mode_set(struct drm_plane *plane,
	bool q16_data = true;
	int idx;
	struct sde_phy_plane *pp;
	uint32_t num_of_phy_planes = 0, maxlinewidth = 0xFFFF;
	uint32_t num_of_phy_planes = 0;
	int mode = 0;
	uint32_t crtc_split_width;
	bool is_across_mixer_boundary  = false;

	if (!plane) {
		SDE_ERROR("invalid plane\n");
@@ -1252,6 +1254,7 @@ static int _sde_plane_mode_set(struct drm_plane *plane,
	pstate = to_sde_plane_state(plane->state);

	crtc = state->crtc;
	crtc_split_width = get_crtc_split_width(crtc);
	fb = state->fb;
	if (!crtc || !fb) {
		SDE_ERROR_PLANE(psde, "invalid crtc %d or fb %d\n",
@@ -1348,17 +1351,17 @@ static int _sde_plane_mode_set(struct drm_plane *plane,
		}
	}

	list_for_each_entry(pp, &psde->phy_plane_head, phy_plane_list) {
		if (maxlinewidth > pp->pipe_sblk->maxlinewidth)
			maxlinewidth = pp->pipe_sblk->maxlinewidth;
	list_for_each_entry(pp, &psde->phy_plane_head, phy_plane_list)
		num_of_phy_planes++;
	}

	/*
	 * Only need to use one physical plane if plane width is still within
	 * the limitation.
	 */
	if (maxlinewidth >= (src.x + src.w))
	is_across_mixer_boundary = (plane->state->crtc_x < crtc_split_width) &&
				(plane->state->crtc_x + plane->state->crtc_w >
				crtc_split_width);
	if (crtc_split_width >= (src.x + src.w) && !is_across_mixer_boundary)
		num_of_phy_planes = 1;

	if (num_of_phy_planes > 1) {
@@ -1369,9 +1372,10 @@ static int _sde_plane_mode_set(struct drm_plane *plane,

	list_for_each_entry(pp, &psde->phy_plane_head, phy_plane_list) {
		/* Adjust offset for multi-pipe */
		if (num_of_phy_planes > 1) {
			src.x += src.w * pp->index;
			dst.x += dst.w * pp->index;

		}
		pp->pipe_cfg.src_rect = src;
		pp->pipe_cfg.dst_rect = dst;