xref: /openbsd-src/sys/dev/pci/drm/i915/display/intel_dp.c (revision aa0c546b6087fa0ed9bedb66fff48eb88c631cb4)
1c349dbc7Sjsg /*
2c349dbc7Sjsg  * Copyright © 2008 Intel Corporation
3c349dbc7Sjsg  *
4c349dbc7Sjsg  * Permission is hereby granted, free of charge, to any person obtaining a
5c349dbc7Sjsg  * copy of this software and associated documentation files (the "Software"),
6c349dbc7Sjsg  * to deal in the Software without restriction, including without limitation
7c349dbc7Sjsg  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8c349dbc7Sjsg  * and/or sell copies of the Software, and to permit persons to whom the
9c349dbc7Sjsg  * Software is furnished to do so, subject to the following conditions:
10c349dbc7Sjsg  *
11c349dbc7Sjsg  * The above copyright notice and this permission notice (including the next
12c349dbc7Sjsg  * paragraph) shall be included in all copies or substantial portions of the
13c349dbc7Sjsg  * Software.
14c349dbc7Sjsg  *
15c349dbc7Sjsg  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16c349dbc7Sjsg  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17c349dbc7Sjsg  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18c349dbc7Sjsg  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19c349dbc7Sjsg  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20c349dbc7Sjsg  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21c349dbc7Sjsg  * IN THE SOFTWARE.
22c349dbc7Sjsg  *
23c349dbc7Sjsg  * Authors:
24c349dbc7Sjsg  *    Keith Packard <keithp@keithp.com>
25c349dbc7Sjsg  *
26c349dbc7Sjsg  */
27c349dbc7Sjsg 
28c349dbc7Sjsg #include <linux/export.h>
29c349dbc7Sjsg #include <linux/i2c.h>
30c349dbc7Sjsg #include <linux/notifier.h>
31c349dbc7Sjsg #include <linux/slab.h>
321bb76ff1Sjsg #include <linux/string_helpers.h>
335ca02815Sjsg #include <linux/timekeeping.h>
34c349dbc7Sjsg #include <linux/types.h>
35c349dbc7Sjsg 
36c349dbc7Sjsg #include <asm/byteorder.h>
37c349dbc7Sjsg 
381bb76ff1Sjsg #include <drm/display/drm_dp_helper.h>
391bb76ff1Sjsg #include <drm/display/drm_dsc_helper.h>
401bb76ff1Sjsg #include <drm/display/drm_hdmi_helper.h>
41c349dbc7Sjsg #include <drm/drm_atomic_helper.h>
42c349dbc7Sjsg #include <drm/drm_crtc.h>
43c349dbc7Sjsg #include <drm/drm_edid.h>
44c349dbc7Sjsg #include <drm/drm_probe_helper.h>
45c349dbc7Sjsg 
465ca02815Sjsg #include "g4x_dp.h"
47c349dbc7Sjsg #include "i915_drv.h"
48f005ef32Sjsg #include "i915_irq.h"
49f005ef32Sjsg #include "i915_reg.h"
50c349dbc7Sjsg #include "intel_atomic.h"
51c349dbc7Sjsg #include "intel_audio.h"
52b35a56d4Sjsg #include "intel_backlight.h"
531bb76ff1Sjsg #include "intel_combo_phy_regs.h"
54c349dbc7Sjsg #include "intel_connector.h"
551bb76ff1Sjsg #include "intel_crtc.h"
56f005ef32Sjsg #include "intel_cx0_phy.h"
57c349dbc7Sjsg #include "intel_ddi.h"
585ca02815Sjsg #include "intel_de.h"
59c349dbc7Sjsg #include "intel_display_types.h"
60c349dbc7Sjsg #include "intel_dp.h"
615ca02815Sjsg #include "intel_dp_aux.h"
625ca02815Sjsg #include "intel_dp_hdcp.h"
63c349dbc7Sjsg #include "intel_dp_link_training.h"
64c349dbc7Sjsg #include "intel_dp_mst.h"
65c349dbc7Sjsg #include "intel_dpio_phy.h"
665ca02815Sjsg #include "intel_dpll.h"
67c349dbc7Sjsg #include "intel_fifo_underrun.h"
68c349dbc7Sjsg #include "intel_hdcp.h"
69c349dbc7Sjsg #include "intel_hdmi.h"
70c349dbc7Sjsg #include "intel_hotplug.h"
71f005ef32Sjsg #include "intel_hotplug_irq.h"
72c349dbc7Sjsg #include "intel_lspcon.h"
73c349dbc7Sjsg #include "intel_lvds.h"
74c349dbc7Sjsg #include "intel_panel.h"
751bb76ff1Sjsg #include "intel_pch_display.h"
765ca02815Sjsg #include "intel_pps.h"
77c349dbc7Sjsg #include "intel_psr.h"
78c349dbc7Sjsg #include "intel_tc.h"
79c349dbc7Sjsg #include "intel_vdsc.h"
805ca02815Sjsg #include "intel_vrr.h"
81f005ef32Sjsg #include "intel_crtc_state_dump.h"
82c349dbc7Sjsg 
83c349dbc7Sjsg /* DP DSC throughput values used for slice count calculations KPixels/s */
84c349dbc7Sjsg #define DP_DSC_PEAK_PIXEL_RATE			2720000
85c349dbc7Sjsg #define DP_DSC_MAX_ENC_THROUGHPUT_0		340000
86c349dbc7Sjsg #define DP_DSC_MAX_ENC_THROUGHPUT_1		400000
87c349dbc7Sjsg 
88c349dbc7Sjsg /* DP DSC FEC Overhead factor = 1/(0.972261) */
89c349dbc7Sjsg #define DP_DSC_FEC_OVERHEAD_FACTOR		972261
90c349dbc7Sjsg 
91c349dbc7Sjsg /* Compliance test status bits  */
92c349dbc7Sjsg #define INTEL_DP_RESOLUTION_SHIFT_MASK	0
93c349dbc7Sjsg #define INTEL_DP_RESOLUTION_PREFERRED	(1 << INTEL_DP_RESOLUTION_SHIFT_MASK)
94c349dbc7Sjsg #define INTEL_DP_RESOLUTION_STANDARD	(2 << INTEL_DP_RESOLUTION_SHIFT_MASK)
95c349dbc7Sjsg #define INTEL_DP_RESOLUTION_FAILSAFE	(3 << INTEL_DP_RESOLUTION_SHIFT_MASK)
96c349dbc7Sjsg 
97c349dbc7Sjsg 
98c349dbc7Sjsg /* Constants for DP DSC configurations */
99c349dbc7Sjsg static const u8 valid_dsc_bpp[] = {6, 8, 10, 12, 15};
100c349dbc7Sjsg 
101c349dbc7Sjsg /* With Single pipe configuration, HW is capable of supporting maximum
102c349dbc7Sjsg  * of 4 slices per line.
103c349dbc7Sjsg  */
104c349dbc7Sjsg static const u8 valid_dsc_slicecount[] = {1, 2, 4};
105c349dbc7Sjsg 
106c349dbc7Sjsg /**
107c349dbc7Sjsg  * intel_dp_is_edp - is the given port attached to an eDP panel (either CPU or PCH)
108c349dbc7Sjsg  * @intel_dp: DP struct
109c349dbc7Sjsg  *
110c349dbc7Sjsg  * If a CPU or PCH DP output is attached to an eDP panel, this function
111c349dbc7Sjsg  * will return true, and false otherwise.
1121bb76ff1Sjsg  *
1131bb76ff1Sjsg  * This function is not safe to use prior to encoder type being set.
114c349dbc7Sjsg  */
115c349dbc7Sjsg bool intel_dp_is_edp(struct intel_dp *intel_dp)
116c349dbc7Sjsg {
117ad8b1aafSjsg 	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
118c349dbc7Sjsg 
119ad8b1aafSjsg 	return dig_port->base.type == INTEL_OUTPUT_EDP;
120c349dbc7Sjsg }
121c349dbc7Sjsg 
122c349dbc7Sjsg static void intel_dp_unset_edid(struct intel_dp *intel_dp);
123c349dbc7Sjsg 
1241bb76ff1Sjsg /* Is link rate UHBR and thus 128b/132b? */
1251bb76ff1Sjsg bool intel_dp_is_uhbr(const struct intel_crtc_state *crtc_state)
1261bb76ff1Sjsg {
1271bb76ff1Sjsg 	return crtc_state->port_clock >= 1000000;
1281bb76ff1Sjsg }
1291bb76ff1Sjsg 
13090d1a473Sjsg static void intel_dp_set_default_sink_rates(struct intel_dp *intel_dp)
13190d1a473Sjsg {
13290d1a473Sjsg 	intel_dp->sink_rates[0] = 162000;
13390d1a473Sjsg 	intel_dp->num_sink_rates = 1;
13490d1a473Sjsg }
13590d1a473Sjsg 
136c349dbc7Sjsg /* update sink rates from dpcd */
1371bb76ff1Sjsg static void intel_dp_set_dpcd_sink_rates(struct intel_dp *intel_dp)
138c349dbc7Sjsg {
139c349dbc7Sjsg 	static const int dp_rates[] = {
140c349dbc7Sjsg 		162000, 270000, 540000, 810000
141c349dbc7Sjsg 	};
142c349dbc7Sjsg 	int i, max_rate;
1435ca02815Sjsg 	int max_lttpr_rate;
144c349dbc7Sjsg 
1455ca02815Sjsg 	if (drm_dp_has_quirk(&intel_dp->desc, DP_DPCD_QUIRK_CAN_DO_MAX_LINK_RATE_3_24_GBPS)) {
146ad8b1aafSjsg 		/* Needed, e.g., for Apple MBP 2017, 15 inch eDP Retina panel */
147ad8b1aafSjsg 		static const int quirk_rates[] = { 162000, 270000, 324000 };
148ad8b1aafSjsg 
149ad8b1aafSjsg 		memcpy(intel_dp->sink_rates, quirk_rates, sizeof(quirk_rates));
150ad8b1aafSjsg 		intel_dp->num_sink_rates = ARRAY_SIZE(quirk_rates);
151ad8b1aafSjsg 
152ad8b1aafSjsg 		return;
153ad8b1aafSjsg 	}
154ad8b1aafSjsg 
1551bb76ff1Sjsg 	/*
1561bb76ff1Sjsg 	 * Sink rates for 8b/10b.
1571bb76ff1Sjsg 	 */
158c349dbc7Sjsg 	max_rate = drm_dp_bw_code_to_link_rate(intel_dp->dpcd[DP_MAX_LINK_RATE]);
1595ca02815Sjsg 	max_lttpr_rate = drm_dp_lttpr_max_link_rate(intel_dp->lttpr_common_caps);
1605ca02815Sjsg 	if (max_lttpr_rate)
1615ca02815Sjsg 		max_rate = min(max_rate, max_lttpr_rate);
162c349dbc7Sjsg 
163c349dbc7Sjsg 	for (i = 0; i < ARRAY_SIZE(dp_rates); i++) {
164c349dbc7Sjsg 		if (dp_rates[i] > max_rate)
165c349dbc7Sjsg 			break;
166c349dbc7Sjsg 		intel_dp->sink_rates[i] = dp_rates[i];
167c349dbc7Sjsg 	}
168c349dbc7Sjsg 
1691bb76ff1Sjsg 	/*
1701bb76ff1Sjsg 	 * Sink rates for 128b/132b. If set, sink should support all 8b/10b
1711bb76ff1Sjsg 	 * rates and 10 Gbps.
1721bb76ff1Sjsg 	 */
1731bb76ff1Sjsg 	if (intel_dp->dpcd[DP_MAIN_LINK_CHANNEL_CODING] & DP_CAP_ANSI_128B132B) {
1741bb76ff1Sjsg 		u8 uhbr_rates = 0;
1751bb76ff1Sjsg 
1761bb76ff1Sjsg 		BUILD_BUG_ON(ARRAY_SIZE(intel_dp->sink_rates) < ARRAY_SIZE(dp_rates) + 3);
1771bb76ff1Sjsg 
1781bb76ff1Sjsg 		drm_dp_dpcd_readb(&intel_dp->aux,
1791bb76ff1Sjsg 				  DP_128B132B_SUPPORTED_LINK_RATES, &uhbr_rates);
1801bb76ff1Sjsg 
1811bb76ff1Sjsg 		if (drm_dp_lttpr_count(intel_dp->lttpr_common_caps)) {
1821bb76ff1Sjsg 			/* We have a repeater */
1831bb76ff1Sjsg 			if (intel_dp->lttpr_common_caps[0] >= 0x20 &&
1841bb76ff1Sjsg 			    intel_dp->lttpr_common_caps[DP_MAIN_LINK_CHANNEL_CODING_PHY_REPEATER -
1851bb76ff1Sjsg 							DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV] &
1861bb76ff1Sjsg 			    DP_PHY_REPEATER_128B132B_SUPPORTED) {
1871bb76ff1Sjsg 				/* Repeater supports 128b/132b, valid UHBR rates */
1881bb76ff1Sjsg 				uhbr_rates &= intel_dp->lttpr_common_caps[DP_PHY_REPEATER_128B132B_RATES -
1891bb76ff1Sjsg 									  DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
1901bb76ff1Sjsg 			} else {
1911bb76ff1Sjsg 				/* Does not support 128b/132b */
1921bb76ff1Sjsg 				uhbr_rates = 0;
1931bb76ff1Sjsg 			}
1941bb76ff1Sjsg 		}
1951bb76ff1Sjsg 
1961bb76ff1Sjsg 		if (uhbr_rates & DP_UHBR10)
1971bb76ff1Sjsg 			intel_dp->sink_rates[i++] = 1000000;
1981bb76ff1Sjsg 		if (uhbr_rates & DP_UHBR13_5)
1991bb76ff1Sjsg 			intel_dp->sink_rates[i++] = 1350000;
2001bb76ff1Sjsg 		if (uhbr_rates & DP_UHBR20)
2011bb76ff1Sjsg 			intel_dp->sink_rates[i++] = 2000000;
2021bb76ff1Sjsg 	}
2031bb76ff1Sjsg 
204c349dbc7Sjsg 	intel_dp->num_sink_rates = i;
205c349dbc7Sjsg }
206c349dbc7Sjsg 
2071bb76ff1Sjsg static void intel_dp_set_sink_rates(struct intel_dp *intel_dp)
2081bb76ff1Sjsg {
2091bb76ff1Sjsg 	struct intel_connector *connector = intel_dp->attached_connector;
2101bb76ff1Sjsg 	struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2111bb76ff1Sjsg 	struct intel_encoder *encoder = &intel_dig_port->base;
2121bb76ff1Sjsg 
2131bb76ff1Sjsg 	intel_dp_set_dpcd_sink_rates(intel_dp);
2141bb76ff1Sjsg 
2151bb76ff1Sjsg 	if (intel_dp->num_sink_rates)
2161bb76ff1Sjsg 		return;
2171bb76ff1Sjsg 
2181bb76ff1Sjsg 	drm_err(&dp_to_i915(intel_dp)->drm,
2191bb76ff1Sjsg 		"[CONNECTOR:%d:%s][ENCODER:%d:%s] Invalid DPCD with no link rates, using defaults\n",
2201bb76ff1Sjsg 		connector->base.base.id, connector->base.name,
2211bb76ff1Sjsg 		encoder->base.base.id, encoder->base.name);
2221bb76ff1Sjsg 
2231bb76ff1Sjsg 	intel_dp_set_default_sink_rates(intel_dp);
2241bb76ff1Sjsg }
2251bb76ff1Sjsg 
2261bb76ff1Sjsg static void intel_dp_set_default_max_sink_lane_count(struct intel_dp *intel_dp)
2271bb76ff1Sjsg {
2281bb76ff1Sjsg 	intel_dp->max_sink_lane_count = 1;
2291bb76ff1Sjsg }
2301bb76ff1Sjsg 
2311bb76ff1Sjsg static void intel_dp_set_max_sink_lane_count(struct intel_dp *intel_dp)
2321bb76ff1Sjsg {
2331bb76ff1Sjsg 	struct intel_connector *connector = intel_dp->attached_connector;
2341bb76ff1Sjsg 	struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2351bb76ff1Sjsg 	struct intel_encoder *encoder = &intel_dig_port->base;
2361bb76ff1Sjsg 
2371bb76ff1Sjsg 	intel_dp->max_sink_lane_count = drm_dp_max_lane_count(intel_dp->dpcd);
2381bb76ff1Sjsg 
2391bb76ff1Sjsg 	switch (intel_dp->max_sink_lane_count) {
2401bb76ff1Sjsg 	case 1:
2411bb76ff1Sjsg 	case 2:
2421bb76ff1Sjsg 	case 4:
2431bb76ff1Sjsg 		return;
2441bb76ff1Sjsg 	}
2451bb76ff1Sjsg 
2461bb76ff1Sjsg 	drm_err(&dp_to_i915(intel_dp)->drm,
2471bb76ff1Sjsg 		"[CONNECTOR:%d:%s][ENCODER:%d:%s] Invalid DPCD max lane count (%d), using default\n",
2481bb76ff1Sjsg 		connector->base.base.id, connector->base.name,
2491bb76ff1Sjsg 		encoder->base.base.id, encoder->base.name,
2501bb76ff1Sjsg 		intel_dp->max_sink_lane_count);
2511bb76ff1Sjsg 
2521bb76ff1Sjsg 	intel_dp_set_default_max_sink_lane_count(intel_dp);
2531bb76ff1Sjsg }
2541bb76ff1Sjsg 
255c349dbc7Sjsg /* Get length of rates array potentially limited by max_rate. */
256c349dbc7Sjsg static int intel_dp_rate_limit_len(const int *rates, int len, int max_rate)
257c349dbc7Sjsg {
258c349dbc7Sjsg 	int i;
259c349dbc7Sjsg 
260c349dbc7Sjsg 	/* Limit results by potentially reduced max rate */
261c349dbc7Sjsg 	for (i = 0; i < len; i++) {
262c349dbc7Sjsg 		if (rates[len - i - 1] <= max_rate)
263c349dbc7Sjsg 			return len - i;
264c349dbc7Sjsg 	}
265c349dbc7Sjsg 
266c349dbc7Sjsg 	return 0;
267c349dbc7Sjsg }
268c349dbc7Sjsg 
269c349dbc7Sjsg /* Get length of common rates array potentially limited by max_rate. */
270c349dbc7Sjsg static int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
271c349dbc7Sjsg 					  int max_rate)
272c349dbc7Sjsg {
273c349dbc7Sjsg 	return intel_dp_rate_limit_len(intel_dp->common_rates,
274c349dbc7Sjsg 				       intel_dp->num_common_rates, max_rate);
275c349dbc7Sjsg }
276c349dbc7Sjsg 
2771bb76ff1Sjsg static int intel_dp_common_rate(struct intel_dp *intel_dp, int index)
2781bb76ff1Sjsg {
2791bb76ff1Sjsg 	if (drm_WARN_ON(&dp_to_i915(intel_dp)->drm,
2801bb76ff1Sjsg 			index < 0 || index >= intel_dp->num_common_rates))
2811bb76ff1Sjsg 		return 162000;
2821bb76ff1Sjsg 
2831bb76ff1Sjsg 	return intel_dp->common_rates[index];
2841bb76ff1Sjsg }
2851bb76ff1Sjsg 
286c349dbc7Sjsg /* Theoretical max between source and sink */
287c349dbc7Sjsg static int intel_dp_max_common_rate(struct intel_dp *intel_dp)
288c349dbc7Sjsg {
2891bb76ff1Sjsg 	return intel_dp_common_rate(intel_dp, intel_dp->num_common_rates - 1);
2901bb76ff1Sjsg }
2911bb76ff1Sjsg 
2921bb76ff1Sjsg static int intel_dp_max_source_lane_count(struct intel_digital_port *dig_port)
2931bb76ff1Sjsg {
294f005ef32Sjsg 	int vbt_max_lanes = intel_bios_dp_max_lane_count(dig_port->base.devdata);
2951bb76ff1Sjsg 	int max_lanes = dig_port->max_lanes;
2961bb76ff1Sjsg 
2971bb76ff1Sjsg 	if (vbt_max_lanes)
2981bb76ff1Sjsg 		max_lanes = min(max_lanes, vbt_max_lanes);
2991bb76ff1Sjsg 
3001bb76ff1Sjsg 	return max_lanes;
301c349dbc7Sjsg }
302c349dbc7Sjsg 
303c349dbc7Sjsg /* Theoretical max between source and sink */
304c349dbc7Sjsg static int intel_dp_max_common_lane_count(struct intel_dp *intel_dp)
305c349dbc7Sjsg {
306ad8b1aafSjsg 	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
3071bb76ff1Sjsg 	int source_max = intel_dp_max_source_lane_count(dig_port);
3081bb76ff1Sjsg 	int sink_max = intel_dp->max_sink_lane_count;
309ad8b1aafSjsg 	int fia_max = intel_tc_port_fia_max_lane_count(dig_port);
3105ca02815Sjsg 	int lttpr_max = drm_dp_lttpr_max_lane_count(intel_dp->lttpr_common_caps);
3115ca02815Sjsg 
3125ca02815Sjsg 	if (lttpr_max)
3135ca02815Sjsg 		sink_max = min(sink_max, lttpr_max);
314c349dbc7Sjsg 
315c349dbc7Sjsg 	return min3(source_max, sink_max, fia_max);
316c349dbc7Sjsg }
317c349dbc7Sjsg 
318c349dbc7Sjsg int intel_dp_max_lane_count(struct intel_dp *intel_dp)
319c349dbc7Sjsg {
3201bb76ff1Sjsg 	switch (intel_dp->max_link_lane_count) {
3211bb76ff1Sjsg 	case 1:
3221bb76ff1Sjsg 	case 2:
3231bb76ff1Sjsg 	case 4:
324c349dbc7Sjsg 		return intel_dp->max_link_lane_count;
3251bb76ff1Sjsg 	default:
3261bb76ff1Sjsg 		MISSING_CASE(intel_dp->max_link_lane_count);
3271bb76ff1Sjsg 		return 1;
3281bb76ff1Sjsg 	}
329c349dbc7Sjsg }
330c349dbc7Sjsg 
3311bb76ff1Sjsg /*
3321bb76ff1Sjsg  * The required data bandwidth for a mode with given pixel clock and bpp. This
3331bb76ff1Sjsg  * is the required net bandwidth independent of the data bandwidth efficiency.
3341bb76ff1Sjsg  */
335c349dbc7Sjsg int
336c349dbc7Sjsg intel_dp_link_required(int pixel_clock, int bpp)
337c349dbc7Sjsg {
338c349dbc7Sjsg 	/* pixel_clock is in kHz, divide bpp by 8 for bit to Byte conversion */
339c349dbc7Sjsg 	return DIV_ROUND_UP(pixel_clock * bpp, 8);
340c349dbc7Sjsg }
341c349dbc7Sjsg 
3421bb76ff1Sjsg /*
3431bb76ff1Sjsg  * Given a link rate and lanes, get the data bandwidth.
3441bb76ff1Sjsg  *
3451bb76ff1Sjsg  * Data bandwidth is the actual payload rate, which depends on the data
3461bb76ff1Sjsg  * bandwidth efficiency and the link rate.
3471bb76ff1Sjsg  *
3481bb76ff1Sjsg  * For 8b/10b channel encoding, SST and non-FEC, the data bandwidth efficiency
3491bb76ff1Sjsg  * is 80%. For example, for a 1.62 Gbps link, 1.62*10^9 bps * 0.80 * (1/8) =
3501bb76ff1Sjsg  * 162000 kBps. With 8-bit symbols, we have 162000 kHz symbol clock. Just by
3511bb76ff1Sjsg  * coincidence, the port clock in kHz matches the data bandwidth in kBps, and
3521bb76ff1Sjsg  * they equal the link bit rate in Gbps multiplied by 100000. (Note that this no
3531bb76ff1Sjsg  * longer holds for data bandwidth as soon as FEC or MST is taken into account!)
3541bb76ff1Sjsg  *
3551bb76ff1Sjsg  * For 128b/132b channel encoding, the data bandwidth efficiency is 96.71%. For
3561bb76ff1Sjsg  * example, for a 10 Gbps link, 10*10^9 bps * 0.9671 * (1/8) = 1208875
3571bb76ff1Sjsg  * kBps. With 32-bit symbols, we have 312500 kHz symbol clock. The value 1000000
3581bb76ff1Sjsg  * does not match the symbol clock, the port clock (not even if you think in
3591bb76ff1Sjsg  * terms of a byte clock), nor the data bandwidth. It only matches the link bit
3601bb76ff1Sjsg  * rate in units of 10000 bps.
3611bb76ff1Sjsg  */
362c349dbc7Sjsg int
3631bb76ff1Sjsg intel_dp_max_data_rate(int max_link_rate, int max_lanes)
364c349dbc7Sjsg {
3651bb76ff1Sjsg 	if (max_link_rate >= 1000000) {
3661bb76ff1Sjsg 		/*
3671bb76ff1Sjsg 		 * UHBR rates always use 128b/132b channel encoding, and have
3681bb76ff1Sjsg 		 * 97.71% data bandwidth efficiency. Consider max_link_rate the
3691bb76ff1Sjsg 		 * link bit rate in units of 10000 bps.
3701bb76ff1Sjsg 		 */
3711bb76ff1Sjsg 		int max_link_rate_kbps = max_link_rate * 10;
3721bb76ff1Sjsg 
3731bb76ff1Sjsg 		max_link_rate_kbps = DIV_ROUND_CLOSEST_ULL(mul_u32_u32(max_link_rate_kbps, 9671), 10000);
3741bb76ff1Sjsg 		max_link_rate = max_link_rate_kbps / 8;
3751bb76ff1Sjsg 	}
3761bb76ff1Sjsg 
3771bb76ff1Sjsg 	/*
3781bb76ff1Sjsg 	 * Lower than UHBR rates always use 8b/10b channel encoding, and have
3791bb76ff1Sjsg 	 * 80% data bandwidth efficiency for SST non-FEC. However, this turns
3801bb76ff1Sjsg 	 * out to be a nop by coincidence, and can be skipped:
3811bb76ff1Sjsg 	 *
3821bb76ff1Sjsg 	 *	int max_link_rate_kbps = max_link_rate * 10;
3831bb76ff1Sjsg 	 *	max_link_rate_kbps = DIV_ROUND_CLOSEST_ULL(max_link_rate_kbps * 8, 10);
3841bb76ff1Sjsg 	 *	max_link_rate = max_link_rate_kbps / 8;
385c349dbc7Sjsg 	 */
386c349dbc7Sjsg 
3871bb76ff1Sjsg 	return max_link_rate * max_lanes;
388c349dbc7Sjsg }
389c349dbc7Sjsg 
3905ca02815Sjsg bool intel_dp_can_bigjoiner(struct intel_dp *intel_dp)
391c349dbc7Sjsg {
3925ca02815Sjsg 	struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3935ca02815Sjsg 	struct intel_encoder *encoder = &intel_dig_port->base;
3945ca02815Sjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
395c349dbc7Sjsg 
3963eae31a5Sjsg 	/* eDP MSO is not compatible with joiner */
3973eae31a5Sjsg 	if (intel_dp->mso_link_count)
3983eae31a5Sjsg 		return false;
3993eae31a5Sjsg 
4005ca02815Sjsg 	return DISPLAY_VER(dev_priv) >= 12 ||
4015ca02815Sjsg 		(DISPLAY_VER(dev_priv) == 11 &&
4025ca02815Sjsg 		 encoder->port != PORT_A);
403c349dbc7Sjsg }
404c349dbc7Sjsg 
4051bb76ff1Sjsg static int dg2_max_source_rate(struct intel_dp *intel_dp)
4061bb76ff1Sjsg {
4071bb76ff1Sjsg 	return intel_dp_is_edp(intel_dp) ? 810000 : 1350000;
4081bb76ff1Sjsg }
4091bb76ff1Sjsg 
410c349dbc7Sjsg static int icl_max_source_rate(struct intel_dp *intel_dp)
411c349dbc7Sjsg {
412c349dbc7Sjsg 	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
413c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
414c349dbc7Sjsg 	enum phy phy = intel_port_to_phy(dev_priv, dig_port->base.port);
415c349dbc7Sjsg 
4161bb76ff1Sjsg 	if (intel_phy_is_combo(dev_priv, phy) && !intel_dp_is_edp(intel_dp))
417c349dbc7Sjsg 		return 540000;
418c349dbc7Sjsg 
419c349dbc7Sjsg 	return 810000;
420c349dbc7Sjsg }
421c349dbc7Sjsg 
4225ca02815Sjsg static int ehl_max_source_rate(struct intel_dp *intel_dp)
4235ca02815Sjsg {
4245ca02815Sjsg 	if (intel_dp_is_edp(intel_dp))
4255ca02815Sjsg 		return 540000;
4265ca02815Sjsg 
4275ca02815Sjsg 	return 810000;
4285ca02815Sjsg }
4295ca02815Sjsg 
430f005ef32Sjsg static int mtl_max_source_rate(struct intel_dp *intel_dp)
431f005ef32Sjsg {
432f005ef32Sjsg 	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
433f005ef32Sjsg 	struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
434f005ef32Sjsg 	enum phy phy = intel_port_to_phy(i915, dig_port->base.port);
435f005ef32Sjsg 
436f005ef32Sjsg 	if (intel_is_c10phy(i915, phy))
437f005ef32Sjsg 		return 810000;
438f005ef32Sjsg 
439f005ef32Sjsg 	return 2000000;
440f005ef32Sjsg }
441f005ef32Sjsg 
4421bb76ff1Sjsg static int vbt_max_link_rate(struct intel_dp *intel_dp)
4431bb76ff1Sjsg {
4441bb76ff1Sjsg 	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
4451bb76ff1Sjsg 	int max_rate;
4461bb76ff1Sjsg 
447f005ef32Sjsg 	max_rate = intel_bios_dp_max_link_rate(encoder->devdata);
4481bb76ff1Sjsg 
4491bb76ff1Sjsg 	if (intel_dp_is_edp(intel_dp)) {
4501bb76ff1Sjsg 		struct intel_connector *connector = intel_dp->attached_connector;
4511bb76ff1Sjsg 		int edp_max_rate = connector->panel.vbt.edp.max_link_rate;
4521bb76ff1Sjsg 
4531bb76ff1Sjsg 		if (max_rate && edp_max_rate)
4541bb76ff1Sjsg 			max_rate = min(max_rate, edp_max_rate);
4551bb76ff1Sjsg 		else if (edp_max_rate)
4561bb76ff1Sjsg 			max_rate = edp_max_rate;
4571bb76ff1Sjsg 	}
4581bb76ff1Sjsg 
4591bb76ff1Sjsg 	return max_rate;
4601bb76ff1Sjsg }
4611bb76ff1Sjsg 
462c349dbc7Sjsg static void
463c349dbc7Sjsg intel_dp_set_source_rates(struct intel_dp *intel_dp)
464c349dbc7Sjsg {
465c349dbc7Sjsg 	/* The values must be in increasing order */
466f005ef32Sjsg 	static const int mtl_rates[] = {
467f005ef32Sjsg 		162000, 216000, 243000, 270000, 324000, 432000, 540000, 675000,
468f005ef32Sjsg 		810000,	1000000, 1350000, 2000000,
469f005ef32Sjsg 	};
4705ca02815Sjsg 	static const int icl_rates[] = {
4711bb76ff1Sjsg 		162000, 216000, 270000, 324000, 432000, 540000, 648000, 810000,
4721bb76ff1Sjsg 		1000000, 1350000,
473c349dbc7Sjsg 	};
474c349dbc7Sjsg 	static const int bxt_rates[] = {
475c349dbc7Sjsg 		162000, 216000, 243000, 270000, 324000, 432000, 540000
476c349dbc7Sjsg 	};
477c349dbc7Sjsg 	static const int skl_rates[] = {
478c349dbc7Sjsg 		162000, 216000, 270000, 324000, 432000, 540000
479c349dbc7Sjsg 	};
480c349dbc7Sjsg 	static const int hsw_rates[] = {
481c349dbc7Sjsg 		162000, 270000, 540000
482c349dbc7Sjsg 	};
483c349dbc7Sjsg 	static const int g4x_rates[] = {
484c349dbc7Sjsg 		162000, 270000
485c349dbc7Sjsg 	};
486c349dbc7Sjsg 	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
487c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
488c349dbc7Sjsg 	const int *source_rates;
489c349dbc7Sjsg 	int size, max_rate = 0, vbt_max_rate;
490c349dbc7Sjsg 
491c349dbc7Sjsg 	/* This should only be done once */
492c349dbc7Sjsg 	drm_WARN_ON(&dev_priv->drm,
493c349dbc7Sjsg 		    intel_dp->source_rates || intel_dp->num_source_rates);
494c349dbc7Sjsg 
495f005ef32Sjsg 	if (DISPLAY_VER(dev_priv) >= 14) {
496f005ef32Sjsg 		source_rates = mtl_rates;
497f005ef32Sjsg 		size = ARRAY_SIZE(mtl_rates);
498f005ef32Sjsg 		max_rate = mtl_max_source_rate(intel_dp);
499f005ef32Sjsg 	} else if (DISPLAY_VER(dev_priv) >= 11) {
5005ca02815Sjsg 		source_rates = icl_rates;
5015ca02815Sjsg 		size = ARRAY_SIZE(icl_rates);
5021bb76ff1Sjsg 		if (IS_DG2(dev_priv))
5031bb76ff1Sjsg 			max_rate = dg2_max_source_rate(intel_dp);
5041bb76ff1Sjsg 		else if (IS_ALDERLAKE_P(dev_priv) || IS_ALDERLAKE_S(dev_priv) ||
5051bb76ff1Sjsg 			 IS_DG1(dev_priv) || IS_ROCKETLAKE(dev_priv))
5061bb76ff1Sjsg 			max_rate = 810000;
507f005ef32Sjsg 		else if (IS_JASPERLAKE(dev_priv) || IS_ELKHARTLAKE(dev_priv))
5085ca02815Sjsg 			max_rate = ehl_max_source_rate(intel_dp);
509c349dbc7Sjsg 		else
510c349dbc7Sjsg 			max_rate = icl_max_source_rate(intel_dp);
5115ca02815Sjsg 	} else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) {
512c349dbc7Sjsg 		source_rates = bxt_rates;
513c349dbc7Sjsg 		size = ARRAY_SIZE(bxt_rates);
5145ca02815Sjsg 	} else if (DISPLAY_VER(dev_priv) == 9) {
515c349dbc7Sjsg 		source_rates = skl_rates;
516c349dbc7Sjsg 		size = ARRAY_SIZE(skl_rates);
517f005ef32Sjsg 	} else if ((IS_HASWELL(dev_priv) && !IS_HASWELL_ULX(dev_priv)) ||
518c349dbc7Sjsg 		   IS_BROADWELL(dev_priv)) {
519c349dbc7Sjsg 		source_rates = hsw_rates;
520c349dbc7Sjsg 		size = ARRAY_SIZE(hsw_rates);
521c349dbc7Sjsg 	} else {
522c349dbc7Sjsg 		source_rates = g4x_rates;
523c349dbc7Sjsg 		size = ARRAY_SIZE(g4x_rates);
524c349dbc7Sjsg 	}
525c349dbc7Sjsg 
5261bb76ff1Sjsg 	vbt_max_rate = vbt_max_link_rate(intel_dp);
527c349dbc7Sjsg 	if (max_rate && vbt_max_rate)
528c349dbc7Sjsg 		max_rate = min(max_rate, vbt_max_rate);
529c349dbc7Sjsg 	else if (vbt_max_rate)
530c349dbc7Sjsg 		max_rate = vbt_max_rate;
531c349dbc7Sjsg 
532c349dbc7Sjsg 	if (max_rate)
533c349dbc7Sjsg 		size = intel_dp_rate_limit_len(source_rates, size, max_rate);
534c349dbc7Sjsg 
535c349dbc7Sjsg 	intel_dp->source_rates = source_rates;
536c349dbc7Sjsg 	intel_dp->num_source_rates = size;
537c349dbc7Sjsg }
538c349dbc7Sjsg 
539c349dbc7Sjsg static int intersect_rates(const int *source_rates, int source_len,
540c349dbc7Sjsg 			   const int *sink_rates, int sink_len,
541c349dbc7Sjsg 			   int *common_rates)
542c349dbc7Sjsg {
543c349dbc7Sjsg 	int i = 0, j = 0, k = 0;
544c349dbc7Sjsg 
545c349dbc7Sjsg 	while (i < source_len && j < sink_len) {
546c349dbc7Sjsg 		if (source_rates[i] == sink_rates[j]) {
547c349dbc7Sjsg 			if (WARN_ON(k >= DP_MAX_SUPPORTED_RATES))
548c349dbc7Sjsg 				return k;
549c349dbc7Sjsg 			common_rates[k] = source_rates[i];
550c349dbc7Sjsg 			++k;
551c349dbc7Sjsg 			++i;
552c349dbc7Sjsg 			++j;
553c349dbc7Sjsg 		} else if (source_rates[i] < sink_rates[j]) {
554c349dbc7Sjsg 			++i;
555c349dbc7Sjsg 		} else {
556c349dbc7Sjsg 			++j;
557c349dbc7Sjsg 		}
558c349dbc7Sjsg 	}
559c349dbc7Sjsg 	return k;
560c349dbc7Sjsg }
561c349dbc7Sjsg 
562c349dbc7Sjsg /* return index of rate in rates array, or -1 if not found */
563c349dbc7Sjsg static int intel_dp_rate_index(const int *rates, int len, int rate)
564c349dbc7Sjsg {
565c349dbc7Sjsg 	int i;
566c349dbc7Sjsg 
567c349dbc7Sjsg 	for (i = 0; i < len; i++)
568c349dbc7Sjsg 		if (rate == rates[i])
569c349dbc7Sjsg 			return i;
570c349dbc7Sjsg 
571c349dbc7Sjsg 	return -1;
572c349dbc7Sjsg }
573c349dbc7Sjsg 
574c349dbc7Sjsg static void intel_dp_set_common_rates(struct intel_dp *intel_dp)
575c349dbc7Sjsg {
576ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
577ad8b1aafSjsg 
578ad8b1aafSjsg 	drm_WARN_ON(&i915->drm,
579ad8b1aafSjsg 		    !intel_dp->num_source_rates || !intel_dp->num_sink_rates);
580c349dbc7Sjsg 
581c349dbc7Sjsg 	intel_dp->num_common_rates = intersect_rates(intel_dp->source_rates,
582c349dbc7Sjsg 						     intel_dp->num_source_rates,
583c349dbc7Sjsg 						     intel_dp->sink_rates,
584c349dbc7Sjsg 						     intel_dp->num_sink_rates,
585c349dbc7Sjsg 						     intel_dp->common_rates);
586c349dbc7Sjsg 
587c349dbc7Sjsg 	/* Paranoia, there should always be something in common. */
588ad8b1aafSjsg 	if (drm_WARN_ON(&i915->drm, intel_dp->num_common_rates == 0)) {
589c349dbc7Sjsg 		intel_dp->common_rates[0] = 162000;
590c349dbc7Sjsg 		intel_dp->num_common_rates = 1;
591c349dbc7Sjsg 	}
592c349dbc7Sjsg }
593c349dbc7Sjsg 
594c349dbc7Sjsg static bool intel_dp_link_params_valid(struct intel_dp *intel_dp, int link_rate,
595c349dbc7Sjsg 				       u8 lane_count)
596c349dbc7Sjsg {
597c349dbc7Sjsg 	/*
598c349dbc7Sjsg 	 * FIXME: we need to synchronize the current link parameters with
599c349dbc7Sjsg 	 * hardware readout. Currently fast link training doesn't work on
600c349dbc7Sjsg 	 * boot-up.
601c349dbc7Sjsg 	 */
602c349dbc7Sjsg 	if (link_rate == 0 ||
603c349dbc7Sjsg 	    link_rate > intel_dp->max_link_rate)
604c349dbc7Sjsg 		return false;
605c349dbc7Sjsg 
606c349dbc7Sjsg 	if (lane_count == 0 ||
607c349dbc7Sjsg 	    lane_count > intel_dp_max_lane_count(intel_dp))
608c349dbc7Sjsg 		return false;
609c349dbc7Sjsg 
610c349dbc7Sjsg 	return true;
611c349dbc7Sjsg }
612c349dbc7Sjsg 
613c349dbc7Sjsg static bool intel_dp_can_link_train_fallback_for_edp(struct intel_dp *intel_dp,
614c349dbc7Sjsg 						     int link_rate,
615c349dbc7Sjsg 						     u8 lane_count)
616c349dbc7Sjsg {
6171bb76ff1Sjsg 	/* FIXME figure out what we actually want here */
618c349dbc7Sjsg 	const struct drm_display_mode *fixed_mode =
6191bb76ff1Sjsg 		intel_panel_preferred_fixed_mode(intel_dp->attached_connector);
620c349dbc7Sjsg 	int mode_rate, max_rate;
621c349dbc7Sjsg 
622c349dbc7Sjsg 	mode_rate = intel_dp_link_required(fixed_mode->clock, 18);
623c349dbc7Sjsg 	max_rate = intel_dp_max_data_rate(link_rate, lane_count);
624c349dbc7Sjsg 	if (mode_rate > max_rate)
625c349dbc7Sjsg 		return false;
626c349dbc7Sjsg 
627c349dbc7Sjsg 	return true;
628c349dbc7Sjsg }
629c349dbc7Sjsg 
630c349dbc7Sjsg int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
631c349dbc7Sjsg 					    int link_rate, u8 lane_count)
632c349dbc7Sjsg {
633ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
634c349dbc7Sjsg 	int index;
635c349dbc7Sjsg 
636ad8b1aafSjsg 	/*
637ad8b1aafSjsg 	 * TODO: Enable fallback on MST links once MST link compute can handle
638ad8b1aafSjsg 	 * the fallback params.
639ad8b1aafSjsg 	 */
640ad8b1aafSjsg 	if (intel_dp->is_mst) {
641ad8b1aafSjsg 		drm_err(&i915->drm, "Link Training Unsuccessful\n");
642ad8b1aafSjsg 		return -1;
643ad8b1aafSjsg 	}
644ad8b1aafSjsg 
6455ca02815Sjsg 	if (intel_dp_is_edp(intel_dp) && !intel_dp->use_max_params) {
6465ca02815Sjsg 		drm_dbg_kms(&i915->drm,
6475ca02815Sjsg 			    "Retrying Link training for eDP with max parameters\n");
6485ca02815Sjsg 		intel_dp->use_max_params = true;
6495ca02815Sjsg 		return 0;
6505ca02815Sjsg 	}
6515ca02815Sjsg 
652c349dbc7Sjsg 	index = intel_dp_rate_index(intel_dp->common_rates,
653c349dbc7Sjsg 				    intel_dp->num_common_rates,
654c349dbc7Sjsg 				    link_rate);
655c349dbc7Sjsg 	if (index > 0) {
656c349dbc7Sjsg 		if (intel_dp_is_edp(intel_dp) &&
657c349dbc7Sjsg 		    !intel_dp_can_link_train_fallback_for_edp(intel_dp,
6581bb76ff1Sjsg 							      intel_dp_common_rate(intel_dp, index - 1),
659c349dbc7Sjsg 							      lane_count)) {
660ad8b1aafSjsg 			drm_dbg_kms(&i915->drm,
661ad8b1aafSjsg 				    "Retrying Link training for eDP with same parameters\n");
662c349dbc7Sjsg 			return 0;
663c349dbc7Sjsg 		}
6641bb76ff1Sjsg 		intel_dp->max_link_rate = intel_dp_common_rate(intel_dp, index - 1);
665c349dbc7Sjsg 		intel_dp->max_link_lane_count = lane_count;
666c349dbc7Sjsg 	} else if (lane_count > 1) {
667c349dbc7Sjsg 		if (intel_dp_is_edp(intel_dp) &&
668c349dbc7Sjsg 		    !intel_dp_can_link_train_fallback_for_edp(intel_dp,
669c349dbc7Sjsg 							      intel_dp_max_common_rate(intel_dp),
670c349dbc7Sjsg 							      lane_count >> 1)) {
671ad8b1aafSjsg 			drm_dbg_kms(&i915->drm,
672ad8b1aafSjsg 				    "Retrying Link training for eDP with same parameters\n");
673c349dbc7Sjsg 			return 0;
674c349dbc7Sjsg 		}
675c349dbc7Sjsg 		intel_dp->max_link_rate = intel_dp_max_common_rate(intel_dp);
676c349dbc7Sjsg 		intel_dp->max_link_lane_count = lane_count >> 1;
677c349dbc7Sjsg 	} else {
678ad8b1aafSjsg 		drm_err(&i915->drm, "Link Training Unsuccessful\n");
679c349dbc7Sjsg 		return -1;
680c349dbc7Sjsg 	}
681c349dbc7Sjsg 
682c349dbc7Sjsg 	return 0;
683c349dbc7Sjsg }
684c349dbc7Sjsg 
685c349dbc7Sjsg u32 intel_dp_mode_to_fec_clock(u32 mode_clock)
686c349dbc7Sjsg {
687c349dbc7Sjsg 	return div_u64(mul_u32_u32(mode_clock, 1000000U),
688c349dbc7Sjsg 		       DP_DSC_FEC_OVERHEAD_FACTOR);
689c349dbc7Sjsg }
690c349dbc7Sjsg 
691c349dbc7Sjsg static int
692c349dbc7Sjsg small_joiner_ram_size_bits(struct drm_i915_private *i915)
693c349dbc7Sjsg {
6941bb76ff1Sjsg 	if (DISPLAY_VER(i915) >= 13)
6951bb76ff1Sjsg 		return 17280 * 8;
6961bb76ff1Sjsg 	else if (DISPLAY_VER(i915) >= 11)
697c349dbc7Sjsg 		return 7680 * 8;
698c349dbc7Sjsg 	else
699c349dbc7Sjsg 		return 6144 * 8;
700c349dbc7Sjsg }
701c349dbc7Sjsg 
702f005ef32Sjsg u32 intel_dp_dsc_nearest_valid_bpp(struct drm_i915_private *i915, u32 bpp, u32 pipe_bpp)
703f005ef32Sjsg {
704f005ef32Sjsg 	u32 bits_per_pixel = bpp;
705f005ef32Sjsg 	int i;
706f005ef32Sjsg 
707f005ef32Sjsg 	/* Error out if the max bpp is less than smallest allowed valid bpp */
708f005ef32Sjsg 	if (bits_per_pixel < valid_dsc_bpp[0]) {
709f005ef32Sjsg 		drm_dbg_kms(&i915->drm, "Unsupported BPP %u, min %u\n",
710f005ef32Sjsg 			    bits_per_pixel, valid_dsc_bpp[0]);
711f005ef32Sjsg 		return 0;
712f005ef32Sjsg 	}
713f005ef32Sjsg 
714f005ef32Sjsg 	/* From XE_LPD onwards we support from bpc upto uncompressed bpp-1 BPPs */
715f005ef32Sjsg 	if (DISPLAY_VER(i915) >= 13) {
716f005ef32Sjsg 		bits_per_pixel = min(bits_per_pixel, pipe_bpp - 1);
717f005ef32Sjsg 
718f005ef32Sjsg 		/*
719f005ef32Sjsg 		 * According to BSpec, 27 is the max DSC output bpp,
720f005ef32Sjsg 		 * 8 is the min DSC output bpp.
721f005ef32Sjsg 		 * While we can still clamp higher bpp values to 27, saving bandwidth,
722f005ef32Sjsg 		 * if it is required to oompress up to bpp < 8, means we can't do
723f005ef32Sjsg 		 * that and probably means we can't fit the required mode, even with
724f005ef32Sjsg 		 * DSC enabled.
725f005ef32Sjsg 		 */
726f005ef32Sjsg 		if (bits_per_pixel < 8) {
727f005ef32Sjsg 			drm_dbg_kms(&i915->drm, "Unsupported BPP %u, min 8\n",
728f005ef32Sjsg 				    bits_per_pixel);
729f005ef32Sjsg 			return 0;
730f005ef32Sjsg 		}
731f005ef32Sjsg 		bits_per_pixel = min_t(u32, bits_per_pixel, 27);
732f005ef32Sjsg 	} else {
733f005ef32Sjsg 		/* Find the nearest match in the array of known BPPs from VESA */
734f005ef32Sjsg 		for (i = 0; i < ARRAY_SIZE(valid_dsc_bpp) - 1; i++) {
735f005ef32Sjsg 			if (bits_per_pixel < valid_dsc_bpp[i + 1])
736f005ef32Sjsg 				break;
737f005ef32Sjsg 		}
738f005ef32Sjsg 		drm_dbg_kms(&i915->drm, "Set dsc bpp from %d to VESA %d\n",
739f005ef32Sjsg 			    bits_per_pixel, valid_dsc_bpp[i]);
740f005ef32Sjsg 
741f005ef32Sjsg 		bits_per_pixel = valid_dsc_bpp[i];
742f005ef32Sjsg 	}
743f005ef32Sjsg 
744f005ef32Sjsg 	return bits_per_pixel;
745f005ef32Sjsg }
746f005ef32Sjsg 
747f005ef32Sjsg u16 intel_dp_dsc_get_output_bpp(struct drm_i915_private *i915,
748c349dbc7Sjsg 				u32 link_clock, u32 lane_count,
7495ca02815Sjsg 				u32 mode_clock, u32 mode_hdisplay,
7505ca02815Sjsg 				bool bigjoiner,
751f005ef32Sjsg 				u32 pipe_bpp,
752f005ef32Sjsg 				u32 timeslots)
753c349dbc7Sjsg {
754c349dbc7Sjsg 	u32 bits_per_pixel, max_bpp_small_joiner_ram;
755c349dbc7Sjsg 
756c349dbc7Sjsg 	/*
757c349dbc7Sjsg 	 * Available Link Bandwidth(Kbits/sec) = (NumberOfLanes)*
758f005ef32Sjsg 	 * (LinkSymbolClock)* 8 * (TimeSlots / 64)
759f005ef32Sjsg 	 * for SST -> TimeSlots is 64(i.e all TimeSlots that are available)
760f005ef32Sjsg 	 * for MST -> TimeSlots has to be calculated, based on mode requirements
761f005ef32Sjsg 	 *
762f005ef32Sjsg 	 * Due to FEC overhead, the available bw is reduced to 97.2261%.
763f005ef32Sjsg 	 * To support the given mode:
764f005ef32Sjsg 	 * Bandwidth required should be <= Available link Bandwidth * FEC Overhead
765f005ef32Sjsg 	 * =>ModeClock * bits_per_pixel <= Available Link Bandwidth * FEC Overhead
766f005ef32Sjsg 	 * =>bits_per_pixel <= Available link Bandwidth * FEC Overhead / ModeClock
767f005ef32Sjsg 	 * =>bits_per_pixel <= (NumberOfLanes * LinkSymbolClock) * 8 (TimeSlots / 64) /
768f005ef32Sjsg 	 *		       (ModeClock / FEC Overhead)
769f005ef32Sjsg 	 * =>bits_per_pixel <= (NumberOfLanes * LinkSymbolClock * TimeSlots) /
770f005ef32Sjsg 	 *		       (ModeClock / FEC Overhead * 8)
771c349dbc7Sjsg 	 */
772f005ef32Sjsg 	bits_per_pixel = ((link_clock * lane_count) * timeslots) /
773f005ef32Sjsg 			 (intel_dp_mode_to_fec_clock(mode_clock) * 8);
774f005ef32Sjsg 
775f005ef32Sjsg 	drm_dbg_kms(&i915->drm, "Max link bpp is %u for %u timeslots "
776f005ef32Sjsg 				"total bw %u pixel clock %u\n",
777f005ef32Sjsg 				bits_per_pixel, timeslots,
778f005ef32Sjsg 				(link_clock * lane_count * 8),
779f005ef32Sjsg 				intel_dp_mode_to_fec_clock(mode_clock));
780c349dbc7Sjsg 
781c349dbc7Sjsg 	/* Small Joiner Check: output bpp <= joiner RAM (bits) / Horiz. width */
782c349dbc7Sjsg 	max_bpp_small_joiner_ram = small_joiner_ram_size_bits(i915) /
783c349dbc7Sjsg 		mode_hdisplay;
7845ca02815Sjsg 
7855ca02815Sjsg 	if (bigjoiner)
7865ca02815Sjsg 		max_bpp_small_joiner_ram *= 2;
7875ca02815Sjsg 
788c349dbc7Sjsg 	/*
789c349dbc7Sjsg 	 * Greatest allowed DSC BPP = MIN (output BPP from available Link BW
790c349dbc7Sjsg 	 * check, output bpp from small joiner RAM check)
791c349dbc7Sjsg 	 */
792c349dbc7Sjsg 	bits_per_pixel = min(bits_per_pixel, max_bpp_small_joiner_ram);
793c349dbc7Sjsg 
7945ca02815Sjsg 	if (bigjoiner) {
7955ca02815Sjsg 		u32 max_bpp_bigjoiner =
7961bb76ff1Sjsg 			i915->display.cdclk.max_cdclk_freq * 48 /
7975ca02815Sjsg 			intel_dp_mode_to_fec_clock(mode_clock);
7985ca02815Sjsg 
7995ca02815Sjsg 		bits_per_pixel = min(bits_per_pixel, max_bpp_bigjoiner);
8005ca02815Sjsg 	}
8015ca02815Sjsg 
802f005ef32Sjsg 	bits_per_pixel = intel_dp_dsc_nearest_valid_bpp(i915, bits_per_pixel, pipe_bpp);
803c349dbc7Sjsg 
804c349dbc7Sjsg 	/*
805c349dbc7Sjsg 	 * Compressed BPP in U6.4 format so multiply by 16, for Gen 11,
806c349dbc7Sjsg 	 * fractional part is 0
807c349dbc7Sjsg 	 */
808c349dbc7Sjsg 	return bits_per_pixel << 4;
809c349dbc7Sjsg }
810c349dbc7Sjsg 
811f005ef32Sjsg u8 intel_dp_dsc_get_slice_count(struct intel_dp *intel_dp,
8125ca02815Sjsg 				int mode_clock, int mode_hdisplay,
8135ca02815Sjsg 				bool bigjoiner)
814c349dbc7Sjsg {
815ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
816c349dbc7Sjsg 	u8 min_slice_count, i;
817c349dbc7Sjsg 	int max_slice_width;
818c349dbc7Sjsg 
819c349dbc7Sjsg 	if (mode_clock <= DP_DSC_PEAK_PIXEL_RATE)
820c349dbc7Sjsg 		min_slice_count = DIV_ROUND_UP(mode_clock,
821c349dbc7Sjsg 					       DP_DSC_MAX_ENC_THROUGHPUT_0);
822c349dbc7Sjsg 	else
823c349dbc7Sjsg 		min_slice_count = DIV_ROUND_UP(mode_clock,
824c349dbc7Sjsg 					       DP_DSC_MAX_ENC_THROUGHPUT_1);
825c349dbc7Sjsg 
826f005ef32Sjsg 	/*
827f005ef32Sjsg 	 * Due to some DSC engine BW limitations, we need to enable second
828f005ef32Sjsg 	 * slice and VDSC engine, whenever we approach close enough to max CDCLK
829f005ef32Sjsg 	 */
830f005ef32Sjsg 	if (mode_clock >= ((i915->display.cdclk.max_cdclk_freq * 85) / 100))
831f005ef32Sjsg 		min_slice_count = max_t(u8, min_slice_count, 2);
832f005ef32Sjsg 
833c349dbc7Sjsg 	max_slice_width = drm_dp_dsc_sink_max_slice_width(intel_dp->dsc_dpcd);
834c349dbc7Sjsg 	if (max_slice_width < DP_DSC_MIN_SLICE_WIDTH_VALUE) {
835ad8b1aafSjsg 		drm_dbg_kms(&i915->drm,
836ad8b1aafSjsg 			    "Unsupported slice width %d by DP DSC Sink device\n",
837c349dbc7Sjsg 			    max_slice_width);
838c349dbc7Sjsg 		return 0;
839c349dbc7Sjsg 	}
840c349dbc7Sjsg 	/* Also take into account max slice width */
841ad8b1aafSjsg 	min_slice_count = max_t(u8, min_slice_count,
842c349dbc7Sjsg 				DIV_ROUND_UP(mode_hdisplay,
843c349dbc7Sjsg 					     max_slice_width));
844c349dbc7Sjsg 
845c349dbc7Sjsg 	/* Find the closest match to the valid slice count values */
846c349dbc7Sjsg 	for (i = 0; i < ARRAY_SIZE(valid_dsc_slicecount); i++) {
8475ca02815Sjsg 		u8 test_slice_count = valid_dsc_slicecount[i] << bigjoiner;
8485ca02815Sjsg 
8495ca02815Sjsg 		if (test_slice_count >
8505ca02815Sjsg 		    drm_dp_dsc_sink_max_slice_count(intel_dp->dsc_dpcd, false))
851c349dbc7Sjsg 			break;
8525ca02815Sjsg 
8535ca02815Sjsg 		/* big joiner needs small joiner to be enabled */
8545ca02815Sjsg 		if (bigjoiner && test_slice_count < 4)
8555ca02815Sjsg 			continue;
8565ca02815Sjsg 
8575ca02815Sjsg 		if (min_slice_count <= test_slice_count)
8585ca02815Sjsg 			return test_slice_count;
859c349dbc7Sjsg 	}
860c349dbc7Sjsg 
861ad8b1aafSjsg 	drm_dbg_kms(&i915->drm, "Unsupported Slice Count %d\n",
862ad8b1aafSjsg 		    min_slice_count);
863c349dbc7Sjsg 	return 0;
864c349dbc7Sjsg }
865c349dbc7Sjsg 
866f005ef32Sjsg static bool source_can_output(struct intel_dp *intel_dp,
867f005ef32Sjsg 			      enum intel_output_format format)
868f005ef32Sjsg {
869f005ef32Sjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
870f005ef32Sjsg 
871f005ef32Sjsg 	switch (format) {
872f005ef32Sjsg 	case INTEL_OUTPUT_FORMAT_RGB:
873f005ef32Sjsg 		return true;
874f005ef32Sjsg 
875f005ef32Sjsg 	case INTEL_OUTPUT_FORMAT_YCBCR444:
876f005ef32Sjsg 		/*
877f005ef32Sjsg 		 * No YCbCr output support on gmch platforms.
878f005ef32Sjsg 		 * Also, ILK doesn't seem capable of DP YCbCr output.
879f005ef32Sjsg 		 * The displayed image is severly corrupted. SNB+ is fine.
880f005ef32Sjsg 		 */
881f005ef32Sjsg 		return !HAS_GMCH(i915) && !IS_IRONLAKE(i915);
882f005ef32Sjsg 
883f005ef32Sjsg 	case INTEL_OUTPUT_FORMAT_YCBCR420:
884f005ef32Sjsg 		/* Platform < Gen 11 cannot output YCbCr420 format */
885f005ef32Sjsg 		return DISPLAY_VER(i915) >= 11;
886f005ef32Sjsg 
887f005ef32Sjsg 	default:
888f005ef32Sjsg 		MISSING_CASE(format);
889f005ef32Sjsg 		return false;
890f005ef32Sjsg 	}
891f005ef32Sjsg }
892f005ef32Sjsg 
893f005ef32Sjsg static bool
894f005ef32Sjsg dfp_can_convert_from_rgb(struct intel_dp *intel_dp,
895f005ef32Sjsg 			 enum intel_output_format sink_format)
896f005ef32Sjsg {
897f005ef32Sjsg 	if (!drm_dp_is_branch(intel_dp->dpcd))
898f005ef32Sjsg 		return false;
899f005ef32Sjsg 
900f005ef32Sjsg 	if (sink_format == INTEL_OUTPUT_FORMAT_YCBCR444)
901f005ef32Sjsg 		return intel_dp->dfp.rgb_to_ycbcr;
902f005ef32Sjsg 
903f005ef32Sjsg 	if (sink_format == INTEL_OUTPUT_FORMAT_YCBCR420)
904f005ef32Sjsg 		return intel_dp->dfp.rgb_to_ycbcr &&
905f005ef32Sjsg 			intel_dp->dfp.ycbcr_444_to_420;
906f005ef32Sjsg 
907f005ef32Sjsg 	return false;
908f005ef32Sjsg }
909f005ef32Sjsg 
910f005ef32Sjsg static bool
911f005ef32Sjsg dfp_can_convert_from_ycbcr444(struct intel_dp *intel_dp,
912f005ef32Sjsg 			      enum intel_output_format sink_format)
913f005ef32Sjsg {
914f005ef32Sjsg 	if (!drm_dp_is_branch(intel_dp->dpcd))
915f005ef32Sjsg 		return false;
916f005ef32Sjsg 
917f005ef32Sjsg 	if (sink_format == INTEL_OUTPUT_FORMAT_YCBCR420)
918f005ef32Sjsg 		return intel_dp->dfp.ycbcr_444_to_420;
919f005ef32Sjsg 
920f005ef32Sjsg 	return false;
921f005ef32Sjsg }
922f005ef32Sjsg 
9235ca02815Sjsg static enum intel_output_format
9241bb76ff1Sjsg intel_dp_output_format(struct intel_connector *connector,
925f005ef32Sjsg 		       enum intel_output_format sink_format)
9265ca02815Sjsg {
9271bb76ff1Sjsg 	struct intel_dp *intel_dp = intel_attached_dp(connector);
928f005ef32Sjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
929f005ef32Sjsg 	enum intel_output_format output_format;
9305ca02815Sjsg 
931f005ef32Sjsg 	if (intel_dp->force_dsc_output_format)
932f005ef32Sjsg 		return intel_dp->force_dsc_output_format;
9335ca02815Sjsg 
934f005ef32Sjsg 	if (sink_format == INTEL_OUTPUT_FORMAT_RGB ||
935f005ef32Sjsg 	    dfp_can_convert_from_rgb(intel_dp, sink_format))
936f005ef32Sjsg 		output_format = INTEL_OUTPUT_FORMAT_RGB;
9375ca02815Sjsg 
938f005ef32Sjsg 	else if (sink_format == INTEL_OUTPUT_FORMAT_YCBCR444 ||
939f005ef32Sjsg 		 dfp_can_convert_from_ycbcr444(intel_dp, sink_format))
940f005ef32Sjsg 		output_format = INTEL_OUTPUT_FORMAT_YCBCR444;
941f005ef32Sjsg 
9425ca02815Sjsg 	else
943f005ef32Sjsg 		output_format = INTEL_OUTPUT_FORMAT_YCBCR420;
944f005ef32Sjsg 
945f005ef32Sjsg 	drm_WARN_ON(&i915->drm, !source_can_output(intel_dp, output_format));
946f005ef32Sjsg 
947f005ef32Sjsg 	return output_format;
9485ca02815Sjsg }
9495ca02815Sjsg 
9505ca02815Sjsg int intel_dp_min_bpp(enum intel_output_format output_format)
9515ca02815Sjsg {
9525ca02815Sjsg 	if (output_format == INTEL_OUTPUT_FORMAT_RGB)
9535ca02815Sjsg 		return 6 * 3;
9545ca02815Sjsg 	else
9555ca02815Sjsg 		return 8 * 3;
9565ca02815Sjsg }
9575ca02815Sjsg 
9585ca02815Sjsg static int intel_dp_output_bpp(enum intel_output_format output_format, int bpp)
9595ca02815Sjsg {
9605ca02815Sjsg 	/*
9615ca02815Sjsg 	 * bpp value was assumed to RGB format. And YCbCr 4:2:0 output
9625ca02815Sjsg 	 * format of the number of bytes per pixel will be half the number
9635ca02815Sjsg 	 * of bytes of RGB pixel.
9645ca02815Sjsg 	 */
9655ca02815Sjsg 	if (output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
9665ca02815Sjsg 		bpp /= 2;
9675ca02815Sjsg 
9685ca02815Sjsg 	return bpp;
9695ca02815Sjsg }
9705ca02815Sjsg 
971f005ef32Sjsg static enum intel_output_format
972f005ef32Sjsg intel_dp_sink_format(struct intel_connector *connector,
973f005ef32Sjsg 		     const struct drm_display_mode *mode)
974f005ef32Sjsg {
975f005ef32Sjsg 	const struct drm_display_info *info = &connector->base.display_info;
976f005ef32Sjsg 
977f005ef32Sjsg 	if (drm_mode_is_420_only(info, mode))
978f005ef32Sjsg 		return INTEL_OUTPUT_FORMAT_YCBCR420;
979f005ef32Sjsg 
980f005ef32Sjsg 	return INTEL_OUTPUT_FORMAT_RGB;
981f005ef32Sjsg }
982f005ef32Sjsg 
9835ca02815Sjsg static int
9841bb76ff1Sjsg intel_dp_mode_min_output_bpp(struct intel_connector *connector,
9855ca02815Sjsg 			     const struct drm_display_mode *mode)
9865ca02815Sjsg {
987f005ef32Sjsg 	enum intel_output_format output_format, sink_format;
988f005ef32Sjsg 
989f005ef32Sjsg 	sink_format = intel_dp_sink_format(connector, mode);
990f005ef32Sjsg 
991f005ef32Sjsg 	output_format = intel_dp_output_format(connector, sink_format);
9925ca02815Sjsg 
9935ca02815Sjsg 	return intel_dp_output_bpp(output_format, intel_dp_min_bpp(output_format));
9945ca02815Sjsg }
9955ca02815Sjsg 
996c349dbc7Sjsg static bool intel_dp_hdisplay_bad(struct drm_i915_private *dev_priv,
997c349dbc7Sjsg 				  int hdisplay)
998c349dbc7Sjsg {
999c349dbc7Sjsg 	/*
1000c349dbc7Sjsg 	 * Older platforms don't like hdisplay==4096 with DP.
1001c349dbc7Sjsg 	 *
1002c349dbc7Sjsg 	 * On ILK/SNB/IVB the pipe seems to be somewhat running (scanline
1003c349dbc7Sjsg 	 * and frame counter increment), but we don't get vblank interrupts,
1004c349dbc7Sjsg 	 * and the pipe underruns immediately. The link also doesn't seem
1005c349dbc7Sjsg 	 * to get trained properly.
1006c349dbc7Sjsg 	 *
1007c349dbc7Sjsg 	 * On CHV the vblank interrupts don't seem to disappear but
1008c349dbc7Sjsg 	 * otherwise the symptoms are similar.
1009c349dbc7Sjsg 	 *
1010c349dbc7Sjsg 	 * TODO: confirm the behaviour on HSW+
1011c349dbc7Sjsg 	 */
1012c349dbc7Sjsg 	return hdisplay == 4096 && !HAS_DDI(dev_priv);
1013c349dbc7Sjsg }
1014c349dbc7Sjsg 
10151bb76ff1Sjsg static int intel_dp_max_tmds_clock(struct intel_dp *intel_dp)
10161bb76ff1Sjsg {
10171bb76ff1Sjsg 	struct intel_connector *connector = intel_dp->attached_connector;
10181bb76ff1Sjsg 	const struct drm_display_info *info = &connector->base.display_info;
10191bb76ff1Sjsg 	int max_tmds_clock = intel_dp->dfp.max_tmds_clock;
10201bb76ff1Sjsg 
10211bb76ff1Sjsg 	/* Only consider the sink's max TMDS clock if we know this is a HDMI DFP */
10221bb76ff1Sjsg 	if (max_tmds_clock && info->max_tmds_clock)
10231bb76ff1Sjsg 		max_tmds_clock = min(max_tmds_clock, info->max_tmds_clock);
10241bb76ff1Sjsg 
10251bb76ff1Sjsg 	return max_tmds_clock;
10261bb76ff1Sjsg }
10271bb76ff1Sjsg 
10281bb76ff1Sjsg static enum drm_mode_status
10291bb76ff1Sjsg intel_dp_tmds_clock_valid(struct intel_dp *intel_dp,
1030f005ef32Sjsg 			  int clock, int bpc,
1031f005ef32Sjsg 			  enum intel_output_format sink_format,
10321bb76ff1Sjsg 			  bool respect_downstream_limits)
10331bb76ff1Sjsg {
10341bb76ff1Sjsg 	int tmds_clock, min_tmds_clock, max_tmds_clock;
10351bb76ff1Sjsg 
10361bb76ff1Sjsg 	if (!respect_downstream_limits)
10371bb76ff1Sjsg 		return MODE_OK;
10381bb76ff1Sjsg 
1039f005ef32Sjsg 	tmds_clock = intel_hdmi_tmds_clock(clock, bpc, sink_format);
10401bb76ff1Sjsg 
10411bb76ff1Sjsg 	min_tmds_clock = intel_dp->dfp.min_tmds_clock;
10421bb76ff1Sjsg 	max_tmds_clock = intel_dp_max_tmds_clock(intel_dp);
10431bb76ff1Sjsg 
10441bb76ff1Sjsg 	if (min_tmds_clock && tmds_clock < min_tmds_clock)
10451bb76ff1Sjsg 		return MODE_CLOCK_LOW;
10461bb76ff1Sjsg 
10471bb76ff1Sjsg 	if (max_tmds_clock && tmds_clock > max_tmds_clock)
10481bb76ff1Sjsg 		return MODE_CLOCK_HIGH;
10491bb76ff1Sjsg 
10501bb76ff1Sjsg 	return MODE_OK;
10511bb76ff1Sjsg }
10521bb76ff1Sjsg 
1053c349dbc7Sjsg static enum drm_mode_status
1054ad8b1aafSjsg intel_dp_mode_valid_downstream(struct intel_connector *connector,
1055ad8b1aafSjsg 			       const struct drm_display_mode *mode,
1056ad8b1aafSjsg 			       int target_clock)
1057ad8b1aafSjsg {
1058ad8b1aafSjsg 	struct intel_dp *intel_dp = intel_attached_dp(connector);
1059ad8b1aafSjsg 	const struct drm_display_info *info = &connector->base.display_info;
10601bb76ff1Sjsg 	enum drm_mode_status status;
1061f005ef32Sjsg 	enum intel_output_format sink_format;
1062ad8b1aafSjsg 
10635ca02815Sjsg 	/* If PCON supports FRL MODE, check FRL bandwidth constraints */
10645ca02815Sjsg 	if (intel_dp->dfp.pcon_max_frl_bw) {
10655ca02815Sjsg 		int target_bw;
10665ca02815Sjsg 		int max_frl_bw;
10671bb76ff1Sjsg 		int bpp = intel_dp_mode_min_output_bpp(connector, mode);
10685ca02815Sjsg 
10695ca02815Sjsg 		target_bw = bpp * target_clock;
10705ca02815Sjsg 
10715ca02815Sjsg 		max_frl_bw = intel_dp->dfp.pcon_max_frl_bw;
10725ca02815Sjsg 
10735ca02815Sjsg 		/* converting bw from Gbps to Kbps*/
10745ca02815Sjsg 		max_frl_bw = max_frl_bw * 1000000;
10755ca02815Sjsg 
10765ca02815Sjsg 		if (target_bw > max_frl_bw)
10775ca02815Sjsg 			return MODE_CLOCK_HIGH;
10785ca02815Sjsg 
10795ca02815Sjsg 		return MODE_OK;
10805ca02815Sjsg 	}
10815ca02815Sjsg 
1082ad8b1aafSjsg 	if (intel_dp->dfp.max_dotclock &&
1083ad8b1aafSjsg 	    target_clock > intel_dp->dfp.max_dotclock)
1084ad8b1aafSjsg 		return MODE_CLOCK_HIGH;
1085ad8b1aafSjsg 
1086f005ef32Sjsg 	sink_format = intel_dp_sink_format(connector, mode);
1087ad8b1aafSjsg 
10881bb76ff1Sjsg 	/* Assume 8bpc for the DP++/HDMI/DVI TMDS clock check */
10891bb76ff1Sjsg 	status = intel_dp_tmds_clock_valid(intel_dp, target_clock,
1090f005ef32Sjsg 					   8, sink_format, true);
10911bb76ff1Sjsg 
10921bb76ff1Sjsg 	if (status != MODE_OK) {
1093f005ef32Sjsg 		if (sink_format == INTEL_OUTPUT_FORMAT_YCBCR420 ||
10941bb76ff1Sjsg 		    !connector->base.ycbcr_420_allowed ||
10951bb76ff1Sjsg 		    !drm_mode_is_420_also(info, mode))
10961bb76ff1Sjsg 			return status;
1097f005ef32Sjsg 		sink_format = INTEL_OUTPUT_FORMAT_YCBCR420;
10981bb76ff1Sjsg 		status = intel_dp_tmds_clock_valid(intel_dp, target_clock,
1099f005ef32Sjsg 						   8, sink_format, true);
11001bb76ff1Sjsg 		if (status != MODE_OK)
11011bb76ff1Sjsg 			return status;
11021bb76ff1Sjsg 	}
1103ad8b1aafSjsg 
1104ad8b1aafSjsg 	return MODE_OK;
1105ad8b1aafSjsg }
1106ad8b1aafSjsg 
1107f005ef32Sjsg bool intel_dp_need_bigjoiner(struct intel_dp *intel_dp,
11081bb76ff1Sjsg 			     int hdisplay, int clock)
11091bb76ff1Sjsg {
11101bb76ff1Sjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
11111bb76ff1Sjsg 
11121bb76ff1Sjsg 	if (!intel_dp_can_bigjoiner(intel_dp))
11131bb76ff1Sjsg 		return false;
11141bb76ff1Sjsg 
11151bb76ff1Sjsg 	return clock > i915->max_dotclk_freq || hdisplay > 5120;
11161bb76ff1Sjsg }
11171bb76ff1Sjsg 
1118ad8b1aafSjsg static enum drm_mode_status
11191bb76ff1Sjsg intel_dp_mode_valid(struct drm_connector *_connector,
1120c349dbc7Sjsg 		    struct drm_display_mode *mode)
1121c349dbc7Sjsg {
11221bb76ff1Sjsg 	struct intel_connector *connector = to_intel_connector(_connector);
11231bb76ff1Sjsg 	struct intel_dp *intel_dp = intel_attached_dp(connector);
11241bb76ff1Sjsg 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
11251bb76ff1Sjsg 	const struct drm_display_mode *fixed_mode;
1126c349dbc7Sjsg 	int target_clock = mode->clock;
1127c349dbc7Sjsg 	int max_rate, mode_rate, max_lanes, max_link_clock;
1128ad8b1aafSjsg 	int max_dotclk = dev_priv->max_dotclk_freq;
1129c349dbc7Sjsg 	u16 dsc_max_output_bpp = 0;
1130c349dbc7Sjsg 	u8 dsc_slice_count = 0;
1131ad8b1aafSjsg 	enum drm_mode_status status;
11325ca02815Sjsg 	bool dsc = false, bigjoiner = false;
1133c349dbc7Sjsg 
11342bd53da4Sjsg 	status = intel_cpu_transcoder_mode_valid(dev_priv, mode);
11352bd53da4Sjsg 	if (status != MODE_OK)
11362bd53da4Sjsg 		return status;
11372bd53da4Sjsg 
11385ca02815Sjsg 	if (mode->flags & DRM_MODE_FLAG_DBLCLK)
11395ca02815Sjsg 		return MODE_H_ILLEGAL;
11405ca02815Sjsg 
11411bb76ff1Sjsg 	fixed_mode = intel_panel_fixed_mode(connector, mode);
1142c349dbc7Sjsg 	if (intel_dp_is_edp(intel_dp) && fixed_mode) {
11431bb76ff1Sjsg 		status = intel_panel_mode_valid(connector, mode);
11441bb76ff1Sjsg 		if (status != MODE_OK)
11451bb76ff1Sjsg 			return status;
1146c349dbc7Sjsg 
1147c349dbc7Sjsg 		target_clock = fixed_mode->clock;
1148c349dbc7Sjsg 	}
1149c349dbc7Sjsg 
11505ca02815Sjsg 	if (mode->clock < 10000)
11515ca02815Sjsg 		return MODE_CLOCK_LOW;
11525ca02815Sjsg 
11531bb76ff1Sjsg 	if (intel_dp_need_bigjoiner(intel_dp, mode->hdisplay, target_clock)) {
11545ca02815Sjsg 		bigjoiner = true;
11555ca02815Sjsg 		max_dotclk *= 2;
11565ca02815Sjsg 	}
11575ca02815Sjsg 	if (target_clock > max_dotclk)
11585ca02815Sjsg 		return MODE_CLOCK_HIGH;
11595ca02815Sjsg 
1160f005ef32Sjsg 	if (intel_dp_hdisplay_bad(dev_priv, mode->hdisplay))
1161f005ef32Sjsg 		return MODE_H_ILLEGAL;
1162f005ef32Sjsg 
1163c349dbc7Sjsg 	max_link_clock = intel_dp_max_link_rate(intel_dp);
1164c349dbc7Sjsg 	max_lanes = intel_dp_max_lane_count(intel_dp);
1165c349dbc7Sjsg 
1166c349dbc7Sjsg 	max_rate = intel_dp_max_data_rate(max_link_clock, max_lanes);
11675ca02815Sjsg 	mode_rate = intel_dp_link_required(target_clock,
11685ca02815Sjsg 					   intel_dp_mode_min_output_bpp(connector, mode));
1169c349dbc7Sjsg 
1170f005ef32Sjsg 	if (HAS_DSC(dev_priv) &&
1171c349dbc7Sjsg 	    drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)) {
11725ca02815Sjsg 		/*
11735ca02815Sjsg 		 * TBD pass the connector BPC,
11745ca02815Sjsg 		 * for now U8_MAX so that max BPC on that platform would be picked
11755ca02815Sjsg 		 */
11765ca02815Sjsg 		int pipe_bpp = intel_dp_dsc_compute_bpp(intel_dp, U8_MAX);
11775ca02815Sjsg 
1178f005ef32Sjsg 		/*
1179f005ef32Sjsg 		 * Output bpp is stored in 6.4 format so right shift by 4 to get the
1180f005ef32Sjsg 		 * integer value since we support only integer values of bpp.
1181f005ef32Sjsg 		 */
1182c349dbc7Sjsg 		if (intel_dp_is_edp(intel_dp)) {
1183c349dbc7Sjsg 			dsc_max_output_bpp =
1184c349dbc7Sjsg 				drm_edp_dsc_sink_output_bpp(intel_dp->dsc_dpcd) >> 4;
1185c349dbc7Sjsg 			dsc_slice_count =
1186c349dbc7Sjsg 				drm_dp_dsc_sink_max_slice_count(intel_dp->dsc_dpcd,
1187c349dbc7Sjsg 								true);
1188c349dbc7Sjsg 		} else if (drm_dp_sink_supports_fec(intel_dp->fec_capable)) {
1189c349dbc7Sjsg 			dsc_max_output_bpp =
1190c349dbc7Sjsg 				intel_dp_dsc_get_output_bpp(dev_priv,
1191c349dbc7Sjsg 							    max_link_clock,
1192c349dbc7Sjsg 							    max_lanes,
1193c349dbc7Sjsg 							    target_clock,
11945ca02815Sjsg 							    mode->hdisplay,
11955ca02815Sjsg 							    bigjoiner,
1196f005ef32Sjsg 							    pipe_bpp, 64) >> 4;
1197c349dbc7Sjsg 			dsc_slice_count =
1198c349dbc7Sjsg 				intel_dp_dsc_get_slice_count(intel_dp,
1199c349dbc7Sjsg 							     target_clock,
12005ca02815Sjsg 							     mode->hdisplay,
12015ca02815Sjsg 							     bigjoiner);
1202c349dbc7Sjsg 		}
1203c349dbc7Sjsg 
12045ca02815Sjsg 		dsc = dsc_max_output_bpp && dsc_slice_count;
12055ca02815Sjsg 	}
12065ca02815Sjsg 
12075ca02815Sjsg 	/*
12085ca02815Sjsg 	 * Big joiner configuration needs DSC for TGL which is not true for
12095ca02815Sjsg 	 * XE_LPD where uncompressed joiner is supported.
12105ca02815Sjsg 	 */
12115ca02815Sjsg 	if (DISPLAY_VER(dev_priv) < 13 && bigjoiner && !dsc)
1212c349dbc7Sjsg 		return MODE_CLOCK_HIGH;
1213c349dbc7Sjsg 
12145ca02815Sjsg 	if (mode_rate > max_rate && !dsc)
12155ca02815Sjsg 		return MODE_CLOCK_HIGH;
1216c349dbc7Sjsg 
12171bb76ff1Sjsg 	status = intel_dp_mode_valid_downstream(connector, mode, target_clock);
1218ad8b1aafSjsg 	if (status != MODE_OK)
1219ad8b1aafSjsg 		return status;
1220ad8b1aafSjsg 
12215ca02815Sjsg 	return intel_mode_valid_max_plane_size(dev_priv, mode, bigjoiner);
1222c349dbc7Sjsg }
1223c349dbc7Sjsg 
12241bb76ff1Sjsg bool intel_dp_source_supports_tps3(struct drm_i915_private *i915)
1225c349dbc7Sjsg {
12261bb76ff1Sjsg 	return DISPLAY_VER(i915) >= 9 || IS_BROADWELL(i915) || IS_HASWELL(i915);
1227c349dbc7Sjsg }
1228c349dbc7Sjsg 
12291bb76ff1Sjsg bool intel_dp_source_supports_tps4(struct drm_i915_private *i915)
1230c349dbc7Sjsg {
12311bb76ff1Sjsg 	return DISPLAY_VER(i915) >= 10;
1232c349dbc7Sjsg }
1233c349dbc7Sjsg 
1234c349dbc7Sjsg static void snprintf_int_array(char *str, size_t len,
1235c349dbc7Sjsg 			       const int *array, int nelem)
1236c349dbc7Sjsg {
1237c349dbc7Sjsg 	int i;
1238c349dbc7Sjsg 
1239c349dbc7Sjsg 	str[0] = '\0';
1240c349dbc7Sjsg 
1241c349dbc7Sjsg 	for (i = 0; i < nelem; i++) {
1242c349dbc7Sjsg 		int r = snprintf(str, len, "%s%d", i ? ", " : "", array[i]);
1243c349dbc7Sjsg 		if (r >= len)
1244c349dbc7Sjsg 			return;
1245c349dbc7Sjsg 		str += r;
1246c349dbc7Sjsg 		len -= r;
1247c349dbc7Sjsg 	}
1248c349dbc7Sjsg }
1249c349dbc7Sjsg 
1250c349dbc7Sjsg static void intel_dp_print_rates(struct intel_dp *intel_dp)
1251c349dbc7Sjsg {
1252ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
1253c349dbc7Sjsg 	char str[128]; /* FIXME: too big for stack? */
1254c349dbc7Sjsg 
1255c349dbc7Sjsg 	if (!drm_debug_enabled(DRM_UT_KMS))
1256c349dbc7Sjsg 		return;
1257c349dbc7Sjsg 
1258c349dbc7Sjsg 	snprintf_int_array(str, sizeof(str),
1259c349dbc7Sjsg 			   intel_dp->source_rates, intel_dp->num_source_rates);
1260ad8b1aafSjsg 	drm_dbg_kms(&i915->drm, "source rates: %s\n", str);
1261c349dbc7Sjsg 
1262c349dbc7Sjsg 	snprintf_int_array(str, sizeof(str),
1263c349dbc7Sjsg 			   intel_dp->sink_rates, intel_dp->num_sink_rates);
1264ad8b1aafSjsg 	drm_dbg_kms(&i915->drm, "sink rates: %s\n", str);
1265c349dbc7Sjsg 
1266c349dbc7Sjsg 	snprintf_int_array(str, sizeof(str),
1267c349dbc7Sjsg 			   intel_dp->common_rates, intel_dp->num_common_rates);
1268ad8b1aafSjsg 	drm_dbg_kms(&i915->drm, "common rates: %s\n", str);
1269c349dbc7Sjsg }
1270c349dbc7Sjsg 
1271c349dbc7Sjsg int
1272c349dbc7Sjsg intel_dp_max_link_rate(struct intel_dp *intel_dp)
1273c349dbc7Sjsg {
1274c349dbc7Sjsg 	int len;
1275c349dbc7Sjsg 
1276c349dbc7Sjsg 	len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->max_link_rate);
1277c349dbc7Sjsg 
12781bb76ff1Sjsg 	return intel_dp_common_rate(intel_dp, len - 1);
1279c349dbc7Sjsg }
1280c349dbc7Sjsg 
1281c349dbc7Sjsg int intel_dp_rate_select(struct intel_dp *intel_dp, int rate)
1282c349dbc7Sjsg {
1283ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
1284c349dbc7Sjsg 	int i = intel_dp_rate_index(intel_dp->sink_rates,
1285c349dbc7Sjsg 				    intel_dp->num_sink_rates, rate);
1286c349dbc7Sjsg 
1287ad8b1aafSjsg 	if (drm_WARN_ON(&i915->drm, i < 0))
1288c349dbc7Sjsg 		i = 0;
1289c349dbc7Sjsg 
1290c349dbc7Sjsg 	return i;
1291c349dbc7Sjsg }
1292c349dbc7Sjsg 
1293c349dbc7Sjsg void intel_dp_compute_rate(struct intel_dp *intel_dp, int port_clock,
1294c349dbc7Sjsg 			   u8 *link_bw, u8 *rate_select)
1295c349dbc7Sjsg {
1296c349dbc7Sjsg 	/* eDP 1.4 rate select method. */
1297c349dbc7Sjsg 	if (intel_dp->use_rate_select) {
1298c349dbc7Sjsg 		*link_bw = 0;
1299c349dbc7Sjsg 		*rate_select =
1300c349dbc7Sjsg 			intel_dp_rate_select(intel_dp, port_clock);
1301c349dbc7Sjsg 	} else {
1302c349dbc7Sjsg 		*link_bw = drm_dp_link_rate_to_bw_code(port_clock);
1303c349dbc7Sjsg 		*rate_select = 0;
1304c349dbc7Sjsg 	}
1305c349dbc7Sjsg }
1306c349dbc7Sjsg 
1307f005ef32Sjsg bool intel_dp_has_hdmi_sink(struct intel_dp *intel_dp)
1308f005ef32Sjsg {
1309f005ef32Sjsg 	struct intel_connector *connector = intel_dp->attached_connector;
1310f005ef32Sjsg 
1311f005ef32Sjsg 	return connector->base.display_info.is_hdmi;
1312f005ef32Sjsg }
1313f005ef32Sjsg 
1314c349dbc7Sjsg static bool intel_dp_source_supports_fec(struct intel_dp *intel_dp,
1315c349dbc7Sjsg 					 const struct intel_crtc_state *pipe_config)
1316c349dbc7Sjsg {
131712f3d135Sjsg 	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
1318c349dbc7Sjsg 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
1319c349dbc7Sjsg 
13205ca02815Sjsg 	if (DISPLAY_VER(dev_priv) >= 12)
1321c349dbc7Sjsg 		return true;
1322c349dbc7Sjsg 
1323f5dd68fdSjsg 	if (DISPLAY_VER(dev_priv) == 11 && encoder->port != PORT_A &&
1324f5dd68fdSjsg 	    !intel_crtc_has_type(pipe_config, INTEL_OUTPUT_DP_MST))
1325c349dbc7Sjsg 		return true;
1326c349dbc7Sjsg 
1327c349dbc7Sjsg 	return false;
1328c349dbc7Sjsg }
1329c349dbc7Sjsg 
1330c349dbc7Sjsg static bool intel_dp_supports_fec(struct intel_dp *intel_dp,
1331c349dbc7Sjsg 				  const struct intel_crtc_state *pipe_config)
1332c349dbc7Sjsg {
1333c349dbc7Sjsg 	return intel_dp_source_supports_fec(intel_dp, pipe_config) &&
1334c349dbc7Sjsg 		drm_dp_sink_supports_fec(intel_dp->fec_capable);
1335c349dbc7Sjsg }
1336c349dbc7Sjsg 
1337c349dbc7Sjsg static bool intel_dp_supports_dsc(struct intel_dp *intel_dp,
1338c349dbc7Sjsg 				  const struct intel_crtc_state *crtc_state)
1339c349dbc7Sjsg {
13405ca02815Sjsg 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP) && !crtc_state->fec_enable)
1341c349dbc7Sjsg 		return false;
1342c349dbc7Sjsg 
13435ca02815Sjsg 	return intel_dsc_source_support(crtc_state) &&
1344c349dbc7Sjsg 		drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd);
1345c349dbc7Sjsg }
1346c349dbc7Sjsg 
13471bb76ff1Sjsg static int intel_dp_hdmi_compute_bpc(struct intel_dp *intel_dp,
1348ad8b1aafSjsg 				     const struct intel_crtc_state *crtc_state,
13491bb76ff1Sjsg 				     int bpc, bool respect_downstream_limits)
1350ad8b1aafSjsg {
13511bb76ff1Sjsg 	int clock = crtc_state->hw.adjusted_mode.crtc_clock;
1352ad8b1aafSjsg 
13531bb76ff1Sjsg 	/*
13541bb76ff1Sjsg 	 * Current bpc could already be below 8bpc due to
13551bb76ff1Sjsg 	 * FDI bandwidth constraints or other limits.
13561bb76ff1Sjsg 	 * HDMI minimum is 8bpc however.
13571bb76ff1Sjsg 	 */
13581bb76ff1Sjsg 	bpc = max(bpc, 8);
13591bb76ff1Sjsg 
13601bb76ff1Sjsg 	/*
13611bb76ff1Sjsg 	 * We will never exceed downstream TMDS clock limits while
13621bb76ff1Sjsg 	 * attempting deep color. If the user insists on forcing an
13631bb76ff1Sjsg 	 * out of spec mode they will have to be satisfied with 8bpc.
13641bb76ff1Sjsg 	 */
13651bb76ff1Sjsg 	if (!respect_downstream_limits)
13661bb76ff1Sjsg 		bpc = 8;
13671bb76ff1Sjsg 
13681bb76ff1Sjsg 	for (; bpc >= 8; bpc -= 2) {
13691bb76ff1Sjsg 		if (intel_hdmi_bpc_possible(crtc_state, bpc,
1370f005ef32Sjsg 					    intel_dp_has_hdmi_sink(intel_dp)) &&
1371f005ef32Sjsg 		    intel_dp_tmds_clock_valid(intel_dp, clock, bpc, crtc_state->sink_format,
13721bb76ff1Sjsg 					      respect_downstream_limits) == MODE_OK)
13731bb76ff1Sjsg 			return bpc;
13741bb76ff1Sjsg 	}
13751bb76ff1Sjsg 
13761bb76ff1Sjsg 	return -EINVAL;
1377ad8b1aafSjsg }
1378ad8b1aafSjsg 
1379ad8b1aafSjsg static int intel_dp_max_bpp(struct intel_dp *intel_dp,
13801bb76ff1Sjsg 			    const struct intel_crtc_state *crtc_state,
13811bb76ff1Sjsg 			    bool respect_downstream_limits)
1382c349dbc7Sjsg {
1383c349dbc7Sjsg 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
1384c349dbc7Sjsg 	struct intel_connector *intel_connector = intel_dp->attached_connector;
1385c349dbc7Sjsg 	int bpp, bpc;
1386c349dbc7Sjsg 
1387ad8b1aafSjsg 	bpc = crtc_state->pipe_bpp / 3;
1388c349dbc7Sjsg 
1389ad8b1aafSjsg 	if (intel_dp->dfp.max_bpc)
1390ad8b1aafSjsg 		bpc = min_t(int, bpc, intel_dp->dfp.max_bpc);
1391c349dbc7Sjsg 
1392ad8b1aafSjsg 	if (intel_dp->dfp.min_tmds_clock) {
13931bb76ff1Sjsg 		int max_hdmi_bpc;
13941bb76ff1Sjsg 
13951bb76ff1Sjsg 		max_hdmi_bpc = intel_dp_hdmi_compute_bpc(intel_dp, crtc_state, bpc,
13961bb76ff1Sjsg 							 respect_downstream_limits);
13971bb76ff1Sjsg 		if (max_hdmi_bpc < 0)
13981bb76ff1Sjsg 			return 0;
13991bb76ff1Sjsg 
14001bb76ff1Sjsg 		bpc = min(bpc, max_hdmi_bpc);
1401ad8b1aafSjsg 	}
1402ad8b1aafSjsg 
1403ad8b1aafSjsg 	bpp = bpc * 3;
1404c349dbc7Sjsg 	if (intel_dp_is_edp(intel_dp)) {
1405c349dbc7Sjsg 		/* Get bpp from vbt only for panels that dont have bpp in edid */
1406c349dbc7Sjsg 		if (intel_connector->base.display_info.bpc == 0 &&
14071bb76ff1Sjsg 		    intel_connector->panel.vbt.edp.bpp &&
14081bb76ff1Sjsg 		    intel_connector->panel.vbt.edp.bpp < bpp) {
1409c349dbc7Sjsg 			drm_dbg_kms(&dev_priv->drm,
1410c349dbc7Sjsg 				    "clamping bpp for eDP panel to BIOS-provided %i\n",
14111bb76ff1Sjsg 				    intel_connector->panel.vbt.edp.bpp);
14121bb76ff1Sjsg 			bpp = intel_connector->panel.vbt.edp.bpp;
1413c349dbc7Sjsg 		}
1414c349dbc7Sjsg 	}
1415c349dbc7Sjsg 
1416c349dbc7Sjsg 	return bpp;
1417c349dbc7Sjsg }
1418c349dbc7Sjsg 
1419c349dbc7Sjsg /* Adjust link config limits based on compliance test requests. */
1420c349dbc7Sjsg void
1421c349dbc7Sjsg intel_dp_adjust_compliance_config(struct intel_dp *intel_dp,
1422c349dbc7Sjsg 				  struct intel_crtc_state *pipe_config,
1423c349dbc7Sjsg 				  struct link_config_limits *limits)
1424c349dbc7Sjsg {
1425ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
1426ad8b1aafSjsg 
1427c349dbc7Sjsg 	/* For DP Compliance we override the computed bpp for the pipe */
1428c349dbc7Sjsg 	if (intel_dp->compliance.test_data.bpc != 0) {
1429c349dbc7Sjsg 		int bpp = 3 * intel_dp->compliance.test_data.bpc;
1430c349dbc7Sjsg 
1431c349dbc7Sjsg 		limits->min_bpp = limits->max_bpp = bpp;
1432c349dbc7Sjsg 		pipe_config->dither_force_disable = bpp == 6 * 3;
1433c349dbc7Sjsg 
1434ad8b1aafSjsg 		drm_dbg_kms(&i915->drm, "Setting pipe_bpp to %d\n", bpp);
1435c349dbc7Sjsg 	}
1436c349dbc7Sjsg 
1437c349dbc7Sjsg 	/* Use values requested by Compliance Test Request */
1438c349dbc7Sjsg 	if (intel_dp->compliance.test_type == DP_TEST_LINK_TRAINING) {
1439c349dbc7Sjsg 		int index;
1440c349dbc7Sjsg 
1441c349dbc7Sjsg 		/* Validate the compliance test data since max values
1442c349dbc7Sjsg 		 * might have changed due to link train fallback.
1443c349dbc7Sjsg 		 */
1444c349dbc7Sjsg 		if (intel_dp_link_params_valid(intel_dp, intel_dp->compliance.test_link_rate,
1445c349dbc7Sjsg 					       intel_dp->compliance.test_lane_count)) {
1446c349dbc7Sjsg 			index = intel_dp_rate_index(intel_dp->common_rates,
1447c349dbc7Sjsg 						    intel_dp->num_common_rates,
1448c349dbc7Sjsg 						    intel_dp->compliance.test_link_rate);
1449c349dbc7Sjsg 			if (index >= 0)
14501bb76ff1Sjsg 				limits->min_rate = limits->max_rate =
14511bb76ff1Sjsg 					intel_dp->compliance.test_link_rate;
1452c349dbc7Sjsg 			limits->min_lane_count = limits->max_lane_count =
1453c349dbc7Sjsg 				intel_dp->compliance.test_lane_count;
1454c349dbc7Sjsg 		}
1455c349dbc7Sjsg 	}
1456c349dbc7Sjsg }
1457c349dbc7Sjsg 
14581bb76ff1Sjsg static bool has_seamless_m_n(struct intel_connector *connector)
14591bb76ff1Sjsg {
14601bb76ff1Sjsg 	struct drm_i915_private *i915 = to_i915(connector->base.dev);
14611bb76ff1Sjsg 
14621bb76ff1Sjsg 	/*
14631bb76ff1Sjsg 	 * Seamless M/N reprogramming only implemented
14641bb76ff1Sjsg 	 * for BDW+ double buffered M/N registers so far.
14651bb76ff1Sjsg 	 */
14661bb76ff1Sjsg 	return HAS_DOUBLE_BUFFERED_M_N(i915) &&
14671bb76ff1Sjsg 		intel_panel_drrs_type(connector) == DRRS_TYPE_SEAMLESS;
14681bb76ff1Sjsg }
14691bb76ff1Sjsg 
14701bb76ff1Sjsg static int intel_dp_mode_clock(const struct intel_crtc_state *crtc_state,
14711bb76ff1Sjsg 			       const struct drm_connector_state *conn_state)
14721bb76ff1Sjsg {
14731bb76ff1Sjsg 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
14741bb76ff1Sjsg 	const struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode;
14751bb76ff1Sjsg 
14761bb76ff1Sjsg 	/* FIXME a bit of a mess wrt clock vs. crtc_clock */
14771bb76ff1Sjsg 	if (has_seamless_m_n(connector))
14781bb76ff1Sjsg 		return intel_panel_highest_mode(connector, adjusted_mode)->clock;
14791bb76ff1Sjsg 	else
14801bb76ff1Sjsg 		return adjusted_mode->crtc_clock;
14811bb76ff1Sjsg }
14821bb76ff1Sjsg 
1483c349dbc7Sjsg /* Optimize link config in order: max bpp, min clock, min lanes */
1484c349dbc7Sjsg static int
1485c349dbc7Sjsg intel_dp_compute_link_config_wide(struct intel_dp *intel_dp,
1486c349dbc7Sjsg 				  struct intel_crtc_state *pipe_config,
14871bb76ff1Sjsg 				  const struct drm_connector_state *conn_state,
1488c349dbc7Sjsg 				  const struct link_config_limits *limits)
1489c349dbc7Sjsg {
14901bb76ff1Sjsg 	int bpp, i, lane_count, clock = intel_dp_mode_clock(pipe_config, conn_state);
14911bb76ff1Sjsg 	int mode_rate, link_rate, link_avail;
1492c349dbc7Sjsg 
1493c349dbc7Sjsg 	for (bpp = limits->max_bpp; bpp >= limits->min_bpp; bpp -= 2 * 3) {
14945ca02815Sjsg 		int output_bpp = intel_dp_output_bpp(pipe_config->output_format, bpp);
1495c349dbc7Sjsg 
14961bb76ff1Sjsg 		mode_rate = intel_dp_link_required(clock, output_bpp);
1497c349dbc7Sjsg 
14981bb76ff1Sjsg 		for (i = 0; i < intel_dp->num_common_rates; i++) {
14991bb76ff1Sjsg 			link_rate = intel_dp_common_rate(intel_dp, i);
15001bb76ff1Sjsg 			if (link_rate < limits->min_rate ||
15011bb76ff1Sjsg 			    link_rate > limits->max_rate)
15021bb76ff1Sjsg 				continue;
15031bb76ff1Sjsg 
1504c349dbc7Sjsg 			for (lane_count = limits->min_lane_count;
1505c349dbc7Sjsg 			     lane_count <= limits->max_lane_count;
1506c349dbc7Sjsg 			     lane_count <<= 1) {
15071bb76ff1Sjsg 				link_avail = intel_dp_max_data_rate(link_rate,
1508c349dbc7Sjsg 								    lane_count);
1509c349dbc7Sjsg 
1510c349dbc7Sjsg 				if (mode_rate <= link_avail) {
1511c349dbc7Sjsg 					pipe_config->lane_count = lane_count;
1512c349dbc7Sjsg 					pipe_config->pipe_bpp = bpp;
15131bb76ff1Sjsg 					pipe_config->port_clock = link_rate;
1514c349dbc7Sjsg 
1515c349dbc7Sjsg 					return 0;
1516c349dbc7Sjsg 				}
1517c349dbc7Sjsg 			}
1518c349dbc7Sjsg 		}
1519c349dbc7Sjsg 	}
1520c349dbc7Sjsg 
1521c349dbc7Sjsg 	return -EINVAL;
1522c349dbc7Sjsg }
1523c349dbc7Sjsg 
1524f005ef32Sjsg int intel_dp_dsc_compute_bpp(struct intel_dp *intel_dp, u8 max_req_bpc)
1525c349dbc7Sjsg {
15265ca02815Sjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
1527c349dbc7Sjsg 	int i, num_bpc;
1528c349dbc7Sjsg 	u8 dsc_bpc[3] = {0};
15295ca02815Sjsg 	u8 dsc_max_bpc;
15305ca02815Sjsg 
15315ca02815Sjsg 	/* Max DSC Input BPC for ICL is 10 and for TGL+ is 12 */
15325ca02815Sjsg 	if (DISPLAY_VER(i915) >= 12)
15335ca02815Sjsg 		dsc_max_bpc = min_t(u8, 12, max_req_bpc);
15345ca02815Sjsg 	else
15355ca02815Sjsg 		dsc_max_bpc = min_t(u8, 10, max_req_bpc);
1536c349dbc7Sjsg 
1537c349dbc7Sjsg 	num_bpc = drm_dp_dsc_sink_supported_input_bpcs(intel_dp->dsc_dpcd,
1538c349dbc7Sjsg 						       dsc_bpc);
1539c349dbc7Sjsg 	for (i = 0; i < num_bpc; i++) {
1540c349dbc7Sjsg 		if (dsc_max_bpc >= dsc_bpc[i])
1541c349dbc7Sjsg 			return dsc_bpc[i] * 3;
1542c349dbc7Sjsg 	}
1543c349dbc7Sjsg 
1544c349dbc7Sjsg 	return 0;
1545c349dbc7Sjsg }
1546c349dbc7Sjsg 
15471bb76ff1Sjsg static int intel_dp_source_dsc_version_minor(struct intel_dp *intel_dp)
15481bb76ff1Sjsg {
15491bb76ff1Sjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
15501bb76ff1Sjsg 
15511bb76ff1Sjsg 	return DISPLAY_VER(i915) >= 14 ? 2 : 1;
15521bb76ff1Sjsg }
15531bb76ff1Sjsg 
15541bb76ff1Sjsg static int intel_dp_sink_dsc_version_minor(struct intel_dp *intel_dp)
15551bb76ff1Sjsg {
15561bb76ff1Sjsg 	return (intel_dp->dsc_dpcd[DP_DSC_REV - DP_DSC_SUPPORT] & DP_DSC_MINOR_MASK) >>
15571bb76ff1Sjsg 		DP_DSC_MINOR_SHIFT;
15581bb76ff1Sjsg }
1559c349dbc7Sjsg 
1560f005ef32Sjsg static int intel_dp_get_slice_height(int vactive)
1561f005ef32Sjsg {
1562f005ef32Sjsg 	int slice_height;
1563f005ef32Sjsg 
1564f005ef32Sjsg 	/*
1565f005ef32Sjsg 	 * VDSC 1.2a spec in Section 3.8 Options for Slices implies that 108
1566f005ef32Sjsg 	 * lines is an optimal slice height, but any size can be used as long as
1567f005ef32Sjsg 	 * vertical active integer multiple and maximum vertical slice count
1568f005ef32Sjsg 	 * requirements are met.
1569f005ef32Sjsg 	 */
1570f005ef32Sjsg 	for (slice_height = 108; slice_height <= vactive; slice_height += 2)
1571f005ef32Sjsg 		if (vactive % slice_height == 0)
1572f005ef32Sjsg 			return slice_height;
1573f005ef32Sjsg 
1574f005ef32Sjsg 	/*
1575f005ef32Sjsg 	 * Highly unlikely we reach here as most of the resolutions will end up
1576f005ef32Sjsg 	 * finding appropriate slice_height in above loop but returning
1577f005ef32Sjsg 	 * slice_height as 2 here as it should work with all resolutions.
1578f005ef32Sjsg 	 */
1579f005ef32Sjsg 	return 2;
1580f005ef32Sjsg }
1581f005ef32Sjsg 
1582c349dbc7Sjsg static int intel_dp_dsc_compute_params(struct intel_encoder *encoder,
1583c349dbc7Sjsg 				       struct intel_crtc_state *crtc_state)
1584c349dbc7Sjsg {
1585ad8b1aafSjsg 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
1586c349dbc7Sjsg 	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1587c349dbc7Sjsg 	struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config;
1588c349dbc7Sjsg 	u8 line_buf_depth;
1589c349dbc7Sjsg 	int ret;
1590c349dbc7Sjsg 
15915ca02815Sjsg 	/*
15925ca02815Sjsg 	 * RC_MODEL_SIZE is currently a constant across all configurations.
15935ca02815Sjsg 	 *
15945ca02815Sjsg 	 * FIXME: Look into using sink defined DPCD DP_DSC_RC_BUF_BLK_SIZE and
15955ca02815Sjsg 	 * DP_DSC_RC_BUF_SIZE for this.
15965ca02815Sjsg 	 */
15975ca02815Sjsg 	vdsc_cfg->rc_model_size = DSC_RC_MODEL_SIZE_CONST;
15981bb76ff1Sjsg 	vdsc_cfg->pic_height = crtc_state->hw.adjusted_mode.crtc_vdisplay;
1599c349dbc7Sjsg 
1600f005ef32Sjsg 	vdsc_cfg->slice_height = intel_dp_get_slice_height(vdsc_cfg->pic_height);
1601c349dbc7Sjsg 
16021bb76ff1Sjsg 	ret = intel_dsc_compute_params(crtc_state);
16035ca02815Sjsg 	if (ret)
16045ca02815Sjsg 		return ret;
16055ca02815Sjsg 
1606c349dbc7Sjsg 	vdsc_cfg->dsc_version_major =
1607c349dbc7Sjsg 		(intel_dp->dsc_dpcd[DP_DSC_REV - DP_DSC_SUPPORT] &
1608c349dbc7Sjsg 		 DP_DSC_MAJOR_MASK) >> DP_DSC_MAJOR_SHIFT;
1609c349dbc7Sjsg 	vdsc_cfg->dsc_version_minor =
16101bb76ff1Sjsg 		min(intel_dp_source_dsc_version_minor(intel_dp),
16111bb76ff1Sjsg 		    intel_dp_sink_dsc_version_minor(intel_dp));
1612f005ef32Sjsg 	if (vdsc_cfg->convert_rgb)
1613f005ef32Sjsg 		vdsc_cfg->convert_rgb =
1614f005ef32Sjsg 			intel_dp->dsc_dpcd[DP_DSC_DEC_COLOR_FORMAT_CAP - DP_DSC_SUPPORT] &
1615c349dbc7Sjsg 			DP_DSC_RGB;
1616c349dbc7Sjsg 
1617c349dbc7Sjsg 	line_buf_depth = drm_dp_dsc_sink_line_buf_depth(intel_dp->dsc_dpcd);
1618c349dbc7Sjsg 	if (!line_buf_depth) {
1619ad8b1aafSjsg 		drm_dbg_kms(&i915->drm,
1620ad8b1aafSjsg 			    "DSC Sink Line Buffer Depth invalid\n");
1621c349dbc7Sjsg 		return -EINVAL;
1622c349dbc7Sjsg 	}
1623c349dbc7Sjsg 
1624c349dbc7Sjsg 	if (vdsc_cfg->dsc_version_minor == 2)
1625c349dbc7Sjsg 		vdsc_cfg->line_buf_depth = (line_buf_depth == DSC_1_2_MAX_LINEBUF_DEPTH_BITS) ?
1626c349dbc7Sjsg 			DSC_1_2_MAX_LINEBUF_DEPTH_VAL : line_buf_depth;
1627c349dbc7Sjsg 	else
1628c349dbc7Sjsg 		vdsc_cfg->line_buf_depth = (line_buf_depth > DSC_1_1_MAX_LINEBUF_DEPTH_BITS) ?
1629c349dbc7Sjsg 			DSC_1_1_MAX_LINEBUF_DEPTH_BITS : line_buf_depth;
1630c349dbc7Sjsg 
1631c349dbc7Sjsg 	vdsc_cfg->block_pred_enable =
1632c349dbc7Sjsg 		intel_dp->dsc_dpcd[DP_DSC_BLK_PREDICTION_SUPPORT - DP_DSC_SUPPORT] &
1633c349dbc7Sjsg 		DP_DSC_BLK_PREDICTION_IS_SUPPORTED;
1634c349dbc7Sjsg 
1635c349dbc7Sjsg 	return drm_dsc_compute_rc_parameters(vdsc_cfg);
1636c349dbc7Sjsg }
1637c349dbc7Sjsg 
1638f005ef32Sjsg static bool intel_dp_dsc_supports_format(struct intel_dp *intel_dp,
1639f005ef32Sjsg 					 enum intel_output_format output_format)
1640f005ef32Sjsg {
1641f005ef32Sjsg 	u8 sink_dsc_format;
1642f005ef32Sjsg 
1643f005ef32Sjsg 	switch (output_format) {
1644f005ef32Sjsg 	case INTEL_OUTPUT_FORMAT_RGB:
1645f005ef32Sjsg 		sink_dsc_format = DP_DSC_RGB;
1646f005ef32Sjsg 		break;
1647f005ef32Sjsg 	case INTEL_OUTPUT_FORMAT_YCBCR444:
1648f005ef32Sjsg 		sink_dsc_format = DP_DSC_YCbCr444;
1649f005ef32Sjsg 		break;
1650f005ef32Sjsg 	case INTEL_OUTPUT_FORMAT_YCBCR420:
1651f005ef32Sjsg 		if (min(intel_dp_source_dsc_version_minor(intel_dp),
1652f005ef32Sjsg 			intel_dp_sink_dsc_version_minor(intel_dp)) < 2)
1653f005ef32Sjsg 			return false;
1654f005ef32Sjsg 		sink_dsc_format = DP_DSC_YCbCr420_Native;
1655f005ef32Sjsg 		break;
1656f005ef32Sjsg 	default:
1657f005ef32Sjsg 		return false;
1658f005ef32Sjsg 	}
1659f005ef32Sjsg 
1660f005ef32Sjsg 	return drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd, sink_dsc_format);
1661f005ef32Sjsg }
1662f005ef32Sjsg 
1663f005ef32Sjsg int intel_dp_dsc_compute_config(struct intel_dp *intel_dp,
1664c349dbc7Sjsg 				struct intel_crtc_state *pipe_config,
1665c349dbc7Sjsg 				struct drm_connector_state *conn_state,
1666f005ef32Sjsg 				struct link_config_limits *limits,
1667f005ef32Sjsg 				int timeslots,
1668f005ef32Sjsg 				bool compute_pipe_bpp)
1669c349dbc7Sjsg {
1670c349dbc7Sjsg 	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
1671c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
1672ad8b1aafSjsg 	const struct drm_display_mode *adjusted_mode =
1673ad8b1aafSjsg 		&pipe_config->hw.adjusted_mode;
1674c349dbc7Sjsg 	int pipe_bpp;
1675c349dbc7Sjsg 	int ret;
1676c349dbc7Sjsg 
1677c349dbc7Sjsg 	pipe_config->fec_enable = !intel_dp_is_edp(intel_dp) &&
1678c349dbc7Sjsg 		intel_dp_supports_fec(intel_dp, pipe_config);
1679c349dbc7Sjsg 
1680c349dbc7Sjsg 	if (!intel_dp_supports_dsc(intel_dp, pipe_config))
1681c349dbc7Sjsg 		return -EINVAL;
1682c349dbc7Sjsg 
1683f005ef32Sjsg 	if (!intel_dp_dsc_supports_format(intel_dp, pipe_config->output_format))
1684f005ef32Sjsg 		return -EINVAL;
1685f005ef32Sjsg 
1686f005ef32Sjsg 	if (compute_pipe_bpp)
16875ca02815Sjsg 		pipe_bpp = intel_dp_dsc_compute_bpp(intel_dp, conn_state->max_requested_bpc);
1688f005ef32Sjsg 	else
1689f005ef32Sjsg 		pipe_bpp = pipe_config->pipe_bpp;
1690c349dbc7Sjsg 
16911bb76ff1Sjsg 	if (intel_dp->force_dsc_bpc) {
16921bb76ff1Sjsg 		pipe_bpp = intel_dp->force_dsc_bpc * 3;
16931bb76ff1Sjsg 		drm_dbg_kms(&dev_priv->drm, "Input DSC BPP forced to %d", pipe_bpp);
16941bb76ff1Sjsg 	}
16951bb76ff1Sjsg 
1696c349dbc7Sjsg 	/* Min Input BPC for ICL+ is 8 */
1697c349dbc7Sjsg 	if (pipe_bpp < 8 * 3) {
1698c349dbc7Sjsg 		drm_dbg_kms(&dev_priv->drm,
1699c349dbc7Sjsg 			    "No DSC support for less than 8bpc\n");
1700c349dbc7Sjsg 		return -EINVAL;
1701c349dbc7Sjsg 	}
1702c349dbc7Sjsg 
1703c349dbc7Sjsg 	/*
1704c349dbc7Sjsg 	 * For now enable DSC for max bpp, max link rate, max lane count.
1705c349dbc7Sjsg 	 * Optimize this later for the minimum possible link rate/lane count
1706c349dbc7Sjsg 	 * with DSC enabled for the requested mode.
1707c349dbc7Sjsg 	 */
1708c349dbc7Sjsg 	pipe_config->pipe_bpp = pipe_bpp;
17091bb76ff1Sjsg 	pipe_config->port_clock = limits->max_rate;
1710c349dbc7Sjsg 	pipe_config->lane_count = limits->max_lane_count;
1711c349dbc7Sjsg 
1712c349dbc7Sjsg 	if (intel_dp_is_edp(intel_dp)) {
1713c349dbc7Sjsg 		pipe_config->dsc.compressed_bpp =
1714c349dbc7Sjsg 			min_t(u16, drm_edp_dsc_sink_output_bpp(intel_dp->dsc_dpcd) >> 4,
1715c349dbc7Sjsg 			      pipe_config->pipe_bpp);
1716c349dbc7Sjsg 		pipe_config->dsc.slice_count =
1717c349dbc7Sjsg 			drm_dp_dsc_sink_max_slice_count(intel_dp->dsc_dpcd,
1718c349dbc7Sjsg 							true);
1719c57bd45dSjsg 		if (!pipe_config->dsc.slice_count) {
1720c57bd45dSjsg 			drm_dbg_kms(&dev_priv->drm, "Unsupported Slice Count %d\n",
1721c57bd45dSjsg 				    pipe_config->dsc.slice_count);
1722c57bd45dSjsg 			return -EINVAL;
1723c57bd45dSjsg 		}
1724c349dbc7Sjsg 	} else {
1725f005ef32Sjsg 		u16 dsc_max_output_bpp = 0;
1726c349dbc7Sjsg 		u8 dsc_dp_slice_count;
1727c349dbc7Sjsg 
1728f005ef32Sjsg 		if (compute_pipe_bpp) {
1729c349dbc7Sjsg 			dsc_max_output_bpp =
1730c349dbc7Sjsg 				intel_dp_dsc_get_output_bpp(dev_priv,
1731c349dbc7Sjsg 							    pipe_config->port_clock,
1732c349dbc7Sjsg 							    pipe_config->lane_count,
1733c349dbc7Sjsg 							    adjusted_mode->crtc_clock,
17345ca02815Sjsg 							    adjusted_mode->crtc_hdisplay,
17351bb76ff1Sjsg 							    pipe_config->bigjoiner_pipes,
1736f005ef32Sjsg 							    pipe_bpp,
1737f005ef32Sjsg 							    timeslots);
1738f005ef32Sjsg 			/*
1739f005ef32Sjsg 			 * According to DSC 1.2a Section 4.1.1 Table 4.1 the maximum
1740f005ef32Sjsg 			 * supported PPS value can be 63.9375 and with the further
1741f005ef32Sjsg 			 * mention that bpp should be programmed double the target bpp
1742f005ef32Sjsg 			 * restricting our target bpp to be 31.9375 at max
1743f005ef32Sjsg 			 */
1744f005ef32Sjsg 			if (pipe_config->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
1745f005ef32Sjsg 				dsc_max_output_bpp = min_t(u16, dsc_max_output_bpp, 31 << 4);
1746f005ef32Sjsg 
1747f005ef32Sjsg 			if (!dsc_max_output_bpp) {
1748f005ef32Sjsg 				drm_dbg_kms(&dev_priv->drm,
1749f005ef32Sjsg 					    "Compressed BPP not supported\n");
1750f005ef32Sjsg 				return -EINVAL;
1751f005ef32Sjsg 			}
1752f005ef32Sjsg 		}
1753c349dbc7Sjsg 		dsc_dp_slice_count =
1754c349dbc7Sjsg 			intel_dp_dsc_get_slice_count(intel_dp,
1755c349dbc7Sjsg 						     adjusted_mode->crtc_clock,
17565ca02815Sjsg 						     adjusted_mode->crtc_hdisplay,
17571bb76ff1Sjsg 						     pipe_config->bigjoiner_pipes);
1758f005ef32Sjsg 		if (!dsc_dp_slice_count) {
1759c349dbc7Sjsg 			drm_dbg_kms(&dev_priv->drm,
1760f005ef32Sjsg 				    "Compressed Slice Count not supported\n");
1761c349dbc7Sjsg 			return -EINVAL;
1762c349dbc7Sjsg 		}
1763f005ef32Sjsg 
1764f005ef32Sjsg 		/*
1765f005ef32Sjsg 		 * compute pipe bpp is set to false for DP MST DSC case
1766f005ef32Sjsg 		 * and compressed_bpp is calculated same time once
1767f005ef32Sjsg 		 * vpci timeslots are allocated, because overall bpp
1768f005ef32Sjsg 		 * calculation procedure is bit different for MST case.
1769f005ef32Sjsg 		 */
1770f005ef32Sjsg 		if (compute_pipe_bpp) {
1771c349dbc7Sjsg 			pipe_config->dsc.compressed_bpp = min_t(u16,
1772c349dbc7Sjsg 								dsc_max_output_bpp >> 4,
1773c349dbc7Sjsg 								pipe_config->pipe_bpp);
1774c349dbc7Sjsg 		}
1775f005ef32Sjsg 		pipe_config->dsc.slice_count = dsc_dp_slice_count;
1776f005ef32Sjsg 		drm_dbg_kms(&dev_priv->drm, "DSC: compressed bpp %d slice count %d\n",
1777f005ef32Sjsg 			    pipe_config->dsc.compressed_bpp,
1778f005ef32Sjsg 			    pipe_config->dsc.slice_count);
1779f005ef32Sjsg 	}
1780c349dbc7Sjsg 	/*
1781c349dbc7Sjsg 	 * VDSC engine operates at 1 Pixel per clock, so if peak pixel rate
1782c349dbc7Sjsg 	 * is greater than the maximum Cdclock and if slice count is even
1783c349dbc7Sjsg 	 * then we need to use 2 VDSC instances.
1784c349dbc7Sjsg 	 */
1785f005ef32Sjsg 	if (pipe_config->bigjoiner_pipes || pipe_config->dsc.slice_count > 1)
17865ca02815Sjsg 		pipe_config->dsc.dsc_split = true;
1787c349dbc7Sjsg 
1788c349dbc7Sjsg 	ret = intel_dp_dsc_compute_params(&dig_port->base, pipe_config);
1789c349dbc7Sjsg 	if (ret < 0) {
1790c349dbc7Sjsg 		drm_dbg_kms(&dev_priv->drm,
1791c349dbc7Sjsg 			    "Cannot compute valid DSC parameters for Input Bpp = %d "
1792c349dbc7Sjsg 			    "Compressed BPP = %d\n",
1793c349dbc7Sjsg 			    pipe_config->pipe_bpp,
1794c349dbc7Sjsg 			    pipe_config->dsc.compressed_bpp);
1795c349dbc7Sjsg 		return ret;
1796c349dbc7Sjsg 	}
1797c349dbc7Sjsg 
1798c349dbc7Sjsg 	pipe_config->dsc.compression_enable = true;
1799c349dbc7Sjsg 	drm_dbg_kms(&dev_priv->drm, "DP DSC computed with Input Bpp = %d "
1800c349dbc7Sjsg 		    "Compressed Bpp = %d Slice Count = %d\n",
1801c349dbc7Sjsg 		    pipe_config->pipe_bpp,
1802c349dbc7Sjsg 		    pipe_config->dsc.compressed_bpp,
1803c349dbc7Sjsg 		    pipe_config->dsc.slice_count);
1804c349dbc7Sjsg 
1805c349dbc7Sjsg 	return 0;
1806c349dbc7Sjsg }
1807c349dbc7Sjsg 
1808c349dbc7Sjsg static int
1809c349dbc7Sjsg intel_dp_compute_link_config(struct intel_encoder *encoder,
1810c349dbc7Sjsg 			     struct intel_crtc_state *pipe_config,
18111bb76ff1Sjsg 			     struct drm_connector_state *conn_state,
18121bb76ff1Sjsg 			     bool respect_downstream_limits)
1813c349dbc7Sjsg {
1814ad8b1aafSjsg 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
18151bb76ff1Sjsg 	struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
1816ad8b1aafSjsg 	const struct drm_display_mode *adjusted_mode =
1817ad8b1aafSjsg 		&pipe_config->hw.adjusted_mode;
1818c349dbc7Sjsg 	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1819c349dbc7Sjsg 	struct link_config_limits limits;
18201bb76ff1Sjsg 	bool joiner_needs_dsc = false;
1821c349dbc7Sjsg 	int ret;
1822c349dbc7Sjsg 
18231bb76ff1Sjsg 	limits.min_rate = intel_dp_common_rate(intel_dp, 0);
18241bb76ff1Sjsg 	limits.max_rate = intel_dp_max_link_rate(intel_dp);
1825c349dbc7Sjsg 
1826c349dbc7Sjsg 	limits.min_lane_count = 1;
1827c349dbc7Sjsg 	limits.max_lane_count = intel_dp_max_lane_count(intel_dp);
1828c349dbc7Sjsg 
18295ca02815Sjsg 	limits.min_bpp = intel_dp_min_bpp(pipe_config->output_format);
18301bb76ff1Sjsg 	limits.max_bpp = intel_dp_max_bpp(intel_dp, pipe_config, respect_downstream_limits);
1831c349dbc7Sjsg 
18325ca02815Sjsg 	if (intel_dp->use_max_params) {
1833c349dbc7Sjsg 		/*
1834c349dbc7Sjsg 		 * Use the maximum clock and number of lanes the eDP panel
18355ca02815Sjsg 		 * advertizes being capable of in case the initial fast
18365ca02815Sjsg 		 * optimal params failed us. The panels are generally
1837c349dbc7Sjsg 		 * designed to support only a single clock and lane
18385ca02815Sjsg 		 * configuration, and typically on older panels these
18395ca02815Sjsg 		 * values correspond to the native resolution of the panel.
1840c349dbc7Sjsg 		 */
1841c349dbc7Sjsg 		limits.min_lane_count = limits.max_lane_count;
18421bb76ff1Sjsg 		limits.min_rate = limits.max_rate;
1843c349dbc7Sjsg 	}
1844c349dbc7Sjsg 
1845c349dbc7Sjsg 	intel_dp_adjust_compliance_config(intel_dp, pipe_config, &limits);
1846c349dbc7Sjsg 
1847ad8b1aafSjsg 	drm_dbg_kms(&i915->drm, "DP link computation with max lane count %i "
1848c349dbc7Sjsg 		    "max rate %d max bpp %d pixel clock %iKHz\n",
18491bb76ff1Sjsg 		    limits.max_lane_count, limits.max_rate,
1850c349dbc7Sjsg 		    limits.max_bpp, adjusted_mode->crtc_clock);
1851c349dbc7Sjsg 
18521bb76ff1Sjsg 	if (intel_dp_need_bigjoiner(intel_dp, adjusted_mode->crtc_hdisplay,
18531bb76ff1Sjsg 				    adjusted_mode->crtc_clock))
18541bb76ff1Sjsg 		pipe_config->bigjoiner_pipes = GENMASK(crtc->pipe + 1, crtc->pipe);
18551bb76ff1Sjsg 
18561bb76ff1Sjsg 	/*
18571bb76ff1Sjsg 	 * Pipe joiner needs compression up to display 12 due to bandwidth
18581bb76ff1Sjsg 	 * limitation. DG2 onwards pipe joiner can be enabled without
18591bb76ff1Sjsg 	 * compression.
18601bb76ff1Sjsg 	 */
18611bb76ff1Sjsg 	joiner_needs_dsc = DISPLAY_VER(i915) < 13 && pipe_config->bigjoiner_pipes;
18625ca02815Sjsg 
1863c349dbc7Sjsg 	/*
18645ca02815Sjsg 	 * Optimize for slow and wide for everything, because there are some
18655ca02815Sjsg 	 * eDP 1.3 and 1.4 panels don't work well with fast and narrow.
1866c349dbc7Sjsg 	 */
18671bb76ff1Sjsg 	ret = intel_dp_compute_link_config_wide(intel_dp, pipe_config, conn_state, &limits);
1868c349dbc7Sjsg 
18691bb76ff1Sjsg 	if (ret || joiner_needs_dsc || intel_dp->force_dsc_en) {
18701bb76ff1Sjsg 		drm_dbg_kms(&i915->drm, "Try DSC (fallback=%s, joiner=%s, force=%s)\n",
18711bb76ff1Sjsg 			    str_yes_no(ret), str_yes_no(joiner_needs_dsc),
18721bb76ff1Sjsg 			    str_yes_no(intel_dp->force_dsc_en));
1873c349dbc7Sjsg 		ret = intel_dp_dsc_compute_config(intel_dp, pipe_config,
1874f005ef32Sjsg 						  conn_state, &limits, 64, true);
1875c349dbc7Sjsg 		if (ret < 0)
1876c349dbc7Sjsg 			return ret;
1877c349dbc7Sjsg 	}
1878c349dbc7Sjsg 
1879c349dbc7Sjsg 	if (pipe_config->dsc.compression_enable) {
1880ad8b1aafSjsg 		drm_dbg_kms(&i915->drm,
1881ad8b1aafSjsg 			    "DP lane count %d clock %d Input bpp %d Compressed bpp %d\n",
1882c349dbc7Sjsg 			    pipe_config->lane_count, pipe_config->port_clock,
1883c349dbc7Sjsg 			    pipe_config->pipe_bpp,
1884c349dbc7Sjsg 			    pipe_config->dsc.compressed_bpp);
1885c349dbc7Sjsg 
1886ad8b1aafSjsg 		drm_dbg_kms(&i915->drm,
1887ad8b1aafSjsg 			    "DP link rate required %i available %i\n",
1888c349dbc7Sjsg 			    intel_dp_link_required(adjusted_mode->crtc_clock,
1889c349dbc7Sjsg 						   pipe_config->dsc.compressed_bpp),
1890c349dbc7Sjsg 			    intel_dp_max_data_rate(pipe_config->port_clock,
1891c349dbc7Sjsg 						   pipe_config->lane_count));
1892c349dbc7Sjsg 	} else {
1893ad8b1aafSjsg 		drm_dbg_kms(&i915->drm, "DP lane count %d clock %d bpp %d\n",
1894c349dbc7Sjsg 			    pipe_config->lane_count, pipe_config->port_clock,
1895c349dbc7Sjsg 			    pipe_config->pipe_bpp);
1896c349dbc7Sjsg 
1897ad8b1aafSjsg 		drm_dbg_kms(&i915->drm,
1898ad8b1aafSjsg 			    "DP link rate required %i available %i\n",
1899c349dbc7Sjsg 			    intel_dp_link_required(adjusted_mode->crtc_clock,
1900c349dbc7Sjsg 						   pipe_config->pipe_bpp),
1901c349dbc7Sjsg 			    intel_dp_max_data_rate(pipe_config->port_clock,
1902c349dbc7Sjsg 						   pipe_config->lane_count));
1903c349dbc7Sjsg 	}
1904c349dbc7Sjsg 	return 0;
1905c349dbc7Sjsg }
1906c349dbc7Sjsg 
1907c349dbc7Sjsg bool intel_dp_limited_color_range(const struct intel_crtc_state *crtc_state,
1908c349dbc7Sjsg 				  const struct drm_connector_state *conn_state)
1909c349dbc7Sjsg {
1910c349dbc7Sjsg 	const struct intel_digital_connector_state *intel_conn_state =
1911c349dbc7Sjsg 		to_intel_digital_connector_state(conn_state);
1912c349dbc7Sjsg 	const struct drm_display_mode *adjusted_mode =
1913c349dbc7Sjsg 		&crtc_state->hw.adjusted_mode;
1914c349dbc7Sjsg 
1915c349dbc7Sjsg 	/*
1916c349dbc7Sjsg 	 * Our YCbCr output is always limited range.
1917c349dbc7Sjsg 	 * crtc_state->limited_color_range only applies to RGB,
1918c349dbc7Sjsg 	 * and it must never be set for YCbCr or we risk setting
1919f005ef32Sjsg 	 * some conflicting bits in TRANSCONF which will mess up
1920c349dbc7Sjsg 	 * the colors on the monitor.
1921c349dbc7Sjsg 	 */
1922c349dbc7Sjsg 	if (crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB)
1923c349dbc7Sjsg 		return false;
1924c349dbc7Sjsg 
1925c349dbc7Sjsg 	if (intel_conn_state->broadcast_rgb == INTEL_BROADCAST_RGB_AUTO) {
1926c349dbc7Sjsg 		/*
1927c349dbc7Sjsg 		 * See:
1928c349dbc7Sjsg 		 * CEA-861-E - 5.1 Default Encoding Parameters
1929c349dbc7Sjsg 		 * VESA DisplayPort Ver.1.2a - 5.1.1.1 Video Colorimetry
1930c349dbc7Sjsg 		 */
1931c349dbc7Sjsg 		return crtc_state->pipe_bpp != 18 &&
1932c349dbc7Sjsg 			drm_default_rgb_quant_range(adjusted_mode) ==
1933c349dbc7Sjsg 			HDMI_QUANTIZATION_RANGE_LIMITED;
1934c349dbc7Sjsg 	} else {
1935c349dbc7Sjsg 		return intel_conn_state->broadcast_rgb ==
1936c349dbc7Sjsg 			INTEL_BROADCAST_RGB_LIMITED;
1937c349dbc7Sjsg 	}
1938c349dbc7Sjsg }
1939c349dbc7Sjsg 
1940c349dbc7Sjsg static bool intel_dp_port_has_audio(struct drm_i915_private *dev_priv,
1941c349dbc7Sjsg 				    enum port port)
1942c349dbc7Sjsg {
1943c349dbc7Sjsg 	if (IS_G4X(dev_priv))
1944c349dbc7Sjsg 		return false;
19455ca02815Sjsg 	if (DISPLAY_VER(dev_priv) < 12 && port == PORT_A)
1946c349dbc7Sjsg 		return false;
1947c349dbc7Sjsg 
1948c349dbc7Sjsg 	return true;
1949c349dbc7Sjsg }
1950c349dbc7Sjsg 
1951ad8b1aafSjsg static void intel_dp_compute_vsc_colorimetry(const struct intel_crtc_state *crtc_state,
1952ad8b1aafSjsg 					     const struct drm_connector_state *conn_state,
1953ad8b1aafSjsg 					     struct drm_dp_vsc_sdp *vsc)
1954ad8b1aafSjsg {
1955ad8b1aafSjsg 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
1956ad8b1aafSjsg 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1957ad8b1aafSjsg 
1958ad8b1aafSjsg 	/*
1959ad8b1aafSjsg 	 * Prepare VSC Header for SU as per DP 1.4 spec, Table 2-118
1960ad8b1aafSjsg 	 * VSC SDP supporting 3D stereo, PSR2, and Pixel Encoding/
1961ad8b1aafSjsg 	 * Colorimetry Format indication.
1962ad8b1aafSjsg 	 */
1963ad8b1aafSjsg 	vsc->revision = 0x5;
1964ad8b1aafSjsg 	vsc->length = 0x13;
1965ad8b1aafSjsg 
1966ad8b1aafSjsg 	/* DP 1.4a spec, Table 2-120 */
1967ad8b1aafSjsg 	switch (crtc_state->output_format) {
1968ad8b1aafSjsg 	case INTEL_OUTPUT_FORMAT_YCBCR444:
1969ad8b1aafSjsg 		vsc->pixelformat = DP_PIXELFORMAT_YUV444;
1970ad8b1aafSjsg 		break;
1971ad8b1aafSjsg 	case INTEL_OUTPUT_FORMAT_YCBCR420:
1972ad8b1aafSjsg 		vsc->pixelformat = DP_PIXELFORMAT_YUV420;
1973ad8b1aafSjsg 		break;
1974ad8b1aafSjsg 	case INTEL_OUTPUT_FORMAT_RGB:
1975ad8b1aafSjsg 	default:
1976ad8b1aafSjsg 		vsc->pixelformat = DP_PIXELFORMAT_RGB;
1977ad8b1aafSjsg 	}
1978ad8b1aafSjsg 
1979ad8b1aafSjsg 	switch (conn_state->colorspace) {
1980ad8b1aafSjsg 	case DRM_MODE_COLORIMETRY_BT709_YCC:
1981ad8b1aafSjsg 		vsc->colorimetry = DP_COLORIMETRY_BT709_YCC;
1982ad8b1aafSjsg 		break;
1983ad8b1aafSjsg 	case DRM_MODE_COLORIMETRY_XVYCC_601:
1984ad8b1aafSjsg 		vsc->colorimetry = DP_COLORIMETRY_XVYCC_601;
1985ad8b1aafSjsg 		break;
1986ad8b1aafSjsg 	case DRM_MODE_COLORIMETRY_XVYCC_709:
1987ad8b1aafSjsg 		vsc->colorimetry = DP_COLORIMETRY_XVYCC_709;
1988ad8b1aafSjsg 		break;
1989ad8b1aafSjsg 	case DRM_MODE_COLORIMETRY_SYCC_601:
1990ad8b1aafSjsg 		vsc->colorimetry = DP_COLORIMETRY_SYCC_601;
1991ad8b1aafSjsg 		break;
1992ad8b1aafSjsg 	case DRM_MODE_COLORIMETRY_OPYCC_601:
1993ad8b1aafSjsg 		vsc->colorimetry = DP_COLORIMETRY_OPYCC_601;
1994ad8b1aafSjsg 		break;
1995ad8b1aafSjsg 	case DRM_MODE_COLORIMETRY_BT2020_CYCC:
1996ad8b1aafSjsg 		vsc->colorimetry = DP_COLORIMETRY_BT2020_CYCC;
1997ad8b1aafSjsg 		break;
1998ad8b1aafSjsg 	case DRM_MODE_COLORIMETRY_BT2020_RGB:
1999ad8b1aafSjsg 		vsc->colorimetry = DP_COLORIMETRY_BT2020_RGB;
2000ad8b1aafSjsg 		break;
2001ad8b1aafSjsg 	case DRM_MODE_COLORIMETRY_BT2020_YCC:
2002ad8b1aafSjsg 		vsc->colorimetry = DP_COLORIMETRY_BT2020_YCC;
2003ad8b1aafSjsg 		break;
2004ad8b1aafSjsg 	case DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65:
2005ad8b1aafSjsg 	case DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER:
2006ad8b1aafSjsg 		vsc->colorimetry = DP_COLORIMETRY_DCI_P3_RGB;
2007ad8b1aafSjsg 		break;
2008ad8b1aafSjsg 	default:
2009ad8b1aafSjsg 		/*
2010ad8b1aafSjsg 		 * RGB->YCBCR color conversion uses the BT.709
2011ad8b1aafSjsg 		 * color space.
2012ad8b1aafSjsg 		 */
2013ad8b1aafSjsg 		if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
2014ad8b1aafSjsg 			vsc->colorimetry = DP_COLORIMETRY_BT709_YCC;
2015ad8b1aafSjsg 		else
2016ad8b1aafSjsg 			vsc->colorimetry = DP_COLORIMETRY_DEFAULT;
2017ad8b1aafSjsg 		break;
2018ad8b1aafSjsg 	}
2019ad8b1aafSjsg 
2020ad8b1aafSjsg 	vsc->bpc = crtc_state->pipe_bpp / 3;
2021ad8b1aafSjsg 
2022ad8b1aafSjsg 	/* only RGB pixelformat supports 6 bpc */
2023ad8b1aafSjsg 	drm_WARN_ON(&dev_priv->drm,
2024ad8b1aafSjsg 		    vsc->bpc == 6 && vsc->pixelformat != DP_PIXELFORMAT_RGB);
2025ad8b1aafSjsg 
2026ad8b1aafSjsg 	/* all YCbCr are always limited range */
2027ad8b1aafSjsg 	vsc->dynamic_range = DP_DYNAMIC_RANGE_CTA;
2028ad8b1aafSjsg 	vsc->content_type = DP_CONTENT_TYPE_NOT_DEFINED;
2029ad8b1aafSjsg }
2030ad8b1aafSjsg 
2031ad8b1aafSjsg static void intel_dp_compute_vsc_sdp(struct intel_dp *intel_dp,
2032ad8b1aafSjsg 				     struct intel_crtc_state *crtc_state,
2033ad8b1aafSjsg 				     const struct drm_connector_state *conn_state)
2034ad8b1aafSjsg {
2035ad8b1aafSjsg 	struct drm_dp_vsc_sdp *vsc = &crtc_state->infoframes.vsc;
2036ad8b1aafSjsg 
2037ad8b1aafSjsg 	/* When a crtc state has PSR, VSC SDP will be handled by PSR routine */
2038ad8b1aafSjsg 	if (crtc_state->has_psr)
2039ad8b1aafSjsg 		return;
2040ad8b1aafSjsg 
2041ad8b1aafSjsg 	if (!intel_dp_needs_vsc_sdp(crtc_state, conn_state))
2042ad8b1aafSjsg 		return;
2043ad8b1aafSjsg 
2044ad8b1aafSjsg 	crtc_state->infoframes.enable |= intel_hdmi_infoframe_enable(DP_SDP_VSC);
2045ad8b1aafSjsg 	vsc->sdp_type = DP_SDP_VSC;
2046ad8b1aafSjsg 	intel_dp_compute_vsc_colorimetry(crtc_state, conn_state,
2047ad8b1aafSjsg 					 &crtc_state->infoframes.vsc);
2048ad8b1aafSjsg }
2049ad8b1aafSjsg 
2050ad8b1aafSjsg void intel_dp_compute_psr_vsc_sdp(struct intel_dp *intel_dp,
2051ad8b1aafSjsg 				  const struct intel_crtc_state *crtc_state,
2052ad8b1aafSjsg 				  const struct drm_connector_state *conn_state,
2053ad8b1aafSjsg 				  struct drm_dp_vsc_sdp *vsc)
2054ad8b1aafSjsg {
2055ad8b1aafSjsg 	vsc->sdp_type = DP_SDP_VSC;
2056ad8b1aafSjsg 
20571bb76ff1Sjsg 	if (crtc_state->has_psr2) {
20585ca02815Sjsg 		if (intel_dp->psr.colorimetry_support &&
2059ad8b1aafSjsg 		    intel_dp_needs_vsc_sdp(crtc_state, conn_state)) {
2060ad8b1aafSjsg 			/* [PSR2, +Colorimetry] */
2061ad8b1aafSjsg 			intel_dp_compute_vsc_colorimetry(crtc_state, conn_state,
2062ad8b1aafSjsg 							 vsc);
2063ad8b1aafSjsg 		} else {
2064ad8b1aafSjsg 			/*
2065ad8b1aafSjsg 			 * [PSR2, -Colorimetry]
2066ad8b1aafSjsg 			 * Prepare VSC Header for SU as per eDP 1.4 spec, Table 6-11
2067ad8b1aafSjsg 			 * 3D stereo + PSR/PSR2 + Y-coordinate.
2068ad8b1aafSjsg 			 */
2069ad8b1aafSjsg 			vsc->revision = 0x4;
2070ad8b1aafSjsg 			vsc->length = 0xe;
2071ad8b1aafSjsg 		}
2072ad8b1aafSjsg 	} else {
2073ad8b1aafSjsg 		/*
2074ad8b1aafSjsg 		 * [PSR1]
2075ad8b1aafSjsg 		 * Prepare VSC Header for SU as per DP 1.4 spec, Table 2-118
2076ad8b1aafSjsg 		 * VSC SDP supporting 3D stereo + PSR (applies to eDP v1.3 or
2077ad8b1aafSjsg 		 * higher).
2078ad8b1aafSjsg 		 */
2079ad8b1aafSjsg 		vsc->revision = 0x2;
2080ad8b1aafSjsg 		vsc->length = 0x8;
2081ad8b1aafSjsg 	}
2082ad8b1aafSjsg }
2083ad8b1aafSjsg 
2084ad8b1aafSjsg static void
2085ad8b1aafSjsg intel_dp_compute_hdr_metadata_infoframe_sdp(struct intel_dp *intel_dp,
2086ad8b1aafSjsg 					    struct intel_crtc_state *crtc_state,
2087ad8b1aafSjsg 					    const struct drm_connector_state *conn_state)
2088ad8b1aafSjsg {
2089ad8b1aafSjsg 	int ret;
2090ad8b1aafSjsg 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
2091ad8b1aafSjsg 	struct hdmi_drm_infoframe *drm_infoframe = &crtc_state->infoframes.drm.drm;
2092ad8b1aafSjsg 
2093ad8b1aafSjsg 	if (!conn_state->hdr_output_metadata)
2094ad8b1aafSjsg 		return;
2095ad8b1aafSjsg 
2096ad8b1aafSjsg 	ret = drm_hdmi_infoframe_set_hdr_metadata(drm_infoframe, conn_state);
2097ad8b1aafSjsg 
2098ad8b1aafSjsg 	if (ret) {
2099ad8b1aafSjsg 		drm_dbg_kms(&dev_priv->drm, "couldn't set HDR metadata in infoframe\n");
2100ad8b1aafSjsg 		return;
2101ad8b1aafSjsg 	}
2102ad8b1aafSjsg 
2103ad8b1aafSjsg 	crtc_state->infoframes.enable |=
2104ad8b1aafSjsg 		intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GAMUT_METADATA);
2105ad8b1aafSjsg }
2106ad8b1aafSjsg 
21071bb76ff1Sjsg static bool cpu_transcoder_has_drrs(struct drm_i915_private *i915,
21081bb76ff1Sjsg 				    enum transcoder cpu_transcoder)
21091bb76ff1Sjsg {
21101bb76ff1Sjsg 	if (HAS_DOUBLE_BUFFERED_M_N(i915))
21111bb76ff1Sjsg 		return true;
21121bb76ff1Sjsg 
21131bb76ff1Sjsg 	return intel_cpu_transcoder_has_m2_n2(i915, cpu_transcoder);
21141bb76ff1Sjsg }
21151bb76ff1Sjsg 
21161bb76ff1Sjsg static bool can_enable_drrs(struct intel_connector *connector,
21171bb76ff1Sjsg 			    const struct intel_crtc_state *pipe_config,
21181bb76ff1Sjsg 			    const struct drm_display_mode *downclock_mode)
21191bb76ff1Sjsg {
21201bb76ff1Sjsg 	struct drm_i915_private *i915 = to_i915(connector->base.dev);
21211bb76ff1Sjsg 
21221bb76ff1Sjsg 	if (pipe_config->vrr.enable)
21231bb76ff1Sjsg 		return false;
21241bb76ff1Sjsg 
21251bb76ff1Sjsg 	/*
21261bb76ff1Sjsg 	 * DRRS and PSR can't be enable together, so giving preference to PSR
21271bb76ff1Sjsg 	 * as it allows more power-savings by complete shutting down display,
21281bb76ff1Sjsg 	 * so to guarantee this, intel_drrs_compute_config() must be called
21291bb76ff1Sjsg 	 * after intel_psr_compute_config().
21301bb76ff1Sjsg 	 */
21311bb76ff1Sjsg 	if (pipe_config->has_psr)
21321bb76ff1Sjsg 		return false;
21331bb76ff1Sjsg 
21341bb76ff1Sjsg 	/* FIXME missing FDI M2/N2 etc. */
21351bb76ff1Sjsg 	if (pipe_config->has_pch_encoder)
21361bb76ff1Sjsg 		return false;
21371bb76ff1Sjsg 
21381bb76ff1Sjsg 	if (!cpu_transcoder_has_drrs(i915, pipe_config->cpu_transcoder))
21391bb76ff1Sjsg 		return false;
21401bb76ff1Sjsg 
21411bb76ff1Sjsg 	return downclock_mode &&
21421bb76ff1Sjsg 		intel_panel_drrs_type(connector) == DRRS_TYPE_SEAMLESS;
21431bb76ff1Sjsg }
21441bb76ff1Sjsg 
21451bb76ff1Sjsg static void
21461bb76ff1Sjsg intel_dp_drrs_compute_config(struct intel_connector *connector,
21471bb76ff1Sjsg 			     struct intel_crtc_state *pipe_config,
21481bb76ff1Sjsg 			     int output_bpp)
21491bb76ff1Sjsg {
21501bb76ff1Sjsg 	struct drm_i915_private *i915 = to_i915(connector->base.dev);
21511bb76ff1Sjsg 	const struct drm_display_mode *downclock_mode =
21521bb76ff1Sjsg 		intel_panel_downclock_mode(connector, &pipe_config->hw.adjusted_mode);
21531bb76ff1Sjsg 	int pixel_clock;
21541bb76ff1Sjsg 
2155da099fe5Sjsg 	/*
2156da099fe5Sjsg 	 * FIXME all joined pipes share the same transcoder.
2157da099fe5Sjsg 	 * Need to account for that when updating M/N live.
2158da099fe5Sjsg 	 */
2159da099fe5Sjsg 	if (has_seamless_m_n(connector) && !pipe_config->bigjoiner_pipes)
21601b89dd6fSjsg 		pipe_config->update_m_n = true;
21611bb76ff1Sjsg 
21621bb76ff1Sjsg 	if (!can_enable_drrs(connector, pipe_config, downclock_mode)) {
21631bb76ff1Sjsg 		if (intel_cpu_transcoder_has_m2_n2(i915, pipe_config->cpu_transcoder))
21641bb76ff1Sjsg 			intel_zero_m_n(&pipe_config->dp_m2_n2);
21651bb76ff1Sjsg 		return;
21661bb76ff1Sjsg 	}
21671bb76ff1Sjsg 
21681bb76ff1Sjsg 	if (IS_IRONLAKE(i915) || IS_SANDYBRIDGE(i915) || IS_IVYBRIDGE(i915))
21691bb76ff1Sjsg 		pipe_config->msa_timing_delay = connector->panel.vbt.edp.drrs_msa_timing_delay;
21701bb76ff1Sjsg 
21711bb76ff1Sjsg 	pipe_config->has_drrs = true;
21721bb76ff1Sjsg 
21731bb76ff1Sjsg 	pixel_clock = downclock_mode->clock;
21741bb76ff1Sjsg 	if (pipe_config->splitter.enable)
21751bb76ff1Sjsg 		pixel_clock /= pipe_config->splitter.link_count;
21761bb76ff1Sjsg 
21771bb76ff1Sjsg 	intel_link_compute_m_n(output_bpp, pipe_config->lane_count, pixel_clock,
21781bb76ff1Sjsg 			       pipe_config->port_clock, &pipe_config->dp_m2_n2,
21791bb76ff1Sjsg 			       pipe_config->fec_enable);
21801bb76ff1Sjsg 
21811bb76ff1Sjsg 	/* FIXME: abstract this better */
21821bb76ff1Sjsg 	if (pipe_config->splitter.enable)
21831bb76ff1Sjsg 		pipe_config->dp_m2_n2.data_m *= pipe_config->splitter.link_count;
21841bb76ff1Sjsg }
21851bb76ff1Sjsg 
21861bb76ff1Sjsg static bool intel_dp_has_audio(struct intel_encoder *encoder,
21871bb76ff1Sjsg 			       const struct drm_connector_state *conn_state)
21881bb76ff1Sjsg {
21891bb76ff1Sjsg 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
21901bb76ff1Sjsg 	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2191f005ef32Sjsg 	struct intel_connector *connector = intel_dp->attached_connector;
21921bb76ff1Sjsg 	const struct intel_digital_connector_state *intel_conn_state =
21931bb76ff1Sjsg 		to_intel_digital_connector_state(conn_state);
21941bb76ff1Sjsg 
21951bb76ff1Sjsg 	if (!intel_dp_port_has_audio(i915, encoder->port))
21961bb76ff1Sjsg 		return false;
21971bb76ff1Sjsg 
21981bb76ff1Sjsg 	if (intel_conn_state->force_audio == HDMI_AUDIO_AUTO)
2199f005ef32Sjsg 		return connector->base.display_info.has_audio;
22001bb76ff1Sjsg 	else
22011bb76ff1Sjsg 		return intel_conn_state->force_audio == HDMI_AUDIO_ON;
22021bb76ff1Sjsg }
22031bb76ff1Sjsg 
22041bb76ff1Sjsg static int
22051bb76ff1Sjsg intel_dp_compute_output_format(struct intel_encoder *encoder,
22061bb76ff1Sjsg 			       struct intel_crtc_state *crtc_state,
22071bb76ff1Sjsg 			       struct drm_connector_state *conn_state,
22081bb76ff1Sjsg 			       bool respect_downstream_limits)
22091bb76ff1Sjsg {
22101bb76ff1Sjsg 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
22111bb76ff1Sjsg 	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
22121bb76ff1Sjsg 	struct intel_connector *connector = intel_dp->attached_connector;
22131bb76ff1Sjsg 	const struct drm_display_info *info = &connector->base.display_info;
22141bb76ff1Sjsg 	const struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode;
22151bb76ff1Sjsg 	bool ycbcr_420_only;
22161bb76ff1Sjsg 	int ret;
22171bb76ff1Sjsg 
22181bb76ff1Sjsg 	ycbcr_420_only = drm_mode_is_420_only(info, adjusted_mode);
22191bb76ff1Sjsg 
2220f005ef32Sjsg 	if (ycbcr_420_only && !connector->base.ycbcr_420_allowed) {
22211bb76ff1Sjsg 		drm_dbg_kms(&i915->drm,
22221bb76ff1Sjsg 			    "YCbCr 4:2:0 mode but YCbCr 4:2:0 output not possible. Falling back to RGB.\n");
2223f005ef32Sjsg 		crtc_state->sink_format = INTEL_OUTPUT_FORMAT_RGB;
2224f005ef32Sjsg 	} else {
2225f005ef32Sjsg 		crtc_state->sink_format = intel_dp_sink_format(connector, adjusted_mode);
22261bb76ff1Sjsg 	}
22271bb76ff1Sjsg 
2228f005ef32Sjsg 	crtc_state->output_format = intel_dp_output_format(connector, crtc_state->sink_format);
2229f005ef32Sjsg 
22301bb76ff1Sjsg 	ret = intel_dp_compute_link_config(encoder, crtc_state, conn_state,
22311bb76ff1Sjsg 					   respect_downstream_limits);
22321bb76ff1Sjsg 	if (ret) {
2233f005ef32Sjsg 		if (crtc_state->sink_format == INTEL_OUTPUT_FORMAT_YCBCR420 ||
22341bb76ff1Sjsg 		    !connector->base.ycbcr_420_allowed ||
22351bb76ff1Sjsg 		    !drm_mode_is_420_also(info, adjusted_mode))
22361bb76ff1Sjsg 			return ret;
22371bb76ff1Sjsg 
2238f005ef32Sjsg 		crtc_state->sink_format = INTEL_OUTPUT_FORMAT_YCBCR420;
2239f005ef32Sjsg 		crtc_state->output_format = intel_dp_output_format(connector,
2240f005ef32Sjsg 								   crtc_state->sink_format);
22411bb76ff1Sjsg 		ret = intel_dp_compute_link_config(encoder, crtc_state, conn_state,
22421bb76ff1Sjsg 						   respect_downstream_limits);
22431bb76ff1Sjsg 	}
22441bb76ff1Sjsg 
22451bb76ff1Sjsg 	return ret;
22461bb76ff1Sjsg }
22471bb76ff1Sjsg 
2248f005ef32Sjsg static void
2249f005ef32Sjsg intel_dp_audio_compute_config(struct intel_encoder *encoder,
2250f005ef32Sjsg 			      struct intel_crtc_state *pipe_config,
2251f005ef32Sjsg 			      struct drm_connector_state *conn_state)
2252f005ef32Sjsg {
2253f005ef32Sjsg 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
2254f005ef32Sjsg 	struct drm_connector *connector = conn_state->connector;
2255f005ef32Sjsg 
2256f005ef32Sjsg 	pipe_config->sdp_split_enable =
2257f005ef32Sjsg 		intel_dp_has_audio(encoder, conn_state) &&
2258f005ef32Sjsg 		intel_dp_is_uhbr(pipe_config);
2259f005ef32Sjsg 
2260f005ef32Sjsg 	drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] SDP split enable: %s\n",
2261f005ef32Sjsg 		    connector->base.id, connector->name,
2262f005ef32Sjsg 		    str_yes_no(pipe_config->sdp_split_enable));
2263f005ef32Sjsg }
2264f005ef32Sjsg 
2265c349dbc7Sjsg int
2266c349dbc7Sjsg intel_dp_compute_config(struct intel_encoder *encoder,
2267c349dbc7Sjsg 			struct intel_crtc_state *pipe_config,
2268c349dbc7Sjsg 			struct drm_connector_state *conn_state)
2269c349dbc7Sjsg {
2270c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2271c349dbc7Sjsg 	struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
2272c349dbc7Sjsg 	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
22731bb76ff1Sjsg 	const struct drm_display_mode *fixed_mode;
22741bb76ff1Sjsg 	struct intel_connector *connector = intel_dp->attached_connector;
2275c349dbc7Sjsg 	int ret = 0, output_bpp;
2276c349dbc7Sjsg 
22771bb76ff1Sjsg 	if (HAS_PCH_SPLIT(dev_priv) && !HAS_DDI(dev_priv) && encoder->port != PORT_A)
2278c349dbc7Sjsg 		pipe_config->has_pch_encoder = true;
2279c349dbc7Sjsg 
2280f005ef32Sjsg 	pipe_config->has_audio =
2281f005ef32Sjsg 		intel_dp_has_audio(encoder, conn_state) &&
2282f005ef32Sjsg 		intel_audio_compute_config(encoder, pipe_config, conn_state);
2283c349dbc7Sjsg 
22841bb76ff1Sjsg 	fixed_mode = intel_panel_fixed_mode(connector, adjusted_mode);
22851bb76ff1Sjsg 	if (intel_dp_is_edp(intel_dp) && fixed_mode) {
22861bb76ff1Sjsg 		ret = intel_panel_compute_config(connector, adjusted_mode);
2287c349dbc7Sjsg 		if (ret)
2288c349dbc7Sjsg 			return ret;
2289c349dbc7Sjsg 	}
2290c349dbc7Sjsg 
2291c349dbc7Sjsg 	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
2292c349dbc7Sjsg 		return -EINVAL;
2293c349dbc7Sjsg 
2294f005ef32Sjsg 	if (!connector->base.interlace_allowed &&
2295c349dbc7Sjsg 	    adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)
2296c349dbc7Sjsg 		return -EINVAL;
2297c349dbc7Sjsg 
2298c349dbc7Sjsg 	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK)
2299c349dbc7Sjsg 		return -EINVAL;
2300c349dbc7Sjsg 
2301c349dbc7Sjsg 	if (intel_dp_hdisplay_bad(dev_priv, adjusted_mode->crtc_hdisplay))
2302c349dbc7Sjsg 		return -EINVAL;
2303c349dbc7Sjsg 
23041bb76ff1Sjsg 	/*
23051bb76ff1Sjsg 	 * Try to respect downstream TMDS clock limits first, if
23061bb76ff1Sjsg 	 * that fails assume the user might know something we don't.
23071bb76ff1Sjsg 	 */
23081bb76ff1Sjsg 	ret = intel_dp_compute_output_format(encoder, pipe_config, conn_state, true);
23091bb76ff1Sjsg 	if (ret)
23101bb76ff1Sjsg 		ret = intel_dp_compute_output_format(encoder, pipe_config, conn_state, false);
23111bb76ff1Sjsg 	if (ret)
2312c349dbc7Sjsg 		return ret;
2313c349dbc7Sjsg 
23141bb76ff1Sjsg 	if ((intel_dp_is_edp(intel_dp) && fixed_mode) ||
23151bb76ff1Sjsg 	    pipe_config->output_format == INTEL_OUTPUT_FORMAT_YCBCR420) {
23161bb76ff1Sjsg 		ret = intel_panel_fitting(pipe_config, conn_state);
23171bb76ff1Sjsg 		if (ret)
23181bb76ff1Sjsg 			return ret;
23191bb76ff1Sjsg 	}
23201bb76ff1Sjsg 
2321c349dbc7Sjsg 	pipe_config->limited_color_range =
2322c349dbc7Sjsg 		intel_dp_limited_color_range(pipe_config, conn_state);
2323c349dbc7Sjsg 
2324f005ef32Sjsg 	pipe_config->enhanced_framing =
2325f005ef32Sjsg 		drm_dp_enhanced_frame_cap(intel_dp->dpcd);
2326f005ef32Sjsg 
2327c349dbc7Sjsg 	if (pipe_config->dsc.compression_enable)
2328c349dbc7Sjsg 		output_bpp = pipe_config->dsc.compressed_bpp;
2329c349dbc7Sjsg 	else
23305ca02815Sjsg 		output_bpp = intel_dp_output_bpp(pipe_config->output_format,
23315ca02815Sjsg 						 pipe_config->pipe_bpp);
23325ca02815Sjsg 
23335ca02815Sjsg 	if (intel_dp->mso_link_count) {
23345ca02815Sjsg 		int n = intel_dp->mso_link_count;
23355ca02815Sjsg 		int overlap = intel_dp->mso_pixel_overlap;
23365ca02815Sjsg 
23375ca02815Sjsg 		pipe_config->splitter.enable = true;
23385ca02815Sjsg 		pipe_config->splitter.link_count = n;
23395ca02815Sjsg 		pipe_config->splitter.pixel_overlap = overlap;
23405ca02815Sjsg 
23415ca02815Sjsg 		drm_dbg_kms(&dev_priv->drm, "MSO link count %d, pixel overlap %d\n",
23425ca02815Sjsg 			    n, overlap);
23435ca02815Sjsg 
23445ca02815Sjsg 		adjusted_mode->crtc_hdisplay = adjusted_mode->crtc_hdisplay / n + overlap;
23455ca02815Sjsg 		adjusted_mode->crtc_hblank_start = adjusted_mode->crtc_hblank_start / n + overlap;
23465ca02815Sjsg 		adjusted_mode->crtc_hblank_end = adjusted_mode->crtc_hblank_end / n + overlap;
23475ca02815Sjsg 		adjusted_mode->crtc_hsync_start = adjusted_mode->crtc_hsync_start / n + overlap;
23485ca02815Sjsg 		adjusted_mode->crtc_hsync_end = adjusted_mode->crtc_hsync_end / n + overlap;
23495ca02815Sjsg 		adjusted_mode->crtc_htotal = adjusted_mode->crtc_htotal / n + overlap;
23505ca02815Sjsg 		adjusted_mode->crtc_clock /= n;
23515ca02815Sjsg 	}
2352c349dbc7Sjsg 
2353f005ef32Sjsg 	intel_dp_audio_compute_config(encoder, pipe_config, conn_state);
2354f005ef32Sjsg 
2355c349dbc7Sjsg 	intel_link_compute_m_n(output_bpp,
2356c349dbc7Sjsg 			       pipe_config->lane_count,
2357c349dbc7Sjsg 			       adjusted_mode->crtc_clock,
2358c349dbc7Sjsg 			       pipe_config->port_clock,
2359c349dbc7Sjsg 			       &pipe_config->dp_m_n,
23601bb76ff1Sjsg 			       pipe_config->fec_enable);
2361c349dbc7Sjsg 
23625ca02815Sjsg 	/* FIXME: abstract this better */
23635ca02815Sjsg 	if (pipe_config->splitter.enable)
23641bb76ff1Sjsg 		pipe_config->dp_m_n.data_m *= pipe_config->splitter.link_count;
2365c349dbc7Sjsg 
23665ca02815Sjsg 	if (!HAS_DDI(dev_priv))
23675ca02815Sjsg 		g4x_dp_set_clock(encoder, pipe_config);
23685ca02815Sjsg 
23695ca02815Sjsg 	intel_vrr_compute_config(pipe_config, conn_state);
23701bb76ff1Sjsg 	intel_psr_compute_config(intel_dp, pipe_config, conn_state);
23711bb76ff1Sjsg 	intel_dp_drrs_compute_config(connector, pipe_config, output_bpp);
2372ad8b1aafSjsg 	intel_dp_compute_vsc_sdp(intel_dp, pipe_config, conn_state);
2373ad8b1aafSjsg 	intel_dp_compute_hdr_metadata_infoframe_sdp(intel_dp, pipe_config, conn_state);
2374c349dbc7Sjsg 
2375c349dbc7Sjsg 	return 0;
2376c349dbc7Sjsg }
2377c349dbc7Sjsg 
2378c349dbc7Sjsg void intel_dp_set_link_params(struct intel_dp *intel_dp,
23795ca02815Sjsg 			      int link_rate, int lane_count)
2380c349dbc7Sjsg {
23811bb76ff1Sjsg 	memset(intel_dp->train_set, 0, sizeof(intel_dp->train_set));
2382c349dbc7Sjsg 	intel_dp->link_trained = false;
2383c349dbc7Sjsg 	intel_dp->link_rate = link_rate;
2384c349dbc7Sjsg 	intel_dp->lane_count = lane_count;
2385c349dbc7Sjsg }
2386c349dbc7Sjsg 
23875ca02815Sjsg static void intel_dp_reset_max_link_params(struct intel_dp *intel_dp)
2388c349dbc7Sjsg {
23895ca02815Sjsg 	intel_dp->max_link_lane_count = intel_dp_max_common_lane_count(intel_dp);
23905ca02815Sjsg 	intel_dp->max_link_rate = intel_dp_max_common_rate(intel_dp);
2391c349dbc7Sjsg }
2392c349dbc7Sjsg 
2393c349dbc7Sjsg /* Enable backlight PWM and backlight PP control. */
2394c349dbc7Sjsg void intel_edp_backlight_on(const struct intel_crtc_state *crtc_state,
2395c349dbc7Sjsg 			    const struct drm_connector_state *conn_state)
2396c349dbc7Sjsg {
2397c349dbc7Sjsg 	struct intel_dp *intel_dp = enc_to_intel_dp(to_intel_encoder(conn_state->best_encoder));
2398ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
2399c349dbc7Sjsg 
2400c349dbc7Sjsg 	if (!intel_dp_is_edp(intel_dp))
2401c349dbc7Sjsg 		return;
2402c349dbc7Sjsg 
2403ad8b1aafSjsg 	drm_dbg_kms(&i915->drm, "\n");
2404c349dbc7Sjsg 
24051bb76ff1Sjsg 	intel_backlight_enable(crtc_state, conn_state);
24065ca02815Sjsg 	intel_pps_backlight_on(intel_dp);
2407c349dbc7Sjsg }
2408c349dbc7Sjsg 
2409c349dbc7Sjsg /* Disable backlight PP control and backlight PWM. */
2410c349dbc7Sjsg void intel_edp_backlight_off(const struct drm_connector_state *old_conn_state)
2411c349dbc7Sjsg {
2412c349dbc7Sjsg 	struct intel_dp *intel_dp = enc_to_intel_dp(to_intel_encoder(old_conn_state->best_encoder));
2413ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
2414c349dbc7Sjsg 
2415c349dbc7Sjsg 	if (!intel_dp_is_edp(intel_dp))
2416c349dbc7Sjsg 		return;
2417c349dbc7Sjsg 
2418ad8b1aafSjsg 	drm_dbg_kms(&i915->drm, "\n");
2419c349dbc7Sjsg 
24205ca02815Sjsg 	intel_pps_backlight_off(intel_dp);
24211bb76ff1Sjsg 	intel_backlight_disable(old_conn_state);
2422c349dbc7Sjsg }
2423c349dbc7Sjsg 
2424c349dbc7Sjsg static bool downstream_hpd_needs_d0(struct intel_dp *intel_dp)
2425c349dbc7Sjsg {
2426c349dbc7Sjsg 	/*
2427c349dbc7Sjsg 	 * DPCD 1.2+ should support BRANCH_DEVICE_CTRL, and thus
2428c349dbc7Sjsg 	 * be capable of signalling downstream hpd with a long pulse.
2429c349dbc7Sjsg 	 * Whether or not that means D3 is safe to use is not clear,
2430c349dbc7Sjsg 	 * but let's assume so until proven otherwise.
2431c349dbc7Sjsg 	 *
2432c349dbc7Sjsg 	 * FIXME should really check all downstream ports...
2433c349dbc7Sjsg 	 */
2434c349dbc7Sjsg 	return intel_dp->dpcd[DP_DPCD_REV] == 0x11 &&
2435c349dbc7Sjsg 		drm_dp_is_branch(intel_dp->dpcd) &&
2436c349dbc7Sjsg 		intel_dp->downstream_ports[0] & DP_DS_PORT_HPD;
2437c349dbc7Sjsg }
2438c349dbc7Sjsg 
2439c349dbc7Sjsg void intel_dp_sink_set_decompression_state(struct intel_dp *intel_dp,
2440c349dbc7Sjsg 					   const struct intel_crtc_state *crtc_state,
2441c349dbc7Sjsg 					   bool enable)
2442c349dbc7Sjsg {
2443ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
2444c349dbc7Sjsg 	int ret;
2445c349dbc7Sjsg 
2446c349dbc7Sjsg 	if (!crtc_state->dsc.compression_enable)
2447c349dbc7Sjsg 		return;
2448c349dbc7Sjsg 
2449c349dbc7Sjsg 	ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_DSC_ENABLE,
2450c349dbc7Sjsg 				 enable ? DP_DECOMPRESSION_EN : 0);
2451c349dbc7Sjsg 	if (ret < 0)
2452ad8b1aafSjsg 		drm_dbg_kms(&i915->drm,
2453ad8b1aafSjsg 			    "Failed to %s sink decompression state\n",
24541bb76ff1Sjsg 			    str_enable_disable(enable));
24555ca02815Sjsg }
24565ca02815Sjsg 
24575ca02815Sjsg static void
24585ca02815Sjsg intel_edp_init_source_oui(struct intel_dp *intel_dp, bool careful)
24595ca02815Sjsg {
24605ca02815Sjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
24615ca02815Sjsg 	u8 oui[] = { 0x00, 0xaa, 0x01 };
24625ca02815Sjsg 	u8 buf[3] = { 0 };
24635ca02815Sjsg 
24645ca02815Sjsg 	/*
24655ca02815Sjsg 	 * During driver init, we want to be careful and avoid changing the source OUI if it's
24665ca02815Sjsg 	 * already set to what we want, so as to avoid clearing any state by accident
24675ca02815Sjsg 	 */
24685ca02815Sjsg 	if (careful) {
24695ca02815Sjsg 		if (drm_dp_dpcd_read(&intel_dp->aux, DP_SOURCE_OUI, buf, sizeof(buf)) < 0)
24705ca02815Sjsg 			drm_err(&i915->drm, "Failed to read source OUI\n");
24715ca02815Sjsg 
24725ca02815Sjsg 		if (memcmp(oui, buf, sizeof(oui)) == 0)
24735ca02815Sjsg 			return;
24745ca02815Sjsg 	}
24755ca02815Sjsg 
24765ca02815Sjsg 	if (drm_dp_dpcd_write(&intel_dp->aux, DP_SOURCE_OUI, oui, sizeof(oui)) < 0)
24775ca02815Sjsg 		drm_err(&i915->drm, "Failed to write source OUI\n");
24785ca02815Sjsg 
24795ca02815Sjsg 	intel_dp->last_oui_write = jiffies;
24805ca02815Sjsg }
24815ca02815Sjsg 
24825ca02815Sjsg void intel_dp_wait_source_oui(struct intel_dp *intel_dp)
24835ca02815Sjsg {
2484f005ef32Sjsg 	struct intel_connector *connector = intel_dp->attached_connector;
24855ca02815Sjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
24865ca02815Sjsg 
2487f005ef32Sjsg 	drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] Performing OUI wait (%u ms)\n",
2488f005ef32Sjsg 		    connector->base.base.id, connector->base.name,
2489f005ef32Sjsg 		    connector->panel.vbt.backlight.hdr_dpcd_refresh_timeout);
2490f005ef32Sjsg 
2491f005ef32Sjsg 	wait_remaining_ms_from_jiffies(intel_dp->last_oui_write,
2492f005ef32Sjsg 				       connector->panel.vbt.backlight.hdr_dpcd_refresh_timeout);
2493c349dbc7Sjsg }
2494c349dbc7Sjsg 
2495ad8b1aafSjsg /* If the device supports it, try to set the power state appropriately */
2496ad8b1aafSjsg void intel_dp_set_power(struct intel_dp *intel_dp, u8 mode)
2497c349dbc7Sjsg {
2498ad8b1aafSjsg 	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
2499ad8b1aafSjsg 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
2500c349dbc7Sjsg 	int ret, i;
2501c349dbc7Sjsg 
2502c349dbc7Sjsg 	/* Should have a valid DPCD by this point */
2503c349dbc7Sjsg 	if (intel_dp->dpcd[DP_DPCD_REV] < 0x11)
2504c349dbc7Sjsg 		return;
2505c349dbc7Sjsg 
2506ad8b1aafSjsg 	if (mode != DP_SET_POWER_D0) {
2507c349dbc7Sjsg 		if (downstream_hpd_needs_d0(intel_dp))
2508c349dbc7Sjsg 			return;
2509c349dbc7Sjsg 
2510ad8b1aafSjsg 		ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_SET_POWER, mode);
2511c349dbc7Sjsg 	} else {
2512c349dbc7Sjsg 		struct intel_lspcon *lspcon = dp_to_lspcon(intel_dp);
2513c349dbc7Sjsg 
25145ca02815Sjsg 		lspcon_resume(dp_to_dig_port(intel_dp));
25155ca02815Sjsg 
25165ca02815Sjsg 		/* Write the source OUI as early as possible */
25175ca02815Sjsg 		if (intel_dp_is_edp(intel_dp))
25185ca02815Sjsg 			intel_edp_init_source_oui(intel_dp, false);
25195ca02815Sjsg 
2520c349dbc7Sjsg 		/*
2521c349dbc7Sjsg 		 * When turning on, we need to retry for 1ms to give the sink
2522c349dbc7Sjsg 		 * time to wake up.
2523c349dbc7Sjsg 		 */
2524c349dbc7Sjsg 		for (i = 0; i < 3; i++) {
2525ad8b1aafSjsg 			ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_SET_POWER, mode);
2526c349dbc7Sjsg 			if (ret == 1)
2527c349dbc7Sjsg 				break;
2528c349dbc7Sjsg 			drm_msleep(1);
2529c349dbc7Sjsg 		}
2530c349dbc7Sjsg 
2531c349dbc7Sjsg 		if (ret == 1 && lspcon->active)
2532c349dbc7Sjsg 			lspcon_wait_pcon_mode(lspcon);
2533c349dbc7Sjsg 	}
2534c349dbc7Sjsg 
2535c349dbc7Sjsg 	if (ret != 1)
2536ad8b1aafSjsg 		drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s] Set power to %s failed\n",
2537ad8b1aafSjsg 			    encoder->base.base.id, encoder->base.name,
2538ad8b1aafSjsg 			    mode == DP_SET_POWER_D0 ? "D0" : "D3");
2539c349dbc7Sjsg }
2540c349dbc7Sjsg 
25415ca02815Sjsg static bool
25425ca02815Sjsg intel_dp_get_dpcd(struct intel_dp *intel_dp);
25435ca02815Sjsg 
25445ca02815Sjsg /**
25455ca02815Sjsg  * intel_dp_sync_state - sync the encoder state during init/resume
25465ca02815Sjsg  * @encoder: intel encoder to sync
25475ca02815Sjsg  * @crtc_state: state for the CRTC connected to the encoder
25485ca02815Sjsg  *
25495ca02815Sjsg  * Sync any state stored in the encoder wrt. HW state during driver init
25505ca02815Sjsg  * and system resume.
25515ca02815Sjsg  */
25525ca02815Sjsg void intel_dp_sync_state(struct intel_encoder *encoder,
25535ca02815Sjsg 			 const struct intel_crtc_state *crtc_state)
2554c349dbc7Sjsg {
25555ca02815Sjsg 	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2556c349dbc7Sjsg 
25575ca02815Sjsg 	if (!crtc_state)
25585ca02815Sjsg 		return;
2559c349dbc7Sjsg 
25605ca02815Sjsg 	/*
25615ca02815Sjsg 	 * Don't clobber DPCD if it's been already read out during output
25625ca02815Sjsg 	 * setup (eDP) or detect.
25635ca02815Sjsg 	 */
25645ca02815Sjsg 	if (intel_dp->dpcd[DP_DPCD_REV] == 0)
25655ca02815Sjsg 		intel_dp_get_dpcd(intel_dp);
25665ca02815Sjsg 
25675ca02815Sjsg 	intel_dp_reset_max_link_params(intel_dp);
25685ca02815Sjsg }
25695ca02815Sjsg 
25705ca02815Sjsg bool intel_dp_initial_fastset_check(struct intel_encoder *encoder,
25715ca02815Sjsg 				    struct intel_crtc_state *crtc_state)
25725ca02815Sjsg {
25735ca02815Sjsg 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
25745ca02815Sjsg 	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2575f005ef32Sjsg 	bool fastset = true;
25765ca02815Sjsg 
25775ca02815Sjsg 	/*
25785ca02815Sjsg 	 * If BIOS has set an unsupported or non-standard link rate for some
25795ca02815Sjsg 	 * reason force an encoder recompute and full modeset.
25805ca02815Sjsg 	 */
25815ca02815Sjsg 	if (intel_dp_rate_index(intel_dp->source_rates, intel_dp->num_source_rates,
25825ca02815Sjsg 				crtc_state->port_clock) < 0) {
2583f005ef32Sjsg 		drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s] Forcing full modeset due to unsupported link rate\n",
2584f005ef32Sjsg 			    encoder->base.base.id, encoder->base.name);
25855ca02815Sjsg 		crtc_state->uapi.connectors_changed = true;
2586f005ef32Sjsg 		fastset = false;
25875ca02815Sjsg 	}
25885ca02815Sjsg 
25895ca02815Sjsg 	/*
25905ca02815Sjsg 	 * FIXME hack to force full modeset when DSC is being used.
25915ca02815Sjsg 	 *
25925ca02815Sjsg 	 * As long as we do not have full state readout and config comparison
25935ca02815Sjsg 	 * of crtc_state->dsc, we have no way to ensure reliable fastset.
25945ca02815Sjsg 	 * Remove once we have readout for DSC.
25955ca02815Sjsg 	 */
25965ca02815Sjsg 	if (crtc_state->dsc.compression_enable) {
2597f005ef32Sjsg 		drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s] Forcing full modeset due to DSC being enabled\n",
2598f005ef32Sjsg 			    encoder->base.base.id, encoder->base.name);
25995ca02815Sjsg 		crtc_state->uapi.mode_changed = true;
2600f005ef32Sjsg 		fastset = false;
26015ca02815Sjsg 	}
26025ca02815Sjsg 
26035ca02815Sjsg 	if (CAN_PSR(intel_dp)) {
2604f005ef32Sjsg 		drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s] Forcing full modeset to compute PSR state\n",
2605f005ef32Sjsg 			    encoder->base.base.id, encoder->base.name);
26065ca02815Sjsg 		crtc_state->uapi.mode_changed = true;
2607f005ef32Sjsg 		fastset = false;
26085ca02815Sjsg 	}
26095ca02815Sjsg 
2610f005ef32Sjsg 	return fastset;
2611c349dbc7Sjsg }
26125ca02815Sjsg 
26135ca02815Sjsg static void intel_dp_get_pcon_dsc_cap(struct intel_dp *intel_dp)
26145ca02815Sjsg {
26155ca02815Sjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
26165ca02815Sjsg 
26175ca02815Sjsg 	/* Clear the cached register set to avoid using stale values */
26185ca02815Sjsg 
26195ca02815Sjsg 	memset(intel_dp->pcon_dsc_dpcd, 0, sizeof(intel_dp->pcon_dsc_dpcd));
26205ca02815Sjsg 
26215ca02815Sjsg 	if (drm_dp_dpcd_read(&intel_dp->aux, DP_PCON_DSC_ENCODER,
26225ca02815Sjsg 			     intel_dp->pcon_dsc_dpcd,
26235ca02815Sjsg 			     sizeof(intel_dp->pcon_dsc_dpcd)) < 0)
26245ca02815Sjsg 		drm_err(&i915->drm, "Failed to read DPCD register 0x%x\n",
26255ca02815Sjsg 			DP_PCON_DSC_ENCODER);
26265ca02815Sjsg 
26275ca02815Sjsg 	drm_dbg_kms(&i915->drm, "PCON ENCODER DSC DPCD: %*ph\n",
26285ca02815Sjsg 		    (int)sizeof(intel_dp->pcon_dsc_dpcd), intel_dp->pcon_dsc_dpcd);
2629c349dbc7Sjsg }
2630c349dbc7Sjsg 
26315ca02815Sjsg static int intel_dp_pcon_get_frl_mask(u8 frl_bw_mask)
26325ca02815Sjsg {
26335ca02815Sjsg 	int bw_gbps[] = {9, 18, 24, 32, 40, 48};
26345ca02815Sjsg 	int i;
2635c349dbc7Sjsg 
26365ca02815Sjsg 	for (i = ARRAY_SIZE(bw_gbps) - 1; i >= 0; i--) {
26375ca02815Sjsg 		if (frl_bw_mask & (1 << i))
26385ca02815Sjsg 			return bw_gbps[i];
26395ca02815Sjsg 	}
26405ca02815Sjsg 	return 0;
26415ca02815Sjsg }
26425ca02815Sjsg 
26435ca02815Sjsg static int intel_dp_pcon_set_frl_mask(int max_frl)
26445ca02815Sjsg {
26455ca02815Sjsg 	switch (max_frl) {
26465ca02815Sjsg 	case 48:
26475ca02815Sjsg 		return DP_PCON_FRL_BW_MASK_48GBPS;
26485ca02815Sjsg 	case 40:
26495ca02815Sjsg 		return DP_PCON_FRL_BW_MASK_40GBPS;
26505ca02815Sjsg 	case 32:
26515ca02815Sjsg 		return DP_PCON_FRL_BW_MASK_32GBPS;
26525ca02815Sjsg 	case 24:
26535ca02815Sjsg 		return DP_PCON_FRL_BW_MASK_24GBPS;
26545ca02815Sjsg 	case 18:
26555ca02815Sjsg 		return DP_PCON_FRL_BW_MASK_18GBPS;
26565ca02815Sjsg 	case 9:
26575ca02815Sjsg 		return DP_PCON_FRL_BW_MASK_9GBPS;
26585ca02815Sjsg 	}
26595ca02815Sjsg 
26605ca02815Sjsg 	return 0;
26615ca02815Sjsg }
26625ca02815Sjsg 
26635ca02815Sjsg static int intel_dp_hdmi_sink_max_frl(struct intel_dp *intel_dp)
26645ca02815Sjsg {
26655ca02815Sjsg 	struct intel_connector *intel_connector = intel_dp->attached_connector;
26665ca02815Sjsg 	struct drm_connector *connector = &intel_connector->base;
26675ca02815Sjsg 	int max_frl_rate;
26685ca02815Sjsg 	int max_lanes, rate_per_lane;
26695ca02815Sjsg 	int max_dsc_lanes, dsc_rate_per_lane;
26705ca02815Sjsg 
26715ca02815Sjsg 	max_lanes = connector->display_info.hdmi.max_lanes;
26725ca02815Sjsg 	rate_per_lane = connector->display_info.hdmi.max_frl_rate_per_lane;
26735ca02815Sjsg 	max_frl_rate = max_lanes * rate_per_lane;
26745ca02815Sjsg 
26755ca02815Sjsg 	if (connector->display_info.hdmi.dsc_cap.v_1p2) {
26765ca02815Sjsg 		max_dsc_lanes = connector->display_info.hdmi.dsc_cap.max_lanes;
26775ca02815Sjsg 		dsc_rate_per_lane = connector->display_info.hdmi.dsc_cap.max_frl_rate_per_lane;
26785ca02815Sjsg 		if (max_dsc_lanes && dsc_rate_per_lane)
26795ca02815Sjsg 			max_frl_rate = min(max_frl_rate, max_dsc_lanes * dsc_rate_per_lane);
26805ca02815Sjsg 	}
26815ca02815Sjsg 
26825ca02815Sjsg 	return max_frl_rate;
26835ca02815Sjsg }
26845ca02815Sjsg 
26851bb76ff1Sjsg static bool
26861bb76ff1Sjsg intel_dp_pcon_is_frl_trained(struct intel_dp *intel_dp,
26871bb76ff1Sjsg 			     u8 max_frl_bw_mask, u8 *frl_trained_mask)
26881bb76ff1Sjsg {
26891bb76ff1Sjsg 	if (drm_dp_pcon_hdmi_link_active(&intel_dp->aux) &&
26901bb76ff1Sjsg 	    drm_dp_pcon_hdmi_link_mode(&intel_dp->aux, frl_trained_mask) == DP_PCON_HDMI_MODE_FRL &&
26911bb76ff1Sjsg 	    *frl_trained_mask >= max_frl_bw_mask)
26921bb76ff1Sjsg 		return true;
26931bb76ff1Sjsg 
26941bb76ff1Sjsg 	return false;
26951bb76ff1Sjsg }
26961bb76ff1Sjsg 
26975ca02815Sjsg static int intel_dp_pcon_start_frl_training(struct intel_dp *intel_dp)
26985ca02815Sjsg {
26995ca02815Sjsg #define TIMEOUT_FRL_READY_MS 500
27005ca02815Sjsg #define TIMEOUT_HDMI_LINK_ACTIVE_MS 1000
27015ca02815Sjsg 
27025ca02815Sjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
27035ca02815Sjsg 	int max_frl_bw, max_pcon_frl_bw, max_edid_frl_bw, ret;
27045ca02815Sjsg 	u8 max_frl_bw_mask = 0, frl_trained_mask;
27055ca02815Sjsg 	bool is_active;
27065ca02815Sjsg 
27075ca02815Sjsg 	max_pcon_frl_bw = intel_dp->dfp.pcon_max_frl_bw;
27085ca02815Sjsg 	drm_dbg(&i915->drm, "PCON max rate = %d Gbps\n", max_pcon_frl_bw);
27095ca02815Sjsg 
27105ca02815Sjsg 	max_edid_frl_bw = intel_dp_hdmi_sink_max_frl(intel_dp);
27115ca02815Sjsg 	drm_dbg(&i915->drm, "Sink max rate from EDID = %d Gbps\n", max_edid_frl_bw);
27125ca02815Sjsg 
27135ca02815Sjsg 	max_frl_bw = min(max_edid_frl_bw, max_pcon_frl_bw);
27145ca02815Sjsg 
27155ca02815Sjsg 	if (max_frl_bw <= 0)
27165ca02815Sjsg 		return -EINVAL;
27175ca02815Sjsg 
27181bb76ff1Sjsg 	max_frl_bw_mask = intel_dp_pcon_set_frl_mask(max_frl_bw);
27191bb76ff1Sjsg 	drm_dbg(&i915->drm, "MAX_FRL_BW_MASK = %u\n", max_frl_bw_mask);
27201bb76ff1Sjsg 
27211bb76ff1Sjsg 	if (intel_dp_pcon_is_frl_trained(intel_dp, max_frl_bw_mask, &frl_trained_mask))
27221bb76ff1Sjsg 		goto frl_trained;
27231bb76ff1Sjsg 
27245ca02815Sjsg 	ret = drm_dp_pcon_frl_prepare(&intel_dp->aux, false);
27255ca02815Sjsg 	if (ret < 0)
27265ca02815Sjsg 		return ret;
27275ca02815Sjsg 	/* Wait for PCON to be FRL Ready */
27285ca02815Sjsg 	wait_for(is_active = drm_dp_pcon_is_frl_ready(&intel_dp->aux) == true, TIMEOUT_FRL_READY_MS);
27295ca02815Sjsg 
27305ca02815Sjsg 	if (!is_active)
27315ca02815Sjsg 		return -ETIMEDOUT;
27325ca02815Sjsg 
27335ca02815Sjsg 	ret = drm_dp_pcon_frl_configure_1(&intel_dp->aux, max_frl_bw,
27345ca02815Sjsg 					  DP_PCON_ENABLE_SEQUENTIAL_LINK);
27355ca02815Sjsg 	if (ret < 0)
27365ca02815Sjsg 		return ret;
27375ca02815Sjsg 	ret = drm_dp_pcon_frl_configure_2(&intel_dp->aux, max_frl_bw_mask,
27385ca02815Sjsg 					  DP_PCON_FRL_LINK_TRAIN_NORMAL);
27395ca02815Sjsg 	if (ret < 0)
27405ca02815Sjsg 		return ret;
27415ca02815Sjsg 	ret = drm_dp_pcon_frl_enable(&intel_dp->aux);
27425ca02815Sjsg 	if (ret < 0)
27435ca02815Sjsg 		return ret;
27445ca02815Sjsg 	/*
27455ca02815Sjsg 	 * Wait for FRL to be completed
27465ca02815Sjsg 	 * Check if the HDMI Link is up and active.
27475ca02815Sjsg 	 */
27481bb76ff1Sjsg 	wait_for(is_active =
27491bb76ff1Sjsg 		 intel_dp_pcon_is_frl_trained(intel_dp, max_frl_bw_mask, &frl_trained_mask),
27501bb76ff1Sjsg 		 TIMEOUT_HDMI_LINK_ACTIVE_MS);
27515ca02815Sjsg 
27525ca02815Sjsg 	if (!is_active)
27535ca02815Sjsg 		return -ETIMEDOUT;
27545ca02815Sjsg 
27551bb76ff1Sjsg frl_trained:
27561bb76ff1Sjsg 	drm_dbg(&i915->drm, "FRL_TRAINED_MASK = %u\n", frl_trained_mask);
27575ca02815Sjsg 	intel_dp->frl.trained_rate_gbps = intel_dp_pcon_get_frl_mask(frl_trained_mask);
27585ca02815Sjsg 	intel_dp->frl.is_trained = true;
27595ca02815Sjsg 	drm_dbg(&i915->drm, "FRL trained with : %d Gbps\n", intel_dp->frl.trained_rate_gbps);
27605ca02815Sjsg 
27615ca02815Sjsg 	return 0;
27625ca02815Sjsg }
27635ca02815Sjsg 
27645ca02815Sjsg static bool intel_dp_is_hdmi_2_1_sink(struct intel_dp *intel_dp)
27655ca02815Sjsg {
27665ca02815Sjsg 	if (drm_dp_is_branch(intel_dp->dpcd) &&
2767f005ef32Sjsg 	    intel_dp_has_hdmi_sink(intel_dp) &&
27685ca02815Sjsg 	    intel_dp_hdmi_sink_max_frl(intel_dp) > 0)
27695ca02815Sjsg 		return true;
2770c349dbc7Sjsg 
2771c349dbc7Sjsg 	return false;
2772c349dbc7Sjsg }
2773c349dbc7Sjsg 
27741bb76ff1Sjsg static
27751bb76ff1Sjsg int intel_dp_pcon_set_tmds_mode(struct intel_dp *intel_dp)
27761bb76ff1Sjsg {
27771bb76ff1Sjsg 	int ret;
27781bb76ff1Sjsg 	u8 buf = 0;
27791bb76ff1Sjsg 
27801bb76ff1Sjsg 	/* Set PCON source control mode */
27811bb76ff1Sjsg 	buf |= DP_PCON_ENABLE_SOURCE_CTL_MODE;
27821bb76ff1Sjsg 
27831bb76ff1Sjsg 	ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_PCON_HDMI_LINK_CONFIG_1, buf);
27841bb76ff1Sjsg 	if (ret < 0)
27851bb76ff1Sjsg 		return ret;
27861bb76ff1Sjsg 
27871bb76ff1Sjsg 	/* Set HDMI LINK ENABLE */
27881bb76ff1Sjsg 	buf |= DP_PCON_ENABLE_HDMI_LINK;
27891bb76ff1Sjsg 	ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_PCON_HDMI_LINK_CONFIG_1, buf);
27901bb76ff1Sjsg 	if (ret < 0)
27911bb76ff1Sjsg 		return ret;
27921bb76ff1Sjsg 
27931bb76ff1Sjsg 	return 0;
27941bb76ff1Sjsg }
27951bb76ff1Sjsg 
27965ca02815Sjsg void intel_dp_check_frl_training(struct intel_dp *intel_dp)
2797c349dbc7Sjsg {
27985ca02815Sjsg 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
2799c349dbc7Sjsg 
28005ca02815Sjsg 	/*
28015ca02815Sjsg 	 * Always go for FRL training if:
28025ca02815Sjsg 	 * -PCON supports SRC_CTL_MODE (VESA DP2.0-HDMI2.1 PCON Spec Draft-1 Sec-7)
28035ca02815Sjsg 	 * -sink is HDMI2.1
28045ca02815Sjsg 	 */
28055ca02815Sjsg 	if (!(intel_dp->downstream_ports[2] & DP_PCON_SOURCE_CTL_MODE) ||
28065ca02815Sjsg 	    !intel_dp_is_hdmi_2_1_sink(intel_dp) ||
28075ca02815Sjsg 	    intel_dp->frl.is_trained)
28085ca02815Sjsg 		return;
2809c349dbc7Sjsg 
28105ca02815Sjsg 	if (intel_dp_pcon_start_frl_training(intel_dp) < 0) {
28115ca02815Sjsg 		int ret, mode;
2812c349dbc7Sjsg 
28135ca02815Sjsg 		drm_dbg(&dev_priv->drm, "Couldn't set FRL mode, continuing with TMDS mode\n");
28141bb76ff1Sjsg 		ret = intel_dp_pcon_set_tmds_mode(intel_dp);
28155ca02815Sjsg 		mode = drm_dp_pcon_hdmi_link_mode(&intel_dp->aux, NULL);
2816c349dbc7Sjsg 
28175ca02815Sjsg 		if (ret < 0 || mode != DP_PCON_HDMI_MODE_TMDS)
28185ca02815Sjsg 			drm_dbg(&dev_priv->drm, "Issue with PCON, cannot set TMDS mode\n");
2819c349dbc7Sjsg 	} else {
28205ca02815Sjsg 		drm_dbg(&dev_priv->drm, "FRL training Completed\n");
2821c349dbc7Sjsg 	}
2822c349dbc7Sjsg }
2823c349dbc7Sjsg 
28245ca02815Sjsg static int
28255ca02815Sjsg intel_dp_pcon_dsc_enc_slice_height(const struct intel_crtc_state *crtc_state)
2826c349dbc7Sjsg {
28275ca02815Sjsg 	int vactive = crtc_state->hw.adjusted_mode.vdisplay;
2828c349dbc7Sjsg 
28295ca02815Sjsg 	return intel_hdmi_dsc_get_slice_height(vactive);
2830c349dbc7Sjsg }
2831c349dbc7Sjsg 
28325ca02815Sjsg static int
28335ca02815Sjsg intel_dp_pcon_dsc_enc_slices(struct intel_dp *intel_dp,
28345ca02815Sjsg 			     const struct intel_crtc_state *crtc_state)
2835c349dbc7Sjsg {
28365ca02815Sjsg 	struct intel_connector *intel_connector = intel_dp->attached_connector;
28375ca02815Sjsg 	struct drm_connector *connector = &intel_connector->base;
28385ca02815Sjsg 	int hdmi_throughput = connector->display_info.hdmi.dsc_cap.clk_per_slice;
28395ca02815Sjsg 	int hdmi_max_slices = connector->display_info.hdmi.dsc_cap.max_slices;
28405ca02815Sjsg 	int pcon_max_slices = drm_dp_pcon_dsc_max_slices(intel_dp->pcon_dsc_dpcd);
28415ca02815Sjsg 	int pcon_max_slice_width = drm_dp_pcon_dsc_max_slice_width(intel_dp->pcon_dsc_dpcd);
28425ca02815Sjsg 
28435ca02815Sjsg 	return intel_hdmi_dsc_get_num_slices(crtc_state, pcon_max_slices,
28445ca02815Sjsg 					     pcon_max_slice_width,
28455ca02815Sjsg 					     hdmi_max_slices, hdmi_throughput);
2846c349dbc7Sjsg }
2847c349dbc7Sjsg 
28485ca02815Sjsg static int
28495ca02815Sjsg intel_dp_pcon_dsc_enc_bpp(struct intel_dp *intel_dp,
28505ca02815Sjsg 			  const struct intel_crtc_state *crtc_state,
28515ca02815Sjsg 			  int num_slices, int slice_width)
2852c349dbc7Sjsg {
28535ca02815Sjsg 	struct intel_connector *intel_connector = intel_dp->attached_connector;
28545ca02815Sjsg 	struct drm_connector *connector = &intel_connector->base;
28555ca02815Sjsg 	int output_format = crtc_state->output_format;
28565ca02815Sjsg 	bool hdmi_all_bpp = connector->display_info.hdmi.dsc_cap.all_bpp;
28575ca02815Sjsg 	int pcon_fractional_bpp = drm_dp_pcon_dsc_bpp_incr(intel_dp->pcon_dsc_dpcd);
28585ca02815Sjsg 	int hdmi_max_chunk_bytes =
28595ca02815Sjsg 		connector->display_info.hdmi.dsc_cap.total_chunk_kbytes * 1024;
28605ca02815Sjsg 
28615ca02815Sjsg 	return intel_hdmi_dsc_get_bpp(pcon_fractional_bpp, slice_width,
28625ca02815Sjsg 				      num_slices, output_format, hdmi_all_bpp,
28635ca02815Sjsg 				      hdmi_max_chunk_bytes);
2864c349dbc7Sjsg }
2865c349dbc7Sjsg 
28665ca02815Sjsg void
28675ca02815Sjsg intel_dp_pcon_dsc_configure(struct intel_dp *intel_dp,
28685ca02815Sjsg 			    const struct intel_crtc_state *crtc_state)
2869c349dbc7Sjsg {
28705ca02815Sjsg 	u8 pps_param[6];
28715ca02815Sjsg 	int slice_height;
28725ca02815Sjsg 	int slice_width;
28735ca02815Sjsg 	int num_slices;
28745ca02815Sjsg 	int bits_per_pixel;
28755ca02815Sjsg 	int ret;
28765ca02815Sjsg 	struct intel_connector *intel_connector = intel_dp->attached_connector;
28775ca02815Sjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
28785ca02815Sjsg 	struct drm_connector *connector;
28795ca02815Sjsg 	bool hdmi_is_dsc_1_2;
2880c349dbc7Sjsg 
28815ca02815Sjsg 	if (!intel_dp_is_hdmi_2_1_sink(intel_dp))
28825ca02815Sjsg 		return;
2883c349dbc7Sjsg 
28845ca02815Sjsg 	if (!intel_connector)
28855ca02815Sjsg 		return;
28865ca02815Sjsg 	connector = &intel_connector->base;
28875ca02815Sjsg 	hdmi_is_dsc_1_2 = connector->display_info.hdmi.dsc_cap.v_1p2;
2888c349dbc7Sjsg 
28895ca02815Sjsg 	if (!drm_dp_pcon_enc_is_dsc_1_2(intel_dp->pcon_dsc_dpcd) ||
28905ca02815Sjsg 	    !hdmi_is_dsc_1_2)
28915ca02815Sjsg 		return;
2892c349dbc7Sjsg 
28935ca02815Sjsg 	slice_height = intel_dp_pcon_dsc_enc_slice_height(crtc_state);
28945ca02815Sjsg 	if (!slice_height)
28955ca02815Sjsg 		return;
2896c349dbc7Sjsg 
28975ca02815Sjsg 	num_slices = intel_dp_pcon_dsc_enc_slices(intel_dp, crtc_state);
28985ca02815Sjsg 	if (!num_slices)
28995ca02815Sjsg 		return;
2900c349dbc7Sjsg 
29015ca02815Sjsg 	slice_width = DIV_ROUND_UP(crtc_state->hw.adjusted_mode.hdisplay,
29025ca02815Sjsg 				   num_slices);
2903c349dbc7Sjsg 
29045ca02815Sjsg 	bits_per_pixel = intel_dp_pcon_dsc_enc_bpp(intel_dp, crtc_state,
29055ca02815Sjsg 						   num_slices, slice_width);
29065ca02815Sjsg 	if (!bits_per_pixel)
29075ca02815Sjsg 		return;
2908c349dbc7Sjsg 
29095ca02815Sjsg 	pps_param[0] = slice_height & 0xFF;
29105ca02815Sjsg 	pps_param[1] = slice_height >> 8;
29115ca02815Sjsg 	pps_param[2] = slice_width & 0xFF;
29125ca02815Sjsg 	pps_param[3] = slice_width >> 8;
29135ca02815Sjsg 	pps_param[4] = bits_per_pixel & 0xFF;
29145ca02815Sjsg 	pps_param[5] = (bits_per_pixel >> 8) & 0x3;
2915c349dbc7Sjsg 
29165ca02815Sjsg 	ret = drm_dp_pcon_pps_override_param(&intel_dp->aux, pps_param);
29175ca02815Sjsg 	if (ret < 0)
29185ca02815Sjsg 		drm_dbg_kms(&i915->drm, "Failed to set pcon DSC\n");
2919c349dbc7Sjsg }
2920c349dbc7Sjsg 
2921ad8b1aafSjsg void intel_dp_configure_protocol_converter(struct intel_dp *intel_dp,
2922ad8b1aafSjsg 					   const struct intel_crtc_state *crtc_state)
2923ad8b1aafSjsg {
2924ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
2925f005ef32Sjsg 	bool ycbcr444_to_420 = false;
2926f005ef32Sjsg 	bool rgb_to_ycbcr = false;
2927ad8b1aafSjsg 	u8 tmp;
2928ad8b1aafSjsg 
2929ad8b1aafSjsg 	if (intel_dp->dpcd[DP_DPCD_REV] < 0x13)
2930ad8b1aafSjsg 		return;
2931ad8b1aafSjsg 
2932ad8b1aafSjsg 	if (!drm_dp_is_branch(intel_dp->dpcd))
2933ad8b1aafSjsg 		return;
2934ad8b1aafSjsg 
2935f005ef32Sjsg 	tmp = intel_dp_has_hdmi_sink(intel_dp) ? DP_HDMI_DVI_OUTPUT_CONFIG : 0;
2936ad8b1aafSjsg 
2937ad8b1aafSjsg 	if (drm_dp_dpcd_writeb(&intel_dp->aux,
2938ad8b1aafSjsg 			       DP_PROTOCOL_CONVERTER_CONTROL_0, tmp) != 1)
29395ca02815Sjsg 		drm_dbg_kms(&i915->drm, "Failed to %s protocol converter HDMI mode\n",
2940f005ef32Sjsg 			    str_enable_disable(intel_dp_has_hdmi_sink(intel_dp)));
2941ad8b1aafSjsg 
2942f005ef32Sjsg 	if (crtc_state->sink_format == INTEL_OUTPUT_FORMAT_YCBCR420) {
2943f005ef32Sjsg 		switch (crtc_state->output_format) {
2944f005ef32Sjsg 		case INTEL_OUTPUT_FORMAT_YCBCR420:
2945f005ef32Sjsg 			break;
2946f005ef32Sjsg 		case INTEL_OUTPUT_FORMAT_YCBCR444:
2947f005ef32Sjsg 			ycbcr444_to_420 = true;
2948f005ef32Sjsg 			break;
2949f005ef32Sjsg 		case INTEL_OUTPUT_FORMAT_RGB:
2950f005ef32Sjsg 			rgb_to_ycbcr = true;
2951f005ef32Sjsg 			ycbcr444_to_420 = true;
2952f005ef32Sjsg 			break;
2953f005ef32Sjsg 		default:
2954f005ef32Sjsg 			MISSING_CASE(crtc_state->output_format);
2955f005ef32Sjsg 			break;
2956f005ef32Sjsg 		}
2957f005ef32Sjsg 	} else if (crtc_state->sink_format == INTEL_OUTPUT_FORMAT_YCBCR444) {
2958f005ef32Sjsg 		switch (crtc_state->output_format) {
2959f005ef32Sjsg 		case INTEL_OUTPUT_FORMAT_YCBCR444:
2960f005ef32Sjsg 			break;
2961f005ef32Sjsg 		case INTEL_OUTPUT_FORMAT_RGB:
2962f005ef32Sjsg 			rgb_to_ycbcr = true;
2963f005ef32Sjsg 			break;
2964f005ef32Sjsg 		default:
2965f005ef32Sjsg 			MISSING_CASE(crtc_state->output_format);
2966f005ef32Sjsg 			break;
2967f005ef32Sjsg 		}
2968f005ef32Sjsg 	}
2969f005ef32Sjsg 
2970f005ef32Sjsg 	tmp = ycbcr444_to_420 ? DP_CONVERSION_TO_YCBCR420_ENABLE : 0;
2971ad8b1aafSjsg 
2972ad8b1aafSjsg 	if (drm_dp_dpcd_writeb(&intel_dp->aux,
2973ad8b1aafSjsg 			       DP_PROTOCOL_CONVERTER_CONTROL_1, tmp) != 1)
2974ad8b1aafSjsg 		drm_dbg_kms(&i915->drm,
29755ca02815Sjsg 			    "Failed to %s protocol converter YCbCr 4:2:0 conversion mode\n",
29761bb76ff1Sjsg 			    str_enable_disable(intel_dp->dfp.ycbcr_444_to_420));
2977ad8b1aafSjsg 
2978f005ef32Sjsg 	tmp = rgb_to_ycbcr ? DP_CONVERSION_BT709_RGB_YCBCR_ENABLE : 0;
29795ca02815Sjsg 
29805ca02815Sjsg 	if (drm_dp_pcon_convert_rgb_to_ycbcr(&intel_dp->aux, tmp) < 0)
2981ad8b1aafSjsg 		drm_dbg_kms(&i915->drm,
29825ca02815Sjsg 			    "Failed to %s protocol converter RGB->YCbCr conversion mode\n",
29831bb76ff1Sjsg 			    str_enable_disable(tmp));
2984ad8b1aafSjsg }
2985ad8b1aafSjsg 
2986c349dbc7Sjsg bool intel_dp_get_colorimetry_status(struct intel_dp *intel_dp)
2987c349dbc7Sjsg {
2988c349dbc7Sjsg 	u8 dprx = 0;
2989c349dbc7Sjsg 
2990c349dbc7Sjsg 	if (drm_dp_dpcd_readb(&intel_dp->aux, DP_DPRX_FEATURE_ENUMERATION_LIST,
2991c349dbc7Sjsg 			      &dprx) != 1)
2992c349dbc7Sjsg 		return false;
2993c349dbc7Sjsg 	return dprx & DP_VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED;
2994c349dbc7Sjsg }
2995c349dbc7Sjsg 
2996c349dbc7Sjsg static void intel_dp_get_dsc_sink_cap(struct intel_dp *intel_dp)
2997c349dbc7Sjsg {
2998ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
2999ad8b1aafSjsg 
3000c349dbc7Sjsg 	/*
3001c349dbc7Sjsg 	 * Clear the cached register set to avoid using stale values
3002c349dbc7Sjsg 	 * for the sinks that do not support DSC.
3003c349dbc7Sjsg 	 */
3004c349dbc7Sjsg 	memset(intel_dp->dsc_dpcd, 0, sizeof(intel_dp->dsc_dpcd));
3005c349dbc7Sjsg 
3006c349dbc7Sjsg 	/* Clear fec_capable to avoid using stale values */
3007c349dbc7Sjsg 	intel_dp->fec_capable = 0;
3008c349dbc7Sjsg 
3009c349dbc7Sjsg 	/* Cache the DSC DPCD if eDP or DP rev >= 1.4 */
3010c349dbc7Sjsg 	if (intel_dp->dpcd[DP_DPCD_REV] >= 0x14 ||
3011c349dbc7Sjsg 	    intel_dp->edp_dpcd[0] >= DP_EDP_14) {
3012c349dbc7Sjsg 		if (drm_dp_dpcd_read(&intel_dp->aux, DP_DSC_SUPPORT,
3013c349dbc7Sjsg 				     intel_dp->dsc_dpcd,
3014c349dbc7Sjsg 				     sizeof(intel_dp->dsc_dpcd)) < 0)
3015ad8b1aafSjsg 			drm_err(&i915->drm,
3016ad8b1aafSjsg 				"Failed to read DPCD register 0x%x\n",
3017c349dbc7Sjsg 				DP_DSC_SUPPORT);
3018c349dbc7Sjsg 
3019ad8b1aafSjsg 		drm_dbg_kms(&i915->drm, "DSC DPCD: %*ph\n",
3020c349dbc7Sjsg 			    (int)sizeof(intel_dp->dsc_dpcd),
3021c349dbc7Sjsg 			    intel_dp->dsc_dpcd);
3022c349dbc7Sjsg 
3023c349dbc7Sjsg 		/* FEC is supported only on DP 1.4 */
3024c349dbc7Sjsg 		if (!intel_dp_is_edp(intel_dp) &&
3025c349dbc7Sjsg 		    drm_dp_dpcd_readb(&intel_dp->aux, DP_FEC_CAPABILITY,
3026c349dbc7Sjsg 				      &intel_dp->fec_capable) < 0)
3027ad8b1aafSjsg 			drm_err(&i915->drm,
3028ad8b1aafSjsg 				"Failed to read FEC DPCD register\n");
3029c349dbc7Sjsg 
3030ad8b1aafSjsg 		drm_dbg_kms(&i915->drm, "FEC CAPABILITY: %x\n",
3031ad8b1aafSjsg 			    intel_dp->fec_capable);
3032c349dbc7Sjsg 	}
3033c349dbc7Sjsg }
3034c349dbc7Sjsg 
30355ca02815Sjsg static void intel_edp_mso_mode_fixup(struct intel_connector *connector,
30365ca02815Sjsg 				     struct drm_display_mode *mode)
30375ca02815Sjsg {
30385ca02815Sjsg 	struct intel_dp *intel_dp = intel_attached_dp(connector);
30395ca02815Sjsg 	struct drm_i915_private *i915 = to_i915(connector->base.dev);
30405ca02815Sjsg 	int n = intel_dp->mso_link_count;
30415ca02815Sjsg 	int overlap = intel_dp->mso_pixel_overlap;
30425ca02815Sjsg 
30435ca02815Sjsg 	if (!mode || !n)
30445ca02815Sjsg 		return;
30455ca02815Sjsg 
30465ca02815Sjsg 	mode->hdisplay = (mode->hdisplay - overlap) * n;
30475ca02815Sjsg 	mode->hsync_start = (mode->hsync_start - overlap) * n;
30485ca02815Sjsg 	mode->hsync_end = (mode->hsync_end - overlap) * n;
30495ca02815Sjsg 	mode->htotal = (mode->htotal - overlap) * n;
30505ca02815Sjsg 	mode->clock *= n;
30515ca02815Sjsg 
30525ca02815Sjsg 	drm_mode_set_name(mode);
30535ca02815Sjsg 
30545ca02815Sjsg 	drm_dbg_kms(&i915->drm,
30551bb76ff1Sjsg 		    "[CONNECTOR:%d:%s] using generated MSO mode: " DRM_MODE_FMT "\n",
30561bb76ff1Sjsg 		    connector->base.base.id, connector->base.name,
30571bb76ff1Sjsg 		    DRM_MODE_ARG(mode));
30581bb76ff1Sjsg }
30591bb76ff1Sjsg 
30601bb76ff1Sjsg void intel_edp_fixup_vbt_bpp(struct intel_encoder *encoder, int pipe_bpp)
30611bb76ff1Sjsg {
30621bb76ff1Sjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
30631bb76ff1Sjsg 	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
30641bb76ff1Sjsg 	struct intel_connector *connector = intel_dp->attached_connector;
30651bb76ff1Sjsg 
30661bb76ff1Sjsg 	if (connector->panel.vbt.edp.bpp && pipe_bpp > connector->panel.vbt.edp.bpp) {
30671bb76ff1Sjsg 		/*
30681bb76ff1Sjsg 		 * This is a big fat ugly hack.
30691bb76ff1Sjsg 		 *
30701bb76ff1Sjsg 		 * Some machines in UEFI boot mode provide us a VBT that has 18
30711bb76ff1Sjsg 		 * bpp and 1.62 GHz link bandwidth for eDP, which for reasons
30721bb76ff1Sjsg 		 * unknown we fail to light up. Yet the same BIOS boots up with
30731bb76ff1Sjsg 		 * 24 bpp and 2.7 GHz link. Use the same bpp as the BIOS uses as
30741bb76ff1Sjsg 		 * max, not what it tells us to use.
30751bb76ff1Sjsg 		 *
30761bb76ff1Sjsg 		 * Note: This will still be broken if the eDP panel is not lit
30771bb76ff1Sjsg 		 * up by the BIOS, and thus we can't get the mode at module
30781bb76ff1Sjsg 		 * load.
30791bb76ff1Sjsg 		 */
30801bb76ff1Sjsg 		drm_dbg_kms(&dev_priv->drm,
30811bb76ff1Sjsg 			    "pipe has %d bpp for eDP panel, overriding BIOS-provided max %d bpp\n",
30821bb76ff1Sjsg 			    pipe_bpp, connector->panel.vbt.edp.bpp);
30831bb76ff1Sjsg 		connector->panel.vbt.edp.bpp = pipe_bpp;
30841bb76ff1Sjsg 	}
30855ca02815Sjsg }
30865ca02815Sjsg 
30875ca02815Sjsg static void intel_edp_mso_init(struct intel_dp *intel_dp)
30885ca02815Sjsg {
30895ca02815Sjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
30901bb76ff1Sjsg 	struct intel_connector *connector = intel_dp->attached_connector;
30911bb76ff1Sjsg 	struct drm_display_info *info = &connector->base.display_info;
30925ca02815Sjsg 	u8 mso;
30935ca02815Sjsg 
30945ca02815Sjsg 	if (intel_dp->edp_dpcd[0] < DP_EDP_14)
30955ca02815Sjsg 		return;
30965ca02815Sjsg 
30975ca02815Sjsg 	if (drm_dp_dpcd_readb(&intel_dp->aux, DP_EDP_MSO_LINK_CAPABILITIES, &mso) != 1) {
30985ca02815Sjsg 		drm_err(&i915->drm, "Failed to read MSO cap\n");
30995ca02815Sjsg 		return;
31005ca02815Sjsg 	}
31015ca02815Sjsg 
31025ca02815Sjsg 	/* Valid configurations are SST or MSO 2x1, 2x2, 4x1 */
31035ca02815Sjsg 	mso &= DP_EDP_MSO_NUMBER_OF_LINKS_MASK;
31045ca02815Sjsg 	if (mso % 2 || mso > drm_dp_max_lane_count(intel_dp->dpcd)) {
31055ca02815Sjsg 		drm_err(&i915->drm, "Invalid MSO link count cap %u\n", mso);
31065ca02815Sjsg 		mso = 0;
31075ca02815Sjsg 	}
31085ca02815Sjsg 
31095ca02815Sjsg 	if (mso) {
31101bb76ff1Sjsg 		drm_dbg_kms(&i915->drm, "Sink MSO %ux%u configuration, pixel overlap %u\n",
31111bb76ff1Sjsg 			    mso, drm_dp_max_lane_count(intel_dp->dpcd) / mso,
31121bb76ff1Sjsg 			    info->mso_pixel_overlap);
31135ca02815Sjsg 		if (!HAS_MSO(i915)) {
31145ca02815Sjsg 			drm_err(&i915->drm, "No source MSO support, disabling\n");
31155ca02815Sjsg 			mso = 0;
31165ca02815Sjsg 		}
31175ca02815Sjsg 	}
31185ca02815Sjsg 
31195ca02815Sjsg 	intel_dp->mso_link_count = mso;
31201bb76ff1Sjsg 	intel_dp->mso_pixel_overlap = mso ? info->mso_pixel_overlap : 0;
31215ca02815Sjsg }
31225ca02815Sjsg 
3123c349dbc7Sjsg static bool
3124c349dbc7Sjsg intel_edp_init_dpcd(struct intel_dp *intel_dp)
3125c349dbc7Sjsg {
3126c349dbc7Sjsg 	struct drm_i915_private *dev_priv =
3127c349dbc7Sjsg 		to_i915(dp_to_dig_port(intel_dp)->base.base.dev);
3128c349dbc7Sjsg 
3129c349dbc7Sjsg 	/* this function is meant to be called only once */
3130c349dbc7Sjsg 	drm_WARN_ON(&dev_priv->drm, intel_dp->dpcd[DP_DPCD_REV] != 0);
3131c349dbc7Sjsg 
3132ad8b1aafSjsg 	if (drm_dp_read_dpcd_caps(&intel_dp->aux, intel_dp->dpcd) != 0)
3133c349dbc7Sjsg 		return false;
3134c349dbc7Sjsg 
3135c349dbc7Sjsg 	drm_dp_read_desc(&intel_dp->aux, &intel_dp->desc,
3136c349dbc7Sjsg 			 drm_dp_is_branch(intel_dp->dpcd));
3137c349dbc7Sjsg 
3138c349dbc7Sjsg 	/*
3139c349dbc7Sjsg 	 * Read the eDP display control registers.
3140c349dbc7Sjsg 	 *
3141c349dbc7Sjsg 	 * Do this independent of DP_DPCD_DISPLAY_CONTROL_CAPABLE bit in
3142c349dbc7Sjsg 	 * DP_EDP_CONFIGURATION_CAP, because some buggy displays do not have it
3143c349dbc7Sjsg 	 * set, but require eDP 1.4+ detection (e.g. for supported link rates
3144c349dbc7Sjsg 	 * method). The display control registers should read zero if they're
3145c349dbc7Sjsg 	 * not supported anyway.
3146c349dbc7Sjsg 	 */
3147c349dbc7Sjsg 	if (drm_dp_dpcd_read(&intel_dp->aux, DP_EDP_DPCD_REV,
3148c349dbc7Sjsg 			     intel_dp->edp_dpcd, sizeof(intel_dp->edp_dpcd)) ==
31495ca02815Sjsg 			     sizeof(intel_dp->edp_dpcd)) {
3150c349dbc7Sjsg 		drm_dbg_kms(&dev_priv->drm, "eDP DPCD: %*ph\n",
3151c349dbc7Sjsg 			    (int)sizeof(intel_dp->edp_dpcd),
3152c349dbc7Sjsg 			    intel_dp->edp_dpcd);
3153c349dbc7Sjsg 
31545ca02815Sjsg 		intel_dp->use_max_params = intel_dp->edp_dpcd[0] < DP_EDP_14;
31555ca02815Sjsg 	}
31565ca02815Sjsg 
3157c349dbc7Sjsg 	/*
3158c349dbc7Sjsg 	 * This has to be called after intel_dp->edp_dpcd is filled, PSR checks
3159c349dbc7Sjsg 	 * for SET_POWER_CAPABLE bit in intel_dp->edp_dpcd[1]
3160c349dbc7Sjsg 	 */
3161c349dbc7Sjsg 	intel_psr_init_dpcd(intel_dp);
3162c349dbc7Sjsg 
316390d1a473Sjsg 	/* Clear the default sink rates */
316490d1a473Sjsg 	intel_dp->num_sink_rates = 0;
316590d1a473Sjsg 
3166c349dbc7Sjsg 	/* Read the eDP 1.4+ supported link rates. */
3167c349dbc7Sjsg 	if (intel_dp->edp_dpcd[0] >= DP_EDP_14) {
3168c349dbc7Sjsg 		__le16 sink_rates[DP_MAX_SUPPORTED_RATES];
3169c349dbc7Sjsg 		int i;
3170c349dbc7Sjsg 
3171c349dbc7Sjsg 		drm_dp_dpcd_read(&intel_dp->aux, DP_SUPPORTED_LINK_RATES,
3172c349dbc7Sjsg 				sink_rates, sizeof(sink_rates));
3173c349dbc7Sjsg 
3174c349dbc7Sjsg 		for (i = 0; i < ARRAY_SIZE(sink_rates); i++) {
3175c349dbc7Sjsg 			int val = le16_to_cpu(sink_rates[i]);
3176c349dbc7Sjsg 
3177c349dbc7Sjsg 			if (val == 0)
3178c349dbc7Sjsg 				break;
3179c349dbc7Sjsg 
3180c349dbc7Sjsg 			/* Value read multiplied by 200kHz gives the per-lane
3181c349dbc7Sjsg 			 * link rate in kHz. The source rates are, however,
3182c349dbc7Sjsg 			 * stored in terms of LS_Clk kHz. The full conversion
3183c349dbc7Sjsg 			 * back to symbols is
3184c349dbc7Sjsg 			 * (val * 200kHz)*(8/10 ch. encoding)*(1/8 bit to Byte)
3185c349dbc7Sjsg 			 */
3186c349dbc7Sjsg 			intel_dp->sink_rates[i] = (val * 200) / 10;
3187c349dbc7Sjsg 		}
3188c349dbc7Sjsg 		intel_dp->num_sink_rates = i;
3189c349dbc7Sjsg 	}
3190c349dbc7Sjsg 
3191c349dbc7Sjsg 	/*
3192c349dbc7Sjsg 	 * Use DP_LINK_RATE_SET if DP_SUPPORTED_LINK_RATES are available,
3193c349dbc7Sjsg 	 * default to DP_MAX_LINK_RATE and DP_LINK_BW_SET otherwise.
3194c349dbc7Sjsg 	 */
3195c349dbc7Sjsg 	if (intel_dp->num_sink_rates)
3196c349dbc7Sjsg 		intel_dp->use_rate_select = true;
3197c349dbc7Sjsg 	else
3198c349dbc7Sjsg 		intel_dp_set_sink_rates(intel_dp);
31991bb76ff1Sjsg 	intel_dp_set_max_sink_lane_count(intel_dp);
3200c349dbc7Sjsg 
3201c349dbc7Sjsg 	/* Read the eDP DSC DPCD registers */
3202f005ef32Sjsg 	if (HAS_DSC(dev_priv))
3203c349dbc7Sjsg 		intel_dp_get_dsc_sink_cap(intel_dp);
3204c349dbc7Sjsg 
32055ca02815Sjsg 	/*
32065ca02815Sjsg 	 * If needed, program our source OUI so we can make various Intel-specific AUX services
32075ca02815Sjsg 	 * available (such as HDR backlight controls)
32085ca02815Sjsg 	 */
32095ca02815Sjsg 	intel_edp_init_source_oui(intel_dp, true);
32105ca02815Sjsg 
3211c349dbc7Sjsg 	return true;
3212c349dbc7Sjsg }
3213c349dbc7Sjsg 
3214ad8b1aafSjsg static bool
3215ad8b1aafSjsg intel_dp_has_sink_count(struct intel_dp *intel_dp)
3216ad8b1aafSjsg {
3217ad8b1aafSjsg 	if (!intel_dp->attached_connector)
3218ad8b1aafSjsg 		return false;
3219ad8b1aafSjsg 
3220ad8b1aafSjsg 	return drm_dp_read_sink_count_cap(&intel_dp->attached_connector->base,
3221ad8b1aafSjsg 					  intel_dp->dpcd,
3222ad8b1aafSjsg 					  &intel_dp->desc);
3223ad8b1aafSjsg }
3224c349dbc7Sjsg 
3225c349dbc7Sjsg static bool
3226c349dbc7Sjsg intel_dp_get_dpcd(struct intel_dp *intel_dp)
3227c349dbc7Sjsg {
3228ad8b1aafSjsg 	int ret;
3229ad8b1aafSjsg 
32305ca02815Sjsg 	if (intel_dp_init_lttpr_and_dprx_caps(intel_dp) < 0)
3231c349dbc7Sjsg 		return false;
3232c349dbc7Sjsg 
3233c349dbc7Sjsg 	/*
3234c349dbc7Sjsg 	 * Don't clobber cached eDP rates. Also skip re-reading
3235c349dbc7Sjsg 	 * the OUI/ID since we know it won't change.
3236c349dbc7Sjsg 	 */
3237c349dbc7Sjsg 	if (!intel_dp_is_edp(intel_dp)) {
3238c349dbc7Sjsg 		drm_dp_read_desc(&intel_dp->aux, &intel_dp->desc,
3239c349dbc7Sjsg 				 drm_dp_is_branch(intel_dp->dpcd));
3240c349dbc7Sjsg 
3241c349dbc7Sjsg 		intel_dp_set_sink_rates(intel_dp);
32421bb76ff1Sjsg 		intel_dp_set_max_sink_lane_count(intel_dp);
3243c349dbc7Sjsg 		intel_dp_set_common_rates(intel_dp);
3244c349dbc7Sjsg 	}
3245c349dbc7Sjsg 
3246ad8b1aafSjsg 	if (intel_dp_has_sink_count(intel_dp)) {
3247ad8b1aafSjsg 		ret = drm_dp_read_sink_count(&intel_dp->aux);
3248ad8b1aafSjsg 		if (ret < 0)
3249c349dbc7Sjsg 			return false;
3250c349dbc7Sjsg 
3251c349dbc7Sjsg 		/*
3252c349dbc7Sjsg 		 * Sink count can change between short pulse hpd hence
3253c349dbc7Sjsg 		 * a member variable in intel_dp will track any changes
3254c349dbc7Sjsg 		 * between short pulse interrupts.
3255c349dbc7Sjsg 		 */
3256ad8b1aafSjsg 		intel_dp->sink_count = ret;
3257c349dbc7Sjsg 
3258c349dbc7Sjsg 		/*
3259c349dbc7Sjsg 		 * SINK_COUNT == 0 and DOWNSTREAM_PORT_PRESENT == 1 implies that
3260c349dbc7Sjsg 		 * a dongle is present but no display. Unless we require to know
3261c349dbc7Sjsg 		 * if a dongle is present or not, we don't need to update
3262c349dbc7Sjsg 		 * downstream port information. So, an early return here saves
3263c349dbc7Sjsg 		 * time from performing other operations which are not required.
3264c349dbc7Sjsg 		 */
3265c349dbc7Sjsg 		if (!intel_dp->sink_count)
3266c349dbc7Sjsg 			return false;
3267c349dbc7Sjsg 	}
3268c349dbc7Sjsg 
3269ad8b1aafSjsg 	return drm_dp_read_downstream_info(&intel_dp->aux, intel_dp->dpcd,
3270ad8b1aafSjsg 					   intel_dp->downstream_ports) == 0;
3271c349dbc7Sjsg }
3272c349dbc7Sjsg 
3273c349dbc7Sjsg static bool
3274c349dbc7Sjsg intel_dp_can_mst(struct intel_dp *intel_dp)
3275c349dbc7Sjsg {
3276ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
3277ad8b1aafSjsg 
3278ad8b1aafSjsg 	return i915->params.enable_dp_mst &&
32791bb76ff1Sjsg 		intel_dp_mst_source_support(intel_dp) &&
3280ad8b1aafSjsg 		drm_dp_read_mst_cap(&intel_dp->aux, intel_dp->dpcd);
3281c349dbc7Sjsg }
3282c349dbc7Sjsg 
3283c349dbc7Sjsg static void
3284c349dbc7Sjsg intel_dp_configure_mst(struct intel_dp *intel_dp)
3285c349dbc7Sjsg {
3286ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
3287c349dbc7Sjsg 	struct intel_encoder *encoder =
3288c349dbc7Sjsg 		&dp_to_dig_port(intel_dp)->base;
3289ad8b1aafSjsg 	bool sink_can_mst = drm_dp_read_mst_cap(&intel_dp->aux, intel_dp->dpcd);
3290c349dbc7Sjsg 
3291ad8b1aafSjsg 	drm_dbg_kms(&i915->drm,
3292ad8b1aafSjsg 		    "[ENCODER:%d:%s] MST support: port: %s, sink: %s, modparam: %s\n",
3293c349dbc7Sjsg 		    encoder->base.base.id, encoder->base.name,
32941bb76ff1Sjsg 		    str_yes_no(intel_dp_mst_source_support(intel_dp)),
32951bb76ff1Sjsg 		    str_yes_no(sink_can_mst),
32961bb76ff1Sjsg 		    str_yes_no(i915->params.enable_dp_mst));
3297c349dbc7Sjsg 
32981bb76ff1Sjsg 	if (!intel_dp_mst_source_support(intel_dp))
3299c349dbc7Sjsg 		return;
3300c349dbc7Sjsg 
3301c349dbc7Sjsg 	intel_dp->is_mst = sink_can_mst &&
3302ad8b1aafSjsg 		i915->params.enable_dp_mst;
3303c349dbc7Sjsg 
3304c349dbc7Sjsg 	drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
3305c349dbc7Sjsg 					intel_dp->is_mst);
3306c349dbc7Sjsg }
3307c349dbc7Sjsg 
3308c349dbc7Sjsg static bool
33091bb76ff1Sjsg intel_dp_get_sink_irq_esi(struct intel_dp *intel_dp, u8 *esi)
3310c349dbc7Sjsg {
33111bb76ff1Sjsg 	return drm_dp_dpcd_read(&intel_dp->aux, DP_SINK_COUNT_ESI, esi, 4) == 4;
33121bb76ff1Sjsg }
33131bb76ff1Sjsg 
33141bb76ff1Sjsg static bool intel_dp_ack_sink_irq_esi(struct intel_dp *intel_dp, u8 esi[4])
33151bb76ff1Sjsg {
33161bb76ff1Sjsg 	int retry;
33171bb76ff1Sjsg 
33181bb76ff1Sjsg 	for (retry = 0; retry < 3; retry++) {
33191bb76ff1Sjsg 		if (drm_dp_dpcd_write(&intel_dp->aux, DP_SINK_COUNT_ESI + 1,
33201bb76ff1Sjsg 				      &esi[1], 3) == 3)
33211bb76ff1Sjsg 			return true;
33221bb76ff1Sjsg 	}
33231bb76ff1Sjsg 
33241bb76ff1Sjsg 	return false;
3325c349dbc7Sjsg }
3326c349dbc7Sjsg 
3327c349dbc7Sjsg bool
3328c349dbc7Sjsg intel_dp_needs_vsc_sdp(const struct intel_crtc_state *crtc_state,
3329c349dbc7Sjsg 		       const struct drm_connector_state *conn_state)
3330c349dbc7Sjsg {
3331c349dbc7Sjsg 	/*
3332c349dbc7Sjsg 	 * As per DP 1.4a spec section 2.2.4.3 [MSA Field for Indication
3333c349dbc7Sjsg 	 * of Color Encoding Format and Content Color Gamut], in order to
3334c349dbc7Sjsg 	 * sending YCBCR 420 or HDR BT.2020 signals we should use DP VSC SDP.
3335c349dbc7Sjsg 	 */
3336c349dbc7Sjsg 	if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
3337c349dbc7Sjsg 		return true;
3338c349dbc7Sjsg 
3339c349dbc7Sjsg 	switch (conn_state->colorspace) {
3340c349dbc7Sjsg 	case DRM_MODE_COLORIMETRY_SYCC_601:
3341c349dbc7Sjsg 	case DRM_MODE_COLORIMETRY_OPYCC_601:
3342c349dbc7Sjsg 	case DRM_MODE_COLORIMETRY_BT2020_YCC:
3343c349dbc7Sjsg 	case DRM_MODE_COLORIMETRY_BT2020_RGB:
3344c349dbc7Sjsg 	case DRM_MODE_COLORIMETRY_BT2020_CYCC:
3345c349dbc7Sjsg 		return true;
3346c349dbc7Sjsg 	default:
3347c349dbc7Sjsg 		break;
3348c349dbc7Sjsg 	}
3349c349dbc7Sjsg 
3350c349dbc7Sjsg 	return false;
3351c349dbc7Sjsg }
3352c349dbc7Sjsg 
3353ad8b1aafSjsg static ssize_t intel_dp_vsc_sdp_pack(const struct drm_dp_vsc_sdp *vsc,
3354ad8b1aafSjsg 				     struct dp_sdp *sdp, size_t size)
3355c349dbc7Sjsg {
3356ad8b1aafSjsg 	size_t length = sizeof(struct dp_sdp);
3357c349dbc7Sjsg 
3358ad8b1aafSjsg 	if (size < length)
3359ad8b1aafSjsg 		return -ENOSPC;
3360ad8b1aafSjsg 
3361ad8b1aafSjsg 	memset(sdp, 0, size);
3362c349dbc7Sjsg 
3363c349dbc7Sjsg 	/*
3364ad8b1aafSjsg 	 * Prepare VSC Header for SU as per DP 1.4a spec, Table 2-119
3365ad8b1aafSjsg 	 * VSC SDP Header Bytes
3366c349dbc7Sjsg 	 */
3367ad8b1aafSjsg 	sdp->sdp_header.HB0 = 0; /* Secondary-Data Packet ID = 0 */
3368ad8b1aafSjsg 	sdp->sdp_header.HB1 = vsc->sdp_type; /* Secondary-data Packet Type */
3369ad8b1aafSjsg 	sdp->sdp_header.HB2 = vsc->revision; /* Revision Number */
3370ad8b1aafSjsg 	sdp->sdp_header.HB3 = vsc->length; /* Number of Valid Data Bytes */
3371c349dbc7Sjsg 
3372c349dbc7Sjsg 	/*
3373ad8b1aafSjsg 	 * Only revision 0x5 supports Pixel Encoding/Colorimetry Format as
3374ad8b1aafSjsg 	 * per DP 1.4a spec.
3375c349dbc7Sjsg 	 */
3376ad8b1aafSjsg 	if (vsc->revision != 0x5)
3377ad8b1aafSjsg 		goto out;
3378c349dbc7Sjsg 
3379ad8b1aafSjsg 	/* VSC SDP Payload for DB16 through DB18 */
3380ad8b1aafSjsg 	/* Pixel Encoding and Colorimetry Formats  */
3381ad8b1aafSjsg 	sdp->db[16] = (vsc->pixelformat & 0xf) << 4; /* DB16[7:4] */
3382ad8b1aafSjsg 	sdp->db[16] |= vsc->colorimetry & 0xf; /* DB16[3:0] */
3383c349dbc7Sjsg 
3384ad8b1aafSjsg 	switch (vsc->bpc) {
3385ad8b1aafSjsg 	case 6:
3386ad8b1aafSjsg 		/* 6bpc: 0x0 */
3387c349dbc7Sjsg 		break;
3388ad8b1aafSjsg 	case 8:
3389ad8b1aafSjsg 		sdp->db[17] = 0x1; /* DB17[3:0] */
3390c349dbc7Sjsg 		break;
3391ad8b1aafSjsg 	case 10:
3392ad8b1aafSjsg 		sdp->db[17] = 0x2;
3393c349dbc7Sjsg 		break;
3394ad8b1aafSjsg 	case 12:
3395ad8b1aafSjsg 		sdp->db[17] = 0x3;
3396c349dbc7Sjsg 		break;
3397ad8b1aafSjsg 	case 16:
3398ad8b1aafSjsg 		sdp->db[17] = 0x4;
3399c349dbc7Sjsg 		break;
3400c349dbc7Sjsg 	default:
3401ad8b1aafSjsg 		MISSING_CASE(vsc->bpc);
3402c349dbc7Sjsg 		break;
3403c349dbc7Sjsg 	}
3404ad8b1aafSjsg 	/* Dynamic Range and Component Bit Depth */
3405ad8b1aafSjsg 	if (vsc->dynamic_range == DP_DYNAMIC_RANGE_CTA)
3406ad8b1aafSjsg 		sdp->db[17] |= 0x80;  /* DB17[7] */
3407c349dbc7Sjsg 
3408ad8b1aafSjsg 	/* Content Type */
3409ad8b1aafSjsg 	sdp->db[18] = vsc->content_type & 0x7;
3410ad8b1aafSjsg 
3411ad8b1aafSjsg out:
3412ad8b1aafSjsg 	return length;
3413c349dbc7Sjsg }
3414c349dbc7Sjsg 
3415ad8b1aafSjsg static ssize_t
34161bb76ff1Sjsg intel_dp_hdr_metadata_infoframe_sdp_pack(struct drm_i915_private *i915,
34171bb76ff1Sjsg 					 const struct hdmi_drm_infoframe *drm_infoframe,
3418ad8b1aafSjsg 					 struct dp_sdp *sdp,
3419ad8b1aafSjsg 					 size_t size)
3420c349dbc7Sjsg {
3421ad8b1aafSjsg 	size_t length = sizeof(struct dp_sdp);
3422c349dbc7Sjsg 	const int infoframe_size = HDMI_INFOFRAME_HEADER_SIZE + HDMI_DRM_INFOFRAME_SIZE;
3423c349dbc7Sjsg 	unsigned char buf[HDMI_INFOFRAME_HEADER_SIZE + HDMI_DRM_INFOFRAME_SIZE];
3424c349dbc7Sjsg 	ssize_t len;
3425c349dbc7Sjsg 
3426ad8b1aafSjsg 	if (size < length)
3427ad8b1aafSjsg 		return -ENOSPC;
3428c349dbc7Sjsg 
3429ad8b1aafSjsg 	memset(sdp, 0, size);
3430ad8b1aafSjsg 
3431ad8b1aafSjsg 	len = hdmi_drm_infoframe_pack_only(drm_infoframe, buf, sizeof(buf));
3432c349dbc7Sjsg 	if (len < 0) {
34331bb76ff1Sjsg 		drm_dbg_kms(&i915->drm, "buffer size is smaller than hdr metadata infoframe\n");
3434ad8b1aafSjsg 		return -ENOSPC;
3435c349dbc7Sjsg 	}
3436c349dbc7Sjsg 
3437c349dbc7Sjsg 	if (len != infoframe_size) {
34381bb76ff1Sjsg 		drm_dbg_kms(&i915->drm, "wrong static hdr metadata size\n");
3439ad8b1aafSjsg 		return -ENOSPC;
3440c349dbc7Sjsg 	}
3441c349dbc7Sjsg 
3442c349dbc7Sjsg 	/*
3443c349dbc7Sjsg 	 * Set up the infoframe sdp packet for HDR static metadata.
3444c349dbc7Sjsg 	 * Prepare VSC Header for SU as per DP 1.4a spec,
3445c349dbc7Sjsg 	 * Table 2-100 and Table 2-101
3446c349dbc7Sjsg 	 */
3447c349dbc7Sjsg 
3448ad8b1aafSjsg 	/* Secondary-Data Packet ID, 00h for non-Audio INFOFRAME */
3449ad8b1aafSjsg 	sdp->sdp_header.HB0 = 0;
3450c349dbc7Sjsg 	/*
3451c349dbc7Sjsg 	 * Packet Type 80h + Non-audio INFOFRAME Type value
3452ad8b1aafSjsg 	 * HDMI_INFOFRAME_TYPE_DRM: 0x87
3453ad8b1aafSjsg 	 * - 80h + Non-audio INFOFRAME Type value
3454ad8b1aafSjsg 	 * - InfoFrame Type: 0x07
3455ad8b1aafSjsg 	 *    [CTA-861-G Table-42 Dynamic Range and Mastering InfoFrame]
3456c349dbc7Sjsg 	 */
3457ad8b1aafSjsg 	sdp->sdp_header.HB1 = drm_infoframe->type;
3458c349dbc7Sjsg 	/*
3459c349dbc7Sjsg 	 * Least Significant Eight Bits of (Data Byte Count – 1)
3460ad8b1aafSjsg 	 * infoframe_size - 1
3461c349dbc7Sjsg 	 */
3462ad8b1aafSjsg 	sdp->sdp_header.HB2 = 0x1D;
3463c349dbc7Sjsg 	/* INFOFRAME SDP Version Number */
3464ad8b1aafSjsg 	sdp->sdp_header.HB3 = (0x13 << 2);
3465c349dbc7Sjsg 	/* CTA Header Byte 2 (INFOFRAME Version Number) */
3466ad8b1aafSjsg 	sdp->db[0] = drm_infoframe->version;
3467c349dbc7Sjsg 	/* CTA Header Byte 3 (Length of INFOFRAME): HDMI_DRM_INFOFRAME_SIZE */
3468ad8b1aafSjsg 	sdp->db[1] = drm_infoframe->length;
3469c349dbc7Sjsg 	/*
3470c349dbc7Sjsg 	 * Copy HDMI_DRM_INFOFRAME_SIZE size from a buffer after
3471c349dbc7Sjsg 	 * HDMI_INFOFRAME_HEADER_SIZE
3472c349dbc7Sjsg 	 */
3473ad8b1aafSjsg 	BUILD_BUG_ON(sizeof(sdp->db) < HDMI_DRM_INFOFRAME_SIZE + 2);
3474ad8b1aafSjsg 	memcpy(&sdp->db[2], &buf[HDMI_INFOFRAME_HEADER_SIZE],
3475c349dbc7Sjsg 	       HDMI_DRM_INFOFRAME_SIZE);
3476c349dbc7Sjsg 
3477c349dbc7Sjsg 	/*
3478ad8b1aafSjsg 	 * Size of DP infoframe sdp packet for HDR static metadata consists of
3479c349dbc7Sjsg 	 * - DP SDP Header(struct dp_sdp_header): 4 bytes
3480c349dbc7Sjsg 	 * - Two Data Blocks: 2 bytes
3481c349dbc7Sjsg 	 *    CTA Header Byte2 (INFOFRAME Version Number)
3482c349dbc7Sjsg 	 *    CTA Header Byte3 (Length of INFOFRAME)
3483c349dbc7Sjsg 	 * - HDMI_DRM_INFOFRAME_SIZE: 26 bytes
3484c349dbc7Sjsg 	 *
3485c349dbc7Sjsg 	 * Prior to GEN11's GMP register size is identical to DP HDR static metadata
3486c349dbc7Sjsg 	 * infoframe size. But GEN11+ has larger than that size, write_infoframe
3487c349dbc7Sjsg 	 * will pad rest of the size.
3488c349dbc7Sjsg 	 */
3489ad8b1aafSjsg 	return sizeof(struct dp_sdp_header) + 2 + HDMI_DRM_INFOFRAME_SIZE;
3490c349dbc7Sjsg }
3491c349dbc7Sjsg 
3492ad8b1aafSjsg static void intel_write_dp_sdp(struct intel_encoder *encoder,
3493ad8b1aafSjsg 			       const struct intel_crtc_state *crtc_state,
3494ad8b1aafSjsg 			       unsigned int type)
3495ad8b1aafSjsg {
3496ad8b1aafSjsg 	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
3497ad8b1aafSjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
3498ad8b1aafSjsg 	struct dp_sdp sdp = {};
3499ad8b1aafSjsg 	ssize_t len;
3500ad8b1aafSjsg 
3501ad8b1aafSjsg 	if ((crtc_state->infoframes.enable &
3502ad8b1aafSjsg 	     intel_hdmi_infoframe_enable(type)) == 0)
3503ad8b1aafSjsg 		return;
3504ad8b1aafSjsg 
3505ad8b1aafSjsg 	switch (type) {
3506ad8b1aafSjsg 	case DP_SDP_VSC:
3507ad8b1aafSjsg 		len = intel_dp_vsc_sdp_pack(&crtc_state->infoframes.vsc, &sdp,
3508ad8b1aafSjsg 					    sizeof(sdp));
3509ad8b1aafSjsg 		break;
3510ad8b1aafSjsg 	case HDMI_PACKET_TYPE_GAMUT_METADATA:
35111bb76ff1Sjsg 		len = intel_dp_hdr_metadata_infoframe_sdp_pack(dev_priv,
35121bb76ff1Sjsg 							       &crtc_state->infoframes.drm.drm,
3513ad8b1aafSjsg 							       &sdp, sizeof(sdp));
3514ad8b1aafSjsg 		break;
3515ad8b1aafSjsg 	default:
3516ad8b1aafSjsg 		MISSING_CASE(type);
3517ad8b1aafSjsg 		return;
3518ad8b1aafSjsg 	}
3519ad8b1aafSjsg 
3520ad8b1aafSjsg 	if (drm_WARN_ON(&dev_priv->drm, len < 0))
3521ad8b1aafSjsg 		return;
3522ad8b1aafSjsg 
3523ad8b1aafSjsg 	dig_port->write_infoframe(encoder, crtc_state, type, &sdp, len);
3524ad8b1aafSjsg }
3525ad8b1aafSjsg 
3526ad8b1aafSjsg void intel_write_dp_vsc_sdp(struct intel_encoder *encoder,
3527ad8b1aafSjsg 			    const struct intel_crtc_state *crtc_state,
35281bb76ff1Sjsg 			    const struct drm_dp_vsc_sdp *vsc)
3529ad8b1aafSjsg {
3530ad8b1aafSjsg 	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
3531ad8b1aafSjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
3532ad8b1aafSjsg 	struct dp_sdp sdp = {};
3533ad8b1aafSjsg 	ssize_t len;
3534ad8b1aafSjsg 
3535ad8b1aafSjsg 	len = intel_dp_vsc_sdp_pack(vsc, &sdp, sizeof(sdp));
3536ad8b1aafSjsg 
3537ad8b1aafSjsg 	if (drm_WARN_ON(&dev_priv->drm, len < 0))
3538ad8b1aafSjsg 		return;
3539ad8b1aafSjsg 
3540ad8b1aafSjsg 	dig_port->write_infoframe(encoder, crtc_state, DP_SDP_VSC,
3541ad8b1aafSjsg 					&sdp, len);
3542ad8b1aafSjsg }
3543ad8b1aafSjsg 
3544ad8b1aafSjsg void intel_dp_set_infoframes(struct intel_encoder *encoder,
3545ad8b1aafSjsg 			     bool enable,
3546c349dbc7Sjsg 			     const struct intel_crtc_state *crtc_state,
3547c349dbc7Sjsg 			     const struct drm_connector_state *conn_state)
3548c349dbc7Sjsg {
3549ad8b1aafSjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
3550ad8b1aafSjsg 	i915_reg_t reg = HSW_TVIDEO_DIP_CTL(crtc_state->cpu_transcoder);
3551ad8b1aafSjsg 	u32 dip_enable = VIDEO_DIP_ENABLE_AVI_HSW | VIDEO_DIP_ENABLE_GCP_HSW |
3552ad8b1aafSjsg 			 VIDEO_DIP_ENABLE_VS_HSW | VIDEO_DIP_ENABLE_GMP_HSW |
3553ad8b1aafSjsg 			 VIDEO_DIP_ENABLE_SPD_HSW | VIDEO_DIP_ENABLE_DRM_GLK;
35545ca02815Sjsg 	u32 val = intel_de_read(dev_priv, reg) & ~dip_enable;
3555c349dbc7Sjsg 
3556ad8b1aafSjsg 	/* TODO: Add DSC case (DIP_ENABLE_PPS) */
3557ad8b1aafSjsg 	/* When PSR is enabled, this routine doesn't disable VSC DIP */
35585ca02815Sjsg 	if (!crtc_state->has_psr)
35595ca02815Sjsg 		val &= ~VIDEO_DIP_ENABLE_VSC_HSW;
3560ad8b1aafSjsg 
3561ad8b1aafSjsg 	intel_de_write(dev_priv, reg, val);
3562ad8b1aafSjsg 	intel_de_posting_read(dev_priv, reg);
35635ca02815Sjsg 
35645ca02815Sjsg 	if (!enable)
3565ad8b1aafSjsg 		return;
3566ad8b1aafSjsg 
3567ad8b1aafSjsg 	/* When PSR is enabled, VSC SDP is handled by PSR routine */
35685ca02815Sjsg 	if (!crtc_state->has_psr)
3569ad8b1aafSjsg 		intel_write_dp_sdp(encoder, crtc_state, DP_SDP_VSC);
3570ad8b1aafSjsg 
3571ad8b1aafSjsg 	intel_write_dp_sdp(encoder, crtc_state, HDMI_PACKET_TYPE_GAMUT_METADATA);
3572ad8b1aafSjsg }
3573ad8b1aafSjsg 
3574ad8b1aafSjsg static int intel_dp_vsc_sdp_unpack(struct drm_dp_vsc_sdp *vsc,
3575ad8b1aafSjsg 				   const void *buffer, size_t size)
3576c349dbc7Sjsg {
3577ad8b1aafSjsg 	const struct dp_sdp *sdp = buffer;
3578ad8b1aafSjsg 
3579ad8b1aafSjsg 	if (size < sizeof(struct dp_sdp))
3580ad8b1aafSjsg 		return -EINVAL;
3581ad8b1aafSjsg 
35820abc5c1fSjsg 	memset(vsc, 0, sizeof(*vsc));
3583ad8b1aafSjsg 
3584ad8b1aafSjsg 	if (sdp->sdp_header.HB0 != 0)
3585ad8b1aafSjsg 		return -EINVAL;
3586ad8b1aafSjsg 
3587ad8b1aafSjsg 	if (sdp->sdp_header.HB1 != DP_SDP_VSC)
3588ad8b1aafSjsg 		return -EINVAL;
3589ad8b1aafSjsg 
3590ad8b1aafSjsg 	vsc->sdp_type = sdp->sdp_header.HB1;
3591ad8b1aafSjsg 	vsc->revision = sdp->sdp_header.HB2;
3592ad8b1aafSjsg 	vsc->length = sdp->sdp_header.HB3;
3593ad8b1aafSjsg 
3594ad8b1aafSjsg 	if ((sdp->sdp_header.HB2 == 0x2 && sdp->sdp_header.HB3 == 0x8) ||
3595ad8b1aafSjsg 	    (sdp->sdp_header.HB2 == 0x4 && sdp->sdp_header.HB3 == 0xe)) {
3596ad8b1aafSjsg 		/*
3597ad8b1aafSjsg 		 * - HB2 = 0x2, HB3 = 0x8
3598ad8b1aafSjsg 		 *   VSC SDP supporting 3D stereo + PSR
3599ad8b1aafSjsg 		 * - HB2 = 0x4, HB3 = 0xe
3600ad8b1aafSjsg 		 *   VSC SDP supporting 3D stereo + PSR2 with Y-coordinate of
3601ad8b1aafSjsg 		 *   first scan line of the SU region (applies to eDP v1.4b
3602ad8b1aafSjsg 		 *   and higher).
3603ad8b1aafSjsg 		 */
3604ad8b1aafSjsg 		return 0;
3605ad8b1aafSjsg 	} else if (sdp->sdp_header.HB2 == 0x5 && sdp->sdp_header.HB3 == 0x13) {
3606ad8b1aafSjsg 		/*
3607ad8b1aafSjsg 		 * - HB2 = 0x5, HB3 = 0x13
3608ad8b1aafSjsg 		 *   VSC SDP supporting 3D stereo + PSR2 + Pixel Encoding/Colorimetry
3609ad8b1aafSjsg 		 *   Format.
3610ad8b1aafSjsg 		 */
3611ad8b1aafSjsg 		vsc->pixelformat = (sdp->db[16] >> 4) & 0xf;
3612ad8b1aafSjsg 		vsc->colorimetry = sdp->db[16] & 0xf;
3613ad8b1aafSjsg 		vsc->dynamic_range = (sdp->db[17] >> 7) & 0x1;
3614ad8b1aafSjsg 
3615ad8b1aafSjsg 		switch (sdp->db[17] & 0x7) {
3616ad8b1aafSjsg 		case 0x0:
3617ad8b1aafSjsg 			vsc->bpc = 6;
3618ad8b1aafSjsg 			break;
3619ad8b1aafSjsg 		case 0x1:
3620ad8b1aafSjsg 			vsc->bpc = 8;
3621ad8b1aafSjsg 			break;
3622ad8b1aafSjsg 		case 0x2:
3623ad8b1aafSjsg 			vsc->bpc = 10;
3624ad8b1aafSjsg 			break;
3625ad8b1aafSjsg 		case 0x3:
3626ad8b1aafSjsg 			vsc->bpc = 12;
3627ad8b1aafSjsg 			break;
3628ad8b1aafSjsg 		case 0x4:
3629ad8b1aafSjsg 			vsc->bpc = 16;
3630ad8b1aafSjsg 			break;
3631ad8b1aafSjsg 		default:
3632ad8b1aafSjsg 			MISSING_CASE(sdp->db[17] & 0x7);
3633ad8b1aafSjsg 			return -EINVAL;
3634ad8b1aafSjsg 		}
3635ad8b1aafSjsg 
3636ad8b1aafSjsg 		vsc->content_type = sdp->db[18] & 0x7;
3637ad8b1aafSjsg 	} else {
3638ad8b1aafSjsg 		return -EINVAL;
3639ad8b1aafSjsg 	}
3640ad8b1aafSjsg 
3641ad8b1aafSjsg 	return 0;
3642ad8b1aafSjsg }
3643ad8b1aafSjsg 
3644ad8b1aafSjsg static int
3645ad8b1aafSjsg intel_dp_hdr_metadata_infoframe_sdp_unpack(struct hdmi_drm_infoframe *drm_infoframe,
3646ad8b1aafSjsg 					   const void *buffer, size_t size)
3647ad8b1aafSjsg {
3648ad8b1aafSjsg 	int ret;
3649ad8b1aafSjsg 
3650ad8b1aafSjsg 	const struct dp_sdp *sdp = buffer;
3651ad8b1aafSjsg 
3652ad8b1aafSjsg 	if (size < sizeof(struct dp_sdp))
3653ad8b1aafSjsg 		return -EINVAL;
3654ad8b1aafSjsg 
3655ad8b1aafSjsg 	if (sdp->sdp_header.HB0 != 0)
3656ad8b1aafSjsg 		return -EINVAL;
3657ad8b1aafSjsg 
3658ad8b1aafSjsg 	if (sdp->sdp_header.HB1 != HDMI_INFOFRAME_TYPE_DRM)
3659ad8b1aafSjsg 		return -EINVAL;
3660ad8b1aafSjsg 
3661ad8b1aafSjsg 	/*
3662ad8b1aafSjsg 	 * Least Significant Eight Bits of (Data Byte Count – 1)
3663ad8b1aafSjsg 	 * 1Dh (i.e., Data Byte Count = 30 bytes).
3664ad8b1aafSjsg 	 */
3665ad8b1aafSjsg 	if (sdp->sdp_header.HB2 != 0x1D)
3666ad8b1aafSjsg 		return -EINVAL;
3667ad8b1aafSjsg 
3668ad8b1aafSjsg 	/* Most Significant Two Bits of (Data Byte Count – 1), Clear to 00b. */
3669ad8b1aafSjsg 	if ((sdp->sdp_header.HB3 & 0x3) != 0)
3670ad8b1aafSjsg 		return -EINVAL;
3671ad8b1aafSjsg 
3672ad8b1aafSjsg 	/* INFOFRAME SDP Version Number */
3673ad8b1aafSjsg 	if (((sdp->sdp_header.HB3 >> 2) & 0x3f) != 0x13)
3674ad8b1aafSjsg 		return -EINVAL;
3675ad8b1aafSjsg 
3676ad8b1aafSjsg 	/* CTA Header Byte 2 (INFOFRAME Version Number) */
3677ad8b1aafSjsg 	if (sdp->db[0] != 1)
3678ad8b1aafSjsg 		return -EINVAL;
3679ad8b1aafSjsg 
3680ad8b1aafSjsg 	/* CTA Header Byte 3 (Length of INFOFRAME): HDMI_DRM_INFOFRAME_SIZE */
3681ad8b1aafSjsg 	if (sdp->db[1] != HDMI_DRM_INFOFRAME_SIZE)
3682ad8b1aafSjsg 		return -EINVAL;
3683ad8b1aafSjsg 
3684ad8b1aafSjsg 	ret = hdmi_drm_infoframe_unpack_only(drm_infoframe, &sdp->db[2],
3685ad8b1aafSjsg 					     HDMI_DRM_INFOFRAME_SIZE);
3686ad8b1aafSjsg 
3687ad8b1aafSjsg 	return ret;
3688ad8b1aafSjsg }
3689ad8b1aafSjsg 
3690ad8b1aafSjsg static void intel_read_dp_vsc_sdp(struct intel_encoder *encoder,
3691ad8b1aafSjsg 				  struct intel_crtc_state *crtc_state,
3692ad8b1aafSjsg 				  struct drm_dp_vsc_sdp *vsc)
3693ad8b1aafSjsg {
3694ad8b1aafSjsg 	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
3695ad8b1aafSjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
3696ad8b1aafSjsg 	unsigned int type = DP_SDP_VSC;
3697ad8b1aafSjsg 	struct dp_sdp sdp = {};
3698ad8b1aafSjsg 	int ret;
3699ad8b1aafSjsg 
3700ad8b1aafSjsg 	/* When PSR is enabled, VSC SDP is handled by PSR routine */
37015ca02815Sjsg 	if (crtc_state->has_psr)
3702c349dbc7Sjsg 		return;
3703c349dbc7Sjsg 
3704ad8b1aafSjsg 	if ((crtc_state->infoframes.enable &
3705ad8b1aafSjsg 	     intel_hdmi_infoframe_enable(type)) == 0)
3706ad8b1aafSjsg 		return;
3707ad8b1aafSjsg 
3708ad8b1aafSjsg 	dig_port->read_infoframe(encoder, crtc_state, type, &sdp, sizeof(sdp));
3709ad8b1aafSjsg 
3710ad8b1aafSjsg 	ret = intel_dp_vsc_sdp_unpack(vsc, &sdp, sizeof(sdp));
3711ad8b1aafSjsg 
3712ad8b1aafSjsg 	if (ret)
3713ad8b1aafSjsg 		drm_dbg_kms(&dev_priv->drm, "Failed to unpack DP VSC SDP\n");
3714ad8b1aafSjsg }
3715ad8b1aafSjsg 
3716ad8b1aafSjsg static void intel_read_dp_hdr_metadata_infoframe_sdp(struct intel_encoder *encoder,
3717ad8b1aafSjsg 						     struct intel_crtc_state *crtc_state,
3718ad8b1aafSjsg 						     struct hdmi_drm_infoframe *drm_infoframe)
3719ad8b1aafSjsg {
3720ad8b1aafSjsg 	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
3721ad8b1aafSjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
3722ad8b1aafSjsg 	unsigned int type = HDMI_PACKET_TYPE_GAMUT_METADATA;
3723ad8b1aafSjsg 	struct dp_sdp sdp = {};
3724ad8b1aafSjsg 	int ret;
3725ad8b1aafSjsg 
3726ad8b1aafSjsg 	if ((crtc_state->infoframes.enable &
3727ad8b1aafSjsg 	    intel_hdmi_infoframe_enable(type)) == 0)
3728ad8b1aafSjsg 		return;
3729ad8b1aafSjsg 
3730ad8b1aafSjsg 	dig_port->read_infoframe(encoder, crtc_state, type, &sdp,
3731ad8b1aafSjsg 				 sizeof(sdp));
3732ad8b1aafSjsg 
3733ad8b1aafSjsg 	ret = intel_dp_hdr_metadata_infoframe_sdp_unpack(drm_infoframe, &sdp,
3734ad8b1aafSjsg 							 sizeof(sdp));
3735ad8b1aafSjsg 
3736ad8b1aafSjsg 	if (ret)
3737ad8b1aafSjsg 		drm_dbg_kms(&dev_priv->drm,
3738ad8b1aafSjsg 			    "Failed to unpack DP HDR Metadata Infoframe SDP\n");
3739ad8b1aafSjsg }
3740ad8b1aafSjsg 
3741ad8b1aafSjsg void intel_read_dp_sdp(struct intel_encoder *encoder,
3742ad8b1aafSjsg 		       struct intel_crtc_state *crtc_state,
3743ad8b1aafSjsg 		       unsigned int type)
3744ad8b1aafSjsg {
3745ad8b1aafSjsg 	switch (type) {
3746ad8b1aafSjsg 	case DP_SDP_VSC:
3747ad8b1aafSjsg 		intel_read_dp_vsc_sdp(encoder, crtc_state,
3748ad8b1aafSjsg 				      &crtc_state->infoframes.vsc);
3749ad8b1aafSjsg 		break;
3750ad8b1aafSjsg 	case HDMI_PACKET_TYPE_GAMUT_METADATA:
3751ad8b1aafSjsg 		intel_read_dp_hdr_metadata_infoframe_sdp(encoder, crtc_state,
3752ad8b1aafSjsg 							 &crtc_state->infoframes.drm.drm);
3753ad8b1aafSjsg 		break;
3754ad8b1aafSjsg 	default:
3755ad8b1aafSjsg 		MISSING_CASE(type);
3756ad8b1aafSjsg 		break;
3757ad8b1aafSjsg 	}
3758c349dbc7Sjsg }
3759c349dbc7Sjsg 
3760c349dbc7Sjsg static u8 intel_dp_autotest_link_training(struct intel_dp *intel_dp)
3761c349dbc7Sjsg {
3762ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
3763c349dbc7Sjsg 	int status = 0;
3764c349dbc7Sjsg 	int test_link_rate;
3765c349dbc7Sjsg 	u8 test_lane_count, test_link_bw;
3766c349dbc7Sjsg 	/* (DP CTS 1.2)
3767c349dbc7Sjsg 	 * 4.3.1.11
3768c349dbc7Sjsg 	 */
3769c349dbc7Sjsg 	/* Read the TEST_LANE_COUNT and TEST_LINK_RTAE fields (DP CTS 3.1.4) */
3770c349dbc7Sjsg 	status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_LANE_COUNT,
3771c349dbc7Sjsg 				   &test_lane_count);
3772c349dbc7Sjsg 
3773c349dbc7Sjsg 	if (status <= 0) {
3774ad8b1aafSjsg 		drm_dbg_kms(&i915->drm, "Lane count read failed\n");
3775c349dbc7Sjsg 		return DP_TEST_NAK;
3776c349dbc7Sjsg 	}
3777c349dbc7Sjsg 	test_lane_count &= DP_MAX_LANE_COUNT_MASK;
3778c349dbc7Sjsg 
3779c349dbc7Sjsg 	status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_LINK_RATE,
3780c349dbc7Sjsg 				   &test_link_bw);
3781c349dbc7Sjsg 	if (status <= 0) {
3782ad8b1aafSjsg 		drm_dbg_kms(&i915->drm, "Link Rate read failed\n");
3783c349dbc7Sjsg 		return DP_TEST_NAK;
3784c349dbc7Sjsg 	}
3785c349dbc7Sjsg 	test_link_rate = drm_dp_bw_code_to_link_rate(test_link_bw);
3786c349dbc7Sjsg 
3787c349dbc7Sjsg 	/* Validate the requested link rate and lane count */
3788c349dbc7Sjsg 	if (!intel_dp_link_params_valid(intel_dp, test_link_rate,
3789c349dbc7Sjsg 					test_lane_count))
3790c349dbc7Sjsg 		return DP_TEST_NAK;
3791c349dbc7Sjsg 
3792c349dbc7Sjsg 	intel_dp->compliance.test_lane_count = test_lane_count;
3793c349dbc7Sjsg 	intel_dp->compliance.test_link_rate = test_link_rate;
3794c349dbc7Sjsg 
3795c349dbc7Sjsg 	return DP_TEST_ACK;
3796c349dbc7Sjsg }
3797c349dbc7Sjsg 
3798c349dbc7Sjsg static u8 intel_dp_autotest_video_pattern(struct intel_dp *intel_dp)
3799c349dbc7Sjsg {
3800ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
3801c349dbc7Sjsg 	u8 test_pattern;
3802c349dbc7Sjsg 	u8 test_misc;
3803c349dbc7Sjsg 	__be16 h_width, v_height;
3804c349dbc7Sjsg 	int status = 0;
3805c349dbc7Sjsg 
3806c349dbc7Sjsg 	/* Read the TEST_PATTERN (DP CTS 3.1.5) */
3807c349dbc7Sjsg 	status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_PATTERN,
3808c349dbc7Sjsg 				   &test_pattern);
3809c349dbc7Sjsg 	if (status <= 0) {
3810ad8b1aafSjsg 		drm_dbg_kms(&i915->drm, "Test pattern read failed\n");
3811c349dbc7Sjsg 		return DP_TEST_NAK;
3812c349dbc7Sjsg 	}
3813c349dbc7Sjsg 	if (test_pattern != DP_COLOR_RAMP)
3814c349dbc7Sjsg 		return DP_TEST_NAK;
3815c349dbc7Sjsg 
3816c349dbc7Sjsg 	status = drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_H_WIDTH_HI,
3817c349dbc7Sjsg 				  &h_width, 2);
3818c349dbc7Sjsg 	if (status <= 0) {
3819ad8b1aafSjsg 		drm_dbg_kms(&i915->drm, "H Width read failed\n");
3820c349dbc7Sjsg 		return DP_TEST_NAK;
3821c349dbc7Sjsg 	}
3822c349dbc7Sjsg 
3823c349dbc7Sjsg 	status = drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_V_HEIGHT_HI,
3824c349dbc7Sjsg 				  &v_height, 2);
3825c349dbc7Sjsg 	if (status <= 0) {
3826ad8b1aafSjsg 		drm_dbg_kms(&i915->drm, "V Height read failed\n");
3827c349dbc7Sjsg 		return DP_TEST_NAK;
3828c349dbc7Sjsg 	}
3829c349dbc7Sjsg 
3830c349dbc7Sjsg 	status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_MISC0,
3831c349dbc7Sjsg 				   &test_misc);
3832c349dbc7Sjsg 	if (status <= 0) {
3833ad8b1aafSjsg 		drm_dbg_kms(&i915->drm, "TEST MISC read failed\n");
3834c349dbc7Sjsg 		return DP_TEST_NAK;
3835c349dbc7Sjsg 	}
3836c349dbc7Sjsg 	if ((test_misc & DP_TEST_COLOR_FORMAT_MASK) != DP_COLOR_FORMAT_RGB)
3837c349dbc7Sjsg 		return DP_TEST_NAK;
3838c349dbc7Sjsg 	if (test_misc & DP_TEST_DYNAMIC_RANGE_CEA)
3839c349dbc7Sjsg 		return DP_TEST_NAK;
3840c349dbc7Sjsg 	switch (test_misc & DP_TEST_BIT_DEPTH_MASK) {
3841c349dbc7Sjsg 	case DP_TEST_BIT_DEPTH_6:
3842c349dbc7Sjsg 		intel_dp->compliance.test_data.bpc = 6;
3843c349dbc7Sjsg 		break;
3844c349dbc7Sjsg 	case DP_TEST_BIT_DEPTH_8:
3845c349dbc7Sjsg 		intel_dp->compliance.test_data.bpc = 8;
3846c349dbc7Sjsg 		break;
3847c349dbc7Sjsg 	default:
3848c349dbc7Sjsg 		return DP_TEST_NAK;
3849c349dbc7Sjsg 	}
3850c349dbc7Sjsg 
3851c349dbc7Sjsg 	intel_dp->compliance.test_data.video_pattern = test_pattern;
3852c349dbc7Sjsg 	intel_dp->compliance.test_data.hdisplay = be16_to_cpu(h_width);
3853c349dbc7Sjsg 	intel_dp->compliance.test_data.vdisplay = be16_to_cpu(v_height);
3854c349dbc7Sjsg 	/* Set test active flag here so userspace doesn't interrupt things */
3855c349dbc7Sjsg 	intel_dp->compliance.test_active = true;
3856c349dbc7Sjsg 
3857c349dbc7Sjsg 	return DP_TEST_ACK;
3858c349dbc7Sjsg }
3859c349dbc7Sjsg 
3860c349dbc7Sjsg static u8 intel_dp_autotest_edid(struct intel_dp *intel_dp)
3861c349dbc7Sjsg {
3862ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
3863c349dbc7Sjsg 	u8 test_result = DP_TEST_ACK;
3864c349dbc7Sjsg 	struct intel_connector *intel_connector = intel_dp->attached_connector;
3865c349dbc7Sjsg 	struct drm_connector *connector = &intel_connector->base;
3866c349dbc7Sjsg 
3867c349dbc7Sjsg 	if (intel_connector->detect_edid == NULL ||
3868c349dbc7Sjsg 	    connector->edid_corrupt ||
3869c349dbc7Sjsg 	    intel_dp->aux.i2c_defer_count > 6) {
3870c349dbc7Sjsg 		/* Check EDID read for NACKs, DEFERs and corruption
3871c349dbc7Sjsg 		 * (DP CTS 1.2 Core r1.1)
3872c349dbc7Sjsg 		 *    4.2.2.4 : Failed EDID read, I2C_NAK
3873c349dbc7Sjsg 		 *    4.2.2.5 : Failed EDID read, I2C_DEFER
3874c349dbc7Sjsg 		 *    4.2.2.6 : EDID corruption detected
3875c349dbc7Sjsg 		 * Use failsafe mode for all cases
3876c349dbc7Sjsg 		 */
3877c349dbc7Sjsg 		if (intel_dp->aux.i2c_nack_count > 0 ||
3878c349dbc7Sjsg 			intel_dp->aux.i2c_defer_count > 0)
3879ad8b1aafSjsg 			drm_dbg_kms(&i915->drm,
3880ad8b1aafSjsg 				    "EDID read had %d NACKs, %d DEFERs\n",
3881c349dbc7Sjsg 				    intel_dp->aux.i2c_nack_count,
3882c349dbc7Sjsg 				    intel_dp->aux.i2c_defer_count);
3883c349dbc7Sjsg 		intel_dp->compliance.test_data.edid = INTEL_DP_RESOLUTION_FAILSAFE;
3884c349dbc7Sjsg 	} else {
3885f005ef32Sjsg 		/* FIXME: Get rid of drm_edid_raw() */
3886f005ef32Sjsg 		const struct edid *block = drm_edid_raw(intel_connector->detect_edid);
3887c349dbc7Sjsg 
3888f005ef32Sjsg 		/* We have to write the checksum of the last block read */
3889f005ef32Sjsg 		block += block->extensions;
3890c349dbc7Sjsg 
3891c349dbc7Sjsg 		if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_EDID_CHECKSUM,
3892c349dbc7Sjsg 				       block->checksum) <= 0)
3893ad8b1aafSjsg 			drm_dbg_kms(&i915->drm,
3894ad8b1aafSjsg 				    "Failed to write EDID checksum\n");
3895c349dbc7Sjsg 
3896c349dbc7Sjsg 		test_result = DP_TEST_ACK | DP_TEST_EDID_CHECKSUM_WRITE;
3897c349dbc7Sjsg 		intel_dp->compliance.test_data.edid = INTEL_DP_RESOLUTION_PREFERRED;
3898c349dbc7Sjsg 	}
3899c349dbc7Sjsg 
3900c349dbc7Sjsg 	/* Set test active flag here so userspace doesn't interrupt things */
3901c349dbc7Sjsg 	intel_dp->compliance.test_active = true;
3902c349dbc7Sjsg 
3903c349dbc7Sjsg 	return test_result;
3904c349dbc7Sjsg }
3905c349dbc7Sjsg 
39065ca02815Sjsg static void intel_dp_phy_pattern_update(struct intel_dp *intel_dp,
39075ca02815Sjsg 					const struct intel_crtc_state *crtc_state)
3908ad8b1aafSjsg {
3909ad8b1aafSjsg 	struct drm_i915_private *dev_priv =
3910ad8b1aafSjsg 			to_i915(dp_to_dig_port(intel_dp)->base.base.dev);
3911ad8b1aafSjsg 	struct drm_dp_phy_test_params *data =
3912ad8b1aafSjsg 			&intel_dp->compliance.test_data.phytest;
39135ca02815Sjsg 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
3914ad8b1aafSjsg 	enum pipe pipe = crtc->pipe;
3915ad8b1aafSjsg 	u32 pattern_val;
3916ad8b1aafSjsg 
3917ad8b1aafSjsg 	switch (data->phy_pattern) {
3918ad8b1aafSjsg 	case DP_PHY_TEST_PATTERN_NONE:
39191bb76ff1Sjsg 		drm_dbg_kms(&dev_priv->drm, "Disable Phy Test Pattern\n");
3920ad8b1aafSjsg 		intel_de_write(dev_priv, DDI_DP_COMP_CTL(pipe), 0x0);
3921ad8b1aafSjsg 		break;
3922ad8b1aafSjsg 	case DP_PHY_TEST_PATTERN_D10_2:
39231bb76ff1Sjsg 		drm_dbg_kms(&dev_priv->drm, "Set D10.2 Phy Test Pattern\n");
3924ad8b1aafSjsg 		intel_de_write(dev_priv, DDI_DP_COMP_CTL(pipe),
3925ad8b1aafSjsg 			       DDI_DP_COMP_CTL_ENABLE | DDI_DP_COMP_CTL_D10_2);
3926ad8b1aafSjsg 		break;
3927ad8b1aafSjsg 	case DP_PHY_TEST_PATTERN_ERROR_COUNT:
39281bb76ff1Sjsg 		drm_dbg_kms(&dev_priv->drm, "Set Error Count Phy Test Pattern\n");
3929ad8b1aafSjsg 		intel_de_write(dev_priv, DDI_DP_COMP_CTL(pipe),
3930ad8b1aafSjsg 			       DDI_DP_COMP_CTL_ENABLE |
3931ad8b1aafSjsg 			       DDI_DP_COMP_CTL_SCRAMBLED_0);
3932ad8b1aafSjsg 		break;
3933ad8b1aafSjsg 	case DP_PHY_TEST_PATTERN_PRBS7:
39341bb76ff1Sjsg 		drm_dbg_kms(&dev_priv->drm, "Set PRBS7 Phy Test Pattern\n");
3935ad8b1aafSjsg 		intel_de_write(dev_priv, DDI_DP_COMP_CTL(pipe),
3936ad8b1aafSjsg 			       DDI_DP_COMP_CTL_ENABLE | DDI_DP_COMP_CTL_PRBS7);
3937ad8b1aafSjsg 		break;
3938ad8b1aafSjsg 	case DP_PHY_TEST_PATTERN_80BIT_CUSTOM:
3939ad8b1aafSjsg 		/*
3940ad8b1aafSjsg 		 * FIXME: Ideally pattern should come from DPCD 0x250. As
3941ad8b1aafSjsg 		 * current firmware of DPR-100 could not set it, so hardcoding
3942ad8b1aafSjsg 		 * now for complaince test.
3943ad8b1aafSjsg 		 */
39441bb76ff1Sjsg 		drm_dbg_kms(&dev_priv->drm,
39451bb76ff1Sjsg 			    "Set 80Bit Custom Phy Test Pattern 0x3e0f83e0 0x0f83e0f8 0x0000f83e\n");
3946ad8b1aafSjsg 		pattern_val = 0x3e0f83e0;
3947ad8b1aafSjsg 		intel_de_write(dev_priv, DDI_DP_COMP_PAT(pipe, 0), pattern_val);
3948ad8b1aafSjsg 		pattern_val = 0x0f83e0f8;
3949ad8b1aafSjsg 		intel_de_write(dev_priv, DDI_DP_COMP_PAT(pipe, 1), pattern_val);
3950ad8b1aafSjsg 		pattern_val = 0x0000f83e;
3951ad8b1aafSjsg 		intel_de_write(dev_priv, DDI_DP_COMP_PAT(pipe, 2), pattern_val);
3952ad8b1aafSjsg 		intel_de_write(dev_priv, DDI_DP_COMP_CTL(pipe),
3953ad8b1aafSjsg 			       DDI_DP_COMP_CTL_ENABLE |
3954ad8b1aafSjsg 			       DDI_DP_COMP_CTL_CUSTOM80);
3955ad8b1aafSjsg 		break;
3956ad8b1aafSjsg 	case DP_PHY_TEST_PATTERN_CP2520:
3957ad8b1aafSjsg 		/*
3958ad8b1aafSjsg 		 * FIXME: Ideally pattern should come from DPCD 0x24A. As
3959ad8b1aafSjsg 		 * current firmware of DPR-100 could not set it, so hardcoding
3960ad8b1aafSjsg 		 * now for complaince test.
3961ad8b1aafSjsg 		 */
39621bb76ff1Sjsg 		drm_dbg_kms(&dev_priv->drm, "Set HBR2 compliance Phy Test Pattern\n");
3963ad8b1aafSjsg 		pattern_val = 0xFB;
3964ad8b1aafSjsg 		intel_de_write(dev_priv, DDI_DP_COMP_CTL(pipe),
3965ad8b1aafSjsg 			       DDI_DP_COMP_CTL_ENABLE | DDI_DP_COMP_CTL_HBR2 |
3966ad8b1aafSjsg 			       pattern_val);
3967ad8b1aafSjsg 		break;
3968ad8b1aafSjsg 	default:
3969ad8b1aafSjsg 		WARN(1, "Invalid Phy Test Pattern\n");
3970ad8b1aafSjsg 	}
3971ad8b1aafSjsg }
3972ad8b1aafSjsg 
39735ca02815Sjsg static void intel_dp_process_phy_request(struct intel_dp *intel_dp,
39745ca02815Sjsg 					 const struct intel_crtc_state *crtc_state)
3975ad8b1aafSjsg {
39761bb76ff1Sjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
3977ad8b1aafSjsg 	struct drm_dp_phy_test_params *data =
3978ad8b1aafSjsg 		&intel_dp->compliance.test_data.phytest;
3979ad8b1aafSjsg 	u8 link_status[DP_LINK_STATUS_SIZE];
3980ad8b1aafSjsg 
39815ca02815Sjsg 	if (drm_dp_dpcd_read_phy_link_status(&intel_dp->aux, DP_PHY_DPRX,
39825ca02815Sjsg 					     link_status) < 0) {
39831bb76ff1Sjsg 		drm_dbg_kms(&i915->drm, "failed to get link status\n");
3984ad8b1aafSjsg 		return;
3985ad8b1aafSjsg 	}
3986ad8b1aafSjsg 
3987ad8b1aafSjsg 	/* retrieve vswing & pre-emphasis setting */
39885ca02815Sjsg 	intel_dp_get_adjust_train(intel_dp, crtc_state, DP_PHY_DPRX,
39895ca02815Sjsg 				  link_status);
3990ad8b1aafSjsg 
39915ca02815Sjsg 	intel_dp_set_signal_levels(intel_dp, crtc_state, DP_PHY_DPRX);
3992ad8b1aafSjsg 
39935ca02815Sjsg 	intel_dp_phy_pattern_update(intel_dp, crtc_state);
3994ad8b1aafSjsg 
39955ca02815Sjsg 	drm_dp_dpcd_write(&intel_dp->aux, DP_TRAINING_LANE0_SET,
39965ca02815Sjsg 			  intel_dp->train_set, crtc_state->lane_count);
3997ad8b1aafSjsg 
3998ad8b1aafSjsg 	drm_dp_set_phy_test_pattern(&intel_dp->aux, data,
3999f005ef32Sjsg 				    intel_dp->dpcd[DP_DPCD_REV]);
4000ad8b1aafSjsg }
4001ad8b1aafSjsg 
4002c349dbc7Sjsg static u8 intel_dp_autotest_phy_pattern(struct intel_dp *intel_dp)
4003c349dbc7Sjsg {
40041bb76ff1Sjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
40055ca02815Sjsg 	struct drm_dp_phy_test_params *data =
40065ca02815Sjsg 		&intel_dp->compliance.test_data.phytest;
4007ad8b1aafSjsg 
40085ca02815Sjsg 	if (drm_dp_get_phy_test_pattern(&intel_dp->aux, data)) {
40091bb76ff1Sjsg 		drm_dbg_kms(&i915->drm, "DP Phy Test pattern AUX read failure\n");
40105ca02815Sjsg 		return DP_TEST_NAK;
40115ca02815Sjsg 	}
4012ad8b1aafSjsg 
40135ca02815Sjsg 	/* Set test active flag here so userspace doesn't interrupt things */
40145ca02815Sjsg 	intel_dp->compliance.test_active = true;
4015ad8b1aafSjsg 
40165ca02815Sjsg 	return DP_TEST_ACK;
4017c349dbc7Sjsg }
4018c349dbc7Sjsg 
4019c349dbc7Sjsg static void intel_dp_handle_test_request(struct intel_dp *intel_dp)
4020c349dbc7Sjsg {
4021ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
4022c349dbc7Sjsg 	u8 response = DP_TEST_NAK;
4023c349dbc7Sjsg 	u8 request = 0;
4024c349dbc7Sjsg 	int status;
4025c349dbc7Sjsg 
4026c349dbc7Sjsg 	status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_REQUEST, &request);
4027c349dbc7Sjsg 	if (status <= 0) {
4028ad8b1aafSjsg 		drm_dbg_kms(&i915->drm,
4029ad8b1aafSjsg 			    "Could not read test request from sink\n");
4030c349dbc7Sjsg 		goto update_status;
4031c349dbc7Sjsg 	}
4032c349dbc7Sjsg 
4033c349dbc7Sjsg 	switch (request) {
4034c349dbc7Sjsg 	case DP_TEST_LINK_TRAINING:
4035ad8b1aafSjsg 		drm_dbg_kms(&i915->drm, "LINK_TRAINING test requested\n");
4036c349dbc7Sjsg 		response = intel_dp_autotest_link_training(intel_dp);
4037c349dbc7Sjsg 		break;
4038c349dbc7Sjsg 	case DP_TEST_LINK_VIDEO_PATTERN:
4039ad8b1aafSjsg 		drm_dbg_kms(&i915->drm, "TEST_PATTERN test requested\n");
4040c349dbc7Sjsg 		response = intel_dp_autotest_video_pattern(intel_dp);
4041c349dbc7Sjsg 		break;
4042c349dbc7Sjsg 	case DP_TEST_LINK_EDID_READ:
4043ad8b1aafSjsg 		drm_dbg_kms(&i915->drm, "EDID test requested\n");
4044c349dbc7Sjsg 		response = intel_dp_autotest_edid(intel_dp);
4045c349dbc7Sjsg 		break;
4046c349dbc7Sjsg 	case DP_TEST_LINK_PHY_TEST_PATTERN:
4047ad8b1aafSjsg 		drm_dbg_kms(&i915->drm, "PHY_PATTERN test requested\n");
4048c349dbc7Sjsg 		response = intel_dp_autotest_phy_pattern(intel_dp);
4049c349dbc7Sjsg 		break;
4050c349dbc7Sjsg 	default:
4051ad8b1aafSjsg 		drm_dbg_kms(&i915->drm, "Invalid test request '%02x'\n",
4052ad8b1aafSjsg 			    request);
4053c349dbc7Sjsg 		break;
4054c349dbc7Sjsg 	}
4055c349dbc7Sjsg 
4056c349dbc7Sjsg 	if (response & DP_TEST_ACK)
4057c349dbc7Sjsg 		intel_dp->compliance.test_type = request;
4058c349dbc7Sjsg 
4059c349dbc7Sjsg update_status:
4060c349dbc7Sjsg 	status = drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_RESPONSE, response);
4061c349dbc7Sjsg 	if (status <= 0)
4062ad8b1aafSjsg 		drm_dbg_kms(&i915->drm,
4063ad8b1aafSjsg 			    "Could not write test response to sink\n");
4064c349dbc7Sjsg }
4065c349dbc7Sjsg 
40661bb76ff1Sjsg static bool intel_dp_link_ok(struct intel_dp *intel_dp,
40671bb76ff1Sjsg 			     u8 link_status[DP_LINK_STATUS_SIZE])
40685ca02815Sjsg {
40691bb76ff1Sjsg 	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
40701bb76ff1Sjsg 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
40711bb76ff1Sjsg 	bool uhbr = intel_dp->link_rate >= 1000000;
40721bb76ff1Sjsg 	bool ok;
40731bb76ff1Sjsg 
40741bb76ff1Sjsg 	if (uhbr)
40751bb76ff1Sjsg 		ok = drm_dp_128b132b_lane_channel_eq_done(link_status,
40761bb76ff1Sjsg 							  intel_dp->lane_count);
40771bb76ff1Sjsg 	else
40781bb76ff1Sjsg 		ok = drm_dp_channel_eq_ok(link_status, intel_dp->lane_count);
40791bb76ff1Sjsg 
40801bb76ff1Sjsg 	if (ok)
40811bb76ff1Sjsg 		return true;
40821bb76ff1Sjsg 
40831bb76ff1Sjsg 	intel_dp_dump_link_status(intel_dp, DP_PHY_DPRX, link_status);
40841bb76ff1Sjsg 	drm_dbg_kms(&i915->drm,
40851bb76ff1Sjsg 		    "[ENCODER:%d:%s] %s link not ok, retraining\n",
40861bb76ff1Sjsg 		    encoder->base.base.id, encoder->base.name,
40871bb76ff1Sjsg 		    uhbr ? "128b/132b" : "8b/10b");
40881bb76ff1Sjsg 
40891bb76ff1Sjsg 	return false;
40901bb76ff1Sjsg }
40911bb76ff1Sjsg 
40921bb76ff1Sjsg static void
40931bb76ff1Sjsg intel_dp_mst_hpd_irq(struct intel_dp *intel_dp, u8 *esi, u8 *ack)
40941bb76ff1Sjsg {
40951bb76ff1Sjsg 	bool handled = false;
40961bb76ff1Sjsg 
409783f201fbSjsg 	drm_dp_mst_hpd_irq_handle_event(&intel_dp->mst_mgr, esi, ack, &handled);
40985ca02815Sjsg 
40995ca02815Sjsg 	if (esi[1] & DP_CP_IRQ) {
41005ca02815Sjsg 		intel_hdcp_handle_cp_irq(intel_dp->attached_connector);
41011bb76ff1Sjsg 		ack[1] |= DP_CP_IRQ;
41025ca02815Sjsg 	}
41035ca02815Sjsg }
41045ca02815Sjsg 
41051bb76ff1Sjsg static bool intel_dp_mst_link_status(struct intel_dp *intel_dp)
41061bb76ff1Sjsg {
41071bb76ff1Sjsg 	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
41081bb76ff1Sjsg 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
41091bb76ff1Sjsg 	u8 link_status[DP_LINK_STATUS_SIZE] = {};
41101bb76ff1Sjsg 	const size_t esi_link_status_size = DP_LINK_STATUS_SIZE - 2;
41111bb76ff1Sjsg 
41121bb76ff1Sjsg 	if (drm_dp_dpcd_read(&intel_dp->aux, DP_LANE0_1_STATUS_ESI, link_status,
41131bb76ff1Sjsg 			     esi_link_status_size) != esi_link_status_size) {
41141bb76ff1Sjsg 		drm_err(&i915->drm,
41151bb76ff1Sjsg 			"[ENCODER:%d:%s] Failed to read link status\n",
41161bb76ff1Sjsg 			encoder->base.base.id, encoder->base.name);
41171bb76ff1Sjsg 		return false;
41181bb76ff1Sjsg 	}
41191bb76ff1Sjsg 
41201bb76ff1Sjsg 	return intel_dp_link_ok(intel_dp, link_status);
41211bb76ff1Sjsg }
41221bb76ff1Sjsg 
4123ad8b1aafSjsg /**
4124ad8b1aafSjsg  * intel_dp_check_mst_status - service any pending MST interrupts, check link status
4125ad8b1aafSjsg  * @intel_dp: Intel DP struct
4126ad8b1aafSjsg  *
4127ad8b1aafSjsg  * Read any pending MST interrupts, call MST core to handle these and ack the
4128ad8b1aafSjsg  * interrupts. Check if the main and AUX link state is ok.
4129ad8b1aafSjsg  *
4130ad8b1aafSjsg  * Returns:
4131ad8b1aafSjsg  * - %true if pending interrupts were serviced (or no interrupts were
4132ad8b1aafSjsg  *   pending) w/o detecting an error condition.
4133ad8b1aafSjsg  * - %false if an error condition - like AUX failure or a loss of link - is
4134ad8b1aafSjsg  *   detected, which needs servicing from the hotplug work.
4135ad8b1aafSjsg  */
4136ad8b1aafSjsg static bool
4137c349dbc7Sjsg intel_dp_check_mst_status(struct intel_dp *intel_dp)
4138c349dbc7Sjsg {
4139ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
4140ad8b1aafSjsg 	bool link_ok = true;
4141c349dbc7Sjsg 
4142ad8b1aafSjsg 	drm_WARN_ON_ONCE(&i915->drm, intel_dp->active_mst_links < 0);
4143ad8b1aafSjsg 
4144ad8b1aafSjsg 	for (;;) {
41451bb76ff1Sjsg 		u8 esi[4] = {};
41461bb76ff1Sjsg 		u8 ack[4] = {};
4147c349dbc7Sjsg 
4148ad8b1aafSjsg 		if (!intel_dp_get_sink_irq_esi(intel_dp, esi)) {
4149ad8b1aafSjsg 			drm_dbg_kms(&i915->drm,
4150ad8b1aafSjsg 				    "failed to get ESI - device may have failed\n");
4151ad8b1aafSjsg 			link_ok = false;
4152c349dbc7Sjsg 
4153ad8b1aafSjsg 			break;
4154c349dbc7Sjsg 		}
4155c349dbc7Sjsg 
41561bb76ff1Sjsg 		drm_dbg_kms(&i915->drm, "DPRX ESI: %4ph\n", esi);
41571bb76ff1Sjsg 
4158ad8b1aafSjsg 		if (intel_dp->active_mst_links > 0 && link_ok &&
41591bb76ff1Sjsg 		    esi[3] & LINK_STATUS_CHANGED) {
41601bb76ff1Sjsg 			if (!intel_dp_mst_link_status(intel_dp))
4161ad8b1aafSjsg 				link_ok = false;
41621bb76ff1Sjsg 			ack[3] |= LINK_STATUS_CHANGED;
4163ad8b1aafSjsg 		}
4164c349dbc7Sjsg 
41651bb76ff1Sjsg 		intel_dp_mst_hpd_irq(intel_dp, esi, ack);
4166ad8b1aafSjsg 
41671bb76ff1Sjsg 		if (!memchr_inv(ack, 0, sizeof(ack)))
4168ad8b1aafSjsg 			break;
4169ad8b1aafSjsg 
41701bb76ff1Sjsg 		if (!intel_dp_ack_sink_irq_esi(intel_dp, ack))
41711bb76ff1Sjsg 			drm_dbg_kms(&i915->drm, "Failed to ack ESI\n");
417283f201fbSjsg 
417383f201fbSjsg 		if (ack[1] & (DP_DOWN_REP_MSG_RDY | DP_UP_REQ_MSG_RDY))
417483f201fbSjsg 			drm_dp_mst_hpd_irq_send_new_request(&intel_dp->mst_mgr);
4175c349dbc7Sjsg 	}
4176c349dbc7Sjsg 
4177ad8b1aafSjsg 	return link_ok;
4178c349dbc7Sjsg }
4179c349dbc7Sjsg 
41805ca02815Sjsg static void
41815ca02815Sjsg intel_dp_handle_hdmi_link_status_change(struct intel_dp *intel_dp)
41825ca02815Sjsg {
41835ca02815Sjsg 	bool is_active;
41845ca02815Sjsg 	u8 buf = 0;
41855ca02815Sjsg 
41865ca02815Sjsg 	is_active = drm_dp_pcon_hdmi_link_active(&intel_dp->aux);
41875ca02815Sjsg 	if (intel_dp->frl.is_trained && !is_active) {
41885ca02815Sjsg 		if (drm_dp_dpcd_readb(&intel_dp->aux, DP_PCON_HDMI_LINK_CONFIG_1, &buf) < 0)
41895ca02815Sjsg 			return;
41905ca02815Sjsg 
41915ca02815Sjsg 		buf &=  ~DP_PCON_ENABLE_HDMI_LINK;
41925ca02815Sjsg 		if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_PCON_HDMI_LINK_CONFIG_1, buf) < 0)
41935ca02815Sjsg 			return;
41945ca02815Sjsg 
41955ca02815Sjsg 		drm_dp_pcon_hdmi_frl_link_error_count(&intel_dp->aux, &intel_dp->attached_connector->base);
41965ca02815Sjsg 
41971bb76ff1Sjsg 		intel_dp->frl.is_trained = false;
41981bb76ff1Sjsg 
41995ca02815Sjsg 		/* Restart FRL training or fall back to TMDS mode */
42005ca02815Sjsg 		intel_dp_check_frl_training(intel_dp);
42015ca02815Sjsg 	}
42025ca02815Sjsg }
42035ca02815Sjsg 
4204c349dbc7Sjsg static bool
4205c349dbc7Sjsg intel_dp_needs_link_retrain(struct intel_dp *intel_dp)
4206c349dbc7Sjsg {
4207c349dbc7Sjsg 	u8 link_status[DP_LINK_STATUS_SIZE];
4208c349dbc7Sjsg 
4209c349dbc7Sjsg 	if (!intel_dp->link_trained)
4210c349dbc7Sjsg 		return false;
4211c349dbc7Sjsg 
4212c349dbc7Sjsg 	/*
4213c349dbc7Sjsg 	 * While PSR source HW is enabled, it will control main-link sending
4214c349dbc7Sjsg 	 * frames, enabling and disabling it so trying to do a retrain will fail
4215c349dbc7Sjsg 	 * as the link would or not be on or it could mix training patterns
4216c349dbc7Sjsg 	 * and frame data at the same time causing retrain to fail.
4217c349dbc7Sjsg 	 * Also when exiting PSR, HW will retrain the link anyways fixing
4218c349dbc7Sjsg 	 * any link status error.
4219c349dbc7Sjsg 	 */
4220c349dbc7Sjsg 	if (intel_psr_enabled(intel_dp))
4221c349dbc7Sjsg 		return false;
4222c349dbc7Sjsg 
42235ca02815Sjsg 	if (drm_dp_dpcd_read_phy_link_status(&intel_dp->aux, DP_PHY_DPRX,
42245ca02815Sjsg 					     link_status) < 0)
4225c349dbc7Sjsg 		return false;
4226c349dbc7Sjsg 
4227c349dbc7Sjsg 	/*
4228c349dbc7Sjsg 	 * Validate the cached values of intel_dp->link_rate and
4229c349dbc7Sjsg 	 * intel_dp->lane_count before attempting to retrain.
42305ca02815Sjsg 	 *
42315ca02815Sjsg 	 * FIXME would be nice to user the crtc state here, but since
42325ca02815Sjsg 	 * we need to call this from the short HPD handler that seems
42335ca02815Sjsg 	 * a bit hard.
4234c349dbc7Sjsg 	 */
4235c349dbc7Sjsg 	if (!intel_dp_link_params_valid(intel_dp, intel_dp->link_rate,
4236c349dbc7Sjsg 					intel_dp->lane_count))
4237c349dbc7Sjsg 		return false;
4238c349dbc7Sjsg 
42391bb76ff1Sjsg 	/* Retrain if link not ok */
42401bb76ff1Sjsg 	return !intel_dp_link_ok(intel_dp, link_status);
4241c349dbc7Sjsg }
4242c349dbc7Sjsg 
4243ad8b1aafSjsg static bool intel_dp_has_connector(struct intel_dp *intel_dp,
4244ad8b1aafSjsg 				   const struct drm_connector_state *conn_state)
4245ad8b1aafSjsg {
4246ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
4247ad8b1aafSjsg 	struct intel_encoder *encoder;
4248ad8b1aafSjsg 	enum pipe pipe;
4249ad8b1aafSjsg 
4250ad8b1aafSjsg 	if (!conn_state->best_encoder)
4251ad8b1aafSjsg 		return false;
4252ad8b1aafSjsg 
4253ad8b1aafSjsg 	/* SST */
4254ad8b1aafSjsg 	encoder = &dp_to_dig_port(intel_dp)->base;
4255ad8b1aafSjsg 	if (conn_state->best_encoder == &encoder->base)
4256ad8b1aafSjsg 		return true;
4257ad8b1aafSjsg 
4258ad8b1aafSjsg 	/* MST */
4259ad8b1aafSjsg 	for_each_pipe(i915, pipe) {
4260ad8b1aafSjsg 		encoder = &intel_dp->mst_encoders[pipe]->base;
4261ad8b1aafSjsg 		if (conn_state->best_encoder == &encoder->base)
4262ad8b1aafSjsg 			return true;
4263ad8b1aafSjsg 	}
4264ad8b1aafSjsg 
4265ad8b1aafSjsg 	return false;
4266ad8b1aafSjsg }
4267ad8b1aafSjsg 
4268f005ef32Sjsg int intel_dp_get_active_pipes(struct intel_dp *intel_dp,
4269ad8b1aafSjsg 			      struct drm_modeset_acquire_ctx *ctx,
42701bb76ff1Sjsg 			      u8 *pipe_mask)
4271ad8b1aafSjsg {
4272ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
4273ad8b1aafSjsg 	struct drm_connector_list_iter conn_iter;
4274ad8b1aafSjsg 	struct intel_connector *connector;
4275ad8b1aafSjsg 	int ret = 0;
4276ad8b1aafSjsg 
42771bb76ff1Sjsg 	*pipe_mask = 0;
4278ad8b1aafSjsg 
4279ad8b1aafSjsg 	drm_connector_list_iter_begin(&i915->drm, &conn_iter);
4280ad8b1aafSjsg 	for_each_intel_connector_iter(connector, &conn_iter) {
4281ad8b1aafSjsg 		struct drm_connector_state *conn_state =
4282ad8b1aafSjsg 			connector->base.state;
4283ad8b1aafSjsg 		struct intel_crtc_state *crtc_state;
4284ad8b1aafSjsg 		struct intel_crtc *crtc;
4285ad8b1aafSjsg 
4286ad8b1aafSjsg 		if (!intel_dp_has_connector(intel_dp, conn_state))
4287ad8b1aafSjsg 			continue;
4288ad8b1aafSjsg 
4289ad8b1aafSjsg 		crtc = to_intel_crtc(conn_state->crtc);
4290ad8b1aafSjsg 		if (!crtc)
4291ad8b1aafSjsg 			continue;
4292ad8b1aafSjsg 
4293ad8b1aafSjsg 		ret = drm_modeset_lock(&crtc->base.mutex, ctx);
4294ad8b1aafSjsg 		if (ret)
4295ad8b1aafSjsg 			break;
4296ad8b1aafSjsg 
4297ad8b1aafSjsg 		crtc_state = to_intel_crtc_state(crtc->base.state);
4298ad8b1aafSjsg 
4299ad8b1aafSjsg 		drm_WARN_ON(&i915->drm, !intel_crtc_has_dp_encoder(crtc_state));
4300ad8b1aafSjsg 
4301ad8b1aafSjsg 		if (!crtc_state->hw.active)
4302ad8b1aafSjsg 			continue;
4303ad8b1aafSjsg 
4304ad8b1aafSjsg 		if (conn_state->commit &&
4305ad8b1aafSjsg 		    !try_wait_for_completion(&conn_state->commit->hw_done))
4306ad8b1aafSjsg 			continue;
4307ad8b1aafSjsg 
43081bb76ff1Sjsg 		*pipe_mask |= BIT(crtc->pipe);
4309ad8b1aafSjsg 	}
4310ad8b1aafSjsg 	drm_connector_list_iter_end(&conn_iter);
4311ad8b1aafSjsg 
4312ad8b1aafSjsg 	return ret;
4313ad8b1aafSjsg }
4314ad8b1aafSjsg 
4315ad8b1aafSjsg static bool intel_dp_is_connected(struct intel_dp *intel_dp)
4316ad8b1aafSjsg {
4317ad8b1aafSjsg 	struct intel_connector *connector = intel_dp->attached_connector;
4318ad8b1aafSjsg 
4319ad8b1aafSjsg 	return connector->base.status == connector_status_connected ||
4320ad8b1aafSjsg 		intel_dp->is_mst;
4321ad8b1aafSjsg }
4322ad8b1aafSjsg 
4323c349dbc7Sjsg int intel_dp_retrain_link(struct intel_encoder *encoder,
4324c349dbc7Sjsg 			  struct drm_modeset_acquire_ctx *ctx)
4325c349dbc7Sjsg {
4326c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
4327c349dbc7Sjsg 	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
4328c349dbc7Sjsg 	struct intel_crtc *crtc;
43291bb76ff1Sjsg 	u8 pipe_mask;
4330c349dbc7Sjsg 	int ret;
4331c349dbc7Sjsg 
4332ad8b1aafSjsg 	if (!intel_dp_is_connected(intel_dp))
4333c349dbc7Sjsg 		return 0;
4334c349dbc7Sjsg 
4335c349dbc7Sjsg 	ret = drm_modeset_lock(&dev_priv->drm.mode_config.connection_mutex,
4336c349dbc7Sjsg 			       ctx);
4337c349dbc7Sjsg 	if (ret)
4338c349dbc7Sjsg 		return ret;
4339c349dbc7Sjsg 
4340f005ef32Sjsg 	if (!intel_dp_needs_link_retrain(intel_dp))
4341f005ef32Sjsg 		return 0;
4342f005ef32Sjsg 
4343f005ef32Sjsg 	ret = intel_dp_get_active_pipes(intel_dp, ctx, &pipe_mask);
4344c349dbc7Sjsg 	if (ret)
4345c349dbc7Sjsg 		return ret;
4346c349dbc7Sjsg 
43471bb76ff1Sjsg 	if (pipe_mask == 0)
4348c349dbc7Sjsg 		return 0;
4349c349dbc7Sjsg 
4350f005ef32Sjsg 	if (!intel_dp_needs_link_retrain(intel_dp))
4351f005ef32Sjsg 		return 0;
4352f005ef32Sjsg 
4353ad8b1aafSjsg 	drm_dbg_kms(&dev_priv->drm, "[ENCODER:%d:%s] retraining link\n",
4354ad8b1aafSjsg 		    encoder->base.base.id, encoder->base.name);
4355c349dbc7Sjsg 
43561bb76ff1Sjsg 	for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, crtc, pipe_mask) {
4357ad8b1aafSjsg 		const struct intel_crtc_state *crtc_state =
4358ad8b1aafSjsg 			to_intel_crtc_state(crtc->base.state);
4359c349dbc7Sjsg 
4360c349dbc7Sjsg 		/* Suppress underruns caused by re-training */
4361c349dbc7Sjsg 		intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, false);
4362c349dbc7Sjsg 		if (crtc_state->has_pch_encoder)
4363c349dbc7Sjsg 			intel_set_pch_fifo_underrun_reporting(dev_priv,
4364c349dbc7Sjsg 							      intel_crtc_pch_transcoder(crtc), false);
4365ad8b1aafSjsg 	}
4366c349dbc7Sjsg 
43671bb76ff1Sjsg 	for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, crtc, pipe_mask) {
43685ca02815Sjsg 		const struct intel_crtc_state *crtc_state =
43695ca02815Sjsg 			to_intel_crtc_state(crtc->base.state);
43705ca02815Sjsg 
43715ca02815Sjsg 		/* retrain on the MST master transcoder */
43725ca02815Sjsg 		if (DISPLAY_VER(dev_priv) >= 12 &&
43735ca02815Sjsg 		    intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST) &&
43745ca02815Sjsg 		    !intel_dp_mst_is_master_trans(crtc_state))
43755ca02815Sjsg 			continue;
43765ca02815Sjsg 
4377*aa0c546bSjsg 		intel_dp->link_trained = false;
4378*aa0c546bSjsg 
43795ca02815Sjsg 		intel_dp_check_frl_training(intel_dp);
43805ca02815Sjsg 		intel_dp_pcon_dsc_configure(intel_dp, crtc_state);
43815ca02815Sjsg 		intel_dp_start_link_train(intel_dp, crtc_state);
43825ca02815Sjsg 		intel_dp_stop_link_train(intel_dp, crtc_state);
43835ca02815Sjsg 		break;
43845ca02815Sjsg 	}
4385c349dbc7Sjsg 
43861bb76ff1Sjsg 	for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, crtc, pipe_mask) {
4387ad8b1aafSjsg 		const struct intel_crtc_state *crtc_state =
4388ad8b1aafSjsg 			to_intel_crtc_state(crtc->base.state);
4389ad8b1aafSjsg 
4390c349dbc7Sjsg 		/* Keep underrun reporting disabled until things are stable */
43911bb76ff1Sjsg 		intel_crtc_wait_for_next_vblank(crtc);
4392c349dbc7Sjsg 
4393c349dbc7Sjsg 		intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, true);
4394c349dbc7Sjsg 		if (crtc_state->has_pch_encoder)
4395c349dbc7Sjsg 			intel_set_pch_fifo_underrun_reporting(dev_priv,
4396c349dbc7Sjsg 							      intel_crtc_pch_transcoder(crtc), true);
4397ad8b1aafSjsg 	}
4398c349dbc7Sjsg 
4399c349dbc7Sjsg 	return 0;
4400c349dbc7Sjsg }
4401c349dbc7Sjsg 
44025ca02815Sjsg static int intel_dp_prep_phy_test(struct intel_dp *intel_dp,
44035ca02815Sjsg 				  struct drm_modeset_acquire_ctx *ctx,
44041bb76ff1Sjsg 				  u8 *pipe_mask)
4405c349dbc7Sjsg {
44065ca02815Sjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
44075ca02815Sjsg 	struct drm_connector_list_iter conn_iter;
44085ca02815Sjsg 	struct intel_connector *connector;
44095ca02815Sjsg 	int ret = 0;
44105ca02815Sjsg 
44111bb76ff1Sjsg 	*pipe_mask = 0;
44125ca02815Sjsg 
44135ca02815Sjsg 	drm_connector_list_iter_begin(&i915->drm, &conn_iter);
44145ca02815Sjsg 	for_each_intel_connector_iter(connector, &conn_iter) {
44155ca02815Sjsg 		struct drm_connector_state *conn_state =
44165ca02815Sjsg 			connector->base.state;
44175ca02815Sjsg 		struct intel_crtc_state *crtc_state;
44185ca02815Sjsg 		struct intel_crtc *crtc;
44195ca02815Sjsg 
44205ca02815Sjsg 		if (!intel_dp_has_connector(intel_dp, conn_state))
44215ca02815Sjsg 			continue;
44225ca02815Sjsg 
44235ca02815Sjsg 		crtc = to_intel_crtc(conn_state->crtc);
44245ca02815Sjsg 		if (!crtc)
44255ca02815Sjsg 			continue;
44265ca02815Sjsg 
44275ca02815Sjsg 		ret = drm_modeset_lock(&crtc->base.mutex, ctx);
44285ca02815Sjsg 		if (ret)
44295ca02815Sjsg 			break;
44305ca02815Sjsg 
44315ca02815Sjsg 		crtc_state = to_intel_crtc_state(crtc->base.state);
44325ca02815Sjsg 
44335ca02815Sjsg 		drm_WARN_ON(&i915->drm, !intel_crtc_has_dp_encoder(crtc_state));
44345ca02815Sjsg 
44355ca02815Sjsg 		if (!crtc_state->hw.active)
44365ca02815Sjsg 			continue;
44375ca02815Sjsg 
44385ca02815Sjsg 		if (conn_state->commit &&
44395ca02815Sjsg 		    !try_wait_for_completion(&conn_state->commit->hw_done))
44405ca02815Sjsg 			continue;
44415ca02815Sjsg 
44421bb76ff1Sjsg 		*pipe_mask |= BIT(crtc->pipe);
44435ca02815Sjsg 	}
44445ca02815Sjsg 	drm_connector_list_iter_end(&conn_iter);
44455ca02815Sjsg 
44465ca02815Sjsg 	return ret;
44475ca02815Sjsg }
44485ca02815Sjsg 
44495ca02815Sjsg static int intel_dp_do_phy_test(struct intel_encoder *encoder,
44505ca02815Sjsg 				struct drm_modeset_acquire_ctx *ctx)
44515ca02815Sjsg {
44525ca02815Sjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
44535ca02815Sjsg 	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
44545ca02815Sjsg 	struct intel_crtc *crtc;
44551bb76ff1Sjsg 	u8 pipe_mask;
4456c349dbc7Sjsg 	int ret;
4457c349dbc7Sjsg 
44585ca02815Sjsg 	ret = drm_modeset_lock(&dev_priv->drm.mode_config.connection_mutex,
44595ca02815Sjsg 			       ctx);
44605ca02815Sjsg 	if (ret)
44615ca02815Sjsg 		return ret;
44625ca02815Sjsg 
44631bb76ff1Sjsg 	ret = intel_dp_prep_phy_test(intel_dp, ctx, &pipe_mask);
44645ca02815Sjsg 	if (ret)
44655ca02815Sjsg 		return ret;
44665ca02815Sjsg 
44671bb76ff1Sjsg 	if (pipe_mask == 0)
44685ca02815Sjsg 		return 0;
44695ca02815Sjsg 
44705ca02815Sjsg 	drm_dbg_kms(&dev_priv->drm, "[ENCODER:%d:%s] PHY test\n",
44715ca02815Sjsg 		    encoder->base.base.id, encoder->base.name);
44725ca02815Sjsg 
44731bb76ff1Sjsg 	for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, crtc, pipe_mask) {
44745ca02815Sjsg 		const struct intel_crtc_state *crtc_state =
44755ca02815Sjsg 			to_intel_crtc_state(crtc->base.state);
44765ca02815Sjsg 
44775ca02815Sjsg 		/* test on the MST master transcoder */
44785ca02815Sjsg 		if (DISPLAY_VER(dev_priv) >= 12 &&
44795ca02815Sjsg 		    intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST) &&
44805ca02815Sjsg 		    !intel_dp_mst_is_master_trans(crtc_state))
44815ca02815Sjsg 			continue;
44825ca02815Sjsg 
44835ca02815Sjsg 		intel_dp_process_phy_request(intel_dp, crtc_state);
44845ca02815Sjsg 		break;
44855ca02815Sjsg 	}
44865ca02815Sjsg 
44875ca02815Sjsg 	return 0;
44885ca02815Sjsg }
44895ca02815Sjsg 
44905ca02815Sjsg void intel_dp_phy_test(struct intel_encoder *encoder)
44915ca02815Sjsg {
44925ca02815Sjsg 	struct drm_modeset_acquire_ctx ctx;
44935ca02815Sjsg 	int ret;
4494c349dbc7Sjsg 
4495c349dbc7Sjsg 	drm_modeset_acquire_init(&ctx, 0);
4496c349dbc7Sjsg 
4497c349dbc7Sjsg 	for (;;) {
44985ca02815Sjsg 		ret = intel_dp_do_phy_test(encoder, &ctx);
4499c349dbc7Sjsg 
4500c349dbc7Sjsg 		if (ret == -EDEADLK) {
4501c349dbc7Sjsg 			drm_modeset_backoff(&ctx);
4502c349dbc7Sjsg 			continue;
4503c349dbc7Sjsg 		}
4504c349dbc7Sjsg 
4505c349dbc7Sjsg 		break;
4506c349dbc7Sjsg 	}
4507c349dbc7Sjsg 
4508c349dbc7Sjsg 	drm_modeset_drop_locks(&ctx);
4509c349dbc7Sjsg 	drm_modeset_acquire_fini(&ctx);
4510c349dbc7Sjsg 	drm_WARN(encoder->base.dev, ret,
4511c349dbc7Sjsg 		 "Acquiring modeset locks failed with %i\n", ret);
4512c349dbc7Sjsg }
4513c349dbc7Sjsg 
45145ca02815Sjsg static void intel_dp_check_device_service_irq(struct intel_dp *intel_dp)
4515c349dbc7Sjsg {
4516ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
4517c349dbc7Sjsg 	u8 val;
4518c349dbc7Sjsg 
4519c349dbc7Sjsg 	if (intel_dp->dpcd[DP_DPCD_REV] < 0x11)
4520c349dbc7Sjsg 		return;
4521c349dbc7Sjsg 
4522c349dbc7Sjsg 	if (drm_dp_dpcd_readb(&intel_dp->aux,
4523c349dbc7Sjsg 			      DP_DEVICE_SERVICE_IRQ_VECTOR, &val) != 1 || !val)
4524c349dbc7Sjsg 		return;
4525c349dbc7Sjsg 
4526c349dbc7Sjsg 	drm_dp_dpcd_writeb(&intel_dp->aux, DP_DEVICE_SERVICE_IRQ_VECTOR, val);
4527c349dbc7Sjsg 
4528c349dbc7Sjsg 	if (val & DP_AUTOMATED_TEST_REQUEST)
4529c349dbc7Sjsg 		intel_dp_handle_test_request(intel_dp);
4530c349dbc7Sjsg 
4531c349dbc7Sjsg 	if (val & DP_CP_IRQ)
4532c349dbc7Sjsg 		intel_hdcp_handle_cp_irq(intel_dp->attached_connector);
4533c349dbc7Sjsg 
4534c349dbc7Sjsg 	if (val & DP_SINK_SPECIFIC_IRQ)
4535ad8b1aafSjsg 		drm_dbg_kms(&i915->drm, "Sink specific irq unhandled\n");
4536c349dbc7Sjsg }
4537c349dbc7Sjsg 
45385ca02815Sjsg static void intel_dp_check_link_service_irq(struct intel_dp *intel_dp)
45395ca02815Sjsg {
45405ca02815Sjsg 	u8 val;
45415ca02815Sjsg 
45425ca02815Sjsg 	if (intel_dp->dpcd[DP_DPCD_REV] < 0x11)
45435ca02815Sjsg 		return;
45445ca02815Sjsg 
45455ca02815Sjsg 	if (drm_dp_dpcd_readb(&intel_dp->aux,
45465ca02815Sjsg 			      DP_LINK_SERVICE_IRQ_VECTOR_ESI0, &val) != 1 || !val)
45475ca02815Sjsg 		return;
45485ca02815Sjsg 
45495ca02815Sjsg 	if (drm_dp_dpcd_writeb(&intel_dp->aux,
45505ca02815Sjsg 			       DP_LINK_SERVICE_IRQ_VECTOR_ESI0, val) != 1)
45515ca02815Sjsg 		return;
45525ca02815Sjsg 
45535ca02815Sjsg 	if (val & HDMI_LINK_STATUS_CHANGED)
45545ca02815Sjsg 		intel_dp_handle_hdmi_link_status_change(intel_dp);
45555ca02815Sjsg }
45565ca02815Sjsg 
4557c349dbc7Sjsg /*
4558c349dbc7Sjsg  * According to DP spec
4559c349dbc7Sjsg  * 5.1.2:
4560c349dbc7Sjsg  *  1. Read DPCD
4561c349dbc7Sjsg  *  2. Configure link according to Receiver Capabilities
4562c349dbc7Sjsg  *  3. Use Link Training from 2.5.3.3 and 3.5.1.3
4563c349dbc7Sjsg  *  4. Check link status on receipt of hot-plug interrupt
4564c349dbc7Sjsg  *
4565c349dbc7Sjsg  * intel_dp_short_pulse -  handles short pulse interrupts
4566c349dbc7Sjsg  * when full detection is not required.
4567c349dbc7Sjsg  * Returns %true if short pulse is handled and full detection
4568c349dbc7Sjsg  * is NOT required and %false otherwise.
4569c349dbc7Sjsg  */
4570c349dbc7Sjsg static bool
4571c349dbc7Sjsg intel_dp_short_pulse(struct intel_dp *intel_dp)
4572c349dbc7Sjsg {
4573c349dbc7Sjsg 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
4574c349dbc7Sjsg 	u8 old_sink_count = intel_dp->sink_count;
4575c349dbc7Sjsg 	bool ret;
4576c349dbc7Sjsg 
4577c349dbc7Sjsg 	/*
4578c349dbc7Sjsg 	 * Clearing compliance test variables to allow capturing
4579c349dbc7Sjsg 	 * of values for next automated test request.
4580c349dbc7Sjsg 	 */
4581c349dbc7Sjsg 	memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance));
4582c349dbc7Sjsg 
4583c349dbc7Sjsg 	/*
4584c349dbc7Sjsg 	 * Now read the DPCD to see if it's actually running
4585c349dbc7Sjsg 	 * If the current value of sink count doesn't match with
4586c349dbc7Sjsg 	 * the value that was stored earlier or dpcd read failed
4587c349dbc7Sjsg 	 * we need to do full detection
4588c349dbc7Sjsg 	 */
4589c349dbc7Sjsg 	ret = intel_dp_get_dpcd(intel_dp);
4590c349dbc7Sjsg 
4591c349dbc7Sjsg 	if ((old_sink_count != intel_dp->sink_count) || !ret) {
4592c349dbc7Sjsg 		/* No need to proceed if we are going to do full detect */
4593c349dbc7Sjsg 		return false;
4594c349dbc7Sjsg 	}
4595c349dbc7Sjsg 
45965ca02815Sjsg 	intel_dp_check_device_service_irq(intel_dp);
45975ca02815Sjsg 	intel_dp_check_link_service_irq(intel_dp);
4598c349dbc7Sjsg 
4599c349dbc7Sjsg 	/* Handle CEC interrupts, if any */
4600c349dbc7Sjsg 	drm_dp_cec_irq(&intel_dp->aux);
4601c349dbc7Sjsg 
4602c349dbc7Sjsg 	/* defer to the hotplug work for link retraining if needed */
4603c349dbc7Sjsg 	if (intel_dp_needs_link_retrain(intel_dp))
4604c349dbc7Sjsg 		return false;
4605c349dbc7Sjsg 
4606c349dbc7Sjsg 	intel_psr_short_pulse(intel_dp);
4607c349dbc7Sjsg 
46085ca02815Sjsg 	switch (intel_dp->compliance.test_type) {
46095ca02815Sjsg 	case DP_TEST_LINK_TRAINING:
4610c349dbc7Sjsg 		drm_dbg_kms(&dev_priv->drm,
4611c349dbc7Sjsg 			    "Link Training Compliance Test requested\n");
4612c349dbc7Sjsg 		/* Send a Hotplug Uevent to userspace to start modeset */
4613c349dbc7Sjsg 		drm_kms_helper_hotplug_event(&dev_priv->drm);
46145ca02815Sjsg 		break;
46155ca02815Sjsg 	case DP_TEST_LINK_PHY_TEST_PATTERN:
46165ca02815Sjsg 		drm_dbg_kms(&dev_priv->drm,
46175ca02815Sjsg 			    "PHY test pattern Compliance Test requested\n");
46185ca02815Sjsg 		/*
46195ca02815Sjsg 		 * Schedule long hpd to do the test
46205ca02815Sjsg 		 *
46215ca02815Sjsg 		 * FIXME get rid of the ad-hoc phy test modeset code
46225ca02815Sjsg 		 * and properly incorporate it into the normal modeset.
46235ca02815Sjsg 		 */
46245ca02815Sjsg 		return false;
4625c349dbc7Sjsg 	}
4626c349dbc7Sjsg 
4627c349dbc7Sjsg 	return true;
4628c349dbc7Sjsg }
4629c349dbc7Sjsg 
4630c349dbc7Sjsg /* XXX this is probably wrong for multiple downstream ports */
4631c349dbc7Sjsg static enum drm_connector_status
4632c349dbc7Sjsg intel_dp_detect_dpcd(struct intel_dp *intel_dp)
4633c349dbc7Sjsg {
4634ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
46355ca02815Sjsg 	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
4636c349dbc7Sjsg 	u8 *dpcd = intel_dp->dpcd;
4637c349dbc7Sjsg 	u8 type;
4638c349dbc7Sjsg 
4639ad8b1aafSjsg 	if (drm_WARN_ON(&i915->drm, intel_dp_is_edp(intel_dp)))
4640c349dbc7Sjsg 		return connector_status_connected;
4641c349dbc7Sjsg 
46425ca02815Sjsg 	lspcon_resume(dig_port);
4643c349dbc7Sjsg 
4644c349dbc7Sjsg 	if (!intel_dp_get_dpcd(intel_dp))
4645c349dbc7Sjsg 		return connector_status_disconnected;
4646c349dbc7Sjsg 
4647c349dbc7Sjsg 	/* if there's no downstream port, we're done */
4648c349dbc7Sjsg 	if (!drm_dp_is_branch(dpcd))
4649c349dbc7Sjsg 		return connector_status_connected;
4650c349dbc7Sjsg 
4651c349dbc7Sjsg 	/* If we're HPD-aware, SINK_COUNT changes dynamically */
4652ad8b1aafSjsg 	if (intel_dp_has_sink_count(intel_dp) &&
4653c349dbc7Sjsg 	    intel_dp->downstream_ports[0] & DP_DS_PORT_HPD) {
4654c349dbc7Sjsg 		return intel_dp->sink_count ?
4655c349dbc7Sjsg 		connector_status_connected : connector_status_disconnected;
4656c349dbc7Sjsg 	}
4657c349dbc7Sjsg 
4658c349dbc7Sjsg 	if (intel_dp_can_mst(intel_dp))
4659c349dbc7Sjsg 		return connector_status_connected;
4660c349dbc7Sjsg 
4661c349dbc7Sjsg 	/* If no HPD, poke DDC gently */
4662c349dbc7Sjsg 	if (drm_probe_ddc(&intel_dp->aux.ddc))
4663c349dbc7Sjsg 		return connector_status_connected;
4664c349dbc7Sjsg 
4665c349dbc7Sjsg 	/* Well we tried, say unknown for unreliable port types */
4666c349dbc7Sjsg 	if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11) {
4667c349dbc7Sjsg 		type = intel_dp->downstream_ports[0] & DP_DS_PORT_TYPE_MASK;
4668c349dbc7Sjsg 		if (type == DP_DS_PORT_TYPE_VGA ||
4669c349dbc7Sjsg 		    type == DP_DS_PORT_TYPE_NON_EDID)
4670c349dbc7Sjsg 			return connector_status_unknown;
4671c349dbc7Sjsg 	} else {
4672c349dbc7Sjsg 		type = intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] &
4673c349dbc7Sjsg 			DP_DWN_STRM_PORT_TYPE_MASK;
4674c349dbc7Sjsg 		if (type == DP_DWN_STRM_PORT_TYPE_ANALOG ||
4675c349dbc7Sjsg 		    type == DP_DWN_STRM_PORT_TYPE_OTHER)
4676c349dbc7Sjsg 			return connector_status_unknown;
4677c349dbc7Sjsg 	}
4678c349dbc7Sjsg 
4679c349dbc7Sjsg 	/* Anything else is out of spec, warn and ignore */
4680ad8b1aafSjsg 	drm_dbg_kms(&i915->drm, "Broken DP branch device, ignoring\n");
4681c349dbc7Sjsg 	return connector_status_disconnected;
4682c349dbc7Sjsg }
4683c349dbc7Sjsg 
4684c349dbc7Sjsg static enum drm_connector_status
4685c349dbc7Sjsg edp_detect(struct intel_dp *intel_dp)
4686c349dbc7Sjsg {
4687c349dbc7Sjsg 	return connector_status_connected;
4688c349dbc7Sjsg }
4689c349dbc7Sjsg 
4690c349dbc7Sjsg /*
4691c349dbc7Sjsg  * intel_digital_port_connected - is the specified port connected?
4692c349dbc7Sjsg  * @encoder: intel_encoder
4693c349dbc7Sjsg  *
4694c349dbc7Sjsg  * In cases where there's a connector physically connected but it can't be used
4695c349dbc7Sjsg  * by our hardware we also return false, since the rest of the driver should
4696c349dbc7Sjsg  * pretty much treat the port as disconnected. This is relevant for type-C
4697c349dbc7Sjsg  * (starting on ICL) where there's ownership involved.
4698c349dbc7Sjsg  *
4699c349dbc7Sjsg  * Return %true if port is connected, %false otherwise.
4700c349dbc7Sjsg  */
4701c349dbc7Sjsg bool intel_digital_port_connected(struct intel_encoder *encoder)
4702c349dbc7Sjsg {
4703c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
4704ad8b1aafSjsg 	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
4705c349dbc7Sjsg 	bool is_connected = false;
4706c349dbc7Sjsg 	intel_wakeref_t wakeref;
4707c349dbc7Sjsg 
4708c349dbc7Sjsg 	with_intel_display_power(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref)
4709ad8b1aafSjsg 		is_connected = dig_port->connected(encoder);
4710c349dbc7Sjsg 
4711c349dbc7Sjsg 	return is_connected;
4712c349dbc7Sjsg }
4713c349dbc7Sjsg 
4714f005ef32Sjsg static const struct drm_edid *
4715c349dbc7Sjsg intel_dp_get_edid(struct intel_dp *intel_dp)
4716c349dbc7Sjsg {
4717f005ef32Sjsg 	struct intel_connector *connector = intel_dp->attached_connector;
4718f005ef32Sjsg 	const struct drm_edid *fixed_edid = connector->panel.fixed_edid;
4719c349dbc7Sjsg 
4720f005ef32Sjsg 	/* Use panel fixed edid if we have one */
4721f005ef32Sjsg 	if (fixed_edid) {
4722c349dbc7Sjsg 		/* invalid edid */
4723f005ef32Sjsg 		if (IS_ERR(fixed_edid))
4724c349dbc7Sjsg 			return NULL;
4725c349dbc7Sjsg 
4726f005ef32Sjsg 		return drm_edid_dup(fixed_edid);
4727f005ef32Sjsg 	}
4728f005ef32Sjsg 
4729f005ef32Sjsg 	return drm_edid_read_ddc(&connector->base, &intel_dp->aux.ddc);
4730c349dbc7Sjsg }
4731c349dbc7Sjsg 
4732c349dbc7Sjsg static void
4733ad8b1aafSjsg intel_dp_update_dfp(struct intel_dp *intel_dp,
4734f005ef32Sjsg 		    const struct drm_edid *drm_edid)
4735ad8b1aafSjsg {
4736ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
4737ad8b1aafSjsg 	struct intel_connector *connector = intel_dp->attached_connector;
4738f005ef32Sjsg 	const struct edid *edid;
4739f005ef32Sjsg 
4740f005ef32Sjsg 	/* FIXME: Get rid of drm_edid_raw() */
4741f005ef32Sjsg 	edid = drm_edid_raw(drm_edid);
4742ad8b1aafSjsg 
4743ad8b1aafSjsg 	intel_dp->dfp.max_bpc =
4744ad8b1aafSjsg 		drm_dp_downstream_max_bpc(intel_dp->dpcd,
4745ad8b1aafSjsg 					  intel_dp->downstream_ports, edid);
4746ad8b1aafSjsg 
4747ad8b1aafSjsg 	intel_dp->dfp.max_dotclock =
4748ad8b1aafSjsg 		drm_dp_downstream_max_dotclock(intel_dp->dpcd,
4749ad8b1aafSjsg 					       intel_dp->downstream_ports);
4750ad8b1aafSjsg 
4751ad8b1aafSjsg 	intel_dp->dfp.min_tmds_clock =
4752ad8b1aafSjsg 		drm_dp_downstream_min_tmds_clock(intel_dp->dpcd,
4753ad8b1aafSjsg 						 intel_dp->downstream_ports,
4754ad8b1aafSjsg 						 edid);
4755ad8b1aafSjsg 	intel_dp->dfp.max_tmds_clock =
4756ad8b1aafSjsg 		drm_dp_downstream_max_tmds_clock(intel_dp->dpcd,
4757ad8b1aafSjsg 						 intel_dp->downstream_ports,
4758ad8b1aafSjsg 						 edid);
4759ad8b1aafSjsg 
47605ca02815Sjsg 	intel_dp->dfp.pcon_max_frl_bw =
47615ca02815Sjsg 		drm_dp_get_pcon_max_frl_bw(intel_dp->dpcd,
47625ca02815Sjsg 					   intel_dp->downstream_ports);
47635ca02815Sjsg 
4764ad8b1aafSjsg 	drm_dbg_kms(&i915->drm,
47655ca02815Sjsg 		    "[CONNECTOR:%d:%s] DFP max bpc %d, max dotclock %d, TMDS clock %d-%d, PCON Max FRL BW %dGbps\n",
4766ad8b1aafSjsg 		    connector->base.base.id, connector->base.name,
4767ad8b1aafSjsg 		    intel_dp->dfp.max_bpc,
4768ad8b1aafSjsg 		    intel_dp->dfp.max_dotclock,
4769ad8b1aafSjsg 		    intel_dp->dfp.min_tmds_clock,
47705ca02815Sjsg 		    intel_dp->dfp.max_tmds_clock,
47715ca02815Sjsg 		    intel_dp->dfp.pcon_max_frl_bw);
47725ca02815Sjsg 
47735ca02815Sjsg 	intel_dp_get_pcon_dsc_cap(intel_dp);
4774ad8b1aafSjsg }
4775ad8b1aafSjsg 
4776f005ef32Sjsg static bool
4777f005ef32Sjsg intel_dp_can_ycbcr420(struct intel_dp *intel_dp)
4778f005ef32Sjsg {
4779f005ef32Sjsg 	if (source_can_output(intel_dp, INTEL_OUTPUT_FORMAT_YCBCR420) &&
4780f005ef32Sjsg 	    (!drm_dp_is_branch(intel_dp->dpcd) || intel_dp->dfp.ycbcr420_passthrough))
4781f005ef32Sjsg 		return true;
4782f005ef32Sjsg 
4783f005ef32Sjsg 	if (source_can_output(intel_dp, INTEL_OUTPUT_FORMAT_RGB) &&
4784f005ef32Sjsg 	    dfp_can_convert_from_rgb(intel_dp, INTEL_OUTPUT_FORMAT_YCBCR420))
4785f005ef32Sjsg 		return true;
4786f005ef32Sjsg 
4787f005ef32Sjsg 	if (source_can_output(intel_dp, INTEL_OUTPUT_FORMAT_YCBCR444) &&
4788f005ef32Sjsg 	    dfp_can_convert_from_ycbcr444(intel_dp, INTEL_OUTPUT_FORMAT_YCBCR420))
4789f005ef32Sjsg 		return true;
4790f005ef32Sjsg 
4791f005ef32Sjsg 	return false;
4792f005ef32Sjsg }
4793f005ef32Sjsg 
4794ad8b1aafSjsg static void
4795ad8b1aafSjsg intel_dp_update_420(struct intel_dp *intel_dp)
4796ad8b1aafSjsg {
4797ad8b1aafSjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
4798ad8b1aafSjsg 	struct intel_connector *connector = intel_dp->attached_connector;
4799ad8b1aafSjsg 
4800f005ef32Sjsg 	intel_dp->dfp.ycbcr420_passthrough =
4801ad8b1aafSjsg 		drm_dp_downstream_420_passthrough(intel_dp->dpcd,
4802ad8b1aafSjsg 						  intel_dp->downstream_ports);
48035ca02815Sjsg 	/* on-board LSPCON always assumed to support 4:4:4->4:2:0 conversion */
4804f005ef32Sjsg 	intel_dp->dfp.ycbcr_444_to_420 =
48055ca02815Sjsg 		dp_to_dig_port(intel_dp)->lspcon.active ||
4806ad8b1aafSjsg 		drm_dp_downstream_444_to_420_conversion(intel_dp->dpcd,
4807ad8b1aafSjsg 							intel_dp->downstream_ports);
4808f005ef32Sjsg 	intel_dp->dfp.rgb_to_ycbcr =
4809f005ef32Sjsg 		drm_dp_downstream_rgb_to_ycbcr_conversion(intel_dp->dpcd,
48105ca02815Sjsg 							  intel_dp->downstream_ports,
48111bb76ff1Sjsg 							  DP_DS_HDMI_BT709_RGB_YCBCR_CONV);
4812ad8b1aafSjsg 
4813f005ef32Sjsg 	connector->base.ycbcr_420_allowed = intel_dp_can_ycbcr420(intel_dp);
4814ad8b1aafSjsg 
4815ad8b1aafSjsg 	drm_dbg_kms(&i915->drm,
48165ca02815Sjsg 		    "[CONNECTOR:%d:%s] RGB->YcbCr conversion? %s, YCbCr 4:2:0 allowed? %s, YCbCr 4:4:4->4:2:0 conversion? %s\n",
4817ad8b1aafSjsg 		    connector->base.base.id, connector->base.name,
48181bb76ff1Sjsg 		    str_yes_no(intel_dp->dfp.rgb_to_ycbcr),
48191bb76ff1Sjsg 		    str_yes_no(connector->base.ycbcr_420_allowed),
48201bb76ff1Sjsg 		    str_yes_no(intel_dp->dfp.ycbcr_444_to_420));
4821ad8b1aafSjsg }
4822ad8b1aafSjsg 
4823ad8b1aafSjsg static void
4824c349dbc7Sjsg intel_dp_set_edid(struct intel_dp *intel_dp)
4825c349dbc7Sjsg {
48261bb76ff1Sjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
4827ad8b1aafSjsg 	struct intel_connector *connector = intel_dp->attached_connector;
4828f005ef32Sjsg 	const struct drm_edid *drm_edid;
4829f005ef32Sjsg 	const struct edid *edid;
48301bb76ff1Sjsg 	bool vrr_capable;
4831c349dbc7Sjsg 
4832c349dbc7Sjsg 	intel_dp_unset_edid(intel_dp);
4833f005ef32Sjsg 	drm_edid = intel_dp_get_edid(intel_dp);
4834f005ef32Sjsg 	connector->detect_edid = drm_edid;
4835f005ef32Sjsg 
4836f005ef32Sjsg 	/* Below we depend on display info having been updated */
4837f005ef32Sjsg 	drm_edid_connector_update(&connector->base, drm_edid);
4838c349dbc7Sjsg 
48391bb76ff1Sjsg 	vrr_capable = intel_vrr_is_capable(connector);
48401bb76ff1Sjsg 	drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] VRR capable: %s\n",
48411bb76ff1Sjsg 		    connector->base.base.id, connector->base.name, str_yes_no(vrr_capable));
48421bb76ff1Sjsg 	drm_connector_set_vrr_capable_property(&connector->base, vrr_capable);
48431bb76ff1Sjsg 
4844f005ef32Sjsg 	intel_dp_update_dfp(intel_dp, drm_edid);
4845ad8b1aafSjsg 	intel_dp_update_420(intel_dp);
4846ad8b1aafSjsg 
4847f005ef32Sjsg 	/* FIXME: Get rid of drm_edid_raw() */
4848f005ef32Sjsg 	edid = drm_edid_raw(drm_edid);
4849ad8b1aafSjsg 
4850c349dbc7Sjsg 	drm_dp_cec_set_edid(&intel_dp->aux, edid);
4851c349dbc7Sjsg }
4852c349dbc7Sjsg 
4853c349dbc7Sjsg static void
4854c349dbc7Sjsg intel_dp_unset_edid(struct intel_dp *intel_dp)
4855c349dbc7Sjsg {
4856ad8b1aafSjsg 	struct intel_connector *connector = intel_dp->attached_connector;
4857c349dbc7Sjsg 
4858c349dbc7Sjsg 	drm_dp_cec_unset_edid(&intel_dp->aux);
4859f005ef32Sjsg 	drm_edid_free(connector->detect_edid);
4860ad8b1aafSjsg 	connector->detect_edid = NULL;
4861c349dbc7Sjsg 
4862ad8b1aafSjsg 	intel_dp->dfp.max_bpc = 0;
4863ad8b1aafSjsg 	intel_dp->dfp.max_dotclock = 0;
4864ad8b1aafSjsg 	intel_dp->dfp.min_tmds_clock = 0;
4865ad8b1aafSjsg 	intel_dp->dfp.max_tmds_clock = 0;
4866ad8b1aafSjsg 
48675ca02815Sjsg 	intel_dp->dfp.pcon_max_frl_bw = 0;
48685ca02815Sjsg 
4869ad8b1aafSjsg 	intel_dp->dfp.ycbcr_444_to_420 = false;
4870ad8b1aafSjsg 	connector->base.ycbcr_420_allowed = false;
48711bb76ff1Sjsg 
48721bb76ff1Sjsg 	drm_connector_set_vrr_capable_property(&connector->base,
48731bb76ff1Sjsg 					       false);
4874c349dbc7Sjsg }
4875c349dbc7Sjsg 
4876c349dbc7Sjsg static int
4877c349dbc7Sjsg intel_dp_detect(struct drm_connector *connector,
4878c349dbc7Sjsg 		struct drm_modeset_acquire_ctx *ctx,
4879c349dbc7Sjsg 		bool force)
4880c349dbc7Sjsg {
4881c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(connector->dev);
4882c349dbc7Sjsg 	struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector));
4883c349dbc7Sjsg 	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
4884c349dbc7Sjsg 	struct intel_encoder *encoder = &dig_port->base;
4885c349dbc7Sjsg 	enum drm_connector_status status;
4886c349dbc7Sjsg 
4887c349dbc7Sjsg 	drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s]\n",
4888c349dbc7Sjsg 		    connector->base.id, connector->name);
4889c349dbc7Sjsg 	drm_WARN_ON(&dev_priv->drm,
4890c349dbc7Sjsg 		    !drm_modeset_is_locked(&dev_priv->drm.mode_config.connection_mutex));
4891c349dbc7Sjsg 
4892ad8b1aafSjsg 	if (!INTEL_DISPLAY_ENABLED(dev_priv))
4893ad8b1aafSjsg 		return connector_status_disconnected;
4894ad8b1aafSjsg 
4895c349dbc7Sjsg 	/* Can't disconnect eDP */
4896c349dbc7Sjsg 	if (intel_dp_is_edp(intel_dp))
4897c349dbc7Sjsg 		status = edp_detect(intel_dp);
4898c349dbc7Sjsg 	else if (intel_digital_port_connected(encoder))
4899c349dbc7Sjsg 		status = intel_dp_detect_dpcd(intel_dp);
4900c349dbc7Sjsg 	else
4901c349dbc7Sjsg 		status = connector_status_disconnected;
4902c349dbc7Sjsg 
4903c349dbc7Sjsg 	if (status == connector_status_disconnected) {
4904c349dbc7Sjsg 		memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance));
4905c349dbc7Sjsg 		memset(intel_dp->dsc_dpcd, 0, sizeof(intel_dp->dsc_dpcd));
4906c349dbc7Sjsg 
4907c349dbc7Sjsg 		if (intel_dp->is_mst) {
4908c349dbc7Sjsg 			drm_dbg_kms(&dev_priv->drm,
4909c349dbc7Sjsg 				    "MST device may have disappeared %d vs %d\n",
4910c349dbc7Sjsg 				    intel_dp->is_mst,
4911c349dbc7Sjsg 				    intel_dp->mst_mgr.mst_state);
4912c349dbc7Sjsg 			intel_dp->is_mst = false;
4913c349dbc7Sjsg 			drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
4914c349dbc7Sjsg 							intel_dp->is_mst);
4915c349dbc7Sjsg 		}
4916c349dbc7Sjsg 
4917c349dbc7Sjsg 		goto out;
4918c349dbc7Sjsg 	}
4919c349dbc7Sjsg 
4920ad8b1aafSjsg 	/* Read DP Sink DSC Cap DPCD regs for DP v1.4 */
4921f005ef32Sjsg 	if (HAS_DSC(dev_priv))
4922ad8b1aafSjsg 		intel_dp_get_dsc_sink_cap(intel_dp);
4923ad8b1aafSjsg 
4924ad8b1aafSjsg 	intel_dp_configure_mst(intel_dp);
4925ad8b1aafSjsg 
4926ad8b1aafSjsg 	/*
4927ad8b1aafSjsg 	 * TODO: Reset link params when switching to MST mode, until MST
4928ad8b1aafSjsg 	 * supports link training fallback params.
4929ad8b1aafSjsg 	 */
4930ad8b1aafSjsg 	if (intel_dp->reset_link_params || intel_dp->is_mst) {
49315ca02815Sjsg 		intel_dp_reset_max_link_params(intel_dp);
4932c349dbc7Sjsg 		intel_dp->reset_link_params = false;
4933c349dbc7Sjsg 	}
4934c349dbc7Sjsg 
4935c349dbc7Sjsg 	intel_dp_print_rates(intel_dp);
4936c349dbc7Sjsg 
4937c349dbc7Sjsg 	if (intel_dp->is_mst) {
4938c349dbc7Sjsg 		/*
4939c349dbc7Sjsg 		 * If we are in MST mode then this connector
4940c349dbc7Sjsg 		 * won't appear connected or have anything
4941c349dbc7Sjsg 		 * with EDID on it
4942c349dbc7Sjsg 		 */
4943c349dbc7Sjsg 		status = connector_status_disconnected;
4944c349dbc7Sjsg 		goto out;
4945c349dbc7Sjsg 	}
4946c349dbc7Sjsg 
4947c349dbc7Sjsg 	/*
4948c349dbc7Sjsg 	 * Some external monitors do not signal loss of link synchronization
4949c349dbc7Sjsg 	 * with an IRQ_HPD, so force a link status check.
4950c349dbc7Sjsg 	 */
4951c349dbc7Sjsg 	if (!intel_dp_is_edp(intel_dp)) {
4952c349dbc7Sjsg 		int ret;
4953c349dbc7Sjsg 
4954c349dbc7Sjsg 		ret = intel_dp_retrain_link(encoder, ctx);
4955c349dbc7Sjsg 		if (ret)
4956c349dbc7Sjsg 			return ret;
4957c349dbc7Sjsg 	}
4958c349dbc7Sjsg 
4959c349dbc7Sjsg 	/*
4960c349dbc7Sjsg 	 * Clearing NACK and defer counts to get their exact values
4961c349dbc7Sjsg 	 * while reading EDID which are required by Compliance tests
4962c349dbc7Sjsg 	 * 4.2.2.4 and 4.2.2.5
4963c349dbc7Sjsg 	 */
4964c349dbc7Sjsg 	intel_dp->aux.i2c_nack_count = 0;
4965c349dbc7Sjsg 	intel_dp->aux.i2c_defer_count = 0;
4966c349dbc7Sjsg 
4967c349dbc7Sjsg 	intel_dp_set_edid(intel_dp);
4968c349dbc7Sjsg 	if (intel_dp_is_edp(intel_dp) ||
4969c349dbc7Sjsg 	    to_intel_connector(connector)->detect_edid)
4970c349dbc7Sjsg 		status = connector_status_connected;
4971c349dbc7Sjsg 
49725ca02815Sjsg 	intel_dp_check_device_service_irq(intel_dp);
4973c349dbc7Sjsg 
4974c349dbc7Sjsg out:
4975c349dbc7Sjsg 	if (status != connector_status_connected && !intel_dp->is_mst)
4976c349dbc7Sjsg 		intel_dp_unset_edid(intel_dp);
4977c349dbc7Sjsg 
4978c349dbc7Sjsg 	/*
4979c349dbc7Sjsg 	 * Make sure the refs for power wells enabled during detect are
4980c349dbc7Sjsg 	 * dropped to avoid a new detect cycle triggered by HPD polling.
4981c349dbc7Sjsg 	 */
4982c349dbc7Sjsg 	intel_display_power_flush_work(dev_priv);
4983c349dbc7Sjsg 
4984ad8b1aafSjsg 	if (!intel_dp_is_edp(intel_dp))
4985ad8b1aafSjsg 		drm_dp_set_subconnector_property(connector,
4986ad8b1aafSjsg 						 status,
4987ad8b1aafSjsg 						 intel_dp->dpcd,
4988ad8b1aafSjsg 						 intel_dp->downstream_ports);
4989c349dbc7Sjsg 	return status;
4990c349dbc7Sjsg }
4991c349dbc7Sjsg 
4992c349dbc7Sjsg static void
4993c349dbc7Sjsg intel_dp_force(struct drm_connector *connector)
4994c349dbc7Sjsg {
4995c349dbc7Sjsg 	struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector));
4996c349dbc7Sjsg 	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
4997c349dbc7Sjsg 	struct intel_encoder *intel_encoder = &dig_port->base;
4998c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev);
4999c349dbc7Sjsg 	enum intel_display_power_domain aux_domain =
5000c349dbc7Sjsg 		intel_aux_power_domain(dig_port);
5001c349dbc7Sjsg 	intel_wakeref_t wakeref;
5002c349dbc7Sjsg 
5003c349dbc7Sjsg 	drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s]\n",
5004c349dbc7Sjsg 		    connector->base.id, connector->name);
5005c349dbc7Sjsg 	intel_dp_unset_edid(intel_dp);
5006c349dbc7Sjsg 
5007c349dbc7Sjsg 	if (connector->status != connector_status_connected)
5008c349dbc7Sjsg 		return;
5009c349dbc7Sjsg 
5010c349dbc7Sjsg 	wakeref = intel_display_power_get(dev_priv, aux_domain);
5011c349dbc7Sjsg 
5012c349dbc7Sjsg 	intel_dp_set_edid(intel_dp);
5013c349dbc7Sjsg 
5014c349dbc7Sjsg 	intel_display_power_put(dev_priv, aux_domain, wakeref);
5015c349dbc7Sjsg }
5016c349dbc7Sjsg 
5017c349dbc7Sjsg static int intel_dp_get_modes(struct drm_connector *connector)
5018c349dbc7Sjsg {
5019c349dbc7Sjsg 	struct intel_connector *intel_connector = to_intel_connector(connector);
5020f005ef32Sjsg 	int num_modes;
5021c349dbc7Sjsg 
5022f005ef32Sjsg 	/* drm_edid_connector_update() done in ->detect() or ->force() */
5023f005ef32Sjsg 	num_modes = drm_edid_connector_add_modes(connector);
50245ca02815Sjsg 
50255ca02815Sjsg 	/* Also add fixed mode, which may or may not be present in EDID */
50261bb76ff1Sjsg 	if (intel_dp_is_edp(intel_attached_dp(intel_connector)))
50271bb76ff1Sjsg 		num_modes += intel_panel_get_modes(intel_connector);
5028c349dbc7Sjsg 
50295ca02815Sjsg 	if (num_modes)
50305ca02815Sjsg 		return num_modes;
50315ca02815Sjsg 
5032f005ef32Sjsg 	if (!intel_connector->detect_edid) {
5033ad8b1aafSjsg 		struct intel_dp *intel_dp = intel_attached_dp(intel_connector);
5034ad8b1aafSjsg 		struct drm_display_mode *mode;
5035ad8b1aafSjsg 
5036ad8b1aafSjsg 		mode = drm_dp_downstream_mode(connector->dev,
5037ad8b1aafSjsg 					      intel_dp->dpcd,
5038ad8b1aafSjsg 					      intel_dp->downstream_ports);
5039ad8b1aafSjsg 		if (mode) {
5040ad8b1aafSjsg 			drm_mode_probed_add(connector, mode);
50415ca02815Sjsg 			num_modes++;
5042ad8b1aafSjsg 		}
5043ad8b1aafSjsg 	}
5044ad8b1aafSjsg 
50455ca02815Sjsg 	return num_modes;
5046c349dbc7Sjsg }
5047c349dbc7Sjsg 
5048c349dbc7Sjsg static int
5049c349dbc7Sjsg intel_dp_connector_register(struct drm_connector *connector)
5050c349dbc7Sjsg {
5051ad8b1aafSjsg 	struct drm_i915_private *i915 = to_i915(connector->dev);
5052c349dbc7Sjsg 	struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector));
50535ca02815Sjsg 	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
50545ca02815Sjsg 	struct intel_lspcon *lspcon = &dig_port->lspcon;
5055c349dbc7Sjsg 	int ret;
5056c349dbc7Sjsg 
5057c349dbc7Sjsg 	ret = intel_connector_register(connector);
5058c349dbc7Sjsg 	if (ret)
5059c349dbc7Sjsg 		return ret;
5060c349dbc7Sjsg 
5061c349dbc7Sjsg #ifdef notyet
5062ad8b1aafSjsg 	drm_dbg_kms(&i915->drm, "registering %s bus for %s\n",
5063c349dbc7Sjsg 		    intel_dp->aux.name, connector->kdev->kobj.name);
5064c349dbc7Sjsg #endif
5065c349dbc7Sjsg 
5066c349dbc7Sjsg 	intel_dp->aux.dev = connector->kdev;
5067c349dbc7Sjsg 	ret = drm_dp_aux_register(&intel_dp->aux);
5068c349dbc7Sjsg 	if (!ret)
5069c349dbc7Sjsg 		drm_dp_cec_register_connector(&intel_dp->aux, connector);
50705ca02815Sjsg 
5071f005ef32Sjsg 	if (!intel_bios_encoder_is_lspcon(dig_port->base.devdata))
50725ca02815Sjsg 		return ret;
50735ca02815Sjsg 
50745ca02815Sjsg 	/*
50755ca02815Sjsg 	 * ToDo: Clean this up to handle lspcon init and resume more
50765ca02815Sjsg 	 * efficiently and streamlined.
50775ca02815Sjsg 	 */
50785ca02815Sjsg 	if (lspcon_init(dig_port)) {
50795ca02815Sjsg 		lspcon_detect_hdr_capability(lspcon);
50805ca02815Sjsg 		if (lspcon->hdr_supported)
50811bb76ff1Sjsg 			drm_connector_attach_hdr_output_metadata_property(connector);
50825ca02815Sjsg 	}
50835ca02815Sjsg 
5084c349dbc7Sjsg 	return ret;
5085c349dbc7Sjsg }
5086c349dbc7Sjsg 
5087c349dbc7Sjsg static void
5088c349dbc7Sjsg intel_dp_connector_unregister(struct drm_connector *connector)
5089c349dbc7Sjsg {
5090c349dbc7Sjsg 	struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector));
5091c349dbc7Sjsg 
5092c349dbc7Sjsg 	drm_dp_cec_unregister_connector(&intel_dp->aux);
5093c349dbc7Sjsg 	drm_dp_aux_unregister(&intel_dp->aux);
5094c349dbc7Sjsg 	intel_connector_unregister(connector);
5095c349dbc7Sjsg }
5096c349dbc7Sjsg 
5097c349dbc7Sjsg void intel_dp_encoder_flush_work(struct drm_encoder *encoder)
5098c349dbc7Sjsg {
5099ad8b1aafSjsg 	struct intel_digital_port *dig_port = enc_to_dig_port(to_intel_encoder(encoder));
5100ad8b1aafSjsg 	struct intel_dp *intel_dp = &dig_port->dp;
5101c349dbc7Sjsg 
5102ad8b1aafSjsg 	intel_dp_mst_encoder_cleanup(dig_port);
5103c349dbc7Sjsg 
51045ca02815Sjsg 	intel_pps_vdd_off_sync(intel_dp);
5105c349dbc7Sjsg 
5106f005ef32Sjsg 	/*
5107f005ef32Sjsg 	 * Ensure power off delay is respected on module remove, so that we can
5108f005ef32Sjsg 	 * reduce delays at driver probe. See pps_init_timestamps().
5109f005ef32Sjsg 	 */
5110f005ef32Sjsg 	intel_pps_wait_power_cycle(intel_dp);
5111f005ef32Sjsg 
5112c349dbc7Sjsg 	intel_dp_aux_fini(intel_dp);
5113c349dbc7Sjsg }
5114c349dbc7Sjsg 
5115c349dbc7Sjsg void intel_dp_encoder_suspend(struct intel_encoder *intel_encoder)
5116c349dbc7Sjsg {
5117c349dbc7Sjsg 	struct intel_dp *intel_dp = enc_to_intel_dp(intel_encoder);
5118c349dbc7Sjsg 
51195ca02815Sjsg 	intel_pps_vdd_off_sync(intel_dp);
5120c349dbc7Sjsg }
5121c349dbc7Sjsg 
51225ca02815Sjsg void intel_dp_encoder_shutdown(struct intel_encoder *intel_encoder)
5123c349dbc7Sjsg {
51245ca02815Sjsg 	struct intel_dp *intel_dp = enc_to_intel_dp(intel_encoder);
5125c349dbc7Sjsg 
51265ca02815Sjsg 	intel_pps_wait_power_cycle(intel_dp);
5127c349dbc7Sjsg }
5128c349dbc7Sjsg 
5129c349dbc7Sjsg static int intel_modeset_tile_group(struct intel_atomic_state *state,
5130c349dbc7Sjsg 				    int tile_group_id)
5131c349dbc7Sjsg {
5132c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
5133c349dbc7Sjsg 	struct drm_connector_list_iter conn_iter;
5134c349dbc7Sjsg 	struct drm_connector *connector;
5135c349dbc7Sjsg 	int ret = 0;
5136c349dbc7Sjsg 
5137c349dbc7Sjsg 	drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter);
5138c349dbc7Sjsg 	drm_for_each_connector_iter(connector, &conn_iter) {
5139c349dbc7Sjsg 		struct drm_connector_state *conn_state;
5140c349dbc7Sjsg 		struct intel_crtc_state *crtc_state;
5141c349dbc7Sjsg 		struct intel_crtc *crtc;
5142c349dbc7Sjsg 
5143c349dbc7Sjsg 		if (!connector->has_tile ||
5144c349dbc7Sjsg 		    connector->tile_group->id != tile_group_id)
5145c349dbc7Sjsg 			continue;
5146c349dbc7Sjsg 
5147c349dbc7Sjsg 		conn_state = drm_atomic_get_connector_state(&state->base,
5148c349dbc7Sjsg 							    connector);
5149c349dbc7Sjsg 		if (IS_ERR(conn_state)) {
5150c349dbc7Sjsg 			ret = PTR_ERR(conn_state);
5151c349dbc7Sjsg 			break;
5152c349dbc7Sjsg 		}
5153c349dbc7Sjsg 
5154c349dbc7Sjsg 		crtc = to_intel_crtc(conn_state->crtc);
5155c349dbc7Sjsg 
5156c349dbc7Sjsg 		if (!crtc)
5157c349dbc7Sjsg 			continue;
5158c349dbc7Sjsg 
5159c349dbc7Sjsg 		crtc_state = intel_atomic_get_new_crtc_state(state, crtc);
5160c349dbc7Sjsg 		crtc_state->uapi.mode_changed = true;
5161c349dbc7Sjsg 
5162c349dbc7Sjsg 		ret = drm_atomic_add_affected_planes(&state->base, &crtc->base);
5163c349dbc7Sjsg 		if (ret)
5164c349dbc7Sjsg 			break;
5165c349dbc7Sjsg 	}
5166c349dbc7Sjsg 	drm_connector_list_iter_end(&conn_iter);
5167c349dbc7Sjsg 
5168c349dbc7Sjsg 	return ret;
5169c349dbc7Sjsg }
5170c349dbc7Sjsg 
5171c349dbc7Sjsg static int intel_modeset_affected_transcoders(struct intel_atomic_state *state, u8 transcoders)
5172c349dbc7Sjsg {
5173c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
5174c349dbc7Sjsg 	struct intel_crtc *crtc;
5175c349dbc7Sjsg 
5176c349dbc7Sjsg 	if (transcoders == 0)
5177c349dbc7Sjsg 		return 0;
5178c349dbc7Sjsg 
5179c349dbc7Sjsg 	for_each_intel_crtc(&dev_priv->drm, crtc) {
5180c349dbc7Sjsg 		struct intel_crtc_state *crtc_state;
5181c349dbc7Sjsg 		int ret;
5182c349dbc7Sjsg 
5183c349dbc7Sjsg 		crtc_state = intel_atomic_get_crtc_state(&state->base, crtc);
5184c349dbc7Sjsg 		if (IS_ERR(crtc_state))
5185c349dbc7Sjsg 			return PTR_ERR(crtc_state);
5186c349dbc7Sjsg 
5187c349dbc7Sjsg 		if (!crtc_state->hw.enable)
5188c349dbc7Sjsg 			continue;
5189c349dbc7Sjsg 
5190c349dbc7Sjsg 		if (!(transcoders & BIT(crtc_state->cpu_transcoder)))
5191c349dbc7Sjsg 			continue;
5192c349dbc7Sjsg 
5193c349dbc7Sjsg 		crtc_state->uapi.mode_changed = true;
5194c349dbc7Sjsg 
5195c349dbc7Sjsg 		ret = drm_atomic_add_affected_connectors(&state->base, &crtc->base);
5196c349dbc7Sjsg 		if (ret)
5197c349dbc7Sjsg 			return ret;
5198c349dbc7Sjsg 
5199c349dbc7Sjsg 		ret = drm_atomic_add_affected_planes(&state->base, &crtc->base);
5200c349dbc7Sjsg 		if (ret)
5201c349dbc7Sjsg 			return ret;
5202c349dbc7Sjsg 
5203c349dbc7Sjsg 		transcoders &= ~BIT(crtc_state->cpu_transcoder);
5204c349dbc7Sjsg 	}
5205c349dbc7Sjsg 
5206c349dbc7Sjsg 	drm_WARN_ON(&dev_priv->drm, transcoders != 0);
5207c349dbc7Sjsg 
5208c349dbc7Sjsg 	return 0;
5209c349dbc7Sjsg }
5210c349dbc7Sjsg 
5211c349dbc7Sjsg static int intel_modeset_synced_crtcs(struct intel_atomic_state *state,
5212c349dbc7Sjsg 				      struct drm_connector *connector)
5213c349dbc7Sjsg {
5214c349dbc7Sjsg 	const struct drm_connector_state *old_conn_state =
5215c349dbc7Sjsg 		drm_atomic_get_old_connector_state(&state->base, connector);
5216c349dbc7Sjsg 	const struct intel_crtc_state *old_crtc_state;
5217c349dbc7Sjsg 	struct intel_crtc *crtc;
5218c349dbc7Sjsg 	u8 transcoders;
5219c349dbc7Sjsg 
5220c349dbc7Sjsg 	crtc = to_intel_crtc(old_conn_state->crtc);
5221c349dbc7Sjsg 	if (!crtc)
5222c349dbc7Sjsg 		return 0;
5223c349dbc7Sjsg 
5224c349dbc7Sjsg 	old_crtc_state = intel_atomic_get_old_crtc_state(state, crtc);
5225c349dbc7Sjsg 
5226c349dbc7Sjsg 	if (!old_crtc_state->hw.active)
5227c349dbc7Sjsg 		return 0;
5228c349dbc7Sjsg 
5229c349dbc7Sjsg 	transcoders = old_crtc_state->sync_mode_slaves_mask;
5230c349dbc7Sjsg 	if (old_crtc_state->master_transcoder != INVALID_TRANSCODER)
5231c349dbc7Sjsg 		transcoders |= BIT(old_crtc_state->master_transcoder);
5232c349dbc7Sjsg 
5233c349dbc7Sjsg 	return intel_modeset_affected_transcoders(state,
5234c349dbc7Sjsg 						  transcoders);
5235c349dbc7Sjsg }
5236c349dbc7Sjsg 
5237c349dbc7Sjsg static int intel_dp_connector_atomic_check(struct drm_connector *conn,
5238c349dbc7Sjsg 					   struct drm_atomic_state *_state)
5239c349dbc7Sjsg {
5240c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(conn->dev);
5241c349dbc7Sjsg 	struct intel_atomic_state *state = to_intel_atomic_state(_state);
52421bb76ff1Sjsg 	struct drm_connector_state *conn_state = drm_atomic_get_new_connector_state(_state, conn);
52431bb76ff1Sjsg 	struct intel_connector *intel_conn = to_intel_connector(conn);
52441bb76ff1Sjsg 	struct intel_dp *intel_dp = enc_to_intel_dp(intel_conn->encoder);
5245c349dbc7Sjsg 	int ret;
5246c349dbc7Sjsg 
5247c349dbc7Sjsg 	ret = intel_digital_connector_atomic_check(conn, &state->base);
5248c349dbc7Sjsg 	if (ret)
5249c349dbc7Sjsg 		return ret;
5250c349dbc7Sjsg 
52511bb76ff1Sjsg 	if (intel_dp_mst_source_support(intel_dp)) {
52521bb76ff1Sjsg 		ret = drm_dp_mst_root_conn_atomic_check(conn_state, &intel_dp->mst_mgr);
52531bb76ff1Sjsg 		if (ret)
52541bb76ff1Sjsg 			return ret;
52551bb76ff1Sjsg 	}
52561bb76ff1Sjsg 
5257ad8b1aafSjsg 	/*
5258ad8b1aafSjsg 	 * We don't enable port sync on BDW due to missing w/as and
5259ad8b1aafSjsg 	 * due to not having adjusted the modeset sequence appropriately.
5260ad8b1aafSjsg 	 */
52615ca02815Sjsg 	if (DISPLAY_VER(dev_priv) < 9)
5262c349dbc7Sjsg 		return 0;
5263c349dbc7Sjsg 
5264c349dbc7Sjsg 	if (!intel_connector_needs_modeset(state, conn))
5265c349dbc7Sjsg 		return 0;
5266c349dbc7Sjsg 
5267c349dbc7Sjsg 	if (conn->has_tile) {
5268c349dbc7Sjsg 		ret = intel_modeset_tile_group(state, conn->tile_group->id);
5269c349dbc7Sjsg 		if (ret)
5270c349dbc7Sjsg 			return ret;
5271c349dbc7Sjsg 	}
5272c349dbc7Sjsg 
5273c349dbc7Sjsg 	return intel_modeset_synced_crtcs(state, conn);
5274c349dbc7Sjsg }
5275c349dbc7Sjsg 
52761bb76ff1Sjsg static void intel_dp_oob_hotplug_event(struct drm_connector *connector)
52771bb76ff1Sjsg {
52781bb76ff1Sjsg 	struct intel_encoder *encoder = intel_attached_encoder(to_intel_connector(connector));
52791bb76ff1Sjsg 	struct drm_i915_private *i915 = to_i915(connector->dev);
52801bb76ff1Sjsg 
52811bb76ff1Sjsg 	spin_lock_irq(&i915->irq_lock);
52821bb76ff1Sjsg 	i915->display.hotplug.event_bits |= BIT(encoder->hpd_pin);
52831bb76ff1Sjsg 	spin_unlock_irq(&i915->irq_lock);
5284f005ef32Sjsg 	queue_delayed_work(i915->unordered_wq, &i915->display.hotplug.hotplug_work, 0);
52851bb76ff1Sjsg }
52861bb76ff1Sjsg 
5287c349dbc7Sjsg static const struct drm_connector_funcs intel_dp_connector_funcs = {
5288c349dbc7Sjsg 	.force = intel_dp_force,
5289c349dbc7Sjsg 	.fill_modes = drm_helper_probe_single_connector_modes,
5290c349dbc7Sjsg 	.atomic_get_property = intel_digital_connector_atomic_get_property,
5291c349dbc7Sjsg 	.atomic_set_property = intel_digital_connector_atomic_set_property,
5292c349dbc7Sjsg 	.late_register = intel_dp_connector_register,
5293c349dbc7Sjsg 	.early_unregister = intel_dp_connector_unregister,
5294c349dbc7Sjsg 	.destroy = intel_connector_destroy,
5295c349dbc7Sjsg 	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
5296c349dbc7Sjsg 	.atomic_duplicate_state = intel_digital_connector_duplicate_state,
52971bb76ff1Sjsg 	.oob_hotplug_event = intel_dp_oob_hotplug_event,
5298c349dbc7Sjsg };
5299c349dbc7Sjsg 
5300c349dbc7Sjsg static const struct drm_connector_helper_funcs intel_dp_connector_helper_funcs = {
5301c349dbc7Sjsg 	.detect_ctx = intel_dp_detect,
5302c349dbc7Sjsg 	.get_modes = intel_dp_get_modes,
5303c349dbc7Sjsg 	.mode_valid = intel_dp_mode_valid,
5304c349dbc7Sjsg 	.atomic_check = intel_dp_connector_atomic_check,
5305c349dbc7Sjsg };
5306c349dbc7Sjsg 
5307ad8b1aafSjsg enum irqreturn
5308ad8b1aafSjsg intel_dp_hpd_pulse(struct intel_digital_port *dig_port, bool long_hpd)
5309ad8b1aafSjsg {
5310ad8b1aafSjsg 	struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
5311ad8b1aafSjsg 	struct intel_dp *intel_dp = &dig_port->dp;
5312ad8b1aafSjsg 
5313ad8b1aafSjsg 	if (dig_port->base.type == INTEL_OUTPUT_EDP &&
53149572d05fSjsg 	    (long_hpd || !intel_pps_have_panel_power_or_vdd(intel_dp))) {
5315c349dbc7Sjsg 		/*
5316ad8b1aafSjsg 		 * vdd off can generate a long/short pulse on eDP which
5317c349dbc7Sjsg 		 * would require vdd on to handle it, and thus we
5318c349dbc7Sjsg 		 * would end up in an endless cycle of
5319ad8b1aafSjsg 		 * "vdd off -> long/short hpd -> vdd on -> detect -> vdd off -> ..."
5320c349dbc7Sjsg 		 */
5321ad8b1aafSjsg 		drm_dbg_kms(&i915->drm,
5322ad8b1aafSjsg 			    "ignoring %s hpd on eDP [ENCODER:%d:%s]\n",
5323ad8b1aafSjsg 			    long_hpd ? "long" : "short",
5324ad8b1aafSjsg 			    dig_port->base.base.base.id,
5325ad8b1aafSjsg 			    dig_port->base.base.name);
5326c349dbc7Sjsg 		return IRQ_HANDLED;
5327c349dbc7Sjsg 	}
5328c349dbc7Sjsg 
5329ad8b1aafSjsg 	drm_dbg_kms(&i915->drm, "got hpd irq on [ENCODER:%d:%s] - %s\n",
5330ad8b1aafSjsg 		    dig_port->base.base.base.id,
5331ad8b1aafSjsg 		    dig_port->base.base.name,
5332c349dbc7Sjsg 		    long_hpd ? "long" : "short");
5333c349dbc7Sjsg 
5334c349dbc7Sjsg 	if (long_hpd) {
5335c349dbc7Sjsg 		intel_dp->reset_link_params = true;
5336c349dbc7Sjsg 		return IRQ_NONE;
5337c349dbc7Sjsg 	}
5338c349dbc7Sjsg 
5339c349dbc7Sjsg 	if (intel_dp->is_mst) {
5340ad8b1aafSjsg 		if (!intel_dp_check_mst_status(intel_dp))
5341c349dbc7Sjsg 			return IRQ_NONE;
5342ad8b1aafSjsg 	} else if (!intel_dp_short_pulse(intel_dp)) {
5343c349dbc7Sjsg 		return IRQ_NONE;
5344c349dbc7Sjsg 	}
5345c349dbc7Sjsg 
5346c349dbc7Sjsg 	return IRQ_HANDLED;
5347c349dbc7Sjsg }
5348c349dbc7Sjsg 
5349f005ef32Sjsg static bool _intel_dp_is_port_edp(struct drm_i915_private *dev_priv,
5350f005ef32Sjsg 				  const struct intel_bios_encoder_data *devdata,
5351f005ef32Sjsg 				  enum port port)
5352c349dbc7Sjsg {
5353c349dbc7Sjsg 	/*
5354c349dbc7Sjsg 	 * eDP not supported on g4x. so bail out early just
5355c349dbc7Sjsg 	 * for a bit extra safety in case the VBT is bonkers.
5356c349dbc7Sjsg 	 */
53575ca02815Sjsg 	if (DISPLAY_VER(dev_priv) < 5)
5358c349dbc7Sjsg 		return false;
5359c349dbc7Sjsg 
53605ca02815Sjsg 	if (DISPLAY_VER(dev_priv) < 9 && port == PORT_A)
5361c349dbc7Sjsg 		return true;
5362c349dbc7Sjsg 
5363f005ef32Sjsg 	return devdata && intel_bios_encoder_supports_edp(devdata);
5364f005ef32Sjsg }
5365f005ef32Sjsg 
5366f005ef32Sjsg bool intel_dp_is_port_edp(struct drm_i915_private *i915, enum port port)
5367f005ef32Sjsg {
5368f005ef32Sjsg 	const struct intel_bios_encoder_data *devdata =
5369f005ef32Sjsg 		intel_bios_encoder_data_lookup(i915, port);
5370f005ef32Sjsg 
5371f005ef32Sjsg 	return _intel_dp_is_port_edp(i915, devdata, port);
5372c349dbc7Sjsg }
5373c349dbc7Sjsg 
53741bb76ff1Sjsg static bool
5375f005ef32Sjsg has_gamut_metadata_dip(struct intel_encoder *encoder)
53761bb76ff1Sjsg {
5377f005ef32Sjsg 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
5378f005ef32Sjsg 	enum port port = encoder->port;
5379f005ef32Sjsg 
5380f005ef32Sjsg 	if (intel_bios_encoder_is_lspcon(encoder->devdata))
53811bb76ff1Sjsg 		return false;
53821bb76ff1Sjsg 
53831bb76ff1Sjsg 	if (DISPLAY_VER(i915) >= 11)
53841bb76ff1Sjsg 		return true;
53851bb76ff1Sjsg 
53861bb76ff1Sjsg 	if (port == PORT_A)
53871bb76ff1Sjsg 		return false;
53881bb76ff1Sjsg 
53891bb76ff1Sjsg 	if (IS_HASWELL(i915) || IS_BROADWELL(i915) ||
53901bb76ff1Sjsg 	    DISPLAY_VER(i915) >= 9)
53911bb76ff1Sjsg 		return true;
53921bb76ff1Sjsg 
53931bb76ff1Sjsg 	return false;
53941bb76ff1Sjsg }
53951bb76ff1Sjsg 
5396c349dbc7Sjsg static void
5397c349dbc7Sjsg intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connector)
5398c349dbc7Sjsg {
5399c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(connector->dev);
5400c349dbc7Sjsg 	enum port port = dp_to_dig_port(intel_dp)->base.port;
5401c349dbc7Sjsg 
5402ad8b1aafSjsg 	if (!intel_dp_is_edp(intel_dp))
5403ad8b1aafSjsg 		drm_connector_attach_dp_subconnector_property(connector);
5404ad8b1aafSjsg 
5405c349dbc7Sjsg 	if (!IS_G4X(dev_priv) && port != PORT_A)
5406c349dbc7Sjsg 		intel_attach_force_audio_property(connector);
5407c349dbc7Sjsg 
5408c349dbc7Sjsg 	intel_attach_broadcast_rgb_property(connector);
5409c349dbc7Sjsg 	if (HAS_GMCH(dev_priv))
5410c349dbc7Sjsg 		drm_connector_attach_max_bpc_property(connector, 6, 10);
54115ca02815Sjsg 	else if (DISPLAY_VER(dev_priv) >= 5)
5412c349dbc7Sjsg 		drm_connector_attach_max_bpc_property(connector, 6, 12);
5413c349dbc7Sjsg 
54145ca02815Sjsg 	/* Register HDMI colorspace for case of lspcon */
5415f005ef32Sjsg 	if (intel_bios_encoder_is_lspcon(dp_to_dig_port(intel_dp)->base.devdata)) {
54165ca02815Sjsg 		drm_connector_attach_content_type_property(connector);
54175ca02815Sjsg 		intel_attach_hdmi_colorspace_property(connector);
54185ca02815Sjsg 	} else {
54195ca02815Sjsg 		intel_attach_dp_colorspace_property(connector);
54205ca02815Sjsg 	}
5421c349dbc7Sjsg 
5422f005ef32Sjsg 	if (has_gamut_metadata_dip(&dp_to_dig_port(intel_dp)->base))
54231bb76ff1Sjsg 		drm_connector_attach_hdr_output_metadata_property(connector);
5424c349dbc7Sjsg 
54255ca02815Sjsg 	if (HAS_VRR(dev_priv))
54265ca02815Sjsg 		drm_connector_attach_vrr_capable_property(connector);
5427c349dbc7Sjsg }
5428c349dbc7Sjsg 
54291bb76ff1Sjsg static void
54301bb76ff1Sjsg intel_edp_add_properties(struct intel_dp *intel_dp)
54311bb76ff1Sjsg {
54321bb76ff1Sjsg 	struct intel_connector *connector = intel_dp->attached_connector;
54331bb76ff1Sjsg 	struct drm_i915_private *i915 = to_i915(connector->base.dev);
54341bb76ff1Sjsg 	const struct drm_display_mode *fixed_mode =
54351bb76ff1Sjsg 		intel_panel_preferred_fixed_mode(connector);
54361bb76ff1Sjsg 
5437f005ef32Sjsg 	intel_attach_scaling_mode_property(&connector->base);
54381bb76ff1Sjsg 
54391bb76ff1Sjsg 	drm_connector_set_panel_orientation_with_quirk(&connector->base,
54401bb76ff1Sjsg 						       i915->display.vbt.orientation,
54411bb76ff1Sjsg 						       fixed_mode->hdisplay,
54421bb76ff1Sjsg 						       fixed_mode->vdisplay);
54431bb76ff1Sjsg }
54441bb76ff1Sjsg 
5445f005ef32Sjsg static void intel_edp_backlight_setup(struct intel_dp *intel_dp,
5446f005ef32Sjsg 				      struct intel_connector *connector)
5447f005ef32Sjsg {
5448f005ef32Sjsg 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
5449f005ef32Sjsg 	enum pipe pipe = INVALID_PIPE;
5450f005ef32Sjsg 
5451f005ef32Sjsg 	if (IS_VALLEYVIEW(i915) || IS_CHERRYVIEW(i915)) {
5452f005ef32Sjsg 		/*
5453f005ef32Sjsg 		 * Figure out the current pipe for the initial backlight setup.
5454f005ef32Sjsg 		 * If the current pipe isn't valid, try the PPS pipe, and if that
5455f005ef32Sjsg 		 * fails just assume pipe A.
5456f005ef32Sjsg 		 */
5457f005ef32Sjsg 		pipe = vlv_active_pipe(intel_dp);
5458f005ef32Sjsg 
5459f005ef32Sjsg 		if (pipe != PIPE_A && pipe != PIPE_B)
5460f005ef32Sjsg 			pipe = intel_dp->pps.pps_pipe;
5461f005ef32Sjsg 
5462f005ef32Sjsg 		if (pipe != PIPE_A && pipe != PIPE_B)
5463f005ef32Sjsg 			pipe = PIPE_A;
5464f005ef32Sjsg 	}
5465f005ef32Sjsg 
5466f005ef32Sjsg 	intel_backlight_setup(connector, pipe);
5467f005ef32Sjsg }
5468f005ef32Sjsg 
5469c349dbc7Sjsg static bool intel_edp_init_connector(struct intel_dp *intel_dp,
5470c349dbc7Sjsg 				     struct intel_connector *intel_connector)
5471c349dbc7Sjsg {
5472c349dbc7Sjsg 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
5473c349dbc7Sjsg 	struct drm_connector *connector = &intel_connector->base;
54741bb76ff1Sjsg 	struct drm_display_mode *fixed_mode;
54751bb76ff1Sjsg 	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
5476c349dbc7Sjsg 	bool has_dpcd;
5477f005ef32Sjsg 	const struct drm_edid *drm_edid;
5478c349dbc7Sjsg 
5479c349dbc7Sjsg 	if (!intel_dp_is_edp(intel_dp))
5480c349dbc7Sjsg 		return true;
5481c349dbc7Sjsg 
5482c349dbc7Sjsg 	/*
5483c349dbc7Sjsg 	 * On IBX/CPT we may get here with LVDS already registered. Since the
5484c349dbc7Sjsg 	 * driver uses the only internal power sequencer available for both
5485c349dbc7Sjsg 	 * eDP and LVDS bail out early in this case to prevent interfering
5486c349dbc7Sjsg 	 * with an already powered-on LVDS power sequencer.
5487c349dbc7Sjsg 	 */
5488c349dbc7Sjsg 	if (intel_get_lvds_encoder(dev_priv)) {
5489f005ef32Sjsg 		drm_WARN_ON(&dev_priv->drm,
5490c349dbc7Sjsg 			    !(HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv)));
5491c349dbc7Sjsg 		drm_info(&dev_priv->drm,
5492c349dbc7Sjsg 			 "LVDS was detected, not registering eDP\n");
5493c349dbc7Sjsg 
5494c349dbc7Sjsg 		return false;
5495c349dbc7Sjsg 	}
5496c349dbc7Sjsg 
549726d05183Sjsg 	intel_bios_init_panel_early(dev_priv, &intel_connector->panel,
549826d05183Sjsg 				    encoder->devdata);
549926d05183Sjsg 
5500f005ef32Sjsg 	if (!intel_pps_init(intel_dp)) {
5501f005ef32Sjsg 		drm_info(&dev_priv->drm,
5502f005ef32Sjsg 			 "[ENCODER:%d:%s] unusable PPS, disabling eDP\n",
5503f005ef32Sjsg 			 encoder->base.base.id, encoder->base.name);
5504f005ef32Sjsg 		/*
5505f005ef32Sjsg 		 * The BIOS may have still enabled VDD on the PPS even
5506f005ef32Sjsg 		 * though it's unusable. Make sure we turn it back off
5507f005ef32Sjsg 		 * and to release the power domain references/etc.
5508f005ef32Sjsg 		 */
5509f005ef32Sjsg 		goto out_vdd_off;
5510f005ef32Sjsg 	}
5511f005ef32Sjsg 
5512f005ef32Sjsg 	/*
5513f005ef32Sjsg 	 * Enable HPD sense for live status check.
5514f005ef32Sjsg 	 * intel_hpd_irq_setup() will turn it off again
5515f005ef32Sjsg 	 * if it's no longer needed later.
5516f005ef32Sjsg 	 *
5517f005ef32Sjsg 	 * The DPCD probe below will make sure VDD is on.
5518f005ef32Sjsg 	 */
5519f005ef32Sjsg 	intel_hpd_enable_detection(encoder);
5520c349dbc7Sjsg 
5521c349dbc7Sjsg 	/* Cache DPCD and EDID for edp. */
5522c349dbc7Sjsg 	has_dpcd = intel_edp_init_dpcd(intel_dp);
5523c349dbc7Sjsg 
5524c349dbc7Sjsg 	if (!has_dpcd) {
5525c349dbc7Sjsg 		/* if this fails, presume the device is a ghost */
5526c349dbc7Sjsg 		drm_info(&dev_priv->drm,
5527f005ef32Sjsg 			 "[ENCODER:%d:%s] failed to retrieve link info, disabling eDP\n",
5528f005ef32Sjsg 			 encoder->base.base.id, encoder->base.name);
5529c349dbc7Sjsg 		goto out_vdd_off;
5530c349dbc7Sjsg 	}
5531c349dbc7Sjsg 
5532f005ef32Sjsg 	/*
5533f005ef32Sjsg 	 * VBT and straps are liars. Also check HPD as that seems
5534f005ef32Sjsg 	 * to be the most reliable piece of information available.
5535f005ef32Sjsg 	 *
5536f005ef32Sjsg 	 * ... expect on devices that forgot to hook HPD up for eDP
5537f005ef32Sjsg 	 * (eg. Acer Chromebook C710), so we'll check it only if multiple
5538f005ef32Sjsg 	 * ports are attempting to use the same AUX CH, according to VBT.
5539f005ef32Sjsg 	 */
5540f005ef32Sjsg 	if (intel_bios_dp_has_shared_aux_ch(encoder->devdata)) {
5541f005ef32Sjsg 		/*
5542f005ef32Sjsg 		 * If this fails, presume the DPCD answer came
5543f005ef32Sjsg 		 * from some other port using the same AUX CH.
5544f005ef32Sjsg 		 *
5545f005ef32Sjsg 		 * FIXME maybe cleaner to check this before the
5546f005ef32Sjsg 		 * DPCD read? Would need sort out the VDD handling...
5547f005ef32Sjsg 		 */
5548f005ef32Sjsg 		if (!intel_digital_port_connected(encoder)) {
5549f005ef32Sjsg 			drm_info(&dev_priv->drm,
5550f005ef32Sjsg 				 "[ENCODER:%d:%s] HPD is down, disabling eDP\n",
5551f005ef32Sjsg 				 encoder->base.base.id, encoder->base.name);
5552f005ef32Sjsg 			goto out_vdd_off;
5553f005ef32Sjsg 		}
5554f005ef32Sjsg 
5555f005ef32Sjsg 		/*
5556f005ef32Sjsg 		 * Unfortunately even the HPD based detection fails on
5557f005ef32Sjsg 		 * eg. Asus B360M-A (CFL+CNP), so as a last resort fall
5558f005ef32Sjsg 		 * back to checking for a VGA branch device. Only do this
5559f005ef32Sjsg 		 * on known affected platforms to minimize false positives.
5560f005ef32Sjsg 		 */
5561f005ef32Sjsg 		if (DISPLAY_VER(dev_priv) == 9 && drm_dp_is_branch(intel_dp->dpcd) &&
5562f005ef32Sjsg 		    (intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] & DP_DWN_STRM_PORT_TYPE_MASK) ==
5563f005ef32Sjsg 		    DP_DWN_STRM_PORT_TYPE_ANALOG) {
5564f005ef32Sjsg 			drm_info(&dev_priv->drm,
5565f005ef32Sjsg 				 "[ENCODER:%d:%s] VGA converter detected, disabling eDP\n",
5566f005ef32Sjsg 				 encoder->base.base.id, encoder->base.name);
5567f005ef32Sjsg 			goto out_vdd_off;
5568f005ef32Sjsg 		}
5569f005ef32Sjsg 	}
5570f005ef32Sjsg 
5571f005ef32Sjsg 	mutex_lock(&dev_priv->drm.mode_config.mutex);
5572f005ef32Sjsg 	drm_edid = drm_edid_read_ddc(connector, &intel_dp->aux.ddc);
5573f005ef32Sjsg 	if (!drm_edid) {
55741bb76ff1Sjsg 		/* Fallback to EDID from ACPI OpRegion, if any */
5575f005ef32Sjsg 		drm_edid = intel_opregion_get_edid(intel_connector);
5576f005ef32Sjsg 		if (drm_edid)
55771bb76ff1Sjsg 			drm_dbg_kms(&dev_priv->drm,
55781bb76ff1Sjsg 				    "[CONNECTOR:%d:%s] Using OpRegion EDID\n",
55791bb76ff1Sjsg 				    connector->base.id, connector->name);
55801bb76ff1Sjsg 	}
5581f005ef32Sjsg 	if (drm_edid) {
5582f005ef32Sjsg 		if (drm_edid_connector_update(connector, drm_edid) ||
5583f005ef32Sjsg 		    !drm_edid_connector_add_modes(connector)) {
5584f005ef32Sjsg 			drm_edid_connector_update(connector, NULL);
5585f005ef32Sjsg 			drm_edid_free(drm_edid);
5586f005ef32Sjsg 			drm_edid = ERR_PTR(-EINVAL);
5587c349dbc7Sjsg 		}
5588c349dbc7Sjsg 	} else {
5589f005ef32Sjsg 		drm_edid = ERR_PTR(-ENOENT);
5590c349dbc7Sjsg 	}
5591c349dbc7Sjsg 
5592f005ef32Sjsg 	intel_bios_init_panel_late(dev_priv, &intel_connector->panel, encoder->devdata,
5593f005ef32Sjsg 				   IS_ERR(drm_edid) ? NULL : drm_edid);
55941bb76ff1Sjsg 
559513315407Sjsg 	intel_panel_add_edid_fixed_modes(intel_connector, true);
55961bb76ff1Sjsg 
55971bb76ff1Sjsg 	/* MSO requires information from the EDID */
55981bb76ff1Sjsg 	intel_edp_mso_init(intel_dp);
5599c349dbc7Sjsg 
56005ca02815Sjsg 	/* multiply the mode clock and horizontal timings for MSO */
56011bb76ff1Sjsg 	list_for_each_entry(fixed_mode, &intel_connector->panel.fixed_modes, head)
56025ca02815Sjsg 		intel_edp_mso_mode_fixup(intel_connector, fixed_mode);
56035ca02815Sjsg 
5604c349dbc7Sjsg 	/* fallback to VBT if available for eDP */
56051bb76ff1Sjsg 	if (!intel_panel_preferred_fixed_mode(intel_connector))
56061bb76ff1Sjsg 		intel_panel_add_vbt_lfp_fixed_mode(intel_connector);
56071bb76ff1Sjsg 
5608f005ef32Sjsg 	mutex_unlock(&dev_priv->drm.mode_config.mutex);
5609c349dbc7Sjsg 
5610f005ef32Sjsg 	if (!intel_panel_preferred_fixed_mode(intel_connector)) {
5611f005ef32Sjsg 		drm_info(&dev_priv->drm,
5612f005ef32Sjsg 			 "[ENCODER:%d:%s] failed to find fixed mode for the panel, disabling eDP\n",
5613f005ef32Sjsg 			 encoder->base.base.id, encoder->base.name);
5614f005ef32Sjsg 		goto out_vdd_off;
5615c349dbc7Sjsg 	}
5616c349dbc7Sjsg 
5617f005ef32Sjsg 	intel_panel_init(intel_connector, drm_edid);
5618c349dbc7Sjsg 
5619f005ef32Sjsg 	intel_edp_backlight_setup(intel_dp, intel_connector);
56201bb76ff1Sjsg 
56211bb76ff1Sjsg 	intel_edp_add_properties(intel_dp);
56221bb76ff1Sjsg 
56231bb76ff1Sjsg 	intel_pps_init_late(intel_dp);
5624c349dbc7Sjsg 
5625c349dbc7Sjsg 	return true;
5626c349dbc7Sjsg 
5627c349dbc7Sjsg out_vdd_off:
56285ca02815Sjsg 	intel_pps_vdd_off_sync(intel_dp);
5629c349dbc7Sjsg 
5630c349dbc7Sjsg 	return false;
5631c349dbc7Sjsg }
5632c349dbc7Sjsg 
5633c349dbc7Sjsg static void intel_dp_modeset_retry_work_fn(struct work_struct *work)
5634c349dbc7Sjsg {
5635c349dbc7Sjsg 	struct intel_connector *intel_connector;
5636c349dbc7Sjsg 	struct drm_connector *connector;
5637c349dbc7Sjsg 
5638c349dbc7Sjsg 	intel_connector = container_of(work, typeof(*intel_connector),
5639c349dbc7Sjsg 				       modeset_retry_work);
5640c349dbc7Sjsg 	connector = &intel_connector->base;
56411bb76ff1Sjsg 	drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s]\n", connector->base.id,
5642c349dbc7Sjsg 		    connector->name);
5643c349dbc7Sjsg 
5644c349dbc7Sjsg 	/* Grab the locks before changing connector property*/
5645c349dbc7Sjsg 	mutex_lock(&connector->dev->mode_config.mutex);
5646c349dbc7Sjsg 	/* Set connector link status to BAD and send a Uevent to notify
5647c349dbc7Sjsg 	 * userspace to do a modeset.
5648c349dbc7Sjsg 	 */
5649c349dbc7Sjsg 	drm_connector_set_link_status_property(connector,
5650c349dbc7Sjsg 					       DRM_MODE_LINK_STATUS_BAD);
5651c349dbc7Sjsg 	mutex_unlock(&connector->dev->mode_config.mutex);
5652c349dbc7Sjsg 	/* Send Hotplug uevent so userspace can reprobe */
56531bb76ff1Sjsg 	drm_kms_helper_connector_hotplug_event(connector);
5654c349dbc7Sjsg }
5655c349dbc7Sjsg 
5656c349dbc7Sjsg bool
5657ad8b1aafSjsg intel_dp_init_connector(struct intel_digital_port *dig_port,
5658c349dbc7Sjsg 			struct intel_connector *intel_connector)
5659c349dbc7Sjsg {
5660c349dbc7Sjsg 	struct drm_connector *connector = &intel_connector->base;
5661ad8b1aafSjsg 	struct intel_dp *intel_dp = &dig_port->dp;
5662ad8b1aafSjsg 	struct intel_encoder *intel_encoder = &dig_port->base;
5663c349dbc7Sjsg 	struct drm_device *dev = intel_encoder->base.dev;
5664c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(dev);
5665c349dbc7Sjsg 	enum port port = intel_encoder->port;
5666c349dbc7Sjsg 	enum phy phy = intel_port_to_phy(dev_priv, port);
5667c349dbc7Sjsg 	int type;
5668c349dbc7Sjsg 
5669c349dbc7Sjsg 	/* Initialize the work for modeset in case of link train failure */
5670c349dbc7Sjsg 	INIT_WORK(&intel_connector->modeset_retry_work,
5671c349dbc7Sjsg 		  intel_dp_modeset_retry_work_fn);
5672c349dbc7Sjsg 
5673ad8b1aafSjsg 	if (drm_WARN(dev, dig_port->max_lanes < 1,
5674c349dbc7Sjsg 		     "Not enough lanes (%d) for DP on [ENCODER:%d:%s]\n",
5675ad8b1aafSjsg 		     dig_port->max_lanes, intel_encoder->base.base.id,
5676c349dbc7Sjsg 		     intel_encoder->base.name))
5677c349dbc7Sjsg 		return false;
5678c349dbc7Sjsg 
5679c349dbc7Sjsg 	intel_dp->reset_link_params = true;
56805ca02815Sjsg 	intel_dp->pps.pps_pipe = INVALID_PIPE;
56815ca02815Sjsg 	intel_dp->pps.active_pipe = INVALID_PIPE;
5682c349dbc7Sjsg 
5683c349dbc7Sjsg 	/* Preserve the current hw state. */
5684c349dbc7Sjsg 	intel_dp->DP = intel_de_read(dev_priv, intel_dp->output_reg);
5685c349dbc7Sjsg 	intel_dp->attached_connector = intel_connector;
5686c349dbc7Sjsg 
5687f005ef32Sjsg 	if (_intel_dp_is_port_edp(dev_priv, intel_encoder->devdata, port)) {
5688c349dbc7Sjsg 		/*
5689c349dbc7Sjsg 		 * Currently we don't support eDP on TypeC ports, although in
5690c349dbc7Sjsg 		 * theory it could work on TypeC legacy ports.
5691c349dbc7Sjsg 		 */
5692c349dbc7Sjsg 		drm_WARN_ON(dev, intel_phy_is_tc(dev_priv, phy));
5693c349dbc7Sjsg 		type = DRM_MODE_CONNECTOR_eDP;
5694c349dbc7Sjsg 		intel_encoder->type = INTEL_OUTPUT_EDP;
5695c349dbc7Sjsg 
5696c349dbc7Sjsg 		/* eDP only on port B and/or C on vlv/chv */
5697c349dbc7Sjsg 		if (drm_WARN_ON(dev, (IS_VALLEYVIEW(dev_priv) ||
5698c349dbc7Sjsg 				      IS_CHERRYVIEW(dev_priv)) &&
5699c349dbc7Sjsg 				port != PORT_B && port != PORT_C))
5700c349dbc7Sjsg 			return false;
57011bb76ff1Sjsg 	} else {
57021bb76ff1Sjsg 		type = DRM_MODE_CONNECTOR_DisplayPort;
57031bb76ff1Sjsg 	}
57041bb76ff1Sjsg 
57051bb76ff1Sjsg 	intel_dp_set_default_sink_rates(intel_dp);
57061bb76ff1Sjsg 	intel_dp_set_default_max_sink_lane_count(intel_dp);
57071bb76ff1Sjsg 
57081bb76ff1Sjsg 	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
57091bb76ff1Sjsg 		intel_dp->pps.active_pipe = vlv_active_pipe(intel_dp);
5710c349dbc7Sjsg 
5711c349dbc7Sjsg 	drm_dbg_kms(&dev_priv->drm,
5712c349dbc7Sjsg 		    "Adding %s connector on [ENCODER:%d:%s]\n",
5713c349dbc7Sjsg 		    type == DRM_MODE_CONNECTOR_eDP ? "eDP" : "DP",
5714c349dbc7Sjsg 		    intel_encoder->base.base.id, intel_encoder->base.name);
5715c349dbc7Sjsg 
5716c349dbc7Sjsg 	drm_connector_init(dev, connector, &intel_dp_connector_funcs, type);
5717c349dbc7Sjsg 	drm_connector_helper_add(connector, &intel_dp_connector_helper_funcs);
5718c349dbc7Sjsg 
5719f005ef32Sjsg 	if (!HAS_GMCH(dev_priv) && DISPLAY_VER(dev_priv) < 12)
5720c349dbc7Sjsg 		connector->interlace_allowed = true;
5721c349dbc7Sjsg 
5722c349dbc7Sjsg 	intel_connector->polled = DRM_CONNECTOR_POLL_HPD;
5723c349dbc7Sjsg 
5724c349dbc7Sjsg 	intel_dp_aux_init(intel_dp);
5725c349dbc7Sjsg 
5726c349dbc7Sjsg 	intel_connector_attach_encoder(intel_connector, intel_encoder);
5727c349dbc7Sjsg 
5728c349dbc7Sjsg 	if (HAS_DDI(dev_priv))
5729c349dbc7Sjsg 		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
5730c349dbc7Sjsg 	else
5731c349dbc7Sjsg 		intel_connector->get_hw_state = intel_connector_get_hw_state;
5732c349dbc7Sjsg 
57331bb76ff1Sjsg 	if (!intel_edp_init_connector(intel_dp, intel_connector)) {
57341bb76ff1Sjsg 		intel_dp_aux_fini(intel_dp);
57351bb76ff1Sjsg 		goto fail;
57361bb76ff1Sjsg 	}
57371bb76ff1Sjsg 
57381bb76ff1Sjsg 	intel_dp_set_source_rates(intel_dp);
57391bb76ff1Sjsg 	intel_dp_set_common_rates(intel_dp);
57401bb76ff1Sjsg 	intel_dp_reset_max_link_params(intel_dp);
57411bb76ff1Sjsg 
5742c349dbc7Sjsg 	/* init MST on ports that can support it */
5743ad8b1aafSjsg 	intel_dp_mst_encoder_init(dig_port,
5744c349dbc7Sjsg 				  intel_connector->base.base.id);
5745c349dbc7Sjsg 
5746c349dbc7Sjsg 	intel_dp_add_properties(intel_dp, connector);
5747c349dbc7Sjsg 
5748c349dbc7Sjsg 	if (is_hdcp_supported(dev_priv, port) && !intel_dp_is_edp(intel_dp)) {
57495ca02815Sjsg 		int ret = intel_dp_hdcp_init(dig_port, intel_connector);
5750c349dbc7Sjsg 		if (ret)
5751c349dbc7Sjsg 			drm_dbg_kms(&dev_priv->drm,
5752c349dbc7Sjsg 				    "HDCP init failed, skipping.\n");
5753c349dbc7Sjsg 	}
5754c349dbc7Sjsg 
5755c349dbc7Sjsg 	/* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
5756c349dbc7Sjsg 	 * 0xd.  Failure to do so will result in spurious interrupts being
5757c349dbc7Sjsg 	 * generated on the port when a cable is not attached.
5758c349dbc7Sjsg 	 */
5759c349dbc7Sjsg 	if (IS_G45(dev_priv)) {
5760c349dbc7Sjsg 		u32 temp = intel_de_read(dev_priv, PEG_BAND_GAP_DATA);
5761c349dbc7Sjsg 		intel_de_write(dev_priv, PEG_BAND_GAP_DATA,
5762c349dbc7Sjsg 			       (temp & ~0xf) | 0xd);
5763c349dbc7Sjsg 	}
5764c349dbc7Sjsg 
57655ca02815Sjsg 	intel_dp->frl.is_trained = false;
57665ca02815Sjsg 	intel_dp->frl.trained_rate_gbps = 0;
57675ca02815Sjsg 
57685ca02815Sjsg 	intel_psr_init(intel_dp);
57695ca02815Sjsg 
5770c349dbc7Sjsg 	return true;
5771c349dbc7Sjsg 
5772c349dbc7Sjsg fail:
5773f005ef32Sjsg 	intel_display_power_flush_work(dev_priv);
5774c349dbc7Sjsg 	drm_connector_cleanup(connector);
5775c349dbc7Sjsg 
5776c349dbc7Sjsg 	return false;
5777c349dbc7Sjsg }
5778c349dbc7Sjsg 
5779c349dbc7Sjsg void intel_dp_mst_suspend(struct drm_i915_private *dev_priv)
5780c349dbc7Sjsg {
5781c349dbc7Sjsg 	struct intel_encoder *encoder;
5782c349dbc7Sjsg 
57835ca02815Sjsg 	if (!HAS_DISPLAY(dev_priv))
57845ca02815Sjsg 		return;
57855ca02815Sjsg 
5786c349dbc7Sjsg 	for_each_intel_encoder(&dev_priv->drm, encoder) {
5787c349dbc7Sjsg 		struct intel_dp *intel_dp;
5788c349dbc7Sjsg 
5789c349dbc7Sjsg 		if (encoder->type != INTEL_OUTPUT_DDI)
5790c349dbc7Sjsg 			continue;
5791c349dbc7Sjsg 
5792c349dbc7Sjsg 		intel_dp = enc_to_intel_dp(encoder);
5793c349dbc7Sjsg 
57941bb76ff1Sjsg 		if (!intel_dp_mst_source_support(intel_dp))
5795c349dbc7Sjsg 			continue;
5796c349dbc7Sjsg 
5797c349dbc7Sjsg 		if (intel_dp->is_mst)
5798c349dbc7Sjsg 			drm_dp_mst_topology_mgr_suspend(&intel_dp->mst_mgr);
5799c349dbc7Sjsg 	}
5800c349dbc7Sjsg }
5801c349dbc7Sjsg 
5802c349dbc7Sjsg void intel_dp_mst_resume(struct drm_i915_private *dev_priv)
5803c349dbc7Sjsg {
5804c349dbc7Sjsg 	struct intel_encoder *encoder;
5805c349dbc7Sjsg 
58065ca02815Sjsg 	if (!HAS_DISPLAY(dev_priv))
58075ca02815Sjsg 		return;
58085ca02815Sjsg 
5809c349dbc7Sjsg 	for_each_intel_encoder(&dev_priv->drm, encoder) {
5810c349dbc7Sjsg 		struct intel_dp *intel_dp;
5811c349dbc7Sjsg 		int ret;
5812c349dbc7Sjsg 
5813c349dbc7Sjsg 		if (encoder->type != INTEL_OUTPUT_DDI)
5814c349dbc7Sjsg 			continue;
5815c349dbc7Sjsg 
5816c349dbc7Sjsg 		intel_dp = enc_to_intel_dp(encoder);
5817c349dbc7Sjsg 
58181bb76ff1Sjsg 		if (!intel_dp_mst_source_support(intel_dp))
5819c349dbc7Sjsg 			continue;
5820c349dbc7Sjsg 
5821c349dbc7Sjsg 		ret = drm_dp_mst_topology_mgr_resume(&intel_dp->mst_mgr,
5822c349dbc7Sjsg 						     true);
5823c349dbc7Sjsg 		if (ret) {
5824c349dbc7Sjsg 			intel_dp->is_mst = false;
5825c349dbc7Sjsg 			drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
5826c349dbc7Sjsg 							false);
5827c349dbc7Sjsg 		}
5828c349dbc7Sjsg 	}
5829c349dbc7Sjsg }
5830