Loading msm/msm_drv.c +9 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); Loading msm/sde/sde_hw_catalog.c +1 −0 Original line number Diff line number Diff line Loading @@ -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)) { Loading msm/sde/sde_hw_catalog.h +3 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; Loading msm/sde/sde_kms.c +38 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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"); } Loading msm/sde_power_handle.c +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__ Loading Loading @@ -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 Loading
msm/msm_drv.c +9 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); Loading
msm/sde/sde_hw_catalog.c +1 −0 Original line number Diff line number Diff line Loading @@ -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)) { Loading
msm/sde/sde_hw_catalog.h +3 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; Loading
msm/sde/sde_kms.c +38 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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"); } Loading
msm/sde_power_handle.c +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__ Loading Loading @@ -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