diff options
| author | Linux Build Service Account <lnxbuild@quicinc.com> | 2017-08-30 19:30:04 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-08-30 19:30:04 -0700 |
| commit | b01b33489fdfcaec7e3c406875cd4c89c31d8694 (patch) | |
| tree | 9369296e38e92e75232ab384bd1fd8e8061888ba /drivers/gpu | |
| parent | c762445edd2fe054537ad35d1e14462c67297b64 (diff) | |
| parent | c2beb408510de5f519d1d9a91bafaed2a220eb5b (diff) | |
Merge "msm: sde: fix deadlock issue in concurrency test"
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/msm/sde/sde_connector.c | 23 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/sde/sde_crtc.c | 27 |
2 files changed, 24 insertions, 26 deletions
diff --git a/drivers/gpu/drm/msm/sde/sde_connector.c b/drivers/gpu/drm/msm/sde/sde_connector.c index a1cbd0cdf795..2ca91674a15a 100644 --- a/drivers/gpu/drm/msm/sde/sde_connector.c +++ b/drivers/gpu/drm/msm/sde/sde_connector.c @@ -16,6 +16,7 @@ #include "sde_kms.h" #include "sde_connector.h" #include "sde_backlight.h" +#include "sde_splash.h" #define SDE_DEBUG_CONN(c, fmt, ...) SDE_DEBUG("conn%d " fmt,\ (c) ? (c)->base.base.id : -1, ##__VA_ARGS__) @@ -567,13 +568,35 @@ void sde_connector_prepare_fence(struct drm_connector *connector) void sde_connector_complete_commit(struct drm_connector *connector) { + struct drm_device *dev; + struct msm_drm_private *priv; + struct sde_connector *c_conn; + struct sde_kms *sde_kms; + if (!connector) { SDE_ERROR("invalid connector\n"); return; } + dev = connector->dev; + priv = dev->dev_private; + sde_kms = to_sde_kms(priv->kms); + /* signal connector's retire fence */ sde_fence_signal(&to_sde_connector(connector)->retire_fence, 0); + + /* after first vsync comes, + * early splash resource should start to be released. + */ + if (sde_splash_get_lk_complete_status(&sde_kms->splash_info)) { + c_conn = to_sde_connector(connector); + + sde_splash_clean_up_free_resource(priv->kms, + &priv->phandle, + c_conn->connector_type, + c_conn->display); + } + } static int sde_connector_dpms(struct drm_connector *connector, diff --git a/drivers/gpu/drm/msm/sde/sde_crtc.c b/drivers/gpu/drm/msm/sde/sde_crtc.c index 5d9a4e907318..2a5127800313 100644 --- a/drivers/gpu/drm/msm/sde/sde_crtc.c +++ b/drivers/gpu/drm/msm/sde/sde_crtc.c @@ -600,23 +600,14 @@ void sde_crtc_complete_commit(struct drm_crtc *crtc, { struct sde_crtc *sde_crtc; struct sde_crtc_state *cstate; - struct drm_connector *conn; - struct sde_connector *c_conn; - struct drm_device *dev; - struct msm_drm_private *priv; - struct sde_kms *sde_kms; int i; - if (!crtc || !crtc->state || !crtc->dev) { + if (!crtc || !crtc->state) { SDE_ERROR("invalid crtc\n"); return; } - dev = crtc->dev; - priv = dev->dev_private; - sde_crtc = to_sde_crtc(crtc); - sde_kms = _sde_crtc_get_kms(crtc); cstate = to_sde_crtc_state(crtc->state); SDE_EVT32(DRMID(crtc)); @@ -625,22 +616,6 @@ void sde_crtc_complete_commit(struct drm_crtc *crtc, for (i = 0; i < cstate->num_connectors; ++i) sde_connector_complete_commit(cstate->connectors[i]); - - if (sde_splash_get_lk_complete_status(&sde_kms->splash_info)) { - mutex_lock(&dev->mode_config.mutex); - drm_for_each_connector(conn, crtc->dev) { - if (conn->state->crtc != crtc) - continue; - - c_conn = to_sde_connector(conn); - - sde_splash_clean_up_free_resource(priv->kms, - &priv->phandle, - c_conn->connector_type, - c_conn->display); - } - mutex_unlock(&dev->mode_config.mutex); - } } /** |
