Merge "disp: msm: sde: flush commit thread queue during pm suspend"
此提交包含在:
@@ -1581,7 +1581,7 @@ static void sde_kms_wait_for_commit_done(struct msm_kms *kms,
|
||||
ret = sde_encoder_wait_for_event(encoder, MSM_ENC_COMMIT_DONE);
|
||||
if (ret && ret != -EWOULDBLOCK) {
|
||||
SDE_ERROR("wait for commit done returned %d\n", ret);
|
||||
sde_crtc_request_frame_reset(crtc);
|
||||
sde_crtc_request_frame_reset(crtc, encoder);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1601,7 +1601,7 @@ static void sde_kms_prepare_fence(struct msm_kms *kms,
|
||||
{
|
||||
struct drm_crtc *crtc;
|
||||
struct drm_crtc_state *old_crtc_state;
|
||||
int i, rc;
|
||||
int i;
|
||||
|
||||
if (!kms || !old_state || !old_state->dev || !old_state->acquire_ctx) {
|
||||
SDE_ERROR("invalid argument(s)\n");
|
||||
@@ -1609,15 +1609,6 @@ static void sde_kms_prepare_fence(struct msm_kms *kms,
|
||||
}
|
||||
|
||||
SDE_ATRACE_BEGIN("sde_kms_prepare_fence");
|
||||
retry:
|
||||
/* attempt to acquire ww mutex for connection */
|
||||
rc = drm_modeset_lock(&old_state->dev->mode_config.connection_mutex,
|
||||
old_state->acquire_ctx);
|
||||
|
||||
if (rc == -EDEADLK) {
|
||||
drm_modeset_backoff(old_state->acquire_ctx);
|
||||
goto retry;
|
||||
}
|
||||
|
||||
/* old_state actually contains updated crtc pointers */
|
||||
for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
|
||||
@@ -3565,6 +3556,11 @@ static void _sde_kms_pm_suspend_idle_helper(struct sde_kms *sde_kms,
|
||||
if (sde_encoder_in_clone_mode(conn->encoder))
|
||||
continue;
|
||||
|
||||
crtc_id = drm_crtc_index(conn->state->crtc);
|
||||
if (priv->disp_thread[crtc_id].thread)
|
||||
kthread_flush_worker(
|
||||
&priv->disp_thread[crtc_id].worker);
|
||||
|
||||
ret = sde_encoder_wait_for_event(conn->encoder,
|
||||
MSM_ENC_TX_COMPLETE);
|
||||
if (ret && ret != -EWOULDBLOCK) {
|
||||
@@ -3572,7 +3568,6 @@ static void _sde_kms_pm_suspend_idle_helper(struct sde_kms *sde_kms,
|
||||
"[conn: %d] wait for commit done returned %d\n",
|
||||
conn->base.id, ret);
|
||||
} else if (!ret) {
|
||||
crtc_id = drm_crtc_index(conn->state->crtc);
|
||||
if (priv->event_thread[crtc_id].thread)
|
||||
kthread_flush_worker(
|
||||
&priv->event_thread[crtc_id].worker);
|
||||
|
新增問題並參考
封鎖使用者