diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp_mst.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp_mst.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c index 5cb47482d29f..600afdbef8c9 100644 --- a/drivers/gpu/drm/i915/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/intel_dp_mst.c | |||
@@ -40,7 +40,9 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder, | |||
40 | int bpp, i; | 40 | int bpp, i; |
41 | int lane_count, slots, rate; | 41 | int lane_count, slots, rate; |
42 | struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode; | 42 | struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode; |
43 | struct intel_connector *found = NULL; | 43 | struct drm_connector *drm_connector; |
44 | struct intel_connector *connector, *found = NULL; | ||
45 | struct drm_connector_state *connector_state; | ||
44 | int mst_pbn; | 46 | int mst_pbn; |
45 | 47 | ||
46 | pipe_config->dp_encoder_is_mst = true; | 48 | pipe_config->dp_encoder_is_mst = true; |
@@ -70,12 +72,11 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder, | |||
70 | 72 | ||
71 | state = pipe_config->base.state; | 73 | state = pipe_config->base.state; |
72 | 74 | ||
73 | for (i = 0; i < state->num_connector; i++) { | 75 | for_each_connector_in_state(state, drm_connector, connector_state, i) { |
74 | if (!state->connectors[i]) | 76 | connector = to_intel_connector(drm_connector); |
75 | continue; | ||
76 | 77 | ||
77 | if (state->connector_states[i]->best_encoder == &encoder->base) { | 78 | if (connector_state->best_encoder == &encoder->base) { |
78 | found = to_intel_connector(state->connectors[i]); | 79 | found = connector; |
79 | break; | 80 | break; |
80 | } | 81 | } |
81 | } | 82 | } |
@@ -150,14 +151,14 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder) | |||
150 | enum port port = intel_dig_port->port; | 151 | enum port port = intel_dig_port->port; |
151 | int ret; | 152 | int ret; |
152 | uint32_t temp; | 153 | uint32_t temp; |
153 | struct intel_connector *found = NULL, *intel_connector; | 154 | struct intel_connector *found = NULL, *connector; |
154 | int slots; | 155 | int slots; |
155 | struct drm_crtc *crtc = encoder->base.crtc; | 156 | struct drm_crtc *crtc = encoder->base.crtc; |
156 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 157 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
157 | 158 | ||
158 | for_each_intel_connector(dev, intel_connector) { | 159 | for_each_intel_connector(dev, connector) { |
159 | if (intel_connector->new_encoder == encoder) { | 160 | if (connector->base.state->best_encoder == &encoder->base) { |
160 | found = intel_connector; | 161 | found = connector; |
161 | break; | 162 | break; |
162 | } | 163 | } |
163 | } | 164 | } |
@@ -173,8 +174,10 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder) | |||
173 | if (intel_dp->active_mst_links == 0) { | 174 | if (intel_dp->active_mst_links == 0) { |
174 | enum port port = intel_ddi_get_encoder_port(encoder); | 175 | enum port port = intel_ddi_get_encoder_port(encoder); |
175 | 176 | ||
176 | I915_WRITE(PORT_CLK_SEL(port), | 177 | /* FIXME: add support for SKL */ |
177 | intel_crtc->config->ddi_pll_sel); | 178 | if (INTEL_INFO(dev)->gen < 9) |
179 | I915_WRITE(PORT_CLK_SEL(port), | ||
180 | intel_crtc->config->ddi_pll_sel); | ||
178 | 181 | ||
179 | intel_ddi_init_dp_buf_reg(&intel_dig_port->base); | 182 | intel_ddi_init_dp_buf_reg(&intel_dig_port->base); |
180 | 183 | ||
@@ -354,6 +357,16 @@ intel_dp_mst_mode_valid(struct drm_connector *connector, | |||
354 | return MODE_OK; | 357 | return MODE_OK; |
355 | } | 358 | } |
356 | 359 | ||
360 | static struct drm_encoder *intel_mst_atomic_best_encoder(struct drm_connector *connector, | ||
361 | struct drm_connector_state *state) | ||
362 | { | ||
363 | struct intel_connector *intel_connector = to_intel_connector(connector); | ||
364 | struct intel_dp *intel_dp = intel_connector->mst_port; | ||
365 | struct intel_crtc *crtc = to_intel_crtc(state->crtc); | ||
366 | |||
367 | return &intel_dp->mst_encoders[crtc->pipe]->base.base; | ||
368 | } | ||
369 | |||
357 | static struct drm_encoder *intel_mst_best_encoder(struct drm_connector *connector) | 370 | static struct drm_encoder *intel_mst_best_encoder(struct drm_connector *connector) |
358 | { | 371 | { |
359 | struct intel_connector *intel_connector = to_intel_connector(connector); | 372 | struct intel_connector *intel_connector = to_intel_connector(connector); |
@@ -364,6 +377,7 @@ static struct drm_encoder *intel_mst_best_encoder(struct drm_connector *connecto | |||
364 | static const struct drm_connector_helper_funcs intel_dp_mst_connector_helper_funcs = { | 377 | static const struct drm_connector_helper_funcs intel_dp_mst_connector_helper_funcs = { |
365 | .get_modes = intel_dp_mst_get_modes, | 378 | .get_modes = intel_dp_mst_get_modes, |
366 | .mode_valid = intel_dp_mst_mode_valid, | 379 | .mode_valid = intel_dp_mst_mode_valid, |
380 | .atomic_best_encoder = intel_mst_atomic_best_encoder, | ||
367 | .best_encoder = intel_mst_best_encoder, | 381 | .best_encoder = intel_mst_best_encoder, |
368 | }; | 382 | }; |
369 | 383 | ||