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

Commit d4185ff1 authored by Steve Cohen's avatar Steve Cohen
Browse files

drm/msm/sde: move rotator start trigger to ctl start time



Trigger rotator start just before the CTL start.  Rotator start
should be triggered after the pipe flush bits have been set.

Change-Id: I7866990a88979783cd33d1b47f36796fb78a3d3c
Signed-off-by: default avatarSteve Cohen <cohens@codeaurora.org>
parent d732694b
Loading
Loading
Loading
Loading
+1 −5
Original line number Diff line number Diff line
@@ -3537,11 +3537,7 @@ static int _sde_crtc_commit_kickoff_rot(struct drm_crtc *crtc,
	if (master_ctl && master_ctl->ops.update_bitmask_rot) {
		master_ctl->ops.update_bitmask_rot(master_ctl, rot_id, 1);

		/* explicitly trigger rotator for async modes */
		if (cstate->sbuf_cfg.rot_op_mode ==
				SDE_CTL_ROT_OP_MODE_INLINE_ASYNC &&
				master_ctl->ops.trigger_rot_start)
			master_ctl->ops.trigger_rot_start(master_ctl);
		/* defer ROT_START trigger until CTL_START */
		SDE_EVT32(DRMID(crtc), master_ctl->idx - CTL_0,
				sde_crtc->sbuf_rot_id,
				sde_crtc->sbuf_rot_id_delta);
+13 −0
Original line number Diff line number Diff line
@@ -501,6 +501,19 @@ static inline int sde_crtc_get_mixer_height(struct sde_crtc *sde_crtc,
			cstate->ds_cfg[0].lm_height : mode->vdisplay);
}

/**
 * sde_crtc_get_rotator_op_mode - get the rotator op mode from the crtc state
 * @crtc: Pointer to drm crtc object
 */
static inline enum sde_ctl_rot_op_mode sde_crtc_get_rotator_op_mode(
		struct drm_crtc *crtc)
{
	if (!crtc || !crtc->state)
		return SDE_CTL_ROT_OP_MODE_OFFLINE;

	return to_sde_crtc_state(crtc->state)->sbuf_cfg.rot_op_mode;
}

/**
 * sde_crtc_frame_pending - retun the number of pending frames
 * @crtc: Pointer to drm crtc object
+19 −1
Original line number Diff line number Diff line
@@ -3190,6 +3190,7 @@ static inline void _sde_encoder_trigger_flush(struct drm_encoder *drm_enc,
static inline void _sde_encoder_trigger_start(struct sde_encoder_phys *phys)
{
	struct sde_hw_ctl *ctl;
	struct sde_encoder_virt *sde_enc;

	if (!phys) {
		SDE_ERROR("invalid argument(s)\n");
@@ -3201,14 +3202,31 @@ static inline void _sde_encoder_trigger_start(struct sde_encoder_phys *phys)
		return;
	}

	if (!phys->parent) {
		SDE_ERROR("invalid parent\n");
		return;
	}

	ctl = phys->hw_ctl;
	sde_enc = to_sde_encoder_virt(phys->parent);

	if (phys->split_role == ENC_ROLE_SKIP) {
		SDE_DEBUG_ENC(to_sde_encoder_virt(phys->parent),
		SDE_DEBUG_ENC(sde_enc,
				"skip start pp%d ctl%d\n",
				phys->hw_pp->idx - PINGPONG_0,
				ctl->idx - CTL_0);
		return;
	}

	/* Start rotator before CTL_START for async inline mode */
	if (sde_crtc_get_rotator_op_mode(sde_enc->crtc) ==
			SDE_CTL_ROT_OP_MODE_INLINE_ASYNC &&
			ctl->ops.trigger_rot_start) {
		SDE_DEBUG_ENC(sde_enc, "trigger rotator start ctl%d\n",
				ctl->idx - CTL_0);
		ctl->ops.trigger_rot_start(ctl);
	}

	if (phys->ops.trigger_start && phys->enable_state != SDE_ENC_DISABLED)
		phys->ops.trigger_start(phys);
}