disp: msm: obtain bridge from bridge chain

Commit 05193dc38197 ("drm/bridge: Make the bridge chain
a double-linked list") creates a bridge chain linked
list. This change updates the relevant changes to msm
driver to use the list to find the bridge associated to
the encoder.

Change-Id: I59eb2910be96f4fff7bdbeb040d6ad204c41d747
Signed-off-by: Samantha Tran <samtran@codeaurora.org>
Signed-off-by: Nilaan Gunabalachandran <ngunabal@codeaurora.org>
This commit is contained in:
Samantha Tran
2020-07-30 16:52:19 -07:00
committato da orion brody
parent 4b150347fc
commit 16cc165833
6 ha cambiato i file con 40 aggiunte e 26 eliminazioni

Vedi File

@@ -628,7 +628,6 @@ int dp_drm_bridge_init(void *data, struct drm_encoder *encoder,
goto error_free_bridge; goto error_free_bridge;
} }
encoder->bridge = &bridge->base;
priv->bridges[priv->num_bridges++] = &bridge->base; priv->bridges[priv->num_bridges++] = &bridge->base;
display->bridge = bridge; display->bridge = bridge;
display->max_mixer_count = max_mixer_count; display->max_mixer_count = max_mixer_count;
@@ -646,9 +645,6 @@ void dp_drm_bridge_deinit(void *data)
struct dp_display *display = data; struct dp_display *display = data;
struct dp_bridge *bridge = display->bridge; struct dp_bridge *bridge = display->bridge;
if (bridge && bridge->base.encoder)
bridge->base.encoder->bridge = NULL;
kfree(bridge); kfree(bridge);
} }

Vedi File

