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

Commit cf8a8395 authored by Jayaprakash's avatar Jayaprakash
Browse files

drm/msm/sde: add sde_crtc lock to protect sde_crtc mixers



Add sde_crtc lock to avoid race condition between
HW_binder thread and crtc_commit thread.
This race may occur if there is a delay in disabling
autorefresh during bootup.

Change-Id: I3de16b199c6c5e8d6660610bcaf44f594b42a4f6
Signed-off-by: default avatarJayaprakash <jmadiset@codeaurora.org>
parent 068f5a8d
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -3289,24 +3289,27 @@ static int _sde_crtc_check_dest_scaler_data(struct drm_crtc *crtc,

	SDE_DEBUG("crtc%d\n", crtc->base.id);

	mutex_lock(&sde_crtc->crtc_lock);

	if (!cstate->ds_dirty) {
		SDE_DEBUG("dest scaler property not set, skip validation\n");
		return 0;
		goto end;
	}

	if (!kms || !kms->catalog) {
		SDE_ERROR("crtc%d: invalid parameters\n", crtc->base.id);
		return -EINVAL;
		ret = -EINVAL;
		goto end;
	}

	if (!kms->catalog->mdp[0].has_dest_scaler) {
		SDE_DEBUG("dest scaler feature not supported\n");
		return 0;
		goto end;
	}

	if (!sde_crtc->num_mixers) {
		SDE_DEBUG("mixers not allocated\n");
		return 0;
		goto end;
	}

	ret = _sde_validate_hw_resources(sde_crtc);
@@ -3485,10 +3488,12 @@ static int _sde_crtc_check_dest_scaler_data(struct drm_crtc *crtc,
			cstate->ds_dirty = false;
	}

	return 0;
	goto end;

err:
	cstate->ds_dirty = false;
end:
	mutex_unlock(&sde_crtc->crtc_lock);
	return ret;
}

@@ -3608,12 +3613,12 @@ static void _sde_crtc_setup_mixers(struct drm_crtc *crtc)
	struct sde_crtc *sde_crtc = to_sde_crtc(crtc);
	struct drm_encoder *enc;

	mutex_lock(&sde_crtc->crtc_lock);
	sde_crtc->num_ctls = 0;
	sde_crtc->num_mixers = 0;
	sde_crtc->mixers_swapped = false;
	memset(sde_crtc->mixers, 0, sizeof(sde_crtc->mixers));

	mutex_lock(&sde_crtc->crtc_lock);
	/* Check for mixers on all encoders attached to this crtc */
	list_for_each_entry(enc, &crtc->dev->mode_config.encoder_list, head) {
		if (enc->crtc != crtc)