Merge "disp: msm: sde: cache encoder_mask for vblank_work"

This commit is contained in:
qctecmdr 2020-11-24 06:44:04 -08:00 committed by Gerrit - the friendly Code Review server
commit a2a3c5e864
4 changed files with 23 additions and 25 deletions

View File

@ -156,7 +156,6 @@ msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
old_conn_state, i) { old_conn_state, i) {
const struct drm_encoder_helper_funcs *funcs; const struct drm_encoder_helper_funcs *funcs;
struct drm_encoder *encoder; struct drm_encoder *encoder;
struct drm_crtc_state *old_crtc_state;
/* /*
* Shut down everything that's in the changeset and currently * Shut down everything that's in the changeset and currently

View File

@ -366,7 +366,6 @@ static int vblank_ctrl_queue_work(struct msm_drm_private *priv,
int crtc_id, bool enable) int crtc_id, bool enable)
{ {
struct vblank_work *cur_work; struct vblank_work *cur_work;
struct drm_crtc *crtc;
struct kthread_worker *worker; struct kthread_worker *worker;
if (!priv || crtc_id >= priv->num_crtcs) if (!priv || crtc_id >= priv->num_crtcs)
@ -376,8 +375,6 @@ static int vblank_ctrl_queue_work(struct msm_drm_private *priv,
if (!cur_work) if (!cur_work)
return -ENOMEM; return -ENOMEM;
crtc = priv->crtcs[crtc_id];
kthread_init_work(&cur_work->work, vblank_ctrl_worker); kthread_init_work(&cur_work->work, vblank_ctrl_worker);
cur_work->crtc_id = crtc_id; cur_work->crtc_id = crtc_id;
cur_work->enable = enable; cur_work->enable = enable;

View File

@ -3823,13 +3823,13 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc,
} }
/** /**
* _sde_crtc_vblank_enable_no_lock - update power resource and vblank request * _sde_crtc_vblank_enable - update power resource and vblank request
* @sde_crtc: Pointer to sde crtc structure * @sde_crtc: Pointer to sde crtc structure
* @enable: Whether to enable/disable vblanks * @enable: Whether to enable/disable vblanks
* *
* @Return: error code * @Return: error code
*/ */
static int _sde_crtc_vblank_enable_no_lock( static int _sde_crtc_vblank_enable(
struct sde_crtc *sde_crtc, bool enable) struct sde_crtc *sde_crtc, bool enable)
{ {
struct drm_crtc *crtc; struct drm_crtc *crtc;
@ -3841,38 +3841,38 @@ static int _sde_crtc_vblank_enable_no_lock(
} }
crtc = &sde_crtc->base; crtc = &sde_crtc->base;
SDE_EVT32(DRMID(crtc), enable, sde_crtc->enabled,
crtc->state->encoder_mask,
sde_crtc->cached_encoder_mask);
if (enable) { if (enable) {
int ret; int ret;
/* drop lock since power crtc cb may try to re-acquire lock */
mutex_unlock(&sde_crtc->crtc_lock);
ret = pm_runtime_get_sync(crtc->dev->dev); ret = pm_runtime_get_sync(crtc->dev->dev);
mutex_lock(&sde_crtc->crtc_lock);
if (ret < 0) if (ret < 0)
return ret; return ret;
mutex_lock(&sde_crtc->crtc_lock);
drm_for_each_encoder_mask(enc, crtc->dev, drm_for_each_encoder_mask(enc, crtc->dev,
crtc->state->encoder_mask) { sde_crtc->cached_encoder_mask) {
SDE_EVT32(DRMID(&sde_crtc->base), DRMID(enc), enable, SDE_EVT32(DRMID(crtc), DRMID(enc));
sde_crtc->enabled);
sde_encoder_register_vblank_callback(enc, sde_encoder_register_vblank_callback(enc,
sde_crtc_vblank_cb, (void *)crtc); sde_crtc_vblank_cb, (void *)crtc);
} }
mutex_unlock(&sde_crtc->crtc_lock);
} else { } else {
mutex_lock(&sde_crtc->crtc_lock);
drm_for_each_encoder_mask(enc, crtc->dev, drm_for_each_encoder_mask(enc, crtc->dev,
crtc->state->encoder_mask) { sde_crtc->cached_encoder_mask) {
SDE_EVT32(DRMID(&sde_crtc->base), DRMID(enc), enable, SDE_EVT32(DRMID(crtc), DRMID(enc));
sde_crtc->enabled);
sde_encoder_register_vblank_callback(enc, NULL, NULL); sde_encoder_register_vblank_callback(enc, NULL, NULL);
} }
/* drop lock since power crtc cb may try to re-acquire lock */
mutex_unlock(&sde_crtc->crtc_lock); mutex_unlock(&sde_crtc->crtc_lock);
pm_runtime_put_sync(crtc->dev->dev); pm_runtime_put_sync(crtc->dev->dev);
mutex_lock(&sde_crtc->crtc_lock);
} }
return 0; return 0;
@ -4168,9 +4168,10 @@ static void sde_crtc_disable(struct drm_crtc *crtc)
kthread_cancel_delayed_work_sync(&sde_crtc->static_cache_read_work); kthread_cancel_delayed_work_sync(&sde_crtc->static_cache_read_work);
kthread_cancel_delayed_work_sync(&sde_crtc->idle_notify_work); kthread_cancel_delayed_work_sync(&sde_crtc->idle_notify_work);
SDE_EVT32(DRMID(crtc), sde_crtc->enabled, SDE_EVT32(DRMID(crtc), sde_crtc->enabled, crtc->state->active,
crtc->state->active, crtc->state->enable); crtc->state->enable, sde_crtc->cached_encoder_mask);
sde_crtc->enabled = false; sde_crtc->enabled = false;
sde_crtc->cached_encoder_mask = 0;
/* Try to disable uidle */ /* Try to disable uidle */
sde_core_perf_crtc_update_uidle(crtc, false); sde_core_perf_crtc_update_uidle(crtc, false);
@ -4279,8 +4280,11 @@ static void sde_crtc_enable(struct drm_crtc *crtc,
* Avoid drm_crtc_vblank_on during seamless DMS case * Avoid drm_crtc_vblank_on during seamless DMS case
* when CRTC is already in enabled state * when CRTC is already in enabled state
*/ */
if (!sde_crtc->enabled) if (!sde_crtc->enabled) {
/* cache the encoder mask now for vblank work */
sde_crtc->cached_encoder_mask = crtc->state->encoder_mask;
drm_crtc_vblank_on(crtc); drm_crtc_vblank_on(crtc);
}
mutex_lock(&sde_crtc->crtc_lock); mutex_lock(&sde_crtc->crtc_lock);
SDE_EVT32(DRMID(crtc), sde_crtc->enabled); SDE_EVT32(DRMID(crtc), sde_crtc->enabled);
@ -5119,15 +5123,11 @@ int sde_crtc_vblank(struct drm_crtc *crtc, bool en)
} }
sde_crtc = to_sde_crtc(crtc); sde_crtc = to_sde_crtc(crtc);
mutex_lock(&sde_crtc->crtc_lock); ret = _sde_crtc_vblank_enable(sde_crtc, en);
SDE_EVT32(DRMID(&sde_crtc->base), en, sde_crtc->enabled);
ret = _sde_crtc_vblank_enable_no_lock(sde_crtc, en);
if (ret) if (ret)
SDE_ERROR("%s vblank enable failed: %d\n", SDE_ERROR("%s vblank enable failed: %d\n",
sde_crtc->name, ret); sde_crtc->name, ret);
mutex_unlock(&sde_crtc->crtc_lock);
return 0; return 0;
} }

View File

@ -291,6 +291,7 @@ struct sde_crtc_misr_info {
* @static_cache_read_work: delayed worker to transition cache state to read * @static_cache_read_work: delayed worker to transition cache state to read
* @cache_state : Current static image cache state * @cache_state : Current static image cache state
* @dspp_blob_info : blob containing dspp hw capability information * @dspp_blob_info : blob containing dspp hw capability information
* @cached_encoder_mask : cached encoder_mask for vblank work
*/ */
struct sde_crtc { struct sde_crtc {
struct drm_crtc base; struct drm_crtc base;
@ -381,6 +382,7 @@ struct sde_crtc {
enum sde_crtc_cache_state cache_state; enum sde_crtc_cache_state cache_state;
struct drm_property_blob *dspp_blob_info; struct drm_property_blob *dspp_blob_info;
u32 cached_encoder_mask;
}; };
enum sde_crtc_dirty_flags { enum sde_crtc_dirty_flags {