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

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

Merge "disp: msm: sde: avoid seamless crtc transition in splash handoff commit"

parents dbef8d0e 17007195
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -33,13 +33,17 @@ struct msm_commit {
	struct kthread_work commit_work;
};

static inline bool _msm_seamless_for_crtc(struct drm_atomic_state *state,
static inline bool _msm_seamless_for_crtc(struct drm_device *dev,
					struct drm_atomic_state *state,
			struct drm_crtc_state *crtc_state, bool enable)
{
	struct drm_connector *connector = NULL;
	struct drm_connector_state  *conn_state = NULL;
	struct msm_drm_private *priv = dev->dev_private;
	struct msm_kms *kms = priv->kms;
	int i = 0;
	int conn_cnt = 0;
	bool splash_en = false;

	if (msm_is_mode_seamless(&crtc_state->mode) ||
		msm_is_mode_seamless_vrr(&crtc_state->adjusted_mode) ||
@@ -58,7 +62,11 @@ static inline bool _msm_seamless_for_crtc(struct drm_atomic_state *state,
					 crtc_state->crtc))
				conn_cnt++;

			if (MULTIPLE_CONN_DETECTED(conn_cnt))
			if (kms && kms->funcs && kms->funcs->check_for_splash)
				splash_en = kms->funcs->check_for_splash(kms,
							 crtc_state->crtc);

			if (MULTIPLE_CONN_DETECTED(conn_cnt) && !splash_en)
				return true;
		}
	}
@@ -214,7 +222,7 @@ msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
		if (!old_crtc_state->active)
			continue;

		if (_msm_seamless_for_crtc(old_state, crtc->state, false))
		if (_msm_seamless_for_crtc(dev, old_state, crtc->state, false))
			continue;

		funcs = crtc->helper_private;
@@ -362,7 +370,7 @@ static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
		if (!new_crtc_state->active)
			continue;

		if (_msm_seamless_for_crtc(old_state, crtc->state, true))
		if (_msm_seamless_for_crtc(dev, old_state, crtc->state, true))
			continue;

		funcs = crtc->helper_private;
+1 −1
Original line number Diff line number Diff line
@@ -1017,7 +1017,7 @@ static void msm_lastclose(struct drm_device *dev)
	 * if kms module is not yet initialized.
	 */
	if (!kms || (kms && kms->funcs && kms->funcs->check_for_splash
		&& kms->funcs->check_for_splash(kms)))
		&& kms->funcs->check_for_splash(kms, NULL)))
		return;

	/*
+2 −2
Original line number Diff line number Diff line
/*
 * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
 * Copyright (C) 2013 Red Hat
 * Author: Rob Clark <robdclark@gmail.com>
 *
@@ -121,7 +121,7 @@ struct msm_kms_funcs {
	/* handle continuous splash  */
	int (*cont_splash_config)(struct msm_kms *kms);
	/* check for continuous splash status */
	bool (*check_for_splash)(struct msm_kms *kms);
	bool (*check_for_splash)(struct msm_kms *kms, struct drm_crtc *crtc);
	/* topology information */
	int (*get_mixer_count)(const struct msm_kms *kms,
			const struct drm_display_mode *mode,
+14 −2
Original line number Diff line number Diff line
@@ -2667,9 +2667,10 @@ static int sde_kms_cont_splash_config(struct msm_kms *kms)
	return rc;
}

static bool sde_kms_check_for_splash(struct msm_kms *kms)
static bool sde_kms_check_for_splash(struct msm_kms *kms, struct drm_crtc *crtc)
{
	struct sde_kms *sde_kms;
	struct drm_encoder *encoder;

	if (!kms) {
		SDE_ERROR("invalid kms\n");
@@ -2677,7 +2678,18 @@ static bool sde_kms_check_for_splash(struct msm_kms *kms)
	}

	sde_kms = to_sde_kms(kms);
	return sde_kms->splash_data.num_splash_displays;

	if (!crtc || !sde_kms->splash_data.num_splash_displays)
		return !!sde_kms->splash_data.num_splash_displays;

	drm_for_each_encoder_mask(encoder, crtc->dev,
			crtc->state->encoder_mask) {
		if (sde_encoder_in_cont_splash(encoder))
			return true;
	}

	return false;

}

static int sde_kms_get_mixer_count(const struct msm_kms *kms,