1c349dbc7Sjsg /*
2c349dbc7Sjsg * Copyright © 2008 Intel Corporation
3c349dbc7Sjsg * 2014 Red Hat Inc.
4c349dbc7Sjsg *
5c349dbc7Sjsg * Permission is hereby granted, free of charge, to any person obtaining a
6c349dbc7Sjsg * copy of this software and associated documentation files (the "Software"),
7c349dbc7Sjsg * to deal in the Software without restriction, including without limitation
8c349dbc7Sjsg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9c349dbc7Sjsg * and/or sell copies of the Software, and to permit persons to whom the
10c349dbc7Sjsg * Software is furnished to do so, subject to the following conditions:
11c349dbc7Sjsg *
12c349dbc7Sjsg * The above copyright notice and this permission notice (including the next
13c349dbc7Sjsg * paragraph) shall be included in all copies or substantial portions of the
14c349dbc7Sjsg * Software.
15c349dbc7Sjsg *
16c349dbc7Sjsg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17c349dbc7Sjsg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18c349dbc7Sjsg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19c349dbc7Sjsg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20c349dbc7Sjsg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21c349dbc7Sjsg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22c349dbc7Sjsg * IN THE SOFTWARE.
23c349dbc7Sjsg *
24c349dbc7Sjsg */
25c349dbc7Sjsg
265ca02815Sjsg #include <drm/drm_atomic.h>
27c349dbc7Sjsg #include <drm/drm_atomic_helper.h>
28c349dbc7Sjsg #include <drm/drm_edid.h>
29c349dbc7Sjsg #include <drm/drm_probe_helper.h>
30c349dbc7Sjsg
31c349dbc7Sjsg #include "i915_drv.h"
32f005ef32Sjsg #include "i915_reg.h"
33c349dbc7Sjsg #include "intel_atomic.h"
34c349dbc7Sjsg #include "intel_audio.h"
35c349dbc7Sjsg #include "intel_connector.h"
365ca02815Sjsg #include "intel_crtc.h"
37c349dbc7Sjsg #include "intel_ddi.h"
385ca02815Sjsg #include "intel_de.h"
39c349dbc7Sjsg #include "intel_display_types.h"
40c349dbc7Sjsg #include "intel_dp.h"
415ca02815Sjsg #include "intel_dp_hdcp.h"
42c349dbc7Sjsg #include "intel_dp_mst.h"
43c349dbc7Sjsg #include "intel_dpio_phy.h"
44ad8b1aafSjsg #include "intel_hdcp.h"
455ca02815Sjsg #include "intel_hotplug.h"
465ca02815Sjsg #include "skl_scaler.h"
47c349dbc7Sjsg
intel_dp_mst_check_constraints(struct drm_i915_private * i915,int bpp,const struct drm_display_mode * adjusted_mode,struct intel_crtc_state * crtc_state,bool dsc)48f005ef32Sjsg static int intel_dp_mst_check_constraints(struct drm_i915_private *i915, int bpp,
49f005ef32Sjsg const struct drm_display_mode *adjusted_mode,
50c349dbc7Sjsg struct intel_crtc_state *crtc_state,
51f005ef32Sjsg bool dsc)
52f005ef32Sjsg {
53f005ef32Sjsg if (intel_dp_is_uhbr(crtc_state) && DISPLAY_VER(i915) <= 13 && dsc) {
54f005ef32Sjsg int output_bpp = bpp;
55f005ef32Sjsg /* DisplayPort 2 128b/132b, bits per lane is always 32 */
56f005ef32Sjsg int symbol_clock = crtc_state->port_clock / 32;
57f005ef32Sjsg
58f005ef32Sjsg if (output_bpp * adjusted_mode->crtc_clock >=
59f005ef32Sjsg symbol_clock * 72) {
60f005ef32Sjsg drm_dbg_kms(&i915->drm, "UHBR check failed(required bw %d available %d)\n",
61f005ef32Sjsg output_bpp * adjusted_mode->crtc_clock, symbol_clock * 72);
62f005ef32Sjsg return -EINVAL;
63f005ef32Sjsg }
64f005ef32Sjsg }
65f005ef32Sjsg
66f005ef32Sjsg return 0;
67f005ef32Sjsg }
68f005ef32Sjsg
intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder * encoder,struct intel_crtc_state * crtc_state,int max_bpp,int min_bpp,struct link_config_limits * limits,struct drm_connector_state * conn_state,int step,bool dsc)69f005ef32Sjsg static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
70f005ef32Sjsg struct intel_crtc_state *crtc_state,
71f005ef32Sjsg int max_bpp,
72f005ef32Sjsg int min_bpp,
73f005ef32Sjsg struct link_config_limits *limits,
74c349dbc7Sjsg struct drm_connector_state *conn_state,
75f005ef32Sjsg int step,
76f005ef32Sjsg bool dsc)
77c349dbc7Sjsg {
78c349dbc7Sjsg struct drm_atomic_state *state = crtc_state->uapi.state;
79c349dbc7Sjsg struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
80c349dbc7Sjsg struct intel_dp *intel_dp = &intel_mst->primary->dp;
811bb76ff1Sjsg struct drm_dp_mst_topology_state *mst_state;
82c349dbc7Sjsg struct intel_connector *connector =
83c349dbc7Sjsg to_intel_connector(conn_state->connector);
84ad8b1aafSjsg struct drm_i915_private *i915 = to_i915(connector->base.dev);
85c349dbc7Sjsg const struct drm_display_mode *adjusted_mode =
86c349dbc7Sjsg &crtc_state->hw.adjusted_mode;
87c349dbc7Sjsg int bpp, slots = -EINVAL;
88f005ef32Sjsg int ret = 0;
89c349dbc7Sjsg
901bb76ff1Sjsg mst_state = drm_atomic_get_mst_topology_state(state, &intel_dp->mst_mgr);
911bb76ff1Sjsg if (IS_ERR(mst_state))
921bb76ff1Sjsg return PTR_ERR(mst_state);
931bb76ff1Sjsg
94c349dbc7Sjsg crtc_state->lane_count = limits->max_lane_count;
951bb76ff1Sjsg crtc_state->port_clock = limits->max_rate;
961bb76ff1Sjsg
971bb76ff1Sjsg // TODO: Handle pbn_div changes by adding a new MST helper
981bb76ff1Sjsg if (!mst_state->pbn_div) {
991bb76ff1Sjsg mst_state->pbn_div = drm_dp_get_vc_payload_bw(&intel_dp->mst_mgr,
100f005ef32Sjsg crtc_state->port_clock,
101f005ef32Sjsg crtc_state->lane_count);
1021bb76ff1Sjsg }
103c349dbc7Sjsg
104f005ef32Sjsg for (bpp = max_bpp; bpp >= min_bpp; bpp -= step) {
105f005ef32Sjsg drm_dbg_kms(&i915->drm, "Trying bpp %d\n", bpp);
106f005ef32Sjsg
107f005ef32Sjsg ret = intel_dp_mst_check_constraints(i915, bpp, adjusted_mode, crtc_state, dsc);
108f005ef32Sjsg if (ret)
109f005ef32Sjsg continue;
110c349dbc7Sjsg
111c349dbc7Sjsg crtc_state->pbn = drm_dp_calc_pbn_mode(adjusted_mode->crtc_clock,
112065458a7Sjsg bpp << 4);
113f005ef32Sjsg
1141bb76ff1Sjsg slots = drm_dp_atomic_find_time_slots(state, &intel_dp->mst_mgr,
115f005ef32Sjsg connector->port,
116f005ef32Sjsg crtc_state->pbn);
117c349dbc7Sjsg if (slots == -EDEADLK)
118c349dbc7Sjsg return slots;
119f005ef32Sjsg
120f005ef32Sjsg if (slots >= 0) {
121f005ef32Sjsg ret = drm_dp_mst_atomic_check(state);
122f005ef32Sjsg /*
123f005ef32Sjsg * If we got slots >= 0 and we can fit those based on check
124f005ef32Sjsg * then we can exit the loop. Otherwise keep trying.
125f005ef32Sjsg */
126f005ef32Sjsg if (!ret)
127c349dbc7Sjsg break;
128c349dbc7Sjsg }
129f005ef32Sjsg }
130f005ef32Sjsg
131f005ef32Sjsg /* We failed to find a proper bpp/timeslots, return error */
132f005ef32Sjsg if (ret)
133f005ef32Sjsg slots = ret;
134c349dbc7Sjsg
135c349dbc7Sjsg if (slots < 0) {
136ad8b1aafSjsg drm_dbg_kms(&i915->drm, "failed finding vcpi slots:%d\n",
137ad8b1aafSjsg slots);
138f005ef32Sjsg } else {
139f005ef32Sjsg if (!dsc)
140f005ef32Sjsg crtc_state->pipe_bpp = bpp;
141f005ef32Sjsg else
142f005ef32Sjsg crtc_state->dsc.compressed_bpp = bpp;
143f005ef32Sjsg drm_dbg_kms(&i915->drm, "Got %d slots for pipe bpp %d dsc %d\n", slots, bpp, dsc);
144f005ef32Sjsg }
145f005ef32Sjsg
146c349dbc7Sjsg return slots;
147c349dbc7Sjsg }
148c349dbc7Sjsg
intel_dp_mst_compute_link_config(struct intel_encoder * encoder,struct intel_crtc_state * crtc_state,struct drm_connector_state * conn_state,struct link_config_limits * limits)149f005ef32Sjsg static int intel_dp_mst_compute_link_config(struct intel_encoder *encoder,
150f005ef32Sjsg struct intel_crtc_state *crtc_state,
151f005ef32Sjsg struct drm_connector_state *conn_state,
152f005ef32Sjsg struct link_config_limits *limits)
153f005ef32Sjsg {
154f005ef32Sjsg const struct drm_display_mode *adjusted_mode =
155f005ef32Sjsg &crtc_state->hw.adjusted_mode;
156f005ef32Sjsg int slots = -EINVAL;
157f005ef32Sjsg
158f005ef32Sjsg slots = intel_dp_mst_find_vcpi_slots_for_bpp(encoder, crtc_state, limits->max_bpp,
159f005ef32Sjsg limits->min_bpp, limits,
160f005ef32Sjsg conn_state, 2 * 3, false);
161f005ef32Sjsg
162f005ef32Sjsg if (slots < 0)
163f005ef32Sjsg return slots;
164f005ef32Sjsg
165c349dbc7Sjsg intel_link_compute_m_n(crtc_state->pipe_bpp,
166c349dbc7Sjsg crtc_state->lane_count,
167c349dbc7Sjsg adjusted_mode->crtc_clock,
168c349dbc7Sjsg crtc_state->port_clock,
169c349dbc7Sjsg &crtc_state->dp_m_n,
1701bb76ff1Sjsg crtc_state->fec_enable);
171c349dbc7Sjsg crtc_state->dp_m_n.tu = slots;
172c349dbc7Sjsg
173c349dbc7Sjsg return 0;
174c349dbc7Sjsg }
175c349dbc7Sjsg
intel_dp_dsc_mst_compute_link_config(struct intel_encoder * encoder,struct intel_crtc_state * crtc_state,struct drm_connector_state * conn_state,struct link_config_limits * limits)176f005ef32Sjsg static int intel_dp_dsc_mst_compute_link_config(struct intel_encoder *encoder,
177f005ef32Sjsg struct intel_crtc_state *crtc_state,
178f005ef32Sjsg struct drm_connector_state *conn_state,
179f005ef32Sjsg struct link_config_limits *limits)
180f005ef32Sjsg {
181f005ef32Sjsg struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
182f005ef32Sjsg struct intel_dp *intel_dp = &intel_mst->primary->dp;
183f005ef32Sjsg struct intel_connector *connector =
184f005ef32Sjsg to_intel_connector(conn_state->connector);
185f005ef32Sjsg struct drm_i915_private *i915 = to_i915(connector->base.dev);
186f005ef32Sjsg const struct drm_display_mode *adjusted_mode =
187f005ef32Sjsg &crtc_state->hw.adjusted_mode;
188f005ef32Sjsg int slots = -EINVAL;
189f005ef32Sjsg int i, num_bpc;
190f005ef32Sjsg u8 dsc_bpc[3] = {0};
191f005ef32Sjsg int min_bpp, max_bpp, sink_min_bpp, sink_max_bpp;
192f005ef32Sjsg u8 dsc_max_bpc;
193f005ef32Sjsg bool need_timeslot_recalc = false;
194f005ef32Sjsg u32 last_compressed_bpp;
195f005ef32Sjsg
196f005ef32Sjsg /* Max DSC Input BPC for ICL is 10 and for TGL+ is 12 */
197f005ef32Sjsg if (DISPLAY_VER(i915) >= 12)
198f005ef32Sjsg dsc_max_bpc = min_t(u8, 12, conn_state->max_requested_bpc);
199f005ef32Sjsg else
200f005ef32Sjsg dsc_max_bpc = min_t(u8, 10, conn_state->max_requested_bpc);
201f005ef32Sjsg
202f005ef32Sjsg max_bpp = min_t(u8, dsc_max_bpc * 3, limits->max_bpp);
203f005ef32Sjsg min_bpp = limits->min_bpp;
204f005ef32Sjsg
205f005ef32Sjsg num_bpc = drm_dp_dsc_sink_supported_input_bpcs(intel_dp->dsc_dpcd,
206f005ef32Sjsg dsc_bpc);
207f005ef32Sjsg
208f005ef32Sjsg drm_dbg_kms(&i915->drm, "DSC Source supported min bpp %d max bpp %d\n",
209f005ef32Sjsg min_bpp, max_bpp);
210f005ef32Sjsg
211f005ef32Sjsg sink_max_bpp = dsc_bpc[0] * 3;
212f005ef32Sjsg sink_min_bpp = sink_max_bpp;
213f005ef32Sjsg
214f005ef32Sjsg for (i = 1; i < num_bpc; i++) {
215f005ef32Sjsg if (sink_min_bpp > dsc_bpc[i] * 3)
216f005ef32Sjsg sink_min_bpp = dsc_bpc[i] * 3;
217f005ef32Sjsg if (sink_max_bpp < dsc_bpc[i] * 3)
218f005ef32Sjsg sink_max_bpp = dsc_bpc[i] * 3;
219f005ef32Sjsg }
220f005ef32Sjsg
221f005ef32Sjsg drm_dbg_kms(&i915->drm, "DSC Sink supported min bpp %d max bpp %d\n",
222f005ef32Sjsg sink_min_bpp, sink_max_bpp);
223f005ef32Sjsg
224f005ef32Sjsg if (min_bpp < sink_min_bpp)
225f005ef32Sjsg min_bpp = sink_min_bpp;
226f005ef32Sjsg
227f005ef32Sjsg if (max_bpp > sink_max_bpp)
228f005ef32Sjsg max_bpp = sink_max_bpp;
229f005ef32Sjsg
230f005ef32Sjsg slots = intel_dp_mst_find_vcpi_slots_for_bpp(encoder, crtc_state, max_bpp,
231f005ef32Sjsg min_bpp, limits,
232f005ef32Sjsg conn_state, 2 * 3, true);
233f005ef32Sjsg
234f005ef32Sjsg if (slots < 0)
235f005ef32Sjsg return slots;
236f005ef32Sjsg
237f005ef32Sjsg last_compressed_bpp = crtc_state->dsc.compressed_bpp;
238f005ef32Sjsg
239f005ef32Sjsg crtc_state->dsc.compressed_bpp = intel_dp_dsc_nearest_valid_bpp(i915,
240f005ef32Sjsg last_compressed_bpp,
241f005ef32Sjsg crtc_state->pipe_bpp);
242f005ef32Sjsg
243f005ef32Sjsg if (crtc_state->dsc.compressed_bpp != last_compressed_bpp)
244f005ef32Sjsg need_timeslot_recalc = true;
245f005ef32Sjsg
246f005ef32Sjsg /*
247f005ef32Sjsg * Apparently some MST hubs dislike if vcpi slots are not matching precisely
248f005ef32Sjsg * the actual compressed bpp we use.
249f005ef32Sjsg */
250f005ef32Sjsg if (need_timeslot_recalc) {
251f005ef32Sjsg slots = intel_dp_mst_find_vcpi_slots_for_bpp(encoder, crtc_state,
252f005ef32Sjsg crtc_state->dsc.compressed_bpp,
253f005ef32Sjsg crtc_state->dsc.compressed_bpp,
254f005ef32Sjsg limits, conn_state, 2 * 3, true);
255f005ef32Sjsg if (slots < 0)
256f005ef32Sjsg return slots;
257f005ef32Sjsg }
258f005ef32Sjsg
259f005ef32Sjsg intel_link_compute_m_n(crtc_state->dsc.compressed_bpp,
260f005ef32Sjsg crtc_state->lane_count,
261f005ef32Sjsg adjusted_mode->crtc_clock,
262f005ef32Sjsg crtc_state->port_clock,
263f005ef32Sjsg &crtc_state->dp_m_n,
264f005ef32Sjsg crtc_state->fec_enable);
265f005ef32Sjsg crtc_state->dp_m_n.tu = slots;
266f005ef32Sjsg
267f005ef32Sjsg return 0;
268f005ef32Sjsg }
intel_dp_mst_update_slots(struct intel_encoder * encoder,struct intel_crtc_state * crtc_state,struct drm_connector_state * conn_state)2691bb76ff1Sjsg static int intel_dp_mst_update_slots(struct intel_encoder *encoder,
2701bb76ff1Sjsg struct intel_crtc_state *crtc_state,
2711bb76ff1Sjsg struct drm_connector_state *conn_state)
2721bb76ff1Sjsg {
2731bb76ff1Sjsg struct drm_i915_private *i915 = to_i915(encoder->base.dev);
2741bb76ff1Sjsg struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
2751bb76ff1Sjsg struct intel_dp *intel_dp = &intel_mst->primary->dp;
2761bb76ff1Sjsg struct drm_dp_mst_topology_mgr *mgr = &intel_dp->mst_mgr;
2771bb76ff1Sjsg struct drm_dp_mst_topology_state *topology_state;
2781bb76ff1Sjsg u8 link_coding_cap = intel_dp_is_uhbr(crtc_state) ?
2791bb76ff1Sjsg DP_CAP_ANSI_128B132B : DP_CAP_ANSI_8B10B;
2801bb76ff1Sjsg
2811bb76ff1Sjsg topology_state = drm_atomic_get_mst_topology_state(conn_state->state, mgr);
2821bb76ff1Sjsg if (IS_ERR(topology_state)) {
2831bb76ff1Sjsg drm_dbg_kms(&i915->drm, "slot update failed\n");
2841bb76ff1Sjsg return PTR_ERR(topology_state);
2851bb76ff1Sjsg }
2861bb76ff1Sjsg
2871bb76ff1Sjsg drm_dp_mst_update_slots(topology_state, link_coding_cap);
2881bb76ff1Sjsg
2891bb76ff1Sjsg return 0;
2901bb76ff1Sjsg }
2911bb76ff1Sjsg
intel_dp_mst_has_audio(const struct drm_connector_state * conn_state)292f005ef32Sjsg static bool intel_dp_mst_has_audio(const struct drm_connector_state *conn_state)
293f005ef32Sjsg {
294f005ef32Sjsg const struct intel_digital_connector_state *intel_conn_state =
295f005ef32Sjsg to_intel_digital_connector_state(conn_state);
296f005ef32Sjsg struct intel_connector *connector =
297f005ef32Sjsg to_intel_connector(conn_state->connector);
298f005ef32Sjsg
299f005ef32Sjsg if (intel_conn_state->force_audio == HDMI_AUDIO_AUTO)
300f005ef32Sjsg return connector->base.display_info.has_audio;
301f005ef32Sjsg else
302f005ef32Sjsg return intel_conn_state->force_audio == HDMI_AUDIO_ON;
303f005ef32Sjsg }
304f005ef32Sjsg
intel_dp_mst_compute_config(struct intel_encoder * encoder,struct intel_crtc_state * pipe_config,struct drm_connector_state * conn_state)305c349dbc7Sjsg static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
306c349dbc7Sjsg struct intel_crtc_state *pipe_config,
307c349dbc7Sjsg struct drm_connector_state *conn_state)
308c349dbc7Sjsg {
309c349dbc7Sjsg struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
310c349dbc7Sjsg struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
311c349dbc7Sjsg struct intel_dp *intel_dp = &intel_mst->primary->dp;
312c349dbc7Sjsg const struct drm_display_mode *adjusted_mode =
313c349dbc7Sjsg &pipe_config->hw.adjusted_mode;
314c349dbc7Sjsg struct link_config_limits limits;
315c349dbc7Sjsg int ret;
316c349dbc7Sjsg
317c349dbc7Sjsg if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
318c349dbc7Sjsg return -EINVAL;
319c349dbc7Sjsg
320f005ef32Sjsg pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB;
321c349dbc7Sjsg pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
322c349dbc7Sjsg pipe_config->has_pch_encoder = false;
323c349dbc7Sjsg
324c349dbc7Sjsg pipe_config->has_audio =
325f005ef32Sjsg intel_dp_mst_has_audio(conn_state) &&
326f005ef32Sjsg intel_audio_compute_config(encoder, pipe_config, conn_state);
327c349dbc7Sjsg
328c349dbc7Sjsg /*
329c349dbc7Sjsg * for MST we always configure max link bw - the spec doesn't
330c349dbc7Sjsg * seem to suggest we should do otherwise.
331c349dbc7Sjsg */
3321bb76ff1Sjsg limits.min_rate =
3331bb76ff1Sjsg limits.max_rate = intel_dp_max_link_rate(intel_dp);
334c349dbc7Sjsg
335c349dbc7Sjsg limits.min_lane_count =
336c349dbc7Sjsg limits.max_lane_count = intel_dp_max_lane_count(intel_dp);
337c349dbc7Sjsg
3385ca02815Sjsg limits.min_bpp = intel_dp_min_bpp(pipe_config->output_format);
339c349dbc7Sjsg /*
340c349dbc7Sjsg * FIXME: If all the streams can't fit into the link with
341c349dbc7Sjsg * their current pipe_bpp we should reduce pipe_bpp across
342c349dbc7Sjsg * the board until things start to fit. Until then we
343c349dbc7Sjsg * limit to <= 8bpc since that's what was hardcoded for all
344c349dbc7Sjsg * MST streams previously. This hack should be removed once
345c349dbc7Sjsg * we have the proper retry logic in place.
346c349dbc7Sjsg */
347c349dbc7Sjsg limits.max_bpp = min(pipe_config->pipe_bpp, 24);
348c349dbc7Sjsg
349c349dbc7Sjsg intel_dp_adjust_compliance_config(intel_dp, pipe_config, &limits);
350c349dbc7Sjsg
351c349dbc7Sjsg ret = intel_dp_mst_compute_link_config(encoder, pipe_config,
352c349dbc7Sjsg conn_state, &limits);
353f005ef32Sjsg
354f005ef32Sjsg if (ret == -EDEADLK)
355f005ef32Sjsg return ret;
356f005ef32Sjsg
357f005ef32Sjsg /* enable compression if the mode doesn't fit available BW */
358f005ef32Sjsg drm_dbg_kms(&dev_priv->drm, "Force DSC en = %d\n", intel_dp->force_dsc_en);
359f005ef32Sjsg if (ret || intel_dp->force_dsc_en) {
360f005ef32Sjsg /*
361f005ef32Sjsg * Try to get at least some timeslots and then see, if
362f005ef32Sjsg * we can fit there with DSC.
363f005ef32Sjsg */
364f005ef32Sjsg drm_dbg_kms(&dev_priv->drm, "Trying to find VCPI slots in DSC mode\n");
365f005ef32Sjsg
366f005ef32Sjsg ret = intel_dp_dsc_mst_compute_link_config(encoder, pipe_config,
367f005ef32Sjsg conn_state, &limits);
368f005ef32Sjsg if (ret < 0)
369f005ef32Sjsg return ret;
370f005ef32Sjsg
371f005ef32Sjsg ret = intel_dp_dsc_compute_config(intel_dp, pipe_config,
372f005ef32Sjsg conn_state, &limits,
373f005ef32Sjsg pipe_config->dp_m_n.tu, false);
374f005ef32Sjsg }
375f005ef32Sjsg
376c349dbc7Sjsg if (ret)
377c349dbc7Sjsg return ret;
378c349dbc7Sjsg
3791bb76ff1Sjsg ret = intel_dp_mst_update_slots(encoder, pipe_config, conn_state);
3801bb76ff1Sjsg if (ret)
3811bb76ff1Sjsg return ret;
3821bb76ff1Sjsg
383c349dbc7Sjsg pipe_config->limited_color_range =
384c349dbc7Sjsg intel_dp_limited_color_range(pipe_config, conn_state);
385c349dbc7Sjsg
3865ca02815Sjsg if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))
387c349dbc7Sjsg pipe_config->lane_lat_optim_mask =
388c349dbc7Sjsg bxt_ddi_phy_calc_lane_lat_optim_mask(pipe_config->lane_count);
389c349dbc7Sjsg
390c349dbc7Sjsg intel_ddi_compute_min_voltage_level(dev_priv, pipe_config);
391c349dbc7Sjsg
392ad8b1aafSjsg return 0;
393ad8b1aafSjsg }
394ad8b1aafSjsg
395ad8b1aafSjsg /*
396ad8b1aafSjsg * Iterate over all connectors and return a mask of
397ad8b1aafSjsg * all CPU transcoders streaming over the same DP link.
398ad8b1aafSjsg */
399ad8b1aafSjsg static unsigned int
intel_dp_mst_transcoder_mask(struct intel_atomic_state * state,struct intel_dp * mst_port)400ad8b1aafSjsg intel_dp_mst_transcoder_mask(struct intel_atomic_state *state,
401ad8b1aafSjsg struct intel_dp *mst_port)
402ad8b1aafSjsg {
403ad8b1aafSjsg struct drm_i915_private *dev_priv = to_i915(state->base.dev);
404ad8b1aafSjsg const struct intel_digital_connector_state *conn_state;
405ad8b1aafSjsg struct intel_connector *connector;
406ad8b1aafSjsg u8 transcoders = 0;
407ad8b1aafSjsg int i;
408ad8b1aafSjsg
4095ca02815Sjsg if (DISPLAY_VER(dev_priv) < 12)
410ad8b1aafSjsg return 0;
411ad8b1aafSjsg
412ad8b1aafSjsg for_each_new_intel_connector_in_state(state, connector, conn_state, i) {
413ad8b1aafSjsg const struct intel_crtc_state *crtc_state;
414ad8b1aafSjsg struct intel_crtc *crtc;
415ad8b1aafSjsg
416ad8b1aafSjsg if (connector->mst_port != mst_port || !conn_state->base.crtc)
417ad8b1aafSjsg continue;
418ad8b1aafSjsg
419ad8b1aafSjsg crtc = to_intel_crtc(conn_state->base.crtc);
420ad8b1aafSjsg crtc_state = intel_atomic_get_new_crtc_state(state, crtc);
421ad8b1aafSjsg
422ad8b1aafSjsg if (!crtc_state->hw.active)
423ad8b1aafSjsg continue;
424ad8b1aafSjsg
425ad8b1aafSjsg transcoders |= BIT(crtc_state->cpu_transcoder);
426ad8b1aafSjsg }
427ad8b1aafSjsg
428ad8b1aafSjsg return transcoders;
429ad8b1aafSjsg }
430ad8b1aafSjsg
intel_dp_mst_compute_config_late(struct intel_encoder * encoder,struct intel_crtc_state * crtc_state,struct drm_connector_state * conn_state)431ad8b1aafSjsg static int intel_dp_mst_compute_config_late(struct intel_encoder *encoder,
432ad8b1aafSjsg struct intel_crtc_state *crtc_state,
433ad8b1aafSjsg struct drm_connector_state *conn_state)
434ad8b1aafSjsg {
435ad8b1aafSjsg struct intel_atomic_state *state = to_intel_atomic_state(conn_state->state);
436ad8b1aafSjsg struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
437ad8b1aafSjsg struct intel_dp *intel_dp = &intel_mst->primary->dp;
438ad8b1aafSjsg
439ad8b1aafSjsg /* lowest numbered transcoder will be designated master */
440ad8b1aafSjsg crtc_state->mst_master_transcoder =
441ad8b1aafSjsg ffs(intel_dp_mst_transcoder_mask(state, intel_dp)) - 1;
442c349dbc7Sjsg
443c349dbc7Sjsg return 0;
444c349dbc7Sjsg }
445c349dbc7Sjsg
446c349dbc7Sjsg /*
447c349dbc7Sjsg * If one of the connectors in a MST stream needs a modeset, mark all CRTCs
448c349dbc7Sjsg * that shares the same MST stream as mode changed,
449c349dbc7Sjsg * intel_modeset_pipe_config()+intel_crtc_check_fastset() will take care to do
450c349dbc7Sjsg * a fastset when possible.
451c349dbc7Sjsg */
452c349dbc7Sjsg static int
intel_dp_mst_atomic_master_trans_check(struct intel_connector * connector,struct intel_atomic_state * state)453c349dbc7Sjsg intel_dp_mst_atomic_master_trans_check(struct intel_connector *connector,
454c349dbc7Sjsg struct intel_atomic_state *state)
455c349dbc7Sjsg {
456c349dbc7Sjsg struct drm_i915_private *dev_priv = to_i915(state->base.dev);
457c349dbc7Sjsg struct drm_connector_list_iter connector_list_iter;
458c349dbc7Sjsg struct intel_connector *connector_iter;
4591bb76ff1Sjsg int ret = 0;
460c349dbc7Sjsg
4615ca02815Sjsg if (DISPLAY_VER(dev_priv) < 12)
462c349dbc7Sjsg return 0;
463c349dbc7Sjsg
464c349dbc7Sjsg if (!intel_connector_needs_modeset(state, &connector->base))
465c349dbc7Sjsg return 0;
466c349dbc7Sjsg
467c349dbc7Sjsg drm_connector_list_iter_begin(&dev_priv->drm, &connector_list_iter);
468c349dbc7Sjsg for_each_intel_connector_iter(connector_iter, &connector_list_iter) {
469c349dbc7Sjsg struct intel_digital_connector_state *conn_iter_state;
470c349dbc7Sjsg struct intel_crtc_state *crtc_state;
471c349dbc7Sjsg struct intel_crtc *crtc;
472c349dbc7Sjsg
473c349dbc7Sjsg if (connector_iter->mst_port != connector->mst_port ||
474c349dbc7Sjsg connector_iter == connector)
475c349dbc7Sjsg continue;
476c349dbc7Sjsg
477c349dbc7Sjsg conn_iter_state = intel_atomic_get_digital_connector_state(state,
478c349dbc7Sjsg connector_iter);
479c349dbc7Sjsg if (IS_ERR(conn_iter_state)) {
4801bb76ff1Sjsg ret = PTR_ERR(conn_iter_state);
4811bb76ff1Sjsg break;
482c349dbc7Sjsg }
483c349dbc7Sjsg
484c349dbc7Sjsg if (!conn_iter_state->base.crtc)
485c349dbc7Sjsg continue;
486c349dbc7Sjsg
487c349dbc7Sjsg crtc = to_intel_crtc(conn_iter_state->base.crtc);
488c349dbc7Sjsg crtc_state = intel_atomic_get_crtc_state(&state->base, crtc);
489c349dbc7Sjsg if (IS_ERR(crtc_state)) {
4901bb76ff1Sjsg ret = PTR_ERR(crtc_state);
4911bb76ff1Sjsg break;
492c349dbc7Sjsg }
493c349dbc7Sjsg
494c349dbc7Sjsg ret = drm_atomic_add_affected_planes(&state->base, &crtc->base);
4951bb76ff1Sjsg if (ret)
4961bb76ff1Sjsg break;
497c349dbc7Sjsg crtc_state->uapi.mode_changed = true;
498c349dbc7Sjsg }
499c349dbc7Sjsg drm_connector_list_iter_end(&connector_list_iter);
500c349dbc7Sjsg
5011bb76ff1Sjsg return ret;
502c349dbc7Sjsg }
503c349dbc7Sjsg
504c349dbc7Sjsg static int
intel_dp_mst_atomic_check(struct drm_connector * connector,struct drm_atomic_state * _state)505c349dbc7Sjsg intel_dp_mst_atomic_check(struct drm_connector *connector,
506c349dbc7Sjsg struct drm_atomic_state *_state)
507c349dbc7Sjsg {
508c349dbc7Sjsg struct intel_atomic_state *state = to_intel_atomic_state(_state);
509c349dbc7Sjsg struct intel_connector *intel_connector =
510c349dbc7Sjsg to_intel_connector(connector);
511c349dbc7Sjsg int ret;
512c349dbc7Sjsg
513c349dbc7Sjsg ret = intel_digital_connector_atomic_check(connector, &state->base);
514c349dbc7Sjsg if (ret)
515c349dbc7Sjsg return ret;
516c349dbc7Sjsg
517c349dbc7Sjsg ret = intel_dp_mst_atomic_master_trans_check(intel_connector, state);
518c349dbc7Sjsg if (ret)
519c349dbc7Sjsg return ret;
520c349dbc7Sjsg
5211bb76ff1Sjsg return drm_dp_atomic_release_time_slots(&state->base,
5221bb76ff1Sjsg &intel_connector->mst_port->mst_mgr,
523c349dbc7Sjsg intel_connector->port);
524c349dbc7Sjsg }
525c349dbc7Sjsg
clear_act_sent(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state)5265ca02815Sjsg static void clear_act_sent(struct intel_encoder *encoder,
5275ca02815Sjsg const struct intel_crtc_state *crtc_state)
528ad8b1aafSjsg {
5295ca02815Sjsg struct drm_i915_private *i915 = to_i915(encoder->base.dev);
530ad8b1aafSjsg
5315ca02815Sjsg intel_de_write(i915, dp_tp_status_reg(encoder, crtc_state),
532ad8b1aafSjsg DP_TP_STATUS_ACT_SENT);
533ad8b1aafSjsg }
534ad8b1aafSjsg
wait_for_act_sent(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state)5355ca02815Sjsg static void wait_for_act_sent(struct intel_encoder *encoder,
5365ca02815Sjsg const struct intel_crtc_state *crtc_state)
537ad8b1aafSjsg {
5385ca02815Sjsg struct drm_i915_private *i915 = to_i915(encoder->base.dev);
5395ca02815Sjsg struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
5405ca02815Sjsg struct intel_dp *intel_dp = &intel_mst->primary->dp;
541ad8b1aafSjsg
5425ca02815Sjsg if (intel_de_wait_for_set(i915, dp_tp_status_reg(encoder, crtc_state),
543ad8b1aafSjsg DP_TP_STATUS_ACT_SENT, 1))
544ad8b1aafSjsg drm_err(&i915->drm, "Timed out waiting for ACT sent\n");
545ad8b1aafSjsg
546ad8b1aafSjsg drm_dp_check_act_status(&intel_dp->mst_mgr);
547ad8b1aafSjsg }
548ad8b1aafSjsg
intel_mst_disable_dp(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * old_crtc_state,const struct drm_connector_state * old_conn_state)549ad8b1aafSjsg static void intel_mst_disable_dp(struct intel_atomic_state *state,
550ad8b1aafSjsg struct intel_encoder *encoder,
551c349dbc7Sjsg const struct intel_crtc_state *old_crtc_state,
552c349dbc7Sjsg const struct drm_connector_state *old_conn_state)
553c349dbc7Sjsg {
554c349dbc7Sjsg struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
555ad8b1aafSjsg struct intel_digital_port *dig_port = intel_mst->primary;
556ad8b1aafSjsg struct intel_dp *intel_dp = &dig_port->dp;
557c349dbc7Sjsg struct intel_connector *connector =
558c349dbc7Sjsg to_intel_connector(old_conn_state->connector);
559e8d87bf3Sjsg struct drm_dp_mst_topology_state *old_mst_state =
560e8d87bf3Sjsg drm_atomic_get_old_mst_topology_state(&state->base, &intel_dp->mst_mgr);
561e8d87bf3Sjsg struct drm_dp_mst_topology_state *new_mst_state =
562e8d87bf3Sjsg drm_atomic_get_new_mst_topology_state(&state->base, &intel_dp->mst_mgr);
563e8d87bf3Sjsg const struct drm_dp_mst_atomic_payload *old_payload =
564e8d87bf3Sjsg drm_atomic_get_mst_payload_state(old_mst_state, connector->port);
565e8d87bf3Sjsg struct drm_dp_mst_atomic_payload *new_payload =
566e8d87bf3Sjsg drm_atomic_get_mst_payload_state(new_mst_state, connector->port);
567ad8b1aafSjsg struct drm_i915_private *i915 = to_i915(connector->base.dev);
568c349dbc7Sjsg
569ad8b1aafSjsg drm_dbg_kms(&i915->drm, "active links %d\n",
570ad8b1aafSjsg intel_dp->active_mst_links);
571ad8b1aafSjsg
572ad8b1aafSjsg intel_hdcp_disable(intel_mst->connector);
573c349dbc7Sjsg
574e8d87bf3Sjsg drm_dp_remove_payload(&intel_dp->mst_mgr, new_mst_state,
575e8d87bf3Sjsg old_payload, new_payload);
576c349dbc7Sjsg
5771bb76ff1Sjsg intel_audio_codec_disable(encoder, old_crtc_state, old_conn_state);
578c349dbc7Sjsg }
579c349dbc7Sjsg
intel_mst_post_disable_dp(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * old_crtc_state,const struct drm_connector_state * old_conn_state)580ad8b1aafSjsg static void intel_mst_post_disable_dp(struct intel_atomic_state *state,
581ad8b1aafSjsg struct intel_encoder *encoder,
582c349dbc7Sjsg const struct intel_crtc_state *old_crtc_state,
583c349dbc7Sjsg const struct drm_connector_state *old_conn_state)
584c349dbc7Sjsg {
585c349dbc7Sjsg struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
586ad8b1aafSjsg struct intel_digital_port *dig_port = intel_mst->primary;
587ad8b1aafSjsg struct intel_dp *intel_dp = &dig_port->dp;
588c349dbc7Sjsg struct intel_connector *connector =
589c349dbc7Sjsg to_intel_connector(old_conn_state->connector);
590c349dbc7Sjsg struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
591c349dbc7Sjsg bool last_mst_stream;
592c349dbc7Sjsg
593c349dbc7Sjsg intel_dp->active_mst_links--;
594c349dbc7Sjsg last_mst_stream = intel_dp->active_mst_links == 0;
595c349dbc7Sjsg drm_WARN_ON(&dev_priv->drm,
5965ca02815Sjsg DISPLAY_VER(dev_priv) >= 12 && last_mst_stream &&
597c349dbc7Sjsg !intel_dp_mst_is_master_trans(old_crtc_state));
598c349dbc7Sjsg
599c349dbc7Sjsg intel_crtc_vblank_off(old_crtc_state);
600c349dbc7Sjsg
6011bb76ff1Sjsg intel_disable_transcoder(old_crtc_state);
602c349dbc7Sjsg
6035ca02815Sjsg clear_act_sent(encoder, old_crtc_state);
604ad8b1aafSjsg
6051bb76ff1Sjsg intel_de_rmw(dev_priv, TRANS_DDI_FUNC_CTL(old_crtc_state->cpu_transcoder),
6061bb76ff1Sjsg TRANS_DDI_DP_VC_PAYLOAD_ALLOC, 0);
607c349dbc7Sjsg
6085ca02815Sjsg wait_for_act_sent(encoder, old_crtc_state);
609c349dbc7Sjsg
610c349dbc7Sjsg intel_ddi_disable_transcoder_func(old_crtc_state);
611c349dbc7Sjsg
6125ca02815Sjsg if (DISPLAY_VER(dev_priv) >= 9)
613c349dbc7Sjsg skl_scaler_disable(old_crtc_state);
614c349dbc7Sjsg else
615c349dbc7Sjsg ilk_pfit_disable(old_crtc_state);
616c349dbc7Sjsg
617c349dbc7Sjsg /*
618c349dbc7Sjsg * Power down mst path before disabling the port, otherwise we end
619c349dbc7Sjsg * up getting interrupts from the sink upon detecting link loss.
620c349dbc7Sjsg */
621c349dbc7Sjsg drm_dp_send_power_updown_phy(&intel_dp->mst_mgr, connector->port,
622c349dbc7Sjsg false);
623ad8b1aafSjsg
624ad8b1aafSjsg /*
625ad8b1aafSjsg * BSpec 4287: disable DIP after the transcoder is disabled and before
626ad8b1aafSjsg * the transcoder clock select is set to none.
627ad8b1aafSjsg */
628ad8b1aafSjsg if (last_mst_stream)
629ad8b1aafSjsg intel_dp_set_infoframes(&dig_port->base, false,
630ad8b1aafSjsg old_crtc_state, NULL);
631c349dbc7Sjsg /*
632c349dbc7Sjsg * From TGL spec: "If multi-stream slave transcoder: Configure
633c349dbc7Sjsg * Transcoder Clock Select to direct no clock to the transcoder"
634c349dbc7Sjsg *
635c349dbc7Sjsg * From older GENs spec: "Configure Transcoder Clock Select to direct
636c349dbc7Sjsg * no clock to the transcoder"
637c349dbc7Sjsg */
6385ca02815Sjsg if (DISPLAY_VER(dev_priv) < 12 || !last_mst_stream)
639f005ef32Sjsg intel_ddi_disable_transcoder_clock(old_crtc_state);
640c349dbc7Sjsg
641c349dbc7Sjsg
642c349dbc7Sjsg intel_mst->connector = NULL;
643c349dbc7Sjsg if (last_mst_stream)
644ad8b1aafSjsg dig_port->base.post_disable(state, &dig_port->base,
645c349dbc7Sjsg old_crtc_state, NULL);
646c349dbc7Sjsg
647ad8b1aafSjsg drm_dbg_kms(&dev_priv->drm, "active links %d\n",
648ad8b1aafSjsg intel_dp->active_mst_links);
649c349dbc7Sjsg }
650c349dbc7Sjsg
intel_mst_post_pll_disable_dp(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * old_crtc_state,const struct drm_connector_state * old_conn_state)651f005ef32Sjsg static void intel_mst_post_pll_disable_dp(struct intel_atomic_state *state,
652f005ef32Sjsg struct intel_encoder *encoder,
653f005ef32Sjsg const struct intel_crtc_state *old_crtc_state,
654f005ef32Sjsg const struct drm_connector_state *old_conn_state)
655f005ef32Sjsg {
656f005ef32Sjsg struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
657f005ef32Sjsg struct intel_digital_port *dig_port = intel_mst->primary;
658f005ef32Sjsg struct intel_dp *intel_dp = &dig_port->dp;
659f005ef32Sjsg
660f005ef32Sjsg if (intel_dp->active_mst_links == 0 &&
661f005ef32Sjsg dig_port->base.post_pll_disable)
662f005ef32Sjsg dig_port->base.post_pll_disable(state, encoder, old_crtc_state, old_conn_state);
663f005ef32Sjsg }
664f005ef32Sjsg
intel_mst_pre_pll_enable_dp(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * pipe_config,const struct drm_connector_state * conn_state)665ad8b1aafSjsg static void intel_mst_pre_pll_enable_dp(struct intel_atomic_state *state,
666ad8b1aafSjsg struct intel_encoder *encoder,
667c349dbc7Sjsg const struct intel_crtc_state *pipe_config,
668c349dbc7Sjsg const struct drm_connector_state *conn_state)
669c349dbc7Sjsg {
670c349dbc7Sjsg struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
671ad8b1aafSjsg struct intel_digital_port *dig_port = intel_mst->primary;
672ad8b1aafSjsg struct intel_dp *intel_dp = &dig_port->dp;
673c349dbc7Sjsg
674c349dbc7Sjsg if (intel_dp->active_mst_links == 0)
675ad8b1aafSjsg dig_port->base.pre_pll_enable(state, &dig_port->base,
676c349dbc7Sjsg pipe_config, NULL);
677f005ef32Sjsg else
678f005ef32Sjsg /*
679f005ef32Sjsg * The port PLL state needs to get updated for secondary
680f005ef32Sjsg * streams as for the primary stream.
681f005ef32Sjsg */
682f005ef32Sjsg intel_ddi_update_active_dpll(state, &dig_port->base,
683f005ef32Sjsg to_intel_crtc(pipe_config->uapi.crtc));
684c349dbc7Sjsg }
685c349dbc7Sjsg
intel_mst_pre_enable_dp(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * pipe_config,const struct drm_connector_state * conn_state)686ad8b1aafSjsg static void intel_mst_pre_enable_dp(struct intel_atomic_state *state,
687ad8b1aafSjsg struct intel_encoder *encoder,
688c349dbc7Sjsg const struct intel_crtc_state *pipe_config,
689c349dbc7Sjsg const struct drm_connector_state *conn_state)
690c349dbc7Sjsg {
691c349dbc7Sjsg struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
692ad8b1aafSjsg struct intel_digital_port *dig_port = intel_mst->primary;
693ad8b1aafSjsg struct intel_dp *intel_dp = &dig_port->dp;
694c349dbc7Sjsg struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
695c349dbc7Sjsg struct intel_connector *connector =
696c349dbc7Sjsg to_intel_connector(conn_state->connector);
6971bb76ff1Sjsg struct drm_dp_mst_topology_state *mst_state =
6981bb76ff1Sjsg drm_atomic_get_new_mst_topology_state(&state->base, &intel_dp->mst_mgr);
699c349dbc7Sjsg int ret;
700c349dbc7Sjsg bool first_mst_stream;
701c349dbc7Sjsg
702c349dbc7Sjsg /* MST encoders are bound to a crtc, not to a connector,
703c349dbc7Sjsg * force the mapping here for get_hw_state.
704c349dbc7Sjsg */
705c349dbc7Sjsg connector->encoder = encoder;
706c349dbc7Sjsg intel_mst->connector = connector;
707c349dbc7Sjsg first_mst_stream = intel_dp->active_mst_links == 0;
708c349dbc7Sjsg drm_WARN_ON(&dev_priv->drm,
7095ca02815Sjsg DISPLAY_VER(dev_priv) >= 12 && first_mst_stream &&
710c349dbc7Sjsg !intel_dp_mst_is_master_trans(pipe_config));
711c349dbc7Sjsg
712ad8b1aafSjsg drm_dbg_kms(&dev_priv->drm, "active links %d\n",
713ad8b1aafSjsg intel_dp->active_mst_links);
714c349dbc7Sjsg
715c349dbc7Sjsg if (first_mst_stream)
716ad8b1aafSjsg intel_dp_set_power(intel_dp, DP_SET_POWER_D0);
717c349dbc7Sjsg
718c349dbc7Sjsg drm_dp_send_power_updown_phy(&intel_dp->mst_mgr, connector->port, true);
719c349dbc7Sjsg
720c349dbc7Sjsg if (first_mst_stream)
721ad8b1aafSjsg dig_port->base.pre_enable(state, &dig_port->base,
722c349dbc7Sjsg pipe_config, NULL);
723c349dbc7Sjsg
724c349dbc7Sjsg intel_dp->active_mst_links++;
725c349dbc7Sjsg
7261bb76ff1Sjsg ret = drm_dp_add_payload_part1(&intel_dp->mst_mgr, mst_state,
7271bb76ff1Sjsg drm_atomic_get_mst_payload_state(mst_state, connector->port));
7281bb76ff1Sjsg if (ret < 0)
7291bb76ff1Sjsg drm_err(&dev_priv->drm, "Failed to create MST payload for %s: %d\n",
7301bb76ff1Sjsg connector->base.name, ret);
731c349dbc7Sjsg
732c349dbc7Sjsg /*
733c349dbc7Sjsg * Before Gen 12 this is not done as part of
734ad8b1aafSjsg * dig_port->base.pre_enable() and should be done here. For
735c349dbc7Sjsg * Gen 12+ the step in which this should be done is different for the
736c349dbc7Sjsg * first MST stream, so it's done on the DDI for the first stream and
737c349dbc7Sjsg * here for the following ones.
738c349dbc7Sjsg */
7395ca02815Sjsg if (DISPLAY_VER(dev_priv) < 12 || !first_mst_stream)
740f005ef32Sjsg intel_ddi_enable_transcoder_clock(encoder, pipe_config);
741c349dbc7Sjsg
742c349dbc7Sjsg intel_ddi_set_dp_msa(pipe_config, conn_state);
743c349dbc7Sjsg }
744c349dbc7Sjsg
intel_mst_enable_dp(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * pipe_config,const struct drm_connector_state * conn_state)745ad8b1aafSjsg static void intel_mst_enable_dp(struct intel_atomic_state *state,
746ad8b1aafSjsg struct intel_encoder *encoder,
747c349dbc7Sjsg const struct intel_crtc_state *pipe_config,
748c349dbc7Sjsg const struct drm_connector_state *conn_state)
749c349dbc7Sjsg {
750c349dbc7Sjsg struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
751ad8b1aafSjsg struct intel_digital_port *dig_port = intel_mst->primary;
752ad8b1aafSjsg struct intel_dp *intel_dp = &dig_port->dp;
7531bb76ff1Sjsg struct intel_connector *connector = to_intel_connector(conn_state->connector);
754c349dbc7Sjsg struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
7551bb76ff1Sjsg struct drm_dp_mst_topology_state *mst_state =
7561bb76ff1Sjsg drm_atomic_get_new_mst_topology_state(&state->base, &intel_dp->mst_mgr);
7575ca02815Sjsg enum transcoder trans = pipe_config->cpu_transcoder;
758c349dbc7Sjsg
759c349dbc7Sjsg drm_WARN_ON(&dev_priv->drm, pipe_config->has_pch_encoder);
760c349dbc7Sjsg
7615ca02815Sjsg clear_act_sent(encoder, pipe_config);
762ad8b1aafSjsg
7631bb76ff1Sjsg if (intel_dp_is_uhbr(pipe_config)) {
7641bb76ff1Sjsg const struct drm_display_mode *adjusted_mode =
7651bb76ff1Sjsg &pipe_config->hw.adjusted_mode;
7661bb76ff1Sjsg u64 crtc_clock_hz = KHz(adjusted_mode->crtc_clock);
7671bb76ff1Sjsg
7681bb76ff1Sjsg intel_de_write(dev_priv, TRANS_DP2_VFREQHIGH(pipe_config->cpu_transcoder),
7691bb76ff1Sjsg TRANS_DP2_VFREQ_PIXEL_CLOCK(crtc_clock_hz >> 24));
7701bb76ff1Sjsg intel_de_write(dev_priv, TRANS_DP2_VFREQLOW(pipe_config->cpu_transcoder),
7711bb76ff1Sjsg TRANS_DP2_VFREQ_PIXEL_CLOCK(crtc_clock_hz & 0xffffff));
7721bb76ff1Sjsg }
7731bb76ff1Sjsg
774ad8b1aafSjsg intel_ddi_enable_transcoder_func(encoder, pipe_config);
775ad8b1aafSjsg
7765ca02815Sjsg intel_de_rmw(dev_priv, TRANS_DDI_FUNC_CTL(trans), 0,
7775ca02815Sjsg TRANS_DDI_DP_VC_PAYLOAD_ALLOC);
778ad8b1aafSjsg
779ad8b1aafSjsg drm_dbg_kms(&dev_priv->drm, "active links %d\n",
780ad8b1aafSjsg intel_dp->active_mst_links);
781ad8b1aafSjsg
7825ca02815Sjsg wait_for_act_sent(encoder, pipe_config);
783ad8b1aafSjsg
7841bb76ff1Sjsg drm_dp_add_payload_part2(&intel_dp->mst_mgr, &state->base,
7851bb76ff1Sjsg drm_atomic_get_mst_payload_state(mst_state, connector->port));
786ad8b1aafSjsg
7871bb76ff1Sjsg if (DISPLAY_VER(dev_priv) >= 14 && pipe_config->fec_enable)
7881bb76ff1Sjsg intel_de_rmw(dev_priv, MTL_CHICKEN_TRANS(trans), 0,
7891bb76ff1Sjsg FECSTALL_DIS_DPTSTREAM_DPTTG);
7901bb76ff1Sjsg else if (DISPLAY_VER(dev_priv) >= 12 && pipe_config->fec_enable)
7915ca02815Sjsg intel_de_rmw(dev_priv, CHICKEN_TRANS(trans), 0,
7925ca02815Sjsg FECSTALL_DIS_DPTSTREAM_DPTTG);
7935ca02815Sjsg
7941bb76ff1Sjsg intel_enable_transcoder(pipe_config);
795c349dbc7Sjsg
796c349dbc7Sjsg intel_crtc_vblank_on(pipe_config);
797c349dbc7Sjsg
798c349dbc7Sjsg intel_audio_codec_enable(encoder, pipe_config, conn_state);
799ad8b1aafSjsg
800ad8b1aafSjsg /* Enable hdcp if it's desired */
801ad8b1aafSjsg if (conn_state->content_protection ==
802ad8b1aafSjsg DRM_MODE_CONTENT_PROTECTION_DESIRED)
803f005ef32Sjsg intel_hdcp_enable(state, encoder, pipe_config, conn_state);
804c349dbc7Sjsg }
805c349dbc7Sjsg
intel_dp_mst_enc_get_hw_state(struct intel_encoder * encoder,enum pipe * pipe)806c349dbc7Sjsg static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder,
807c349dbc7Sjsg enum pipe *pipe)
808c349dbc7Sjsg {
809c349dbc7Sjsg struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
810c349dbc7Sjsg *pipe = intel_mst->pipe;
811c349dbc7Sjsg if (intel_mst->connector)
812c349dbc7Sjsg return true;
813c349dbc7Sjsg return false;
814c349dbc7Sjsg }
815c349dbc7Sjsg
intel_dp_mst_enc_get_config(struct intel_encoder * encoder,struct intel_crtc_state * pipe_config)816c349dbc7Sjsg static void intel_dp_mst_enc_get_config(struct intel_encoder *encoder,
817c349dbc7Sjsg struct intel_crtc_state *pipe_config)
818c349dbc7Sjsg {
819c349dbc7Sjsg struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
820ad8b1aafSjsg struct intel_digital_port *dig_port = intel_mst->primary;
821c349dbc7Sjsg
8225ca02815Sjsg dig_port->base.get_config(&dig_port->base, pipe_config);
8235ca02815Sjsg }
8245ca02815Sjsg
intel_dp_mst_initial_fastset_check(struct intel_encoder * encoder,struct intel_crtc_state * crtc_state)8255ca02815Sjsg static bool intel_dp_mst_initial_fastset_check(struct intel_encoder *encoder,
8265ca02815Sjsg struct intel_crtc_state *crtc_state)
8275ca02815Sjsg {
8285ca02815Sjsg struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
8295ca02815Sjsg struct intel_digital_port *dig_port = intel_mst->primary;
8305ca02815Sjsg
8315ca02815Sjsg return intel_dp_initial_fastset_check(&dig_port->base, crtc_state);
832c349dbc7Sjsg }
833c349dbc7Sjsg
intel_dp_mst_get_ddc_modes(struct drm_connector * connector)834c349dbc7Sjsg static int intel_dp_mst_get_ddc_modes(struct drm_connector *connector)
835c349dbc7Sjsg {
836c349dbc7Sjsg struct intel_connector *intel_connector = to_intel_connector(connector);
837c349dbc7Sjsg struct intel_dp *intel_dp = intel_connector->mst_port;
838f005ef32Sjsg const struct drm_edid *drm_edid;
839c349dbc7Sjsg int ret;
840c349dbc7Sjsg
841c349dbc7Sjsg if (drm_connector_is_unregistered(connector))
842c349dbc7Sjsg return intel_connector_update_modes(connector, NULL);
843c349dbc7Sjsg
844f005ef32Sjsg drm_edid = drm_dp_mst_edid_read(connector, &intel_dp->mst_mgr, intel_connector->port);
845f005ef32Sjsg
846f005ef32Sjsg ret = intel_connector_update_modes(connector, drm_edid);
847f005ef32Sjsg
848f005ef32Sjsg drm_edid_free(drm_edid);
849c349dbc7Sjsg
850c349dbc7Sjsg return ret;
851c349dbc7Sjsg }
852c349dbc7Sjsg
853c349dbc7Sjsg static int
intel_dp_mst_connector_late_register(struct drm_connector * connector)854c349dbc7Sjsg intel_dp_mst_connector_late_register(struct drm_connector *connector)
855c349dbc7Sjsg {
856c349dbc7Sjsg struct intel_connector *intel_connector = to_intel_connector(connector);
857c349dbc7Sjsg int ret;
858c349dbc7Sjsg
859c349dbc7Sjsg ret = drm_dp_mst_connector_late_register(connector,
860c349dbc7Sjsg intel_connector->port);
861c349dbc7Sjsg if (ret < 0)
862c349dbc7Sjsg return ret;
863c349dbc7Sjsg
864c349dbc7Sjsg ret = intel_connector_register(connector);
865c349dbc7Sjsg if (ret < 0)
866c349dbc7Sjsg drm_dp_mst_connector_early_unregister(connector,
867c349dbc7Sjsg intel_connector->port);
868c349dbc7Sjsg
869c349dbc7Sjsg return ret;
870c349dbc7Sjsg }
871c349dbc7Sjsg
872c349dbc7Sjsg static void
intel_dp_mst_connector_early_unregister(struct drm_connector * connector)873c349dbc7Sjsg intel_dp_mst_connector_early_unregister(struct drm_connector *connector)
874c349dbc7Sjsg {
875c349dbc7Sjsg struct intel_connector *intel_connector = to_intel_connector(connector);
876c349dbc7Sjsg
877c349dbc7Sjsg intel_connector_unregister(connector);
878c349dbc7Sjsg drm_dp_mst_connector_early_unregister(connector,
879c349dbc7Sjsg intel_connector->port);
880c349dbc7Sjsg }
881c349dbc7Sjsg
882c349dbc7Sjsg static const struct drm_connector_funcs intel_dp_mst_connector_funcs = {
883c349dbc7Sjsg .fill_modes = drm_helper_probe_single_connector_modes,
884c349dbc7Sjsg .atomic_get_property = intel_digital_connector_atomic_get_property,
885c349dbc7Sjsg .atomic_set_property = intel_digital_connector_atomic_set_property,
886c349dbc7Sjsg .late_register = intel_dp_mst_connector_late_register,
887c349dbc7Sjsg .early_unregister = intel_dp_mst_connector_early_unregister,
888c349dbc7Sjsg .destroy = intel_connector_destroy,
889c349dbc7Sjsg .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
890c349dbc7Sjsg .atomic_duplicate_state = intel_digital_connector_duplicate_state,
891c349dbc7Sjsg };
892c349dbc7Sjsg
intel_dp_mst_get_modes(struct drm_connector * connector)893c349dbc7Sjsg static int intel_dp_mst_get_modes(struct drm_connector *connector)
894c349dbc7Sjsg {
895c349dbc7Sjsg return intel_dp_mst_get_ddc_modes(connector);
896c349dbc7Sjsg }
897c349dbc7Sjsg
898ad8b1aafSjsg static int
intel_dp_mst_mode_valid_ctx(struct drm_connector * connector,struct drm_display_mode * mode,struct drm_modeset_acquire_ctx * ctx,enum drm_mode_status * status)899ad8b1aafSjsg intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
900ad8b1aafSjsg struct drm_display_mode *mode,
901ad8b1aafSjsg struct drm_modeset_acquire_ctx *ctx,
902ad8b1aafSjsg enum drm_mode_status *status)
903c349dbc7Sjsg {
904c349dbc7Sjsg struct drm_i915_private *dev_priv = to_i915(connector->dev);
905c349dbc7Sjsg struct intel_connector *intel_connector = to_intel_connector(connector);
906c349dbc7Sjsg struct intel_dp *intel_dp = intel_connector->mst_port;
907ad8b1aafSjsg struct drm_dp_mst_topology_mgr *mgr = &intel_dp->mst_mgr;
908ad8b1aafSjsg struct drm_dp_mst_port *port = intel_connector->port;
909ad8b1aafSjsg const int min_bpp = 18;
910c349dbc7Sjsg int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
911c349dbc7Sjsg int max_rate, mode_rate, max_lanes, max_link_clock;
912ad8b1aafSjsg int ret;
913f005ef32Sjsg bool dsc = false, bigjoiner = false;
914f005ef32Sjsg u16 dsc_max_output_bpp = 0;
915f005ef32Sjsg u8 dsc_slice_count = 0;
916f005ef32Sjsg int target_clock = mode->clock;
917c349dbc7Sjsg
918ad8b1aafSjsg if (drm_connector_is_unregistered(connector)) {
919ad8b1aafSjsg *status = MODE_ERROR;
920ad8b1aafSjsg return 0;
921ad8b1aafSjsg }
922c349dbc7Sjsg
9232bd53da4Sjsg *status = intel_cpu_transcoder_mode_valid(dev_priv, mode);
9242bd53da4Sjsg if (*status != MODE_OK)
9252bd53da4Sjsg return 0;
9262bd53da4Sjsg
927ad8b1aafSjsg if (mode->flags & DRM_MODE_FLAG_DBLSCAN) {
928ad8b1aafSjsg *status = MODE_NO_DBLESCAN;
929ad8b1aafSjsg return 0;
930ad8b1aafSjsg }
931c349dbc7Sjsg
932c349dbc7Sjsg max_link_clock = intel_dp_max_link_rate(intel_dp);
933c349dbc7Sjsg max_lanes = intel_dp_max_lane_count(intel_dp);
934c349dbc7Sjsg
935c349dbc7Sjsg max_rate = intel_dp_max_data_rate(max_link_clock, max_lanes);
936ad8b1aafSjsg mode_rate = intel_dp_link_required(mode->clock, min_bpp);
937c349dbc7Sjsg
938ad8b1aafSjsg ret = drm_modeset_lock(&mgr->base.lock, ctx);
939ad8b1aafSjsg if (ret)
940ad8b1aafSjsg return ret;
941c349dbc7Sjsg
942ad8b1aafSjsg if (mode_rate > max_rate || mode->clock > max_dotclk ||
943065458a7Sjsg drm_dp_calc_pbn_mode(mode->clock, min_bpp << 4) > port->full_pbn) {
944ad8b1aafSjsg *status = MODE_CLOCK_HIGH;
945ad8b1aafSjsg return 0;
946ad8b1aafSjsg }
947c349dbc7Sjsg
948ad8b1aafSjsg if (mode->clock < 10000) {
949ad8b1aafSjsg *status = MODE_CLOCK_LOW;
950ad8b1aafSjsg return 0;
951ad8b1aafSjsg }
952c349dbc7Sjsg
953ad8b1aafSjsg if (mode->flags & DRM_MODE_FLAG_DBLCLK) {
954ad8b1aafSjsg *status = MODE_H_ILLEGAL;
955ad8b1aafSjsg return 0;
956ad8b1aafSjsg }
957ad8b1aafSjsg
958f005ef32Sjsg if (intel_dp_need_bigjoiner(intel_dp, mode->hdisplay, target_clock)) {
959f005ef32Sjsg bigjoiner = true;
960f005ef32Sjsg max_dotclk *= 2;
961f005ef32Sjsg
962f005ef32Sjsg /* TODO: add support for bigjoiner */
963f005ef32Sjsg *status = MODE_CLOCK_HIGH;
964f005ef32Sjsg return 0;
965f005ef32Sjsg }
966f005ef32Sjsg
967*6198737bSjsg if (HAS_DSC_MST(dev_priv) &&
968f005ef32Sjsg drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)) {
969f005ef32Sjsg /*
970f005ef32Sjsg * TBD pass the connector BPC,
971f005ef32Sjsg * for now U8_MAX so that max BPC on that platform would be picked
972f005ef32Sjsg */
973f005ef32Sjsg int pipe_bpp = intel_dp_dsc_compute_bpp(intel_dp, U8_MAX);
974f005ef32Sjsg
975f005ef32Sjsg if (drm_dp_sink_supports_fec(intel_dp->fec_capable)) {
976f005ef32Sjsg dsc_max_output_bpp =
977f005ef32Sjsg intel_dp_dsc_get_output_bpp(dev_priv,
978f005ef32Sjsg max_link_clock,
979f005ef32Sjsg max_lanes,
980f005ef32Sjsg target_clock,
981f005ef32Sjsg mode->hdisplay,
982f005ef32Sjsg bigjoiner,
983f005ef32Sjsg pipe_bpp, 64) >> 4;
984f005ef32Sjsg dsc_slice_count =
985f005ef32Sjsg intel_dp_dsc_get_slice_count(intel_dp,
986f005ef32Sjsg target_clock,
987f005ef32Sjsg mode->hdisplay,
988f005ef32Sjsg bigjoiner);
989f005ef32Sjsg }
990f005ef32Sjsg
991f005ef32Sjsg dsc = dsc_max_output_bpp && dsc_slice_count;
992f005ef32Sjsg }
993f005ef32Sjsg
994f005ef32Sjsg /*
995f005ef32Sjsg * Big joiner configuration needs DSC for TGL which is not true for
996f005ef32Sjsg * XE_LPD where uncompressed joiner is supported.
997f005ef32Sjsg */
998f005ef32Sjsg if (DISPLAY_VER(dev_priv) < 13 && bigjoiner && !dsc) {
999f005ef32Sjsg *status = MODE_CLOCK_HIGH;
1000f005ef32Sjsg return 0;
1001f005ef32Sjsg }
1002f005ef32Sjsg
1003f005ef32Sjsg if (mode_rate > max_rate && !dsc) {
1004f005ef32Sjsg *status = MODE_CLOCK_HIGH;
1005f005ef32Sjsg return 0;
1006f005ef32Sjsg }
1007f005ef32Sjsg
10085ca02815Sjsg *status = intel_mode_valid_max_plane_size(dev_priv, mode, false);
1009ad8b1aafSjsg return 0;
1010c349dbc7Sjsg }
1011c349dbc7Sjsg
intel_mst_atomic_best_encoder(struct drm_connector * connector,struct drm_atomic_state * state)1012c349dbc7Sjsg static struct drm_encoder *intel_mst_atomic_best_encoder(struct drm_connector *connector,
10135ca02815Sjsg struct drm_atomic_state *state)
1014c349dbc7Sjsg {
10155ca02815Sjsg struct drm_connector_state *connector_state = drm_atomic_get_new_connector_state(state,
10165ca02815Sjsg connector);
1017c349dbc7Sjsg struct intel_connector *intel_connector = to_intel_connector(connector);
1018c349dbc7Sjsg struct intel_dp *intel_dp = intel_connector->mst_port;
10195ca02815Sjsg struct intel_crtc *crtc = to_intel_crtc(connector_state->crtc);
1020c349dbc7Sjsg
1021c349dbc7Sjsg return &intel_dp->mst_encoders[crtc->pipe]->base.base;
1022c349dbc7Sjsg }
1023c349dbc7Sjsg
1024c349dbc7Sjsg static int
intel_dp_mst_detect(struct drm_connector * connector,struct drm_modeset_acquire_ctx * ctx,bool force)1025c349dbc7Sjsg intel_dp_mst_detect(struct drm_connector *connector,
1026c349dbc7Sjsg struct drm_modeset_acquire_ctx *ctx, bool force)
1027c349dbc7Sjsg {
1028ad8b1aafSjsg struct drm_i915_private *i915 = to_i915(connector->dev);
1029c349dbc7Sjsg struct intel_connector *intel_connector = to_intel_connector(connector);
1030c349dbc7Sjsg struct intel_dp *intel_dp = intel_connector->mst_port;
1031c349dbc7Sjsg
1032ad8b1aafSjsg if (!INTEL_DISPLAY_ENABLED(i915))
1033ad8b1aafSjsg return connector_status_disconnected;
1034ad8b1aafSjsg
1035c349dbc7Sjsg if (drm_connector_is_unregistered(connector))
1036c349dbc7Sjsg return connector_status_disconnected;
1037c349dbc7Sjsg
1038c349dbc7Sjsg return drm_dp_mst_detect_port(connector, ctx, &intel_dp->mst_mgr,
1039c349dbc7Sjsg intel_connector->port);
1040c349dbc7Sjsg }
1041c349dbc7Sjsg
1042c349dbc7Sjsg static const struct drm_connector_helper_funcs intel_dp_mst_connector_helper_funcs = {
1043c349dbc7Sjsg .get_modes = intel_dp_mst_get_modes,
1044ad8b1aafSjsg .mode_valid_ctx = intel_dp_mst_mode_valid_ctx,
1045c349dbc7Sjsg .atomic_best_encoder = intel_mst_atomic_best_encoder,
1046c349dbc7Sjsg .atomic_check = intel_dp_mst_atomic_check,
1047c349dbc7Sjsg .detect_ctx = intel_dp_mst_detect,
1048c349dbc7Sjsg };
1049c349dbc7Sjsg
intel_dp_mst_encoder_destroy(struct drm_encoder * encoder)1050c349dbc7Sjsg static void intel_dp_mst_encoder_destroy(struct drm_encoder *encoder)
1051c349dbc7Sjsg {
1052c349dbc7Sjsg struct intel_dp_mst_encoder *intel_mst = enc_to_mst(to_intel_encoder(encoder));
1053c349dbc7Sjsg
1054c349dbc7Sjsg drm_encoder_cleanup(encoder);
1055c349dbc7Sjsg kfree(intel_mst);
1056c349dbc7Sjsg }
1057c349dbc7Sjsg
1058c349dbc7Sjsg static const struct drm_encoder_funcs intel_dp_mst_enc_funcs = {
1059c349dbc7Sjsg .destroy = intel_dp_mst_encoder_destroy,
1060c349dbc7Sjsg };
1061c349dbc7Sjsg
intel_dp_mst_get_hw_state(struct intel_connector * connector)1062c349dbc7Sjsg static bool intel_dp_mst_get_hw_state(struct intel_connector *connector)
1063c349dbc7Sjsg {
1064c349dbc7Sjsg if (intel_attached_encoder(connector) && connector->base.state->crtc) {
1065c349dbc7Sjsg enum pipe pipe;
1066c349dbc7Sjsg if (!intel_attached_encoder(connector)->get_hw_state(intel_attached_encoder(connector), &pipe))
1067c349dbc7Sjsg return false;
1068c349dbc7Sjsg return true;
1069c349dbc7Sjsg }
1070c349dbc7Sjsg return false;
1071c349dbc7Sjsg }
1072c349dbc7Sjsg
intel_dp_mst_add_properties(struct intel_dp * intel_dp,struct drm_connector * connector,const char * pathprop)1073f005ef32Sjsg static int intel_dp_mst_add_properties(struct intel_dp *intel_dp,
1074f005ef32Sjsg struct drm_connector *connector,
1075f005ef32Sjsg const char *pathprop)
1076f005ef32Sjsg {
1077f005ef32Sjsg struct drm_i915_private *i915 = to_i915(connector->dev);
1078f005ef32Sjsg
1079f005ef32Sjsg drm_object_attach_property(&connector->base,
1080f005ef32Sjsg i915->drm.mode_config.path_property, 0);
1081f005ef32Sjsg drm_object_attach_property(&connector->base,
1082f005ef32Sjsg i915->drm.mode_config.tile_property, 0);
1083f005ef32Sjsg
1084f005ef32Sjsg intel_attach_force_audio_property(connector);
1085f005ef32Sjsg intel_attach_broadcast_rgb_property(connector);
1086f005ef32Sjsg
1087f005ef32Sjsg /*
1088f005ef32Sjsg * Reuse the prop from the SST connector because we're
1089f005ef32Sjsg * not allowed to create new props after device registration.
1090f005ef32Sjsg */
1091f005ef32Sjsg connector->max_bpc_property =
1092f005ef32Sjsg intel_dp->attached_connector->base.max_bpc_property;
1093f005ef32Sjsg if (connector->max_bpc_property)
1094f005ef32Sjsg drm_connector_attach_max_bpc_property(connector, 6, 12);
1095f005ef32Sjsg
1096f005ef32Sjsg return drm_connector_set_path_property(connector, pathprop);
1097f005ef32Sjsg }
1098f005ef32Sjsg
intel_dp_add_mst_connector(struct drm_dp_mst_topology_mgr * mgr,struct drm_dp_mst_port * port,const char * pathprop)1099f005ef32Sjsg static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
1100f005ef32Sjsg struct drm_dp_mst_port *port,
1101f005ef32Sjsg const char *pathprop)
1102c349dbc7Sjsg {
1103c349dbc7Sjsg struct intel_dp *intel_dp = container_of(mgr, struct intel_dp, mst_mgr);
1104ad8b1aafSjsg struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
1105ad8b1aafSjsg struct drm_device *dev = dig_port->base.base.dev;
1106c349dbc7Sjsg struct drm_i915_private *dev_priv = to_i915(dev);
1107c349dbc7Sjsg struct intel_connector *intel_connector;
1108c349dbc7Sjsg struct drm_connector *connector;
1109c349dbc7Sjsg enum pipe pipe;
1110c349dbc7Sjsg int ret;
1111c349dbc7Sjsg
1112c349dbc7Sjsg intel_connector = intel_connector_alloc();
1113c349dbc7Sjsg if (!intel_connector)
1114c349dbc7Sjsg return NULL;
1115c349dbc7Sjsg
1116c349dbc7Sjsg intel_connector->get_hw_state = intel_dp_mst_get_hw_state;
1117c349dbc7Sjsg intel_connector->mst_port = intel_dp;
1118c349dbc7Sjsg intel_connector->port = port;
1119c349dbc7Sjsg drm_dp_mst_get_port_malloc(port);
1120c349dbc7Sjsg
1121c349dbc7Sjsg connector = &intel_connector->base;
1122c349dbc7Sjsg ret = drm_connector_init(dev, connector, &intel_dp_mst_connector_funcs,
1123c349dbc7Sjsg DRM_MODE_CONNECTOR_DisplayPort);
1124c349dbc7Sjsg if (ret) {
112576a1f421Sjsg drm_dp_mst_put_port_malloc(port);
1126c349dbc7Sjsg intel_connector_free(intel_connector);
1127c349dbc7Sjsg return NULL;
1128c349dbc7Sjsg }
1129c349dbc7Sjsg
1130c349dbc7Sjsg drm_connector_helper_add(connector, &intel_dp_mst_connector_helper_funcs);
1131c349dbc7Sjsg
1132c349dbc7Sjsg for_each_pipe(dev_priv, pipe) {
1133c349dbc7Sjsg struct drm_encoder *enc =
1134c349dbc7Sjsg &intel_dp->mst_encoders[pipe]->base.base;
1135c349dbc7Sjsg
1136c349dbc7Sjsg ret = drm_connector_attach_encoder(&intel_connector->base, enc);
1137c349dbc7Sjsg if (ret)
1138c349dbc7Sjsg goto err;
1139c349dbc7Sjsg }
1140c349dbc7Sjsg
1141f005ef32Sjsg ret = intel_dp_mst_add_properties(intel_dp, connector, pathprop);
1142c349dbc7Sjsg if (ret)
1143c349dbc7Sjsg goto err;
1144c349dbc7Sjsg
11455ca02815Sjsg ret = intel_dp_hdcp_init(dig_port, intel_connector);
1146ad8b1aafSjsg if (ret)
11475ca02815Sjsg drm_dbg_kms(&dev_priv->drm, "[%s:%d] HDCP MST init failed, skipping.\n",
11485ca02815Sjsg connector->name, connector->base.id);
1149c349dbc7Sjsg
1150c349dbc7Sjsg return connector;
1151c349dbc7Sjsg
1152c349dbc7Sjsg err:
1153c349dbc7Sjsg drm_connector_cleanup(connector);
1154c349dbc7Sjsg return NULL;
1155c349dbc7Sjsg }
1156c349dbc7Sjsg
1157ad8b1aafSjsg static void
intel_dp_mst_poll_hpd_irq(struct drm_dp_mst_topology_mgr * mgr)1158ad8b1aafSjsg intel_dp_mst_poll_hpd_irq(struct drm_dp_mst_topology_mgr *mgr)
1159ad8b1aafSjsg {
1160ad8b1aafSjsg struct intel_dp *intel_dp = container_of(mgr, struct intel_dp, mst_mgr);
1161ad8b1aafSjsg
1162ad8b1aafSjsg intel_hpd_trigger_irq(dp_to_dig_port(intel_dp));
1163ad8b1aafSjsg }
1164ad8b1aafSjsg
1165c349dbc7Sjsg static const struct drm_dp_mst_topology_cbs mst_cbs = {
1166c349dbc7Sjsg .add_connector = intel_dp_add_mst_connector,
1167ad8b1aafSjsg .poll_hpd_irq = intel_dp_mst_poll_hpd_irq,
1168c349dbc7Sjsg };
1169c349dbc7Sjsg
1170c349dbc7Sjsg static struct intel_dp_mst_encoder *
intel_dp_create_fake_mst_encoder(struct intel_digital_port * dig_port,enum pipe pipe)1171ad8b1aafSjsg intel_dp_create_fake_mst_encoder(struct intel_digital_port *dig_port, enum pipe pipe)
1172c349dbc7Sjsg {
1173c349dbc7Sjsg struct intel_dp_mst_encoder *intel_mst;
1174c349dbc7Sjsg struct intel_encoder *intel_encoder;
1175ad8b1aafSjsg struct drm_device *dev = dig_port->base.base.dev;
1176c349dbc7Sjsg
1177c349dbc7Sjsg intel_mst = kzalloc(sizeof(*intel_mst), GFP_KERNEL);
1178c349dbc7Sjsg
1179c349dbc7Sjsg if (!intel_mst)
1180c349dbc7Sjsg return NULL;
1181c349dbc7Sjsg
1182c349dbc7Sjsg intel_mst->pipe = pipe;
1183c349dbc7Sjsg intel_encoder = &intel_mst->base;
1184ad8b1aafSjsg intel_mst->primary = dig_port;
1185c349dbc7Sjsg
1186c349dbc7Sjsg drm_encoder_init(dev, &intel_encoder->base, &intel_dp_mst_enc_funcs,
1187c349dbc7Sjsg DRM_MODE_ENCODER_DPMST, "DP-MST %c", pipe_name(pipe));
1188c349dbc7Sjsg
1189c349dbc7Sjsg intel_encoder->type = INTEL_OUTPUT_DP_MST;
1190ad8b1aafSjsg intel_encoder->power_domain = dig_port->base.power_domain;
1191ad8b1aafSjsg intel_encoder->port = dig_port->base.port;
1192c349dbc7Sjsg intel_encoder->cloneable = 0;
1193c349dbc7Sjsg /*
1194c349dbc7Sjsg * This is wrong, but broken userspace uses the intersection
1195c349dbc7Sjsg * of possible_crtcs of all the encoders of a given connector
1196c349dbc7Sjsg * to figure out which crtcs can drive said connector. What
1197c349dbc7Sjsg * should be used instead is the union of possible_crtcs.
1198c349dbc7Sjsg * To keep such userspace functioning we must misconfigure
1199c349dbc7Sjsg * this to make sure the intersection is not empty :(
1200c349dbc7Sjsg */
1201c349dbc7Sjsg intel_encoder->pipe_mask = ~0;
1202c349dbc7Sjsg
1203c349dbc7Sjsg intel_encoder->compute_config = intel_dp_mst_compute_config;
1204ad8b1aafSjsg intel_encoder->compute_config_late = intel_dp_mst_compute_config_late;
1205c349dbc7Sjsg intel_encoder->disable = intel_mst_disable_dp;
1206c349dbc7Sjsg intel_encoder->post_disable = intel_mst_post_disable_dp;
1207f005ef32Sjsg intel_encoder->post_pll_disable = intel_mst_post_pll_disable_dp;
1208ad8b1aafSjsg intel_encoder->update_pipe = intel_ddi_update_pipe;
1209c349dbc7Sjsg intel_encoder->pre_pll_enable = intel_mst_pre_pll_enable_dp;
1210c349dbc7Sjsg intel_encoder->pre_enable = intel_mst_pre_enable_dp;
1211c349dbc7Sjsg intel_encoder->enable = intel_mst_enable_dp;
1212c349dbc7Sjsg intel_encoder->get_hw_state = intel_dp_mst_enc_get_hw_state;
1213c349dbc7Sjsg intel_encoder->get_config = intel_dp_mst_enc_get_config;
12145ca02815Sjsg intel_encoder->initial_fastset_check = intel_dp_mst_initial_fastset_check;
1215c349dbc7Sjsg
1216c349dbc7Sjsg return intel_mst;
1217c349dbc7Sjsg
1218c349dbc7Sjsg }
1219c349dbc7Sjsg
1220c349dbc7Sjsg static bool
intel_dp_create_fake_mst_encoders(struct intel_digital_port * dig_port)1221ad8b1aafSjsg intel_dp_create_fake_mst_encoders(struct intel_digital_port *dig_port)
1222c349dbc7Sjsg {
1223ad8b1aafSjsg struct intel_dp *intel_dp = &dig_port->dp;
1224ad8b1aafSjsg struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
1225c349dbc7Sjsg enum pipe pipe;
1226c349dbc7Sjsg
1227c349dbc7Sjsg for_each_pipe(dev_priv, pipe)
1228ad8b1aafSjsg intel_dp->mst_encoders[pipe] = intel_dp_create_fake_mst_encoder(dig_port, pipe);
1229c349dbc7Sjsg return true;
1230c349dbc7Sjsg }
1231c349dbc7Sjsg
1232c349dbc7Sjsg int
intel_dp_mst_encoder_active_links(struct intel_digital_port * dig_port)1233ad8b1aafSjsg intel_dp_mst_encoder_active_links(struct intel_digital_port *dig_port)
1234c349dbc7Sjsg {
1235ad8b1aafSjsg return dig_port->dp.active_mst_links;
1236c349dbc7Sjsg }
1237c349dbc7Sjsg
1238c349dbc7Sjsg int
intel_dp_mst_encoder_init(struct intel_digital_port * dig_port,int conn_base_id)1239ad8b1aafSjsg intel_dp_mst_encoder_init(struct intel_digital_port *dig_port, int conn_base_id)
1240c349dbc7Sjsg {
1241ad8b1aafSjsg struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1242ad8b1aafSjsg struct intel_dp *intel_dp = &dig_port->dp;
1243ad8b1aafSjsg enum port port = dig_port->base.port;
1244c349dbc7Sjsg int ret;
1245c349dbc7Sjsg
1246c349dbc7Sjsg if (!HAS_DP_MST(i915) || intel_dp_is_edp(intel_dp))
1247c349dbc7Sjsg return 0;
1248c349dbc7Sjsg
12495ca02815Sjsg if (DISPLAY_VER(i915) < 12 && port == PORT_A)
1250c349dbc7Sjsg return 0;
1251c349dbc7Sjsg
12525ca02815Sjsg if (DISPLAY_VER(i915) < 11 && port == PORT_E)
1253c349dbc7Sjsg return 0;
1254c349dbc7Sjsg
1255c349dbc7Sjsg intel_dp->mst_mgr.cbs = &mst_cbs;
1256c349dbc7Sjsg
1257c349dbc7Sjsg /* create encoders */
1258ad8b1aafSjsg intel_dp_create_fake_mst_encoders(dig_port);
1259c349dbc7Sjsg ret = drm_dp_mst_topology_mgr_init(&intel_dp->mst_mgr, &i915->drm,
12601bb76ff1Sjsg &intel_dp->aux, 16, 3, conn_base_id);
12611bb76ff1Sjsg if (ret) {
12621bb76ff1Sjsg intel_dp->mst_mgr.cbs = NULL;
1263c349dbc7Sjsg return ret;
12641bb76ff1Sjsg }
1265c349dbc7Sjsg
1266c349dbc7Sjsg return 0;
1267c349dbc7Sjsg }
1268c349dbc7Sjsg
intel_dp_mst_source_support(struct intel_dp * intel_dp)12691bb76ff1Sjsg bool intel_dp_mst_source_support(struct intel_dp *intel_dp)
12701bb76ff1Sjsg {
12711bb76ff1Sjsg return intel_dp->mst_mgr.cbs;
12721bb76ff1Sjsg }
12731bb76ff1Sjsg
1274c349dbc7Sjsg void
intel_dp_mst_encoder_cleanup(struct intel_digital_port * dig_port)1275ad8b1aafSjsg intel_dp_mst_encoder_cleanup(struct intel_digital_port *dig_port)
1276c349dbc7Sjsg {
1277ad8b1aafSjsg struct intel_dp *intel_dp = &dig_port->dp;
1278c349dbc7Sjsg
12791bb76ff1Sjsg if (!intel_dp_mst_source_support(intel_dp))
1280c349dbc7Sjsg return;
1281c349dbc7Sjsg
1282c349dbc7Sjsg drm_dp_mst_topology_mgr_destroy(&intel_dp->mst_mgr);
1283c349dbc7Sjsg /* encoders will get killed by normal cleanup */
12841bb76ff1Sjsg
12851bb76ff1Sjsg intel_dp->mst_mgr.cbs = NULL;
1286c349dbc7Sjsg }
1287c349dbc7Sjsg
intel_dp_mst_is_master_trans(const struct intel_crtc_state * crtc_state)1288c349dbc7Sjsg bool intel_dp_mst_is_master_trans(const struct intel_crtc_state *crtc_state)
1289c349dbc7Sjsg {
1290c349dbc7Sjsg return crtc_state->mst_master_transcoder == crtc_state->cpu_transcoder;
1291c349dbc7Sjsg }
1292c349dbc7Sjsg
intel_dp_mst_is_slave_trans(const struct intel_crtc_state * crtc_state)1293c349dbc7Sjsg bool intel_dp_mst_is_slave_trans(const struct intel_crtc_state *crtc_state)
1294c349dbc7Sjsg {
1295c349dbc7Sjsg return crtc_state->mst_master_transcoder != INVALID_TRANSCODER &&
1296c349dbc7Sjsg crtc_state->mst_master_transcoder != crtc_state->cpu_transcoder;
1297c349dbc7Sjsg }
129847f7db4bSjsg
129947f7db4bSjsg /**
130047f7db4bSjsg * intel_dp_mst_add_topology_state_for_connector - add MST topology state for a connector
130147f7db4bSjsg * @state: atomic state
130247f7db4bSjsg * @connector: connector to add the state for
130347f7db4bSjsg * @crtc: the CRTC @connector is attached to
130447f7db4bSjsg *
130547f7db4bSjsg * Add the MST topology state for @connector to @state.
130647f7db4bSjsg *
130747f7db4bSjsg * Returns 0 on success, negative error code on failure.
130847f7db4bSjsg */
130947f7db4bSjsg static int
intel_dp_mst_add_topology_state_for_connector(struct intel_atomic_state * state,struct intel_connector * connector,struct intel_crtc * crtc)131047f7db4bSjsg intel_dp_mst_add_topology_state_for_connector(struct intel_atomic_state *state,
131147f7db4bSjsg struct intel_connector *connector,
131247f7db4bSjsg struct intel_crtc *crtc)
131347f7db4bSjsg {
131447f7db4bSjsg struct drm_dp_mst_topology_state *mst_state;
131547f7db4bSjsg
131647f7db4bSjsg if (!connector->mst_port)
131747f7db4bSjsg return 0;
131847f7db4bSjsg
131947f7db4bSjsg mst_state = drm_atomic_get_mst_topology_state(&state->base,
132047f7db4bSjsg &connector->mst_port->mst_mgr);
132147f7db4bSjsg if (IS_ERR(mst_state))
132247f7db4bSjsg return PTR_ERR(mst_state);
132347f7db4bSjsg
132447f7db4bSjsg mst_state->pending_crtc_mask |= drm_crtc_mask(&crtc->base);
132547f7db4bSjsg
132647f7db4bSjsg return 0;
132747f7db4bSjsg }
132847f7db4bSjsg
132947f7db4bSjsg /**
133047f7db4bSjsg * intel_dp_mst_add_topology_state_for_crtc - add MST topology state for a CRTC
133147f7db4bSjsg * @state: atomic state
133247f7db4bSjsg * @crtc: CRTC to add the state for
133347f7db4bSjsg *
133447f7db4bSjsg * Add the MST topology state for @crtc to @state.
133547f7db4bSjsg *
133647f7db4bSjsg * Returns 0 on success, negative error code on failure.
133747f7db4bSjsg */
intel_dp_mst_add_topology_state_for_crtc(struct intel_atomic_state * state,struct intel_crtc * crtc)133847f7db4bSjsg int intel_dp_mst_add_topology_state_for_crtc(struct intel_atomic_state *state,
133947f7db4bSjsg struct intel_crtc *crtc)
134047f7db4bSjsg {
134147f7db4bSjsg struct drm_connector *_connector;
134247f7db4bSjsg struct drm_connector_state *conn_state;
134347f7db4bSjsg int i;
134447f7db4bSjsg
134547f7db4bSjsg for_each_new_connector_in_state(&state->base, _connector, conn_state, i) {
134647f7db4bSjsg struct intel_connector *connector = to_intel_connector(_connector);
134747f7db4bSjsg int ret;
134847f7db4bSjsg
134947f7db4bSjsg if (conn_state->crtc != &crtc->base)
135047f7db4bSjsg continue;
135147f7db4bSjsg
135247f7db4bSjsg ret = intel_dp_mst_add_topology_state_for_connector(state, connector, crtc);
135347f7db4bSjsg if (ret)
135447f7db4bSjsg return ret;
135547f7db4bSjsg }
135647f7db4bSjsg
135747f7db4bSjsg return 0;
135847f7db4bSjsg }
1359