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

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

Merge "disp: msm: sde: allow gdsc toggle when external vote is present"

parents 5f8daadb 1a8188ec
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -1590,11 +1590,16 @@ int msm_ioctl_power_ctrl(struct drm_device *dev, void *data,
		pr_err("ignoring, unbalanced disable\n");
	}

	mutex_lock(&priv->phandle.ext_client_lock);

	if (vote_req) {
		if (power_ctrl->enable)
		if (power_ctrl->enable) {
			rc = pm_runtime_get_sync(dev->dev);
		else
			priv->phandle.is_ext_vote_en = true;
		} else {
			pm_runtime_put_sync(dev->dev);
			 priv->phandle.is_ext_vote_en = false;
		}

		if (rc < 0)
			ctx->enable_refcnt = old_cnt;
@@ -1602,6 +1607,8 @@ int msm_ioctl_power_ctrl(struct drm_device *dev, void *data,
			rc = 0;
	}

	mutex_unlock(&priv->phandle.ext_client_lock);

	pr_debug("pid %d enable %d, refcnt %d, vote_req %d\n",
			current->pid, power_ctrl->enable, ctx->enable_refcnt,
			vote_req);
+1 −0
Original line number Diff line number Diff line
@@ -4339,6 +4339,7 @@ static int _sde_hardware_pre_caps(struct sde_mdss_cfg *sde_cfg, uint32_t hw_rev)
		sde_cfg->sui_block_xin_mask = 0xC01;
		sde_cfg->has_hdr = false;
		sde_cfg->has_sui_blendstage = true;
		sde_cfg->allow_gdsc_toggle = true;
		clear_bit(MDSS_INTR_AD4_0_INTR, sde_cfg->mdss_irqs);
		clear_bit(MDSS_INTR_AD4_1_INTR, sde_cfg->mdss_irqs);
	} else if (IS_LAGOON_TARGET(hw_rev)) {
+3 −0
Original line number Diff line number Diff line
@@ -1267,6 +1267,8 @@ struct sde_limit_cfg {
 * @update_tcsr_disp_glitch  flag to enable HW workaround to avoid spurious
 *                            transactions during suspend
 * @has_base_layer     Supports staging layer as base layer
 * @allow_gdsc_toggle  Flag to check if gdsc toggle is needed after crtc is
 *                           disabled when external vote is present
 * @sc_cfg: system cache configuration
 * @uidle_cfg		Settings for uidle feature
 * @sui_misr_supported  indicate if secure-ui-misr is supported
@@ -1324,6 +1326,7 @@ struct sde_mdss_cfg {
	bool has_decimation;
	bool update_tcsr_disp_glitch;
	bool has_base_layer;
	bool allow_gdsc_toggle;

	struct sde_sc_cfg sc_cfg;

+38 −0
Original line number Diff line number Diff line
@@ -1104,6 +1104,42 @@ static void _sde_kms_release_splash_resource(struct sde_kms *sde_kms,
	}
}

static void sde_kms_check_for_ext_vote(struct sde_kms *sde_kms,
		struct sde_power_handle *phandle)
{
	struct sde_crtc *sde_crtc;
	struct drm_crtc *crtc;
	struct drm_device *dev;
	bool crtc_enabled = false;

	if (!sde_kms->catalog->allow_gdsc_toggle)
		return;

	dev = sde_kms->dev;

	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
		sde_crtc = to_sde_crtc(crtc);
		if (sde_crtc->enabled)
			crtc_enabled = true;
	}

	mutex_lock(&phandle->ext_client_lock);

	/* In some targets, a gdsc toggle is needed after crtc is disabled.
	 * There are some scenarios where presence of an external vote like
	 * secure vote which can prevent this from happening. In those
	 * cases, allow the target to go through a gdsc toggle after
	 * crtc is disabled.
	 */
	if (!crtc_enabled && phandle->is_ext_vote_en) {
		pm_runtime_put_sync(sde_kms->dev->dev);
		SDE_EVT32(phandle->is_ext_vote_en);
		pm_runtime_get_sync(sde_kms->dev->dev);
	}

	mutex_unlock(&phandle->ext_client_lock);
}

static void sde_kms_complete_commit(struct msm_kms *kms,
		struct drm_atomic_state *old_state)
{
@@ -1165,6 +1201,8 @@ static void sde_kms_complete_commit(struct msm_kms *kms,
	for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i)
		_sde_kms_release_splash_resource(sde_kms, crtc);

	sde_kms_check_for_ext_vote(sde_kms, &priv->phandle);

	SDE_EVT32_VERBOSE(SDE_EVTLOG_FUNC_EXIT);
	SDE_ATRACE_END("sde_kms_complete_commit");
}
+2 −1
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2014-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2014-2020, The Linux Foundation. All rights reserved.
 */

#define pr_fmt(fmt)	"[drm:%s:%d]: " fmt, __func__, __LINE__
@@ -590,6 +590,7 @@ int sde_power_resource_init(struct platform_device *pdev,
	phandle->rsc_client_init = false;

	mutex_init(&phandle->phandle_lock);
	mutex_init(&phandle->ext_client_lock);

	return rc;

Loading