@@ -1300,7 +1300,6 @@ int dp_mst_drm_bridge_init(void *data, struct drm_encoder *encoder)
goto end; goto end;
} }
encoder->bridge = &bridge->base;
priv->bridges[priv->num_bridges++] = &bridge->base; priv->bridges[priv->num_bridges++] = &bridge->base;
state = kzalloc(sizeof(*state), GFP_KERNEL); state = kzalloc(sizeof(*state), GFP_KERNEL);
@@ -1604,6 +1603,7 @@ static int dp_mst_connector_atomic_check(struct drm_connector *connector,
struct drm_crtc_state *crtc_state; struct drm_crtc_state *crtc_state;
struct dp_mst_bridge *bridge; struct dp_mst_bridge *bridge;
struct dp_mst_bridge_state *bridge_state; struct dp_mst_bridge_state *bridge_state;
struct drm_bridge *drm_bridge;
struct dp_display *dp_display = display; struct dp_display *dp_display = display;
struct dp_mst_private *mst = dp_display->dp_mst_prv_info; struct dp_mst_private *mst = dp_display->dp_mst_prv_info;
struct sde_connector *c_conn = to_sde_connector(connector); struct sde_connector *c_conn = to_sde_connector(connector);
@@ -1642,8 +1642,13 @@ static int dp_mst_connector_atomic_check(struct drm_connector *connector,
goto end; goto end;
} }
bridge = to_dp_mst_bridge( drm_bridge = drm_bridge_chain_get_first_bridge(
old_conn_state->best_encoder->bridge); old_conn_state->best_encoder);
if (WARN_ON(!drm_bridge)) {
rc = -EINVAL;
goto end;
}
bridge = to_dp_mst_bridge(drm_bridge);
bridge_state = dp_mst_get_bridge_atomic_state(state, bridge); bridge_state = dp_mst_get_bridge_atomic_state(state, bridge);
if (IS_ERR(bridge_state)) { if (IS_ERR(bridge_state)) {
@@ -1691,8 +1696,13 @@ mode_set:
goto end; goto end;
} }
bridge = to_dp_mst_bridge( drm_bridge = drm_bridge_chain_get_first_bridge(
new_conn_state->best_encoder->bridge); new_conn_state->best_encoder);
if (WARN_ON(!drm_bridge)) {
rc = -EINVAL;
goto end;
}
bridge = to_dp_mst_bridge(drm_bridge);
bridge_state = dp_mst_get_bridge_atomic_state(state, bridge); bridge_state = dp_mst_get_bridge_atomic_state(state, bridge);
if (IS_ERR(bridge_state)) { if (IS_ERR(bridge_state)) {

Vedi File

@@ -6381,7 +6381,7 @@ int dsi_display_drm_ext_bridge_init(struct dsi_display *display,
return -EINVAL; return -EINVAL;
drm = encoder->dev; drm = encoder->dev;
bridge = encoder->bridge; bridge = drm_bridge_chain_get_first_bridge(encoder);
sde_conn = to_sde_connector(connector); sde_conn = to_sde_connector(connector);
prev_bridge = bridge; prev_bridge = bridge;

Vedi File

@@ -1023,6 +1023,7 @@ int dsi_conn_post_kickoff(struct drm_connector *connector,
struct msm_display_conn_params *params) struct msm_display_conn_params *params)
{ {
struct drm_encoder *encoder; struct drm_encoder *encoder;
struct drm_bridge *bridge;
struct dsi_bridge *c_bridge; struct dsi_bridge *c_bridge;
struct dsi_display_mode adj_mode; struct dsi_display_mode adj_mode;
struct dsi_display *display; struct dsi_display *display;
@@ -1042,7 +1043,12 @@ int dsi_conn_post_kickoff(struct drm_connector *connector,
return 0; return 0;
} }
c_bridge = to_dsi_bridge(encoder->bridge); bridge = drm_bridge_chain_get_first_bridge(encoder);
if (!bridge) {
DSI_DEBUG("bridge is not available\n");
return 0;
}
c_bridge = to_dsi_bridge(bridge);
adj_mode = c_bridge->dsi_mode; adj_mode = c_bridge->dsi_mode;
display = c_bridge->display; display = c_bridge->display;
dyn_clk_caps = &(display->panel->dyn_clk_caps); dyn_clk_caps = &(display->panel->dyn_clk_caps);
@@ -1123,7 +1129,6 @@ struct dsi_bridge *dsi_drm_bridge_init(struct dsi_display *display,
goto error_free_bridge; goto error_free_bridge;
} }
encoder->bridge = &bridge->base;
return bridge; return bridge;
error_free_bridge: error_free_bridge:
kfree(bridge); kfree(bridge);
@@ -1133,9 +1138,6 @@ error:
void dsi_drm_bridge_cleanup(struct dsi_bridge *bridge) void dsi_drm_bridge_cleanup(struct dsi_bridge *bridge)
{ {
if (bridge && bridge->base.encoder)
bridge->base.encoder->bridge = NULL;
kfree(bridge); kfree(bridge);
} }

Vedi File

@@ -156,6 +156,7 @@ 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_bridge *bridge;
/* /*
* Shut down everything that's in the changeset and currently * Shut down everything that's in the changeset and currently
@@ -191,7 +192,8 @@ msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
* Each encoder has at most one connector (since we always steal * Each encoder has at most one connector (since we always steal
* it away), so we won't call disable hooks twice. * it away), so we won't call disable hooks twice.
*/ */
drm_bridge_disable(encoder->bridge); bridge = drm_bridge_chain_get_first_bridge(encoder);
drm_bridge_chain_disable(bridge);
/* Right function depends upon target state. */ /* Right function depends upon target state. */
if (connector->state->crtc && funcs->prepare) if (connector->state->crtc && funcs->prepare)
@@ -201,7 +203,7 @@ msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
else else
funcs->dpms(encoder, DRM_MODE_DPMS_OFF); funcs->dpms(encoder, DRM_MODE_DPMS_OFF);
drm_bridge_post_disable(encoder->bridge); drm_bridge_chain_post_disable(bridge);
} }
for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) { for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
@@ -264,6 +266,7 @@ msm_crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
struct drm_crtc_state *new_crtc_state; struct drm_crtc_state *new_crtc_state;
struct drm_encoder *encoder; struct drm_encoder *encoder;
struct drm_display_mode *mode, *adjusted_mode; struct drm_display_mode *mode, *adjusted_mode;
struct drm_bridge *bridge;
if (!connector->state->best_encoder) if (!connector->state->best_encoder)
continue; continue;
@@ -294,7 +297,8 @@ msm_crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
if (funcs->mode_set) if (funcs->mode_set)
funcs->mode_set(encoder, mode, adjusted_mode); funcs->mode_set(encoder, mode, adjusted_mode);
drm_bridge_mode_set(encoder->bridge, mode, adjusted_mode); bridge = drm_bridge_chain_get_first_bridge(encoder);
drm_bridge_chain_mode_set(bridge, mode, adjusted_mode);
SDE_ATRACE_END("msm_set_mode"); SDE_ATRACE_END("msm_set_mode");
} }
} }
@@ -388,6 +392,7 @@ static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
const struct drm_encoder_helper_funcs *funcs; const struct drm_encoder_helper_funcs *funcs;
struct drm_encoder *encoder; struct drm_encoder *encoder;
struct drm_connector_state *old_conn_state; struct drm_connector_state *old_conn_state;
struct drm_bridge *bridge;
if (!new_conn_state->best_encoder) if (!new_conn_state->best_encoder)
continue; continue;
@@ -412,7 +417,8 @@ static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
* Each encoder has at most one connector (since we always steal * Each encoder has at most one connector (since we always steal
* it away), so we won't call enable hooks twice. * it away), so we won't call enable hooks twice.
*/ */
drm_bridge_pre_enable(encoder->bridge); bridge = drm_bridge_chain_get_first_bridge(encoder);
drm_bridge_chain_pre_enable(bridge);
++bridge_enable_count; ++bridge_enable_count;
if (funcs->enable) if (funcs->enable)
@@ -436,6 +442,7 @@ static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
new_conn_state, i) { new_conn_state, i) {
struct drm_encoder *encoder; struct drm_encoder *encoder;
struct drm_connector_state *old_conn_state; struct drm_connector_state *old_conn_state;
struct drm_bridge *bridge;
if (!new_conn_state->best_encoder) if (!new_conn_state->best_encoder)
continue; continue;
@@ -455,7 +462,8 @@ static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
DRM_DEBUG_ATOMIC("bridge enable enabling [ENCODER:%d:%s]\n", DRM_DEBUG_ATOMIC("bridge enable enabling [ENCODER:%d:%s]\n",
encoder->base.id, encoder->name); encoder->base.id, encoder->name);
drm_bridge_enable(encoder->bridge); bridge = drm_bridge_chain_get_first_bridge(encoder);
drm_bridge_chain_enable(bridge);
} }
SDE_ATRACE_END("msm_enable"); SDE_ATRACE_END("msm_enable");
} }

