blob: 71721de39e6ba545aa714c944fa35c860b61da05 [file] [log] [blame]
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001/*
2 * Copyright © 2008 Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 *
23 * Authors:
24 * Keith Packard <keithp@keithp.com>
25 *
26 */
27
28#include <linux/i2c.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090029#include <linux/slab.h>
Paul Gortmaker2d1a8a42011-08-30 18:16:33 -040030#include <linux/export.h>
Manasi Navare611032b2017-01-24 08:21:49 -080031#include <linux/types.h>
Clint Taylor01527b32014-07-07 13:01:46 -070032#include <linux/notifier.h>
33#include <linux/reboot.h>
Manasi Navare611032b2017-01-24 08:21:49 -080034#include <asm/byteorder.h>
David Howells760285e2012-10-02 18:01:07 +010035#include <drm/drmP.h>
Matt Roperc6f95f22015-01-22 16:50:32 -080036#include <drm/drm_atomic_helper.h>
David Howells760285e2012-10-02 18:01:07 +010037#include <drm/drm_crtc.h>
38#include <drm/drm_crtc_helper.h>
39#include <drm/drm_edid.h>
Keith Packarda4fc5ed2009-04-07 16:16:42 -070040#include "intel_drv.h"
David Howells760285e2012-10-02 18:01:07 +010041#include <drm/i915_drm.h>
Keith Packarda4fc5ed2009-04-07 16:16:42 -070042#include "i915_drv.h"
Keith Packarda4fc5ed2009-04-07 16:16:42 -070043
Keith Packarda4fc5ed2009-04-07 16:16:42 -070044#define DP_LINK_CHECK_TIMEOUT (10 * 1000)
Pandiyan, Dhinakarane8b25772017-09-18 15:21:39 -070045#define DP_DPRX_ESI_LEN 14
Keith Packarda4fc5ed2009-04-07 16:16:42 -070046
Todd Previte559be302015-05-04 07:48:20 -070047/* Compliance test status bits */
48#define INTEL_DP_RESOLUTION_SHIFT_MASK 0
49#define INTEL_DP_RESOLUTION_PREFERRED (1 << INTEL_DP_RESOLUTION_SHIFT_MASK)
50#define INTEL_DP_RESOLUTION_STANDARD (2 << INTEL_DP_RESOLUTION_SHIFT_MASK)
51#define INTEL_DP_RESOLUTION_FAILSAFE (3 << INTEL_DP_RESOLUTION_SHIFT_MASK)
52
Chon Ming Lee9dd4ffd2013-09-04 01:30:37 +080053struct dp_link_dpll {
Ville Syrjälä840b32b2015-08-11 20:21:46 +030054 int clock;
Chon Ming Lee9dd4ffd2013-09-04 01:30:37 +080055 struct dpll dpll;
56};
57
58static const struct dp_link_dpll gen4_dpll[] = {
Ville Syrjälä840b32b2015-08-11 20:21:46 +030059 { 162000,
Chon Ming Lee9dd4ffd2013-09-04 01:30:37 +080060 { .p1 = 2, .p2 = 10, .n = 2, .m1 = 23, .m2 = 8 } },
Ville Syrjälä840b32b2015-08-11 20:21:46 +030061 { 270000,
Chon Ming Lee9dd4ffd2013-09-04 01:30:37 +080062 { .p1 = 1, .p2 = 10, .n = 1, .m1 = 14, .m2 = 2 } }
63};
64
65static const struct dp_link_dpll pch_dpll[] = {
Ville Syrjälä840b32b2015-08-11 20:21:46 +030066 { 162000,
Chon Ming Lee9dd4ffd2013-09-04 01:30:37 +080067 { .p1 = 2, .p2 = 10, .n = 1, .m1 = 12, .m2 = 9 } },
Ville Syrjälä840b32b2015-08-11 20:21:46 +030068 { 270000,
Chon Ming Lee9dd4ffd2013-09-04 01:30:37 +080069 { .p1 = 1, .p2 = 10, .n = 2, .m1 = 14, .m2 = 8 } }
70};
71
Chon Ming Lee65ce4bf2013-09-04 01:30:38 +080072static const struct dp_link_dpll vlv_dpll[] = {
Ville Syrjälä840b32b2015-08-11 20:21:46 +030073 { 162000,
Chon Ming Lee58f6e632013-09-25 15:47:51 +080074 { .p1 = 3, .p2 = 2, .n = 5, .m1 = 3, .m2 = 81 } },
Ville Syrjälä840b32b2015-08-11 20:21:46 +030075 { 270000,
Chon Ming Lee65ce4bf2013-09-04 01:30:38 +080076 { .p1 = 2, .p2 = 2, .n = 1, .m1 = 2, .m2 = 27 } }
77};
78
Chon Ming Leeef9348c2014-04-09 13:28:18 +030079/*
80 * CHV supports eDP 1.4 that have more link rates.
81 * Below only provides the fixed rate but exclude variable rate.
82 */
83static const struct dp_link_dpll chv_dpll[] = {
84 /*
85 * CHV requires to program fractional division for m2.
86 * m2 is stored in fixed point format using formula below
87 * (m2_int << 22) | m2_fraction
88 */
Ville Syrjälä840b32b2015-08-11 20:21:46 +030089 { 162000, /* m2_int = 32, m2_fraction = 1677722 */
Chon Ming Leeef9348c2014-04-09 13:28:18 +030090 { .p1 = 4, .p2 = 2, .n = 1, .m1 = 2, .m2 = 0x819999a } },
Ville Syrjälä840b32b2015-08-11 20:21:46 +030091 { 270000, /* m2_int = 27, m2_fraction = 0 */
Chon Ming Leeef9348c2014-04-09 13:28:18 +030092 { .p1 = 4, .p2 = 1, .n = 1, .m1 = 2, .m2 = 0x6c00000 } },
Ville Syrjälä840b32b2015-08-11 20:21:46 +030093 { 540000, /* m2_int = 27, m2_fraction = 0 */
Chon Ming Leeef9348c2014-04-09 13:28:18 +030094 { .p1 = 2, .p2 = 1, .n = 1, .m1 = 2, .m2 = 0x6c00000 } }
95};
Sonika Jindal637a9c62015-05-07 09:52:08 +053096
Sonika Jindal64987fc2015-05-26 17:50:13 +053097static const int bxt_rates[] = { 162000, 216000, 243000, 270000,
98 324000, 432000, 540000 };
Sonika Jindal637a9c62015-05-07 09:52:08 +053099static const int skl_rates[] = { 162000, 216000, 270000,
Ville Syrjäläf4896f12015-03-12 17:10:27 +0200100 324000, 432000, 540000 };
Rodrigo Vivid907b662017-08-10 15:40:08 -0700101static const int cnl_rates[] = { 162000, 216000, 270000,
102 324000, 432000, 540000,
103 648000, 810000 };
Ville Syrjäläf4896f12015-03-12 17:10:27 +0200104static const int default_rates[] = { 162000, 270000, 540000 };
Chon Ming Leeef9348c2014-04-09 13:28:18 +0300105
Jesse Barnescfcb0fc2010-10-07 16:01:06 -0700106/**
Jani Nikula1853a9d2017-08-18 12:30:20 +0300107 * intel_dp_is_edp - is the given port attached to an eDP panel (either CPU or PCH)
Jesse Barnescfcb0fc2010-10-07 16:01:06 -0700108 * @intel_dp: DP struct
109 *
110 * If a CPU or PCH DP output is attached to an eDP panel, this function
111 * will return true, and false otherwise.
112 */
Jani Nikula1853a9d2017-08-18 12:30:20 +0300113bool intel_dp_is_edp(struct intel_dp *intel_dp)
Jesse Barnescfcb0fc2010-10-07 16:01:06 -0700114{
Paulo Zanonida63a9f2012-10-26 19:05:46 -0200115 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
116
117 return intel_dig_port->base.type == INTEL_OUTPUT_EDP;
Jesse Barnescfcb0fc2010-10-07 16:01:06 -0700118}
119
Imre Deak68b4d822013-05-08 13:14:06 +0300120static struct drm_device *intel_dp_to_dev(struct intel_dp *intel_dp)
Jesse Barnescfcb0fc2010-10-07 16:01:06 -0700121{
Imre Deak68b4d822013-05-08 13:14:06 +0300122 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
123
124 return intel_dig_port->base.base.dev;
Jesse Barnescfcb0fc2010-10-07 16:01:06 -0700125}
126
Chris Wilsondf0e9242010-09-09 16:20:55 +0100127static struct intel_dp *intel_attached_dp(struct drm_connector *connector)
128{
Paulo Zanonifa90ece2012-10-26 19:05:44 -0200129 return enc_to_intel_dp(&intel_attached_encoder(connector)->base);
Chris Wilsondf0e9242010-09-09 16:20:55 +0100130}
131
Ville Syrjäläadc10302017-10-31 22:51:14 +0200132static void intel_dp_link_down(struct intel_encoder *encoder,
133 const struct intel_crtc_state *old_crtc_state);
Ville Syrjälä1e0560e2014-08-19 13:24:25 +0300134static bool edp_panel_vdd_on(struct intel_dp *intel_dp);
Daniel Vetter4be73782014-01-17 14:39:48 +0100135static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync);
Ville Syrjäläadc10302017-10-31 22:51:14 +0200136static void vlv_init_panel_power_sequencer(struct intel_encoder *encoder,
137 const struct intel_crtc_state *crtc_state);
Ville Syrjälä46bd8382017-10-31 22:51:22 +0200138static void vlv_steal_power_sequencer(struct drm_i915_private *dev_priv,
Ville Syrjäläa8c33442014-10-16 21:29:59 +0300139 enum pipe pipe);
Shubhangi Shrivastavaf21a2192016-03-30 18:05:22 +0530140static void intel_dp_unset_edid(struct intel_dp *intel_dp);
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700141
Jani Nikula68f357c2017-03-28 17:59:05 +0300142/* update sink rates from dpcd */
143static void intel_dp_set_sink_rates(struct intel_dp *intel_dp)
144{
Jani Nikulaa8a08882017-10-09 12:29:59 +0300145 int i, max_rate;
Jani Nikula68f357c2017-03-28 17:59:05 +0300146
Jani Nikulaa8a08882017-10-09 12:29:59 +0300147 max_rate = drm_dp_bw_code_to_link_rate(intel_dp->dpcd[DP_MAX_LINK_RATE]);
Jani Nikula68f357c2017-03-28 17:59:05 +0300148
Jani Nikulaa8a08882017-10-09 12:29:59 +0300149 for (i = 0; i < ARRAY_SIZE(default_rates); i++) {
150 if (default_rates[i] > max_rate)
151 break;
Jani Nikula68f357c2017-03-28 17:59:05 +0300152 intel_dp->sink_rates[i] = default_rates[i];
Jani Nikulaa8a08882017-10-09 12:29:59 +0300153 }
Jani Nikula68f357c2017-03-28 17:59:05 +0300154
Jani Nikulaa8a08882017-10-09 12:29:59 +0300155 intel_dp->num_sink_rates = i;
Jani Nikula68f357c2017-03-28 17:59:05 +0300156}
157
Jani Nikula540b0b7f2017-04-06 16:44:13 +0300158/* Theoretical max between source and sink */
159static int intel_dp_max_common_rate(struct intel_dp *intel_dp)
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700160{
Jani Nikula540b0b7f2017-04-06 16:44:13 +0300161 return intel_dp->common_rates[intel_dp->num_common_rates - 1];
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700162}
163
Jani Nikula540b0b7f2017-04-06 16:44:13 +0300164/* Theoretical max between source and sink */
165static int intel_dp_max_common_lane_count(struct intel_dp *intel_dp)
Paulo Zanonieeb63242014-05-06 14:56:50 +0300166{
167 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Jani Nikula540b0b7f2017-04-06 16:44:13 +0300168 int source_max = intel_dig_port->max_lanes;
169 int sink_max = drm_dp_max_lane_count(intel_dp->dpcd);
Paulo Zanonieeb63242014-05-06 14:56:50 +0300170
171 return min(source_max, sink_max);
172}
173
Jani Nikula3d65a732017-04-06 16:44:14 +0300174int intel_dp_max_lane_count(struct intel_dp *intel_dp)
Jani Nikula540b0b7f2017-04-06 16:44:13 +0300175{
176 return intel_dp->max_link_lane_count;
177}
178
Dhinakaran Pandiyan22a2c8e2016-11-15 12:59:06 -0800179int
Keith Packardc8982612012-01-25 08:16:25 -0800180intel_dp_link_required(int pixel_clock, int bpp)
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700181{
Dhinakaran Pandiyanfd81c442016-11-14 13:50:20 -0800182 /* pixel_clock is in kHz, divide bpp by 8 for bit to Byte conversion */
183 return DIV_ROUND_UP(pixel_clock * bpp, 8);
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700184}
185
Dhinakaran Pandiyan22a2c8e2016-11-15 12:59:06 -0800186int
Dave Airliefe27d532010-06-30 11:46:17 +1000187intel_dp_max_data_rate(int max_link_clock, int max_lanes)
188{
Dhinakaran Pandiyanfd81c442016-11-14 13:50:20 -0800189 /* max_link_clock is the link symbol clock (LS_Clk) in kHz and not the
190 * link rate that is generally expressed in Gbps. Since, 8 bits of data
191 * is transmitted every LS_Clk per lane, there is no need to account for
192 * the channel encoding that is done in the PHY layer here.
193 */
194
195 return max_link_clock * max_lanes;
Dave Airliefe27d532010-06-30 11:46:17 +1000196}
197
Mika Kahola70ec0642016-09-09 14:10:55 +0300198static int
199intel_dp_downstream_max_dotclock(struct intel_dp *intel_dp)
200{
201 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
202 struct intel_encoder *encoder = &intel_dig_port->base;
203 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
204 int max_dotclk = dev_priv->max_dotclk_freq;
205 int ds_max_dotclk;
206
207 int type = intel_dp->downstream_ports[0] & DP_DS_PORT_TYPE_MASK;
208
209 if (type != DP_DS_PORT_TYPE_VGA)
210 return max_dotclk;
211
212 ds_max_dotclk = drm_dp_downstream_max_clock(intel_dp->dpcd,
213 intel_dp->downstream_ports);
214
215 if (ds_max_dotclk != 0)
216 max_dotclk = min(max_dotclk, ds_max_dotclk);
217
218 return max_dotclk;
219}
220
Jani Nikula55cfc582017-03-28 17:59:04 +0300221static void
222intel_dp_set_source_rates(struct intel_dp *intel_dp)
Navare, Manasi D40dba342016-10-26 16:25:55 -0700223{
224 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
225 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
Ville Syrjälä8f4f2792017-11-09 17:24:34 +0200226 enum port port = dig_port->base.port;
Jani Nikula55cfc582017-03-28 17:59:04 +0300227 const int *source_rates;
Navare, Manasi D40dba342016-10-26 16:25:55 -0700228 int size;
Rodrigo Vivid907b662017-08-10 15:40:08 -0700229 u32 voltage;
Navare, Manasi D40dba342016-10-26 16:25:55 -0700230
Jani Nikula55cfc582017-03-28 17:59:04 +0300231 /* This should only be done once */
232 WARN_ON(intel_dp->source_rates || intel_dp->num_source_rates);
233
Ander Conselvan de Oliveiracc3f90f2016-12-02 10:23:49 +0200234 if (IS_GEN9_LP(dev_priv)) {
Jani Nikula55cfc582017-03-28 17:59:04 +0300235 source_rates = bxt_rates;
Navare, Manasi D40dba342016-10-26 16:25:55 -0700236 size = ARRAY_SIZE(bxt_rates);
Rodrigo Vivid907b662017-08-10 15:40:08 -0700237 } else if (IS_CANNONLAKE(dev_priv)) {
238 source_rates = cnl_rates;
239 size = ARRAY_SIZE(cnl_rates);
240 voltage = I915_READ(CNL_PORT_COMP_DW3) & VOLTAGE_INFO_MASK;
241 if (port == PORT_A || port == PORT_D ||
242 voltage == VOLTAGE_INFO_0_85V)
243 size -= 2;
Rodrigo Vivib976dc52017-01-23 10:32:37 -0800244 } else if (IS_GEN9_BC(dev_priv)) {
Jani Nikula55cfc582017-03-28 17:59:04 +0300245 source_rates = skl_rates;
Navare, Manasi D40dba342016-10-26 16:25:55 -0700246 size = ARRAY_SIZE(skl_rates);
Jani Nikulafc603ca2017-10-09 12:29:58 +0300247 } else if ((IS_HASWELL(dev_priv) && !IS_HSW_ULX(dev_priv)) ||
248 IS_BROADWELL(dev_priv)) {
Jani Nikula55cfc582017-03-28 17:59:04 +0300249 source_rates = default_rates;
Navare, Manasi D40dba342016-10-26 16:25:55 -0700250 size = ARRAY_SIZE(default_rates);
Jani Nikulafc603ca2017-10-09 12:29:58 +0300251 } else {
252 source_rates = default_rates;
253 size = ARRAY_SIZE(default_rates) - 1;
Navare, Manasi D40dba342016-10-26 16:25:55 -0700254 }
255
Jani Nikula55cfc582017-03-28 17:59:04 +0300256 intel_dp->source_rates = source_rates;
257 intel_dp->num_source_rates = size;
Navare, Manasi D40dba342016-10-26 16:25:55 -0700258}
259
260static int intersect_rates(const int *source_rates, int source_len,
261 const int *sink_rates, int sink_len,
262 int *common_rates)
263{
264 int i = 0, j = 0, k = 0;
265
266 while (i < source_len && j < sink_len) {
267 if (source_rates[i] == sink_rates[j]) {
268 if (WARN_ON(k >= DP_MAX_SUPPORTED_RATES))
269 return k;
270 common_rates[k] = source_rates[i];
271 ++k;
272 ++i;
273 ++j;
274 } else if (source_rates[i] < sink_rates[j]) {
275 ++i;
276 } else {
277 ++j;
278 }
279 }
280 return k;
281}
282
Jani Nikula8001b752017-03-28 17:59:03 +0300283/* return index of rate in rates array, or -1 if not found */
284static int intel_dp_rate_index(const int *rates, int len, int rate)
285{
286 int i;
287
288 for (i = 0; i < len; i++)
289 if (rate == rates[i])
290 return i;
291
292 return -1;
293}
294
Jani Nikula975ee5fca2017-04-06 16:44:10 +0300295static void intel_dp_set_common_rates(struct intel_dp *intel_dp)
Navare, Manasi D40dba342016-10-26 16:25:55 -0700296{
Jani Nikula975ee5fca2017-04-06 16:44:10 +0300297 WARN_ON(!intel_dp->num_source_rates || !intel_dp->num_sink_rates);
Navare, Manasi D40dba342016-10-26 16:25:55 -0700298
Jani Nikula975ee5fca2017-04-06 16:44:10 +0300299 intel_dp->num_common_rates = intersect_rates(intel_dp->source_rates,
300 intel_dp->num_source_rates,
301 intel_dp->sink_rates,
302 intel_dp->num_sink_rates,
303 intel_dp->common_rates);
304
305 /* Paranoia, there should always be something in common. */
306 if (WARN_ON(intel_dp->num_common_rates == 0)) {
307 intel_dp->common_rates[0] = default_rates[0];
308 intel_dp->num_common_rates = 1;
309 }
310}
311
312/* get length of common rates potentially limited by max_rate */
313static int intel_dp_common_len_rate_limit(struct intel_dp *intel_dp,
314 int max_rate)
315{
316 const int *common_rates = intel_dp->common_rates;
317 int i, common_len = intel_dp->num_common_rates;
Navare, Manasi D40dba342016-10-26 16:25:55 -0700318
Jani Nikula68f357c2017-03-28 17:59:05 +0300319 /* Limit results by potentially reduced max rate */
320 for (i = 0; i < common_len; i++) {
321 if (common_rates[common_len - i - 1] <= max_rate)
322 return common_len - i;
323 }
324
325 return 0;
Navare, Manasi D40dba342016-10-26 16:25:55 -0700326}
327
Manasi Navare1a92c702017-06-08 13:41:02 -0700328static bool intel_dp_link_params_valid(struct intel_dp *intel_dp, int link_rate,
329 uint8_t lane_count)
Manasi Navare14c562c2017-04-06 14:00:12 -0700330{
331 /*
332 * FIXME: we need to synchronize the current link parameters with
333 * hardware readout. Currently fast link training doesn't work on
334 * boot-up.
335 */
Manasi Navare1a92c702017-06-08 13:41:02 -0700336 if (link_rate == 0 ||
337 link_rate > intel_dp->max_link_rate)
Manasi Navare14c562c2017-04-06 14:00:12 -0700338 return false;
339
Manasi Navare1a92c702017-06-08 13:41:02 -0700340 if (lane_count == 0 ||
341 lane_count > intel_dp_max_lane_count(intel_dp))
Manasi Navare14c562c2017-04-06 14:00:12 -0700342 return false;
343
344 return true;
345}
346
Manasi Navarefdb14d32016-12-08 19:05:12 -0800347int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
348 int link_rate, uint8_t lane_count)
349{
Jani Nikulab1810a72017-04-06 16:44:11 +0300350 int index;
Manasi Navarefdb14d32016-12-08 19:05:12 -0800351
Jani Nikulab1810a72017-04-06 16:44:11 +0300352 index = intel_dp_rate_index(intel_dp->common_rates,
353 intel_dp->num_common_rates,
354 link_rate);
355 if (index > 0) {
Jani Nikulae6c0c642017-04-06 16:44:12 +0300356 intel_dp->max_link_rate = intel_dp->common_rates[index - 1];
357 intel_dp->max_link_lane_count = lane_count;
Manasi Navarefdb14d32016-12-08 19:05:12 -0800358 } else if (lane_count > 1) {
Jani Nikula540b0b7f2017-04-06 16:44:13 +0300359 intel_dp->max_link_rate = intel_dp_max_common_rate(intel_dp);
Jani Nikulae6c0c642017-04-06 16:44:12 +0300360 intel_dp->max_link_lane_count = lane_count >> 1;
Manasi Navarefdb14d32016-12-08 19:05:12 -0800361 } else {
362 DRM_ERROR("Link Training Unsuccessful\n");
363 return -1;
364 }
365
366 return 0;
367}
368
Damien Lespiauc19de8e2013-11-28 15:29:18 +0000369static enum drm_mode_status
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700370intel_dp_mode_valid(struct drm_connector *connector,
371 struct drm_display_mode *mode)
372{
Chris Wilsondf0e9242010-09-09 16:20:55 +0100373 struct intel_dp *intel_dp = intel_attached_dp(connector);
Jani Nikuladd06f902012-10-19 14:51:50 +0300374 struct intel_connector *intel_connector = to_intel_connector(connector);
375 struct drm_display_mode *fixed_mode = intel_connector->panel.fixed_mode;
Daniel Vetter36008362013-03-27 00:44:59 +0100376 int target_clock = mode->clock;
377 int max_rate, mode_rate, max_lanes, max_link_clock;
Mika Kahola70ec0642016-09-09 14:10:55 +0300378 int max_dotclk;
379
380 max_dotclk = intel_dp_downstream_max_dotclock(intel_dp);
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700381
Jani Nikula1853a9d2017-08-18 12:30:20 +0300382 if (intel_dp_is_edp(intel_dp) && fixed_mode) {
Jani Nikuladd06f902012-10-19 14:51:50 +0300383 if (mode->hdisplay > fixed_mode->hdisplay)
Zhao Yakui7de56f42010-07-19 09:43:14 +0100384 return MODE_PANEL;
385
Jani Nikuladd06f902012-10-19 14:51:50 +0300386 if (mode->vdisplay > fixed_mode->vdisplay)
Zhao Yakui7de56f42010-07-19 09:43:14 +0100387 return MODE_PANEL;
Daniel Vetter03afc4a2013-04-02 23:42:31 +0200388
389 target_clock = fixed_mode->clock;
Zhao Yakui7de56f42010-07-19 09:43:14 +0100390 }
391
Ville Syrjälä50fec212015-03-12 17:10:34 +0200392 max_link_clock = intel_dp_max_link_rate(intel_dp);
Paulo Zanonieeb63242014-05-06 14:56:50 +0300393 max_lanes = intel_dp_max_lane_count(intel_dp);
Daniel Vetter36008362013-03-27 00:44:59 +0100394
395 max_rate = intel_dp_max_data_rate(max_link_clock, max_lanes);
396 mode_rate = intel_dp_link_required(target_clock, 18);
397
Mika Kahola799487f2016-02-02 15:16:38 +0200398 if (mode_rate > max_rate || target_clock > max_dotclk)
Daniel Vetterc4867932012-04-10 10:42:36 +0200399 return MODE_CLOCK_HIGH;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700400
401 if (mode->clock < 10000)
402 return MODE_CLOCK_LOW;
403
Daniel Vetter0af78a22012-05-23 11:30:55 +0200404 if (mode->flags & DRM_MODE_FLAG_DBLCLK)
405 return MODE_H_ILLEGAL;
406
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700407 return MODE_OK;
408}
409
Rodrigo Vivia4f12892014-11-14 08:52:27 -0800410uint32_t intel_dp_pack_aux(const uint8_t *src, int src_bytes)
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700411{
412 int i;
413 uint32_t v = 0;
414
415 if (src_bytes > 4)
416 src_bytes = 4;
417 for (i = 0; i < src_bytes; i++)
418 v |= ((uint32_t) src[i]) << ((3-i) * 8);
419 return v;
420}
421
Damien Lespiauc2af70e2015-02-10 19:32:23 +0000422static void intel_dp_unpack_aux(uint32_t src, uint8_t *dst, int dst_bytes)
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700423{
424 int i;
425 if (dst_bytes > 4)
426 dst_bytes = 4;
427 for (i = 0; i < dst_bytes; i++)
428 dst[i] = src >> ((3-i) * 8);
429}
430
Jani Nikulabf13e812013-09-06 07:40:05 +0300431static void
Ville Syrjälä46bd8382017-10-31 22:51:22 +0200432intel_dp_init_panel_power_sequencer(struct intel_dp *intel_dp);
Jani Nikulabf13e812013-09-06 07:40:05 +0300433static void
Ville Syrjälä46bd8382017-10-31 22:51:22 +0200434intel_dp_init_panel_power_sequencer_registers(struct intel_dp *intel_dp,
Ville Syrjälä5d5ab2d2016-12-20 18:51:17 +0200435 bool force_disable_vdd);
Imre Deak335f7522016-08-10 14:07:32 +0300436static void
Ville Syrjälä46bd8382017-10-31 22:51:22 +0200437intel_dp_pps_init(struct intel_dp *intel_dp);
Jani Nikulabf13e812013-09-06 07:40:05 +0300438
Ville Syrjälä773538e82014-09-04 14:54:56 +0300439static void pps_lock(struct intel_dp *intel_dp)
440{
Ville Syrjälä2f773472017-11-09 17:27:58 +0200441 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Ville Syrjälä773538e82014-09-04 14:54:56 +0300442
443 /*
Lucas De Marchi40c7ae42017-11-13 16:46:38 -0800444 * See intel_power_sequencer_reset() why we need
Ville Syrjälä773538e82014-09-04 14:54:56 +0300445 * a power domain reference here.
446 */
Ander Conselvan de Oliveira5432fca2017-02-22 08:34:26 +0200447 intel_display_power_get(dev_priv, intel_dp->aux_power_domain);
Ville Syrjälä773538e82014-09-04 14:54:56 +0300448
449 mutex_lock(&dev_priv->pps_mutex);
450}
451
452static void pps_unlock(struct intel_dp *intel_dp)
453{
Ville Syrjälä2f773472017-11-09 17:27:58 +0200454 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Ville Syrjälä773538e82014-09-04 14:54:56 +0300455
456 mutex_unlock(&dev_priv->pps_mutex);
457
Ander Conselvan de Oliveira5432fca2017-02-22 08:34:26 +0200458 intel_display_power_put(dev_priv, intel_dp->aux_power_domain);
Ville Syrjälä773538e82014-09-04 14:54:56 +0300459}
460
Ville Syrjälä961a0db2014-10-16 21:29:42 +0300461static void
462vlv_power_sequencer_kick(struct intel_dp *intel_dp)
463{
Ville Syrjälä2f773472017-11-09 17:27:58 +0200464 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Ville Syrjälä961a0db2014-10-16 21:29:42 +0300465 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Ville Syrjälä961a0db2014-10-16 21:29:42 +0300466 enum pipe pipe = intel_dp->pps_pipe;
Ville Syrjälä0047eed2015-07-10 10:56:24 +0300467 bool pll_enabled, release_cl_override = false;
468 enum dpio_phy phy = DPIO_PHY(pipe);
469 enum dpio_channel ch = vlv_pipe_to_channel(pipe);
Ville Syrjälä961a0db2014-10-16 21:29:42 +0300470 uint32_t DP;
471
472 if (WARN(I915_READ(intel_dp->output_reg) & DP_PORT_EN,
473 "skipping pipe %c power seqeuncer kick due to port %c being active\n",
Ville Syrjälä8f4f2792017-11-09 17:24:34 +0200474 pipe_name(pipe), port_name(intel_dig_port->base.port)))
Ville Syrjälä961a0db2014-10-16 21:29:42 +0300475 return;
476
477 DRM_DEBUG_KMS("kicking pipe %c power sequencer for port %c\n",
Ville Syrjälä8f4f2792017-11-09 17:24:34 +0200478 pipe_name(pipe), port_name(intel_dig_port->base.port));
Ville Syrjälä961a0db2014-10-16 21:29:42 +0300479
480 /* Preserve the BIOS-computed detected bit. This is
481 * supposed to be read-only.
482 */
483 DP = I915_READ(intel_dp->output_reg) & DP_DETECTED;
484 DP |= DP_VOLTAGE_0_4 | DP_PRE_EMPHASIS_0;
485 DP |= DP_PORT_WIDTH(1);
486 DP |= DP_LINK_TRAIN_PAT_1;
487
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +0100488 if (IS_CHERRYVIEW(dev_priv))
Ville Syrjälä961a0db2014-10-16 21:29:42 +0300489 DP |= DP_PIPE_SELECT_CHV(pipe);
490 else if (pipe == PIPE_B)
491 DP |= DP_PIPEB_SELECT;
492
Ville Syrjäläd288f652014-10-28 13:20:22 +0200493 pll_enabled = I915_READ(DPLL(pipe)) & DPLL_VCO_ENABLE;
494
495 /*
496 * The DPLL for the pipe must be enabled for this to work.
497 * So enable temporarily it if it's not already enabled.
498 */
Ville Syrjälä0047eed2015-07-10 10:56:24 +0300499 if (!pll_enabled) {
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +0100500 release_cl_override = IS_CHERRYVIEW(dev_priv) &&
Ville Syrjälä0047eed2015-07-10 10:56:24 +0300501 !chv_phy_powergate_ch(dev_priv, phy, ch, true);
502
Ville Syrjälä30ad9812016-10-31 22:37:07 +0200503 if (vlv_force_pll_on(dev_priv, pipe, IS_CHERRYVIEW(dev_priv) ?
Tvrtko Ursulin3f36b932016-01-19 15:25:17 +0000504 &chv_dpll[0].dpll : &vlv_dpll[0].dpll)) {
505 DRM_ERROR("Failed to force on pll for pipe %c!\n",
506 pipe_name(pipe));
507 return;
508 }
Ville Syrjälä0047eed2015-07-10 10:56:24 +0300509 }
Ville Syrjäläd288f652014-10-28 13:20:22 +0200510
Ville Syrjälä961a0db2014-10-16 21:29:42 +0300511 /*
512 * Similar magic as in intel_dp_enable_port().
513 * We _must_ do this port enable + disable trick
514 * to make this power seqeuencer lock onto the port.
515 * Otherwise even VDD force bit won't work.
516 */
517 I915_WRITE(intel_dp->output_reg, DP);
518 POSTING_READ(intel_dp->output_reg);
519
520 I915_WRITE(intel_dp->output_reg, DP | DP_PORT_EN);
521 POSTING_READ(intel_dp->output_reg);
522
523 I915_WRITE(intel_dp->output_reg, DP & ~DP_PORT_EN);
524 POSTING_READ(intel_dp->output_reg);
Ville Syrjäläd288f652014-10-28 13:20:22 +0200525
Ville Syrjälä0047eed2015-07-10 10:56:24 +0300526 if (!pll_enabled) {
Ville Syrjälä30ad9812016-10-31 22:37:07 +0200527 vlv_force_pll_off(dev_priv, pipe);
Ville Syrjälä0047eed2015-07-10 10:56:24 +0300528
529 if (release_cl_override)
530 chv_phy_powergate_ch(dev_priv, phy, ch, false);
531 }
Ville Syrjälä961a0db2014-10-16 21:29:42 +0300532}
533
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +0200534static enum pipe vlv_find_free_pps(struct drm_i915_private *dev_priv)
535{
536 struct intel_encoder *encoder;
537 unsigned int pipes = (1 << PIPE_A) | (1 << PIPE_B);
538
539 /*
540 * We don't have power sequencer currently.
541 * Pick one that's not used by other ports.
542 */
543 for_each_intel_encoder(&dev_priv->drm, encoder) {
544 struct intel_dp *intel_dp;
545
546 if (encoder->type != INTEL_OUTPUT_DP &&
547 encoder->type != INTEL_OUTPUT_EDP)
548 continue;
549
550 intel_dp = enc_to_intel_dp(&encoder->base);
551
552 if (encoder->type == INTEL_OUTPUT_EDP) {
553 WARN_ON(intel_dp->active_pipe != INVALID_PIPE &&
554 intel_dp->active_pipe != intel_dp->pps_pipe);
555
556 if (intel_dp->pps_pipe != INVALID_PIPE)
557 pipes &= ~(1 << intel_dp->pps_pipe);
558 } else {
559 WARN_ON(intel_dp->pps_pipe != INVALID_PIPE);
560
561 if (intel_dp->active_pipe != INVALID_PIPE)
562 pipes &= ~(1 << intel_dp->active_pipe);
563 }
564 }
565
566 if (pipes == 0)
567 return INVALID_PIPE;
568
569 return ffs(pipes) - 1;
570}
571
Jani Nikulabf13e812013-09-06 07:40:05 +0300572static enum pipe
573vlv_power_sequencer_pipe(struct intel_dp *intel_dp)
574{
Ville Syrjälä46bd8382017-10-31 22:51:22 +0200575 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Jani Nikulabf13e812013-09-06 07:40:05 +0300576 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Ville Syrjäläa8c33442014-10-16 21:29:59 +0300577 enum pipe pipe;
Jani Nikulabf13e812013-09-06 07:40:05 +0300578
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300579 lockdep_assert_held(&dev_priv->pps_mutex);
580
Ville Syrjäläa8c33442014-10-16 21:29:59 +0300581 /* We should never land here with regular DP ports */
Jani Nikula1853a9d2017-08-18 12:30:20 +0300582 WARN_ON(!intel_dp_is_edp(intel_dp));
Ville Syrjäläa8c33442014-10-16 21:29:59 +0300583
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +0200584 WARN_ON(intel_dp->active_pipe != INVALID_PIPE &&
585 intel_dp->active_pipe != intel_dp->pps_pipe);
586
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300587 if (intel_dp->pps_pipe != INVALID_PIPE)
588 return intel_dp->pps_pipe;
Jani Nikulabf13e812013-09-06 07:40:05 +0300589
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +0200590 pipe = vlv_find_free_pps(dev_priv);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300591
592 /*
593 * Didn't find one. This should not happen since there
594 * are two power sequencers and up to two eDP ports.
595 */
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +0200596 if (WARN_ON(pipe == INVALID_PIPE))
Ville Syrjäläa8c33442014-10-16 21:29:59 +0300597 pipe = PIPE_A;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300598
Ville Syrjälä46bd8382017-10-31 22:51:22 +0200599 vlv_steal_power_sequencer(dev_priv, pipe);
Ville Syrjäläa8c33442014-10-16 21:29:59 +0300600 intel_dp->pps_pipe = pipe;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300601
602 DRM_DEBUG_KMS("picked pipe %c power sequencer for port %c\n",
603 pipe_name(intel_dp->pps_pipe),
Ville Syrjälä8f4f2792017-11-09 17:24:34 +0200604 port_name(intel_dig_port->base.port));
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300605
606 /* init power sequencer on this pipe and port */
Ville Syrjälä46bd8382017-10-31 22:51:22 +0200607 intel_dp_init_panel_power_sequencer(intel_dp);
608 intel_dp_init_panel_power_sequencer_registers(intel_dp, true);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300609
Ville Syrjälä961a0db2014-10-16 21:29:42 +0300610 /*
611 * Even vdd force doesn't work until we've made
612 * the power sequencer lock in on the port.
613 */
614 vlv_power_sequencer_kick(intel_dp);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300615
616 return intel_dp->pps_pipe;
617}
618
Imre Deak78597992016-06-16 16:37:20 +0300619static int
620bxt_power_sequencer_idx(struct intel_dp *intel_dp)
621{
Ville Syrjälä46bd8382017-10-31 22:51:22 +0200622 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Imre Deak78597992016-06-16 16:37:20 +0300623
624 lockdep_assert_held(&dev_priv->pps_mutex);
625
626 /* We should never land here with regular DP ports */
Jani Nikula1853a9d2017-08-18 12:30:20 +0300627 WARN_ON(!intel_dp_is_edp(intel_dp));
Imre Deak78597992016-06-16 16:37:20 +0300628
629 /*
630 * TODO: BXT has 2 PPS instances. The correct port->PPS instance
631 * mapping needs to be retrieved from VBT, for now just hard-code to
632 * use instance #0 always.
633 */
634 if (!intel_dp->pps_reset)
635 return 0;
636
637 intel_dp->pps_reset = false;
638
639 /*
640 * Only the HW needs to be reprogrammed, the SW state is fixed and
641 * has been setup during connector init.
642 */
Ville Syrjälä46bd8382017-10-31 22:51:22 +0200643 intel_dp_init_panel_power_sequencer_registers(intel_dp, false);
Imre Deak78597992016-06-16 16:37:20 +0300644
645 return 0;
646}
647
Ville Syrjälä6491ab22014-08-18 22:16:06 +0300648typedef bool (*vlv_pipe_check)(struct drm_i915_private *dev_priv,
649 enum pipe pipe);
650
651static bool vlv_pipe_has_pp_on(struct drm_i915_private *dev_priv,
652 enum pipe pipe)
653{
Imre Deak44cb7342016-08-10 14:07:29 +0300654 return I915_READ(PP_STATUS(pipe)) & PP_ON;
Ville Syrjälä6491ab22014-08-18 22:16:06 +0300655}
656
657static bool vlv_pipe_has_vdd_on(struct drm_i915_private *dev_priv,
658 enum pipe pipe)
659{
Imre Deak44cb7342016-08-10 14:07:29 +0300660 return I915_READ(PP_CONTROL(pipe)) & EDP_FORCE_VDD;
Ville Syrjälä6491ab22014-08-18 22:16:06 +0300661}
662
663static bool vlv_pipe_any(struct drm_i915_private *dev_priv,
664 enum pipe pipe)
665{
666 return true;
667}
668
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300669static enum pipe
Ville Syrjälä6491ab22014-08-18 22:16:06 +0300670vlv_initial_pps_pipe(struct drm_i915_private *dev_priv,
671 enum port port,
672 vlv_pipe_check pipe_check)
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300673{
Jani Nikulabf13e812013-09-06 07:40:05 +0300674 enum pipe pipe;
675
Jani Nikulabf13e812013-09-06 07:40:05 +0300676 for (pipe = PIPE_A; pipe <= PIPE_B; pipe++) {
Imre Deak44cb7342016-08-10 14:07:29 +0300677 u32 port_sel = I915_READ(PP_ON_DELAYS(pipe)) &
Jani Nikulabf13e812013-09-06 07:40:05 +0300678 PANEL_PORT_SELECT_MASK;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300679
680 if (port_sel != PANEL_PORT_SELECT_VLV(port))
681 continue;
682
Ville Syrjälä6491ab22014-08-18 22:16:06 +0300683 if (!pipe_check(dev_priv, pipe))
684 continue;
685
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300686 return pipe;
Jani Nikulabf13e812013-09-06 07:40:05 +0300687 }
688
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300689 return INVALID_PIPE;
690}
691
692static void
693vlv_initial_power_sequencer_setup(struct intel_dp *intel_dp)
694{
Ville Syrjälä46bd8382017-10-31 22:51:22 +0200695 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300696 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Ville Syrjälä8f4f2792017-11-09 17:24:34 +0200697 enum port port = intel_dig_port->base.port;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300698
699 lockdep_assert_held(&dev_priv->pps_mutex);
700
701 /* try to find a pipe with this port selected */
Ville Syrjälä6491ab22014-08-18 22:16:06 +0300702 /* first pick one where the panel is on */
703 intel_dp->pps_pipe = vlv_initial_pps_pipe(dev_priv, port,
704 vlv_pipe_has_pp_on);
705 /* didn't find one? pick one where vdd is on */
706 if (intel_dp->pps_pipe == INVALID_PIPE)
707 intel_dp->pps_pipe = vlv_initial_pps_pipe(dev_priv, port,
708 vlv_pipe_has_vdd_on);
709 /* didn't find one? pick one with just the correct port */
710 if (intel_dp->pps_pipe == INVALID_PIPE)
711 intel_dp->pps_pipe = vlv_initial_pps_pipe(dev_priv, port,
712 vlv_pipe_any);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300713
714 /* didn't find one? just let vlv_power_sequencer_pipe() pick one when needed */
715 if (intel_dp->pps_pipe == INVALID_PIPE) {
716 DRM_DEBUG_KMS("no initial power sequencer for port %c\n",
717 port_name(port));
718 return;
719 }
720
721 DRM_DEBUG_KMS("initial power sequencer for port %c: pipe %c\n",
722 port_name(port), pipe_name(intel_dp->pps_pipe));
723
Ville Syrjälä46bd8382017-10-31 22:51:22 +0200724 intel_dp_init_panel_power_sequencer(intel_dp);
725 intel_dp_init_panel_power_sequencer_registers(intel_dp, false);
Jani Nikulabf13e812013-09-06 07:40:05 +0300726}
727
Imre Deak78597992016-06-16 16:37:20 +0300728void intel_power_sequencer_reset(struct drm_i915_private *dev_priv)
Ville Syrjälä773538e82014-09-04 14:54:56 +0300729{
Ville Syrjälä773538e82014-09-04 14:54:56 +0300730 struct intel_encoder *encoder;
731
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +0100732 if (WARN_ON(!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv) &&
Ander Conselvan de Oliveiracc3f90f2016-12-02 10:23:49 +0200733 !IS_GEN9_LP(dev_priv)))
Ville Syrjälä773538e82014-09-04 14:54:56 +0300734 return;
735
736 /*
737 * We can't grab pps_mutex here due to deadlock with power_domain
738 * mutex when power_domain functions are called while holding pps_mutex.
739 * That also means that in order to use pps_pipe the code needs to
740 * hold both a power domain reference and pps_mutex, and the power domain
741 * reference get/put must be done while _not_ holding pps_mutex.
742 * pps_{lock,unlock}() do these steps in the correct order, so one
743 * should use them always.
744 */
745
Ville Syrjälä2f773472017-11-09 17:27:58 +0200746 for_each_intel_encoder(&dev_priv->drm, encoder) {
Ville Syrjälä773538e82014-09-04 14:54:56 +0300747 struct intel_dp *intel_dp;
748
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +0200749 if (encoder->type != INTEL_OUTPUT_DP &&
Ville Syrjälä7e732ca2017-10-27 22:31:24 +0300750 encoder->type != INTEL_OUTPUT_EDP &&
751 encoder->type != INTEL_OUTPUT_DDI)
Ville Syrjälä773538e82014-09-04 14:54:56 +0300752 continue;
753
754 intel_dp = enc_to_intel_dp(&encoder->base);
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +0200755
Ville Syrjälä7e732ca2017-10-27 22:31:24 +0300756 /* Skip pure DVI/HDMI DDI encoders */
757 if (!i915_mmio_reg_valid(intel_dp->output_reg))
758 continue;
759
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +0200760 WARN_ON(intel_dp->active_pipe != INVALID_PIPE);
761
762 if (encoder->type != INTEL_OUTPUT_EDP)
763 continue;
764
Ander Conselvan de Oliveiracc3f90f2016-12-02 10:23:49 +0200765 if (IS_GEN9_LP(dev_priv))
Imre Deak78597992016-06-16 16:37:20 +0300766 intel_dp->pps_reset = true;
767 else
768 intel_dp->pps_pipe = INVALID_PIPE;
Ville Syrjälä773538e82014-09-04 14:54:56 +0300769 }
Jani Nikulabf13e812013-09-06 07:40:05 +0300770}
771
Imre Deak8e8232d2016-06-16 16:37:21 +0300772struct pps_registers {
773 i915_reg_t pp_ctrl;
774 i915_reg_t pp_stat;
775 i915_reg_t pp_on;
776 i915_reg_t pp_off;
777 i915_reg_t pp_div;
778};
779
Ville Syrjälä46bd8382017-10-31 22:51:22 +0200780static void intel_pps_get_registers(struct intel_dp *intel_dp,
Imre Deak8e8232d2016-06-16 16:37:21 +0300781 struct pps_registers *regs)
782{
Ville Syrjälä46bd8382017-10-31 22:51:22 +0200783 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Imre Deak44cb7342016-08-10 14:07:29 +0300784 int pps_idx = 0;
785
Imre Deak8e8232d2016-06-16 16:37:21 +0300786 memset(regs, 0, sizeof(*regs));
787
Ander Conselvan de Oliveiracc3f90f2016-12-02 10:23:49 +0200788 if (IS_GEN9_LP(dev_priv))
Imre Deak44cb7342016-08-10 14:07:29 +0300789 pps_idx = bxt_power_sequencer_idx(intel_dp);
790 else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
791 pps_idx = vlv_power_sequencer_pipe(intel_dp);
Imre Deak8e8232d2016-06-16 16:37:21 +0300792
Imre Deak44cb7342016-08-10 14:07:29 +0300793 regs->pp_ctrl = PP_CONTROL(pps_idx);
794 regs->pp_stat = PP_STATUS(pps_idx);
795 regs->pp_on = PP_ON_DELAYS(pps_idx);
796 regs->pp_off = PP_OFF_DELAYS(pps_idx);
Rodrigo Vivi938361e2017-06-02 13:06:44 -0700797 if (!IS_GEN9_LP(dev_priv) && !HAS_PCH_CNP(dev_priv))
Imre Deak44cb7342016-08-10 14:07:29 +0300798 regs->pp_div = PP_DIVISOR(pps_idx);
Imre Deak8e8232d2016-06-16 16:37:21 +0300799}
800
Ville Syrjäläf0f59a02015-11-18 15:33:26 +0200801static i915_reg_t
802_pp_ctrl_reg(struct intel_dp *intel_dp)
Jani Nikulabf13e812013-09-06 07:40:05 +0300803{
Imre Deak8e8232d2016-06-16 16:37:21 +0300804 struct pps_registers regs;
Jani Nikulabf13e812013-09-06 07:40:05 +0300805
Ville Syrjälä46bd8382017-10-31 22:51:22 +0200806 intel_pps_get_registers(intel_dp, &regs);
Imre Deak8e8232d2016-06-16 16:37:21 +0300807
808 return regs.pp_ctrl;
Jani Nikulabf13e812013-09-06 07:40:05 +0300809}
810
Ville Syrjäläf0f59a02015-11-18 15:33:26 +0200811static i915_reg_t
812_pp_stat_reg(struct intel_dp *intel_dp)
Jani Nikulabf13e812013-09-06 07:40:05 +0300813{
Imre Deak8e8232d2016-06-16 16:37:21 +0300814 struct pps_registers regs;
Jani Nikulabf13e812013-09-06 07:40:05 +0300815
Ville Syrjälä46bd8382017-10-31 22:51:22 +0200816 intel_pps_get_registers(intel_dp, &regs);
Imre Deak8e8232d2016-06-16 16:37:21 +0300817
818 return regs.pp_stat;
Jani Nikulabf13e812013-09-06 07:40:05 +0300819}
820
Clint Taylor01527b32014-07-07 13:01:46 -0700821/* Reboot notifier handler to shutdown panel power to guarantee T12 timing
822 This function only applicable when panel PM state is not to be tracked */
823static int edp_notify_handler(struct notifier_block *this, unsigned long code,
824 void *unused)
825{
826 struct intel_dp *intel_dp = container_of(this, typeof(* intel_dp),
827 edp_notifier);
Ville Syrjälä2f773472017-11-09 17:27:58 +0200828 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Clint Taylor01527b32014-07-07 13:01:46 -0700829
Jani Nikula1853a9d2017-08-18 12:30:20 +0300830 if (!intel_dp_is_edp(intel_dp) || code != SYS_RESTART)
Clint Taylor01527b32014-07-07 13:01:46 -0700831 return 0;
832
Ville Syrjälä773538e82014-09-04 14:54:56 +0300833 pps_lock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300834
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +0100835 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300836 enum pipe pipe = vlv_power_sequencer_pipe(intel_dp);
Ville Syrjäläf0f59a02015-11-18 15:33:26 +0200837 i915_reg_t pp_ctrl_reg, pp_div_reg;
Ville Syrjälä649636e2015-09-22 19:50:01 +0300838 u32 pp_div;
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300839
Imre Deak44cb7342016-08-10 14:07:29 +0300840 pp_ctrl_reg = PP_CONTROL(pipe);
841 pp_div_reg = PP_DIVISOR(pipe);
Clint Taylor01527b32014-07-07 13:01:46 -0700842 pp_div = I915_READ(pp_div_reg);
843 pp_div &= PP_REFERENCE_DIVIDER_MASK;
844
845 /* 0x1F write to PP_DIV_REG sets max cycle delay */
846 I915_WRITE(pp_div_reg, pp_div | 0x1F);
847 I915_WRITE(pp_ctrl_reg, PANEL_UNLOCK_REGS | PANEL_POWER_OFF);
848 msleep(intel_dp->panel_power_cycle_delay);
849 }
850
Ville Syrjälä773538e82014-09-04 14:54:56 +0300851 pps_unlock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300852
Clint Taylor01527b32014-07-07 13:01:46 -0700853 return 0;
854}
855
Daniel Vetter4be73782014-01-17 14:39:48 +0100856static bool edp_have_panel_power(struct intel_dp *intel_dp)
Keith Packardebf33b12011-09-29 15:53:27 -0700857{
Ville Syrjälä2f773472017-11-09 17:27:58 +0200858 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Keith Packardebf33b12011-09-29 15:53:27 -0700859
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300860 lockdep_assert_held(&dev_priv->pps_mutex);
861
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +0100862 if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
Ville Syrjälä9a423562014-10-16 21:29:48 +0300863 intel_dp->pps_pipe == INVALID_PIPE)
864 return false;
865
Jani Nikulabf13e812013-09-06 07:40:05 +0300866 return (I915_READ(_pp_stat_reg(intel_dp)) & PP_ON) != 0;
Keith Packardebf33b12011-09-29 15:53:27 -0700867}
868
Daniel Vetter4be73782014-01-17 14:39:48 +0100869static bool edp_have_panel_vdd(struct intel_dp *intel_dp)
Keith Packardebf33b12011-09-29 15:53:27 -0700870{
Ville Syrjälä2f773472017-11-09 17:27:58 +0200871 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Keith Packardebf33b12011-09-29 15:53:27 -0700872
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300873 lockdep_assert_held(&dev_priv->pps_mutex);
874
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +0100875 if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
Ville Syrjälä9a423562014-10-16 21:29:48 +0300876 intel_dp->pps_pipe == INVALID_PIPE)
877 return false;
878
Ville Syrjälä773538e82014-09-04 14:54:56 +0300879 return I915_READ(_pp_ctrl_reg(intel_dp)) & EDP_FORCE_VDD;
Keith Packardebf33b12011-09-29 15:53:27 -0700880}
881
Keith Packard9b984da2011-09-19 13:54:47 -0700882static void
883intel_dp_check_edp(struct intel_dp *intel_dp)
884{
Ville Syrjälä2f773472017-11-09 17:27:58 +0200885 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Keith Packardebf33b12011-09-29 15:53:27 -0700886
Jani Nikula1853a9d2017-08-18 12:30:20 +0300887 if (!intel_dp_is_edp(intel_dp))
Keith Packard9b984da2011-09-19 13:54:47 -0700888 return;
Jesse Barnes453c5422013-03-28 09:55:41 -0700889
Daniel Vetter4be73782014-01-17 14:39:48 +0100890 if (!edp_have_panel_power(intel_dp) && !edp_have_panel_vdd(intel_dp)) {
Keith Packard9b984da2011-09-19 13:54:47 -0700891 WARN(1, "eDP powered off while attempting aux channel communication.\n");
892 DRM_DEBUG_KMS("Status 0x%08x Control 0x%08x\n",
Jani Nikulabf13e812013-09-06 07:40:05 +0300893 I915_READ(_pp_stat_reg(intel_dp)),
894 I915_READ(_pp_ctrl_reg(intel_dp)));
Keith Packard9b984da2011-09-19 13:54:47 -0700895 }
896}
897
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100898static uint32_t
899intel_dp_aux_wait_done(struct intel_dp *intel_dp, bool has_aux_irq)
900{
Ville Syrjälä2f773472017-11-09 17:27:58 +0200901 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Ville Syrjäläf0f59a02015-11-18 15:33:26 +0200902 i915_reg_t ch_ctl = intel_dp->aux_ch_ctl_reg;
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100903 uint32_t status;
904 bool done;
905
Daniel Vetteref04f002012-12-01 21:03:59 +0100906#define C (((status = I915_READ_NOTRACE(ch_ctl)) & DP_AUX_CH_CTL_SEND_BUSY) == 0)
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100907 if (has_aux_irq)
Paulo Zanonib18ac462013-02-18 19:00:24 -0300908 done = wait_event_timeout(dev_priv->gmbus_wait_queue, C,
Imre Deak35987062013-05-21 20:03:20 +0300909 msecs_to_jiffies_timeout(10));
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100910 else
Imre Deak713a6b662016-06-28 13:37:33 +0300911 done = wait_for(C, 10) == 0;
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100912 if (!done)
913 DRM_ERROR("dp aux hw did not signal timeout (has irq: %i)!\n",
914 has_aux_irq);
915#undef C
916
917 return status;
918}
919
Ville Syrjälä6ffb1be2016-03-02 17:22:14 +0200920static uint32_t g4x_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
Damien Lespiauec5b01d2014-01-21 13:35:39 +0000921{
922 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Ville Syrjäläe7dc33f2016-03-02 17:22:13 +0200923 struct drm_i915_private *dev_priv = to_i915(intel_dig_port->base.base.dev);
Damien Lespiauec5b01d2014-01-21 13:35:39 +0000924
Ville Syrjäläa457f542016-03-02 17:22:17 +0200925 if (index)
926 return 0;
927
Damien Lespiauec5b01d2014-01-21 13:35:39 +0000928 /*
929 * The clock divider is based off the hrawclk, and would like to run at
Ville Syrjäläa457f542016-03-02 17:22:17 +0200930 * 2MHz. So, take the hrawclk value and divide by 2000 and use that
Damien Lespiauec5b01d2014-01-21 13:35:39 +0000931 */
Ville Syrjäläa457f542016-03-02 17:22:17 +0200932 return DIV_ROUND_CLOSEST(dev_priv->rawclk_freq, 2000);
Damien Lespiauec5b01d2014-01-21 13:35:39 +0000933}
934
935static uint32_t ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
936{
937 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Ville Syrjäläa457f542016-03-02 17:22:17 +0200938 struct drm_i915_private *dev_priv = to_i915(intel_dig_port->base.base.dev);
Damien Lespiauec5b01d2014-01-21 13:35:39 +0000939
940 if (index)
941 return 0;
942
Ville Syrjäläa457f542016-03-02 17:22:17 +0200943 /*
944 * The clock divider is based off the cdclk or PCH rawclk, and would
945 * like to run at 2MHz. So, take the cdclk or PCH rawclk value and
946 * divide by 2000 and use that
947 */
Ville Syrjälä8f4f2792017-11-09 17:24:34 +0200948 if (intel_dig_port->base.port == PORT_A)
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200949 return DIV_ROUND_CLOSEST(dev_priv->cdclk.hw.cdclk, 2000);
Ville Syrjäläe7dc33f2016-03-02 17:22:13 +0200950 else
951 return DIV_ROUND_CLOSEST(dev_priv->rawclk_freq, 2000);
Damien Lespiauec5b01d2014-01-21 13:35:39 +0000952}
953
954static uint32_t hsw_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
Rodrigo Vivib84a1cf2013-07-11 18:44:57 -0300955{
956 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Ville Syrjäläa457f542016-03-02 17:22:17 +0200957 struct drm_i915_private *dev_priv = to_i915(intel_dig_port->base.base.dev);
Rodrigo Vivib84a1cf2013-07-11 18:44:57 -0300958
Ville Syrjälä8f4f2792017-11-09 17:24:34 +0200959 if (intel_dig_port->base.port != PORT_A && HAS_PCH_LPT_H(dev_priv)) {
Rodrigo Vivib84a1cf2013-07-11 18:44:57 -0300960 /* Workaround for non-ULT HSW */
Chris Wilsonbc866252013-07-21 16:00:03 +0100961 switch (index) {
962 case 0: return 63;
963 case 1: return 72;
964 default: return 0;
965 }
Rodrigo Vivib84a1cf2013-07-11 18:44:57 -0300966 }
Ville Syrjäläa457f542016-03-02 17:22:17 +0200967
968 return ilk_get_aux_clock_divider(intel_dp, index);
Rodrigo Vivib84a1cf2013-07-11 18:44:57 -0300969}
970
Damien Lespiaub6b5e382014-01-20 16:00:59 +0000971static uint32_t skl_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
972{
973 /*
974 * SKL doesn't need us to program the AUX clock divider (Hardware will
975 * derive the clock from CDCLK automatically). We still implement the
976 * get_aux_clock_divider vfunc to plug-in into the existing code.
977 */
978 return index ? 0 : 1;
979}
980
Ville Syrjälä6ffb1be2016-03-02 17:22:14 +0200981static uint32_t g4x_get_aux_send_ctl(struct intel_dp *intel_dp,
982 bool has_aux_irq,
983 int send_bytes,
984 uint32_t aux_clock_divider)
Damien Lespiau5ed12a12014-01-20 15:52:30 +0000985{
986 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Tvrtko Ursulin86527442016-10-13 11:03:00 +0100987 struct drm_i915_private *dev_priv =
988 to_i915(intel_dig_port->base.base.dev);
Damien Lespiau5ed12a12014-01-20 15:52:30 +0000989 uint32_t precharge, timeout;
990
Tvrtko Ursulin86527442016-10-13 11:03:00 +0100991 if (IS_GEN6(dev_priv))
Damien Lespiau5ed12a12014-01-20 15:52:30 +0000992 precharge = 3;
993 else
994 precharge = 5;
995
James Ausmus8f5f63d2017-10-12 14:30:37 -0700996 if (IS_BROADWELL(dev_priv))
Damien Lespiau5ed12a12014-01-20 15:52:30 +0000997 timeout = DP_AUX_CH_CTL_TIME_OUT_600us;
998 else
999 timeout = DP_AUX_CH_CTL_TIME_OUT_400us;
1000
1001 return DP_AUX_CH_CTL_SEND_BUSY |
Damien Lespiau788d4432014-01-20 15:52:31 +00001002 DP_AUX_CH_CTL_DONE |
Damien Lespiau5ed12a12014-01-20 15:52:30 +00001003 (has_aux_irq ? DP_AUX_CH_CTL_INTERRUPT : 0) |
Damien Lespiau788d4432014-01-20 15:52:31 +00001004 DP_AUX_CH_CTL_TIME_OUT_ERROR |
Damien Lespiau5ed12a12014-01-20 15:52:30 +00001005 timeout |
Damien Lespiau788d4432014-01-20 15:52:31 +00001006 DP_AUX_CH_CTL_RECEIVE_ERROR |
Damien Lespiau5ed12a12014-01-20 15:52:30 +00001007 (send_bytes << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) |
1008 (precharge << DP_AUX_CH_CTL_PRECHARGE_2US_SHIFT) |
Damien Lespiau788d4432014-01-20 15:52:31 +00001009 (aux_clock_divider << DP_AUX_CH_CTL_BIT_CLOCK_2X_SHIFT);
Damien Lespiau5ed12a12014-01-20 15:52:30 +00001010}
1011
Damien Lespiaub9ca5fa2014-01-20 16:01:00 +00001012static uint32_t skl_get_aux_send_ctl(struct intel_dp *intel_dp,
1013 bool has_aux_irq,
1014 int send_bytes,
1015 uint32_t unused)
1016{
1017 return DP_AUX_CH_CTL_SEND_BUSY |
1018 DP_AUX_CH_CTL_DONE |
1019 (has_aux_irq ? DP_AUX_CH_CTL_INTERRUPT : 0) |
1020 DP_AUX_CH_CTL_TIME_OUT_ERROR |
James Ausmus6fa228b2017-10-12 14:30:36 -07001021 DP_AUX_CH_CTL_TIME_OUT_MAX |
Damien Lespiaub9ca5fa2014-01-20 16:01:00 +00001022 DP_AUX_CH_CTL_RECEIVE_ERROR |
1023 (send_bytes << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) |
Daniel Vetterd4dcbdc2016-05-18 18:47:15 +02001024 DP_AUX_CH_CTL_FW_SYNC_PULSE_SKL(32) |
Damien Lespiaub9ca5fa2014-01-20 16:01:00 +00001025 DP_AUX_CH_CTL_SYNC_PULSE_SKL(32);
1026}
1027
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001028static int
Chris Wilsonea5b2132010-08-04 13:50:23 +01001029intel_dp_aux_ch(struct intel_dp *intel_dp,
Daniel Vetterbd9f74a2014-10-02 09:45:35 +02001030 const uint8_t *send, int send_bytes,
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001031 uint8_t *recv, int recv_size)
1032{
Paulo Zanoni174edf12012-10-26 19:05:50 -02001033 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Tvrtko Ursulin0031fb92016-11-04 14:42:44 +00001034 struct drm_i915_private *dev_priv =
1035 to_i915(intel_dig_port->base.base.dev);
Ville Syrjäläf0f59a02015-11-18 15:33:26 +02001036 i915_reg_t ch_ctl = intel_dp->aux_ch_ctl_reg;
Chris Wilsonbc866252013-07-21 16:00:03 +01001037 uint32_t aux_clock_divider;
Daniel Vetter9ee32fea2012-12-01 13:53:48 +01001038 int i, ret, recv_bytes;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001039 uint32_t status;
Damien Lespiau5ed12a12014-01-20 15:52:30 +00001040 int try, clock = 0;
Tvrtko Ursulin0031fb92016-11-04 14:42:44 +00001041 bool has_aux_irq = HAS_AUX_IRQ(dev_priv);
Jani Nikula884f19e2014-03-14 16:51:14 +02001042 bool vdd;
1043
Ville Syrjälä773538e82014-09-04 14:54:56 +03001044 pps_lock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001045
Ville Syrjälä72c35002014-08-18 22:16:00 +03001046 /*
1047 * We will be called with VDD already enabled for dpcd/edid/oui reads.
1048 * In such cases we want to leave VDD enabled and it's up to upper layers
1049 * to turn it off. But for eg. i2c-dev access we need to turn it on/off
1050 * ourselves.
1051 */
Ville Syrjälä1e0560e2014-08-19 13:24:25 +03001052 vdd = edp_panel_vdd_on(intel_dp);
Daniel Vetter9ee32fea2012-12-01 13:53:48 +01001053
1054 /* dp aux is extremely sensitive to irq latency, hence request the
1055 * lowest possible wakeup latency and so prevent the cpu from going into
1056 * deep sleep states.
1057 */
1058 pm_qos_update_request(&dev_priv->pm_qos, 0);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001059
Keith Packard9b984da2011-09-19 13:54:47 -07001060 intel_dp_check_edp(intel_dp);
Zhenyu Wang5eb08b62009-07-24 01:00:31 +08001061
Jesse Barnes11bee432011-08-01 15:02:20 -07001062 /* Try to wait for any previous AUX channel activity */
1063 for (try = 0; try < 3; try++) {
Daniel Vetteref04f002012-12-01 21:03:59 +01001064 status = I915_READ_NOTRACE(ch_ctl);
Jesse Barnes11bee432011-08-01 15:02:20 -07001065 if ((status & DP_AUX_CH_CTL_SEND_BUSY) == 0)
1066 break;
1067 msleep(1);
1068 }
1069
1070 if (try == 3) {
Mika Kuoppala02196c72015-08-06 16:48:58 +03001071 static u32 last_status = -1;
1072 const u32 status = I915_READ(ch_ctl);
1073
1074 if (status != last_status) {
1075 WARN(1, "dp_aux_ch not started status 0x%08x\n",
1076 status);
1077 last_status = status;
1078 }
1079
Daniel Vetter9ee32fea2012-12-01 13:53:48 +01001080 ret = -EBUSY;
1081 goto out;
Chris Wilson4f7f7b72010-08-18 18:12:56 +01001082 }
1083
Paulo Zanoni46a5ae92013-09-17 11:14:10 -03001084 /* Only 5 data registers! */
1085 if (WARN_ON(send_bytes > 20 || recv_size > 20)) {
1086 ret = -E2BIG;
1087 goto out;
1088 }
1089
Damien Lespiauec5b01d2014-01-21 13:35:39 +00001090 while ((aux_clock_divider = intel_dp->get_aux_clock_divider(intel_dp, clock++))) {
Damien Lespiau153b1102014-01-21 13:37:15 +00001091 u32 send_ctl = intel_dp->get_aux_send_ctl(intel_dp,
1092 has_aux_irq,
1093 send_bytes,
1094 aux_clock_divider);
Damien Lespiau5ed12a12014-01-20 15:52:30 +00001095
Chris Wilsonbc866252013-07-21 16:00:03 +01001096 /* Must try at least 3 times according to DP spec */
1097 for (try = 0; try < 5; try++) {
1098 /* Load the send data into the aux channel data registers */
1099 for (i = 0; i < send_bytes; i += 4)
Ville Syrjälä330e20e2015-11-11 20:34:14 +02001100 I915_WRITE(intel_dp->aux_ch_data_reg[i >> 2],
Rodrigo Vivia4f12892014-11-14 08:52:27 -08001101 intel_dp_pack_aux(send + i,
1102 send_bytes - i));
Akshay Joshi0206e352011-08-16 15:34:10 -04001103
Chris Wilsonbc866252013-07-21 16:00:03 +01001104 /* Send the command and wait for it to complete */
Damien Lespiau5ed12a12014-01-20 15:52:30 +00001105 I915_WRITE(ch_ctl, send_ctl);
Daniel Vetter9ee32fea2012-12-01 13:53:48 +01001106
Chris Wilsonbc866252013-07-21 16:00:03 +01001107 status = intel_dp_aux_wait_done(intel_dp, has_aux_irq);
Akshay Joshi0206e352011-08-16 15:34:10 -04001108
Chris Wilsonbc866252013-07-21 16:00:03 +01001109 /* Clear done status and any errors */
1110 I915_WRITE(ch_ctl,
1111 status |
1112 DP_AUX_CH_CTL_DONE |
1113 DP_AUX_CH_CTL_TIME_OUT_ERROR |
1114 DP_AUX_CH_CTL_RECEIVE_ERROR);
Adam Jacksond7e96fe2011-07-26 15:39:46 -04001115
Todd Previte74ebf292015-04-15 08:38:41 -07001116 if (status & DP_AUX_CH_CTL_TIME_OUT_ERROR)
Chris Wilsonbc866252013-07-21 16:00:03 +01001117 continue;
Todd Previte74ebf292015-04-15 08:38:41 -07001118
1119 /* DP CTS 1.2 Core Rev 1.1, 4.2.1.1 & 4.2.1.2
1120 * 400us delay required for errors and timeouts
1121 * Timeout errors from the HW already meet this
1122 * requirement so skip to next iteration
1123 */
1124 if (status & DP_AUX_CH_CTL_RECEIVE_ERROR) {
1125 usleep_range(400, 500);
1126 continue;
1127 }
Chris Wilsonbc866252013-07-21 16:00:03 +01001128 if (status & DP_AUX_CH_CTL_DONE)
Jim Bridee058c942015-05-27 10:21:48 -07001129 goto done;
Chris Wilsonbc866252013-07-21 16:00:03 +01001130 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001131 }
1132
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001133 if ((status & DP_AUX_CH_CTL_DONE) == 0) {
Keith Packard1ae8c0a2009-06-28 15:42:17 -07001134 DRM_ERROR("dp_aux_ch not done status 0x%08x\n", status);
Daniel Vetter9ee32fea2012-12-01 13:53:48 +01001135 ret = -EBUSY;
1136 goto out;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001137 }
1138
Jim Bridee058c942015-05-27 10:21:48 -07001139done:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001140 /* Check for timeout or receive error.
1141 * Timeouts occur when the sink is not connected
1142 */
Keith Packarda5b3da52009-06-11 22:30:32 -07001143 if (status & DP_AUX_CH_CTL_RECEIVE_ERROR) {
Keith Packard1ae8c0a2009-06-28 15:42:17 -07001144 DRM_ERROR("dp_aux_ch receive error status 0x%08x\n", status);
Daniel Vetter9ee32fea2012-12-01 13:53:48 +01001145 ret = -EIO;
1146 goto out;
Keith Packarda5b3da52009-06-11 22:30:32 -07001147 }
Keith Packard1ae8c0a2009-06-28 15:42:17 -07001148
1149 /* Timeouts occur when the device isn't connected, so they're
1150 * "normal" -- don't fill the kernel log with these */
Keith Packarda5b3da52009-06-11 22:30:32 -07001151 if (status & DP_AUX_CH_CTL_TIME_OUT_ERROR) {
Chris Wilsona5570fe2017-02-23 11:51:02 +00001152 DRM_DEBUG_KMS("dp_aux_ch timeout status 0x%08x\n", status);
Daniel Vetter9ee32fea2012-12-01 13:53:48 +01001153 ret = -ETIMEDOUT;
1154 goto out;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001155 }
1156
1157 /* Unload any bytes sent back from the other side */
1158 recv_bytes = ((status & DP_AUX_CH_CTL_MESSAGE_SIZE_MASK) >>
1159 DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT);
Rodrigo Vivi14e01882015-12-10 11:12:27 -08001160
1161 /*
1162 * By BSpec: "Message sizes of 0 or >20 are not allowed."
1163 * We have no idea of what happened so we return -EBUSY so
1164 * drm layer takes care for the necessary retries.
1165 */
1166 if (recv_bytes == 0 || recv_bytes > 20) {
1167 DRM_DEBUG_KMS("Forbidden recv_bytes = %d on aux transaction\n",
1168 recv_bytes);
1169 /*
1170 * FIXME: This patch was created on top of a series that
1171 * organize the retries at drm level. There EBUSY should
1172 * also take care for 1ms wait before retrying.
1173 * That aux retries re-org is still needed and after that is
1174 * merged we remove this sleep from here.
1175 */
1176 usleep_range(1000, 1500);
1177 ret = -EBUSY;
1178 goto out;
1179 }
1180
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001181 if (recv_bytes > recv_size)
1182 recv_bytes = recv_size;
Akshay Joshi0206e352011-08-16 15:34:10 -04001183
Chris Wilson4f7f7b72010-08-18 18:12:56 +01001184 for (i = 0; i < recv_bytes; i += 4)
Ville Syrjälä330e20e2015-11-11 20:34:14 +02001185 intel_dp_unpack_aux(I915_READ(intel_dp->aux_ch_data_reg[i >> 2]),
Rodrigo Vivia4f12892014-11-14 08:52:27 -08001186 recv + i, recv_bytes - i);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001187
Daniel Vetter9ee32fea2012-12-01 13:53:48 +01001188 ret = recv_bytes;
1189out:
1190 pm_qos_update_request(&dev_priv->pm_qos, PM_QOS_DEFAULT_VALUE);
1191
Jani Nikula884f19e2014-03-14 16:51:14 +02001192 if (vdd)
1193 edp_panel_vdd_off(intel_dp, false);
1194
Ville Syrjälä773538e82014-09-04 14:54:56 +03001195 pps_unlock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001196
Daniel Vetter9ee32fea2012-12-01 13:53:48 +01001197 return ret;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001198}
1199
Jani Nikulaa6c8aff02014-04-07 12:37:25 +03001200#define BARE_ADDRESS_SIZE 3
1201#define HEADER_SIZE (BARE_ADDRESS_SIZE + 1)
Jani Nikula9d1a1032014-03-14 16:51:15 +02001202static ssize_t
1203intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001204{
Jani Nikula9d1a1032014-03-14 16:51:15 +02001205 struct intel_dp *intel_dp = container_of(aux, struct intel_dp, aux);
1206 uint8_t txbuf[20], rxbuf[20];
1207 size_t txsize, rxsize;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001208 int ret;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001209
Ville Syrjäläd2d9cbb2015-03-19 11:44:06 +02001210 txbuf[0] = (msg->request << 4) |
1211 ((msg->address >> 16) & 0xf);
1212 txbuf[1] = (msg->address >> 8) & 0xff;
Jani Nikula9d1a1032014-03-14 16:51:15 +02001213 txbuf[2] = msg->address & 0xff;
1214 txbuf[3] = msg->size - 1;
Paulo Zanoni46a5ae92013-09-17 11:14:10 -03001215
Jani Nikula9d1a1032014-03-14 16:51:15 +02001216 switch (msg->request & ~DP_AUX_I2C_MOT) {
1217 case DP_AUX_NATIVE_WRITE:
1218 case DP_AUX_I2C_WRITE:
Ville Syrjäläc1e741222015-08-27 17:23:27 +03001219 case DP_AUX_I2C_WRITE_STATUS_UPDATE:
Jani Nikulaa6c8aff02014-04-07 12:37:25 +03001220 txsize = msg->size ? HEADER_SIZE + msg->size : BARE_ADDRESS_SIZE;
Jani Nikulaa1ddefd2015-03-17 17:18:54 +02001221 rxsize = 2; /* 0 or 1 data bytes */
Jani Nikulaf51a44b2014-02-11 11:52:05 +02001222
Jani Nikula9d1a1032014-03-14 16:51:15 +02001223 if (WARN_ON(txsize > 20))
1224 return -E2BIG;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001225
Ville Syrjälädd788092016-07-28 17:55:04 +03001226 WARN_ON(!msg->buffer != !msg->size);
1227
Imre Deakd81a67c2016-01-29 14:52:26 +02001228 if (msg->buffer)
1229 memcpy(txbuf + HEADER_SIZE, msg->buffer, msg->size);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001230
Jani Nikula9d1a1032014-03-14 16:51:15 +02001231 ret = intel_dp_aux_ch(intel_dp, txbuf, txsize, rxbuf, rxsize);
1232 if (ret > 0) {
1233 msg->reply = rxbuf[0] >> 4;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001234
Jani Nikulaa1ddefd2015-03-17 17:18:54 +02001235 if (ret > 1) {
1236 /* Number of bytes written in a short write. */
1237 ret = clamp_t(int, rxbuf[1], 0, msg->size);
1238 } else {
1239 /* Return payload size. */
1240 ret = msg->size;
1241 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001242 }
Jani Nikula9d1a1032014-03-14 16:51:15 +02001243 break;
1244
1245 case DP_AUX_NATIVE_READ:
1246 case DP_AUX_I2C_READ:
Jani Nikulaa6c8aff02014-04-07 12:37:25 +03001247 txsize = msg->size ? HEADER_SIZE : BARE_ADDRESS_SIZE;
Jani Nikula9d1a1032014-03-14 16:51:15 +02001248 rxsize = msg->size + 1;
1249
1250 if (WARN_ON(rxsize > 20))
1251 return -E2BIG;
1252
1253 ret = intel_dp_aux_ch(intel_dp, txbuf, txsize, rxbuf, rxsize);
1254 if (ret > 0) {
1255 msg->reply = rxbuf[0] >> 4;
1256 /*
1257 * Assume happy day, and copy the data. The caller is
1258 * expected to check msg->reply before touching it.
1259 *
1260 * Return payload size.
1261 */
1262 ret--;
1263 memcpy(msg->buffer, rxbuf + 1, ret);
1264 }
1265 break;
1266
1267 default:
1268 ret = -EINVAL;
1269 break;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001270 }
Jani Nikulaf51a44b2014-02-11 11:52:05 +02001271
Jani Nikula9d1a1032014-03-14 16:51:15 +02001272 return ret;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001273}
1274
Ville Syrjälä8f7ce032016-10-11 20:52:45 +03001275static enum port intel_aux_port(struct drm_i915_private *dev_priv,
1276 enum port port)
1277{
1278 const struct ddi_vbt_port_info *info =
1279 &dev_priv->vbt.ddi_port_info[port];
1280 enum port aux_port;
1281
1282 if (!info->alternate_aux_channel) {
1283 DRM_DEBUG_KMS("using AUX %c for port %c (platform default)\n",
1284 port_name(port), port_name(port));
1285 return port;
1286 }
1287
1288 switch (info->alternate_aux_channel) {
1289 case DP_AUX_A:
1290 aux_port = PORT_A;
1291 break;
1292 case DP_AUX_B:
1293 aux_port = PORT_B;
1294 break;
1295 case DP_AUX_C:
1296 aux_port = PORT_C;
1297 break;
1298 case DP_AUX_D:
1299 aux_port = PORT_D;
1300 break;
1301 default:
1302 MISSING_CASE(info->alternate_aux_channel);
1303 aux_port = PORT_A;
1304 break;
1305 }
1306
1307 DRM_DEBUG_KMS("using AUX %c for port %c (VBT)\n",
1308 port_name(aux_port), port_name(port));
1309
1310 return aux_port;
1311}
1312
Ville Syrjäläf0f59a02015-11-18 15:33:26 +02001313static i915_reg_t g4x_aux_ctl_reg(struct drm_i915_private *dev_priv,
Ville Syrjäläc8a89b02016-10-11 20:52:48 +03001314 enum port port)
Ville Syrjäläda00bdc2015-11-11 20:34:13 +02001315{
1316 switch (port) {
1317 case PORT_B:
1318 case PORT_C:
1319 case PORT_D:
1320 return DP_AUX_CH_CTL(port);
1321 default:
1322 MISSING_CASE(port);
1323 return DP_AUX_CH_CTL(PORT_B);
1324 }
1325}
1326
Ville Syrjäläf0f59a02015-11-18 15:33:26 +02001327static i915_reg_t g4x_aux_data_reg(struct drm_i915_private *dev_priv,
Ville Syrjäläc8a89b02016-10-11 20:52:48 +03001328 enum port port, int index)
Ville Syrjälä330e20e2015-11-11 20:34:14 +02001329{
1330 switch (port) {
1331 case PORT_B:
1332 case PORT_C:
1333 case PORT_D:
1334 return DP_AUX_CH_DATA(port, index);
1335 default:
1336 MISSING_CASE(port);
1337 return DP_AUX_CH_DATA(PORT_B, index);
1338 }
1339}
1340
Ville Syrjäläf0f59a02015-11-18 15:33:26 +02001341static i915_reg_t ilk_aux_ctl_reg(struct drm_i915_private *dev_priv,
Ville Syrjäläc8a89b02016-10-11 20:52:48 +03001342 enum port port)
Ville Syrjäläda00bdc2015-11-11 20:34:13 +02001343{
1344 switch (port) {
1345 case PORT_A:
1346 return DP_AUX_CH_CTL(port);
1347 case PORT_B:
1348 case PORT_C:
1349 case PORT_D:
1350 return PCH_DP_AUX_CH_CTL(port);
1351 default:
1352 MISSING_CASE(port);
1353 return DP_AUX_CH_CTL(PORT_A);
1354 }
1355}
1356
Ville Syrjäläf0f59a02015-11-18 15:33:26 +02001357static i915_reg_t ilk_aux_data_reg(struct drm_i915_private *dev_priv,
Ville Syrjäläc8a89b02016-10-11 20:52:48 +03001358 enum port port, int index)
Ville Syrjälä330e20e2015-11-11 20:34:14 +02001359{
1360 switch (port) {
1361 case PORT_A:
1362 return DP_AUX_CH_DATA(port, index);
1363 case PORT_B:
1364 case PORT_C:
1365 case PORT_D:
1366 return PCH_DP_AUX_CH_DATA(port, index);
1367 default:
1368 MISSING_CASE(port);
1369 return DP_AUX_CH_DATA(PORT_A, index);
1370 }
1371}
1372
Ville Syrjäläf0f59a02015-11-18 15:33:26 +02001373static i915_reg_t skl_aux_ctl_reg(struct drm_i915_private *dev_priv,
Ville Syrjäläc8a89b02016-10-11 20:52:48 +03001374 enum port port)
Ville Syrjäläda00bdc2015-11-11 20:34:13 +02001375{
Ville Syrjäläda00bdc2015-11-11 20:34:13 +02001376 switch (port) {
1377 case PORT_A:
1378 case PORT_B:
1379 case PORT_C:
1380 case PORT_D:
Rodrigo Vivi841b5ed72018-01-11 16:00:03 -02001381 case PORT_F:
Ville Syrjäläda00bdc2015-11-11 20:34:13 +02001382 return DP_AUX_CH_CTL(port);
1383 default:
1384 MISSING_CASE(port);
1385 return DP_AUX_CH_CTL(PORT_A);
1386 }
1387}
1388
Ville Syrjäläf0f59a02015-11-18 15:33:26 +02001389static i915_reg_t skl_aux_data_reg(struct drm_i915_private *dev_priv,
Ville Syrjäläc8a89b02016-10-11 20:52:48 +03001390 enum port port, int index)
Ville Syrjälä330e20e2015-11-11 20:34:14 +02001391{
Ville Syrjälä330e20e2015-11-11 20:34:14 +02001392 switch (port) {
1393 case PORT_A:
1394 case PORT_B:
1395 case PORT_C:
1396 case PORT_D:
Rodrigo Vivi841b5ed72018-01-11 16:00:03 -02001397 case PORT_F:
Ville Syrjälä330e20e2015-11-11 20:34:14 +02001398 return DP_AUX_CH_DATA(port, index);
1399 default:
1400 MISSING_CASE(port);
1401 return DP_AUX_CH_DATA(PORT_A, index);
1402 }
1403}
1404
Ville Syrjäläf0f59a02015-11-18 15:33:26 +02001405static i915_reg_t intel_aux_ctl_reg(struct drm_i915_private *dev_priv,
Ville Syrjäläc8a89b02016-10-11 20:52:48 +03001406 enum port port)
Ville Syrjälä330e20e2015-11-11 20:34:14 +02001407{
1408 if (INTEL_INFO(dev_priv)->gen >= 9)
1409 return skl_aux_ctl_reg(dev_priv, port);
1410 else if (HAS_PCH_SPLIT(dev_priv))
1411 return ilk_aux_ctl_reg(dev_priv, port);
1412 else
1413 return g4x_aux_ctl_reg(dev_priv, port);
1414}
1415
Ville Syrjäläf0f59a02015-11-18 15:33:26 +02001416static i915_reg_t intel_aux_data_reg(struct drm_i915_private *dev_priv,
Ville Syrjäläc8a89b02016-10-11 20:52:48 +03001417 enum port port, int index)
Ville Syrjälä330e20e2015-11-11 20:34:14 +02001418{
1419 if (INTEL_INFO(dev_priv)->gen >= 9)
1420 return skl_aux_data_reg(dev_priv, port, index);
1421 else if (HAS_PCH_SPLIT(dev_priv))
1422 return ilk_aux_data_reg(dev_priv, port, index);
1423 else
1424 return g4x_aux_data_reg(dev_priv, port, index);
1425}
1426
1427static void intel_aux_reg_init(struct intel_dp *intel_dp)
1428{
1429 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Ville Syrjälä8f7ce032016-10-11 20:52:45 +03001430 enum port port = intel_aux_port(dev_priv,
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02001431 dp_to_dig_port(intel_dp)->base.port);
Ville Syrjälä330e20e2015-11-11 20:34:14 +02001432 int i;
1433
1434 intel_dp->aux_ch_ctl_reg = intel_aux_ctl_reg(dev_priv, port);
1435 for (i = 0; i < ARRAY_SIZE(intel_dp->aux_ch_data_reg); i++)
1436 intel_dp->aux_ch_data_reg[i] = intel_aux_data_reg(dev_priv, port, i);
1437}
1438
Jani Nikula9d1a1032014-03-14 16:51:15 +02001439static void
Ville Syrjäläa121f4e2015-11-11 20:34:11 +02001440intel_dp_aux_fini(struct intel_dp *intel_dp)
1441{
Ville Syrjäläa121f4e2015-11-11 20:34:11 +02001442 kfree(intel_dp->aux.name);
1443}
1444
Chris Wilson7a418e32016-06-24 14:00:14 +01001445static void
Mika Kaholab6339582016-09-09 14:10:52 +03001446intel_dp_aux_init(struct intel_dp *intel_dp)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001447{
Jani Nikula33ad6622014-03-14 16:51:16 +02001448 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02001449 enum port port = intel_dig_port->base.port;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001450
Ville Syrjälä330e20e2015-11-11 20:34:14 +02001451 intel_aux_reg_init(intel_dp);
Chris Wilson7a418e32016-06-24 14:00:14 +01001452 drm_dp_aux_init(&intel_dp->aux);
David Flynn8316f332010-12-08 16:10:21 +00001453
Chris Wilson7a418e32016-06-24 14:00:14 +01001454 /* Failure to allocate our preferred name is not critical */
Ville Syrjäläa121f4e2015-11-11 20:34:11 +02001455 intel_dp->aux.name = kasprintf(GFP_KERNEL, "DPDDC-%c", port_name(port));
Jani Nikula9d1a1032014-03-14 16:51:15 +02001456 intel_dp->aux.transfer = intel_dp_aux_transfer;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001457}
1458
Ander Conselvan de Oliveirae588fa12015-10-23 13:01:50 +03001459bool intel_dp_source_supports_hbr2(struct intel_dp *intel_dp)
Thulasimani,Sivakumared63baa2015-08-18 15:30:37 +05301460{
Jani Nikulafc603ca2017-10-09 12:29:58 +03001461 int max_rate = intel_dp->source_rates[intel_dp->num_source_rates - 1];
Ander Conselvan de Oliveirae588fa12015-10-23 13:01:50 +03001462
Jani Nikulafc603ca2017-10-09 12:29:58 +03001463 return max_rate >= 540000;
Thulasimani,Sivakumared63baa2015-08-18 15:30:37 +05301464}
1465
Daniel Vetter0e503382014-07-04 11:26:04 -03001466static void
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001467intel_dp_set_clock(struct intel_encoder *encoder,
Ville Syrjälä840b32b2015-08-11 20:21:46 +03001468 struct intel_crtc_state *pipe_config)
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001469{
Ville Syrjälä2f773472017-11-09 17:27:58 +02001470 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
Chon Ming Lee9dd4ffd2013-09-04 01:30:37 +08001471 const struct dp_link_dpll *divisor = NULL;
1472 int i, count = 0;
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001473
Tvrtko Ursulin9beb5fe2016-10-13 11:03:06 +01001474 if (IS_G4X(dev_priv)) {
Chon Ming Lee9dd4ffd2013-09-04 01:30:37 +08001475 divisor = gen4_dpll;
1476 count = ARRAY_SIZE(gen4_dpll);
Tvrtko Ursulin6e266952016-10-13 11:02:53 +01001477 } else if (HAS_PCH_SPLIT(dev_priv)) {
Chon Ming Lee9dd4ffd2013-09-04 01:30:37 +08001478 divisor = pch_dpll;
1479 count = ARRAY_SIZE(pch_dpll);
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +01001480 } else if (IS_CHERRYVIEW(dev_priv)) {
Chon Ming Leeef9348c2014-04-09 13:28:18 +03001481 divisor = chv_dpll;
1482 count = ARRAY_SIZE(chv_dpll);
Tvrtko Ursulin11a914c2016-10-13 11:03:08 +01001483 } else if (IS_VALLEYVIEW(dev_priv)) {
Chon Ming Lee65ce4bf2013-09-04 01:30:38 +08001484 divisor = vlv_dpll;
1485 count = ARRAY_SIZE(vlv_dpll);
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001486 }
Chon Ming Lee9dd4ffd2013-09-04 01:30:37 +08001487
1488 if (divisor && count) {
1489 for (i = 0; i < count; i++) {
Ville Syrjälä840b32b2015-08-11 20:21:46 +03001490 if (pipe_config->port_clock == divisor[i].clock) {
Chon Ming Lee9dd4ffd2013-09-04 01:30:37 +08001491 pipe_config->dpll = divisor[i].dpll;
1492 pipe_config->clock_set = true;
1493 break;
1494 }
1495 }
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001496 }
1497}
1498
Ville Syrjälä0336400e2015-03-12 17:10:39 +02001499static void snprintf_int_array(char *str, size_t len,
1500 const int *array, int nelem)
1501{
1502 int i;
1503
1504 str[0] = '\0';
1505
1506 for (i = 0; i < nelem; i++) {
Jani Nikulab2f505b2015-05-18 16:01:45 +03001507 int r = snprintf(str, len, "%s%d", i ? ", " : "", array[i]);
Ville Syrjälä0336400e2015-03-12 17:10:39 +02001508 if (r >= len)
1509 return;
1510 str += r;
1511 len -= r;
1512 }
1513}
1514
1515static void intel_dp_print_rates(struct intel_dp *intel_dp)
1516{
Ville Syrjälä0336400e2015-03-12 17:10:39 +02001517 char str[128]; /* FIXME: too big for stack? */
1518
1519 if ((drm_debug & DRM_UT_KMS) == 0)
1520 return;
1521
Jani Nikula55cfc582017-03-28 17:59:04 +03001522 snprintf_int_array(str, sizeof(str),
1523 intel_dp->source_rates, intel_dp->num_source_rates);
Ville Syrjälä0336400e2015-03-12 17:10:39 +02001524 DRM_DEBUG_KMS("source rates: %s\n", str);
1525
Jani Nikula68f357c2017-03-28 17:59:05 +03001526 snprintf_int_array(str, sizeof(str),
1527 intel_dp->sink_rates, intel_dp->num_sink_rates);
Ville Syrjälä0336400e2015-03-12 17:10:39 +02001528 DRM_DEBUG_KMS("sink rates: %s\n", str);
1529
Jani Nikula975ee5fca2017-04-06 16:44:10 +03001530 snprintf_int_array(str, sizeof(str),
1531 intel_dp->common_rates, intel_dp->num_common_rates);
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001532 DRM_DEBUG_KMS("common rates: %s\n", str);
Ville Syrjälä0336400e2015-03-12 17:10:39 +02001533}
1534
Ville Syrjälä50fec212015-03-12 17:10:34 +02001535int
1536intel_dp_max_link_rate(struct intel_dp *intel_dp)
1537{
Ville Syrjälä50fec212015-03-12 17:10:34 +02001538 int len;
1539
Jani Nikulae6c0c642017-04-06 16:44:12 +03001540 len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->max_link_rate);
Ville Syrjälä50fec212015-03-12 17:10:34 +02001541 if (WARN_ON(len <= 0))
1542 return 162000;
1543
Jani Nikula975ee5fca2017-04-06 16:44:10 +03001544 return intel_dp->common_rates[len - 1];
Ville Syrjälä50fec212015-03-12 17:10:34 +02001545}
1546
Ville Syrjäläed4e9c12015-03-12 17:10:36 +02001547int intel_dp_rate_select(struct intel_dp *intel_dp, int rate)
1548{
Jani Nikula8001b752017-03-28 17:59:03 +03001549 int i = intel_dp_rate_index(intel_dp->sink_rates,
1550 intel_dp->num_sink_rates, rate);
Jani Nikulab5c72b22017-03-28 17:59:02 +03001551
1552 if (WARN_ON(i < 0))
1553 i = 0;
1554
1555 return i;
Ville Syrjäläed4e9c12015-03-12 17:10:36 +02001556}
1557
Ander Conselvan de Oliveira94223d02015-10-23 13:01:48 +03001558void intel_dp_compute_rate(struct intel_dp *intel_dp, int port_clock,
1559 uint8_t *link_bw, uint8_t *rate_select)
Ville Syrjälä04a60f92015-07-06 15:10:06 +03001560{
Jani Nikula68f357c2017-03-28 17:59:05 +03001561 /* eDP 1.4 rate select method. */
1562 if (intel_dp->use_rate_select) {
Ville Syrjälä04a60f92015-07-06 15:10:06 +03001563 *link_bw = 0;
1564 *rate_select =
1565 intel_dp_rate_select(intel_dp, port_clock);
1566 } else {
1567 *link_bw = drm_dp_link_rate_to_bw_code(port_clock);
1568 *rate_select = 0;
1569 }
1570}
1571
Jani Nikulaf580bea2016-09-15 16:28:52 +03001572static int intel_dp_compute_bpp(struct intel_dp *intel_dp,
1573 struct intel_crtc_state *pipe_config)
Mika Kaholaf9bb7052016-09-09 14:10:56 +03001574{
1575 int bpp, bpc;
1576
1577 bpp = pipe_config->pipe_bpp;
1578 bpc = drm_dp_downstream_max_bpc(intel_dp->dpcd, intel_dp->downstream_ports);
1579
1580 if (bpc > 0)
1581 bpp = min(bpp, 3*bpc);
1582
Manasi Navare611032b2017-01-24 08:21:49 -08001583 /* For DP Compliance we override the computed bpp for the pipe */
1584 if (intel_dp->compliance.test_data.bpc != 0) {
1585 pipe_config->pipe_bpp = 3*intel_dp->compliance.test_data.bpc;
1586 pipe_config->dither_force_disable = pipe_config->pipe_bpp == 6*3;
1587 DRM_DEBUG_KMS("Setting pipe_bpp to %d\n",
1588 pipe_config->pipe_bpp);
1589 }
Mika Kaholaf9bb7052016-09-09 14:10:56 +03001590 return bpp;
1591}
1592
Jim Bridedc911f52017-08-09 12:48:53 -07001593static bool intel_edp_compare_alt_mode(struct drm_display_mode *m1,
1594 struct drm_display_mode *m2)
1595{
1596 bool bres = false;
1597
1598 if (m1 && m2)
1599 bres = (m1->hdisplay == m2->hdisplay &&
1600 m1->hsync_start == m2->hsync_start &&
1601 m1->hsync_end == m2->hsync_end &&
1602 m1->htotal == m2->htotal &&
1603 m1->vdisplay == m2->vdisplay &&
1604 m1->vsync_start == m2->vsync_start &&
1605 m1->vsync_end == m2->vsync_end &&
1606 m1->vtotal == m2->vtotal);
1607 return bres;
1608}
1609
Paulo Zanoni00c09d72012-10-26 19:05:52 -02001610bool
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01001611intel_dp_compute_config(struct intel_encoder *encoder,
Maarten Lankhorst0a478c22016-08-09 17:04:05 +02001612 struct intel_crtc_state *pipe_config,
1613 struct drm_connector_state *conn_state)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001614{
Tvrtko Ursulindd11bc12016-11-16 08:55:41 +00001615 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
Ander Conselvan de Oliveira2d112de2015-01-15 14:55:22 +02001616 struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01001617 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02001618 enum port port = encoder->port;
Ander Conselvan de Oliveira84556d52015-03-20 16:18:10 +02001619 struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->base.crtc);
Jani Nikuladd06f902012-10-19 14:51:50 +03001620 struct intel_connector *intel_connector = intel_dp->attached_connector;
Maarten Lankhorst8f647a02017-05-01 15:38:01 +02001621 struct intel_digital_connector_state *intel_conn_state =
1622 to_intel_digital_connector_state(conn_state);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001623 int lane_count, clock;
Jani Nikula56071a22014-05-06 14:56:52 +03001624 int min_lane_count = 1;
Paulo Zanonieeb63242014-05-06 14:56:50 +03001625 int max_lane_count = intel_dp_max_lane_count(intel_dp);
Todd Previte06ea66b2014-01-20 10:19:39 -07001626 /* Conveniently, the link BW constants become indices with a shift...*/
Jani Nikula56071a22014-05-06 14:56:52 +03001627 int min_clock = 0;
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301628 int max_clock;
Daniel Vetter083f9562012-04-20 20:23:49 +02001629 int bpp, mode_rate;
Daniel Vetterff9a6752013-06-01 17:16:21 +02001630 int link_avail, link_clock;
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001631 int common_len;
Ville Syrjälä04a60f92015-07-06 15:10:06 +03001632 uint8_t link_bw, rate_select;
Jani Nikulab31e85e2017-05-18 14:10:25 +03001633 bool reduce_m_n = drm_dp_has_quirk(&intel_dp->desc,
1634 DP_DPCD_QUIRK_LIMITED_M_N);
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301635
Jani Nikula975ee5fca2017-04-06 16:44:10 +03001636 common_len = intel_dp_common_len_rate_limit(intel_dp,
Jani Nikulae6c0c642017-04-06 16:44:12 +03001637 intel_dp->max_link_rate);
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301638
1639 /* No common link rates between source and sink */
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001640 WARN_ON(common_len <= 0);
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301641
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001642 max_clock = common_len - 1;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001643
Tvrtko Ursulin4f8036a2016-10-13 11:02:52 +01001644 if (HAS_PCH_SPLIT(dev_priv) && !HAS_DDI(dev_priv) && port != PORT_A)
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01001645 pipe_config->has_pch_encoder = true;
1646
Vandana Kannanf769cd22014-08-05 07:51:22 -07001647 pipe_config->has_drrs = false;
Ville Syrjälä20ff39f2017-11-29 18:43:01 +02001648 if (IS_G4X(dev_priv) || port == PORT_A)
Maarten Lankhorste6b72c92017-05-01 15:38:00 +02001649 pipe_config->has_audio = false;
Maarten Lankhorst8f647a02017-05-01 15:38:01 +02001650 else if (intel_conn_state->force_audio == HDMI_AUDIO_AUTO)
Maarten Lankhorste6b72c92017-05-01 15:38:00 +02001651 pipe_config->has_audio = intel_dp->has_audio;
1652 else
Maarten Lankhorst8f647a02017-05-01 15:38:01 +02001653 pipe_config->has_audio = intel_conn_state->force_audio == HDMI_AUDIO_ON;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001654
Jani Nikula1853a9d2017-08-18 12:30:20 +03001655 if (intel_dp_is_edp(intel_dp) && intel_connector->panel.fixed_mode) {
Jim Bridedc911f52017-08-09 12:48:53 -07001656 struct drm_display_mode *panel_mode =
1657 intel_connector->panel.alt_fixed_mode;
1658 struct drm_display_mode *req_mode = &pipe_config->base.mode;
1659
1660 if (!intel_edp_compare_alt_mode(req_mode, panel_mode))
1661 panel_mode = intel_connector->panel.fixed_mode;
1662
1663 drm_mode_debug_printmodeline(panel_mode);
1664
1665 intel_fixed_panel_mode(panel_mode, adjusted_mode);
Chandra Kondurua1b22782015-04-07 15:28:45 -07001666
Tvrtko Ursulindd11bc12016-11-16 08:55:41 +00001667 if (INTEL_GEN(dev_priv) >= 9) {
Chandra Kondurua1b22782015-04-07 15:28:45 -07001668 int ret;
Maarten Lankhorste435d6e2015-07-13 16:30:15 +02001669 ret = skl_update_scaler_crtc(pipe_config);
Chandra Kondurua1b22782015-04-07 15:28:45 -07001670 if (ret)
1671 return ret;
1672 }
1673
Tvrtko Ursulin49cff962016-10-13 11:02:54 +01001674 if (HAS_GMCH_DISPLAY(dev_priv))
Jesse Barnes2dd24552013-04-25 12:55:01 -07001675 intel_gmch_panel_fitting(intel_crtc, pipe_config,
Maarten Lankhorsteead06d2017-05-01 15:37:55 +02001676 conn_state->scaling_mode);
Jesse Barnes2dd24552013-04-25 12:55:01 -07001677 else
Jesse Barnesb074cec2013-04-25 12:55:02 -07001678 intel_pch_panel_fitting(intel_crtc, pipe_config,
Maarten Lankhorsteead06d2017-05-01 15:37:55 +02001679 conn_state->scaling_mode);
Zhao Yakui0d3a1be2010-07-19 09:43:13 +01001680 }
1681
Ville Syrjälä050213892017-11-29 20:08:47 +02001682 if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
1683 adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)
1684 return false;
1685
Daniel Vettercb1793c2012-06-04 18:39:21 +02001686 if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK)
Daniel Vetter0af78a22012-05-23 11:30:55 +02001687 return false;
1688
Manasi Navareda15f7c2017-01-24 08:16:34 -08001689 /* Use values requested by Compliance Test Request */
1690 if (intel_dp->compliance.test_type == DP_TEST_LINK_TRAINING) {
Jani Nikulaec990e22017-04-06 16:44:15 +03001691 int index;
1692
Manasi Navare140ef132017-06-08 13:41:03 -07001693 /* Validate the compliance test data since max values
1694 * might have changed due to link train fallback.
1695 */
1696 if (intel_dp_link_params_valid(intel_dp, intel_dp->compliance.test_link_rate,
1697 intel_dp->compliance.test_lane_count)) {
1698 index = intel_dp_rate_index(intel_dp->common_rates,
1699 intel_dp->num_common_rates,
1700 intel_dp->compliance.test_link_rate);
1701 if (index >= 0)
1702 min_clock = max_clock = index;
1703 min_lane_count = max_lane_count = intel_dp->compliance.test_lane_count;
1704 }
Manasi Navareda15f7c2017-01-24 08:16:34 -08001705 }
Daniel Vetter083f9562012-04-20 20:23:49 +02001706 DRM_DEBUG_KMS("DP link computation with max lane count %i "
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301707 "max bw %d pixel clock %iKHz\n",
Jani Nikula975ee5fca2017-04-06 16:44:10 +03001708 max_lane_count, intel_dp->common_rates[max_clock],
Damien Lespiau241bfc32013-09-25 16:45:37 +01001709 adjusted_mode->crtc_clock);
Daniel Vetter083f9562012-04-20 20:23:49 +02001710
Daniel Vetter36008362013-03-27 00:44:59 +01001711 /* Walk through all bpp values. Luckily they're all nicely spaced with 2
1712 * bpc in between. */
Mika Kaholaf9bb7052016-09-09 14:10:56 +03001713 bpp = intel_dp_compute_bpp(intel_dp, pipe_config);
Jani Nikula1853a9d2017-08-18 12:30:20 +03001714 if (intel_dp_is_edp(intel_dp)) {
Thulasimani,Sivakumar22ce5622015-07-31 11:05:27 +05301715
1716 /* Get bpp from vbt only for panels that dont have bpp in edid */
1717 if (intel_connector->base.display_info.bpc == 0 &&
Jani Nikula6aa23e62016-03-24 17:50:20 +02001718 (dev_priv->vbt.edp.bpp && dev_priv->vbt.edp.bpp < bpp)) {
Jani Nikula56071a22014-05-06 14:56:52 +03001719 DRM_DEBUG_KMS("clamping bpp for eDP panel to BIOS-provided %i\n",
Jani Nikula6aa23e62016-03-24 17:50:20 +02001720 dev_priv->vbt.edp.bpp);
1721 bpp = dev_priv->vbt.edp.bpp;
Jani Nikula56071a22014-05-06 14:56:52 +03001722 }
1723
Jani Nikula344c5bb2014-09-09 11:25:13 +03001724 /*
1725 * Use the maximum clock and number of lanes the eDP panel
1726 * advertizes being capable of. The panels are generally
1727 * designed to support only a single clock and lane
1728 * configuration, and typically these values correspond to the
1729 * native resolution of the panel.
1730 */
1731 min_lane_count = max_lane_count;
1732 min_clock = max_clock;
Imre Deak79842112013-07-18 17:44:13 +03001733 }
Daniel Vetter657445f2013-05-04 10:09:18 +02001734
Daniel Vetter36008362013-03-27 00:44:59 +01001735 for (; bpp >= 6*3; bpp -= 2*3) {
Damien Lespiau241bfc32013-09-25 16:45:37 +01001736 mode_rate = intel_dp_link_required(adjusted_mode->crtc_clock,
1737 bpp);
Daniel Vetterc4867932012-04-10 10:42:36 +02001738
Dave Airliec6930992014-07-14 11:04:39 +10001739 for (clock = min_clock; clock <= max_clock; clock++) {
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301740 for (lane_count = min_lane_count;
1741 lane_count <= max_lane_count;
1742 lane_count <<= 1) {
1743
Jani Nikula975ee5fca2017-04-06 16:44:10 +03001744 link_clock = intel_dp->common_rates[clock];
Daniel Vetter36008362013-03-27 00:44:59 +01001745 link_avail = intel_dp_max_data_rate(link_clock,
1746 lane_count);
Ville Syrjälä3685a8f2013-01-17 16:31:28 +02001747
Daniel Vetter36008362013-03-27 00:44:59 +01001748 if (mode_rate <= link_avail) {
1749 goto found;
1750 }
1751 }
1752 }
1753 }
1754
1755 return false;
1756
1757found:
Maarten Lankhorst8f647a02017-05-01 15:38:01 +02001758 if (intel_conn_state->broadcast_rgb == INTEL_BROADCAST_RGB_AUTO) {
Ville Syrjälä55bc60d2013-01-17 16:31:29 +02001759 /*
1760 * See:
1761 * CEA-861-E - 5.1 Default Encoding Parameters
1762 * VESA DisplayPort Ver.1.2a - 5.1.1.1 Video Colorimetry
1763 */
Ville Syrjälä0f2a2a72015-07-06 15:10:00 +03001764 pipe_config->limited_color_range =
Ville Syrjäläc8127cf02017-01-11 16:18:35 +02001765 bpp != 18 &&
1766 drm_default_rgb_quant_range(adjusted_mode) ==
1767 HDMI_QUANTIZATION_RANGE_LIMITED;
Ville Syrjälä0f2a2a72015-07-06 15:10:00 +03001768 } else {
1769 pipe_config->limited_color_range =
Maarten Lankhorst8f647a02017-05-01 15:38:01 +02001770 intel_conn_state->broadcast_rgb == INTEL_BROADCAST_RGB_LIMITED;
Ville Syrjälä55bc60d2013-01-17 16:31:29 +02001771 }
1772
Ville Syrjälä90a6b7b2015-07-06 16:39:15 +03001773 pipe_config->lane_count = lane_count;
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301774
Daniel Vetter657445f2013-05-04 10:09:18 +02001775 pipe_config->pipe_bpp = bpp;
Jani Nikula975ee5fca2017-04-06 16:44:10 +03001776 pipe_config->port_clock = intel_dp->common_rates[clock];
Daniel Vetterc4867932012-04-10 10:42:36 +02001777
Ville Syrjälä04a60f92015-07-06 15:10:06 +03001778 intel_dp_compute_rate(intel_dp, pipe_config->port_clock,
1779 &link_bw, &rate_select);
1780
1781 DRM_DEBUG_KMS("DP link bw %02x rate select %02x lane count %d clock %d bpp %d\n",
1782 link_bw, rate_select, pipe_config->lane_count,
Daniel Vetterff9a6752013-06-01 17:16:21 +02001783 pipe_config->port_clock, bpp);
Daniel Vetter36008362013-03-27 00:44:59 +01001784 DRM_DEBUG_KMS("DP link bw required %i available %i\n",
1785 mode_rate, link_avail);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001786
Daniel Vetter03afc4a2013-04-02 23:42:31 +02001787 intel_link_compute_m_n(bpp, lane_count,
Damien Lespiau241bfc32013-09-25 16:45:37 +01001788 adjusted_mode->crtc_clock,
1789 pipe_config->port_clock,
Jani Nikulab31e85e2017-05-18 14:10:25 +03001790 &pipe_config->dp_m_n,
1791 reduce_m_n);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001792
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05301793 if (intel_connector->panel.downclock_mode != NULL &&
Vandana Kannan96178ee2015-01-10 02:25:56 +05301794 dev_priv->drrs.type == SEAMLESS_DRRS_SUPPORT) {
Vandana Kannanf769cd22014-08-05 07:51:22 -07001795 pipe_config->has_drrs = true;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05301796 intel_link_compute_m_n(bpp, lane_count,
1797 intel_connector->panel.downclock_mode->clock,
1798 pipe_config->port_clock,
Jani Nikulab31e85e2017-05-18 14:10:25 +03001799 &pipe_config->dp_m2_n2,
1800 reduce_m_n);
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05301801 }
1802
Ville Syrjälä14d41b32016-05-13 23:41:22 +03001803 /*
1804 * DPLL0 VCO may need to be adjusted to get the correct
1805 * clock for eDP. This will affect cdclk as well.
1806 */
Jani Nikula1853a9d2017-08-18 12:30:20 +03001807 if (intel_dp_is_edp(intel_dp) && IS_GEN9_BC(dev_priv)) {
Ville Syrjälä14d41b32016-05-13 23:41:22 +03001808 int vco;
1809
1810 switch (pipe_config->port_clock / 2) {
1811 case 108000:
1812 case 216000:
Ville Syrjälä63911d72016-05-13 23:41:32 +03001813 vco = 8640000;
Ville Syrjälä14d41b32016-05-13 23:41:22 +03001814 break;
1815 default:
Ville Syrjälä63911d72016-05-13 23:41:32 +03001816 vco = 8100000;
Ville Syrjälä14d41b32016-05-13 23:41:22 +03001817 break;
1818 }
1819
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02001820 to_intel_atomic_state(pipe_config->base.state)->cdclk.logical.vco = vco;
Ville Syrjälä14d41b32016-05-13 23:41:22 +03001821 }
1822
Tvrtko Ursulin4f8036a2016-10-13 11:02:52 +01001823 if (!HAS_DDI(dev_priv))
Ville Syrjälä840b32b2015-08-11 20:21:46 +03001824 intel_dp_set_clock(encoder, pipe_config);
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001825
Ville Syrjälä4d90f2d2017-10-12 16:02:01 +03001826 intel_psr_compute_config(intel_dp, pipe_config);
1827
Daniel Vetter36008362013-03-27 00:44:59 +01001828 return true;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001829}
1830
Ville Syrjälä901c2da2015-08-17 18:05:12 +03001831void intel_dp_set_link_params(struct intel_dp *intel_dp,
Ander Conselvan de Oliveiradfa10482016-09-01 15:08:06 -07001832 int link_rate, uint8_t lane_count,
1833 bool link_mst)
Ville Syrjälä901c2da2015-08-17 18:05:12 +03001834{
Ander Conselvan de Oliveiradfa10482016-09-01 15:08:06 -07001835 intel_dp->link_rate = link_rate;
1836 intel_dp->lane_count = lane_count;
1837 intel_dp->link_mst = link_mst;
Ville Syrjälä901c2da2015-08-17 18:05:12 +03001838}
1839
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02001840static void intel_dp_prepare(struct intel_encoder *encoder,
Ville Syrjälä5f88a9c2017-08-18 16:49:58 +03001841 const struct intel_crtc_state *pipe_config)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001842{
Ville Syrjälä2f773472017-11-09 17:27:58 +02001843 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
Daniel Vetterb934223d2013-07-21 21:37:05 +02001844 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02001845 enum port port = encoder->port;
Ville Syrjäläadc10302017-10-31 22:51:14 +02001846 struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02001847 const struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001848
Ander Conselvan de Oliveiradfa10482016-09-01 15:08:06 -07001849 intel_dp_set_link_params(intel_dp, pipe_config->port_clock,
1850 pipe_config->lane_count,
1851 intel_crtc_has_type(pipe_config,
1852 INTEL_OUTPUT_DP_MST));
Ville Syrjälä901c2da2015-08-17 18:05:12 +03001853
Keith Packard417e8222011-11-01 19:54:11 -07001854 /*
Keith Packard1a2eb462011-11-16 16:26:07 -08001855 * There are four kinds of DP registers:
Keith Packard417e8222011-11-01 19:54:11 -07001856 *
1857 * IBX PCH
Keith Packard1a2eb462011-11-16 16:26:07 -08001858 * SNB CPU
1859 * IVB CPU
Keith Packard417e8222011-11-01 19:54:11 -07001860 * CPT PCH
1861 *
1862 * IBX PCH and CPU are the same for almost everything,
1863 * except that the CPU DP PLL is configured in this
1864 * register
1865 *
1866 * CPT PCH is quite different, having many bits moved
1867 * to the TRANS_DP_CTL register instead. That
1868 * configuration happens (oddly) in ironlake_pch_enable
1869 */
Adam Jackson9c9e7922010-04-05 17:57:59 -04001870
Keith Packard417e8222011-11-01 19:54:11 -07001871 /* Preserve the BIOS-computed detected bit. This is
1872 * supposed to be read-only.
1873 */
1874 intel_dp->DP = I915_READ(intel_dp->output_reg) & DP_DETECTED;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001875
Keith Packard417e8222011-11-01 19:54:11 -07001876 /* Handle DP bits in common between all three register formats */
Keith Packard417e8222011-11-01 19:54:11 -07001877 intel_dp->DP |= DP_VOLTAGE_0_4 | DP_PRE_EMPHASIS_0;
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02001878 intel_dp->DP |= DP_PORT_WIDTH(pipe_config->lane_count);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001879
Keith Packard417e8222011-11-01 19:54:11 -07001880 /* Split out the IBX/CPU vs CPT settings */
Zhenyu Wang32f9d652009-07-24 01:00:32 +08001881
Tvrtko Ursulin5db94012016-10-13 11:03:10 +01001882 if (IS_GEN7(dev_priv) && port == PORT_A) {
Keith Packard1a2eb462011-11-16 16:26:07 -08001883 if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
1884 intel_dp->DP |= DP_SYNC_HS_HIGH;
1885 if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
1886 intel_dp->DP |= DP_SYNC_VS_HIGH;
1887 intel_dp->DP |= DP_LINK_TRAIN_OFF_CPT;
1888
Jani Nikula6aba5b62013-10-04 15:08:10 +03001889 if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
Keith Packard1a2eb462011-11-16 16:26:07 -08001890 intel_dp->DP |= DP_ENHANCED_FRAMING;
1891
Daniel Vetter7c62a162013-06-01 17:16:20 +02001892 intel_dp->DP |= crtc->pipe << 29;
Tvrtko Ursulin6e266952016-10-13 11:02:53 +01001893 } else if (HAS_PCH_CPT(dev_priv) && port != PORT_A) {
Ville Syrjäläe3ef4472015-05-05 17:17:31 +03001894 u32 trans_dp;
1895
Ville Syrjälä39e5fa82015-05-05 17:17:29 +03001896 intel_dp->DP |= DP_LINK_TRAIN_OFF_CPT;
Ville Syrjäläe3ef4472015-05-05 17:17:31 +03001897
1898 trans_dp = I915_READ(TRANS_DP_CTL(crtc->pipe));
1899 if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
1900 trans_dp |= TRANS_DP_ENH_FRAMING;
1901 else
1902 trans_dp &= ~TRANS_DP_ENH_FRAMING;
1903 I915_WRITE(TRANS_DP_CTL(crtc->pipe), trans_dp);
Ville Syrjälä39e5fa82015-05-05 17:17:29 +03001904 } else {
Ville Syrjäläc99f53f2016-11-14 19:44:07 +02001905 if (IS_G4X(dev_priv) && pipe_config->limited_color_range)
Ville Syrjälä0f2a2a72015-07-06 15:10:00 +03001906 intel_dp->DP |= DP_COLOR_RANGE_16_235;
Keith Packard417e8222011-11-01 19:54:11 -07001907
1908 if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
1909 intel_dp->DP |= DP_SYNC_HS_HIGH;
1910 if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
1911 intel_dp->DP |= DP_SYNC_VS_HIGH;
1912 intel_dp->DP |= DP_LINK_TRAIN_OFF;
1913
Jani Nikula6aba5b62013-10-04 15:08:10 +03001914 if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
Keith Packard417e8222011-11-01 19:54:11 -07001915 intel_dp->DP |= DP_ENHANCED_FRAMING;
1916
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +01001917 if (IS_CHERRYVIEW(dev_priv))
Chon Ming Lee44f37d12014-04-09 13:28:21 +03001918 intel_dp->DP |= DP_PIPE_SELECT_CHV(crtc->pipe);
Ville Syrjälä39e5fa82015-05-05 17:17:29 +03001919 else if (crtc->pipe == PIPE_B)
1920 intel_dp->DP |= DP_PIPEB_SELECT;
Zhenyu Wang32f9d652009-07-24 01:00:32 +08001921 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001922}
1923
Paulo Zanoniffd6749d2013-12-19 14:29:42 -02001924#define IDLE_ON_MASK (PP_ON | PP_SEQUENCE_MASK | 0 | PP_SEQUENCE_STATE_MASK)
1925#define IDLE_ON_VALUE (PP_ON | PP_SEQUENCE_NONE | 0 | PP_SEQUENCE_STATE_ON_IDLE)
Keith Packard99ea7122011-11-01 19:57:50 -07001926
Paulo Zanoni1a5ef5b2013-12-19 14:29:43 -02001927#define IDLE_OFF_MASK (PP_ON | PP_SEQUENCE_MASK | 0 | 0)
1928#define IDLE_OFF_VALUE (0 | PP_SEQUENCE_NONE | 0 | 0)
Keith Packard99ea7122011-11-01 19:57:50 -07001929
Paulo Zanoniffd6749d2013-12-19 14:29:42 -02001930#define IDLE_CYCLE_MASK (PP_ON | PP_SEQUENCE_MASK | PP_CYCLE_DELAY_ACTIVE | PP_SEQUENCE_STATE_MASK)
1931#define IDLE_CYCLE_VALUE (0 | PP_SEQUENCE_NONE | 0 | PP_SEQUENCE_STATE_OFF_IDLE)
Keith Packard99ea7122011-11-01 19:57:50 -07001932
Ville Syrjälä46bd8382017-10-31 22:51:22 +02001933static void intel_pps_verify_state(struct intel_dp *intel_dp);
Imre Deakde9c1b62016-06-16 20:01:46 +03001934
Daniel Vetter4be73782014-01-17 14:39:48 +01001935static void wait_panel_status(struct intel_dp *intel_dp,
Keith Packard99ea7122011-11-01 19:57:50 -07001936 u32 mask,
1937 u32 value)
1938{
Ville Syrjälä2f773472017-11-09 17:27:58 +02001939 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Ville Syrjäläf0f59a02015-11-18 15:33:26 +02001940 i915_reg_t pp_stat_reg, pp_ctrl_reg;
Jesse Barnes453c5422013-03-28 09:55:41 -07001941
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001942 lockdep_assert_held(&dev_priv->pps_mutex);
1943
Ville Syrjälä46bd8382017-10-31 22:51:22 +02001944 intel_pps_verify_state(intel_dp);
Imre Deakde9c1b62016-06-16 20:01:46 +03001945
Jani Nikulabf13e812013-09-06 07:40:05 +03001946 pp_stat_reg = _pp_stat_reg(intel_dp);
1947 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
Keith Packard99ea7122011-11-01 19:57:50 -07001948
1949 DRM_DEBUG_KMS("mask %08x value %08x status %08x control %08x\n",
Jesse Barnes453c5422013-03-28 09:55:41 -07001950 mask, value,
1951 I915_READ(pp_stat_reg),
1952 I915_READ(pp_ctrl_reg));
Keith Packard99ea7122011-11-01 19:57:50 -07001953
Chris Wilson9036ff02016-06-30 15:33:09 +01001954 if (intel_wait_for_register(dev_priv,
1955 pp_stat_reg, mask, value,
1956 5000))
Keith Packard99ea7122011-11-01 19:57:50 -07001957 DRM_ERROR("Panel status timeout: status %08x control %08x\n",
Jesse Barnes453c5422013-03-28 09:55:41 -07001958 I915_READ(pp_stat_reg),
1959 I915_READ(pp_ctrl_reg));
Chris Wilson54c136d2013-12-02 09:57:16 +00001960
1961 DRM_DEBUG_KMS("Wait complete\n");
Keith Packard99ea7122011-11-01 19:57:50 -07001962}
1963
Daniel Vetter4be73782014-01-17 14:39:48 +01001964static void wait_panel_on(struct intel_dp *intel_dp)
Keith Packard99ea7122011-11-01 19:57:50 -07001965{
1966 DRM_DEBUG_KMS("Wait for panel power on\n");
Daniel Vetter4be73782014-01-17 14:39:48 +01001967 wait_panel_status(intel_dp, IDLE_ON_MASK, IDLE_ON_VALUE);
Keith Packard99ea7122011-11-01 19:57:50 -07001968}
1969
Daniel Vetter4be73782014-01-17 14:39:48 +01001970static void wait_panel_off(struct intel_dp *intel_dp)
Keith Packardbd943152011-09-18 23:09:52 -07001971{
Keith Packardbd943152011-09-18 23:09:52 -07001972 DRM_DEBUG_KMS("Wait for panel power off time\n");
Daniel Vetter4be73782014-01-17 14:39:48 +01001973 wait_panel_status(intel_dp, IDLE_OFF_MASK, IDLE_OFF_VALUE);
Keith Packardbd943152011-09-18 23:09:52 -07001974}
Keith Packardbd943152011-09-18 23:09:52 -07001975
Daniel Vetter4be73782014-01-17 14:39:48 +01001976static void wait_panel_power_cycle(struct intel_dp *intel_dp)
Keith Packard99ea7122011-11-01 19:57:50 -07001977{
Abhay Kumard28d4732016-01-22 17:39:04 -08001978 ktime_t panel_power_on_time;
1979 s64 panel_power_off_duration;
1980
Keith Packard99ea7122011-11-01 19:57:50 -07001981 DRM_DEBUG_KMS("Wait for panel power cycle\n");
Paulo Zanonidce56b32013-12-19 14:29:40 -02001982
Abhay Kumard28d4732016-01-22 17:39:04 -08001983 /* take the difference of currrent time and panel power off time
1984 * and then make panel wait for t11_t12 if needed. */
1985 panel_power_on_time = ktime_get_boottime();
1986 panel_power_off_duration = ktime_ms_delta(panel_power_on_time, intel_dp->panel_power_off_time);
1987
Paulo Zanonidce56b32013-12-19 14:29:40 -02001988 /* When we disable the VDD override bit last we have to do the manual
1989 * wait. */
Abhay Kumard28d4732016-01-22 17:39:04 -08001990 if (panel_power_off_duration < (s64)intel_dp->panel_power_cycle_delay)
1991 wait_remaining_ms_from_jiffies(jiffies,
1992 intel_dp->panel_power_cycle_delay - panel_power_off_duration);
Paulo Zanonidce56b32013-12-19 14:29:40 -02001993
Daniel Vetter4be73782014-01-17 14:39:48 +01001994 wait_panel_status(intel_dp, IDLE_CYCLE_MASK, IDLE_CYCLE_VALUE);
Keith Packard99ea7122011-11-01 19:57:50 -07001995}
Keith Packardbd943152011-09-18 23:09:52 -07001996
Daniel Vetter4be73782014-01-17 14:39:48 +01001997static void wait_backlight_on(struct intel_dp *intel_dp)
Paulo Zanonidce56b32013-12-19 14:29:40 -02001998{
1999 wait_remaining_ms_from_jiffies(intel_dp->last_power_on,
2000 intel_dp->backlight_on_delay);
2001}
2002
Daniel Vetter4be73782014-01-17 14:39:48 +01002003static void edp_wait_backlight_off(struct intel_dp *intel_dp)
Paulo Zanonidce56b32013-12-19 14:29:40 -02002004{
2005 wait_remaining_ms_from_jiffies(intel_dp->last_backlight_off,
2006 intel_dp->backlight_off_delay);
2007}
Keith Packard99ea7122011-11-01 19:57:50 -07002008
Keith Packard832dd3c2011-11-01 19:34:06 -07002009/* Read the current pp_control value, unlocking the register if it
2010 * is locked
2011 */
2012
Jesse Barnes453c5422013-03-28 09:55:41 -07002013static u32 ironlake_get_pp_control(struct intel_dp *intel_dp)
Keith Packard832dd3c2011-11-01 19:34:06 -07002014{
Ville Syrjälä2f773472017-11-09 17:27:58 +02002015 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Jesse Barnes453c5422013-03-28 09:55:41 -07002016 u32 control;
Jesse Barnes453c5422013-03-28 09:55:41 -07002017
Ville Syrjäläe39b9992014-09-04 14:53:14 +03002018 lockdep_assert_held(&dev_priv->pps_mutex);
2019
Jani Nikulabf13e812013-09-06 07:40:05 +03002020 control = I915_READ(_pp_ctrl_reg(intel_dp));
Imre Deak8090ba82016-08-10 14:07:33 +03002021 if (WARN_ON(!HAS_DDI(dev_priv) &&
2022 (control & PANEL_UNLOCK_MASK) != PANEL_UNLOCK_REGS)) {
Vandana Kannanb0a08be2015-06-18 11:00:55 +05302023 control &= ~PANEL_UNLOCK_MASK;
2024 control |= PANEL_UNLOCK_REGS;
2025 }
Keith Packard832dd3c2011-11-01 19:34:06 -07002026 return control;
Keith Packardbd943152011-09-18 23:09:52 -07002027}
2028
Ville Syrjälä951468f2014-09-04 14:55:31 +03002029/*
2030 * Must be paired with edp_panel_vdd_off().
2031 * Must hold pps_mutex around the whole on/off sequence.
2032 * Can be nested with intel_edp_panel_vdd_{on,off}() calls.
2033 */
Ville Syrjälä1e0560e2014-08-19 13:24:25 +03002034static bool edp_panel_vdd_on(struct intel_dp *intel_dp)
Jesse Barnes5d613502011-01-24 17:10:54 -08002035{
Ville Syrjälä2f773472017-11-09 17:27:58 +02002036 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Imre Deak4e6e1a52014-03-27 17:45:11 +02002037 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Jesse Barnes5d613502011-01-24 17:10:54 -08002038 u32 pp;
Ville Syrjäläf0f59a02015-11-18 15:33:26 +02002039 i915_reg_t pp_stat_reg, pp_ctrl_reg;
Jani Nikulaadddaaf2014-03-14 16:51:13 +02002040 bool need_to_disable = !intel_dp->want_panel_vdd;
Jesse Barnes5d613502011-01-24 17:10:54 -08002041
Ville Syrjäläe39b9992014-09-04 14:53:14 +03002042 lockdep_assert_held(&dev_priv->pps_mutex);
2043
Jani Nikula1853a9d2017-08-18 12:30:20 +03002044 if (!intel_dp_is_edp(intel_dp))
Jani Nikulaadddaaf2014-03-14 16:51:13 +02002045 return false;
Keith Packardbd943152011-09-18 23:09:52 -07002046
Egbert Eich2c623c12014-11-25 12:54:57 +01002047 cancel_delayed_work(&intel_dp->panel_vdd_work);
Keith Packardbd943152011-09-18 23:09:52 -07002048 intel_dp->want_panel_vdd = true;
Keith Packard99ea7122011-11-01 19:57:50 -07002049
Daniel Vetter4be73782014-01-17 14:39:48 +01002050 if (edp_have_panel_vdd(intel_dp))
Jani Nikulaadddaaf2014-03-14 16:51:13 +02002051 return need_to_disable;
Paulo Zanonib0665d52013-10-30 19:50:27 -02002052
Ander Conselvan de Oliveira5432fca2017-02-22 08:34:26 +02002053 intel_display_power_get(dev_priv, intel_dp->aux_power_domain);
Paulo Zanonie9cb81a2013-11-21 13:47:23 -02002054
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03002055 DRM_DEBUG_KMS("Turning eDP port %c VDD on\n",
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02002056 port_name(intel_dig_port->base.port));
Keith Packardbd943152011-09-18 23:09:52 -07002057
Daniel Vetter4be73782014-01-17 14:39:48 +01002058 if (!edp_have_panel_power(intel_dp))
2059 wait_panel_power_cycle(intel_dp);
Keith Packard99ea7122011-11-01 19:57:50 -07002060
Jesse Barnes453c5422013-03-28 09:55:41 -07002061 pp = ironlake_get_pp_control(intel_dp);
Jesse Barnes5d613502011-01-24 17:10:54 -08002062 pp |= EDP_FORCE_VDD;
Keith Packardebf33b12011-09-29 15:53:27 -07002063
Jani Nikulabf13e812013-09-06 07:40:05 +03002064 pp_stat_reg = _pp_stat_reg(intel_dp);
2065 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
Jesse Barnes453c5422013-03-28 09:55:41 -07002066
2067 I915_WRITE(pp_ctrl_reg, pp);
2068 POSTING_READ(pp_ctrl_reg);
2069 DRM_DEBUG_KMS("PP_STATUS: 0x%08x PP_CONTROL: 0x%08x\n",
2070 I915_READ(pp_stat_reg), I915_READ(pp_ctrl_reg));
Keith Packardebf33b12011-09-29 15:53:27 -07002071 /*
2072 * If the panel wasn't on, delay before accessing aux channel
2073 */
Daniel Vetter4be73782014-01-17 14:39:48 +01002074 if (!edp_have_panel_power(intel_dp)) {
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03002075 DRM_DEBUG_KMS("eDP port %c panel power wasn't enabled\n",
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02002076 port_name(intel_dig_port->base.port));
Keith Packardf01eca22011-09-28 16:48:10 -07002077 msleep(intel_dp->panel_power_up_delay);
Keith Packardf01eca22011-09-28 16:48:10 -07002078 }
Jani Nikulaadddaaf2014-03-14 16:51:13 +02002079
2080 return need_to_disable;
2081}
2082
Ville Syrjälä951468f2014-09-04 14:55:31 +03002083/*
2084 * Must be paired with intel_edp_panel_vdd_off() or
2085 * intel_edp_panel_off().
2086 * Nested calls to these functions are not allowed since
2087 * we drop the lock. Caller must use some higher level
2088 * locking to prevent nested calls from other threads.
2089 */
Daniel Vetterb80d6c72014-03-19 15:54:37 +01002090void intel_edp_panel_vdd_on(struct intel_dp *intel_dp)
Jani Nikulaadddaaf2014-03-14 16:51:13 +02002091{
Ville Syrjäläc695b6b2014-08-18 22:16:03 +03002092 bool vdd;
Jani Nikulaadddaaf2014-03-14 16:51:13 +02002093
Jani Nikula1853a9d2017-08-18 12:30:20 +03002094 if (!intel_dp_is_edp(intel_dp))
Ville Syrjäläc695b6b2014-08-18 22:16:03 +03002095 return;
2096
Ville Syrjälä773538e82014-09-04 14:54:56 +03002097 pps_lock(intel_dp);
Ville Syrjäläc695b6b2014-08-18 22:16:03 +03002098 vdd = edp_panel_vdd_on(intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03002099 pps_unlock(intel_dp);
Ville Syrjäläc695b6b2014-08-18 22:16:03 +03002100
Rob Clarke2c719b2014-12-15 13:56:32 -05002101 I915_STATE_WARN(!vdd, "eDP port %c VDD already requested on\n",
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02002102 port_name(dp_to_dig_port(intel_dp)->base.port));
Jesse Barnes5d613502011-01-24 17:10:54 -08002103}
2104
Daniel Vetter4be73782014-01-17 14:39:48 +01002105static void edp_panel_vdd_off_sync(struct intel_dp *intel_dp)
Jesse Barnes5d613502011-01-24 17:10:54 -08002106{
Ville Syrjälä2f773472017-11-09 17:27:58 +02002107 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03002108 struct intel_digital_port *intel_dig_port =
2109 dp_to_dig_port(intel_dp);
Jesse Barnes5d613502011-01-24 17:10:54 -08002110 u32 pp;
Ville Syrjäläf0f59a02015-11-18 15:33:26 +02002111 i915_reg_t pp_stat_reg, pp_ctrl_reg;
Jesse Barnes5d613502011-01-24 17:10:54 -08002112
Ville Syrjäläe39b9992014-09-04 14:53:14 +03002113 lockdep_assert_held(&dev_priv->pps_mutex);
Daniel Vettera0e99e62012-12-02 01:05:46 +01002114
Ville Syrjälä15e899a2014-08-18 22:16:02 +03002115 WARN_ON(intel_dp->want_panel_vdd);
Imre Deak4e6e1a52014-03-27 17:45:11 +02002116
Ville Syrjälä15e899a2014-08-18 22:16:02 +03002117 if (!edp_have_panel_vdd(intel_dp))
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03002118 return;
Paulo Zanonib0665d52013-10-30 19:50:27 -02002119
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03002120 DRM_DEBUG_KMS("Turning eDP port %c VDD off\n",
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02002121 port_name(intel_dig_port->base.port));
Jesse Barnes453c5422013-03-28 09:55:41 -07002122
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03002123 pp = ironlake_get_pp_control(intel_dp);
2124 pp &= ~EDP_FORCE_VDD;
Jesse Barnes453c5422013-03-28 09:55:41 -07002125
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03002126 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
2127 pp_stat_reg = _pp_stat_reg(intel_dp);
Jesse Barnes5d613502011-01-24 17:10:54 -08002128
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03002129 I915_WRITE(pp_ctrl_reg, pp);
2130 POSTING_READ(pp_ctrl_reg);
Paulo Zanoni90791a52013-12-06 17:32:42 -02002131
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03002132 /* Make sure sequencer is idle before allowing subsequent activity */
2133 DRM_DEBUG_KMS("PP_STATUS: 0x%08x PP_CONTROL: 0x%08x\n",
2134 I915_READ(pp_stat_reg), I915_READ(pp_ctrl_reg));
Paulo Zanonie9cb81a2013-11-21 13:47:23 -02002135
Imre Deak5a162e22016-08-10 14:07:30 +03002136 if ((pp & PANEL_POWER_ON) == 0)
Abhay Kumard28d4732016-01-22 17:39:04 -08002137 intel_dp->panel_power_off_time = ktime_get_boottime();
Paulo Zanonie9cb81a2013-11-21 13:47:23 -02002138
Ander Conselvan de Oliveira5432fca2017-02-22 08:34:26 +02002139 intel_display_power_put(dev_priv, intel_dp->aux_power_domain);
Keith Packardbd943152011-09-18 23:09:52 -07002140}
2141
Daniel Vetter4be73782014-01-17 14:39:48 +01002142static void edp_panel_vdd_work(struct work_struct *__work)
Keith Packardbd943152011-09-18 23:09:52 -07002143{
2144 struct intel_dp *intel_dp = container_of(to_delayed_work(__work),
2145 struct intel_dp, panel_vdd_work);
Keith Packardbd943152011-09-18 23:09:52 -07002146
Ville Syrjälä773538e82014-09-04 14:54:56 +03002147 pps_lock(intel_dp);
Ville Syrjälä15e899a2014-08-18 22:16:02 +03002148 if (!intel_dp->want_panel_vdd)
2149 edp_panel_vdd_off_sync(intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03002150 pps_unlock(intel_dp);
Keith Packardbd943152011-09-18 23:09:52 -07002151}
2152
Imre Deakaba86892014-07-30 15:57:31 +03002153static void edp_panel_vdd_schedule_off(struct intel_dp *intel_dp)
2154{
2155 unsigned long delay;
2156
2157 /*
2158 * Queue the timer to fire a long time from now (relative to the power
2159 * down delay) to keep the panel power up across a sequence of
2160 * operations.
2161 */
2162 delay = msecs_to_jiffies(intel_dp->panel_power_cycle_delay * 5);
2163 schedule_delayed_work(&intel_dp->panel_vdd_work, delay);
2164}
2165
Ville Syrjälä951468f2014-09-04 14:55:31 +03002166/*
2167 * Must be paired with edp_panel_vdd_on().
2168 * Must hold pps_mutex around the whole on/off sequence.
2169 * Can be nested with intel_edp_panel_vdd_{on,off}() calls.
2170 */
Daniel Vetter4be73782014-01-17 14:39:48 +01002171static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync)
Keith Packardbd943152011-09-18 23:09:52 -07002172{
Chris Wilsonfac5e232016-07-04 11:34:36 +01002173 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Ville Syrjäläe39b9992014-09-04 14:53:14 +03002174
2175 lockdep_assert_held(&dev_priv->pps_mutex);
2176
Jani Nikula1853a9d2017-08-18 12:30:20 +03002177 if (!intel_dp_is_edp(intel_dp))
Keith Packard97af61f572011-09-28 16:23:51 -07002178 return;
Jesse Barnes5d613502011-01-24 17:10:54 -08002179
Rob Clarke2c719b2014-12-15 13:56:32 -05002180 I915_STATE_WARN(!intel_dp->want_panel_vdd, "eDP port %c VDD not forced on",
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02002181 port_name(dp_to_dig_port(intel_dp)->base.port));
Keith Packardf2e8b182011-11-01 20:01:35 -07002182
Keith Packardbd943152011-09-18 23:09:52 -07002183 intel_dp->want_panel_vdd = false;
2184
Imre Deakaba86892014-07-30 15:57:31 +03002185 if (sync)
Daniel Vetter4be73782014-01-17 14:39:48 +01002186 edp_panel_vdd_off_sync(intel_dp);
Imre Deakaba86892014-07-30 15:57:31 +03002187 else
2188 edp_panel_vdd_schedule_off(intel_dp);
Jesse Barnes5d613502011-01-24 17:10:54 -08002189}
2190
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03002191static void edp_panel_on(struct intel_dp *intel_dp)
Jesse Barnes9934c132010-07-22 13:18:19 -07002192{
Ville Syrjälä2f773472017-11-09 17:27:58 +02002193 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Keith Packard99ea7122011-11-01 19:57:50 -07002194 u32 pp;
Ville Syrjäläf0f59a02015-11-18 15:33:26 +02002195 i915_reg_t pp_ctrl_reg;
Jesse Barnes9934c132010-07-22 13:18:19 -07002196
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03002197 lockdep_assert_held(&dev_priv->pps_mutex);
2198
Jani Nikula1853a9d2017-08-18 12:30:20 +03002199 if (!intel_dp_is_edp(intel_dp))
Keith Packardbd943152011-09-18 23:09:52 -07002200 return;
Keith Packard99ea7122011-11-01 19:57:50 -07002201
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03002202 DRM_DEBUG_KMS("Turn eDP port %c panel power on\n",
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02002203 port_name(dp_to_dig_port(intel_dp)->base.port));
Keith Packard99ea7122011-11-01 19:57:50 -07002204
Ville Syrjäläe7a89ac2014-10-16 21:30:07 +03002205 if (WARN(edp_have_panel_power(intel_dp),
2206 "eDP port %c panel power already on\n",
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02002207 port_name(dp_to_dig_port(intel_dp)->base.port)))
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03002208 return;
Jesse Barnes9934c132010-07-22 13:18:19 -07002209
Daniel Vetter4be73782014-01-17 14:39:48 +01002210 wait_panel_power_cycle(intel_dp);
Jesse Barnes37c6c9b2010-08-11 10:04:43 -07002211
Jani Nikulabf13e812013-09-06 07:40:05 +03002212 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
Jesse Barnes453c5422013-03-28 09:55:41 -07002213 pp = ironlake_get_pp_control(intel_dp);
Tvrtko Ursulin5db94012016-10-13 11:03:10 +01002214 if (IS_GEN5(dev_priv)) {
Keith Packard05ce1a42011-09-29 16:33:01 -07002215 /* ILK workaround: disable reset around power sequence */
2216 pp &= ~PANEL_POWER_RESET;
Jani Nikulabf13e812013-09-06 07:40:05 +03002217 I915_WRITE(pp_ctrl_reg, pp);
2218 POSTING_READ(pp_ctrl_reg);
Keith Packard05ce1a42011-09-29 16:33:01 -07002219 }
Jesse Barnes37c6c9b2010-08-11 10:04:43 -07002220
Imre Deak5a162e22016-08-10 14:07:30 +03002221 pp |= PANEL_POWER_ON;
Tvrtko Ursulin5db94012016-10-13 11:03:10 +01002222 if (!IS_GEN5(dev_priv))
Keith Packard99ea7122011-11-01 19:57:50 -07002223 pp |= PANEL_POWER_RESET;
2224
Jesse Barnes453c5422013-03-28 09:55:41 -07002225 I915_WRITE(pp_ctrl_reg, pp);
2226 POSTING_READ(pp_ctrl_reg);
Jesse Barnes9934c132010-07-22 13:18:19 -07002227
Daniel Vetter4be73782014-01-17 14:39:48 +01002228 wait_panel_on(intel_dp);
Paulo Zanonidce56b32013-12-19 14:29:40 -02002229 intel_dp->last_power_on = jiffies;
Jesse Barnes9934c132010-07-22 13:18:19 -07002230
Tvrtko Ursulin5db94012016-10-13 11:03:10 +01002231 if (IS_GEN5(dev_priv)) {
Keith Packard05ce1a42011-09-29 16:33:01 -07002232 pp |= PANEL_POWER_RESET; /* restore panel reset bit */
Jani Nikulabf13e812013-09-06 07:40:05 +03002233 I915_WRITE(pp_ctrl_reg, pp);
2234 POSTING_READ(pp_ctrl_reg);
Keith Packard05ce1a42011-09-29 16:33:01 -07002235 }
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03002236}
Ville Syrjäläe39b9992014-09-04 14:53:14 +03002237
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03002238void intel_edp_panel_on(struct intel_dp *intel_dp)
2239{
Jani Nikula1853a9d2017-08-18 12:30:20 +03002240 if (!intel_dp_is_edp(intel_dp))
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03002241 return;
2242
2243 pps_lock(intel_dp);
2244 edp_panel_on(intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03002245 pps_unlock(intel_dp);
Jesse Barnes9934c132010-07-22 13:18:19 -07002246}
2247
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03002248
2249static void edp_panel_off(struct intel_dp *intel_dp)
Jesse Barnes9934c132010-07-22 13:18:19 -07002250{
Ville Syrjälä2f773472017-11-09 17:27:58 +02002251 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Keith Packard99ea7122011-11-01 19:57:50 -07002252 u32 pp;
Ville Syrjäläf0f59a02015-11-18 15:33:26 +02002253 i915_reg_t pp_ctrl_reg;
Jesse Barnes9934c132010-07-22 13:18:19 -07002254
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03002255 lockdep_assert_held(&dev_priv->pps_mutex);
2256
Jani Nikula1853a9d2017-08-18 12:30:20 +03002257 if (!intel_dp_is_edp(intel_dp))
Keith Packard97af61f572011-09-28 16:23:51 -07002258 return;
Jesse Barnes37c6c9b2010-08-11 10:04:43 -07002259
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03002260 DRM_DEBUG_KMS("Turn eDP port %c panel power off\n",
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02002261 port_name(dp_to_dig_port(intel_dp)->base.port));
Jesse Barnes37c6c9b2010-08-11 10:04:43 -07002262
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03002263 WARN(!intel_dp->want_panel_vdd, "Need eDP port %c VDD to turn off panel\n",
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02002264 port_name(dp_to_dig_port(intel_dp)->base.port));
Jani Nikula24f3e092014-03-17 16:43:36 +02002265
Jesse Barnes453c5422013-03-28 09:55:41 -07002266 pp = ironlake_get_pp_control(intel_dp);
Daniel Vetter35a38552012-08-12 22:17:14 +02002267 /* We need to switch off panel power _and_ force vdd, for otherwise some
2268 * panels get very unhappy and cease to work. */
Imre Deak5a162e22016-08-10 14:07:30 +03002269 pp &= ~(PANEL_POWER_ON | PANEL_POWER_RESET | EDP_FORCE_VDD |
Patrik Jakobssonb3064152014-03-04 00:42:44 +01002270 EDP_BLC_ENABLE);
Jesse Barnes453c5422013-03-28 09:55:41 -07002271
Jani Nikulabf13e812013-09-06 07:40:05 +03002272 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
Jesse Barnes453c5422013-03-28 09:55:41 -07002273
Paulo Zanoni849e39f2014-03-07 20:05:20 -03002274 intel_dp->want_panel_vdd = false;
2275
Jesse Barnes453c5422013-03-28 09:55:41 -07002276 I915_WRITE(pp_ctrl_reg, pp);
2277 POSTING_READ(pp_ctrl_reg);
Jesse Barnes9934c132010-07-22 13:18:19 -07002278
Daniel Vetter4be73782014-01-17 14:39:48 +01002279 wait_panel_off(intel_dp);
Manasi Navared7ba25b2017-10-04 09:48:26 -07002280 intel_dp->panel_power_off_time = ktime_get_boottime();
Paulo Zanoni849e39f2014-03-07 20:05:20 -03002281
2282 /* We got a reference when we enabled the VDD. */
Ander Conselvan de Oliveira5432fca2017-02-22 08:34:26 +02002283 intel_display_power_put(dev_priv, intel_dp->aux_power_domain);
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03002284}
Ville Syrjäläe39b9992014-09-04 14:53:14 +03002285
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03002286void intel_edp_panel_off(struct intel_dp *intel_dp)
2287{
Jani Nikula1853a9d2017-08-18 12:30:20 +03002288 if (!intel_dp_is_edp(intel_dp))
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03002289 return;
2290
2291 pps_lock(intel_dp);
2292 edp_panel_off(intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03002293 pps_unlock(intel_dp);
Jesse Barnes9934c132010-07-22 13:18:19 -07002294}
2295
Jani Nikula1250d102014-08-12 17:11:39 +03002296/* Enable backlight in the panel power control. */
2297static void _intel_edp_backlight_on(struct intel_dp *intel_dp)
Zhenyu Wang32f9d652009-07-24 01:00:32 +08002298{
Ville Syrjälä2f773472017-11-09 17:27:58 +02002299 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Zhenyu Wang32f9d652009-07-24 01:00:32 +08002300 u32 pp;
Ville Syrjäläf0f59a02015-11-18 15:33:26 +02002301 i915_reg_t pp_ctrl_reg;
Zhenyu Wang32f9d652009-07-24 01:00:32 +08002302
Jesse Barnes01cb9ea2010-10-07 16:01:12 -07002303 /*
2304 * If we enable the backlight right away following a panel power
2305 * on, we may see slight flicker as the panel syncs with the eDP
2306 * link. So delay a bit to make sure the image is solid before
2307 * allowing it to appear.
2308 */
Daniel Vetter4be73782014-01-17 14:39:48 +01002309 wait_backlight_on(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03002310
Ville Syrjälä773538e82014-09-04 14:54:56 +03002311 pps_lock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03002312
Jesse Barnes453c5422013-03-28 09:55:41 -07002313 pp = ironlake_get_pp_control(intel_dp);
Zhenyu Wang32f9d652009-07-24 01:00:32 +08002314 pp |= EDP_BLC_ENABLE;
Jesse Barnes453c5422013-03-28 09:55:41 -07002315
Jani Nikulabf13e812013-09-06 07:40:05 +03002316 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
Jesse Barnes453c5422013-03-28 09:55:41 -07002317
2318 I915_WRITE(pp_ctrl_reg, pp);
2319 POSTING_READ(pp_ctrl_reg);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03002320
Ville Syrjälä773538e82014-09-04 14:54:56 +03002321 pps_unlock(intel_dp);
Zhenyu Wang32f9d652009-07-24 01:00:32 +08002322}
2323
Jani Nikula1250d102014-08-12 17:11:39 +03002324/* Enable backlight PWM and backlight PP control. */
Maarten Lankhorstb037d582017-06-12 12:21:13 +02002325void intel_edp_backlight_on(const struct intel_crtc_state *crtc_state,
2326 const struct drm_connector_state *conn_state)
Jani Nikula1250d102014-08-12 17:11:39 +03002327{
Maarten Lankhorstb037d582017-06-12 12:21:13 +02002328 struct intel_dp *intel_dp = enc_to_intel_dp(conn_state->best_encoder);
2329
Jani Nikula1853a9d2017-08-18 12:30:20 +03002330 if (!intel_dp_is_edp(intel_dp))
Jani Nikula1250d102014-08-12 17:11:39 +03002331 return;
2332
2333 DRM_DEBUG_KMS("\n");
2334
Maarten Lankhorstb037d582017-06-12 12:21:13 +02002335 intel_panel_enable_backlight(crtc_state, conn_state);
Jani Nikula1250d102014-08-12 17:11:39 +03002336 _intel_edp_backlight_on(intel_dp);
2337}
2338
2339/* Disable backlight in the panel power control. */
2340static void _intel_edp_backlight_off(struct intel_dp *intel_dp)
Zhenyu Wang32f9d652009-07-24 01:00:32 +08002341{
Ville Syrjälä2f773472017-11-09 17:27:58 +02002342 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Zhenyu Wang32f9d652009-07-24 01:00:32 +08002343 u32 pp;
Ville Syrjäläf0f59a02015-11-18 15:33:26 +02002344 i915_reg_t pp_ctrl_reg;
Zhenyu Wang32f9d652009-07-24 01:00:32 +08002345
Jani Nikula1853a9d2017-08-18 12:30:20 +03002346 if (!intel_dp_is_edp(intel_dp))
Keith Packardf01eca22011-09-28 16:48:10 -07002347 return;
2348
Ville Syrjälä773538e82014-09-04 14:54:56 +03002349 pps_lock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03002350
Jesse Barnes453c5422013-03-28 09:55:41 -07002351 pp = ironlake_get_pp_control(intel_dp);
Zhenyu Wang32f9d652009-07-24 01:00:32 +08002352 pp &= ~EDP_BLC_ENABLE;
Jesse Barnes453c5422013-03-28 09:55:41 -07002353
Jani Nikulabf13e812013-09-06 07:40:05 +03002354 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
Jesse Barnes453c5422013-03-28 09:55:41 -07002355
2356 I915_WRITE(pp_ctrl_reg, pp);
2357 POSTING_READ(pp_ctrl_reg);
Jesse Barnesf7d23232014-03-31 11:13:56 -07002358
Ville Syrjälä773538e82014-09-04 14:54:56 +03002359 pps_unlock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03002360
Paulo Zanonidce56b32013-12-19 14:29:40 -02002361 intel_dp->last_backlight_off = jiffies;
Jesse Barnesf7d23232014-03-31 11:13:56 -07002362 edp_wait_backlight_off(intel_dp);
Jani Nikula1250d102014-08-12 17:11:39 +03002363}
Jesse Barnesf7d23232014-03-31 11:13:56 -07002364
Jani Nikula1250d102014-08-12 17:11:39 +03002365/* Disable backlight PP control and backlight PWM. */
Maarten Lankhorstb037d582017-06-12 12:21:13 +02002366void intel_edp_backlight_off(const struct drm_connector_state *old_conn_state)
Jani Nikula1250d102014-08-12 17:11:39 +03002367{
Maarten Lankhorstb037d582017-06-12 12:21:13 +02002368 struct intel_dp *intel_dp = enc_to_intel_dp(old_conn_state->best_encoder);
2369
Jani Nikula1853a9d2017-08-18 12:30:20 +03002370 if (!intel_dp_is_edp(intel_dp))
Jani Nikula1250d102014-08-12 17:11:39 +03002371 return;
2372
2373 DRM_DEBUG_KMS("\n");
2374
2375 _intel_edp_backlight_off(intel_dp);
Maarten Lankhorstb037d582017-06-12 12:21:13 +02002376 intel_panel_disable_backlight(old_conn_state);
Zhenyu Wang32f9d652009-07-24 01:00:32 +08002377}
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002378
Jani Nikula73580fb72014-08-12 17:11:41 +03002379/*
2380 * Hook for controlling the panel power control backlight through the bl_power
2381 * sysfs attribute. Take care to handle multiple calls.
2382 */
2383static void intel_edp_backlight_power(struct intel_connector *connector,
2384 bool enable)
2385{
2386 struct intel_dp *intel_dp = intel_attached_dp(&connector->base);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03002387 bool is_enabled;
2388
Ville Syrjälä773538e82014-09-04 14:54:56 +03002389 pps_lock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03002390 is_enabled = ironlake_get_pp_control(intel_dp) & EDP_BLC_ENABLE;
Ville Syrjälä773538e82014-09-04 14:54:56 +03002391 pps_unlock(intel_dp);
Jani Nikula73580fb72014-08-12 17:11:41 +03002392
2393 if (is_enabled == enable)
2394 return;
2395
Jani Nikula23ba9372014-08-27 14:08:43 +03002396 DRM_DEBUG_KMS("panel power control backlight %s\n",
2397 enable ? "enable" : "disable");
Jani Nikula73580fb72014-08-12 17:11:41 +03002398
2399 if (enable)
2400 _intel_edp_backlight_on(intel_dp);
2401 else
2402 _intel_edp_backlight_off(intel_dp);
2403}
2404
Ville Syrjälä64e10772015-10-29 21:26:01 +02002405static void assert_dp_port(struct intel_dp *intel_dp, bool state)
2406{
2407 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
2408 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
2409 bool cur_state = I915_READ(intel_dp->output_reg) & DP_PORT_EN;
2410
2411 I915_STATE_WARN(cur_state != state,
2412 "DP port %c state assertion failure (expected %s, current %s)\n",
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02002413 port_name(dig_port->base.port),
Jani Nikula87ad3212016-01-14 12:53:34 +02002414 onoff(state), onoff(cur_state));
Ville Syrjälä64e10772015-10-29 21:26:01 +02002415}
2416#define assert_dp_port_disabled(d) assert_dp_port((d), false)
2417
2418static void assert_edp_pll(struct drm_i915_private *dev_priv, bool state)
2419{
2420 bool cur_state = I915_READ(DP_A) & DP_PLL_ENABLE;
2421
2422 I915_STATE_WARN(cur_state != state,
2423 "eDP PLL state assertion failure (expected %s, current %s)\n",
Jani Nikula87ad3212016-01-14 12:53:34 +02002424 onoff(state), onoff(cur_state));
Ville Syrjälä64e10772015-10-29 21:26:01 +02002425}
2426#define assert_edp_pll_enabled(d) assert_edp_pll((d), true)
2427#define assert_edp_pll_disabled(d) assert_edp_pll((d), false)
2428
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02002429static void ironlake_edp_pll_on(struct intel_dp *intel_dp,
Ville Syrjälä5f88a9c2017-08-18 16:49:58 +03002430 const struct intel_crtc_state *pipe_config)
Jesse Barnesd240f202010-08-13 15:43:26 -07002431{
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02002432 struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
Ville Syrjälä64e10772015-10-29 21:26:01 +02002433 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
Jesse Barnesd240f202010-08-13 15:43:26 -07002434
Ville Syrjälä64e10772015-10-29 21:26:01 +02002435 assert_pipe_disabled(dev_priv, crtc->pipe);
2436 assert_dp_port_disabled(intel_dp);
2437 assert_edp_pll_disabled(dev_priv);
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02002438
Ville Syrjäläabfce942015-10-29 21:26:03 +02002439 DRM_DEBUG_KMS("enabling eDP PLL for clock %d\n",
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02002440 pipe_config->port_clock);
Ville Syrjäläabfce942015-10-29 21:26:03 +02002441
2442 intel_dp->DP &= ~DP_PLL_FREQ_MASK;
2443
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02002444 if (pipe_config->port_clock == 162000)
Ville Syrjäläabfce942015-10-29 21:26:03 +02002445 intel_dp->DP |= DP_PLL_FREQ_162MHZ;
2446 else
2447 intel_dp->DP |= DP_PLL_FREQ_270MHZ;
2448
2449 I915_WRITE(DP_A, intel_dp->DP);
2450 POSTING_READ(DP_A);
2451 udelay(500);
2452
Ville Syrjälä6b23f3e2016-04-01 21:53:19 +03002453 /*
2454 * [DevILK] Work around required when enabling DP PLL
2455 * while a pipe is enabled going to FDI:
2456 * 1. Wait for the start of vertical blank on the enabled pipe going to FDI
2457 * 2. Program DP PLL enable
2458 */
2459 if (IS_GEN5(dev_priv))
Ville Syrjälä0f0f74b2016-10-31 22:37:06 +02002460 intel_wait_for_vblank_if_active(dev_priv, !crtc->pipe);
Ville Syrjälä6b23f3e2016-04-01 21:53:19 +03002461
Daniel Vetter07679352012-09-06 22:15:42 +02002462 intel_dp->DP |= DP_PLL_ENABLE;
Ville Syrjälä6fec7662015-11-10 16:16:17 +02002463
Daniel Vetter07679352012-09-06 22:15:42 +02002464 I915_WRITE(DP_A, intel_dp->DP);
Jesse Barnes298b0b32010-10-07 16:01:24 -07002465 POSTING_READ(DP_A);
2466 udelay(200);
Jesse Barnesd240f202010-08-13 15:43:26 -07002467}
2468
Ville Syrjäläadc10302017-10-31 22:51:14 +02002469static void ironlake_edp_pll_off(struct intel_dp *intel_dp,
2470 const struct intel_crtc_state *old_crtc_state)
Jesse Barnesd240f202010-08-13 15:43:26 -07002471{
Ville Syrjäläadc10302017-10-31 22:51:14 +02002472 struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc);
Ville Syrjälä64e10772015-10-29 21:26:01 +02002473 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
Jesse Barnesd240f202010-08-13 15:43:26 -07002474
Ville Syrjälä64e10772015-10-29 21:26:01 +02002475 assert_pipe_disabled(dev_priv, crtc->pipe);
2476 assert_dp_port_disabled(intel_dp);
2477 assert_edp_pll_enabled(dev_priv);
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02002478
Ville Syrjäläabfce942015-10-29 21:26:03 +02002479 DRM_DEBUG_KMS("disabling eDP PLL\n");
2480
Ville Syrjälä6fec7662015-11-10 16:16:17 +02002481 intel_dp->DP &= ~DP_PLL_ENABLE;
Daniel Vetter07679352012-09-06 22:15:42 +02002482
Ville Syrjälä6fec7662015-11-10 16:16:17 +02002483 I915_WRITE(DP_A, intel_dp->DP);
Chris Wilson1af5fa12010-09-08 21:07:28 +01002484 POSTING_READ(DP_A);
Jesse Barnesd240f202010-08-13 15:43:26 -07002485 udelay(200);
2486}
2487
Ville Syrjälä857c4162017-10-27 12:45:23 +03002488static bool downstream_hpd_needs_d0(struct intel_dp *intel_dp)
2489{
2490 /*
2491 * DPCD 1.2+ should support BRANCH_DEVICE_CTRL, and thus
2492 * be capable of signalling downstream hpd with a long pulse.
2493 * Whether or not that means D3 is safe to use is not clear,
2494 * but let's assume so until proven otherwise.
2495 *
2496 * FIXME should really check all downstream ports...
2497 */
2498 return intel_dp->dpcd[DP_DPCD_REV] == 0x11 &&
2499 intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] & DP_DWN_STRM_PORT_PRESENT &&
2500 intel_dp->downstream_ports[0] & DP_DS_PORT_HPD;
2501}
2502
Jesse Barnesc7ad3812011-07-07 11:11:03 -07002503/* If the sink supports it, try to set the power state appropriately */
Paulo Zanonic19b0662012-10-15 15:51:41 -03002504void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode)
Jesse Barnesc7ad3812011-07-07 11:11:03 -07002505{
2506 int ret, i;
2507
2508 /* Should have a valid DPCD by this point */
2509 if (intel_dp->dpcd[DP_DPCD_REV] < 0x11)
2510 return;
2511
2512 if (mode != DRM_MODE_DPMS_ON) {
Ville Syrjälä857c4162017-10-27 12:45:23 +03002513 if (downstream_hpd_needs_d0(intel_dp))
2514 return;
2515
Jani Nikula9d1a1032014-03-14 16:51:15 +02002516 ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_SET_POWER,
2517 DP_SET_POWER_D3);
Jesse Barnesc7ad3812011-07-07 11:11:03 -07002518 } else {
Imre Deak357c0ae2016-11-21 21:15:06 +02002519 struct intel_lspcon *lspcon = dp_to_lspcon(intel_dp);
2520
Jesse Barnesc7ad3812011-07-07 11:11:03 -07002521 /*
2522 * When turning on, we need to retry for 1ms to give the sink
2523 * time to wake up.
2524 */
2525 for (i = 0; i < 3; i++) {
Jani Nikula9d1a1032014-03-14 16:51:15 +02002526 ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_SET_POWER,
2527 DP_SET_POWER_D0);
Jesse Barnesc7ad3812011-07-07 11:11:03 -07002528 if (ret == 1)
2529 break;
2530 msleep(1);
2531 }
Imre Deak357c0ae2016-11-21 21:15:06 +02002532
2533 if (ret == 1 && lspcon->active)
2534 lspcon_wait_pcon_mode(lspcon);
Jesse Barnesc7ad3812011-07-07 11:11:03 -07002535 }
Jani Nikulaf9cac722014-09-02 16:33:52 +03002536
2537 if (ret != 1)
2538 DRM_DEBUG_KMS("failed to %s sink power state\n",
2539 mode == DRM_MODE_DPMS_ON ? "enable" : "disable");
Jesse Barnesc7ad3812011-07-07 11:11:03 -07002540}
2541
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002542static bool intel_dp_get_hw_state(struct intel_encoder *encoder,
2543 enum pipe *pipe)
Jesse Barnesd240f202010-08-13 15:43:26 -07002544{
Ville Syrjälä2f773472017-11-09 17:27:58 +02002545 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002546 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02002547 enum port port = encoder->port;
Imre Deak6d129be2014-03-05 16:20:54 +02002548 u32 tmp;
Imre Deak6fa9a5e2016-02-12 18:55:18 +02002549 bool ret;
Imre Deak6d129be2014-03-05 16:20:54 +02002550
Ander Conselvan de Oliveira79f255a2017-02-22 08:34:27 +02002551 if (!intel_display_power_get_if_enabled(dev_priv,
2552 encoder->power_domain))
Imre Deak6d129be2014-03-05 16:20:54 +02002553 return false;
2554
Imre Deak6fa9a5e2016-02-12 18:55:18 +02002555 ret = false;
2556
Imre Deak6d129be2014-03-05 16:20:54 +02002557 tmp = I915_READ(intel_dp->output_reg);
Jesse Barnesd240f202010-08-13 15:43:26 -07002558
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002559 if (!(tmp & DP_PORT_EN))
Imre Deak6fa9a5e2016-02-12 18:55:18 +02002560 goto out;
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002561
Tvrtko Ursulin5db94012016-10-13 11:03:10 +01002562 if (IS_GEN7(dev_priv) && port == PORT_A) {
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002563 *pipe = PORT_TO_PIPE_CPT(tmp);
Tvrtko Ursulin6e266952016-10-13 11:02:53 +01002564 } else if (HAS_PCH_CPT(dev_priv) && port != PORT_A) {
Ville Syrjäläadc289d2015-05-05 17:17:30 +03002565 enum pipe p;
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002566
Ville Syrjäläadc289d2015-05-05 17:17:30 +03002567 for_each_pipe(dev_priv, p) {
2568 u32 trans_dp = I915_READ(TRANS_DP_CTL(p));
2569 if (TRANS_DP_PIPE_TO_PORT(trans_dp) == port) {
2570 *pipe = p;
Imre Deak6fa9a5e2016-02-12 18:55:18 +02002571 ret = true;
2572
2573 goto out;
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002574 }
2575 }
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002576
Daniel Vetter4a0833e2012-10-26 10:58:11 +02002577 DRM_DEBUG_KMS("No pipe for dp port 0x%x found\n",
Ville Syrjäläf0f59a02015-11-18 15:33:26 +02002578 i915_mmio_reg_offset(intel_dp->output_reg));
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +01002579 } else if (IS_CHERRYVIEW(dev_priv)) {
Ville Syrjälä39e5fa82015-05-05 17:17:29 +03002580 *pipe = DP_PORT_TO_PIPE_CHV(tmp);
2581 } else {
2582 *pipe = PORT_TO_PIPE(tmp);
Daniel Vetter4a0833e2012-10-26 10:58:11 +02002583 }
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002584
Imre Deak6fa9a5e2016-02-12 18:55:18 +02002585 ret = true;
2586
2587out:
Ander Conselvan de Oliveira79f255a2017-02-22 08:34:27 +02002588 intel_display_power_put(dev_priv, encoder->power_domain);
Imre Deak6fa9a5e2016-02-12 18:55:18 +02002589
2590 return ret;
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002591}
2592
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002593static void intel_dp_get_config(struct intel_encoder *encoder,
Ander Conselvan de Oliveira5cec2582015-01-15 14:55:21 +02002594 struct intel_crtc_state *pipe_config)
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002595{
Ville Syrjälä2f773472017-11-09 17:27:58 +02002596 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002597 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002598 u32 tmp, flags = 0;
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02002599 enum port port = encoder->port;
Ville Syrjäläadc10302017-10-31 22:51:14 +02002600 struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002601
Ville Syrjäläe1214b92017-10-27 22:31:23 +03002602 if (encoder->type == INTEL_OUTPUT_EDP)
2603 pipe_config->output_types |= BIT(INTEL_OUTPUT_EDP);
2604 else
2605 pipe_config->output_types |= BIT(INTEL_OUTPUT_DP);
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002606
Daniel Vetter9ed109a2014-04-24 23:54:52 +02002607 tmp = I915_READ(intel_dp->output_reg);
Jani Nikula9fcb1702015-05-05 16:32:12 +03002608
2609 pipe_config->has_audio = tmp & DP_AUDIO_OUTPUT_ENABLE && port != PORT_A;
Daniel Vetter9ed109a2014-04-24 23:54:52 +02002610
Tvrtko Ursulin6e266952016-10-13 11:02:53 +01002611 if (HAS_PCH_CPT(dev_priv) && port != PORT_A) {
Ville Syrjäläb81e34c2015-07-06 15:10:03 +03002612 u32 trans_dp = I915_READ(TRANS_DP_CTL(crtc->pipe));
2613
2614 if (trans_dp & TRANS_DP_HSYNC_ACTIVE_HIGH)
Xiong Zhang63000ef2013-06-28 12:59:06 +08002615 flags |= DRM_MODE_FLAG_PHSYNC;
2616 else
2617 flags |= DRM_MODE_FLAG_NHSYNC;
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002618
Ville Syrjäläb81e34c2015-07-06 15:10:03 +03002619 if (trans_dp & TRANS_DP_VSYNC_ACTIVE_HIGH)
Xiong Zhang63000ef2013-06-28 12:59:06 +08002620 flags |= DRM_MODE_FLAG_PVSYNC;
2621 else
2622 flags |= DRM_MODE_FLAG_NVSYNC;
Ville Syrjälä39e5fa82015-05-05 17:17:29 +03002623 } else {
2624 if (tmp & DP_SYNC_HS_HIGH)
2625 flags |= DRM_MODE_FLAG_PHSYNC;
2626 else
2627 flags |= DRM_MODE_FLAG_NHSYNC;
2628
2629 if (tmp & DP_SYNC_VS_HIGH)
2630 flags |= DRM_MODE_FLAG_PVSYNC;
2631 else
2632 flags |= DRM_MODE_FLAG_NVSYNC;
Xiong Zhang63000ef2013-06-28 12:59:06 +08002633 }
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002634
Ander Conselvan de Oliveira2d112de2015-01-15 14:55:22 +02002635 pipe_config->base.adjusted_mode.flags |= flags;
Jesse Barnesf1f644d2013-06-27 00:39:25 +03002636
Ville Syrjäläc99f53f2016-11-14 19:44:07 +02002637 if (IS_G4X(dev_priv) && tmp & DP_COLOR_RANGE_16_235)
Ville Syrjälä8c875fc2014-09-12 15:46:29 +03002638 pipe_config->limited_color_range = true;
2639
Ville Syrjälä90a6b7b2015-07-06 16:39:15 +03002640 pipe_config->lane_count =
2641 ((tmp & DP_PORT_WIDTH_MASK) >> DP_PORT_WIDTH_SHIFT) + 1;
2642
Ville Syrjäläeb14cb72013-09-10 17:02:54 +03002643 intel_dp_get_m_n(crtc, pipe_config);
2644
Ville Syrjälä18442d02013-09-13 16:00:08 +03002645 if (port == PORT_A) {
Ville Syrjäläb377e0d2015-10-29 21:25:59 +02002646 if ((I915_READ(DP_A) & DP_PLL_FREQ_MASK) == DP_PLL_FREQ_162MHZ)
Jesse Barnesf1f644d2013-06-27 00:39:25 +03002647 pipe_config->port_clock = 162000;
2648 else
2649 pipe_config->port_clock = 270000;
2650 }
Ville Syrjälä18442d02013-09-13 16:00:08 +03002651
Ville Syrjäläe3b247d2016-02-17 21:41:09 +02002652 pipe_config->base.adjusted_mode.crtc_clock =
2653 intel_dotclock_calculate(pipe_config->port_clock,
2654 &pipe_config->dp_m_n);
Daniel Vetter7f16e5c2013-11-04 16:28:47 +01002655
Jani Nikula1853a9d2017-08-18 12:30:20 +03002656 if (intel_dp_is_edp(intel_dp) && dev_priv->vbt.edp.bpp &&
Jani Nikula6aa23e62016-03-24 17:50:20 +02002657 pipe_config->pipe_bpp > dev_priv->vbt.edp.bpp) {
Jani Nikulac6cd2ee2013-10-21 10:52:07 +03002658 /*
2659 * This is a big fat ugly hack.
2660 *
2661 * Some machines in UEFI boot mode provide us a VBT that has 18
2662 * bpp and 1.62 GHz link bandwidth for eDP, which for reasons
2663 * unknown we fail to light up. Yet the same BIOS boots up with
2664 * 24 bpp and 2.7 GHz link. Use the same bpp as the BIOS uses as
2665 * max, not what it tells us to use.
2666 *
2667 * Note: This will still be broken if the eDP panel is not lit
2668 * up by the BIOS, and thus we can't get the mode at module
2669 * load.
2670 */
2671 DRM_DEBUG_KMS("pipe has %d bpp for eDP panel, overriding BIOS-provided max %d bpp\n",
Jani Nikula6aa23e62016-03-24 17:50:20 +02002672 pipe_config->pipe_bpp, dev_priv->vbt.edp.bpp);
2673 dev_priv->vbt.edp.bpp = pipe_config->pipe_bpp;
Jani Nikulac6cd2ee2013-10-21 10:52:07 +03002674 }
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002675}
2676
Maarten Lankhorstfd6bbda2016-08-09 17:04:04 +02002677static void intel_disable_dp(struct intel_encoder *encoder,
Ville Syrjälä5f88a9c2017-08-18 16:49:58 +03002678 const struct intel_crtc_state *old_crtc_state,
2679 const struct drm_connector_state *old_conn_state)
Jesse Barnesd240f202010-08-13 15:43:26 -07002680{
Daniel Vettere8cb4552012-07-01 13:05:48 +02002681 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Jani Nikula495a5bb2014-10-27 16:26:55 +02002682
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02002683 if (old_crtc_state->has_audio)
Ville Syrjälä8ec47de2017-10-30 20:46:53 +02002684 intel_audio_codec_disable(encoder,
2685 old_crtc_state, old_conn_state);
Daniel Vetter6cb49832012-05-20 17:14:50 +02002686
2687 /* Make sure the panel is off before trying to change the mode. But also
2688 * ensure that we have vdd while we switch off the panel. */
Jani Nikula24f3e092014-03-17 16:43:36 +02002689 intel_edp_panel_vdd_on(intel_dp);
Maarten Lankhorstb037d582017-06-12 12:21:13 +02002690 intel_edp_backlight_off(old_conn_state);
Jani Nikulafdbc3b12013-11-12 17:10:13 +02002691 intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
Daniel Vetter4be73782014-01-17 14:39:48 +01002692 intel_edp_panel_off(intel_dp);
Ville Syrjälä1a8ff602017-09-20 18:12:51 +03002693}
2694
2695static void g4x_disable_dp(struct intel_encoder *encoder,
2696 const struct intel_crtc_state *old_crtc_state,
2697 const struct drm_connector_state *old_conn_state)
2698{
Ville Syrjälä1a8ff602017-09-20 18:12:51 +03002699 intel_disable_dp(encoder, old_crtc_state, old_conn_state);
Daniel Vetter37398502012-09-06 22:15:44 +02002700
Ville Syrjälä08aff3f2014-08-18 22:16:09 +03002701 /* disable the port before the pipe on g4x */
Ville Syrjäläadc10302017-10-31 22:51:14 +02002702 intel_dp_link_down(encoder, old_crtc_state);
Ville Syrjälä1a8ff602017-09-20 18:12:51 +03002703}
2704
2705static void ilk_disable_dp(struct intel_encoder *encoder,
2706 const struct intel_crtc_state *old_crtc_state,
2707 const struct drm_connector_state *old_conn_state)
2708{
2709 intel_disable_dp(encoder, old_crtc_state, old_conn_state);
2710}
2711
2712static void vlv_disable_dp(struct intel_encoder *encoder,
2713 const struct intel_crtc_state *old_crtc_state,
2714 const struct drm_connector_state *old_conn_state)
2715{
2716 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2717
2718 intel_psr_disable(intel_dp, old_crtc_state);
2719
2720 intel_disable_dp(encoder, old_crtc_state, old_conn_state);
Jesse Barnesd240f202010-08-13 15:43:26 -07002721}
2722
Maarten Lankhorstfd6bbda2016-08-09 17:04:04 +02002723static void ilk_post_disable_dp(struct intel_encoder *encoder,
Ville Syrjälä5f88a9c2017-08-18 16:49:58 +03002724 const struct intel_crtc_state *old_crtc_state,
2725 const struct drm_connector_state *old_conn_state)
Jesse Barnesd240f202010-08-13 15:43:26 -07002726{
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02002727 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Ville Syrjäläadc10302017-10-31 22:51:14 +02002728 enum port port = encoder->port;
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02002729
Ville Syrjäläadc10302017-10-31 22:51:14 +02002730 intel_dp_link_down(encoder, old_crtc_state);
Ville Syrjäläabfce942015-10-29 21:26:03 +02002731
2732 /* Only ilk+ has port A */
Ville Syrjälä08aff3f2014-08-18 22:16:09 +03002733 if (port == PORT_A)
Ville Syrjäläadc10302017-10-31 22:51:14 +02002734 ironlake_edp_pll_off(intel_dp, old_crtc_state);
Ville Syrjälä49277c32014-03-31 18:21:26 +03002735}
2736
Maarten Lankhorstfd6bbda2016-08-09 17:04:04 +02002737static void vlv_post_disable_dp(struct intel_encoder *encoder,
Ville Syrjälä5f88a9c2017-08-18 16:49:58 +03002738 const struct intel_crtc_state *old_crtc_state,
2739 const struct drm_connector_state *old_conn_state)
Ville Syrjälä49277c32014-03-31 18:21:26 +03002740{
Ville Syrjäläadc10302017-10-31 22:51:14 +02002741 intel_dp_link_down(encoder, old_crtc_state);
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02002742}
2743
Maarten Lankhorstfd6bbda2016-08-09 17:04:04 +02002744static void chv_post_disable_dp(struct intel_encoder *encoder,
Ville Syrjälä5f88a9c2017-08-18 16:49:58 +03002745 const struct intel_crtc_state *old_crtc_state,
2746 const struct drm_connector_state *old_conn_state)
Ville Syrjälä580d3812014-04-09 13:29:00 +03002747{
Ville Syrjäläadc10302017-10-31 22:51:14 +02002748 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
Ville Syrjälä580d3812014-04-09 13:29:00 +03002749
Ville Syrjäläadc10302017-10-31 22:51:14 +02002750 intel_dp_link_down(encoder, old_crtc_state);
Ville Syrjälä580d3812014-04-09 13:29:00 +03002751
Ville Syrjäläa5805162015-05-26 20:42:30 +03002752 mutex_lock(&dev_priv->sb_lock);
Ville Syrjälä580d3812014-04-09 13:29:00 +03002753
Ville Syrjäläa8f327f2015-07-09 20:14:11 +03002754 /* Assert data lane reset */
Ville Syrjälä2e1029c2017-10-31 22:51:18 +02002755 chv_data_lane_soft_reset(encoder, old_crtc_state, true);
Ville Syrjälä580d3812014-04-09 13:29:00 +03002756
Ville Syrjäläa5805162015-05-26 20:42:30 +03002757 mutex_unlock(&dev_priv->sb_lock);
Ville Syrjälä580d3812014-04-09 13:29:00 +03002758}
2759
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002760static void
2761_intel_dp_set_link_train(struct intel_dp *intel_dp,
2762 uint32_t *DP,
2763 uint8_t dp_train_pat)
2764{
Ville Syrjälä2f773472017-11-09 17:27:58 +02002765 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002766 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02002767 enum port port = intel_dig_port->base.port;
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002768
Pandiyan, Dhinakaran8b0878a2016-08-04 13:48:35 -07002769 if (dp_train_pat & DP_TRAINING_PATTERN_MASK)
2770 DRM_DEBUG_KMS("Using DP training pattern TPS%d\n",
2771 dp_train_pat & DP_TRAINING_PATTERN_MASK);
2772
Tvrtko Ursulin4f8036a2016-10-13 11:02:52 +01002773 if (HAS_DDI(dev_priv)) {
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002774 uint32_t temp = I915_READ(DP_TP_CTL(port));
2775
2776 if (dp_train_pat & DP_LINK_SCRAMBLING_DISABLE)
2777 temp |= DP_TP_CTL_SCRAMBLE_DISABLE;
2778 else
2779 temp &= ~DP_TP_CTL_SCRAMBLE_DISABLE;
2780
2781 temp &= ~DP_TP_CTL_LINK_TRAIN_MASK;
2782 switch (dp_train_pat & DP_TRAINING_PATTERN_MASK) {
2783 case DP_TRAINING_PATTERN_DISABLE:
2784 temp |= DP_TP_CTL_LINK_TRAIN_NORMAL;
2785
2786 break;
2787 case DP_TRAINING_PATTERN_1:
2788 temp |= DP_TP_CTL_LINK_TRAIN_PAT1;
2789 break;
2790 case DP_TRAINING_PATTERN_2:
2791 temp |= DP_TP_CTL_LINK_TRAIN_PAT2;
2792 break;
2793 case DP_TRAINING_PATTERN_3:
2794 temp |= DP_TP_CTL_LINK_TRAIN_PAT3;
2795 break;
2796 }
2797 I915_WRITE(DP_TP_CTL(port), temp);
2798
Tvrtko Ursulin5db94012016-10-13 11:03:10 +01002799 } else if ((IS_GEN7(dev_priv) && port == PORT_A) ||
Tvrtko Ursulin6e266952016-10-13 11:02:53 +01002800 (HAS_PCH_CPT(dev_priv) && port != PORT_A)) {
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002801 *DP &= ~DP_LINK_TRAIN_MASK_CPT;
2802
2803 switch (dp_train_pat & DP_TRAINING_PATTERN_MASK) {
2804 case DP_TRAINING_PATTERN_DISABLE:
2805 *DP |= DP_LINK_TRAIN_OFF_CPT;
2806 break;
2807 case DP_TRAINING_PATTERN_1:
2808 *DP |= DP_LINK_TRAIN_PAT_1_CPT;
2809 break;
2810 case DP_TRAINING_PATTERN_2:
2811 *DP |= DP_LINK_TRAIN_PAT_2_CPT;
2812 break;
2813 case DP_TRAINING_PATTERN_3:
Pandiyan, Dhinakaran8b0878a2016-08-04 13:48:35 -07002814 DRM_DEBUG_KMS("TPS3 not supported, using TPS2 instead\n");
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002815 *DP |= DP_LINK_TRAIN_PAT_2_CPT;
2816 break;
2817 }
2818
2819 } else {
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +01002820 if (IS_CHERRYVIEW(dev_priv))
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002821 *DP &= ~DP_LINK_TRAIN_MASK_CHV;
2822 else
2823 *DP &= ~DP_LINK_TRAIN_MASK;
2824
2825 switch (dp_train_pat & DP_TRAINING_PATTERN_MASK) {
2826 case DP_TRAINING_PATTERN_DISABLE:
2827 *DP |= DP_LINK_TRAIN_OFF;
2828 break;
2829 case DP_TRAINING_PATTERN_1:
2830 *DP |= DP_LINK_TRAIN_PAT_1;
2831 break;
2832 case DP_TRAINING_PATTERN_2:
2833 *DP |= DP_LINK_TRAIN_PAT_2;
2834 break;
2835 case DP_TRAINING_PATTERN_3:
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +01002836 if (IS_CHERRYVIEW(dev_priv)) {
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002837 *DP |= DP_LINK_TRAIN_PAT_3_CHV;
2838 } else {
Pandiyan, Dhinakaran8b0878a2016-08-04 13:48:35 -07002839 DRM_DEBUG_KMS("TPS3 not supported, using TPS2 instead\n");
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002840 *DP |= DP_LINK_TRAIN_PAT_2;
2841 }
2842 break;
2843 }
2844 }
2845}
2846
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02002847static void intel_dp_enable_port(struct intel_dp *intel_dp,
Ville Syrjälä5f88a9c2017-08-18 16:49:58 +03002848 const struct intel_crtc_state *old_crtc_state)
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002849{
Ville Syrjälä2f773472017-11-09 17:27:58 +02002850 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002851
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002852 /* enable with pattern 1 (as per spec) */
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002853
Pandiyan, Dhinakaran8b0878a2016-08-04 13:48:35 -07002854 intel_dp_program_link_training_pattern(intel_dp, DP_TRAINING_PATTERN_1);
Ville Syrjälä7b713f52014-10-16 21:27:35 +03002855
2856 /*
2857 * Magic for VLV/CHV. We _must_ first set up the register
2858 * without actually enabling the port, and then do another
2859 * write to enable the port. Otherwise link training will
2860 * fail when the power sequencer is freshly used for this port.
2861 */
2862 intel_dp->DP |= DP_PORT_EN;
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02002863 if (old_crtc_state->has_audio)
Ville Syrjälä6fec7662015-11-10 16:16:17 +02002864 intel_dp->DP |= DP_AUDIO_OUTPUT_ENABLE;
Ville Syrjälä7b713f52014-10-16 21:27:35 +03002865
2866 I915_WRITE(intel_dp->output_reg, intel_dp->DP);
2867 POSTING_READ(intel_dp->output_reg);
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002868}
2869
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02002870static void intel_enable_dp(struct intel_encoder *encoder,
Ville Syrjälä5f88a9c2017-08-18 16:49:58 +03002871 const struct intel_crtc_state *pipe_config,
2872 const struct drm_connector_state *conn_state)
Jesse Barnesd240f202010-08-13 15:43:26 -07002873{
Ville Syrjälä2f773472017-11-09 17:27:58 +02002874 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
Daniel Vettere8cb4552012-07-01 13:05:48 +02002875 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Ville Syrjäläadc10302017-10-31 22:51:14 +02002876 struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
Chris Wilsonea5b2132010-08-04 13:50:23 +01002877 uint32_t dp_reg = I915_READ(intel_dp->output_reg);
Ville Syrjäläd6fbdd12015-10-29 21:25:58 +02002878 enum pipe pipe = crtc->pipe;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002879
Daniel Vetter0c33d8d2012-09-06 22:15:43 +02002880 if (WARN_ON(dp_reg & DP_PORT_EN))
2881 return;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002882
Ville Syrjälä093e3f12014-10-16 21:27:33 +03002883 pps_lock(intel_dp);
2884
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +01002885 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
Ville Syrjäläadc10302017-10-31 22:51:14 +02002886 vlv_init_panel_power_sequencer(encoder, pipe_config);
Ville Syrjälä093e3f12014-10-16 21:27:33 +03002887
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02002888 intel_dp_enable_port(intel_dp, pipe_config);
Ville Syrjälä093e3f12014-10-16 21:27:33 +03002889
2890 edp_panel_vdd_on(intel_dp);
2891 edp_panel_on(intel_dp);
2892 edp_panel_vdd_off(intel_dp, true);
2893
2894 pps_unlock(intel_dp);
2895
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +01002896 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
Ville Syrjäläe0fce782015-07-08 23:45:54 +03002897 unsigned int lane_mask = 0x0;
2898
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +01002899 if (IS_CHERRYVIEW(dev_priv))
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02002900 lane_mask = intel_dp_unused_lane_mask(pipe_config->lane_count);
Ville Syrjäläe0fce782015-07-08 23:45:54 +03002901
Ville Syrjälä9b6de0a2015-04-10 18:21:31 +03002902 vlv_wait_port_ready(dev_priv, dp_to_dig_port(intel_dp),
2903 lane_mask);
Ville Syrjäläe0fce782015-07-08 23:45:54 +03002904 }
Ville Syrjälä61234fa2014-10-16 21:27:34 +03002905
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002906 intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
2907 intel_dp_start_link_train(intel_dp);
Imre Deak3ab9c632013-05-03 12:57:41 +03002908 intel_dp_stop_link_train(intel_dp);
Jani Nikulac1dec792014-10-27 16:26:56 +02002909
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02002910 if (pipe_config->has_audio) {
Jani Nikulac1dec792014-10-27 16:26:56 +02002911 DRM_DEBUG_DRIVER("Enabling DP audio on pipe %c\n",
Ville Syrjäläd6fbdd12015-10-29 21:25:58 +02002912 pipe_name(pipe));
Maarten Lankhorstbbf35e92016-11-08 13:55:38 +01002913 intel_audio_codec_enable(encoder, pipe_config, conn_state);
Jani Nikulac1dec792014-10-27 16:26:56 +02002914 }
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002915}
Jesse Barnes89b667f2013-04-18 14:51:36 -07002916
Maarten Lankhorstfd6bbda2016-08-09 17:04:04 +02002917static void g4x_enable_dp(struct intel_encoder *encoder,
Ville Syrjälä5f88a9c2017-08-18 16:49:58 +03002918 const struct intel_crtc_state *pipe_config,
2919 const struct drm_connector_state *conn_state)
Jani Nikulaecff4f32013-09-06 07:38:29 +03002920{
Maarten Lankhorstbbf35e92016-11-08 13:55:38 +01002921 intel_enable_dp(encoder, pipe_config, conn_state);
Maarten Lankhorstb037d582017-06-12 12:21:13 +02002922 intel_edp_backlight_on(pipe_config, conn_state);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002923}
Jesse Barnes89b667f2013-04-18 14:51:36 -07002924
Maarten Lankhorstfd6bbda2016-08-09 17:04:04 +02002925static void vlv_enable_dp(struct intel_encoder *encoder,
Ville Syrjälä5f88a9c2017-08-18 16:49:58 +03002926 const struct intel_crtc_state *pipe_config,
2927 const struct drm_connector_state *conn_state)
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002928{
Jani Nikula828f5c62013-09-05 16:44:45 +03002929 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2930
Maarten Lankhorstb037d582017-06-12 12:21:13 +02002931 intel_edp_backlight_on(pipe_config, conn_state);
Ville Syrjäläd2419ff2017-08-18 16:49:56 +03002932 intel_psr_enable(intel_dp, pipe_config);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002933}
2934
Maarten Lankhorstfd6bbda2016-08-09 17:04:04 +02002935static void g4x_pre_enable_dp(struct intel_encoder *encoder,
Ville Syrjälä5f88a9c2017-08-18 16:49:58 +03002936 const struct intel_crtc_state *pipe_config,
2937 const struct drm_connector_state *conn_state)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002938{
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02002939 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02002940 enum port port = encoder->port;
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002941
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02002942 intel_dp_prepare(encoder, pipe_config);
Daniel Vetter8ac33ed2014-04-24 23:54:54 +02002943
Daniel Vetterd41f1ef2014-04-24 23:54:53 +02002944 /* Only ilk+ has port A */
Ville Syrjäläabfce942015-10-29 21:26:03 +02002945 if (port == PORT_A)
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02002946 ironlake_edp_pll_on(intel_dp, pipe_config);
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002947}
2948
Ville Syrjälä83b84592014-10-16 21:29:51 +03002949static void vlv_detach_power_sequencer(struct intel_dp *intel_dp)
2950{
2951 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Chris Wilsonfac5e232016-07-04 11:34:36 +01002952 struct drm_i915_private *dev_priv = to_i915(intel_dig_port->base.base.dev);
Ville Syrjälä83b84592014-10-16 21:29:51 +03002953 enum pipe pipe = intel_dp->pps_pipe;
Imre Deak44cb7342016-08-10 14:07:29 +03002954 i915_reg_t pp_on_reg = PP_ON_DELAYS(pipe);
Ville Syrjälä83b84592014-10-16 21:29:51 +03002955
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +02002956 WARN_ON(intel_dp->active_pipe != INVALID_PIPE);
2957
Ville Syrjäläd1586942017-02-08 19:52:54 +02002958 if (WARN_ON(pipe != PIPE_A && pipe != PIPE_B))
2959 return;
2960
Ville Syrjälä83b84592014-10-16 21:29:51 +03002961 edp_panel_vdd_off_sync(intel_dp);
2962
2963 /*
2964 * VLV seems to get confused when multiple power seqeuencers
2965 * have the same port selected (even if only one has power/vdd
2966 * enabled). The failure manifests as vlv_wait_port_ready() failing
2967 * CHV on the other hand doesn't seem to mind having the same port
2968 * selected in multiple power seqeuencers, but let's clear the
2969 * port select always when logically disconnecting a power sequencer
2970 * from a port.
2971 */
2972 DRM_DEBUG_KMS("detaching pipe %c power sequencer from port %c\n",
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02002973 pipe_name(pipe), port_name(intel_dig_port->base.port));
Ville Syrjälä83b84592014-10-16 21:29:51 +03002974 I915_WRITE(pp_on_reg, 0);
2975 POSTING_READ(pp_on_reg);
2976
2977 intel_dp->pps_pipe = INVALID_PIPE;
2978}
2979
Ville Syrjälä46bd8382017-10-31 22:51:22 +02002980static void vlv_steal_power_sequencer(struct drm_i915_private *dev_priv,
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002981 enum pipe pipe)
2982{
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002983 struct intel_encoder *encoder;
2984
2985 lockdep_assert_held(&dev_priv->pps_mutex);
2986
Ville Syrjälä46bd8382017-10-31 22:51:22 +02002987 for_each_intel_encoder(&dev_priv->drm, encoder) {
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002988 struct intel_dp *intel_dp;
Ville Syrjälä773538e82014-09-04 14:54:56 +03002989 enum port port;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002990
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +02002991 if (encoder->type != INTEL_OUTPUT_DP &&
2992 encoder->type != INTEL_OUTPUT_EDP)
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002993 continue;
2994
2995 intel_dp = enc_to_intel_dp(&encoder->base);
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02002996 port = dp_to_dig_port(intel_dp)->base.port;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002997
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +02002998 WARN(intel_dp->active_pipe == pipe,
2999 "stealing pipe %c power sequencer from active (e)DP port %c\n",
3000 pipe_name(pipe), port_name(port));
3001
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03003002 if (intel_dp->pps_pipe != pipe)
3003 continue;
3004
3005 DRM_DEBUG_KMS("stealing pipe %c power sequencer from port %c\n",
Ville Syrjälä773538e82014-09-04 14:54:56 +03003006 pipe_name(pipe), port_name(port));
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03003007
3008 /* make sure vdd is off before we steal it */
Ville Syrjälä83b84592014-10-16 21:29:51 +03003009 vlv_detach_power_sequencer(intel_dp);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03003010 }
3011}
3012
Ville Syrjäläadc10302017-10-31 22:51:14 +02003013static void vlv_init_panel_power_sequencer(struct intel_encoder *encoder,
3014 const struct intel_crtc_state *crtc_state)
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03003015{
Ville Syrjälä46bd8382017-10-31 22:51:22 +02003016 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
Ville Syrjäläadc10302017-10-31 22:51:14 +02003017 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Ville Syrjäläadc10302017-10-31 22:51:14 +02003018 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03003019
3020 lockdep_assert_held(&dev_priv->pps_mutex);
3021
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +02003022 WARN_ON(intel_dp->active_pipe != INVALID_PIPE);
Ville Syrjälä093e3f12014-10-16 21:27:33 +03003023
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +02003024 if (intel_dp->pps_pipe != INVALID_PIPE &&
3025 intel_dp->pps_pipe != crtc->pipe) {
3026 /*
3027 * If another power sequencer was being used on this
3028 * port previously make sure to turn off vdd there while
3029 * we still have control of it.
3030 */
Ville Syrjälä83b84592014-10-16 21:29:51 +03003031 vlv_detach_power_sequencer(intel_dp);
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +02003032 }
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03003033
3034 /*
3035 * We may be stealing the power
3036 * sequencer from another port.
3037 */
Ville Syrjälä46bd8382017-10-31 22:51:22 +02003038 vlv_steal_power_sequencer(dev_priv, crtc->pipe);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03003039
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +02003040 intel_dp->active_pipe = crtc->pipe;
3041
Jani Nikula1853a9d2017-08-18 12:30:20 +03003042 if (!intel_dp_is_edp(intel_dp))
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +02003043 return;
3044
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03003045 /* now it's all ours */
3046 intel_dp->pps_pipe = crtc->pipe;
3047
3048 DRM_DEBUG_KMS("initializing pipe %c power sequencer for port %c\n",
Ville Syrjäläadc10302017-10-31 22:51:14 +02003049 pipe_name(intel_dp->pps_pipe), port_name(encoder->port));
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03003050
3051 /* init power sequencer on this pipe and port */
Ville Syrjälä46bd8382017-10-31 22:51:22 +02003052 intel_dp_init_panel_power_sequencer(intel_dp);
3053 intel_dp_init_panel_power_sequencer_registers(intel_dp, true);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03003054}
3055
Maarten Lankhorstfd6bbda2016-08-09 17:04:04 +02003056static void vlv_pre_enable_dp(struct intel_encoder *encoder,
Ville Syrjälä5f88a9c2017-08-18 16:49:58 +03003057 const struct intel_crtc_state *pipe_config,
3058 const struct drm_connector_state *conn_state)
Jani Nikulaab1f90f2013-07-30 12:20:30 +03003059{
Ville Syrjälä2e1029c2017-10-31 22:51:18 +02003060 vlv_phy_pre_encoder_enable(encoder, pipe_config);
Jesse Barnes89b667f2013-04-18 14:51:36 -07003061
Maarten Lankhorstbbf35e92016-11-08 13:55:38 +01003062 intel_enable_dp(encoder, pipe_config, conn_state);
Jesse Barnes89b667f2013-04-18 14:51:36 -07003063}
3064
Maarten Lankhorstfd6bbda2016-08-09 17:04:04 +02003065static void vlv_dp_pre_pll_enable(struct intel_encoder *encoder,
Ville Syrjälä5f88a9c2017-08-18 16:49:58 +03003066 const struct intel_crtc_state *pipe_config,
3067 const struct drm_connector_state *conn_state)
Jesse Barnes89b667f2013-04-18 14:51:36 -07003068{
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02003069 intel_dp_prepare(encoder, pipe_config);
Daniel Vetter8ac33ed2014-04-24 23:54:54 +02003070
Ville Syrjälä2e1029c2017-10-31 22:51:18 +02003071 vlv_phy_pre_pll_enable(encoder, pipe_config);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003072}
3073
Maarten Lankhorstfd6bbda2016-08-09 17:04:04 +02003074static void chv_pre_enable_dp(struct intel_encoder *encoder,
Ville Syrjälä5f88a9c2017-08-18 16:49:58 +03003075 const struct intel_crtc_state *pipe_config,
3076 const struct drm_connector_state *conn_state)
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003077{
Ville Syrjälä2e1029c2017-10-31 22:51:18 +02003078 chv_phy_pre_encoder_enable(encoder, pipe_config);
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003079
Maarten Lankhorstbbf35e92016-11-08 13:55:38 +01003080 intel_enable_dp(encoder, pipe_config, conn_state);
Ville Syrjäläb0b33842015-07-08 23:45:55 +03003081
3082 /* Second common lane will stay alive on its own now */
Ander Conselvan de Oliveirae7d2a7172016-04-27 15:44:20 +03003083 chv_phy_release_cl2_override(encoder);
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003084}
3085
Maarten Lankhorstfd6bbda2016-08-09 17:04:04 +02003086static void chv_dp_pre_pll_enable(struct intel_encoder *encoder,
Ville Syrjälä5f88a9c2017-08-18 16:49:58 +03003087 const struct intel_crtc_state *pipe_config,
3088 const struct drm_connector_state *conn_state)
Ville Syrjälä9197c882014-04-09 13:29:05 +03003089{
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02003090 intel_dp_prepare(encoder, pipe_config);
Ville Syrjälä625695f2014-06-28 02:04:02 +03003091
Ville Syrjälä2e1029c2017-10-31 22:51:18 +02003092 chv_phy_pre_pll_enable(encoder, pipe_config);
Ville Syrjälä9197c882014-04-09 13:29:05 +03003093}
3094
Maarten Lankhorstfd6bbda2016-08-09 17:04:04 +02003095static void chv_dp_post_pll_disable(struct intel_encoder *encoder,
Ville Syrjälä2e1029c2017-10-31 22:51:18 +02003096 const struct intel_crtc_state *old_crtc_state,
3097 const struct drm_connector_state *old_conn_state)
Ville Syrjäläd6db9952015-07-08 23:45:49 +03003098{
Ville Syrjälä2e1029c2017-10-31 22:51:18 +02003099 chv_phy_post_pll_disable(encoder, old_crtc_state);
Ville Syrjäläd6db9952015-07-08 23:45:49 +03003100}
3101
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003102/*
3103 * Fetch AUX CH registers 0x202 - 0x207 which contain
3104 * link status information
3105 */
Ander Conselvan de Oliveira94223d02015-10-23 13:01:48 +03003106bool
Keith Packard93f62da2011-11-01 19:45:03 -07003107intel_dp_get_link_status(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_STATUS_SIZE])
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003108{
Lyude9f085eb2016-04-13 10:58:33 -04003109 return drm_dp_dpcd_read(&intel_dp->aux, DP_LANE0_1_STATUS, link_status,
3110 DP_LINK_STATUS_SIZE) == DP_LINK_STATUS_SIZE;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003111}
3112
Nagaraju, Vathsala97da2ef2017-01-02 17:00:55 +05303113static bool intel_dp_get_y_cord_status(struct intel_dp *intel_dp)
3114{
3115 uint8_t psr_caps = 0;
3116
Imre Deak9bacd4b2017-05-10 12:21:48 +03003117 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_PSR_CAPS, &psr_caps) != 1)
3118 return false;
Nagaraju, Vathsala97da2ef2017-01-02 17:00:55 +05303119 return psr_caps & DP_PSR2_SU_Y_COORDINATE_REQUIRED;
3120}
3121
3122static bool intel_dp_get_colorimetry_status(struct intel_dp *intel_dp)
3123{
3124 uint8_t dprx = 0;
3125
Imre Deak9bacd4b2017-05-10 12:21:48 +03003126 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_DPRX_FEATURE_ENUMERATION_LIST,
3127 &dprx) != 1)
3128 return false;
Nagaraju, Vathsala97da2ef2017-01-02 17:00:55 +05303129 return dprx & DP_VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED;
3130}
3131
Chris Wilsona76f73d2017-01-14 10:51:13 +00003132static bool intel_dp_get_alpm_status(struct intel_dp *intel_dp)
Nagaraju, Vathsala340c93c2017-01-02 17:00:58 +05303133{
3134 uint8_t alpm_caps = 0;
3135
Imre Deak9bacd4b2017-05-10 12:21:48 +03003136 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_RECEIVER_ALPM_CAP,
3137 &alpm_caps) != 1)
3138 return false;
Nagaraju, Vathsala340c93c2017-01-02 17:00:58 +05303139 return alpm_caps & DP_ALPM_CAP;
3140}
3141
Paulo Zanoni11002442014-06-13 18:45:41 -03003142/* These are source-specific values. */
Ander Conselvan de Oliveira94223d02015-10-23 13:01:48 +03003143uint8_t
Keith Packard1a2eb462011-11-16 16:26:07 -08003144intel_dp_voltage_max(struct intel_dp *intel_dp)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003145{
Tvrtko Ursulindd11bc12016-11-16 08:55:41 +00003146 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02003147 enum port port = dp_to_dig_port(intel_dp)->base.port;
Keith Packard1a2eb462011-11-16 16:26:07 -08003148
Ville Syrjälä7d4f37b2017-10-16 17:57:00 +03003149 if (INTEL_GEN(dev_priv) >= 9) {
Ville Syrjäläffe51112017-02-23 19:49:01 +02003150 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
3151 return intel_ddi_dp_voltage_max(encoder);
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +01003152 } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
Sonika Jindalbd600182014-08-08 16:23:41 +05303153 return DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
Tvrtko Ursulin5db94012016-10-13 11:03:10 +01003154 else if (IS_GEN7(dev_priv) && port == PORT_A)
Sonika Jindalbd600182014-08-08 16:23:41 +05303155 return DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
Tvrtko Ursulin6e266952016-10-13 11:02:53 +01003156 else if (HAS_PCH_CPT(dev_priv) && port != PORT_A)
Sonika Jindalbd600182014-08-08 16:23:41 +05303157 return DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
Keith Packard1a2eb462011-11-16 16:26:07 -08003158 else
Sonika Jindalbd600182014-08-08 16:23:41 +05303159 return DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
Keith Packard1a2eb462011-11-16 16:26:07 -08003160}
3161
Ander Conselvan de Oliveira94223d02015-10-23 13:01:48 +03003162uint8_t
Keith Packard1a2eb462011-11-16 16:26:07 -08003163intel_dp_pre_emphasis_max(struct intel_dp *intel_dp, uint8_t voltage_swing)
3164{
Tvrtko Ursulin86527442016-10-13 11:03:00 +01003165 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02003166 enum port port = dp_to_dig_port(intel_dp)->base.port;
Keith Packard1a2eb462011-11-16 16:26:07 -08003167
Tvrtko Ursulin86527442016-10-13 11:03:00 +01003168 if (INTEL_GEN(dev_priv) >= 9) {
Damien Lespiau5a9d1f12013-12-03 13:56:26 +00003169 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
3170 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
3171 return DP_TRAIN_PRE_EMPH_LEVEL_3;
3172 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
3173 return DP_TRAIN_PRE_EMPH_LEVEL_2;
3174 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
3175 return DP_TRAIN_PRE_EMPH_LEVEL_1;
Sonika Jindal7ad14a22015-02-25 10:29:12 +05303176 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3:
3177 return DP_TRAIN_PRE_EMPH_LEVEL_0;
Damien Lespiau5a9d1f12013-12-03 13:56:26 +00003178 default:
3179 return DP_TRAIN_PRE_EMPH_LEVEL_0;
3180 }
Tvrtko Ursulin86527442016-10-13 11:03:00 +01003181 } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
Paulo Zanonid6c0d722012-10-15 15:51:34 -03003182 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303183 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
3184 return DP_TRAIN_PRE_EMPH_LEVEL_3;
3185 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
3186 return DP_TRAIN_PRE_EMPH_LEVEL_2;
3187 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
3188 return DP_TRAIN_PRE_EMPH_LEVEL_1;
3189 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3:
Paulo Zanonid6c0d722012-10-15 15:51:34 -03003190 default:
Sonika Jindalbd600182014-08-08 16:23:41 +05303191 return DP_TRAIN_PRE_EMPH_LEVEL_0;
Paulo Zanonid6c0d722012-10-15 15:51:34 -03003192 }
Tvrtko Ursulin86527442016-10-13 11:03:00 +01003193 } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003194 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303195 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
3196 return DP_TRAIN_PRE_EMPH_LEVEL_3;
3197 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
3198 return DP_TRAIN_PRE_EMPH_LEVEL_2;
3199 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
3200 return DP_TRAIN_PRE_EMPH_LEVEL_1;
3201 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003202 default:
Sonika Jindalbd600182014-08-08 16:23:41 +05303203 return DP_TRAIN_PRE_EMPH_LEVEL_0;
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003204 }
Tvrtko Ursulin86527442016-10-13 11:03:00 +01003205 } else if (IS_GEN7(dev_priv) && port == PORT_A) {
Keith Packard1a2eb462011-11-16 16:26:07 -08003206 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303207 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
3208 return DP_TRAIN_PRE_EMPH_LEVEL_2;
3209 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
3210 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
3211 return DP_TRAIN_PRE_EMPH_LEVEL_1;
Keith Packard1a2eb462011-11-16 16:26:07 -08003212 default:
Sonika Jindalbd600182014-08-08 16:23:41 +05303213 return DP_TRAIN_PRE_EMPH_LEVEL_0;
Keith Packard1a2eb462011-11-16 16:26:07 -08003214 }
3215 } else {
3216 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303217 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
3218 return DP_TRAIN_PRE_EMPH_LEVEL_2;
3219 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
3220 return DP_TRAIN_PRE_EMPH_LEVEL_2;
3221 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
3222 return DP_TRAIN_PRE_EMPH_LEVEL_1;
3223 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3:
Keith Packard1a2eb462011-11-16 16:26:07 -08003224 default:
Sonika Jindalbd600182014-08-08 16:23:41 +05303225 return DP_TRAIN_PRE_EMPH_LEVEL_0;
Keith Packard1a2eb462011-11-16 16:26:07 -08003226 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003227 }
3228}
3229
Daniel Vetter5829975c2015-04-16 11:36:52 +02003230static uint32_t vlv_signal_levels(struct intel_dp *intel_dp)
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003231{
Ander Conselvan de Oliveira53d98722016-04-27 15:44:22 +03003232 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003233 unsigned long demph_reg_value, preemph_reg_value,
3234 uniqtranscale_reg_value;
3235 uint8_t train_set = intel_dp->train_set[0];
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003236
3237 switch (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303238 case DP_TRAIN_PRE_EMPH_LEVEL_0:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003239 preemph_reg_value = 0x0004000;
3240 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303241 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003242 demph_reg_value = 0x2B405555;
3243 uniqtranscale_reg_value = 0x552AB83A;
3244 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303245 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003246 demph_reg_value = 0x2B404040;
3247 uniqtranscale_reg_value = 0x5548B83A;
3248 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303249 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003250 demph_reg_value = 0x2B245555;
3251 uniqtranscale_reg_value = 0x5560B83A;
3252 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303253 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003254 demph_reg_value = 0x2B405555;
3255 uniqtranscale_reg_value = 0x5598DA3A;
3256 break;
3257 default:
3258 return 0;
3259 }
3260 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303261 case DP_TRAIN_PRE_EMPH_LEVEL_1:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003262 preemph_reg_value = 0x0002000;
3263 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303264 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003265 demph_reg_value = 0x2B404040;
3266 uniqtranscale_reg_value = 0x5552B83A;
3267 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303268 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003269 demph_reg_value = 0x2B404848;
3270 uniqtranscale_reg_value = 0x5580B83A;
3271 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303272 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003273 demph_reg_value = 0x2B404040;
3274 uniqtranscale_reg_value = 0x55ADDA3A;
3275 break;
3276 default:
3277 return 0;
3278 }
3279 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303280 case DP_TRAIN_PRE_EMPH_LEVEL_2:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003281 preemph_reg_value = 0x0000000;
3282 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303283 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003284 demph_reg_value = 0x2B305555;
3285 uniqtranscale_reg_value = 0x5570B83A;
3286 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303287 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003288 demph_reg_value = 0x2B2B4040;
3289 uniqtranscale_reg_value = 0x55ADDA3A;
3290 break;
3291 default:
3292 return 0;
3293 }
3294 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303295 case DP_TRAIN_PRE_EMPH_LEVEL_3:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003296 preemph_reg_value = 0x0006000;
3297 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303298 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003299 demph_reg_value = 0x1B405555;
3300 uniqtranscale_reg_value = 0x55ADDA3A;
3301 break;
3302 default:
3303 return 0;
3304 }
3305 break;
3306 default:
3307 return 0;
3308 }
3309
Ander Conselvan de Oliveira53d98722016-04-27 15:44:22 +03003310 vlv_set_phy_signal_level(encoder, demph_reg_value, preemph_reg_value,
3311 uniqtranscale_reg_value, 0);
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003312
3313 return 0;
3314}
3315
Daniel Vetter5829975c2015-04-16 11:36:52 +02003316static uint32_t chv_signal_levels(struct intel_dp *intel_dp)
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003317{
Ander Conselvan de Oliveirab7fa22d2016-04-27 15:44:17 +03003318 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
3319 u32 deemph_reg_value, margin_reg_value;
3320 bool uniq_trans_scale = false;
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003321 uint8_t train_set = intel_dp->train_set[0];
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003322
3323 switch (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303324 case DP_TRAIN_PRE_EMPH_LEVEL_0:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003325 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303326 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003327 deemph_reg_value = 128;
3328 margin_reg_value = 52;
3329 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303330 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003331 deemph_reg_value = 128;
3332 margin_reg_value = 77;
3333 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303334 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003335 deemph_reg_value = 128;
3336 margin_reg_value = 102;
3337 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303338 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003339 deemph_reg_value = 128;
3340 margin_reg_value = 154;
Ander Conselvan de Oliveirab7fa22d2016-04-27 15:44:17 +03003341 uniq_trans_scale = true;
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003342 break;
3343 default:
3344 return 0;
3345 }
3346 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303347 case DP_TRAIN_PRE_EMPH_LEVEL_1:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003348 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303349 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003350 deemph_reg_value = 85;
3351 margin_reg_value = 78;
3352 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303353 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003354 deemph_reg_value = 85;
3355 margin_reg_value = 116;
3356 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303357 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003358 deemph_reg_value = 85;
3359 margin_reg_value = 154;
3360 break;
3361 default:
3362 return 0;
3363 }
3364 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303365 case DP_TRAIN_PRE_EMPH_LEVEL_2:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003366 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303367 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003368 deemph_reg_value = 64;
3369 margin_reg_value = 104;
3370 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303371 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003372 deemph_reg_value = 64;
3373 margin_reg_value = 154;
3374 break;
3375 default:
3376 return 0;
3377 }
3378 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303379 case DP_TRAIN_PRE_EMPH_LEVEL_3:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003380 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303381 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003382 deemph_reg_value = 43;
3383 margin_reg_value = 154;
3384 break;
3385 default:
3386 return 0;
3387 }
3388 break;
3389 default:
3390 return 0;
3391 }
3392
Ander Conselvan de Oliveirab7fa22d2016-04-27 15:44:17 +03003393 chv_set_phy_signal_level(encoder, deemph_reg_value,
3394 margin_reg_value, uniq_trans_scale);
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003395
3396 return 0;
3397}
3398
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003399static uint32_t
Daniel Vetter5829975c2015-04-16 11:36:52 +02003400gen4_signal_levels(uint8_t train_set)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003401{
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003402 uint32_t signal_levels = 0;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003403
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003404 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303405 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003406 default:
3407 signal_levels |= DP_VOLTAGE_0_4;
3408 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303409 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003410 signal_levels |= DP_VOLTAGE_0_6;
3411 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303412 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003413 signal_levels |= DP_VOLTAGE_0_8;
3414 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303415 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003416 signal_levels |= DP_VOLTAGE_1_2;
3417 break;
3418 }
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003419 switch (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303420 case DP_TRAIN_PRE_EMPH_LEVEL_0:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003421 default:
3422 signal_levels |= DP_PRE_EMPHASIS_0;
3423 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303424 case DP_TRAIN_PRE_EMPH_LEVEL_1:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003425 signal_levels |= DP_PRE_EMPHASIS_3_5;
3426 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303427 case DP_TRAIN_PRE_EMPH_LEVEL_2:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003428 signal_levels |= DP_PRE_EMPHASIS_6;
3429 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303430 case DP_TRAIN_PRE_EMPH_LEVEL_3:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003431 signal_levels |= DP_PRE_EMPHASIS_9_5;
3432 break;
3433 }
3434 return signal_levels;
3435}
3436
Zhenyu Wange3421a12010-04-08 09:43:27 +08003437/* Gen6's DP voltage swing and pre-emphasis control */
3438static uint32_t
Daniel Vetter5829975c2015-04-16 11:36:52 +02003439gen6_edp_signal_levels(uint8_t train_set)
Zhenyu Wange3421a12010-04-08 09:43:27 +08003440{
Yuanhan Liu3c5a62b2011-01-06 18:26:08 +08003441 int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK |
3442 DP_TRAIN_PRE_EMPHASIS_MASK);
3443 switch (signal_levels) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303444 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_0:
3445 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_0:
Yuanhan Liu3c5a62b2011-01-06 18:26:08 +08003446 return EDP_LINK_TRAIN_400_600MV_0DB_SNB_B;
Sonika Jindalbd600182014-08-08 16:23:41 +05303447 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_1:
Yuanhan Liu3c5a62b2011-01-06 18:26:08 +08003448 return EDP_LINK_TRAIN_400MV_3_5DB_SNB_B;
Sonika Jindalbd600182014-08-08 16:23:41 +05303449 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_2:
3450 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_2:
Yuanhan Liu3c5a62b2011-01-06 18:26:08 +08003451 return EDP_LINK_TRAIN_400_600MV_6DB_SNB_B;
Sonika Jindalbd600182014-08-08 16:23:41 +05303452 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_1:
3453 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_1:
Yuanhan Liu3c5a62b2011-01-06 18:26:08 +08003454 return EDP_LINK_TRAIN_600_800MV_3_5DB_SNB_B;
Sonika Jindalbd600182014-08-08 16:23:41 +05303455 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_0:
3456 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3 | DP_TRAIN_PRE_EMPH_LEVEL_0:
Yuanhan Liu3c5a62b2011-01-06 18:26:08 +08003457 return EDP_LINK_TRAIN_800_1200MV_0DB_SNB_B;
Zhenyu Wange3421a12010-04-08 09:43:27 +08003458 default:
Yuanhan Liu3c5a62b2011-01-06 18:26:08 +08003459 DRM_DEBUG_KMS("Unsupported voltage swing/pre-emphasis level:"
3460 "0x%x\n", signal_levels);
3461 return EDP_LINK_TRAIN_400_600MV_0DB_SNB_B;
Zhenyu Wange3421a12010-04-08 09:43:27 +08003462 }
3463}
3464
Keith Packard1a2eb462011-11-16 16:26:07 -08003465/* Gen7's DP voltage swing and pre-emphasis control */
3466static uint32_t
Daniel Vetter5829975c2015-04-16 11:36:52 +02003467gen7_edp_signal_levels(uint8_t train_set)
Keith Packard1a2eb462011-11-16 16:26:07 -08003468{
3469 int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK |
3470 DP_TRAIN_PRE_EMPHASIS_MASK);
3471 switch (signal_levels) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303472 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_0:
Keith Packard1a2eb462011-11-16 16:26:07 -08003473 return EDP_LINK_TRAIN_400MV_0DB_IVB;
Sonika Jindalbd600182014-08-08 16:23:41 +05303474 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_1:
Keith Packard1a2eb462011-11-16 16:26:07 -08003475 return EDP_LINK_TRAIN_400MV_3_5DB_IVB;
Sonika Jindalbd600182014-08-08 16:23:41 +05303476 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_2:
Keith Packard1a2eb462011-11-16 16:26:07 -08003477 return EDP_LINK_TRAIN_400MV_6DB_IVB;
3478
Sonika Jindalbd600182014-08-08 16:23:41 +05303479 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_0:
Keith Packard1a2eb462011-11-16 16:26:07 -08003480 return EDP_LINK_TRAIN_600MV_0DB_IVB;
Sonika Jindalbd600182014-08-08 16:23:41 +05303481 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_1:
Keith Packard1a2eb462011-11-16 16:26:07 -08003482 return EDP_LINK_TRAIN_600MV_3_5DB_IVB;
3483
Sonika Jindalbd600182014-08-08 16:23:41 +05303484 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_0:
Keith Packard1a2eb462011-11-16 16:26:07 -08003485 return EDP_LINK_TRAIN_800MV_0DB_IVB;
Sonika Jindalbd600182014-08-08 16:23:41 +05303486 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_1:
Keith Packard1a2eb462011-11-16 16:26:07 -08003487 return EDP_LINK_TRAIN_800MV_3_5DB_IVB;
3488
3489 default:
3490 DRM_DEBUG_KMS("Unsupported voltage swing/pre-emphasis level:"
3491 "0x%x\n", signal_levels);
3492 return EDP_LINK_TRAIN_500MV_0DB_IVB;
3493 }
3494}
3495
Ander Conselvan de Oliveira94223d02015-10-23 13:01:48 +03003496void
Ander Conselvan de Oliveiraf4eb6922015-10-23 13:01:44 +03003497intel_dp_set_signal_levels(struct intel_dp *intel_dp)
Paulo Zanonif0a34242012-12-06 16:51:50 -02003498{
Ville Syrjälä2f773472017-11-09 17:27:58 +02003499 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Paulo Zanonif0a34242012-12-06 16:51:50 -02003500 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02003501 enum port port = intel_dig_port->base.port;
David Weinehallf8896f52015-06-25 11:11:03 +03003502 uint32_t signal_levels, mask = 0;
Paulo Zanonif0a34242012-12-06 16:51:50 -02003503 uint8_t train_set = intel_dp->train_set[0];
3504
Rodrigo Vivid509af62017-08-29 16:22:24 -07003505 if (IS_GEN9_LP(dev_priv) || IS_CANNONLAKE(dev_priv)) {
3506 signal_levels = bxt_signal_levels(intel_dp);
3507 } else if (HAS_DDI(dev_priv)) {
David Weinehallf8896f52015-06-25 11:11:03 +03003508 signal_levels = ddi_signal_levels(intel_dp);
Rodrigo Vivid509af62017-08-29 16:22:24 -07003509 mask = DDI_BUF_EMP_MASK;
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +01003510 } else if (IS_CHERRYVIEW(dev_priv)) {
Daniel Vetter5829975c2015-04-16 11:36:52 +02003511 signal_levels = chv_signal_levels(intel_dp);
Tvrtko Ursulin11a914c2016-10-13 11:03:08 +01003512 } else if (IS_VALLEYVIEW(dev_priv)) {
Daniel Vetter5829975c2015-04-16 11:36:52 +02003513 signal_levels = vlv_signal_levels(intel_dp);
Tvrtko Ursulin5db94012016-10-13 11:03:10 +01003514 } else if (IS_GEN7(dev_priv) && port == PORT_A) {
Daniel Vetter5829975c2015-04-16 11:36:52 +02003515 signal_levels = gen7_edp_signal_levels(train_set);
Paulo Zanonif0a34242012-12-06 16:51:50 -02003516 mask = EDP_LINK_TRAIN_VOL_EMP_MASK_IVB;
Tvrtko Ursulin5db94012016-10-13 11:03:10 +01003517 } else if (IS_GEN6(dev_priv) && port == PORT_A) {
Daniel Vetter5829975c2015-04-16 11:36:52 +02003518 signal_levels = gen6_edp_signal_levels(train_set);
Paulo Zanonif0a34242012-12-06 16:51:50 -02003519 mask = EDP_LINK_TRAIN_VOL_EMP_MASK_SNB;
3520 } else {
Daniel Vetter5829975c2015-04-16 11:36:52 +02003521 signal_levels = gen4_signal_levels(train_set);
Paulo Zanonif0a34242012-12-06 16:51:50 -02003522 mask = DP_VOLTAGE_MASK | DP_PRE_EMPHASIS_MASK;
3523 }
3524
Vandana Kannan96fb9f92014-11-18 15:45:27 +05303525 if (mask)
3526 DRM_DEBUG_KMS("Using signal levels %08x\n", signal_levels);
3527
3528 DRM_DEBUG_KMS("Using vswing level %d\n",
3529 train_set & DP_TRAIN_VOLTAGE_SWING_MASK);
3530 DRM_DEBUG_KMS("Using pre-emphasis level %d\n",
3531 (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) >>
3532 DP_TRAIN_PRE_EMPHASIS_SHIFT);
Paulo Zanonif0a34242012-12-06 16:51:50 -02003533
Ander Conselvan de Oliveiraf4eb6922015-10-23 13:01:44 +03003534 intel_dp->DP = (intel_dp->DP & ~mask) | signal_levels;
Ander Conselvan de Oliveirab905a912015-10-23 13:01:47 +03003535
3536 I915_WRITE(intel_dp->output_reg, intel_dp->DP);
3537 POSTING_READ(intel_dp->output_reg);
Paulo Zanonif0a34242012-12-06 16:51:50 -02003538}
3539
Ander Conselvan de Oliveira94223d02015-10-23 13:01:48 +03003540void
Ander Conselvan de Oliveirae9c176d2015-10-23 13:01:45 +03003541intel_dp_program_link_training_pattern(struct intel_dp *intel_dp,
3542 uint8_t dp_train_pat)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003543{
Paulo Zanoni174edf12012-10-26 19:05:50 -02003544 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Ville Syrjälä90a6b7b2015-07-06 16:39:15 +03003545 struct drm_i915_private *dev_priv =
3546 to_i915(intel_dig_port->base.base.dev);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003547
Ander Conselvan de Oliveiraf4eb6922015-10-23 13:01:44 +03003548 _intel_dp_set_link_train(intel_dp, &intel_dp->DP, dp_train_pat);
Paulo Zanoni47ea7542012-07-17 16:55:16 -03003549
Ander Conselvan de Oliveiraf4eb6922015-10-23 13:01:44 +03003550 I915_WRITE(intel_dp->output_reg, intel_dp->DP);
Chris Wilsonea5b2132010-08-04 13:50:23 +01003551 POSTING_READ(intel_dp->output_reg);
Ander Conselvan de Oliveirae9c176d2015-10-23 13:01:45 +03003552}
3553
Ander Conselvan de Oliveira94223d02015-10-23 13:01:48 +03003554void intel_dp_set_idle_link_train(struct intel_dp *intel_dp)
Imre Deak3ab9c632013-05-03 12:57:41 +03003555{
Ville Syrjälä2f773472017-11-09 17:27:58 +02003556 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Imre Deak3ab9c632013-05-03 12:57:41 +03003557 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02003558 enum port port = intel_dig_port->base.port;
Imre Deak3ab9c632013-05-03 12:57:41 +03003559 uint32_t val;
3560
Tvrtko Ursulin4f8036a2016-10-13 11:02:52 +01003561 if (!HAS_DDI(dev_priv))
Imre Deak3ab9c632013-05-03 12:57:41 +03003562 return;
3563
3564 val = I915_READ(DP_TP_CTL(port));
3565 val &= ~DP_TP_CTL_LINK_TRAIN_MASK;
3566 val |= DP_TP_CTL_LINK_TRAIN_IDLE;
3567 I915_WRITE(DP_TP_CTL(port), val);
3568
3569 /*
3570 * On PORT_A we can have only eDP in SST mode. There the only reason
3571 * we need to set idle transmission mode is to work around a HW issue
3572 * where we enable the pipe while not in idle link-training mode.
3573 * In this case there is requirement to wait for a minimum number of
3574 * idle patterns to be sent.
3575 */
3576 if (port == PORT_A)
3577 return;
3578
Chris Wilsona7670172016-06-30 15:33:10 +01003579 if (intel_wait_for_register(dev_priv,DP_TP_STATUS(port),
3580 DP_TP_STATUS_IDLE_DONE,
3581 DP_TP_STATUS_IDLE_DONE,
3582 1))
Imre Deak3ab9c632013-05-03 12:57:41 +03003583 DRM_ERROR("Timed out waiting for DP idle patterns\n");
3584}
3585
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003586static void
Ville Syrjäläadc10302017-10-31 22:51:14 +02003587intel_dp_link_down(struct intel_encoder *encoder,
3588 const struct intel_crtc_state *old_crtc_state)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003589{
Ville Syrjäläadc10302017-10-31 22:51:14 +02003590 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
3591 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
3592 struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc);
3593 enum port port = encoder->port;
Chris Wilsonea5b2132010-08-04 13:50:23 +01003594 uint32_t DP = intel_dp->DP;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003595
Tvrtko Ursulin4f8036a2016-10-13 11:02:52 +01003596 if (WARN_ON(HAS_DDI(dev_priv)))
Paulo Zanonic19b0662012-10-15 15:51:41 -03003597 return;
3598
Daniel Vetter0c33d8d2012-09-06 22:15:43 +02003599 if (WARN_ON((I915_READ(intel_dp->output_reg) & DP_PORT_EN) == 0))
Chris Wilson1b39d6f2010-12-06 11:20:45 +00003600 return;
3601
Zhao Yakui28c97732009-10-09 11:39:41 +08003602 DRM_DEBUG_KMS("\n");
Zhenyu Wang32f9d652009-07-24 01:00:32 +08003603
Tvrtko Ursulin5db94012016-10-13 11:03:10 +01003604 if ((IS_GEN7(dev_priv) && port == PORT_A) ||
Tvrtko Ursulin6e266952016-10-13 11:02:53 +01003605 (HAS_PCH_CPT(dev_priv) && port != PORT_A)) {
Zhenyu Wange3421a12010-04-08 09:43:27 +08003606 DP &= ~DP_LINK_TRAIN_MASK_CPT;
Ville Syrjälä1612c8b2015-05-05 17:17:34 +03003607 DP |= DP_LINK_TRAIN_PAT_IDLE_CPT;
Zhenyu Wange3421a12010-04-08 09:43:27 +08003608 } else {
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +01003609 if (IS_CHERRYVIEW(dev_priv))
Ville Syrjäläaad3d142014-06-28 02:04:25 +03003610 DP &= ~DP_LINK_TRAIN_MASK_CHV;
3611 else
3612 DP &= ~DP_LINK_TRAIN_MASK;
Ville Syrjälä1612c8b2015-05-05 17:17:34 +03003613 DP |= DP_LINK_TRAIN_PAT_IDLE;
Zhenyu Wange3421a12010-04-08 09:43:27 +08003614 }
Ville Syrjälä1612c8b2015-05-05 17:17:34 +03003615 I915_WRITE(intel_dp->output_reg, DP);
Chris Wilsonfe255d02010-09-11 21:37:48 +01003616 POSTING_READ(intel_dp->output_reg);
Zhenyu Wang5eb08b62009-07-24 01:00:31 +08003617
Ville Syrjälä1612c8b2015-05-05 17:17:34 +03003618 DP &= ~(DP_PORT_EN | DP_AUDIO_OUTPUT_ENABLE);
3619 I915_WRITE(intel_dp->output_reg, DP);
3620 POSTING_READ(intel_dp->output_reg);
3621
3622 /*
3623 * HW workaround for IBX, we need to move the port
3624 * to transcoder A after disabling it to allow the
3625 * matching HDMI port to be enabled on transcoder A.
3626 */
Tvrtko Ursulin6e266952016-10-13 11:02:53 +01003627 if (HAS_PCH_IBX(dev_priv) && crtc->pipe == PIPE_B && port != PORT_A) {
Ville Syrjälä0c241d52015-10-30 19:23:22 +02003628 /*
3629 * We get CPU/PCH FIFO underruns on the other pipe when
3630 * doing the workaround. Sweep them under the rug.
3631 */
3632 intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, false);
3633 intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, false);
3634
Ville Syrjälä1612c8b2015-05-05 17:17:34 +03003635 /* always enable with pattern 1 (as per spec) */
3636 DP &= ~(DP_PIPEB_SELECT | DP_LINK_TRAIN_MASK);
3637 DP |= DP_PORT_EN | DP_LINK_TRAIN_PAT_1;
3638 I915_WRITE(intel_dp->output_reg, DP);
3639 POSTING_READ(intel_dp->output_reg);
3640
3641 DP &= ~DP_PORT_EN;
Eric Anholt5bddd172010-11-18 09:32:59 +08003642 I915_WRITE(intel_dp->output_reg, DP);
Daniel Vetter0ca09682014-11-24 16:54:11 +01003643 POSTING_READ(intel_dp->output_reg);
Ville Syrjälä0c241d52015-10-30 19:23:22 +02003644
Ville Syrjälä0f0f74b2016-10-31 22:37:06 +02003645 intel_wait_for_vblank_if_active(dev_priv, PIPE_A);
Ville Syrjälä0c241d52015-10-30 19:23:22 +02003646 intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, true);
3647 intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, true);
Eric Anholt5bddd172010-11-18 09:32:59 +08003648 }
3649
Keith Packardf01eca22011-09-28 16:48:10 -07003650 msleep(intel_dp->panel_power_down_delay);
Ville Syrjälä6fec7662015-11-10 16:16:17 +02003651
3652 intel_dp->DP = DP;
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +02003653
3654 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
3655 pps_lock(intel_dp);
3656 intel_dp->active_pipe = INVALID_PIPE;
3657 pps_unlock(intel_dp);
3658 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003659}
3660
Imre Deak24e807e2016-10-24 19:33:28 +03003661bool
Ville Syrjäläfe5a66f2016-07-29 16:52:39 +03003662intel_dp_read_dpcd(struct intel_dp *intel_dp)
Keith Packard92fd8fd2011-07-25 19:50:10 -07003663{
Lyude9f085eb2016-04-13 10:58:33 -04003664 if (drm_dp_dpcd_read(&intel_dp->aux, 0x000, intel_dp->dpcd,
3665 sizeof(intel_dp->dpcd)) < 0)
Adam Jacksonedb39242012-09-18 10:58:49 -04003666 return false; /* aux transfer failed */
Keith Packard92fd8fd2011-07-25 19:50:10 -07003667
Andy Shevchenkoa8e98152014-09-01 14:12:01 +03003668 DRM_DEBUG_KMS("DPCD: %*ph\n", (int) sizeof(intel_dp->dpcd), intel_dp->dpcd);
Damien Lespiau577c7a52012-12-13 16:09:02 +00003669
Ville Syrjäläfe5a66f2016-07-29 16:52:39 +03003670 return intel_dp->dpcd[DP_DPCD_REV] != 0;
3671}
3672
3673static bool
3674intel_edp_init_dpcd(struct intel_dp *intel_dp)
3675{
3676 struct drm_i915_private *dev_priv =
3677 to_i915(dp_to_dig_port(intel_dp)->base.base.dev);
3678
3679 /* this function is meant to be called only once */
3680 WARN_ON(intel_dp->dpcd[DP_DPCD_REV] != 0);
3681
3682 if (!intel_dp_read_dpcd(intel_dp))
3683 return false;
3684
Jani Nikula84c36752017-05-18 14:10:23 +03003685 drm_dp_read_desc(&intel_dp->aux, &intel_dp->desc,
3686 drm_dp_is_branch(intel_dp->dpcd));
Imre Deak12a47a422016-10-24 19:33:29 +03003687
Ville Syrjäläfe5a66f2016-07-29 16:52:39 +03003688 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11)
3689 dev_priv->no_aux_handshake = intel_dp->dpcd[DP_MAX_DOWNSPREAD] &
3690 DP_NO_AUX_HANDSHAKE_LINK_TRAINING;
3691
3692 /* Check if the panel supports PSR */
3693 drm_dp_dpcd_read(&intel_dp->aux, DP_PSR_SUPPORT,
3694 intel_dp->psr_dpcd,
3695 sizeof(intel_dp->psr_dpcd));
3696 if (intel_dp->psr_dpcd[0] & DP_PSR_IS_SUPPORTED) {
3697 dev_priv->psr.sink_support = true;
3698 DRM_DEBUG_KMS("Detected EDP PSR Panel.\n");
3699 }
3700
3701 if (INTEL_GEN(dev_priv) >= 9 &&
3702 (intel_dp->psr_dpcd[0] & DP_PSR2_IS_SUPPORTED)) {
3703 uint8_t frame_sync_cap;
3704
3705 dev_priv->psr.sink_support = true;
Imre Deak9bacd4b2017-05-10 12:21:48 +03003706 if (drm_dp_dpcd_readb(&intel_dp->aux,
3707 DP_SINK_DEVICE_AUX_FRAME_SYNC_CAP,
3708 &frame_sync_cap) != 1)
3709 frame_sync_cap = 0;
Ville Syrjäläfe5a66f2016-07-29 16:52:39 +03003710 dev_priv->psr.aux_frame_sync = frame_sync_cap ? true : false;
3711 /* PSR2 needs frame sync as well */
3712 dev_priv->psr.psr2_support = dev_priv->psr.aux_frame_sync;
3713 DRM_DEBUG_KMS("PSR2 %s on sink",
3714 dev_priv->psr.psr2_support ? "supported" : "not supported");
Nagaraju, Vathsala97da2ef2017-01-02 17:00:55 +05303715
3716 if (dev_priv->psr.psr2_support) {
3717 dev_priv->psr.y_cord_support =
3718 intel_dp_get_y_cord_status(intel_dp);
3719 dev_priv->psr.colorimetry_support =
3720 intel_dp_get_colorimetry_status(intel_dp);
Nagaraju, Vathsala340c93c2017-01-02 17:00:58 +05303721 dev_priv->psr.alpm =
3722 intel_dp_get_alpm_status(intel_dp);
Nagaraju, Vathsala97da2ef2017-01-02 17:00:55 +05303723 }
3724
Ville Syrjäläfe5a66f2016-07-29 16:52:39 +03003725 }
3726
Jani Nikula7c838e22017-10-26 17:29:31 +03003727 /*
3728 * Read the eDP display control registers.
3729 *
3730 * Do this independent of DP_DPCD_DISPLAY_CONTROL_CAPABLE bit in
3731 * DP_EDP_CONFIGURATION_CAP, because some buggy displays do not have it
3732 * set, but require eDP 1.4+ detection (e.g. for supported link rates
3733 * method). The display control registers should read zero if they're
3734 * not supported anyway.
3735 */
3736 if (drm_dp_dpcd_read(&intel_dp->aux, DP_EDP_DPCD_REV,
Dan Carpenterf7170e22016-10-13 11:55:08 +03003737 intel_dp->edp_dpcd, sizeof(intel_dp->edp_dpcd)) ==
3738 sizeof(intel_dp->edp_dpcd))
Jani Nikulae6ed2a12017-10-26 17:29:32 +03003739 DRM_DEBUG_KMS("eDP DPCD: %*ph\n", (int) sizeof(intel_dp->edp_dpcd),
Ville Syrjäläfe5a66f2016-07-29 16:52:39 +03003740 intel_dp->edp_dpcd);
3741
Jani Nikulae6ed2a12017-10-26 17:29:32 +03003742 /* Read the eDP 1.4+ supported link rates. */
3743 if (intel_dp->edp_dpcd[0] >= DP_EDP_14) {
Ville Syrjäläfe5a66f2016-07-29 16:52:39 +03003744 __le16 sink_rates[DP_MAX_SUPPORTED_RATES];
3745 int i;
3746
3747 drm_dp_dpcd_read(&intel_dp->aux, DP_SUPPORTED_LINK_RATES,
3748 sink_rates, sizeof(sink_rates));
3749
3750 for (i = 0; i < ARRAY_SIZE(sink_rates); i++) {
3751 int val = le16_to_cpu(sink_rates[i]);
3752
3753 if (val == 0)
3754 break;
3755
Dhinakaran Pandiyanfd81c442016-11-14 13:50:20 -08003756 /* Value read multiplied by 200kHz gives the per-lane
3757 * link rate in kHz. The source rates are, however,
3758 * stored in terms of LS_Clk kHz. The full conversion
3759 * back to symbols is
3760 * (val * 200kHz)*(8/10 ch. encoding)*(1/8 bit to Byte)
3761 */
Ville Syrjäläfe5a66f2016-07-29 16:52:39 +03003762 intel_dp->sink_rates[i] = (val * 200) / 10;
3763 }
3764 intel_dp->num_sink_rates = i;
3765 }
3766
Jani Nikulae6ed2a12017-10-26 17:29:32 +03003767 /*
3768 * Use DP_LINK_RATE_SET if DP_SUPPORTED_LINK_RATES are available,
3769 * default to DP_MAX_LINK_RATE and DP_LINK_BW_SET otherwise.
3770 */
Jani Nikula68f357c2017-03-28 17:59:05 +03003771 if (intel_dp->num_sink_rates)
3772 intel_dp->use_rate_select = true;
3773 else
3774 intel_dp_set_sink_rates(intel_dp);
3775
Jani Nikula975ee5fca2017-04-06 16:44:10 +03003776 intel_dp_set_common_rates(intel_dp);
3777
Ville Syrjäläfe5a66f2016-07-29 16:52:39 +03003778 return true;
3779}
3780
3781
3782static bool
3783intel_dp_get_dpcd(struct intel_dp *intel_dp)
3784{
Jani Nikula27dbefb2017-04-06 16:44:17 +03003785 u8 sink_count;
3786
Ville Syrjäläfe5a66f2016-07-29 16:52:39 +03003787 if (!intel_dp_read_dpcd(intel_dp))
3788 return false;
Adam Jacksonedb39242012-09-18 10:58:49 -04003789
Jani Nikula68f357c2017-03-28 17:59:05 +03003790 /* Don't clobber cached eDP rates. */
Jani Nikula1853a9d2017-08-18 12:30:20 +03003791 if (!intel_dp_is_edp(intel_dp)) {
Jani Nikula68f357c2017-03-28 17:59:05 +03003792 intel_dp_set_sink_rates(intel_dp);
Jani Nikula975ee5fca2017-04-06 16:44:10 +03003793 intel_dp_set_common_rates(intel_dp);
3794 }
Jani Nikula68f357c2017-03-28 17:59:05 +03003795
Jani Nikula27dbefb2017-04-06 16:44:17 +03003796 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_SINK_COUNT, &sink_count) <= 0)
Shubhangi Shrivastava30d9aa42016-03-30 18:05:25 +05303797 return false;
3798
3799 /*
3800 * Sink count can change between short pulse hpd hence
3801 * a member variable in intel_dp will track any changes
3802 * between short pulse interrupts.
3803 */
Jani Nikula27dbefb2017-04-06 16:44:17 +03003804 intel_dp->sink_count = DP_GET_SINK_COUNT(sink_count);
Shubhangi Shrivastava30d9aa42016-03-30 18:05:25 +05303805
3806 /*
3807 * SINK_COUNT == 0 and DOWNSTREAM_PORT_PRESENT == 1 implies that
3808 * a dongle is present but no display. Unless we require to know
3809 * if a dongle is present or not, we don't need to update
3810 * downstream port information. So, an early return here saves
3811 * time from performing other operations which are not required.
3812 */
Jani Nikula1853a9d2017-08-18 12:30:20 +03003813 if (!intel_dp_is_edp(intel_dp) && !intel_dp->sink_count)
Shubhangi Shrivastava30d9aa42016-03-30 18:05:25 +05303814 return false;
3815
Imre Deakc726ad02016-10-24 19:33:24 +03003816 if (!drm_dp_is_branch(intel_dp->dpcd))
Adam Jacksonedb39242012-09-18 10:58:49 -04003817 return true; /* native DP sink */
3818
3819 if (intel_dp->dpcd[DP_DPCD_REV] == 0x10)
3820 return true; /* no per-port downstream info */
3821
Lyude9f085eb2016-04-13 10:58:33 -04003822 if (drm_dp_dpcd_read(&intel_dp->aux, DP_DOWNSTREAM_PORT_0,
3823 intel_dp->downstream_ports,
3824 DP_MAX_DOWNSTREAM_PORTS) < 0)
Adam Jacksonedb39242012-09-18 10:58:49 -04003825 return false; /* downstream port status fetch failed */
3826
3827 return true;
Keith Packard92fd8fd2011-07-25 19:50:10 -07003828}
3829
Dave Airlie0e32b392014-05-02 14:02:48 +10003830static bool
Ville Syrjäläc4e31702016-07-29 16:51:16 +03003831intel_dp_can_mst(struct intel_dp *intel_dp)
Dave Airlie0e32b392014-05-02 14:02:48 +10003832{
Jani Nikula010b9b32017-04-06 16:44:16 +03003833 u8 mstm_cap;
Dave Airlie0e32b392014-05-02 14:02:48 +10003834
Michal Wajdeczko4f044a82017-09-19 19:38:44 +00003835 if (!i915_modparams.enable_dp_mst)
Nathan Schulte7cc96132016-03-15 10:14:05 -05003836 return false;
3837
Dave Airlie0e32b392014-05-02 14:02:48 +10003838 if (!intel_dp->can_mst)
3839 return false;
3840
3841 if (intel_dp->dpcd[DP_DPCD_REV] < 0x12)
3842 return false;
3843
Jani Nikula010b9b32017-04-06 16:44:16 +03003844 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_MSTM_CAP, &mstm_cap) != 1)
Ville Syrjäläc4e31702016-07-29 16:51:16 +03003845 return false;
Dave Airlie0e32b392014-05-02 14:02:48 +10003846
Jani Nikula010b9b32017-04-06 16:44:16 +03003847 return mstm_cap & DP_MST_CAP;
Ville Syrjäläc4e31702016-07-29 16:51:16 +03003848}
3849
3850static void
3851intel_dp_configure_mst(struct intel_dp *intel_dp)
3852{
Michal Wajdeczko4f044a82017-09-19 19:38:44 +00003853 if (!i915_modparams.enable_dp_mst)
Ville Syrjäläc4e31702016-07-29 16:51:16 +03003854 return;
3855
3856 if (!intel_dp->can_mst)
3857 return;
3858
3859 intel_dp->is_mst = intel_dp_can_mst(intel_dp);
3860
3861 if (intel_dp->is_mst)
3862 DRM_DEBUG_KMS("Sink is MST capable\n");
3863 else
3864 DRM_DEBUG_KMS("Sink is not MST capable\n");
3865
3866 drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
3867 intel_dp->is_mst);
Dave Airlie0e32b392014-05-02 14:02:48 +10003868}
3869
Maarten Lankhorst93313532017-11-10 12:34:59 +01003870static int intel_dp_sink_crc_stop(struct intel_dp *intel_dp,
3871 struct intel_crtc_state *crtc_state, bool disable_wa)
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003872{
Rodrigo Vivi082dcc72015-07-30 16:26:39 -07003873 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
Ville Syrjälä0f0f74b2016-10-31 22:37:06 +02003874 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
Maarten Lankhorst93313532017-11-10 12:34:59 +01003875 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
Rodrigo Viviad9dc912014-09-16 19:18:12 -04003876 u8 buf;
Rodrigo Vivie5a1cab2015-07-23 16:35:48 -07003877 int ret = 0;
Rodrigo Vivic6297842015-11-05 10:50:20 -08003878 int count = 0;
3879 int attempts = 10;
Paulo Zanoni4373f0f2015-05-25 18:52:29 -03003880
3881 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK, &buf) < 0) {
Rodrigo Vivi082dcc72015-07-30 16:26:39 -07003882 DRM_DEBUG_KMS("Sink CRC couldn't be stopped properly\n");
Rodrigo Vivie5a1cab2015-07-23 16:35:48 -07003883 ret = -EIO;
3884 goto out;
Paulo Zanoni4373f0f2015-05-25 18:52:29 -03003885 }
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003886
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003887 if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK,
Rodrigo Vivie5a1cab2015-07-23 16:35:48 -07003888 buf & ~DP_TEST_SINK_START) < 0) {
Rodrigo Vivi082dcc72015-07-30 16:26:39 -07003889 DRM_DEBUG_KMS("Sink CRC couldn't be stopped properly\n");
Rodrigo Vivie5a1cab2015-07-23 16:35:48 -07003890 ret = -EIO;
3891 goto out;
3892 }
Rodrigo Vivi082dcc72015-07-30 16:26:39 -07003893
Rodrigo Vivic6297842015-11-05 10:50:20 -08003894 do {
Ville Syrjälä0f0f74b2016-10-31 22:37:06 +02003895 intel_wait_for_vblank(dev_priv, intel_crtc->pipe);
Rodrigo Vivic6297842015-11-05 10:50:20 -08003896
3897 if (drm_dp_dpcd_readb(&intel_dp->aux,
3898 DP_TEST_SINK_MISC, &buf) < 0) {
3899 ret = -EIO;
3900 goto out;
3901 }
3902 count = buf & DP_TEST_COUNT_MASK;
3903 } while (--attempts && count);
3904
3905 if (attempts == 0) {
Rodrigo Vividc5a9032016-01-29 14:44:59 -08003906 DRM_DEBUG_KMS("TIMEOUT: Sink CRC counter is not zeroed after calculation is stopped\n");
Rodrigo Vivic6297842015-11-05 10:50:20 -08003907 ret = -ETIMEDOUT;
3908 }
3909
Rodrigo Vivie5a1cab2015-07-23 16:35:48 -07003910 out:
Maarten Lankhorst93313532017-11-10 12:34:59 +01003911 if (disable_wa)
Maarten Lankhorst199ea382017-11-10 12:35:00 +01003912 hsw_enable_ips(crtc_state);
Rodrigo Vivie5a1cab2015-07-23 16:35:48 -07003913 return ret;
Rodrigo Vivi082dcc72015-07-30 16:26:39 -07003914}
3915
Maarten Lankhorst93313532017-11-10 12:34:59 +01003916static int intel_dp_sink_crc_start(struct intel_dp *intel_dp,
3917 struct intel_crtc_state *crtc_state)
Rodrigo Vivi082dcc72015-07-30 16:26:39 -07003918{
3919 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
Ville Syrjälä0f0f74b2016-10-31 22:37:06 +02003920 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
Maarten Lankhorst93313532017-11-10 12:34:59 +01003921 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
Rodrigo Vivi082dcc72015-07-30 16:26:39 -07003922 u8 buf;
Rodrigo Vivie5a1cab2015-07-23 16:35:48 -07003923 int ret;
3924
Rodrigo Vivi082dcc72015-07-30 16:26:39 -07003925 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK_MISC, &buf) < 0)
3926 return -EIO;
3927
3928 if (!(buf & DP_TEST_CRC_SUPPORTED))
3929 return -ENOTTY;
3930
3931 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK, &buf) < 0)
3932 return -EIO;
3933
Rodrigo Vivi6d8175d2015-11-05 10:50:22 -08003934 if (buf & DP_TEST_SINK_START) {
Maarten Lankhorst93313532017-11-10 12:34:59 +01003935 ret = intel_dp_sink_crc_stop(intel_dp, crtc_state, false);
Rodrigo Vivi6d8175d2015-11-05 10:50:22 -08003936 if (ret)
3937 return ret;
3938 }
3939
Maarten Lankhorst199ea382017-11-10 12:35:00 +01003940 hsw_disable_ips(crtc_state);
Rodrigo Vivi082dcc72015-07-30 16:26:39 -07003941
3942 if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK,
3943 buf | DP_TEST_SINK_START) < 0) {
Maarten Lankhorst199ea382017-11-10 12:35:00 +01003944 hsw_enable_ips(crtc_state);
Rodrigo Vivi082dcc72015-07-30 16:26:39 -07003945 return -EIO;
Paulo Zanoni4373f0f2015-05-25 18:52:29 -03003946 }
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003947
Ville Syrjälä0f0f74b2016-10-31 22:37:06 +02003948 intel_wait_for_vblank(dev_priv, intel_crtc->pipe);
Rodrigo Vivi082dcc72015-07-30 16:26:39 -07003949 return 0;
3950}
3951
Maarten Lankhorst93313532017-11-10 12:34:59 +01003952int intel_dp_sink_crc(struct intel_dp *intel_dp, struct intel_crtc_state *crtc_state, u8 *crc)
Rodrigo Vivi082dcc72015-07-30 16:26:39 -07003953{
3954 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
Ville Syrjälä0f0f74b2016-10-31 22:37:06 +02003955 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
Maarten Lankhorst93313532017-11-10 12:34:59 +01003956 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
Rodrigo Vivi082dcc72015-07-30 16:26:39 -07003957 u8 buf;
Rodrigo Vivi621d4c72015-07-23 16:35:49 -07003958 int count, ret;
Rodrigo Vivi082dcc72015-07-30 16:26:39 -07003959 int attempts = 6;
Rodrigo Vivi082dcc72015-07-30 16:26:39 -07003960
Maarten Lankhorst93313532017-11-10 12:34:59 +01003961 ret = intel_dp_sink_crc_start(intel_dp, crtc_state);
Rodrigo Vivi082dcc72015-07-30 16:26:39 -07003962 if (ret)
3963 return ret;
3964
Rodrigo Viviad9dc912014-09-16 19:18:12 -04003965 do {
Ville Syrjälä0f0f74b2016-10-31 22:37:06 +02003966 intel_wait_for_vblank(dev_priv, intel_crtc->pipe);
Rodrigo Vivi621d4c72015-07-23 16:35:49 -07003967
Rodrigo Vivi1dda5f92014-10-01 07:32:37 -07003968 if (drm_dp_dpcd_readb(&intel_dp->aux,
Paulo Zanoni4373f0f2015-05-25 18:52:29 -03003969 DP_TEST_SINK_MISC, &buf) < 0) {
3970 ret = -EIO;
Rodrigo Viviafe0d672015-07-23 16:35:45 -07003971 goto stop;
Paulo Zanoni4373f0f2015-05-25 18:52:29 -03003972 }
Rodrigo Vivi621d4c72015-07-23 16:35:49 -07003973 count = buf & DP_TEST_COUNT_MASK;
Rodrigo Viviaabc95d2015-07-23 16:35:50 -07003974
Rodrigo Vivi7e38eef2015-11-05 10:50:21 -08003975 } while (--attempts && count == 0);
Rodrigo Viviad9dc912014-09-16 19:18:12 -04003976
3977 if (attempts == 0) {
Rodrigo Vivi7e38eef2015-11-05 10:50:21 -08003978 DRM_ERROR("Panel is unable to calculate any CRC after 6 vblanks\n");
3979 ret = -ETIMEDOUT;
3980 goto stop;
3981 }
3982
3983 if (drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_CRC_R_CR, crc, 6) < 0) {
3984 ret = -EIO;
3985 goto stop;
Rodrigo Viviad9dc912014-09-16 19:18:12 -04003986 }
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003987
Rodrigo Viviafe0d672015-07-23 16:35:45 -07003988stop:
Maarten Lankhorst93313532017-11-10 12:34:59 +01003989 intel_dp_sink_crc_stop(intel_dp, crtc_state, true);
Paulo Zanoni4373f0f2015-05-25 18:52:29 -03003990 return ret;
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003991}
3992
Jesse Barnesa60f0e32011-10-20 15:09:17 -07003993static bool
3994intel_dp_get_sink_irq(struct intel_dp *intel_dp, u8 *sink_irq_vector)
3995{
Jani Nikula010b9b32017-04-06 16:44:16 +03003996 return drm_dp_dpcd_readb(&intel_dp->aux, DP_DEVICE_SERVICE_IRQ_VECTOR,
3997 sink_irq_vector) == 1;
Jesse Barnesa60f0e32011-10-20 15:09:17 -07003998}
3999
Dave Airlie0e32b392014-05-02 14:02:48 +10004000static bool
4001intel_dp_get_sink_irq_esi(struct intel_dp *intel_dp, u8 *sink_irq_vector)
4002{
Pandiyan, Dhinakarane8b25772017-09-18 15:21:39 -07004003 return drm_dp_dpcd_read(&intel_dp->aux, DP_SINK_COUNT_ESI,
4004 sink_irq_vector, DP_DPRX_ESI_LEN) ==
4005 DP_DPRX_ESI_LEN;
Dave Airlie0e32b392014-05-02 14:02:48 +10004006}
4007
Todd Previtec5d5ab72015-04-15 08:38:38 -07004008static uint8_t intel_dp_autotest_link_training(struct intel_dp *intel_dp)
Jesse Barnesa60f0e32011-10-20 15:09:17 -07004009{
Manasi Navareda15f7c2017-01-24 08:16:34 -08004010 int status = 0;
Manasi Navare140ef132017-06-08 13:41:03 -07004011 int test_link_rate;
Manasi Navareda15f7c2017-01-24 08:16:34 -08004012 uint8_t test_lane_count, test_link_bw;
4013 /* (DP CTS 1.2)
4014 * 4.3.1.11
4015 */
4016 /* Read the TEST_LANE_COUNT and TEST_LINK_RTAE fields (DP CTS 3.1.4) */
4017 status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_LANE_COUNT,
4018 &test_lane_count);
4019
4020 if (status <= 0) {
4021 DRM_DEBUG_KMS("Lane count read failed\n");
4022 return DP_TEST_NAK;
4023 }
4024 test_lane_count &= DP_MAX_LANE_COUNT_MASK;
Manasi Navareda15f7c2017-01-24 08:16:34 -08004025
4026 status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_LINK_RATE,
4027 &test_link_bw);
4028 if (status <= 0) {
4029 DRM_DEBUG_KMS("Link Rate read failed\n");
4030 return DP_TEST_NAK;
4031 }
Manasi Navareda15f7c2017-01-24 08:16:34 -08004032 test_link_rate = drm_dp_bw_code_to_link_rate(test_link_bw);
Manasi Navare140ef132017-06-08 13:41:03 -07004033
4034 /* Validate the requested link rate and lane count */
4035 if (!intel_dp_link_params_valid(intel_dp, test_link_rate,
4036 test_lane_count))
Manasi Navareda15f7c2017-01-24 08:16:34 -08004037 return DP_TEST_NAK;
4038
4039 intel_dp->compliance.test_lane_count = test_lane_count;
4040 intel_dp->compliance.test_link_rate = test_link_rate;
4041
4042 return DP_TEST_ACK;
Todd Previtec5d5ab72015-04-15 08:38:38 -07004043}
4044
4045static uint8_t intel_dp_autotest_video_pattern(struct intel_dp *intel_dp)
4046{
Manasi Navare611032b2017-01-24 08:21:49 -08004047 uint8_t test_pattern;
Jani Nikula010b9b32017-04-06 16:44:16 +03004048 uint8_t test_misc;
Manasi Navare611032b2017-01-24 08:21:49 -08004049 __be16 h_width, v_height;
4050 int status = 0;
4051
4052 /* Read the TEST_PATTERN (DP CTS 3.1.5) */
Jani Nikula010b9b32017-04-06 16:44:16 +03004053 status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_PATTERN,
4054 &test_pattern);
Manasi Navare611032b2017-01-24 08:21:49 -08004055 if (status <= 0) {
4056 DRM_DEBUG_KMS("Test pattern read failed\n");
4057 return DP_TEST_NAK;
4058 }
4059 if (test_pattern != DP_COLOR_RAMP)
4060 return DP_TEST_NAK;
4061
4062 status = drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_H_WIDTH_HI,
4063 &h_width, 2);
4064 if (status <= 0) {
4065 DRM_DEBUG_KMS("H Width read failed\n");
4066 return DP_TEST_NAK;
4067 }
4068
4069 status = drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_V_HEIGHT_HI,
4070 &v_height, 2);
4071 if (status <= 0) {
4072 DRM_DEBUG_KMS("V Height read failed\n");
4073 return DP_TEST_NAK;
4074 }
4075
Jani Nikula010b9b32017-04-06 16:44:16 +03004076 status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_MISC0,
4077 &test_misc);
Manasi Navare611032b2017-01-24 08:21:49 -08004078 if (status <= 0) {
4079 DRM_DEBUG_KMS("TEST MISC read failed\n");
4080 return DP_TEST_NAK;
4081 }
4082 if ((test_misc & DP_TEST_COLOR_FORMAT_MASK) != DP_COLOR_FORMAT_RGB)
4083 return DP_TEST_NAK;
4084 if (test_misc & DP_TEST_DYNAMIC_RANGE_CEA)
4085 return DP_TEST_NAK;
4086 switch (test_misc & DP_TEST_BIT_DEPTH_MASK) {
4087 case DP_TEST_BIT_DEPTH_6:
4088 intel_dp->compliance.test_data.bpc = 6;
4089 break;
4090 case DP_TEST_BIT_DEPTH_8:
4091 intel_dp->compliance.test_data.bpc = 8;
4092 break;
4093 default:
4094 return DP_TEST_NAK;
4095 }
4096
4097 intel_dp->compliance.test_data.video_pattern = test_pattern;
4098 intel_dp->compliance.test_data.hdisplay = be16_to_cpu(h_width);
4099 intel_dp->compliance.test_data.vdisplay = be16_to_cpu(v_height);
4100 /* Set test active flag here so userspace doesn't interrupt things */
4101 intel_dp->compliance.test_active = 1;
4102
4103 return DP_TEST_ACK;
Todd Previtec5d5ab72015-04-15 08:38:38 -07004104}
4105
4106static uint8_t intel_dp_autotest_edid(struct intel_dp *intel_dp)
4107{
Manasi Navareb48a5ba2017-01-20 19:09:28 -08004108 uint8_t test_result = DP_TEST_ACK;
Todd Previte559be302015-05-04 07:48:20 -07004109 struct intel_connector *intel_connector = intel_dp->attached_connector;
4110 struct drm_connector *connector = &intel_connector->base;
4111
4112 if (intel_connector->detect_edid == NULL ||
Daniel Vetterac6f2e22015-05-08 16:15:41 +02004113 connector->edid_corrupt ||
Todd Previte559be302015-05-04 07:48:20 -07004114 intel_dp->aux.i2c_defer_count > 6) {
4115 /* Check EDID read for NACKs, DEFERs and corruption
4116 * (DP CTS 1.2 Core r1.1)
4117 * 4.2.2.4 : Failed EDID read, I2C_NAK
4118 * 4.2.2.5 : Failed EDID read, I2C_DEFER
4119 * 4.2.2.6 : EDID corruption detected
4120 * Use failsafe mode for all cases
4121 */
4122 if (intel_dp->aux.i2c_nack_count > 0 ||
4123 intel_dp->aux.i2c_defer_count > 0)
4124 DRM_DEBUG_KMS("EDID read had %d NACKs, %d DEFERs\n",
4125 intel_dp->aux.i2c_nack_count,
4126 intel_dp->aux.i2c_defer_count);
Manasi Navarec1617ab2016-12-09 16:22:50 -08004127 intel_dp->compliance.test_data.edid = INTEL_DP_RESOLUTION_FAILSAFE;
Todd Previte559be302015-05-04 07:48:20 -07004128 } else {
Thulasimani,Sivakumarf79b468e2015-08-07 15:14:30 +05304129 struct edid *block = intel_connector->detect_edid;
4130
4131 /* We have to write the checksum
4132 * of the last block read
4133 */
4134 block += intel_connector->detect_edid->extensions;
4135
Jani Nikula010b9b32017-04-06 16:44:16 +03004136 if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_EDID_CHECKSUM,
4137 block->checksum) <= 0)
Todd Previte559be302015-05-04 07:48:20 -07004138 DRM_DEBUG_KMS("Failed to write EDID checksum\n");
4139
4140 test_result = DP_TEST_ACK | DP_TEST_EDID_CHECKSUM_WRITE;
Manasi Navareb48a5ba2017-01-20 19:09:28 -08004141 intel_dp->compliance.test_data.edid = INTEL_DP_RESOLUTION_PREFERRED;
Todd Previte559be302015-05-04 07:48:20 -07004142 }
4143
4144 /* Set test active flag here so userspace doesn't interrupt things */
Manasi Navarec1617ab2016-12-09 16:22:50 -08004145 intel_dp->compliance.test_active = 1;
Todd Previte559be302015-05-04 07:48:20 -07004146
Todd Previtec5d5ab72015-04-15 08:38:38 -07004147 return test_result;
4148}
4149
4150static uint8_t intel_dp_autotest_phy_pattern(struct intel_dp *intel_dp)
4151{
4152 uint8_t test_result = DP_TEST_NAK;
4153 return test_result;
4154}
4155
4156static void intel_dp_handle_test_request(struct intel_dp *intel_dp)
4157{
4158 uint8_t response = DP_TEST_NAK;
Jani Nikula5ec63bb2017-01-20 19:04:06 +02004159 uint8_t request = 0;
4160 int status;
Todd Previtec5d5ab72015-04-15 08:38:38 -07004161
Jani Nikula5ec63bb2017-01-20 19:04:06 +02004162 status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_REQUEST, &request);
Todd Previtec5d5ab72015-04-15 08:38:38 -07004163 if (status <= 0) {
4164 DRM_DEBUG_KMS("Could not read test request from sink\n");
4165 goto update_status;
4166 }
4167
Jani Nikula5ec63bb2017-01-20 19:04:06 +02004168 switch (request) {
Todd Previtec5d5ab72015-04-15 08:38:38 -07004169 case DP_TEST_LINK_TRAINING:
4170 DRM_DEBUG_KMS("LINK_TRAINING test requested\n");
Todd Previtec5d5ab72015-04-15 08:38:38 -07004171 response = intel_dp_autotest_link_training(intel_dp);
4172 break;
4173 case DP_TEST_LINK_VIDEO_PATTERN:
4174 DRM_DEBUG_KMS("TEST_PATTERN test requested\n");
Todd Previtec5d5ab72015-04-15 08:38:38 -07004175 response = intel_dp_autotest_video_pattern(intel_dp);
4176 break;
4177 case DP_TEST_LINK_EDID_READ:
4178 DRM_DEBUG_KMS("EDID test requested\n");
Todd Previtec5d5ab72015-04-15 08:38:38 -07004179 response = intel_dp_autotest_edid(intel_dp);
4180 break;
4181 case DP_TEST_LINK_PHY_TEST_PATTERN:
4182 DRM_DEBUG_KMS("PHY_PATTERN test requested\n");
Todd Previtec5d5ab72015-04-15 08:38:38 -07004183 response = intel_dp_autotest_phy_pattern(intel_dp);
4184 break;
4185 default:
Jani Nikula5ec63bb2017-01-20 19:04:06 +02004186 DRM_DEBUG_KMS("Invalid test request '%02x'\n", request);
Todd Previtec5d5ab72015-04-15 08:38:38 -07004187 break;
4188 }
4189
Jani Nikula5ec63bb2017-01-20 19:04:06 +02004190 if (response & DP_TEST_ACK)
4191 intel_dp->compliance.test_type = request;
4192
Todd Previtec5d5ab72015-04-15 08:38:38 -07004193update_status:
Jani Nikula5ec63bb2017-01-20 19:04:06 +02004194 status = drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_RESPONSE, response);
Todd Previtec5d5ab72015-04-15 08:38:38 -07004195 if (status <= 0)
4196 DRM_DEBUG_KMS("Could not write test response to sink\n");
Jesse Barnesa60f0e32011-10-20 15:09:17 -07004197}
4198
Dave Airlie0e32b392014-05-02 14:02:48 +10004199static int
4200intel_dp_check_mst_status(struct intel_dp *intel_dp)
4201{
4202 bool bret;
4203
4204 if (intel_dp->is_mst) {
Pandiyan, Dhinakarane8b25772017-09-18 15:21:39 -07004205 u8 esi[DP_DPRX_ESI_LEN] = { 0 };
Dave Airlie0e32b392014-05-02 14:02:48 +10004206 int ret = 0;
4207 int retry;
4208 bool handled;
4209 bret = intel_dp_get_sink_irq_esi(intel_dp, esi);
4210go_again:
4211 if (bret == true) {
4212
4213 /* check link status - esi[10] = 0x200c */
Ville Syrjälä19e0b4c2016-08-05 19:05:42 +03004214 if (intel_dp->active_mst_links &&
Ville Syrjälä901c2da2015-08-17 18:05:12 +03004215 !drm_dp_channel_eq_ok(&esi[10], intel_dp->lane_count)) {
Dave Airlie0e32b392014-05-02 14:02:48 +10004216 DRM_DEBUG_KMS("channel EQ not ok, retraining\n");
4217 intel_dp_start_link_train(intel_dp);
Dave Airlie0e32b392014-05-02 14:02:48 +10004218 intel_dp_stop_link_train(intel_dp);
4219 }
4220
Andy Shevchenko6f34cc32015-01-15 13:45:09 +02004221 DRM_DEBUG_KMS("got esi %3ph\n", esi);
Dave Airlie0e32b392014-05-02 14:02:48 +10004222 ret = drm_dp_mst_hpd_irq(&intel_dp->mst_mgr, esi, &handled);
4223
4224 if (handled) {
4225 for (retry = 0; retry < 3; retry++) {
4226 int wret;
4227 wret = drm_dp_dpcd_write(&intel_dp->aux,
4228 DP_SINK_COUNT_ESI+1,
4229 &esi[1], 3);
4230 if (wret == 3) {
4231 break;
4232 }
4233 }
4234
4235 bret = intel_dp_get_sink_irq_esi(intel_dp, esi);
4236 if (bret == true) {
Andy Shevchenko6f34cc32015-01-15 13:45:09 +02004237 DRM_DEBUG_KMS("got esi2 %3ph\n", esi);
Dave Airlie0e32b392014-05-02 14:02:48 +10004238 goto go_again;
4239 }
4240 } else
4241 ret = 0;
4242
4243 return ret;
4244 } else {
4245 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
4246 DRM_DEBUG_KMS("failed to get ESI - device may have failed\n");
4247 intel_dp->is_mst = false;
4248 drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr, intel_dp->is_mst);
4249 /* send a hotplug event */
4250 drm_kms_helper_hotplug_event(intel_dig_port->base.base.dev);
4251 }
4252 }
4253 return -EINVAL;
4254}
4255
Shubhangi Shrivastava5c9114d2016-03-30 18:05:24 +05304256static void
Ville Syrjäläbfd02b32016-10-14 20:02:54 +03004257intel_dp_retrain_link(struct intel_dp *intel_dp)
4258{
4259 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
4260 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
4261 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
4262
4263 /* Suppress underruns caused by re-training */
4264 intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, false);
4265 if (crtc->config->has_pch_encoder)
4266 intel_set_pch_fifo_underrun_reporting(dev_priv,
4267 intel_crtc_pch_transcoder(crtc), false);
4268
4269 intel_dp_start_link_train(intel_dp);
4270 intel_dp_stop_link_train(intel_dp);
4271
4272 /* Keep underrun reporting disabled until things are stable */
Ville Syrjälä0f0f74b2016-10-31 22:37:06 +02004273 intel_wait_for_vblank(dev_priv, crtc->pipe);
Ville Syrjäläbfd02b32016-10-14 20:02:54 +03004274
4275 intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, true);
4276 if (crtc->config->has_pch_encoder)
4277 intel_set_pch_fifo_underrun_reporting(dev_priv,
4278 intel_crtc_pch_transcoder(crtc), true);
4279}
4280
4281static void
Shubhangi Shrivastava5c9114d2016-03-30 18:05:24 +05304282intel_dp_check_link_status(struct intel_dp *intel_dp)
4283{
Ville Syrjälä2f773472017-11-09 17:27:58 +02004284 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Shubhangi Shrivastava5c9114d2016-03-30 18:05:24 +05304285 struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base;
Daniel Vetter42e5e652017-11-13 17:01:40 +01004286 struct drm_connector_state *conn_state =
4287 intel_dp->attached_connector->base.state;
Shubhangi Shrivastava5c9114d2016-03-30 18:05:24 +05304288 u8 link_status[DP_LINK_STATUS_SIZE];
4289
Ville Syrjälä2f773472017-11-09 17:27:58 +02004290 WARN_ON(!drm_modeset_is_locked(&dev_priv->drm.mode_config.connection_mutex));
Shubhangi Shrivastava5c9114d2016-03-30 18:05:24 +05304291
4292 if (!intel_dp_get_link_status(intel_dp, link_status)) {
4293 DRM_ERROR("Failed to get link status\n");
4294 return;
4295 }
4296
Daniel Vetter42e5e652017-11-13 17:01:40 +01004297 if (!conn_state->crtc)
Shubhangi Shrivastava5c9114d2016-03-30 18:05:24 +05304298 return;
4299
Daniel Vetter42e5e652017-11-13 17:01:40 +01004300 WARN_ON(!drm_modeset_is_locked(&conn_state->crtc->mutex));
4301
4302 if (!conn_state->crtc->state->active)
4303 return;
4304
4305 if (conn_state->commit &&
4306 !try_wait_for_completion(&conn_state->commit->hw_done))
Shubhangi Shrivastava5c9114d2016-03-30 18:05:24 +05304307 return;
4308
Manasi Navare14c562c2017-04-06 14:00:12 -07004309 /*
4310 * Validate the cached values of intel_dp->link_rate and
4311 * intel_dp->lane_count before attempting to retrain.
4312 */
Manasi Navare1a92c702017-06-08 13:41:02 -07004313 if (!intel_dp_link_params_valid(intel_dp, intel_dp->link_rate,
4314 intel_dp->lane_count))
Matthew Auldd4cb3fd2016-10-19 22:29:53 +01004315 return;
4316
Manasi Navareda15f7c2017-01-24 08:16:34 -08004317 /* Retrain if Channel EQ or CR not ok */
4318 if (!drm_dp_channel_eq_ok(link_status, intel_dp->lane_count)) {
Shubhangi Shrivastava5c9114d2016-03-30 18:05:24 +05304319 DRM_DEBUG_KMS("%s: channel EQ not ok, retraining\n",
4320 intel_encoder->base.name);
Ville Syrjäläbfd02b32016-10-14 20:02:54 +03004321
4322 intel_dp_retrain_link(intel_dp);
Shubhangi Shrivastava5c9114d2016-03-30 18:05:24 +05304323 }
4324}
4325
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004326/*
4327 * According to DP spec
4328 * 5.1.2:
4329 * 1. Read DPCD
4330 * 2. Configure link according to Receiver Capabilities
4331 * 3. Use Link Training from 2.5.3.3 and 3.5.1.3
4332 * 4. Check link status on receipt of hot-plug interrupt
Shubhangi Shrivastava39ff7472016-03-30 18:05:26 +05304333 *
4334 * intel_dp_short_pulse - handles short pulse interrupts
4335 * when full detection is not required.
4336 * Returns %true if short pulse is handled and full detection
4337 * is NOT required and %false otherwise.
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004338 */
Shubhangi Shrivastava39ff7472016-03-30 18:05:26 +05304339static bool
Shubhangi Shrivastava5c9114d2016-03-30 18:05:24 +05304340intel_dp_short_pulse(struct intel_dp *intel_dp)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004341{
Ville Syrjälä2f773472017-11-09 17:27:58 +02004342 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Ville Syrjälä65fbb4e2016-07-28 17:50:47 +03004343 u8 sink_irq_vector = 0;
Shubhangi Shrivastava39ff7472016-03-30 18:05:26 +05304344 u8 old_sink_count = intel_dp->sink_count;
4345 bool ret;
Dave Airlie5b215bc2014-08-05 10:40:20 +10004346
Shubhangi Shrivastava4df69602015-10-28 15:30:36 +05304347 /*
4348 * Clearing compliance test variables to allow capturing
4349 * of values for next automated test request.
4350 */
Manasi Navarec1617ab2016-12-09 16:22:50 -08004351 memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance));
Shubhangi Shrivastava4df69602015-10-28 15:30:36 +05304352
Shubhangi Shrivastava39ff7472016-03-30 18:05:26 +05304353 /*
4354 * Now read the DPCD to see if it's actually running
4355 * If the current value of sink count doesn't match with
4356 * the value that was stored earlier or dpcd read failed
4357 * we need to do full detection
4358 */
4359 ret = intel_dp_get_dpcd(intel_dp);
4360
4361 if ((old_sink_count != intel_dp->sink_count) || !ret) {
4362 /* No need to proceed if we are going to do full detect */
4363 return false;
Jesse Barnes59cd09e2011-07-07 11:10:59 -07004364 }
4365
Jesse Barnesa60f0e32011-10-20 15:09:17 -07004366 /* Try to read the source of the interrupt */
4367 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 &&
Ville Syrjälä65fbb4e2016-07-28 17:50:47 +03004368 intel_dp_get_sink_irq(intel_dp, &sink_irq_vector) &&
4369 sink_irq_vector != 0) {
Jesse Barnesa60f0e32011-10-20 15:09:17 -07004370 /* Clear interrupt source */
Jani Nikula9d1a1032014-03-14 16:51:15 +02004371 drm_dp_dpcd_writeb(&intel_dp->aux,
4372 DP_DEVICE_SERVICE_IRQ_VECTOR,
4373 sink_irq_vector);
Jesse Barnesa60f0e32011-10-20 15:09:17 -07004374
4375 if (sink_irq_vector & DP_AUTOMATED_TEST_REQUEST)
Manasi Navareda15f7c2017-01-24 08:16:34 -08004376 intel_dp_handle_test_request(intel_dp);
Jesse Barnesa60f0e32011-10-20 15:09:17 -07004377 if (sink_irq_vector & (DP_CP_IRQ | DP_SINK_SPECIFIC_IRQ))
4378 DRM_DEBUG_DRIVER("CP or sink specific irq unhandled\n");
4379 }
4380
Shubhangi Shrivastava5c9114d2016-03-30 18:05:24 +05304381 intel_dp_check_link_status(intel_dp);
Daniel Vetter42e5e652017-11-13 17:01:40 +01004382
Manasi Navareda15f7c2017-01-24 08:16:34 -08004383 if (intel_dp->compliance.test_type == DP_TEST_LINK_TRAINING) {
4384 DRM_DEBUG_KMS("Link Training Compliance Test requested\n");
4385 /* Send a Hotplug Uevent to userspace to start modeset */
Ville Syrjälä2f773472017-11-09 17:27:58 +02004386 drm_kms_helper_hotplug_event(&dev_priv->drm);
Manasi Navareda15f7c2017-01-24 08:16:34 -08004387 }
Shubhangi Shrivastava39ff7472016-03-30 18:05:26 +05304388
4389 return true;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004390}
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004391
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004392/* XXX this is probably wrong for multiple downstream ports */
Zhenyu Wang5eb08b62009-07-24 01:00:31 +08004393static enum drm_connector_status
Keith Packard26d61aa2011-07-25 20:01:09 -07004394intel_dp_detect_dpcd(struct intel_dp *intel_dp)
Adam Jackson71ba90002011-07-12 17:38:04 -04004395{
Imre Deake393d0d2017-02-22 17:10:52 +02004396 struct intel_lspcon *lspcon = dp_to_lspcon(intel_dp);
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004397 uint8_t *dpcd = intel_dp->dpcd;
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004398 uint8_t type;
4399
Imre Deake393d0d2017-02-22 17:10:52 +02004400 if (lspcon->active)
4401 lspcon_resume(lspcon);
4402
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004403 if (!intel_dp_get_dpcd(intel_dp))
4404 return connector_status_disconnected;
4405
Jani Nikula1853a9d2017-08-18 12:30:20 +03004406 if (intel_dp_is_edp(intel_dp))
Shubhangi Shrivastava1034ce72016-04-12 12:23:54 +05304407 return connector_status_connected;
4408
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004409 /* if there's no downstream port, we're done */
Imre Deakc726ad02016-10-24 19:33:24 +03004410 if (!drm_dp_is_branch(dpcd))
Keith Packard26d61aa2011-07-25 20:01:09 -07004411 return connector_status_connected;
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004412
4413 /* If we're HPD-aware, SINK_COUNT changes dynamically */
Jani Nikulac9ff1602013-09-27 14:48:42 +03004414 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 &&
4415 intel_dp->downstream_ports[0] & DP_DS_PORT_HPD) {
Jani Nikula9d1a1032014-03-14 16:51:15 +02004416
Shubhangi Shrivastava30d9aa42016-03-30 18:05:25 +05304417 return intel_dp->sink_count ?
4418 connector_status_connected : connector_status_disconnected;
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004419 }
4420
Ville Syrjäläc4e31702016-07-29 16:51:16 +03004421 if (intel_dp_can_mst(intel_dp))
4422 return connector_status_connected;
4423
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004424 /* If no HPD, poke DDC gently */
Jani Nikula0b998362014-03-14 16:51:17 +02004425 if (drm_probe_ddc(&intel_dp->aux.ddc))
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004426 return connector_status_connected;
4427
4428 /* Well we tried, say unknown for unreliable port types */
Jani Nikulac9ff1602013-09-27 14:48:42 +03004429 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11) {
4430 type = intel_dp->downstream_ports[0] & DP_DS_PORT_TYPE_MASK;
4431 if (type == DP_DS_PORT_TYPE_VGA ||
4432 type == DP_DS_PORT_TYPE_NON_EDID)
4433 return connector_status_unknown;
4434 } else {
4435 type = intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] &
4436 DP_DWN_STRM_PORT_TYPE_MASK;
4437 if (type == DP_DWN_STRM_PORT_TYPE_ANALOG ||
4438 type == DP_DWN_STRM_PORT_TYPE_OTHER)
4439 return connector_status_unknown;
4440 }
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004441
4442 /* Anything else is out of spec, warn and ignore */
4443 DRM_DEBUG_KMS("Broken DP branch device, ignoring\n");
Keith Packard26d61aa2011-07-25 20:01:09 -07004444 return connector_status_disconnected;
Adam Jackson71ba90002011-07-12 17:38:04 -04004445}
4446
4447static enum drm_connector_status
Chris Wilsond410b562014-09-02 20:03:59 +01004448edp_detect(struct intel_dp *intel_dp)
4449{
Ville Syrjälä2f773472017-11-09 17:27:58 +02004450 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Chris Wilsond410b562014-09-02 20:03:59 +01004451 enum drm_connector_status status;
4452
Mika Kahola1650be72016-12-13 10:02:47 +02004453 status = intel_panel_detect(dev_priv);
Chris Wilsond410b562014-09-02 20:03:59 +01004454 if (status == connector_status_unknown)
4455 status = connector_status_connected;
4456
4457 return status;
4458}
4459
Jani Nikulab93433c2015-08-20 10:47:36 +03004460static bool ibx_digital_port_connected(struct drm_i915_private *dev_priv,
4461 struct intel_digital_port *port)
Zhenyu Wang5eb08b62009-07-24 01:00:31 +08004462{
Jani Nikulab93433c2015-08-20 10:47:36 +03004463 u32 bit;
Jesse Barnes01cb9ea2010-10-07 16:01:12 -07004464
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02004465 switch (port->base.port) {
Jani Nikula0df53b72015-08-20 10:47:40 +03004466 case PORT_B:
4467 bit = SDE_PORTB_HOTPLUG;
4468 break;
4469 case PORT_C:
4470 bit = SDE_PORTC_HOTPLUG;
4471 break;
4472 case PORT_D:
4473 bit = SDE_PORTD_HOTPLUG;
4474 break;
4475 default:
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02004476 MISSING_CASE(port->base.port);
Jani Nikula0df53b72015-08-20 10:47:40 +03004477 return false;
4478 }
4479
4480 return I915_READ(SDEISR) & bit;
4481}
4482
4483static bool cpt_digital_port_connected(struct drm_i915_private *dev_priv,
4484 struct intel_digital_port *port)
4485{
4486 u32 bit;
4487
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02004488 switch (port->base.port) {
Jani Nikula0df53b72015-08-20 10:47:40 +03004489 case PORT_B:
4490 bit = SDE_PORTB_HOTPLUG_CPT;
4491 break;
4492 case PORT_C:
4493 bit = SDE_PORTC_HOTPLUG_CPT;
4494 break;
4495 case PORT_D:
4496 bit = SDE_PORTD_HOTPLUG_CPT;
4497 break;
Ville Syrjälä93e5f0b2017-06-15 20:12:52 +03004498 default:
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02004499 MISSING_CASE(port->base.port);
Ville Syrjälä93e5f0b2017-06-15 20:12:52 +03004500 return false;
4501 }
4502
4503 return I915_READ(SDEISR) & bit;
4504}
4505
4506static bool spt_digital_port_connected(struct drm_i915_private *dev_priv,
4507 struct intel_digital_port *port)
4508{
4509 u32 bit;
4510
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02004511 switch (port->base.port) {
Ville Syrjälä93e5f0b2017-06-15 20:12:52 +03004512 case PORT_A:
4513 bit = SDE_PORTA_HOTPLUG_SPT;
4514 break;
Jani Nikulaa78695d2015-09-18 15:54:50 +03004515 case PORT_E:
4516 bit = SDE_PORTE_HOTPLUG_SPT;
4517 break;
Jani Nikula0df53b72015-08-20 10:47:40 +03004518 default:
Ville Syrjälä93e5f0b2017-06-15 20:12:52 +03004519 return cpt_digital_port_connected(dev_priv, port);
Jani Nikulab93433c2015-08-20 10:47:36 +03004520 }
Damien Lespiau1b469632012-12-13 16:09:01 +00004521
Jani Nikulab93433c2015-08-20 10:47:36 +03004522 return I915_READ(SDEISR) & bit;
Zhenyu Wang5eb08b62009-07-24 01:00:31 +08004523}
4524
Jani Nikula7e66bcf2015-08-20 10:47:39 +03004525static bool g4x_digital_port_connected(struct drm_i915_private *dev_priv,
Jani Nikula1d245982015-08-20 10:47:37 +03004526 struct intel_digital_port *port)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004527{
Jani Nikula9642c812015-08-20 10:47:41 +03004528 u32 bit;
Zhenyu Wang5eb08b62009-07-24 01:00:31 +08004529
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02004530 switch (port->base.port) {
Jani Nikula9642c812015-08-20 10:47:41 +03004531 case PORT_B:
4532 bit = PORTB_HOTPLUG_LIVE_STATUS_G4X;
4533 break;
4534 case PORT_C:
4535 bit = PORTC_HOTPLUG_LIVE_STATUS_G4X;
4536 break;
4537 case PORT_D:
4538 bit = PORTD_HOTPLUG_LIVE_STATUS_G4X;
4539 break;
4540 default:
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02004541 MISSING_CASE(port->base.port);
Jani Nikula9642c812015-08-20 10:47:41 +03004542 return false;
4543 }
4544
4545 return I915_READ(PORT_HOTPLUG_STAT) & bit;
4546}
4547
Ville Syrjälä0780cd32016-02-10 19:59:05 +02004548static bool gm45_digital_port_connected(struct drm_i915_private *dev_priv,
4549 struct intel_digital_port *port)
Jani Nikula9642c812015-08-20 10:47:41 +03004550{
4551 u32 bit;
4552
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02004553 switch (port->base.port) {
Jani Nikula9642c812015-08-20 10:47:41 +03004554 case PORT_B:
Ville Syrjälä0780cd32016-02-10 19:59:05 +02004555 bit = PORTB_HOTPLUG_LIVE_STATUS_GM45;
Jani Nikula9642c812015-08-20 10:47:41 +03004556 break;
4557 case PORT_C:
Ville Syrjälä0780cd32016-02-10 19:59:05 +02004558 bit = PORTC_HOTPLUG_LIVE_STATUS_GM45;
Jani Nikula9642c812015-08-20 10:47:41 +03004559 break;
4560 case PORT_D:
Ville Syrjälä0780cd32016-02-10 19:59:05 +02004561 bit = PORTD_HOTPLUG_LIVE_STATUS_GM45;
Jani Nikula9642c812015-08-20 10:47:41 +03004562 break;
4563 default:
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02004564 MISSING_CASE(port->base.port);
Jani Nikula9642c812015-08-20 10:47:41 +03004565 return false;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004566 }
4567
Jani Nikula1d245982015-08-20 10:47:37 +03004568 return I915_READ(PORT_HOTPLUG_STAT) & bit;
Dave Airlie2a592be2014-09-01 16:58:12 +10004569}
4570
Ville Syrjälä93e5f0b2017-06-15 20:12:52 +03004571static bool ilk_digital_port_connected(struct drm_i915_private *dev_priv,
4572 struct intel_digital_port *port)
4573{
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02004574 if (port->base.port == PORT_A)
Ville Syrjälä93e5f0b2017-06-15 20:12:52 +03004575 return I915_READ(DEISR) & DE_DP_A_HOTPLUG;
4576 else
4577 return ibx_digital_port_connected(dev_priv, port);
4578}
4579
4580static bool snb_digital_port_connected(struct drm_i915_private *dev_priv,
4581 struct intel_digital_port *port)
4582{
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02004583 if (port->base.port == PORT_A)
Ville Syrjälä93e5f0b2017-06-15 20:12:52 +03004584 return I915_READ(DEISR) & DE_DP_A_HOTPLUG;
4585 else
4586 return cpt_digital_port_connected(dev_priv, port);
4587}
4588
4589static bool ivb_digital_port_connected(struct drm_i915_private *dev_priv,
4590 struct intel_digital_port *port)
4591{
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02004592 if (port->base.port == PORT_A)
Ville Syrjälä93e5f0b2017-06-15 20:12:52 +03004593 return I915_READ(DEISR) & DE_DP_A_HOTPLUG_IVB;
4594 else
4595 return cpt_digital_port_connected(dev_priv, port);
4596}
4597
4598static bool bdw_digital_port_connected(struct drm_i915_private *dev_priv,
4599 struct intel_digital_port *port)
4600{
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02004601 if (port->base.port == PORT_A)
Ville Syrjälä93e5f0b2017-06-15 20:12:52 +03004602 return I915_READ(GEN8_DE_PORT_ISR) & GEN8_PORT_DP_A_HOTPLUG;
4603 else
4604 return cpt_digital_port_connected(dev_priv, port);
4605}
4606
Jani Nikulae464bfd2015-08-20 10:47:42 +03004607static bool bxt_digital_port_connected(struct drm_i915_private *dev_priv,
Sonika Jindale2ec35a2015-09-11 16:58:32 +05304608 struct intel_digital_port *intel_dig_port)
Jani Nikulae464bfd2015-08-20 10:47:42 +03004609{
Sonika Jindale2ec35a2015-09-11 16:58:32 +05304610 struct intel_encoder *intel_encoder = &intel_dig_port->base;
4611 enum port port;
Jani Nikulae464bfd2015-08-20 10:47:42 +03004612 u32 bit;
4613
Rodrigo Vivi256cfdd2017-08-11 11:26:49 -07004614 port = intel_hpd_pin_to_port(intel_encoder->hpd_pin);
Sonika Jindale2ec35a2015-09-11 16:58:32 +05304615 switch (port) {
Jani Nikulae464bfd2015-08-20 10:47:42 +03004616 case PORT_A:
4617 bit = BXT_DE_PORT_HP_DDIA;
4618 break;
4619 case PORT_B:
4620 bit = BXT_DE_PORT_HP_DDIB;
4621 break;
4622 case PORT_C:
4623 bit = BXT_DE_PORT_HP_DDIC;
4624 break;
4625 default:
Sonika Jindale2ec35a2015-09-11 16:58:32 +05304626 MISSING_CASE(port);
Jani Nikulae464bfd2015-08-20 10:47:42 +03004627 return false;
4628 }
4629
4630 return I915_READ(GEN8_DE_PORT_ISR) & bit;
4631}
4632
Jani Nikula7e66bcf2015-08-20 10:47:39 +03004633/*
4634 * intel_digital_port_connected - is the specified port connected?
4635 * @dev_priv: i915 private structure
4636 * @port: the port to test
4637 *
4638 * Return %true if @port is connected, %false otherwise.
4639 */
Imre Deak390b4e02017-01-27 11:39:19 +02004640bool intel_digital_port_connected(struct drm_i915_private *dev_priv,
4641 struct intel_digital_port *port)
Jani Nikula7e66bcf2015-08-20 10:47:39 +03004642{
Ville Syrjälä93e5f0b2017-06-15 20:12:52 +03004643 if (HAS_GMCH_DISPLAY(dev_priv)) {
4644 if (IS_GM45(dev_priv))
4645 return gm45_digital_port_connected(dev_priv, port);
4646 else
4647 return g4x_digital_port_connected(dev_priv, port);
4648 }
4649
4650 if (IS_GEN5(dev_priv))
4651 return ilk_digital_port_connected(dev_priv, port);
4652 else if (IS_GEN6(dev_priv))
4653 return snb_digital_port_connected(dev_priv, port);
4654 else if (IS_GEN7(dev_priv))
4655 return ivb_digital_port_connected(dev_priv, port);
4656 else if (IS_GEN8(dev_priv))
4657 return bdw_digital_port_connected(dev_priv, port);
Ander Conselvan de Oliveiracc3f90f2016-12-02 10:23:49 +02004658 else if (IS_GEN9_LP(dev_priv))
Jani Nikulae464bfd2015-08-20 10:47:42 +03004659 return bxt_digital_port_connected(dev_priv, port);
Jani Nikula7e66bcf2015-08-20 10:47:39 +03004660 else
Ville Syrjälä93e5f0b2017-06-15 20:12:52 +03004661 return spt_digital_port_connected(dev_priv, port);
Jani Nikula7e66bcf2015-08-20 10:47:39 +03004662}
4663
Keith Packard8c241fe2011-09-28 16:38:44 -07004664static struct edid *
Chris Wilsonbeb60602014-09-02 20:04:00 +01004665intel_dp_get_edid(struct intel_dp *intel_dp)
Keith Packard8c241fe2011-09-28 16:38:44 -07004666{
Chris Wilsonbeb60602014-09-02 20:04:00 +01004667 struct intel_connector *intel_connector = intel_dp->attached_connector;
Keith Packard8c241fe2011-09-28 16:38:44 -07004668
Jani Nikula9cd300e2012-10-19 14:51:52 +03004669 /* use cached edid if we have one */
4670 if (intel_connector->edid) {
Jani Nikula9cd300e2012-10-19 14:51:52 +03004671 /* invalid edid */
4672 if (IS_ERR(intel_connector->edid))
Jesse Barnesd6f24d02012-06-14 15:28:33 -04004673 return NULL;
4674
Jani Nikula55e9ede2013-10-01 10:38:54 +03004675 return drm_edid_duplicate(intel_connector->edid);
Chris Wilsonbeb60602014-09-02 20:04:00 +01004676 } else
4677 return drm_get_edid(&intel_connector->base,
4678 &intel_dp->aux.ddc);
Keith Packard8c241fe2011-09-28 16:38:44 -07004679}
4680
Chris Wilsonbeb60602014-09-02 20:04:00 +01004681static void
4682intel_dp_set_edid(struct intel_dp *intel_dp)
Keith Packard8c241fe2011-09-28 16:38:44 -07004683{
Chris Wilsonbeb60602014-09-02 20:04:00 +01004684 struct intel_connector *intel_connector = intel_dp->attached_connector;
4685 struct edid *edid;
Keith Packard8c241fe2011-09-28 16:38:44 -07004686
Shubhangi Shrivastavaf21a2192016-03-30 18:05:22 +05304687 intel_dp_unset_edid(intel_dp);
Chris Wilsonbeb60602014-09-02 20:04:00 +01004688 edid = intel_dp_get_edid(intel_dp);
4689 intel_connector->detect_edid = edid;
Jani Nikula9cd300e2012-10-19 14:51:52 +03004690
Maarten Lankhorste6b72c92017-05-01 15:38:00 +02004691 intel_dp->has_audio = drm_detect_monitor_audio(edid);
Chris Wilsonbeb60602014-09-02 20:04:00 +01004692}
Jesse Barnesd6f24d02012-06-14 15:28:33 -04004693
Chris Wilsonbeb60602014-09-02 20:04:00 +01004694static void
4695intel_dp_unset_edid(struct intel_dp *intel_dp)
4696{
4697 struct intel_connector *intel_connector = intel_dp->attached_connector;
4698
4699 kfree(intel_connector->detect_edid);
4700 intel_connector->detect_edid = NULL;
4701
4702 intel_dp->has_audio = false;
4703}
4704
Maarten Lankhorst6c5ed5a2017-04-06 20:55:20 +02004705static int
Ville Syrjälä2f773472017-11-09 17:27:58 +02004706intel_dp_long_pulse(struct intel_connector *connector)
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004707{
Ville Syrjälä2f773472017-11-09 17:27:58 +02004708 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
4709 struct intel_dp *intel_dp = intel_attached_dp(&connector->base);
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004710 enum drm_connector_status status;
Ville Syrjälä65fbb4e2016-07-28 17:50:47 +03004711 u8 sink_irq_vector = 0;
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004712
Ville Syrjälä2f773472017-11-09 17:27:58 +02004713 WARN_ON(!drm_modeset_is_locked(&dev_priv->drm.mode_config.connection_mutex));
Maarten Lankhorst6c5ed5a2017-04-06 20:55:20 +02004714
Ville Syrjälä2f773472017-11-09 17:27:58 +02004715 intel_display_power_get(dev_priv, intel_dp->aux_power_domain);
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004716
Chris Wilsond410b562014-09-02 20:03:59 +01004717 /* Can't disconnect eDP, but you can close the lid... */
Jani Nikula1853a9d2017-08-18 12:30:20 +03004718 if (intel_dp_is_edp(intel_dp))
Chris Wilsond410b562014-09-02 20:03:59 +01004719 status = edp_detect(intel_dp);
Ville Syrjälä2f773472017-11-09 17:27:58 +02004720 else if (intel_digital_port_connected(dev_priv,
Ander Conselvan de Oliveirac555a812015-11-18 17:19:30 +02004721 dp_to_dig_port(intel_dp)))
4722 status = intel_dp_detect_dpcd(intel_dp);
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004723 else
Ander Conselvan de Oliveirac555a812015-11-18 17:19:30 +02004724 status = connector_status_disconnected;
4725
Ville Syrjälä5cb651a2016-10-03 10:55:16 +03004726 if (status == connector_status_disconnected) {
Manasi Navarec1617ab2016-12-09 16:22:50 -08004727 memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance));
Shubhangi Shrivastava4df69602015-10-28 15:30:36 +05304728
jim.bride@linux.intel.com0e505a02016-04-11 10:11:24 -07004729 if (intel_dp->is_mst) {
4730 DRM_DEBUG_KMS("MST device may have disappeared %d vs %d\n",
4731 intel_dp->is_mst,
4732 intel_dp->mst_mgr.mst_state);
4733 intel_dp->is_mst = false;
4734 drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
4735 intel_dp->is_mst);
4736 }
4737
Paulo Zanonic8c8fb32013-11-27 18:21:54 -02004738 goto out;
Shubhangi Shrivastava4df69602015-10-28 15:30:36 +05304739 }
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004740
Manasi Navared7e8ef02017-02-07 16:54:11 -08004741 if (intel_dp->reset_link_params) {
Jani Nikula540b0b7f2017-04-06 16:44:13 +03004742 /* Initial max link lane count */
4743 intel_dp->max_link_lane_count = intel_dp_max_common_lane_count(intel_dp);
Manasi Navaref4829842016-12-05 16:27:36 -08004744
Jani Nikula540b0b7f2017-04-06 16:44:13 +03004745 /* Initial max link rate */
4746 intel_dp->max_link_rate = intel_dp_max_common_rate(intel_dp);
Manasi Navared7e8ef02017-02-07 16:54:11 -08004747
4748 intel_dp->reset_link_params = false;
4749 }
Manasi Navaref4829842016-12-05 16:27:36 -08004750
Ville Syrjäläfe5a66f2016-07-29 16:52:39 +03004751 intel_dp_print_rates(intel_dp);
4752
Jani Nikula84c36752017-05-18 14:10:23 +03004753 drm_dp_read_desc(&intel_dp->aux, &intel_dp->desc,
4754 drm_dp_is_branch(intel_dp->dpcd));
Mika Kahola0e390a32016-09-09 14:10:53 +03004755
Ville Syrjäläc4e31702016-07-29 16:51:16 +03004756 intel_dp_configure_mst(intel_dp);
4757
4758 if (intel_dp->is_mst) {
Shubhangi Shrivastavaf21a2192016-03-30 18:05:22 +05304759 /*
4760 * If we are in MST mode then this connector
4761 * won't appear connected or have anything
4762 * with EDID on it
4763 */
Dave Airlie0e32b392014-05-02 14:02:48 +10004764 status = connector_status_disconnected;
4765 goto out;
Ville Syrjälä1a361472017-04-12 22:30:17 +03004766 } else {
4767 /*
4768 * If display is now connected check links status,
4769 * there has been known issues of link loss triggerring
4770 * long pulse.
4771 *
4772 * Some sinks (eg. ASUS PB287Q) seem to perform some
4773 * weird HPD ping pong during modesets. So we can apparently
4774 * end up with HPD going low during a modeset, and then
4775 * going back up soon after. And once that happens we must
4776 * retrain the link to get a picture. That's in case no
4777 * userspace component reacted to intermittent HPD dip.
4778 */
Shubhangi Shrivastava7d23e3c2016-03-30 18:05:23 +05304779 intel_dp_check_link_status(intel_dp);
Dave Airlie0e32b392014-05-02 14:02:48 +10004780 }
4781
Shubhangi Shrivastava4df69602015-10-28 15:30:36 +05304782 /*
4783 * Clearing NACK and defer counts to get their exact values
4784 * while reading EDID which are required by Compliance tests
4785 * 4.2.2.4 and 4.2.2.5
4786 */
4787 intel_dp->aux.i2c_nack_count = 0;
4788 intel_dp->aux.i2c_defer_count = 0;
4789
Chris Wilsonbeb60602014-09-02 20:04:00 +01004790 intel_dp_set_edid(intel_dp);
Ville Syrjälä2f773472017-11-09 17:27:58 +02004791 if (intel_dp_is_edp(intel_dp) || connector->detect_edid)
Ville Syrjälä5cb651a2016-10-03 10:55:16 +03004792 status = connector_status_connected;
Shubhangi Shrivastava7d23e3c2016-03-30 18:05:23 +05304793 intel_dp->detect_done = true;
Paulo Zanonic8c8fb32013-11-27 18:21:54 -02004794
Todd Previte09b1eb12015-04-20 15:27:34 -07004795 /* Try to read the source of the interrupt */
4796 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 &&
Ville Syrjälä65fbb4e2016-07-28 17:50:47 +03004797 intel_dp_get_sink_irq(intel_dp, &sink_irq_vector) &&
4798 sink_irq_vector != 0) {
Todd Previte09b1eb12015-04-20 15:27:34 -07004799 /* Clear interrupt source */
4800 drm_dp_dpcd_writeb(&intel_dp->aux,
4801 DP_DEVICE_SERVICE_IRQ_VECTOR,
4802 sink_irq_vector);
4803
4804 if (sink_irq_vector & DP_AUTOMATED_TEST_REQUEST)
4805 intel_dp_handle_test_request(intel_dp);
4806 if (sink_irq_vector & (DP_CP_IRQ | DP_SINK_SPECIFIC_IRQ))
4807 DRM_DEBUG_DRIVER("CP or sink specific irq unhandled\n");
4808 }
4809
Paulo Zanonic8c8fb32013-11-27 18:21:54 -02004810out:
Ville Syrjälä5cb651a2016-10-03 10:55:16 +03004811 if (status != connector_status_connected && !intel_dp->is_mst)
Shubhangi Shrivastavaf21a2192016-03-30 18:05:22 +05304812 intel_dp_unset_edid(intel_dp);
Shubhangi Shrivastava7d23e3c2016-03-30 18:05:23 +05304813
Ville Syrjälä2f773472017-11-09 17:27:58 +02004814 intel_display_power_put(dev_priv, intel_dp->aux_power_domain);
Ville Syrjälä5cb651a2016-10-03 10:55:16 +03004815 return status;
Shubhangi Shrivastavaf21a2192016-03-30 18:05:22 +05304816}
4817
Maarten Lankhorst6c5ed5a2017-04-06 20:55:20 +02004818static int
4819intel_dp_detect(struct drm_connector *connector,
4820 struct drm_modeset_acquire_ctx *ctx,
4821 bool force)
Shubhangi Shrivastavaf21a2192016-03-30 18:05:22 +05304822{
4823 struct intel_dp *intel_dp = intel_attached_dp(connector);
Maarten Lankhorst6c5ed5a2017-04-06 20:55:20 +02004824 int status = connector->status;
Shubhangi Shrivastavaf21a2192016-03-30 18:05:22 +05304825
4826 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
4827 connector->base.id, connector->name);
4828
Shubhangi Shrivastava7d23e3c2016-03-30 18:05:23 +05304829 /* If full detect is not performed yet, do a full detect */
Daniel Vetter42e5e652017-11-13 17:01:40 +01004830 if (!intel_dp->detect_done) {
4831 struct drm_crtc *crtc;
4832 int ret;
4833
4834 crtc = connector->state->crtc;
4835 if (crtc) {
4836 ret = drm_modeset_lock(&crtc->mutex, ctx);
4837 if (ret)
4838 return ret;
4839 }
4840
Ville Syrjälä5cb651a2016-10-03 10:55:16 +03004841 status = intel_dp_long_pulse(intel_dp->attached_connector);
Daniel Vetter42e5e652017-11-13 17:01:40 +01004842 }
Shubhangi Shrivastava7d23e3c2016-03-30 18:05:23 +05304843
4844 intel_dp->detect_done = false;
Shubhangi Shrivastavaf21a2192016-03-30 18:05:22 +05304845
Ville Syrjälä5cb651a2016-10-03 10:55:16 +03004846 return status;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004847}
4848
Chris Wilsonbeb60602014-09-02 20:04:00 +01004849static void
4850intel_dp_force(struct drm_connector *connector)
4851{
4852 struct intel_dp *intel_dp = intel_attached_dp(connector);
4853 struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base;
Ville Syrjälä25f78f52015-11-16 15:01:04 +01004854 struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev);
Chris Wilsonbeb60602014-09-02 20:04:00 +01004855
4856 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
4857 connector->base.id, connector->name);
4858 intel_dp_unset_edid(intel_dp);
4859
4860 if (connector->status != connector_status_connected)
4861 return;
4862
Ander Conselvan de Oliveira5432fca2017-02-22 08:34:26 +02004863 intel_display_power_get(dev_priv, intel_dp->aux_power_domain);
Chris Wilsonbeb60602014-09-02 20:04:00 +01004864
4865 intel_dp_set_edid(intel_dp);
4866
Ander Conselvan de Oliveira5432fca2017-02-22 08:34:26 +02004867 intel_display_power_put(dev_priv, intel_dp->aux_power_domain);
Chris Wilsonbeb60602014-09-02 20:04:00 +01004868}
4869
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004870static int intel_dp_get_modes(struct drm_connector *connector)
4871{
Jani Nikuladd06f902012-10-19 14:51:50 +03004872 struct intel_connector *intel_connector = to_intel_connector(connector);
Chris Wilsonbeb60602014-09-02 20:04:00 +01004873 struct edid *edid;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004874
Chris Wilsonbeb60602014-09-02 20:04:00 +01004875 edid = intel_connector->detect_edid;
4876 if (edid) {
4877 int ret = intel_connector_update_modes(connector, edid);
4878 if (ret)
4879 return ret;
4880 }
Zhenyu Wang32f9d652009-07-24 01:00:32 +08004881
Jani Nikulaf8779fd2012-10-19 14:51:48 +03004882 /* if eDP has no EDID, fall back to fixed mode */
Jani Nikula1853a9d2017-08-18 12:30:20 +03004883 if (intel_dp_is_edp(intel_attached_dp(connector)) &&
Chris Wilsonbeb60602014-09-02 20:04:00 +01004884 intel_connector->panel.fixed_mode) {
Jani Nikulaf8779fd2012-10-19 14:51:48 +03004885 struct drm_display_mode *mode;
Chris Wilsonbeb60602014-09-02 20:04:00 +01004886
4887 mode = drm_mode_duplicate(connector->dev,
Jani Nikuladd06f902012-10-19 14:51:50 +03004888 intel_connector->panel.fixed_mode);
Jani Nikulaf8779fd2012-10-19 14:51:48 +03004889 if (mode) {
Zhenyu Wang32f9d652009-07-24 01:00:32 +08004890 drm_mode_probed_add(connector, mode);
4891 return 1;
4892 }
4893 }
Chris Wilsonbeb60602014-09-02 20:04:00 +01004894
Zhenyu Wang32f9d652009-07-24 01:00:32 +08004895 return 0;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004896}
4897
Chris Wilsonf6849602010-09-19 09:29:33 +01004898static int
Chris Wilson7a418e32016-06-24 14:00:14 +01004899intel_dp_connector_register(struct drm_connector *connector)
4900{
4901 struct intel_dp *intel_dp = intel_attached_dp(connector);
Chris Wilson1ebaa0b2016-06-24 14:00:15 +01004902 int ret;
4903
4904 ret = intel_connector_register(connector);
4905 if (ret)
4906 return ret;
Chris Wilson7a418e32016-06-24 14:00:14 +01004907
4908 i915_debugfs_connector_add(connector);
4909
4910 DRM_DEBUG_KMS("registering %s bus for %s\n",
4911 intel_dp->aux.name, connector->kdev->kobj.name);
4912
4913 intel_dp->aux.dev = connector->kdev;
4914 return drm_dp_aux_register(&intel_dp->aux);
4915}
4916
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004917static void
Chris Wilsonc191eca2016-06-17 11:40:33 +01004918intel_dp_connector_unregister(struct drm_connector *connector)
4919{
4920 drm_dp_aux_unregister(&intel_attached_dp(connector)->aux);
4921 intel_connector_unregister(connector);
4922}
4923
4924static void
Paulo Zanoni73845ad2013-06-12 17:27:30 -03004925intel_dp_connector_destroy(struct drm_connector *connector)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004926{
Jani Nikula1d508702012-10-19 14:51:49 +03004927 struct intel_connector *intel_connector = to_intel_connector(connector);
Matthew Garrettaaa6fd22011-08-12 12:11:33 +02004928
Chris Wilson10e972d2014-09-04 21:43:45 +01004929 kfree(intel_connector->detect_edid);
Chris Wilsonbeb60602014-09-02 20:04:00 +01004930
Jani Nikula9cd300e2012-10-19 14:51:52 +03004931 if (!IS_ERR_OR_NULL(intel_connector->edid))
4932 kfree(intel_connector->edid);
4933
Jani Nikula1853a9d2017-08-18 12:30:20 +03004934 /*
4935 * Can't call intel_dp_is_edp() since the encoder may have been
4936 * destroyed already.
4937 */
Paulo Zanoniacd8db102013-06-12 17:27:23 -03004938 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP)
Jani Nikula1d508702012-10-19 14:51:49 +03004939 intel_panel_fini(&intel_connector->panel);
Matthew Garrettaaa6fd22011-08-12 12:11:33 +02004940
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004941 drm_connector_cleanup(connector);
Zhenyu Wang55f78c42010-03-29 16:13:57 +08004942 kfree(connector);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004943}
4944
Paulo Zanoni00c09d72012-10-26 19:05:52 -02004945void intel_dp_encoder_destroy(struct drm_encoder *encoder)
Daniel Vetter24d05922010-08-20 18:08:28 +02004946{
Paulo Zanonida63a9f2012-10-26 19:05:46 -02004947 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
4948 struct intel_dp *intel_dp = &intel_dig_port->dp;
Daniel Vetter24d05922010-08-20 18:08:28 +02004949
Dave Airlie0e32b392014-05-02 14:02:48 +10004950 intel_dp_mst_encoder_cleanup(intel_dig_port);
Jani Nikula1853a9d2017-08-18 12:30:20 +03004951 if (intel_dp_is_edp(intel_dp)) {
Keith Packardbd943152011-09-18 23:09:52 -07004952 cancel_delayed_work_sync(&intel_dp->panel_vdd_work);
Ville Syrjälä951468f2014-09-04 14:55:31 +03004953 /*
4954 * vdd might still be enabled do to the delayed vdd off.
4955 * Make sure vdd is actually turned off here.
4956 */
Ville Syrjälä773538e82014-09-04 14:54:56 +03004957 pps_lock(intel_dp);
Daniel Vetter4be73782014-01-17 14:39:48 +01004958 edp_panel_vdd_off_sync(intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03004959 pps_unlock(intel_dp);
4960
Clint Taylor01527b32014-07-07 13:01:46 -07004961 if (intel_dp->edp_notifier.notifier_call) {
4962 unregister_reboot_notifier(&intel_dp->edp_notifier);
4963 intel_dp->edp_notifier.notifier_call = NULL;
4964 }
Keith Packardbd943152011-09-18 23:09:52 -07004965 }
Chris Wilson99681882016-06-20 09:29:17 +01004966
4967 intel_dp_aux_fini(intel_dp);
4968
Imre Deakc8bd0e42014-12-12 17:57:38 +02004969 drm_encoder_cleanup(encoder);
Paulo Zanonida63a9f2012-10-26 19:05:46 -02004970 kfree(intel_dig_port);
Daniel Vetter24d05922010-08-20 18:08:28 +02004971}
4972
Imre Deakbf93ba62016-04-18 10:04:21 +03004973void intel_dp_encoder_suspend(struct intel_encoder *intel_encoder)
Imre Deak07f9cd02014-08-18 14:42:45 +03004974{
4975 struct intel_dp *intel_dp = enc_to_intel_dp(&intel_encoder->base);
4976
Jani Nikula1853a9d2017-08-18 12:30:20 +03004977 if (!intel_dp_is_edp(intel_dp))
Imre Deak07f9cd02014-08-18 14:42:45 +03004978 return;
4979
Ville Syrjälä951468f2014-09-04 14:55:31 +03004980 /*
4981 * vdd might still be enabled do to the delayed vdd off.
4982 * Make sure vdd is actually turned off here.
4983 */
Ville Syrjäläafa4e532014-11-25 15:43:48 +02004984 cancel_delayed_work_sync(&intel_dp->panel_vdd_work);
Ville Syrjälä773538e82014-09-04 14:54:56 +03004985 pps_lock(intel_dp);
Imre Deak07f9cd02014-08-18 14:42:45 +03004986 edp_panel_vdd_off_sync(intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03004987 pps_unlock(intel_dp);
Imre Deak07f9cd02014-08-18 14:42:45 +03004988}
4989
Ville Syrjälä49e6bc52014-10-28 16:15:52 +02004990static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp)
4991{
Ville Syrjälä2f773472017-11-09 17:27:58 +02004992 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Ville Syrjälä49e6bc52014-10-28 16:15:52 +02004993
4994 lockdep_assert_held(&dev_priv->pps_mutex);
4995
4996 if (!edp_have_panel_vdd(intel_dp))
4997 return;
4998
4999 /*
5000 * The VDD bit needs a power domain reference, so if the bit is
5001 * already enabled when we boot or resume, grab this reference and
5002 * schedule a vdd off, so we don't hold on to the reference
5003 * indefinitely.
5004 */
5005 DRM_DEBUG_KMS("VDD left on by BIOS, adjusting state tracking\n");
Ander Conselvan de Oliveira5432fca2017-02-22 08:34:26 +02005006 intel_display_power_get(dev_priv, intel_dp->aux_power_domain);
Ville Syrjälä49e6bc52014-10-28 16:15:52 +02005007
5008 edp_panel_vdd_schedule_off(intel_dp);
5009}
5010
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +02005011static enum pipe vlv_active_pipe(struct intel_dp *intel_dp)
5012{
5013 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
5014
5015 if ((intel_dp->DP & DP_PORT_EN) == 0)
5016 return INVALID_PIPE;
5017
5018 if (IS_CHERRYVIEW(dev_priv))
5019 return DP_PORT_TO_PIPE_CHV(intel_dp->DP);
5020 else
5021 return PORT_TO_PIPE(intel_dp->DP);
5022}
5023
Imre Deakbf93ba62016-04-18 10:04:21 +03005024void intel_dp_encoder_reset(struct drm_encoder *encoder)
Imre Deak6d93c0c2014-07-31 14:03:36 +03005025{
Ville Syrjälä64989ca42016-05-13 20:53:56 +03005026 struct drm_i915_private *dev_priv = to_i915(encoder->dev);
Imre Deakdd75f6d2016-11-21 21:15:05 +02005027 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
5028 struct intel_lspcon *lspcon = dp_to_lspcon(intel_dp);
Ville Syrjälä64989ca42016-05-13 20:53:56 +03005029
5030 if (!HAS_DDI(dev_priv))
5031 intel_dp->DP = I915_READ(intel_dp->output_reg);
Ville Syrjälä49e6bc52014-10-28 16:15:52 +02005032
Imre Deakdd75f6d2016-11-21 21:15:05 +02005033 if (lspcon->active)
Shashank Sharma910530c2016-10-14 19:56:52 +05305034 lspcon_resume(lspcon);
5035
Manasi Navared7e8ef02017-02-07 16:54:11 -08005036 intel_dp->reset_link_params = true;
5037
Ville Syrjälä49e6bc52014-10-28 16:15:52 +02005038 pps_lock(intel_dp);
5039
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +02005040 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
5041 intel_dp->active_pipe = vlv_active_pipe(intel_dp);
5042
Jani Nikula1853a9d2017-08-18 12:30:20 +03005043 if (intel_dp_is_edp(intel_dp)) {
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +02005044 /* Reinit the power sequencer, in case BIOS did something with it. */
Ville Syrjälä46bd8382017-10-31 22:51:22 +02005045 intel_dp_pps_init(intel_dp);
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +02005046 intel_edp_panel_vdd_sanitize(intel_dp);
5047 }
Ville Syrjälä49e6bc52014-10-28 16:15:52 +02005048
5049 pps_unlock(intel_dp);
Imre Deak6d93c0c2014-07-31 14:03:36 +03005050}
5051
Keith Packarda4fc5ed2009-04-07 16:16:42 -07005052static const struct drm_connector_funcs intel_dp_connector_funcs = {
Chris Wilsonbeb60602014-09-02 20:04:00 +01005053 .force = intel_dp_force,
Keith Packarda4fc5ed2009-04-07 16:16:42 -07005054 .fill_modes = drm_helper_probe_single_connector_modes,
Maarten Lankhorst8f647a02017-05-01 15:38:01 +02005055 .atomic_get_property = intel_digital_connector_atomic_get_property,
5056 .atomic_set_property = intel_digital_connector_atomic_set_property,
Chris Wilson7a418e32016-06-24 14:00:14 +01005057 .late_register = intel_dp_connector_register,
Chris Wilsonc191eca2016-06-17 11:40:33 +01005058 .early_unregister = intel_dp_connector_unregister,
Paulo Zanoni73845ad2013-06-12 17:27:30 -03005059 .destroy = intel_dp_connector_destroy,
Matt Roperc6f95f22015-01-22 16:50:32 -08005060 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
Maarten Lankhorst8f647a02017-05-01 15:38:01 +02005061 .atomic_duplicate_state = intel_digital_connector_duplicate_state,
Keith Packarda4fc5ed2009-04-07 16:16:42 -07005062};
5063
5064static const struct drm_connector_helper_funcs intel_dp_connector_helper_funcs = {
Maarten Lankhorst6c5ed5a2017-04-06 20:55:20 +02005065 .detect_ctx = intel_dp_detect,
Keith Packarda4fc5ed2009-04-07 16:16:42 -07005066 .get_modes = intel_dp_get_modes,
5067 .mode_valid = intel_dp_mode_valid,
Maarten Lankhorst8f647a02017-05-01 15:38:01 +02005068 .atomic_check = intel_digital_connector_atomic_check,
Keith Packarda4fc5ed2009-04-07 16:16:42 -07005069};
5070
Keith Packarda4fc5ed2009-04-07 16:16:42 -07005071static const struct drm_encoder_funcs intel_dp_enc_funcs = {
Imre Deak6d93c0c2014-07-31 14:03:36 +03005072 .reset = intel_dp_encoder_reset,
Daniel Vetter24d05922010-08-20 18:08:28 +02005073 .destroy = intel_dp_encoder_destroy,
Keith Packarda4fc5ed2009-04-07 16:16:42 -07005074};
5075
Daniel Vetterb2c5c182015-01-23 06:00:31 +01005076enum irqreturn
Dave Airlie13cf5502014-06-18 11:29:35 +10005077intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
5078{
5079 struct intel_dp *intel_dp = &intel_dig_port->dp;
Ville Syrjälä2f773472017-11-09 17:27:58 +02005080 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Daniel Vetterb2c5c182015-01-23 06:00:31 +01005081 enum irqreturn ret = IRQ_NONE;
Imre Deak1c767b32014-08-18 14:42:42 +03005082
Ville Syrjälä7a7f84c2014-10-16 20:46:10 +03005083 if (long_hpd && intel_dig_port->base.type == INTEL_OUTPUT_EDP) {
5084 /*
5085 * vdd off can generate a long pulse on eDP which
5086 * would require vdd on to handle it, and thus we
5087 * would end up in an endless cycle of
5088 * "vdd off -> long hpd -> vdd on -> detect -> vdd off -> ..."
5089 */
5090 DRM_DEBUG_KMS("ignoring long hpd on eDP port %c\n",
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02005091 port_name(intel_dig_port->base.port));
Ville Syrjäläa8b3d522015-02-10 14:11:46 +02005092 return IRQ_HANDLED;
Ville Syrjälä7a7f84c2014-10-16 20:46:10 +03005093 }
5094
Ville Syrjälä26fbb772014-08-11 18:37:37 +03005095 DRM_DEBUG_KMS("got hpd irq on port %c - %s\n",
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02005096 port_name(intel_dig_port->base.port),
Dave Airlie0e32b392014-05-02 14:02:48 +10005097 long_hpd ? "long" : "short");
Dave Airlie13cf5502014-06-18 11:29:35 +10005098
Ville Syrjälä27d4efc2016-10-03 10:55:15 +03005099 if (long_hpd) {
Manasi Navared7e8ef02017-02-07 16:54:11 -08005100 intel_dp->reset_link_params = true;
Ville Syrjälä27d4efc2016-10-03 10:55:15 +03005101 intel_dp->detect_done = false;
5102 return IRQ_NONE;
5103 }
5104
Ander Conselvan de Oliveira5432fca2017-02-22 08:34:26 +02005105 intel_display_power_get(dev_priv, intel_dp->aux_power_domain);
Imre Deak1c767b32014-08-18 14:42:42 +03005106
Ville Syrjälä27d4efc2016-10-03 10:55:15 +03005107 if (intel_dp->is_mst) {
5108 if (intel_dp_check_mst_status(intel_dp) == -EINVAL) {
5109 /*
5110 * If we were in MST mode, and device is not
5111 * there, get out of MST mode
5112 */
5113 DRM_DEBUG_KMS("MST device may have disappeared %d vs %d\n",
5114 intel_dp->is_mst, intel_dp->mst_mgr.mst_state);
5115 intel_dp->is_mst = false;
5116 drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
5117 intel_dp->is_mst);
5118 intel_dp->detect_done = false;
5119 goto put_power;
Dave Airlie0e32b392014-05-02 14:02:48 +10005120 }
Ville Syrjälä27d4efc2016-10-03 10:55:15 +03005121 }
Dave Airlie0e32b392014-05-02 14:02:48 +10005122
Ville Syrjälä27d4efc2016-10-03 10:55:15 +03005123 if (!intel_dp->is_mst) {
Daniel Vetter42e5e652017-11-13 17:01:40 +01005124 struct drm_modeset_acquire_ctx ctx;
5125 struct drm_connector *connector = &intel_dp->attached_connector->base;
5126 struct drm_crtc *crtc;
5127 int iret;
5128 bool handled = false;
5129
5130 drm_modeset_acquire_init(&ctx, 0);
5131retry:
5132 iret = drm_modeset_lock(&dev_priv->drm.mode_config.connection_mutex, &ctx);
5133 if (iret)
5134 goto err;
5135
5136 crtc = connector->state->crtc;
5137 if (crtc) {
5138 iret = drm_modeset_lock(&crtc->mutex, &ctx);
5139 if (iret)
5140 goto err;
5141 }
5142
5143 handled = intel_dp_short_pulse(intel_dp);
5144
5145err:
5146 if (iret == -EDEADLK) {
5147 drm_modeset_backoff(&ctx);
5148 goto retry;
5149 }
5150
5151 drm_modeset_drop_locks(&ctx);
5152 drm_modeset_acquire_fini(&ctx);
5153 WARN(iret, "Acquiring modeset locks failed with %i\n", iret);
5154
5155 if (!handled) {
Ville Syrjälä27d4efc2016-10-03 10:55:15 +03005156 intel_dp->detect_done = false;
5157 goto put_power;
Shubhangi Shrivastava39ff7472016-03-30 18:05:26 +05305158 }
Dave Airlie0e32b392014-05-02 14:02:48 +10005159 }
Daniel Vetterb2c5c182015-01-23 06:00:31 +01005160
5161 ret = IRQ_HANDLED;
5162
Imre Deak1c767b32014-08-18 14:42:42 +03005163put_power:
Ander Conselvan de Oliveira5432fca2017-02-22 08:34:26 +02005164 intel_display_power_put(dev_priv, intel_dp->aux_power_domain);
Imre Deak1c767b32014-08-18 14:42:42 +03005165
5166 return ret;
Dave Airlie13cf5502014-06-18 11:29:35 +10005167}
5168
Rodrigo Vivi477ec322015-08-06 15:51:39 +08005169/* check the VBT to see whether the eDP is on another port */
Jani Nikula7b91bf72017-08-18 12:30:19 +03005170bool intel_dp_is_port_edp(struct drm_i915_private *dev_priv, enum port port)
Zhao Yakui36e83a12010-06-12 14:32:21 +08005171{
Ville Syrjälä53ce81a2015-09-11 21:04:38 +03005172 /*
5173 * eDP not supported on g4x. so bail out early just
5174 * for a bit extra safety in case the VBT is bonkers.
5175 */
Tvrtko Ursulindd11bc12016-11-16 08:55:41 +00005176 if (INTEL_GEN(dev_priv) < 5)
Ville Syrjälä53ce81a2015-09-11 21:04:38 +03005177 return false;
5178
Imre Deaka98d9c12016-12-21 12:17:24 +02005179 if (INTEL_GEN(dev_priv) < 9 && port == PORT_A)
Ville Syrjälä3b32a352013-11-01 18:22:41 +02005180 return true;
5181
Jani Nikula951d9ef2016-03-16 12:43:31 +02005182 return intel_bios_is_port_edp(dev_priv, port);
Zhao Yakui36e83a12010-06-12 14:32:21 +08005183}
5184
Maarten Lankhorst200819a2017-04-10 12:51:10 +02005185static void
Chris Wilsonf6849602010-09-19 09:29:33 +01005186intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connector)
5187{
Maarten Lankhorst8b453302017-05-01 15:37:56 +02005188 struct drm_i915_private *dev_priv = to_i915(connector->dev);
Ville Syrjälä68ec0732017-11-29 18:43:02 +02005189 enum port port = dp_to_dig_port(intel_dp)->base.port;
Maarten Lankhorst8b453302017-05-01 15:37:56 +02005190
Ville Syrjälä68ec0732017-11-29 18:43:02 +02005191 if (!IS_G4X(dev_priv) && port != PORT_A)
5192 intel_attach_force_audio_property(connector);
5193
Chris Wilsone953fd72011-02-21 22:23:52 +00005194 intel_attach_broadcast_rgb_property(connector);
Yuly Novikov53b41832012-10-26 12:04:00 +03005195
Jani Nikula1853a9d2017-08-18 12:30:20 +03005196 if (intel_dp_is_edp(intel_dp)) {
Maarten Lankhorst8b453302017-05-01 15:37:56 +02005197 u32 allowed_scalers;
5198
5199 allowed_scalers = BIT(DRM_MODE_SCALE_ASPECT) | BIT(DRM_MODE_SCALE_FULLSCREEN);
5200 if (!HAS_GMCH_DISPLAY(dev_priv))
5201 allowed_scalers |= BIT(DRM_MODE_SCALE_CENTER);
5202
5203 drm_connector_attach_scaling_mode_property(connector, allowed_scalers);
5204
Maarten Lankhorsteead06d2017-05-01 15:37:55 +02005205 connector->state->scaling_mode = DRM_MODE_SCALE_ASPECT;
Maarten Lankhorst8b453302017-05-01 15:37:56 +02005206
Yuly Novikov53b41832012-10-26 12:04:00 +03005207 }
Chris Wilsonf6849602010-09-19 09:29:33 +01005208}
5209
Imre Deakdada1a92014-01-29 13:25:41 +02005210static void intel_dp_init_panel_power_timestamps(struct intel_dp *intel_dp)
5211{
Abhay Kumard28d4732016-01-22 17:39:04 -08005212 intel_dp->panel_power_off_time = ktime_get_boottime();
Imre Deakdada1a92014-01-29 13:25:41 +02005213 intel_dp->last_power_on = jiffies;
5214 intel_dp->last_backlight_off = jiffies;
5215}
5216
Daniel Vetter67a54562012-10-20 20:57:45 +02005217static void
Ville Syrjälä46bd8382017-10-31 22:51:22 +02005218intel_pps_readout_hw_state(struct intel_dp *intel_dp, struct edp_power_seq *seq)
Daniel Vetter67a54562012-10-20 20:57:45 +02005219{
Ville Syrjälä46bd8382017-10-31 22:51:22 +02005220 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Vandana Kannanb0a08be2015-06-18 11:00:55 +05305221 u32 pp_on, pp_off, pp_div = 0, pp_ctl = 0;
Imre Deak8e8232d2016-06-16 16:37:21 +03005222 struct pps_registers regs;
Jesse Barnes453c5422013-03-28 09:55:41 -07005223
Ville Syrjälä46bd8382017-10-31 22:51:22 +02005224 intel_pps_get_registers(intel_dp, &regs);
Daniel Vetter67a54562012-10-20 20:57:45 +02005225
5226 /* Workaround: Need to write PP_CONTROL with the unlock key as
5227 * the very first thing. */
Vandana Kannanb0a08be2015-06-18 11:00:55 +05305228 pp_ctl = ironlake_get_pp_control(intel_dp);
Daniel Vetter67a54562012-10-20 20:57:45 +02005229
Imre Deak8e8232d2016-06-16 16:37:21 +03005230 pp_on = I915_READ(regs.pp_on);
5231 pp_off = I915_READ(regs.pp_off);
Rodrigo Vivi938361e2017-06-02 13:06:44 -07005232 if (!IS_GEN9_LP(dev_priv) && !HAS_PCH_CNP(dev_priv)) {
Imre Deak8e8232d2016-06-16 16:37:21 +03005233 I915_WRITE(regs.pp_ctrl, pp_ctl);
5234 pp_div = I915_READ(regs.pp_div);
Vandana Kannanb0a08be2015-06-18 11:00:55 +05305235 }
Daniel Vetter67a54562012-10-20 20:57:45 +02005236
5237 /* Pull timing values out of registers */
Imre Deak54648612016-06-16 16:37:22 +03005238 seq->t1_t3 = (pp_on & PANEL_POWER_UP_DELAY_MASK) >>
5239 PANEL_POWER_UP_DELAY_SHIFT;
Daniel Vetter67a54562012-10-20 20:57:45 +02005240
Imre Deak54648612016-06-16 16:37:22 +03005241 seq->t8 = (pp_on & PANEL_LIGHT_ON_DELAY_MASK) >>
5242 PANEL_LIGHT_ON_DELAY_SHIFT;
Daniel Vetter67a54562012-10-20 20:57:45 +02005243
Imre Deak54648612016-06-16 16:37:22 +03005244 seq->t9 = (pp_off & PANEL_LIGHT_OFF_DELAY_MASK) >>
5245 PANEL_LIGHT_OFF_DELAY_SHIFT;
Daniel Vetter67a54562012-10-20 20:57:45 +02005246
Imre Deak54648612016-06-16 16:37:22 +03005247 seq->t10 = (pp_off & PANEL_POWER_DOWN_DELAY_MASK) >>
5248 PANEL_POWER_DOWN_DELAY_SHIFT;
Daniel Vetter67a54562012-10-20 20:57:45 +02005249
Rodrigo Vivi938361e2017-06-02 13:06:44 -07005250 if (IS_GEN9_LP(dev_priv) || HAS_PCH_CNP(dev_priv)) {
Manasi Navare12c8ca92017-06-26 12:21:45 -07005251 seq->t11_t12 = ((pp_ctl & BXT_POWER_CYCLE_DELAY_MASK) >>
5252 BXT_POWER_CYCLE_DELAY_SHIFT) * 1000;
Vandana Kannanb0a08be2015-06-18 11:00:55 +05305253 } else {
Imre Deak54648612016-06-16 16:37:22 +03005254 seq->t11_t12 = ((pp_div & PANEL_POWER_CYCLE_DELAY_MASK) >>
Daniel Vetter67a54562012-10-20 20:57:45 +02005255 PANEL_POWER_CYCLE_DELAY_SHIFT) * 1000;
Vandana Kannanb0a08be2015-06-18 11:00:55 +05305256 }
Imre Deak54648612016-06-16 16:37:22 +03005257}
5258
5259static void
Imre Deakde9c1b62016-06-16 20:01:46 +03005260intel_pps_dump_state(const char *state_name, const struct edp_power_seq *seq)
5261{
5262 DRM_DEBUG_KMS("%s t1_t3 %d t8 %d t9 %d t10 %d t11_t12 %d\n",
5263 state_name,
5264 seq->t1_t3, seq->t8, seq->t9, seq->t10, seq->t11_t12);
5265}
5266
5267static void
Ville Syrjälä46bd8382017-10-31 22:51:22 +02005268intel_pps_verify_state(struct intel_dp *intel_dp)
Imre Deakde9c1b62016-06-16 20:01:46 +03005269{
5270 struct edp_power_seq hw;
5271 struct edp_power_seq *sw = &intel_dp->pps_delays;
5272
Ville Syrjälä46bd8382017-10-31 22:51:22 +02005273 intel_pps_readout_hw_state(intel_dp, &hw);
Imre Deakde9c1b62016-06-16 20:01:46 +03005274
5275 if (hw.t1_t3 != sw->t1_t3 || hw.t8 != sw->t8 || hw.t9 != sw->t9 ||
5276 hw.t10 != sw->t10 || hw.t11_t12 != sw->t11_t12) {
5277 DRM_ERROR("PPS state mismatch\n");
5278 intel_pps_dump_state("sw", sw);
5279 intel_pps_dump_state("hw", &hw);
5280 }
5281}
5282
5283static void
Ville Syrjälä46bd8382017-10-31 22:51:22 +02005284intel_dp_init_panel_power_sequencer(struct intel_dp *intel_dp)
Imre Deak54648612016-06-16 16:37:22 +03005285{
Ville Syrjälä46bd8382017-10-31 22:51:22 +02005286 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Imre Deak54648612016-06-16 16:37:22 +03005287 struct edp_power_seq cur, vbt, spec,
5288 *final = &intel_dp->pps_delays;
5289
5290 lockdep_assert_held(&dev_priv->pps_mutex);
5291
5292 /* already initialized? */
5293 if (final->t11_t12 != 0)
5294 return;
5295
Ville Syrjälä46bd8382017-10-31 22:51:22 +02005296 intel_pps_readout_hw_state(intel_dp, &cur);
Daniel Vetter67a54562012-10-20 20:57:45 +02005297
Imre Deakde9c1b62016-06-16 20:01:46 +03005298 intel_pps_dump_state("cur", &cur);
Daniel Vetter67a54562012-10-20 20:57:45 +02005299
Jani Nikula6aa23e62016-03-24 17:50:20 +02005300 vbt = dev_priv->vbt.edp.pps;
Manasi Navarec99a2592017-06-30 09:33:48 -07005301 /* On Toshiba Satellite P50-C-18C system the VBT T12 delay
5302 * of 500ms appears to be too short. Ocassionally the panel
5303 * just fails to power back on. Increasing the delay to 800ms
5304 * seems sufficient to avoid this problem.
5305 */
5306 if (dev_priv->quirks & QUIRK_INCREASE_T12_DELAY) {
Manasi Navare7313f5a2017-10-03 16:37:25 -07005307 vbt.t11_t12 = max_t(u16, vbt.t11_t12, 1300 * 10);
Manasi Navarec99a2592017-06-30 09:33:48 -07005308 DRM_DEBUG_KMS("Increasing T12 panel delay as per the quirk to %d\n",
5309 vbt.t11_t12);
5310 }
Manasi Navare770a17a2017-06-26 12:21:44 -07005311 /* T11_T12 delay is special and actually in units of 100ms, but zero
5312 * based in the hw (so we need to add 100 ms). But the sw vbt
5313 * table multiplies it with 1000 to make it in units of 100usec,
5314 * too. */
5315 vbt.t11_t12 += 100 * 10;
Daniel Vetter67a54562012-10-20 20:57:45 +02005316
5317 /* Upper limits from eDP 1.3 spec. Note that we use the clunky units of
5318 * our hw here, which are all in 100usec. */
5319 spec.t1_t3 = 210 * 10;
5320 spec.t8 = 50 * 10; /* no limit for t8, use t7 instead */
5321 spec.t9 = 50 * 10; /* no limit for t9, make it symmetric with t8 */
5322 spec.t10 = 500 * 10;
5323 /* This one is special and actually in units of 100ms, but zero
5324 * based in the hw (so we need to add 100 ms). But the sw vbt
5325 * table multiplies it with 1000 to make it in units of 100usec,
5326 * too. */
5327 spec.t11_t12 = (510 + 100) * 10;
5328
Imre Deakde9c1b62016-06-16 20:01:46 +03005329 intel_pps_dump_state("vbt", &vbt);
Daniel Vetter67a54562012-10-20 20:57:45 +02005330
5331 /* Use the max of the register settings and vbt. If both are
5332 * unset, fall back to the spec limits. */
Ville Syrjälä36b5f422014-10-16 21:27:30 +03005333#define assign_final(field) final->field = (max(cur.field, vbt.field) == 0 ? \
Daniel Vetter67a54562012-10-20 20:57:45 +02005334 spec.field : \
5335 max(cur.field, vbt.field))
5336 assign_final(t1_t3);
5337 assign_final(t8);
5338 assign_final(t9);
5339 assign_final(t10);
5340 assign_final(t11_t12);
5341#undef assign_final
5342
Ville Syrjälä36b5f422014-10-16 21:27:30 +03005343#define get_delay(field) (DIV_ROUND_UP(final->field, 10))
Daniel Vetter67a54562012-10-20 20:57:45 +02005344 intel_dp->panel_power_up_delay = get_delay(t1_t3);
5345 intel_dp->backlight_on_delay = get_delay(t8);
5346 intel_dp->backlight_off_delay = get_delay(t9);
5347 intel_dp->panel_power_down_delay = get_delay(t10);
5348 intel_dp->panel_power_cycle_delay = get_delay(t11_t12);
5349#undef get_delay
5350
Jani Nikulaf30d26e2013-01-16 10:53:40 +02005351 DRM_DEBUG_KMS("panel power up delay %d, power down delay %d, power cycle delay %d\n",
5352 intel_dp->panel_power_up_delay, intel_dp->panel_power_down_delay,
5353 intel_dp->panel_power_cycle_delay);
5354
5355 DRM_DEBUG_KMS("backlight on delay %d, off delay %d\n",
5356 intel_dp->backlight_on_delay, intel_dp->backlight_off_delay);
Imre Deakde9c1b62016-06-16 20:01:46 +03005357
5358 /*
5359 * We override the HW backlight delays to 1 because we do manual waits
5360 * on them. For T8, even BSpec recommends doing it. For T9, if we
5361 * don't do this, we'll end up waiting for the backlight off delay
5362 * twice: once when we do the manual sleep, and once when we disable
5363 * the panel and wait for the PP_STATUS bit to become zero.
5364 */
5365 final->t8 = 1;
5366 final->t9 = 1;
Imre Deak56432052017-11-29 19:51:37 +02005367
5368 /*
5369 * HW has only a 100msec granularity for t11_t12 so round it up
5370 * accordingly.
5371 */
5372 final->t11_t12 = roundup(final->t11_t12, 100 * 10);
Jani Nikulaf30d26e2013-01-16 10:53:40 +02005373}
5374
5375static void
Ville Syrjälä46bd8382017-10-31 22:51:22 +02005376intel_dp_init_panel_power_sequencer_registers(struct intel_dp *intel_dp,
Ville Syrjälä5d5ab2d2016-12-20 18:51:17 +02005377 bool force_disable_vdd)
Jani Nikulaf30d26e2013-01-16 10:53:40 +02005378{
Ville Syrjälä46bd8382017-10-31 22:51:22 +02005379 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Jesse Barnes453c5422013-03-28 09:55:41 -07005380 u32 pp_on, pp_off, pp_div, port_sel = 0;
Ville Syrjäläe7dc33f2016-03-02 17:22:13 +02005381 int div = dev_priv->rawclk_freq / 1000;
Imre Deak8e8232d2016-06-16 16:37:21 +03005382 struct pps_registers regs;
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02005383 enum port port = dp_to_dig_port(intel_dp)->base.port;
Ville Syrjälä36b5f422014-10-16 21:27:30 +03005384 const struct edp_power_seq *seq = &intel_dp->pps_delays;
Jesse Barnes453c5422013-03-28 09:55:41 -07005385
Ville Syrjäläe39b9992014-09-04 14:53:14 +03005386 lockdep_assert_held(&dev_priv->pps_mutex);
Jesse Barnes453c5422013-03-28 09:55:41 -07005387
Ville Syrjälä46bd8382017-10-31 22:51:22 +02005388 intel_pps_get_registers(intel_dp, &regs);
Jesse Barnes453c5422013-03-28 09:55:41 -07005389
Ville Syrjälä5d5ab2d2016-12-20 18:51:17 +02005390 /*
5391 * On some VLV machines the BIOS can leave the VDD
5392 * enabled even on power seqeuencers which aren't
5393 * hooked up to any port. This would mess up the
5394 * power domain tracking the first time we pick
5395 * one of these power sequencers for use since
5396 * edp_panel_vdd_on() would notice that the VDD was
5397 * already on and therefore wouldn't grab the power
5398 * domain reference. Disable VDD first to avoid this.
5399 * This also avoids spuriously turning the VDD on as
5400 * soon as the new power seqeuencer gets initialized.
5401 */
5402 if (force_disable_vdd) {
5403 u32 pp = ironlake_get_pp_control(intel_dp);
5404
5405 WARN(pp & PANEL_POWER_ON, "Panel power already on\n");
5406
5407 if (pp & EDP_FORCE_VDD)
5408 DRM_DEBUG_KMS("VDD already on, disabling first\n");
5409
5410 pp &= ~EDP_FORCE_VDD;
5411
5412 I915_WRITE(regs.pp_ctrl, pp);
5413 }
5414
Jani Nikulaf30d26e2013-01-16 10:53:40 +02005415 pp_on = (seq->t1_t3 << PANEL_POWER_UP_DELAY_SHIFT) |
Imre Deakde9c1b62016-06-16 20:01:46 +03005416 (seq->t8 << PANEL_LIGHT_ON_DELAY_SHIFT);
5417 pp_off = (seq->t9 << PANEL_LIGHT_OFF_DELAY_SHIFT) |
Jani Nikulaf30d26e2013-01-16 10:53:40 +02005418 (seq->t10 << PANEL_POWER_DOWN_DELAY_SHIFT);
Daniel Vetter67a54562012-10-20 20:57:45 +02005419 /* Compute the divisor for the pp clock, simply match the Bspec
5420 * formula. */
Rodrigo Vivi938361e2017-06-02 13:06:44 -07005421 if (IS_GEN9_LP(dev_priv) || HAS_PCH_CNP(dev_priv)) {
Imre Deak8e8232d2016-06-16 16:37:21 +03005422 pp_div = I915_READ(regs.pp_ctrl);
Vandana Kannanb0a08be2015-06-18 11:00:55 +05305423 pp_div &= ~BXT_POWER_CYCLE_DELAY_MASK;
Manasi Navare12c8ca92017-06-26 12:21:45 -07005424 pp_div |= (DIV_ROUND_UP(seq->t11_t12, 1000)
Vandana Kannanb0a08be2015-06-18 11:00:55 +05305425 << BXT_POWER_CYCLE_DELAY_SHIFT);
5426 } else {
5427 pp_div = ((100 * div)/2 - 1) << PP_REFERENCE_DIVIDER_SHIFT;
5428 pp_div |= (DIV_ROUND_UP(seq->t11_t12, 1000)
5429 << PANEL_POWER_CYCLE_DELAY_SHIFT);
5430 }
Daniel Vetter67a54562012-10-20 20:57:45 +02005431
5432 /* Haswell doesn't have any port selection bits for the panel
5433 * power sequencer any more. */
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +01005434 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
Ville Syrjäläad933b52014-08-18 22:15:56 +03005435 port_sel = PANEL_PORT_SELECT_VLV(port);
Tvrtko Ursulin6e266952016-10-13 11:02:53 +01005436 } else if (HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv)) {
Ville Syrjäläad933b52014-08-18 22:15:56 +03005437 if (port == PORT_A)
Jani Nikulaa24c1442013-09-05 16:44:46 +03005438 port_sel = PANEL_PORT_SELECT_DPA;
Daniel Vetter67a54562012-10-20 20:57:45 +02005439 else
Jani Nikulaa24c1442013-09-05 16:44:46 +03005440 port_sel = PANEL_PORT_SELECT_DPD;
Daniel Vetter67a54562012-10-20 20:57:45 +02005441 }
5442
Jesse Barnes453c5422013-03-28 09:55:41 -07005443 pp_on |= port_sel;
5444
Imre Deak8e8232d2016-06-16 16:37:21 +03005445 I915_WRITE(regs.pp_on, pp_on);
5446 I915_WRITE(regs.pp_off, pp_off);
Rodrigo Vivi938361e2017-06-02 13:06:44 -07005447 if (IS_GEN9_LP(dev_priv) || HAS_PCH_CNP(dev_priv))
Imre Deak8e8232d2016-06-16 16:37:21 +03005448 I915_WRITE(regs.pp_ctrl, pp_div);
Vandana Kannanb0a08be2015-06-18 11:00:55 +05305449 else
Imre Deak8e8232d2016-06-16 16:37:21 +03005450 I915_WRITE(regs.pp_div, pp_div);
Daniel Vetter67a54562012-10-20 20:57:45 +02005451
Daniel Vetter67a54562012-10-20 20:57:45 +02005452 DRM_DEBUG_KMS("panel power sequencer register settings: PP_ON %#x, PP_OFF %#x, PP_DIV %#x\n",
Imre Deak8e8232d2016-06-16 16:37:21 +03005453 I915_READ(regs.pp_on),
5454 I915_READ(regs.pp_off),
Rodrigo Vivi938361e2017-06-02 13:06:44 -07005455 (IS_GEN9_LP(dev_priv) || HAS_PCH_CNP(dev_priv)) ?
Imre Deak8e8232d2016-06-16 16:37:21 +03005456 (I915_READ(regs.pp_ctrl) & BXT_POWER_CYCLE_DELAY_MASK) :
5457 I915_READ(regs.pp_div));
Zhenyu Wange3421a12010-04-08 09:43:27 +08005458}
5459
Ville Syrjälä46bd8382017-10-31 22:51:22 +02005460static void intel_dp_pps_init(struct intel_dp *intel_dp)
Imre Deak335f7522016-08-10 14:07:32 +03005461{
Ville Syrjälä46bd8382017-10-31 22:51:22 +02005462 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +01005463
5464 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
Imre Deak335f7522016-08-10 14:07:32 +03005465 vlv_initial_power_sequencer_setup(intel_dp);
5466 } else {
Ville Syrjälä46bd8382017-10-31 22:51:22 +02005467 intel_dp_init_panel_power_sequencer(intel_dp);
5468 intel_dp_init_panel_power_sequencer_registers(intel_dp, false);
Imre Deak335f7522016-08-10 14:07:32 +03005469 }
5470}
5471
Vandana Kannanb33a2812015-02-13 15:33:03 +05305472/**
5473 * intel_dp_set_drrs_state - program registers for RR switch to take effect
Maarten Lankhorst5423adf2016-08-31 11:01:36 +02005474 * @dev_priv: i915 device
Maarten Lankhorste8964022016-08-25 11:07:02 +02005475 * @crtc_state: a pointer to the active intel_crtc_state
Vandana Kannanb33a2812015-02-13 15:33:03 +05305476 * @refresh_rate: RR to be programmed
5477 *
5478 * This function gets called when refresh rate (RR) has to be changed from
5479 * one frequency to another. Switches can be between high and low RR
5480 * supported by the panel or to any other RR based on media playback (in
5481 * this case, RR value needs to be passed from user space).
5482 *
5483 * The caller of this function needs to take a lock on dev_priv->drrs.
5484 */
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02005485static void intel_dp_set_drrs_state(struct drm_i915_private *dev_priv,
Ville Syrjälä5f88a9c2017-08-18 16:49:58 +03005486 const struct intel_crtc_state *crtc_state,
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02005487 int refresh_rate)
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305488{
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305489 struct intel_encoder *encoder;
Vandana Kannan96178ee2015-01-10 02:25:56 +05305490 struct intel_digital_port *dig_port = NULL;
5491 struct intel_dp *intel_dp = dev_priv->drrs.dp;
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02005492 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
Vandana Kannan96178ee2015-01-10 02:25:56 +05305493 enum drrs_refresh_rate_type index = DRRS_HIGH_RR;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305494
5495 if (refresh_rate <= 0) {
5496 DRM_DEBUG_KMS("Refresh rate should be positive non-zero.\n");
5497 return;
5498 }
5499
Vandana Kannan96178ee2015-01-10 02:25:56 +05305500 if (intel_dp == NULL) {
5501 DRM_DEBUG_KMS("DRRS not supported.\n");
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305502 return;
5503 }
5504
Vandana Kannan96178ee2015-01-10 02:25:56 +05305505 dig_port = dp_to_dig_port(intel_dp);
5506 encoder = &dig_port->base;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305507
5508 if (!intel_crtc) {
5509 DRM_DEBUG_KMS("DRRS: intel_crtc not initialized\n");
5510 return;
5511 }
5512
Vandana Kannan96178ee2015-01-10 02:25:56 +05305513 if (dev_priv->drrs.type < SEAMLESS_DRRS_SUPPORT) {
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305514 DRM_DEBUG_KMS("Only Seamless DRRS supported.\n");
5515 return;
5516 }
5517
Vandana Kannan96178ee2015-01-10 02:25:56 +05305518 if (intel_dp->attached_connector->panel.downclock_mode->vrefresh ==
5519 refresh_rate)
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305520 index = DRRS_LOW_RR;
5521
Vandana Kannan96178ee2015-01-10 02:25:56 +05305522 if (index == dev_priv->drrs.refresh_rate_type) {
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305523 DRM_DEBUG_KMS(
5524 "DRRS requested for previously set RR...ignoring\n");
5525 return;
5526 }
5527
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02005528 if (!crtc_state->base.active) {
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305529 DRM_DEBUG_KMS("eDP encoder disabled. CRTC not Active\n");
5530 return;
5531 }
5532
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02005533 if (INTEL_GEN(dev_priv) >= 8 && !IS_CHERRYVIEW(dev_priv)) {
Vandana Kannana4c30b12015-02-13 15:33:00 +05305534 switch (index) {
5535 case DRRS_HIGH_RR:
5536 intel_dp_set_m_n(intel_crtc, M1_N1);
5537 break;
5538 case DRRS_LOW_RR:
5539 intel_dp_set_m_n(intel_crtc, M2_N2);
5540 break;
5541 case DRRS_MAX_RR:
5542 default:
5543 DRM_ERROR("Unsupported refreshrate type\n");
5544 }
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02005545 } else if (INTEL_GEN(dev_priv) > 6) {
5546 i915_reg_t reg = PIPECONF(crtc_state->cpu_transcoder);
Ville Syrjälä649636e2015-09-22 19:50:01 +03005547 u32 val;
Vandana Kannana4c30b12015-02-13 15:33:00 +05305548
Ville Syrjälä649636e2015-09-22 19:50:01 +03005549 val = I915_READ(reg);
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305550 if (index > DRRS_HIGH_RR) {
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02005551 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
Vandana Kannan6fa7aec2015-02-13 15:33:01 +05305552 val |= PIPECONF_EDP_RR_MODE_SWITCH_VLV;
5553 else
5554 val |= PIPECONF_EDP_RR_MODE_SWITCH;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305555 } else {
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02005556 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
Vandana Kannan6fa7aec2015-02-13 15:33:01 +05305557 val &= ~PIPECONF_EDP_RR_MODE_SWITCH_VLV;
5558 else
5559 val &= ~PIPECONF_EDP_RR_MODE_SWITCH;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305560 }
5561 I915_WRITE(reg, val);
5562 }
5563
Vandana Kannan4e9ac942015-01-22 15:14:45 +05305564 dev_priv->drrs.refresh_rate_type = index;
5565
5566 DRM_DEBUG_KMS("eDP Refresh Rate set to : %dHz\n", refresh_rate);
5567}
5568
Vandana Kannanb33a2812015-02-13 15:33:03 +05305569/**
5570 * intel_edp_drrs_enable - init drrs struct if supported
5571 * @intel_dp: DP struct
Maarten Lankhorst5423adf2016-08-31 11:01:36 +02005572 * @crtc_state: A pointer to the active crtc state.
Vandana Kannanb33a2812015-02-13 15:33:03 +05305573 *
5574 * Initializes frontbuffer_bits and drrs.dp
5575 */
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02005576void intel_edp_drrs_enable(struct intel_dp *intel_dp,
Ville Syrjälä5f88a9c2017-08-18 16:49:58 +03005577 const struct intel_crtc_state *crtc_state)
Vandana Kannanc3955782015-01-22 15:17:40 +05305578{
Ville Syrjälä2f773472017-11-09 17:27:58 +02005579 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Vandana Kannanc3955782015-01-22 15:17:40 +05305580
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02005581 if (!crtc_state->has_drrs) {
Vandana Kannanc3955782015-01-22 15:17:40 +05305582 DRM_DEBUG_KMS("Panel doesn't support DRRS\n");
5583 return;
5584 }
5585
Radhakrishna Sripadada83ef82017-09-14 11:16:41 -07005586 if (dev_priv->psr.enabled) {
5587 DRM_DEBUG_KMS("PSR enabled. Not enabling DRRS.\n");
5588 return;
5589 }
5590
Vandana Kannanc3955782015-01-22 15:17:40 +05305591 mutex_lock(&dev_priv->drrs.mutex);
5592 if (WARN_ON(dev_priv->drrs.dp)) {
5593 DRM_ERROR("DRRS already enabled\n");
5594 goto unlock;
5595 }
5596
5597 dev_priv->drrs.busy_frontbuffer_bits = 0;
5598
5599 dev_priv->drrs.dp = intel_dp;
5600
5601unlock:
5602 mutex_unlock(&dev_priv->drrs.mutex);
5603}
5604
Vandana Kannanb33a2812015-02-13 15:33:03 +05305605/**
5606 * intel_edp_drrs_disable - Disable DRRS
5607 * @intel_dp: DP struct
Maarten Lankhorst5423adf2016-08-31 11:01:36 +02005608 * @old_crtc_state: Pointer to old crtc_state.
Vandana Kannanb33a2812015-02-13 15:33:03 +05305609 *
5610 */
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02005611void intel_edp_drrs_disable(struct intel_dp *intel_dp,
Ville Syrjälä5f88a9c2017-08-18 16:49:58 +03005612 const struct intel_crtc_state *old_crtc_state)
Vandana Kannanc3955782015-01-22 15:17:40 +05305613{
Ville Syrjälä2f773472017-11-09 17:27:58 +02005614 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
Vandana Kannanc3955782015-01-22 15:17:40 +05305615
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02005616 if (!old_crtc_state->has_drrs)
Vandana Kannanc3955782015-01-22 15:17:40 +05305617 return;
5618
5619 mutex_lock(&dev_priv->drrs.mutex);
5620 if (!dev_priv->drrs.dp) {
5621 mutex_unlock(&dev_priv->drrs.mutex);
5622 return;
5623 }
5624
5625 if (dev_priv->drrs.refresh_rate_type == DRRS_LOW_RR)
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02005626 intel_dp_set_drrs_state(dev_priv, old_crtc_state,
5627 intel_dp->attached_connector->panel.fixed_mode->vrefresh);
Vandana Kannanc3955782015-01-22 15:17:40 +05305628
5629 dev_priv->drrs.dp = NULL;
5630 mutex_unlock(&dev_priv->drrs.mutex);
5631
5632 cancel_delayed_work_sync(&dev_priv->drrs.work);
5633}
5634
Vandana Kannan4e9ac942015-01-22 15:14:45 +05305635static void intel_edp_drrs_downclock_work(struct work_struct *work)
5636{
5637 struct drm_i915_private *dev_priv =
5638 container_of(work, typeof(*dev_priv), drrs.work.work);
5639 struct intel_dp *intel_dp;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305640
Vandana Kannan96178ee2015-01-10 02:25:56 +05305641 mutex_lock(&dev_priv->drrs.mutex);
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305642
Vandana Kannan4e9ac942015-01-22 15:14:45 +05305643 intel_dp = dev_priv->drrs.dp;
5644
5645 if (!intel_dp)
5646 goto unlock;
5647
5648 /*
5649 * The delayed work can race with an invalidate hence we need to
5650 * recheck.
5651 */
5652
5653 if (dev_priv->drrs.busy_frontbuffer_bits)
5654 goto unlock;
5655
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02005656 if (dev_priv->drrs.refresh_rate_type != DRRS_LOW_RR) {
5657 struct drm_crtc *crtc = dp_to_dig_port(intel_dp)->base.base.crtc;
5658
5659 intel_dp_set_drrs_state(dev_priv, to_intel_crtc(crtc)->config,
5660 intel_dp->attached_connector->panel.downclock_mode->vrefresh);
5661 }
Vandana Kannan4e9ac942015-01-22 15:14:45 +05305662
5663unlock:
Vandana Kannan96178ee2015-01-10 02:25:56 +05305664 mutex_unlock(&dev_priv->drrs.mutex);
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305665}
5666
Vandana Kannanb33a2812015-02-13 15:33:03 +05305667/**
Ramalingam C0ddfd202015-06-15 20:50:05 +05305668 * intel_edp_drrs_invalidate - Disable Idleness DRRS
Chris Wilson5748b6a2016-08-04 16:32:38 +01005669 * @dev_priv: i915 device
Vandana Kannanb33a2812015-02-13 15:33:03 +05305670 * @frontbuffer_bits: frontbuffer plane tracking bits
5671 *
Ramalingam C0ddfd202015-06-15 20:50:05 +05305672 * This function gets called everytime rendering on the given planes start.
5673 * Hence DRRS needs to be Upclocked, i.e. (LOW_RR -> HIGH_RR).
Vandana Kannanb33a2812015-02-13 15:33:03 +05305674 *
5675 * Dirty frontbuffers relevant to DRRS are tracked in busy_frontbuffer_bits.
5676 */
Chris Wilson5748b6a2016-08-04 16:32:38 +01005677void intel_edp_drrs_invalidate(struct drm_i915_private *dev_priv,
5678 unsigned int frontbuffer_bits)
Vandana Kannana93fad02015-01-10 02:25:59 +05305679{
Vandana Kannana93fad02015-01-10 02:25:59 +05305680 struct drm_crtc *crtc;
5681 enum pipe pipe;
5682
Daniel Vetter9da7d692015-04-09 16:44:15 +02005683 if (dev_priv->drrs.type == DRRS_NOT_SUPPORTED)
Vandana Kannana93fad02015-01-10 02:25:59 +05305684 return;
5685
Daniel Vetter88f933a2015-04-09 16:44:16 +02005686 cancel_delayed_work(&dev_priv->drrs.work);
Ramalingam C3954e732015-03-03 12:11:46 +05305687
Vandana Kannana93fad02015-01-10 02:25:59 +05305688 mutex_lock(&dev_priv->drrs.mutex);
Daniel Vetter9da7d692015-04-09 16:44:15 +02005689 if (!dev_priv->drrs.dp) {
5690 mutex_unlock(&dev_priv->drrs.mutex);
5691 return;
5692 }
5693
Vandana Kannana93fad02015-01-10 02:25:59 +05305694 crtc = dp_to_dig_port(dev_priv->drrs.dp)->base.base.crtc;
5695 pipe = to_intel_crtc(crtc)->pipe;
5696
Daniel Vetterc1d038c2015-06-18 10:30:25 +02005697 frontbuffer_bits &= INTEL_FRONTBUFFER_ALL_MASK(pipe);
5698 dev_priv->drrs.busy_frontbuffer_bits |= frontbuffer_bits;
5699
Ramalingam C0ddfd202015-06-15 20:50:05 +05305700 /* invalidate means busy screen hence upclock */
Daniel Vetterc1d038c2015-06-18 10:30:25 +02005701 if (frontbuffer_bits && dev_priv->drrs.refresh_rate_type == DRRS_LOW_RR)
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02005702 intel_dp_set_drrs_state(dev_priv, to_intel_crtc(crtc)->config,
5703 dev_priv->drrs.dp->attached_connector->panel.fixed_mode->vrefresh);
Vandana Kannana93fad02015-01-10 02:25:59 +05305704
Vandana Kannana93fad02015-01-10 02:25:59 +05305705 mutex_unlock(&dev_priv->drrs.mutex);
5706}
5707
Vandana Kannanb33a2812015-02-13 15:33:03 +05305708/**
Ramalingam C0ddfd202015-06-15 20:50:05 +05305709 * intel_edp_drrs_flush - Restart Idleness DRRS
Chris Wilson5748b6a2016-08-04 16:32:38 +01005710 * @dev_priv: i915 device
Vandana Kannanb33a2812015-02-13 15:33:03 +05305711 * @frontbuffer_bits: frontbuffer plane tracking bits
5712 *
Ramalingam C0ddfd202015-06-15 20:50:05 +05305713 * This function gets called every time rendering on the given planes has
5714 * completed or flip on a crtc is completed. So DRRS should be upclocked
5715 * (LOW_RR -> HIGH_RR). And also Idleness detection should be started again,
5716 * if no other planes are dirty.
Vandana Kannanb33a2812015-02-13 15:33:03 +05305717 *
5718 * Dirty frontbuffers relevant to DRRS are tracked in busy_frontbuffer_bits.
5719 */
Chris Wilson5748b6a2016-08-04 16:32:38 +01005720void intel_edp_drrs_flush(struct drm_i915_private *dev_priv,
5721 unsigned int frontbuffer_bits)
Vandana Kannana93fad02015-01-10 02:25:59 +05305722{
Vandana Kannana93fad02015-01-10 02:25:59 +05305723 struct drm_crtc *crtc;
5724 enum pipe pipe;
5725
Daniel Vetter9da7d692015-04-09 16:44:15 +02005726 if (dev_priv->drrs.type == DRRS_NOT_SUPPORTED)
Vandana Kannana93fad02015-01-10 02:25:59 +05305727 return;
5728
Daniel Vetter88f933a2015-04-09 16:44:16 +02005729 cancel_delayed_work(&dev_priv->drrs.work);
Ramalingam C3954e732015-03-03 12:11:46 +05305730
Vandana Kannana93fad02015-01-10 02:25:59 +05305731 mutex_lock(&dev_priv->drrs.mutex);
Daniel Vetter9da7d692015-04-09 16:44:15 +02005732 if (!dev_priv->drrs.dp) {
5733 mutex_unlock(&dev_priv->drrs.mutex);
5734 return;
5735 }
5736
Vandana Kannana93fad02015-01-10 02:25:59 +05305737 crtc = dp_to_dig_port(dev_priv->drrs.dp)->base.base.crtc;
5738 pipe = to_intel_crtc(crtc)->pipe;
Daniel Vetterc1d038c2015-06-18 10:30:25 +02005739
5740 frontbuffer_bits &= INTEL_FRONTBUFFER_ALL_MASK(pipe);
Vandana Kannana93fad02015-01-10 02:25:59 +05305741 dev_priv->drrs.busy_frontbuffer_bits &= ~frontbuffer_bits;
5742
Ramalingam C0ddfd202015-06-15 20:50:05 +05305743 /* flush means busy screen hence upclock */
Daniel Vetterc1d038c2015-06-18 10:30:25 +02005744 if (frontbuffer_bits && dev_priv->drrs.refresh_rate_type == DRRS_LOW_RR)
Maarten Lankhorst85cb48a2016-08-09 17:04:13 +02005745 intel_dp_set_drrs_state(dev_priv, to_intel_crtc(crtc)->config,
5746 dev_priv->drrs.dp->attached_connector->panel.fixed_mode->vrefresh);
Ramalingam C0ddfd202015-06-15 20:50:05 +05305747
5748 /*
5749 * flush also means no more activity hence schedule downclock, if all
5750 * other fbs are quiescent too
5751 */
5752 if (!dev_priv->drrs.busy_frontbuffer_bits)
Vandana Kannana93fad02015-01-10 02:25:59 +05305753 schedule_delayed_work(&dev_priv->drrs.work,
5754 msecs_to_jiffies(1000));
5755 mutex_unlock(&dev_priv->drrs.mutex);
5756}
5757
Vandana Kannanb33a2812015-02-13 15:33:03 +05305758/**
5759 * DOC: Display Refresh Rate Switching (DRRS)
5760 *
5761 * Display Refresh Rate Switching (DRRS) is a power conservation feature
5762 * which enables swtching between low and high refresh rates,
5763 * dynamically, based on the usage scenario. This feature is applicable
5764 * for internal panels.
5765 *
5766 * Indication that the panel supports DRRS is given by the panel EDID, which
5767 * would list multiple refresh rates for one resolution.
5768 *
5769 * DRRS is of 2 types - static and seamless.
5770 * Static DRRS involves changing refresh rate (RR) by doing a full modeset
5771 * (may appear as a blink on screen) and is used in dock-undock scenario.
5772 * Seamless DRRS involves changing RR without any visual effect to the user
5773 * and can be used during normal system usage. This is done by programming
5774 * certain registers.
5775 *
5776 * Support for static/seamless DRRS may be indicated in the VBT based on
5777 * inputs from the panel spec.
5778 *
5779 * DRRS saves power by switching to low RR based on usage scenarios.
5780 *
Daniel Vetter2e7a5702016-06-01 23:40:36 +02005781 * The implementation is based on frontbuffer tracking implementation. When
5782 * there is a disturbance on the screen triggered by user activity or a periodic
5783 * system activity, DRRS is disabled (RR is changed to high RR). When there is
5784 * no movement on screen, after a timeout of 1 second, a switch to low RR is
5785 * made.
5786 *
5787 * For integration with frontbuffer tracking code, intel_edp_drrs_invalidate()
5788 * and intel_edp_drrs_flush() are called.
Vandana Kannanb33a2812015-02-13 15:33:03 +05305789 *
5790 * DRRS can be further extended to support other internal panels and also
5791 * the scenario of video playback wherein RR is set based on the rate
5792 * requested by userspace.
5793 */
5794
5795/**
5796 * intel_dp_drrs_init - Init basic DRRS work and mutex.
Ville Syrjälä2f773472017-11-09 17:27:58 +02005797 * @connector: eDP connector
Vandana Kannanb33a2812015-02-13 15:33:03 +05305798 * @fixed_mode: preferred mode of panel
5799 *
5800 * This function is called only once at driver load to initialize basic
5801 * DRRS stuff.
5802 *
5803 * Returns:
5804 * Downclock mode if panel supports it, else return NULL.
5805 * DRRS support is determined by the presence of downclock mode (apart
5806 * from VBT setting).
5807 */
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305808static struct drm_display_mode *
Ville Syrjälä2f773472017-11-09 17:27:58 +02005809intel_dp_drrs_init(struct intel_connector *connector,
5810 struct drm_display_mode *fixed_mode)
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305811{
Ville Syrjälä2f773472017-11-09 17:27:58 +02005812 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305813 struct drm_display_mode *downclock_mode = NULL;
5814
Daniel Vetter9da7d692015-04-09 16:44:15 +02005815 INIT_DELAYED_WORK(&dev_priv->drrs.work, intel_edp_drrs_downclock_work);
5816 mutex_init(&dev_priv->drrs.mutex);
5817
Tvrtko Ursulindd11bc12016-11-16 08:55:41 +00005818 if (INTEL_GEN(dev_priv) <= 6) {
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305819 DRM_DEBUG_KMS("DRRS supported for Gen7 and above\n");
5820 return NULL;
5821 }
5822
5823 if (dev_priv->vbt.drrs_type != SEAMLESS_DRRS_SUPPORT) {
Damien Lespiau4079b8d2014-08-05 10:39:42 +01005824 DRM_DEBUG_KMS("VBT doesn't support DRRS\n");
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305825 return NULL;
5826 }
5827
Ville Syrjälä2f773472017-11-09 17:27:58 +02005828 downclock_mode = intel_find_panel_downclock(dev_priv, fixed_mode,
5829 &connector->base);
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305830
5831 if (!downclock_mode) {
Ramalingam Ca1d26342015-02-23 17:38:33 +05305832 DRM_DEBUG_KMS("Downclock mode is not found. DRRS not supported\n");
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305833 return NULL;
5834 }
5835
Vandana Kannan96178ee2015-01-10 02:25:56 +05305836 dev_priv->drrs.type = dev_priv->vbt.drrs_type;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305837
Vandana Kannan96178ee2015-01-10 02:25:56 +05305838 dev_priv->drrs.refresh_rate_type = DRRS_HIGH_RR;
Damien Lespiau4079b8d2014-08-05 10:39:42 +01005839 DRM_DEBUG_KMS("seamless DRRS supported for eDP panel.\n");
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305840 return downclock_mode;
5841}
5842
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005843static bool intel_edp_init_connector(struct intel_dp *intel_dp,
Ville Syrjälä36b5f422014-10-16 21:27:30 +03005844 struct intel_connector *intel_connector)
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005845{
Ville Syrjälä2f773472017-11-09 17:27:58 +02005846 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Chris Wilsonfac5e232016-07-04 11:34:36 +01005847 struct drm_i915_private *dev_priv = to_i915(dev);
Ville Syrjälä2f773472017-11-09 17:27:58 +02005848 struct drm_connector *connector = &intel_connector->base;
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005849 struct drm_display_mode *fixed_mode = NULL;
Jim Bridedc911f52017-08-09 12:48:53 -07005850 struct drm_display_mode *alt_fixed_mode = NULL;
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305851 struct drm_display_mode *downclock_mode = NULL;
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005852 bool has_dpcd;
5853 struct drm_display_mode *scan;
5854 struct edid *edid;
Ville Syrjälä6517d272014-11-07 11:16:02 +02005855 enum pipe pipe = INVALID_PIPE;
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005856
Jani Nikula1853a9d2017-08-18 12:30:20 +03005857 if (!intel_dp_is_edp(intel_dp))
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005858 return true;
5859
Imre Deak97a824e12016-06-21 11:51:47 +03005860 /*
5861 * On IBX/CPT we may get here with LVDS already registered. Since the
5862 * driver uses the only internal power sequencer available for both
5863 * eDP and LVDS bail out early in this case to prevent interfering
5864 * with an already powered-on LVDS power sequencer.
5865 */
Ville Syrjälä2f773472017-11-09 17:27:58 +02005866 if (intel_get_lvds_encoder(&dev_priv->drm)) {
Imre Deak97a824e12016-06-21 11:51:47 +03005867 WARN_ON(!(HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv)));
5868 DRM_INFO("LVDS was detected, not registering eDP\n");
5869
5870 return false;
5871 }
5872
Ville Syrjälä49e6bc52014-10-28 16:15:52 +02005873 pps_lock(intel_dp);
Imre Deakb4d06ed2016-06-21 11:51:49 +03005874
5875 intel_dp_init_panel_power_timestamps(intel_dp);
Ville Syrjälä46bd8382017-10-31 22:51:22 +02005876 intel_dp_pps_init(intel_dp);
Ville Syrjälä49e6bc52014-10-28 16:15:52 +02005877 intel_edp_panel_vdd_sanitize(intel_dp);
Imre Deakb4d06ed2016-06-21 11:51:49 +03005878
Ville Syrjälä49e6bc52014-10-28 16:15:52 +02005879 pps_unlock(intel_dp);
Paulo Zanoni63635212014-04-22 19:55:42 -03005880
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005881 /* Cache DPCD and EDID for edp. */
Ville Syrjäläfe5a66f2016-07-29 16:52:39 +03005882 has_dpcd = intel_edp_init_dpcd(intel_dp);
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005883
Ville Syrjäläfe5a66f2016-07-29 16:52:39 +03005884 if (!has_dpcd) {
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005885 /* if this fails, presume the device is a ghost */
5886 DRM_INFO("failed to retrieve link info, disabling eDP\n");
Imre Deakb4d06ed2016-06-21 11:51:49 +03005887 goto out_vdd_off;
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005888 }
5889
Daniel Vetter060c8772014-03-21 23:22:35 +01005890 mutex_lock(&dev->mode_config.mutex);
Jani Nikula0b998362014-03-14 16:51:17 +02005891 edid = drm_get_edid(connector, &intel_dp->aux.ddc);
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005892 if (edid) {
5893 if (drm_add_edid_modes(connector, edid)) {
5894 drm_mode_connector_update_edid_property(connector,
5895 edid);
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005896 } else {
5897 kfree(edid);
5898 edid = ERR_PTR(-EINVAL);
5899 }
5900 } else {
5901 edid = ERR_PTR(-ENOENT);
5902 }
5903 intel_connector->edid = edid;
5904
Jim Bridedc911f52017-08-09 12:48:53 -07005905 /* prefer fixed mode from EDID if available, save an alt mode also */
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005906 list_for_each_entry(scan, &connector->probed_modes, head) {
5907 if ((scan->type & DRM_MODE_TYPE_PREFERRED)) {
5908 fixed_mode = drm_mode_duplicate(dev, scan);
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305909 downclock_mode = intel_dp_drrs_init(
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305910 intel_connector, fixed_mode);
Jim Bridedc911f52017-08-09 12:48:53 -07005911 } else if (!alt_fixed_mode) {
5912 alt_fixed_mode = drm_mode_duplicate(dev, scan);
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005913 }
5914 }
5915
5916 /* fallback to VBT if available for eDP */
5917 if (!fixed_mode && dev_priv->vbt.lfp_lvds_vbt_mode) {
5918 fixed_mode = drm_mode_duplicate(dev,
5919 dev_priv->vbt.lfp_lvds_vbt_mode);
Ville Syrjälädf457242016-05-31 12:08:34 +03005920 if (fixed_mode) {
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005921 fixed_mode->type |= DRM_MODE_TYPE_PREFERRED;
Ville Syrjälädf457242016-05-31 12:08:34 +03005922 connector->display_info.width_mm = fixed_mode->width_mm;
5923 connector->display_info.height_mm = fixed_mode->height_mm;
5924 }
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005925 }
Daniel Vetter060c8772014-03-21 23:22:35 +01005926 mutex_unlock(&dev->mode_config.mutex);
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005927
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +01005928 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
Clint Taylor01527b32014-07-07 13:01:46 -07005929 intel_dp->edp_notifier.notifier_call = edp_notify_handler;
5930 register_reboot_notifier(&intel_dp->edp_notifier);
Ville Syrjälä6517d272014-11-07 11:16:02 +02005931
5932 /*
5933 * Figure out the current pipe for the initial backlight setup.
5934 * If the current pipe isn't valid, try the PPS pipe, and if that
5935 * fails just assume pipe A.
5936 */
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +02005937 pipe = vlv_active_pipe(intel_dp);
Ville Syrjälä6517d272014-11-07 11:16:02 +02005938
5939 if (pipe != PIPE_A && pipe != PIPE_B)
5940 pipe = intel_dp->pps_pipe;
5941
5942 if (pipe != PIPE_A && pipe != PIPE_B)
5943 pipe = PIPE_A;
5944
5945 DRM_DEBUG_KMS("using pipe %c for initial backlight setup\n",
5946 pipe_name(pipe));
Clint Taylor01527b32014-07-07 13:01:46 -07005947 }
5948
Jim Bridedc911f52017-08-09 12:48:53 -07005949 intel_panel_init(&intel_connector->panel, fixed_mode, alt_fixed_mode,
5950 downclock_mode);
Jani Nikula5507fae2015-09-14 14:03:48 +03005951 intel_connector->panel.backlight.power = intel_edp_backlight_power;
Ville Syrjälä6517d272014-11-07 11:16:02 +02005952 intel_panel_setup_backlight(connector, pipe);
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005953
5954 return true;
Imre Deakb4d06ed2016-06-21 11:51:49 +03005955
5956out_vdd_off:
5957 cancel_delayed_work_sync(&intel_dp->panel_vdd_work);
5958 /*
5959 * vdd might still be enabled do to the delayed vdd off.
5960 * Make sure vdd is actually turned off here.
5961 */
5962 pps_lock(intel_dp);
5963 edp_panel_vdd_off_sync(intel_dp);
5964 pps_unlock(intel_dp);
5965
5966 return false;
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005967}
5968
Ander Conselvan de Oliveira5432fca2017-02-22 08:34:26 +02005969/* Set up the hotplug pin and aux power domain. */
Ander Conselvan de Oliveirab71953a2017-02-03 16:03:14 +02005970static void
5971intel_dp_init_connector_port_info(struct intel_digital_port *intel_dig_port)
5972{
5973 struct intel_encoder *encoder = &intel_dig_port->base;
Ander Conselvan de Oliveira5432fca2017-02-22 08:34:26 +02005974 struct intel_dp *intel_dp = &intel_dig_port->dp;
Ander Conselvan de Oliveirab71953a2017-02-03 16:03:14 +02005975
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02005976 encoder->hpd_pin = intel_hpd_pin(encoder->port);
Rodrigo Vivif761bef22017-08-11 11:26:50 -07005977
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02005978 switch (encoder->port) {
Ander Conselvan de Oliveirab71953a2017-02-03 16:03:14 +02005979 case PORT_A:
Ander Conselvan de Oliveira5432fca2017-02-22 08:34:26 +02005980 intel_dp->aux_power_domain = POWER_DOMAIN_AUX_A;
Ander Conselvan de Oliveirab71953a2017-02-03 16:03:14 +02005981 break;
5982 case PORT_B:
Ander Conselvan de Oliveira5432fca2017-02-22 08:34:26 +02005983 intel_dp->aux_power_domain = POWER_DOMAIN_AUX_B;
Ander Conselvan de Oliveirab71953a2017-02-03 16:03:14 +02005984 break;
5985 case PORT_C:
Ander Conselvan de Oliveira5432fca2017-02-22 08:34:26 +02005986 intel_dp->aux_power_domain = POWER_DOMAIN_AUX_C;
Ander Conselvan de Oliveirab71953a2017-02-03 16:03:14 +02005987 break;
5988 case PORT_D:
Ander Conselvan de Oliveira5432fca2017-02-22 08:34:26 +02005989 intel_dp->aux_power_domain = POWER_DOMAIN_AUX_D;
Ander Conselvan de Oliveirab71953a2017-02-03 16:03:14 +02005990 break;
5991 case PORT_E:
Ander Conselvan de Oliveira5432fca2017-02-22 08:34:26 +02005992 /* FIXME: Check VBT for actual wiring of PORT E */
5993 intel_dp->aux_power_domain = POWER_DOMAIN_AUX_D;
Ander Conselvan de Oliveirab71953a2017-02-03 16:03:14 +02005994 break;
5995 default:
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02005996 MISSING_CASE(encoder->port);
Ander Conselvan de Oliveirab71953a2017-02-03 16:03:14 +02005997 }
5998}
5999
Manasi Navare93013972017-04-06 16:44:19 +03006000static void intel_dp_modeset_retry_work_fn(struct work_struct *work)
6001{
6002 struct intel_connector *intel_connector;
6003 struct drm_connector *connector;
6004
6005 intel_connector = container_of(work, typeof(*intel_connector),
6006 modeset_retry_work);
6007 connector = &intel_connector->base;
6008 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", connector->base.id,
6009 connector->name);
6010
6011 /* Grab the locks before changing connector property*/
6012 mutex_lock(&connector->dev->mode_config.mutex);
6013 /* Set connector link status to BAD and send a Uevent to notify
6014 * userspace to do a modeset.
6015 */
6016 drm_mode_connector_set_link_status_property(connector,
6017 DRM_MODE_LINK_STATUS_BAD);
6018 mutex_unlock(&connector->dev->mode_config.mutex);
6019 /* Send Hotplug uevent so userspace can reprobe */
6020 drm_kms_helper_hotplug_event(connector->dev);
6021}
6022
Paulo Zanoni16c25532013-06-12 17:27:25 -03006023bool
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02006024intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
6025 struct intel_connector *intel_connector)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07006026{
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02006027 struct drm_connector *connector = &intel_connector->base;
6028 struct intel_dp *intel_dp = &intel_dig_port->dp;
6029 struct intel_encoder *intel_encoder = &intel_dig_port->base;
6030 struct drm_device *dev = intel_encoder->base.dev;
Chris Wilsonfac5e232016-07-04 11:34:36 +01006031 struct drm_i915_private *dev_priv = to_i915(dev);
Ville Syrjälä8f4f2792017-11-09 17:24:34 +02006032 enum port port = intel_encoder->port;
Chris Wilson7a418e32016-06-24 14:00:14 +01006033 int type;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07006034
Manasi Navare93013972017-04-06 16:44:19 +03006035 /* Initialize the work for modeset in case of link train failure */
6036 INIT_WORK(&intel_connector->modeset_retry_work,
6037 intel_dp_modeset_retry_work_fn);
6038
Ville Syrjäläccb1a832015-12-08 19:59:38 +02006039 if (WARN(intel_dig_port->max_lanes < 1,
6040 "Not enough lanes (%d) for DP on port %c\n",
6041 intel_dig_port->max_lanes, port_name(port)))
6042 return false;
6043
Jani Nikula55cfc582017-03-28 17:59:04 +03006044 intel_dp_set_source_rates(intel_dp);
6045
Manasi Navared7e8ef02017-02-07 16:54:11 -08006046 intel_dp->reset_link_params = true;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03006047 intel_dp->pps_pipe = INVALID_PIPE;
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +02006048 intel_dp->active_pipe = INVALID_PIPE;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03006049
Damien Lespiauec5b01d2014-01-21 13:35:39 +00006050 /* intel_dp vfuncs */
Tvrtko Ursulindd11bc12016-11-16 08:55:41 +00006051 if (INTEL_GEN(dev_priv) >= 9)
Damien Lespiaub6b5e382014-01-20 16:00:59 +00006052 intel_dp->get_aux_clock_divider = skl_get_aux_clock_divider;
Tvrtko Ursulin86527442016-10-13 11:03:00 +01006053 else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
Damien Lespiauec5b01d2014-01-21 13:35:39 +00006054 intel_dp->get_aux_clock_divider = hsw_get_aux_clock_divider;
Tvrtko Ursulin6e266952016-10-13 11:02:53 +01006055 else if (HAS_PCH_SPLIT(dev_priv))
Damien Lespiauec5b01d2014-01-21 13:35:39 +00006056 intel_dp->get_aux_clock_divider = ilk_get_aux_clock_divider;
6057 else
Ville Syrjälä6ffb1be2016-03-02 17:22:14 +02006058 intel_dp->get_aux_clock_divider = g4x_get_aux_clock_divider;
Damien Lespiauec5b01d2014-01-21 13:35:39 +00006059
Tvrtko Ursulindd11bc12016-11-16 08:55:41 +00006060 if (INTEL_GEN(dev_priv) >= 9)
Damien Lespiaub9ca5fa2014-01-20 16:01:00 +00006061 intel_dp->get_aux_send_ctl = skl_get_aux_send_ctl;
6062 else
Ville Syrjälä6ffb1be2016-03-02 17:22:14 +02006063 intel_dp->get_aux_send_ctl = g4x_get_aux_send_ctl;
Damien Lespiau153b1102014-01-21 13:37:15 +00006064
Tvrtko Ursulin4f8036a2016-10-13 11:02:52 +01006065 if (HAS_DDI(dev_priv))
Ander Conselvan de Oliveiraad642172015-10-23 13:01:49 +03006066 intel_dp->prepare_link_retrain = intel_ddi_prepare_link_retrain;
6067
Daniel Vetter07679352012-09-06 22:15:42 +02006068 /* Preserve the current hw state. */
6069 intel_dp->DP = I915_READ(intel_dp->output_reg);
Jani Nikuladd06f902012-10-19 14:51:50 +03006070 intel_dp->attached_connector = intel_connector;
Chris Wilson3d3dc142011-02-12 10:33:12 +00006071
Jani Nikula7b91bf72017-08-18 12:30:19 +03006072 if (intel_dp_is_port_edp(dev_priv, port))
Gajanan Bhat19c03922012-09-27 19:13:07 +05306073 type = DRM_MODE_CONNECTOR_eDP;
Ville Syrjälä3b32a352013-11-01 18:22:41 +02006074 else
6075 type = DRM_MODE_CONNECTOR_DisplayPort;
Adam Jacksonb3295302010-07-16 14:46:28 -04006076
Ville Syrjälä9f2bdb02016-12-14 20:00:23 +02006077 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
6078 intel_dp->active_pipe = vlv_active_pipe(intel_dp);
6079
Imre Deakf7d24902013-05-08 13:14:05 +03006080 /*
6081 * For eDP we always set the encoder type to INTEL_OUTPUT_EDP, but
6082 * for DP the encoder type can be set by the caller to
6083 * INTEL_OUTPUT_UNKNOWN for DDI, so don't rewrite it.
6084 */
6085 if (type == DRM_MODE_CONNECTOR_eDP)
6086 intel_encoder->type = INTEL_OUTPUT_EDP;
6087
Ville Syrjäläc17ed5b2014-10-16 21:27:27 +03006088 /* eDP only on port B and/or C on vlv/chv */
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +01006089 if (WARN_ON((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
Jani Nikula1853a9d2017-08-18 12:30:20 +03006090 intel_dp_is_edp(intel_dp) &&
6091 port != PORT_B && port != PORT_C))
Ville Syrjäläc17ed5b2014-10-16 21:27:27 +03006092 return false;
6093
Imre Deake7281ea2013-05-08 13:14:08 +03006094 DRM_DEBUG_KMS("Adding %s connector on port %c\n",
6095 type == DRM_MODE_CONNECTOR_eDP ? "eDP" : "DP",
6096 port_name(port));
6097
Adam Jacksonb3295302010-07-16 14:46:28 -04006098 drm_connector_init(dev, connector, &intel_dp_connector_funcs, type);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07006099 drm_connector_helper_add(connector, &intel_dp_connector_helper_funcs);
6100
Ville Syrjälä050213892017-11-29 20:08:47 +02006101 if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv))
6102 connector->interlace_allowed = true;
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02006103 connector->doublescan_allowed = 0;
Ma Lingf8aed702009-08-24 13:50:24 +08006104
Ander Conselvan de Oliveira5432fca2017-02-22 08:34:26 +02006105 intel_dp_init_connector_port_info(intel_dig_port);
6106
Mika Kaholab6339582016-09-09 14:10:52 +03006107 intel_dp_aux_init(intel_dp);
Chris Wilson7a418e32016-06-24 14:00:14 +01006108
Daniel Vetter66a92782012-07-12 20:08:18 +02006109 INIT_DELAYED_WORK(&intel_dp->panel_vdd_work,
Daniel Vetter4be73782014-01-17 14:39:48 +01006110 edp_panel_vdd_work);
Zhenyu Wang6251ec02010-01-12 05:38:32 +08006111
Chris Wilsondf0e9242010-09-09 16:20:55 +01006112 intel_connector_attach_encoder(intel_connector, intel_encoder);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07006113
Tvrtko Ursulin4f8036a2016-10-13 11:02:52 +01006114 if (HAS_DDI(dev_priv))
Paulo Zanonibcbc8892012-10-26 19:05:51 -02006115 intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
6116 else
6117 intel_connector->get_hw_state = intel_connector_get_hw_state;
6118
Dave Airlie0e32b392014-05-02 14:02:48 +10006119 /* init MST on ports that can support it */
Jani Nikula1853a9d2017-08-18 12:30:20 +03006120 if (HAS_DP_MST(dev_priv) && !intel_dp_is_edp(intel_dp) &&
Jani Nikula0c9b3712015-05-18 17:10:01 +03006121 (port == PORT_B || port == PORT_C || port == PORT_D))
6122 intel_dp_mst_encoder_init(intel_dig_port,
6123 intel_connector->base.base.id);
Dave Airlie0e32b392014-05-02 14:02:48 +10006124
Ville Syrjälä36b5f422014-10-16 21:27:30 +03006125 if (!intel_edp_init_connector(intel_dp, intel_connector)) {
Ville Syrjäläa121f4e2015-11-11 20:34:11 +02006126 intel_dp_aux_fini(intel_dp);
6127 intel_dp_mst_encoder_cleanup(intel_dig_port);
6128 goto fail;
Paulo Zanonib2f246a2013-06-12 17:27:26 -03006129 }
Zhenyu Wang32f9d652009-07-24 01:00:32 +08006130
Chris Wilsonf6849602010-09-19 09:29:33 +01006131 intel_dp_add_properties(intel_dp, connector);
6132
Keith Packarda4fc5ed2009-04-07 16:16:42 -07006133 /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
6134 * 0xd. Failure to do so will result in spurious interrupts being
6135 * generated on the port when a cable is not attached.
6136 */
Tvrtko Ursulin50a0bc92016-10-13 11:02:58 +01006137 if (IS_G4X(dev_priv) && !IS_GM45(dev_priv)) {
Keith Packarda4fc5ed2009-04-07 16:16:42 -07006138 u32 temp = I915_READ(PEG_BAND_GAP_DATA);
6139 I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
6140 }
Paulo Zanoni16c25532013-06-12 17:27:25 -03006141
6142 return true;
Ville Syrjäläa121f4e2015-11-11 20:34:11 +02006143
6144fail:
Ville Syrjäläa121f4e2015-11-11 20:34:11 +02006145 drm_connector_cleanup(connector);
6146
6147 return false;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07006148}
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02006149
Ander Conselvan de Oliveirac39055b2016-11-23 16:21:44 +02006150bool intel_dp_init(struct drm_i915_private *dev_priv,
Chris Wilson457c52d2016-06-01 08:27:50 +01006151 i915_reg_t output_reg,
6152 enum port port)
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02006153{
6154 struct intel_digital_port *intel_dig_port;
6155 struct intel_encoder *intel_encoder;
6156 struct drm_encoder *encoder;
6157 struct intel_connector *intel_connector;
6158
Daniel Vetterb14c5672013-09-19 12:18:32 +02006159 intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02006160 if (!intel_dig_port)
Chris Wilson457c52d2016-06-01 08:27:50 +01006161 return false;
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02006162
Ander Conselvan de Oliveira08d9bc92015-04-10 10:59:10 +03006163 intel_connector = intel_connector_alloc();
Sudip Mukherjee11aee0f2015-10-08 19:27:59 +05306164 if (!intel_connector)
6165 goto err_connector_alloc;
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02006166
6167 intel_encoder = &intel_dig_port->base;
6168 encoder = &intel_encoder->base;
6169
Ander Conselvan de Oliveirac39055b2016-11-23 16:21:44 +02006170 if (drm_encoder_init(&dev_priv->drm, &intel_encoder->base,
6171 &intel_dp_enc_funcs, DRM_MODE_ENCODER_TMDS,
6172 "DP %c", port_name(port)))
Sudip Mukherjee893da0c2015-10-08 19:28:00 +05306173 goto err_encoder_init;
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02006174
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01006175 intel_encoder->compute_config = intel_dp_compute_config;
Paulo Zanoni00c09d72012-10-26 19:05:52 -02006176 intel_encoder->get_hw_state = intel_dp_get_hw_state;
Jesse Barnes045ac3b2013-05-14 17:08:26 -07006177 intel_encoder->get_config = intel_dp_get_config;
Imre Deak07f9cd02014-08-18 14:42:45 +03006178 intel_encoder->suspend = intel_dp_encoder_suspend;
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +01006179 if (IS_CHERRYVIEW(dev_priv)) {
Ville Syrjälä9197c882014-04-09 13:29:05 +03006180 intel_encoder->pre_pll_enable = chv_dp_pre_pll_enable;
Chon Ming Leee4a1d842014-04-09 13:28:20 +03006181 intel_encoder->pre_enable = chv_pre_enable_dp;
6182 intel_encoder->enable = vlv_enable_dp;
Ville Syrjälä1a8ff602017-09-20 18:12:51 +03006183 intel_encoder->disable = vlv_disable_dp;
Ville Syrjälä580d3812014-04-09 13:29:00 +03006184 intel_encoder->post_disable = chv_post_disable_dp;
Ville Syrjäläd6db9952015-07-08 23:45:49 +03006185 intel_encoder->post_pll_disable = chv_dp_post_pll_disable;
Tvrtko Ursulin11a914c2016-10-13 11:03:08 +01006186 } else if (IS_VALLEYVIEW(dev_priv)) {
Jani Nikulaecff4f32013-09-06 07:38:29 +03006187 intel_encoder->pre_pll_enable = vlv_dp_pre_pll_enable;
Jani Nikulaab1f90f2013-07-30 12:20:30 +03006188 intel_encoder->pre_enable = vlv_pre_enable_dp;
6189 intel_encoder->enable = vlv_enable_dp;
Ville Syrjälä1a8ff602017-09-20 18:12:51 +03006190 intel_encoder->disable = vlv_disable_dp;
Ville Syrjälä49277c32014-03-31 18:21:26 +03006191 intel_encoder->post_disable = vlv_post_disable_dp;
Ville Syrjälä1a8ff602017-09-20 18:12:51 +03006192 } else if (INTEL_GEN(dev_priv) >= 5) {
6193 intel_encoder->pre_enable = g4x_pre_enable_dp;
6194 intel_encoder->enable = g4x_enable_dp;
6195 intel_encoder->disable = ilk_disable_dp;
6196 intel_encoder->post_disable = ilk_post_disable_dp;
Jani Nikulaab1f90f2013-07-30 12:20:30 +03006197 } else {
Jani Nikulaecff4f32013-09-06 07:38:29 +03006198 intel_encoder->pre_enable = g4x_pre_enable_dp;
6199 intel_encoder->enable = g4x_enable_dp;
Ville Syrjälä1a8ff602017-09-20 18:12:51 +03006200 intel_encoder->disable = g4x_disable_dp;
Jani Nikulaab1f90f2013-07-30 12:20:30 +03006201 }
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02006202
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02006203 intel_dig_port->dp.output_reg = output_reg;
Ville Syrjäläccb1a832015-12-08 19:59:38 +02006204 intel_dig_port->max_lanes = 4;
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02006205
Ville Syrjäläcca05022016-06-22 21:57:06 +03006206 intel_encoder->type = INTEL_OUTPUT_DP;
Ander Conselvan de Oliveira79f255a2017-02-22 08:34:27 +02006207 intel_encoder->power_domain = intel_port_to_power_domain(port);
Tvrtko Ursulin920a14b2016-10-14 10:13:44 +01006208 if (IS_CHERRYVIEW(dev_priv)) {
Ville Syrjälä882ec382014-04-28 14:07:43 +03006209 if (port == PORT_D)
6210 intel_encoder->crtc_mask = 1 << 2;
6211 else
6212 intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
6213 } else {
6214 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
6215 }
Ville Syrjäläbc079e82014-03-03 16:15:28 +02006216 intel_encoder->cloneable = 0;
Pandiyan, Dhinakaran03cdc1d2016-09-19 18:24:38 -07006217 intel_encoder->port = port;
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02006218
Dave Airlie13cf5502014-06-18 11:29:35 +10006219 intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
Jani Nikula5fcece82015-05-27 15:03:42 +03006220 dev_priv->hotplug.irq_port[port] = intel_dig_port;
Dave Airlie13cf5502014-06-18 11:29:35 +10006221
Ville Syrjälä385e4de2017-08-18 16:49:55 +03006222 if (port != PORT_A)
6223 intel_infoframe_init(intel_dig_port);
6224
Sudip Mukherjee11aee0f2015-10-08 19:27:59 +05306225 if (!intel_dp_init_connector(intel_dig_port, intel_connector))
6226 goto err_init_connector;
6227
Chris Wilson457c52d2016-06-01 08:27:50 +01006228 return true;
Sudip Mukherjee11aee0f2015-10-08 19:27:59 +05306229
6230err_init_connector:
6231 drm_encoder_cleanup(encoder);
Sudip Mukherjee893da0c2015-10-08 19:28:00 +05306232err_encoder_init:
Sudip Mukherjee11aee0f2015-10-08 19:27:59 +05306233 kfree(intel_connector);
6234err_connector_alloc:
6235 kfree(intel_dig_port);
Chris Wilson457c52d2016-06-01 08:27:50 +01006236 return false;
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02006237}
Dave Airlie0e32b392014-05-02 14:02:48 +10006238
6239void intel_dp_mst_suspend(struct drm_device *dev)
6240{
Chris Wilsonfac5e232016-07-04 11:34:36 +01006241 struct drm_i915_private *dev_priv = to_i915(dev);
Dave Airlie0e32b392014-05-02 14:02:48 +10006242 int i;
6243
6244 /* disable MST */
6245 for (i = 0; i < I915_MAX_PORTS; i++) {
Jani Nikula5fcece82015-05-27 15:03:42 +03006246 struct intel_digital_port *intel_dig_port = dev_priv->hotplug.irq_port[i];
Ville Syrjälä5aa56962016-06-22 21:57:00 +03006247
6248 if (!intel_dig_port || !intel_dig_port->dp.can_mst)
Dave Airlie0e32b392014-05-02 14:02:48 +10006249 continue;
6250
Ville Syrjälä5aa56962016-06-22 21:57:00 +03006251 if (intel_dig_port->dp.is_mst)
6252 drm_dp_mst_topology_mgr_suspend(&intel_dig_port->dp.mst_mgr);
Dave Airlie0e32b392014-05-02 14:02:48 +10006253 }
6254}
6255
6256void intel_dp_mst_resume(struct drm_device *dev)
6257{
Chris Wilsonfac5e232016-07-04 11:34:36 +01006258 struct drm_i915_private *dev_priv = to_i915(dev);
Dave Airlie0e32b392014-05-02 14:02:48 +10006259 int i;
6260
6261 for (i = 0; i < I915_MAX_PORTS; i++) {
Jani Nikula5fcece82015-05-27 15:03:42 +03006262 struct intel_digital_port *intel_dig_port = dev_priv->hotplug.irq_port[i];
Ville Syrjälä5aa56962016-06-22 21:57:00 +03006263 int ret;
6264
6265 if (!intel_dig_port || !intel_dig_port->dp.can_mst)
Dave Airlie0e32b392014-05-02 14:02:48 +10006266 continue;
Dave Airlie0e32b392014-05-02 14:02:48 +10006267
Ville Syrjälä5aa56962016-06-22 21:57:00 +03006268 ret = drm_dp_mst_topology_mgr_resume(&intel_dig_port->dp.mst_mgr);
6269 if (ret)
6270 intel_dp_check_mst_status(&intel_dig_port->dp);
Dave Airlie0e32b392014-05-02 14:02:48 +10006271 }
6272}