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

Commit 3e985f08 authored by Alan Kwong's avatar Alan Kwong
Browse files

drm/msm/sde: use current encoders to determine crtc interface



Instead of using the cached interface type, which is updated
during fence preparation time, determine interface type by
enumerating over all matching encoders and query the interface
directly. This avoids pontential stale interface types due to
changing connector state.

CRs-Fixed: 2009714
Change-Id: I31e1350cc62cafb5f014c0f32514d0692dec42d0
Signed-off-by: default avatarAlan Kwong <akwong@codeaurora.org>
parent 436b4a5f
Loading
Loading
Loading
Loading
+17 −7
Original line number Original line Diff line number Diff line
@@ -467,12 +467,6 @@ void sde_crtc_prepare_commit(struct drm_crtc *crtc,
			sde_connector_prepare_fence(conn);
			sde_connector_prepare_fence(conn);
		}
		}


	if (cstate->num_connectors > 0 && cstate->connectors[0]->encoder)
		cstate->intf_mode = sde_encoder_get_intf_mode(
				cstate->connectors[0]->encoder);
	else
		cstate->intf_mode = INTF_MODE_NONE;

	/* prepare main output fence */
	/* prepare main output fence */
	sde_fence_prepare(&sde_crtc->output_fence);
	sde_fence_prepare(&sde_crtc->output_fence);
}
}
@@ -514,6 +508,22 @@ static void _sde_crtc_complete_flip(struct drm_crtc *crtc,
	spin_unlock_irqrestore(&dev->event_lock, flags);
	spin_unlock_irqrestore(&dev->event_lock, flags);
}
}


enum sde_intf_mode sde_crtc_get_intf_mode(struct drm_crtc *crtc)
{
	struct drm_encoder *encoder;

	if (!crtc || !crtc->dev) {
		SDE_ERROR("invalid crtc\n");
		return INTF_MODE_NONE;
	}

	drm_for_each_encoder(encoder, crtc->dev)
		if (encoder->crtc == crtc)
			return sde_encoder_get_intf_mode(encoder);

	return INTF_MODE_NONE;
}

static void sde_crtc_vblank_cb(void *data)
static void sde_crtc_vblank_cb(void *data)
{
{
	struct drm_crtc *crtc = (struct drm_crtc *)data;
	struct drm_crtc *crtc = (struct drm_crtc *)data;
@@ -2021,7 +2031,7 @@ static int sde_crtc_debugfs_state_show(struct seq_file *s, void *v)


	seq_printf(s, "num_connectors: %d\n", cstate->num_connectors);
	seq_printf(s, "num_connectors: %d\n", cstate->num_connectors);
	seq_printf(s, "client type: %d\n", sde_crtc_get_client_type(crtc));
	seq_printf(s, "client type: %d\n", sde_crtc_get_client_type(crtc));
	seq_printf(s, "intf_mode: %d\n", cstate->intf_mode);
	seq_printf(s, "intf_mode: %d\n", sde_crtc_get_intf_mode(crtc));
	seq_printf(s, "bw_ctl: %llu\n", cstate->cur_perf.bw_ctl);
	seq_printf(s, "bw_ctl: %llu\n", cstate->cur_perf.bw_ctl);
	seq_printf(s, "core_clk_rate: %u\n", cstate->cur_perf.core_clk_rate);
	seq_printf(s, "core_clk_rate: %u\n", cstate->cur_perf.core_clk_rate);
	seq_printf(s, "max_per_pipe_ib: %llu\n",
	seq_printf(s, "max_per_pipe_ib: %llu\n",
+2 −8
Original line number Original line Diff line number Diff line
@@ -316,16 +316,10 @@ struct drm_crtc *sde_crtc_init(struct drm_device *dev, struct drm_plane *plane);
void sde_crtc_cancel_pending_flip(struct drm_crtc *crtc, struct drm_file *file);
void sde_crtc_cancel_pending_flip(struct drm_crtc *crtc, struct drm_file *file);


/**
/**
 * sde_crtc_get_intf_mode - get interface mode of the given crtc
 * sde_crtc_get_intf_mode - get primary interface mode of the given crtc
 * @crtc: Pointert to crtc
 * @crtc: Pointert to crtc
 */
 */
static inline enum sde_intf_mode sde_crtc_get_intf_mode(struct drm_crtc *crtc)
enum sde_intf_mode sde_crtc_get_intf_mode(struct drm_crtc *crtc);
{
	struct sde_crtc_state *cstate =
			crtc ? to_sde_crtc_state(crtc->state) : NULL;

	return cstate ? cstate->intf_mode : INTF_MODE_NONE;
}


/**
/**
 * sde_crtc_get_client_type - check the crtc type- rt, nrt, rsc, etc.
 * sde_crtc_get_client_type - check the crtc type- rt, nrt, rsc, etc.