Vedi File

@@ -5218,6 +5218,7 @@ int sde_encoder_update_caps_for_cont_splash(struct drm_encoder *encoder,
struct sde_connector_state *sde_conn_state = NULL; struct sde_connector_state *sde_conn_state = NULL;
struct drm_display_mode *drm_mode = NULL; struct drm_display_mode *drm_mode = NULL;
struct sde_encoder_phys *phys_enc; struct sde_encoder_phys *phys_enc;
struct drm_bridge *bridge;
int ret = 0, i; int ret = 0, i;
if (!encoder) { if (!encoder) {
@@ -5318,7 +5319,8 @@ int sde_encoder_update_caps_for_cont_splash(struct drm_encoder *encoder,
drm_mode->hdisplay, drm_mode->vdisplay); drm_mode->hdisplay, drm_mode->vdisplay);
drm_set_preferred_mode(conn, drm_mode->hdisplay, drm_mode->vdisplay); drm_set_preferred_mode(conn, drm_mode->hdisplay, drm_mode->vdisplay);
if (encoder->bridge) { bridge = drm_bridge_chain_get_first_bridge(encoder);
if (bridge) {
SDE_DEBUG_ENC(sde_enc, "Bridge mapped to encoder\n"); SDE_DEBUG_ENC(sde_enc, "Bridge mapped to encoder\n");
/* /*
* For cont-splash use case, we update the mode * For cont-splash use case, we update the mode
@@ -5328,11 +5330,7 @@ int sde_encoder_update_caps_for_cont_splash(struct drm_encoder *encoder,
* be updated with the current drm mode by * be updated with the current drm mode by
* calling the bridge mode set ops. * calling the bridge mode set ops.
*/ */
if (encoder->bridge->funcs) { drm_bridge_chain_mode_set(bridge, drm_mode, drm_mode);
SDE_DEBUG_ENC(sde_enc, "calling mode_set\n");
encoder->bridge->funcs->mode_set(encoder->bridge,
drm_mode, drm_mode);
}
} else { } else {
SDE_ERROR_ENC(sde_enc, "No bridge attached to encoder\n"); SDE_ERROR_ENC(sde_enc, "No bridge attached to encoder\n");
} }