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

Commit 4877f0a5 authored by Jayaprakash's avatar Jayaprakash
Browse files

disp: msm: sde: correct the available mixers count provided



On connecting Display port when primary is in suspend state, RM
provides all the available mixers for DP mode validations.
Mixers which are primary and secondary display configured are
also provided for DP mode, which can cause commit failures on
external DP. Add changes to provide the correct mixer count
in such cases.

Change-Id: I239feb60a5373545c0ab929a0c318c6c2ac66531
Signed-off-by: default avatarJayaprakash <jmadiset@codeaurora.org>
parent 0f6a0559
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -371,6 +371,7 @@ static void sde_connector_get_avail_res_info(struct drm_connector *conn,
	struct msm_drm_private *priv;
	struct sde_kms *sde_kms;
	struct drm_encoder *drm_enc = NULL;
	struct msm_display_info display_info;

	if (!conn || !conn->dev || !conn->dev->dev_private)
		return;
@@ -381,12 +382,17 @@ static void sde_connector_get_avail_res_info(struct drm_connector *conn,
	if (!sde_kms)
		return;

	memset(&display_info, 0, sizeof(display_info));

	if (conn->state && conn->state->best_encoder)
		drm_enc = conn->state->best_encoder;
	else
		drm_enc = conn->encoder;

	sde_rm_get_resource_info(&sde_kms->rm, drm_enc, avail_res);
	sde_connector_get_info(conn, &display_info);

	sde_rm_get_resource_info(&sde_kms->rm, drm_enc, avail_res,
					 display_info.display_type);

	avail_res->max_mixer_width = sde_kms->catalog->max_mixer_width;
}
+24 −2
Original line number Diff line number Diff line
@@ -203,17 +203,36 @@ static void _sde_rm_dec_resource_info(struct sde_rm *rm,

void sde_rm_get_resource_info(struct sde_rm *rm,
		struct drm_encoder *drm_enc,
		struct msm_resource_caps_info *avail_res)
		struct msm_resource_caps_info *avail_res,
		 int display_type)
{
	struct sde_rm_hw_blk *blk;
	enum sde_hw_blk_type type;
	struct sde_rm_rsvp rsvp;
	const struct sde_lm_cfg *lm_cfg;

	mutex_lock(&rm->rm_lock);
	memcpy(avail_res, &rm->avail_res,
			sizeof(rm->avail_res));

	/**
	 * Layer Mixers which are primary display, secondary
	 * display preferred and are available must not be provided
	 * for connectors which are neither primary nor secondary.
	 */
	if (display_type != SDE_CONNECTOR_PRIMARY &&
		display_type != SDE_CONNECTOR_SECONDARY) {
		list_for_each_entry(blk, &rm->hw_blks[SDE_HW_BLK_LM], list) {
			lm_cfg = to_sde_hw_mixer(blk->hw)->cap;
			if (!blk->rsvp && (lm_cfg->features &
					 (BIT(SDE_DISP_PRIMARY_PREF)
					 | BIT(SDE_DISP_SECONDARY_PREF))))
				avail_res->num_lm--;
		}
	}

	if (!drm_enc)
		return;
		goto end;

	rsvp.enc_id = drm_enc->base.id;

@@ -221,6 +240,9 @@ void sde_rm_get_resource_info(struct sde_rm *rm,
		list_for_each_entry(blk, &rm->hw_blks[type], list)
			if (blk->rsvp && blk->rsvp->enc_id == rsvp.enc_id)
				_sde_rm_inc_resource_info(rm, avail_res, blk);
end:
	mutex_unlock(&rm->rm_lock);
	return;
}

static void _sde_rm_print_rsvps(
+4 −2
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
 */

#ifndef __SDE_RM_H__
@@ -323,8 +323,10 @@ int sde_rm_ext_blk_destroy(struct sde_rm *rm,
 * @mr: sde rm object
 * @drm_enc: drm encoder object
 * @avail_res: out parameter, available resource object
 * @display_type: type of the display in usage
 */
void sde_rm_get_resource_info(struct sde_rm *rm,
		struct drm_encoder *drm_enc,
		struct msm_resource_caps_info *avail_res);
		struct msm_resource_caps_info *avail_res,
		int display_type);
#endif /* __SDE_RM_H__ */