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

Commit 1e2af48f authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "disp: msm: sde: add ctl reset during wait for commit done timeout"

parents 72f31fb3 e603c2e5
Loading
Loading
Loading
Loading
+2 −10
Original line number Diff line number Diff line
@@ -3637,11 +3637,8 @@ int sde_crtc_reset_hw(struct drm_crtc *crtc, struct drm_crtc_state *old_state,
	}

	/* Early out if simple ctl reset succeeded */
	if (i == sde_crtc->num_ctls) {
		sde_kms_update_recovery_mask(_sde_crtc_get_kms(crtc),
			crtc, false);
	if (i == sde_crtc->num_ctls)
		return 0;
	}

	SDE_DEBUG("crtc%d: issuing hard reset\n", DRMID(crtc));

@@ -3699,8 +3696,6 @@ int sde_crtc_reset_hw(struct drm_crtc *crtc, struct drm_crtc_state *old_state,
			sde_encoder_kickoff(encoder, false, true);
	}

	sde_kms_update_recovery_mask(_sde_crtc_get_kms(crtc),
			crtc, false);
	/* panic the device if VBIF is not in good state */
	return !recovery_events ? 0 : -EAGAIN;
}
@@ -3776,8 +3771,6 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc,
						params.recovery_events_enabled))
			is_error = true;
		sde_crtc->needs_hw_reset = false;
	} else {
		sde_kms_update_recovery_mask(sde_kms, crtc, false);
	}

	sde_crtc_calc_fps(sde_crtc);
@@ -3798,10 +3791,9 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc,

	sde_vbif_clear_errors(sde_kms);

	if (is_error || sde_kms->recovery_mask) {
	if (is_error) {
		_sde_crtc_remove_pipe_flush(crtc);
		_sde_crtc_blend_setup(crtc, old_state, false);
		SDE_EVT32(sde_kms->recovery_mask);
	}

	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
+6 −2
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include "sde_kms.h"
#include "sde_core_perf.h"
#include "sde_hw_ds.h"
#include "sde_encoder.h"

#define SDE_CRTC_NAME_SIZE	12

@@ -575,12 +576,15 @@ int sde_crtc_reset_hw(struct drm_crtc *crtc, struct drm_crtc_state *old_state,
/**
 * sde_crtc_request_frame_reset - requests for next frame reset
 * @crtc: Pointer to drm crtc object
 * @encoder: Pointer to drm encoder object
 */
static inline int sde_crtc_request_frame_reset(struct drm_crtc *crtc)
static inline int sde_crtc_request_frame_reset(struct drm_crtc *crtc,
		struct drm_encoder *encoder)
{
	struct sde_crtc *sde_crtc = to_sde_crtc(crtc);

	if (sde_crtc->frame_trigger_mode == FRAME_DONE_WAIT_POSTED_START)
	if (sde_crtc->frame_trigger_mode == FRAME_DONE_WAIT_POSTED_START ||
			!sde_encoder_is_dsi_display(encoder))
		sde_crtc_reset_hw(crtc, crtc->state, false);

	return 0;
+1 −28
Original line number Diff line number Diff line
@@ -1512,31 +1512,6 @@ static void sde_kms_complete_commit(struct msm_kms *kms,
	SDE_ATRACE_END("sde_kms_complete_commit");
}

void sde_kms_update_recovery_mask(struct sde_kms *sde_kms,
		struct drm_crtc *crtc, bool flag)
{
	int i;
	struct sde_hw_ctl *ctl;
	struct sde_crtc *sde_crtc;

	if (!crtc || !sde_kms) {
		SDE_ERROR("invalid params\n");
		return;
	}

	sde_crtc = to_sde_crtc(crtc);

	for (i = 0; i < sde_crtc->num_ctls; ++i) {
		ctl = sde_crtc->mixers[i].hw_ctl;
		if (!ctl || !ctl->ops.reset)
			continue;
		if (flag)
			sde_kms->recovery_mask |= BIT(ctl->idx - CTL_0);
		else
			sde_kms->recovery_mask &= ~BIT(ctl->idx - CTL_0);
	}
}

static void sde_kms_wait_for_commit_done(struct msm_kms *kms,
		struct drm_crtc *crtc)
{
@@ -1586,9 +1561,7 @@ static void sde_kms_wait_for_commit_done(struct msm_kms *kms,
		ret = sde_encoder_wait_for_event(encoder, MSM_ENC_COMMIT_DONE);
		if (ret && ret != -EWOULDBLOCK) {
			SDE_ERROR("wait for commit done returned %d\n", ret);
			sde_kms_update_recovery_mask(to_sde_kms(kms),
				crtc, true);
			sde_crtc_request_frame_reset(crtc);
			sde_crtc_request_frame_reset(crtc, encoder);
			break;
		}

+0 −11
Original line number Diff line number Diff line
@@ -274,7 +274,6 @@ struct sde_kms {
	int irq_num;	/* mdss irq number */
	bool irq_enabled;

	int recovery_mask;
	struct sde_core_perf perf;

	/* saved atomic state during system suspend */
@@ -755,14 +754,4 @@ int sde_kms_vm_trusted_prepare_commit(struct sde_kms *sde_kms,
 */
int sde_kms_vm_primary_prepare_commit(struct sde_kms *sde_kms,
					   struct drm_atomic_state *state);

/**
 * sde_kms_update_recovery_mask - function to update recovery ctl mask
 *				  during error cases
 * @sde_kms: pointer to sde_kms
 * @crtc: pointer to drm_crtc
 * @flag: to determine whether to clear/set recovery mask
 */
void sde_kms_update_recovery_mask(struct sde_kms *sde_kms,
					struct drm_crtc *crtc, bool flag);
#endif /* __sde_kms_H__ */