aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_dp_mst.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp_mst.c')
-rw-r--r--drivers/gpu/drm/i915/intel_dp_mst.c38
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
360static 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
357static struct drm_encoder *intel_mst_best_encoder(struct drm_connector *connector) 370static 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
364static const struct drm_connector_helper_funcs intel_dp_mst_connector_helper_funcs = { 377static 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