Merge "disp: msm: sde: cache encoder_mask for vblank_work"
This commit is contained in:
commit
a2a3c5e864
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user