summaryrefslogtreecommitdiff
path: root/drivers/gpu
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@quicinc.com>2017-08-30 19:30:04 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2017-08-30 19:30:04 -0700
commitb01b33489fdfcaec7e3c406875cd4c89c31d8694 (patch)
tree9369296e38e92e75232ab384bd1fd8e8061888ba /drivers/gpu
parentc762445edd2fe054537ad35d1e14462c67297b64 (diff)
parentc2beb408510de5f519d1d9a91bafaed2a220eb5b (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.c23
-rw-r--r--drivers/gpu/drm/msm/sde/sde_crtc.c27
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);
- }
}
/**