Merge "disp: msm: sde: avoid tx wait during cwb disable and reset"
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

commit
c83a1df2b3
@@ -2788,6 +2788,33 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
|
|||||||
_sde_encoder_virt_enable_helper(drm_enc);
|
_sde_encoder_virt_enable_helper(drm_enc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sde_encoder_virt_reset(struct drm_encoder *drm_enc)
|
||||||
|
{
|
||||||
|
struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(drm_enc);
|
||||||
|
struct sde_kms *sde_kms = sde_encoder_get_kms(drm_enc);
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < sde_enc->num_phys_encs; i++) {
|
||||||
|
if (sde_enc->phys_encs[i]) {
|
||||||
|
sde_enc->phys_encs[i]->cont_splash_enabled = false;
|
||||||
|
sde_enc->phys_encs[i]->connector = NULL;
|
||||||
|
}
|
||||||
|
atomic_set(&sde_enc->frame_done_cnt[i], 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
sde_enc->cur_master = NULL;
|
||||||
|
/*
|
||||||
|
* clear the cached crtc in sde_enc on use case finish, after all the
|
||||||
|
* outstanding events and timers have been completed
|
||||||
|
*/
|
||||||
|
sde_enc->crtc = NULL;
|
||||||
|
memset(&sde_enc->mode_info, 0, sizeof(sde_enc->mode_info));
|
||||||
|
|
||||||
|
SDE_DEBUG_ENC(sde_enc, "encoder disabled\n");
|
||||||
|
|
||||||
|
sde_rm_release(&sde_kms->rm, drm_enc, false);
|
||||||
|
}
|
||||||
|
|
||||||
static void sde_encoder_virt_disable(struct drm_encoder *drm_enc)
|
static void sde_encoder_virt_disable(struct drm_encoder *drm_enc)
|
||||||
{
|
{
|
||||||
struct sde_encoder_virt *sde_enc = NULL;
|
struct sde_encoder_virt *sde_enc = NULL;
|
||||||
@@ -2823,6 +2850,7 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc)
|
|||||||
SDE_EVT32(DRMID(drm_enc));
|
SDE_EVT32(DRMID(drm_enc));
|
||||||
|
|
||||||
/* wait for idle */
|
/* wait for idle */
|
||||||
|
if (!sde_encoder_in_clone_mode(drm_enc))
|
||||||
sde_encoder_wait_for_event(drm_enc, MSM_ENC_TX_COMPLETE);
|
sde_encoder_wait_for_event(drm_enc, MSM_ENC_TX_COMPLETE);
|
||||||
|
|
||||||
_sde_encoder_input_handler_unregister(drm_enc);
|
_sde_encoder_input_handler_unregister(drm_enc);
|
||||||
@@ -2867,25 +2895,8 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc)
|
|||||||
|
|
||||||
sde_encoder_resource_control(drm_enc, SDE_ENC_RC_EVENT_STOP);
|
sde_encoder_resource_control(drm_enc, SDE_ENC_RC_EVENT_STOP);
|
||||||
|
|
||||||
for (i = 0; i < sde_enc->num_phys_encs; i++) {
|
if (!sde_encoder_in_clone_mode(drm_enc))
|
||||||
if (sde_enc->phys_encs[i]) {
|
sde_encoder_virt_reset(drm_enc);
|
||||||
sde_enc->phys_encs[i]->cont_splash_enabled = false;
|
|
||||||
sde_enc->phys_encs[i]->connector = NULL;
|
|
||||||
}
|
|
||||||
atomic_set(&sde_enc->frame_done_cnt[i], 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
sde_enc->cur_master = NULL;
|
|
||||||
/*
|
|
||||||
* clear the cached crtc in sde_enc on use case finish, after all the
|
|
||||||
* outstanding events and timers have been completed
|
|
||||||
*/
|
|
||||||
sde_enc->crtc = NULL;
|
|
||||||
memset(&sde_enc->mode_info, 0, sizeof(sde_enc->mode_info));
|
|
||||||
|
|
||||||
SDE_DEBUG_ENC(sde_enc, "encoder disabled\n");
|
|
||||||
|
|
||||||
sde_rm_release(&sde_kms->rm, drm_enc, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void sde_encoder_helper_phys_disable(struct sde_encoder_phys *phys_enc,
|
void sde_encoder_helper_phys_disable(struct sde_encoder_phys *phys_enc,
|
||||||
|
@@ -573,6 +573,12 @@ static inline u32 sde_encoder_get_dfps_maxfps(struct drm_encoder *drm_enc)
|
|||||||
return sde_enc->mode_info.dfps_maxfps;
|
return sde_enc->mode_info.dfps_maxfps;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sde_encoder_virt_reset - delay encoder virt reset
|
||||||
|
* @drm_enc: Pointer to drm encoder structure
|
||||||
|
*/
|
||||||
|
void sde_encoder_virt_reset(struct drm_encoder *drm_enc);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sde_encoder_get_kms - retrieve the kms from encoder
|
* sde_encoder_get_kms - retrieve the kms from encoder
|
||||||
* @drm_enc: Pointer to drm encoder structure
|
* @drm_enc: Pointer to drm encoder structure
|
||||||
|
@@ -1390,6 +1390,7 @@ static int sde_encoder_phys_wb_wait_for_commit_done(
|
|||||||
phys_enc->in_clone_mode) {
|
phys_enc->in_clone_mode) {
|
||||||
rc = _sde_encoder_phys_wb_wait_for_commit_done(phys_enc, true);
|
rc = _sde_encoder_phys_wb_wait_for_commit_done(phys_enc, true);
|
||||||
_sde_encoder_phys_wb_reset_state(phys_enc);
|
_sde_encoder_phys_wb_reset_state(phys_enc);
|
||||||
|
sde_encoder_phys_wb_irq_ctrl(phys_enc, false);
|
||||||
} else {
|
} else {
|
||||||
rc = _sde_encoder_phys_wb_wait_for_commit_done(phys_enc, false);
|
rc = _sde_encoder_phys_wb_wait_for_commit_done(phys_enc, false);
|
||||||
}
|
}
|
||||||
@@ -1676,8 +1677,10 @@ static void sde_encoder_phys_wb_disable(struct sde_encoder_phys *phys_enc)
|
|||||||
_sde_encoder_phys_wb_update_cwb_flush(phys_enc, false);
|
_sde_encoder_phys_wb_update_cwb_flush(phys_enc, false);
|
||||||
phys_enc->enable_state = SDE_ENC_DISABLING;
|
phys_enc->enable_state = SDE_ENC_DISABLING;
|
||||||
|
|
||||||
if (wb_enc->crtc->state->active)
|
if (wb_enc->crtc->state->active) {
|
||||||
|
sde_encoder_phys_wb_irq_ctrl(phys_enc, true);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
@@ -1532,6 +1532,7 @@ static void sde_kms_wait_for_commit_done(struct msm_kms *kms,
|
|||||||
struct drm_encoder *encoder;
|
struct drm_encoder *encoder;
|
||||||
struct drm_device *dev;
|
struct drm_device *dev;
|
||||||
int ret;
|
int ret;
|
||||||
|
bool cwb_disabling;
|
||||||
|
|
||||||
if (!kms || !crtc || !crtc->state) {
|
if (!kms || !crtc || !crtc->state) {
|
||||||
SDE_ERROR("invalid params\n");
|
SDE_ERROR("invalid params\n");
|
||||||
@@ -1557,9 +1558,14 @@ static void sde_kms_wait_for_commit_done(struct msm_kms *kms,
|
|||||||
|
|
||||||
SDE_ATRACE_BEGIN("sde_kms_wait_for_commit_done");
|
SDE_ATRACE_BEGIN("sde_kms_wait_for_commit_done");
|
||||||
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
|
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
|
||||||
if (encoder->crtc != crtc &&
|
cwb_disabling = false;
|
||||||
!sde_encoder_is_cwb_disabling(encoder, crtc))
|
if (encoder->crtc != crtc) {
|
||||||
|
cwb_disabling = sde_encoder_is_cwb_disabling(encoder,
|
||||||
|
crtc);
|
||||||
|
if (!cwb_disabling)
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Wait for post-flush if necessary to delay before
|
* Wait for post-flush if necessary to delay before
|
||||||
* plane_cleanup. For example, wait for vsync in case of video
|
* plane_cleanup. For example, wait for vsync in case of video
|
||||||
@@ -1574,6 +1580,9 @@ static void sde_kms_wait_for_commit_done(struct msm_kms *kms,
|
|||||||
}
|
}
|
||||||
|
|
||||||
sde_crtc_complete_flip(crtc, NULL);
|
sde_crtc_complete_flip(crtc, NULL);
|
||||||
|
|
||||||
|
if (cwb_disabling)
|
||||||
|
sde_encoder_virt_reset(encoder);
|
||||||
}
|
}
|
||||||
|
|
||||||
sde_crtc_static_cache_read_kickoff(crtc);
|
sde_crtc_static_cache_read_kickoff(crtc);
|
||||||
|
Reference in New Issue
Block a user