aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_dp_mst.c
diff options
context:
space:
mode:
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2016-08-09 11:04:12 -0400
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2016-08-23 05:56:53 -0400
commit1e7bfa0b0e845d5e6984eb0dcdfd150c900d30b3 (patch)
tree271434201c3ef471ccabd3a2e9779608da51cfc4 /drivers/gpu/drm/i915/intel_dp_mst.c
parentd468e21e8c4f79dcc171b1f66dbb4e66c8ff53d7 (diff)
drm/i915: Convert intel_dp_mst to use atomic state
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1470755054-32699-14-git-send-email-maarten.lankhorst@linux.intel.com [mlankhorst: Address bikeshed.] Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp_mst.c')
-rw-r--r--drivers/gpu/drm/i915/intel_dp_mst.c49
1 files changed, 18 insertions, 31 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c
index 482dd07f5182..29ba4f6bd01f 100644
--- a/drivers/gpu/drm/i915/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/intel_dp_mst.c
@@ -82,11 +82,13 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder,
82 struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base); 82 struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
83 struct intel_digital_port *intel_dig_port = intel_mst->primary; 83 struct intel_digital_port *intel_dig_port = intel_mst->primary;
84 struct intel_dp *intel_dp = &intel_dig_port->dp; 84 struct intel_dp *intel_dp = &intel_dig_port->dp;
85 struct intel_connector *connector =
86 to_intel_connector(old_conn_state->connector);
85 int ret; 87 int ret;
86 88
87 DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); 89 DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links);
88 90
89 drm_dp_mst_reset_vcpi_slots(&intel_dp->mst_mgr, intel_mst->connector->port); 91 drm_dp_mst_reset_vcpi_slots(&intel_dp->mst_mgr, connector->port);
90 92
91 ret = drm_dp_update_payload_part1(&intel_dp->mst_mgr); 93 ret = drm_dp_update_payload_part1(&intel_dp->mst_mgr);
92 if (ret) { 94 if (ret) {
@@ -101,6 +103,8 @@ static void intel_mst_post_disable_dp(struct intel_encoder *encoder,
101 struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base); 103 struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
102 struct intel_digital_port *intel_dig_port = intel_mst->primary; 104 struct intel_digital_port *intel_dig_port = intel_mst->primary;
103 struct intel_dp *intel_dp = &intel_dig_port->dp; 105 struct intel_dp *intel_dp = &intel_dig_port->dp;
106 struct intel_connector *connector =
107 to_intel_connector(old_conn_state->connector);
104 108
105 DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); 109 DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links);
106 110
@@ -109,7 +113,7 @@ static void intel_mst_post_disable_dp(struct intel_encoder *encoder,
109 /* and this can also fail */ 113 /* and this can also fail */
110 drm_dp_update_payload_part2(&intel_dp->mst_mgr); 114 drm_dp_update_payload_part2(&intel_dp->mst_mgr);
111 115
112 drm_dp_mst_deallocate_vcpi(&intel_dp->mst_mgr, intel_mst->connector->port); 116 drm_dp_mst_deallocate_vcpi(&intel_dp->mst_mgr, connector->port);
113 117
114 intel_dp->active_mst_links--; 118 intel_dp->active_mst_links--;
115 119
@@ -129,43 +133,28 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder,
129 struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base); 133 struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
130 struct intel_digital_port *intel_dig_port = intel_mst->primary; 134 struct intel_digital_port *intel_dig_port = intel_mst->primary;
131 struct intel_dp *intel_dp = &intel_dig_port->dp; 135 struct intel_dp *intel_dp = &intel_dig_port->dp;
132 struct drm_device *dev = encoder->base.dev; 136 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
133 struct drm_i915_private *dev_priv = to_i915(dev);
134 enum port port = intel_dig_port->port; 137 enum port port = intel_dig_port->port;
138 struct intel_connector *connector =
139 to_intel_connector(conn_state->connector);
135 int ret; 140 int ret;
136 uint32_t temp; 141 uint32_t temp;
137 struct intel_connector *found = NULL, *connector;
138 int slots; 142 int slots;
139 struct drm_crtc *crtc = encoder->base.crtc;
140 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
141
142 for_each_intel_connector(dev, connector) {
143 if (connector->base.state->best_encoder == &encoder->base) {
144 found = connector;
145 break;
146 }
147 }
148
149 if (!found) {
150 DRM_ERROR("can't find connector\n");
151 return;
152 }
153 143
154 /* MST encoders are bound to a crtc, not to a connector, 144 /* MST encoders are bound to a crtc, not to a connector,
155 * force the mapping here for get_hw_state. 145 * force the mapping here for get_hw_state.
156 */ 146 */
157 found->encoder = encoder; 147 connector->encoder = encoder;
148 intel_mst->connector = connector;
158 149
159 DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); 150 DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links);
160 151
161 intel_mst->connector = found;
162
163 if (intel_dp->active_mst_links == 0) { 152 if (intel_dp->active_mst_links == 0) {
164 intel_ddi_clk_select(&intel_dig_port->base, intel_crtc->config); 153 intel_ddi_clk_select(&intel_dig_port->base, pipe_config);
165 154
166 intel_prepare_dp_ddi_buffers(&intel_dig_port->base); 155 intel_prepare_dp_ddi_buffers(&intel_dig_port->base);
167 156
168 intel_dp_set_link_params(intel_dp, intel_crtc->config); 157 intel_dp_set_link_params(intel_dp, pipe_config);
169 158
170 intel_ddi_init_dp_buf_reg(&intel_dig_port->base); 159 intel_ddi_init_dp_buf_reg(&intel_dig_port->base);
171 160
@@ -176,8 +165,8 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder,
176 } 165 }
177 166
178 ret = drm_dp_mst_allocate_vcpi(&intel_dp->mst_mgr, 167 ret = drm_dp_mst_allocate_vcpi(&intel_dp->mst_mgr,
179 intel_mst->connector->port, 168 connector->port,
180 intel_crtc->config->pbn, &slots); 169 pipe_config->pbn, &slots);
181 if (ret == false) { 170 if (ret == false) {
182 DRM_ERROR("failed to allocate vcpi\n"); 171 DRM_ERROR("failed to allocate vcpi\n");
183 return; 172 return;
@@ -198,8 +187,7 @@ static void intel_mst_enable_dp(struct intel_encoder *encoder,
198 struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base); 187 struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
199 struct intel_digital_port *intel_dig_port = intel_mst->primary; 188 struct intel_digital_port *intel_dig_port = intel_mst->primary;
200 struct intel_dp *intel_dp = &intel_dig_port->dp; 189 struct intel_dp *intel_dp = &intel_dig_port->dp;
201 struct drm_device *dev = intel_dig_port->base.base.dev; 190 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
202 struct drm_i915_private *dev_priv = to_i915(dev);
203 enum port port = intel_dig_port->port; 191 enum port port = intel_dig_port->port;
204 int ret; 192 int ret;
205 193
@@ -232,9 +220,8 @@ static void intel_dp_mst_enc_get_config(struct intel_encoder *encoder,
232{ 220{
233 struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base); 221 struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
234 struct intel_digital_port *intel_dig_port = intel_mst->primary; 222 struct intel_digital_port *intel_dig_port = intel_mst->primary;
235 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); 223 struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
236 struct drm_device *dev = encoder->base.dev; 224 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
237 struct drm_i915_private *dev_priv = to_i915(dev);
238 enum transcoder cpu_transcoder = pipe_config->cpu_transcoder; 225 enum transcoder cpu_transcoder = pipe_config->cpu_transcoder;
239 u32 temp, flags = 0; 226 u32 temp, flags = 0;
240 227