xref: /openbsd-src/sys/dev/pci/drm/i915/display/intel_dp_mst.c (revision 6198737ba9dd09e7f08f94c46d1b353879eb49c1)
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