diff --git a/msm/sde/sde_core_perf.c b/msm/sde/sde_core_perf.c index 31b8885a4e..fd0aa2e8e4 100644 --- a/msm/sde/sde_core_perf.c +++ b/msm/sde/sde_core_perf.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. */ @@ -531,8 +531,33 @@ static void _sde_core_uidle_setup_wd(struct sde_kms *kms, uidle->ops.setup_wd_timer(uidle, &wd); } +static bool _sde_core_uidle_fal10_override(struct sde_kms *kms, + struct drm_crtc *crtc) +{ + bool fal10_override, is_vid_mode = false; + struct drm_encoder *drm_enc; + + fal10_override = kms->catalog->uidle_cfg.fal10_override; + if (!fal10_override) + return false; + + drm_for_each_encoder(drm_enc, kms->dev) { + if (drm_enc->crtc != crtc) + continue; + + if (sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_VIDEO_MODE)) { + is_vid_mode = true; + break; + } + } + + SDE_EVT32(fal10_override, is_vid_mode); + + return fal10_override && is_vid_mode; +} + static void _sde_core_uidle_setup_cfg(struct sde_kms *kms, - enum sde_uidle_state state) + struct drm_crtc *crtc, enum sde_uidle_state state) { struct sde_uidle_ctl_cfg cfg; struct sde_hw_uidle *uidle; @@ -545,6 +570,7 @@ static void _sde_core_uidle_setup_cfg(struct sde_kms *kms, kms->catalog->uidle_cfg.fal10_exit_cnt; cfg.fal10_exit_danger = kms->catalog->uidle_cfg.fal10_exit_danger; + cfg.fal10_override = _sde_core_uidle_fal10_override(kms, crtc); SDE_DEBUG("fal10_danger:%d fal10_exit_cnt:%d fal10_exit_danger:%d\n", cfg.fal10_danger, cfg.fal10_exit_cnt, cfg.fal10_exit_danger); @@ -584,7 +610,7 @@ static int _sde_core_perf_enable_uidle(struct sde_kms *kms, SDE_EVT32(uidle_state); _sde_core_uidle_setup_wd(kms, enable); - _sde_core_uidle_setup_cfg(kms, uidle_state); + _sde_core_uidle_setup_cfg(kms, crtc, uidle_state); sde_core_perf_uidle_setup_ctl(crtc, true); kms->perf.uidle_enabled = enable; diff --git a/msm/sde/sde_hw_catalog.c b/msm/sde/sde_hw_catalog.c index 22a9255ae2..c28bd003b5 100644 --- a/msm/sde/sde_hw_catalog.c +++ b/msm/sde/sde_hw_catalog.c @@ -5578,6 +5578,8 @@ static int _sde_hardware_pre_caps(struct sde_mdss_cfg *sde_cfg, uint32_t hw_rev) sde_cfg->ts_prefill_rev = 2; sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0; sde_cfg->true_inline_rot_rev = SDE_INLINE_ROT_VERSION_2_0_1; + sde_cfg->uidle_cfg.uidle_rev = SDE_UIDLE_VERSION_1_0_4; + sde_cfg->uidle_cfg.fal10_override = true; sde_cfg->sid_rev = SDE_SID_VERSION_2_0_0; sde_cfg->mdss_hw_block_size = 0x158; sde_cfg->demura_supported[SSPP_DMA1][0] = BIT(DEMURA_0); diff --git a/msm/sde/sde_hw_catalog.h b/msm/sde/sde_hw_catalog.h index 967da894cf..a18ddd61e8 100644 --- a/msm/sde/sde_hw_catalog.h +++ b/msm/sde/sde_hw_catalog.h @@ -1340,6 +1340,7 @@ struct sde_mdp_cfg { * @debugfs_ctrl: uidle is enabled/disabled through debugfs * @perf_cntr_en: performance counters are enabled/disabled * @dirty: dirty flag for uidle update + * @fal10_override: flag to override fal10 veto */ struct sde_uidle_cfg { SDE_HW_BLK_INFO; @@ -1360,6 +1361,7 @@ struct sde_uidle_cfg { bool debugfs_ctrl; bool perf_cntr_en; bool dirty; + bool fal10_override; }; /* struct sde_mdp_cfg : MDP TOP-BLK instance info diff --git a/msm/sde/sde_hw_uidle.c b/msm/sde/sde_hw_uidle.c index bfa6921e85..7f12f0343e 100644 --- a/msm/sde/sde_hw_uidle.c +++ b/msm/sde/sde_hw_uidle.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2022, 2024 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved. * */ @@ -185,7 +185,7 @@ void sde_hw_uidle_setup_ctl(struct sde_hw_uidle *uidle, FAL10_EXIT_CNT_MSK); SDE_REG_WRITE(c, UIDLE_CTL, reg_val); - if (!enable) + if (!enable || cfg->fal10_override) fal10_veto_regval |= (BIT(31) | BIT(0)); SDE_REG_WRITE(c, UIDLE_FAL10_VETO_OVERRIDE, fal10_veto_regval); diff --git a/msm/sde/sde_hw_uidle.h b/msm/sde/sde_hw_uidle.h index 5c51949717..45cae2f580 100644 --- a/msm/sde/sde_hw_uidle.h +++ b/msm/sde/sde_hw_uidle.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2022, 2024 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved. * */ @@ -37,6 +37,7 @@ struct sde_uidle_ctl_cfg { u32 fal10_exit_cnt; u32 fal10_exit_danger; u32 fal10_danger; + bool fal10_override; enum sde_uidle_state uidle_state; };