diff options
author | Maarten Lankhorst <maarten.lankhorst@linux.intel.com> | 2016-08-09 11:04:12 -0400 |
---|---|---|
committer | Maarten Lankhorst <maarten.lankhorst@linux.intel.com> | 2016-08-23 05:56:53 -0400 |
commit | 1e7bfa0b0e845d5e6984eb0dcdfd150c900d30b3 (patch) | |
tree | 271434201c3ef471ccabd3a2e9779608da51cfc4 /drivers/gpu/drm/i915/intel_dp_mst.c | |
parent | d468e21e8c4f79dcc171b1f66dbb4e66c8ff53d7 (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.c | 49 |
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 | ||