blob: 7553f08d87e1ebb6cee41bb0de11755faeef0b36 [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>
Clint Taylor01527b32014-07-07 13:01:46 -070031#include <linux/notifier.h>
32#include <linux/reboot.h>
David Howells760285e2012-10-02 18:01:07 +010033#include <drm/drmP.h>
Matt Roperc6f95f22015-01-22 16:50:32 -080034#include <drm/drm_atomic_helper.h>
David Howells760285e2012-10-02 18:01:07 +010035#include <drm/drm_crtc.h>
36#include <drm/drm_crtc_helper.h>
37#include <drm/drm_edid.h>
Keith Packarda4fc5ed2009-04-07 16:16:42 -070038#include "intel_drv.h"
David Howells760285e2012-10-02 18:01:07 +010039#include <drm/i915_drm.h>
Keith Packarda4fc5ed2009-04-07 16:16:42 -070040#include "i915_drv.h"
Keith Packarda4fc5ed2009-04-07 16:16:42 -070041
Keith Packarda4fc5ed2009-04-07 16:16:42 -070042#define DP_LINK_CHECK_TIMEOUT (10 * 1000)
43
Chon Ming Lee9dd4ffd2013-09-04 01:30:37 +080044struct dp_link_dpll {
45 int link_bw;
46 struct dpll dpll;
47};
48
49static const struct dp_link_dpll gen4_dpll[] = {
50 { DP_LINK_BW_1_62,
51 { .p1 = 2, .p2 = 10, .n = 2, .m1 = 23, .m2 = 8 } },
52 { DP_LINK_BW_2_7,
53 { .p1 = 1, .p2 = 10, .n = 1, .m1 = 14, .m2 = 2 } }
54};
55
56static const struct dp_link_dpll pch_dpll[] = {
57 { DP_LINK_BW_1_62,
58 { .p1 = 2, .p2 = 10, .n = 1, .m1 = 12, .m2 = 9 } },
59 { DP_LINK_BW_2_7,
60 { .p1 = 1, .p2 = 10, .n = 2, .m1 = 14, .m2 = 8 } }
61};
62
Chon Ming Lee65ce4bf2013-09-04 01:30:38 +080063static const struct dp_link_dpll vlv_dpll[] = {
64 { DP_LINK_BW_1_62,
Chon Ming Lee58f6e632013-09-25 15:47:51 +080065 { .p1 = 3, .p2 = 2, .n = 5, .m1 = 3, .m2 = 81 } },
Chon Ming Lee65ce4bf2013-09-04 01:30:38 +080066 { DP_LINK_BW_2_7,
67 { .p1 = 2, .p2 = 2, .n = 1, .m1 = 2, .m2 = 27 } }
68};
69
Chon Ming Leeef9348c2014-04-09 13:28:18 +030070/*
71 * CHV supports eDP 1.4 that have more link rates.
72 * Below only provides the fixed rate but exclude variable rate.
73 */
74static const struct dp_link_dpll chv_dpll[] = {
75 /*
76 * CHV requires to program fractional division for m2.
77 * m2 is stored in fixed point format using formula below
78 * (m2_int << 22) | m2_fraction
79 */
80 { DP_LINK_BW_1_62, /* m2_int = 32, m2_fraction = 1677722 */
81 { .p1 = 4, .p2 = 2, .n = 1, .m1 = 2, .m2 = 0x819999a } },
82 { DP_LINK_BW_2_7, /* m2_int = 27, m2_fraction = 0 */
83 { .p1 = 4, .p2 = 1, .n = 1, .m1 = 2, .m2 = 0x6c00000 } },
84 { DP_LINK_BW_5_4, /* m2_int = 27, m2_fraction = 0 */
85 { .p1 = 2, .p2 = 1, .n = 1, .m1 = 2, .m2 = 0x6c00000 } }
86};
Sonika Jindala8f3ef62015-03-05 10:02:30 +053087/* Skylake supports following rates */
Ville Syrjäläf4896f12015-03-12 17:10:27 +020088static const int gen9_rates[] = { 162000, 216000, 270000,
89 324000, 432000, 540000 };
90static const int default_rates[] = { 162000, 270000, 540000 };
Chon Ming Leeef9348c2014-04-09 13:28:18 +030091
Jesse Barnescfcb0fc2010-10-07 16:01:06 -070092/**
93 * is_edp - is the given port attached to an eDP panel (either CPU or PCH)
94 * @intel_dp: DP struct
95 *
96 * If a CPU or PCH DP output is attached to an eDP panel, this function
97 * will return true, and false otherwise.
98 */
99static bool is_edp(struct intel_dp *intel_dp)
100{
Paulo Zanonida63a9f2012-10-26 19:05:46 -0200101 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
102
103 return intel_dig_port->base.type == INTEL_OUTPUT_EDP;
Jesse Barnescfcb0fc2010-10-07 16:01:06 -0700104}
105
Imre Deak68b4d822013-05-08 13:14:06 +0300106static struct drm_device *intel_dp_to_dev(struct intel_dp *intel_dp)
Jesse Barnescfcb0fc2010-10-07 16:01:06 -0700107{
Imre Deak68b4d822013-05-08 13:14:06 +0300108 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
109
110 return intel_dig_port->base.base.dev;
Jesse Barnescfcb0fc2010-10-07 16:01:06 -0700111}
112
Chris Wilsondf0e9242010-09-09 16:20:55 +0100113static struct intel_dp *intel_attached_dp(struct drm_connector *connector)
114{
Paulo Zanonifa90ece2012-10-26 19:05:44 -0200115 return enc_to_intel_dp(&intel_attached_encoder(connector)->base);
Chris Wilsondf0e9242010-09-09 16:20:55 +0100116}
117
Chris Wilsonea5b2132010-08-04 13:50:23 +0100118static void intel_dp_link_down(struct intel_dp *intel_dp);
Ville Syrjälä1e0560e2014-08-19 13:24:25 +0300119static bool edp_panel_vdd_on(struct intel_dp *intel_dp);
Daniel Vetter4be73782014-01-17 14:39:48 +0100120static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync);
Ville Syrjälä093e3f12014-10-16 21:27:33 +0300121static void vlv_init_panel_power_sequencer(struct intel_dp *intel_dp);
Ville Syrjäläa8c33442014-10-16 21:29:59 +0300122static void vlv_steal_power_sequencer(struct drm_device *dev,
123 enum pipe pipe);
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700124
Dave Airlie0e32b392014-05-02 14:02:48 +1000125int
Chris Wilsonea5b2132010-08-04 13:50:23 +0100126intel_dp_max_link_bw(struct intel_dp *intel_dp)
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700127{
Jesse Barnes7183dc22011-07-07 11:10:58 -0700128 int max_link_bw = intel_dp->dpcd[DP_MAX_LINK_RATE];
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700129
130 switch (max_link_bw) {
131 case DP_LINK_BW_1_62:
132 case DP_LINK_BW_2_7:
Ville Syrjälä1db10e22015-03-12 17:10:32 +0200133 case DP_LINK_BW_5_4:
Imre Deakd4eead52013-07-09 17:05:26 +0300134 break;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700135 default:
Imre Deakd4eead52013-07-09 17:05:26 +0300136 WARN(1, "invalid max DP link bw val %x, using 1.62Gbps\n",
137 max_link_bw);
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700138 max_link_bw = DP_LINK_BW_1_62;
139 break;
140 }
141 return max_link_bw;
142}
143
Paulo Zanonieeb63242014-05-06 14:56:50 +0300144static u8 intel_dp_max_lane_count(struct intel_dp *intel_dp)
145{
146 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
147 struct drm_device *dev = intel_dig_port->base.base.dev;
148 u8 source_max, sink_max;
149
150 source_max = 4;
151 if (HAS_DDI(dev) && intel_dig_port->port == PORT_A &&
152 (intel_dig_port->saved_port_bits & DDI_A_4_LANES) == 0)
153 source_max = 2;
154
155 sink_max = drm_dp_max_lane_count(intel_dp->dpcd);
156
157 return min(source_max, sink_max);
158}
159
Adam Jacksoncd9dde42011-10-14 12:43:49 -0400160/*
161 * The units on the numbers in the next two are... bizarre. Examples will
162 * make it clearer; this one parallels an example in the eDP spec.
163 *
164 * intel_dp_max_data_rate for one lane of 2.7GHz evaluates as:
165 *
166 * 270000 * 1 * 8 / 10 == 216000
167 *
168 * The actual data capacity of that configuration is 2.16Gbit/s, so the
169 * units are decakilobits. ->clock in a drm_display_mode is in kilohertz -
170 * or equivalently, kilopixels per second - so for 1680x1050R it'd be
171 * 119000. At 18bpp that's 2142000 kilobits per second.
172 *
173 * Thus the strange-looking division by 10 in intel_dp_link_required, to
174 * get the result in decakilobits instead of kilobits.
175 */
176
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700177static int
Keith Packardc8982612012-01-25 08:16:25 -0800178intel_dp_link_required(int pixel_clock, int bpp)
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700179{
Adam Jacksoncd9dde42011-10-14 12:43:49 -0400180 return (pixel_clock * bpp + 9) / 10;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700181}
182
183static int
Dave Airliefe27d532010-06-30 11:46:17 +1000184intel_dp_max_data_rate(int max_link_clock, int max_lanes)
185{
186 return (max_link_clock * max_lanes * 8) / 10;
187}
188
Damien Lespiauc19de8e2013-11-28 15:29:18 +0000189static enum drm_mode_status
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700190intel_dp_mode_valid(struct drm_connector *connector,
191 struct drm_display_mode *mode)
192{
Chris Wilsondf0e9242010-09-09 16:20:55 +0100193 struct intel_dp *intel_dp = intel_attached_dp(connector);
Jani Nikuladd06f902012-10-19 14:51:50 +0300194 struct intel_connector *intel_connector = to_intel_connector(connector);
195 struct drm_display_mode *fixed_mode = intel_connector->panel.fixed_mode;
Daniel Vetter36008362013-03-27 00:44:59 +0100196 int target_clock = mode->clock;
197 int max_rate, mode_rate, max_lanes, max_link_clock;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700198
Jani Nikuladd06f902012-10-19 14:51:50 +0300199 if (is_edp(intel_dp) && fixed_mode) {
200 if (mode->hdisplay > fixed_mode->hdisplay)
Zhao Yakui7de56f42010-07-19 09:43:14 +0100201 return MODE_PANEL;
202
Jani Nikuladd06f902012-10-19 14:51:50 +0300203 if (mode->vdisplay > fixed_mode->vdisplay)
Zhao Yakui7de56f42010-07-19 09:43:14 +0100204 return MODE_PANEL;
Daniel Vetter03afc4a2013-04-02 23:42:31 +0200205
206 target_clock = fixed_mode->clock;
Zhao Yakui7de56f42010-07-19 09:43:14 +0100207 }
208
Daniel Vetter36008362013-03-27 00:44:59 +0100209 max_link_clock = drm_dp_bw_code_to_link_rate(intel_dp_max_link_bw(intel_dp));
Paulo Zanonieeb63242014-05-06 14:56:50 +0300210 max_lanes = intel_dp_max_lane_count(intel_dp);
Daniel Vetter36008362013-03-27 00:44:59 +0100211
212 max_rate = intel_dp_max_data_rate(max_link_clock, max_lanes);
213 mode_rate = intel_dp_link_required(target_clock, 18);
214
215 if (mode_rate > max_rate)
Daniel Vetterc4867932012-04-10 10:42:36 +0200216 return MODE_CLOCK_HIGH;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700217
218 if (mode->clock < 10000)
219 return MODE_CLOCK_LOW;
220
Daniel Vetter0af78a22012-05-23 11:30:55 +0200221 if (mode->flags & DRM_MODE_FLAG_DBLCLK)
222 return MODE_H_ILLEGAL;
223
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700224 return MODE_OK;
225}
226
Rodrigo Vivia4f12892014-11-14 08:52:27 -0800227uint32_t intel_dp_pack_aux(const uint8_t *src, int src_bytes)
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700228{
229 int i;
230 uint32_t v = 0;
231
232 if (src_bytes > 4)
233 src_bytes = 4;
234 for (i = 0; i < src_bytes; i++)
235 v |= ((uint32_t) src[i]) << ((3-i) * 8);
236 return v;
237}
238
Damien Lespiauc2af70e2015-02-10 19:32:23 +0000239static void intel_dp_unpack_aux(uint32_t src, uint8_t *dst, int dst_bytes)
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700240{
241 int i;
242 if (dst_bytes > 4)
243 dst_bytes = 4;
244 for (i = 0; i < dst_bytes; i++)
245 dst[i] = src >> ((3-i) * 8);
246}
247
Keith Packardfb0f8fb2009-06-11 22:31:31 -0700248/* hrawclock is 1/4 the FSB frequency */
249static int
250intel_hrawclk(struct drm_device *dev)
251{
252 struct drm_i915_private *dev_priv = dev->dev_private;
253 uint32_t clkcfg;
254
Vijay Purushothaman9473c8f2012-09-27 19:13:01 +0530255 /* There is no CLKCFG reg in Valleyview. VLV hrawclk is 200 MHz */
256 if (IS_VALLEYVIEW(dev))
257 return 200;
258
Keith Packardfb0f8fb2009-06-11 22:31:31 -0700259 clkcfg = I915_READ(CLKCFG);
260 switch (clkcfg & CLKCFG_FSB_MASK) {
261 case CLKCFG_FSB_400:
262 return 100;
263 case CLKCFG_FSB_533:
264 return 133;
265 case CLKCFG_FSB_667:
266 return 166;
267 case CLKCFG_FSB_800:
268 return 200;
269 case CLKCFG_FSB_1067:
270 return 266;
271 case CLKCFG_FSB_1333:
272 return 333;
273 /* these two are just a guess; one of them might be right */
274 case CLKCFG_FSB_1600:
275 case CLKCFG_FSB_1600_ALT:
276 return 400;
277 default:
278 return 133;
279 }
280}
281
Jani Nikulabf13e812013-09-06 07:40:05 +0300282static void
283intel_dp_init_panel_power_sequencer(struct drm_device *dev,
Ville Syrjälä36b5f422014-10-16 21:27:30 +0300284 struct intel_dp *intel_dp);
Jani Nikulabf13e812013-09-06 07:40:05 +0300285static void
286intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev,
Ville Syrjälä36b5f422014-10-16 21:27:30 +0300287 struct intel_dp *intel_dp);
Jani Nikulabf13e812013-09-06 07:40:05 +0300288
Ville Syrjälä773538e82014-09-04 14:54:56 +0300289static void pps_lock(struct intel_dp *intel_dp)
290{
291 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
292 struct intel_encoder *encoder = &intel_dig_port->base;
293 struct drm_device *dev = encoder->base.dev;
294 struct drm_i915_private *dev_priv = dev->dev_private;
295 enum intel_display_power_domain power_domain;
296
297 /*
298 * See vlv_power_sequencer_reset() why we need
299 * a power domain reference here.
300 */
301 power_domain = intel_display_port_power_domain(encoder);
302 intel_display_power_get(dev_priv, power_domain);
303
304 mutex_lock(&dev_priv->pps_mutex);
305}
306
307static void pps_unlock(struct intel_dp *intel_dp)
308{
309 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
310 struct intel_encoder *encoder = &intel_dig_port->base;
311 struct drm_device *dev = encoder->base.dev;
312 struct drm_i915_private *dev_priv = dev->dev_private;
313 enum intel_display_power_domain power_domain;
314
315 mutex_unlock(&dev_priv->pps_mutex);
316
317 power_domain = intel_display_port_power_domain(encoder);
318 intel_display_power_put(dev_priv, power_domain);
319}
320
Ville Syrjälä961a0db2014-10-16 21:29:42 +0300321static void
322vlv_power_sequencer_kick(struct intel_dp *intel_dp)
323{
324 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
325 struct drm_device *dev = intel_dig_port->base.base.dev;
326 struct drm_i915_private *dev_priv = dev->dev_private;
327 enum pipe pipe = intel_dp->pps_pipe;
Ville Syrjäläd288f652014-10-28 13:20:22 +0200328 bool pll_enabled;
Ville Syrjälä961a0db2014-10-16 21:29:42 +0300329 uint32_t DP;
330
331 if (WARN(I915_READ(intel_dp->output_reg) & DP_PORT_EN,
332 "skipping pipe %c power seqeuncer kick due to port %c being active\n",
333 pipe_name(pipe), port_name(intel_dig_port->port)))
334 return;
335
336 DRM_DEBUG_KMS("kicking pipe %c power sequencer for port %c\n",
337 pipe_name(pipe), port_name(intel_dig_port->port));
338
339 /* Preserve the BIOS-computed detected bit. This is
340 * supposed to be read-only.
341 */
342 DP = I915_READ(intel_dp->output_reg) & DP_DETECTED;
343 DP |= DP_VOLTAGE_0_4 | DP_PRE_EMPHASIS_0;
344 DP |= DP_PORT_WIDTH(1);
345 DP |= DP_LINK_TRAIN_PAT_1;
346
347 if (IS_CHERRYVIEW(dev))
348 DP |= DP_PIPE_SELECT_CHV(pipe);
349 else if (pipe == PIPE_B)
350 DP |= DP_PIPEB_SELECT;
351
Ville Syrjäläd288f652014-10-28 13:20:22 +0200352 pll_enabled = I915_READ(DPLL(pipe)) & DPLL_VCO_ENABLE;
353
354 /*
355 * The DPLL for the pipe must be enabled for this to work.
356 * So enable temporarily it if it's not already enabled.
357 */
358 if (!pll_enabled)
359 vlv_force_pll_on(dev, pipe, IS_CHERRYVIEW(dev) ?
360 &chv_dpll[0].dpll : &vlv_dpll[0].dpll);
361
Ville Syrjälä961a0db2014-10-16 21:29:42 +0300362 /*
363 * Similar magic as in intel_dp_enable_port().
364 * We _must_ do this port enable + disable trick
365 * to make this power seqeuencer lock onto the port.
366 * Otherwise even VDD force bit won't work.
367 */
368 I915_WRITE(intel_dp->output_reg, DP);
369 POSTING_READ(intel_dp->output_reg);
370
371 I915_WRITE(intel_dp->output_reg, DP | DP_PORT_EN);
372 POSTING_READ(intel_dp->output_reg);
373
374 I915_WRITE(intel_dp->output_reg, DP & ~DP_PORT_EN);
375 POSTING_READ(intel_dp->output_reg);
Ville Syrjäläd288f652014-10-28 13:20:22 +0200376
377 if (!pll_enabled)
378 vlv_force_pll_off(dev, pipe);
Ville Syrjälä961a0db2014-10-16 21:29:42 +0300379}
380
Jani Nikulabf13e812013-09-06 07:40:05 +0300381static enum pipe
382vlv_power_sequencer_pipe(struct intel_dp *intel_dp)
383{
384 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Jani Nikulabf13e812013-09-06 07:40:05 +0300385 struct drm_device *dev = intel_dig_port->base.base.dev;
386 struct drm_i915_private *dev_priv = dev->dev_private;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300387 struct intel_encoder *encoder;
388 unsigned int pipes = (1 << PIPE_A) | (1 << PIPE_B);
Ville Syrjäläa8c33442014-10-16 21:29:59 +0300389 enum pipe pipe;
Jani Nikulabf13e812013-09-06 07:40:05 +0300390
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300391 lockdep_assert_held(&dev_priv->pps_mutex);
392
Ville Syrjäläa8c33442014-10-16 21:29:59 +0300393 /* We should never land here with regular DP ports */
394 WARN_ON(!is_edp(intel_dp));
395
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300396 if (intel_dp->pps_pipe != INVALID_PIPE)
397 return intel_dp->pps_pipe;
Jani Nikulabf13e812013-09-06 07:40:05 +0300398
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300399 /*
400 * We don't have power sequencer currently.
401 * Pick one that's not used by other ports.
402 */
403 list_for_each_entry(encoder, &dev->mode_config.encoder_list,
404 base.head) {
405 struct intel_dp *tmp;
406
407 if (encoder->type != INTEL_OUTPUT_EDP)
408 continue;
409
410 tmp = enc_to_intel_dp(&encoder->base);
411
412 if (tmp->pps_pipe != INVALID_PIPE)
413 pipes &= ~(1 << tmp->pps_pipe);
414 }
415
416 /*
417 * Didn't find one. This should not happen since there
418 * are two power sequencers and up to two eDP ports.
419 */
420 if (WARN_ON(pipes == 0))
Ville Syrjäläa8c33442014-10-16 21:29:59 +0300421 pipe = PIPE_A;
422 else
423 pipe = ffs(pipes) - 1;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300424
Ville Syrjäläa8c33442014-10-16 21:29:59 +0300425 vlv_steal_power_sequencer(dev, pipe);
426 intel_dp->pps_pipe = pipe;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300427
428 DRM_DEBUG_KMS("picked pipe %c power sequencer for port %c\n",
429 pipe_name(intel_dp->pps_pipe),
430 port_name(intel_dig_port->port));
431
432 /* init power sequencer on this pipe and port */
Ville Syrjälä36b5f422014-10-16 21:27:30 +0300433 intel_dp_init_panel_power_sequencer(dev, intel_dp);
434 intel_dp_init_panel_power_sequencer_registers(dev, intel_dp);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300435
Ville Syrjälä961a0db2014-10-16 21:29:42 +0300436 /*
437 * Even vdd force doesn't work until we've made
438 * the power sequencer lock in on the port.
439 */
440 vlv_power_sequencer_kick(intel_dp);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300441
442 return intel_dp->pps_pipe;
443}
444
Ville Syrjälä6491ab22014-08-18 22:16:06 +0300445typedef bool (*vlv_pipe_check)(struct drm_i915_private *dev_priv,
446 enum pipe pipe);
447
448static bool vlv_pipe_has_pp_on(struct drm_i915_private *dev_priv,
449 enum pipe pipe)
450{
451 return I915_READ(VLV_PIPE_PP_STATUS(pipe)) & PP_ON;
452}
453
454static bool vlv_pipe_has_vdd_on(struct drm_i915_private *dev_priv,
455 enum pipe pipe)
456{
457 return I915_READ(VLV_PIPE_PP_CONTROL(pipe)) & EDP_FORCE_VDD;
458}
459
460static bool vlv_pipe_any(struct drm_i915_private *dev_priv,
461 enum pipe pipe)
462{
463 return true;
464}
465
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300466static enum pipe
Ville Syrjälä6491ab22014-08-18 22:16:06 +0300467vlv_initial_pps_pipe(struct drm_i915_private *dev_priv,
468 enum port port,
469 vlv_pipe_check pipe_check)
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300470{
Jani Nikulabf13e812013-09-06 07:40:05 +0300471 enum pipe pipe;
472
Jani Nikulabf13e812013-09-06 07:40:05 +0300473 for (pipe = PIPE_A; pipe <= PIPE_B; pipe++) {
474 u32 port_sel = I915_READ(VLV_PIPE_PP_ON_DELAYS(pipe)) &
475 PANEL_PORT_SELECT_MASK;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300476
477 if (port_sel != PANEL_PORT_SELECT_VLV(port))
478 continue;
479
Ville Syrjälä6491ab22014-08-18 22:16:06 +0300480 if (!pipe_check(dev_priv, pipe))
481 continue;
482
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300483 return pipe;
Jani Nikulabf13e812013-09-06 07:40:05 +0300484 }
485
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300486 return INVALID_PIPE;
487}
488
489static void
490vlv_initial_power_sequencer_setup(struct intel_dp *intel_dp)
491{
492 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
493 struct drm_device *dev = intel_dig_port->base.base.dev;
494 struct drm_i915_private *dev_priv = dev->dev_private;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300495 enum port port = intel_dig_port->port;
496
497 lockdep_assert_held(&dev_priv->pps_mutex);
498
499 /* try to find a pipe with this port selected */
Ville Syrjälä6491ab22014-08-18 22:16:06 +0300500 /* first pick one where the panel is on */
501 intel_dp->pps_pipe = vlv_initial_pps_pipe(dev_priv, port,
502 vlv_pipe_has_pp_on);
503 /* didn't find one? pick one where vdd is on */
504 if (intel_dp->pps_pipe == INVALID_PIPE)
505 intel_dp->pps_pipe = vlv_initial_pps_pipe(dev_priv, port,
506 vlv_pipe_has_vdd_on);
507 /* didn't find one? pick one with just the correct port */
508 if (intel_dp->pps_pipe == INVALID_PIPE)
509 intel_dp->pps_pipe = vlv_initial_pps_pipe(dev_priv, port,
510 vlv_pipe_any);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300511
512 /* didn't find one? just let vlv_power_sequencer_pipe() pick one when needed */
513 if (intel_dp->pps_pipe == INVALID_PIPE) {
514 DRM_DEBUG_KMS("no initial power sequencer for port %c\n",
515 port_name(port));
516 return;
517 }
518
519 DRM_DEBUG_KMS("initial power sequencer for port %c: pipe %c\n",
520 port_name(port), pipe_name(intel_dp->pps_pipe));
521
Ville Syrjälä36b5f422014-10-16 21:27:30 +0300522 intel_dp_init_panel_power_sequencer(dev, intel_dp);
523 intel_dp_init_panel_power_sequencer_registers(dev, intel_dp);
Jani Nikulabf13e812013-09-06 07:40:05 +0300524}
525
Ville Syrjälä773538e82014-09-04 14:54:56 +0300526void vlv_power_sequencer_reset(struct drm_i915_private *dev_priv)
527{
528 struct drm_device *dev = dev_priv->dev;
529 struct intel_encoder *encoder;
530
531 if (WARN_ON(!IS_VALLEYVIEW(dev)))
532 return;
533
534 /*
535 * We can't grab pps_mutex here due to deadlock with power_domain
536 * mutex when power_domain functions are called while holding pps_mutex.
537 * That also means that in order to use pps_pipe the code needs to
538 * hold both a power domain reference and pps_mutex, and the power domain
539 * reference get/put must be done while _not_ holding pps_mutex.
540 * pps_{lock,unlock}() do these steps in the correct order, so one
541 * should use them always.
542 */
543
544 list_for_each_entry(encoder, &dev->mode_config.encoder_list, base.head) {
545 struct intel_dp *intel_dp;
546
547 if (encoder->type != INTEL_OUTPUT_EDP)
548 continue;
549
550 intel_dp = enc_to_intel_dp(&encoder->base);
551 intel_dp->pps_pipe = INVALID_PIPE;
552 }
Jani Nikulabf13e812013-09-06 07:40:05 +0300553}
554
555static u32 _pp_ctrl_reg(struct intel_dp *intel_dp)
556{
557 struct drm_device *dev = intel_dp_to_dev(intel_dp);
558
559 if (HAS_PCH_SPLIT(dev))
560 return PCH_PP_CONTROL;
561 else
562 return VLV_PIPE_PP_CONTROL(vlv_power_sequencer_pipe(intel_dp));
563}
564
565static u32 _pp_stat_reg(struct intel_dp *intel_dp)
566{
567 struct drm_device *dev = intel_dp_to_dev(intel_dp);
568
569 if (HAS_PCH_SPLIT(dev))
570 return PCH_PP_STATUS;
571 else
572 return VLV_PIPE_PP_STATUS(vlv_power_sequencer_pipe(intel_dp));
573}
574
Clint Taylor01527b32014-07-07 13:01:46 -0700575/* Reboot notifier handler to shutdown panel power to guarantee T12 timing
576 This function only applicable when panel PM state is not to be tracked */
577static int edp_notify_handler(struct notifier_block *this, unsigned long code,
578 void *unused)
579{
580 struct intel_dp *intel_dp = container_of(this, typeof(* intel_dp),
581 edp_notifier);
582 struct drm_device *dev = intel_dp_to_dev(intel_dp);
583 struct drm_i915_private *dev_priv = dev->dev_private;
584 u32 pp_div;
585 u32 pp_ctrl_reg, pp_div_reg;
Clint Taylor01527b32014-07-07 13:01:46 -0700586
587 if (!is_edp(intel_dp) || code != SYS_RESTART)
588 return 0;
589
Ville Syrjälä773538e82014-09-04 14:54:56 +0300590 pps_lock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300591
Clint Taylor01527b32014-07-07 13:01:46 -0700592 if (IS_VALLEYVIEW(dev)) {
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300593 enum pipe pipe = vlv_power_sequencer_pipe(intel_dp);
594
Clint Taylor01527b32014-07-07 13:01:46 -0700595 pp_ctrl_reg = VLV_PIPE_PP_CONTROL(pipe);
596 pp_div_reg = VLV_PIPE_PP_DIVISOR(pipe);
597 pp_div = I915_READ(pp_div_reg);
598 pp_div &= PP_REFERENCE_DIVIDER_MASK;
599
600 /* 0x1F write to PP_DIV_REG sets max cycle delay */
601 I915_WRITE(pp_div_reg, pp_div | 0x1F);
602 I915_WRITE(pp_ctrl_reg, PANEL_UNLOCK_REGS | PANEL_POWER_OFF);
603 msleep(intel_dp->panel_power_cycle_delay);
604 }
605
Ville Syrjälä773538e82014-09-04 14:54:56 +0300606 pps_unlock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300607
Clint Taylor01527b32014-07-07 13:01:46 -0700608 return 0;
609}
610
Daniel Vetter4be73782014-01-17 14:39:48 +0100611static bool edp_have_panel_power(struct intel_dp *intel_dp)
Keith Packardebf33b12011-09-29 15:53:27 -0700612{
Paulo Zanoni30add222012-10-26 19:05:45 -0200613 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Keith Packardebf33b12011-09-29 15:53:27 -0700614 struct drm_i915_private *dev_priv = dev->dev_private;
615
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300616 lockdep_assert_held(&dev_priv->pps_mutex);
617
Ville Syrjälä9a423562014-10-16 21:29:48 +0300618 if (IS_VALLEYVIEW(dev) &&
619 intel_dp->pps_pipe == INVALID_PIPE)
620 return false;
621
Jani Nikulabf13e812013-09-06 07:40:05 +0300622 return (I915_READ(_pp_stat_reg(intel_dp)) & PP_ON) != 0;
Keith Packardebf33b12011-09-29 15:53:27 -0700623}
624
Daniel Vetter4be73782014-01-17 14:39:48 +0100625static bool edp_have_panel_vdd(struct intel_dp *intel_dp)
Keith Packardebf33b12011-09-29 15:53:27 -0700626{
Paulo Zanoni30add222012-10-26 19:05:45 -0200627 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Keith Packardebf33b12011-09-29 15:53:27 -0700628 struct drm_i915_private *dev_priv = dev->dev_private;
629
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300630 lockdep_assert_held(&dev_priv->pps_mutex);
631
Ville Syrjälä9a423562014-10-16 21:29:48 +0300632 if (IS_VALLEYVIEW(dev) &&
633 intel_dp->pps_pipe == INVALID_PIPE)
634 return false;
635
Ville Syrjälä773538e82014-09-04 14:54:56 +0300636 return I915_READ(_pp_ctrl_reg(intel_dp)) & EDP_FORCE_VDD;
Keith Packardebf33b12011-09-29 15:53:27 -0700637}
638
Keith Packard9b984da2011-09-19 13:54:47 -0700639static void
640intel_dp_check_edp(struct intel_dp *intel_dp)
641{
Paulo Zanoni30add222012-10-26 19:05:45 -0200642 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Keith Packard9b984da2011-09-19 13:54:47 -0700643 struct drm_i915_private *dev_priv = dev->dev_private;
Keith Packardebf33b12011-09-29 15:53:27 -0700644
Keith Packard9b984da2011-09-19 13:54:47 -0700645 if (!is_edp(intel_dp))
646 return;
Jesse Barnes453c5422013-03-28 09:55:41 -0700647
Daniel Vetter4be73782014-01-17 14:39:48 +0100648 if (!edp_have_panel_power(intel_dp) && !edp_have_panel_vdd(intel_dp)) {
Keith Packard9b984da2011-09-19 13:54:47 -0700649 WARN(1, "eDP powered off while attempting aux channel communication.\n");
650 DRM_DEBUG_KMS("Status 0x%08x Control 0x%08x\n",
Jani Nikulabf13e812013-09-06 07:40:05 +0300651 I915_READ(_pp_stat_reg(intel_dp)),
652 I915_READ(_pp_ctrl_reg(intel_dp)));
Keith Packard9b984da2011-09-19 13:54:47 -0700653 }
654}
655
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100656static uint32_t
657intel_dp_aux_wait_done(struct intel_dp *intel_dp, bool has_aux_irq)
658{
659 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
660 struct drm_device *dev = intel_dig_port->base.base.dev;
661 struct drm_i915_private *dev_priv = dev->dev_private;
Paulo Zanoni9ed35ab2013-02-18 19:00:25 -0300662 uint32_t ch_ctl = intel_dp->aux_ch_ctl_reg;
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100663 uint32_t status;
664 bool done;
665
Daniel Vetteref04f002012-12-01 21:03:59 +0100666#define C (((status = I915_READ_NOTRACE(ch_ctl)) & DP_AUX_CH_CTL_SEND_BUSY) == 0)
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100667 if (has_aux_irq)
Paulo Zanonib18ac462013-02-18 19:00:24 -0300668 done = wait_event_timeout(dev_priv->gmbus_wait_queue, C,
Imre Deak35987062013-05-21 20:03:20 +0300669 msecs_to_jiffies_timeout(10));
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100670 else
671 done = wait_for_atomic(C, 10) == 0;
672 if (!done)
673 DRM_ERROR("dp aux hw did not signal timeout (has irq: %i)!\n",
674 has_aux_irq);
675#undef C
676
677 return status;
678}
679
Damien Lespiauec5b01d2014-01-21 13:35:39 +0000680static uint32_t i9xx_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
681{
682 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
683 struct drm_device *dev = intel_dig_port->base.base.dev;
684
685 /*
686 * The clock divider is based off the hrawclk, and would like to run at
687 * 2MHz. So, take the hrawclk value and divide by 2 and use that
688 */
689 return index ? 0 : intel_hrawclk(dev) / 2;
690}
691
692static uint32_t ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
693{
694 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
695 struct drm_device *dev = intel_dig_port->base.base.dev;
696
697 if (index)
698 return 0;
699
700 if (intel_dig_port->port == PORT_A) {
701 if (IS_GEN6(dev) || IS_GEN7(dev))
702 return 200; /* SNB & IVB eDP input clock at 400Mhz */
703 else
704 return 225; /* eDP input clock at 450Mhz */
705 } else {
706 return DIV_ROUND_UP(intel_pch_rawclk(dev), 2);
707 }
708}
709
710static uint32_t hsw_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
Rodrigo Vivib84a1cf2013-07-11 18:44:57 -0300711{
712 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
713 struct drm_device *dev = intel_dig_port->base.base.dev;
714 struct drm_i915_private *dev_priv = dev->dev_private;
715
Damien Lespiauec5b01d2014-01-21 13:35:39 +0000716 if (intel_dig_port->port == PORT_A) {
Chris Wilsonbc866252013-07-21 16:00:03 +0100717 if (index)
718 return 0;
Damien Lespiauec5b01d2014-01-21 13:35:39 +0000719 return DIV_ROUND_CLOSEST(intel_ddi_get_cdclk_freq(dev_priv), 2000);
Rodrigo Vivib84a1cf2013-07-11 18:44:57 -0300720 } else if (dev_priv->pch_id == INTEL_PCH_LPT_DEVICE_ID_TYPE) {
721 /* Workaround for non-ULT HSW */
Chris Wilsonbc866252013-07-21 16:00:03 +0100722 switch (index) {
723 case 0: return 63;
724 case 1: return 72;
725 default: return 0;
726 }
Damien Lespiauec5b01d2014-01-21 13:35:39 +0000727 } else {
Chris Wilsonbc866252013-07-21 16:00:03 +0100728 return index ? 0 : DIV_ROUND_UP(intel_pch_rawclk(dev), 2);
Rodrigo Vivib84a1cf2013-07-11 18:44:57 -0300729 }
730}
731
Damien Lespiauec5b01d2014-01-21 13:35:39 +0000732static uint32_t vlv_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
733{
734 return index ? 0 : 100;
735}
736
Damien Lespiaub6b5e382014-01-20 16:00:59 +0000737static uint32_t skl_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
738{
739 /*
740 * SKL doesn't need us to program the AUX clock divider (Hardware will
741 * derive the clock from CDCLK automatically). We still implement the
742 * get_aux_clock_divider vfunc to plug-in into the existing code.
743 */
744 return index ? 0 : 1;
745}
746
Damien Lespiau5ed12a12014-01-20 15:52:30 +0000747static uint32_t i9xx_get_aux_send_ctl(struct intel_dp *intel_dp,
748 bool has_aux_irq,
749 int send_bytes,
750 uint32_t aux_clock_divider)
751{
752 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
753 struct drm_device *dev = intel_dig_port->base.base.dev;
754 uint32_t precharge, timeout;
755
756 if (IS_GEN6(dev))
757 precharge = 3;
758 else
759 precharge = 5;
760
761 if (IS_BROADWELL(dev) && intel_dp->aux_ch_ctl_reg == DPA_AUX_CH_CTL)
762 timeout = DP_AUX_CH_CTL_TIME_OUT_600us;
763 else
764 timeout = DP_AUX_CH_CTL_TIME_OUT_400us;
765
766 return DP_AUX_CH_CTL_SEND_BUSY |
Damien Lespiau788d4432014-01-20 15:52:31 +0000767 DP_AUX_CH_CTL_DONE |
Damien Lespiau5ed12a12014-01-20 15:52:30 +0000768 (has_aux_irq ? DP_AUX_CH_CTL_INTERRUPT : 0) |
Damien Lespiau788d4432014-01-20 15:52:31 +0000769 DP_AUX_CH_CTL_TIME_OUT_ERROR |
Damien Lespiau5ed12a12014-01-20 15:52:30 +0000770 timeout |
Damien Lespiau788d4432014-01-20 15:52:31 +0000771 DP_AUX_CH_CTL_RECEIVE_ERROR |
Damien Lespiau5ed12a12014-01-20 15:52:30 +0000772 (send_bytes << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) |
773 (precharge << DP_AUX_CH_CTL_PRECHARGE_2US_SHIFT) |
Damien Lespiau788d4432014-01-20 15:52:31 +0000774 (aux_clock_divider << DP_AUX_CH_CTL_BIT_CLOCK_2X_SHIFT);
Damien Lespiau5ed12a12014-01-20 15:52:30 +0000775}
776
Damien Lespiaub9ca5fa2014-01-20 16:01:00 +0000777static uint32_t skl_get_aux_send_ctl(struct intel_dp *intel_dp,
778 bool has_aux_irq,
779 int send_bytes,
780 uint32_t unused)
781{
782 return DP_AUX_CH_CTL_SEND_BUSY |
783 DP_AUX_CH_CTL_DONE |
784 (has_aux_irq ? DP_AUX_CH_CTL_INTERRUPT : 0) |
785 DP_AUX_CH_CTL_TIME_OUT_ERROR |
786 DP_AUX_CH_CTL_TIME_OUT_1600us |
787 DP_AUX_CH_CTL_RECEIVE_ERROR |
788 (send_bytes << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) |
789 DP_AUX_CH_CTL_SYNC_PULSE_SKL(32);
790}
791
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700792static int
Chris Wilsonea5b2132010-08-04 13:50:23 +0100793intel_dp_aux_ch(struct intel_dp *intel_dp,
Daniel Vetterbd9f74a2014-10-02 09:45:35 +0200794 const uint8_t *send, int send_bytes,
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700795 uint8_t *recv, int recv_size)
796{
Paulo Zanoni174edf12012-10-26 19:05:50 -0200797 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
798 struct drm_device *dev = intel_dig_port->base.base.dev;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700799 struct drm_i915_private *dev_priv = dev->dev_private;
Paulo Zanoni9ed35ab2013-02-18 19:00:25 -0300800 uint32_t ch_ctl = intel_dp->aux_ch_ctl_reg;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700801 uint32_t ch_data = ch_ctl + 4;
Chris Wilsonbc866252013-07-21 16:00:03 +0100802 uint32_t aux_clock_divider;
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100803 int i, ret, recv_bytes;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700804 uint32_t status;
Damien Lespiau5ed12a12014-01-20 15:52:30 +0000805 int try, clock = 0;
Daniel Vetter4e6b7882014-02-07 16:33:20 +0100806 bool has_aux_irq = HAS_AUX_IRQ(dev);
Jani Nikula884f19e2014-03-14 16:51:14 +0200807 bool vdd;
808
Ville Syrjälä773538e82014-09-04 14:54:56 +0300809 pps_lock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300810
Ville Syrjälä72c35002014-08-18 22:16:00 +0300811 /*
812 * We will be called with VDD already enabled for dpcd/edid/oui reads.
813 * In such cases we want to leave VDD enabled and it's up to upper layers
814 * to turn it off. But for eg. i2c-dev access we need to turn it on/off
815 * ourselves.
816 */
Ville Syrjälä1e0560e2014-08-19 13:24:25 +0300817 vdd = edp_panel_vdd_on(intel_dp);
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100818
819 /* dp aux is extremely sensitive to irq latency, hence request the
820 * lowest possible wakeup latency and so prevent the cpu from going into
821 * deep sleep states.
822 */
823 pm_qos_update_request(&dev_priv->pm_qos, 0);
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700824
Keith Packard9b984da2011-09-19 13:54:47 -0700825 intel_dp_check_edp(intel_dp);
Zhenyu Wang5eb08b62009-07-24 01:00:31 +0800826
Paulo Zanonic67a4702013-08-19 13:18:09 -0300827 intel_aux_display_runtime_get(dev_priv);
828
Jesse Barnes11bee432011-08-01 15:02:20 -0700829 /* Try to wait for any previous AUX channel activity */
830 for (try = 0; try < 3; try++) {
Daniel Vetteref04f002012-12-01 21:03:59 +0100831 status = I915_READ_NOTRACE(ch_ctl);
Jesse Barnes11bee432011-08-01 15:02:20 -0700832 if ((status & DP_AUX_CH_CTL_SEND_BUSY) == 0)
833 break;
834 msleep(1);
835 }
836
837 if (try == 3) {
838 WARN(1, "dp_aux_ch not started status 0x%08x\n",
839 I915_READ(ch_ctl));
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100840 ret = -EBUSY;
841 goto out;
Chris Wilson4f7f7b72010-08-18 18:12:56 +0100842 }
843
Paulo Zanoni46a5ae92013-09-17 11:14:10 -0300844 /* Only 5 data registers! */
845 if (WARN_ON(send_bytes > 20 || recv_size > 20)) {
846 ret = -E2BIG;
847 goto out;
848 }
849
Damien Lespiauec5b01d2014-01-21 13:35:39 +0000850 while ((aux_clock_divider = intel_dp->get_aux_clock_divider(intel_dp, clock++))) {
Damien Lespiau153b1102014-01-21 13:37:15 +0000851 u32 send_ctl = intel_dp->get_aux_send_ctl(intel_dp,
852 has_aux_irq,
853 send_bytes,
854 aux_clock_divider);
Damien Lespiau5ed12a12014-01-20 15:52:30 +0000855
Chris Wilsonbc866252013-07-21 16:00:03 +0100856 /* Must try at least 3 times according to DP spec */
857 for (try = 0; try < 5; try++) {
858 /* Load the send data into the aux channel data registers */
859 for (i = 0; i < send_bytes; i += 4)
860 I915_WRITE(ch_data + i,
Rodrigo Vivia4f12892014-11-14 08:52:27 -0800861 intel_dp_pack_aux(send + i,
862 send_bytes - i));
Akshay Joshi0206e352011-08-16 15:34:10 -0400863
Chris Wilsonbc866252013-07-21 16:00:03 +0100864 /* Send the command and wait for it to complete */
Damien Lespiau5ed12a12014-01-20 15:52:30 +0000865 I915_WRITE(ch_ctl, send_ctl);
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100866
Chris Wilsonbc866252013-07-21 16:00:03 +0100867 status = intel_dp_aux_wait_done(intel_dp, has_aux_irq);
Akshay Joshi0206e352011-08-16 15:34:10 -0400868
Chris Wilsonbc866252013-07-21 16:00:03 +0100869 /* Clear done status and any errors */
870 I915_WRITE(ch_ctl,
871 status |
872 DP_AUX_CH_CTL_DONE |
873 DP_AUX_CH_CTL_TIME_OUT_ERROR |
874 DP_AUX_CH_CTL_RECEIVE_ERROR);
Adam Jacksond7e96fe2011-07-26 15:39:46 -0400875
Chris Wilsonbc866252013-07-21 16:00:03 +0100876 if (status & (DP_AUX_CH_CTL_TIME_OUT_ERROR |
877 DP_AUX_CH_CTL_RECEIVE_ERROR))
878 continue;
879 if (status & DP_AUX_CH_CTL_DONE)
880 break;
881 }
Chris Wilson4f7f7b72010-08-18 18:12:56 +0100882 if (status & DP_AUX_CH_CTL_DONE)
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700883 break;
884 }
885
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700886 if ((status & DP_AUX_CH_CTL_DONE) == 0) {
Keith Packard1ae8c0a2009-06-28 15:42:17 -0700887 DRM_ERROR("dp_aux_ch not done status 0x%08x\n", status);
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100888 ret = -EBUSY;
889 goto out;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700890 }
891
892 /* Check for timeout or receive error.
893 * Timeouts occur when the sink is not connected
894 */
Keith Packarda5b3da52009-06-11 22:30:32 -0700895 if (status & DP_AUX_CH_CTL_RECEIVE_ERROR) {
Keith Packard1ae8c0a2009-06-28 15:42:17 -0700896 DRM_ERROR("dp_aux_ch receive error status 0x%08x\n", status);
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100897 ret = -EIO;
898 goto out;
Keith Packarda5b3da52009-06-11 22:30:32 -0700899 }
Keith Packard1ae8c0a2009-06-28 15:42:17 -0700900
901 /* Timeouts occur when the device isn't connected, so they're
902 * "normal" -- don't fill the kernel log with these */
Keith Packarda5b3da52009-06-11 22:30:32 -0700903 if (status & DP_AUX_CH_CTL_TIME_OUT_ERROR) {
Zhao Yakui28c97732009-10-09 11:39:41 +0800904 DRM_DEBUG_KMS("dp_aux_ch timeout status 0x%08x\n", status);
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100905 ret = -ETIMEDOUT;
906 goto out;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700907 }
908
909 /* Unload any bytes sent back from the other side */
910 recv_bytes = ((status & DP_AUX_CH_CTL_MESSAGE_SIZE_MASK) >>
911 DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT);
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700912 if (recv_bytes > recv_size)
913 recv_bytes = recv_size;
Akshay Joshi0206e352011-08-16 15:34:10 -0400914
Chris Wilson4f7f7b72010-08-18 18:12:56 +0100915 for (i = 0; i < recv_bytes; i += 4)
Rodrigo Vivia4f12892014-11-14 08:52:27 -0800916 intel_dp_unpack_aux(I915_READ(ch_data + i),
917 recv + i, recv_bytes - i);
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700918
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100919 ret = recv_bytes;
920out:
921 pm_qos_update_request(&dev_priv->pm_qos, PM_QOS_DEFAULT_VALUE);
Paulo Zanonic67a4702013-08-19 13:18:09 -0300922 intel_aux_display_runtime_put(dev_priv);
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100923
Jani Nikula884f19e2014-03-14 16:51:14 +0200924 if (vdd)
925 edp_panel_vdd_off(intel_dp, false);
926
Ville Syrjälä773538e82014-09-04 14:54:56 +0300927 pps_unlock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300928
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100929 return ret;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700930}
931
Jani Nikulaa6c8aff02014-04-07 12:37:25 +0300932#define BARE_ADDRESS_SIZE 3
933#define HEADER_SIZE (BARE_ADDRESS_SIZE + 1)
Jani Nikula9d1a1032014-03-14 16:51:15 +0200934static ssize_t
935intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700936{
Jani Nikula9d1a1032014-03-14 16:51:15 +0200937 struct intel_dp *intel_dp = container_of(aux, struct intel_dp, aux);
938 uint8_t txbuf[20], rxbuf[20];
939 size_t txsize, rxsize;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700940 int ret;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700941
Jani Nikula9d1a1032014-03-14 16:51:15 +0200942 txbuf[0] = msg->request << 4;
943 txbuf[1] = msg->address >> 8;
944 txbuf[2] = msg->address & 0xff;
945 txbuf[3] = msg->size - 1;
Paulo Zanoni46a5ae92013-09-17 11:14:10 -0300946
Jani Nikula9d1a1032014-03-14 16:51:15 +0200947 switch (msg->request & ~DP_AUX_I2C_MOT) {
948 case DP_AUX_NATIVE_WRITE:
949 case DP_AUX_I2C_WRITE:
Jani Nikulaa6c8aff02014-04-07 12:37:25 +0300950 txsize = msg->size ? HEADER_SIZE + msg->size : BARE_ADDRESS_SIZE;
Jani Nikula9d1a1032014-03-14 16:51:15 +0200951 rxsize = 1;
Jani Nikulaf51a44b2014-02-11 11:52:05 +0200952
Jani Nikula9d1a1032014-03-14 16:51:15 +0200953 if (WARN_ON(txsize > 20))
954 return -E2BIG;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700955
Jani Nikula9d1a1032014-03-14 16:51:15 +0200956 memcpy(txbuf + HEADER_SIZE, msg->buffer, msg->size);
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700957
Jani Nikula9d1a1032014-03-14 16:51:15 +0200958 ret = intel_dp_aux_ch(intel_dp, txbuf, txsize, rxbuf, rxsize);
959 if (ret > 0) {
960 msg->reply = rxbuf[0] >> 4;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700961
Jani Nikula9d1a1032014-03-14 16:51:15 +0200962 /* Return payload size. */
963 ret = msg->size;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700964 }
Jani Nikula9d1a1032014-03-14 16:51:15 +0200965 break;
966
967 case DP_AUX_NATIVE_READ:
968 case DP_AUX_I2C_READ:
Jani Nikulaa6c8aff02014-04-07 12:37:25 +0300969 txsize = msg->size ? HEADER_SIZE : BARE_ADDRESS_SIZE;
Jani Nikula9d1a1032014-03-14 16:51:15 +0200970 rxsize = msg->size + 1;
971
972 if (WARN_ON(rxsize > 20))
973 return -E2BIG;
974
975 ret = intel_dp_aux_ch(intel_dp, txbuf, txsize, rxbuf, rxsize);
976 if (ret > 0) {
977 msg->reply = rxbuf[0] >> 4;
978 /*
979 * Assume happy day, and copy the data. The caller is
980 * expected to check msg->reply before touching it.
981 *
982 * Return payload size.
983 */
984 ret--;
985 memcpy(msg->buffer, rxbuf + 1, ret);
986 }
987 break;
988
989 default:
990 ret = -EINVAL;
991 break;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700992 }
Jani Nikulaf51a44b2014-02-11 11:52:05 +0200993
Jani Nikula9d1a1032014-03-14 16:51:15 +0200994 return ret;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700995}
996
Jani Nikula9d1a1032014-03-14 16:51:15 +0200997static void
998intel_dp_aux_init(struct intel_dp *intel_dp, struct intel_connector *connector)
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700999{
Jani Nikula9d1a1032014-03-14 16:51:15 +02001000 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Jani Nikula33ad6622014-03-14 16:51:16 +02001001 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
1002 enum port port = intel_dig_port->port;
Jani Nikula0b998362014-03-14 16:51:17 +02001003 const char *name = NULL;
Dave Airlieab2c0672009-12-04 10:55:24 +10001004 int ret;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001005
Jani Nikula33ad6622014-03-14 16:51:16 +02001006 switch (port) {
1007 case PORT_A:
1008 intel_dp->aux_ch_ctl_reg = DPA_AUX_CH_CTL;
Jani Nikula0b998362014-03-14 16:51:17 +02001009 name = "DPDDC-A";
Dave Airlieab2c0672009-12-04 10:55:24 +10001010 break;
Jani Nikula33ad6622014-03-14 16:51:16 +02001011 case PORT_B:
1012 intel_dp->aux_ch_ctl_reg = PCH_DPB_AUX_CH_CTL;
Jani Nikula0b998362014-03-14 16:51:17 +02001013 name = "DPDDC-B";
Jani Nikula33ad6622014-03-14 16:51:16 +02001014 break;
1015 case PORT_C:
1016 intel_dp->aux_ch_ctl_reg = PCH_DPC_AUX_CH_CTL;
Jani Nikula0b998362014-03-14 16:51:17 +02001017 name = "DPDDC-C";
Jani Nikula33ad6622014-03-14 16:51:16 +02001018 break;
1019 case PORT_D:
1020 intel_dp->aux_ch_ctl_reg = PCH_DPD_AUX_CH_CTL;
Jani Nikula0b998362014-03-14 16:51:17 +02001021 name = "DPDDC-D";
Dave Airlieab2c0672009-12-04 10:55:24 +10001022 break;
1023 default:
Jani Nikula33ad6622014-03-14 16:51:16 +02001024 BUG();
Dave Airlieab2c0672009-12-04 10:55:24 +10001025 }
1026
Damien Lespiau1b1aad72013-12-03 13:56:29 +00001027 /*
1028 * The AUX_CTL register is usually DP_CTL + 0x10.
1029 *
1030 * On Haswell and Broadwell though:
1031 * - Both port A DDI_BUF_CTL and DDI_AUX_CTL are on the CPU
1032 * - Port B/C/D AUX channels are on the PCH, DDI_BUF_CTL on the CPU
1033 *
1034 * Skylake moves AUX_CTL back next to DDI_BUF_CTL, on the CPU.
1035 */
1036 if (!IS_HASWELL(dev) && !IS_BROADWELL(dev))
Jani Nikula33ad6622014-03-14 16:51:16 +02001037 intel_dp->aux_ch_ctl_reg = intel_dp->output_reg + 0x10;
David Flynn8316f332010-12-08 16:10:21 +00001038
Jani Nikula0b998362014-03-14 16:51:17 +02001039 intel_dp->aux.name = name;
Jani Nikula9d1a1032014-03-14 16:51:15 +02001040 intel_dp->aux.dev = dev->dev;
1041 intel_dp->aux.transfer = intel_dp_aux_transfer;
David Flynn8316f332010-12-08 16:10:21 +00001042
Jani Nikula0b998362014-03-14 16:51:17 +02001043 DRM_DEBUG_KMS("registering %s bus for %s\n", name,
1044 connector->base.kdev->kobj.name);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001045
Dave Airlie4f71d0c2014-06-04 16:02:28 +10001046 ret = drm_dp_aux_register(&intel_dp->aux);
Jani Nikula0b998362014-03-14 16:51:17 +02001047 if (ret < 0) {
Dave Airlie4f71d0c2014-06-04 16:02:28 +10001048 DRM_ERROR("drm_dp_aux_register() for %s failed (%d)\n",
Jani Nikula0b998362014-03-14 16:51:17 +02001049 name, ret);
1050 return;
Dave Airlieab2c0672009-12-04 10:55:24 +10001051 }
David Flynn8316f332010-12-08 16:10:21 +00001052
Jani Nikula0b998362014-03-14 16:51:17 +02001053 ret = sysfs_create_link(&connector->base.kdev->kobj,
1054 &intel_dp->aux.ddc.dev.kobj,
1055 intel_dp->aux.ddc.dev.kobj.name);
1056 if (ret < 0) {
1057 DRM_ERROR("sysfs_create_link() for %s failed (%d)\n", name, ret);
Dave Airlie4f71d0c2014-06-04 16:02:28 +10001058 drm_dp_aux_unregister(&intel_dp->aux);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001059 }
1060}
1061
Imre Deak80f65de2014-02-11 17:12:49 +02001062static void
1063intel_dp_connector_unregister(struct intel_connector *intel_connector)
1064{
1065 struct intel_dp *intel_dp = intel_attached_dp(&intel_connector->base);
1066
Dave Airlie0e32b392014-05-02 14:02:48 +10001067 if (!intel_connector->mst_port)
1068 sysfs_remove_link(&intel_connector->base.kdev->kobj,
1069 intel_dp->aux.ddc.dev.kobj.name);
Imre Deak80f65de2014-02-11 17:12:49 +02001070 intel_connector_unregister(intel_connector);
1071}
1072
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001073static void
Sonika Jindalc3346ef2015-02-21 11:12:13 +05301074skl_edp_set_pll_config(struct intel_crtc_state *pipe_config, int link_clock)
Damien Lespiau5416d872014-11-14 17:24:33 +00001075{
1076 u32 ctrl1;
1077
1078 pipe_config->ddi_pll_sel = SKL_DPLL0;
1079 pipe_config->dpll_hw_state.cfgcr1 = 0;
1080 pipe_config->dpll_hw_state.cfgcr2 = 0;
1081
1082 ctrl1 = DPLL_CTRL1_OVERRIDE(SKL_DPLL0);
Sonika Jindalc3346ef2015-02-21 11:12:13 +05301083 switch (link_clock / 2) {
1084 case 81000:
Damien Lespiau5416d872014-11-14 17:24:33 +00001085 ctrl1 |= DPLL_CRTL1_LINK_RATE(DPLL_CRTL1_LINK_RATE_810,
1086 SKL_DPLL0);
1087 break;
Sonika Jindalc3346ef2015-02-21 11:12:13 +05301088 case 135000:
Damien Lespiau5416d872014-11-14 17:24:33 +00001089 ctrl1 |= DPLL_CRTL1_LINK_RATE(DPLL_CRTL1_LINK_RATE_1350,
1090 SKL_DPLL0);
1091 break;
Sonika Jindalc3346ef2015-02-21 11:12:13 +05301092 case 270000:
Damien Lespiau5416d872014-11-14 17:24:33 +00001093 ctrl1 |= DPLL_CRTL1_LINK_RATE(DPLL_CRTL1_LINK_RATE_2700,
1094 SKL_DPLL0);
1095 break;
Sonika Jindalc3346ef2015-02-21 11:12:13 +05301096 case 162000:
1097 ctrl1 |= DPLL_CRTL1_LINK_RATE(DPLL_CRTL1_LINK_RATE_1620,
1098 SKL_DPLL0);
1099 break;
1100 /* TBD: For DP link rates 2.16 GHz and 4.32 GHz, VCO is 8640 which
1101 results in CDCLK change. Need to handle the change of CDCLK by
1102 disabling pipes and re-enabling them */
1103 case 108000:
1104 ctrl1 |= DPLL_CRTL1_LINK_RATE(DPLL_CRTL1_LINK_RATE_1080,
1105 SKL_DPLL0);
1106 break;
1107 case 216000:
1108 ctrl1 |= DPLL_CRTL1_LINK_RATE(DPLL_CRTL1_LINK_RATE_2160,
1109 SKL_DPLL0);
1110 break;
1111
Damien Lespiau5416d872014-11-14 17:24:33 +00001112 }
1113 pipe_config->dpll_hw_state.ctrl1 = ctrl1;
1114}
1115
1116static void
Ander Conselvan de Oliveira5cec2582015-01-15 14:55:21 +02001117hsw_dp_set_ddi_pll_sel(struct intel_crtc_state *pipe_config, int link_bw)
Daniel Vetter0e503382014-07-04 11:26:04 -03001118{
1119 switch (link_bw) {
1120 case DP_LINK_BW_1_62:
1121 pipe_config->ddi_pll_sel = PORT_CLK_SEL_LCPLL_810;
1122 break;
1123 case DP_LINK_BW_2_7:
1124 pipe_config->ddi_pll_sel = PORT_CLK_SEL_LCPLL_1350;
1125 break;
1126 case DP_LINK_BW_5_4:
1127 pipe_config->ddi_pll_sel = PORT_CLK_SEL_LCPLL_2700;
1128 break;
1129 }
1130}
1131
Sonika Jindalfc0f8e22015-03-05 10:03:58 +05301132static int
Ville Syrjälä12f6a2e2015-03-12 17:10:30 +02001133intel_dp_sink_rates(struct intel_dp *intel_dp, const int **sink_rates)
Sonika Jindalfc0f8e22015-03-05 10:03:58 +05301134{
Ville Syrjälä12f6a2e2015-03-12 17:10:30 +02001135 if (intel_dp->num_supported_rates) {
1136 *sink_rates = intel_dp->supported_rates;
Ville Syrjäläea2d8a42015-03-12 17:10:28 +02001137 return intel_dp->num_supported_rates;
Sonika Jindalfc0f8e22015-03-05 10:03:58 +05301138 }
Ville Syrjälä12f6a2e2015-03-12 17:10:30 +02001139
1140 *sink_rates = default_rates;
1141
1142 return (intel_dp_max_link_bw(intel_dp) >> 3) + 1;
Sonika Jindalfc0f8e22015-03-05 10:03:58 +05301143}
1144
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301145static int
Ville Syrjälä1db10e22015-03-12 17:10:32 +02001146intel_dp_source_rates(struct drm_device *dev, const int **source_rates)
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301147{
Ville Syrjälä636280b2015-03-12 17:10:29 +02001148 if (INTEL_INFO(dev)->gen >= 9) {
1149 *source_rates = gen9_rates;
1150 return ARRAY_SIZE(gen9_rates);
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301151 }
Ville Syrjälä636280b2015-03-12 17:10:29 +02001152
1153 *source_rates = default_rates;
1154
Ville Syrjälä1db10e22015-03-12 17:10:32 +02001155 if (IS_SKYLAKE(dev) && INTEL_REVID(dev) <= SKL_REVID_B0)
1156 /* WaDisableHBR2:skl */
1157 return (DP_LINK_BW_2_7 >> 3) + 1;
1158 else if (INTEL_INFO(dev)->gen >= 8 ||
1159 (IS_HASWELL(dev) && !IS_HSW_ULX(dev)))
1160 return (DP_LINK_BW_5_4 >> 3) + 1;
1161 else
1162 return (DP_LINK_BW_2_7 >> 3) + 1;
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301163}
1164
Daniel Vetter0e503382014-07-04 11:26:04 -03001165static void
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001166intel_dp_set_clock(struct intel_encoder *encoder,
Ander Conselvan de Oliveira5cec2582015-01-15 14:55:21 +02001167 struct intel_crtc_state *pipe_config, int link_bw)
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001168{
1169 struct drm_device *dev = encoder->base.dev;
Chon Ming Lee9dd4ffd2013-09-04 01:30:37 +08001170 const struct dp_link_dpll *divisor = NULL;
1171 int i, count = 0;
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001172
1173 if (IS_G4X(dev)) {
Chon Ming Lee9dd4ffd2013-09-04 01:30:37 +08001174 divisor = gen4_dpll;
1175 count = ARRAY_SIZE(gen4_dpll);
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001176 } else if (HAS_PCH_SPLIT(dev)) {
Chon Ming Lee9dd4ffd2013-09-04 01:30:37 +08001177 divisor = pch_dpll;
1178 count = ARRAY_SIZE(pch_dpll);
Chon Ming Leeef9348c2014-04-09 13:28:18 +03001179 } else if (IS_CHERRYVIEW(dev)) {
1180 divisor = chv_dpll;
1181 count = ARRAY_SIZE(chv_dpll);
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001182 } else if (IS_VALLEYVIEW(dev)) {
Chon Ming Lee65ce4bf2013-09-04 01:30:38 +08001183 divisor = vlv_dpll;
1184 count = ARRAY_SIZE(vlv_dpll);
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001185 }
Chon Ming Lee9dd4ffd2013-09-04 01:30:37 +08001186
1187 if (divisor && count) {
1188 for (i = 0; i < count; i++) {
1189 if (link_bw == divisor[i].link_bw) {
1190 pipe_config->dpll = divisor[i].dpll;
1191 pipe_config->clock_set = true;
1192 break;
1193 }
1194 }
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001195 }
1196}
1197
Ville Syrjäläf4896f12015-03-12 17:10:27 +02001198static int intel_supported_rates(const int *source_rates, int source_len,
1199 const int *sink_rates, int sink_len,
1200 int *supported_rates)
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301201{
1202 int i = 0, j = 0, k = 0;
1203
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301204 while (i < source_len && j < sink_len) {
1205 if (source_rates[i] == sink_rates[j]) {
1206 supported_rates[k] = source_rates[i];
1207 ++k;
1208 ++i;
1209 ++j;
1210 } else if (source_rates[i] < sink_rates[j]) {
1211 ++i;
1212 } else {
1213 ++j;
1214 }
1215 }
1216 return k;
1217}
1218
Ville Syrjäläf4896f12015-03-12 17:10:27 +02001219static int rate_to_index(int find, const int *rates)
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301220{
1221 int i = 0;
1222
1223 for (i = 0; i < DP_MAX_SUPPORTED_RATES; ++i)
1224 if (find == rates[i])
1225 break;
1226
1227 return i;
1228}
1229
Paulo Zanoni00c09d72012-10-26 19:05:52 -02001230bool
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01001231intel_dp_compute_config(struct intel_encoder *encoder,
Ander Conselvan de Oliveira5cec2582015-01-15 14:55:21 +02001232 struct intel_crtc_state *pipe_config)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001233{
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01001234 struct drm_device *dev = encoder->base.dev;
Daniel Vetter36008362013-03-27 00:44:59 +01001235 struct drm_i915_private *dev_priv = dev->dev_private;
Ander Conselvan de Oliveira2d112de2015-01-15 14:55:22 +02001236 struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01001237 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Imre Deakbc7d38a2013-05-16 14:40:36 +03001238 enum port port = dp_to_dig_port(intel_dp)->port;
Jesse Barnes2dd24552013-04-25 12:55:01 -07001239 struct intel_crtc *intel_crtc = encoder->new_crtc;
Jani Nikuladd06f902012-10-19 14:51:50 +03001240 struct intel_connector *intel_connector = intel_dp->attached_connector;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001241 int lane_count, clock;
Jani Nikula56071a22014-05-06 14:56:52 +03001242 int min_lane_count = 1;
Paulo Zanonieeb63242014-05-06 14:56:50 +03001243 int max_lane_count = intel_dp_max_lane_count(intel_dp);
Todd Previte06ea66b2014-01-20 10:19:39 -07001244 /* Conveniently, the link BW constants become indices with a shift...*/
Jani Nikula56071a22014-05-06 14:56:52 +03001245 int min_clock = 0;
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301246 int max_clock;
Daniel Vetter083f9562012-04-20 20:23:49 +02001247 int bpp, mode_rate;
Daniel Vetterff9a6752013-06-01 17:16:21 +02001248 int link_avail, link_clock;
Ville Syrjälä12f6a2e2015-03-12 17:10:30 +02001249 const int *sink_rates;
Ville Syrjäläf4896f12015-03-12 17:10:27 +02001250 int supported_rates[8] = {0};
Ville Syrjälä636280b2015-03-12 17:10:29 +02001251 const int *source_rates;
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301252 int source_len, sink_len, supported_len;
1253
Ville Syrjälä12f6a2e2015-03-12 17:10:30 +02001254 sink_len = intel_dp_sink_rates(intel_dp, &sink_rates);
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301255
Ville Syrjälä1db10e22015-03-12 17:10:32 +02001256 source_len = intel_dp_source_rates(dev, &source_rates);
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301257
1258 supported_len = intel_supported_rates(source_rates, source_len,
1259 sink_rates, sink_len, supported_rates);
1260
1261 /* No common link rates between source and sink */
1262 WARN_ON(supported_len <= 0);
1263
1264 max_clock = supported_len - 1;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001265
Imre Deakbc7d38a2013-05-16 14:40:36 +03001266 if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev) && port != PORT_A)
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01001267 pipe_config->has_pch_encoder = true;
1268
Daniel Vetter03afc4a2013-04-02 23:42:31 +02001269 pipe_config->has_dp_encoder = true;
Vandana Kannanf769cd22014-08-05 07:51:22 -07001270 pipe_config->has_drrs = false;
Daniel Vetter9ed109a2014-04-24 23:54:52 +02001271 pipe_config->has_audio = intel_dp->has_audio;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001272
Jani Nikuladd06f902012-10-19 14:51:50 +03001273 if (is_edp(intel_dp) && intel_connector->panel.fixed_mode) {
1274 intel_fixed_panel_mode(intel_connector->panel.fixed_mode,
1275 adjusted_mode);
Jesse Barnes2dd24552013-04-25 12:55:01 -07001276 if (!HAS_PCH_SPLIT(dev))
1277 intel_gmch_panel_fitting(intel_crtc, pipe_config,
1278 intel_connector->panel.fitting_mode);
1279 else
Jesse Barnesb074cec2013-04-25 12:55:02 -07001280 intel_pch_panel_fitting(intel_crtc, pipe_config,
1281 intel_connector->panel.fitting_mode);
Zhao Yakui0d3a1be2010-07-19 09:43:13 +01001282 }
1283
Daniel Vettercb1793c2012-06-04 18:39:21 +02001284 if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK)
Daniel Vetter0af78a22012-05-23 11:30:55 +02001285 return false;
1286
Daniel Vetter083f9562012-04-20 20:23:49 +02001287 DRM_DEBUG_KMS("DP link computation with max lane count %i "
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301288 "max bw %d pixel clock %iKHz\n",
1289 max_lane_count, supported_rates[max_clock],
Damien Lespiau241bfc32013-09-25 16:45:37 +01001290 adjusted_mode->crtc_clock);
Daniel Vetter083f9562012-04-20 20:23:49 +02001291
Daniel Vetter36008362013-03-27 00:44:59 +01001292 /* Walk through all bpp values. Luckily they're all nicely spaced with 2
1293 * bpc in between. */
Daniel Vetter3e7ca982013-06-01 19:45:56 +02001294 bpp = pipe_config->pipe_bpp;
Jani Nikula56071a22014-05-06 14:56:52 +03001295 if (is_edp(intel_dp)) {
1296 if (dev_priv->vbt.edp_bpp && dev_priv->vbt.edp_bpp < bpp) {
1297 DRM_DEBUG_KMS("clamping bpp for eDP panel to BIOS-provided %i\n",
1298 dev_priv->vbt.edp_bpp);
1299 bpp = dev_priv->vbt.edp_bpp;
1300 }
1301
Jani Nikula344c5bb2014-09-09 11:25:13 +03001302 /*
1303 * Use the maximum clock and number of lanes the eDP panel
1304 * advertizes being capable of. The panels are generally
1305 * designed to support only a single clock and lane
1306 * configuration, and typically these values correspond to the
1307 * native resolution of the panel.
1308 */
1309 min_lane_count = max_lane_count;
1310 min_clock = max_clock;
Imre Deak79842112013-07-18 17:44:13 +03001311 }
Daniel Vetter657445f2013-05-04 10:09:18 +02001312
Daniel Vetter36008362013-03-27 00:44:59 +01001313 for (; bpp >= 6*3; bpp -= 2*3) {
Damien Lespiau241bfc32013-09-25 16:45:37 +01001314 mode_rate = intel_dp_link_required(adjusted_mode->crtc_clock,
1315 bpp);
Daniel Vetterc4867932012-04-10 10:42:36 +02001316
Dave Airliec6930992014-07-14 11:04:39 +10001317 for (clock = min_clock; clock <= max_clock; clock++) {
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301318 for (lane_count = min_lane_count;
1319 lane_count <= max_lane_count;
1320 lane_count <<= 1) {
1321
1322 link_clock = supported_rates[clock];
Daniel Vetter36008362013-03-27 00:44:59 +01001323 link_avail = intel_dp_max_data_rate(link_clock,
1324 lane_count);
Ville Syrjälä3685a8f2013-01-17 16:31:28 +02001325
Daniel Vetter36008362013-03-27 00:44:59 +01001326 if (mode_rate <= link_avail) {
1327 goto found;
1328 }
1329 }
1330 }
1331 }
1332
1333 return false;
1334
1335found:
Ville Syrjälä55bc60d2013-01-17 16:31:29 +02001336 if (intel_dp->color_range_auto) {
1337 /*
1338 * See:
1339 * CEA-861-E - 5.1 Default Encoding Parameters
1340 * VESA DisplayPort Ver.1.2a - 5.1.1.1 Video Colorimetry
1341 */
Thierry Reding18316c82012-12-20 15:41:44 +01001342 if (bpp != 18 && drm_match_cea_mode(adjusted_mode) > 1)
Ville Syrjälä55bc60d2013-01-17 16:31:29 +02001343 intel_dp->color_range = DP_COLOR_RANGE_16_235;
1344 else
1345 intel_dp->color_range = 0;
1346 }
1347
Ville Syrjälä3685a8f2013-01-17 16:31:28 +02001348 if (intel_dp->color_range)
Daniel Vetter50f3b012013-03-27 00:44:56 +01001349 pipe_config->limited_color_range = true;
Ville Syrjälä3685a8f2013-01-17 16:31:28 +02001350
Daniel Vetter36008362013-03-27 00:44:59 +01001351 intel_dp->lane_count = lane_count;
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301352
1353 intel_dp->link_bw =
1354 drm_dp_link_rate_to_bw_code(supported_rates[clock]);
1355
1356 if (INTEL_INFO(dev)->gen >= 9 && intel_dp->supported_rates[0]) {
1357 intel_dp->rate_select =
1358 rate_to_index(supported_rates[clock], sink_rates);
1359 intel_dp->link_bw = 0;
1360 }
1361
Daniel Vetter657445f2013-05-04 10:09:18 +02001362 pipe_config->pipe_bpp = bpp;
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301363 pipe_config->port_clock = supported_rates[clock];
Daniel Vetterc4867932012-04-10 10:42:36 +02001364
Daniel Vetter36008362013-03-27 00:44:59 +01001365 DRM_DEBUG_KMS("DP link bw %02x lane count %d clock %d bpp %d\n",
1366 intel_dp->link_bw, intel_dp->lane_count,
Daniel Vetterff9a6752013-06-01 17:16:21 +02001367 pipe_config->port_clock, bpp);
Daniel Vetter36008362013-03-27 00:44:59 +01001368 DRM_DEBUG_KMS("DP link bw required %i available %i\n",
1369 mode_rate, link_avail);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001370
Daniel Vetter03afc4a2013-04-02 23:42:31 +02001371 intel_link_compute_m_n(bpp, lane_count,
Damien Lespiau241bfc32013-09-25 16:45:37 +01001372 adjusted_mode->crtc_clock,
1373 pipe_config->port_clock,
Daniel Vetter03afc4a2013-04-02 23:42:31 +02001374 &pipe_config->dp_m_n);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001375
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05301376 if (intel_connector->panel.downclock_mode != NULL &&
Vandana Kannan96178ee2015-01-10 02:25:56 +05301377 dev_priv->drrs.type == SEAMLESS_DRRS_SUPPORT) {
Vandana Kannanf769cd22014-08-05 07:51:22 -07001378 pipe_config->has_drrs = true;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05301379 intel_link_compute_m_n(bpp, lane_count,
1380 intel_connector->panel.downclock_mode->clock,
1381 pipe_config->port_clock,
1382 &pipe_config->dp_m2_n2);
1383 }
1384
Damien Lespiau5416d872014-11-14 17:24:33 +00001385 if (IS_SKYLAKE(dev) && is_edp(intel_dp))
Sonika Jindalc3346ef2015-02-21 11:12:13 +05301386 skl_edp_set_pll_config(pipe_config, supported_rates[clock]);
Damien Lespiau5416d872014-11-14 17:24:33 +00001387 else if (IS_HASWELL(dev) || IS_BROADWELL(dev))
Daniel Vetter0e503382014-07-04 11:26:04 -03001388 hsw_dp_set_ddi_pll_sel(pipe_config, intel_dp->link_bw);
1389 else
1390 intel_dp_set_clock(encoder, pipe_config, intel_dp->link_bw);
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001391
Daniel Vetter36008362013-03-27 00:44:59 +01001392 return true;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001393}
1394
Daniel Vetter7c62a162013-06-01 17:16:20 +02001395static void ironlake_set_pll_cpu_edp(struct intel_dp *intel_dp)
Daniel Vetterea9b6002012-11-29 15:59:31 +01001396{
Daniel Vetter7c62a162013-06-01 17:16:20 +02001397 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
1398 struct intel_crtc *crtc = to_intel_crtc(dig_port->base.base.crtc);
1399 struct drm_device *dev = crtc->base.dev;
Daniel Vetterea9b6002012-11-29 15:59:31 +01001400 struct drm_i915_private *dev_priv = dev->dev_private;
1401 u32 dpa_ctl;
1402
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001403 DRM_DEBUG_KMS("eDP PLL enable for clock %d\n",
1404 crtc->config->port_clock);
Daniel Vetterea9b6002012-11-29 15:59:31 +01001405 dpa_ctl = I915_READ(DP_A);
1406 dpa_ctl &= ~DP_PLL_FREQ_MASK;
1407
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001408 if (crtc->config->port_clock == 162000) {
Daniel Vetter1ce17032012-11-29 15:59:32 +01001409 /* For a long time we've carried around a ILK-DevA w/a for the
1410 * 160MHz clock. If we're really unlucky, it's still required.
1411 */
1412 DRM_DEBUG_KMS("160MHz cpu eDP clock, might need ilk devA w/a\n");
Daniel Vetterea9b6002012-11-29 15:59:31 +01001413 dpa_ctl |= DP_PLL_FREQ_160MHZ;
Daniel Vetter7c62a162013-06-01 17:16:20 +02001414 intel_dp->DP |= DP_PLL_FREQ_160MHZ;
Daniel Vetterea9b6002012-11-29 15:59:31 +01001415 } else {
1416 dpa_ctl |= DP_PLL_FREQ_270MHZ;
Daniel Vetter7c62a162013-06-01 17:16:20 +02001417 intel_dp->DP |= DP_PLL_FREQ_270MHZ;
Daniel Vetterea9b6002012-11-29 15:59:31 +01001418 }
Daniel Vetter1ce17032012-11-29 15:59:32 +01001419
Daniel Vetterea9b6002012-11-29 15:59:31 +01001420 I915_WRITE(DP_A, dpa_ctl);
1421
1422 POSTING_READ(DP_A);
1423 udelay(500);
1424}
1425
Daniel Vetter8ac33ed2014-04-24 23:54:54 +02001426static void intel_dp_prepare(struct intel_encoder *encoder)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001427{
Daniel Vetterb934223d2013-07-21 21:37:05 +02001428 struct drm_device *dev = encoder->base.dev;
Keith Packard417e8222011-11-01 19:54:11 -07001429 struct drm_i915_private *dev_priv = dev->dev_private;
Daniel Vetterb934223d2013-07-21 21:37:05 +02001430 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Imre Deakbc7d38a2013-05-16 14:40:36 +03001431 enum port port = dp_to_dig_port(intel_dp)->port;
Daniel Vetterb934223d2013-07-21 21:37:05 +02001432 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001433 struct drm_display_mode *adjusted_mode = &crtc->config->base.adjusted_mode;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001434
Keith Packard417e8222011-11-01 19:54:11 -07001435 /*
Keith Packard1a2eb462011-11-16 16:26:07 -08001436 * There are four kinds of DP registers:
Keith Packard417e8222011-11-01 19:54:11 -07001437 *
1438 * IBX PCH
Keith Packard1a2eb462011-11-16 16:26:07 -08001439 * SNB CPU
1440 * IVB CPU
Keith Packard417e8222011-11-01 19:54:11 -07001441 * CPT PCH
1442 *
1443 * IBX PCH and CPU are the same for almost everything,
1444 * except that the CPU DP PLL is configured in this
1445 * register
1446 *
1447 * CPT PCH is quite different, having many bits moved
1448 * to the TRANS_DP_CTL register instead. That
1449 * configuration happens (oddly) in ironlake_pch_enable
1450 */
Adam Jackson9c9e7922010-04-05 17:57:59 -04001451
Keith Packard417e8222011-11-01 19:54:11 -07001452 /* Preserve the BIOS-computed detected bit. This is
1453 * supposed to be read-only.
1454 */
1455 intel_dp->DP = I915_READ(intel_dp->output_reg) & DP_DETECTED;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001456
Keith Packard417e8222011-11-01 19:54:11 -07001457 /* Handle DP bits in common between all three register formats */
Keith Packard417e8222011-11-01 19:54:11 -07001458 intel_dp->DP |= DP_VOLTAGE_0_4 | DP_PRE_EMPHASIS_0;
Daniel Vetter17aa6be2013-04-30 14:01:40 +02001459 intel_dp->DP |= DP_PORT_WIDTH(intel_dp->lane_count);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001460
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001461 if (crtc->config->has_audio)
Chris Wilsonea5b2132010-08-04 13:50:23 +01001462 intel_dp->DP |= DP_AUDIO_OUTPUT_ENABLE;
Paulo Zanoni247d89f2012-10-15 15:51:33 -03001463
Keith Packard417e8222011-11-01 19:54:11 -07001464 /* Split out the IBX/CPU vs CPT settings */
Zhenyu Wang32f9d652009-07-24 01:00:32 +08001465
Imre Deakbc7d38a2013-05-16 14:40:36 +03001466 if (port == PORT_A && IS_GEN7(dev) && !IS_VALLEYVIEW(dev)) {
Keith Packard1a2eb462011-11-16 16:26:07 -08001467 if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
1468 intel_dp->DP |= DP_SYNC_HS_HIGH;
1469 if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
1470 intel_dp->DP |= DP_SYNC_VS_HIGH;
1471 intel_dp->DP |= DP_LINK_TRAIN_OFF_CPT;
1472
Jani Nikula6aba5b62013-10-04 15:08:10 +03001473 if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
Keith Packard1a2eb462011-11-16 16:26:07 -08001474 intel_dp->DP |= DP_ENHANCED_FRAMING;
1475
Daniel Vetter7c62a162013-06-01 17:16:20 +02001476 intel_dp->DP |= crtc->pipe << 29;
Imre Deakbc7d38a2013-05-16 14:40:36 +03001477 } else if (!HAS_PCH_CPT(dev) || port == PORT_A) {
Jesse Barnesb2634012013-03-28 09:55:40 -07001478 if (!HAS_PCH_SPLIT(dev) && !IS_VALLEYVIEW(dev))
Ville Syrjälä3685a8f2013-01-17 16:31:28 +02001479 intel_dp->DP |= intel_dp->color_range;
Keith Packard417e8222011-11-01 19:54:11 -07001480
1481 if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
1482 intel_dp->DP |= DP_SYNC_HS_HIGH;
1483 if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
1484 intel_dp->DP |= DP_SYNC_VS_HIGH;
1485 intel_dp->DP |= DP_LINK_TRAIN_OFF;
1486
Jani Nikula6aba5b62013-10-04 15:08:10 +03001487 if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
Keith Packard417e8222011-11-01 19:54:11 -07001488 intel_dp->DP |= DP_ENHANCED_FRAMING;
1489
Chon Ming Lee44f37d12014-04-09 13:28:21 +03001490 if (!IS_CHERRYVIEW(dev)) {
1491 if (crtc->pipe == 1)
1492 intel_dp->DP |= DP_PIPEB_SELECT;
1493 } else {
1494 intel_dp->DP |= DP_PIPE_SELECT_CHV(crtc->pipe);
1495 }
Keith Packard417e8222011-11-01 19:54:11 -07001496 } else {
1497 intel_dp->DP |= DP_LINK_TRAIN_OFF_CPT;
Zhenyu Wang32f9d652009-07-24 01:00:32 +08001498 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001499}
1500
Paulo Zanoniffd6749d2013-12-19 14:29:42 -02001501#define IDLE_ON_MASK (PP_ON | PP_SEQUENCE_MASK | 0 | PP_SEQUENCE_STATE_MASK)
1502#define IDLE_ON_VALUE (PP_ON | PP_SEQUENCE_NONE | 0 | PP_SEQUENCE_STATE_ON_IDLE)
Keith Packard99ea7122011-11-01 19:57:50 -07001503
Paulo Zanoni1a5ef5b2013-12-19 14:29:43 -02001504#define IDLE_OFF_MASK (PP_ON | PP_SEQUENCE_MASK | 0 | 0)
1505#define IDLE_OFF_VALUE (0 | PP_SEQUENCE_NONE | 0 | 0)
Keith Packard99ea7122011-11-01 19:57:50 -07001506
Paulo Zanoniffd6749d2013-12-19 14:29:42 -02001507#define IDLE_CYCLE_MASK (PP_ON | PP_SEQUENCE_MASK | PP_CYCLE_DELAY_ACTIVE | PP_SEQUENCE_STATE_MASK)
1508#define IDLE_CYCLE_VALUE (0 | PP_SEQUENCE_NONE | 0 | PP_SEQUENCE_STATE_OFF_IDLE)
Keith Packard99ea7122011-11-01 19:57:50 -07001509
Daniel Vetter4be73782014-01-17 14:39:48 +01001510static void wait_panel_status(struct intel_dp *intel_dp,
Keith Packard99ea7122011-11-01 19:57:50 -07001511 u32 mask,
1512 u32 value)
1513{
Paulo Zanoni30add222012-10-26 19:05:45 -02001514 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Keith Packard99ea7122011-11-01 19:57:50 -07001515 struct drm_i915_private *dev_priv = dev->dev_private;
Jesse Barnes453c5422013-03-28 09:55:41 -07001516 u32 pp_stat_reg, pp_ctrl_reg;
1517
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001518 lockdep_assert_held(&dev_priv->pps_mutex);
1519
Jani Nikulabf13e812013-09-06 07:40:05 +03001520 pp_stat_reg = _pp_stat_reg(intel_dp);
1521 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
Keith Packard99ea7122011-11-01 19:57:50 -07001522
1523 DRM_DEBUG_KMS("mask %08x value %08x status %08x control %08x\n",
Jesse Barnes453c5422013-03-28 09:55:41 -07001524 mask, value,
1525 I915_READ(pp_stat_reg),
1526 I915_READ(pp_ctrl_reg));
Keith Packard99ea7122011-11-01 19:57:50 -07001527
Jesse Barnes453c5422013-03-28 09:55:41 -07001528 if (_wait_for((I915_READ(pp_stat_reg) & mask) == value, 5000, 10)) {
Keith Packard99ea7122011-11-01 19:57:50 -07001529 DRM_ERROR("Panel status timeout: status %08x control %08x\n",
Jesse Barnes453c5422013-03-28 09:55:41 -07001530 I915_READ(pp_stat_reg),
1531 I915_READ(pp_ctrl_reg));
Keith Packard99ea7122011-11-01 19:57:50 -07001532 }
Chris Wilson54c136d2013-12-02 09:57:16 +00001533
1534 DRM_DEBUG_KMS("Wait complete\n");
Keith Packard99ea7122011-11-01 19:57:50 -07001535}
1536
Daniel Vetter4be73782014-01-17 14:39:48 +01001537static void wait_panel_on(struct intel_dp *intel_dp)
Keith Packard99ea7122011-11-01 19:57:50 -07001538{
1539 DRM_DEBUG_KMS("Wait for panel power on\n");
Daniel Vetter4be73782014-01-17 14:39:48 +01001540 wait_panel_status(intel_dp, IDLE_ON_MASK, IDLE_ON_VALUE);
Keith Packard99ea7122011-11-01 19:57:50 -07001541}
1542
Daniel Vetter4be73782014-01-17 14:39:48 +01001543static void wait_panel_off(struct intel_dp *intel_dp)
Keith Packardbd943152011-09-18 23:09:52 -07001544{
Keith Packardbd943152011-09-18 23:09:52 -07001545 DRM_DEBUG_KMS("Wait for panel power off time\n");
Daniel Vetter4be73782014-01-17 14:39:48 +01001546 wait_panel_status(intel_dp, IDLE_OFF_MASK, IDLE_OFF_VALUE);
Keith Packardbd943152011-09-18 23:09:52 -07001547}
Keith Packardbd943152011-09-18 23:09:52 -07001548
Daniel Vetter4be73782014-01-17 14:39:48 +01001549static void wait_panel_power_cycle(struct intel_dp *intel_dp)
Keith Packard99ea7122011-11-01 19:57:50 -07001550{
1551 DRM_DEBUG_KMS("Wait for panel power cycle\n");
Paulo Zanonidce56b32013-12-19 14:29:40 -02001552
1553 /* When we disable the VDD override bit last we have to do the manual
1554 * wait. */
1555 wait_remaining_ms_from_jiffies(intel_dp->last_power_cycle,
1556 intel_dp->panel_power_cycle_delay);
1557
Daniel Vetter4be73782014-01-17 14:39:48 +01001558 wait_panel_status(intel_dp, IDLE_CYCLE_MASK, IDLE_CYCLE_VALUE);
Keith Packard99ea7122011-11-01 19:57:50 -07001559}
Keith Packardbd943152011-09-18 23:09:52 -07001560
Daniel Vetter4be73782014-01-17 14:39:48 +01001561static void wait_backlight_on(struct intel_dp *intel_dp)
Paulo Zanonidce56b32013-12-19 14:29:40 -02001562{
1563 wait_remaining_ms_from_jiffies(intel_dp->last_power_on,
1564 intel_dp->backlight_on_delay);
1565}
1566
Daniel Vetter4be73782014-01-17 14:39:48 +01001567static void edp_wait_backlight_off(struct intel_dp *intel_dp)
Paulo Zanonidce56b32013-12-19 14:29:40 -02001568{
1569 wait_remaining_ms_from_jiffies(intel_dp->last_backlight_off,
1570 intel_dp->backlight_off_delay);
1571}
Keith Packard99ea7122011-11-01 19:57:50 -07001572
Keith Packard832dd3c2011-11-01 19:34:06 -07001573/* Read the current pp_control value, unlocking the register if it
1574 * is locked
1575 */
1576
Jesse Barnes453c5422013-03-28 09:55:41 -07001577static u32 ironlake_get_pp_control(struct intel_dp *intel_dp)
Keith Packard832dd3c2011-11-01 19:34:06 -07001578{
Jesse Barnes453c5422013-03-28 09:55:41 -07001579 struct drm_device *dev = intel_dp_to_dev(intel_dp);
1580 struct drm_i915_private *dev_priv = dev->dev_private;
1581 u32 control;
Jesse Barnes453c5422013-03-28 09:55:41 -07001582
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001583 lockdep_assert_held(&dev_priv->pps_mutex);
1584
Jani Nikulabf13e812013-09-06 07:40:05 +03001585 control = I915_READ(_pp_ctrl_reg(intel_dp));
Keith Packard832dd3c2011-11-01 19:34:06 -07001586 control &= ~PANEL_UNLOCK_MASK;
1587 control |= PANEL_UNLOCK_REGS;
1588 return control;
Keith Packardbd943152011-09-18 23:09:52 -07001589}
1590
Ville Syrjälä951468f2014-09-04 14:55:31 +03001591/*
1592 * Must be paired with edp_panel_vdd_off().
1593 * Must hold pps_mutex around the whole on/off sequence.
1594 * Can be nested with intel_edp_panel_vdd_{on,off}() calls.
1595 */
Ville Syrjälä1e0560e2014-08-19 13:24:25 +03001596static bool edp_panel_vdd_on(struct intel_dp *intel_dp)
Jesse Barnes5d613502011-01-24 17:10:54 -08001597{
Paulo Zanoni30add222012-10-26 19:05:45 -02001598 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Imre Deak4e6e1a52014-03-27 17:45:11 +02001599 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
1600 struct intel_encoder *intel_encoder = &intel_dig_port->base;
Jesse Barnes5d613502011-01-24 17:10:54 -08001601 struct drm_i915_private *dev_priv = dev->dev_private;
Imre Deak4e6e1a52014-03-27 17:45:11 +02001602 enum intel_display_power_domain power_domain;
Jesse Barnes5d613502011-01-24 17:10:54 -08001603 u32 pp;
Jesse Barnes453c5422013-03-28 09:55:41 -07001604 u32 pp_stat_reg, pp_ctrl_reg;
Jani Nikulaadddaaf2014-03-14 16:51:13 +02001605 bool need_to_disable = !intel_dp->want_panel_vdd;
Jesse Barnes5d613502011-01-24 17:10:54 -08001606
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001607 lockdep_assert_held(&dev_priv->pps_mutex);
1608
Keith Packard97af61f572011-09-28 16:23:51 -07001609 if (!is_edp(intel_dp))
Jani Nikulaadddaaf2014-03-14 16:51:13 +02001610 return false;
Keith Packardbd943152011-09-18 23:09:52 -07001611
Egbert Eich2c623c12014-11-25 12:54:57 +01001612 cancel_delayed_work(&intel_dp->panel_vdd_work);
Keith Packardbd943152011-09-18 23:09:52 -07001613 intel_dp->want_panel_vdd = true;
Keith Packard99ea7122011-11-01 19:57:50 -07001614
Daniel Vetter4be73782014-01-17 14:39:48 +01001615 if (edp_have_panel_vdd(intel_dp))
Jani Nikulaadddaaf2014-03-14 16:51:13 +02001616 return need_to_disable;
Paulo Zanonib0665d52013-10-30 19:50:27 -02001617
Imre Deak4e6e1a52014-03-27 17:45:11 +02001618 power_domain = intel_display_port_power_domain(intel_encoder);
1619 intel_display_power_get(dev_priv, power_domain);
Paulo Zanonie9cb81a2013-11-21 13:47:23 -02001620
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03001621 DRM_DEBUG_KMS("Turning eDP port %c VDD on\n",
1622 port_name(intel_dig_port->port));
Keith Packardbd943152011-09-18 23:09:52 -07001623
Daniel Vetter4be73782014-01-17 14:39:48 +01001624 if (!edp_have_panel_power(intel_dp))
1625 wait_panel_power_cycle(intel_dp);
Keith Packard99ea7122011-11-01 19:57:50 -07001626
Jesse Barnes453c5422013-03-28 09:55:41 -07001627 pp = ironlake_get_pp_control(intel_dp);
Jesse Barnes5d613502011-01-24 17:10:54 -08001628 pp |= EDP_FORCE_VDD;
Keith Packardebf33b12011-09-29 15:53:27 -07001629
Jani Nikulabf13e812013-09-06 07:40:05 +03001630 pp_stat_reg = _pp_stat_reg(intel_dp);
1631 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
Jesse Barnes453c5422013-03-28 09:55:41 -07001632
1633 I915_WRITE(pp_ctrl_reg, pp);
1634 POSTING_READ(pp_ctrl_reg);
1635 DRM_DEBUG_KMS("PP_STATUS: 0x%08x PP_CONTROL: 0x%08x\n",
1636 I915_READ(pp_stat_reg), I915_READ(pp_ctrl_reg));
Keith Packardebf33b12011-09-29 15:53:27 -07001637 /*
1638 * If the panel wasn't on, delay before accessing aux channel
1639 */
Daniel Vetter4be73782014-01-17 14:39:48 +01001640 if (!edp_have_panel_power(intel_dp)) {
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03001641 DRM_DEBUG_KMS("eDP port %c panel power wasn't enabled\n",
1642 port_name(intel_dig_port->port));
Keith Packardf01eca22011-09-28 16:48:10 -07001643 msleep(intel_dp->panel_power_up_delay);
Keith Packardf01eca22011-09-28 16:48:10 -07001644 }
Jani Nikulaadddaaf2014-03-14 16:51:13 +02001645
1646 return need_to_disable;
1647}
1648
Ville Syrjälä951468f2014-09-04 14:55:31 +03001649/*
1650 * Must be paired with intel_edp_panel_vdd_off() or
1651 * intel_edp_panel_off().
1652 * Nested calls to these functions are not allowed since
1653 * we drop the lock. Caller must use some higher level
1654 * locking to prevent nested calls from other threads.
1655 */
Daniel Vetterb80d6c72014-03-19 15:54:37 +01001656void intel_edp_panel_vdd_on(struct intel_dp *intel_dp)
Jani Nikulaadddaaf2014-03-14 16:51:13 +02001657{
Ville Syrjäläc695b6b2014-08-18 22:16:03 +03001658 bool vdd;
Jani Nikulaadddaaf2014-03-14 16:51:13 +02001659
Ville Syrjäläc695b6b2014-08-18 22:16:03 +03001660 if (!is_edp(intel_dp))
1661 return;
1662
Ville Syrjälä773538e82014-09-04 14:54:56 +03001663 pps_lock(intel_dp);
Ville Syrjäläc695b6b2014-08-18 22:16:03 +03001664 vdd = edp_panel_vdd_on(intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03001665 pps_unlock(intel_dp);
Ville Syrjäläc695b6b2014-08-18 22:16:03 +03001666
Rob Clarke2c719b2014-12-15 13:56:32 -05001667 I915_STATE_WARN(!vdd, "eDP port %c VDD already requested on\n",
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03001668 port_name(dp_to_dig_port(intel_dp)->port));
Jesse Barnes5d613502011-01-24 17:10:54 -08001669}
1670
Daniel Vetter4be73782014-01-17 14:39:48 +01001671static void edp_panel_vdd_off_sync(struct intel_dp *intel_dp)
Jesse Barnes5d613502011-01-24 17:10:54 -08001672{
Paulo Zanoni30add222012-10-26 19:05:45 -02001673 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Jesse Barnes5d613502011-01-24 17:10:54 -08001674 struct drm_i915_private *dev_priv = dev->dev_private;
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03001675 struct intel_digital_port *intel_dig_port =
1676 dp_to_dig_port(intel_dp);
1677 struct intel_encoder *intel_encoder = &intel_dig_port->base;
1678 enum intel_display_power_domain power_domain;
Jesse Barnes5d613502011-01-24 17:10:54 -08001679 u32 pp;
Jesse Barnes453c5422013-03-28 09:55:41 -07001680 u32 pp_stat_reg, pp_ctrl_reg;
Jesse Barnes5d613502011-01-24 17:10:54 -08001681
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001682 lockdep_assert_held(&dev_priv->pps_mutex);
Daniel Vettera0e99e62012-12-02 01:05:46 +01001683
Ville Syrjälä15e899a2014-08-18 22:16:02 +03001684 WARN_ON(intel_dp->want_panel_vdd);
Imre Deak4e6e1a52014-03-27 17:45:11 +02001685
Ville Syrjälä15e899a2014-08-18 22:16:02 +03001686 if (!edp_have_panel_vdd(intel_dp))
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03001687 return;
Paulo Zanonib0665d52013-10-30 19:50:27 -02001688
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03001689 DRM_DEBUG_KMS("Turning eDP port %c VDD off\n",
1690 port_name(intel_dig_port->port));
Jesse Barnes453c5422013-03-28 09:55:41 -07001691
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03001692 pp = ironlake_get_pp_control(intel_dp);
1693 pp &= ~EDP_FORCE_VDD;
Jesse Barnes453c5422013-03-28 09:55:41 -07001694
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03001695 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
1696 pp_stat_reg = _pp_stat_reg(intel_dp);
Jesse Barnes5d613502011-01-24 17:10:54 -08001697
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03001698 I915_WRITE(pp_ctrl_reg, pp);
1699 POSTING_READ(pp_ctrl_reg);
Paulo Zanoni90791a52013-12-06 17:32:42 -02001700
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03001701 /* Make sure sequencer is idle before allowing subsequent activity */
1702 DRM_DEBUG_KMS("PP_STATUS: 0x%08x PP_CONTROL: 0x%08x\n",
1703 I915_READ(pp_stat_reg), I915_READ(pp_ctrl_reg));
Paulo Zanonie9cb81a2013-11-21 13:47:23 -02001704
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03001705 if ((pp & POWER_TARGET_ON) == 0)
1706 intel_dp->last_power_cycle = jiffies;
Paulo Zanonie9cb81a2013-11-21 13:47:23 -02001707
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03001708 power_domain = intel_display_port_power_domain(intel_encoder);
1709 intel_display_power_put(dev_priv, power_domain);
Keith Packardbd943152011-09-18 23:09:52 -07001710}
1711
Daniel Vetter4be73782014-01-17 14:39:48 +01001712static void edp_panel_vdd_work(struct work_struct *__work)
Keith Packardbd943152011-09-18 23:09:52 -07001713{
1714 struct intel_dp *intel_dp = container_of(to_delayed_work(__work),
1715 struct intel_dp, panel_vdd_work);
Keith Packardbd943152011-09-18 23:09:52 -07001716
Ville Syrjälä773538e82014-09-04 14:54:56 +03001717 pps_lock(intel_dp);
Ville Syrjälä15e899a2014-08-18 22:16:02 +03001718 if (!intel_dp->want_panel_vdd)
1719 edp_panel_vdd_off_sync(intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03001720 pps_unlock(intel_dp);
Keith Packardbd943152011-09-18 23:09:52 -07001721}
1722
Imre Deakaba86892014-07-30 15:57:31 +03001723static void edp_panel_vdd_schedule_off(struct intel_dp *intel_dp)
1724{
1725 unsigned long delay;
1726
1727 /*
1728 * Queue the timer to fire a long time from now (relative to the power
1729 * down delay) to keep the panel power up across a sequence of
1730 * operations.
1731 */
1732 delay = msecs_to_jiffies(intel_dp->panel_power_cycle_delay * 5);
1733 schedule_delayed_work(&intel_dp->panel_vdd_work, delay);
1734}
1735
Ville Syrjälä951468f2014-09-04 14:55:31 +03001736/*
1737 * Must be paired with edp_panel_vdd_on().
1738 * Must hold pps_mutex around the whole on/off sequence.
1739 * Can be nested with intel_edp_panel_vdd_{on,off}() calls.
1740 */
Daniel Vetter4be73782014-01-17 14:39:48 +01001741static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync)
Keith Packardbd943152011-09-18 23:09:52 -07001742{
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001743 struct drm_i915_private *dev_priv =
1744 intel_dp_to_dev(intel_dp)->dev_private;
1745
1746 lockdep_assert_held(&dev_priv->pps_mutex);
1747
Keith Packard97af61f572011-09-28 16:23:51 -07001748 if (!is_edp(intel_dp))
1749 return;
Jesse Barnes5d613502011-01-24 17:10:54 -08001750
Rob Clarke2c719b2014-12-15 13:56:32 -05001751 I915_STATE_WARN(!intel_dp->want_panel_vdd, "eDP port %c VDD not forced on",
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03001752 port_name(dp_to_dig_port(intel_dp)->port));
Keith Packardf2e8b182011-11-01 20:01:35 -07001753
Keith Packardbd943152011-09-18 23:09:52 -07001754 intel_dp->want_panel_vdd = false;
1755
Imre Deakaba86892014-07-30 15:57:31 +03001756 if (sync)
Daniel Vetter4be73782014-01-17 14:39:48 +01001757 edp_panel_vdd_off_sync(intel_dp);
Imre Deakaba86892014-07-30 15:57:31 +03001758 else
1759 edp_panel_vdd_schedule_off(intel_dp);
Jesse Barnes5d613502011-01-24 17:10:54 -08001760}
1761
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03001762static void edp_panel_on(struct intel_dp *intel_dp)
Jesse Barnes9934c132010-07-22 13:18:19 -07001763{
Paulo Zanoni30add222012-10-26 19:05:45 -02001764 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Jesse Barnes9934c132010-07-22 13:18:19 -07001765 struct drm_i915_private *dev_priv = dev->dev_private;
Keith Packard99ea7122011-11-01 19:57:50 -07001766 u32 pp;
Jesse Barnes453c5422013-03-28 09:55:41 -07001767 u32 pp_ctrl_reg;
Jesse Barnes9934c132010-07-22 13:18:19 -07001768
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03001769 lockdep_assert_held(&dev_priv->pps_mutex);
1770
Keith Packard97af61f572011-09-28 16:23:51 -07001771 if (!is_edp(intel_dp))
Keith Packardbd943152011-09-18 23:09:52 -07001772 return;
Keith Packard99ea7122011-11-01 19:57:50 -07001773
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03001774 DRM_DEBUG_KMS("Turn eDP port %c panel power on\n",
1775 port_name(dp_to_dig_port(intel_dp)->port));
Keith Packard99ea7122011-11-01 19:57:50 -07001776
Ville Syrjäläe7a89ac2014-10-16 21:30:07 +03001777 if (WARN(edp_have_panel_power(intel_dp),
1778 "eDP port %c panel power already on\n",
1779 port_name(dp_to_dig_port(intel_dp)->port)))
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03001780 return;
Jesse Barnes9934c132010-07-22 13:18:19 -07001781
Daniel Vetter4be73782014-01-17 14:39:48 +01001782 wait_panel_power_cycle(intel_dp);
Jesse Barnes37c6c9b2010-08-11 10:04:43 -07001783
Jani Nikulabf13e812013-09-06 07:40:05 +03001784 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
Jesse Barnes453c5422013-03-28 09:55:41 -07001785 pp = ironlake_get_pp_control(intel_dp);
Keith Packard05ce1a42011-09-29 16:33:01 -07001786 if (IS_GEN5(dev)) {
1787 /* ILK workaround: disable reset around power sequence */
1788 pp &= ~PANEL_POWER_RESET;
Jani Nikulabf13e812013-09-06 07:40:05 +03001789 I915_WRITE(pp_ctrl_reg, pp);
1790 POSTING_READ(pp_ctrl_reg);
Keith Packard05ce1a42011-09-29 16:33:01 -07001791 }
Jesse Barnes37c6c9b2010-08-11 10:04:43 -07001792
Keith Packard1c0ae802011-09-19 13:59:29 -07001793 pp |= POWER_TARGET_ON;
Keith Packard99ea7122011-11-01 19:57:50 -07001794 if (!IS_GEN5(dev))
1795 pp |= PANEL_POWER_RESET;
1796
Jesse Barnes453c5422013-03-28 09:55:41 -07001797 I915_WRITE(pp_ctrl_reg, pp);
1798 POSTING_READ(pp_ctrl_reg);
Jesse Barnes9934c132010-07-22 13:18:19 -07001799
Daniel Vetter4be73782014-01-17 14:39:48 +01001800 wait_panel_on(intel_dp);
Paulo Zanonidce56b32013-12-19 14:29:40 -02001801 intel_dp->last_power_on = jiffies;
Jesse Barnes9934c132010-07-22 13:18:19 -07001802
Keith Packard05ce1a42011-09-29 16:33:01 -07001803 if (IS_GEN5(dev)) {
1804 pp |= PANEL_POWER_RESET; /* restore panel reset bit */
Jani Nikulabf13e812013-09-06 07:40:05 +03001805 I915_WRITE(pp_ctrl_reg, pp);
1806 POSTING_READ(pp_ctrl_reg);
Keith Packard05ce1a42011-09-29 16:33:01 -07001807 }
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03001808}
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001809
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03001810void intel_edp_panel_on(struct intel_dp *intel_dp)
1811{
1812 if (!is_edp(intel_dp))
1813 return;
1814
1815 pps_lock(intel_dp);
1816 edp_panel_on(intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03001817 pps_unlock(intel_dp);
Jesse Barnes9934c132010-07-22 13:18:19 -07001818}
1819
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03001820
1821static void edp_panel_off(struct intel_dp *intel_dp)
Jesse Barnes9934c132010-07-22 13:18:19 -07001822{
Imre Deak4e6e1a52014-03-27 17:45:11 +02001823 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
1824 struct intel_encoder *intel_encoder = &intel_dig_port->base;
Paulo Zanoni30add222012-10-26 19:05:45 -02001825 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Jesse Barnes9934c132010-07-22 13:18:19 -07001826 struct drm_i915_private *dev_priv = dev->dev_private;
Imre Deak4e6e1a52014-03-27 17:45:11 +02001827 enum intel_display_power_domain power_domain;
Keith Packard99ea7122011-11-01 19:57:50 -07001828 u32 pp;
Jesse Barnes453c5422013-03-28 09:55:41 -07001829 u32 pp_ctrl_reg;
Jesse Barnes9934c132010-07-22 13:18:19 -07001830
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03001831 lockdep_assert_held(&dev_priv->pps_mutex);
1832
Keith Packard97af61f572011-09-28 16:23:51 -07001833 if (!is_edp(intel_dp))
1834 return;
Jesse Barnes37c6c9b2010-08-11 10:04:43 -07001835
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03001836 DRM_DEBUG_KMS("Turn eDP port %c panel power off\n",
1837 port_name(dp_to_dig_port(intel_dp)->port));
Jesse Barnes37c6c9b2010-08-11 10:04:43 -07001838
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03001839 WARN(!intel_dp->want_panel_vdd, "Need eDP port %c VDD to turn off panel\n",
1840 port_name(dp_to_dig_port(intel_dp)->port));
Jani Nikula24f3e092014-03-17 16:43:36 +02001841
Jesse Barnes453c5422013-03-28 09:55:41 -07001842 pp = ironlake_get_pp_control(intel_dp);
Daniel Vetter35a38552012-08-12 22:17:14 +02001843 /* We need to switch off panel power _and_ force vdd, for otherwise some
1844 * panels get very unhappy and cease to work. */
Patrik Jakobssonb3064152014-03-04 00:42:44 +01001845 pp &= ~(POWER_TARGET_ON | PANEL_POWER_RESET | EDP_FORCE_VDD |
1846 EDP_BLC_ENABLE);
Jesse Barnes453c5422013-03-28 09:55:41 -07001847
Jani Nikulabf13e812013-09-06 07:40:05 +03001848 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
Jesse Barnes453c5422013-03-28 09:55:41 -07001849
Paulo Zanoni849e39f2014-03-07 20:05:20 -03001850 intel_dp->want_panel_vdd = false;
1851
Jesse Barnes453c5422013-03-28 09:55:41 -07001852 I915_WRITE(pp_ctrl_reg, pp);
1853 POSTING_READ(pp_ctrl_reg);
Jesse Barnes9934c132010-07-22 13:18:19 -07001854
Paulo Zanonidce56b32013-12-19 14:29:40 -02001855 intel_dp->last_power_cycle = jiffies;
Daniel Vetter4be73782014-01-17 14:39:48 +01001856 wait_panel_off(intel_dp);
Paulo Zanoni849e39f2014-03-07 20:05:20 -03001857
1858 /* We got a reference when we enabled the VDD. */
Imre Deak4e6e1a52014-03-27 17:45:11 +02001859 power_domain = intel_display_port_power_domain(intel_encoder);
1860 intel_display_power_put(dev_priv, power_domain);
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03001861}
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001862
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03001863void intel_edp_panel_off(struct intel_dp *intel_dp)
1864{
1865 if (!is_edp(intel_dp))
1866 return;
1867
1868 pps_lock(intel_dp);
1869 edp_panel_off(intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03001870 pps_unlock(intel_dp);
Jesse Barnes9934c132010-07-22 13:18:19 -07001871}
1872
Jani Nikula1250d102014-08-12 17:11:39 +03001873/* Enable backlight in the panel power control. */
1874static void _intel_edp_backlight_on(struct intel_dp *intel_dp)
Zhenyu Wang32f9d652009-07-24 01:00:32 +08001875{
Paulo Zanonida63a9f2012-10-26 19:05:46 -02001876 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
1877 struct drm_device *dev = intel_dig_port->base.base.dev;
Zhenyu Wang32f9d652009-07-24 01:00:32 +08001878 struct drm_i915_private *dev_priv = dev->dev_private;
1879 u32 pp;
Jesse Barnes453c5422013-03-28 09:55:41 -07001880 u32 pp_ctrl_reg;
Zhenyu Wang32f9d652009-07-24 01:00:32 +08001881
Jesse Barnes01cb9ea2010-10-07 16:01:12 -07001882 /*
1883 * If we enable the backlight right away following a panel power
1884 * on, we may see slight flicker as the panel syncs with the eDP
1885 * link. So delay a bit to make sure the image is solid before
1886 * allowing it to appear.
1887 */
Daniel Vetter4be73782014-01-17 14:39:48 +01001888 wait_backlight_on(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001889
Ville Syrjälä773538e82014-09-04 14:54:56 +03001890 pps_lock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001891
Jesse Barnes453c5422013-03-28 09:55:41 -07001892 pp = ironlake_get_pp_control(intel_dp);
Zhenyu Wang32f9d652009-07-24 01:00:32 +08001893 pp |= EDP_BLC_ENABLE;
Jesse Barnes453c5422013-03-28 09:55:41 -07001894
Jani Nikulabf13e812013-09-06 07:40:05 +03001895 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
Jesse Barnes453c5422013-03-28 09:55:41 -07001896
1897 I915_WRITE(pp_ctrl_reg, pp);
1898 POSTING_READ(pp_ctrl_reg);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001899
Ville Syrjälä773538e82014-09-04 14:54:56 +03001900 pps_unlock(intel_dp);
Zhenyu Wang32f9d652009-07-24 01:00:32 +08001901}
1902
Jani Nikula1250d102014-08-12 17:11:39 +03001903/* Enable backlight PWM and backlight PP control. */
1904void intel_edp_backlight_on(struct intel_dp *intel_dp)
1905{
1906 if (!is_edp(intel_dp))
1907 return;
1908
1909 DRM_DEBUG_KMS("\n");
1910
1911 intel_panel_enable_backlight(intel_dp->attached_connector);
1912 _intel_edp_backlight_on(intel_dp);
1913}
1914
1915/* Disable backlight in the panel power control. */
1916static void _intel_edp_backlight_off(struct intel_dp *intel_dp)
Zhenyu Wang32f9d652009-07-24 01:00:32 +08001917{
Paulo Zanoni30add222012-10-26 19:05:45 -02001918 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Zhenyu Wang32f9d652009-07-24 01:00:32 +08001919 struct drm_i915_private *dev_priv = dev->dev_private;
1920 u32 pp;
Jesse Barnes453c5422013-03-28 09:55:41 -07001921 u32 pp_ctrl_reg;
Zhenyu Wang32f9d652009-07-24 01:00:32 +08001922
Keith Packardf01eca22011-09-28 16:48:10 -07001923 if (!is_edp(intel_dp))
1924 return;
1925
Ville Syrjälä773538e82014-09-04 14:54:56 +03001926 pps_lock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001927
Jesse Barnes453c5422013-03-28 09:55:41 -07001928 pp = ironlake_get_pp_control(intel_dp);
Zhenyu Wang32f9d652009-07-24 01:00:32 +08001929 pp &= ~EDP_BLC_ENABLE;
Jesse Barnes453c5422013-03-28 09:55:41 -07001930
Jani Nikulabf13e812013-09-06 07:40:05 +03001931 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
Jesse Barnes453c5422013-03-28 09:55:41 -07001932
1933 I915_WRITE(pp_ctrl_reg, pp);
1934 POSTING_READ(pp_ctrl_reg);
Jesse Barnesf7d23232014-03-31 11:13:56 -07001935
Ville Syrjälä773538e82014-09-04 14:54:56 +03001936 pps_unlock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001937
Paulo Zanonidce56b32013-12-19 14:29:40 -02001938 intel_dp->last_backlight_off = jiffies;
Jesse Barnesf7d23232014-03-31 11:13:56 -07001939 edp_wait_backlight_off(intel_dp);
Jani Nikula1250d102014-08-12 17:11:39 +03001940}
Jesse Barnesf7d23232014-03-31 11:13:56 -07001941
Jani Nikula1250d102014-08-12 17:11:39 +03001942/* Disable backlight PP control and backlight PWM. */
1943void intel_edp_backlight_off(struct intel_dp *intel_dp)
1944{
1945 if (!is_edp(intel_dp))
1946 return;
1947
1948 DRM_DEBUG_KMS("\n");
1949
1950 _intel_edp_backlight_off(intel_dp);
Jesse Barnesf7d23232014-03-31 11:13:56 -07001951 intel_panel_disable_backlight(intel_dp->attached_connector);
Zhenyu Wang32f9d652009-07-24 01:00:32 +08001952}
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001953
Jani Nikula73580fb72014-08-12 17:11:41 +03001954/*
1955 * Hook for controlling the panel power control backlight through the bl_power
1956 * sysfs attribute. Take care to handle multiple calls.
1957 */
1958static void intel_edp_backlight_power(struct intel_connector *connector,
1959 bool enable)
1960{
1961 struct intel_dp *intel_dp = intel_attached_dp(&connector->base);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001962 bool is_enabled;
1963
Ville Syrjälä773538e82014-09-04 14:54:56 +03001964 pps_lock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001965 is_enabled = ironlake_get_pp_control(intel_dp) & EDP_BLC_ENABLE;
Ville Syrjälä773538e82014-09-04 14:54:56 +03001966 pps_unlock(intel_dp);
Jani Nikula73580fb72014-08-12 17:11:41 +03001967
1968 if (is_enabled == enable)
1969 return;
1970
Jani Nikula23ba9372014-08-27 14:08:43 +03001971 DRM_DEBUG_KMS("panel power control backlight %s\n",
1972 enable ? "enable" : "disable");
Jani Nikula73580fb72014-08-12 17:11:41 +03001973
1974 if (enable)
1975 _intel_edp_backlight_on(intel_dp);
1976 else
1977 _intel_edp_backlight_off(intel_dp);
1978}
1979
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02001980static void ironlake_edp_pll_on(struct intel_dp *intel_dp)
Jesse Barnesd240f202010-08-13 15:43:26 -07001981{
Paulo Zanonida63a9f2012-10-26 19:05:46 -02001982 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
1983 struct drm_crtc *crtc = intel_dig_port->base.base.crtc;
1984 struct drm_device *dev = crtc->dev;
Jesse Barnesd240f202010-08-13 15:43:26 -07001985 struct drm_i915_private *dev_priv = dev->dev_private;
1986 u32 dpa_ctl;
1987
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02001988 assert_pipe_disabled(dev_priv,
1989 to_intel_crtc(crtc)->pipe);
1990
Jesse Barnesd240f202010-08-13 15:43:26 -07001991 DRM_DEBUG_KMS("\n");
1992 dpa_ctl = I915_READ(DP_A);
Daniel Vetter07679352012-09-06 22:15:42 +02001993 WARN(dpa_ctl & DP_PLL_ENABLE, "dp pll on, should be off\n");
1994 WARN(dpa_ctl & DP_PORT_EN, "dp port still on, should be off\n");
1995
1996 /* We don't adjust intel_dp->DP while tearing down the link, to
1997 * facilitate link retraining (e.g. after hotplug). Hence clear all
1998 * enable bits here to ensure that we don't enable too much. */
1999 intel_dp->DP &= ~(DP_PORT_EN | DP_AUDIO_OUTPUT_ENABLE);
2000 intel_dp->DP |= DP_PLL_ENABLE;
2001 I915_WRITE(DP_A, intel_dp->DP);
Jesse Barnes298b0b32010-10-07 16:01:24 -07002002 POSTING_READ(DP_A);
2003 udelay(200);
Jesse Barnesd240f202010-08-13 15:43:26 -07002004}
2005
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02002006static void ironlake_edp_pll_off(struct intel_dp *intel_dp)
Jesse Barnesd240f202010-08-13 15:43:26 -07002007{
Paulo Zanonida63a9f2012-10-26 19:05:46 -02002008 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2009 struct drm_crtc *crtc = intel_dig_port->base.base.crtc;
2010 struct drm_device *dev = crtc->dev;
Jesse Barnesd240f202010-08-13 15:43:26 -07002011 struct drm_i915_private *dev_priv = dev->dev_private;
2012 u32 dpa_ctl;
2013
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02002014 assert_pipe_disabled(dev_priv,
2015 to_intel_crtc(crtc)->pipe);
2016
Jesse Barnesd240f202010-08-13 15:43:26 -07002017 dpa_ctl = I915_READ(DP_A);
Daniel Vetter07679352012-09-06 22:15:42 +02002018 WARN((dpa_ctl & DP_PLL_ENABLE) == 0,
2019 "dp pll off, should be on\n");
2020 WARN(dpa_ctl & DP_PORT_EN, "dp port still on, should be off\n");
2021
2022 /* We can't rely on the value tracked for the DP register in
2023 * intel_dp->DP because link_down must not change that (otherwise link
2024 * re-training will fail. */
Jesse Barnes298b0b32010-10-07 16:01:24 -07002025 dpa_ctl &= ~DP_PLL_ENABLE;
Jesse Barnesd240f202010-08-13 15:43:26 -07002026 I915_WRITE(DP_A, dpa_ctl);
Chris Wilson1af5fa12010-09-08 21:07:28 +01002027 POSTING_READ(DP_A);
Jesse Barnesd240f202010-08-13 15:43:26 -07002028 udelay(200);
2029}
2030
Jesse Barnesc7ad3812011-07-07 11:11:03 -07002031/* If the sink supports it, try to set the power state appropriately */
Paulo Zanonic19b0662012-10-15 15:51:41 -03002032void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode)
Jesse Barnesc7ad3812011-07-07 11:11:03 -07002033{
2034 int ret, i;
2035
2036 /* Should have a valid DPCD by this point */
2037 if (intel_dp->dpcd[DP_DPCD_REV] < 0x11)
2038 return;
2039
2040 if (mode != DRM_MODE_DPMS_ON) {
Jani Nikula9d1a1032014-03-14 16:51:15 +02002041 ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_SET_POWER,
2042 DP_SET_POWER_D3);
Jesse Barnesc7ad3812011-07-07 11:11:03 -07002043 } else {
2044 /*
2045 * When turning on, we need to retry for 1ms to give the sink
2046 * time to wake up.
2047 */
2048 for (i = 0; i < 3; i++) {
Jani Nikula9d1a1032014-03-14 16:51:15 +02002049 ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_SET_POWER,
2050 DP_SET_POWER_D0);
Jesse Barnesc7ad3812011-07-07 11:11:03 -07002051 if (ret == 1)
2052 break;
2053 msleep(1);
2054 }
2055 }
Jani Nikulaf9cac722014-09-02 16:33:52 +03002056
2057 if (ret != 1)
2058 DRM_DEBUG_KMS("failed to %s sink power state\n",
2059 mode == DRM_MODE_DPMS_ON ? "enable" : "disable");
Jesse Barnesc7ad3812011-07-07 11:11:03 -07002060}
2061
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002062static bool intel_dp_get_hw_state(struct intel_encoder *encoder,
2063 enum pipe *pipe)
Jesse Barnesd240f202010-08-13 15:43:26 -07002064{
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002065 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Imre Deakbc7d38a2013-05-16 14:40:36 +03002066 enum port port = dp_to_dig_port(intel_dp)->port;
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002067 struct drm_device *dev = encoder->base.dev;
2068 struct drm_i915_private *dev_priv = dev->dev_private;
Imre Deak6d129be2014-03-05 16:20:54 +02002069 enum intel_display_power_domain power_domain;
2070 u32 tmp;
2071
2072 power_domain = intel_display_port_power_domain(encoder);
Daniel Vetterf458ebb2014-09-30 10:56:39 +02002073 if (!intel_display_power_is_enabled(dev_priv, power_domain))
Imre Deak6d129be2014-03-05 16:20:54 +02002074 return false;
2075
2076 tmp = I915_READ(intel_dp->output_reg);
Jesse Barnesd240f202010-08-13 15:43:26 -07002077
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002078 if (!(tmp & DP_PORT_EN))
2079 return false;
2080
Imre Deakbc7d38a2013-05-16 14:40:36 +03002081 if (port == PORT_A && IS_GEN7(dev) && !IS_VALLEYVIEW(dev)) {
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002082 *pipe = PORT_TO_PIPE_CPT(tmp);
Ville Syrjälä71485e02014-04-09 13:28:55 +03002083 } else if (IS_CHERRYVIEW(dev)) {
2084 *pipe = DP_PORT_TO_PIPE_CHV(tmp);
Imre Deakbc7d38a2013-05-16 14:40:36 +03002085 } else if (!HAS_PCH_CPT(dev) || port == PORT_A) {
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002086 *pipe = PORT_TO_PIPE(tmp);
2087 } else {
2088 u32 trans_sel;
2089 u32 trans_dp;
2090 int i;
2091
2092 switch (intel_dp->output_reg) {
2093 case PCH_DP_B:
2094 trans_sel = TRANS_DP_PORT_SEL_B;
2095 break;
2096 case PCH_DP_C:
2097 trans_sel = TRANS_DP_PORT_SEL_C;
2098 break;
2099 case PCH_DP_D:
2100 trans_sel = TRANS_DP_PORT_SEL_D;
2101 break;
2102 default:
2103 return true;
2104 }
2105
Damien Lespiau055e3932014-08-18 13:49:10 +01002106 for_each_pipe(dev_priv, i) {
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002107 trans_dp = I915_READ(TRANS_DP_CTL(i));
2108 if ((trans_dp & TRANS_DP_PORT_SEL_MASK) == trans_sel) {
2109 *pipe = i;
2110 return true;
2111 }
2112 }
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002113
Daniel Vetter4a0833e2012-10-26 10:58:11 +02002114 DRM_DEBUG_KMS("No pipe for dp port 0x%x found\n",
2115 intel_dp->output_reg);
2116 }
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002117
2118 return true;
2119}
2120
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002121static void intel_dp_get_config(struct intel_encoder *encoder,
Ander Conselvan de Oliveira5cec2582015-01-15 14:55:21 +02002122 struct intel_crtc_state *pipe_config)
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002123{
2124 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002125 u32 tmp, flags = 0;
Xiong Zhang63000ef2013-06-28 12:59:06 +08002126 struct drm_device *dev = encoder->base.dev;
2127 struct drm_i915_private *dev_priv = dev->dev_private;
2128 enum port port = dp_to_dig_port(intel_dp)->port;
2129 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
Ville Syrjälä18442d02013-09-13 16:00:08 +03002130 int dotclock;
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002131
Daniel Vetter9ed109a2014-04-24 23:54:52 +02002132 tmp = I915_READ(intel_dp->output_reg);
2133 if (tmp & DP_AUDIO_OUTPUT_ENABLE)
2134 pipe_config->has_audio = true;
2135
Xiong Zhang63000ef2013-06-28 12:59:06 +08002136 if ((port == PORT_A) || !HAS_PCH_CPT(dev)) {
Xiong Zhang63000ef2013-06-28 12:59:06 +08002137 if (tmp & DP_SYNC_HS_HIGH)
2138 flags |= DRM_MODE_FLAG_PHSYNC;
2139 else
2140 flags |= DRM_MODE_FLAG_NHSYNC;
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002141
Xiong Zhang63000ef2013-06-28 12:59:06 +08002142 if (tmp & DP_SYNC_VS_HIGH)
2143 flags |= DRM_MODE_FLAG_PVSYNC;
2144 else
2145 flags |= DRM_MODE_FLAG_NVSYNC;
2146 } else {
2147 tmp = I915_READ(TRANS_DP_CTL(crtc->pipe));
2148 if (tmp & TRANS_DP_HSYNC_ACTIVE_HIGH)
2149 flags |= DRM_MODE_FLAG_PHSYNC;
2150 else
2151 flags |= DRM_MODE_FLAG_NHSYNC;
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002152
Xiong Zhang63000ef2013-06-28 12:59:06 +08002153 if (tmp & TRANS_DP_VSYNC_ACTIVE_HIGH)
2154 flags |= DRM_MODE_FLAG_PVSYNC;
2155 else
2156 flags |= DRM_MODE_FLAG_NVSYNC;
2157 }
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002158
Ander Conselvan de Oliveira2d112de2015-01-15 14:55:22 +02002159 pipe_config->base.adjusted_mode.flags |= flags;
Jesse Barnesf1f644d2013-06-27 00:39:25 +03002160
Ville Syrjälä8c875fc2014-09-12 15:46:29 +03002161 if (!HAS_PCH_SPLIT(dev) && !IS_VALLEYVIEW(dev) &&
2162 tmp & DP_COLOR_RANGE_16_235)
2163 pipe_config->limited_color_range = true;
2164
Ville Syrjäläeb14cb72013-09-10 17:02:54 +03002165 pipe_config->has_dp_encoder = true;
2166
2167 intel_dp_get_m_n(crtc, pipe_config);
2168
Ville Syrjälä18442d02013-09-13 16:00:08 +03002169 if (port == PORT_A) {
Jesse Barnesf1f644d2013-06-27 00:39:25 +03002170 if ((I915_READ(DP_A) & DP_PLL_FREQ_MASK) == DP_PLL_FREQ_160MHZ)
2171 pipe_config->port_clock = 162000;
2172 else
2173 pipe_config->port_clock = 270000;
2174 }
Ville Syrjälä18442d02013-09-13 16:00:08 +03002175
2176 dotclock = intel_dotclock_calculate(pipe_config->port_clock,
2177 &pipe_config->dp_m_n);
2178
2179 if (HAS_PCH_SPLIT(dev_priv->dev) && port != PORT_A)
2180 ironlake_check_encoder_dotclock(pipe_config, dotclock);
2181
Ander Conselvan de Oliveira2d112de2015-01-15 14:55:22 +02002182 pipe_config->base.adjusted_mode.crtc_clock = dotclock;
Daniel Vetter7f16e5c2013-11-04 16:28:47 +01002183
Jani Nikulac6cd2ee2013-10-21 10:52:07 +03002184 if (is_edp(intel_dp) && dev_priv->vbt.edp_bpp &&
2185 pipe_config->pipe_bpp > dev_priv->vbt.edp_bpp) {
2186 /*
2187 * This is a big fat ugly hack.
2188 *
2189 * Some machines in UEFI boot mode provide us a VBT that has 18
2190 * bpp and 1.62 GHz link bandwidth for eDP, which for reasons
2191 * unknown we fail to light up. Yet the same BIOS boots up with
2192 * 24 bpp and 2.7 GHz link. Use the same bpp as the BIOS uses as
2193 * max, not what it tells us to use.
2194 *
2195 * Note: This will still be broken if the eDP panel is not lit
2196 * up by the BIOS, and thus we can't get the mode at module
2197 * load.
2198 */
2199 DRM_DEBUG_KMS("pipe has %d bpp for eDP panel, overriding BIOS-provided max %d bpp\n",
2200 pipe_config->pipe_bpp, dev_priv->vbt.edp_bpp);
2201 dev_priv->vbt.edp_bpp = pipe_config->pipe_bpp;
2202 }
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002203}
2204
Daniel Vettere8cb4552012-07-01 13:05:48 +02002205static void intel_disable_dp(struct intel_encoder *encoder)
Jesse Barnesd240f202010-08-13 15:43:26 -07002206{
Daniel Vettere8cb4552012-07-01 13:05:48 +02002207 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Imre Deak982a3862013-05-23 19:39:40 +03002208 struct drm_device *dev = encoder->base.dev;
Jani Nikula495a5bb2014-10-27 16:26:55 +02002209 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
2210
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02002211 if (crtc->config->has_audio)
Jani Nikula495a5bb2014-10-27 16:26:55 +02002212 intel_audio_codec_disable(encoder);
Daniel Vetter6cb49832012-05-20 17:14:50 +02002213
Rodrigo Vivib32c6f42014-11-20 03:44:37 -08002214 if (HAS_PSR(dev) && !HAS_DDI(dev))
2215 intel_psr_disable(intel_dp);
2216
Daniel Vetter6cb49832012-05-20 17:14:50 +02002217 /* Make sure the panel is off before trying to change the mode. But also
2218 * ensure that we have vdd while we switch off the panel. */
Jani Nikula24f3e092014-03-17 16:43:36 +02002219 intel_edp_panel_vdd_on(intel_dp);
Daniel Vetter4be73782014-01-17 14:39:48 +01002220 intel_edp_backlight_off(intel_dp);
Jani Nikulafdbc3b12013-11-12 17:10:13 +02002221 intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
Daniel Vetter4be73782014-01-17 14:39:48 +01002222 intel_edp_panel_off(intel_dp);
Daniel Vetter37398502012-09-06 22:15:44 +02002223
Ville Syrjälä08aff3f2014-08-18 22:16:09 +03002224 /* disable the port before the pipe on g4x */
2225 if (INTEL_INFO(dev)->gen < 5)
Daniel Vetter37398502012-09-06 22:15:44 +02002226 intel_dp_link_down(intel_dp);
Jesse Barnesd240f202010-08-13 15:43:26 -07002227}
2228
Ville Syrjälä08aff3f2014-08-18 22:16:09 +03002229static void ilk_post_disable_dp(struct intel_encoder *encoder)
Jesse Barnesd240f202010-08-13 15:43:26 -07002230{
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02002231 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Imre Deak982a3862013-05-23 19:39:40 +03002232 enum port port = dp_to_dig_port(intel_dp)->port;
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02002233
Ville Syrjälä49277c32014-03-31 18:21:26 +03002234 intel_dp_link_down(intel_dp);
Ville Syrjälä08aff3f2014-08-18 22:16:09 +03002235 if (port == PORT_A)
2236 ironlake_edp_pll_off(intel_dp);
Ville Syrjälä49277c32014-03-31 18:21:26 +03002237}
2238
2239static void vlv_post_disable_dp(struct intel_encoder *encoder)
2240{
2241 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2242
2243 intel_dp_link_down(intel_dp);
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02002244}
2245
Ville Syrjälä580d3812014-04-09 13:29:00 +03002246static void chv_post_disable_dp(struct intel_encoder *encoder)
2247{
2248 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2249 struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
2250 struct drm_device *dev = encoder->base.dev;
2251 struct drm_i915_private *dev_priv = dev->dev_private;
2252 struct intel_crtc *intel_crtc =
2253 to_intel_crtc(encoder->base.crtc);
2254 enum dpio_channel ch = vlv_dport_to_channel(dport);
2255 enum pipe pipe = intel_crtc->pipe;
2256 u32 val;
2257
2258 intel_dp_link_down(intel_dp);
2259
2260 mutex_lock(&dev_priv->dpio_lock);
2261
2262 /* Propagate soft reset to data lane reset */
Ville Syrjälä97fd4d52014-04-09 13:29:02 +03002263 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch));
Ville Syrjäläd2152b22014-04-28 14:15:24 +03002264 val |= CHV_PCS_REQ_SOFTRESET_EN;
Ville Syrjälä97fd4d52014-04-09 13:29:02 +03002265 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW1(ch), val);
Ville Syrjäläd2152b22014-04-28 14:15:24 +03002266
Ville Syrjälä97fd4d52014-04-09 13:29:02 +03002267 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW1(ch));
2268 val |= CHV_PCS_REQ_SOFTRESET_EN;
2269 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW1(ch), val);
2270
2271 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW0(ch));
Ville Syrjälä580d3812014-04-09 13:29:00 +03002272 val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
Ville Syrjälä97fd4d52014-04-09 13:29:02 +03002273 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW0(ch), val);
2274
2275 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW0(ch));
2276 val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
2277 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val);
Ville Syrjälä580d3812014-04-09 13:29:00 +03002278
2279 mutex_unlock(&dev_priv->dpio_lock);
2280}
2281
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002282static void
2283_intel_dp_set_link_train(struct intel_dp *intel_dp,
2284 uint32_t *DP,
2285 uint8_t dp_train_pat)
2286{
2287 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2288 struct drm_device *dev = intel_dig_port->base.base.dev;
2289 struct drm_i915_private *dev_priv = dev->dev_private;
2290 enum port port = intel_dig_port->port;
2291
2292 if (HAS_DDI(dev)) {
2293 uint32_t temp = I915_READ(DP_TP_CTL(port));
2294
2295 if (dp_train_pat & DP_LINK_SCRAMBLING_DISABLE)
2296 temp |= DP_TP_CTL_SCRAMBLE_DISABLE;
2297 else
2298 temp &= ~DP_TP_CTL_SCRAMBLE_DISABLE;
2299
2300 temp &= ~DP_TP_CTL_LINK_TRAIN_MASK;
2301 switch (dp_train_pat & DP_TRAINING_PATTERN_MASK) {
2302 case DP_TRAINING_PATTERN_DISABLE:
2303 temp |= DP_TP_CTL_LINK_TRAIN_NORMAL;
2304
2305 break;
2306 case DP_TRAINING_PATTERN_1:
2307 temp |= DP_TP_CTL_LINK_TRAIN_PAT1;
2308 break;
2309 case DP_TRAINING_PATTERN_2:
2310 temp |= DP_TP_CTL_LINK_TRAIN_PAT2;
2311 break;
2312 case DP_TRAINING_PATTERN_3:
2313 temp |= DP_TP_CTL_LINK_TRAIN_PAT3;
2314 break;
2315 }
2316 I915_WRITE(DP_TP_CTL(port), temp);
2317
2318 } else if (HAS_PCH_CPT(dev) && (IS_GEN7(dev) || port != PORT_A)) {
2319 *DP &= ~DP_LINK_TRAIN_MASK_CPT;
2320
2321 switch (dp_train_pat & DP_TRAINING_PATTERN_MASK) {
2322 case DP_TRAINING_PATTERN_DISABLE:
2323 *DP |= DP_LINK_TRAIN_OFF_CPT;
2324 break;
2325 case DP_TRAINING_PATTERN_1:
2326 *DP |= DP_LINK_TRAIN_PAT_1_CPT;
2327 break;
2328 case DP_TRAINING_PATTERN_2:
2329 *DP |= DP_LINK_TRAIN_PAT_2_CPT;
2330 break;
2331 case DP_TRAINING_PATTERN_3:
2332 DRM_ERROR("DP training pattern 3 not supported\n");
2333 *DP |= DP_LINK_TRAIN_PAT_2_CPT;
2334 break;
2335 }
2336
2337 } else {
2338 if (IS_CHERRYVIEW(dev))
2339 *DP &= ~DP_LINK_TRAIN_MASK_CHV;
2340 else
2341 *DP &= ~DP_LINK_TRAIN_MASK;
2342
2343 switch (dp_train_pat & DP_TRAINING_PATTERN_MASK) {
2344 case DP_TRAINING_PATTERN_DISABLE:
2345 *DP |= DP_LINK_TRAIN_OFF;
2346 break;
2347 case DP_TRAINING_PATTERN_1:
2348 *DP |= DP_LINK_TRAIN_PAT_1;
2349 break;
2350 case DP_TRAINING_PATTERN_2:
2351 *DP |= DP_LINK_TRAIN_PAT_2;
2352 break;
2353 case DP_TRAINING_PATTERN_3:
2354 if (IS_CHERRYVIEW(dev)) {
2355 *DP |= DP_LINK_TRAIN_PAT_3_CHV;
2356 } else {
2357 DRM_ERROR("DP training pattern 3 not supported\n");
2358 *DP |= DP_LINK_TRAIN_PAT_2;
2359 }
2360 break;
2361 }
2362 }
2363}
2364
2365static void intel_dp_enable_port(struct intel_dp *intel_dp)
2366{
2367 struct drm_device *dev = intel_dp_to_dev(intel_dp);
2368 struct drm_i915_private *dev_priv = dev->dev_private;
2369
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002370 /* enable with pattern 1 (as per spec) */
2371 _intel_dp_set_link_train(intel_dp, &intel_dp->DP,
2372 DP_TRAINING_PATTERN_1);
2373
2374 I915_WRITE(intel_dp->output_reg, intel_dp->DP);
2375 POSTING_READ(intel_dp->output_reg);
Ville Syrjälä7b713f52014-10-16 21:27:35 +03002376
2377 /*
2378 * Magic for VLV/CHV. We _must_ first set up the register
2379 * without actually enabling the port, and then do another
2380 * write to enable the port. Otherwise link training will
2381 * fail when the power sequencer is freshly used for this port.
2382 */
2383 intel_dp->DP |= DP_PORT_EN;
2384
2385 I915_WRITE(intel_dp->output_reg, intel_dp->DP);
2386 POSTING_READ(intel_dp->output_reg);
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002387}
2388
Daniel Vettere8cb4552012-07-01 13:05:48 +02002389static void intel_enable_dp(struct intel_encoder *encoder)
Jesse Barnesd240f202010-08-13 15:43:26 -07002390{
Daniel Vettere8cb4552012-07-01 13:05:48 +02002391 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2392 struct drm_device *dev = encoder->base.dev;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002393 struct drm_i915_private *dev_priv = dev->dev_private;
Jani Nikulac1dec792014-10-27 16:26:56 +02002394 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
Chris Wilsonea5b2132010-08-04 13:50:23 +01002395 uint32_t dp_reg = I915_READ(intel_dp->output_reg);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002396
Daniel Vetter0c33d8d2012-09-06 22:15:43 +02002397 if (WARN_ON(dp_reg & DP_PORT_EN))
2398 return;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002399
Ville Syrjälä093e3f12014-10-16 21:27:33 +03002400 pps_lock(intel_dp);
2401
2402 if (IS_VALLEYVIEW(dev))
2403 vlv_init_panel_power_sequencer(intel_dp);
2404
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002405 intel_dp_enable_port(intel_dp);
Ville Syrjälä093e3f12014-10-16 21:27:33 +03002406
2407 edp_panel_vdd_on(intel_dp);
2408 edp_panel_on(intel_dp);
2409 edp_panel_vdd_off(intel_dp, true);
2410
2411 pps_unlock(intel_dp);
2412
Ville Syrjälä61234fa2014-10-16 21:27:34 +03002413 if (IS_VALLEYVIEW(dev))
2414 vlv_wait_port_ready(dev_priv, dp_to_dig_port(intel_dp));
2415
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002416 intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
2417 intel_dp_start_link_train(intel_dp);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002418 intel_dp_complete_link_train(intel_dp);
Imre Deak3ab9c632013-05-03 12:57:41 +03002419 intel_dp_stop_link_train(intel_dp);
Jani Nikulac1dec792014-10-27 16:26:56 +02002420
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02002421 if (crtc->config->has_audio) {
Jani Nikulac1dec792014-10-27 16:26:56 +02002422 DRM_DEBUG_DRIVER("Enabling DP audio on pipe %c\n",
2423 pipe_name(crtc->pipe));
2424 intel_audio_codec_enable(encoder);
2425 }
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002426}
Jesse Barnes89b667f2013-04-18 14:51:36 -07002427
Jani Nikulaecff4f32013-09-06 07:38:29 +03002428static void g4x_enable_dp(struct intel_encoder *encoder)
2429{
Jani Nikula828f5c62013-09-05 16:44:45 +03002430 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2431
Jani Nikulaecff4f32013-09-06 07:38:29 +03002432 intel_enable_dp(encoder);
Daniel Vetter4be73782014-01-17 14:39:48 +01002433 intel_edp_backlight_on(intel_dp);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002434}
Jesse Barnes89b667f2013-04-18 14:51:36 -07002435
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002436static void vlv_enable_dp(struct intel_encoder *encoder)
2437{
Jani Nikula828f5c62013-09-05 16:44:45 +03002438 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2439
Daniel Vetter4be73782014-01-17 14:39:48 +01002440 intel_edp_backlight_on(intel_dp);
Rodrigo Vivib32c6f42014-11-20 03:44:37 -08002441 intel_psr_enable(intel_dp);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002442}
2443
Jani Nikulaecff4f32013-09-06 07:38:29 +03002444static void g4x_pre_enable_dp(struct intel_encoder *encoder)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002445{
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02002446 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Imre Deakbc7d38a2013-05-16 14:40:36 +03002447 struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002448
Daniel Vetter8ac33ed2014-04-24 23:54:54 +02002449 intel_dp_prepare(encoder);
2450
Daniel Vetterd41f1ef2014-04-24 23:54:53 +02002451 /* Only ilk+ has port A */
2452 if (dport->port == PORT_A) {
2453 ironlake_set_pll_cpu_edp(intel_dp);
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002454 ironlake_edp_pll_on(intel_dp);
Daniel Vetterd41f1ef2014-04-24 23:54:53 +02002455 }
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002456}
2457
Ville Syrjälä83b84592014-10-16 21:29:51 +03002458static void vlv_detach_power_sequencer(struct intel_dp *intel_dp)
2459{
2460 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2461 struct drm_i915_private *dev_priv = intel_dig_port->base.base.dev->dev_private;
2462 enum pipe pipe = intel_dp->pps_pipe;
2463 int pp_on_reg = VLV_PIPE_PP_ON_DELAYS(pipe);
2464
2465 edp_panel_vdd_off_sync(intel_dp);
2466
2467 /*
2468 * VLV seems to get confused when multiple power seqeuencers
2469 * have the same port selected (even if only one has power/vdd
2470 * enabled). The failure manifests as vlv_wait_port_ready() failing
2471 * CHV on the other hand doesn't seem to mind having the same port
2472 * selected in multiple power seqeuencers, but let's clear the
2473 * port select always when logically disconnecting a power sequencer
2474 * from a port.
2475 */
2476 DRM_DEBUG_KMS("detaching pipe %c power sequencer from port %c\n",
2477 pipe_name(pipe), port_name(intel_dig_port->port));
2478 I915_WRITE(pp_on_reg, 0);
2479 POSTING_READ(pp_on_reg);
2480
2481 intel_dp->pps_pipe = INVALID_PIPE;
2482}
2483
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002484static void vlv_steal_power_sequencer(struct drm_device *dev,
2485 enum pipe pipe)
2486{
2487 struct drm_i915_private *dev_priv = dev->dev_private;
2488 struct intel_encoder *encoder;
2489
2490 lockdep_assert_held(&dev_priv->pps_mutex);
2491
Ville Syrjäläac3c12e2014-10-16 21:29:56 +03002492 if (WARN_ON(pipe != PIPE_A && pipe != PIPE_B))
2493 return;
2494
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002495 list_for_each_entry(encoder, &dev->mode_config.encoder_list,
2496 base.head) {
2497 struct intel_dp *intel_dp;
Ville Syrjälä773538e82014-09-04 14:54:56 +03002498 enum port port;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002499
2500 if (encoder->type != INTEL_OUTPUT_EDP)
2501 continue;
2502
2503 intel_dp = enc_to_intel_dp(&encoder->base);
Ville Syrjälä773538e82014-09-04 14:54:56 +03002504 port = dp_to_dig_port(intel_dp)->port;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002505
2506 if (intel_dp->pps_pipe != pipe)
2507 continue;
2508
2509 DRM_DEBUG_KMS("stealing pipe %c power sequencer from port %c\n",
Ville Syrjälä773538e82014-09-04 14:54:56 +03002510 pipe_name(pipe), port_name(port));
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002511
Ville Syrjälä034e43c2014-10-16 21:27:28 +03002512 WARN(encoder->connectors_active,
2513 "stealing pipe %c power sequencer from active eDP port %c\n",
2514 pipe_name(pipe), port_name(port));
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002515
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002516 /* make sure vdd is off before we steal it */
Ville Syrjälä83b84592014-10-16 21:29:51 +03002517 vlv_detach_power_sequencer(intel_dp);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002518 }
2519}
2520
2521static void vlv_init_panel_power_sequencer(struct intel_dp *intel_dp)
2522{
2523 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2524 struct intel_encoder *encoder = &intel_dig_port->base;
2525 struct drm_device *dev = encoder->base.dev;
2526 struct drm_i915_private *dev_priv = dev->dev_private;
2527 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002528
2529 lockdep_assert_held(&dev_priv->pps_mutex);
2530
Ville Syrjälä093e3f12014-10-16 21:27:33 +03002531 if (!is_edp(intel_dp))
2532 return;
2533
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002534 if (intel_dp->pps_pipe == crtc->pipe)
2535 return;
2536
2537 /*
2538 * If another power sequencer was being used on this
2539 * port previously make sure to turn off vdd there while
2540 * we still have control of it.
2541 */
2542 if (intel_dp->pps_pipe != INVALID_PIPE)
Ville Syrjälä83b84592014-10-16 21:29:51 +03002543 vlv_detach_power_sequencer(intel_dp);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002544
2545 /*
2546 * We may be stealing the power
2547 * sequencer from another port.
2548 */
2549 vlv_steal_power_sequencer(dev, crtc->pipe);
2550
2551 /* now it's all ours */
2552 intel_dp->pps_pipe = crtc->pipe;
2553
2554 DRM_DEBUG_KMS("initializing pipe %c power sequencer for port %c\n",
2555 pipe_name(intel_dp->pps_pipe), port_name(intel_dig_port->port));
2556
2557 /* init power sequencer on this pipe and port */
Ville Syrjälä36b5f422014-10-16 21:27:30 +03002558 intel_dp_init_panel_power_sequencer(dev, intel_dp);
2559 intel_dp_init_panel_power_sequencer_registers(dev, intel_dp);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002560}
2561
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002562static void vlv_pre_enable_dp(struct intel_encoder *encoder)
2563{
2564 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2565 struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
Jesse Barnesb2634012013-03-28 09:55:40 -07002566 struct drm_device *dev = encoder->base.dev;
Jesse Barnes89b667f2013-04-18 14:51:36 -07002567 struct drm_i915_private *dev_priv = dev->dev_private;
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002568 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
Chon Ming Leee4607fc2013-11-06 14:36:35 +08002569 enum dpio_channel port = vlv_dport_to_channel(dport);
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002570 int pipe = intel_crtc->pipe;
2571 u32 val;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002572
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002573 mutex_lock(&dev_priv->dpio_lock);
Jesse Barnes89b667f2013-04-18 14:51:36 -07002574
Chon Ming Leeab3c7592013-11-07 10:43:30 +08002575 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW8(port));
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002576 val = 0;
2577 if (pipe)
2578 val |= (1<<21);
2579 else
2580 val &= ~(1<<21);
2581 val |= 0x001000c4;
Chon Ming Leeab3c7592013-11-07 10:43:30 +08002582 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW8(port), val);
2583 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW14(port), 0x00760018);
2584 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW23(port), 0x00400888);
Jesse Barnes89b667f2013-04-18 14:51:36 -07002585
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002586 mutex_unlock(&dev_priv->dpio_lock);
Jesse Barnes89b667f2013-04-18 14:51:36 -07002587
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002588 intel_enable_dp(encoder);
Jesse Barnes89b667f2013-04-18 14:51:36 -07002589}
2590
Jani Nikulaecff4f32013-09-06 07:38:29 +03002591static void vlv_dp_pre_pll_enable(struct intel_encoder *encoder)
Jesse Barnes89b667f2013-04-18 14:51:36 -07002592{
2593 struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
2594 struct drm_device *dev = encoder->base.dev;
2595 struct drm_i915_private *dev_priv = dev->dev_private;
Chon Ming Lee5e69f972013-09-05 20:41:49 +08002596 struct intel_crtc *intel_crtc =
2597 to_intel_crtc(encoder->base.crtc);
Chon Ming Leee4607fc2013-11-06 14:36:35 +08002598 enum dpio_channel port = vlv_dport_to_channel(dport);
Chon Ming Lee5e69f972013-09-05 20:41:49 +08002599 int pipe = intel_crtc->pipe;
Jesse Barnes89b667f2013-04-18 14:51:36 -07002600
Daniel Vetter8ac33ed2014-04-24 23:54:54 +02002601 intel_dp_prepare(encoder);
2602
Jesse Barnes89b667f2013-04-18 14:51:36 -07002603 /* Program Tx lane resets to default */
Chris Wilson0980a602013-07-26 19:57:35 +01002604 mutex_lock(&dev_priv->dpio_lock);
Chon Ming Leeab3c7592013-11-07 10:43:30 +08002605 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port),
Jesse Barnes89b667f2013-04-18 14:51:36 -07002606 DPIO_PCS_TX_LANE2_RESET |
2607 DPIO_PCS_TX_LANE1_RESET);
Chon Ming Leeab3c7592013-11-07 10:43:30 +08002608 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW1(port),
Jesse Barnes89b667f2013-04-18 14:51:36 -07002609 DPIO_PCS_CLK_CRI_RXEB_EIOS_EN |
2610 DPIO_PCS_CLK_CRI_RXDIGFILTSG_EN |
2611 (1<<DPIO_PCS_CLK_DATAWIDTH_SHIFT) |
2612 DPIO_PCS_CLK_SOFT_RESET);
2613
2614 /* Fix up inter-pair skew failure */
Chon Ming Leeab3c7592013-11-07 10:43:30 +08002615 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW12(port), 0x00750f00);
2616 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW11(port), 0x00001500);
2617 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW14(port), 0x40400000);
Chris Wilson0980a602013-07-26 19:57:35 +01002618 mutex_unlock(&dev_priv->dpio_lock);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002619}
2620
Chon Ming Leee4a1d842014-04-09 13:28:20 +03002621static void chv_pre_enable_dp(struct intel_encoder *encoder)
2622{
2623 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2624 struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
2625 struct drm_device *dev = encoder->base.dev;
2626 struct drm_i915_private *dev_priv = dev->dev_private;
Chon Ming Leee4a1d842014-04-09 13:28:20 +03002627 struct intel_crtc *intel_crtc =
2628 to_intel_crtc(encoder->base.crtc);
2629 enum dpio_channel ch = vlv_dport_to_channel(dport);
2630 int pipe = intel_crtc->pipe;
2631 int data, i;
Ville Syrjälä949c1d42014-04-09 13:28:58 +03002632 u32 val;
2633
2634 mutex_lock(&dev_priv->dpio_lock);
2635
Ville Syrjälä570e2a72014-08-18 14:42:46 +03002636 /* allow hardware to manage TX FIFO reset source */
2637 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW11(ch));
2638 val &= ~DPIO_LANEDESKEW_STRAP_OVRD;
2639 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val);
2640
2641 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch));
2642 val &= ~DPIO_LANEDESKEW_STRAP_OVRD;
2643 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val);
2644
Ville Syrjälä949c1d42014-04-09 13:28:58 +03002645 /* Deassert soft data lane reset*/
Ville Syrjälä97fd4d52014-04-09 13:29:02 +03002646 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch));
Ville Syrjäläd2152b22014-04-28 14:15:24 +03002647 val |= CHV_PCS_REQ_SOFTRESET_EN;
Ville Syrjälä97fd4d52014-04-09 13:29:02 +03002648 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW1(ch), val);
Ville Syrjäläd2152b22014-04-28 14:15:24 +03002649
Ville Syrjälä97fd4d52014-04-09 13:29:02 +03002650 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW1(ch));
2651 val |= CHV_PCS_REQ_SOFTRESET_EN;
2652 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW1(ch), val);
2653
2654 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW0(ch));
Ville Syrjälä949c1d42014-04-09 13:28:58 +03002655 val |= (DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
Ville Syrjälä97fd4d52014-04-09 13:29:02 +03002656 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW0(ch), val);
2657
2658 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW0(ch));
2659 val |= (DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
2660 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val);
Chon Ming Leee4a1d842014-04-09 13:28:20 +03002661
2662 /* Program Tx lane latency optimal setting*/
Chon Ming Leee4a1d842014-04-09 13:28:20 +03002663 for (i = 0; i < 4; i++) {
2664 /* Set the latency optimal bit */
2665 data = (i == 1) ? 0x0 : 0x6;
2666 vlv_dpio_write(dev_priv, pipe, CHV_TX_DW11(ch, i),
2667 data << DPIO_FRC_LATENCY_SHFIT);
2668
2669 /* Set the upar bit */
2670 data = (i == 1) ? 0x0 : 0x1;
2671 vlv_dpio_write(dev_priv, pipe, CHV_TX_DW14(ch, i),
2672 data << DPIO_UPAR_SHIFT);
2673 }
2674
2675 /* Data lane stagger programming */
2676 /* FIXME: Fix up value only after power analysis */
2677
2678 mutex_unlock(&dev_priv->dpio_lock);
2679
Chon Ming Leee4a1d842014-04-09 13:28:20 +03002680 intel_enable_dp(encoder);
Chon Ming Leee4a1d842014-04-09 13:28:20 +03002681}
2682
Ville Syrjälä9197c882014-04-09 13:29:05 +03002683static void chv_dp_pre_pll_enable(struct intel_encoder *encoder)
2684{
2685 struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
2686 struct drm_device *dev = encoder->base.dev;
2687 struct drm_i915_private *dev_priv = dev->dev_private;
2688 struct intel_crtc *intel_crtc =
2689 to_intel_crtc(encoder->base.crtc);
2690 enum dpio_channel ch = vlv_dport_to_channel(dport);
2691 enum pipe pipe = intel_crtc->pipe;
2692 u32 val;
2693
Ville Syrjälä625695f2014-06-28 02:04:02 +03002694 intel_dp_prepare(encoder);
2695
Ville Syrjälä9197c882014-04-09 13:29:05 +03002696 mutex_lock(&dev_priv->dpio_lock);
2697
Ville Syrjäläb9e5ac32014-05-27 16:30:18 +03002698 /* program left/right clock distribution */
2699 if (pipe != PIPE_B) {
2700 val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW5_CH0);
2701 val &= ~(CHV_BUFLEFTENA1_MASK | CHV_BUFRIGHTENA1_MASK);
2702 if (ch == DPIO_CH0)
2703 val |= CHV_BUFLEFTENA1_FORCE;
2704 if (ch == DPIO_CH1)
2705 val |= CHV_BUFRIGHTENA1_FORCE;
2706 vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW5_CH0, val);
2707 } else {
2708 val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW1_CH1);
2709 val &= ~(CHV_BUFLEFTENA2_MASK | CHV_BUFRIGHTENA2_MASK);
2710 if (ch == DPIO_CH0)
2711 val |= CHV_BUFLEFTENA2_FORCE;
2712 if (ch == DPIO_CH1)
2713 val |= CHV_BUFRIGHTENA2_FORCE;
2714 vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW1_CH1, val);
2715 }
2716
Ville Syrjälä9197c882014-04-09 13:29:05 +03002717 /* program clock channel usage */
2718 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW8(ch));
2719 val |= CHV_PCS_USEDCLKCHANNEL_OVRRIDE;
2720 if (pipe != PIPE_B)
2721 val &= ~CHV_PCS_USEDCLKCHANNEL;
2722 else
2723 val |= CHV_PCS_USEDCLKCHANNEL;
2724 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW8(ch), val);
2725
2726 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW8(ch));
2727 val |= CHV_PCS_USEDCLKCHANNEL_OVRRIDE;
2728 if (pipe != PIPE_B)
2729 val &= ~CHV_PCS_USEDCLKCHANNEL;
2730 else
2731 val |= CHV_PCS_USEDCLKCHANNEL;
2732 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW8(ch), val);
2733
2734 /*
2735 * This a a bit weird since generally CL
2736 * matches the pipe, but here we need to
2737 * pick the CL based on the port.
2738 */
2739 val = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW19(ch));
2740 if (pipe != PIPE_B)
2741 val &= ~CHV_CMN_USEDCLKCHANNEL;
2742 else
2743 val |= CHV_CMN_USEDCLKCHANNEL;
2744 vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW19(ch), val);
2745
2746 mutex_unlock(&dev_priv->dpio_lock);
2747}
2748
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002749/*
Jesse Barnesdf0c2372011-07-07 11:11:02 -07002750 * Native read with retry for link status and receiver capability reads for
2751 * cases where the sink may still be asleep.
Jani Nikula9d1a1032014-03-14 16:51:15 +02002752 *
2753 * Sinks are *supposed* to come up within 1ms from an off state, but we're also
2754 * supposed to retry 3 times per the spec.
Jesse Barnesdf0c2372011-07-07 11:11:02 -07002755 */
Jani Nikula9d1a1032014-03-14 16:51:15 +02002756static ssize_t
2757intel_dp_dpcd_read_wake(struct drm_dp_aux *aux, unsigned int offset,
2758 void *buffer, size_t size)
Jesse Barnesdf0c2372011-07-07 11:11:02 -07002759{
Jani Nikula9d1a1032014-03-14 16:51:15 +02002760 ssize_t ret;
2761 int i;
Jesse Barnesdf0c2372011-07-07 11:11:02 -07002762
Ville Syrjäläf6a19062014-10-16 20:46:09 +03002763 /*
2764 * Sometime we just get the same incorrect byte repeated
2765 * over the entire buffer. Doing just one throw away read
2766 * initially seems to "solve" it.
2767 */
2768 drm_dp_dpcd_read(aux, DP_DPCD_REV, buffer, 1);
2769
Jesse Barnesdf0c2372011-07-07 11:11:02 -07002770 for (i = 0; i < 3; i++) {
Jani Nikula9d1a1032014-03-14 16:51:15 +02002771 ret = drm_dp_dpcd_read(aux, offset, buffer, size);
2772 if (ret == size)
2773 return ret;
Jesse Barnesdf0c2372011-07-07 11:11:02 -07002774 msleep(1);
2775 }
2776
Jani Nikula9d1a1032014-03-14 16:51:15 +02002777 return ret;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002778}
2779
2780/*
2781 * Fetch AUX CH registers 0x202 - 0x207 which contain
2782 * link status information
2783 */
2784static bool
Keith Packard93f62da2011-11-01 19:45:03 -07002785intel_dp_get_link_status(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_STATUS_SIZE])
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002786{
Jani Nikula9d1a1032014-03-14 16:51:15 +02002787 return intel_dp_dpcd_read_wake(&intel_dp->aux,
2788 DP_LANE0_1_STATUS,
2789 link_status,
2790 DP_LINK_STATUS_SIZE) == DP_LINK_STATUS_SIZE;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002791}
2792
Paulo Zanoni11002442014-06-13 18:45:41 -03002793/* These are source-specific values. */
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002794static uint8_t
Keith Packard1a2eb462011-11-16 16:26:07 -08002795intel_dp_voltage_max(struct intel_dp *intel_dp)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002796{
Paulo Zanoni30add222012-10-26 19:05:45 -02002797 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Sonika Jindal7ad14a22015-02-25 10:29:12 +05302798 struct drm_i915_private *dev_priv = dev->dev_private;
Imre Deakbc7d38a2013-05-16 14:40:36 +03002799 enum port port = dp_to_dig_port(intel_dp)->port;
Keith Packard1a2eb462011-11-16 16:26:07 -08002800
Sonika Jindal7ad14a22015-02-25 10:29:12 +05302801 if (INTEL_INFO(dev)->gen >= 9) {
2802 if (dev_priv->vbt.edp_low_vswing && port == PORT_A)
2803 return DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
Damien Lespiau5a9d1f12013-12-03 13:56:26 +00002804 return DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
Sonika Jindal7ad14a22015-02-25 10:29:12 +05302805 } else if (IS_VALLEYVIEW(dev))
Sonika Jindalbd600182014-08-08 16:23:41 +05302806 return DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
Imre Deakbc7d38a2013-05-16 14:40:36 +03002807 else if (IS_GEN7(dev) && port == PORT_A)
Sonika Jindalbd600182014-08-08 16:23:41 +05302808 return DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
Imre Deakbc7d38a2013-05-16 14:40:36 +03002809 else if (HAS_PCH_CPT(dev) && port != PORT_A)
Sonika Jindalbd600182014-08-08 16:23:41 +05302810 return DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
Keith Packard1a2eb462011-11-16 16:26:07 -08002811 else
Sonika Jindalbd600182014-08-08 16:23:41 +05302812 return DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
Keith Packard1a2eb462011-11-16 16:26:07 -08002813}
2814
2815static uint8_t
2816intel_dp_pre_emphasis_max(struct intel_dp *intel_dp, uint8_t voltage_swing)
2817{
Paulo Zanoni30add222012-10-26 19:05:45 -02002818 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Imre Deakbc7d38a2013-05-16 14:40:36 +03002819 enum port port = dp_to_dig_port(intel_dp)->port;
Keith Packard1a2eb462011-11-16 16:26:07 -08002820
Damien Lespiau5a9d1f12013-12-03 13:56:26 +00002821 if (INTEL_INFO(dev)->gen >= 9) {
2822 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
2823 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
2824 return DP_TRAIN_PRE_EMPH_LEVEL_3;
2825 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
2826 return DP_TRAIN_PRE_EMPH_LEVEL_2;
2827 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
2828 return DP_TRAIN_PRE_EMPH_LEVEL_1;
Sonika Jindal7ad14a22015-02-25 10:29:12 +05302829 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3:
2830 return DP_TRAIN_PRE_EMPH_LEVEL_0;
Damien Lespiau5a9d1f12013-12-03 13:56:26 +00002831 default:
2832 return DP_TRAIN_PRE_EMPH_LEVEL_0;
2833 }
2834 } else if (IS_HASWELL(dev) || IS_BROADWELL(dev)) {
Paulo Zanonid6c0d722012-10-15 15:51:34 -03002835 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05302836 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
2837 return DP_TRAIN_PRE_EMPH_LEVEL_3;
2838 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
2839 return DP_TRAIN_PRE_EMPH_LEVEL_2;
2840 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
2841 return DP_TRAIN_PRE_EMPH_LEVEL_1;
2842 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3:
Paulo Zanonid6c0d722012-10-15 15:51:34 -03002843 default:
Sonika Jindalbd600182014-08-08 16:23:41 +05302844 return DP_TRAIN_PRE_EMPH_LEVEL_0;
Paulo Zanonid6c0d722012-10-15 15:51:34 -03002845 }
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002846 } else if (IS_VALLEYVIEW(dev)) {
2847 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05302848 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
2849 return DP_TRAIN_PRE_EMPH_LEVEL_3;
2850 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
2851 return DP_TRAIN_PRE_EMPH_LEVEL_2;
2852 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
2853 return DP_TRAIN_PRE_EMPH_LEVEL_1;
2854 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002855 default:
Sonika Jindalbd600182014-08-08 16:23:41 +05302856 return DP_TRAIN_PRE_EMPH_LEVEL_0;
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002857 }
Imre Deakbc7d38a2013-05-16 14:40:36 +03002858 } else if (IS_GEN7(dev) && port == PORT_A) {
Keith Packard1a2eb462011-11-16 16:26:07 -08002859 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05302860 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
2861 return DP_TRAIN_PRE_EMPH_LEVEL_2;
2862 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
2863 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
2864 return DP_TRAIN_PRE_EMPH_LEVEL_1;
Keith Packard1a2eb462011-11-16 16:26:07 -08002865 default:
Sonika Jindalbd600182014-08-08 16:23:41 +05302866 return DP_TRAIN_PRE_EMPH_LEVEL_0;
Keith Packard1a2eb462011-11-16 16:26:07 -08002867 }
2868 } else {
2869 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05302870 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
2871 return DP_TRAIN_PRE_EMPH_LEVEL_2;
2872 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
2873 return DP_TRAIN_PRE_EMPH_LEVEL_2;
2874 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
2875 return DP_TRAIN_PRE_EMPH_LEVEL_1;
2876 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3:
Keith Packard1a2eb462011-11-16 16:26:07 -08002877 default:
Sonika Jindalbd600182014-08-08 16:23:41 +05302878 return DP_TRAIN_PRE_EMPH_LEVEL_0;
Keith Packard1a2eb462011-11-16 16:26:07 -08002879 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002880 }
2881}
2882
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002883static uint32_t intel_vlv_signal_levels(struct intel_dp *intel_dp)
2884{
2885 struct drm_device *dev = intel_dp_to_dev(intel_dp);
2886 struct drm_i915_private *dev_priv = dev->dev_private;
2887 struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
Chon Ming Lee5e69f972013-09-05 20:41:49 +08002888 struct intel_crtc *intel_crtc =
2889 to_intel_crtc(dport->base.base.crtc);
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002890 unsigned long demph_reg_value, preemph_reg_value,
2891 uniqtranscale_reg_value;
2892 uint8_t train_set = intel_dp->train_set[0];
Chon Ming Leee4607fc2013-11-06 14:36:35 +08002893 enum dpio_channel port = vlv_dport_to_channel(dport);
Chon Ming Lee5e69f972013-09-05 20:41:49 +08002894 int pipe = intel_crtc->pipe;
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002895
2896 switch (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05302897 case DP_TRAIN_PRE_EMPH_LEVEL_0:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002898 preemph_reg_value = 0x0004000;
2899 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05302900 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002901 demph_reg_value = 0x2B405555;
2902 uniqtranscale_reg_value = 0x552AB83A;
2903 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05302904 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002905 demph_reg_value = 0x2B404040;
2906 uniqtranscale_reg_value = 0x5548B83A;
2907 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05302908 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002909 demph_reg_value = 0x2B245555;
2910 uniqtranscale_reg_value = 0x5560B83A;
2911 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05302912 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002913 demph_reg_value = 0x2B405555;
2914 uniqtranscale_reg_value = 0x5598DA3A;
2915 break;
2916 default:
2917 return 0;
2918 }
2919 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05302920 case DP_TRAIN_PRE_EMPH_LEVEL_1:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002921 preemph_reg_value = 0x0002000;
2922 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05302923 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002924 demph_reg_value = 0x2B404040;
2925 uniqtranscale_reg_value = 0x5552B83A;
2926 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05302927 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002928 demph_reg_value = 0x2B404848;
2929 uniqtranscale_reg_value = 0x5580B83A;
2930 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05302931 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002932 demph_reg_value = 0x2B404040;
2933 uniqtranscale_reg_value = 0x55ADDA3A;
2934 break;
2935 default:
2936 return 0;
2937 }
2938 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05302939 case DP_TRAIN_PRE_EMPH_LEVEL_2:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002940 preemph_reg_value = 0x0000000;
2941 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05302942 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002943 demph_reg_value = 0x2B305555;
2944 uniqtranscale_reg_value = 0x5570B83A;
2945 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05302946 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002947 demph_reg_value = 0x2B2B4040;
2948 uniqtranscale_reg_value = 0x55ADDA3A;
2949 break;
2950 default:
2951 return 0;
2952 }
2953 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05302954 case DP_TRAIN_PRE_EMPH_LEVEL_3:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002955 preemph_reg_value = 0x0006000;
2956 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05302957 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002958 demph_reg_value = 0x1B405555;
2959 uniqtranscale_reg_value = 0x55ADDA3A;
2960 break;
2961 default:
2962 return 0;
2963 }
2964 break;
2965 default:
2966 return 0;
2967 }
2968
Chris Wilson0980a602013-07-26 19:57:35 +01002969 mutex_lock(&dev_priv->dpio_lock);
Chon Ming Leeab3c7592013-11-07 10:43:30 +08002970 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), 0x00000000);
2971 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW4(port), demph_reg_value);
2972 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW2(port),
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002973 uniqtranscale_reg_value);
Chon Ming Leeab3c7592013-11-07 10:43:30 +08002974 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW3(port), 0x0C782040);
2975 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW11(port), 0x00030000);
2976 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW9(port), preemph_reg_value);
2977 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), 0x80000000);
Chris Wilson0980a602013-07-26 19:57:35 +01002978 mutex_unlock(&dev_priv->dpio_lock);
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002979
2980 return 0;
2981}
2982
Chon Ming Leee4a1d842014-04-09 13:28:20 +03002983static uint32_t intel_chv_signal_levels(struct intel_dp *intel_dp)
2984{
2985 struct drm_device *dev = intel_dp_to_dev(intel_dp);
2986 struct drm_i915_private *dev_priv = dev->dev_private;
2987 struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
2988 struct intel_crtc *intel_crtc = to_intel_crtc(dport->base.base.crtc);
Ville Syrjäläf72df8d2014-04-09 13:29:03 +03002989 u32 deemph_reg_value, margin_reg_value, val;
Chon Ming Leee4a1d842014-04-09 13:28:20 +03002990 uint8_t train_set = intel_dp->train_set[0];
2991 enum dpio_channel ch = vlv_dport_to_channel(dport);
Ville Syrjäläf72df8d2014-04-09 13:29:03 +03002992 enum pipe pipe = intel_crtc->pipe;
2993 int i;
Chon Ming Leee4a1d842014-04-09 13:28:20 +03002994
2995 switch (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05302996 case DP_TRAIN_PRE_EMPH_LEVEL_0:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03002997 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05302998 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03002999 deemph_reg_value = 128;
3000 margin_reg_value = 52;
3001 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303002 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003003 deemph_reg_value = 128;
3004 margin_reg_value = 77;
3005 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303006 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003007 deemph_reg_value = 128;
3008 margin_reg_value = 102;
3009 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303010 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003011 deemph_reg_value = 128;
3012 margin_reg_value = 154;
3013 /* FIXME extra to set for 1200 */
3014 break;
3015 default:
3016 return 0;
3017 }
3018 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303019 case DP_TRAIN_PRE_EMPH_LEVEL_1:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003020 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303021 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003022 deemph_reg_value = 85;
3023 margin_reg_value = 78;
3024 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303025 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003026 deemph_reg_value = 85;
3027 margin_reg_value = 116;
3028 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303029 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003030 deemph_reg_value = 85;
3031 margin_reg_value = 154;
3032 break;
3033 default:
3034 return 0;
3035 }
3036 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303037 case DP_TRAIN_PRE_EMPH_LEVEL_2:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003038 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303039 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003040 deemph_reg_value = 64;
3041 margin_reg_value = 104;
3042 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303043 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003044 deemph_reg_value = 64;
3045 margin_reg_value = 154;
3046 break;
3047 default:
3048 return 0;
3049 }
3050 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303051 case DP_TRAIN_PRE_EMPH_LEVEL_3:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003052 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303053 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003054 deemph_reg_value = 43;
3055 margin_reg_value = 154;
3056 break;
3057 default:
3058 return 0;
3059 }
3060 break;
3061 default:
3062 return 0;
3063 }
3064
3065 mutex_lock(&dev_priv->dpio_lock);
3066
3067 /* Clear calc init */
Ville Syrjälä1966e592014-04-09 13:29:04 +03003068 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch));
3069 val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
Ville Syrjäläa02ef3c2014-08-18 14:42:45 +03003070 val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
3071 val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
Ville Syrjälä1966e592014-04-09 13:29:04 +03003072 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val);
3073
3074 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch));
3075 val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
Ville Syrjäläa02ef3c2014-08-18 14:42:45 +03003076 val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
3077 val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
Ville Syrjälä1966e592014-04-09 13:29:04 +03003078 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val);
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003079
Ville Syrjäläa02ef3c2014-08-18 14:42:45 +03003080 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW9(ch));
3081 val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK);
3082 val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000;
3083 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW9(ch), val);
3084
3085 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW9(ch));
3086 val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK);
3087 val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000;
3088 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW9(ch), val);
3089
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003090 /* Program swing deemph */
Ville Syrjäläf72df8d2014-04-09 13:29:03 +03003091 for (i = 0; i < 4; i++) {
3092 val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW4(ch, i));
3093 val &= ~DPIO_SWING_DEEMPH9P5_MASK;
3094 val |= deemph_reg_value << DPIO_SWING_DEEMPH9P5_SHIFT;
3095 vlv_dpio_write(dev_priv, pipe, CHV_TX_DW4(ch, i), val);
3096 }
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003097
3098 /* Program swing margin */
Ville Syrjäläf72df8d2014-04-09 13:29:03 +03003099 for (i = 0; i < 4; i++) {
3100 val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW2(ch, i));
Ville Syrjälä1fb44502014-06-28 02:04:03 +03003101 val &= ~DPIO_SWING_MARGIN000_MASK;
3102 val |= margin_reg_value << DPIO_SWING_MARGIN000_SHIFT;
Ville Syrjäläf72df8d2014-04-09 13:29:03 +03003103 vlv_dpio_write(dev_priv, pipe, CHV_TX_DW2(ch, i), val);
3104 }
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003105
3106 /* Disable unique transition scale */
Ville Syrjäläf72df8d2014-04-09 13:29:03 +03003107 for (i = 0; i < 4; i++) {
3108 val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW3(ch, i));
3109 val &= ~DPIO_TX_UNIQ_TRANS_SCALE_EN;
3110 vlv_dpio_write(dev_priv, pipe, CHV_TX_DW3(ch, i), val);
3111 }
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003112
3113 if (((train_set & DP_TRAIN_PRE_EMPHASIS_MASK)
Sonika Jindalbd600182014-08-08 16:23:41 +05303114 == DP_TRAIN_PRE_EMPH_LEVEL_0) &&
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003115 ((train_set & DP_TRAIN_VOLTAGE_SWING_MASK)
Sonika Jindalbd600182014-08-08 16:23:41 +05303116 == DP_TRAIN_VOLTAGE_SWING_LEVEL_3)) {
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003117
3118 /*
3119 * The document said it needs to set bit 27 for ch0 and bit 26
3120 * for ch1. Might be a typo in the doc.
3121 * For now, for this unique transition scale selection, set bit
3122 * 27 for ch0 and ch1.
3123 */
Ville Syrjäläf72df8d2014-04-09 13:29:03 +03003124 for (i = 0; i < 4; i++) {
3125 val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW3(ch, i));
3126 val |= DPIO_TX_UNIQ_TRANS_SCALE_EN;
3127 vlv_dpio_write(dev_priv, pipe, CHV_TX_DW3(ch, i), val);
3128 }
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003129
Ville Syrjäläf72df8d2014-04-09 13:29:03 +03003130 for (i = 0; i < 4; i++) {
3131 val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW2(ch, i));
3132 val &= ~(0xff << DPIO_UNIQ_TRANS_SCALE_SHIFT);
3133 val |= (0x9a << DPIO_UNIQ_TRANS_SCALE_SHIFT);
3134 vlv_dpio_write(dev_priv, pipe, CHV_TX_DW2(ch, i), val);
3135 }
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003136 }
3137
3138 /* Start swing calculation */
Ville Syrjälä1966e592014-04-09 13:29:04 +03003139 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch));
3140 val |= DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3;
3141 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val);
3142
3143 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch));
3144 val |= DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3;
3145 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val);
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003146
3147 /* LRC Bypass */
3148 val = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW30);
3149 val |= DPIO_LRC_BYPASS;
3150 vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW30, val);
3151
3152 mutex_unlock(&dev_priv->dpio_lock);
3153
3154 return 0;
3155}
3156
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003157static void
Jani Nikula0301b3a2013-10-15 09:36:08 +03003158intel_get_adjust_train(struct intel_dp *intel_dp,
3159 const uint8_t link_status[DP_LINK_STATUS_SIZE])
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003160{
3161 uint8_t v = 0;
3162 uint8_t p = 0;
3163 int lane;
Keith Packard1a2eb462011-11-16 16:26:07 -08003164 uint8_t voltage_max;
3165 uint8_t preemph_max;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003166
Jesse Barnes33a34e42010-09-08 12:42:02 -07003167 for (lane = 0; lane < intel_dp->lane_count; lane++) {
Daniel Vetter0f037bd2012-10-18 10:15:27 +02003168 uint8_t this_v = drm_dp_get_adjust_request_voltage(link_status, lane);
3169 uint8_t this_p = drm_dp_get_adjust_request_pre_emphasis(link_status, lane);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003170
3171 if (this_v > v)
3172 v = this_v;
3173 if (this_p > p)
3174 p = this_p;
3175 }
3176
Keith Packard1a2eb462011-11-16 16:26:07 -08003177 voltage_max = intel_dp_voltage_max(intel_dp);
Keith Packard417e8222011-11-01 19:54:11 -07003178 if (v >= voltage_max)
3179 v = voltage_max | DP_TRAIN_MAX_SWING_REACHED;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003180
Keith Packard1a2eb462011-11-16 16:26:07 -08003181 preemph_max = intel_dp_pre_emphasis_max(intel_dp, v);
3182 if (p >= preemph_max)
3183 p = preemph_max | DP_TRAIN_MAX_PRE_EMPHASIS_REACHED;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003184
3185 for (lane = 0; lane < 4; lane++)
Jesse Barnes33a34e42010-09-08 12:42:02 -07003186 intel_dp->train_set[lane] = v | p;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003187}
3188
3189static uint32_t
Paulo Zanonif0a34242012-12-06 16:51:50 -02003190intel_gen4_signal_levels(uint8_t train_set)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003191{
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003192 uint32_t signal_levels = 0;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003193
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003194 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303195 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003196 default:
3197 signal_levels |= DP_VOLTAGE_0_4;
3198 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303199 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003200 signal_levels |= DP_VOLTAGE_0_6;
3201 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303202 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003203 signal_levels |= DP_VOLTAGE_0_8;
3204 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303205 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003206 signal_levels |= DP_VOLTAGE_1_2;
3207 break;
3208 }
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003209 switch (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303210 case DP_TRAIN_PRE_EMPH_LEVEL_0:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003211 default:
3212 signal_levels |= DP_PRE_EMPHASIS_0;
3213 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303214 case DP_TRAIN_PRE_EMPH_LEVEL_1:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003215 signal_levels |= DP_PRE_EMPHASIS_3_5;
3216 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303217 case DP_TRAIN_PRE_EMPH_LEVEL_2:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003218 signal_levels |= DP_PRE_EMPHASIS_6;
3219 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303220 case DP_TRAIN_PRE_EMPH_LEVEL_3:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003221 signal_levels |= DP_PRE_EMPHASIS_9_5;
3222 break;
3223 }
3224 return signal_levels;
3225}
3226
Zhenyu Wange3421a12010-04-08 09:43:27 +08003227/* Gen6's DP voltage swing and pre-emphasis control */
3228static uint32_t
3229intel_gen6_edp_signal_levels(uint8_t train_set)
3230{
Yuanhan Liu3c5a62b2011-01-06 18:26:08 +08003231 int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK |
3232 DP_TRAIN_PRE_EMPHASIS_MASK);
3233 switch (signal_levels) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303234 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_0:
3235 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_0:
Yuanhan Liu3c5a62b2011-01-06 18:26:08 +08003236 return EDP_LINK_TRAIN_400_600MV_0DB_SNB_B;
Sonika Jindalbd600182014-08-08 16:23:41 +05303237 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_1:
Yuanhan Liu3c5a62b2011-01-06 18:26:08 +08003238 return EDP_LINK_TRAIN_400MV_3_5DB_SNB_B;
Sonika Jindalbd600182014-08-08 16:23:41 +05303239 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_2:
3240 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_2:
Yuanhan Liu3c5a62b2011-01-06 18:26:08 +08003241 return EDP_LINK_TRAIN_400_600MV_6DB_SNB_B;
Sonika Jindalbd600182014-08-08 16:23:41 +05303242 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_1:
3243 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_1:
Yuanhan Liu3c5a62b2011-01-06 18:26:08 +08003244 return EDP_LINK_TRAIN_600_800MV_3_5DB_SNB_B;
Sonika Jindalbd600182014-08-08 16:23:41 +05303245 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_0:
3246 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3 | DP_TRAIN_PRE_EMPH_LEVEL_0:
Yuanhan Liu3c5a62b2011-01-06 18:26:08 +08003247 return EDP_LINK_TRAIN_800_1200MV_0DB_SNB_B;
Zhenyu Wange3421a12010-04-08 09:43:27 +08003248 default:
Yuanhan Liu3c5a62b2011-01-06 18:26:08 +08003249 DRM_DEBUG_KMS("Unsupported voltage swing/pre-emphasis level:"
3250 "0x%x\n", signal_levels);
3251 return EDP_LINK_TRAIN_400_600MV_0DB_SNB_B;
Zhenyu Wange3421a12010-04-08 09:43:27 +08003252 }
3253}
3254
Keith Packard1a2eb462011-11-16 16:26:07 -08003255/* Gen7's DP voltage swing and pre-emphasis control */
3256static uint32_t
3257intel_gen7_edp_signal_levels(uint8_t train_set)
3258{
3259 int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK |
3260 DP_TRAIN_PRE_EMPHASIS_MASK);
3261 switch (signal_levels) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303262 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_0:
Keith Packard1a2eb462011-11-16 16:26:07 -08003263 return EDP_LINK_TRAIN_400MV_0DB_IVB;
Sonika Jindalbd600182014-08-08 16:23:41 +05303264 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_1:
Keith Packard1a2eb462011-11-16 16:26:07 -08003265 return EDP_LINK_TRAIN_400MV_3_5DB_IVB;
Sonika Jindalbd600182014-08-08 16:23:41 +05303266 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_2:
Keith Packard1a2eb462011-11-16 16:26:07 -08003267 return EDP_LINK_TRAIN_400MV_6DB_IVB;
3268
Sonika Jindalbd600182014-08-08 16:23:41 +05303269 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_0:
Keith Packard1a2eb462011-11-16 16:26:07 -08003270 return EDP_LINK_TRAIN_600MV_0DB_IVB;
Sonika Jindalbd600182014-08-08 16:23:41 +05303271 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_1:
Keith Packard1a2eb462011-11-16 16:26:07 -08003272 return EDP_LINK_TRAIN_600MV_3_5DB_IVB;
3273
Sonika Jindalbd600182014-08-08 16:23:41 +05303274 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_0:
Keith Packard1a2eb462011-11-16 16:26:07 -08003275 return EDP_LINK_TRAIN_800MV_0DB_IVB;
Sonika Jindalbd600182014-08-08 16:23:41 +05303276 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_1:
Keith Packard1a2eb462011-11-16 16:26:07 -08003277 return EDP_LINK_TRAIN_800MV_3_5DB_IVB;
3278
3279 default:
3280 DRM_DEBUG_KMS("Unsupported voltage swing/pre-emphasis level:"
3281 "0x%x\n", signal_levels);
3282 return EDP_LINK_TRAIN_500MV_0DB_IVB;
3283 }
3284}
3285
Paulo Zanonid6c0d722012-10-15 15:51:34 -03003286/* Gen7.5's (HSW) DP voltage swing and pre-emphasis control */
3287static uint32_t
Paulo Zanonif0a34242012-12-06 16:51:50 -02003288intel_hsw_signal_levels(uint8_t train_set)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003289{
Paulo Zanonid6c0d722012-10-15 15:51:34 -03003290 int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK |
3291 DP_TRAIN_PRE_EMPHASIS_MASK);
3292 switch (signal_levels) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303293 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_0:
Sonika Jindalc5fe6a02014-08-11 08:57:36 +05303294 return DDI_BUF_TRANS_SELECT(0);
Sonika Jindalbd600182014-08-08 16:23:41 +05303295 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_1:
Sonika Jindalc5fe6a02014-08-11 08:57:36 +05303296 return DDI_BUF_TRANS_SELECT(1);
Sonika Jindalbd600182014-08-08 16:23:41 +05303297 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_2:
Sonika Jindalc5fe6a02014-08-11 08:57:36 +05303298 return DDI_BUF_TRANS_SELECT(2);
Sonika Jindalbd600182014-08-08 16:23:41 +05303299 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_3:
Sonika Jindalc5fe6a02014-08-11 08:57:36 +05303300 return DDI_BUF_TRANS_SELECT(3);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003301
Sonika Jindalbd600182014-08-08 16:23:41 +05303302 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_0:
Sonika Jindalc5fe6a02014-08-11 08:57:36 +05303303 return DDI_BUF_TRANS_SELECT(4);
Sonika Jindalbd600182014-08-08 16:23:41 +05303304 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_1:
Sonika Jindalc5fe6a02014-08-11 08:57:36 +05303305 return DDI_BUF_TRANS_SELECT(5);
Sonika Jindalbd600182014-08-08 16:23:41 +05303306 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_2:
Sonika Jindalc5fe6a02014-08-11 08:57:36 +05303307 return DDI_BUF_TRANS_SELECT(6);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003308
Sonika Jindalbd600182014-08-08 16:23:41 +05303309 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_0:
Sonika Jindalc5fe6a02014-08-11 08:57:36 +05303310 return DDI_BUF_TRANS_SELECT(7);
Sonika Jindalbd600182014-08-08 16:23:41 +05303311 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_1:
Sonika Jindalc5fe6a02014-08-11 08:57:36 +05303312 return DDI_BUF_TRANS_SELECT(8);
Sonika Jindal7ad14a22015-02-25 10:29:12 +05303313
3314 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3 | DP_TRAIN_PRE_EMPH_LEVEL_0:
3315 return DDI_BUF_TRANS_SELECT(9);
Paulo Zanonid6c0d722012-10-15 15:51:34 -03003316 default:
3317 DRM_DEBUG_KMS("Unsupported voltage swing/pre-emphasis level:"
3318 "0x%x\n", signal_levels);
Sonika Jindalc5fe6a02014-08-11 08:57:36 +05303319 return DDI_BUF_TRANS_SELECT(0);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003320 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003321}
3322
Paulo Zanonif0a34242012-12-06 16:51:50 -02003323/* Properly updates "DP" with the correct signal levels. */
3324static void
3325intel_dp_set_signal_levels(struct intel_dp *intel_dp, uint32_t *DP)
3326{
3327 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Imre Deakbc7d38a2013-05-16 14:40:36 +03003328 enum port port = intel_dig_port->port;
Paulo Zanonif0a34242012-12-06 16:51:50 -02003329 struct drm_device *dev = intel_dig_port->base.base.dev;
3330 uint32_t signal_levels, mask;
3331 uint8_t train_set = intel_dp->train_set[0];
3332
Damien Lespiau5a9d1f12013-12-03 13:56:26 +00003333 if (IS_HASWELL(dev) || IS_BROADWELL(dev) || INTEL_INFO(dev)->gen >= 9) {
Paulo Zanonif0a34242012-12-06 16:51:50 -02003334 signal_levels = intel_hsw_signal_levels(train_set);
3335 mask = DDI_BUF_EMP_MASK;
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003336 } else if (IS_CHERRYVIEW(dev)) {
3337 signal_levels = intel_chv_signal_levels(intel_dp);
3338 mask = 0;
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003339 } else if (IS_VALLEYVIEW(dev)) {
3340 signal_levels = intel_vlv_signal_levels(intel_dp);
3341 mask = 0;
Imre Deakbc7d38a2013-05-16 14:40:36 +03003342 } else if (IS_GEN7(dev) && port == PORT_A) {
Paulo Zanonif0a34242012-12-06 16:51:50 -02003343 signal_levels = intel_gen7_edp_signal_levels(train_set);
3344 mask = EDP_LINK_TRAIN_VOL_EMP_MASK_IVB;
Imre Deakbc7d38a2013-05-16 14:40:36 +03003345 } else if (IS_GEN6(dev) && port == PORT_A) {
Paulo Zanonif0a34242012-12-06 16:51:50 -02003346 signal_levels = intel_gen6_edp_signal_levels(train_set);
3347 mask = EDP_LINK_TRAIN_VOL_EMP_MASK_SNB;
3348 } else {
3349 signal_levels = intel_gen4_signal_levels(train_set);
3350 mask = DP_VOLTAGE_MASK | DP_PRE_EMPHASIS_MASK;
3351 }
3352
3353 DRM_DEBUG_KMS("Using signal levels %08x\n", signal_levels);
3354
3355 *DP = (*DP & ~mask) | signal_levels;
3356}
3357
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003358static bool
Chris Wilsonea5b2132010-08-04 13:50:23 +01003359intel_dp_set_link_train(struct intel_dp *intel_dp,
Jani Nikula70aff662013-09-27 15:10:44 +03003360 uint32_t *DP,
Chris Wilson58e10eb2010-10-03 10:56:11 +01003361 uint8_t dp_train_pat)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003362{
Paulo Zanoni174edf12012-10-26 19:05:50 -02003363 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3364 struct drm_device *dev = intel_dig_port->base.base.dev;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003365 struct drm_i915_private *dev_priv = dev->dev_private;
Jani Nikula2cdfe6c2013-10-04 15:08:48 +03003366 uint8_t buf[sizeof(intel_dp->train_set) + 1];
3367 int ret, len;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003368
Ville Syrjälä7b13b582014-08-18 22:16:08 +03003369 _intel_dp_set_link_train(intel_dp, DP, dp_train_pat);
Paulo Zanoni47ea7542012-07-17 16:55:16 -03003370
Jani Nikula70aff662013-09-27 15:10:44 +03003371 I915_WRITE(intel_dp->output_reg, *DP);
Chris Wilsonea5b2132010-08-04 13:50:23 +01003372 POSTING_READ(intel_dp->output_reg);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003373
Jani Nikula2cdfe6c2013-10-04 15:08:48 +03003374 buf[0] = dp_train_pat;
3375 if ((dp_train_pat & DP_TRAINING_PATTERN_MASK) ==
Paulo Zanoni47ea7542012-07-17 16:55:16 -03003376 DP_TRAINING_PATTERN_DISABLE) {
Jani Nikula2cdfe6c2013-10-04 15:08:48 +03003377 /* don't write DP_TRAINING_LANEx_SET on disable */
3378 len = 1;
3379 } else {
3380 /* DP_TRAINING_LANEx_SET follow DP_TRAINING_PATTERN_SET */
3381 memcpy(buf + 1, intel_dp->train_set, intel_dp->lane_count);
3382 len = intel_dp->lane_count + 1;
Paulo Zanoni47ea7542012-07-17 16:55:16 -03003383 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003384
Jani Nikula9d1a1032014-03-14 16:51:15 +02003385 ret = drm_dp_dpcd_write(&intel_dp->aux, DP_TRAINING_PATTERN_SET,
3386 buf, len);
Jani Nikula2cdfe6c2013-10-04 15:08:48 +03003387
3388 return ret == len;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003389}
3390
Jani Nikula70aff662013-09-27 15:10:44 +03003391static bool
3392intel_dp_reset_link_train(struct intel_dp *intel_dp, uint32_t *DP,
3393 uint8_t dp_train_pat)
3394{
Jani Nikula953d22e2013-10-04 15:08:47 +03003395 memset(intel_dp->train_set, 0, sizeof(intel_dp->train_set));
Jani Nikula70aff662013-09-27 15:10:44 +03003396 intel_dp_set_signal_levels(intel_dp, DP);
3397 return intel_dp_set_link_train(intel_dp, DP, dp_train_pat);
3398}
3399
3400static bool
3401intel_dp_update_link_train(struct intel_dp *intel_dp, uint32_t *DP,
Jani Nikula0301b3a2013-10-15 09:36:08 +03003402 const uint8_t link_status[DP_LINK_STATUS_SIZE])
Jani Nikula70aff662013-09-27 15:10:44 +03003403{
3404 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3405 struct drm_device *dev = intel_dig_port->base.base.dev;
3406 struct drm_i915_private *dev_priv = dev->dev_private;
3407 int ret;
3408
3409 intel_get_adjust_train(intel_dp, link_status);
3410 intel_dp_set_signal_levels(intel_dp, DP);
3411
3412 I915_WRITE(intel_dp->output_reg, *DP);
3413 POSTING_READ(intel_dp->output_reg);
3414
Jani Nikula9d1a1032014-03-14 16:51:15 +02003415 ret = drm_dp_dpcd_write(&intel_dp->aux, DP_TRAINING_LANE0_SET,
3416 intel_dp->train_set, intel_dp->lane_count);
Jani Nikula70aff662013-09-27 15:10:44 +03003417
3418 return ret == intel_dp->lane_count;
3419}
3420
Imre Deak3ab9c632013-05-03 12:57:41 +03003421static void intel_dp_set_idle_link_train(struct intel_dp *intel_dp)
3422{
3423 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3424 struct drm_device *dev = intel_dig_port->base.base.dev;
3425 struct drm_i915_private *dev_priv = dev->dev_private;
3426 enum port port = intel_dig_port->port;
3427 uint32_t val;
3428
3429 if (!HAS_DDI(dev))
3430 return;
3431
3432 val = I915_READ(DP_TP_CTL(port));
3433 val &= ~DP_TP_CTL_LINK_TRAIN_MASK;
3434 val |= DP_TP_CTL_LINK_TRAIN_IDLE;
3435 I915_WRITE(DP_TP_CTL(port), val);
3436
3437 /*
3438 * On PORT_A we can have only eDP in SST mode. There the only reason
3439 * we need to set idle transmission mode is to work around a HW issue
3440 * where we enable the pipe while not in idle link-training mode.
3441 * In this case there is requirement to wait for a minimum number of
3442 * idle patterns to be sent.
3443 */
3444 if (port == PORT_A)
3445 return;
3446
3447 if (wait_for((I915_READ(DP_TP_STATUS(port)) & DP_TP_STATUS_IDLE_DONE),
3448 1))
3449 DRM_ERROR("Timed out waiting for DP idle patterns\n");
3450}
3451
Jesse Barnes33a34e42010-09-08 12:42:02 -07003452/* Enable corresponding port and start training pattern 1 */
Paulo Zanonic19b0662012-10-15 15:51:41 -03003453void
Jesse Barnes33a34e42010-09-08 12:42:02 -07003454intel_dp_start_link_train(struct intel_dp *intel_dp)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003455{
Paulo Zanonida63a9f2012-10-26 19:05:46 -02003456 struct drm_encoder *encoder = &dp_to_dig_port(intel_dp)->base.base;
Paulo Zanonic19b0662012-10-15 15:51:41 -03003457 struct drm_device *dev = encoder->dev;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003458 int i;
3459 uint8_t voltage;
Keith Packardcdb0e952011-11-01 20:00:06 -07003460 int voltage_tries, loop_tries;
Chris Wilsonea5b2132010-08-04 13:50:23 +01003461 uint32_t DP = intel_dp->DP;
Jani Nikula6aba5b62013-10-04 15:08:10 +03003462 uint8_t link_config[2];
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003463
Paulo Zanoniaffa9352012-11-23 15:30:39 -02003464 if (HAS_DDI(dev))
Paulo Zanonic19b0662012-10-15 15:51:41 -03003465 intel_ddi_prepare_link_retrain(encoder);
3466
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003467 /* Write the link configuration data */
Jani Nikula6aba5b62013-10-04 15:08:10 +03003468 link_config[0] = intel_dp->link_bw;
3469 link_config[1] = intel_dp->lane_count;
3470 if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
3471 link_config[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
Jani Nikula9d1a1032014-03-14 16:51:15 +02003472 drm_dp_dpcd_write(&intel_dp->aux, DP_LINK_BW_SET, link_config, 2);
Sonika Jindala8f3ef62015-03-05 10:02:30 +05303473 if (INTEL_INFO(dev)->gen >= 9 && intel_dp->supported_rates[0])
3474 drm_dp_dpcd_write(&intel_dp->aux, DP_LINK_RATE_SET,
3475 &intel_dp->rate_select, 1);
Jani Nikula6aba5b62013-10-04 15:08:10 +03003476
3477 link_config[0] = 0;
3478 link_config[1] = DP_SET_ANSI_8B10B;
Jani Nikula9d1a1032014-03-14 16:51:15 +02003479 drm_dp_dpcd_write(&intel_dp->aux, DP_DOWNSPREAD_CTRL, link_config, 2);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003480
3481 DP |= DP_PORT_EN;
Keith Packard1a2eb462011-11-16 16:26:07 -08003482
Jani Nikula70aff662013-09-27 15:10:44 +03003483 /* clock recovery */
3484 if (!intel_dp_reset_link_train(intel_dp, &DP,
3485 DP_TRAINING_PATTERN_1 |
3486 DP_LINK_SCRAMBLING_DISABLE)) {
3487 DRM_ERROR("failed to enable link training\n");
3488 return;
3489 }
3490
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003491 voltage = 0xff;
Keith Packardcdb0e952011-11-01 20:00:06 -07003492 voltage_tries = 0;
3493 loop_tries = 0;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003494 for (;;) {
Jani Nikula70aff662013-09-27 15:10:44 +03003495 uint8_t link_status[DP_LINK_STATUS_SIZE];
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003496
Daniel Vettera7c96552012-10-18 10:15:30 +02003497 drm_dp_link_train_clock_recovery_delay(intel_dp->dpcd);
Keith Packard93f62da2011-11-01 19:45:03 -07003498 if (!intel_dp_get_link_status(intel_dp, link_status)) {
3499 DRM_ERROR("failed to get link status\n");
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003500 break;
Keith Packard93f62da2011-11-01 19:45:03 -07003501 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003502
Daniel Vetter01916272012-10-18 10:15:25 +02003503 if (drm_dp_clock_recovery_ok(link_status, intel_dp->lane_count)) {
Keith Packard93f62da2011-11-01 19:45:03 -07003504 DRM_DEBUG_KMS("clock recovery OK\n");
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003505 break;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003506 }
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003507
3508 /* Check to see if we've tried the max voltage */
3509 for (i = 0; i < intel_dp->lane_count; i++)
3510 if ((intel_dp->train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0)
3511 break;
Takashi Iwai3b4f8192013-03-11 18:40:16 +01003512 if (i == intel_dp->lane_count) {
Daniel Vetterb06fbda2012-10-16 09:50:25 +02003513 ++loop_tries;
3514 if (loop_tries == 5) {
Jani Nikula3def84b2013-10-05 16:13:56 +03003515 DRM_ERROR("too many full retries, give up\n");
Keith Packardcdb0e952011-11-01 20:00:06 -07003516 break;
3517 }
Jani Nikula70aff662013-09-27 15:10:44 +03003518 intel_dp_reset_link_train(intel_dp, &DP,
3519 DP_TRAINING_PATTERN_1 |
3520 DP_LINK_SCRAMBLING_DISABLE);
Keith Packardcdb0e952011-11-01 20:00:06 -07003521 voltage_tries = 0;
3522 continue;
3523 }
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003524
3525 /* Check to see if we've tried the same voltage 5 times */
Daniel Vetterb06fbda2012-10-16 09:50:25 +02003526 if ((intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) == voltage) {
Chris Wilson24773672012-09-26 16:48:30 +01003527 ++voltage_tries;
Daniel Vetterb06fbda2012-10-16 09:50:25 +02003528 if (voltage_tries == 5) {
Jani Nikula3def84b2013-10-05 16:13:56 +03003529 DRM_ERROR("too many voltage retries, give up\n");
Daniel Vetterb06fbda2012-10-16 09:50:25 +02003530 break;
3531 }
3532 } else
3533 voltage_tries = 0;
3534 voltage = intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK;
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003535
Jani Nikula70aff662013-09-27 15:10:44 +03003536 /* Update training set as requested by target */
3537 if (!intel_dp_update_link_train(intel_dp, &DP, link_status)) {
3538 DRM_ERROR("failed to update link training\n");
3539 break;
3540 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003541 }
3542
Jesse Barnes33a34e42010-09-08 12:42:02 -07003543 intel_dp->DP = DP;
3544}
3545
Paulo Zanonic19b0662012-10-15 15:51:41 -03003546void
Jesse Barnes33a34e42010-09-08 12:42:02 -07003547intel_dp_complete_link_train(struct intel_dp *intel_dp)
3548{
Jesse Barnes33a34e42010-09-08 12:42:02 -07003549 bool channel_eq = false;
Jesse Barnes37f80972011-01-05 14:45:24 -08003550 int tries, cr_tries;
Jesse Barnes33a34e42010-09-08 12:42:02 -07003551 uint32_t DP = intel_dp->DP;
Todd Previte06ea66b2014-01-20 10:19:39 -07003552 uint32_t training_pattern = DP_TRAINING_PATTERN_2;
3553
3554 /* Training Pattern 3 for HBR2 ot 1.2 devices that support it*/
3555 if (intel_dp->link_bw == DP_LINK_BW_5_4 || intel_dp->use_tps3)
3556 training_pattern = DP_TRAINING_PATTERN_3;
Jesse Barnes33a34e42010-09-08 12:42:02 -07003557
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003558 /* channel equalization */
Jani Nikula70aff662013-09-27 15:10:44 +03003559 if (!intel_dp_set_link_train(intel_dp, &DP,
Todd Previte06ea66b2014-01-20 10:19:39 -07003560 training_pattern |
Jani Nikula70aff662013-09-27 15:10:44 +03003561 DP_LINK_SCRAMBLING_DISABLE)) {
3562 DRM_ERROR("failed to start channel equalization\n");
3563 return;
3564 }
3565
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003566 tries = 0;
Jesse Barnes37f80972011-01-05 14:45:24 -08003567 cr_tries = 0;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003568 channel_eq = false;
3569 for (;;) {
Jani Nikula70aff662013-09-27 15:10:44 +03003570 uint8_t link_status[DP_LINK_STATUS_SIZE];
Zhenyu Wange3421a12010-04-08 09:43:27 +08003571
Jesse Barnes37f80972011-01-05 14:45:24 -08003572 if (cr_tries > 5) {
3573 DRM_ERROR("failed to train DP, aborting\n");
Jesse Barnes37f80972011-01-05 14:45:24 -08003574 break;
3575 }
3576
Daniel Vettera7c96552012-10-18 10:15:30 +02003577 drm_dp_link_train_channel_eq_delay(intel_dp->dpcd);
Jani Nikula70aff662013-09-27 15:10:44 +03003578 if (!intel_dp_get_link_status(intel_dp, link_status)) {
3579 DRM_ERROR("failed to get link status\n");
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003580 break;
Jani Nikula70aff662013-09-27 15:10:44 +03003581 }
Jesse Barnes869184a2010-10-07 16:01:22 -07003582
Jesse Barnes37f80972011-01-05 14:45:24 -08003583 /* Make sure clock is still ok */
Daniel Vetter01916272012-10-18 10:15:25 +02003584 if (!drm_dp_clock_recovery_ok(link_status, intel_dp->lane_count)) {
Jesse Barnes37f80972011-01-05 14:45:24 -08003585 intel_dp_start_link_train(intel_dp);
Jani Nikula70aff662013-09-27 15:10:44 +03003586 intel_dp_set_link_train(intel_dp, &DP,
Todd Previte06ea66b2014-01-20 10:19:39 -07003587 training_pattern |
Jani Nikula70aff662013-09-27 15:10:44 +03003588 DP_LINK_SCRAMBLING_DISABLE);
Jesse Barnes37f80972011-01-05 14:45:24 -08003589 cr_tries++;
3590 continue;
3591 }
3592
Daniel Vetter1ffdff12012-10-18 10:15:24 +02003593 if (drm_dp_channel_eq_ok(link_status, intel_dp->lane_count)) {
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003594 channel_eq = true;
3595 break;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003596 }
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003597
Jesse Barnes37f80972011-01-05 14:45:24 -08003598 /* Try 5 times, then try clock recovery if that fails */
3599 if (tries > 5) {
Jesse Barnes37f80972011-01-05 14:45:24 -08003600 intel_dp_start_link_train(intel_dp);
Jani Nikula70aff662013-09-27 15:10:44 +03003601 intel_dp_set_link_train(intel_dp, &DP,
Todd Previte06ea66b2014-01-20 10:19:39 -07003602 training_pattern |
Jani Nikula70aff662013-09-27 15:10:44 +03003603 DP_LINK_SCRAMBLING_DISABLE);
Jesse Barnes37f80972011-01-05 14:45:24 -08003604 tries = 0;
3605 cr_tries++;
3606 continue;
3607 }
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003608
Jani Nikula70aff662013-09-27 15:10:44 +03003609 /* Update training set as requested by target */
3610 if (!intel_dp_update_link_train(intel_dp, &DP, link_status)) {
3611 DRM_ERROR("failed to update link training\n");
3612 break;
3613 }
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003614 ++tries;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003615 }
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003616
Imre Deak3ab9c632013-05-03 12:57:41 +03003617 intel_dp_set_idle_link_train(intel_dp);
3618
3619 intel_dp->DP = DP;
3620
Paulo Zanonid6c0d722012-10-15 15:51:34 -03003621 if (channel_eq)
Masanari Iida07f42252013-03-20 11:00:34 +09003622 DRM_DEBUG_KMS("Channel EQ done. DP Training successful\n");
Paulo Zanonid6c0d722012-10-15 15:51:34 -03003623
Imre Deak3ab9c632013-05-03 12:57:41 +03003624}
3625
3626void intel_dp_stop_link_train(struct intel_dp *intel_dp)
3627{
Jani Nikula70aff662013-09-27 15:10:44 +03003628 intel_dp_set_link_train(intel_dp, &intel_dp->DP,
Imre Deak3ab9c632013-05-03 12:57:41 +03003629 DP_TRAINING_PATTERN_DISABLE);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003630}
3631
3632static void
Chris Wilsonea5b2132010-08-04 13:50:23 +01003633intel_dp_link_down(struct intel_dp *intel_dp)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003634{
Paulo Zanonida63a9f2012-10-26 19:05:46 -02003635 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Imre Deakbc7d38a2013-05-16 14:40:36 +03003636 enum port port = intel_dig_port->port;
Paulo Zanonida63a9f2012-10-26 19:05:46 -02003637 struct drm_device *dev = intel_dig_port->base.base.dev;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003638 struct drm_i915_private *dev_priv = dev->dev_private;
Chris Wilsonea5b2132010-08-04 13:50:23 +01003639 uint32_t DP = intel_dp->DP;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003640
Daniel Vetterbc76e322014-05-20 22:46:50 +02003641 if (WARN_ON(HAS_DDI(dev)))
Paulo Zanonic19b0662012-10-15 15:51:41 -03003642 return;
3643
Daniel Vetter0c33d8d2012-09-06 22:15:43 +02003644 if (WARN_ON((I915_READ(intel_dp->output_reg) & DP_PORT_EN) == 0))
Chris Wilson1b39d6f2010-12-06 11:20:45 +00003645 return;
3646
Zhao Yakui28c97732009-10-09 11:39:41 +08003647 DRM_DEBUG_KMS("\n");
Zhenyu Wang32f9d652009-07-24 01:00:32 +08003648
Imre Deakbc7d38a2013-05-16 14:40:36 +03003649 if (HAS_PCH_CPT(dev) && (IS_GEN7(dev) || port != PORT_A)) {
Zhenyu Wange3421a12010-04-08 09:43:27 +08003650 DP &= ~DP_LINK_TRAIN_MASK_CPT;
Chris Wilsonea5b2132010-08-04 13:50:23 +01003651 I915_WRITE(intel_dp->output_reg, DP | DP_LINK_TRAIN_PAT_IDLE_CPT);
Zhenyu Wange3421a12010-04-08 09:43:27 +08003652 } else {
Ville Syrjäläaad3d142014-06-28 02:04:25 +03003653 if (IS_CHERRYVIEW(dev))
3654 DP &= ~DP_LINK_TRAIN_MASK_CHV;
3655 else
3656 DP &= ~DP_LINK_TRAIN_MASK;
Chris Wilsonea5b2132010-08-04 13:50:23 +01003657 I915_WRITE(intel_dp->output_reg, DP | DP_LINK_TRAIN_PAT_IDLE);
Zhenyu Wange3421a12010-04-08 09:43:27 +08003658 }
Chris Wilsonfe255d02010-09-11 21:37:48 +01003659 POSTING_READ(intel_dp->output_reg);
Zhenyu Wang5eb08b62009-07-24 01:00:31 +08003660
Daniel Vetter493a7082012-05-30 12:31:56 +02003661 if (HAS_PCH_IBX(dev) &&
Chris Wilson1b39d6f2010-12-06 11:20:45 +00003662 I915_READ(intel_dp->output_reg) & DP_PIPEB_SELECT) {
Eric Anholt5bddd172010-11-18 09:32:59 +08003663 /* Hardware workaround: leaving our transcoder select
3664 * set to transcoder B while it's off will prevent the
3665 * corresponding HDMI output on transcoder A.
3666 *
3667 * Combine this with another hardware workaround:
3668 * transcoder select bit can only be cleared while the
3669 * port is enabled.
3670 */
3671 DP &= ~DP_PIPEB_SELECT;
3672 I915_WRITE(intel_dp->output_reg, DP);
Daniel Vetter0ca09682014-11-24 16:54:11 +01003673 POSTING_READ(intel_dp->output_reg);
Eric Anholt5bddd172010-11-18 09:32:59 +08003674 }
3675
Wu Fengguang832afda2011-12-09 20:42:21 +08003676 DP &= ~DP_AUDIO_OUTPUT_ENABLE;
Chris Wilsonea5b2132010-08-04 13:50:23 +01003677 I915_WRITE(intel_dp->output_reg, DP & ~DP_PORT_EN);
3678 POSTING_READ(intel_dp->output_reg);
Keith Packardf01eca22011-09-28 16:48:10 -07003679 msleep(intel_dp->panel_power_down_delay);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003680}
3681
Keith Packard26d61aa2011-07-25 20:01:09 -07003682static bool
3683intel_dp_get_dpcd(struct intel_dp *intel_dp)
Keith Packard92fd8fd2011-07-25 19:50:10 -07003684{
Rodrigo Vivia031d702013-10-03 16:15:06 -03003685 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
3686 struct drm_device *dev = dig_port->base.base.dev;
3687 struct drm_i915_private *dev_priv = dev->dev_private;
Sonika Jindalfc0f8e22015-03-05 10:03:58 +05303688 uint8_t rev;
Rodrigo Vivia031d702013-10-03 16:15:06 -03003689
Jani Nikula9d1a1032014-03-14 16:51:15 +02003690 if (intel_dp_dpcd_read_wake(&intel_dp->aux, 0x000, intel_dp->dpcd,
3691 sizeof(intel_dp->dpcd)) < 0)
Adam Jacksonedb39242012-09-18 10:58:49 -04003692 return false; /* aux transfer failed */
Keith Packard92fd8fd2011-07-25 19:50:10 -07003693
Andy Shevchenkoa8e98152014-09-01 14:12:01 +03003694 DRM_DEBUG_KMS("DPCD: %*ph\n", (int) sizeof(intel_dp->dpcd), intel_dp->dpcd);
Damien Lespiau577c7a52012-12-13 16:09:02 +00003695
Adam Jacksonedb39242012-09-18 10:58:49 -04003696 if (intel_dp->dpcd[DP_DPCD_REV] == 0)
3697 return false; /* DPCD not present */
3698
Shobhit Kumar2293bb52013-07-11 18:44:56 -03003699 /* Check if the panel supports PSR */
3700 memset(intel_dp->psr_dpcd, 0, sizeof(intel_dp->psr_dpcd));
Jani Nikula50003932013-09-20 16:42:17 +03003701 if (is_edp(intel_dp)) {
Jani Nikula9d1a1032014-03-14 16:51:15 +02003702 intel_dp_dpcd_read_wake(&intel_dp->aux, DP_PSR_SUPPORT,
3703 intel_dp->psr_dpcd,
3704 sizeof(intel_dp->psr_dpcd));
Rodrigo Vivia031d702013-10-03 16:15:06 -03003705 if (intel_dp->psr_dpcd[0] & DP_PSR_IS_SUPPORTED) {
3706 dev_priv->psr.sink_support = true;
Jani Nikula50003932013-09-20 16:42:17 +03003707 DRM_DEBUG_KMS("Detected EDP PSR Panel.\n");
Rodrigo Vivia031d702013-10-03 16:15:06 -03003708 }
Jani Nikula50003932013-09-20 16:42:17 +03003709 }
3710
Jani Nikula7809a612014-10-29 11:03:26 +02003711 /* Training Pattern 3 support, both source and sink */
Todd Previte06ea66b2014-01-20 10:19:39 -07003712 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x12 &&
Jani Nikula7809a612014-10-29 11:03:26 +02003713 intel_dp->dpcd[DP_MAX_LANE_COUNT] & DP_TPS3_SUPPORTED &&
3714 (IS_HASWELL(dev_priv) || INTEL_INFO(dev_priv)->gen >= 8)) {
Todd Previte06ea66b2014-01-20 10:19:39 -07003715 intel_dp->use_tps3 = true;
Jani Nikulaf8d8a672014-09-05 16:19:18 +03003716 DRM_DEBUG_KMS("Displayport TPS3 supported\n");
Todd Previte06ea66b2014-01-20 10:19:39 -07003717 } else
3718 intel_dp->use_tps3 = false;
3719
Sonika Jindalfc0f8e22015-03-05 10:03:58 +05303720 /* Intermediate frequency support */
3721 if (is_edp(intel_dp) &&
3722 (intel_dp->dpcd[DP_EDP_CONFIGURATION_CAP] & DP_DPCD_DISPLAY_CONTROL_CAPABLE) &&
3723 (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_EDP_DPCD_REV, &rev, 1) == 1) &&
3724 (rev >= 0x03)) { /* eDp v1.4 or higher */
Ville Syrjäläea2d8a42015-03-12 17:10:28 +02003725 __le16 supported_rates[DP_MAX_SUPPORTED_RATES];
3726 int i;
3727
Sonika Jindalfc0f8e22015-03-05 10:03:58 +05303728 intel_dp_dpcd_read_wake(&intel_dp->aux,
3729 DP_SUPPORTED_LINK_RATES,
Ville Syrjäläea2d8a42015-03-12 17:10:28 +02003730 supported_rates,
3731 sizeof(supported_rates));
3732
3733 for (i = 0; i < ARRAY_SIZE(supported_rates); i++) {
3734 int val = le16_to_cpu(supported_rates[i]);
3735
3736 if (val == 0)
3737 break;
3738
3739 intel_dp->supported_rates[i] = val * 200;
3740 }
3741 intel_dp->num_supported_rates = i;
Sonika Jindalfc0f8e22015-03-05 10:03:58 +05303742 }
Adam Jacksonedb39242012-09-18 10:58:49 -04003743 if (!(intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] &
3744 DP_DWN_STRM_PORT_PRESENT))
3745 return true; /* native DP sink */
3746
3747 if (intel_dp->dpcd[DP_DPCD_REV] == 0x10)
3748 return true; /* no per-port downstream info */
3749
Jani Nikula9d1a1032014-03-14 16:51:15 +02003750 if (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_DOWNSTREAM_PORT_0,
3751 intel_dp->downstream_ports,
3752 DP_MAX_DOWNSTREAM_PORTS) < 0)
Adam Jacksonedb39242012-09-18 10:58:49 -04003753 return false; /* downstream port status fetch failed */
3754
3755 return true;
Keith Packard92fd8fd2011-07-25 19:50:10 -07003756}
3757
Adam Jackson0d198322012-05-14 16:05:47 -04003758static void
3759intel_dp_probe_oui(struct intel_dp *intel_dp)
3760{
3761 u8 buf[3];
3762
3763 if (!(intel_dp->dpcd[DP_DOWN_STREAM_PORT_COUNT] & DP_OUI_SUPPORT))
3764 return;
3765
Jani Nikula9d1a1032014-03-14 16:51:15 +02003766 if (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_SINK_OUI, buf, 3) == 3)
Adam Jackson0d198322012-05-14 16:05:47 -04003767 DRM_DEBUG_KMS("Sink OUI: %02hx%02hx%02hx\n",
3768 buf[0], buf[1], buf[2]);
3769
Jani Nikula9d1a1032014-03-14 16:51:15 +02003770 if (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_BRANCH_OUI, buf, 3) == 3)
Adam Jackson0d198322012-05-14 16:05:47 -04003771 DRM_DEBUG_KMS("Branch OUI: %02hx%02hx%02hx\n",
3772 buf[0], buf[1], buf[2]);
3773}
3774
Dave Airlie0e32b392014-05-02 14:02:48 +10003775static bool
3776intel_dp_probe_mst(struct intel_dp *intel_dp)
3777{
3778 u8 buf[1];
3779
3780 if (!intel_dp->can_mst)
3781 return false;
3782
3783 if (intel_dp->dpcd[DP_DPCD_REV] < 0x12)
3784 return false;
3785
Dave Airlie0e32b392014-05-02 14:02:48 +10003786 if (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_MSTM_CAP, buf, 1)) {
3787 if (buf[0] & DP_MST_CAP) {
3788 DRM_DEBUG_KMS("Sink is MST capable\n");
3789 intel_dp->is_mst = true;
3790 } else {
3791 DRM_DEBUG_KMS("Sink is not MST capable\n");
3792 intel_dp->is_mst = false;
3793 }
3794 }
Dave Airlie0e32b392014-05-02 14:02:48 +10003795
3796 drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr, intel_dp->is_mst);
3797 return intel_dp->is_mst;
3798}
3799
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003800int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc)
3801{
3802 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3803 struct drm_device *dev = intel_dig_port->base.base.dev;
3804 struct intel_crtc *intel_crtc =
3805 to_intel_crtc(intel_dig_port->base.base.crtc);
Rodrigo Viviad9dc912014-09-16 19:18:12 -04003806 u8 buf;
3807 int test_crc_count;
3808 int attempts = 6;
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003809
Rodrigo Viviad9dc912014-09-16 19:18:12 -04003810 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK_MISC, &buf) < 0)
Rodrigo Vivibda03812014-09-15 19:24:03 -04003811 return -EIO;
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003812
Rodrigo Viviad9dc912014-09-16 19:18:12 -04003813 if (!(buf & DP_TEST_CRC_SUPPORTED))
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003814 return -ENOTTY;
3815
Rodrigo Vivi1dda5f92014-10-01 07:32:37 -07003816 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK, &buf) < 0)
Rodrigo Vivibda03812014-09-15 19:24:03 -04003817 return -EIO;
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003818
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003819 if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK,
Rodrigo Vivice31d9f2014-09-29 18:29:52 -04003820 buf | DP_TEST_SINK_START) < 0)
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003821 return -EIO;
3822
Rodrigo Vivi1dda5f92014-10-01 07:32:37 -07003823 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK_MISC, &buf) < 0)
3824 return -EIO;
Rodrigo Viviad9dc912014-09-16 19:18:12 -04003825 test_crc_count = buf & DP_TEST_COUNT_MASK;
3826
3827 do {
Rodrigo Vivi1dda5f92014-10-01 07:32:37 -07003828 if (drm_dp_dpcd_readb(&intel_dp->aux,
3829 DP_TEST_SINK_MISC, &buf) < 0)
3830 return -EIO;
Rodrigo Viviad9dc912014-09-16 19:18:12 -04003831 intel_wait_for_vblank(dev, intel_crtc->pipe);
3832 } while (--attempts && (buf & DP_TEST_COUNT_MASK) == test_crc_count);
3833
3834 if (attempts == 0) {
Daniel Vetter90bd1f42014-11-19 11:18:47 +01003835 DRM_DEBUG_KMS("Panel is unable to calculate CRC after 6 vblanks\n");
3836 return -ETIMEDOUT;
Rodrigo Viviad9dc912014-09-16 19:18:12 -04003837 }
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003838
Jani Nikula9d1a1032014-03-14 16:51:15 +02003839 if (drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_CRC_R_CR, crc, 6) < 0)
Rodrigo Vivibda03812014-09-15 19:24:03 -04003840 return -EIO;
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003841
Rodrigo Vivi1dda5f92014-10-01 07:32:37 -07003842 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK, &buf) < 0)
3843 return -EIO;
3844 if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK,
3845 buf & ~DP_TEST_SINK_START) < 0)
3846 return -EIO;
Rodrigo Vivice31d9f2014-09-29 18:29:52 -04003847
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003848 return 0;
3849}
3850
Jesse Barnesa60f0e32011-10-20 15:09:17 -07003851static bool
3852intel_dp_get_sink_irq(struct intel_dp *intel_dp, u8 *sink_irq_vector)
3853{
Jani Nikula9d1a1032014-03-14 16:51:15 +02003854 return intel_dp_dpcd_read_wake(&intel_dp->aux,
3855 DP_DEVICE_SERVICE_IRQ_VECTOR,
3856 sink_irq_vector, 1) == 1;
Jesse Barnesa60f0e32011-10-20 15:09:17 -07003857}
3858
Dave Airlie0e32b392014-05-02 14:02:48 +10003859static bool
3860intel_dp_get_sink_irq_esi(struct intel_dp *intel_dp, u8 *sink_irq_vector)
3861{
3862 int ret;
3863
3864 ret = intel_dp_dpcd_read_wake(&intel_dp->aux,
3865 DP_SINK_COUNT_ESI,
3866 sink_irq_vector, 14);
3867 if (ret != 14)
3868 return false;
3869
3870 return true;
3871}
3872
Jesse Barnesa60f0e32011-10-20 15:09:17 -07003873static void
3874intel_dp_handle_test_request(struct intel_dp *intel_dp)
3875{
3876 /* NAK by default */
Jani Nikula9d1a1032014-03-14 16:51:15 +02003877 drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_RESPONSE, DP_TEST_NAK);
Jesse Barnesa60f0e32011-10-20 15:09:17 -07003878}
3879
Dave Airlie0e32b392014-05-02 14:02:48 +10003880static int
3881intel_dp_check_mst_status(struct intel_dp *intel_dp)
3882{
3883 bool bret;
3884
3885 if (intel_dp->is_mst) {
3886 u8 esi[16] = { 0 };
3887 int ret = 0;
3888 int retry;
3889 bool handled;
3890 bret = intel_dp_get_sink_irq_esi(intel_dp, esi);
3891go_again:
3892 if (bret == true) {
3893
3894 /* check link status - esi[10] = 0x200c */
3895 if (intel_dp->active_mst_links && !drm_dp_channel_eq_ok(&esi[10], intel_dp->lane_count)) {
3896 DRM_DEBUG_KMS("channel EQ not ok, retraining\n");
3897 intel_dp_start_link_train(intel_dp);
3898 intel_dp_complete_link_train(intel_dp);
3899 intel_dp_stop_link_train(intel_dp);
3900 }
3901
Andy Shevchenko6f34cc32015-01-15 13:45:09 +02003902 DRM_DEBUG_KMS("got esi %3ph\n", esi);
Dave Airlie0e32b392014-05-02 14:02:48 +10003903 ret = drm_dp_mst_hpd_irq(&intel_dp->mst_mgr, esi, &handled);
3904
3905 if (handled) {
3906 for (retry = 0; retry < 3; retry++) {
3907 int wret;
3908 wret = drm_dp_dpcd_write(&intel_dp->aux,
3909 DP_SINK_COUNT_ESI+1,
3910 &esi[1], 3);
3911 if (wret == 3) {
3912 break;
3913 }
3914 }
3915
3916 bret = intel_dp_get_sink_irq_esi(intel_dp, esi);
3917 if (bret == true) {
Andy Shevchenko6f34cc32015-01-15 13:45:09 +02003918 DRM_DEBUG_KMS("got esi2 %3ph\n", esi);
Dave Airlie0e32b392014-05-02 14:02:48 +10003919 goto go_again;
3920 }
3921 } else
3922 ret = 0;
3923
3924 return ret;
3925 } else {
3926 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3927 DRM_DEBUG_KMS("failed to get ESI - device may have failed\n");
3928 intel_dp->is_mst = false;
3929 drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr, intel_dp->is_mst);
3930 /* send a hotplug event */
3931 drm_kms_helper_hotplug_event(intel_dig_port->base.base.dev);
3932 }
3933 }
3934 return -EINVAL;
3935}
3936
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003937/*
3938 * According to DP spec
3939 * 5.1.2:
3940 * 1. Read DPCD
3941 * 2. Configure link according to Receiver Capabilities
3942 * 3. Use Link Training from 2.5.3.3 and 3.5.1.3
3943 * 4. Check link status on receipt of hot-plug interrupt
3944 */
Damien Lespiaua5146202015-02-10 19:32:22 +00003945static void
Chris Wilsonea5b2132010-08-04 13:50:23 +01003946intel_dp_check_link_status(struct intel_dp *intel_dp)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003947{
Dave Airlie5b215bc2014-08-05 10:40:20 +10003948 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Paulo Zanonida63a9f2012-10-26 19:05:46 -02003949 struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base;
Jesse Barnesa60f0e32011-10-20 15:09:17 -07003950 u8 sink_irq_vector;
Keith Packard93f62da2011-11-01 19:45:03 -07003951 u8 link_status[DP_LINK_STATUS_SIZE];
Jesse Barnesa60f0e32011-10-20 15:09:17 -07003952
Dave Airlie5b215bc2014-08-05 10:40:20 +10003953 WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
3954
Paulo Zanonida63a9f2012-10-26 19:05:46 -02003955 if (!intel_encoder->connectors_active)
Keith Packardd2b996a2011-07-25 22:37:51 -07003956 return;
Jesse Barnes59cd09e2011-07-07 11:10:59 -07003957
Paulo Zanonida63a9f2012-10-26 19:05:46 -02003958 if (WARN_ON(!intel_encoder->base.crtc))
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003959 return;
3960
Imre Deak1a125d82014-08-18 14:42:46 +03003961 if (!to_intel_crtc(intel_encoder->base.crtc)->active)
3962 return;
3963
Keith Packard92fd8fd2011-07-25 19:50:10 -07003964 /* Try to read receiver status if the link appears to be up */
Keith Packard93f62da2011-11-01 19:45:03 -07003965 if (!intel_dp_get_link_status(intel_dp, link_status)) {
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003966 return;
3967 }
3968
Keith Packard92fd8fd2011-07-25 19:50:10 -07003969 /* Now read the DPCD to see if it's actually running */
Keith Packard26d61aa2011-07-25 20:01:09 -07003970 if (!intel_dp_get_dpcd(intel_dp)) {
Jesse Barnes59cd09e2011-07-07 11:10:59 -07003971 return;
3972 }
3973
Jesse Barnesa60f0e32011-10-20 15:09:17 -07003974 /* Try to read the source of the interrupt */
3975 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 &&
3976 intel_dp_get_sink_irq(intel_dp, &sink_irq_vector)) {
3977 /* Clear interrupt source */
Jani Nikula9d1a1032014-03-14 16:51:15 +02003978 drm_dp_dpcd_writeb(&intel_dp->aux,
3979 DP_DEVICE_SERVICE_IRQ_VECTOR,
3980 sink_irq_vector);
Jesse Barnesa60f0e32011-10-20 15:09:17 -07003981
3982 if (sink_irq_vector & DP_AUTOMATED_TEST_REQUEST)
3983 intel_dp_handle_test_request(intel_dp);
3984 if (sink_irq_vector & (DP_CP_IRQ | DP_SINK_SPECIFIC_IRQ))
3985 DRM_DEBUG_DRIVER("CP or sink specific irq unhandled\n");
3986 }
3987
Daniel Vetter1ffdff12012-10-18 10:15:24 +02003988 if (!drm_dp_channel_eq_ok(link_status, intel_dp->lane_count)) {
Keith Packard92fd8fd2011-07-25 19:50:10 -07003989 DRM_DEBUG_KMS("%s: channel EQ not ok, retraining\n",
Jani Nikula8e329a02014-06-03 14:56:21 +03003990 intel_encoder->base.name);
Jesse Barnes33a34e42010-09-08 12:42:02 -07003991 intel_dp_start_link_train(intel_dp);
3992 intel_dp_complete_link_train(intel_dp);
Imre Deak3ab9c632013-05-03 12:57:41 +03003993 intel_dp_stop_link_train(intel_dp);
Jesse Barnes33a34e42010-09-08 12:42:02 -07003994 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003995}
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003996
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04003997/* XXX this is probably wrong for multiple downstream ports */
Zhenyu Wang5eb08b62009-07-24 01:00:31 +08003998static enum drm_connector_status
Keith Packard26d61aa2011-07-25 20:01:09 -07003999intel_dp_detect_dpcd(struct intel_dp *intel_dp)
Adam Jackson71ba90002011-07-12 17:38:04 -04004000{
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004001 uint8_t *dpcd = intel_dp->dpcd;
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004002 uint8_t type;
4003
4004 if (!intel_dp_get_dpcd(intel_dp))
4005 return connector_status_disconnected;
4006
4007 /* if there's no downstream port, we're done */
4008 if (!(dpcd[DP_DOWNSTREAMPORT_PRESENT] & DP_DWN_STRM_PORT_PRESENT))
Keith Packard26d61aa2011-07-25 20:01:09 -07004009 return connector_status_connected;
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004010
4011 /* If we're HPD-aware, SINK_COUNT changes dynamically */
Jani Nikulac9ff1602013-09-27 14:48:42 +03004012 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 &&
4013 intel_dp->downstream_ports[0] & DP_DS_PORT_HPD) {
Adam Jackson23235172012-09-20 16:42:45 -04004014 uint8_t reg;
Jani Nikula9d1a1032014-03-14 16:51:15 +02004015
4016 if (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_SINK_COUNT,
4017 &reg, 1) < 0)
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004018 return connector_status_unknown;
Jani Nikula9d1a1032014-03-14 16:51:15 +02004019
Adam Jackson23235172012-09-20 16:42:45 -04004020 return DP_GET_SINK_COUNT(reg) ? connector_status_connected
4021 : connector_status_disconnected;
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004022 }
4023
4024 /* If no HPD, poke DDC gently */
Jani Nikula0b998362014-03-14 16:51:17 +02004025 if (drm_probe_ddc(&intel_dp->aux.ddc))
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004026 return connector_status_connected;
4027
4028 /* Well we tried, say unknown for unreliable port types */
Jani Nikulac9ff1602013-09-27 14:48:42 +03004029 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11) {
4030 type = intel_dp->downstream_ports[0] & DP_DS_PORT_TYPE_MASK;
4031 if (type == DP_DS_PORT_TYPE_VGA ||
4032 type == DP_DS_PORT_TYPE_NON_EDID)
4033 return connector_status_unknown;
4034 } else {
4035 type = intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] &
4036 DP_DWN_STRM_PORT_TYPE_MASK;
4037 if (type == DP_DWN_STRM_PORT_TYPE_ANALOG ||
4038 type == DP_DWN_STRM_PORT_TYPE_OTHER)
4039 return connector_status_unknown;
4040 }
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004041
4042 /* Anything else is out of spec, warn and ignore */
4043 DRM_DEBUG_KMS("Broken DP branch device, ignoring\n");
Keith Packard26d61aa2011-07-25 20:01:09 -07004044 return connector_status_disconnected;
Adam Jackson71ba90002011-07-12 17:38:04 -04004045}
4046
4047static enum drm_connector_status
Chris Wilsond410b562014-09-02 20:03:59 +01004048edp_detect(struct intel_dp *intel_dp)
4049{
4050 struct drm_device *dev = intel_dp_to_dev(intel_dp);
4051 enum drm_connector_status status;
4052
4053 status = intel_panel_detect(dev);
4054 if (status == connector_status_unknown)
4055 status = connector_status_connected;
4056
4057 return status;
4058}
4059
4060static enum drm_connector_status
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004061ironlake_dp_detect(struct intel_dp *intel_dp)
Zhenyu Wang5eb08b62009-07-24 01:00:31 +08004062{
Paulo Zanoni30add222012-10-26 19:05:45 -02004063 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Damien Lespiau1b469632012-12-13 16:09:01 +00004064 struct drm_i915_private *dev_priv = dev->dev_private;
4065 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Jesse Barnes01cb9ea2010-10-07 16:01:12 -07004066
Damien Lespiau1b469632012-12-13 16:09:01 +00004067 if (!ibx_digital_port_connected(dev_priv, intel_dig_port))
4068 return connector_status_disconnected;
4069
Keith Packard26d61aa2011-07-25 20:01:09 -07004070 return intel_dp_detect_dpcd(intel_dp);
Zhenyu Wang5eb08b62009-07-24 01:00:31 +08004071}
4072
Dave Airlie2a592be2014-09-01 16:58:12 +10004073static int g4x_digital_port_connected(struct drm_device *dev,
4074 struct intel_digital_port *intel_dig_port)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004075{
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004076 struct drm_i915_private *dev_priv = dev->dev_private;
Chris Wilson10f76a32012-05-11 18:01:32 +01004077 uint32_t bit;
Zhenyu Wang5eb08b62009-07-24 01:00:31 +08004078
Todd Previte232a6ee2014-01-23 00:13:41 -07004079 if (IS_VALLEYVIEW(dev)) {
4080 switch (intel_dig_port->port) {
4081 case PORT_B:
4082 bit = PORTB_HOTPLUG_LIVE_STATUS_VLV;
4083 break;
4084 case PORT_C:
4085 bit = PORTC_HOTPLUG_LIVE_STATUS_VLV;
4086 break;
4087 case PORT_D:
4088 bit = PORTD_HOTPLUG_LIVE_STATUS_VLV;
4089 break;
4090 default:
Dave Airlie2a592be2014-09-01 16:58:12 +10004091 return -EINVAL;
Todd Previte232a6ee2014-01-23 00:13:41 -07004092 }
4093 } else {
4094 switch (intel_dig_port->port) {
4095 case PORT_B:
4096 bit = PORTB_HOTPLUG_LIVE_STATUS_G4X;
4097 break;
4098 case PORT_C:
4099 bit = PORTC_HOTPLUG_LIVE_STATUS_G4X;
4100 break;
4101 case PORT_D:
4102 bit = PORTD_HOTPLUG_LIVE_STATUS_G4X;
4103 break;
4104 default:
Dave Airlie2a592be2014-09-01 16:58:12 +10004105 return -EINVAL;
Todd Previte232a6ee2014-01-23 00:13:41 -07004106 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004107 }
4108
Chris Wilson10f76a32012-05-11 18:01:32 +01004109 if ((I915_READ(PORT_HOTPLUG_STAT) & bit) == 0)
Dave Airlie2a592be2014-09-01 16:58:12 +10004110 return 0;
4111 return 1;
4112}
4113
4114static enum drm_connector_status
4115g4x_dp_detect(struct intel_dp *intel_dp)
4116{
4117 struct drm_device *dev = intel_dp_to_dev(intel_dp);
4118 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
4119 int ret;
4120
4121 /* Can't disconnect eDP, but you can close the lid... */
4122 if (is_edp(intel_dp)) {
4123 enum drm_connector_status status;
4124
4125 status = intel_panel_detect(dev);
4126 if (status == connector_status_unknown)
4127 status = connector_status_connected;
4128 return status;
4129 }
4130
4131 ret = g4x_digital_port_connected(dev, intel_dig_port);
4132 if (ret == -EINVAL)
4133 return connector_status_unknown;
4134 else if (ret == 0)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004135 return connector_status_disconnected;
4136
Keith Packard26d61aa2011-07-25 20:01:09 -07004137 return intel_dp_detect_dpcd(intel_dp);
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004138}
4139
Keith Packard8c241fe2011-09-28 16:38:44 -07004140static struct edid *
Chris Wilsonbeb60602014-09-02 20:04:00 +01004141intel_dp_get_edid(struct intel_dp *intel_dp)
Keith Packard8c241fe2011-09-28 16:38:44 -07004142{
Chris Wilsonbeb60602014-09-02 20:04:00 +01004143 struct intel_connector *intel_connector = intel_dp->attached_connector;
Keith Packard8c241fe2011-09-28 16:38:44 -07004144
Jani Nikula9cd300e2012-10-19 14:51:52 +03004145 /* use cached edid if we have one */
4146 if (intel_connector->edid) {
Jani Nikula9cd300e2012-10-19 14:51:52 +03004147 /* invalid edid */
4148 if (IS_ERR(intel_connector->edid))
Jesse Barnesd6f24d02012-06-14 15:28:33 -04004149 return NULL;
4150
Jani Nikula55e9ede2013-10-01 10:38:54 +03004151 return drm_edid_duplicate(intel_connector->edid);
Chris Wilsonbeb60602014-09-02 20:04:00 +01004152 } else
4153 return drm_get_edid(&intel_connector->base,
4154 &intel_dp->aux.ddc);
Keith Packard8c241fe2011-09-28 16:38:44 -07004155}
4156
Chris Wilsonbeb60602014-09-02 20:04:00 +01004157static void
4158intel_dp_set_edid(struct intel_dp *intel_dp)
Keith Packard8c241fe2011-09-28 16:38:44 -07004159{
Chris Wilsonbeb60602014-09-02 20:04:00 +01004160 struct intel_connector *intel_connector = intel_dp->attached_connector;
4161 struct edid *edid;
Keith Packard8c241fe2011-09-28 16:38:44 -07004162
Chris Wilsonbeb60602014-09-02 20:04:00 +01004163 edid = intel_dp_get_edid(intel_dp);
4164 intel_connector->detect_edid = edid;
Jani Nikula9cd300e2012-10-19 14:51:52 +03004165
Chris Wilsonbeb60602014-09-02 20:04:00 +01004166 if (intel_dp->force_audio != HDMI_AUDIO_AUTO)
4167 intel_dp->has_audio = intel_dp->force_audio == HDMI_AUDIO_ON;
4168 else
4169 intel_dp->has_audio = drm_detect_monitor_audio(edid);
4170}
Jesse Barnesd6f24d02012-06-14 15:28:33 -04004171
Chris Wilsonbeb60602014-09-02 20:04:00 +01004172static void
4173intel_dp_unset_edid(struct intel_dp *intel_dp)
4174{
4175 struct intel_connector *intel_connector = intel_dp->attached_connector;
4176
4177 kfree(intel_connector->detect_edid);
4178 intel_connector->detect_edid = NULL;
4179
4180 intel_dp->has_audio = false;
4181}
4182
4183static enum intel_display_power_domain
4184intel_dp_power_get(struct intel_dp *dp)
4185{
4186 struct intel_encoder *encoder = &dp_to_dig_port(dp)->base;
4187 enum intel_display_power_domain power_domain;
4188
4189 power_domain = intel_display_port_power_domain(encoder);
4190 intel_display_power_get(to_i915(encoder->base.dev), power_domain);
4191
4192 return power_domain;
4193}
4194
4195static void
4196intel_dp_power_put(struct intel_dp *dp,
4197 enum intel_display_power_domain power_domain)
4198{
4199 struct intel_encoder *encoder = &dp_to_dig_port(dp)->base;
4200 intel_display_power_put(to_i915(encoder->base.dev), power_domain);
Keith Packard8c241fe2011-09-28 16:38:44 -07004201}
4202
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004203static enum drm_connector_status
4204intel_dp_detect(struct drm_connector *connector, bool force)
4205{
4206 struct intel_dp *intel_dp = intel_attached_dp(connector);
Paulo Zanonid63885d2012-10-26 19:05:49 -02004207 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
4208 struct intel_encoder *intel_encoder = &intel_dig_port->base;
Paulo Zanonifa90ece2012-10-26 19:05:44 -02004209 struct drm_device *dev = connector->dev;
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004210 enum drm_connector_status status;
Imre Deak671dedd2014-03-05 16:20:53 +02004211 enum intel_display_power_domain power_domain;
Dave Airlie0e32b392014-05-02 14:02:48 +10004212 bool ret;
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004213
Chris Wilson164c8592013-07-20 20:27:08 +01004214 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
Jani Nikulac23cc412014-06-03 14:56:17 +03004215 connector->base.id, connector->name);
Chris Wilsonbeb60602014-09-02 20:04:00 +01004216 intel_dp_unset_edid(intel_dp);
Chris Wilson164c8592013-07-20 20:27:08 +01004217
Dave Airlie0e32b392014-05-02 14:02:48 +10004218 if (intel_dp->is_mst) {
4219 /* MST devices are disconnected from a monitor POV */
4220 if (intel_encoder->type != INTEL_OUTPUT_EDP)
4221 intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT;
Chris Wilsonbeb60602014-09-02 20:04:00 +01004222 return connector_status_disconnected;
Dave Airlie0e32b392014-05-02 14:02:48 +10004223 }
4224
Chris Wilsonbeb60602014-09-02 20:04:00 +01004225 power_domain = intel_dp_power_get(intel_dp);
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004226
Chris Wilsond410b562014-09-02 20:03:59 +01004227 /* Can't disconnect eDP, but you can close the lid... */
4228 if (is_edp(intel_dp))
4229 status = edp_detect(intel_dp);
4230 else if (HAS_PCH_SPLIT(dev))
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004231 status = ironlake_dp_detect(intel_dp);
4232 else
4233 status = g4x_dp_detect(intel_dp);
4234 if (status != connector_status_connected)
Paulo Zanonic8c8fb32013-11-27 18:21:54 -02004235 goto out;
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004236
Adam Jackson0d198322012-05-14 16:05:47 -04004237 intel_dp_probe_oui(intel_dp);
4238
Dave Airlie0e32b392014-05-02 14:02:48 +10004239 ret = intel_dp_probe_mst(intel_dp);
4240 if (ret) {
4241 /* if we are in MST mode then this connector
4242 won't appear connected or have anything with EDID on it */
4243 if (intel_encoder->type != INTEL_OUTPUT_EDP)
4244 intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT;
4245 status = connector_status_disconnected;
4246 goto out;
4247 }
4248
Chris Wilsonbeb60602014-09-02 20:04:00 +01004249 intel_dp_set_edid(intel_dp);
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004250
Paulo Zanonid63885d2012-10-26 19:05:49 -02004251 if (intel_encoder->type != INTEL_OUTPUT_EDP)
4252 intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT;
Paulo Zanonic8c8fb32013-11-27 18:21:54 -02004253 status = connector_status_connected;
4254
4255out:
Chris Wilsonbeb60602014-09-02 20:04:00 +01004256 intel_dp_power_put(intel_dp, power_domain);
Paulo Zanonic8c8fb32013-11-27 18:21:54 -02004257 return status;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004258}
4259
Chris Wilsonbeb60602014-09-02 20:04:00 +01004260static void
4261intel_dp_force(struct drm_connector *connector)
4262{
4263 struct intel_dp *intel_dp = intel_attached_dp(connector);
4264 struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base;
4265 enum intel_display_power_domain power_domain;
4266
4267 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
4268 connector->base.id, connector->name);
4269 intel_dp_unset_edid(intel_dp);
4270
4271 if (connector->status != connector_status_connected)
4272 return;
4273
4274 power_domain = intel_dp_power_get(intel_dp);
4275
4276 intel_dp_set_edid(intel_dp);
4277
4278 intel_dp_power_put(intel_dp, power_domain);
4279
4280 if (intel_encoder->type != INTEL_OUTPUT_EDP)
4281 intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT;
4282}
4283
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004284static int intel_dp_get_modes(struct drm_connector *connector)
4285{
Jani Nikuladd06f902012-10-19 14:51:50 +03004286 struct intel_connector *intel_connector = to_intel_connector(connector);
Chris Wilsonbeb60602014-09-02 20:04:00 +01004287 struct edid *edid;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004288
Chris Wilsonbeb60602014-09-02 20:04:00 +01004289 edid = intel_connector->detect_edid;
4290 if (edid) {
4291 int ret = intel_connector_update_modes(connector, edid);
4292 if (ret)
4293 return ret;
4294 }
Zhenyu Wang32f9d652009-07-24 01:00:32 +08004295
Jani Nikulaf8779fd2012-10-19 14:51:48 +03004296 /* if eDP has no EDID, fall back to fixed mode */
Chris Wilsonbeb60602014-09-02 20:04:00 +01004297 if (is_edp(intel_attached_dp(connector)) &&
4298 intel_connector->panel.fixed_mode) {
Jani Nikulaf8779fd2012-10-19 14:51:48 +03004299 struct drm_display_mode *mode;
Chris Wilsonbeb60602014-09-02 20:04:00 +01004300
4301 mode = drm_mode_duplicate(connector->dev,
Jani Nikuladd06f902012-10-19 14:51:50 +03004302 intel_connector->panel.fixed_mode);
Jani Nikulaf8779fd2012-10-19 14:51:48 +03004303 if (mode) {
Zhenyu Wang32f9d652009-07-24 01:00:32 +08004304 drm_mode_probed_add(connector, mode);
4305 return 1;
4306 }
4307 }
Chris Wilsonbeb60602014-09-02 20:04:00 +01004308
Zhenyu Wang32f9d652009-07-24 01:00:32 +08004309 return 0;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004310}
4311
Chris Wilson1aad7ac2011-02-09 18:46:58 +00004312static bool
4313intel_dp_detect_audio(struct drm_connector *connector)
4314{
Chris Wilson1aad7ac2011-02-09 18:46:58 +00004315 bool has_audio = false;
Chris Wilsonbeb60602014-09-02 20:04:00 +01004316 struct edid *edid;
Chris Wilson1aad7ac2011-02-09 18:46:58 +00004317
Chris Wilsonbeb60602014-09-02 20:04:00 +01004318 edid = to_intel_connector(connector)->detect_edid;
4319 if (edid)
Chris Wilson1aad7ac2011-02-09 18:46:58 +00004320 has_audio = drm_detect_monitor_audio(edid);
Imre Deak671dedd2014-03-05 16:20:53 +02004321
Chris Wilson1aad7ac2011-02-09 18:46:58 +00004322 return has_audio;
4323}
4324
Chris Wilsonf6849602010-09-19 09:29:33 +01004325static int
4326intel_dp_set_property(struct drm_connector *connector,
4327 struct drm_property *property,
4328 uint64_t val)
4329{
Chris Wilsone953fd72011-02-21 22:23:52 +00004330 struct drm_i915_private *dev_priv = connector->dev->dev_private;
Yuly Novikov53b41832012-10-26 12:04:00 +03004331 struct intel_connector *intel_connector = to_intel_connector(connector);
Paulo Zanonida63a9f2012-10-26 19:05:46 -02004332 struct intel_encoder *intel_encoder = intel_attached_encoder(connector);
4333 struct intel_dp *intel_dp = enc_to_intel_dp(&intel_encoder->base);
Chris Wilsonf6849602010-09-19 09:29:33 +01004334 int ret;
4335
Rob Clark662595d2012-10-11 20:36:04 -05004336 ret = drm_object_property_set_value(&connector->base, property, val);
Chris Wilsonf6849602010-09-19 09:29:33 +01004337 if (ret)
4338 return ret;
4339
Chris Wilson3f43c482011-05-12 22:17:24 +01004340 if (property == dev_priv->force_audio_property) {
Chris Wilson1aad7ac2011-02-09 18:46:58 +00004341 int i = val;
4342 bool has_audio;
4343
4344 if (i == intel_dp->force_audio)
Chris Wilsonf6849602010-09-19 09:29:33 +01004345 return 0;
4346
Chris Wilson1aad7ac2011-02-09 18:46:58 +00004347 intel_dp->force_audio = i;
Chris Wilsonf6849602010-09-19 09:29:33 +01004348
Daniel Vetterc3e5f672012-02-23 17:14:47 +01004349 if (i == HDMI_AUDIO_AUTO)
Chris Wilson1aad7ac2011-02-09 18:46:58 +00004350 has_audio = intel_dp_detect_audio(connector);
4351 else
Daniel Vetterc3e5f672012-02-23 17:14:47 +01004352 has_audio = (i == HDMI_AUDIO_ON);
Chris Wilson1aad7ac2011-02-09 18:46:58 +00004353
4354 if (has_audio == intel_dp->has_audio)
Chris Wilsonf6849602010-09-19 09:29:33 +01004355 return 0;
4356
Chris Wilson1aad7ac2011-02-09 18:46:58 +00004357 intel_dp->has_audio = has_audio;
Chris Wilsonf6849602010-09-19 09:29:33 +01004358 goto done;
4359 }
4360
Chris Wilsone953fd72011-02-21 22:23:52 +00004361 if (property == dev_priv->broadcast_rgb_property) {
Daniel Vetterae4edb82013-04-22 17:07:23 +02004362 bool old_auto = intel_dp->color_range_auto;
4363 uint32_t old_range = intel_dp->color_range;
4364
Ville Syrjälä55bc60d2013-01-17 16:31:29 +02004365 switch (val) {
4366 case INTEL_BROADCAST_RGB_AUTO:
4367 intel_dp->color_range_auto = true;
4368 break;
4369 case INTEL_BROADCAST_RGB_FULL:
4370 intel_dp->color_range_auto = false;
4371 intel_dp->color_range = 0;
4372 break;
4373 case INTEL_BROADCAST_RGB_LIMITED:
4374 intel_dp->color_range_auto = false;
4375 intel_dp->color_range = DP_COLOR_RANGE_16_235;
4376 break;
4377 default:
4378 return -EINVAL;
4379 }
Daniel Vetterae4edb82013-04-22 17:07:23 +02004380
4381 if (old_auto == intel_dp->color_range_auto &&
4382 old_range == intel_dp->color_range)
4383 return 0;
4384
Chris Wilsone953fd72011-02-21 22:23:52 +00004385 goto done;
4386 }
4387
Yuly Novikov53b41832012-10-26 12:04:00 +03004388 if (is_edp(intel_dp) &&
4389 property == connector->dev->mode_config.scaling_mode_property) {
4390 if (val == DRM_MODE_SCALE_NONE) {
4391 DRM_DEBUG_KMS("no scaling not supported\n");
4392 return -EINVAL;
4393 }
4394
4395 if (intel_connector->panel.fitting_mode == val) {
4396 /* the eDP scaling property is not changed */
4397 return 0;
4398 }
4399 intel_connector->panel.fitting_mode = val;
4400
4401 goto done;
4402 }
4403
Chris Wilsonf6849602010-09-19 09:29:33 +01004404 return -EINVAL;
4405
4406done:
Chris Wilsonc0c36b942012-12-19 16:08:43 +00004407 if (intel_encoder->base.crtc)
4408 intel_crtc_restore_mode(intel_encoder->base.crtc);
Chris Wilsonf6849602010-09-19 09:29:33 +01004409
4410 return 0;
4411}
4412
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004413static void
Paulo Zanoni73845ad2013-06-12 17:27:30 -03004414intel_dp_connector_destroy(struct drm_connector *connector)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004415{
Jani Nikula1d508702012-10-19 14:51:49 +03004416 struct intel_connector *intel_connector = to_intel_connector(connector);
Matthew Garrettaaa6fd22011-08-12 12:11:33 +02004417
Chris Wilson10e972d2014-09-04 21:43:45 +01004418 kfree(intel_connector->detect_edid);
Chris Wilsonbeb60602014-09-02 20:04:00 +01004419
Jani Nikula9cd300e2012-10-19 14:51:52 +03004420 if (!IS_ERR_OR_NULL(intel_connector->edid))
4421 kfree(intel_connector->edid);
4422
Paulo Zanoniacd8db102013-06-12 17:27:23 -03004423 /* Can't call is_edp() since the encoder may have been destroyed
4424 * already. */
4425 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP)
Jani Nikula1d508702012-10-19 14:51:49 +03004426 intel_panel_fini(&intel_connector->panel);
Matthew Garrettaaa6fd22011-08-12 12:11:33 +02004427
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004428 drm_connector_cleanup(connector);
Zhenyu Wang55f78c42010-03-29 16:13:57 +08004429 kfree(connector);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004430}
4431
Paulo Zanoni00c09d72012-10-26 19:05:52 -02004432void intel_dp_encoder_destroy(struct drm_encoder *encoder)
Daniel Vetter24d05922010-08-20 18:08:28 +02004433{
Paulo Zanonida63a9f2012-10-26 19:05:46 -02004434 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
4435 struct intel_dp *intel_dp = &intel_dig_port->dp;
Daniel Vetter24d05922010-08-20 18:08:28 +02004436
Dave Airlie4f71d0c2014-06-04 16:02:28 +10004437 drm_dp_aux_unregister(&intel_dp->aux);
Dave Airlie0e32b392014-05-02 14:02:48 +10004438 intel_dp_mst_encoder_cleanup(intel_dig_port);
Keith Packardbd943152011-09-18 23:09:52 -07004439 if (is_edp(intel_dp)) {
4440 cancel_delayed_work_sync(&intel_dp->panel_vdd_work);
Ville Syrjälä951468f2014-09-04 14:55:31 +03004441 /*
4442 * vdd might still be enabled do to the delayed vdd off.
4443 * Make sure vdd is actually turned off here.
4444 */
Ville Syrjälä773538e82014-09-04 14:54:56 +03004445 pps_lock(intel_dp);
Daniel Vetter4be73782014-01-17 14:39:48 +01004446 edp_panel_vdd_off_sync(intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03004447 pps_unlock(intel_dp);
4448
Clint Taylor01527b32014-07-07 13:01:46 -07004449 if (intel_dp->edp_notifier.notifier_call) {
4450 unregister_reboot_notifier(&intel_dp->edp_notifier);
4451 intel_dp->edp_notifier.notifier_call = NULL;
4452 }
Keith Packardbd943152011-09-18 23:09:52 -07004453 }
Imre Deakc8bd0e42014-12-12 17:57:38 +02004454 drm_encoder_cleanup(encoder);
Paulo Zanonida63a9f2012-10-26 19:05:46 -02004455 kfree(intel_dig_port);
Daniel Vetter24d05922010-08-20 18:08:28 +02004456}
4457
Imre Deak07f9cd02014-08-18 14:42:45 +03004458static void intel_dp_encoder_suspend(struct intel_encoder *intel_encoder)
4459{
4460 struct intel_dp *intel_dp = enc_to_intel_dp(&intel_encoder->base);
4461
4462 if (!is_edp(intel_dp))
4463 return;
4464
Ville Syrjälä951468f2014-09-04 14:55:31 +03004465 /*
4466 * vdd might still be enabled do to the delayed vdd off.
4467 * Make sure vdd is actually turned off here.
4468 */
Ville Syrjäläafa4e532014-11-25 15:43:48 +02004469 cancel_delayed_work_sync(&intel_dp->panel_vdd_work);
Ville Syrjälä773538e82014-09-04 14:54:56 +03004470 pps_lock(intel_dp);
Imre Deak07f9cd02014-08-18 14:42:45 +03004471 edp_panel_vdd_off_sync(intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03004472 pps_unlock(intel_dp);
Imre Deak07f9cd02014-08-18 14:42:45 +03004473}
4474
Ville Syrjälä49e6bc52014-10-28 16:15:52 +02004475static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp)
4476{
4477 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
4478 struct drm_device *dev = intel_dig_port->base.base.dev;
4479 struct drm_i915_private *dev_priv = dev->dev_private;
4480 enum intel_display_power_domain power_domain;
4481
4482 lockdep_assert_held(&dev_priv->pps_mutex);
4483
4484 if (!edp_have_panel_vdd(intel_dp))
4485 return;
4486
4487 /*
4488 * The VDD bit needs a power domain reference, so if the bit is
4489 * already enabled when we boot or resume, grab this reference and
4490 * schedule a vdd off, so we don't hold on to the reference
4491 * indefinitely.
4492 */
4493 DRM_DEBUG_KMS("VDD left on by BIOS, adjusting state tracking\n");
4494 power_domain = intel_display_port_power_domain(&intel_dig_port->base);
4495 intel_display_power_get(dev_priv, power_domain);
4496
4497 edp_panel_vdd_schedule_off(intel_dp);
4498}
4499
Imre Deak6d93c0c2014-07-31 14:03:36 +03004500static void intel_dp_encoder_reset(struct drm_encoder *encoder)
4501{
Ville Syrjälä49e6bc52014-10-28 16:15:52 +02004502 struct intel_dp *intel_dp;
4503
4504 if (to_intel_encoder(encoder)->type != INTEL_OUTPUT_EDP)
4505 return;
4506
4507 intel_dp = enc_to_intel_dp(encoder);
4508
4509 pps_lock(intel_dp);
4510
4511 /*
4512 * Read out the current power sequencer assignment,
4513 * in case the BIOS did something with it.
4514 */
4515 if (IS_VALLEYVIEW(encoder->dev))
4516 vlv_initial_power_sequencer_setup(intel_dp);
4517
4518 intel_edp_panel_vdd_sanitize(intel_dp);
4519
4520 pps_unlock(intel_dp);
Imre Deak6d93c0c2014-07-31 14:03:36 +03004521}
4522
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004523static const struct drm_connector_funcs intel_dp_connector_funcs = {
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02004524 .dpms = intel_connector_dpms,
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004525 .detect = intel_dp_detect,
Chris Wilsonbeb60602014-09-02 20:04:00 +01004526 .force = intel_dp_force,
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004527 .fill_modes = drm_helper_probe_single_connector_modes,
Chris Wilsonf6849602010-09-19 09:29:33 +01004528 .set_property = intel_dp_set_property,
Matt Roper2545e4a2015-01-22 16:51:27 -08004529 .atomic_get_property = intel_connector_atomic_get_property,
Paulo Zanoni73845ad2013-06-12 17:27:30 -03004530 .destroy = intel_dp_connector_destroy,
Matt Roperc6f95f22015-01-22 16:50:32 -08004531 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004532};
4533
4534static const struct drm_connector_helper_funcs intel_dp_connector_helper_funcs = {
4535 .get_modes = intel_dp_get_modes,
4536 .mode_valid = intel_dp_mode_valid,
Chris Wilsondf0e9242010-09-09 16:20:55 +01004537 .best_encoder = intel_best_encoder,
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004538};
4539
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004540static const struct drm_encoder_funcs intel_dp_enc_funcs = {
Imre Deak6d93c0c2014-07-31 14:03:36 +03004541 .reset = intel_dp_encoder_reset,
Daniel Vetter24d05922010-08-20 18:08:28 +02004542 .destroy = intel_dp_encoder_destroy,
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004543};
4544
Dave Airlie0e32b392014-05-02 14:02:48 +10004545void
Eric Anholt21d40d32010-03-25 11:11:14 -07004546intel_dp_hot_plug(struct intel_encoder *intel_encoder)
Keith Packardc8110e52009-05-06 11:51:10 -07004547{
Dave Airlie0e32b392014-05-02 14:02:48 +10004548 return;
Keith Packardc8110e52009-05-06 11:51:10 -07004549}
4550
Daniel Vetterb2c5c182015-01-23 06:00:31 +01004551enum irqreturn
Dave Airlie13cf5502014-06-18 11:29:35 +10004552intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
4553{
4554 struct intel_dp *intel_dp = &intel_dig_port->dp;
Imre Deak1c767b32014-08-18 14:42:42 +03004555 struct intel_encoder *intel_encoder = &intel_dig_port->base;
Dave Airlie0e32b392014-05-02 14:02:48 +10004556 struct drm_device *dev = intel_dig_port->base.base.dev;
4557 struct drm_i915_private *dev_priv = dev->dev_private;
Imre Deak1c767b32014-08-18 14:42:42 +03004558 enum intel_display_power_domain power_domain;
Daniel Vetterb2c5c182015-01-23 06:00:31 +01004559 enum irqreturn ret = IRQ_NONE;
Imre Deak1c767b32014-08-18 14:42:42 +03004560
Dave Airlie0e32b392014-05-02 14:02:48 +10004561 if (intel_dig_port->base.type != INTEL_OUTPUT_EDP)
4562 intel_dig_port->base.type = INTEL_OUTPUT_DISPLAYPORT;
Dave Airlie13cf5502014-06-18 11:29:35 +10004563
Ville Syrjälä7a7f84c2014-10-16 20:46:10 +03004564 if (long_hpd && intel_dig_port->base.type == INTEL_OUTPUT_EDP) {
4565 /*
4566 * vdd off can generate a long pulse on eDP which
4567 * would require vdd on to handle it, and thus we
4568 * would end up in an endless cycle of
4569 * "vdd off -> long hpd -> vdd on -> detect -> vdd off -> ..."
4570 */
4571 DRM_DEBUG_KMS("ignoring long hpd on eDP port %c\n",
4572 port_name(intel_dig_port->port));
Ville Syrjäläa8b3d522015-02-10 14:11:46 +02004573 return IRQ_HANDLED;
Ville Syrjälä7a7f84c2014-10-16 20:46:10 +03004574 }
4575
Ville Syrjälä26fbb772014-08-11 18:37:37 +03004576 DRM_DEBUG_KMS("got hpd irq on port %c - %s\n",
4577 port_name(intel_dig_port->port),
Dave Airlie0e32b392014-05-02 14:02:48 +10004578 long_hpd ? "long" : "short");
Dave Airlie13cf5502014-06-18 11:29:35 +10004579
Imre Deak1c767b32014-08-18 14:42:42 +03004580 power_domain = intel_display_port_power_domain(intel_encoder);
4581 intel_display_power_get(dev_priv, power_domain);
4582
Dave Airlie0e32b392014-05-02 14:02:48 +10004583 if (long_hpd) {
Dave Airlie2a592be2014-09-01 16:58:12 +10004584
4585 if (HAS_PCH_SPLIT(dev)) {
4586 if (!ibx_digital_port_connected(dev_priv, intel_dig_port))
4587 goto mst_fail;
4588 } else {
4589 if (g4x_digital_port_connected(dev, intel_dig_port) != 1)
4590 goto mst_fail;
4591 }
Dave Airlie0e32b392014-05-02 14:02:48 +10004592
4593 if (!intel_dp_get_dpcd(intel_dp)) {
4594 goto mst_fail;
4595 }
4596
4597 intel_dp_probe_oui(intel_dp);
4598
4599 if (!intel_dp_probe_mst(intel_dp))
4600 goto mst_fail;
4601
4602 } else {
4603 if (intel_dp->is_mst) {
Imre Deak1c767b32014-08-18 14:42:42 +03004604 if (intel_dp_check_mst_status(intel_dp) == -EINVAL)
Dave Airlie0e32b392014-05-02 14:02:48 +10004605 goto mst_fail;
4606 }
4607
4608 if (!intel_dp->is_mst) {
4609 /*
4610 * we'll check the link status via the normal hot plug path later -
4611 * but for short hpds we should check it now
4612 */
Dave Airlie5b215bc2014-08-05 10:40:20 +10004613 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
Dave Airlie0e32b392014-05-02 14:02:48 +10004614 intel_dp_check_link_status(intel_dp);
Dave Airlie5b215bc2014-08-05 10:40:20 +10004615 drm_modeset_unlock(&dev->mode_config.connection_mutex);
Dave Airlie0e32b392014-05-02 14:02:48 +10004616 }
4617 }
Daniel Vetterb2c5c182015-01-23 06:00:31 +01004618
4619 ret = IRQ_HANDLED;
4620
Imre Deak1c767b32014-08-18 14:42:42 +03004621 goto put_power;
Dave Airlie0e32b392014-05-02 14:02:48 +10004622mst_fail:
4623 /* if we were in MST mode, and device is not there get out of MST mode */
4624 if (intel_dp->is_mst) {
4625 DRM_DEBUG_KMS("MST device may have disappeared %d vs %d\n", intel_dp->is_mst, intel_dp->mst_mgr.mst_state);
4626 intel_dp->is_mst = false;
4627 drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr, intel_dp->is_mst);
4628 }
Imre Deak1c767b32014-08-18 14:42:42 +03004629put_power:
4630 intel_display_power_put(dev_priv, power_domain);
4631
4632 return ret;
Dave Airlie13cf5502014-06-18 11:29:35 +10004633}
4634
Zhenyu Wange3421a12010-04-08 09:43:27 +08004635/* Return which DP Port should be selected for Transcoder DP control */
4636int
Akshay Joshi0206e352011-08-16 15:34:10 -04004637intel_trans_dp_port_sel(struct drm_crtc *crtc)
Zhenyu Wange3421a12010-04-08 09:43:27 +08004638{
4639 struct drm_device *dev = crtc->dev;
Paulo Zanonifa90ece2012-10-26 19:05:44 -02004640 struct intel_encoder *intel_encoder;
4641 struct intel_dp *intel_dp;
Zhenyu Wange3421a12010-04-08 09:43:27 +08004642
Paulo Zanonifa90ece2012-10-26 19:05:44 -02004643 for_each_encoder_on_crtc(dev, crtc, intel_encoder) {
4644 intel_dp = enc_to_intel_dp(&intel_encoder->base);
Chris Wilsonea5b2132010-08-04 13:50:23 +01004645
Paulo Zanonifa90ece2012-10-26 19:05:44 -02004646 if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
4647 intel_encoder->type == INTEL_OUTPUT_EDP)
Chris Wilsonea5b2132010-08-04 13:50:23 +01004648 return intel_dp->output_reg;
Zhenyu Wange3421a12010-04-08 09:43:27 +08004649 }
Chris Wilsonea5b2132010-08-04 13:50:23 +01004650
Zhenyu Wange3421a12010-04-08 09:43:27 +08004651 return -1;
4652}
4653
Zhao Yakui36e83a12010-06-12 14:32:21 +08004654/* check the VBT to see whether the eDP is on DP-D port */
Ville Syrjälä5d8a7752013-11-01 18:22:39 +02004655bool intel_dp_is_edp(struct drm_device *dev, enum port port)
Zhao Yakui36e83a12010-06-12 14:32:21 +08004656{
4657 struct drm_i915_private *dev_priv = dev->dev_private;
Paulo Zanoni768f69c2013-09-11 18:02:47 -03004658 union child_device_config *p_child;
Zhao Yakui36e83a12010-06-12 14:32:21 +08004659 int i;
Ville Syrjälä5d8a7752013-11-01 18:22:39 +02004660 static const short port_mapping[] = {
4661 [PORT_B] = PORT_IDPB,
4662 [PORT_C] = PORT_IDPC,
4663 [PORT_D] = PORT_IDPD,
4664 };
Zhao Yakui36e83a12010-06-12 14:32:21 +08004665
Ville Syrjälä3b32a352013-11-01 18:22:41 +02004666 if (port == PORT_A)
4667 return true;
4668
Rodrigo Vivi41aa3442013-05-09 20:03:18 -03004669 if (!dev_priv->vbt.child_dev_num)
Zhao Yakui36e83a12010-06-12 14:32:21 +08004670 return false;
4671
Rodrigo Vivi41aa3442013-05-09 20:03:18 -03004672 for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
4673 p_child = dev_priv->vbt.child_dev + i;
Zhao Yakui36e83a12010-06-12 14:32:21 +08004674
Ville Syrjälä5d8a7752013-11-01 18:22:39 +02004675 if (p_child->common.dvo_port == port_mapping[port] &&
Ville Syrjäläf02586d2013-11-01 20:32:08 +02004676 (p_child->common.device_type & DEVICE_TYPE_eDP_BITS) ==
4677 (DEVICE_TYPE_eDP & DEVICE_TYPE_eDP_BITS))
Zhao Yakui36e83a12010-06-12 14:32:21 +08004678 return true;
4679 }
4680 return false;
4681}
4682
Dave Airlie0e32b392014-05-02 14:02:48 +10004683void
Chris Wilsonf6849602010-09-19 09:29:33 +01004684intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connector)
4685{
Yuly Novikov53b41832012-10-26 12:04:00 +03004686 struct intel_connector *intel_connector = to_intel_connector(connector);
4687
Chris Wilson3f43c482011-05-12 22:17:24 +01004688 intel_attach_force_audio_property(connector);
Chris Wilsone953fd72011-02-21 22:23:52 +00004689 intel_attach_broadcast_rgb_property(connector);
Ville Syrjälä55bc60d2013-01-17 16:31:29 +02004690 intel_dp->color_range_auto = true;
Yuly Novikov53b41832012-10-26 12:04:00 +03004691
4692 if (is_edp(intel_dp)) {
4693 drm_mode_create_scaling_mode_property(connector->dev);
Rob Clark6de6d842012-10-11 20:36:04 -05004694 drm_object_attach_property(
4695 &connector->base,
Yuly Novikov53b41832012-10-26 12:04:00 +03004696 connector->dev->mode_config.scaling_mode_property,
Yuly Novikov8e740cd2012-10-26 12:04:01 +03004697 DRM_MODE_SCALE_ASPECT);
4698 intel_connector->panel.fitting_mode = DRM_MODE_SCALE_ASPECT;
Yuly Novikov53b41832012-10-26 12:04:00 +03004699 }
Chris Wilsonf6849602010-09-19 09:29:33 +01004700}
4701
Imre Deakdada1a92014-01-29 13:25:41 +02004702static void intel_dp_init_panel_power_timestamps(struct intel_dp *intel_dp)
4703{
4704 intel_dp->last_power_cycle = jiffies;
4705 intel_dp->last_power_on = jiffies;
4706 intel_dp->last_backlight_off = jiffies;
4707}
4708
Daniel Vetter67a54562012-10-20 20:57:45 +02004709static void
4710intel_dp_init_panel_power_sequencer(struct drm_device *dev,
Ville Syrjälä36b5f422014-10-16 21:27:30 +03004711 struct intel_dp *intel_dp)
Daniel Vetter67a54562012-10-20 20:57:45 +02004712{
4713 struct drm_i915_private *dev_priv = dev->dev_private;
Ville Syrjälä36b5f422014-10-16 21:27:30 +03004714 struct edp_power_seq cur, vbt, spec,
4715 *final = &intel_dp->pps_delays;
Daniel Vetter67a54562012-10-20 20:57:45 +02004716 u32 pp_on, pp_off, pp_div, pp;
Jani Nikulabf13e812013-09-06 07:40:05 +03004717 int pp_ctrl_reg, pp_on_reg, pp_off_reg, pp_div_reg;
Jesse Barnes453c5422013-03-28 09:55:41 -07004718
Ville Syrjäläe39b9992014-09-04 14:53:14 +03004719 lockdep_assert_held(&dev_priv->pps_mutex);
4720
Ville Syrjälä81ddbc62014-10-16 21:27:31 +03004721 /* already initialized? */
4722 if (final->t11_t12 != 0)
4723 return;
4724
Jesse Barnes453c5422013-03-28 09:55:41 -07004725 if (HAS_PCH_SPLIT(dev)) {
Jani Nikulabf13e812013-09-06 07:40:05 +03004726 pp_ctrl_reg = PCH_PP_CONTROL;
Jesse Barnes453c5422013-03-28 09:55:41 -07004727 pp_on_reg = PCH_PP_ON_DELAYS;
4728 pp_off_reg = PCH_PP_OFF_DELAYS;
4729 pp_div_reg = PCH_PP_DIVISOR;
4730 } else {
Jani Nikulabf13e812013-09-06 07:40:05 +03004731 enum pipe pipe = vlv_power_sequencer_pipe(intel_dp);
4732
4733 pp_ctrl_reg = VLV_PIPE_PP_CONTROL(pipe);
4734 pp_on_reg = VLV_PIPE_PP_ON_DELAYS(pipe);
4735 pp_off_reg = VLV_PIPE_PP_OFF_DELAYS(pipe);
4736 pp_div_reg = VLV_PIPE_PP_DIVISOR(pipe);
Jesse Barnes453c5422013-03-28 09:55:41 -07004737 }
Daniel Vetter67a54562012-10-20 20:57:45 +02004738
4739 /* Workaround: Need to write PP_CONTROL with the unlock key as
4740 * the very first thing. */
Jesse Barnes453c5422013-03-28 09:55:41 -07004741 pp = ironlake_get_pp_control(intel_dp);
Jani Nikulabf13e812013-09-06 07:40:05 +03004742 I915_WRITE(pp_ctrl_reg, pp);
Daniel Vetter67a54562012-10-20 20:57:45 +02004743
Jesse Barnes453c5422013-03-28 09:55:41 -07004744 pp_on = I915_READ(pp_on_reg);
4745 pp_off = I915_READ(pp_off_reg);
4746 pp_div = I915_READ(pp_div_reg);
Daniel Vetter67a54562012-10-20 20:57:45 +02004747
4748 /* Pull timing values out of registers */
4749 cur.t1_t3 = (pp_on & PANEL_POWER_UP_DELAY_MASK) >>
4750 PANEL_POWER_UP_DELAY_SHIFT;
4751
4752 cur.t8 = (pp_on & PANEL_LIGHT_ON_DELAY_MASK) >>
4753 PANEL_LIGHT_ON_DELAY_SHIFT;
4754
4755 cur.t9 = (pp_off & PANEL_LIGHT_OFF_DELAY_MASK) >>
4756 PANEL_LIGHT_OFF_DELAY_SHIFT;
4757
4758 cur.t10 = (pp_off & PANEL_POWER_DOWN_DELAY_MASK) >>
4759 PANEL_POWER_DOWN_DELAY_SHIFT;
4760
4761 cur.t11_t12 = ((pp_div & PANEL_POWER_CYCLE_DELAY_MASK) >>
4762 PANEL_POWER_CYCLE_DELAY_SHIFT) * 1000;
4763
4764 DRM_DEBUG_KMS("cur t1_t3 %d t8 %d t9 %d t10 %d t11_t12 %d\n",
4765 cur.t1_t3, cur.t8, cur.t9, cur.t10, cur.t11_t12);
4766
Rodrigo Vivi41aa3442013-05-09 20:03:18 -03004767 vbt = dev_priv->vbt.edp_pps;
Daniel Vetter67a54562012-10-20 20:57:45 +02004768
4769 /* Upper limits from eDP 1.3 spec. Note that we use the clunky units of
4770 * our hw here, which are all in 100usec. */
4771 spec.t1_t3 = 210 * 10;
4772 spec.t8 = 50 * 10; /* no limit for t8, use t7 instead */
4773 spec.t9 = 50 * 10; /* no limit for t9, make it symmetric with t8 */
4774 spec.t10 = 500 * 10;
4775 /* This one is special and actually in units of 100ms, but zero
4776 * based in the hw (so we need to add 100 ms). But the sw vbt
4777 * table multiplies it with 1000 to make it in units of 100usec,
4778 * too. */
4779 spec.t11_t12 = (510 + 100) * 10;
4780
4781 DRM_DEBUG_KMS("vbt t1_t3 %d t8 %d t9 %d t10 %d t11_t12 %d\n",
4782 vbt.t1_t3, vbt.t8, vbt.t9, vbt.t10, vbt.t11_t12);
4783
4784 /* Use the max of the register settings and vbt. If both are
4785 * unset, fall back to the spec limits. */
Ville Syrjälä36b5f422014-10-16 21:27:30 +03004786#define assign_final(field) final->field = (max(cur.field, vbt.field) == 0 ? \
Daniel Vetter67a54562012-10-20 20:57:45 +02004787 spec.field : \
4788 max(cur.field, vbt.field))
4789 assign_final(t1_t3);
4790 assign_final(t8);
4791 assign_final(t9);
4792 assign_final(t10);
4793 assign_final(t11_t12);
4794#undef assign_final
4795
Ville Syrjälä36b5f422014-10-16 21:27:30 +03004796#define get_delay(field) (DIV_ROUND_UP(final->field, 10))
Daniel Vetter67a54562012-10-20 20:57:45 +02004797 intel_dp->panel_power_up_delay = get_delay(t1_t3);
4798 intel_dp->backlight_on_delay = get_delay(t8);
4799 intel_dp->backlight_off_delay = get_delay(t9);
4800 intel_dp->panel_power_down_delay = get_delay(t10);
4801 intel_dp->panel_power_cycle_delay = get_delay(t11_t12);
4802#undef get_delay
4803
Jani Nikulaf30d26e2013-01-16 10:53:40 +02004804 DRM_DEBUG_KMS("panel power up delay %d, power down delay %d, power cycle delay %d\n",
4805 intel_dp->panel_power_up_delay, intel_dp->panel_power_down_delay,
4806 intel_dp->panel_power_cycle_delay);
4807
4808 DRM_DEBUG_KMS("backlight on delay %d, off delay %d\n",
4809 intel_dp->backlight_on_delay, intel_dp->backlight_off_delay);
Jani Nikulaf30d26e2013-01-16 10:53:40 +02004810}
4811
4812static void
4813intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev,
Ville Syrjälä36b5f422014-10-16 21:27:30 +03004814 struct intel_dp *intel_dp)
Jani Nikulaf30d26e2013-01-16 10:53:40 +02004815{
4816 struct drm_i915_private *dev_priv = dev->dev_private;
Jesse Barnes453c5422013-03-28 09:55:41 -07004817 u32 pp_on, pp_off, pp_div, port_sel = 0;
4818 int div = HAS_PCH_SPLIT(dev) ? intel_pch_rawclk(dev) : intel_hrawclk(dev);
4819 int pp_on_reg, pp_off_reg, pp_div_reg;
Ville Syrjäläad933b52014-08-18 22:15:56 +03004820 enum port port = dp_to_dig_port(intel_dp)->port;
Ville Syrjälä36b5f422014-10-16 21:27:30 +03004821 const struct edp_power_seq *seq = &intel_dp->pps_delays;
Jesse Barnes453c5422013-03-28 09:55:41 -07004822
Ville Syrjäläe39b9992014-09-04 14:53:14 +03004823 lockdep_assert_held(&dev_priv->pps_mutex);
Jesse Barnes453c5422013-03-28 09:55:41 -07004824
4825 if (HAS_PCH_SPLIT(dev)) {
4826 pp_on_reg = PCH_PP_ON_DELAYS;
4827 pp_off_reg = PCH_PP_OFF_DELAYS;
4828 pp_div_reg = PCH_PP_DIVISOR;
4829 } else {
Jani Nikulabf13e812013-09-06 07:40:05 +03004830 enum pipe pipe = vlv_power_sequencer_pipe(intel_dp);
4831
4832 pp_on_reg = VLV_PIPE_PP_ON_DELAYS(pipe);
4833 pp_off_reg = VLV_PIPE_PP_OFF_DELAYS(pipe);
4834 pp_div_reg = VLV_PIPE_PP_DIVISOR(pipe);
Jesse Barnes453c5422013-03-28 09:55:41 -07004835 }
4836
Paulo Zanonib2f19d12013-12-19 14:29:44 -02004837 /*
4838 * And finally store the new values in the power sequencer. The
4839 * backlight delays are set to 1 because we do manual waits on them. For
4840 * T8, even BSpec recommends doing it. For T9, if we don't do this,
4841 * we'll end up waiting for the backlight off delay twice: once when we
4842 * do the manual sleep, and once when we disable the panel and wait for
4843 * the PP_STATUS bit to become zero.
4844 */
Jani Nikulaf30d26e2013-01-16 10:53:40 +02004845 pp_on = (seq->t1_t3 << PANEL_POWER_UP_DELAY_SHIFT) |
Paulo Zanonib2f19d12013-12-19 14:29:44 -02004846 (1 << PANEL_LIGHT_ON_DELAY_SHIFT);
4847 pp_off = (1 << PANEL_LIGHT_OFF_DELAY_SHIFT) |
Jani Nikulaf30d26e2013-01-16 10:53:40 +02004848 (seq->t10 << PANEL_POWER_DOWN_DELAY_SHIFT);
Daniel Vetter67a54562012-10-20 20:57:45 +02004849 /* Compute the divisor for the pp clock, simply match the Bspec
4850 * formula. */
Jesse Barnes453c5422013-03-28 09:55:41 -07004851 pp_div = ((100 * div)/2 - 1) << PP_REFERENCE_DIVIDER_SHIFT;
Jani Nikulaf30d26e2013-01-16 10:53:40 +02004852 pp_div |= (DIV_ROUND_UP(seq->t11_t12, 1000)
Daniel Vetter67a54562012-10-20 20:57:45 +02004853 << PANEL_POWER_CYCLE_DELAY_SHIFT);
4854
4855 /* Haswell doesn't have any port selection bits for the panel
4856 * power sequencer any more. */
Imre Deakbc7d38a2013-05-16 14:40:36 +03004857 if (IS_VALLEYVIEW(dev)) {
Ville Syrjäläad933b52014-08-18 22:15:56 +03004858 port_sel = PANEL_PORT_SELECT_VLV(port);
Imre Deakbc7d38a2013-05-16 14:40:36 +03004859 } else if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev)) {
Ville Syrjäläad933b52014-08-18 22:15:56 +03004860 if (port == PORT_A)
Jani Nikulaa24c1442013-09-05 16:44:46 +03004861 port_sel = PANEL_PORT_SELECT_DPA;
Daniel Vetter67a54562012-10-20 20:57:45 +02004862 else
Jani Nikulaa24c1442013-09-05 16:44:46 +03004863 port_sel = PANEL_PORT_SELECT_DPD;
Daniel Vetter67a54562012-10-20 20:57:45 +02004864 }
4865
Jesse Barnes453c5422013-03-28 09:55:41 -07004866 pp_on |= port_sel;
4867
4868 I915_WRITE(pp_on_reg, pp_on);
4869 I915_WRITE(pp_off_reg, pp_off);
4870 I915_WRITE(pp_div_reg, pp_div);
Daniel Vetter67a54562012-10-20 20:57:45 +02004871
Daniel Vetter67a54562012-10-20 20:57:45 +02004872 DRM_DEBUG_KMS("panel power sequencer register settings: PP_ON %#x, PP_OFF %#x, PP_DIV %#x\n",
Jesse Barnes453c5422013-03-28 09:55:41 -07004873 I915_READ(pp_on_reg),
4874 I915_READ(pp_off_reg),
4875 I915_READ(pp_div_reg));
Keith Packardc8110e52009-05-06 11:51:10 -07004876}
4877
Vandana Kannanb33a2812015-02-13 15:33:03 +05304878/**
4879 * intel_dp_set_drrs_state - program registers for RR switch to take effect
4880 * @dev: DRM device
4881 * @refresh_rate: RR to be programmed
4882 *
4883 * This function gets called when refresh rate (RR) has to be changed from
4884 * one frequency to another. Switches can be between high and low RR
4885 * supported by the panel or to any other RR based on media playback (in
4886 * this case, RR value needs to be passed from user space).
4887 *
4888 * The caller of this function needs to take a lock on dev_priv->drrs.
4889 */
Vandana Kannan96178ee2015-01-10 02:25:56 +05304890static void intel_dp_set_drrs_state(struct drm_device *dev, int refresh_rate)
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05304891{
4892 struct drm_i915_private *dev_priv = dev->dev_private;
4893 struct intel_encoder *encoder;
Vandana Kannan96178ee2015-01-10 02:25:56 +05304894 struct intel_digital_port *dig_port = NULL;
4895 struct intel_dp *intel_dp = dev_priv->drrs.dp;
Ander Conselvan de Oliveira5cec2582015-01-15 14:55:21 +02004896 struct intel_crtc_state *config = NULL;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05304897 struct intel_crtc *intel_crtc = NULL;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05304898 u32 reg, val;
Vandana Kannan96178ee2015-01-10 02:25:56 +05304899 enum drrs_refresh_rate_type index = DRRS_HIGH_RR;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05304900
4901 if (refresh_rate <= 0) {
4902 DRM_DEBUG_KMS("Refresh rate should be positive non-zero.\n");
4903 return;
4904 }
4905
Vandana Kannan96178ee2015-01-10 02:25:56 +05304906 if (intel_dp == NULL) {
4907 DRM_DEBUG_KMS("DRRS not supported.\n");
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05304908 return;
4909 }
4910
Daniel Vetter1fcc9d12014-07-11 10:30:10 -07004911 /*
Rodrigo Vivie4d59f62014-11-20 02:22:08 -08004912 * FIXME: This needs proper synchronization with psr state for some
4913 * platforms that cannot have PSR and DRRS enabled at the same time.
Daniel Vetter1fcc9d12014-07-11 10:30:10 -07004914 */
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05304915
Vandana Kannan96178ee2015-01-10 02:25:56 +05304916 dig_port = dp_to_dig_port(intel_dp);
4917 encoder = &dig_port->base;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05304918 intel_crtc = encoder->new_crtc;
4919
4920 if (!intel_crtc) {
4921 DRM_DEBUG_KMS("DRRS: intel_crtc not initialized\n");
4922 return;
4923 }
4924
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02004925 config = intel_crtc->config;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05304926
Vandana Kannan96178ee2015-01-10 02:25:56 +05304927 if (dev_priv->drrs.type < SEAMLESS_DRRS_SUPPORT) {
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05304928 DRM_DEBUG_KMS("Only Seamless DRRS supported.\n");
4929 return;
4930 }
4931
Vandana Kannan96178ee2015-01-10 02:25:56 +05304932 if (intel_dp->attached_connector->panel.downclock_mode->vrefresh ==
4933 refresh_rate)
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05304934 index = DRRS_LOW_RR;
4935
Vandana Kannan96178ee2015-01-10 02:25:56 +05304936 if (index == dev_priv->drrs.refresh_rate_type) {
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05304937 DRM_DEBUG_KMS(
4938 "DRRS requested for previously set RR...ignoring\n");
4939 return;
4940 }
4941
4942 if (!intel_crtc->active) {
4943 DRM_DEBUG_KMS("eDP encoder disabled. CRTC not Active\n");
4944 return;
4945 }
4946
Durgadoss R44395bf2015-02-13 15:33:02 +05304947 if (INTEL_INFO(dev)->gen >= 8 && !IS_CHERRYVIEW(dev)) {
Vandana Kannana4c30b12015-02-13 15:33:00 +05304948 switch (index) {
4949 case DRRS_HIGH_RR:
4950 intel_dp_set_m_n(intel_crtc, M1_N1);
4951 break;
4952 case DRRS_LOW_RR:
4953 intel_dp_set_m_n(intel_crtc, M2_N2);
4954 break;
4955 case DRRS_MAX_RR:
4956 default:
4957 DRM_ERROR("Unsupported refreshrate type\n");
4958 }
4959 } else if (INTEL_INFO(dev)->gen > 6) {
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02004960 reg = PIPECONF(intel_crtc->config->cpu_transcoder);
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05304961 val = I915_READ(reg);
Vandana Kannana4c30b12015-02-13 15:33:00 +05304962
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05304963 if (index > DRRS_HIGH_RR) {
Vandana Kannan6fa7aec2015-02-13 15:33:01 +05304964 if (IS_VALLEYVIEW(dev))
4965 val |= PIPECONF_EDP_RR_MODE_SWITCH_VLV;
4966 else
4967 val |= PIPECONF_EDP_RR_MODE_SWITCH;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05304968 } else {
Vandana Kannan6fa7aec2015-02-13 15:33:01 +05304969 if (IS_VALLEYVIEW(dev))
4970 val &= ~PIPECONF_EDP_RR_MODE_SWITCH_VLV;
4971 else
4972 val &= ~PIPECONF_EDP_RR_MODE_SWITCH;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05304973 }
4974 I915_WRITE(reg, val);
4975 }
4976
Vandana Kannan4e9ac942015-01-22 15:14:45 +05304977 dev_priv->drrs.refresh_rate_type = index;
4978
4979 DRM_DEBUG_KMS("eDP Refresh Rate set to : %dHz\n", refresh_rate);
4980}
4981
Vandana Kannanb33a2812015-02-13 15:33:03 +05304982/**
4983 * intel_edp_drrs_enable - init drrs struct if supported
4984 * @intel_dp: DP struct
4985 *
4986 * Initializes frontbuffer_bits and drrs.dp
4987 */
Vandana Kannanc3955782015-01-22 15:17:40 +05304988void intel_edp_drrs_enable(struct intel_dp *intel_dp)
4989{
4990 struct drm_device *dev = intel_dp_to_dev(intel_dp);
4991 struct drm_i915_private *dev_priv = dev->dev_private;
4992 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
4993 struct drm_crtc *crtc = dig_port->base.base.crtc;
4994 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
4995
4996 if (!intel_crtc->config->has_drrs) {
4997 DRM_DEBUG_KMS("Panel doesn't support DRRS\n");
4998 return;
4999 }
5000
5001 mutex_lock(&dev_priv->drrs.mutex);
5002 if (WARN_ON(dev_priv->drrs.dp)) {
5003 DRM_ERROR("DRRS already enabled\n");
5004 goto unlock;
5005 }
5006
5007 dev_priv->drrs.busy_frontbuffer_bits = 0;
5008
5009 dev_priv->drrs.dp = intel_dp;
5010
5011unlock:
5012 mutex_unlock(&dev_priv->drrs.mutex);
5013}
5014
Vandana Kannanb33a2812015-02-13 15:33:03 +05305015/**
5016 * intel_edp_drrs_disable - Disable DRRS
5017 * @intel_dp: DP struct
5018 *
5019 */
Vandana Kannanc3955782015-01-22 15:17:40 +05305020void intel_edp_drrs_disable(struct intel_dp *intel_dp)
5021{
5022 struct drm_device *dev = intel_dp_to_dev(intel_dp);
5023 struct drm_i915_private *dev_priv = dev->dev_private;
5024 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
5025 struct drm_crtc *crtc = dig_port->base.base.crtc;
5026 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
5027
5028 if (!intel_crtc->config->has_drrs)
5029 return;
5030
5031 mutex_lock(&dev_priv->drrs.mutex);
5032 if (!dev_priv->drrs.dp) {
5033 mutex_unlock(&dev_priv->drrs.mutex);
5034 return;
5035 }
5036
5037 if (dev_priv->drrs.refresh_rate_type == DRRS_LOW_RR)
5038 intel_dp_set_drrs_state(dev_priv->dev,
5039 intel_dp->attached_connector->panel.
5040 fixed_mode->vrefresh);
5041
5042 dev_priv->drrs.dp = NULL;
5043 mutex_unlock(&dev_priv->drrs.mutex);
5044
5045 cancel_delayed_work_sync(&dev_priv->drrs.work);
5046}
5047
Vandana Kannan4e9ac942015-01-22 15:14:45 +05305048static void intel_edp_drrs_downclock_work(struct work_struct *work)
5049{
5050 struct drm_i915_private *dev_priv =
5051 container_of(work, typeof(*dev_priv), drrs.work.work);
5052 struct intel_dp *intel_dp;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305053
Vandana Kannan96178ee2015-01-10 02:25:56 +05305054 mutex_lock(&dev_priv->drrs.mutex);
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305055
Vandana Kannan4e9ac942015-01-22 15:14:45 +05305056 intel_dp = dev_priv->drrs.dp;
5057
5058 if (!intel_dp)
5059 goto unlock;
5060
5061 /*
5062 * The delayed work can race with an invalidate hence we need to
5063 * recheck.
5064 */
5065
5066 if (dev_priv->drrs.busy_frontbuffer_bits)
5067 goto unlock;
5068
5069 if (dev_priv->drrs.refresh_rate_type != DRRS_LOW_RR)
5070 intel_dp_set_drrs_state(dev_priv->dev,
5071 intel_dp->attached_connector->panel.
5072 downclock_mode->vrefresh);
5073
5074unlock:
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305075
Vandana Kannan96178ee2015-01-10 02:25:56 +05305076 mutex_unlock(&dev_priv->drrs.mutex);
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305077}
5078
Vandana Kannanb33a2812015-02-13 15:33:03 +05305079/**
5080 * intel_edp_drrs_invalidate - Invalidate DRRS
5081 * @dev: DRM device
5082 * @frontbuffer_bits: frontbuffer plane tracking bits
5083 *
5084 * When there is a disturbance on screen (due to cursor movement/time
5085 * update etc), DRRS needs to be invalidated, i.e. need to switch to
5086 * high RR.
5087 *
5088 * Dirty frontbuffers relevant to DRRS are tracked in busy_frontbuffer_bits.
5089 */
Vandana Kannana93fad02015-01-10 02:25:59 +05305090void intel_edp_drrs_invalidate(struct drm_device *dev,
5091 unsigned frontbuffer_bits)
5092{
5093 struct drm_i915_private *dev_priv = dev->dev_private;
5094 struct drm_crtc *crtc;
5095 enum pipe pipe;
5096
5097 if (!dev_priv->drrs.dp)
5098 return;
5099
Ramalingam C3954e732015-03-03 12:11:46 +05305100 cancel_delayed_work_sync(&dev_priv->drrs.work);
5101
Vandana Kannana93fad02015-01-10 02:25:59 +05305102 mutex_lock(&dev_priv->drrs.mutex);
5103 crtc = dp_to_dig_port(dev_priv->drrs.dp)->base.base.crtc;
5104 pipe = to_intel_crtc(crtc)->pipe;
5105
5106 if (dev_priv->drrs.refresh_rate_type == DRRS_LOW_RR) {
Vandana Kannana93fad02015-01-10 02:25:59 +05305107 intel_dp_set_drrs_state(dev_priv->dev,
5108 dev_priv->drrs.dp->attached_connector->panel.
5109 fixed_mode->vrefresh);
5110 }
5111
5112 frontbuffer_bits &= INTEL_FRONTBUFFER_ALL_MASK(pipe);
5113
5114 dev_priv->drrs.busy_frontbuffer_bits |= frontbuffer_bits;
5115 mutex_unlock(&dev_priv->drrs.mutex);
5116}
5117
Vandana Kannanb33a2812015-02-13 15:33:03 +05305118/**
5119 * intel_edp_drrs_flush - Flush DRRS
5120 * @dev: DRM device
5121 * @frontbuffer_bits: frontbuffer plane tracking bits
5122 *
5123 * When there is no movement on screen, DRRS work can be scheduled.
5124 * This DRRS work is responsible for setting relevant registers after a
5125 * timeout of 1 second.
5126 *
5127 * Dirty frontbuffers relevant to DRRS are tracked in busy_frontbuffer_bits.
5128 */
Vandana Kannana93fad02015-01-10 02:25:59 +05305129void intel_edp_drrs_flush(struct drm_device *dev,
5130 unsigned frontbuffer_bits)
5131{
5132 struct drm_i915_private *dev_priv = dev->dev_private;
5133 struct drm_crtc *crtc;
5134 enum pipe pipe;
5135
5136 if (!dev_priv->drrs.dp)
5137 return;
5138
Ramalingam C3954e732015-03-03 12:11:46 +05305139 cancel_delayed_work_sync(&dev_priv->drrs.work);
5140
Vandana Kannana93fad02015-01-10 02:25:59 +05305141 mutex_lock(&dev_priv->drrs.mutex);
5142 crtc = dp_to_dig_port(dev_priv->drrs.dp)->base.base.crtc;
5143 pipe = to_intel_crtc(crtc)->pipe;
5144 dev_priv->drrs.busy_frontbuffer_bits &= ~frontbuffer_bits;
5145
Vandana Kannana93fad02015-01-10 02:25:59 +05305146 if (dev_priv->drrs.refresh_rate_type != DRRS_LOW_RR &&
5147 !dev_priv->drrs.busy_frontbuffer_bits)
5148 schedule_delayed_work(&dev_priv->drrs.work,
5149 msecs_to_jiffies(1000));
5150 mutex_unlock(&dev_priv->drrs.mutex);
5151}
5152
Vandana Kannanb33a2812015-02-13 15:33:03 +05305153/**
5154 * DOC: Display Refresh Rate Switching (DRRS)
5155 *
5156 * Display Refresh Rate Switching (DRRS) is a power conservation feature
5157 * which enables swtching between low and high refresh rates,
5158 * dynamically, based on the usage scenario. This feature is applicable
5159 * for internal panels.
5160 *
5161 * Indication that the panel supports DRRS is given by the panel EDID, which
5162 * would list multiple refresh rates for one resolution.
5163 *
5164 * DRRS is of 2 types - static and seamless.
5165 * Static DRRS involves changing refresh rate (RR) by doing a full modeset
5166 * (may appear as a blink on screen) and is used in dock-undock scenario.
5167 * Seamless DRRS involves changing RR without any visual effect to the user
5168 * and can be used during normal system usage. This is done by programming
5169 * certain registers.
5170 *
5171 * Support for static/seamless DRRS may be indicated in the VBT based on
5172 * inputs from the panel spec.
5173 *
5174 * DRRS saves power by switching to low RR based on usage scenarios.
5175 *
5176 * eDP DRRS:-
5177 * The implementation is based on frontbuffer tracking implementation.
5178 * When there is a disturbance on the screen triggered by user activity or a
5179 * periodic system activity, DRRS is disabled (RR is changed to high RR).
5180 * When there is no movement on screen, after a timeout of 1 second, a switch
5181 * to low RR is made.
5182 * For integration with frontbuffer tracking code,
5183 * intel_edp_drrs_invalidate() and intel_edp_drrs_flush() are called.
5184 *
5185 * DRRS can be further extended to support other internal panels and also
5186 * the scenario of video playback wherein RR is set based on the rate
5187 * requested by userspace.
5188 */
5189
5190/**
5191 * intel_dp_drrs_init - Init basic DRRS work and mutex.
5192 * @intel_connector: eDP connector
5193 * @fixed_mode: preferred mode of panel
5194 *
5195 * This function is called only once at driver load to initialize basic
5196 * DRRS stuff.
5197 *
5198 * Returns:
5199 * Downclock mode if panel supports it, else return NULL.
5200 * DRRS support is determined by the presence of downclock mode (apart
5201 * from VBT setting).
5202 */
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305203static struct drm_display_mode *
Vandana Kannan96178ee2015-01-10 02:25:56 +05305204intel_dp_drrs_init(struct intel_connector *intel_connector,
5205 struct drm_display_mode *fixed_mode)
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305206{
5207 struct drm_connector *connector = &intel_connector->base;
Vandana Kannan96178ee2015-01-10 02:25:56 +05305208 struct drm_device *dev = connector->dev;
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305209 struct drm_i915_private *dev_priv = dev->dev_private;
5210 struct drm_display_mode *downclock_mode = NULL;
5211
5212 if (INTEL_INFO(dev)->gen <= 6) {
5213 DRM_DEBUG_KMS("DRRS supported for Gen7 and above\n");
5214 return NULL;
5215 }
5216
5217 if (dev_priv->vbt.drrs_type != SEAMLESS_DRRS_SUPPORT) {
Damien Lespiau4079b8d2014-08-05 10:39:42 +01005218 DRM_DEBUG_KMS("VBT doesn't support DRRS\n");
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305219 return NULL;
5220 }
5221
5222 downclock_mode = intel_find_panel_downclock
5223 (dev, fixed_mode, connector);
5224
5225 if (!downclock_mode) {
Ramalingam Ca1d26342015-02-23 17:38:33 +05305226 DRM_DEBUG_KMS("Downclock mode is not found. DRRS not supported\n");
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305227 return NULL;
5228 }
5229
Vandana Kannan4e9ac942015-01-22 15:14:45 +05305230 INIT_DELAYED_WORK(&dev_priv->drrs.work, intel_edp_drrs_downclock_work);
5231
Vandana Kannan96178ee2015-01-10 02:25:56 +05305232 mutex_init(&dev_priv->drrs.mutex);
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305233
Vandana Kannan96178ee2015-01-10 02:25:56 +05305234 dev_priv->drrs.type = dev_priv->vbt.drrs_type;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305235
Vandana Kannan96178ee2015-01-10 02:25:56 +05305236 dev_priv->drrs.refresh_rate_type = DRRS_HIGH_RR;
Damien Lespiau4079b8d2014-08-05 10:39:42 +01005237 DRM_DEBUG_KMS("seamless DRRS supported for eDP panel.\n");
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305238 return downclock_mode;
5239}
5240
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005241static bool intel_edp_init_connector(struct intel_dp *intel_dp,
Ville Syrjälä36b5f422014-10-16 21:27:30 +03005242 struct intel_connector *intel_connector)
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005243{
5244 struct drm_connector *connector = &intel_connector->base;
5245 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Paulo Zanoni63635212014-04-22 19:55:42 -03005246 struct intel_encoder *intel_encoder = &intel_dig_port->base;
5247 struct drm_device *dev = intel_encoder->base.dev;
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005248 struct drm_i915_private *dev_priv = dev->dev_private;
5249 struct drm_display_mode *fixed_mode = NULL;
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305250 struct drm_display_mode *downclock_mode = NULL;
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005251 bool has_dpcd;
5252 struct drm_display_mode *scan;
5253 struct edid *edid;
Ville Syrjälä6517d272014-11-07 11:16:02 +02005254 enum pipe pipe = INVALID_PIPE;
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005255
Vandana Kannan96178ee2015-01-10 02:25:56 +05305256 dev_priv->drrs.type = DRRS_NOT_SUPPORTED;
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305257
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005258 if (!is_edp(intel_dp))
5259 return true;
5260
Ville Syrjälä49e6bc52014-10-28 16:15:52 +02005261 pps_lock(intel_dp);
5262 intel_edp_panel_vdd_sanitize(intel_dp);
5263 pps_unlock(intel_dp);
Paulo Zanoni63635212014-04-22 19:55:42 -03005264
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005265 /* Cache DPCD and EDID for edp. */
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005266 has_dpcd = intel_dp_get_dpcd(intel_dp);
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005267
5268 if (has_dpcd) {
5269 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11)
5270 dev_priv->no_aux_handshake =
5271 intel_dp->dpcd[DP_MAX_DOWNSPREAD] &
5272 DP_NO_AUX_HANDSHAKE_LINK_TRAINING;
5273 } else {
5274 /* if this fails, presume the device is a ghost */
5275 DRM_INFO("failed to retrieve link info, disabling eDP\n");
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005276 return false;
5277 }
5278
5279 /* We now know it's not a ghost, init power sequence regs. */
Ville Syrjälä773538e82014-09-04 14:54:56 +03005280 pps_lock(intel_dp);
Ville Syrjälä36b5f422014-10-16 21:27:30 +03005281 intel_dp_init_panel_power_sequencer_registers(dev, intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03005282 pps_unlock(intel_dp);
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005283
Daniel Vetter060c8772014-03-21 23:22:35 +01005284 mutex_lock(&dev->mode_config.mutex);
Jani Nikula0b998362014-03-14 16:51:17 +02005285 edid = drm_get_edid(connector, &intel_dp->aux.ddc);
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005286 if (edid) {
5287 if (drm_add_edid_modes(connector, edid)) {
5288 drm_mode_connector_update_edid_property(connector,
5289 edid);
5290 drm_edid_to_eld(connector, edid);
5291 } else {
5292 kfree(edid);
5293 edid = ERR_PTR(-EINVAL);
5294 }
5295 } else {
5296 edid = ERR_PTR(-ENOENT);
5297 }
5298 intel_connector->edid = edid;
5299
5300 /* prefer fixed mode from EDID if available */
5301 list_for_each_entry(scan, &connector->probed_modes, head) {
5302 if ((scan->type & DRM_MODE_TYPE_PREFERRED)) {
5303 fixed_mode = drm_mode_duplicate(dev, scan);
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305304 downclock_mode = intel_dp_drrs_init(
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305305 intel_connector, fixed_mode);
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005306 break;
5307 }
5308 }
5309
5310 /* fallback to VBT if available for eDP */
5311 if (!fixed_mode && dev_priv->vbt.lfp_lvds_vbt_mode) {
5312 fixed_mode = drm_mode_duplicate(dev,
5313 dev_priv->vbt.lfp_lvds_vbt_mode);
5314 if (fixed_mode)
5315 fixed_mode->type |= DRM_MODE_TYPE_PREFERRED;
5316 }
Daniel Vetter060c8772014-03-21 23:22:35 +01005317 mutex_unlock(&dev->mode_config.mutex);
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005318
Clint Taylor01527b32014-07-07 13:01:46 -07005319 if (IS_VALLEYVIEW(dev)) {
5320 intel_dp->edp_notifier.notifier_call = edp_notify_handler;
5321 register_reboot_notifier(&intel_dp->edp_notifier);
Ville Syrjälä6517d272014-11-07 11:16:02 +02005322
5323 /*
5324 * Figure out the current pipe for the initial backlight setup.
5325 * If the current pipe isn't valid, try the PPS pipe, and if that
5326 * fails just assume pipe A.
5327 */
5328 if (IS_CHERRYVIEW(dev))
5329 pipe = DP_PORT_TO_PIPE_CHV(intel_dp->DP);
5330 else
5331 pipe = PORT_TO_PIPE(intel_dp->DP);
5332
5333 if (pipe != PIPE_A && pipe != PIPE_B)
5334 pipe = intel_dp->pps_pipe;
5335
5336 if (pipe != PIPE_A && pipe != PIPE_B)
5337 pipe = PIPE_A;
5338
5339 DRM_DEBUG_KMS("using pipe %c for initial backlight setup\n",
5340 pipe_name(pipe));
Clint Taylor01527b32014-07-07 13:01:46 -07005341 }
5342
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305343 intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode);
Jani Nikula73580fb72014-08-12 17:11:41 +03005344 intel_connector->panel.backlight_power = intel_edp_backlight_power;
Ville Syrjälä6517d272014-11-07 11:16:02 +02005345 intel_panel_setup_backlight(connector, pipe);
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005346
5347 return true;
5348}
5349
Paulo Zanoni16c25532013-06-12 17:27:25 -03005350bool
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005351intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
5352 struct intel_connector *intel_connector)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07005353{
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005354 struct drm_connector *connector = &intel_connector->base;
5355 struct intel_dp *intel_dp = &intel_dig_port->dp;
5356 struct intel_encoder *intel_encoder = &intel_dig_port->base;
5357 struct drm_device *dev = intel_encoder->base.dev;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07005358 struct drm_i915_private *dev_priv = dev->dev_private;
Paulo Zanoni174edf12012-10-26 19:05:50 -02005359 enum port port = intel_dig_port->port;
Jani Nikula0b998362014-03-14 16:51:17 +02005360 int type;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07005361
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03005362 intel_dp->pps_pipe = INVALID_PIPE;
5363
Damien Lespiauec5b01d2014-01-21 13:35:39 +00005364 /* intel_dp vfuncs */
Damien Lespiaub6b5e382014-01-20 16:00:59 +00005365 if (INTEL_INFO(dev)->gen >= 9)
5366 intel_dp->get_aux_clock_divider = skl_get_aux_clock_divider;
5367 else if (IS_VALLEYVIEW(dev))
Damien Lespiauec5b01d2014-01-21 13:35:39 +00005368 intel_dp->get_aux_clock_divider = vlv_get_aux_clock_divider;
5369 else if (IS_HASWELL(dev) || IS_BROADWELL(dev))
5370 intel_dp->get_aux_clock_divider = hsw_get_aux_clock_divider;
5371 else if (HAS_PCH_SPLIT(dev))
5372 intel_dp->get_aux_clock_divider = ilk_get_aux_clock_divider;
5373 else
5374 intel_dp->get_aux_clock_divider = i9xx_get_aux_clock_divider;
5375
Damien Lespiaub9ca5fa2014-01-20 16:01:00 +00005376 if (INTEL_INFO(dev)->gen >= 9)
5377 intel_dp->get_aux_send_ctl = skl_get_aux_send_ctl;
5378 else
5379 intel_dp->get_aux_send_ctl = i9xx_get_aux_send_ctl;
Damien Lespiau153b1102014-01-21 13:37:15 +00005380
Daniel Vetter07679352012-09-06 22:15:42 +02005381 /* Preserve the current hw state. */
5382 intel_dp->DP = I915_READ(intel_dp->output_reg);
Jani Nikuladd06f902012-10-19 14:51:50 +03005383 intel_dp->attached_connector = intel_connector;
Chris Wilson3d3dc142011-02-12 10:33:12 +00005384
Ville Syrjälä3b32a352013-11-01 18:22:41 +02005385 if (intel_dp_is_edp(dev, port))
Gajanan Bhat19c03922012-09-27 19:13:07 +05305386 type = DRM_MODE_CONNECTOR_eDP;
Ville Syrjälä3b32a352013-11-01 18:22:41 +02005387 else
5388 type = DRM_MODE_CONNECTOR_DisplayPort;
Adam Jacksonb3295302010-07-16 14:46:28 -04005389
Imre Deakf7d24902013-05-08 13:14:05 +03005390 /*
5391 * For eDP we always set the encoder type to INTEL_OUTPUT_EDP, but
5392 * for DP the encoder type can be set by the caller to
5393 * INTEL_OUTPUT_UNKNOWN for DDI, so don't rewrite it.
5394 */
5395 if (type == DRM_MODE_CONNECTOR_eDP)
5396 intel_encoder->type = INTEL_OUTPUT_EDP;
5397
Ville Syrjäläc17ed5b2014-10-16 21:27:27 +03005398 /* eDP only on port B and/or C on vlv/chv */
5399 if (WARN_ON(IS_VALLEYVIEW(dev) && is_edp(intel_dp) &&
5400 port != PORT_B && port != PORT_C))
5401 return false;
5402
Imre Deake7281ea2013-05-08 13:14:08 +03005403 DRM_DEBUG_KMS("Adding %s connector on port %c\n",
5404 type == DRM_MODE_CONNECTOR_eDP ? "eDP" : "DP",
5405 port_name(port));
5406
Adam Jacksonb3295302010-07-16 14:46:28 -04005407 drm_connector_init(dev, connector, &intel_dp_connector_funcs, type);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07005408 drm_connector_helper_add(connector, &intel_dp_connector_helper_funcs);
5409
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005410 connector->interlace_allowed = true;
5411 connector->doublescan_allowed = 0;
Ma Lingf8aed702009-08-24 13:50:24 +08005412
Daniel Vetter66a92782012-07-12 20:08:18 +02005413 INIT_DELAYED_WORK(&intel_dp->panel_vdd_work,
Daniel Vetter4be73782014-01-17 14:39:48 +01005414 edp_panel_vdd_work);
Zhenyu Wang6251ec02010-01-12 05:38:32 +08005415
Chris Wilsondf0e9242010-09-09 16:20:55 +01005416 intel_connector_attach_encoder(intel_connector, intel_encoder);
Thomas Wood34ea3d32014-05-29 16:57:41 +01005417 drm_connector_register(connector);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07005418
Paulo Zanoniaffa9352012-11-23 15:30:39 -02005419 if (HAS_DDI(dev))
Paulo Zanonibcbc8892012-10-26 19:05:51 -02005420 intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
5421 else
5422 intel_connector->get_hw_state = intel_connector_get_hw_state;
Imre Deak80f65de2014-02-11 17:12:49 +02005423 intel_connector->unregister = intel_dp_connector_unregister;
Paulo Zanonibcbc8892012-10-26 19:05:51 -02005424
Jani Nikula0b998362014-03-14 16:51:17 +02005425 /* Set up the hotplug pin. */
Paulo Zanoniab9d7c32012-07-17 17:53:45 -03005426 switch (port) {
5427 case PORT_A:
Egbert Eich1d843f92013-02-25 12:06:49 -05005428 intel_encoder->hpd_pin = HPD_PORT_A;
Paulo Zanoniab9d7c32012-07-17 17:53:45 -03005429 break;
5430 case PORT_B:
Egbert Eich1d843f92013-02-25 12:06:49 -05005431 intel_encoder->hpd_pin = HPD_PORT_B;
Paulo Zanoniab9d7c32012-07-17 17:53:45 -03005432 break;
5433 case PORT_C:
Egbert Eich1d843f92013-02-25 12:06:49 -05005434 intel_encoder->hpd_pin = HPD_PORT_C;
Paulo Zanoniab9d7c32012-07-17 17:53:45 -03005435 break;
5436 case PORT_D:
Egbert Eich1d843f92013-02-25 12:06:49 -05005437 intel_encoder->hpd_pin = HPD_PORT_D;
Paulo Zanoniab9d7c32012-07-17 17:53:45 -03005438 break;
5439 default:
Damien Lespiauad1c0b12013-03-07 15:30:28 +00005440 BUG();
Zhenyu Wang5eb08b62009-07-24 01:00:31 +08005441 }
5442
Imre Deakdada1a92014-01-29 13:25:41 +02005443 if (is_edp(intel_dp)) {
Ville Syrjälä773538e82014-09-04 14:54:56 +03005444 pps_lock(intel_dp);
Ville Syrjälä1e74a322014-10-28 16:15:51 +02005445 intel_dp_init_panel_power_timestamps(intel_dp);
5446 if (IS_VALLEYVIEW(dev))
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03005447 vlv_initial_power_sequencer_setup(intel_dp);
Ville Syrjälä1e74a322014-10-28 16:15:51 +02005448 else
Ville Syrjälä36b5f422014-10-16 21:27:30 +03005449 intel_dp_init_panel_power_sequencer(dev, intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03005450 pps_unlock(intel_dp);
Imre Deakdada1a92014-01-29 13:25:41 +02005451 }
Paulo Zanoni0095e6d2013-12-19 14:29:39 -02005452
Jani Nikula9d1a1032014-03-14 16:51:15 +02005453 intel_dp_aux_init(intel_dp, intel_connector);
Dave Airliec1f05262012-08-30 11:06:18 +10005454
Dave Airlie0e32b392014-05-02 14:02:48 +10005455 /* init MST on ports that can support it */
Damien Lespiauc86ea3d2014-12-12 14:26:58 +00005456 if (IS_HASWELL(dev) || IS_BROADWELL(dev) || INTEL_INFO(dev)->gen >= 9) {
Dave Airlie0e32b392014-05-02 14:02:48 +10005457 if (port == PORT_B || port == PORT_C || port == PORT_D) {
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03005458 intel_dp_mst_encoder_init(intel_dig_port,
5459 intel_connector->base.base.id);
Dave Airlie0e32b392014-05-02 14:02:48 +10005460 }
5461 }
5462
Ville Syrjälä36b5f422014-10-16 21:27:30 +03005463 if (!intel_edp_init_connector(intel_dp, intel_connector)) {
Dave Airlie4f71d0c2014-06-04 16:02:28 +10005464 drm_dp_aux_unregister(&intel_dp->aux);
Paulo Zanoni15b1d172013-06-12 17:27:27 -03005465 if (is_edp(intel_dp)) {
5466 cancel_delayed_work_sync(&intel_dp->panel_vdd_work);
Ville Syrjälä951468f2014-09-04 14:55:31 +03005467 /*
5468 * vdd might still be enabled do to the delayed vdd off.
5469 * Make sure vdd is actually turned off here.
5470 */
Ville Syrjälä773538e82014-09-04 14:54:56 +03005471 pps_lock(intel_dp);
Daniel Vetter4be73782014-01-17 14:39:48 +01005472 edp_panel_vdd_off_sync(intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03005473 pps_unlock(intel_dp);
Paulo Zanoni15b1d172013-06-12 17:27:27 -03005474 }
Thomas Wood34ea3d32014-05-29 16:57:41 +01005475 drm_connector_unregister(connector);
Paulo Zanonib2f246a2013-06-12 17:27:26 -03005476 drm_connector_cleanup(connector);
Paulo Zanoni16c25532013-06-12 17:27:25 -03005477 return false;
Paulo Zanonib2f246a2013-06-12 17:27:26 -03005478 }
Zhenyu Wang32f9d652009-07-24 01:00:32 +08005479
Chris Wilsonf6849602010-09-19 09:29:33 +01005480 intel_dp_add_properties(intel_dp, connector);
5481
Keith Packarda4fc5ed2009-04-07 16:16:42 -07005482 /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
5483 * 0xd. Failure to do so will result in spurious interrupts being
5484 * generated on the port when a cable is not attached.
5485 */
5486 if (IS_G4X(dev) && !IS_GM45(dev)) {
5487 u32 temp = I915_READ(PEG_BAND_GAP_DATA);
5488 I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
5489 }
Paulo Zanoni16c25532013-06-12 17:27:25 -03005490
5491 return true;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07005492}
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005493
5494void
5495intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
5496{
Dave Airlie13cf5502014-06-18 11:29:35 +10005497 struct drm_i915_private *dev_priv = dev->dev_private;
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005498 struct intel_digital_port *intel_dig_port;
5499 struct intel_encoder *intel_encoder;
5500 struct drm_encoder *encoder;
5501 struct intel_connector *intel_connector;
5502
Daniel Vetterb14c5672013-09-19 12:18:32 +02005503 intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005504 if (!intel_dig_port)
5505 return;
5506
Daniel Vetterb14c5672013-09-19 12:18:32 +02005507 intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL);
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005508 if (!intel_connector) {
5509 kfree(intel_dig_port);
5510 return;
5511 }
5512
5513 intel_encoder = &intel_dig_port->base;
5514 encoder = &intel_encoder->base;
5515
5516 drm_encoder_init(dev, &intel_encoder->base, &intel_dp_enc_funcs,
5517 DRM_MODE_ENCODER_TMDS);
5518
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01005519 intel_encoder->compute_config = intel_dp_compute_config;
Paulo Zanoni00c09d72012-10-26 19:05:52 -02005520 intel_encoder->disable = intel_disable_dp;
Paulo Zanoni00c09d72012-10-26 19:05:52 -02005521 intel_encoder->get_hw_state = intel_dp_get_hw_state;
Jesse Barnes045ac3b2013-05-14 17:08:26 -07005522 intel_encoder->get_config = intel_dp_get_config;
Imre Deak07f9cd02014-08-18 14:42:45 +03005523 intel_encoder->suspend = intel_dp_encoder_suspend;
Chon Ming Leee4a1d842014-04-09 13:28:20 +03005524 if (IS_CHERRYVIEW(dev)) {
Ville Syrjälä9197c882014-04-09 13:29:05 +03005525 intel_encoder->pre_pll_enable = chv_dp_pre_pll_enable;
Chon Ming Leee4a1d842014-04-09 13:28:20 +03005526 intel_encoder->pre_enable = chv_pre_enable_dp;
5527 intel_encoder->enable = vlv_enable_dp;
Ville Syrjälä580d3812014-04-09 13:29:00 +03005528 intel_encoder->post_disable = chv_post_disable_dp;
Chon Ming Leee4a1d842014-04-09 13:28:20 +03005529 } else if (IS_VALLEYVIEW(dev)) {
Jani Nikulaecff4f32013-09-06 07:38:29 +03005530 intel_encoder->pre_pll_enable = vlv_dp_pre_pll_enable;
Jani Nikulaab1f90f2013-07-30 12:20:30 +03005531 intel_encoder->pre_enable = vlv_pre_enable_dp;
5532 intel_encoder->enable = vlv_enable_dp;
Ville Syrjälä49277c32014-03-31 18:21:26 +03005533 intel_encoder->post_disable = vlv_post_disable_dp;
Jani Nikulaab1f90f2013-07-30 12:20:30 +03005534 } else {
Jani Nikulaecff4f32013-09-06 07:38:29 +03005535 intel_encoder->pre_enable = g4x_pre_enable_dp;
5536 intel_encoder->enable = g4x_enable_dp;
Ville Syrjälä08aff3f2014-08-18 22:16:09 +03005537 if (INTEL_INFO(dev)->gen >= 5)
5538 intel_encoder->post_disable = ilk_post_disable_dp;
Jani Nikulaab1f90f2013-07-30 12:20:30 +03005539 }
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005540
Paulo Zanoni174edf12012-10-26 19:05:50 -02005541 intel_dig_port->port = port;
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005542 intel_dig_port->dp.output_reg = output_reg;
5543
Paulo Zanoni00c09d72012-10-26 19:05:52 -02005544 intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT;
Ville Syrjälä882ec382014-04-28 14:07:43 +03005545 if (IS_CHERRYVIEW(dev)) {
5546 if (port == PORT_D)
5547 intel_encoder->crtc_mask = 1 << 2;
5548 else
5549 intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
5550 } else {
5551 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
5552 }
Ville Syrjäläbc079e82014-03-03 16:15:28 +02005553 intel_encoder->cloneable = 0;
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005554 intel_encoder->hot_plug = intel_dp_hot_plug;
5555
Dave Airlie13cf5502014-06-18 11:29:35 +10005556 intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
5557 dev_priv->hpd_irq_port[port] = intel_dig_port;
5558
Paulo Zanoni15b1d172013-06-12 17:27:27 -03005559 if (!intel_dp_init_connector(intel_dig_port, intel_connector)) {
5560 drm_encoder_cleanup(encoder);
5561 kfree(intel_dig_port);
Paulo Zanonib2f246a2013-06-12 17:27:26 -03005562 kfree(intel_connector);
Paulo Zanoni15b1d172013-06-12 17:27:27 -03005563 }
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005564}
Dave Airlie0e32b392014-05-02 14:02:48 +10005565
5566void intel_dp_mst_suspend(struct drm_device *dev)
5567{
5568 struct drm_i915_private *dev_priv = dev->dev_private;
5569 int i;
5570
5571 /* disable MST */
5572 for (i = 0; i < I915_MAX_PORTS; i++) {
5573 struct intel_digital_port *intel_dig_port = dev_priv->hpd_irq_port[i];
5574 if (!intel_dig_port)
5575 continue;
5576
5577 if (intel_dig_port->base.type == INTEL_OUTPUT_DISPLAYPORT) {
5578 if (!intel_dig_port->dp.can_mst)
5579 continue;
5580 if (intel_dig_port->dp.is_mst)
5581 drm_dp_mst_topology_mgr_suspend(&intel_dig_port->dp.mst_mgr);
5582 }
5583 }
5584}
5585
5586void intel_dp_mst_resume(struct drm_device *dev)
5587{
5588 struct drm_i915_private *dev_priv = dev->dev_private;
5589 int i;
5590
5591 for (i = 0; i < I915_MAX_PORTS; i++) {
5592 struct intel_digital_port *intel_dig_port = dev_priv->hpd_irq_port[i];
5593 if (!intel_dig_port)
5594 continue;
5595 if (intel_dig_port->base.type == INTEL_OUTPUT_DISPLAYPORT) {
5596 int ret;
5597
5598 if (!intel_dig_port->dp.can_mst)
5599 continue;
5600
5601 ret = drm_dp_mst_topology_mgr_resume(&intel_dig_port->dp.mst_mgr);
5602 if (ret != 0) {
5603 intel_dp_check_mst_status(&intel_dig_port->dp);
5604 }
5605 }
5606 }
5607}