Merge "disp: msm: sde: update uidle_db_updates in both enable/disable cases"
This commit is contained in:
commit
e9a99b10ab
@ -1,6 +1,6 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2016-2021, The Linux Foundation. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__
|
#define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__
|
||||||
@ -494,7 +494,7 @@ static void _sde_core_uidle_setup_cfg(struct sde_kms *kms,
|
|||||||
uidle->ops.set_uidle_ctl(uidle, &cfg);
|
uidle->ops.set_uidle_ctl(uidle, &cfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _sde_core_uidle_setup_ctl(struct drm_crtc *crtc,
|
void sde_core_uidle_setup_ctl(struct drm_crtc *crtc,
|
||||||
bool enable)
|
bool enable)
|
||||||
{
|
{
|
||||||
struct drm_encoder *drm_enc;
|
struct drm_encoder *drm_enc;
|
||||||
@ -522,7 +522,7 @@ static int _sde_core_perf_enable_uidle(struct sde_kms *kms,
|
|||||||
SDE_EVT32(enable);
|
SDE_EVT32(enable);
|
||||||
_sde_core_uidle_setup_wd(kms, enable);
|
_sde_core_uidle_setup_wd(kms, enable);
|
||||||
_sde_core_uidle_setup_cfg(kms, enable);
|
_sde_core_uidle_setup_cfg(kms, enable);
|
||||||
_sde_core_uidle_setup_ctl(crtc, enable);
|
sde_core_uidle_setup_ctl(crtc, true);
|
||||||
|
|
||||||
kms->perf.uidle_enabled = enable;
|
kms->perf.uidle_enabled = enable;
|
||||||
|
|
||||||
@ -577,7 +577,7 @@ void sde_core_perf_crtc_update_uidle(struct drm_crtc *crtc,
|
|||||||
struct drm_crtc *tmp_crtc;
|
struct drm_crtc *tmp_crtc;
|
||||||
struct sde_kms *kms;
|
struct sde_kms *kms;
|
||||||
bool disable_uidle = false;
|
bool disable_uidle = false;
|
||||||
u32 fps;
|
u32 fps, num_crtc = 0;
|
||||||
|
|
||||||
if (!crtc) {
|
if (!crtc) {
|
||||||
SDE_ERROR("invalid crtc\n");
|
SDE_ERROR("invalid crtc\n");
|
||||||
@ -603,6 +603,7 @@ void sde_core_perf_crtc_update_uidle(struct drm_crtc *crtc,
|
|||||||
drm_for_each_crtc(tmp_crtc, crtc->dev) {
|
drm_for_each_crtc(tmp_crtc, crtc->dev) {
|
||||||
if (_sde_core_perf_crtc_is_power_on(tmp_crtc)) {
|
if (_sde_core_perf_crtc_is_power_on(tmp_crtc)) {
|
||||||
|
|
||||||
|
num_crtc++;
|
||||||
/*
|
/*
|
||||||
* If DFPS is enabled with VFP, SDE clock and
|
* If DFPS is enabled with VFP, SDE clock and
|
||||||
* transfer time will get fixed at max FPS
|
* transfer time will get fixed at max FPS
|
||||||
@ -620,7 +621,7 @@ void sde_core_perf_crtc_update_uidle(struct drm_crtc *crtc,
|
|||||||
_sde_core_perf_is_cwb(tmp_crtc),
|
_sde_core_perf_is_cwb(tmp_crtc),
|
||||||
disable_uidle, enable);
|
disable_uidle, enable);
|
||||||
|
|
||||||
if (_sde_core_perf_is_wb(tmp_crtc) ||
|
if ((num_crtc > 1) || _sde_core_perf_is_wb(tmp_crtc) ||
|
||||||
_sde_core_perf_is_cwb(tmp_crtc) || (!fps ||
|
_sde_core_perf_is_cwb(tmp_crtc) || (!fps ||
|
||||||
fps > kms->perf.catalog->uidle_cfg.max_fps)) {
|
fps > kms->perf.catalog->uidle_cfg.max_fps)) {
|
||||||
disable_uidle = true;
|
disable_uidle = true;
|
||||||
@ -632,6 +633,8 @@ void sde_core_perf_crtc_update_uidle(struct drm_crtc *crtc,
|
|||||||
_sde_core_perf_enable_uidle(kms, crtc,
|
_sde_core_perf_enable_uidle(kms, crtc,
|
||||||
(enable && !disable_uidle) ? true : false);
|
(enable && !disable_uidle) ? true : false);
|
||||||
|
|
||||||
|
kms->perf.catalog->uidle_cfg.dirty = !enable;
|
||||||
|
|
||||||
/* If perf counters enabled, set them up now */
|
/* If perf counters enabled, set them up now */
|
||||||
if (kms->catalog->uidle_cfg.debugfs_perf)
|
if (kms->catalog->uidle_cfg.debugfs_perf)
|
||||||
_sde_core_perf_uidle_setup_cntr(kms, enable);
|
_sde_core_perf_uidle_setup_cntr(kms, enable);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2016-2021, The Linux Foundation. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _SDE_CORE_PERF_H_
|
#ifndef _SDE_CORE_PERF_H_
|
||||||
@ -138,6 +138,13 @@ void sde_core_perf_crtc_release_bw(struct drm_crtc *crtc);
|
|||||||
*/
|
*/
|
||||||
void sde_core_perf_crtc_update_uidle(struct drm_crtc *crtc, bool enable);
|
void sde_core_perf_crtc_update_uidle(struct drm_crtc *crtc, bool enable);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sde_core_uidle_setup_ctl - enable uidle DB control
|
||||||
|
* @crtc: Pointer to crtc
|
||||||
|
* @enable: enable/disable uidle DB
|
||||||
|
*/
|
||||||
|
void sde_core_uidle_setup_ctl(struct drm_crtc *crtc, bool enable);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sde_core_perf_destroy - destroy the given core performance context
|
* sde_core_perf_destroy - destroy the given core performance context
|
||||||
* @perf: Pointer to core performance context
|
* @perf: Pointer to core performance context
|
||||||
|
@ -3322,8 +3322,13 @@ static void sde_crtc_atomic_begin(struct drm_crtc *crtc,
|
|||||||
_sde_crtc_blend_setup(crtc, old_state, true);
|
_sde_crtc_blend_setup(crtc, old_state, true);
|
||||||
_sde_crtc_dest_scaler_setup(crtc);
|
_sde_crtc_dest_scaler_setup(crtc);
|
||||||
|
|
||||||
if (crtc->state->mode_changed)
|
if (crtc->state->mode_changed || sde_kms->perf.catalog->uidle_cfg.dirty)
|
||||||
sde_core_perf_crtc_update_uidle(crtc, true);
|
sde_core_perf_crtc_update_uidle(crtc, true);
|
||||||
|
else if (!test_bit(SDE_CRTC_DIRTY_UIDLE, &sde_crtc->revalidate_mask) &&
|
||||||
|
!sde_kms->perf.uidle_enabled)
|
||||||
|
sde_core_uidle_setup_ctl(crtc, false);
|
||||||
|
|
||||||
|
test_and_clear_bit(SDE_CRTC_DIRTY_UIDLE, &sde_crtc->revalidate_mask);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Since CP properties use AXI buffer to program the
|
* Since CP properties use AXI buffer to program the
|
||||||
@ -3994,6 +3999,7 @@ void sde_crtc_reset_sw_state(struct drm_crtc *crtc)
|
|||||||
|
|
||||||
/* mark other properties which need to be dirty for next update */
|
/* mark other properties which need to be dirty for next update */
|
||||||
set_bit(SDE_CRTC_DIRTY_DIM_LAYERS, &sde_crtc->revalidate_mask);
|
set_bit(SDE_CRTC_DIRTY_DIM_LAYERS, &sde_crtc->revalidate_mask);
|
||||||
|
set_bit(SDE_CRTC_DIRTY_UIDLE, &sde_crtc->revalidate_mask);
|
||||||
if (cstate->num_ds_enabled)
|
if (cstate->num_ds_enabled)
|
||||||
set_bit(SDE_CRTC_DIRTY_DEST_SCALER, cstate->dirty);
|
set_bit(SDE_CRTC_DIRTY_DEST_SCALER, cstate->dirty);
|
||||||
}
|
}
|
||||||
|
@ -399,6 +399,7 @@ struct sde_crtc {
|
|||||||
enum sde_crtc_dirty_flags {
|
enum sde_crtc_dirty_flags {
|
||||||
SDE_CRTC_DIRTY_DEST_SCALER,
|
SDE_CRTC_DIRTY_DEST_SCALER,
|
||||||
SDE_CRTC_DIRTY_DIM_LAYERS,
|
SDE_CRTC_DIRTY_DIM_LAYERS,
|
||||||
|
SDE_CRTC_DIRTY_UIDLE,
|
||||||
SDE_CRTC_DIRTY_MAX,
|
SDE_CRTC_DIRTY_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -141,7 +141,6 @@ void sde_encoder_uidle_enable(struct drm_encoder *drm_enc, bool enable)
|
|||||||
struct sde_encoder_phys *phys = sde_enc->phys_encs[i];
|
struct sde_encoder_phys *phys = sde_enc->phys_encs[i];
|
||||||
|
|
||||||
if (phys && phys->hw_ctl && phys->hw_ctl->ops.uidle_enable) {
|
if (phys && phys->hw_ctl && phys->hw_ctl->ops.uidle_enable) {
|
||||||
SDE_EVT32(DRMID(drm_enc), enable);
|
|
||||||
phys->hw_ctl->ops.uidle_enable(phys->hw_ctl, enable);
|
phys->hw_ctl->ops.uidle_enable(phys->hw_ctl, enable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -938,6 +938,7 @@ struct sde_uidle_cfg {
|
|||||||
u32 debugfs_perf;
|
u32 debugfs_perf;
|
||||||
bool debugfs_ctrl;
|
bool debugfs_ctrl;
|
||||||
bool perf_cntr_en;
|
bool perf_cntr_en;
|
||||||
|
bool dirty;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* struct sde_mdp_cfg : MDP TOP-BLK instance info
|
/* struct sde_mdp_cfg : MDP TOP-BLK instance info
|
||||||
|
Loading…
Reference in New Issue
Block a user