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

Commit 2c748e62 authored by Veera Sundaram Sankaran's avatar Veera Sundaram Sankaran Committed by Gerrit - the friendly Code Review server
Browse files

drm/msm/sde: move release fence to crtc frame done event for cmd mode



Currently, crtc output_fence is released during commit_complete.
Release the fence early in frame_done crtc event for cmd mode
panels to increase performance, as the buffers are no longer
required after PPDONE.

Change-Id: Ie711adeee20d10530508bd11e2fa04a599e1f9c1
Signed-off-by: default avatarVeera Sundaram Sankaran <veeras@codeaurora.org>
parent 7ee99097
Loading
Loading
Loading
Loading
+33 −3
Original line number Diff line number Diff line
@@ -1516,6 +1516,7 @@ static void sde_crtc_frame_event_work(struct kthread_work *work)
	struct sde_crtc *sde_crtc;
	struct sde_crtc_state *cstate;
	struct sde_kms *sde_kms;
	struct drm_encoder *encoder;
	unsigned long flags;

	if (!work) {
@@ -1569,8 +1570,26 @@ static void sde_crtc_frame_event_work(struct kthread_work *work)
		}

		if (fevent->event == SDE_ENCODER_FRAME_EVENT_DONE ||
			(fevent->event & SDE_ENCODER_FRAME_EVENT_ERROR))
			    (fevent->event & SDE_ENCODER_FRAME_EVENT_ERROR)) {
			bool signal_fence = true;

			drm_for_each_encoder(encoder, crtc->dev) {
				if (encoder->crtc != crtc)
					continue;

				signal_fence &=
					sde_encoder_is_cmd_mode(encoder);
			}

			/* signal release fence only for cmd mode panels here */
			if (signal_fence) {
				sde_fence_signal(&sde_crtc->output_fence, 0);
				SDE_EVT32_VERBOSE(DRMID(crtc), fevent->event,
							SDE_EVTLOG_FUNC_CASE4);
			}

			complete_all(&sde_crtc->frame_done_comp);
		}

		if (fevent->event == SDE_ENCODER_FRAME_EVENT_DONE)
			sde_core_perf_crtc_update(crtc, 0, false);
@@ -1635,7 +1654,9 @@ void sde_crtc_complete_commit(struct drm_crtc *crtc,
{
	struct sde_crtc *sde_crtc;
	struct sde_crtc_state *cstate;
	struct drm_encoder *encoder;
	int i;
	bool signal_fence = true;

	if (!crtc || !crtc->state) {
		SDE_ERROR("invalid crtc\n");
@@ -1646,9 +1667,18 @@ void sde_crtc_complete_commit(struct drm_crtc *crtc,
	cstate = to_sde_crtc_state(crtc->state);
	SDE_EVT32_VERBOSE(DRMID(crtc));

	/* signal output fence(s) at end of commit */
	drm_for_each_encoder(encoder, crtc->dev) {
		if (encoder->crtc != crtc)
			continue;

		signal_fence &= !sde_encoder_is_cmd_mode(encoder);
	}

	/* signal release fence for non-cmd mode panels */
	if (signal_fence)
		sde_fence_signal(&sde_crtc->output_fence, 0);

	/* signal retire fence */
	for (i = 0; i < cstate->num_connectors; ++i)
		sde_connector_complete_commit(cstate->connectors[i]);
}
+16 −0
Original line number Diff line number Diff line
@@ -2214,6 +2214,22 @@ static void _sde_encoder_update_master(struct drm_encoder *drm_enc,
	}
}

bool sde_encoder_is_cmd_mode(struct drm_encoder *drm_enc)
{
	struct sde_encoder_virt *sde_enc;
	struct msm_display_info *disp_info;

	if (!drm_enc) {
		SDE_ERROR("invalid encoder\n");
		return false;
	}

	sde_enc = to_sde_encoder_virt(drm_enc);
	disp_info = &sde_enc->disp_info;

	return (disp_info->capabilities & MSM_DISPLAY_CAP_CMD_MODE);
}

void sde_encoder_trigger_kickoff_pending(struct drm_encoder *drm_enc)
{
	struct sde_encoder_virt *sde_enc;
+7 −0
Original line number Diff line number Diff line
@@ -172,6 +172,13 @@ bool sde_encoder_is_dsc_enabled(struct drm_encoder *drm_enc);
 */
bool sde_encoder_is_dsc_merge(struct drm_encoder *drm_enc);

/**
 * sde_encoder_is_cmd_mode - check if it is cmd mode
 * @drm_enc: Pointer to drm encoder object
 * @Return: true if it is cmd mode
 */
bool sde_encoder_is_cmd_mode(struct drm_encoder *drm_enc);

/**
 * sde_encoder_init - initialize virtual encoder object
 * @dev:        Pointer to drm device structure