blob: 5a955e33ba133f4368246f5f2311c1c4e63d7132 [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 };
Ville Syrjäläfe51bfb2015-03-12 17:10:38 +020090static const int chv_rates[] = { 162000, 202500, 210000, 216000,
91 243000, 270000, 324000, 405000,
92 420000, 432000, 540000 };
Ville Syrjäläf4896f12015-03-12 17:10:27 +020093static const int default_rates[] = { 162000, 270000, 540000 };
Chon Ming Leeef9348c2014-04-09 13:28:18 +030094
Jesse Barnescfcb0fc2010-10-07 16:01:06 -070095/**
96 * is_edp - is the given port attached to an eDP panel (either CPU or PCH)
97 * @intel_dp: DP struct
98 *
99 * If a CPU or PCH DP output is attached to an eDP panel, this function
100 * will return true, and false otherwise.
101 */
102static bool is_edp(struct intel_dp *intel_dp)
103{
Paulo Zanonida63a9f2012-10-26 19:05:46 -0200104 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
105
106 return intel_dig_port->base.type == INTEL_OUTPUT_EDP;
Jesse Barnescfcb0fc2010-10-07 16:01:06 -0700107}
108
Imre Deak68b4d822013-05-08 13:14:06 +0300109static struct drm_device *intel_dp_to_dev(struct intel_dp *intel_dp)
Jesse Barnescfcb0fc2010-10-07 16:01:06 -0700110{
Imre Deak68b4d822013-05-08 13:14:06 +0300111 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
112
113 return intel_dig_port->base.base.dev;
Jesse Barnescfcb0fc2010-10-07 16:01:06 -0700114}
115
Chris Wilsondf0e9242010-09-09 16:20:55 +0100116static struct intel_dp *intel_attached_dp(struct drm_connector *connector)
117{
Paulo Zanonifa90ece2012-10-26 19:05:44 -0200118 return enc_to_intel_dp(&intel_attached_encoder(connector)->base);
Chris Wilsondf0e9242010-09-09 16:20:55 +0100119}
120
Chris Wilsonea5b2132010-08-04 13:50:23 +0100121static void intel_dp_link_down(struct intel_dp *intel_dp);
Ville Syrjälä1e0560e2014-08-19 13:24:25 +0300122static bool edp_panel_vdd_on(struct intel_dp *intel_dp);
Daniel Vetter4be73782014-01-17 14:39:48 +0100123static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync);
Ville Syrjälä093e3f12014-10-16 21:27:33 +0300124static void vlv_init_panel_power_sequencer(struct intel_dp *intel_dp);
Ville Syrjäläa8c33442014-10-16 21:29:59 +0300125static void vlv_steal_power_sequencer(struct drm_device *dev,
126 enum pipe pipe);
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700127
Ville Syrjäläed4e9c12015-03-12 17:10:36 +0200128static int
129intel_dp_max_link_bw(struct intel_dp *intel_dp)
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700130{
Jesse Barnes7183dc22011-07-07 11:10:58 -0700131 int max_link_bw = intel_dp->dpcd[DP_MAX_LINK_RATE];
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700132
133 switch (max_link_bw) {
134 case DP_LINK_BW_1_62:
135 case DP_LINK_BW_2_7:
Ville Syrjälä1db10e22015-03-12 17:10:32 +0200136 case DP_LINK_BW_5_4:
Imre Deakd4eead52013-07-09 17:05:26 +0300137 break;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700138 default:
Imre Deakd4eead52013-07-09 17:05:26 +0300139 WARN(1, "invalid max DP link bw val %x, using 1.62Gbps\n",
140 max_link_bw);
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700141 max_link_bw = DP_LINK_BW_1_62;
142 break;
143 }
144 return max_link_bw;
145}
146
Paulo Zanonieeb63242014-05-06 14:56:50 +0300147static u8 intel_dp_max_lane_count(struct intel_dp *intel_dp)
148{
149 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
150 struct drm_device *dev = intel_dig_port->base.base.dev;
151 u8 source_max, sink_max;
152
153 source_max = 4;
154 if (HAS_DDI(dev) && intel_dig_port->port == PORT_A &&
155 (intel_dig_port->saved_port_bits & DDI_A_4_LANES) == 0)
156 source_max = 2;
157
158 sink_max = drm_dp_max_lane_count(intel_dp->dpcd);
159
160 return min(source_max, sink_max);
161}
162
Adam Jacksoncd9dde42011-10-14 12:43:49 -0400163/*
164 * The units on the numbers in the next two are... bizarre. Examples will
165 * make it clearer; this one parallels an example in the eDP spec.
166 *
167 * intel_dp_max_data_rate for one lane of 2.7GHz evaluates as:
168 *
169 * 270000 * 1 * 8 / 10 == 216000
170 *
171 * The actual data capacity of that configuration is 2.16Gbit/s, so the
172 * units are decakilobits. ->clock in a drm_display_mode is in kilohertz -
173 * or equivalently, kilopixels per second - so for 1680x1050R it'd be
174 * 119000. At 18bpp that's 2142000 kilobits per second.
175 *
176 * Thus the strange-looking division by 10 in intel_dp_link_required, to
177 * get the result in decakilobits instead of kilobits.
178 */
179
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700180static int
Keith Packardc8982612012-01-25 08:16:25 -0800181intel_dp_link_required(int pixel_clock, int bpp)
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700182{
Adam Jacksoncd9dde42011-10-14 12:43:49 -0400183 return (pixel_clock * bpp + 9) / 10;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700184}
185
186static int
Dave Airliefe27d532010-06-30 11:46:17 +1000187intel_dp_max_data_rate(int max_link_clock, int max_lanes)
188{
189 return (max_link_clock * max_lanes * 8) / 10;
190}
191
Damien Lespiauc19de8e2013-11-28 15:29:18 +0000192static enum drm_mode_status
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700193intel_dp_mode_valid(struct drm_connector *connector,
194 struct drm_display_mode *mode)
195{
Chris Wilsondf0e9242010-09-09 16:20:55 +0100196 struct intel_dp *intel_dp = intel_attached_dp(connector);
Jani Nikuladd06f902012-10-19 14:51:50 +0300197 struct intel_connector *intel_connector = to_intel_connector(connector);
198 struct drm_display_mode *fixed_mode = intel_connector->panel.fixed_mode;
Daniel Vetter36008362013-03-27 00:44:59 +0100199 int target_clock = mode->clock;
200 int max_rate, mode_rate, max_lanes, max_link_clock;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700201
Jani Nikuladd06f902012-10-19 14:51:50 +0300202 if (is_edp(intel_dp) && fixed_mode) {
203 if (mode->hdisplay > fixed_mode->hdisplay)
Zhao Yakui7de56f42010-07-19 09:43:14 +0100204 return MODE_PANEL;
205
Jani Nikuladd06f902012-10-19 14:51:50 +0300206 if (mode->vdisplay > fixed_mode->vdisplay)
Zhao Yakui7de56f42010-07-19 09:43:14 +0100207 return MODE_PANEL;
Daniel Vetter03afc4a2013-04-02 23:42:31 +0200208
209 target_clock = fixed_mode->clock;
Zhao Yakui7de56f42010-07-19 09:43:14 +0100210 }
211
Ville Syrjälä50fec212015-03-12 17:10:34 +0200212 max_link_clock = intel_dp_max_link_rate(intel_dp);
Paulo Zanonieeb63242014-05-06 14:56:50 +0300213 max_lanes = intel_dp_max_lane_count(intel_dp);
Daniel Vetter36008362013-03-27 00:44:59 +0100214
215 max_rate = intel_dp_max_data_rate(max_link_clock, max_lanes);
216 mode_rate = intel_dp_link_required(target_clock, 18);
217
218 if (mode_rate > max_rate)
Daniel Vetterc4867932012-04-10 10:42:36 +0200219 return MODE_CLOCK_HIGH;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700220
221 if (mode->clock < 10000)
222 return MODE_CLOCK_LOW;
223
Daniel Vetter0af78a22012-05-23 11:30:55 +0200224 if (mode->flags & DRM_MODE_FLAG_DBLCLK)
225 return MODE_H_ILLEGAL;
226
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700227 return MODE_OK;
228}
229
Rodrigo Vivia4f12892014-11-14 08:52:27 -0800230uint32_t intel_dp_pack_aux(const uint8_t *src, int src_bytes)
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700231{
232 int i;
233 uint32_t v = 0;
234
235 if (src_bytes > 4)
236 src_bytes = 4;
237 for (i = 0; i < src_bytes; i++)
238 v |= ((uint32_t) src[i]) << ((3-i) * 8);
239 return v;
240}
241
Damien Lespiauc2af70e2015-02-10 19:32:23 +0000242static void intel_dp_unpack_aux(uint32_t src, uint8_t *dst, int dst_bytes)
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700243{
244 int i;
245 if (dst_bytes > 4)
246 dst_bytes = 4;
247 for (i = 0; i < dst_bytes; i++)
248 dst[i] = src >> ((3-i) * 8);
249}
250
Keith Packardfb0f8fb2009-06-11 22:31:31 -0700251/* hrawclock is 1/4 the FSB frequency */
252static int
253intel_hrawclk(struct drm_device *dev)
254{
255 struct drm_i915_private *dev_priv = dev->dev_private;
256 uint32_t clkcfg;
257
Vijay Purushothaman9473c8f2012-09-27 19:13:01 +0530258 /* There is no CLKCFG reg in Valleyview. VLV hrawclk is 200 MHz */
259 if (IS_VALLEYVIEW(dev))
260 return 200;
261
Keith Packardfb0f8fb2009-06-11 22:31:31 -0700262 clkcfg = I915_READ(CLKCFG);
263 switch (clkcfg & CLKCFG_FSB_MASK) {
264 case CLKCFG_FSB_400:
265 return 100;
266 case CLKCFG_FSB_533:
267 return 133;
268 case CLKCFG_FSB_667:
269 return 166;
270 case CLKCFG_FSB_800:
271 return 200;
272 case CLKCFG_FSB_1067:
273 return 266;
274 case CLKCFG_FSB_1333:
275 return 333;
276 /* these two are just a guess; one of them might be right */
277 case CLKCFG_FSB_1600:
278 case CLKCFG_FSB_1600_ALT:
279 return 400;
280 default:
281 return 133;
282 }
283}
284
Jani Nikulabf13e812013-09-06 07:40:05 +0300285static void
286intel_dp_init_panel_power_sequencer(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 +0300288static void
289intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev,
Ville Syrjälä36b5f422014-10-16 21:27:30 +0300290 struct intel_dp *intel_dp);
Jani Nikulabf13e812013-09-06 07:40:05 +0300291
Ville Syrjälä773538e82014-09-04 14:54:56 +0300292static void pps_lock(struct intel_dp *intel_dp)
293{
294 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
295 struct intel_encoder *encoder = &intel_dig_port->base;
296 struct drm_device *dev = encoder->base.dev;
297 struct drm_i915_private *dev_priv = dev->dev_private;
298 enum intel_display_power_domain power_domain;
299
300 /*
301 * See vlv_power_sequencer_reset() why we need
302 * a power domain reference here.
303 */
304 power_domain = intel_display_port_power_domain(encoder);
305 intel_display_power_get(dev_priv, power_domain);
306
307 mutex_lock(&dev_priv->pps_mutex);
308}
309
310static void pps_unlock(struct intel_dp *intel_dp)
311{
312 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
313 struct intel_encoder *encoder = &intel_dig_port->base;
314 struct drm_device *dev = encoder->base.dev;
315 struct drm_i915_private *dev_priv = dev->dev_private;
316 enum intel_display_power_domain power_domain;
317
318 mutex_unlock(&dev_priv->pps_mutex);
319
320 power_domain = intel_display_port_power_domain(encoder);
321 intel_display_power_put(dev_priv, power_domain);
322}
323
Ville Syrjälä961a0db2014-10-16 21:29:42 +0300324static void
325vlv_power_sequencer_kick(struct intel_dp *intel_dp)
326{
327 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
328 struct drm_device *dev = intel_dig_port->base.base.dev;
329 struct drm_i915_private *dev_priv = dev->dev_private;
330 enum pipe pipe = intel_dp->pps_pipe;
Ville Syrjäläd288f652014-10-28 13:20:22 +0200331 bool pll_enabled;
Ville Syrjälä961a0db2014-10-16 21:29:42 +0300332 uint32_t DP;
333
334 if (WARN(I915_READ(intel_dp->output_reg) & DP_PORT_EN,
335 "skipping pipe %c power seqeuncer kick due to port %c being active\n",
336 pipe_name(pipe), port_name(intel_dig_port->port)))
337 return;
338
339 DRM_DEBUG_KMS("kicking pipe %c power sequencer for port %c\n",
340 pipe_name(pipe), port_name(intel_dig_port->port));
341
342 /* Preserve the BIOS-computed detected bit. This is
343 * supposed to be read-only.
344 */
345 DP = I915_READ(intel_dp->output_reg) & DP_DETECTED;
346 DP |= DP_VOLTAGE_0_4 | DP_PRE_EMPHASIS_0;
347 DP |= DP_PORT_WIDTH(1);
348 DP |= DP_LINK_TRAIN_PAT_1;
349
350 if (IS_CHERRYVIEW(dev))
351 DP |= DP_PIPE_SELECT_CHV(pipe);
352 else if (pipe == PIPE_B)
353 DP |= DP_PIPEB_SELECT;
354
Ville Syrjäläd288f652014-10-28 13:20:22 +0200355 pll_enabled = I915_READ(DPLL(pipe)) & DPLL_VCO_ENABLE;
356
357 /*
358 * The DPLL for the pipe must be enabled for this to work.
359 * So enable temporarily it if it's not already enabled.
360 */
361 if (!pll_enabled)
362 vlv_force_pll_on(dev, pipe, IS_CHERRYVIEW(dev) ?
363 &chv_dpll[0].dpll : &vlv_dpll[0].dpll);
364
Ville Syrjälä961a0db2014-10-16 21:29:42 +0300365 /*
366 * Similar magic as in intel_dp_enable_port().
367 * We _must_ do this port enable + disable trick
368 * to make this power seqeuencer lock onto the port.
369 * Otherwise even VDD force bit won't work.
370 */
371 I915_WRITE(intel_dp->output_reg, DP);
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);
376
377 I915_WRITE(intel_dp->output_reg, DP & ~DP_PORT_EN);
378 POSTING_READ(intel_dp->output_reg);
Ville Syrjäläd288f652014-10-28 13:20:22 +0200379
380 if (!pll_enabled)
381 vlv_force_pll_off(dev, pipe);
Ville Syrjälä961a0db2014-10-16 21:29:42 +0300382}
383
Jani Nikulabf13e812013-09-06 07:40:05 +0300384static enum pipe
385vlv_power_sequencer_pipe(struct intel_dp *intel_dp)
386{
387 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Jani Nikulabf13e812013-09-06 07:40:05 +0300388 struct drm_device *dev = intel_dig_port->base.base.dev;
389 struct drm_i915_private *dev_priv = dev->dev_private;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300390 struct intel_encoder *encoder;
391 unsigned int pipes = (1 << PIPE_A) | (1 << PIPE_B);
Ville Syrjäläa8c33442014-10-16 21:29:59 +0300392 enum pipe pipe;
Jani Nikulabf13e812013-09-06 07:40:05 +0300393
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300394 lockdep_assert_held(&dev_priv->pps_mutex);
395
Ville Syrjäläa8c33442014-10-16 21:29:59 +0300396 /* We should never land here with regular DP ports */
397 WARN_ON(!is_edp(intel_dp));
398
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300399 if (intel_dp->pps_pipe != INVALID_PIPE)
400 return intel_dp->pps_pipe;
Jani Nikulabf13e812013-09-06 07:40:05 +0300401
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300402 /*
403 * We don't have power sequencer currently.
404 * Pick one that's not used by other ports.
405 */
406 list_for_each_entry(encoder, &dev->mode_config.encoder_list,
407 base.head) {
408 struct intel_dp *tmp;
409
410 if (encoder->type != INTEL_OUTPUT_EDP)
411 continue;
412
413 tmp = enc_to_intel_dp(&encoder->base);
414
415 if (tmp->pps_pipe != INVALID_PIPE)
416 pipes &= ~(1 << tmp->pps_pipe);
417 }
418
419 /*
420 * Didn't find one. This should not happen since there
421 * are two power sequencers and up to two eDP ports.
422 */
423 if (WARN_ON(pipes == 0))
Ville Syrjäläa8c33442014-10-16 21:29:59 +0300424 pipe = PIPE_A;
425 else
426 pipe = ffs(pipes) - 1;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300427
Ville Syrjäläa8c33442014-10-16 21:29:59 +0300428 vlv_steal_power_sequencer(dev, pipe);
429 intel_dp->pps_pipe = pipe;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300430
431 DRM_DEBUG_KMS("picked pipe %c power sequencer for port %c\n",
432 pipe_name(intel_dp->pps_pipe),
433 port_name(intel_dig_port->port));
434
435 /* init power sequencer on this pipe and port */
Ville Syrjälä36b5f422014-10-16 21:27:30 +0300436 intel_dp_init_panel_power_sequencer(dev, intel_dp);
437 intel_dp_init_panel_power_sequencer_registers(dev, intel_dp);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300438
Ville Syrjälä961a0db2014-10-16 21:29:42 +0300439 /*
440 * Even vdd force doesn't work until we've made
441 * the power sequencer lock in on the port.
442 */
443 vlv_power_sequencer_kick(intel_dp);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300444
445 return intel_dp->pps_pipe;
446}
447
Ville Syrjälä6491ab22014-08-18 22:16:06 +0300448typedef bool (*vlv_pipe_check)(struct drm_i915_private *dev_priv,
449 enum pipe pipe);
450
451static bool vlv_pipe_has_pp_on(struct drm_i915_private *dev_priv,
452 enum pipe pipe)
453{
454 return I915_READ(VLV_PIPE_PP_STATUS(pipe)) & PP_ON;
455}
456
457static bool vlv_pipe_has_vdd_on(struct drm_i915_private *dev_priv,
458 enum pipe pipe)
459{
460 return I915_READ(VLV_PIPE_PP_CONTROL(pipe)) & EDP_FORCE_VDD;
461}
462
463static bool vlv_pipe_any(struct drm_i915_private *dev_priv,
464 enum pipe pipe)
465{
466 return true;
467}
468
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300469static enum pipe
Ville Syrjälä6491ab22014-08-18 22:16:06 +0300470vlv_initial_pps_pipe(struct drm_i915_private *dev_priv,
471 enum port port,
472 vlv_pipe_check pipe_check)
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300473{
Jani Nikulabf13e812013-09-06 07:40:05 +0300474 enum pipe pipe;
475
Jani Nikulabf13e812013-09-06 07:40:05 +0300476 for (pipe = PIPE_A; pipe <= PIPE_B; pipe++) {
477 u32 port_sel = I915_READ(VLV_PIPE_PP_ON_DELAYS(pipe)) &
478 PANEL_PORT_SELECT_MASK;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300479
480 if (port_sel != PANEL_PORT_SELECT_VLV(port))
481 continue;
482
Ville Syrjälä6491ab22014-08-18 22:16:06 +0300483 if (!pipe_check(dev_priv, pipe))
484 continue;
485
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300486 return pipe;
Jani Nikulabf13e812013-09-06 07:40:05 +0300487 }
488
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300489 return INVALID_PIPE;
490}
491
492static void
493vlv_initial_power_sequencer_setup(struct intel_dp *intel_dp)
494{
495 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
496 struct drm_device *dev = intel_dig_port->base.base.dev;
497 struct drm_i915_private *dev_priv = dev->dev_private;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300498 enum port port = intel_dig_port->port;
499
500 lockdep_assert_held(&dev_priv->pps_mutex);
501
502 /* try to find a pipe with this port selected */
Ville Syrjälä6491ab22014-08-18 22:16:06 +0300503 /* first pick one where the panel is on */
504 intel_dp->pps_pipe = vlv_initial_pps_pipe(dev_priv, port,
505 vlv_pipe_has_pp_on);
506 /* didn't find one? pick one where vdd is on */
507 if (intel_dp->pps_pipe == INVALID_PIPE)
508 intel_dp->pps_pipe = vlv_initial_pps_pipe(dev_priv, port,
509 vlv_pipe_has_vdd_on);
510 /* didn't find one? pick one with just the correct port */
511 if (intel_dp->pps_pipe == INVALID_PIPE)
512 intel_dp->pps_pipe = vlv_initial_pps_pipe(dev_priv, port,
513 vlv_pipe_any);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +0300514
515 /* didn't find one? just let vlv_power_sequencer_pipe() pick one when needed */
516 if (intel_dp->pps_pipe == INVALID_PIPE) {
517 DRM_DEBUG_KMS("no initial power sequencer for port %c\n",
518 port_name(port));
519 return;
520 }
521
522 DRM_DEBUG_KMS("initial power sequencer for port %c: pipe %c\n",
523 port_name(port), pipe_name(intel_dp->pps_pipe));
524
Ville Syrjälä36b5f422014-10-16 21:27:30 +0300525 intel_dp_init_panel_power_sequencer(dev, intel_dp);
526 intel_dp_init_panel_power_sequencer_registers(dev, intel_dp);
Jani Nikulabf13e812013-09-06 07:40:05 +0300527}
528
Ville Syrjälä773538e82014-09-04 14:54:56 +0300529void vlv_power_sequencer_reset(struct drm_i915_private *dev_priv)
530{
531 struct drm_device *dev = dev_priv->dev;
532 struct intel_encoder *encoder;
533
534 if (WARN_ON(!IS_VALLEYVIEW(dev)))
535 return;
536
537 /*
538 * We can't grab pps_mutex here due to deadlock with power_domain
539 * mutex when power_domain functions are called while holding pps_mutex.
540 * That also means that in order to use pps_pipe the code needs to
541 * hold both a power domain reference and pps_mutex, and the power domain
542 * reference get/put must be done while _not_ holding pps_mutex.
543 * pps_{lock,unlock}() do these steps in the correct order, so one
544 * should use them always.
545 */
546
547 list_for_each_entry(encoder, &dev->mode_config.encoder_list, base.head) {
548 struct intel_dp *intel_dp;
549
550 if (encoder->type != INTEL_OUTPUT_EDP)
551 continue;
552
553 intel_dp = enc_to_intel_dp(&encoder->base);
554 intel_dp->pps_pipe = INVALID_PIPE;
555 }
Jani Nikulabf13e812013-09-06 07:40:05 +0300556}
557
558static u32 _pp_ctrl_reg(struct intel_dp *intel_dp)
559{
560 struct drm_device *dev = intel_dp_to_dev(intel_dp);
561
562 if (HAS_PCH_SPLIT(dev))
563 return PCH_PP_CONTROL;
564 else
565 return VLV_PIPE_PP_CONTROL(vlv_power_sequencer_pipe(intel_dp));
566}
567
568static u32 _pp_stat_reg(struct intel_dp *intel_dp)
569{
570 struct drm_device *dev = intel_dp_to_dev(intel_dp);
571
572 if (HAS_PCH_SPLIT(dev))
573 return PCH_PP_STATUS;
574 else
575 return VLV_PIPE_PP_STATUS(vlv_power_sequencer_pipe(intel_dp));
576}
577
Clint Taylor01527b32014-07-07 13:01:46 -0700578/* Reboot notifier handler to shutdown panel power to guarantee T12 timing
579 This function only applicable when panel PM state is not to be tracked */
580static int edp_notify_handler(struct notifier_block *this, unsigned long code,
581 void *unused)
582{
583 struct intel_dp *intel_dp = container_of(this, typeof(* intel_dp),
584 edp_notifier);
585 struct drm_device *dev = intel_dp_to_dev(intel_dp);
586 struct drm_i915_private *dev_priv = dev->dev_private;
587 u32 pp_div;
588 u32 pp_ctrl_reg, pp_div_reg;
Clint Taylor01527b32014-07-07 13:01:46 -0700589
590 if (!is_edp(intel_dp) || code != SYS_RESTART)
591 return 0;
592
Ville Syrjälä773538e82014-09-04 14:54:56 +0300593 pps_lock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300594
Clint Taylor01527b32014-07-07 13:01:46 -0700595 if (IS_VALLEYVIEW(dev)) {
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300596 enum pipe pipe = vlv_power_sequencer_pipe(intel_dp);
597
Clint Taylor01527b32014-07-07 13:01:46 -0700598 pp_ctrl_reg = VLV_PIPE_PP_CONTROL(pipe);
599 pp_div_reg = VLV_PIPE_PP_DIVISOR(pipe);
600 pp_div = I915_READ(pp_div_reg);
601 pp_div &= PP_REFERENCE_DIVIDER_MASK;
602
603 /* 0x1F write to PP_DIV_REG sets max cycle delay */
604 I915_WRITE(pp_div_reg, pp_div | 0x1F);
605 I915_WRITE(pp_ctrl_reg, PANEL_UNLOCK_REGS | PANEL_POWER_OFF);
606 msleep(intel_dp->panel_power_cycle_delay);
607 }
608
Ville Syrjälä773538e82014-09-04 14:54:56 +0300609 pps_unlock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300610
Clint Taylor01527b32014-07-07 13:01:46 -0700611 return 0;
612}
613
Daniel Vetter4be73782014-01-17 14:39:48 +0100614static bool edp_have_panel_power(struct intel_dp *intel_dp)
Keith Packardebf33b12011-09-29 15:53:27 -0700615{
Paulo Zanoni30add222012-10-26 19:05:45 -0200616 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Keith Packardebf33b12011-09-29 15:53:27 -0700617 struct drm_i915_private *dev_priv = dev->dev_private;
618
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300619 lockdep_assert_held(&dev_priv->pps_mutex);
620
Ville Syrjälä9a423562014-10-16 21:29:48 +0300621 if (IS_VALLEYVIEW(dev) &&
622 intel_dp->pps_pipe == INVALID_PIPE)
623 return false;
624
Jani Nikulabf13e812013-09-06 07:40:05 +0300625 return (I915_READ(_pp_stat_reg(intel_dp)) & PP_ON) != 0;
Keith Packardebf33b12011-09-29 15:53:27 -0700626}
627
Daniel Vetter4be73782014-01-17 14:39:48 +0100628static bool edp_have_panel_vdd(struct intel_dp *intel_dp)
Keith Packardebf33b12011-09-29 15:53:27 -0700629{
Paulo Zanoni30add222012-10-26 19:05:45 -0200630 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Keith Packardebf33b12011-09-29 15:53:27 -0700631 struct drm_i915_private *dev_priv = dev->dev_private;
632
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300633 lockdep_assert_held(&dev_priv->pps_mutex);
634
Ville Syrjälä9a423562014-10-16 21:29:48 +0300635 if (IS_VALLEYVIEW(dev) &&
636 intel_dp->pps_pipe == INVALID_PIPE)
637 return false;
638
Ville Syrjälä773538e82014-09-04 14:54:56 +0300639 return I915_READ(_pp_ctrl_reg(intel_dp)) & EDP_FORCE_VDD;
Keith Packardebf33b12011-09-29 15:53:27 -0700640}
641
Keith Packard9b984da2011-09-19 13:54:47 -0700642static void
643intel_dp_check_edp(struct intel_dp *intel_dp)
644{
Paulo Zanoni30add222012-10-26 19:05:45 -0200645 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Keith Packard9b984da2011-09-19 13:54:47 -0700646 struct drm_i915_private *dev_priv = dev->dev_private;
Keith Packardebf33b12011-09-29 15:53:27 -0700647
Keith Packard9b984da2011-09-19 13:54:47 -0700648 if (!is_edp(intel_dp))
649 return;
Jesse Barnes453c5422013-03-28 09:55:41 -0700650
Daniel Vetter4be73782014-01-17 14:39:48 +0100651 if (!edp_have_panel_power(intel_dp) && !edp_have_panel_vdd(intel_dp)) {
Keith Packard9b984da2011-09-19 13:54:47 -0700652 WARN(1, "eDP powered off while attempting aux channel communication.\n");
653 DRM_DEBUG_KMS("Status 0x%08x Control 0x%08x\n",
Jani Nikulabf13e812013-09-06 07:40:05 +0300654 I915_READ(_pp_stat_reg(intel_dp)),
655 I915_READ(_pp_ctrl_reg(intel_dp)));
Keith Packard9b984da2011-09-19 13:54:47 -0700656 }
657}
658
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100659static uint32_t
660intel_dp_aux_wait_done(struct intel_dp *intel_dp, bool has_aux_irq)
661{
662 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
663 struct drm_device *dev = intel_dig_port->base.base.dev;
664 struct drm_i915_private *dev_priv = dev->dev_private;
Paulo Zanoni9ed35ab2013-02-18 19:00:25 -0300665 uint32_t ch_ctl = intel_dp->aux_ch_ctl_reg;
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100666 uint32_t status;
667 bool done;
668
Daniel Vetteref04f002012-12-01 21:03:59 +0100669#define C (((status = I915_READ_NOTRACE(ch_ctl)) & DP_AUX_CH_CTL_SEND_BUSY) == 0)
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100670 if (has_aux_irq)
Paulo Zanonib18ac462013-02-18 19:00:24 -0300671 done = wait_event_timeout(dev_priv->gmbus_wait_queue, C,
Imre Deak35987062013-05-21 20:03:20 +0300672 msecs_to_jiffies_timeout(10));
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100673 else
674 done = wait_for_atomic(C, 10) == 0;
675 if (!done)
676 DRM_ERROR("dp aux hw did not signal timeout (has irq: %i)!\n",
677 has_aux_irq);
678#undef C
679
680 return status;
681}
682
Damien Lespiauec5b01d2014-01-21 13:35:39 +0000683static uint32_t i9xx_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
684{
685 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
686 struct drm_device *dev = intel_dig_port->base.base.dev;
687
688 /*
689 * The clock divider is based off the hrawclk, and would like to run at
690 * 2MHz. So, take the hrawclk value and divide by 2 and use that
691 */
692 return index ? 0 : intel_hrawclk(dev) / 2;
693}
694
695static uint32_t ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
696{
697 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
698 struct drm_device *dev = intel_dig_port->base.base.dev;
Ville Syrjälä469d4b22015-03-31 14:11:59 +0300699 struct drm_i915_private *dev_priv = dev->dev_private;
Damien Lespiauec5b01d2014-01-21 13:35:39 +0000700
701 if (index)
702 return 0;
703
704 if (intel_dig_port->port == PORT_A) {
Ville Syrjälä469d4b22015-03-31 14:11:59 +0300705 return DIV_ROUND_UP(dev_priv->display.get_display_clock_speed(dev), 2000);
Damien Lespiauec5b01d2014-01-21 13:35:39 +0000706 } else {
707 return DIV_ROUND_UP(intel_pch_rawclk(dev), 2);
708 }
709}
710
711static uint32_t hsw_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
Rodrigo Vivib84a1cf2013-07-11 18:44:57 -0300712{
713 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
714 struct drm_device *dev = intel_dig_port->base.base.dev;
715 struct drm_i915_private *dev_priv = dev->dev_private;
716
Damien Lespiauec5b01d2014-01-21 13:35:39 +0000717 if (intel_dig_port->port == PORT_A) {
Chris Wilsonbc866252013-07-21 16:00:03 +0100718 if (index)
719 return 0;
Ville Syrjälä1652d192015-03-31 14:12:01 +0300720 return DIV_ROUND_CLOSEST(dev_priv->display.get_display_clock_speed(dev), 2000);
Rodrigo Vivib84a1cf2013-07-11 18:44:57 -0300721 } else if (dev_priv->pch_id == INTEL_PCH_LPT_DEVICE_ID_TYPE) {
722 /* Workaround for non-ULT HSW */
Chris Wilsonbc866252013-07-21 16:00:03 +0100723 switch (index) {
724 case 0: return 63;
725 case 1: return 72;
726 default: return 0;
727 }
Damien Lespiauec5b01d2014-01-21 13:35:39 +0000728 } else {
Chris Wilsonbc866252013-07-21 16:00:03 +0100729 return index ? 0 : DIV_ROUND_UP(intel_pch_rawclk(dev), 2);
Rodrigo Vivib84a1cf2013-07-11 18:44:57 -0300730 }
731}
732
Damien Lespiauec5b01d2014-01-21 13:35:39 +0000733static uint32_t vlv_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
734{
735 return index ? 0 : 100;
736}
737
Damien Lespiaub6b5e382014-01-20 16:00:59 +0000738static uint32_t skl_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
739{
740 /*
741 * SKL doesn't need us to program the AUX clock divider (Hardware will
742 * derive the clock from CDCLK automatically). We still implement the
743 * get_aux_clock_divider vfunc to plug-in into the existing code.
744 */
745 return index ? 0 : 1;
746}
747
Damien Lespiau5ed12a12014-01-20 15:52:30 +0000748static uint32_t i9xx_get_aux_send_ctl(struct intel_dp *intel_dp,
749 bool has_aux_irq,
750 int send_bytes,
751 uint32_t aux_clock_divider)
752{
753 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
754 struct drm_device *dev = intel_dig_port->base.base.dev;
755 uint32_t precharge, timeout;
756
757 if (IS_GEN6(dev))
758 precharge = 3;
759 else
760 precharge = 5;
761
762 if (IS_BROADWELL(dev) && intel_dp->aux_ch_ctl_reg == DPA_AUX_CH_CTL)
763 timeout = DP_AUX_CH_CTL_TIME_OUT_600us;
764 else
765 timeout = DP_AUX_CH_CTL_TIME_OUT_400us;
766
767 return DP_AUX_CH_CTL_SEND_BUSY |
Damien Lespiau788d4432014-01-20 15:52:31 +0000768 DP_AUX_CH_CTL_DONE |
Damien Lespiau5ed12a12014-01-20 15:52:30 +0000769 (has_aux_irq ? DP_AUX_CH_CTL_INTERRUPT : 0) |
Damien Lespiau788d4432014-01-20 15:52:31 +0000770 DP_AUX_CH_CTL_TIME_OUT_ERROR |
Damien Lespiau5ed12a12014-01-20 15:52:30 +0000771 timeout |
Damien Lespiau788d4432014-01-20 15:52:31 +0000772 DP_AUX_CH_CTL_RECEIVE_ERROR |
Damien Lespiau5ed12a12014-01-20 15:52:30 +0000773 (send_bytes << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) |
774 (precharge << DP_AUX_CH_CTL_PRECHARGE_2US_SHIFT) |
Damien Lespiau788d4432014-01-20 15:52:31 +0000775 (aux_clock_divider << DP_AUX_CH_CTL_BIT_CLOCK_2X_SHIFT);
Damien Lespiau5ed12a12014-01-20 15:52:30 +0000776}
777
Damien Lespiaub9ca5fa2014-01-20 16:01:00 +0000778static uint32_t skl_get_aux_send_ctl(struct intel_dp *intel_dp,
779 bool has_aux_irq,
780 int send_bytes,
781 uint32_t unused)
782{
783 return DP_AUX_CH_CTL_SEND_BUSY |
784 DP_AUX_CH_CTL_DONE |
785 (has_aux_irq ? DP_AUX_CH_CTL_INTERRUPT : 0) |
786 DP_AUX_CH_CTL_TIME_OUT_ERROR |
787 DP_AUX_CH_CTL_TIME_OUT_1600us |
788 DP_AUX_CH_CTL_RECEIVE_ERROR |
789 (send_bytes << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) |
790 DP_AUX_CH_CTL_SYNC_PULSE_SKL(32);
791}
792
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700793static int
Chris Wilsonea5b2132010-08-04 13:50:23 +0100794intel_dp_aux_ch(struct intel_dp *intel_dp,
Daniel Vetterbd9f74a2014-10-02 09:45:35 +0200795 const uint8_t *send, int send_bytes,
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700796 uint8_t *recv, int recv_size)
797{
Paulo Zanoni174edf12012-10-26 19:05:50 -0200798 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
799 struct drm_device *dev = intel_dig_port->base.base.dev;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700800 struct drm_i915_private *dev_priv = dev->dev_private;
Paulo Zanoni9ed35ab2013-02-18 19:00:25 -0300801 uint32_t ch_ctl = intel_dp->aux_ch_ctl_reg;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700802 uint32_t ch_data = ch_ctl + 4;
Chris Wilsonbc866252013-07-21 16:00:03 +0100803 uint32_t aux_clock_divider;
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100804 int i, ret, recv_bytes;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700805 uint32_t status;
Damien Lespiau5ed12a12014-01-20 15:52:30 +0000806 int try, clock = 0;
Daniel Vetter4e6b7882014-02-07 16:33:20 +0100807 bool has_aux_irq = HAS_AUX_IRQ(dev);
Jani Nikula884f19e2014-03-14 16:51:14 +0200808 bool vdd;
809
Ville Syrjälä773538e82014-09-04 14:54:56 +0300810 pps_lock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300811
Ville Syrjälä72c35002014-08-18 22:16:00 +0300812 /*
813 * We will be called with VDD already enabled for dpcd/edid/oui reads.
814 * In such cases we want to leave VDD enabled and it's up to upper layers
815 * to turn it off. But for eg. i2c-dev access we need to turn it on/off
816 * ourselves.
817 */
Ville Syrjälä1e0560e2014-08-19 13:24:25 +0300818 vdd = edp_panel_vdd_on(intel_dp);
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100819
820 /* dp aux is extremely sensitive to irq latency, hence request the
821 * lowest possible wakeup latency and so prevent the cpu from going into
822 * deep sleep states.
823 */
824 pm_qos_update_request(&dev_priv->pm_qos, 0);
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700825
Keith Packard9b984da2011-09-19 13:54:47 -0700826 intel_dp_check_edp(intel_dp);
Zhenyu Wang5eb08b62009-07-24 01:00:31 +0800827
Paulo Zanonic67a4702013-08-19 13:18:09 -0300828 intel_aux_display_runtime_get(dev_priv);
829
Jesse Barnes11bee432011-08-01 15:02:20 -0700830 /* Try to wait for any previous AUX channel activity */
831 for (try = 0; try < 3; try++) {
Daniel Vetteref04f002012-12-01 21:03:59 +0100832 status = I915_READ_NOTRACE(ch_ctl);
Jesse Barnes11bee432011-08-01 15:02:20 -0700833 if ((status & DP_AUX_CH_CTL_SEND_BUSY) == 0)
834 break;
835 msleep(1);
836 }
837
838 if (try == 3) {
839 WARN(1, "dp_aux_ch not started status 0x%08x\n",
840 I915_READ(ch_ctl));
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100841 ret = -EBUSY;
842 goto out;
Chris Wilson4f7f7b72010-08-18 18:12:56 +0100843 }
844
Paulo Zanoni46a5ae92013-09-17 11:14:10 -0300845 /* Only 5 data registers! */
846 if (WARN_ON(send_bytes > 20 || recv_size > 20)) {
847 ret = -E2BIG;
848 goto out;
849 }
850
Damien Lespiauec5b01d2014-01-21 13:35:39 +0000851 while ((aux_clock_divider = intel_dp->get_aux_clock_divider(intel_dp, clock++))) {
Damien Lespiau153b1102014-01-21 13:37:15 +0000852 u32 send_ctl = intel_dp->get_aux_send_ctl(intel_dp,
853 has_aux_irq,
854 send_bytes,
855 aux_clock_divider);
Damien Lespiau5ed12a12014-01-20 15:52:30 +0000856
Chris Wilsonbc866252013-07-21 16:00:03 +0100857 /* Must try at least 3 times according to DP spec */
858 for (try = 0; try < 5; try++) {
859 /* Load the send data into the aux channel data registers */
860 for (i = 0; i < send_bytes; i += 4)
861 I915_WRITE(ch_data + i,
Rodrigo Vivia4f12892014-11-14 08:52:27 -0800862 intel_dp_pack_aux(send + i,
863 send_bytes - i));
Akshay Joshi0206e352011-08-16 15:34:10 -0400864
Chris Wilsonbc866252013-07-21 16:00:03 +0100865 /* Send the command and wait for it to complete */
Damien Lespiau5ed12a12014-01-20 15:52:30 +0000866 I915_WRITE(ch_ctl, send_ctl);
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100867
Chris Wilsonbc866252013-07-21 16:00:03 +0100868 status = intel_dp_aux_wait_done(intel_dp, has_aux_irq);
Akshay Joshi0206e352011-08-16 15:34:10 -0400869
Chris Wilsonbc866252013-07-21 16:00:03 +0100870 /* Clear done status and any errors */
871 I915_WRITE(ch_ctl,
872 status |
873 DP_AUX_CH_CTL_DONE |
874 DP_AUX_CH_CTL_TIME_OUT_ERROR |
875 DP_AUX_CH_CTL_RECEIVE_ERROR);
Adam Jacksond7e96fe2011-07-26 15:39:46 -0400876
Chris Wilsonbc866252013-07-21 16:00:03 +0100877 if (status & (DP_AUX_CH_CTL_TIME_OUT_ERROR |
878 DP_AUX_CH_CTL_RECEIVE_ERROR))
879 continue;
880 if (status & DP_AUX_CH_CTL_DONE)
881 break;
882 }
Chris Wilson4f7f7b72010-08-18 18:12:56 +0100883 if (status & DP_AUX_CH_CTL_DONE)
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700884 break;
885 }
886
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700887 if ((status & DP_AUX_CH_CTL_DONE) == 0) {
Keith Packard1ae8c0a2009-06-28 15:42:17 -0700888 DRM_ERROR("dp_aux_ch not done status 0x%08x\n", status);
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100889 ret = -EBUSY;
890 goto out;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700891 }
892
893 /* Check for timeout or receive error.
894 * Timeouts occur when the sink is not connected
895 */
Keith Packarda5b3da52009-06-11 22:30:32 -0700896 if (status & DP_AUX_CH_CTL_RECEIVE_ERROR) {
Keith Packard1ae8c0a2009-06-28 15:42:17 -0700897 DRM_ERROR("dp_aux_ch receive error status 0x%08x\n", status);
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100898 ret = -EIO;
899 goto out;
Keith Packarda5b3da52009-06-11 22:30:32 -0700900 }
Keith Packard1ae8c0a2009-06-28 15:42:17 -0700901
902 /* Timeouts occur when the device isn't connected, so they're
903 * "normal" -- don't fill the kernel log with these */
Keith Packarda5b3da52009-06-11 22:30:32 -0700904 if (status & DP_AUX_CH_CTL_TIME_OUT_ERROR) {
Zhao Yakui28c97732009-10-09 11:39:41 +0800905 DRM_DEBUG_KMS("dp_aux_ch timeout status 0x%08x\n", status);
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100906 ret = -ETIMEDOUT;
907 goto out;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700908 }
909
910 /* Unload any bytes sent back from the other side */
911 recv_bytes = ((status & DP_AUX_CH_CTL_MESSAGE_SIZE_MASK) >>
912 DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT);
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700913 if (recv_bytes > recv_size)
914 recv_bytes = recv_size;
Akshay Joshi0206e352011-08-16 15:34:10 -0400915
Chris Wilson4f7f7b72010-08-18 18:12:56 +0100916 for (i = 0; i < recv_bytes; i += 4)
Rodrigo Vivia4f12892014-11-14 08:52:27 -0800917 intel_dp_unpack_aux(I915_READ(ch_data + i),
918 recv + i, recv_bytes - i);
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700919
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100920 ret = recv_bytes;
921out:
922 pm_qos_update_request(&dev_priv->pm_qos, PM_QOS_DEFAULT_VALUE);
Paulo Zanonic67a4702013-08-19 13:18:09 -0300923 intel_aux_display_runtime_put(dev_priv);
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100924
Jani Nikula884f19e2014-03-14 16:51:14 +0200925 if (vdd)
926 edp_panel_vdd_off(intel_dp, false);
927
Ville Syrjälä773538e82014-09-04 14:54:56 +0300928 pps_unlock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +0300929
Daniel Vetter9ee32fea2012-12-01 13:53:48 +0100930 return ret;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700931}
932
Jani Nikulaa6c8aff02014-04-07 12:37:25 +0300933#define BARE_ADDRESS_SIZE 3
934#define HEADER_SIZE (BARE_ADDRESS_SIZE + 1)
Jani Nikula9d1a1032014-03-14 16:51:15 +0200935static ssize_t
936intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700937{
Jani Nikula9d1a1032014-03-14 16:51:15 +0200938 struct intel_dp *intel_dp = container_of(aux, struct intel_dp, aux);
939 uint8_t txbuf[20], rxbuf[20];
940 size_t txsize, rxsize;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700941 int ret;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700942
Ville Syrjäläd2d9cbb2015-03-19 11:44:06 +0200943 txbuf[0] = (msg->request << 4) |
944 ((msg->address >> 16) & 0xf);
945 txbuf[1] = (msg->address >> 8) & 0xff;
Jani Nikula9d1a1032014-03-14 16:51:15 +0200946 txbuf[2] = msg->address & 0xff;
947 txbuf[3] = msg->size - 1;
Paulo Zanoni46a5ae92013-09-17 11:14:10 -0300948
Jani Nikula9d1a1032014-03-14 16:51:15 +0200949 switch (msg->request & ~DP_AUX_I2C_MOT) {
950 case DP_AUX_NATIVE_WRITE:
951 case DP_AUX_I2C_WRITE:
Jani Nikulaa6c8aff02014-04-07 12:37:25 +0300952 txsize = msg->size ? HEADER_SIZE + msg->size : BARE_ADDRESS_SIZE;
Jani Nikulaa1ddefd2015-03-17 17:18:54 +0200953 rxsize = 2; /* 0 or 1 data bytes */
Jani Nikulaf51a44b2014-02-11 11:52:05 +0200954
Jani Nikula9d1a1032014-03-14 16:51:15 +0200955 if (WARN_ON(txsize > 20))
956 return -E2BIG;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700957
Jani Nikula9d1a1032014-03-14 16:51:15 +0200958 memcpy(txbuf + HEADER_SIZE, msg->buffer, msg->size);
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700959
Jani Nikula9d1a1032014-03-14 16:51:15 +0200960 ret = intel_dp_aux_ch(intel_dp, txbuf, txsize, rxbuf, rxsize);
961 if (ret > 0) {
962 msg->reply = rxbuf[0] >> 4;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700963
Jani Nikulaa1ddefd2015-03-17 17:18:54 +0200964 if (ret > 1) {
965 /* Number of bytes written in a short write. */
966 ret = clamp_t(int, rxbuf[1], 0, msg->size);
967 } else {
968 /* Return payload size. */
969 ret = msg->size;
970 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700971 }
Jani Nikula9d1a1032014-03-14 16:51:15 +0200972 break;
973
974 case DP_AUX_NATIVE_READ:
975 case DP_AUX_I2C_READ:
Jani Nikulaa6c8aff02014-04-07 12:37:25 +0300976 txsize = msg->size ? HEADER_SIZE : BARE_ADDRESS_SIZE;
Jani Nikula9d1a1032014-03-14 16:51:15 +0200977 rxsize = msg->size + 1;
978
979 if (WARN_ON(rxsize > 20))
980 return -E2BIG;
981
982 ret = intel_dp_aux_ch(intel_dp, txbuf, txsize, rxbuf, rxsize);
983 if (ret > 0) {
984 msg->reply = rxbuf[0] >> 4;
985 /*
986 * Assume happy day, and copy the data. The caller is
987 * expected to check msg->reply before touching it.
988 *
989 * Return payload size.
990 */
991 ret--;
992 memcpy(msg->buffer, rxbuf + 1, ret);
993 }
994 break;
995
996 default:
997 ret = -EINVAL;
998 break;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700999 }
Jani Nikulaf51a44b2014-02-11 11:52:05 +02001000
Jani Nikula9d1a1032014-03-14 16:51:15 +02001001 return ret;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001002}
1003
Jani Nikula9d1a1032014-03-14 16:51:15 +02001004static void
1005intel_dp_aux_init(struct intel_dp *intel_dp, struct intel_connector *connector)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001006{
Jani Nikula9d1a1032014-03-14 16:51:15 +02001007 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Jani Nikula33ad6622014-03-14 16:51:16 +02001008 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
1009 enum port port = intel_dig_port->port;
Jani Nikula0b998362014-03-14 16:51:17 +02001010 const char *name = NULL;
Dave Airlieab2c0672009-12-04 10:55:24 +10001011 int ret;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001012
Jani Nikula33ad6622014-03-14 16:51:16 +02001013 switch (port) {
1014 case PORT_A:
1015 intel_dp->aux_ch_ctl_reg = DPA_AUX_CH_CTL;
Jani Nikula0b998362014-03-14 16:51:17 +02001016 name = "DPDDC-A";
Dave Airlieab2c0672009-12-04 10:55:24 +10001017 break;
Jani Nikula33ad6622014-03-14 16:51:16 +02001018 case PORT_B:
1019 intel_dp->aux_ch_ctl_reg = PCH_DPB_AUX_CH_CTL;
Jani Nikula0b998362014-03-14 16:51:17 +02001020 name = "DPDDC-B";
Jani Nikula33ad6622014-03-14 16:51:16 +02001021 break;
1022 case PORT_C:
1023 intel_dp->aux_ch_ctl_reg = PCH_DPC_AUX_CH_CTL;
Jani Nikula0b998362014-03-14 16:51:17 +02001024 name = "DPDDC-C";
Jani Nikula33ad6622014-03-14 16:51:16 +02001025 break;
1026 case PORT_D:
1027 intel_dp->aux_ch_ctl_reg = PCH_DPD_AUX_CH_CTL;
Jani Nikula0b998362014-03-14 16:51:17 +02001028 name = "DPDDC-D";
Dave Airlieab2c0672009-12-04 10:55:24 +10001029 break;
1030 default:
Jani Nikula33ad6622014-03-14 16:51:16 +02001031 BUG();
Dave Airlieab2c0672009-12-04 10:55:24 +10001032 }
1033
Damien Lespiau1b1aad72013-12-03 13:56:29 +00001034 /*
1035 * The AUX_CTL register is usually DP_CTL + 0x10.
1036 *
1037 * On Haswell and Broadwell though:
1038 * - Both port A DDI_BUF_CTL and DDI_AUX_CTL are on the CPU
1039 * - Port B/C/D AUX channels are on the PCH, DDI_BUF_CTL on the CPU
1040 *
1041 * Skylake moves AUX_CTL back next to DDI_BUF_CTL, on the CPU.
1042 */
1043 if (!IS_HASWELL(dev) && !IS_BROADWELL(dev))
Jani Nikula33ad6622014-03-14 16:51:16 +02001044 intel_dp->aux_ch_ctl_reg = intel_dp->output_reg + 0x10;
David Flynn8316f332010-12-08 16:10:21 +00001045
Jani Nikula0b998362014-03-14 16:51:17 +02001046 intel_dp->aux.name = name;
Jani Nikula9d1a1032014-03-14 16:51:15 +02001047 intel_dp->aux.dev = dev->dev;
1048 intel_dp->aux.transfer = intel_dp_aux_transfer;
David Flynn8316f332010-12-08 16:10:21 +00001049
Jani Nikula0b998362014-03-14 16:51:17 +02001050 DRM_DEBUG_KMS("registering %s bus for %s\n", name,
1051 connector->base.kdev->kobj.name);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001052
Dave Airlie4f71d0c2014-06-04 16:02:28 +10001053 ret = drm_dp_aux_register(&intel_dp->aux);
Jani Nikula0b998362014-03-14 16:51:17 +02001054 if (ret < 0) {
Dave Airlie4f71d0c2014-06-04 16:02:28 +10001055 DRM_ERROR("drm_dp_aux_register() for %s failed (%d)\n",
Jani Nikula0b998362014-03-14 16:51:17 +02001056 name, ret);
1057 return;
Dave Airlieab2c0672009-12-04 10:55:24 +10001058 }
David Flynn8316f332010-12-08 16:10:21 +00001059
Jani Nikula0b998362014-03-14 16:51:17 +02001060 ret = sysfs_create_link(&connector->base.kdev->kobj,
1061 &intel_dp->aux.ddc.dev.kobj,
1062 intel_dp->aux.ddc.dev.kobj.name);
1063 if (ret < 0) {
1064 DRM_ERROR("sysfs_create_link() for %s failed (%d)\n", name, ret);
Dave Airlie4f71d0c2014-06-04 16:02:28 +10001065 drm_dp_aux_unregister(&intel_dp->aux);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001066 }
1067}
1068
Imre Deak80f65de2014-02-11 17:12:49 +02001069static void
1070intel_dp_connector_unregister(struct intel_connector *intel_connector)
1071{
1072 struct intel_dp *intel_dp = intel_attached_dp(&intel_connector->base);
1073
Dave Airlie0e32b392014-05-02 14:02:48 +10001074 if (!intel_connector->mst_port)
1075 sysfs_remove_link(&intel_connector->base.kdev->kobj,
1076 intel_dp->aux.ddc.dev.kobj.name);
Imre Deak80f65de2014-02-11 17:12:49 +02001077 intel_connector_unregister(intel_connector);
1078}
1079
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001080static void
Sonika Jindalc3346ef2015-02-21 11:12:13 +05301081skl_edp_set_pll_config(struct intel_crtc_state *pipe_config, int link_clock)
Damien Lespiau5416d872014-11-14 17:24:33 +00001082{
1083 u32 ctrl1;
1084
1085 pipe_config->ddi_pll_sel = SKL_DPLL0;
1086 pipe_config->dpll_hw_state.cfgcr1 = 0;
1087 pipe_config->dpll_hw_state.cfgcr2 = 0;
1088
1089 ctrl1 = DPLL_CTRL1_OVERRIDE(SKL_DPLL0);
Sonika Jindalc3346ef2015-02-21 11:12:13 +05301090 switch (link_clock / 2) {
1091 case 81000:
Damien Lespiau5416d872014-11-14 17:24:33 +00001092 ctrl1 |= DPLL_CRTL1_LINK_RATE(DPLL_CRTL1_LINK_RATE_810,
1093 SKL_DPLL0);
1094 break;
Sonika Jindalc3346ef2015-02-21 11:12:13 +05301095 case 135000:
Damien Lespiau5416d872014-11-14 17:24:33 +00001096 ctrl1 |= DPLL_CRTL1_LINK_RATE(DPLL_CRTL1_LINK_RATE_1350,
1097 SKL_DPLL0);
1098 break;
Sonika Jindalc3346ef2015-02-21 11:12:13 +05301099 case 270000:
Damien Lespiau5416d872014-11-14 17:24:33 +00001100 ctrl1 |= DPLL_CRTL1_LINK_RATE(DPLL_CRTL1_LINK_RATE_2700,
1101 SKL_DPLL0);
1102 break;
Sonika Jindalc3346ef2015-02-21 11:12:13 +05301103 case 162000:
1104 ctrl1 |= DPLL_CRTL1_LINK_RATE(DPLL_CRTL1_LINK_RATE_1620,
1105 SKL_DPLL0);
1106 break;
1107 /* TBD: For DP link rates 2.16 GHz and 4.32 GHz, VCO is 8640 which
1108 results in CDCLK change. Need to handle the change of CDCLK by
1109 disabling pipes and re-enabling them */
1110 case 108000:
1111 ctrl1 |= DPLL_CRTL1_LINK_RATE(DPLL_CRTL1_LINK_RATE_1080,
1112 SKL_DPLL0);
1113 break;
1114 case 216000:
1115 ctrl1 |= DPLL_CRTL1_LINK_RATE(DPLL_CRTL1_LINK_RATE_2160,
1116 SKL_DPLL0);
1117 break;
1118
Damien Lespiau5416d872014-11-14 17:24:33 +00001119 }
1120 pipe_config->dpll_hw_state.ctrl1 = ctrl1;
1121}
1122
1123static void
Ander Conselvan de Oliveira5cec2582015-01-15 14:55:21 +02001124hsw_dp_set_ddi_pll_sel(struct intel_crtc_state *pipe_config, int link_bw)
Daniel Vetter0e503382014-07-04 11:26:04 -03001125{
1126 switch (link_bw) {
1127 case DP_LINK_BW_1_62:
1128 pipe_config->ddi_pll_sel = PORT_CLK_SEL_LCPLL_810;
1129 break;
1130 case DP_LINK_BW_2_7:
1131 pipe_config->ddi_pll_sel = PORT_CLK_SEL_LCPLL_1350;
1132 break;
1133 case DP_LINK_BW_5_4:
1134 pipe_config->ddi_pll_sel = PORT_CLK_SEL_LCPLL_2700;
1135 break;
1136 }
1137}
1138
Sonika Jindalfc0f8e22015-03-05 10:03:58 +05301139static int
Ville Syrjälä12f6a2e2015-03-12 17:10:30 +02001140intel_dp_sink_rates(struct intel_dp *intel_dp, const int **sink_rates)
Sonika Jindalfc0f8e22015-03-05 10:03:58 +05301141{
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001142 if (intel_dp->num_sink_rates) {
1143 *sink_rates = intel_dp->sink_rates;
1144 return intel_dp->num_sink_rates;
Sonika Jindalfc0f8e22015-03-05 10:03:58 +05301145 }
Ville Syrjälä12f6a2e2015-03-12 17:10:30 +02001146
1147 *sink_rates = default_rates;
1148
1149 return (intel_dp_max_link_bw(intel_dp) >> 3) + 1;
Sonika Jindalfc0f8e22015-03-05 10:03:58 +05301150}
1151
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301152static int
Ville Syrjälä1db10e22015-03-12 17:10:32 +02001153intel_dp_source_rates(struct drm_device *dev, const int **source_rates)
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301154{
Ville Syrjälä636280b2015-03-12 17:10:29 +02001155 if (INTEL_INFO(dev)->gen >= 9) {
1156 *source_rates = gen9_rates;
1157 return ARRAY_SIZE(gen9_rates);
Ville Syrjäläfe51bfb2015-03-12 17:10:38 +02001158 } else if (IS_CHERRYVIEW(dev)) {
1159 *source_rates = chv_rates;
1160 return ARRAY_SIZE(chv_rates);
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301161 }
Ville Syrjälä636280b2015-03-12 17:10:29 +02001162
1163 *source_rates = default_rates;
1164
Ville Syrjälä1db10e22015-03-12 17:10:32 +02001165 if (IS_SKYLAKE(dev) && INTEL_REVID(dev) <= SKL_REVID_B0)
1166 /* WaDisableHBR2:skl */
1167 return (DP_LINK_BW_2_7 >> 3) + 1;
1168 else if (INTEL_INFO(dev)->gen >= 8 ||
1169 (IS_HASWELL(dev) && !IS_HSW_ULX(dev)))
1170 return (DP_LINK_BW_5_4 >> 3) + 1;
1171 else
1172 return (DP_LINK_BW_2_7 >> 3) + 1;
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301173}
1174
Daniel Vetter0e503382014-07-04 11:26:04 -03001175static void
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001176intel_dp_set_clock(struct intel_encoder *encoder,
Ander Conselvan de Oliveira5cec2582015-01-15 14:55:21 +02001177 struct intel_crtc_state *pipe_config, int link_bw)
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001178{
1179 struct drm_device *dev = encoder->base.dev;
Chon Ming Lee9dd4ffd2013-09-04 01:30:37 +08001180 const struct dp_link_dpll *divisor = NULL;
1181 int i, count = 0;
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001182
1183 if (IS_G4X(dev)) {
Chon Ming Lee9dd4ffd2013-09-04 01:30:37 +08001184 divisor = gen4_dpll;
1185 count = ARRAY_SIZE(gen4_dpll);
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001186 } else if (HAS_PCH_SPLIT(dev)) {
Chon Ming Lee9dd4ffd2013-09-04 01:30:37 +08001187 divisor = pch_dpll;
1188 count = ARRAY_SIZE(pch_dpll);
Chon Ming Leeef9348c2014-04-09 13:28:18 +03001189 } else if (IS_CHERRYVIEW(dev)) {
1190 divisor = chv_dpll;
1191 count = ARRAY_SIZE(chv_dpll);
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001192 } else if (IS_VALLEYVIEW(dev)) {
Chon Ming Lee65ce4bf2013-09-04 01:30:38 +08001193 divisor = vlv_dpll;
1194 count = ARRAY_SIZE(vlv_dpll);
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001195 }
Chon Ming Lee9dd4ffd2013-09-04 01:30:37 +08001196
1197 if (divisor && count) {
1198 for (i = 0; i < count; i++) {
1199 if (link_bw == divisor[i].link_bw) {
1200 pipe_config->dpll = divisor[i].dpll;
1201 pipe_config->clock_set = true;
1202 break;
1203 }
1204 }
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001205 }
1206}
1207
Ville Syrjälä2ecae762015-03-12 17:10:33 +02001208static int intersect_rates(const int *source_rates, int source_len,
1209 const int *sink_rates, int sink_len,
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001210 int *common_rates)
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301211{
1212 int i = 0, j = 0, k = 0;
1213
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301214 while (i < source_len && j < sink_len) {
1215 if (source_rates[i] == sink_rates[j]) {
Ville Syrjäläe6bda3e2015-03-12 17:10:37 +02001216 if (WARN_ON(k >= DP_MAX_SUPPORTED_RATES))
1217 return k;
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001218 common_rates[k] = source_rates[i];
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301219 ++k;
1220 ++i;
1221 ++j;
1222 } else if (source_rates[i] < sink_rates[j]) {
1223 ++i;
1224 } else {
1225 ++j;
1226 }
1227 }
1228 return k;
1229}
1230
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001231static int intel_dp_common_rates(struct intel_dp *intel_dp,
1232 int *common_rates)
Ville Syrjälä2ecae762015-03-12 17:10:33 +02001233{
1234 struct drm_device *dev = intel_dp_to_dev(intel_dp);
1235 const int *source_rates, *sink_rates;
1236 int source_len, sink_len;
1237
1238 sink_len = intel_dp_sink_rates(intel_dp, &sink_rates);
1239 source_len = intel_dp_source_rates(dev, &source_rates);
1240
1241 return intersect_rates(source_rates, source_len,
1242 sink_rates, sink_len,
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001243 common_rates);
Ville Syrjälä2ecae762015-03-12 17:10:33 +02001244}
1245
Ville Syrjälä0336400e2015-03-12 17:10:39 +02001246static void snprintf_int_array(char *str, size_t len,
1247 const int *array, int nelem)
1248{
1249 int i;
1250
1251 str[0] = '\0';
1252
1253 for (i = 0; i < nelem; i++) {
1254 int r = snprintf(str, len, "%d,", array[i]);
1255 if (r >= len)
1256 return;
1257 str += r;
1258 len -= r;
1259 }
1260}
1261
1262static void intel_dp_print_rates(struct intel_dp *intel_dp)
1263{
1264 struct drm_device *dev = intel_dp_to_dev(intel_dp);
1265 const int *source_rates, *sink_rates;
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001266 int source_len, sink_len, common_len;
1267 int common_rates[DP_MAX_SUPPORTED_RATES];
Ville Syrjälä0336400e2015-03-12 17:10:39 +02001268 char str[128]; /* FIXME: too big for stack? */
1269
1270 if ((drm_debug & DRM_UT_KMS) == 0)
1271 return;
1272
1273 source_len = intel_dp_source_rates(dev, &source_rates);
1274 snprintf_int_array(str, sizeof(str), source_rates, source_len);
1275 DRM_DEBUG_KMS("source rates: %s\n", str);
1276
1277 sink_len = intel_dp_sink_rates(intel_dp, &sink_rates);
1278 snprintf_int_array(str, sizeof(str), sink_rates, sink_len);
1279 DRM_DEBUG_KMS("sink rates: %s\n", str);
1280
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001281 common_len = intel_dp_common_rates(intel_dp, common_rates);
1282 snprintf_int_array(str, sizeof(str), common_rates, common_len);
1283 DRM_DEBUG_KMS("common rates: %s\n", str);
Ville Syrjälä0336400e2015-03-12 17:10:39 +02001284}
1285
Ville Syrjäläf4896f12015-03-12 17:10:27 +02001286static int rate_to_index(int find, const int *rates)
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301287{
1288 int i = 0;
1289
1290 for (i = 0; i < DP_MAX_SUPPORTED_RATES; ++i)
1291 if (find == rates[i])
1292 break;
1293
1294 return i;
1295}
1296
Ville Syrjälä50fec212015-03-12 17:10:34 +02001297int
1298intel_dp_max_link_rate(struct intel_dp *intel_dp)
1299{
1300 int rates[DP_MAX_SUPPORTED_RATES] = {};
1301 int len;
1302
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001303 len = intel_dp_common_rates(intel_dp, rates);
Ville Syrjälä50fec212015-03-12 17:10:34 +02001304 if (WARN_ON(len <= 0))
1305 return 162000;
1306
1307 return rates[rate_to_index(0, rates) - 1];
1308}
1309
Ville Syrjäläed4e9c12015-03-12 17:10:36 +02001310int intel_dp_rate_select(struct intel_dp *intel_dp, int rate)
1311{
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001312 return rate_to_index(rate, intel_dp->sink_rates);
Ville Syrjäläed4e9c12015-03-12 17:10:36 +02001313}
1314
Paulo Zanoni00c09d72012-10-26 19:05:52 -02001315bool
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01001316intel_dp_compute_config(struct intel_encoder *encoder,
Ander Conselvan de Oliveira5cec2582015-01-15 14:55:21 +02001317 struct intel_crtc_state *pipe_config)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001318{
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01001319 struct drm_device *dev = encoder->base.dev;
Daniel Vetter36008362013-03-27 00:44:59 +01001320 struct drm_i915_private *dev_priv = dev->dev_private;
Ander Conselvan de Oliveira2d112de2015-01-15 14:55:22 +02001321 struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01001322 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Imre Deakbc7d38a2013-05-16 14:40:36 +03001323 enum port port = dp_to_dig_port(intel_dp)->port;
Ander Conselvan de Oliveira84556d52015-03-20 16:18:10 +02001324 struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->base.crtc);
Jani Nikuladd06f902012-10-19 14:51:50 +03001325 struct intel_connector *intel_connector = intel_dp->attached_connector;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001326 int lane_count, clock;
Jani Nikula56071a22014-05-06 14:56:52 +03001327 int min_lane_count = 1;
Paulo Zanonieeb63242014-05-06 14:56:50 +03001328 int max_lane_count = intel_dp_max_lane_count(intel_dp);
Todd Previte06ea66b2014-01-20 10:19:39 -07001329 /* Conveniently, the link BW constants become indices with a shift...*/
Jani Nikula56071a22014-05-06 14:56:52 +03001330 int min_clock = 0;
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301331 int max_clock;
Daniel Vetter083f9562012-04-20 20:23:49 +02001332 int bpp, mode_rate;
Daniel Vetterff9a6752013-06-01 17:16:21 +02001333 int link_avail, link_clock;
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001334 int common_rates[DP_MAX_SUPPORTED_RATES] = {};
1335 int common_len;
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301336
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001337 common_len = intel_dp_common_rates(intel_dp, common_rates);
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301338
1339 /* No common link rates between source and sink */
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001340 WARN_ON(common_len <= 0);
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301341
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001342 max_clock = common_len - 1;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001343
Imre Deakbc7d38a2013-05-16 14:40:36 +03001344 if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev) && port != PORT_A)
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01001345 pipe_config->has_pch_encoder = true;
1346
Daniel Vetter03afc4a2013-04-02 23:42:31 +02001347 pipe_config->has_dp_encoder = true;
Vandana Kannanf769cd22014-08-05 07:51:22 -07001348 pipe_config->has_drrs = false;
Daniel Vetter9ed109a2014-04-24 23:54:52 +02001349 pipe_config->has_audio = intel_dp->has_audio;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001350
Jani Nikuladd06f902012-10-19 14:51:50 +03001351 if (is_edp(intel_dp) && intel_connector->panel.fixed_mode) {
1352 intel_fixed_panel_mode(intel_connector->panel.fixed_mode,
1353 adjusted_mode);
Chandra Kondurua1b22782015-04-07 15:28:45 -07001354
1355 if (INTEL_INFO(dev)->gen >= 9) {
1356 int ret;
1357 ret = skl_update_scaler_users(intel_crtc, pipe_config, NULL, NULL, 0);
1358 if (ret)
1359 return ret;
1360 }
1361
Jesse Barnes2dd24552013-04-25 12:55:01 -07001362 if (!HAS_PCH_SPLIT(dev))
1363 intel_gmch_panel_fitting(intel_crtc, pipe_config,
1364 intel_connector->panel.fitting_mode);
1365 else
Jesse Barnesb074cec2013-04-25 12:55:02 -07001366 intel_pch_panel_fitting(intel_crtc, pipe_config,
1367 intel_connector->panel.fitting_mode);
Zhao Yakui0d3a1be2010-07-19 09:43:13 +01001368 }
1369
Daniel Vettercb1793c2012-06-04 18:39:21 +02001370 if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK)
Daniel Vetter0af78a22012-05-23 11:30:55 +02001371 return false;
1372
Daniel Vetter083f9562012-04-20 20:23:49 +02001373 DRM_DEBUG_KMS("DP link computation with max lane count %i "
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301374 "max bw %d pixel clock %iKHz\n",
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001375 max_lane_count, common_rates[max_clock],
Damien Lespiau241bfc32013-09-25 16:45:37 +01001376 adjusted_mode->crtc_clock);
Daniel Vetter083f9562012-04-20 20:23:49 +02001377
Daniel Vetter36008362013-03-27 00:44:59 +01001378 /* Walk through all bpp values. Luckily they're all nicely spaced with 2
1379 * bpc in between. */
Daniel Vetter3e7ca982013-06-01 19:45:56 +02001380 bpp = pipe_config->pipe_bpp;
Jani Nikula56071a22014-05-06 14:56:52 +03001381 if (is_edp(intel_dp)) {
1382 if (dev_priv->vbt.edp_bpp && dev_priv->vbt.edp_bpp < bpp) {
1383 DRM_DEBUG_KMS("clamping bpp for eDP panel to BIOS-provided %i\n",
1384 dev_priv->vbt.edp_bpp);
1385 bpp = dev_priv->vbt.edp_bpp;
1386 }
1387
Jani Nikula344c5bb2014-09-09 11:25:13 +03001388 /*
1389 * Use the maximum clock and number of lanes the eDP panel
1390 * advertizes being capable of. The panels are generally
1391 * designed to support only a single clock and lane
1392 * configuration, and typically these values correspond to the
1393 * native resolution of the panel.
1394 */
1395 min_lane_count = max_lane_count;
1396 min_clock = max_clock;
Imre Deak79842112013-07-18 17:44:13 +03001397 }
Daniel Vetter657445f2013-05-04 10:09:18 +02001398
Daniel Vetter36008362013-03-27 00:44:59 +01001399 for (; bpp >= 6*3; bpp -= 2*3) {
Damien Lespiau241bfc32013-09-25 16:45:37 +01001400 mode_rate = intel_dp_link_required(adjusted_mode->crtc_clock,
1401 bpp);
Daniel Vetterc4867932012-04-10 10:42:36 +02001402
Dave Airliec6930992014-07-14 11:04:39 +10001403 for (clock = min_clock; clock <= max_clock; clock++) {
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301404 for (lane_count = min_lane_count;
1405 lane_count <= max_lane_count;
1406 lane_count <<= 1) {
1407
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001408 link_clock = common_rates[clock];
Daniel Vetter36008362013-03-27 00:44:59 +01001409 link_avail = intel_dp_max_data_rate(link_clock,
1410 lane_count);
Ville Syrjälä3685a8f2013-01-17 16:31:28 +02001411
Daniel Vetter36008362013-03-27 00:44:59 +01001412 if (mode_rate <= link_avail) {
1413 goto found;
1414 }
1415 }
1416 }
1417 }
1418
1419 return false;
1420
1421found:
Ville Syrjälä55bc60d2013-01-17 16:31:29 +02001422 if (intel_dp->color_range_auto) {
1423 /*
1424 * See:
1425 * CEA-861-E - 5.1 Default Encoding Parameters
1426 * VESA DisplayPort Ver.1.2a - 5.1.1.1 Video Colorimetry
1427 */
Thierry Reding18316c82012-12-20 15:41:44 +01001428 if (bpp != 18 && drm_match_cea_mode(adjusted_mode) > 1)
Ville Syrjälä55bc60d2013-01-17 16:31:29 +02001429 intel_dp->color_range = DP_COLOR_RANGE_16_235;
1430 else
1431 intel_dp->color_range = 0;
1432 }
1433
Ville Syrjälä3685a8f2013-01-17 16:31:28 +02001434 if (intel_dp->color_range)
Daniel Vetter50f3b012013-03-27 00:44:56 +01001435 pipe_config->limited_color_range = true;
Ville Syrjälä3685a8f2013-01-17 16:31:28 +02001436
Daniel Vetter36008362013-03-27 00:44:59 +01001437 intel_dp->lane_count = lane_count;
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301438
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001439 if (intel_dp->num_sink_rates) {
Ville Syrjäläbc27b7d2015-03-12 17:10:35 +02001440 intel_dp->link_bw = 0;
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301441 intel_dp->rate_select =
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001442 intel_dp_rate_select(intel_dp, common_rates[clock]);
Ville Syrjäläbc27b7d2015-03-12 17:10:35 +02001443 } else {
1444 intel_dp->link_bw =
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001445 drm_dp_link_rate_to_bw_code(common_rates[clock]);
Ville Syrjäläbc27b7d2015-03-12 17:10:35 +02001446 intel_dp->rate_select = 0;
Sonika Jindala8f3ef62015-03-05 10:02:30 +05301447 }
1448
Daniel Vetter657445f2013-05-04 10:09:18 +02001449 pipe_config->pipe_bpp = bpp;
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001450 pipe_config->port_clock = common_rates[clock];
Daniel Vetterc4867932012-04-10 10:42:36 +02001451
Daniel Vetter36008362013-03-27 00:44:59 +01001452 DRM_DEBUG_KMS("DP link bw %02x lane count %d clock %d bpp %d\n",
1453 intel_dp->link_bw, intel_dp->lane_count,
Daniel Vetterff9a6752013-06-01 17:16:21 +02001454 pipe_config->port_clock, bpp);
Daniel Vetter36008362013-03-27 00:44:59 +01001455 DRM_DEBUG_KMS("DP link bw required %i available %i\n",
1456 mode_rate, link_avail);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001457
Daniel Vetter03afc4a2013-04-02 23:42:31 +02001458 intel_link_compute_m_n(bpp, lane_count,
Damien Lespiau241bfc32013-09-25 16:45:37 +01001459 adjusted_mode->crtc_clock,
1460 pipe_config->port_clock,
Daniel Vetter03afc4a2013-04-02 23:42:31 +02001461 &pipe_config->dp_m_n);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001462
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05301463 if (intel_connector->panel.downclock_mode != NULL &&
Vandana Kannan96178ee2015-01-10 02:25:56 +05301464 dev_priv->drrs.type == SEAMLESS_DRRS_SUPPORT) {
Vandana Kannanf769cd22014-08-05 07:51:22 -07001465 pipe_config->has_drrs = true;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05301466 intel_link_compute_m_n(bpp, lane_count,
1467 intel_connector->panel.downclock_mode->clock,
1468 pipe_config->port_clock,
1469 &pipe_config->dp_m2_n2);
1470 }
1471
Damien Lespiau5416d872014-11-14 17:24:33 +00001472 if (IS_SKYLAKE(dev) && is_edp(intel_dp))
Ville Syrjälä94ca7192015-03-13 19:40:31 +02001473 skl_edp_set_pll_config(pipe_config, common_rates[clock]);
Satheeshakrishna M977bb382014-08-22 09:49:12 +05301474 else if (IS_BROXTON(dev))
1475 /* handled in ddi */;
Damien Lespiau5416d872014-11-14 17:24:33 +00001476 else if (IS_HASWELL(dev) || IS_BROADWELL(dev))
Daniel Vetter0e503382014-07-04 11:26:04 -03001477 hsw_dp_set_ddi_pll_sel(pipe_config, intel_dp->link_bw);
1478 else
1479 intel_dp_set_clock(encoder, pipe_config, intel_dp->link_bw);
Daniel Vetterc6bb3532013-04-19 11:14:33 +02001480
Daniel Vetter36008362013-03-27 00:44:59 +01001481 return true;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001482}
1483
Daniel Vetter7c62a162013-06-01 17:16:20 +02001484static void ironlake_set_pll_cpu_edp(struct intel_dp *intel_dp)
Daniel Vetterea9b6002012-11-29 15:59:31 +01001485{
Daniel Vetter7c62a162013-06-01 17:16:20 +02001486 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
1487 struct intel_crtc *crtc = to_intel_crtc(dig_port->base.base.crtc);
1488 struct drm_device *dev = crtc->base.dev;
Daniel Vetterea9b6002012-11-29 15:59:31 +01001489 struct drm_i915_private *dev_priv = dev->dev_private;
1490 u32 dpa_ctl;
1491
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001492 DRM_DEBUG_KMS("eDP PLL enable for clock %d\n",
1493 crtc->config->port_clock);
Daniel Vetterea9b6002012-11-29 15:59:31 +01001494 dpa_ctl = I915_READ(DP_A);
1495 dpa_ctl &= ~DP_PLL_FREQ_MASK;
1496
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001497 if (crtc->config->port_clock == 162000) {
Daniel Vetter1ce17032012-11-29 15:59:32 +01001498 /* For a long time we've carried around a ILK-DevA w/a for the
1499 * 160MHz clock. If we're really unlucky, it's still required.
1500 */
1501 DRM_DEBUG_KMS("160MHz cpu eDP clock, might need ilk devA w/a\n");
Daniel Vetterea9b6002012-11-29 15:59:31 +01001502 dpa_ctl |= DP_PLL_FREQ_160MHZ;
Daniel Vetter7c62a162013-06-01 17:16:20 +02001503 intel_dp->DP |= DP_PLL_FREQ_160MHZ;
Daniel Vetterea9b6002012-11-29 15:59:31 +01001504 } else {
1505 dpa_ctl |= DP_PLL_FREQ_270MHZ;
Daniel Vetter7c62a162013-06-01 17:16:20 +02001506 intel_dp->DP |= DP_PLL_FREQ_270MHZ;
Daniel Vetterea9b6002012-11-29 15:59:31 +01001507 }
Daniel Vetter1ce17032012-11-29 15:59:32 +01001508
Daniel Vetterea9b6002012-11-29 15:59:31 +01001509 I915_WRITE(DP_A, dpa_ctl);
1510
1511 POSTING_READ(DP_A);
1512 udelay(500);
1513}
1514
Daniel Vetter8ac33ed2014-04-24 23:54:54 +02001515static void intel_dp_prepare(struct intel_encoder *encoder)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001516{
Daniel Vetterb934223d2013-07-21 21:37:05 +02001517 struct drm_device *dev = encoder->base.dev;
Keith Packard417e8222011-11-01 19:54:11 -07001518 struct drm_i915_private *dev_priv = dev->dev_private;
Daniel Vetterb934223d2013-07-21 21:37:05 +02001519 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Imre Deakbc7d38a2013-05-16 14:40:36 +03001520 enum port port = dp_to_dig_port(intel_dp)->port;
Daniel Vetterb934223d2013-07-21 21:37:05 +02001521 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001522 struct drm_display_mode *adjusted_mode = &crtc->config->base.adjusted_mode;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001523
Keith Packard417e8222011-11-01 19:54:11 -07001524 /*
Keith Packard1a2eb462011-11-16 16:26:07 -08001525 * There are four kinds of DP registers:
Keith Packard417e8222011-11-01 19:54:11 -07001526 *
1527 * IBX PCH
Keith Packard1a2eb462011-11-16 16:26:07 -08001528 * SNB CPU
1529 * IVB CPU
Keith Packard417e8222011-11-01 19:54:11 -07001530 * CPT PCH
1531 *
1532 * IBX PCH and CPU are the same for almost everything,
1533 * except that the CPU DP PLL is configured in this
1534 * register
1535 *
1536 * CPT PCH is quite different, having many bits moved
1537 * to the TRANS_DP_CTL register instead. That
1538 * configuration happens (oddly) in ironlake_pch_enable
1539 */
Adam Jackson9c9e7922010-04-05 17:57:59 -04001540
Keith Packard417e8222011-11-01 19:54:11 -07001541 /* Preserve the BIOS-computed detected bit. This is
1542 * supposed to be read-only.
1543 */
1544 intel_dp->DP = I915_READ(intel_dp->output_reg) & DP_DETECTED;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001545
Keith Packard417e8222011-11-01 19:54:11 -07001546 /* Handle DP bits in common between all three register formats */
Keith Packard417e8222011-11-01 19:54:11 -07001547 intel_dp->DP |= DP_VOLTAGE_0_4 | DP_PRE_EMPHASIS_0;
Daniel Vetter17aa6be2013-04-30 14:01:40 +02001548 intel_dp->DP |= DP_PORT_WIDTH(intel_dp->lane_count);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001549
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001550 if (crtc->config->has_audio)
Chris Wilsonea5b2132010-08-04 13:50:23 +01001551 intel_dp->DP |= DP_AUDIO_OUTPUT_ENABLE;
Paulo Zanoni247d89f2012-10-15 15:51:33 -03001552
Keith Packard417e8222011-11-01 19:54:11 -07001553 /* Split out the IBX/CPU vs CPT settings */
Zhenyu Wang32f9d652009-07-24 01:00:32 +08001554
Imre Deakbc7d38a2013-05-16 14:40:36 +03001555 if (port == PORT_A && IS_GEN7(dev) && !IS_VALLEYVIEW(dev)) {
Keith Packard1a2eb462011-11-16 16:26:07 -08001556 if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
1557 intel_dp->DP |= DP_SYNC_HS_HIGH;
1558 if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
1559 intel_dp->DP |= DP_SYNC_VS_HIGH;
1560 intel_dp->DP |= DP_LINK_TRAIN_OFF_CPT;
1561
Jani Nikula6aba5b62013-10-04 15:08:10 +03001562 if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
Keith Packard1a2eb462011-11-16 16:26:07 -08001563 intel_dp->DP |= DP_ENHANCED_FRAMING;
1564
Daniel Vetter7c62a162013-06-01 17:16:20 +02001565 intel_dp->DP |= crtc->pipe << 29;
Imre Deakbc7d38a2013-05-16 14:40:36 +03001566 } else if (!HAS_PCH_CPT(dev) || port == PORT_A) {
Jesse Barnesb2634012013-03-28 09:55:40 -07001567 if (!HAS_PCH_SPLIT(dev) && !IS_VALLEYVIEW(dev))
Ville Syrjälä3685a8f2013-01-17 16:31:28 +02001568 intel_dp->DP |= intel_dp->color_range;
Keith Packard417e8222011-11-01 19:54:11 -07001569
1570 if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
1571 intel_dp->DP |= DP_SYNC_HS_HIGH;
1572 if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
1573 intel_dp->DP |= DP_SYNC_VS_HIGH;
1574 intel_dp->DP |= DP_LINK_TRAIN_OFF;
1575
Jani Nikula6aba5b62013-10-04 15:08:10 +03001576 if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
Keith Packard417e8222011-11-01 19:54:11 -07001577 intel_dp->DP |= DP_ENHANCED_FRAMING;
1578
Chon Ming Lee44f37d12014-04-09 13:28:21 +03001579 if (!IS_CHERRYVIEW(dev)) {
1580 if (crtc->pipe == 1)
1581 intel_dp->DP |= DP_PIPEB_SELECT;
1582 } else {
1583 intel_dp->DP |= DP_PIPE_SELECT_CHV(crtc->pipe);
1584 }
Keith Packard417e8222011-11-01 19:54:11 -07001585 } else {
1586 intel_dp->DP |= DP_LINK_TRAIN_OFF_CPT;
Zhenyu Wang32f9d652009-07-24 01:00:32 +08001587 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -07001588}
1589
Paulo Zanoniffd6749d2013-12-19 14:29:42 -02001590#define IDLE_ON_MASK (PP_ON | PP_SEQUENCE_MASK | 0 | PP_SEQUENCE_STATE_MASK)
1591#define IDLE_ON_VALUE (PP_ON | PP_SEQUENCE_NONE | 0 | PP_SEQUENCE_STATE_ON_IDLE)
Keith Packard99ea7122011-11-01 19:57:50 -07001592
Paulo Zanoni1a5ef5b2013-12-19 14:29:43 -02001593#define IDLE_OFF_MASK (PP_ON | PP_SEQUENCE_MASK | 0 | 0)
1594#define IDLE_OFF_VALUE (0 | PP_SEQUENCE_NONE | 0 | 0)
Keith Packard99ea7122011-11-01 19:57:50 -07001595
Paulo Zanoniffd6749d2013-12-19 14:29:42 -02001596#define IDLE_CYCLE_MASK (PP_ON | PP_SEQUENCE_MASK | PP_CYCLE_DELAY_ACTIVE | PP_SEQUENCE_STATE_MASK)
1597#define IDLE_CYCLE_VALUE (0 | PP_SEQUENCE_NONE | 0 | PP_SEQUENCE_STATE_OFF_IDLE)
Keith Packard99ea7122011-11-01 19:57:50 -07001598
Daniel Vetter4be73782014-01-17 14:39:48 +01001599static void wait_panel_status(struct intel_dp *intel_dp,
Keith Packard99ea7122011-11-01 19:57:50 -07001600 u32 mask,
1601 u32 value)
1602{
Paulo Zanoni30add222012-10-26 19:05:45 -02001603 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Keith Packard99ea7122011-11-01 19:57:50 -07001604 struct drm_i915_private *dev_priv = dev->dev_private;
Jesse Barnes453c5422013-03-28 09:55:41 -07001605 u32 pp_stat_reg, pp_ctrl_reg;
1606
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001607 lockdep_assert_held(&dev_priv->pps_mutex);
1608
Jani Nikulabf13e812013-09-06 07:40:05 +03001609 pp_stat_reg = _pp_stat_reg(intel_dp);
1610 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
Keith Packard99ea7122011-11-01 19:57:50 -07001611
1612 DRM_DEBUG_KMS("mask %08x value %08x status %08x control %08x\n",
Jesse Barnes453c5422013-03-28 09:55:41 -07001613 mask, value,
1614 I915_READ(pp_stat_reg),
1615 I915_READ(pp_ctrl_reg));
Keith Packard99ea7122011-11-01 19:57:50 -07001616
Jesse Barnes453c5422013-03-28 09:55:41 -07001617 if (_wait_for((I915_READ(pp_stat_reg) & mask) == value, 5000, 10)) {
Keith Packard99ea7122011-11-01 19:57:50 -07001618 DRM_ERROR("Panel status timeout: status %08x control %08x\n",
Jesse Barnes453c5422013-03-28 09:55:41 -07001619 I915_READ(pp_stat_reg),
1620 I915_READ(pp_ctrl_reg));
Keith Packard99ea7122011-11-01 19:57:50 -07001621 }
Chris Wilson54c136d2013-12-02 09:57:16 +00001622
1623 DRM_DEBUG_KMS("Wait complete\n");
Keith Packard99ea7122011-11-01 19:57:50 -07001624}
1625
Daniel Vetter4be73782014-01-17 14:39:48 +01001626static void wait_panel_on(struct intel_dp *intel_dp)
Keith Packard99ea7122011-11-01 19:57:50 -07001627{
1628 DRM_DEBUG_KMS("Wait for panel power on\n");
Daniel Vetter4be73782014-01-17 14:39:48 +01001629 wait_panel_status(intel_dp, IDLE_ON_MASK, IDLE_ON_VALUE);
Keith Packard99ea7122011-11-01 19:57:50 -07001630}
1631
Daniel Vetter4be73782014-01-17 14:39:48 +01001632static void wait_panel_off(struct intel_dp *intel_dp)
Keith Packardbd943152011-09-18 23:09:52 -07001633{
Keith Packardbd943152011-09-18 23:09:52 -07001634 DRM_DEBUG_KMS("Wait for panel power off time\n");
Daniel Vetter4be73782014-01-17 14:39:48 +01001635 wait_panel_status(intel_dp, IDLE_OFF_MASK, IDLE_OFF_VALUE);
Keith Packardbd943152011-09-18 23:09:52 -07001636}
Keith Packardbd943152011-09-18 23:09:52 -07001637
Daniel Vetter4be73782014-01-17 14:39:48 +01001638static void wait_panel_power_cycle(struct intel_dp *intel_dp)
Keith Packard99ea7122011-11-01 19:57:50 -07001639{
1640 DRM_DEBUG_KMS("Wait for panel power cycle\n");
Paulo Zanonidce56b32013-12-19 14:29:40 -02001641
1642 /* When we disable the VDD override bit last we have to do the manual
1643 * wait. */
1644 wait_remaining_ms_from_jiffies(intel_dp->last_power_cycle,
1645 intel_dp->panel_power_cycle_delay);
1646
Daniel Vetter4be73782014-01-17 14:39:48 +01001647 wait_panel_status(intel_dp, IDLE_CYCLE_MASK, IDLE_CYCLE_VALUE);
Keith Packard99ea7122011-11-01 19:57:50 -07001648}
Keith Packardbd943152011-09-18 23:09:52 -07001649
Daniel Vetter4be73782014-01-17 14:39:48 +01001650static void wait_backlight_on(struct intel_dp *intel_dp)
Paulo Zanonidce56b32013-12-19 14:29:40 -02001651{
1652 wait_remaining_ms_from_jiffies(intel_dp->last_power_on,
1653 intel_dp->backlight_on_delay);
1654}
1655
Daniel Vetter4be73782014-01-17 14:39:48 +01001656static void edp_wait_backlight_off(struct intel_dp *intel_dp)
Paulo Zanonidce56b32013-12-19 14:29:40 -02001657{
1658 wait_remaining_ms_from_jiffies(intel_dp->last_backlight_off,
1659 intel_dp->backlight_off_delay);
1660}
Keith Packard99ea7122011-11-01 19:57:50 -07001661
Keith Packard832dd3c2011-11-01 19:34:06 -07001662/* Read the current pp_control value, unlocking the register if it
1663 * is locked
1664 */
1665
Jesse Barnes453c5422013-03-28 09:55:41 -07001666static u32 ironlake_get_pp_control(struct intel_dp *intel_dp)
Keith Packard832dd3c2011-11-01 19:34:06 -07001667{
Jesse Barnes453c5422013-03-28 09:55:41 -07001668 struct drm_device *dev = intel_dp_to_dev(intel_dp);
1669 struct drm_i915_private *dev_priv = dev->dev_private;
1670 u32 control;
Jesse Barnes453c5422013-03-28 09:55:41 -07001671
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001672 lockdep_assert_held(&dev_priv->pps_mutex);
1673
Jani Nikulabf13e812013-09-06 07:40:05 +03001674 control = I915_READ(_pp_ctrl_reg(intel_dp));
Keith Packard832dd3c2011-11-01 19:34:06 -07001675 control &= ~PANEL_UNLOCK_MASK;
1676 control |= PANEL_UNLOCK_REGS;
1677 return control;
Keith Packardbd943152011-09-18 23:09:52 -07001678}
1679
Ville Syrjälä951468f2014-09-04 14:55:31 +03001680/*
1681 * Must be paired with edp_panel_vdd_off().
1682 * Must hold pps_mutex around the whole on/off sequence.
1683 * Can be nested with intel_edp_panel_vdd_{on,off}() calls.
1684 */
Ville Syrjälä1e0560e2014-08-19 13:24:25 +03001685static bool edp_panel_vdd_on(struct intel_dp *intel_dp)
Jesse Barnes5d613502011-01-24 17:10:54 -08001686{
Paulo Zanoni30add222012-10-26 19:05:45 -02001687 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Imre Deak4e6e1a52014-03-27 17:45:11 +02001688 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
1689 struct intel_encoder *intel_encoder = &intel_dig_port->base;
Jesse Barnes5d613502011-01-24 17:10:54 -08001690 struct drm_i915_private *dev_priv = dev->dev_private;
Imre Deak4e6e1a52014-03-27 17:45:11 +02001691 enum intel_display_power_domain power_domain;
Jesse Barnes5d613502011-01-24 17:10:54 -08001692 u32 pp;
Jesse Barnes453c5422013-03-28 09:55:41 -07001693 u32 pp_stat_reg, pp_ctrl_reg;
Jani Nikulaadddaaf2014-03-14 16:51:13 +02001694 bool need_to_disable = !intel_dp->want_panel_vdd;
Jesse Barnes5d613502011-01-24 17:10:54 -08001695
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001696 lockdep_assert_held(&dev_priv->pps_mutex);
1697
Keith Packard97af61f572011-09-28 16:23:51 -07001698 if (!is_edp(intel_dp))
Jani Nikulaadddaaf2014-03-14 16:51:13 +02001699 return false;
Keith Packardbd943152011-09-18 23:09:52 -07001700
Egbert Eich2c623c12014-11-25 12:54:57 +01001701 cancel_delayed_work(&intel_dp->panel_vdd_work);
Keith Packardbd943152011-09-18 23:09:52 -07001702 intel_dp->want_panel_vdd = true;
Keith Packard99ea7122011-11-01 19:57:50 -07001703
Daniel Vetter4be73782014-01-17 14:39:48 +01001704 if (edp_have_panel_vdd(intel_dp))
Jani Nikulaadddaaf2014-03-14 16:51:13 +02001705 return need_to_disable;
Paulo Zanonib0665d52013-10-30 19:50:27 -02001706
Imre Deak4e6e1a52014-03-27 17:45:11 +02001707 power_domain = intel_display_port_power_domain(intel_encoder);
1708 intel_display_power_get(dev_priv, power_domain);
Paulo Zanonie9cb81a2013-11-21 13:47:23 -02001709
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03001710 DRM_DEBUG_KMS("Turning eDP port %c VDD on\n",
1711 port_name(intel_dig_port->port));
Keith Packardbd943152011-09-18 23:09:52 -07001712
Daniel Vetter4be73782014-01-17 14:39:48 +01001713 if (!edp_have_panel_power(intel_dp))
1714 wait_panel_power_cycle(intel_dp);
Keith Packard99ea7122011-11-01 19:57:50 -07001715
Jesse Barnes453c5422013-03-28 09:55:41 -07001716 pp = ironlake_get_pp_control(intel_dp);
Jesse Barnes5d613502011-01-24 17:10:54 -08001717 pp |= EDP_FORCE_VDD;
Keith Packardebf33b12011-09-29 15:53:27 -07001718
Jani Nikulabf13e812013-09-06 07:40:05 +03001719 pp_stat_reg = _pp_stat_reg(intel_dp);
1720 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
Jesse Barnes453c5422013-03-28 09:55:41 -07001721
1722 I915_WRITE(pp_ctrl_reg, pp);
1723 POSTING_READ(pp_ctrl_reg);
1724 DRM_DEBUG_KMS("PP_STATUS: 0x%08x PP_CONTROL: 0x%08x\n",
1725 I915_READ(pp_stat_reg), I915_READ(pp_ctrl_reg));
Keith Packardebf33b12011-09-29 15:53:27 -07001726 /*
1727 * If the panel wasn't on, delay before accessing aux channel
1728 */
Daniel Vetter4be73782014-01-17 14:39:48 +01001729 if (!edp_have_panel_power(intel_dp)) {
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03001730 DRM_DEBUG_KMS("eDP port %c panel power wasn't enabled\n",
1731 port_name(intel_dig_port->port));
Keith Packardf01eca22011-09-28 16:48:10 -07001732 msleep(intel_dp->panel_power_up_delay);
Keith Packardf01eca22011-09-28 16:48:10 -07001733 }
Jani Nikulaadddaaf2014-03-14 16:51:13 +02001734
1735 return need_to_disable;
1736}
1737
Ville Syrjälä951468f2014-09-04 14:55:31 +03001738/*
1739 * Must be paired with intel_edp_panel_vdd_off() or
1740 * intel_edp_panel_off().
1741 * Nested calls to these functions are not allowed since
1742 * we drop the lock. Caller must use some higher level
1743 * locking to prevent nested calls from other threads.
1744 */
Daniel Vetterb80d6c72014-03-19 15:54:37 +01001745void intel_edp_panel_vdd_on(struct intel_dp *intel_dp)
Jani Nikulaadddaaf2014-03-14 16:51:13 +02001746{
Ville Syrjäläc695b6b2014-08-18 22:16:03 +03001747 bool vdd;
Jani Nikulaadddaaf2014-03-14 16:51:13 +02001748
Ville Syrjäläc695b6b2014-08-18 22:16:03 +03001749 if (!is_edp(intel_dp))
1750 return;
1751
Ville Syrjälä773538e82014-09-04 14:54:56 +03001752 pps_lock(intel_dp);
Ville Syrjäläc695b6b2014-08-18 22:16:03 +03001753 vdd = edp_panel_vdd_on(intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03001754 pps_unlock(intel_dp);
Ville Syrjäläc695b6b2014-08-18 22:16:03 +03001755
Rob Clarke2c719b2014-12-15 13:56:32 -05001756 I915_STATE_WARN(!vdd, "eDP port %c VDD already requested on\n",
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03001757 port_name(dp_to_dig_port(intel_dp)->port));
Jesse Barnes5d613502011-01-24 17:10:54 -08001758}
1759
Daniel Vetter4be73782014-01-17 14:39:48 +01001760static void edp_panel_vdd_off_sync(struct intel_dp *intel_dp)
Jesse Barnes5d613502011-01-24 17:10:54 -08001761{
Paulo Zanoni30add222012-10-26 19:05:45 -02001762 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Jesse Barnes5d613502011-01-24 17:10:54 -08001763 struct drm_i915_private *dev_priv = dev->dev_private;
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03001764 struct intel_digital_port *intel_dig_port =
1765 dp_to_dig_port(intel_dp);
1766 struct intel_encoder *intel_encoder = &intel_dig_port->base;
1767 enum intel_display_power_domain power_domain;
Jesse Barnes5d613502011-01-24 17:10:54 -08001768 u32 pp;
Jesse Barnes453c5422013-03-28 09:55:41 -07001769 u32 pp_stat_reg, pp_ctrl_reg;
Jesse Barnes5d613502011-01-24 17:10:54 -08001770
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001771 lockdep_assert_held(&dev_priv->pps_mutex);
Daniel Vettera0e99e62012-12-02 01:05:46 +01001772
Ville Syrjälä15e899a2014-08-18 22:16:02 +03001773 WARN_ON(intel_dp->want_panel_vdd);
Imre Deak4e6e1a52014-03-27 17:45:11 +02001774
Ville Syrjälä15e899a2014-08-18 22:16:02 +03001775 if (!edp_have_panel_vdd(intel_dp))
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03001776 return;
Paulo Zanonib0665d52013-10-30 19:50:27 -02001777
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03001778 DRM_DEBUG_KMS("Turning eDP port %c VDD off\n",
1779 port_name(intel_dig_port->port));
Jesse Barnes453c5422013-03-28 09:55:41 -07001780
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03001781 pp = ironlake_get_pp_control(intel_dp);
1782 pp &= ~EDP_FORCE_VDD;
Jesse Barnes453c5422013-03-28 09:55:41 -07001783
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03001784 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
1785 pp_stat_reg = _pp_stat_reg(intel_dp);
Jesse Barnes5d613502011-01-24 17:10:54 -08001786
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03001787 I915_WRITE(pp_ctrl_reg, pp);
1788 POSTING_READ(pp_ctrl_reg);
Paulo Zanoni90791a52013-12-06 17:32:42 -02001789
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03001790 /* Make sure sequencer is idle before allowing subsequent activity */
1791 DRM_DEBUG_KMS("PP_STATUS: 0x%08x PP_CONTROL: 0x%08x\n",
1792 I915_READ(pp_stat_reg), I915_READ(pp_ctrl_reg));
Paulo Zanonie9cb81a2013-11-21 13:47:23 -02001793
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03001794 if ((pp & POWER_TARGET_ON) == 0)
1795 intel_dp->last_power_cycle = jiffies;
Paulo Zanonie9cb81a2013-11-21 13:47:23 -02001796
Ville Syrjäläbe2c9192014-08-18 22:16:01 +03001797 power_domain = intel_display_port_power_domain(intel_encoder);
1798 intel_display_power_put(dev_priv, power_domain);
Keith Packardbd943152011-09-18 23:09:52 -07001799}
1800
Daniel Vetter4be73782014-01-17 14:39:48 +01001801static void edp_panel_vdd_work(struct work_struct *__work)
Keith Packardbd943152011-09-18 23:09:52 -07001802{
1803 struct intel_dp *intel_dp = container_of(to_delayed_work(__work),
1804 struct intel_dp, panel_vdd_work);
Keith Packardbd943152011-09-18 23:09:52 -07001805
Ville Syrjälä773538e82014-09-04 14:54:56 +03001806 pps_lock(intel_dp);
Ville Syrjälä15e899a2014-08-18 22:16:02 +03001807 if (!intel_dp->want_panel_vdd)
1808 edp_panel_vdd_off_sync(intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03001809 pps_unlock(intel_dp);
Keith Packardbd943152011-09-18 23:09:52 -07001810}
1811
Imre Deakaba86892014-07-30 15:57:31 +03001812static void edp_panel_vdd_schedule_off(struct intel_dp *intel_dp)
1813{
1814 unsigned long delay;
1815
1816 /*
1817 * Queue the timer to fire a long time from now (relative to the power
1818 * down delay) to keep the panel power up across a sequence of
1819 * operations.
1820 */
1821 delay = msecs_to_jiffies(intel_dp->panel_power_cycle_delay * 5);
1822 schedule_delayed_work(&intel_dp->panel_vdd_work, delay);
1823}
1824
Ville Syrjälä951468f2014-09-04 14:55:31 +03001825/*
1826 * Must be paired with edp_panel_vdd_on().
1827 * Must hold pps_mutex around the whole on/off sequence.
1828 * Can be nested with intel_edp_panel_vdd_{on,off}() calls.
1829 */
Daniel Vetter4be73782014-01-17 14:39:48 +01001830static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync)
Keith Packardbd943152011-09-18 23:09:52 -07001831{
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001832 struct drm_i915_private *dev_priv =
1833 intel_dp_to_dev(intel_dp)->dev_private;
1834
1835 lockdep_assert_held(&dev_priv->pps_mutex);
1836
Keith Packard97af61f572011-09-28 16:23:51 -07001837 if (!is_edp(intel_dp))
1838 return;
Jesse Barnes5d613502011-01-24 17:10:54 -08001839
Rob Clarke2c719b2014-12-15 13:56:32 -05001840 I915_STATE_WARN(!intel_dp->want_panel_vdd, "eDP port %c VDD not forced on",
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03001841 port_name(dp_to_dig_port(intel_dp)->port));
Keith Packardf2e8b182011-11-01 20:01:35 -07001842
Keith Packardbd943152011-09-18 23:09:52 -07001843 intel_dp->want_panel_vdd = false;
1844
Imre Deakaba86892014-07-30 15:57:31 +03001845 if (sync)
Daniel Vetter4be73782014-01-17 14:39:48 +01001846 edp_panel_vdd_off_sync(intel_dp);
Imre Deakaba86892014-07-30 15:57:31 +03001847 else
1848 edp_panel_vdd_schedule_off(intel_dp);
Jesse Barnes5d613502011-01-24 17:10:54 -08001849}
1850
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03001851static void edp_panel_on(struct intel_dp *intel_dp)
Jesse Barnes9934c132010-07-22 13:18:19 -07001852{
Paulo Zanoni30add222012-10-26 19:05:45 -02001853 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Jesse Barnes9934c132010-07-22 13:18:19 -07001854 struct drm_i915_private *dev_priv = dev->dev_private;
Keith Packard99ea7122011-11-01 19:57:50 -07001855 u32 pp;
Jesse Barnes453c5422013-03-28 09:55:41 -07001856 u32 pp_ctrl_reg;
Jesse Barnes9934c132010-07-22 13:18:19 -07001857
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03001858 lockdep_assert_held(&dev_priv->pps_mutex);
1859
Keith Packard97af61f572011-09-28 16:23:51 -07001860 if (!is_edp(intel_dp))
Keith Packardbd943152011-09-18 23:09:52 -07001861 return;
Keith Packard99ea7122011-11-01 19:57:50 -07001862
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03001863 DRM_DEBUG_KMS("Turn eDP port %c panel power on\n",
1864 port_name(dp_to_dig_port(intel_dp)->port));
Keith Packard99ea7122011-11-01 19:57:50 -07001865
Ville Syrjäläe7a89ac2014-10-16 21:30:07 +03001866 if (WARN(edp_have_panel_power(intel_dp),
1867 "eDP port %c panel power already on\n",
1868 port_name(dp_to_dig_port(intel_dp)->port)))
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03001869 return;
Jesse Barnes9934c132010-07-22 13:18:19 -07001870
Daniel Vetter4be73782014-01-17 14:39:48 +01001871 wait_panel_power_cycle(intel_dp);
Jesse Barnes37c6c9b2010-08-11 10:04:43 -07001872
Jani Nikulabf13e812013-09-06 07:40:05 +03001873 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
Jesse Barnes453c5422013-03-28 09:55:41 -07001874 pp = ironlake_get_pp_control(intel_dp);
Keith Packard05ce1a42011-09-29 16:33:01 -07001875 if (IS_GEN5(dev)) {
1876 /* ILK workaround: disable reset around power sequence */
1877 pp &= ~PANEL_POWER_RESET;
Jani Nikulabf13e812013-09-06 07:40:05 +03001878 I915_WRITE(pp_ctrl_reg, pp);
1879 POSTING_READ(pp_ctrl_reg);
Keith Packard05ce1a42011-09-29 16:33:01 -07001880 }
Jesse Barnes37c6c9b2010-08-11 10:04:43 -07001881
Keith Packard1c0ae802011-09-19 13:59:29 -07001882 pp |= POWER_TARGET_ON;
Keith Packard99ea7122011-11-01 19:57:50 -07001883 if (!IS_GEN5(dev))
1884 pp |= PANEL_POWER_RESET;
1885
Jesse Barnes453c5422013-03-28 09:55:41 -07001886 I915_WRITE(pp_ctrl_reg, pp);
1887 POSTING_READ(pp_ctrl_reg);
Jesse Barnes9934c132010-07-22 13:18:19 -07001888
Daniel Vetter4be73782014-01-17 14:39:48 +01001889 wait_panel_on(intel_dp);
Paulo Zanonidce56b32013-12-19 14:29:40 -02001890 intel_dp->last_power_on = jiffies;
Jesse Barnes9934c132010-07-22 13:18:19 -07001891
Keith Packard05ce1a42011-09-29 16:33:01 -07001892 if (IS_GEN5(dev)) {
1893 pp |= PANEL_POWER_RESET; /* restore panel reset bit */
Jani Nikulabf13e812013-09-06 07:40:05 +03001894 I915_WRITE(pp_ctrl_reg, pp);
1895 POSTING_READ(pp_ctrl_reg);
Keith Packard05ce1a42011-09-29 16:33:01 -07001896 }
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03001897}
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001898
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03001899void intel_edp_panel_on(struct intel_dp *intel_dp)
1900{
1901 if (!is_edp(intel_dp))
1902 return;
1903
1904 pps_lock(intel_dp);
1905 edp_panel_on(intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03001906 pps_unlock(intel_dp);
Jesse Barnes9934c132010-07-22 13:18:19 -07001907}
1908
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03001909
1910static void edp_panel_off(struct intel_dp *intel_dp)
Jesse Barnes9934c132010-07-22 13:18:19 -07001911{
Imre Deak4e6e1a52014-03-27 17:45:11 +02001912 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
1913 struct intel_encoder *intel_encoder = &intel_dig_port->base;
Paulo Zanoni30add222012-10-26 19:05:45 -02001914 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Jesse Barnes9934c132010-07-22 13:18:19 -07001915 struct drm_i915_private *dev_priv = dev->dev_private;
Imre Deak4e6e1a52014-03-27 17:45:11 +02001916 enum intel_display_power_domain power_domain;
Keith Packard99ea7122011-11-01 19:57:50 -07001917 u32 pp;
Jesse Barnes453c5422013-03-28 09:55:41 -07001918 u32 pp_ctrl_reg;
Jesse Barnes9934c132010-07-22 13:18:19 -07001919
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03001920 lockdep_assert_held(&dev_priv->pps_mutex);
1921
Keith Packard97af61f572011-09-28 16:23:51 -07001922 if (!is_edp(intel_dp))
1923 return;
Jesse Barnes37c6c9b2010-08-11 10:04:43 -07001924
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03001925 DRM_DEBUG_KMS("Turn eDP port %c panel power off\n",
1926 port_name(dp_to_dig_port(intel_dp)->port));
Jesse Barnes37c6c9b2010-08-11 10:04:43 -07001927
Ville Syrjälä3936fcf2014-10-16 21:30:02 +03001928 WARN(!intel_dp->want_panel_vdd, "Need eDP port %c VDD to turn off panel\n",
1929 port_name(dp_to_dig_port(intel_dp)->port));
Jani Nikula24f3e092014-03-17 16:43:36 +02001930
Jesse Barnes453c5422013-03-28 09:55:41 -07001931 pp = ironlake_get_pp_control(intel_dp);
Daniel Vetter35a38552012-08-12 22:17:14 +02001932 /* We need to switch off panel power _and_ force vdd, for otherwise some
1933 * panels get very unhappy and cease to work. */
Patrik Jakobssonb3064152014-03-04 00:42:44 +01001934 pp &= ~(POWER_TARGET_ON | PANEL_POWER_RESET | EDP_FORCE_VDD |
1935 EDP_BLC_ENABLE);
Jesse Barnes453c5422013-03-28 09:55:41 -07001936
Jani Nikulabf13e812013-09-06 07:40:05 +03001937 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
Jesse Barnes453c5422013-03-28 09:55:41 -07001938
Paulo Zanoni849e39f2014-03-07 20:05:20 -03001939 intel_dp->want_panel_vdd = false;
1940
Jesse Barnes453c5422013-03-28 09:55:41 -07001941 I915_WRITE(pp_ctrl_reg, pp);
1942 POSTING_READ(pp_ctrl_reg);
Jesse Barnes9934c132010-07-22 13:18:19 -07001943
Paulo Zanonidce56b32013-12-19 14:29:40 -02001944 intel_dp->last_power_cycle = jiffies;
Daniel Vetter4be73782014-01-17 14:39:48 +01001945 wait_panel_off(intel_dp);
Paulo Zanoni849e39f2014-03-07 20:05:20 -03001946
1947 /* We got a reference when we enabled the VDD. */
Imre Deak4e6e1a52014-03-27 17:45:11 +02001948 power_domain = intel_display_port_power_domain(intel_encoder);
1949 intel_display_power_put(dev_priv, power_domain);
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03001950}
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001951
Ville Syrjälä9f0fb5b2014-10-16 21:27:32 +03001952void intel_edp_panel_off(struct intel_dp *intel_dp)
1953{
1954 if (!is_edp(intel_dp))
1955 return;
1956
1957 pps_lock(intel_dp);
1958 edp_panel_off(intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03001959 pps_unlock(intel_dp);
Jesse Barnes9934c132010-07-22 13:18:19 -07001960}
1961
Jani Nikula1250d102014-08-12 17:11:39 +03001962/* Enable backlight in the panel power control. */
1963static void _intel_edp_backlight_on(struct intel_dp *intel_dp)
Zhenyu Wang32f9d652009-07-24 01:00:32 +08001964{
Paulo Zanonida63a9f2012-10-26 19:05:46 -02001965 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
1966 struct drm_device *dev = intel_dig_port->base.base.dev;
Zhenyu Wang32f9d652009-07-24 01:00:32 +08001967 struct drm_i915_private *dev_priv = dev->dev_private;
1968 u32 pp;
Jesse Barnes453c5422013-03-28 09:55:41 -07001969 u32 pp_ctrl_reg;
Zhenyu Wang32f9d652009-07-24 01:00:32 +08001970
Jesse Barnes01cb9ea2010-10-07 16:01:12 -07001971 /*
1972 * If we enable the backlight right away following a panel power
1973 * on, we may see slight flicker as the panel syncs with the eDP
1974 * link. So delay a bit to make sure the image is solid before
1975 * allowing it to appear.
1976 */
Daniel Vetter4be73782014-01-17 14:39:48 +01001977 wait_backlight_on(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001978
Ville Syrjälä773538e82014-09-04 14:54:56 +03001979 pps_lock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001980
Jesse Barnes453c5422013-03-28 09:55:41 -07001981 pp = ironlake_get_pp_control(intel_dp);
Zhenyu Wang32f9d652009-07-24 01:00:32 +08001982 pp |= EDP_BLC_ENABLE;
Jesse Barnes453c5422013-03-28 09:55:41 -07001983
Jani Nikulabf13e812013-09-06 07:40:05 +03001984 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
Jesse Barnes453c5422013-03-28 09:55:41 -07001985
1986 I915_WRITE(pp_ctrl_reg, pp);
1987 POSTING_READ(pp_ctrl_reg);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03001988
Ville Syrjälä773538e82014-09-04 14:54:56 +03001989 pps_unlock(intel_dp);
Zhenyu Wang32f9d652009-07-24 01:00:32 +08001990}
1991
Jani Nikula1250d102014-08-12 17:11:39 +03001992/* Enable backlight PWM and backlight PP control. */
1993void intel_edp_backlight_on(struct intel_dp *intel_dp)
1994{
1995 if (!is_edp(intel_dp))
1996 return;
1997
1998 DRM_DEBUG_KMS("\n");
1999
2000 intel_panel_enable_backlight(intel_dp->attached_connector);
2001 _intel_edp_backlight_on(intel_dp);
2002}
2003
2004/* Disable backlight in the panel power control. */
2005static void _intel_edp_backlight_off(struct intel_dp *intel_dp)
Zhenyu Wang32f9d652009-07-24 01:00:32 +08002006{
Paulo Zanoni30add222012-10-26 19:05:45 -02002007 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Zhenyu Wang32f9d652009-07-24 01:00:32 +08002008 struct drm_i915_private *dev_priv = dev->dev_private;
2009 u32 pp;
Jesse Barnes453c5422013-03-28 09:55:41 -07002010 u32 pp_ctrl_reg;
Zhenyu Wang32f9d652009-07-24 01:00:32 +08002011
Keith Packardf01eca22011-09-28 16:48:10 -07002012 if (!is_edp(intel_dp))
2013 return;
2014
Ville Syrjälä773538e82014-09-04 14:54:56 +03002015 pps_lock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03002016
Jesse Barnes453c5422013-03-28 09:55:41 -07002017 pp = ironlake_get_pp_control(intel_dp);
Zhenyu Wang32f9d652009-07-24 01:00:32 +08002018 pp &= ~EDP_BLC_ENABLE;
Jesse Barnes453c5422013-03-28 09:55:41 -07002019
Jani Nikulabf13e812013-09-06 07:40:05 +03002020 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
Jesse Barnes453c5422013-03-28 09:55:41 -07002021
2022 I915_WRITE(pp_ctrl_reg, pp);
2023 POSTING_READ(pp_ctrl_reg);
Jesse Barnesf7d23232014-03-31 11:13:56 -07002024
Ville Syrjälä773538e82014-09-04 14:54:56 +03002025 pps_unlock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03002026
Paulo Zanonidce56b32013-12-19 14:29:40 -02002027 intel_dp->last_backlight_off = jiffies;
Jesse Barnesf7d23232014-03-31 11:13:56 -07002028 edp_wait_backlight_off(intel_dp);
Jani Nikula1250d102014-08-12 17:11:39 +03002029}
Jesse Barnesf7d23232014-03-31 11:13:56 -07002030
Jani Nikula1250d102014-08-12 17:11:39 +03002031/* Disable backlight PP control and backlight PWM. */
2032void intel_edp_backlight_off(struct intel_dp *intel_dp)
2033{
2034 if (!is_edp(intel_dp))
2035 return;
2036
2037 DRM_DEBUG_KMS("\n");
2038
2039 _intel_edp_backlight_off(intel_dp);
Jesse Barnesf7d23232014-03-31 11:13:56 -07002040 intel_panel_disable_backlight(intel_dp->attached_connector);
Zhenyu Wang32f9d652009-07-24 01:00:32 +08002041}
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002042
Jani Nikula73580fb72014-08-12 17:11:41 +03002043/*
2044 * Hook for controlling the panel power control backlight through the bl_power
2045 * sysfs attribute. Take care to handle multiple calls.
2046 */
2047static void intel_edp_backlight_power(struct intel_connector *connector,
2048 bool enable)
2049{
2050 struct intel_dp *intel_dp = intel_attached_dp(&connector->base);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03002051 bool is_enabled;
2052
Ville Syrjälä773538e82014-09-04 14:54:56 +03002053 pps_lock(intel_dp);
Ville Syrjäläe39b9992014-09-04 14:53:14 +03002054 is_enabled = ironlake_get_pp_control(intel_dp) & EDP_BLC_ENABLE;
Ville Syrjälä773538e82014-09-04 14:54:56 +03002055 pps_unlock(intel_dp);
Jani Nikula73580fb72014-08-12 17:11:41 +03002056
2057 if (is_enabled == enable)
2058 return;
2059
Jani Nikula23ba9372014-08-27 14:08:43 +03002060 DRM_DEBUG_KMS("panel power control backlight %s\n",
2061 enable ? "enable" : "disable");
Jani Nikula73580fb72014-08-12 17:11:41 +03002062
2063 if (enable)
2064 _intel_edp_backlight_on(intel_dp);
2065 else
2066 _intel_edp_backlight_off(intel_dp);
2067}
2068
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02002069static void ironlake_edp_pll_on(struct intel_dp *intel_dp)
Jesse Barnesd240f202010-08-13 15:43:26 -07002070{
Paulo Zanonida63a9f2012-10-26 19:05:46 -02002071 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2072 struct drm_crtc *crtc = intel_dig_port->base.base.crtc;
2073 struct drm_device *dev = crtc->dev;
Jesse Barnesd240f202010-08-13 15:43:26 -07002074 struct drm_i915_private *dev_priv = dev->dev_private;
2075 u32 dpa_ctl;
2076
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02002077 assert_pipe_disabled(dev_priv,
2078 to_intel_crtc(crtc)->pipe);
2079
Jesse Barnesd240f202010-08-13 15:43:26 -07002080 DRM_DEBUG_KMS("\n");
2081 dpa_ctl = I915_READ(DP_A);
Daniel Vetter07679352012-09-06 22:15:42 +02002082 WARN(dpa_ctl & DP_PLL_ENABLE, "dp pll on, should be off\n");
2083 WARN(dpa_ctl & DP_PORT_EN, "dp port still on, should be off\n");
2084
2085 /* We don't adjust intel_dp->DP while tearing down the link, to
2086 * facilitate link retraining (e.g. after hotplug). Hence clear all
2087 * enable bits here to ensure that we don't enable too much. */
2088 intel_dp->DP &= ~(DP_PORT_EN | DP_AUDIO_OUTPUT_ENABLE);
2089 intel_dp->DP |= DP_PLL_ENABLE;
2090 I915_WRITE(DP_A, intel_dp->DP);
Jesse Barnes298b0b32010-10-07 16:01:24 -07002091 POSTING_READ(DP_A);
2092 udelay(200);
Jesse Barnesd240f202010-08-13 15:43:26 -07002093}
2094
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02002095static void ironlake_edp_pll_off(struct intel_dp *intel_dp)
Jesse Barnesd240f202010-08-13 15:43:26 -07002096{
Paulo Zanonida63a9f2012-10-26 19:05:46 -02002097 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2098 struct drm_crtc *crtc = intel_dig_port->base.base.crtc;
2099 struct drm_device *dev = crtc->dev;
Jesse Barnesd240f202010-08-13 15:43:26 -07002100 struct drm_i915_private *dev_priv = dev->dev_private;
2101 u32 dpa_ctl;
2102
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02002103 assert_pipe_disabled(dev_priv,
2104 to_intel_crtc(crtc)->pipe);
2105
Jesse Barnesd240f202010-08-13 15:43:26 -07002106 dpa_ctl = I915_READ(DP_A);
Daniel Vetter07679352012-09-06 22:15:42 +02002107 WARN((dpa_ctl & DP_PLL_ENABLE) == 0,
2108 "dp pll off, should be on\n");
2109 WARN(dpa_ctl & DP_PORT_EN, "dp port still on, should be off\n");
2110
2111 /* We can't rely on the value tracked for the DP register in
2112 * intel_dp->DP because link_down must not change that (otherwise link
2113 * re-training will fail. */
Jesse Barnes298b0b32010-10-07 16:01:24 -07002114 dpa_ctl &= ~DP_PLL_ENABLE;
Jesse Barnesd240f202010-08-13 15:43:26 -07002115 I915_WRITE(DP_A, dpa_ctl);
Chris Wilson1af5fa12010-09-08 21:07:28 +01002116 POSTING_READ(DP_A);
Jesse Barnesd240f202010-08-13 15:43:26 -07002117 udelay(200);
2118}
2119
Jesse Barnesc7ad3812011-07-07 11:11:03 -07002120/* If the sink supports it, try to set the power state appropriately */
Paulo Zanonic19b0662012-10-15 15:51:41 -03002121void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode)
Jesse Barnesc7ad3812011-07-07 11:11:03 -07002122{
2123 int ret, i;
2124
2125 /* Should have a valid DPCD by this point */
2126 if (intel_dp->dpcd[DP_DPCD_REV] < 0x11)
2127 return;
2128
2129 if (mode != DRM_MODE_DPMS_ON) {
Jani Nikula9d1a1032014-03-14 16:51:15 +02002130 ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_SET_POWER,
2131 DP_SET_POWER_D3);
Jesse Barnesc7ad3812011-07-07 11:11:03 -07002132 } else {
2133 /*
2134 * When turning on, we need to retry for 1ms to give the sink
2135 * time to wake up.
2136 */
2137 for (i = 0; i < 3; i++) {
Jani Nikula9d1a1032014-03-14 16:51:15 +02002138 ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_SET_POWER,
2139 DP_SET_POWER_D0);
Jesse Barnesc7ad3812011-07-07 11:11:03 -07002140 if (ret == 1)
2141 break;
2142 msleep(1);
2143 }
2144 }
Jani Nikulaf9cac722014-09-02 16:33:52 +03002145
2146 if (ret != 1)
2147 DRM_DEBUG_KMS("failed to %s sink power state\n",
2148 mode == DRM_MODE_DPMS_ON ? "enable" : "disable");
Jesse Barnesc7ad3812011-07-07 11:11:03 -07002149}
2150
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002151static bool intel_dp_get_hw_state(struct intel_encoder *encoder,
2152 enum pipe *pipe)
Jesse Barnesd240f202010-08-13 15:43:26 -07002153{
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002154 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Imre Deakbc7d38a2013-05-16 14:40:36 +03002155 enum port port = dp_to_dig_port(intel_dp)->port;
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002156 struct drm_device *dev = encoder->base.dev;
2157 struct drm_i915_private *dev_priv = dev->dev_private;
Imre Deak6d129be2014-03-05 16:20:54 +02002158 enum intel_display_power_domain power_domain;
2159 u32 tmp;
2160
2161 power_domain = intel_display_port_power_domain(encoder);
Daniel Vetterf458ebb2014-09-30 10:56:39 +02002162 if (!intel_display_power_is_enabled(dev_priv, power_domain))
Imre Deak6d129be2014-03-05 16:20:54 +02002163 return false;
2164
2165 tmp = I915_READ(intel_dp->output_reg);
Jesse Barnesd240f202010-08-13 15:43:26 -07002166
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002167 if (!(tmp & DP_PORT_EN))
2168 return false;
2169
Imre Deakbc7d38a2013-05-16 14:40:36 +03002170 if (port == PORT_A && IS_GEN7(dev) && !IS_VALLEYVIEW(dev)) {
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002171 *pipe = PORT_TO_PIPE_CPT(tmp);
Ville Syrjälä71485e02014-04-09 13:28:55 +03002172 } else if (IS_CHERRYVIEW(dev)) {
2173 *pipe = DP_PORT_TO_PIPE_CHV(tmp);
Imre Deakbc7d38a2013-05-16 14:40:36 +03002174 } else if (!HAS_PCH_CPT(dev) || port == PORT_A) {
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002175 *pipe = PORT_TO_PIPE(tmp);
2176 } else {
2177 u32 trans_sel;
2178 u32 trans_dp;
2179 int i;
2180
2181 switch (intel_dp->output_reg) {
2182 case PCH_DP_B:
2183 trans_sel = TRANS_DP_PORT_SEL_B;
2184 break;
2185 case PCH_DP_C:
2186 trans_sel = TRANS_DP_PORT_SEL_C;
2187 break;
2188 case PCH_DP_D:
2189 trans_sel = TRANS_DP_PORT_SEL_D;
2190 break;
2191 default:
2192 return true;
2193 }
2194
Damien Lespiau055e3932014-08-18 13:49:10 +01002195 for_each_pipe(dev_priv, i) {
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002196 trans_dp = I915_READ(TRANS_DP_CTL(i));
2197 if ((trans_dp & TRANS_DP_PORT_SEL_MASK) == trans_sel) {
2198 *pipe = i;
2199 return true;
2200 }
2201 }
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002202
Daniel Vetter4a0833e2012-10-26 10:58:11 +02002203 DRM_DEBUG_KMS("No pipe for dp port 0x%x found\n",
2204 intel_dp->output_reg);
2205 }
Daniel Vetter19d8fe12012-07-02 13:26:27 +02002206
2207 return true;
2208}
2209
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002210static void intel_dp_get_config(struct intel_encoder *encoder,
Ander Conselvan de Oliveira5cec2582015-01-15 14:55:21 +02002211 struct intel_crtc_state *pipe_config)
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002212{
2213 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002214 u32 tmp, flags = 0;
Xiong Zhang63000ef2013-06-28 12:59:06 +08002215 struct drm_device *dev = encoder->base.dev;
2216 struct drm_i915_private *dev_priv = dev->dev_private;
2217 enum port port = dp_to_dig_port(intel_dp)->port;
2218 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
Ville Syrjälä18442d02013-09-13 16:00:08 +03002219 int dotclock;
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002220
Daniel Vetter9ed109a2014-04-24 23:54:52 +02002221 tmp = I915_READ(intel_dp->output_reg);
2222 if (tmp & DP_AUDIO_OUTPUT_ENABLE)
2223 pipe_config->has_audio = true;
2224
Xiong Zhang63000ef2013-06-28 12:59:06 +08002225 if ((port == PORT_A) || !HAS_PCH_CPT(dev)) {
Xiong Zhang63000ef2013-06-28 12:59:06 +08002226 if (tmp & DP_SYNC_HS_HIGH)
2227 flags |= DRM_MODE_FLAG_PHSYNC;
2228 else
2229 flags |= DRM_MODE_FLAG_NHSYNC;
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002230
Xiong Zhang63000ef2013-06-28 12:59:06 +08002231 if (tmp & DP_SYNC_VS_HIGH)
2232 flags |= DRM_MODE_FLAG_PVSYNC;
2233 else
2234 flags |= DRM_MODE_FLAG_NVSYNC;
2235 } else {
2236 tmp = I915_READ(TRANS_DP_CTL(crtc->pipe));
2237 if (tmp & TRANS_DP_HSYNC_ACTIVE_HIGH)
2238 flags |= DRM_MODE_FLAG_PHSYNC;
2239 else
2240 flags |= DRM_MODE_FLAG_NHSYNC;
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002241
Xiong Zhang63000ef2013-06-28 12:59:06 +08002242 if (tmp & TRANS_DP_VSYNC_ACTIVE_HIGH)
2243 flags |= DRM_MODE_FLAG_PVSYNC;
2244 else
2245 flags |= DRM_MODE_FLAG_NVSYNC;
2246 }
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002247
Ander Conselvan de Oliveira2d112de2015-01-15 14:55:22 +02002248 pipe_config->base.adjusted_mode.flags |= flags;
Jesse Barnesf1f644d2013-06-27 00:39:25 +03002249
Ville Syrjälä8c875fc2014-09-12 15:46:29 +03002250 if (!HAS_PCH_SPLIT(dev) && !IS_VALLEYVIEW(dev) &&
2251 tmp & DP_COLOR_RANGE_16_235)
2252 pipe_config->limited_color_range = true;
2253
Ville Syrjäläeb14cb72013-09-10 17:02:54 +03002254 pipe_config->has_dp_encoder = true;
2255
2256 intel_dp_get_m_n(crtc, pipe_config);
2257
Ville Syrjälä18442d02013-09-13 16:00:08 +03002258 if (port == PORT_A) {
Jesse Barnesf1f644d2013-06-27 00:39:25 +03002259 if ((I915_READ(DP_A) & DP_PLL_FREQ_MASK) == DP_PLL_FREQ_160MHZ)
2260 pipe_config->port_clock = 162000;
2261 else
2262 pipe_config->port_clock = 270000;
2263 }
Ville Syrjälä18442d02013-09-13 16:00:08 +03002264
2265 dotclock = intel_dotclock_calculate(pipe_config->port_clock,
2266 &pipe_config->dp_m_n);
2267
2268 if (HAS_PCH_SPLIT(dev_priv->dev) && port != PORT_A)
2269 ironlake_check_encoder_dotclock(pipe_config, dotclock);
2270
Ander Conselvan de Oliveira2d112de2015-01-15 14:55:22 +02002271 pipe_config->base.adjusted_mode.crtc_clock = dotclock;
Daniel Vetter7f16e5c2013-11-04 16:28:47 +01002272
Jani Nikulac6cd2ee2013-10-21 10:52:07 +03002273 if (is_edp(intel_dp) && dev_priv->vbt.edp_bpp &&
2274 pipe_config->pipe_bpp > dev_priv->vbt.edp_bpp) {
2275 /*
2276 * This is a big fat ugly hack.
2277 *
2278 * Some machines in UEFI boot mode provide us a VBT that has 18
2279 * bpp and 1.62 GHz link bandwidth for eDP, which for reasons
2280 * unknown we fail to light up. Yet the same BIOS boots up with
2281 * 24 bpp and 2.7 GHz link. Use the same bpp as the BIOS uses as
2282 * max, not what it tells us to use.
2283 *
2284 * Note: This will still be broken if the eDP panel is not lit
2285 * up by the BIOS, and thus we can't get the mode at module
2286 * load.
2287 */
2288 DRM_DEBUG_KMS("pipe has %d bpp for eDP panel, overriding BIOS-provided max %d bpp\n",
2289 pipe_config->pipe_bpp, dev_priv->vbt.edp_bpp);
2290 dev_priv->vbt.edp_bpp = pipe_config->pipe_bpp;
2291 }
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002292}
2293
Daniel Vettere8cb4552012-07-01 13:05:48 +02002294static void intel_disable_dp(struct intel_encoder *encoder)
Jesse Barnesd240f202010-08-13 15:43:26 -07002295{
Daniel Vettere8cb4552012-07-01 13:05:48 +02002296 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Imre Deak982a3862013-05-23 19:39:40 +03002297 struct drm_device *dev = encoder->base.dev;
Jani Nikula495a5bb2014-10-27 16:26:55 +02002298 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
2299
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02002300 if (crtc->config->has_audio)
Jani Nikula495a5bb2014-10-27 16:26:55 +02002301 intel_audio_codec_disable(encoder);
Daniel Vetter6cb49832012-05-20 17:14:50 +02002302
Rodrigo Vivib32c6f42014-11-20 03:44:37 -08002303 if (HAS_PSR(dev) && !HAS_DDI(dev))
2304 intel_psr_disable(intel_dp);
2305
Daniel Vetter6cb49832012-05-20 17:14:50 +02002306 /* Make sure the panel is off before trying to change the mode. But also
2307 * ensure that we have vdd while we switch off the panel. */
Jani Nikula24f3e092014-03-17 16:43:36 +02002308 intel_edp_panel_vdd_on(intel_dp);
Daniel Vetter4be73782014-01-17 14:39:48 +01002309 intel_edp_backlight_off(intel_dp);
Jani Nikulafdbc3b12013-11-12 17:10:13 +02002310 intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
Daniel Vetter4be73782014-01-17 14:39:48 +01002311 intel_edp_panel_off(intel_dp);
Daniel Vetter37398502012-09-06 22:15:44 +02002312
Ville Syrjälä08aff3f2014-08-18 22:16:09 +03002313 /* disable the port before the pipe on g4x */
2314 if (INTEL_INFO(dev)->gen < 5)
Daniel Vetter37398502012-09-06 22:15:44 +02002315 intel_dp_link_down(intel_dp);
Jesse Barnesd240f202010-08-13 15:43:26 -07002316}
2317
Ville Syrjälä08aff3f2014-08-18 22:16:09 +03002318static void ilk_post_disable_dp(struct intel_encoder *encoder)
Jesse Barnesd240f202010-08-13 15:43:26 -07002319{
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02002320 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Imre Deak982a3862013-05-23 19:39:40 +03002321 enum port port = dp_to_dig_port(intel_dp)->port;
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02002322
Ville Syrjälä49277c32014-03-31 18:21:26 +03002323 intel_dp_link_down(intel_dp);
Ville Syrjälä08aff3f2014-08-18 22:16:09 +03002324 if (port == PORT_A)
2325 ironlake_edp_pll_off(intel_dp);
Ville Syrjälä49277c32014-03-31 18:21:26 +03002326}
2327
2328static void vlv_post_disable_dp(struct intel_encoder *encoder)
2329{
2330 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2331
2332 intel_dp_link_down(intel_dp);
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02002333}
2334
Ville Syrjälä580d3812014-04-09 13:29:00 +03002335static void chv_post_disable_dp(struct intel_encoder *encoder)
2336{
2337 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2338 struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
2339 struct drm_device *dev = encoder->base.dev;
2340 struct drm_i915_private *dev_priv = dev->dev_private;
2341 struct intel_crtc *intel_crtc =
2342 to_intel_crtc(encoder->base.crtc);
2343 enum dpio_channel ch = vlv_dport_to_channel(dport);
2344 enum pipe pipe = intel_crtc->pipe;
2345 u32 val;
2346
2347 intel_dp_link_down(intel_dp);
2348
2349 mutex_lock(&dev_priv->dpio_lock);
2350
2351 /* Propagate soft reset to data lane reset */
Ville Syrjälä97fd4d52014-04-09 13:29:02 +03002352 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch));
Ville Syrjäläd2152b22014-04-28 14:15:24 +03002353 val |= CHV_PCS_REQ_SOFTRESET_EN;
Ville Syrjälä97fd4d52014-04-09 13:29:02 +03002354 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW1(ch), val);
Ville Syrjäläd2152b22014-04-28 14:15:24 +03002355
Ville Syrjälä97fd4d52014-04-09 13:29:02 +03002356 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW1(ch));
2357 val |= CHV_PCS_REQ_SOFTRESET_EN;
2358 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW1(ch), val);
2359
2360 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW0(ch));
Ville Syrjälä580d3812014-04-09 13:29:00 +03002361 val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
Ville Syrjälä97fd4d52014-04-09 13:29:02 +03002362 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW0(ch), val);
2363
2364 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW0(ch));
2365 val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
2366 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val);
Ville Syrjälä580d3812014-04-09 13:29:00 +03002367
2368 mutex_unlock(&dev_priv->dpio_lock);
2369}
2370
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002371static void
2372_intel_dp_set_link_train(struct intel_dp *intel_dp,
2373 uint32_t *DP,
2374 uint8_t dp_train_pat)
2375{
2376 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2377 struct drm_device *dev = intel_dig_port->base.base.dev;
2378 struct drm_i915_private *dev_priv = dev->dev_private;
2379 enum port port = intel_dig_port->port;
2380
2381 if (HAS_DDI(dev)) {
2382 uint32_t temp = I915_READ(DP_TP_CTL(port));
2383
2384 if (dp_train_pat & DP_LINK_SCRAMBLING_DISABLE)
2385 temp |= DP_TP_CTL_SCRAMBLE_DISABLE;
2386 else
2387 temp &= ~DP_TP_CTL_SCRAMBLE_DISABLE;
2388
2389 temp &= ~DP_TP_CTL_LINK_TRAIN_MASK;
2390 switch (dp_train_pat & DP_TRAINING_PATTERN_MASK) {
2391 case DP_TRAINING_PATTERN_DISABLE:
2392 temp |= DP_TP_CTL_LINK_TRAIN_NORMAL;
2393
2394 break;
2395 case DP_TRAINING_PATTERN_1:
2396 temp |= DP_TP_CTL_LINK_TRAIN_PAT1;
2397 break;
2398 case DP_TRAINING_PATTERN_2:
2399 temp |= DP_TP_CTL_LINK_TRAIN_PAT2;
2400 break;
2401 case DP_TRAINING_PATTERN_3:
2402 temp |= DP_TP_CTL_LINK_TRAIN_PAT3;
2403 break;
2404 }
2405 I915_WRITE(DP_TP_CTL(port), temp);
2406
2407 } else if (HAS_PCH_CPT(dev) && (IS_GEN7(dev) || port != PORT_A)) {
2408 *DP &= ~DP_LINK_TRAIN_MASK_CPT;
2409
2410 switch (dp_train_pat & DP_TRAINING_PATTERN_MASK) {
2411 case DP_TRAINING_PATTERN_DISABLE:
2412 *DP |= DP_LINK_TRAIN_OFF_CPT;
2413 break;
2414 case DP_TRAINING_PATTERN_1:
2415 *DP |= DP_LINK_TRAIN_PAT_1_CPT;
2416 break;
2417 case DP_TRAINING_PATTERN_2:
2418 *DP |= DP_LINK_TRAIN_PAT_2_CPT;
2419 break;
2420 case DP_TRAINING_PATTERN_3:
2421 DRM_ERROR("DP training pattern 3 not supported\n");
2422 *DP |= DP_LINK_TRAIN_PAT_2_CPT;
2423 break;
2424 }
2425
2426 } else {
2427 if (IS_CHERRYVIEW(dev))
2428 *DP &= ~DP_LINK_TRAIN_MASK_CHV;
2429 else
2430 *DP &= ~DP_LINK_TRAIN_MASK;
2431
2432 switch (dp_train_pat & DP_TRAINING_PATTERN_MASK) {
2433 case DP_TRAINING_PATTERN_DISABLE:
2434 *DP |= DP_LINK_TRAIN_OFF;
2435 break;
2436 case DP_TRAINING_PATTERN_1:
2437 *DP |= DP_LINK_TRAIN_PAT_1;
2438 break;
2439 case DP_TRAINING_PATTERN_2:
2440 *DP |= DP_LINK_TRAIN_PAT_2;
2441 break;
2442 case DP_TRAINING_PATTERN_3:
2443 if (IS_CHERRYVIEW(dev)) {
2444 *DP |= DP_LINK_TRAIN_PAT_3_CHV;
2445 } else {
2446 DRM_ERROR("DP training pattern 3 not supported\n");
2447 *DP |= DP_LINK_TRAIN_PAT_2;
2448 }
2449 break;
2450 }
2451 }
2452}
2453
2454static void intel_dp_enable_port(struct intel_dp *intel_dp)
2455{
2456 struct drm_device *dev = intel_dp_to_dev(intel_dp);
2457 struct drm_i915_private *dev_priv = dev->dev_private;
2458
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002459 /* enable with pattern 1 (as per spec) */
2460 _intel_dp_set_link_train(intel_dp, &intel_dp->DP,
2461 DP_TRAINING_PATTERN_1);
2462
2463 I915_WRITE(intel_dp->output_reg, intel_dp->DP);
2464 POSTING_READ(intel_dp->output_reg);
Ville Syrjälä7b713f52014-10-16 21:27:35 +03002465
2466 /*
2467 * Magic for VLV/CHV. We _must_ first set up the register
2468 * without actually enabling the port, and then do another
2469 * write to enable the port. Otherwise link training will
2470 * fail when the power sequencer is freshly used for this port.
2471 */
2472 intel_dp->DP |= DP_PORT_EN;
2473
2474 I915_WRITE(intel_dp->output_reg, intel_dp->DP);
2475 POSTING_READ(intel_dp->output_reg);
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002476}
2477
Daniel Vettere8cb4552012-07-01 13:05:48 +02002478static void intel_enable_dp(struct intel_encoder *encoder)
Jesse Barnesd240f202010-08-13 15:43:26 -07002479{
Daniel Vettere8cb4552012-07-01 13:05:48 +02002480 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2481 struct drm_device *dev = encoder->base.dev;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002482 struct drm_i915_private *dev_priv = dev->dev_private;
Jani Nikulac1dec792014-10-27 16:26:56 +02002483 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
Chris Wilsonea5b2132010-08-04 13:50:23 +01002484 uint32_t dp_reg = I915_READ(intel_dp->output_reg);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002485
Daniel Vetter0c33d8d2012-09-06 22:15:43 +02002486 if (WARN_ON(dp_reg & DP_PORT_EN))
2487 return;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002488
Ville Syrjälä093e3f12014-10-16 21:27:33 +03002489 pps_lock(intel_dp);
2490
2491 if (IS_VALLEYVIEW(dev))
2492 vlv_init_panel_power_sequencer(intel_dp);
2493
Ville Syrjälä7b13b582014-08-18 22:16:08 +03002494 intel_dp_enable_port(intel_dp);
Ville Syrjälä093e3f12014-10-16 21:27:33 +03002495
2496 edp_panel_vdd_on(intel_dp);
2497 edp_panel_on(intel_dp);
2498 edp_panel_vdd_off(intel_dp, true);
2499
2500 pps_unlock(intel_dp);
2501
Ville Syrjälä61234fa2014-10-16 21:27:34 +03002502 if (IS_VALLEYVIEW(dev))
2503 vlv_wait_port_ready(dev_priv, dp_to_dig_port(intel_dp));
2504
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002505 intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
2506 intel_dp_start_link_train(intel_dp);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002507 intel_dp_complete_link_train(intel_dp);
Imre Deak3ab9c632013-05-03 12:57:41 +03002508 intel_dp_stop_link_train(intel_dp);
Jani Nikulac1dec792014-10-27 16:26:56 +02002509
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02002510 if (crtc->config->has_audio) {
Jani Nikulac1dec792014-10-27 16:26:56 +02002511 DRM_DEBUG_DRIVER("Enabling DP audio on pipe %c\n",
2512 pipe_name(crtc->pipe));
2513 intel_audio_codec_enable(encoder);
2514 }
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002515}
Jesse Barnes89b667f2013-04-18 14:51:36 -07002516
Jani Nikulaecff4f32013-09-06 07:38:29 +03002517static void g4x_enable_dp(struct intel_encoder *encoder)
2518{
Jani Nikula828f5c62013-09-05 16:44:45 +03002519 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2520
Jani Nikulaecff4f32013-09-06 07:38:29 +03002521 intel_enable_dp(encoder);
Daniel Vetter4be73782014-01-17 14:39:48 +01002522 intel_edp_backlight_on(intel_dp);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002523}
Jesse Barnes89b667f2013-04-18 14:51:36 -07002524
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002525static void vlv_enable_dp(struct intel_encoder *encoder)
2526{
Jani Nikula828f5c62013-09-05 16:44:45 +03002527 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2528
Daniel Vetter4be73782014-01-17 14:39:48 +01002529 intel_edp_backlight_on(intel_dp);
Rodrigo Vivib32c6f42014-11-20 03:44:37 -08002530 intel_psr_enable(intel_dp);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002531}
2532
Jani Nikulaecff4f32013-09-06 07:38:29 +03002533static void g4x_pre_enable_dp(struct intel_encoder *encoder)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002534{
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02002535 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
Imre Deakbc7d38a2013-05-16 14:40:36 +03002536 struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002537
Daniel Vetter8ac33ed2014-04-24 23:54:54 +02002538 intel_dp_prepare(encoder);
2539
Daniel Vetterd41f1ef2014-04-24 23:54:53 +02002540 /* Only ilk+ has port A */
2541 if (dport->port == PORT_A) {
2542 ironlake_set_pll_cpu_edp(intel_dp);
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002543 ironlake_edp_pll_on(intel_dp);
Daniel Vetterd41f1ef2014-04-24 23:54:53 +02002544 }
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002545}
2546
Ville Syrjälä83b84592014-10-16 21:29:51 +03002547static void vlv_detach_power_sequencer(struct intel_dp *intel_dp)
2548{
2549 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2550 struct drm_i915_private *dev_priv = intel_dig_port->base.base.dev->dev_private;
2551 enum pipe pipe = intel_dp->pps_pipe;
2552 int pp_on_reg = VLV_PIPE_PP_ON_DELAYS(pipe);
2553
2554 edp_panel_vdd_off_sync(intel_dp);
2555
2556 /*
2557 * VLV seems to get confused when multiple power seqeuencers
2558 * have the same port selected (even if only one has power/vdd
2559 * enabled). The failure manifests as vlv_wait_port_ready() failing
2560 * CHV on the other hand doesn't seem to mind having the same port
2561 * selected in multiple power seqeuencers, but let's clear the
2562 * port select always when logically disconnecting a power sequencer
2563 * from a port.
2564 */
2565 DRM_DEBUG_KMS("detaching pipe %c power sequencer from port %c\n",
2566 pipe_name(pipe), port_name(intel_dig_port->port));
2567 I915_WRITE(pp_on_reg, 0);
2568 POSTING_READ(pp_on_reg);
2569
2570 intel_dp->pps_pipe = INVALID_PIPE;
2571}
2572
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002573static void vlv_steal_power_sequencer(struct drm_device *dev,
2574 enum pipe pipe)
2575{
2576 struct drm_i915_private *dev_priv = dev->dev_private;
2577 struct intel_encoder *encoder;
2578
2579 lockdep_assert_held(&dev_priv->pps_mutex);
2580
Ville Syrjäläac3c12e2014-10-16 21:29:56 +03002581 if (WARN_ON(pipe != PIPE_A && pipe != PIPE_B))
2582 return;
2583
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002584 list_for_each_entry(encoder, &dev->mode_config.encoder_list,
2585 base.head) {
2586 struct intel_dp *intel_dp;
Ville Syrjälä773538e82014-09-04 14:54:56 +03002587 enum port port;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002588
2589 if (encoder->type != INTEL_OUTPUT_EDP)
2590 continue;
2591
2592 intel_dp = enc_to_intel_dp(&encoder->base);
Ville Syrjälä773538e82014-09-04 14:54:56 +03002593 port = dp_to_dig_port(intel_dp)->port;
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002594
2595 if (intel_dp->pps_pipe != pipe)
2596 continue;
2597
2598 DRM_DEBUG_KMS("stealing pipe %c power sequencer from port %c\n",
Ville Syrjälä773538e82014-09-04 14:54:56 +03002599 pipe_name(pipe), port_name(port));
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002600
Ville Syrjälä034e43c2014-10-16 21:27:28 +03002601 WARN(encoder->connectors_active,
2602 "stealing pipe %c power sequencer from active eDP port %c\n",
2603 pipe_name(pipe), port_name(port));
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002604
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002605 /* make sure vdd is off before we steal it */
Ville Syrjälä83b84592014-10-16 21:29:51 +03002606 vlv_detach_power_sequencer(intel_dp);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002607 }
2608}
2609
2610static void vlv_init_panel_power_sequencer(struct intel_dp *intel_dp)
2611{
2612 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2613 struct intel_encoder *encoder = &intel_dig_port->base;
2614 struct drm_device *dev = encoder->base.dev;
2615 struct drm_i915_private *dev_priv = dev->dev_private;
2616 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002617
2618 lockdep_assert_held(&dev_priv->pps_mutex);
2619
Ville Syrjälä093e3f12014-10-16 21:27:33 +03002620 if (!is_edp(intel_dp))
2621 return;
2622
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002623 if (intel_dp->pps_pipe == crtc->pipe)
2624 return;
2625
2626 /*
2627 * If another power sequencer was being used on this
2628 * port previously make sure to turn off vdd there while
2629 * we still have control of it.
2630 */
2631 if (intel_dp->pps_pipe != INVALID_PIPE)
Ville Syrjälä83b84592014-10-16 21:29:51 +03002632 vlv_detach_power_sequencer(intel_dp);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002633
2634 /*
2635 * We may be stealing the power
2636 * sequencer from another port.
2637 */
2638 vlv_steal_power_sequencer(dev, crtc->pipe);
2639
2640 /* now it's all ours */
2641 intel_dp->pps_pipe = crtc->pipe;
2642
2643 DRM_DEBUG_KMS("initializing pipe %c power sequencer for port %c\n",
2644 pipe_name(intel_dp->pps_pipe), port_name(intel_dig_port->port));
2645
2646 /* init power sequencer on this pipe and port */
Ville Syrjälä36b5f422014-10-16 21:27:30 +03002647 intel_dp_init_panel_power_sequencer(dev, intel_dp);
2648 intel_dp_init_panel_power_sequencer_registers(dev, intel_dp);
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03002649}
2650
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002651static void vlv_pre_enable_dp(struct intel_encoder *encoder)
2652{
2653 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2654 struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
Jesse Barnesb2634012013-03-28 09:55:40 -07002655 struct drm_device *dev = encoder->base.dev;
Jesse Barnes89b667f2013-04-18 14:51:36 -07002656 struct drm_i915_private *dev_priv = dev->dev_private;
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002657 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
Chon Ming Leee4607fc2013-11-06 14:36:35 +08002658 enum dpio_channel port = vlv_dport_to_channel(dport);
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002659 int pipe = intel_crtc->pipe;
2660 u32 val;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002661
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002662 mutex_lock(&dev_priv->dpio_lock);
Jesse Barnes89b667f2013-04-18 14:51:36 -07002663
Chon Ming Leeab3c7592013-11-07 10:43:30 +08002664 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW8(port));
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002665 val = 0;
2666 if (pipe)
2667 val |= (1<<21);
2668 else
2669 val &= ~(1<<21);
2670 val |= 0x001000c4;
Chon Ming Leeab3c7592013-11-07 10:43:30 +08002671 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW8(port), val);
2672 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW14(port), 0x00760018);
2673 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW23(port), 0x00400888);
Jesse Barnes89b667f2013-04-18 14:51:36 -07002674
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002675 mutex_unlock(&dev_priv->dpio_lock);
Jesse Barnes89b667f2013-04-18 14:51:36 -07002676
Jani Nikulaab1f90f2013-07-30 12:20:30 +03002677 intel_enable_dp(encoder);
Jesse Barnes89b667f2013-04-18 14:51:36 -07002678}
2679
Jani Nikulaecff4f32013-09-06 07:38:29 +03002680static void vlv_dp_pre_pll_enable(struct intel_encoder *encoder)
Jesse Barnes89b667f2013-04-18 14:51:36 -07002681{
2682 struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
2683 struct drm_device *dev = encoder->base.dev;
2684 struct drm_i915_private *dev_priv = dev->dev_private;
Chon Ming Lee5e69f972013-09-05 20:41:49 +08002685 struct intel_crtc *intel_crtc =
2686 to_intel_crtc(encoder->base.crtc);
Chon Ming Leee4607fc2013-11-06 14:36:35 +08002687 enum dpio_channel port = vlv_dport_to_channel(dport);
Chon Ming Lee5e69f972013-09-05 20:41:49 +08002688 int pipe = intel_crtc->pipe;
Jesse Barnes89b667f2013-04-18 14:51:36 -07002689
Daniel Vetter8ac33ed2014-04-24 23:54:54 +02002690 intel_dp_prepare(encoder);
2691
Jesse Barnes89b667f2013-04-18 14:51:36 -07002692 /* Program Tx lane resets to default */
Chris Wilson0980a602013-07-26 19:57:35 +01002693 mutex_lock(&dev_priv->dpio_lock);
Chon Ming Leeab3c7592013-11-07 10:43:30 +08002694 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port),
Jesse Barnes89b667f2013-04-18 14:51:36 -07002695 DPIO_PCS_TX_LANE2_RESET |
2696 DPIO_PCS_TX_LANE1_RESET);
Chon Ming Leeab3c7592013-11-07 10:43:30 +08002697 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW1(port),
Jesse Barnes89b667f2013-04-18 14:51:36 -07002698 DPIO_PCS_CLK_CRI_RXEB_EIOS_EN |
2699 DPIO_PCS_CLK_CRI_RXDIGFILTSG_EN |
2700 (1<<DPIO_PCS_CLK_DATAWIDTH_SHIFT) |
2701 DPIO_PCS_CLK_SOFT_RESET);
2702
2703 /* Fix up inter-pair skew failure */
Chon Ming Leeab3c7592013-11-07 10:43:30 +08002704 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW12(port), 0x00750f00);
2705 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW11(port), 0x00001500);
2706 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW14(port), 0x40400000);
Chris Wilson0980a602013-07-26 19:57:35 +01002707 mutex_unlock(&dev_priv->dpio_lock);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002708}
2709
Chon Ming Leee4a1d842014-04-09 13:28:20 +03002710static void chv_pre_enable_dp(struct intel_encoder *encoder)
2711{
2712 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2713 struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
2714 struct drm_device *dev = encoder->base.dev;
2715 struct drm_i915_private *dev_priv = dev->dev_private;
Chon Ming Leee4a1d842014-04-09 13:28:20 +03002716 struct intel_crtc *intel_crtc =
2717 to_intel_crtc(encoder->base.crtc);
2718 enum dpio_channel ch = vlv_dport_to_channel(dport);
2719 int pipe = intel_crtc->pipe;
2720 int data, i;
Ville Syrjälä949c1d42014-04-09 13:28:58 +03002721 u32 val;
2722
2723 mutex_lock(&dev_priv->dpio_lock);
2724
Ville Syrjälä570e2a72014-08-18 14:42:46 +03002725 /* allow hardware to manage TX FIFO reset source */
2726 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW11(ch));
2727 val &= ~DPIO_LANEDESKEW_STRAP_OVRD;
2728 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val);
2729
2730 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch));
2731 val &= ~DPIO_LANEDESKEW_STRAP_OVRD;
2732 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val);
2733
Ville Syrjälä949c1d42014-04-09 13:28:58 +03002734 /* Deassert soft data lane reset*/
Ville Syrjälä97fd4d52014-04-09 13:29:02 +03002735 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch));
Ville Syrjäläd2152b22014-04-28 14:15:24 +03002736 val |= CHV_PCS_REQ_SOFTRESET_EN;
Ville Syrjälä97fd4d52014-04-09 13:29:02 +03002737 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW1(ch), val);
Ville Syrjäläd2152b22014-04-28 14:15:24 +03002738
Ville Syrjälä97fd4d52014-04-09 13:29:02 +03002739 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW1(ch));
2740 val |= CHV_PCS_REQ_SOFTRESET_EN;
2741 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW1(ch), val);
2742
2743 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW0(ch));
Ville Syrjälä949c1d42014-04-09 13:28:58 +03002744 val |= (DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
Ville Syrjälä97fd4d52014-04-09 13:29:02 +03002745 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW0(ch), val);
2746
2747 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW0(ch));
2748 val |= (DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
2749 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val);
Chon Ming Leee4a1d842014-04-09 13:28:20 +03002750
2751 /* Program Tx lane latency optimal setting*/
Chon Ming Leee4a1d842014-04-09 13:28:20 +03002752 for (i = 0; i < 4; i++) {
2753 /* Set the latency optimal bit */
2754 data = (i == 1) ? 0x0 : 0x6;
2755 vlv_dpio_write(dev_priv, pipe, CHV_TX_DW11(ch, i),
2756 data << DPIO_FRC_LATENCY_SHFIT);
2757
2758 /* Set the upar bit */
2759 data = (i == 1) ? 0x0 : 0x1;
2760 vlv_dpio_write(dev_priv, pipe, CHV_TX_DW14(ch, i),
2761 data << DPIO_UPAR_SHIFT);
2762 }
2763
2764 /* Data lane stagger programming */
2765 /* FIXME: Fix up value only after power analysis */
2766
2767 mutex_unlock(&dev_priv->dpio_lock);
2768
Chon Ming Leee4a1d842014-04-09 13:28:20 +03002769 intel_enable_dp(encoder);
Chon Ming Leee4a1d842014-04-09 13:28:20 +03002770}
2771
Ville Syrjälä9197c882014-04-09 13:29:05 +03002772static void chv_dp_pre_pll_enable(struct intel_encoder *encoder)
2773{
2774 struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
2775 struct drm_device *dev = encoder->base.dev;
2776 struct drm_i915_private *dev_priv = dev->dev_private;
2777 struct intel_crtc *intel_crtc =
2778 to_intel_crtc(encoder->base.crtc);
2779 enum dpio_channel ch = vlv_dport_to_channel(dport);
2780 enum pipe pipe = intel_crtc->pipe;
2781 u32 val;
2782
Ville Syrjälä625695f2014-06-28 02:04:02 +03002783 intel_dp_prepare(encoder);
2784
Ville Syrjälä9197c882014-04-09 13:29:05 +03002785 mutex_lock(&dev_priv->dpio_lock);
2786
Ville Syrjäläb9e5ac32014-05-27 16:30:18 +03002787 /* program left/right clock distribution */
2788 if (pipe != PIPE_B) {
2789 val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW5_CH0);
2790 val &= ~(CHV_BUFLEFTENA1_MASK | CHV_BUFRIGHTENA1_MASK);
2791 if (ch == DPIO_CH0)
2792 val |= CHV_BUFLEFTENA1_FORCE;
2793 if (ch == DPIO_CH1)
2794 val |= CHV_BUFRIGHTENA1_FORCE;
2795 vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW5_CH0, val);
2796 } else {
2797 val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW1_CH1);
2798 val &= ~(CHV_BUFLEFTENA2_MASK | CHV_BUFRIGHTENA2_MASK);
2799 if (ch == DPIO_CH0)
2800 val |= CHV_BUFLEFTENA2_FORCE;
2801 if (ch == DPIO_CH1)
2802 val |= CHV_BUFRIGHTENA2_FORCE;
2803 vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW1_CH1, val);
2804 }
2805
Ville Syrjälä9197c882014-04-09 13:29:05 +03002806 /* program clock channel usage */
2807 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW8(ch));
2808 val |= CHV_PCS_USEDCLKCHANNEL_OVRRIDE;
2809 if (pipe != PIPE_B)
2810 val &= ~CHV_PCS_USEDCLKCHANNEL;
2811 else
2812 val |= CHV_PCS_USEDCLKCHANNEL;
2813 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW8(ch), val);
2814
2815 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW8(ch));
2816 val |= CHV_PCS_USEDCLKCHANNEL_OVRRIDE;
2817 if (pipe != PIPE_B)
2818 val &= ~CHV_PCS_USEDCLKCHANNEL;
2819 else
2820 val |= CHV_PCS_USEDCLKCHANNEL;
2821 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW8(ch), val);
2822
2823 /*
2824 * This a a bit weird since generally CL
2825 * matches the pipe, but here we need to
2826 * pick the CL based on the port.
2827 */
2828 val = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW19(ch));
2829 if (pipe != PIPE_B)
2830 val &= ~CHV_CMN_USEDCLKCHANNEL;
2831 else
2832 val |= CHV_CMN_USEDCLKCHANNEL;
2833 vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW19(ch), val);
2834
2835 mutex_unlock(&dev_priv->dpio_lock);
2836}
2837
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002838/*
Jesse Barnesdf0c2372011-07-07 11:11:02 -07002839 * Native read with retry for link status and receiver capability reads for
2840 * cases where the sink may still be asleep.
Jani Nikula9d1a1032014-03-14 16:51:15 +02002841 *
2842 * Sinks are *supposed* to come up within 1ms from an off state, but we're also
2843 * supposed to retry 3 times per the spec.
Jesse Barnesdf0c2372011-07-07 11:11:02 -07002844 */
Jani Nikula9d1a1032014-03-14 16:51:15 +02002845static ssize_t
2846intel_dp_dpcd_read_wake(struct drm_dp_aux *aux, unsigned int offset,
2847 void *buffer, size_t size)
Jesse Barnesdf0c2372011-07-07 11:11:02 -07002848{
Jani Nikula9d1a1032014-03-14 16:51:15 +02002849 ssize_t ret;
2850 int i;
Jesse Barnesdf0c2372011-07-07 11:11:02 -07002851
Ville Syrjäläf6a19062014-10-16 20:46:09 +03002852 /*
2853 * Sometime we just get the same incorrect byte repeated
2854 * over the entire buffer. Doing just one throw away read
2855 * initially seems to "solve" it.
2856 */
2857 drm_dp_dpcd_read(aux, DP_DPCD_REV, buffer, 1);
2858
Jesse Barnesdf0c2372011-07-07 11:11:02 -07002859 for (i = 0; i < 3; i++) {
Jani Nikula9d1a1032014-03-14 16:51:15 +02002860 ret = drm_dp_dpcd_read(aux, offset, buffer, size);
2861 if (ret == size)
2862 return ret;
Jesse Barnesdf0c2372011-07-07 11:11:02 -07002863 msleep(1);
2864 }
2865
Jani Nikula9d1a1032014-03-14 16:51:15 +02002866 return ret;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002867}
2868
2869/*
2870 * Fetch AUX CH registers 0x202 - 0x207 which contain
2871 * link status information
2872 */
2873static bool
Keith Packard93f62da2011-11-01 19:45:03 -07002874intel_dp_get_link_status(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_STATUS_SIZE])
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002875{
Jani Nikula9d1a1032014-03-14 16:51:15 +02002876 return intel_dp_dpcd_read_wake(&intel_dp->aux,
2877 DP_LANE0_1_STATUS,
2878 link_status,
2879 DP_LINK_STATUS_SIZE) == DP_LINK_STATUS_SIZE;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002880}
2881
Paulo Zanoni11002442014-06-13 18:45:41 -03002882/* These are source-specific values. */
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002883static uint8_t
Keith Packard1a2eb462011-11-16 16:26:07 -08002884intel_dp_voltage_max(struct intel_dp *intel_dp)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002885{
Paulo Zanoni30add222012-10-26 19:05:45 -02002886 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Sonika Jindal7ad14a22015-02-25 10:29:12 +05302887 struct drm_i915_private *dev_priv = dev->dev_private;
Imre Deakbc7d38a2013-05-16 14:40:36 +03002888 enum port port = dp_to_dig_port(intel_dp)->port;
Keith Packard1a2eb462011-11-16 16:26:07 -08002889
Vandana Kannan93147262014-11-18 15:45:29 +05302890 if (IS_BROXTON(dev))
2891 return DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
2892 else if (INTEL_INFO(dev)->gen >= 9) {
Sonika Jindal7ad14a22015-02-25 10:29:12 +05302893 if (dev_priv->vbt.edp_low_vswing && port == PORT_A)
2894 return DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
Damien Lespiau5a9d1f12013-12-03 13:56:26 +00002895 return DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
Sonika Jindal7ad14a22015-02-25 10:29:12 +05302896 } else if (IS_VALLEYVIEW(dev))
Sonika Jindalbd600182014-08-08 16:23:41 +05302897 return DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
Imre Deakbc7d38a2013-05-16 14:40:36 +03002898 else if (IS_GEN7(dev) && port == PORT_A)
Sonika Jindalbd600182014-08-08 16:23:41 +05302899 return DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
Imre Deakbc7d38a2013-05-16 14:40:36 +03002900 else if (HAS_PCH_CPT(dev) && port != PORT_A)
Sonika Jindalbd600182014-08-08 16:23:41 +05302901 return DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
Keith Packard1a2eb462011-11-16 16:26:07 -08002902 else
Sonika Jindalbd600182014-08-08 16:23:41 +05302903 return DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
Keith Packard1a2eb462011-11-16 16:26:07 -08002904}
2905
2906static uint8_t
2907intel_dp_pre_emphasis_max(struct intel_dp *intel_dp, uint8_t voltage_swing)
2908{
Paulo Zanoni30add222012-10-26 19:05:45 -02002909 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Imre Deakbc7d38a2013-05-16 14:40:36 +03002910 enum port port = dp_to_dig_port(intel_dp)->port;
Keith Packard1a2eb462011-11-16 16:26:07 -08002911
Damien Lespiau5a9d1f12013-12-03 13:56:26 +00002912 if (INTEL_INFO(dev)->gen >= 9) {
2913 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
2914 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
2915 return DP_TRAIN_PRE_EMPH_LEVEL_3;
2916 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
2917 return DP_TRAIN_PRE_EMPH_LEVEL_2;
2918 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
2919 return DP_TRAIN_PRE_EMPH_LEVEL_1;
Sonika Jindal7ad14a22015-02-25 10:29:12 +05302920 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3:
2921 return DP_TRAIN_PRE_EMPH_LEVEL_0;
Damien Lespiau5a9d1f12013-12-03 13:56:26 +00002922 default:
2923 return DP_TRAIN_PRE_EMPH_LEVEL_0;
2924 }
2925 } else if (IS_HASWELL(dev) || IS_BROADWELL(dev)) {
Paulo Zanonid6c0d722012-10-15 15:51:34 -03002926 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05302927 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
2928 return DP_TRAIN_PRE_EMPH_LEVEL_3;
2929 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
2930 return DP_TRAIN_PRE_EMPH_LEVEL_2;
2931 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
2932 return DP_TRAIN_PRE_EMPH_LEVEL_1;
2933 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3:
Paulo Zanonid6c0d722012-10-15 15:51:34 -03002934 default:
Sonika Jindalbd600182014-08-08 16:23:41 +05302935 return DP_TRAIN_PRE_EMPH_LEVEL_0;
Paulo Zanonid6c0d722012-10-15 15:51:34 -03002936 }
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002937 } else if (IS_VALLEYVIEW(dev)) {
2938 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05302939 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
2940 return DP_TRAIN_PRE_EMPH_LEVEL_3;
2941 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
2942 return DP_TRAIN_PRE_EMPH_LEVEL_2;
2943 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
2944 return DP_TRAIN_PRE_EMPH_LEVEL_1;
2945 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002946 default:
Sonika Jindalbd600182014-08-08 16:23:41 +05302947 return DP_TRAIN_PRE_EMPH_LEVEL_0;
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002948 }
Imre Deakbc7d38a2013-05-16 14:40:36 +03002949 } else if (IS_GEN7(dev) && port == PORT_A) {
Keith Packard1a2eb462011-11-16 16:26:07 -08002950 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05302951 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
2952 return DP_TRAIN_PRE_EMPH_LEVEL_2;
2953 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
2954 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
2955 return DP_TRAIN_PRE_EMPH_LEVEL_1;
Keith Packard1a2eb462011-11-16 16:26:07 -08002956 default:
Sonika Jindalbd600182014-08-08 16:23:41 +05302957 return DP_TRAIN_PRE_EMPH_LEVEL_0;
Keith Packard1a2eb462011-11-16 16:26:07 -08002958 }
2959 } else {
2960 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05302961 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
2962 return DP_TRAIN_PRE_EMPH_LEVEL_2;
2963 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
2964 return DP_TRAIN_PRE_EMPH_LEVEL_2;
2965 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
2966 return DP_TRAIN_PRE_EMPH_LEVEL_1;
2967 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3:
Keith Packard1a2eb462011-11-16 16:26:07 -08002968 default:
Sonika Jindalbd600182014-08-08 16:23:41 +05302969 return DP_TRAIN_PRE_EMPH_LEVEL_0;
Keith Packard1a2eb462011-11-16 16:26:07 -08002970 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -07002971 }
2972}
2973
Daniel Vetter5829975c2015-04-16 11:36:52 +02002974static uint32_t vlv_signal_levels(struct intel_dp *intel_dp)
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002975{
2976 struct drm_device *dev = intel_dp_to_dev(intel_dp);
2977 struct drm_i915_private *dev_priv = dev->dev_private;
2978 struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
Chon Ming Lee5e69f972013-09-05 20:41:49 +08002979 struct intel_crtc *intel_crtc =
2980 to_intel_crtc(dport->base.base.crtc);
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002981 unsigned long demph_reg_value, preemph_reg_value,
2982 uniqtranscale_reg_value;
2983 uint8_t train_set = intel_dp->train_set[0];
Chon Ming Leee4607fc2013-11-06 14:36:35 +08002984 enum dpio_channel port = vlv_dport_to_channel(dport);
Chon Ming Lee5e69f972013-09-05 20:41:49 +08002985 int pipe = intel_crtc->pipe;
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002986
2987 switch (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05302988 case DP_TRAIN_PRE_EMPH_LEVEL_0:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002989 preemph_reg_value = 0x0004000;
2990 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05302991 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002992 demph_reg_value = 0x2B405555;
2993 uniqtranscale_reg_value = 0x552AB83A;
2994 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05302995 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07002996 demph_reg_value = 0x2B404040;
2997 uniqtranscale_reg_value = 0x5548B83A;
2998 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05302999 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003000 demph_reg_value = 0x2B245555;
3001 uniqtranscale_reg_value = 0x5560B83A;
3002 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303003 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003004 demph_reg_value = 0x2B405555;
3005 uniqtranscale_reg_value = 0x5598DA3A;
3006 break;
3007 default:
3008 return 0;
3009 }
3010 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303011 case DP_TRAIN_PRE_EMPH_LEVEL_1:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003012 preemph_reg_value = 0x0002000;
3013 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303014 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003015 demph_reg_value = 0x2B404040;
3016 uniqtranscale_reg_value = 0x5552B83A;
3017 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303018 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003019 demph_reg_value = 0x2B404848;
3020 uniqtranscale_reg_value = 0x5580B83A;
3021 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303022 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003023 demph_reg_value = 0x2B404040;
3024 uniqtranscale_reg_value = 0x55ADDA3A;
3025 break;
3026 default:
3027 return 0;
3028 }
3029 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303030 case DP_TRAIN_PRE_EMPH_LEVEL_2:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003031 preemph_reg_value = 0x0000000;
3032 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303033 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003034 demph_reg_value = 0x2B305555;
3035 uniqtranscale_reg_value = 0x5570B83A;
3036 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303037 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003038 demph_reg_value = 0x2B2B4040;
3039 uniqtranscale_reg_value = 0x55ADDA3A;
3040 break;
3041 default:
3042 return 0;
3043 }
3044 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303045 case DP_TRAIN_PRE_EMPH_LEVEL_3:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003046 preemph_reg_value = 0x0006000;
3047 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303048 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003049 demph_reg_value = 0x1B405555;
3050 uniqtranscale_reg_value = 0x55ADDA3A;
3051 break;
3052 default:
3053 return 0;
3054 }
3055 break;
3056 default:
3057 return 0;
3058 }
3059
Chris Wilson0980a602013-07-26 19:57:35 +01003060 mutex_lock(&dev_priv->dpio_lock);
Chon Ming Leeab3c7592013-11-07 10:43:30 +08003061 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), 0x00000000);
3062 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW4(port), demph_reg_value);
3063 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW2(port),
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003064 uniqtranscale_reg_value);
Chon Ming Leeab3c7592013-11-07 10:43:30 +08003065 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW3(port), 0x0C782040);
3066 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW11(port), 0x00030000);
3067 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW9(port), preemph_reg_value);
3068 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), 0x80000000);
Chris Wilson0980a602013-07-26 19:57:35 +01003069 mutex_unlock(&dev_priv->dpio_lock);
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003070
3071 return 0;
3072}
3073
Daniel Vetter5829975c2015-04-16 11:36:52 +02003074static uint32_t chv_signal_levels(struct intel_dp *intel_dp)
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003075{
3076 struct drm_device *dev = intel_dp_to_dev(intel_dp);
3077 struct drm_i915_private *dev_priv = dev->dev_private;
3078 struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
3079 struct intel_crtc *intel_crtc = to_intel_crtc(dport->base.base.crtc);
Ville Syrjäläf72df8d2014-04-09 13:29:03 +03003080 u32 deemph_reg_value, margin_reg_value, val;
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003081 uint8_t train_set = intel_dp->train_set[0];
3082 enum dpio_channel ch = vlv_dport_to_channel(dport);
Ville Syrjäläf72df8d2014-04-09 13:29:03 +03003083 enum pipe pipe = intel_crtc->pipe;
3084 int i;
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003085
3086 switch (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303087 case DP_TRAIN_PRE_EMPH_LEVEL_0:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003088 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303089 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003090 deemph_reg_value = 128;
3091 margin_reg_value = 52;
3092 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303093 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003094 deemph_reg_value = 128;
3095 margin_reg_value = 77;
3096 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303097 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003098 deemph_reg_value = 128;
3099 margin_reg_value = 102;
3100 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303101 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003102 deemph_reg_value = 128;
3103 margin_reg_value = 154;
3104 /* FIXME extra to set for 1200 */
3105 break;
3106 default:
3107 return 0;
3108 }
3109 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303110 case DP_TRAIN_PRE_EMPH_LEVEL_1:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003111 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303112 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003113 deemph_reg_value = 85;
3114 margin_reg_value = 78;
3115 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303116 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003117 deemph_reg_value = 85;
3118 margin_reg_value = 116;
3119 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303120 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003121 deemph_reg_value = 85;
3122 margin_reg_value = 154;
3123 break;
3124 default:
3125 return 0;
3126 }
3127 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303128 case DP_TRAIN_PRE_EMPH_LEVEL_2:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003129 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303130 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003131 deemph_reg_value = 64;
3132 margin_reg_value = 104;
3133 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303134 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003135 deemph_reg_value = 64;
3136 margin_reg_value = 154;
3137 break;
3138 default:
3139 return 0;
3140 }
3141 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303142 case DP_TRAIN_PRE_EMPH_LEVEL_3:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003143 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303144 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003145 deemph_reg_value = 43;
3146 margin_reg_value = 154;
3147 break;
3148 default:
3149 return 0;
3150 }
3151 break;
3152 default:
3153 return 0;
3154 }
3155
3156 mutex_lock(&dev_priv->dpio_lock);
3157
3158 /* Clear calc init */
Ville Syrjälä1966e592014-04-09 13:29:04 +03003159 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch));
3160 val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
Ville Syrjäläa02ef3c2014-08-18 14:42:45 +03003161 val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
3162 val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
Ville Syrjälä1966e592014-04-09 13:29:04 +03003163 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val);
3164
3165 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch));
3166 val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
Ville Syrjäläa02ef3c2014-08-18 14:42:45 +03003167 val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
3168 val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
Ville Syrjälä1966e592014-04-09 13:29:04 +03003169 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val);
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003170
Ville Syrjäläa02ef3c2014-08-18 14:42:45 +03003171 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW9(ch));
3172 val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK);
3173 val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000;
3174 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW9(ch), val);
3175
3176 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW9(ch));
3177 val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK);
3178 val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000;
3179 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW9(ch), val);
3180
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003181 /* Program swing deemph */
Ville Syrjäläf72df8d2014-04-09 13:29:03 +03003182 for (i = 0; i < 4; i++) {
3183 val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW4(ch, i));
3184 val &= ~DPIO_SWING_DEEMPH9P5_MASK;
3185 val |= deemph_reg_value << DPIO_SWING_DEEMPH9P5_SHIFT;
3186 vlv_dpio_write(dev_priv, pipe, CHV_TX_DW4(ch, i), val);
3187 }
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003188
3189 /* Program swing margin */
Ville Syrjäläf72df8d2014-04-09 13:29:03 +03003190 for (i = 0; i < 4; i++) {
3191 val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW2(ch, i));
Ville Syrjälä1fb44502014-06-28 02:04:03 +03003192 val &= ~DPIO_SWING_MARGIN000_MASK;
3193 val |= margin_reg_value << DPIO_SWING_MARGIN000_SHIFT;
Ville Syrjäläf72df8d2014-04-09 13:29:03 +03003194 vlv_dpio_write(dev_priv, pipe, CHV_TX_DW2(ch, i), val);
3195 }
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003196
3197 /* Disable unique transition scale */
Ville Syrjäläf72df8d2014-04-09 13:29:03 +03003198 for (i = 0; i < 4; i++) {
3199 val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW3(ch, i));
3200 val &= ~DPIO_TX_UNIQ_TRANS_SCALE_EN;
3201 vlv_dpio_write(dev_priv, pipe, CHV_TX_DW3(ch, i), val);
3202 }
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003203
3204 if (((train_set & DP_TRAIN_PRE_EMPHASIS_MASK)
Sonika Jindalbd600182014-08-08 16:23:41 +05303205 == DP_TRAIN_PRE_EMPH_LEVEL_0) &&
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003206 ((train_set & DP_TRAIN_VOLTAGE_SWING_MASK)
Sonika Jindalbd600182014-08-08 16:23:41 +05303207 == DP_TRAIN_VOLTAGE_SWING_LEVEL_3)) {
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003208
3209 /*
3210 * The document said it needs to set bit 27 for ch0 and bit 26
3211 * for ch1. Might be a typo in the doc.
3212 * For now, for this unique transition scale selection, set bit
3213 * 27 for ch0 and ch1.
3214 */
Ville Syrjäläf72df8d2014-04-09 13:29:03 +03003215 for (i = 0; i < 4; i++) {
3216 val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW3(ch, i));
3217 val |= DPIO_TX_UNIQ_TRANS_SCALE_EN;
3218 vlv_dpio_write(dev_priv, pipe, CHV_TX_DW3(ch, i), val);
3219 }
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003220
Ville Syrjäläf72df8d2014-04-09 13:29:03 +03003221 for (i = 0; i < 4; i++) {
3222 val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW2(ch, i));
3223 val &= ~(0xff << DPIO_UNIQ_TRANS_SCALE_SHIFT);
3224 val |= (0x9a << DPIO_UNIQ_TRANS_SCALE_SHIFT);
3225 vlv_dpio_write(dev_priv, pipe, CHV_TX_DW2(ch, i), val);
3226 }
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003227 }
3228
3229 /* Start swing calculation */
Ville Syrjälä1966e592014-04-09 13:29:04 +03003230 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch));
3231 val |= DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3;
3232 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val);
3233
3234 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch));
3235 val |= DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3;
3236 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val);
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003237
3238 /* LRC Bypass */
3239 val = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW30);
3240 val |= DPIO_LRC_BYPASS;
3241 vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW30, val);
3242
3243 mutex_unlock(&dev_priv->dpio_lock);
3244
3245 return 0;
3246}
3247
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003248static void
Jani Nikula0301b3a2013-10-15 09:36:08 +03003249intel_get_adjust_train(struct intel_dp *intel_dp,
3250 const uint8_t link_status[DP_LINK_STATUS_SIZE])
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003251{
3252 uint8_t v = 0;
3253 uint8_t p = 0;
3254 int lane;
Keith Packard1a2eb462011-11-16 16:26:07 -08003255 uint8_t voltage_max;
3256 uint8_t preemph_max;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003257
Jesse Barnes33a34e42010-09-08 12:42:02 -07003258 for (lane = 0; lane < intel_dp->lane_count; lane++) {
Daniel Vetter0f037bd2012-10-18 10:15:27 +02003259 uint8_t this_v = drm_dp_get_adjust_request_voltage(link_status, lane);
3260 uint8_t this_p = drm_dp_get_adjust_request_pre_emphasis(link_status, lane);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003261
3262 if (this_v > v)
3263 v = this_v;
3264 if (this_p > p)
3265 p = this_p;
3266 }
3267
Keith Packard1a2eb462011-11-16 16:26:07 -08003268 voltage_max = intel_dp_voltage_max(intel_dp);
Keith Packard417e8222011-11-01 19:54:11 -07003269 if (v >= voltage_max)
3270 v = voltage_max | DP_TRAIN_MAX_SWING_REACHED;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003271
Keith Packard1a2eb462011-11-16 16:26:07 -08003272 preemph_max = intel_dp_pre_emphasis_max(intel_dp, v);
3273 if (p >= preemph_max)
3274 p = preemph_max | DP_TRAIN_MAX_PRE_EMPHASIS_REACHED;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003275
3276 for (lane = 0; lane < 4; lane++)
Jesse Barnes33a34e42010-09-08 12:42:02 -07003277 intel_dp->train_set[lane] = v | p;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003278}
3279
3280static uint32_t
Daniel Vetter5829975c2015-04-16 11:36:52 +02003281gen4_signal_levels(uint8_t train_set)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003282{
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003283 uint32_t signal_levels = 0;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003284
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003285 switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303286 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003287 default:
3288 signal_levels |= DP_VOLTAGE_0_4;
3289 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303290 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003291 signal_levels |= DP_VOLTAGE_0_6;
3292 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303293 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003294 signal_levels |= DP_VOLTAGE_0_8;
3295 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303296 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003297 signal_levels |= DP_VOLTAGE_1_2;
3298 break;
3299 }
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003300 switch (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303301 case DP_TRAIN_PRE_EMPH_LEVEL_0:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003302 default:
3303 signal_levels |= DP_PRE_EMPHASIS_0;
3304 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303305 case DP_TRAIN_PRE_EMPH_LEVEL_1:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003306 signal_levels |= DP_PRE_EMPHASIS_3_5;
3307 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303308 case DP_TRAIN_PRE_EMPH_LEVEL_2:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003309 signal_levels |= DP_PRE_EMPHASIS_6;
3310 break;
Sonika Jindalbd600182014-08-08 16:23:41 +05303311 case DP_TRAIN_PRE_EMPH_LEVEL_3:
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003312 signal_levels |= DP_PRE_EMPHASIS_9_5;
3313 break;
3314 }
3315 return signal_levels;
3316}
3317
Zhenyu Wange3421a12010-04-08 09:43:27 +08003318/* Gen6's DP voltage swing and pre-emphasis control */
3319static uint32_t
Daniel Vetter5829975c2015-04-16 11:36:52 +02003320gen6_edp_signal_levels(uint8_t train_set)
Zhenyu Wange3421a12010-04-08 09:43:27 +08003321{
Yuanhan Liu3c5a62b2011-01-06 18:26:08 +08003322 int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK |
3323 DP_TRAIN_PRE_EMPHASIS_MASK);
3324 switch (signal_levels) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303325 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_0:
3326 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_0:
Yuanhan Liu3c5a62b2011-01-06 18:26:08 +08003327 return EDP_LINK_TRAIN_400_600MV_0DB_SNB_B;
Sonika Jindalbd600182014-08-08 16:23:41 +05303328 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_1:
Yuanhan Liu3c5a62b2011-01-06 18:26:08 +08003329 return EDP_LINK_TRAIN_400MV_3_5DB_SNB_B;
Sonika Jindalbd600182014-08-08 16:23:41 +05303330 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_2:
3331 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_2:
Yuanhan Liu3c5a62b2011-01-06 18:26:08 +08003332 return EDP_LINK_TRAIN_400_600MV_6DB_SNB_B;
Sonika Jindalbd600182014-08-08 16:23:41 +05303333 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_1:
3334 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_1:
Yuanhan Liu3c5a62b2011-01-06 18:26:08 +08003335 return EDP_LINK_TRAIN_600_800MV_3_5DB_SNB_B;
Sonika Jindalbd600182014-08-08 16:23:41 +05303336 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_0:
3337 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3 | DP_TRAIN_PRE_EMPH_LEVEL_0:
Yuanhan Liu3c5a62b2011-01-06 18:26:08 +08003338 return EDP_LINK_TRAIN_800_1200MV_0DB_SNB_B;
Zhenyu Wange3421a12010-04-08 09:43:27 +08003339 default:
Yuanhan Liu3c5a62b2011-01-06 18:26:08 +08003340 DRM_DEBUG_KMS("Unsupported voltage swing/pre-emphasis level:"
3341 "0x%x\n", signal_levels);
3342 return EDP_LINK_TRAIN_400_600MV_0DB_SNB_B;
Zhenyu Wange3421a12010-04-08 09:43:27 +08003343 }
3344}
3345
Keith Packard1a2eb462011-11-16 16:26:07 -08003346/* Gen7's DP voltage swing and pre-emphasis control */
3347static uint32_t
Daniel Vetter5829975c2015-04-16 11:36:52 +02003348gen7_edp_signal_levels(uint8_t train_set)
Keith Packard1a2eb462011-11-16 16:26:07 -08003349{
3350 int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK |
3351 DP_TRAIN_PRE_EMPHASIS_MASK);
3352 switch (signal_levels) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303353 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_0:
Keith Packard1a2eb462011-11-16 16:26:07 -08003354 return EDP_LINK_TRAIN_400MV_0DB_IVB;
Sonika Jindalbd600182014-08-08 16:23:41 +05303355 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_1:
Keith Packard1a2eb462011-11-16 16:26:07 -08003356 return EDP_LINK_TRAIN_400MV_3_5DB_IVB;
Sonika Jindalbd600182014-08-08 16:23:41 +05303357 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_2:
Keith Packard1a2eb462011-11-16 16:26:07 -08003358 return EDP_LINK_TRAIN_400MV_6DB_IVB;
3359
Sonika Jindalbd600182014-08-08 16:23:41 +05303360 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_0:
Keith Packard1a2eb462011-11-16 16:26:07 -08003361 return EDP_LINK_TRAIN_600MV_0DB_IVB;
Sonika Jindalbd600182014-08-08 16:23:41 +05303362 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_1:
Keith Packard1a2eb462011-11-16 16:26:07 -08003363 return EDP_LINK_TRAIN_600MV_3_5DB_IVB;
3364
Sonika Jindalbd600182014-08-08 16:23:41 +05303365 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_0:
Keith Packard1a2eb462011-11-16 16:26:07 -08003366 return EDP_LINK_TRAIN_800MV_0DB_IVB;
Sonika Jindalbd600182014-08-08 16:23:41 +05303367 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_1:
Keith Packard1a2eb462011-11-16 16:26:07 -08003368 return EDP_LINK_TRAIN_800MV_3_5DB_IVB;
3369
3370 default:
3371 DRM_DEBUG_KMS("Unsupported voltage swing/pre-emphasis level:"
3372 "0x%x\n", signal_levels);
3373 return EDP_LINK_TRAIN_500MV_0DB_IVB;
3374 }
3375}
3376
Paulo Zanonid6c0d722012-10-15 15:51:34 -03003377/* Gen7.5's (HSW) DP voltage swing and pre-emphasis control */
3378static uint32_t
Daniel Vetter5829975c2015-04-16 11:36:52 +02003379hsw_signal_levels(uint8_t train_set)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003380{
Paulo Zanonid6c0d722012-10-15 15:51:34 -03003381 int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK |
3382 DP_TRAIN_PRE_EMPHASIS_MASK);
3383 switch (signal_levels) {
Sonika Jindalbd600182014-08-08 16:23:41 +05303384 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_0:
Sonika Jindalc5fe6a02014-08-11 08:57:36 +05303385 return DDI_BUF_TRANS_SELECT(0);
Sonika Jindalbd600182014-08-08 16:23:41 +05303386 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_1:
Sonika Jindalc5fe6a02014-08-11 08:57:36 +05303387 return DDI_BUF_TRANS_SELECT(1);
Sonika Jindalbd600182014-08-08 16:23:41 +05303388 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_2:
Sonika Jindalc5fe6a02014-08-11 08:57:36 +05303389 return DDI_BUF_TRANS_SELECT(2);
Sonika Jindalbd600182014-08-08 16:23:41 +05303390 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_3:
Sonika Jindalc5fe6a02014-08-11 08:57:36 +05303391 return DDI_BUF_TRANS_SELECT(3);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003392
Sonika Jindalbd600182014-08-08 16:23:41 +05303393 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_0:
Sonika Jindalc5fe6a02014-08-11 08:57:36 +05303394 return DDI_BUF_TRANS_SELECT(4);
Sonika Jindalbd600182014-08-08 16:23:41 +05303395 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_1:
Sonika Jindalc5fe6a02014-08-11 08:57:36 +05303396 return DDI_BUF_TRANS_SELECT(5);
Sonika Jindalbd600182014-08-08 16:23:41 +05303397 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_2:
Sonika Jindalc5fe6a02014-08-11 08:57:36 +05303398 return DDI_BUF_TRANS_SELECT(6);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003399
Sonika Jindalbd600182014-08-08 16:23:41 +05303400 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_0:
Sonika Jindalc5fe6a02014-08-11 08:57:36 +05303401 return DDI_BUF_TRANS_SELECT(7);
Sonika Jindalbd600182014-08-08 16:23:41 +05303402 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_1:
Sonika Jindalc5fe6a02014-08-11 08:57:36 +05303403 return DDI_BUF_TRANS_SELECT(8);
Sonika Jindal7ad14a22015-02-25 10:29:12 +05303404
3405 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3 | DP_TRAIN_PRE_EMPH_LEVEL_0:
3406 return DDI_BUF_TRANS_SELECT(9);
Paulo Zanonid6c0d722012-10-15 15:51:34 -03003407 default:
3408 DRM_DEBUG_KMS("Unsupported voltage swing/pre-emphasis level:"
3409 "0x%x\n", signal_levels);
Sonika Jindalc5fe6a02014-08-11 08:57:36 +05303410 return DDI_BUF_TRANS_SELECT(0);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003411 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003412}
3413
Daniel Vetter5829975c2015-04-16 11:36:52 +02003414static void bxt_signal_levels(struct intel_dp *intel_dp)
Vandana Kannan96fb9f92014-11-18 15:45:27 +05303415{
3416 struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
3417 enum port port = dport->port;
3418 struct drm_device *dev = dport->base.base.dev;
3419 struct intel_encoder *encoder = &dport->base;
3420 uint8_t train_set = intel_dp->train_set[0];
3421 uint32_t level = 0;
3422
3423 int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK |
3424 DP_TRAIN_PRE_EMPHASIS_MASK);
3425 switch (signal_levels) {
3426 default:
3427 DRM_DEBUG_KMS("Unsupported voltage swing/pre-emph level\n");
3428 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_0:
3429 level = 0;
3430 break;
3431 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_1:
3432 level = 1;
3433 break;
3434 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_2:
3435 level = 2;
3436 break;
3437 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_3:
3438 level = 3;
3439 break;
3440 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_0:
3441 level = 4;
3442 break;
3443 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_1:
3444 level = 5;
3445 break;
3446 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_2:
3447 level = 6;
3448 break;
3449 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_0:
3450 level = 7;
3451 break;
3452 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_1:
3453 level = 8;
3454 break;
3455 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3 | DP_TRAIN_PRE_EMPH_LEVEL_0:
3456 level = 9;
3457 break;
3458 }
3459
3460 bxt_ddi_vswing_sequence(dev, level, port, encoder->type);
3461}
3462
Paulo Zanonif0a34242012-12-06 16:51:50 -02003463/* Properly updates "DP" with the correct signal levels. */
3464static void
3465intel_dp_set_signal_levels(struct intel_dp *intel_dp, uint32_t *DP)
3466{
3467 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Imre Deakbc7d38a2013-05-16 14:40:36 +03003468 enum port port = intel_dig_port->port;
Paulo Zanonif0a34242012-12-06 16:51:50 -02003469 struct drm_device *dev = intel_dig_port->base.base.dev;
3470 uint32_t signal_levels, mask;
3471 uint8_t train_set = intel_dp->train_set[0];
3472
Vandana Kannan96fb9f92014-11-18 15:45:27 +05303473 if (IS_BROXTON(dev)) {
3474 signal_levels = 0;
Daniel Vetter5829975c2015-04-16 11:36:52 +02003475 bxt_signal_levels(intel_dp);
Vandana Kannan96fb9f92014-11-18 15:45:27 +05303476 mask = 0;
3477 } else if (HAS_DDI(dev)) {
Daniel Vetter5829975c2015-04-16 11:36:52 +02003478 signal_levels = hsw_signal_levels(train_set);
Paulo Zanonif0a34242012-12-06 16:51:50 -02003479 mask = DDI_BUF_EMP_MASK;
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003480 } else if (IS_CHERRYVIEW(dev)) {
Daniel Vetter5829975c2015-04-16 11:36:52 +02003481 signal_levels = chv_signal_levels(intel_dp);
Chon Ming Leee4a1d842014-04-09 13:28:20 +03003482 mask = 0;
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003483 } else if (IS_VALLEYVIEW(dev)) {
Daniel Vetter5829975c2015-04-16 11:36:52 +02003484 signal_levels = vlv_signal_levels(intel_dp);
Pallavi Ge2fa6fb2013-04-18 14:44:28 -07003485 mask = 0;
Imre Deakbc7d38a2013-05-16 14:40:36 +03003486 } else if (IS_GEN7(dev) && port == PORT_A) {
Daniel Vetter5829975c2015-04-16 11:36:52 +02003487 signal_levels = gen7_edp_signal_levels(train_set);
Paulo Zanonif0a34242012-12-06 16:51:50 -02003488 mask = EDP_LINK_TRAIN_VOL_EMP_MASK_IVB;
Imre Deakbc7d38a2013-05-16 14:40:36 +03003489 } else if (IS_GEN6(dev) && port == PORT_A) {
Daniel Vetter5829975c2015-04-16 11:36:52 +02003490 signal_levels = gen6_edp_signal_levels(train_set);
Paulo Zanonif0a34242012-12-06 16:51:50 -02003491 mask = EDP_LINK_TRAIN_VOL_EMP_MASK_SNB;
3492 } else {
Daniel Vetter5829975c2015-04-16 11:36:52 +02003493 signal_levels = gen4_signal_levels(train_set);
Paulo Zanonif0a34242012-12-06 16:51:50 -02003494 mask = DP_VOLTAGE_MASK | DP_PRE_EMPHASIS_MASK;
3495 }
3496
Vandana Kannan96fb9f92014-11-18 15:45:27 +05303497 if (mask)
3498 DRM_DEBUG_KMS("Using signal levels %08x\n", signal_levels);
3499
3500 DRM_DEBUG_KMS("Using vswing level %d\n",
3501 train_set & DP_TRAIN_VOLTAGE_SWING_MASK);
3502 DRM_DEBUG_KMS("Using pre-emphasis level %d\n",
3503 (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) >>
3504 DP_TRAIN_PRE_EMPHASIS_SHIFT);
Paulo Zanonif0a34242012-12-06 16:51:50 -02003505
3506 *DP = (*DP & ~mask) | signal_levels;
3507}
3508
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003509static bool
Chris Wilsonea5b2132010-08-04 13:50:23 +01003510intel_dp_set_link_train(struct intel_dp *intel_dp,
Jani Nikula70aff662013-09-27 15:10:44 +03003511 uint32_t *DP,
Chris Wilson58e10eb2010-10-03 10:56:11 +01003512 uint8_t dp_train_pat)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003513{
Paulo Zanoni174edf12012-10-26 19:05:50 -02003514 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3515 struct drm_device *dev = intel_dig_port->base.base.dev;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003516 struct drm_i915_private *dev_priv = dev->dev_private;
Jani Nikula2cdfe6c2013-10-04 15:08:48 +03003517 uint8_t buf[sizeof(intel_dp->train_set) + 1];
3518 int ret, len;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003519
Ville Syrjälä7b13b582014-08-18 22:16:08 +03003520 _intel_dp_set_link_train(intel_dp, DP, dp_train_pat);
Paulo Zanoni47ea7542012-07-17 16:55:16 -03003521
Jani Nikula70aff662013-09-27 15:10:44 +03003522 I915_WRITE(intel_dp->output_reg, *DP);
Chris Wilsonea5b2132010-08-04 13:50:23 +01003523 POSTING_READ(intel_dp->output_reg);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003524
Jani Nikula2cdfe6c2013-10-04 15:08:48 +03003525 buf[0] = dp_train_pat;
3526 if ((dp_train_pat & DP_TRAINING_PATTERN_MASK) ==
Paulo Zanoni47ea7542012-07-17 16:55:16 -03003527 DP_TRAINING_PATTERN_DISABLE) {
Jani Nikula2cdfe6c2013-10-04 15:08:48 +03003528 /* don't write DP_TRAINING_LANEx_SET on disable */
3529 len = 1;
3530 } else {
3531 /* DP_TRAINING_LANEx_SET follow DP_TRAINING_PATTERN_SET */
3532 memcpy(buf + 1, intel_dp->train_set, intel_dp->lane_count);
3533 len = intel_dp->lane_count + 1;
Paulo Zanoni47ea7542012-07-17 16:55:16 -03003534 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003535
Jani Nikula9d1a1032014-03-14 16:51:15 +02003536 ret = drm_dp_dpcd_write(&intel_dp->aux, DP_TRAINING_PATTERN_SET,
3537 buf, len);
Jani Nikula2cdfe6c2013-10-04 15:08:48 +03003538
3539 return ret == len;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003540}
3541
Jani Nikula70aff662013-09-27 15:10:44 +03003542static bool
3543intel_dp_reset_link_train(struct intel_dp *intel_dp, uint32_t *DP,
3544 uint8_t dp_train_pat)
3545{
Jani Nikula953d22e2013-10-04 15:08:47 +03003546 memset(intel_dp->train_set, 0, sizeof(intel_dp->train_set));
Jani Nikula70aff662013-09-27 15:10:44 +03003547 intel_dp_set_signal_levels(intel_dp, DP);
3548 return intel_dp_set_link_train(intel_dp, DP, dp_train_pat);
3549}
3550
3551static bool
3552intel_dp_update_link_train(struct intel_dp *intel_dp, uint32_t *DP,
Jani Nikula0301b3a2013-10-15 09:36:08 +03003553 const uint8_t link_status[DP_LINK_STATUS_SIZE])
Jani Nikula70aff662013-09-27 15:10:44 +03003554{
3555 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3556 struct drm_device *dev = intel_dig_port->base.base.dev;
3557 struct drm_i915_private *dev_priv = dev->dev_private;
3558 int ret;
3559
3560 intel_get_adjust_train(intel_dp, link_status);
3561 intel_dp_set_signal_levels(intel_dp, DP);
3562
3563 I915_WRITE(intel_dp->output_reg, *DP);
3564 POSTING_READ(intel_dp->output_reg);
3565
Jani Nikula9d1a1032014-03-14 16:51:15 +02003566 ret = drm_dp_dpcd_write(&intel_dp->aux, DP_TRAINING_LANE0_SET,
3567 intel_dp->train_set, intel_dp->lane_count);
Jani Nikula70aff662013-09-27 15:10:44 +03003568
3569 return ret == intel_dp->lane_count;
3570}
3571
Imre Deak3ab9c632013-05-03 12:57:41 +03003572static void intel_dp_set_idle_link_train(struct intel_dp *intel_dp)
3573{
3574 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3575 struct drm_device *dev = intel_dig_port->base.base.dev;
3576 struct drm_i915_private *dev_priv = dev->dev_private;
3577 enum port port = intel_dig_port->port;
3578 uint32_t val;
3579
3580 if (!HAS_DDI(dev))
3581 return;
3582
3583 val = I915_READ(DP_TP_CTL(port));
3584 val &= ~DP_TP_CTL_LINK_TRAIN_MASK;
3585 val |= DP_TP_CTL_LINK_TRAIN_IDLE;
3586 I915_WRITE(DP_TP_CTL(port), val);
3587
3588 /*
3589 * On PORT_A we can have only eDP in SST mode. There the only reason
3590 * we need to set idle transmission mode is to work around a HW issue
3591 * where we enable the pipe while not in idle link-training mode.
3592 * In this case there is requirement to wait for a minimum number of
3593 * idle patterns to be sent.
3594 */
3595 if (port == PORT_A)
3596 return;
3597
3598 if (wait_for((I915_READ(DP_TP_STATUS(port)) & DP_TP_STATUS_IDLE_DONE),
3599 1))
3600 DRM_ERROR("Timed out waiting for DP idle patterns\n");
3601}
3602
Jesse Barnes33a34e42010-09-08 12:42:02 -07003603/* Enable corresponding port and start training pattern 1 */
Paulo Zanonic19b0662012-10-15 15:51:41 -03003604void
Jesse Barnes33a34e42010-09-08 12:42:02 -07003605intel_dp_start_link_train(struct intel_dp *intel_dp)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003606{
Paulo Zanonida63a9f2012-10-26 19:05:46 -02003607 struct drm_encoder *encoder = &dp_to_dig_port(intel_dp)->base.base;
Paulo Zanonic19b0662012-10-15 15:51:41 -03003608 struct drm_device *dev = encoder->dev;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003609 int i;
3610 uint8_t voltage;
Keith Packardcdb0e952011-11-01 20:00:06 -07003611 int voltage_tries, loop_tries;
Chris Wilsonea5b2132010-08-04 13:50:23 +01003612 uint32_t DP = intel_dp->DP;
Jani Nikula6aba5b62013-10-04 15:08:10 +03003613 uint8_t link_config[2];
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003614
Paulo Zanoniaffa9352012-11-23 15:30:39 -02003615 if (HAS_DDI(dev))
Paulo Zanonic19b0662012-10-15 15:51:41 -03003616 intel_ddi_prepare_link_retrain(encoder);
3617
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003618 /* Write the link configuration data */
Jani Nikula6aba5b62013-10-04 15:08:10 +03003619 link_config[0] = intel_dp->link_bw;
3620 link_config[1] = intel_dp->lane_count;
3621 if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
3622 link_config[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
Jani Nikula9d1a1032014-03-14 16:51:15 +02003623 drm_dp_dpcd_write(&intel_dp->aux, DP_LINK_BW_SET, link_config, 2);
Ville Syrjälä94ca7192015-03-13 19:40:31 +02003624 if (intel_dp->num_sink_rates)
Sonika Jindala8f3ef62015-03-05 10:02:30 +05303625 drm_dp_dpcd_write(&intel_dp->aux, DP_LINK_RATE_SET,
3626 &intel_dp->rate_select, 1);
Jani Nikula6aba5b62013-10-04 15:08:10 +03003627
3628 link_config[0] = 0;
3629 link_config[1] = DP_SET_ANSI_8B10B;
Jani Nikula9d1a1032014-03-14 16:51:15 +02003630 drm_dp_dpcd_write(&intel_dp->aux, DP_DOWNSPREAD_CTRL, link_config, 2);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003631
3632 DP |= DP_PORT_EN;
Keith Packard1a2eb462011-11-16 16:26:07 -08003633
Jani Nikula70aff662013-09-27 15:10:44 +03003634 /* clock recovery */
3635 if (!intel_dp_reset_link_train(intel_dp, &DP,
3636 DP_TRAINING_PATTERN_1 |
3637 DP_LINK_SCRAMBLING_DISABLE)) {
3638 DRM_ERROR("failed to enable link training\n");
3639 return;
3640 }
3641
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003642 voltage = 0xff;
Keith Packardcdb0e952011-11-01 20:00:06 -07003643 voltage_tries = 0;
3644 loop_tries = 0;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003645 for (;;) {
Jani Nikula70aff662013-09-27 15:10:44 +03003646 uint8_t link_status[DP_LINK_STATUS_SIZE];
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003647
Daniel Vettera7c96552012-10-18 10:15:30 +02003648 drm_dp_link_train_clock_recovery_delay(intel_dp->dpcd);
Keith Packard93f62da2011-11-01 19:45:03 -07003649 if (!intel_dp_get_link_status(intel_dp, link_status)) {
3650 DRM_ERROR("failed to get link status\n");
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003651 break;
Keith Packard93f62da2011-11-01 19:45:03 -07003652 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003653
Daniel Vetter01916272012-10-18 10:15:25 +02003654 if (drm_dp_clock_recovery_ok(link_status, intel_dp->lane_count)) {
Keith Packard93f62da2011-11-01 19:45:03 -07003655 DRM_DEBUG_KMS("clock recovery OK\n");
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003656 break;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003657 }
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003658
3659 /* Check to see if we've tried the max voltage */
3660 for (i = 0; i < intel_dp->lane_count; i++)
3661 if ((intel_dp->train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0)
3662 break;
Takashi Iwai3b4f8192013-03-11 18:40:16 +01003663 if (i == intel_dp->lane_count) {
Daniel Vetterb06fbda2012-10-16 09:50:25 +02003664 ++loop_tries;
3665 if (loop_tries == 5) {
Jani Nikula3def84b2013-10-05 16:13:56 +03003666 DRM_ERROR("too many full retries, give up\n");
Keith Packardcdb0e952011-11-01 20:00:06 -07003667 break;
3668 }
Jani Nikula70aff662013-09-27 15:10:44 +03003669 intel_dp_reset_link_train(intel_dp, &DP,
3670 DP_TRAINING_PATTERN_1 |
3671 DP_LINK_SCRAMBLING_DISABLE);
Keith Packardcdb0e952011-11-01 20:00:06 -07003672 voltage_tries = 0;
3673 continue;
3674 }
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003675
3676 /* Check to see if we've tried the same voltage 5 times */
Daniel Vetterb06fbda2012-10-16 09:50:25 +02003677 if ((intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) == voltage) {
Chris Wilson24773672012-09-26 16:48:30 +01003678 ++voltage_tries;
Daniel Vetterb06fbda2012-10-16 09:50:25 +02003679 if (voltage_tries == 5) {
Jani Nikula3def84b2013-10-05 16:13:56 +03003680 DRM_ERROR("too many voltage retries, give up\n");
Daniel Vetterb06fbda2012-10-16 09:50:25 +02003681 break;
3682 }
3683 } else
3684 voltage_tries = 0;
3685 voltage = intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK;
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003686
Jani Nikula70aff662013-09-27 15:10:44 +03003687 /* Update training set as requested by target */
3688 if (!intel_dp_update_link_train(intel_dp, &DP, link_status)) {
3689 DRM_ERROR("failed to update link training\n");
3690 break;
3691 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003692 }
3693
Jesse Barnes33a34e42010-09-08 12:42:02 -07003694 intel_dp->DP = DP;
3695}
3696
Paulo Zanonic19b0662012-10-15 15:51:41 -03003697void
Jesse Barnes33a34e42010-09-08 12:42:02 -07003698intel_dp_complete_link_train(struct intel_dp *intel_dp)
3699{
Jesse Barnes33a34e42010-09-08 12:42:02 -07003700 bool channel_eq = false;
Jesse Barnes37f80972011-01-05 14:45:24 -08003701 int tries, cr_tries;
Jesse Barnes33a34e42010-09-08 12:42:02 -07003702 uint32_t DP = intel_dp->DP;
Todd Previte06ea66b2014-01-20 10:19:39 -07003703 uint32_t training_pattern = DP_TRAINING_PATTERN_2;
3704
3705 /* Training Pattern 3 for HBR2 ot 1.2 devices that support it*/
3706 if (intel_dp->link_bw == DP_LINK_BW_5_4 || intel_dp->use_tps3)
3707 training_pattern = DP_TRAINING_PATTERN_3;
Jesse Barnes33a34e42010-09-08 12:42:02 -07003708
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003709 /* channel equalization */
Jani Nikula70aff662013-09-27 15:10:44 +03003710 if (!intel_dp_set_link_train(intel_dp, &DP,
Todd Previte06ea66b2014-01-20 10:19:39 -07003711 training_pattern |
Jani Nikula70aff662013-09-27 15:10:44 +03003712 DP_LINK_SCRAMBLING_DISABLE)) {
3713 DRM_ERROR("failed to start channel equalization\n");
3714 return;
3715 }
3716
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003717 tries = 0;
Jesse Barnes37f80972011-01-05 14:45:24 -08003718 cr_tries = 0;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003719 channel_eq = false;
3720 for (;;) {
Jani Nikula70aff662013-09-27 15:10:44 +03003721 uint8_t link_status[DP_LINK_STATUS_SIZE];
Zhenyu Wange3421a12010-04-08 09:43:27 +08003722
Jesse Barnes37f80972011-01-05 14:45:24 -08003723 if (cr_tries > 5) {
3724 DRM_ERROR("failed to train DP, aborting\n");
Jesse Barnes37f80972011-01-05 14:45:24 -08003725 break;
3726 }
3727
Daniel Vettera7c96552012-10-18 10:15:30 +02003728 drm_dp_link_train_channel_eq_delay(intel_dp->dpcd);
Jani Nikula70aff662013-09-27 15:10:44 +03003729 if (!intel_dp_get_link_status(intel_dp, link_status)) {
3730 DRM_ERROR("failed to get link status\n");
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003731 break;
Jani Nikula70aff662013-09-27 15:10:44 +03003732 }
Jesse Barnes869184a2010-10-07 16:01:22 -07003733
Jesse Barnes37f80972011-01-05 14:45:24 -08003734 /* Make sure clock is still ok */
Daniel Vetter01916272012-10-18 10:15:25 +02003735 if (!drm_dp_clock_recovery_ok(link_status, intel_dp->lane_count)) {
Jesse Barnes37f80972011-01-05 14:45:24 -08003736 intel_dp_start_link_train(intel_dp);
Jani Nikula70aff662013-09-27 15:10:44 +03003737 intel_dp_set_link_train(intel_dp, &DP,
Todd Previte06ea66b2014-01-20 10:19:39 -07003738 training_pattern |
Jani Nikula70aff662013-09-27 15:10:44 +03003739 DP_LINK_SCRAMBLING_DISABLE);
Jesse Barnes37f80972011-01-05 14:45:24 -08003740 cr_tries++;
3741 continue;
3742 }
3743
Daniel Vetter1ffdff12012-10-18 10:15:24 +02003744 if (drm_dp_channel_eq_ok(link_status, intel_dp->lane_count)) {
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003745 channel_eq = true;
3746 break;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003747 }
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003748
Jesse Barnes37f80972011-01-05 14:45:24 -08003749 /* Try 5 times, then try clock recovery if that fails */
3750 if (tries > 5) {
Jesse Barnes37f80972011-01-05 14:45:24 -08003751 intel_dp_start_link_train(intel_dp);
Jani Nikula70aff662013-09-27 15:10:44 +03003752 intel_dp_set_link_train(intel_dp, &DP,
Todd Previte06ea66b2014-01-20 10:19:39 -07003753 training_pattern |
Jani Nikula70aff662013-09-27 15:10:44 +03003754 DP_LINK_SCRAMBLING_DISABLE);
Jesse Barnes37f80972011-01-05 14:45:24 -08003755 tries = 0;
3756 cr_tries++;
3757 continue;
3758 }
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003759
Jani Nikula70aff662013-09-27 15:10:44 +03003760 /* Update training set as requested by target */
3761 if (!intel_dp_update_link_train(intel_dp, &DP, link_status)) {
3762 DRM_ERROR("failed to update link training\n");
3763 break;
3764 }
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003765 ++tries;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003766 }
Chris Wilson3cf2efb2010-11-29 10:09:55 +00003767
Imre Deak3ab9c632013-05-03 12:57:41 +03003768 intel_dp_set_idle_link_train(intel_dp);
3769
3770 intel_dp->DP = DP;
3771
Paulo Zanonid6c0d722012-10-15 15:51:34 -03003772 if (channel_eq)
Masanari Iida07f42252013-03-20 11:00:34 +09003773 DRM_DEBUG_KMS("Channel EQ done. DP Training successful\n");
Paulo Zanonid6c0d722012-10-15 15:51:34 -03003774
Imre Deak3ab9c632013-05-03 12:57:41 +03003775}
3776
3777void intel_dp_stop_link_train(struct intel_dp *intel_dp)
3778{
Jani Nikula70aff662013-09-27 15:10:44 +03003779 intel_dp_set_link_train(intel_dp, &intel_dp->DP,
Imre Deak3ab9c632013-05-03 12:57:41 +03003780 DP_TRAINING_PATTERN_DISABLE);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003781}
3782
3783static void
Chris Wilsonea5b2132010-08-04 13:50:23 +01003784intel_dp_link_down(struct intel_dp *intel_dp)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003785{
Paulo Zanonida63a9f2012-10-26 19:05:46 -02003786 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Imre Deakbc7d38a2013-05-16 14:40:36 +03003787 enum port port = intel_dig_port->port;
Paulo Zanonida63a9f2012-10-26 19:05:46 -02003788 struct drm_device *dev = intel_dig_port->base.base.dev;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003789 struct drm_i915_private *dev_priv = dev->dev_private;
Chris Wilsonea5b2132010-08-04 13:50:23 +01003790 uint32_t DP = intel_dp->DP;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003791
Daniel Vetterbc76e3202014-05-20 22:46:50 +02003792 if (WARN_ON(HAS_DDI(dev)))
Paulo Zanonic19b0662012-10-15 15:51:41 -03003793 return;
3794
Daniel Vetter0c33d8d2012-09-06 22:15:43 +02003795 if (WARN_ON((I915_READ(intel_dp->output_reg) & DP_PORT_EN) == 0))
Chris Wilson1b39d6f2010-12-06 11:20:45 +00003796 return;
3797
Zhao Yakui28c97732009-10-09 11:39:41 +08003798 DRM_DEBUG_KMS("\n");
Zhenyu Wang32f9d652009-07-24 01:00:32 +08003799
Imre Deakbc7d38a2013-05-16 14:40:36 +03003800 if (HAS_PCH_CPT(dev) && (IS_GEN7(dev) || port != PORT_A)) {
Zhenyu Wange3421a12010-04-08 09:43:27 +08003801 DP &= ~DP_LINK_TRAIN_MASK_CPT;
Chris Wilsonea5b2132010-08-04 13:50:23 +01003802 I915_WRITE(intel_dp->output_reg, DP | DP_LINK_TRAIN_PAT_IDLE_CPT);
Zhenyu Wange3421a12010-04-08 09:43:27 +08003803 } else {
Ville Syrjäläaad3d142014-06-28 02:04:25 +03003804 if (IS_CHERRYVIEW(dev))
3805 DP &= ~DP_LINK_TRAIN_MASK_CHV;
3806 else
3807 DP &= ~DP_LINK_TRAIN_MASK;
Chris Wilsonea5b2132010-08-04 13:50:23 +01003808 I915_WRITE(intel_dp->output_reg, DP | DP_LINK_TRAIN_PAT_IDLE);
Zhenyu Wange3421a12010-04-08 09:43:27 +08003809 }
Chris Wilsonfe255d02010-09-11 21:37:48 +01003810 POSTING_READ(intel_dp->output_reg);
Zhenyu Wang5eb08b62009-07-24 01:00:31 +08003811
Daniel Vetter493a7082012-05-30 12:31:56 +02003812 if (HAS_PCH_IBX(dev) &&
Chris Wilson1b39d6f2010-12-06 11:20:45 +00003813 I915_READ(intel_dp->output_reg) & DP_PIPEB_SELECT) {
Eric Anholt5bddd172010-11-18 09:32:59 +08003814 /* Hardware workaround: leaving our transcoder select
3815 * set to transcoder B while it's off will prevent the
3816 * corresponding HDMI output on transcoder A.
3817 *
3818 * Combine this with another hardware workaround:
3819 * transcoder select bit can only be cleared while the
3820 * port is enabled.
3821 */
3822 DP &= ~DP_PIPEB_SELECT;
3823 I915_WRITE(intel_dp->output_reg, DP);
Daniel Vetter0ca09682014-11-24 16:54:11 +01003824 POSTING_READ(intel_dp->output_reg);
Eric Anholt5bddd172010-11-18 09:32:59 +08003825 }
3826
Wu Fengguang832afda2011-12-09 20:42:21 +08003827 DP &= ~DP_AUDIO_OUTPUT_ENABLE;
Chris Wilsonea5b2132010-08-04 13:50:23 +01003828 I915_WRITE(intel_dp->output_reg, DP & ~DP_PORT_EN);
3829 POSTING_READ(intel_dp->output_reg);
Keith Packardf01eca22011-09-28 16:48:10 -07003830 msleep(intel_dp->panel_power_down_delay);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07003831}
3832
Keith Packard26d61aa2011-07-25 20:01:09 -07003833static bool
3834intel_dp_get_dpcd(struct intel_dp *intel_dp)
Keith Packard92fd8fd2011-07-25 19:50:10 -07003835{
Rodrigo Vivia031d702013-10-03 16:15:06 -03003836 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
3837 struct drm_device *dev = dig_port->base.base.dev;
3838 struct drm_i915_private *dev_priv = dev->dev_private;
Sonika Jindalfc0f8e22015-03-05 10:03:58 +05303839 uint8_t rev;
Rodrigo Vivia031d702013-10-03 16:15:06 -03003840
Jani Nikula9d1a1032014-03-14 16:51:15 +02003841 if (intel_dp_dpcd_read_wake(&intel_dp->aux, 0x000, intel_dp->dpcd,
3842 sizeof(intel_dp->dpcd)) < 0)
Adam Jacksonedb39242012-09-18 10:58:49 -04003843 return false; /* aux transfer failed */
Keith Packard92fd8fd2011-07-25 19:50:10 -07003844
Andy Shevchenkoa8e98152014-09-01 14:12:01 +03003845 DRM_DEBUG_KMS("DPCD: %*ph\n", (int) sizeof(intel_dp->dpcd), intel_dp->dpcd);
Damien Lespiau577c7a52012-12-13 16:09:02 +00003846
Adam Jacksonedb39242012-09-18 10:58:49 -04003847 if (intel_dp->dpcd[DP_DPCD_REV] == 0)
3848 return false; /* DPCD not present */
3849
Shobhit Kumar2293bb52013-07-11 18:44:56 -03003850 /* Check if the panel supports PSR */
3851 memset(intel_dp->psr_dpcd, 0, sizeof(intel_dp->psr_dpcd));
Jani Nikula50003932013-09-20 16:42:17 +03003852 if (is_edp(intel_dp)) {
Jani Nikula9d1a1032014-03-14 16:51:15 +02003853 intel_dp_dpcd_read_wake(&intel_dp->aux, DP_PSR_SUPPORT,
3854 intel_dp->psr_dpcd,
3855 sizeof(intel_dp->psr_dpcd));
Rodrigo Vivia031d702013-10-03 16:15:06 -03003856 if (intel_dp->psr_dpcd[0] & DP_PSR_IS_SUPPORTED) {
3857 dev_priv->psr.sink_support = true;
Jani Nikula50003932013-09-20 16:42:17 +03003858 DRM_DEBUG_KMS("Detected EDP PSR Panel.\n");
Rodrigo Vivia031d702013-10-03 16:15:06 -03003859 }
Sonika Jindal474d1ec2015-04-02 11:02:44 +05303860
3861 if (INTEL_INFO(dev)->gen >= 9 &&
3862 (intel_dp->psr_dpcd[0] & DP_PSR2_IS_SUPPORTED)) {
3863 uint8_t frame_sync_cap;
3864
3865 dev_priv->psr.sink_support = true;
3866 intel_dp_dpcd_read_wake(&intel_dp->aux,
3867 DP_SINK_DEVICE_AUX_FRAME_SYNC_CAP,
3868 &frame_sync_cap, 1);
3869 dev_priv->psr.aux_frame_sync = frame_sync_cap ? true : false;
3870 /* PSR2 needs frame sync as well */
3871 dev_priv->psr.psr2_support = dev_priv->psr.aux_frame_sync;
3872 DRM_DEBUG_KMS("PSR2 %s on sink",
3873 dev_priv->psr.psr2_support ? "supported" : "not supported");
3874 }
Jani Nikula50003932013-09-20 16:42:17 +03003875 }
3876
Jani Nikula7809a612014-10-29 11:03:26 +02003877 /* Training Pattern 3 support, both source and sink */
Todd Previte06ea66b2014-01-20 10:19:39 -07003878 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x12 &&
Jani Nikula7809a612014-10-29 11:03:26 +02003879 intel_dp->dpcd[DP_MAX_LANE_COUNT] & DP_TPS3_SUPPORTED &&
3880 (IS_HASWELL(dev_priv) || INTEL_INFO(dev_priv)->gen >= 8)) {
Todd Previte06ea66b2014-01-20 10:19:39 -07003881 intel_dp->use_tps3 = true;
Jani Nikulaf8d8a672014-09-05 16:19:18 +03003882 DRM_DEBUG_KMS("Displayport TPS3 supported\n");
Todd Previte06ea66b2014-01-20 10:19:39 -07003883 } else
3884 intel_dp->use_tps3 = false;
3885
Sonika Jindalfc0f8e22015-03-05 10:03:58 +05303886 /* Intermediate frequency support */
3887 if (is_edp(intel_dp) &&
3888 (intel_dp->dpcd[DP_EDP_CONFIGURATION_CAP] & DP_DPCD_DISPLAY_CONTROL_CAPABLE) &&
3889 (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_EDP_DPCD_REV, &rev, 1) == 1) &&
3890 (rev >= 0x03)) { /* eDp v1.4 or higher */
Ville Syrjälä94ca7192015-03-13 19:40:31 +02003891 __le16 sink_rates[DP_MAX_SUPPORTED_RATES];
Ville Syrjäläea2d8a42015-03-12 17:10:28 +02003892 int i;
3893
Sonika Jindalfc0f8e22015-03-05 10:03:58 +05303894 intel_dp_dpcd_read_wake(&intel_dp->aux,
3895 DP_SUPPORTED_LINK_RATES,
Ville Syrjälä94ca7192015-03-13 19:40:31 +02003896 sink_rates,
3897 sizeof(sink_rates));
Ville Syrjäläea2d8a42015-03-12 17:10:28 +02003898
Ville Syrjälä94ca7192015-03-13 19:40:31 +02003899 for (i = 0; i < ARRAY_SIZE(sink_rates); i++) {
3900 int val = le16_to_cpu(sink_rates[i]);
Ville Syrjäläea2d8a42015-03-12 17:10:28 +02003901
3902 if (val == 0)
3903 break;
3904
Ville Syrjälä94ca7192015-03-13 19:40:31 +02003905 intel_dp->sink_rates[i] = val * 200;
Ville Syrjäläea2d8a42015-03-12 17:10:28 +02003906 }
Ville Syrjälä94ca7192015-03-13 19:40:31 +02003907 intel_dp->num_sink_rates = i;
Sonika Jindalfc0f8e22015-03-05 10:03:58 +05303908 }
Ville Syrjälä0336400e2015-03-12 17:10:39 +02003909
3910 intel_dp_print_rates(intel_dp);
3911
Adam Jacksonedb39242012-09-18 10:58:49 -04003912 if (!(intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] &
3913 DP_DWN_STRM_PORT_PRESENT))
3914 return true; /* native DP sink */
3915
3916 if (intel_dp->dpcd[DP_DPCD_REV] == 0x10)
3917 return true; /* no per-port downstream info */
3918
Jani Nikula9d1a1032014-03-14 16:51:15 +02003919 if (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_DOWNSTREAM_PORT_0,
3920 intel_dp->downstream_ports,
3921 DP_MAX_DOWNSTREAM_PORTS) < 0)
Adam Jacksonedb39242012-09-18 10:58:49 -04003922 return false; /* downstream port status fetch failed */
3923
3924 return true;
Keith Packard92fd8fd2011-07-25 19:50:10 -07003925}
3926
Adam Jackson0d198322012-05-14 16:05:47 -04003927static void
3928intel_dp_probe_oui(struct intel_dp *intel_dp)
3929{
3930 u8 buf[3];
3931
3932 if (!(intel_dp->dpcd[DP_DOWN_STREAM_PORT_COUNT] & DP_OUI_SUPPORT))
3933 return;
3934
Jani Nikula9d1a1032014-03-14 16:51:15 +02003935 if (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_SINK_OUI, buf, 3) == 3)
Adam Jackson0d198322012-05-14 16:05:47 -04003936 DRM_DEBUG_KMS("Sink OUI: %02hx%02hx%02hx\n",
3937 buf[0], buf[1], buf[2]);
3938
Jani Nikula9d1a1032014-03-14 16:51:15 +02003939 if (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_BRANCH_OUI, buf, 3) == 3)
Adam Jackson0d198322012-05-14 16:05:47 -04003940 DRM_DEBUG_KMS("Branch OUI: %02hx%02hx%02hx\n",
3941 buf[0], buf[1], buf[2]);
3942}
3943
Dave Airlie0e32b392014-05-02 14:02:48 +10003944static bool
3945intel_dp_probe_mst(struct intel_dp *intel_dp)
3946{
3947 u8 buf[1];
3948
3949 if (!intel_dp->can_mst)
3950 return false;
3951
3952 if (intel_dp->dpcd[DP_DPCD_REV] < 0x12)
3953 return false;
3954
Dave Airlie0e32b392014-05-02 14:02:48 +10003955 if (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_MSTM_CAP, buf, 1)) {
3956 if (buf[0] & DP_MST_CAP) {
3957 DRM_DEBUG_KMS("Sink is MST capable\n");
3958 intel_dp->is_mst = true;
3959 } else {
3960 DRM_DEBUG_KMS("Sink is not MST capable\n");
3961 intel_dp->is_mst = false;
3962 }
3963 }
Dave Airlie0e32b392014-05-02 14:02:48 +10003964
3965 drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr, intel_dp->is_mst);
3966 return intel_dp->is_mst;
3967}
3968
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003969int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc)
3970{
3971 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3972 struct drm_device *dev = intel_dig_port->base.base.dev;
3973 struct intel_crtc *intel_crtc =
3974 to_intel_crtc(intel_dig_port->base.base.crtc);
Rodrigo Viviad9dc912014-09-16 19:18:12 -04003975 u8 buf;
3976 int test_crc_count;
3977 int attempts = 6;
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003978
Rodrigo Viviad9dc912014-09-16 19:18:12 -04003979 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK_MISC, &buf) < 0)
Rodrigo Vivibda03812014-09-15 19:24:03 -04003980 return -EIO;
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003981
Rodrigo Viviad9dc912014-09-16 19:18:12 -04003982 if (!(buf & DP_TEST_CRC_SUPPORTED))
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003983 return -ENOTTY;
3984
Rodrigo Vivi1dda5f92014-10-01 07:32:37 -07003985 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK, &buf) < 0)
Rodrigo Vivibda03812014-09-15 19:24:03 -04003986 return -EIO;
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003987
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003988 if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK,
Rodrigo Vivice31d9f2014-09-29 18:29:52 -04003989 buf | DP_TEST_SINK_START) < 0)
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02003990 return -EIO;
3991
Rodrigo Vivi1dda5f92014-10-01 07:32:37 -07003992 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK_MISC, &buf) < 0)
3993 return -EIO;
Rodrigo Viviad9dc912014-09-16 19:18:12 -04003994 test_crc_count = buf & DP_TEST_COUNT_MASK;
3995
3996 do {
Rodrigo Vivi1dda5f92014-10-01 07:32:37 -07003997 if (drm_dp_dpcd_readb(&intel_dp->aux,
3998 DP_TEST_SINK_MISC, &buf) < 0)
3999 return -EIO;
Rodrigo Viviad9dc912014-09-16 19:18:12 -04004000 intel_wait_for_vblank(dev, intel_crtc->pipe);
4001 } while (--attempts && (buf & DP_TEST_COUNT_MASK) == test_crc_count);
4002
4003 if (attempts == 0) {
Daniel Vetter90bd1f42014-11-19 11:18:47 +01004004 DRM_DEBUG_KMS("Panel is unable to calculate CRC after 6 vblanks\n");
4005 return -ETIMEDOUT;
Rodrigo Viviad9dc912014-09-16 19:18:12 -04004006 }
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02004007
Jani Nikula9d1a1032014-03-14 16:51:15 +02004008 if (drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_CRC_R_CR, crc, 6) < 0)
Rodrigo Vivibda03812014-09-15 19:24:03 -04004009 return -EIO;
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02004010
Rodrigo Vivi1dda5f92014-10-01 07:32:37 -07004011 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK, &buf) < 0)
4012 return -EIO;
4013 if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK,
4014 buf & ~DP_TEST_SINK_START) < 0)
4015 return -EIO;
Rodrigo Vivice31d9f2014-09-29 18:29:52 -04004016
Rodrigo Vivid2e216d2014-01-24 13:36:17 -02004017 return 0;
4018}
4019
Jesse Barnesa60f0e32011-10-20 15:09:17 -07004020static bool
4021intel_dp_get_sink_irq(struct intel_dp *intel_dp, u8 *sink_irq_vector)
4022{
Jani Nikula9d1a1032014-03-14 16:51:15 +02004023 return intel_dp_dpcd_read_wake(&intel_dp->aux,
4024 DP_DEVICE_SERVICE_IRQ_VECTOR,
4025 sink_irq_vector, 1) == 1;
Jesse Barnesa60f0e32011-10-20 15:09:17 -07004026}
4027
Dave Airlie0e32b392014-05-02 14:02:48 +10004028static bool
4029intel_dp_get_sink_irq_esi(struct intel_dp *intel_dp, u8 *sink_irq_vector)
4030{
4031 int ret;
4032
4033 ret = intel_dp_dpcd_read_wake(&intel_dp->aux,
4034 DP_SINK_COUNT_ESI,
4035 sink_irq_vector, 14);
4036 if (ret != 14)
4037 return false;
4038
4039 return true;
4040}
4041
Jesse Barnesa60f0e32011-10-20 15:09:17 -07004042static void
4043intel_dp_handle_test_request(struct intel_dp *intel_dp)
4044{
4045 /* NAK by default */
Jani Nikula9d1a1032014-03-14 16:51:15 +02004046 drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_RESPONSE, DP_TEST_NAK);
Jesse Barnesa60f0e32011-10-20 15:09:17 -07004047}
4048
Dave Airlie0e32b392014-05-02 14:02:48 +10004049static int
4050intel_dp_check_mst_status(struct intel_dp *intel_dp)
4051{
4052 bool bret;
4053
4054 if (intel_dp->is_mst) {
4055 u8 esi[16] = { 0 };
4056 int ret = 0;
4057 int retry;
4058 bool handled;
4059 bret = intel_dp_get_sink_irq_esi(intel_dp, esi);
4060go_again:
4061 if (bret == true) {
4062
4063 /* check link status - esi[10] = 0x200c */
4064 if (intel_dp->active_mst_links && !drm_dp_channel_eq_ok(&esi[10], intel_dp->lane_count)) {
4065 DRM_DEBUG_KMS("channel EQ not ok, retraining\n");
4066 intel_dp_start_link_train(intel_dp);
4067 intel_dp_complete_link_train(intel_dp);
4068 intel_dp_stop_link_train(intel_dp);
4069 }
4070
Andy Shevchenko6f34cc32015-01-15 13:45:09 +02004071 DRM_DEBUG_KMS("got esi %3ph\n", esi);
Dave Airlie0e32b392014-05-02 14:02:48 +10004072 ret = drm_dp_mst_hpd_irq(&intel_dp->mst_mgr, esi, &handled);
4073
4074 if (handled) {
4075 for (retry = 0; retry < 3; retry++) {
4076 int wret;
4077 wret = drm_dp_dpcd_write(&intel_dp->aux,
4078 DP_SINK_COUNT_ESI+1,
4079 &esi[1], 3);
4080 if (wret == 3) {
4081 break;
4082 }
4083 }
4084
4085 bret = intel_dp_get_sink_irq_esi(intel_dp, esi);
4086 if (bret == true) {
Andy Shevchenko6f34cc32015-01-15 13:45:09 +02004087 DRM_DEBUG_KMS("got esi2 %3ph\n", esi);
Dave Airlie0e32b392014-05-02 14:02:48 +10004088 goto go_again;
4089 }
4090 } else
4091 ret = 0;
4092
4093 return ret;
4094 } else {
4095 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
4096 DRM_DEBUG_KMS("failed to get ESI - device may have failed\n");
4097 intel_dp->is_mst = false;
4098 drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr, intel_dp->is_mst);
4099 /* send a hotplug event */
4100 drm_kms_helper_hotplug_event(intel_dig_port->base.base.dev);
4101 }
4102 }
4103 return -EINVAL;
4104}
4105
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004106/*
4107 * According to DP spec
4108 * 5.1.2:
4109 * 1. Read DPCD
4110 * 2. Configure link according to Receiver Capabilities
4111 * 3. Use Link Training from 2.5.3.3 and 3.5.1.3
4112 * 4. Check link status on receipt of hot-plug interrupt
4113 */
Damien Lespiaua5146202015-02-10 19:32:22 +00004114static void
Chris Wilsonea5b2132010-08-04 13:50:23 +01004115intel_dp_check_link_status(struct intel_dp *intel_dp)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004116{
Dave Airlie5b215bc2014-08-05 10:40:20 +10004117 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Paulo Zanonida63a9f2012-10-26 19:05:46 -02004118 struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base;
Jesse Barnesa60f0e32011-10-20 15:09:17 -07004119 u8 sink_irq_vector;
Keith Packard93f62da2011-11-01 19:45:03 -07004120 u8 link_status[DP_LINK_STATUS_SIZE];
Jesse Barnesa60f0e32011-10-20 15:09:17 -07004121
Dave Airlie5b215bc2014-08-05 10:40:20 +10004122 WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
4123
Paulo Zanonida63a9f2012-10-26 19:05:46 -02004124 if (!intel_encoder->connectors_active)
Keith Packardd2b996a2011-07-25 22:37:51 -07004125 return;
Jesse Barnes59cd09e2011-07-07 11:10:59 -07004126
Paulo Zanonida63a9f2012-10-26 19:05:46 -02004127 if (WARN_ON(!intel_encoder->base.crtc))
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004128 return;
4129
Imre Deak1a125d82014-08-18 14:42:46 +03004130 if (!to_intel_crtc(intel_encoder->base.crtc)->active)
4131 return;
4132
Keith Packard92fd8fd2011-07-25 19:50:10 -07004133 /* Try to read receiver status if the link appears to be up */
Keith Packard93f62da2011-11-01 19:45:03 -07004134 if (!intel_dp_get_link_status(intel_dp, link_status)) {
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004135 return;
4136 }
4137
Keith Packard92fd8fd2011-07-25 19:50:10 -07004138 /* Now read the DPCD to see if it's actually running */
Keith Packard26d61aa2011-07-25 20:01:09 -07004139 if (!intel_dp_get_dpcd(intel_dp)) {
Jesse Barnes59cd09e2011-07-07 11:10:59 -07004140 return;
4141 }
4142
Jesse Barnesa60f0e32011-10-20 15:09:17 -07004143 /* Try to read the source of the interrupt */
4144 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 &&
4145 intel_dp_get_sink_irq(intel_dp, &sink_irq_vector)) {
4146 /* Clear interrupt source */
Jani Nikula9d1a1032014-03-14 16:51:15 +02004147 drm_dp_dpcd_writeb(&intel_dp->aux,
4148 DP_DEVICE_SERVICE_IRQ_VECTOR,
4149 sink_irq_vector);
Jesse Barnesa60f0e32011-10-20 15:09:17 -07004150
4151 if (sink_irq_vector & DP_AUTOMATED_TEST_REQUEST)
4152 intel_dp_handle_test_request(intel_dp);
4153 if (sink_irq_vector & (DP_CP_IRQ | DP_SINK_SPECIFIC_IRQ))
4154 DRM_DEBUG_DRIVER("CP or sink specific irq unhandled\n");
4155 }
4156
Daniel Vetter1ffdff12012-10-18 10:15:24 +02004157 if (!drm_dp_channel_eq_ok(link_status, intel_dp->lane_count)) {
Keith Packard92fd8fd2011-07-25 19:50:10 -07004158 DRM_DEBUG_KMS("%s: channel EQ not ok, retraining\n",
Jani Nikula8e329a02014-06-03 14:56:21 +03004159 intel_encoder->base.name);
Jesse Barnes33a34e42010-09-08 12:42:02 -07004160 intel_dp_start_link_train(intel_dp);
4161 intel_dp_complete_link_train(intel_dp);
Imre Deak3ab9c632013-05-03 12:57:41 +03004162 intel_dp_stop_link_train(intel_dp);
Jesse Barnes33a34e42010-09-08 12:42:02 -07004163 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004164}
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004165
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004166/* XXX this is probably wrong for multiple downstream ports */
Zhenyu Wang5eb08b62009-07-24 01:00:31 +08004167static enum drm_connector_status
Keith Packard26d61aa2011-07-25 20:01:09 -07004168intel_dp_detect_dpcd(struct intel_dp *intel_dp)
Adam Jackson71ba90002011-07-12 17:38:04 -04004169{
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004170 uint8_t *dpcd = intel_dp->dpcd;
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004171 uint8_t type;
4172
4173 if (!intel_dp_get_dpcd(intel_dp))
4174 return connector_status_disconnected;
4175
4176 /* if there's no downstream port, we're done */
4177 if (!(dpcd[DP_DOWNSTREAMPORT_PRESENT] & DP_DWN_STRM_PORT_PRESENT))
Keith Packard26d61aa2011-07-25 20:01:09 -07004178 return connector_status_connected;
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004179
4180 /* If we're HPD-aware, SINK_COUNT changes dynamically */
Jani Nikulac9ff1602013-09-27 14:48:42 +03004181 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 &&
4182 intel_dp->downstream_ports[0] & DP_DS_PORT_HPD) {
Adam Jackson23235172012-09-20 16:42:45 -04004183 uint8_t reg;
Jani Nikula9d1a1032014-03-14 16:51:15 +02004184
4185 if (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_SINK_COUNT,
4186 &reg, 1) < 0)
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004187 return connector_status_unknown;
Jani Nikula9d1a1032014-03-14 16:51:15 +02004188
Adam Jackson23235172012-09-20 16:42:45 -04004189 return DP_GET_SINK_COUNT(reg) ? connector_status_connected
4190 : connector_status_disconnected;
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004191 }
4192
4193 /* If no HPD, poke DDC gently */
Jani Nikula0b998362014-03-14 16:51:17 +02004194 if (drm_probe_ddc(&intel_dp->aux.ddc))
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004195 return connector_status_connected;
4196
4197 /* Well we tried, say unknown for unreliable port types */
Jani Nikulac9ff1602013-09-27 14:48:42 +03004198 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11) {
4199 type = intel_dp->downstream_ports[0] & DP_DS_PORT_TYPE_MASK;
4200 if (type == DP_DS_PORT_TYPE_VGA ||
4201 type == DP_DS_PORT_TYPE_NON_EDID)
4202 return connector_status_unknown;
4203 } else {
4204 type = intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] &
4205 DP_DWN_STRM_PORT_TYPE_MASK;
4206 if (type == DP_DWN_STRM_PORT_TYPE_ANALOG ||
4207 type == DP_DWN_STRM_PORT_TYPE_OTHER)
4208 return connector_status_unknown;
4209 }
Adam Jacksoncaf9ab22012-09-18 10:58:50 -04004210
4211 /* Anything else is out of spec, warn and ignore */
4212 DRM_DEBUG_KMS("Broken DP branch device, ignoring\n");
Keith Packard26d61aa2011-07-25 20:01:09 -07004213 return connector_status_disconnected;
Adam Jackson71ba90002011-07-12 17:38:04 -04004214}
4215
4216static enum drm_connector_status
Chris Wilsond410b562014-09-02 20:03:59 +01004217edp_detect(struct intel_dp *intel_dp)
4218{
4219 struct drm_device *dev = intel_dp_to_dev(intel_dp);
4220 enum drm_connector_status status;
4221
4222 status = intel_panel_detect(dev);
4223 if (status == connector_status_unknown)
4224 status = connector_status_connected;
4225
4226 return status;
4227}
4228
4229static enum drm_connector_status
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004230ironlake_dp_detect(struct intel_dp *intel_dp)
Zhenyu Wang5eb08b62009-07-24 01:00:31 +08004231{
Paulo Zanoni30add222012-10-26 19:05:45 -02004232 struct drm_device *dev = intel_dp_to_dev(intel_dp);
Damien Lespiau1b469632012-12-13 16:09:01 +00004233 struct drm_i915_private *dev_priv = dev->dev_private;
4234 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Jesse Barnes01cb9ea2010-10-07 16:01:12 -07004235
Damien Lespiau1b469632012-12-13 16:09:01 +00004236 if (!ibx_digital_port_connected(dev_priv, intel_dig_port))
4237 return connector_status_disconnected;
4238
Keith Packard26d61aa2011-07-25 20:01:09 -07004239 return intel_dp_detect_dpcd(intel_dp);
Zhenyu Wang5eb08b62009-07-24 01:00:31 +08004240}
4241
Dave Airlie2a592be2014-09-01 16:58:12 +10004242static int g4x_digital_port_connected(struct drm_device *dev,
4243 struct intel_digital_port *intel_dig_port)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004244{
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004245 struct drm_i915_private *dev_priv = dev->dev_private;
Chris Wilson10f76a32012-05-11 18:01:32 +01004246 uint32_t bit;
Zhenyu Wang5eb08b62009-07-24 01:00:31 +08004247
Todd Previte232a6ee2014-01-23 00:13:41 -07004248 if (IS_VALLEYVIEW(dev)) {
4249 switch (intel_dig_port->port) {
4250 case PORT_B:
4251 bit = PORTB_HOTPLUG_LIVE_STATUS_VLV;
4252 break;
4253 case PORT_C:
4254 bit = PORTC_HOTPLUG_LIVE_STATUS_VLV;
4255 break;
4256 case PORT_D:
4257 bit = PORTD_HOTPLUG_LIVE_STATUS_VLV;
4258 break;
4259 default:
Dave Airlie2a592be2014-09-01 16:58:12 +10004260 return -EINVAL;
Todd Previte232a6ee2014-01-23 00:13:41 -07004261 }
4262 } else {
4263 switch (intel_dig_port->port) {
4264 case PORT_B:
4265 bit = PORTB_HOTPLUG_LIVE_STATUS_G4X;
4266 break;
4267 case PORT_C:
4268 bit = PORTC_HOTPLUG_LIVE_STATUS_G4X;
4269 break;
4270 case PORT_D:
4271 bit = PORTD_HOTPLUG_LIVE_STATUS_G4X;
4272 break;
4273 default:
Dave Airlie2a592be2014-09-01 16:58:12 +10004274 return -EINVAL;
Todd Previte232a6ee2014-01-23 00:13:41 -07004275 }
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004276 }
4277
Chris Wilson10f76a32012-05-11 18:01:32 +01004278 if ((I915_READ(PORT_HOTPLUG_STAT) & bit) == 0)
Dave Airlie2a592be2014-09-01 16:58:12 +10004279 return 0;
4280 return 1;
4281}
4282
4283static enum drm_connector_status
4284g4x_dp_detect(struct intel_dp *intel_dp)
4285{
4286 struct drm_device *dev = intel_dp_to_dev(intel_dp);
4287 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
4288 int ret;
4289
4290 /* Can't disconnect eDP, but you can close the lid... */
4291 if (is_edp(intel_dp)) {
4292 enum drm_connector_status status;
4293
4294 status = intel_panel_detect(dev);
4295 if (status == connector_status_unknown)
4296 status = connector_status_connected;
4297 return status;
4298 }
4299
4300 ret = g4x_digital_port_connected(dev, intel_dig_port);
4301 if (ret == -EINVAL)
4302 return connector_status_unknown;
4303 else if (ret == 0)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004304 return connector_status_disconnected;
4305
Keith Packard26d61aa2011-07-25 20:01:09 -07004306 return intel_dp_detect_dpcd(intel_dp);
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004307}
4308
Keith Packard8c241fe2011-09-28 16:38:44 -07004309static struct edid *
Chris Wilsonbeb60602014-09-02 20:04:00 +01004310intel_dp_get_edid(struct intel_dp *intel_dp)
Keith Packard8c241fe2011-09-28 16:38:44 -07004311{
Chris Wilsonbeb60602014-09-02 20:04:00 +01004312 struct intel_connector *intel_connector = intel_dp->attached_connector;
Keith Packard8c241fe2011-09-28 16:38:44 -07004313
Jani Nikula9cd300e2012-10-19 14:51:52 +03004314 /* use cached edid if we have one */
4315 if (intel_connector->edid) {
Jani Nikula9cd300e2012-10-19 14:51:52 +03004316 /* invalid edid */
4317 if (IS_ERR(intel_connector->edid))
Jesse Barnesd6f24d02012-06-14 15:28:33 -04004318 return NULL;
4319
Jani Nikula55e9ede2013-10-01 10:38:54 +03004320 return drm_edid_duplicate(intel_connector->edid);
Chris Wilsonbeb60602014-09-02 20:04:00 +01004321 } else
4322 return drm_get_edid(&intel_connector->base,
4323 &intel_dp->aux.ddc);
Keith Packard8c241fe2011-09-28 16:38:44 -07004324}
4325
Chris Wilsonbeb60602014-09-02 20:04:00 +01004326static void
4327intel_dp_set_edid(struct intel_dp *intel_dp)
Keith Packard8c241fe2011-09-28 16:38:44 -07004328{
Chris Wilsonbeb60602014-09-02 20:04:00 +01004329 struct intel_connector *intel_connector = intel_dp->attached_connector;
4330 struct edid *edid;
Keith Packard8c241fe2011-09-28 16:38:44 -07004331
Chris Wilsonbeb60602014-09-02 20:04:00 +01004332 edid = intel_dp_get_edid(intel_dp);
4333 intel_connector->detect_edid = edid;
Jani Nikula9cd300e2012-10-19 14:51:52 +03004334
Chris Wilsonbeb60602014-09-02 20:04:00 +01004335 if (intel_dp->force_audio != HDMI_AUDIO_AUTO)
4336 intel_dp->has_audio = intel_dp->force_audio == HDMI_AUDIO_ON;
4337 else
4338 intel_dp->has_audio = drm_detect_monitor_audio(edid);
4339}
Jesse Barnesd6f24d02012-06-14 15:28:33 -04004340
Chris Wilsonbeb60602014-09-02 20:04:00 +01004341static void
4342intel_dp_unset_edid(struct intel_dp *intel_dp)
4343{
4344 struct intel_connector *intel_connector = intel_dp->attached_connector;
4345
4346 kfree(intel_connector->detect_edid);
4347 intel_connector->detect_edid = NULL;
4348
4349 intel_dp->has_audio = false;
4350}
4351
4352static enum intel_display_power_domain
4353intel_dp_power_get(struct intel_dp *dp)
4354{
4355 struct intel_encoder *encoder = &dp_to_dig_port(dp)->base;
4356 enum intel_display_power_domain power_domain;
4357
4358 power_domain = intel_display_port_power_domain(encoder);
4359 intel_display_power_get(to_i915(encoder->base.dev), power_domain);
4360
4361 return power_domain;
4362}
4363
4364static void
4365intel_dp_power_put(struct intel_dp *dp,
4366 enum intel_display_power_domain power_domain)
4367{
4368 struct intel_encoder *encoder = &dp_to_dig_port(dp)->base;
4369 intel_display_power_put(to_i915(encoder->base.dev), power_domain);
Keith Packard8c241fe2011-09-28 16:38:44 -07004370}
4371
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004372static enum drm_connector_status
4373intel_dp_detect(struct drm_connector *connector, bool force)
4374{
4375 struct intel_dp *intel_dp = intel_attached_dp(connector);
Paulo Zanonid63885d2012-10-26 19:05:49 -02004376 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
4377 struct intel_encoder *intel_encoder = &intel_dig_port->base;
Paulo Zanonifa90ece2012-10-26 19:05:44 -02004378 struct drm_device *dev = connector->dev;
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004379 enum drm_connector_status status;
Imre Deak671dedd2014-03-05 16:20:53 +02004380 enum intel_display_power_domain power_domain;
Dave Airlie0e32b392014-05-02 14:02:48 +10004381 bool ret;
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004382
Chris Wilson164c8592013-07-20 20:27:08 +01004383 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
Jani Nikulac23cc412014-06-03 14:56:17 +03004384 connector->base.id, connector->name);
Chris Wilsonbeb60602014-09-02 20:04:00 +01004385 intel_dp_unset_edid(intel_dp);
Chris Wilson164c8592013-07-20 20:27:08 +01004386
Dave Airlie0e32b392014-05-02 14:02:48 +10004387 if (intel_dp->is_mst) {
4388 /* MST devices are disconnected from a monitor POV */
4389 if (intel_encoder->type != INTEL_OUTPUT_EDP)
4390 intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT;
Chris Wilsonbeb60602014-09-02 20:04:00 +01004391 return connector_status_disconnected;
Dave Airlie0e32b392014-05-02 14:02:48 +10004392 }
4393
Chris Wilsonbeb60602014-09-02 20:04:00 +01004394 power_domain = intel_dp_power_get(intel_dp);
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004395
Chris Wilsond410b562014-09-02 20:03:59 +01004396 /* Can't disconnect eDP, but you can close the lid... */
4397 if (is_edp(intel_dp))
4398 status = edp_detect(intel_dp);
4399 else if (HAS_PCH_SPLIT(dev))
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004400 status = ironlake_dp_detect(intel_dp);
4401 else
4402 status = g4x_dp_detect(intel_dp);
4403 if (status != connector_status_connected)
Paulo Zanonic8c8fb32013-11-27 18:21:54 -02004404 goto out;
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004405
Adam Jackson0d198322012-05-14 16:05:47 -04004406 intel_dp_probe_oui(intel_dp);
4407
Dave Airlie0e32b392014-05-02 14:02:48 +10004408 ret = intel_dp_probe_mst(intel_dp);
4409 if (ret) {
4410 /* if we are in MST mode then this connector
4411 won't appear connected or have anything with EDID on it */
4412 if (intel_encoder->type != INTEL_OUTPUT_EDP)
4413 intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT;
4414 status = connector_status_disconnected;
4415 goto out;
4416 }
4417
Chris Wilsonbeb60602014-09-02 20:04:00 +01004418 intel_dp_set_edid(intel_dp);
Zhenyu Wanga9756bb2010-09-19 13:09:06 +08004419
Paulo Zanonid63885d2012-10-26 19:05:49 -02004420 if (intel_encoder->type != INTEL_OUTPUT_EDP)
4421 intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT;
Paulo Zanonic8c8fb32013-11-27 18:21:54 -02004422 status = connector_status_connected;
4423
4424out:
Chris Wilsonbeb60602014-09-02 20:04:00 +01004425 intel_dp_power_put(intel_dp, power_domain);
Paulo Zanonic8c8fb32013-11-27 18:21:54 -02004426 return status;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004427}
4428
Chris Wilsonbeb60602014-09-02 20:04:00 +01004429static void
4430intel_dp_force(struct drm_connector *connector)
4431{
4432 struct intel_dp *intel_dp = intel_attached_dp(connector);
4433 struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base;
4434 enum intel_display_power_domain power_domain;
4435
4436 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
4437 connector->base.id, connector->name);
4438 intel_dp_unset_edid(intel_dp);
4439
4440 if (connector->status != connector_status_connected)
4441 return;
4442
4443 power_domain = intel_dp_power_get(intel_dp);
4444
4445 intel_dp_set_edid(intel_dp);
4446
4447 intel_dp_power_put(intel_dp, power_domain);
4448
4449 if (intel_encoder->type != INTEL_OUTPUT_EDP)
4450 intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT;
4451}
4452
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004453static int intel_dp_get_modes(struct drm_connector *connector)
4454{
Jani Nikuladd06f902012-10-19 14:51:50 +03004455 struct intel_connector *intel_connector = to_intel_connector(connector);
Chris Wilsonbeb60602014-09-02 20:04:00 +01004456 struct edid *edid;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004457
Chris Wilsonbeb60602014-09-02 20:04:00 +01004458 edid = intel_connector->detect_edid;
4459 if (edid) {
4460 int ret = intel_connector_update_modes(connector, edid);
4461 if (ret)
4462 return ret;
4463 }
Zhenyu Wang32f9d652009-07-24 01:00:32 +08004464
Jani Nikulaf8779fd2012-10-19 14:51:48 +03004465 /* if eDP has no EDID, fall back to fixed mode */
Chris Wilsonbeb60602014-09-02 20:04:00 +01004466 if (is_edp(intel_attached_dp(connector)) &&
4467 intel_connector->panel.fixed_mode) {
Jani Nikulaf8779fd2012-10-19 14:51:48 +03004468 struct drm_display_mode *mode;
Chris Wilsonbeb60602014-09-02 20:04:00 +01004469
4470 mode = drm_mode_duplicate(connector->dev,
Jani Nikuladd06f902012-10-19 14:51:50 +03004471 intel_connector->panel.fixed_mode);
Jani Nikulaf8779fd2012-10-19 14:51:48 +03004472 if (mode) {
Zhenyu Wang32f9d652009-07-24 01:00:32 +08004473 drm_mode_probed_add(connector, mode);
4474 return 1;
4475 }
4476 }
Chris Wilsonbeb60602014-09-02 20:04:00 +01004477
Zhenyu Wang32f9d652009-07-24 01:00:32 +08004478 return 0;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004479}
4480
Chris Wilson1aad7ac2011-02-09 18:46:58 +00004481static bool
4482intel_dp_detect_audio(struct drm_connector *connector)
4483{
Chris Wilson1aad7ac2011-02-09 18:46:58 +00004484 bool has_audio = false;
Chris Wilsonbeb60602014-09-02 20:04:00 +01004485 struct edid *edid;
Chris Wilson1aad7ac2011-02-09 18:46:58 +00004486
Chris Wilsonbeb60602014-09-02 20:04:00 +01004487 edid = to_intel_connector(connector)->detect_edid;
4488 if (edid)
Chris Wilson1aad7ac2011-02-09 18:46:58 +00004489 has_audio = drm_detect_monitor_audio(edid);
Imre Deak671dedd2014-03-05 16:20:53 +02004490
Chris Wilson1aad7ac2011-02-09 18:46:58 +00004491 return has_audio;
4492}
4493
Chris Wilsonf6849602010-09-19 09:29:33 +01004494static int
4495intel_dp_set_property(struct drm_connector *connector,
4496 struct drm_property *property,
4497 uint64_t val)
4498{
Chris Wilsone953fd72011-02-21 22:23:52 +00004499 struct drm_i915_private *dev_priv = connector->dev->dev_private;
Yuly Novikov53b41832012-10-26 12:04:00 +03004500 struct intel_connector *intel_connector = to_intel_connector(connector);
Paulo Zanonida63a9f2012-10-26 19:05:46 -02004501 struct intel_encoder *intel_encoder = intel_attached_encoder(connector);
4502 struct intel_dp *intel_dp = enc_to_intel_dp(&intel_encoder->base);
Chris Wilsonf6849602010-09-19 09:29:33 +01004503 int ret;
4504
Rob Clark662595d2012-10-11 20:36:04 -05004505 ret = drm_object_property_set_value(&connector->base, property, val);
Chris Wilsonf6849602010-09-19 09:29:33 +01004506 if (ret)
4507 return ret;
4508
Chris Wilson3f43c482011-05-12 22:17:24 +01004509 if (property == dev_priv->force_audio_property) {
Chris Wilson1aad7ac2011-02-09 18:46:58 +00004510 int i = val;
4511 bool has_audio;
4512
4513 if (i == intel_dp->force_audio)
Chris Wilsonf6849602010-09-19 09:29:33 +01004514 return 0;
4515
Chris Wilson1aad7ac2011-02-09 18:46:58 +00004516 intel_dp->force_audio = i;
Chris Wilsonf6849602010-09-19 09:29:33 +01004517
Daniel Vetterc3e5f672012-02-23 17:14:47 +01004518 if (i == HDMI_AUDIO_AUTO)
Chris Wilson1aad7ac2011-02-09 18:46:58 +00004519 has_audio = intel_dp_detect_audio(connector);
4520 else
Daniel Vetterc3e5f672012-02-23 17:14:47 +01004521 has_audio = (i == HDMI_AUDIO_ON);
Chris Wilson1aad7ac2011-02-09 18:46:58 +00004522
4523 if (has_audio == intel_dp->has_audio)
Chris Wilsonf6849602010-09-19 09:29:33 +01004524 return 0;
4525
Chris Wilson1aad7ac2011-02-09 18:46:58 +00004526 intel_dp->has_audio = has_audio;
Chris Wilsonf6849602010-09-19 09:29:33 +01004527 goto done;
4528 }
4529
Chris Wilsone953fd72011-02-21 22:23:52 +00004530 if (property == dev_priv->broadcast_rgb_property) {
Daniel Vetterae4edb82013-04-22 17:07:23 +02004531 bool old_auto = intel_dp->color_range_auto;
4532 uint32_t old_range = intel_dp->color_range;
4533
Ville Syrjälä55bc60d2013-01-17 16:31:29 +02004534 switch (val) {
4535 case INTEL_BROADCAST_RGB_AUTO:
4536 intel_dp->color_range_auto = true;
4537 break;
4538 case INTEL_BROADCAST_RGB_FULL:
4539 intel_dp->color_range_auto = false;
4540 intel_dp->color_range = 0;
4541 break;
4542 case INTEL_BROADCAST_RGB_LIMITED:
4543 intel_dp->color_range_auto = false;
4544 intel_dp->color_range = DP_COLOR_RANGE_16_235;
4545 break;
4546 default:
4547 return -EINVAL;
4548 }
Daniel Vetterae4edb82013-04-22 17:07:23 +02004549
4550 if (old_auto == intel_dp->color_range_auto &&
4551 old_range == intel_dp->color_range)
4552 return 0;
4553
Chris Wilsone953fd72011-02-21 22:23:52 +00004554 goto done;
4555 }
4556
Yuly Novikov53b41832012-10-26 12:04:00 +03004557 if (is_edp(intel_dp) &&
4558 property == connector->dev->mode_config.scaling_mode_property) {
4559 if (val == DRM_MODE_SCALE_NONE) {
4560 DRM_DEBUG_KMS("no scaling not supported\n");
4561 return -EINVAL;
4562 }
4563
4564 if (intel_connector->panel.fitting_mode == val) {
4565 /* the eDP scaling property is not changed */
4566 return 0;
4567 }
4568 intel_connector->panel.fitting_mode = val;
4569
4570 goto done;
4571 }
4572
Chris Wilsonf6849602010-09-19 09:29:33 +01004573 return -EINVAL;
4574
4575done:
Chris Wilsonc0c36b942012-12-19 16:08:43 +00004576 if (intel_encoder->base.crtc)
4577 intel_crtc_restore_mode(intel_encoder->base.crtc);
Chris Wilsonf6849602010-09-19 09:29:33 +01004578
4579 return 0;
4580}
4581
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004582static void
Paulo Zanoni73845ad2013-06-12 17:27:30 -03004583intel_dp_connector_destroy(struct drm_connector *connector)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004584{
Jani Nikula1d508702012-10-19 14:51:49 +03004585 struct intel_connector *intel_connector = to_intel_connector(connector);
Matthew Garrettaaa6fd22011-08-12 12:11:33 +02004586
Chris Wilson10e972d2014-09-04 21:43:45 +01004587 kfree(intel_connector->detect_edid);
Chris Wilsonbeb60602014-09-02 20:04:00 +01004588
Jani Nikula9cd300e2012-10-19 14:51:52 +03004589 if (!IS_ERR_OR_NULL(intel_connector->edid))
4590 kfree(intel_connector->edid);
4591
Paulo Zanoniacd8db102013-06-12 17:27:23 -03004592 /* Can't call is_edp() since the encoder may have been destroyed
4593 * already. */
4594 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP)
Jani Nikula1d508702012-10-19 14:51:49 +03004595 intel_panel_fini(&intel_connector->panel);
Matthew Garrettaaa6fd22011-08-12 12:11:33 +02004596
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004597 drm_connector_cleanup(connector);
Zhenyu Wang55f78c42010-03-29 16:13:57 +08004598 kfree(connector);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004599}
4600
Paulo Zanoni00c09d72012-10-26 19:05:52 -02004601void intel_dp_encoder_destroy(struct drm_encoder *encoder)
Daniel Vetter24d05922010-08-20 18:08:28 +02004602{
Paulo Zanonida63a9f2012-10-26 19:05:46 -02004603 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
4604 struct intel_dp *intel_dp = &intel_dig_port->dp;
Daniel Vetter24d05922010-08-20 18:08:28 +02004605
Dave Airlie4f71d0c2014-06-04 16:02:28 +10004606 drm_dp_aux_unregister(&intel_dp->aux);
Dave Airlie0e32b392014-05-02 14:02:48 +10004607 intel_dp_mst_encoder_cleanup(intel_dig_port);
Keith Packardbd943152011-09-18 23:09:52 -07004608 if (is_edp(intel_dp)) {
4609 cancel_delayed_work_sync(&intel_dp->panel_vdd_work);
Ville Syrjälä951468f2014-09-04 14:55:31 +03004610 /*
4611 * vdd might still be enabled do to the delayed vdd off.
4612 * Make sure vdd is actually turned off here.
4613 */
Ville Syrjälä773538e82014-09-04 14:54:56 +03004614 pps_lock(intel_dp);
Daniel Vetter4be73782014-01-17 14:39:48 +01004615 edp_panel_vdd_off_sync(intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03004616 pps_unlock(intel_dp);
4617
Clint Taylor01527b32014-07-07 13:01:46 -07004618 if (intel_dp->edp_notifier.notifier_call) {
4619 unregister_reboot_notifier(&intel_dp->edp_notifier);
4620 intel_dp->edp_notifier.notifier_call = NULL;
4621 }
Keith Packardbd943152011-09-18 23:09:52 -07004622 }
Imre Deakc8bd0e42014-12-12 17:57:38 +02004623 drm_encoder_cleanup(encoder);
Paulo Zanonida63a9f2012-10-26 19:05:46 -02004624 kfree(intel_dig_port);
Daniel Vetter24d05922010-08-20 18:08:28 +02004625}
4626
Imre Deak07f9cd02014-08-18 14:42:45 +03004627static void intel_dp_encoder_suspend(struct intel_encoder *intel_encoder)
4628{
4629 struct intel_dp *intel_dp = enc_to_intel_dp(&intel_encoder->base);
4630
4631 if (!is_edp(intel_dp))
4632 return;
4633
Ville Syrjälä951468f2014-09-04 14:55:31 +03004634 /*
4635 * vdd might still be enabled do to the delayed vdd off.
4636 * Make sure vdd is actually turned off here.
4637 */
Ville Syrjäläafa4e532014-11-25 15:43:48 +02004638 cancel_delayed_work_sync(&intel_dp->panel_vdd_work);
Ville Syrjälä773538e82014-09-04 14:54:56 +03004639 pps_lock(intel_dp);
Imre Deak07f9cd02014-08-18 14:42:45 +03004640 edp_panel_vdd_off_sync(intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03004641 pps_unlock(intel_dp);
Imre Deak07f9cd02014-08-18 14:42:45 +03004642}
4643
Ville Syrjälä49e6bc52014-10-28 16:15:52 +02004644static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp)
4645{
4646 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
4647 struct drm_device *dev = intel_dig_port->base.base.dev;
4648 struct drm_i915_private *dev_priv = dev->dev_private;
4649 enum intel_display_power_domain power_domain;
4650
4651 lockdep_assert_held(&dev_priv->pps_mutex);
4652
4653 if (!edp_have_panel_vdd(intel_dp))
4654 return;
4655
4656 /*
4657 * The VDD bit needs a power domain reference, so if the bit is
4658 * already enabled when we boot or resume, grab this reference and
4659 * schedule a vdd off, so we don't hold on to the reference
4660 * indefinitely.
4661 */
4662 DRM_DEBUG_KMS("VDD left on by BIOS, adjusting state tracking\n");
4663 power_domain = intel_display_port_power_domain(&intel_dig_port->base);
4664 intel_display_power_get(dev_priv, power_domain);
4665
4666 edp_panel_vdd_schedule_off(intel_dp);
4667}
4668
Imre Deak6d93c0c2014-07-31 14:03:36 +03004669static void intel_dp_encoder_reset(struct drm_encoder *encoder)
4670{
Ville Syrjälä49e6bc52014-10-28 16:15:52 +02004671 struct intel_dp *intel_dp;
4672
4673 if (to_intel_encoder(encoder)->type != INTEL_OUTPUT_EDP)
4674 return;
4675
4676 intel_dp = enc_to_intel_dp(encoder);
4677
4678 pps_lock(intel_dp);
4679
4680 /*
4681 * Read out the current power sequencer assignment,
4682 * in case the BIOS did something with it.
4683 */
4684 if (IS_VALLEYVIEW(encoder->dev))
4685 vlv_initial_power_sequencer_setup(intel_dp);
4686
4687 intel_edp_panel_vdd_sanitize(intel_dp);
4688
4689 pps_unlock(intel_dp);
Imre Deak6d93c0c2014-07-31 14:03:36 +03004690}
4691
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004692static const struct drm_connector_funcs intel_dp_connector_funcs = {
Daniel Vetter2bd2ad62012-09-06 22:15:41 +02004693 .dpms = intel_connector_dpms,
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004694 .detect = intel_dp_detect,
Chris Wilsonbeb60602014-09-02 20:04:00 +01004695 .force = intel_dp_force,
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004696 .fill_modes = drm_helper_probe_single_connector_modes,
Chris Wilsonf6849602010-09-19 09:29:33 +01004697 .set_property = intel_dp_set_property,
Matt Roper2545e4a2015-01-22 16:51:27 -08004698 .atomic_get_property = intel_connector_atomic_get_property,
Paulo Zanoni73845ad2013-06-12 17:27:30 -03004699 .destroy = intel_dp_connector_destroy,
Matt Roperc6f95f22015-01-22 16:50:32 -08004700 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
Ander Conselvan de Oliveira98969722015-03-20 16:18:06 +02004701 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004702};
4703
4704static const struct drm_connector_helper_funcs intel_dp_connector_helper_funcs = {
4705 .get_modes = intel_dp_get_modes,
4706 .mode_valid = intel_dp_mode_valid,
Chris Wilsondf0e9242010-09-09 16:20:55 +01004707 .best_encoder = intel_best_encoder,
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004708};
4709
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004710static const struct drm_encoder_funcs intel_dp_enc_funcs = {
Imre Deak6d93c0c2014-07-31 14:03:36 +03004711 .reset = intel_dp_encoder_reset,
Daniel Vetter24d05922010-08-20 18:08:28 +02004712 .destroy = intel_dp_encoder_destroy,
Keith Packarda4fc5ed2009-04-07 16:16:42 -07004713};
4714
Dave Airlie0e32b392014-05-02 14:02:48 +10004715void
Eric Anholt21d40d32010-03-25 11:11:14 -07004716intel_dp_hot_plug(struct intel_encoder *intel_encoder)
Keith Packardc8110e52009-05-06 11:51:10 -07004717{
Dave Airlie0e32b392014-05-02 14:02:48 +10004718 return;
Keith Packardc8110e52009-05-06 11:51:10 -07004719}
4720
Daniel Vetterb2c5c182015-01-23 06:00:31 +01004721enum irqreturn
Dave Airlie13cf5502014-06-18 11:29:35 +10004722intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
4723{
4724 struct intel_dp *intel_dp = &intel_dig_port->dp;
Imre Deak1c767b32014-08-18 14:42:42 +03004725 struct intel_encoder *intel_encoder = &intel_dig_port->base;
Dave Airlie0e32b392014-05-02 14:02:48 +10004726 struct drm_device *dev = intel_dig_port->base.base.dev;
4727 struct drm_i915_private *dev_priv = dev->dev_private;
Imre Deak1c767b32014-08-18 14:42:42 +03004728 enum intel_display_power_domain power_domain;
Daniel Vetterb2c5c182015-01-23 06:00:31 +01004729 enum irqreturn ret = IRQ_NONE;
Imre Deak1c767b32014-08-18 14:42:42 +03004730
Dave Airlie0e32b392014-05-02 14:02:48 +10004731 if (intel_dig_port->base.type != INTEL_OUTPUT_EDP)
4732 intel_dig_port->base.type = INTEL_OUTPUT_DISPLAYPORT;
Dave Airlie13cf5502014-06-18 11:29:35 +10004733
Ville Syrjälä7a7f84c2014-10-16 20:46:10 +03004734 if (long_hpd && intel_dig_port->base.type == INTEL_OUTPUT_EDP) {
4735 /*
4736 * vdd off can generate a long pulse on eDP which
4737 * would require vdd on to handle it, and thus we
4738 * would end up in an endless cycle of
4739 * "vdd off -> long hpd -> vdd on -> detect -> vdd off -> ..."
4740 */
4741 DRM_DEBUG_KMS("ignoring long hpd on eDP port %c\n",
4742 port_name(intel_dig_port->port));
Ville Syrjäläa8b3d522015-02-10 14:11:46 +02004743 return IRQ_HANDLED;
Ville Syrjälä7a7f84c2014-10-16 20:46:10 +03004744 }
4745
Ville Syrjälä26fbb772014-08-11 18:37:37 +03004746 DRM_DEBUG_KMS("got hpd irq on port %c - %s\n",
4747 port_name(intel_dig_port->port),
Dave Airlie0e32b392014-05-02 14:02:48 +10004748 long_hpd ? "long" : "short");
Dave Airlie13cf5502014-06-18 11:29:35 +10004749
Imre Deak1c767b32014-08-18 14:42:42 +03004750 power_domain = intel_display_port_power_domain(intel_encoder);
4751 intel_display_power_get(dev_priv, power_domain);
4752
Dave Airlie0e32b392014-05-02 14:02:48 +10004753 if (long_hpd) {
Dave Airlie2a592be2014-09-01 16:58:12 +10004754
4755 if (HAS_PCH_SPLIT(dev)) {
4756 if (!ibx_digital_port_connected(dev_priv, intel_dig_port))
4757 goto mst_fail;
4758 } else {
4759 if (g4x_digital_port_connected(dev, intel_dig_port) != 1)
4760 goto mst_fail;
4761 }
Dave Airlie0e32b392014-05-02 14:02:48 +10004762
4763 if (!intel_dp_get_dpcd(intel_dp)) {
4764 goto mst_fail;
4765 }
4766
4767 intel_dp_probe_oui(intel_dp);
4768
4769 if (!intel_dp_probe_mst(intel_dp))
4770 goto mst_fail;
4771
4772 } else {
4773 if (intel_dp->is_mst) {
Imre Deak1c767b32014-08-18 14:42:42 +03004774 if (intel_dp_check_mst_status(intel_dp) == -EINVAL)
Dave Airlie0e32b392014-05-02 14:02:48 +10004775 goto mst_fail;
4776 }
4777
4778 if (!intel_dp->is_mst) {
4779 /*
4780 * we'll check the link status via the normal hot plug path later -
4781 * but for short hpds we should check it now
4782 */
Dave Airlie5b215bc2014-08-05 10:40:20 +10004783 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
Dave Airlie0e32b392014-05-02 14:02:48 +10004784 intel_dp_check_link_status(intel_dp);
Dave Airlie5b215bc2014-08-05 10:40:20 +10004785 drm_modeset_unlock(&dev->mode_config.connection_mutex);
Dave Airlie0e32b392014-05-02 14:02:48 +10004786 }
4787 }
Daniel Vetterb2c5c182015-01-23 06:00:31 +01004788
4789 ret = IRQ_HANDLED;
4790
Imre Deak1c767b32014-08-18 14:42:42 +03004791 goto put_power;
Dave Airlie0e32b392014-05-02 14:02:48 +10004792mst_fail:
4793 /* if we were in MST mode, and device is not there get out of MST mode */
4794 if (intel_dp->is_mst) {
4795 DRM_DEBUG_KMS("MST device may have disappeared %d vs %d\n", intel_dp->is_mst, intel_dp->mst_mgr.mst_state);
4796 intel_dp->is_mst = false;
4797 drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr, intel_dp->is_mst);
4798 }
Imre Deak1c767b32014-08-18 14:42:42 +03004799put_power:
4800 intel_display_power_put(dev_priv, power_domain);
4801
4802 return ret;
Dave Airlie13cf5502014-06-18 11:29:35 +10004803}
4804
Zhenyu Wange3421a12010-04-08 09:43:27 +08004805/* Return which DP Port should be selected for Transcoder DP control */
4806int
Akshay Joshi0206e352011-08-16 15:34:10 -04004807intel_trans_dp_port_sel(struct drm_crtc *crtc)
Zhenyu Wange3421a12010-04-08 09:43:27 +08004808{
4809 struct drm_device *dev = crtc->dev;
Paulo Zanonifa90ece2012-10-26 19:05:44 -02004810 struct intel_encoder *intel_encoder;
4811 struct intel_dp *intel_dp;
Zhenyu Wange3421a12010-04-08 09:43:27 +08004812
Paulo Zanonifa90ece2012-10-26 19:05:44 -02004813 for_each_encoder_on_crtc(dev, crtc, intel_encoder) {
4814 intel_dp = enc_to_intel_dp(&intel_encoder->base);
Chris Wilsonea5b2132010-08-04 13:50:23 +01004815
Paulo Zanonifa90ece2012-10-26 19:05:44 -02004816 if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
4817 intel_encoder->type == INTEL_OUTPUT_EDP)
Chris Wilsonea5b2132010-08-04 13:50:23 +01004818 return intel_dp->output_reg;
Zhenyu Wange3421a12010-04-08 09:43:27 +08004819 }
Chris Wilsonea5b2132010-08-04 13:50:23 +01004820
Zhenyu Wange3421a12010-04-08 09:43:27 +08004821 return -1;
4822}
4823
Zhao Yakui36e83a12010-06-12 14:32:21 +08004824/* check the VBT to see whether the eDP is on DP-D port */
Ville Syrjälä5d8a7752013-11-01 18:22:39 +02004825bool intel_dp_is_edp(struct drm_device *dev, enum port port)
Zhao Yakui36e83a12010-06-12 14:32:21 +08004826{
4827 struct drm_i915_private *dev_priv = dev->dev_private;
Paulo Zanoni768f69c2013-09-11 18:02:47 -03004828 union child_device_config *p_child;
Zhao Yakui36e83a12010-06-12 14:32:21 +08004829 int i;
Ville Syrjälä5d8a7752013-11-01 18:22:39 +02004830 static const short port_mapping[] = {
4831 [PORT_B] = PORT_IDPB,
4832 [PORT_C] = PORT_IDPC,
4833 [PORT_D] = PORT_IDPD,
4834 };
Zhao Yakui36e83a12010-06-12 14:32:21 +08004835
Ville Syrjälä3b32a352013-11-01 18:22:41 +02004836 if (port == PORT_A)
4837 return true;
4838
Rodrigo Vivi41aa3442013-05-09 20:03:18 -03004839 if (!dev_priv->vbt.child_dev_num)
Zhao Yakui36e83a12010-06-12 14:32:21 +08004840 return false;
4841
Rodrigo Vivi41aa3442013-05-09 20:03:18 -03004842 for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
4843 p_child = dev_priv->vbt.child_dev + i;
Zhao Yakui36e83a12010-06-12 14:32:21 +08004844
Ville Syrjälä5d8a7752013-11-01 18:22:39 +02004845 if (p_child->common.dvo_port == port_mapping[port] &&
Ville Syrjäläf02586d2013-11-01 20:32:08 +02004846 (p_child->common.device_type & DEVICE_TYPE_eDP_BITS) ==
4847 (DEVICE_TYPE_eDP & DEVICE_TYPE_eDP_BITS))
Zhao Yakui36e83a12010-06-12 14:32:21 +08004848 return true;
4849 }
4850 return false;
4851}
4852
Dave Airlie0e32b392014-05-02 14:02:48 +10004853void
Chris Wilsonf6849602010-09-19 09:29:33 +01004854intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connector)
4855{
Yuly Novikov53b41832012-10-26 12:04:00 +03004856 struct intel_connector *intel_connector = to_intel_connector(connector);
4857
Chris Wilson3f43c482011-05-12 22:17:24 +01004858 intel_attach_force_audio_property(connector);
Chris Wilsone953fd72011-02-21 22:23:52 +00004859 intel_attach_broadcast_rgb_property(connector);
Ville Syrjälä55bc60d2013-01-17 16:31:29 +02004860 intel_dp->color_range_auto = true;
Yuly Novikov53b41832012-10-26 12:04:00 +03004861
4862 if (is_edp(intel_dp)) {
4863 drm_mode_create_scaling_mode_property(connector->dev);
Rob Clark6de6d842012-10-11 20:36:04 -05004864 drm_object_attach_property(
4865 &connector->base,
Yuly Novikov53b41832012-10-26 12:04:00 +03004866 connector->dev->mode_config.scaling_mode_property,
Yuly Novikov8e740cd2012-10-26 12:04:01 +03004867 DRM_MODE_SCALE_ASPECT);
4868 intel_connector->panel.fitting_mode = DRM_MODE_SCALE_ASPECT;
Yuly Novikov53b41832012-10-26 12:04:00 +03004869 }
Chris Wilsonf6849602010-09-19 09:29:33 +01004870}
4871
Imre Deakdada1a92014-01-29 13:25:41 +02004872static void intel_dp_init_panel_power_timestamps(struct intel_dp *intel_dp)
4873{
4874 intel_dp->last_power_cycle = jiffies;
4875 intel_dp->last_power_on = jiffies;
4876 intel_dp->last_backlight_off = jiffies;
4877}
4878
Daniel Vetter67a54562012-10-20 20:57:45 +02004879static void
4880intel_dp_init_panel_power_sequencer(struct drm_device *dev,
Ville Syrjälä36b5f422014-10-16 21:27:30 +03004881 struct intel_dp *intel_dp)
Daniel Vetter67a54562012-10-20 20:57:45 +02004882{
4883 struct drm_i915_private *dev_priv = dev->dev_private;
Ville Syrjälä36b5f422014-10-16 21:27:30 +03004884 struct edp_power_seq cur, vbt, spec,
4885 *final = &intel_dp->pps_delays;
Daniel Vetter67a54562012-10-20 20:57:45 +02004886 u32 pp_on, pp_off, pp_div, pp;
Jani Nikulabf13e812013-09-06 07:40:05 +03004887 int pp_ctrl_reg, pp_on_reg, pp_off_reg, pp_div_reg;
Jesse Barnes453c5422013-03-28 09:55:41 -07004888
Ville Syrjäläe39b9992014-09-04 14:53:14 +03004889 lockdep_assert_held(&dev_priv->pps_mutex);
4890
Ville Syrjälä81ddbc62014-10-16 21:27:31 +03004891 /* already initialized? */
4892 if (final->t11_t12 != 0)
4893 return;
4894
Jesse Barnes453c5422013-03-28 09:55:41 -07004895 if (HAS_PCH_SPLIT(dev)) {
Jani Nikulabf13e812013-09-06 07:40:05 +03004896 pp_ctrl_reg = PCH_PP_CONTROL;
Jesse Barnes453c5422013-03-28 09:55:41 -07004897 pp_on_reg = PCH_PP_ON_DELAYS;
4898 pp_off_reg = PCH_PP_OFF_DELAYS;
4899 pp_div_reg = PCH_PP_DIVISOR;
4900 } else {
Jani Nikulabf13e812013-09-06 07:40:05 +03004901 enum pipe pipe = vlv_power_sequencer_pipe(intel_dp);
4902
4903 pp_ctrl_reg = VLV_PIPE_PP_CONTROL(pipe);
4904 pp_on_reg = VLV_PIPE_PP_ON_DELAYS(pipe);
4905 pp_off_reg = VLV_PIPE_PP_OFF_DELAYS(pipe);
4906 pp_div_reg = VLV_PIPE_PP_DIVISOR(pipe);
Jesse Barnes453c5422013-03-28 09:55:41 -07004907 }
Daniel Vetter67a54562012-10-20 20:57:45 +02004908
4909 /* Workaround: Need to write PP_CONTROL with the unlock key as
4910 * the very first thing. */
Jesse Barnes453c5422013-03-28 09:55:41 -07004911 pp = ironlake_get_pp_control(intel_dp);
Jani Nikulabf13e812013-09-06 07:40:05 +03004912 I915_WRITE(pp_ctrl_reg, pp);
Daniel Vetter67a54562012-10-20 20:57:45 +02004913
Jesse Barnes453c5422013-03-28 09:55:41 -07004914 pp_on = I915_READ(pp_on_reg);
4915 pp_off = I915_READ(pp_off_reg);
4916 pp_div = I915_READ(pp_div_reg);
Daniel Vetter67a54562012-10-20 20:57:45 +02004917
4918 /* Pull timing values out of registers */
4919 cur.t1_t3 = (pp_on & PANEL_POWER_UP_DELAY_MASK) >>
4920 PANEL_POWER_UP_DELAY_SHIFT;
4921
4922 cur.t8 = (pp_on & PANEL_LIGHT_ON_DELAY_MASK) >>
4923 PANEL_LIGHT_ON_DELAY_SHIFT;
4924
4925 cur.t9 = (pp_off & PANEL_LIGHT_OFF_DELAY_MASK) >>
4926 PANEL_LIGHT_OFF_DELAY_SHIFT;
4927
4928 cur.t10 = (pp_off & PANEL_POWER_DOWN_DELAY_MASK) >>
4929 PANEL_POWER_DOWN_DELAY_SHIFT;
4930
4931 cur.t11_t12 = ((pp_div & PANEL_POWER_CYCLE_DELAY_MASK) >>
4932 PANEL_POWER_CYCLE_DELAY_SHIFT) * 1000;
4933
4934 DRM_DEBUG_KMS("cur t1_t3 %d t8 %d t9 %d t10 %d t11_t12 %d\n",
4935 cur.t1_t3, cur.t8, cur.t9, cur.t10, cur.t11_t12);
4936
Rodrigo Vivi41aa3442013-05-09 20:03:18 -03004937 vbt = dev_priv->vbt.edp_pps;
Daniel Vetter67a54562012-10-20 20:57:45 +02004938
4939 /* Upper limits from eDP 1.3 spec. Note that we use the clunky units of
4940 * our hw here, which are all in 100usec. */
4941 spec.t1_t3 = 210 * 10;
4942 spec.t8 = 50 * 10; /* no limit for t8, use t7 instead */
4943 spec.t9 = 50 * 10; /* no limit for t9, make it symmetric with t8 */
4944 spec.t10 = 500 * 10;
4945 /* This one is special and actually in units of 100ms, but zero
4946 * based in the hw (so we need to add 100 ms). But the sw vbt
4947 * table multiplies it with 1000 to make it in units of 100usec,
4948 * too. */
4949 spec.t11_t12 = (510 + 100) * 10;
4950
4951 DRM_DEBUG_KMS("vbt t1_t3 %d t8 %d t9 %d t10 %d t11_t12 %d\n",
4952 vbt.t1_t3, vbt.t8, vbt.t9, vbt.t10, vbt.t11_t12);
4953
4954 /* Use the max of the register settings and vbt. If both are
4955 * unset, fall back to the spec limits. */
Ville Syrjälä36b5f422014-10-16 21:27:30 +03004956#define assign_final(field) final->field = (max(cur.field, vbt.field) == 0 ? \
Daniel Vetter67a54562012-10-20 20:57:45 +02004957 spec.field : \
4958 max(cur.field, vbt.field))
4959 assign_final(t1_t3);
4960 assign_final(t8);
4961 assign_final(t9);
4962 assign_final(t10);
4963 assign_final(t11_t12);
4964#undef assign_final
4965
Ville Syrjälä36b5f422014-10-16 21:27:30 +03004966#define get_delay(field) (DIV_ROUND_UP(final->field, 10))
Daniel Vetter67a54562012-10-20 20:57:45 +02004967 intel_dp->panel_power_up_delay = get_delay(t1_t3);
4968 intel_dp->backlight_on_delay = get_delay(t8);
4969 intel_dp->backlight_off_delay = get_delay(t9);
4970 intel_dp->panel_power_down_delay = get_delay(t10);
4971 intel_dp->panel_power_cycle_delay = get_delay(t11_t12);
4972#undef get_delay
4973
Jani Nikulaf30d26e2013-01-16 10:53:40 +02004974 DRM_DEBUG_KMS("panel power up delay %d, power down delay %d, power cycle delay %d\n",
4975 intel_dp->panel_power_up_delay, intel_dp->panel_power_down_delay,
4976 intel_dp->panel_power_cycle_delay);
4977
4978 DRM_DEBUG_KMS("backlight on delay %d, off delay %d\n",
4979 intel_dp->backlight_on_delay, intel_dp->backlight_off_delay);
Jani Nikulaf30d26e2013-01-16 10:53:40 +02004980}
4981
4982static void
4983intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev,
Ville Syrjälä36b5f422014-10-16 21:27:30 +03004984 struct intel_dp *intel_dp)
Jani Nikulaf30d26e2013-01-16 10:53:40 +02004985{
4986 struct drm_i915_private *dev_priv = dev->dev_private;
Jesse Barnes453c5422013-03-28 09:55:41 -07004987 u32 pp_on, pp_off, pp_div, port_sel = 0;
4988 int div = HAS_PCH_SPLIT(dev) ? intel_pch_rawclk(dev) : intel_hrawclk(dev);
4989 int pp_on_reg, pp_off_reg, pp_div_reg;
Ville Syrjäläad933b52014-08-18 22:15:56 +03004990 enum port port = dp_to_dig_port(intel_dp)->port;
Ville Syrjälä36b5f422014-10-16 21:27:30 +03004991 const struct edp_power_seq *seq = &intel_dp->pps_delays;
Jesse Barnes453c5422013-03-28 09:55:41 -07004992
Ville Syrjäläe39b9992014-09-04 14:53:14 +03004993 lockdep_assert_held(&dev_priv->pps_mutex);
Jesse Barnes453c5422013-03-28 09:55:41 -07004994
4995 if (HAS_PCH_SPLIT(dev)) {
4996 pp_on_reg = PCH_PP_ON_DELAYS;
4997 pp_off_reg = PCH_PP_OFF_DELAYS;
4998 pp_div_reg = PCH_PP_DIVISOR;
4999 } else {
Jani Nikulabf13e812013-09-06 07:40:05 +03005000 enum pipe pipe = vlv_power_sequencer_pipe(intel_dp);
5001
5002 pp_on_reg = VLV_PIPE_PP_ON_DELAYS(pipe);
5003 pp_off_reg = VLV_PIPE_PP_OFF_DELAYS(pipe);
5004 pp_div_reg = VLV_PIPE_PP_DIVISOR(pipe);
Jesse Barnes453c5422013-03-28 09:55:41 -07005005 }
5006
Paulo Zanonib2f19d12013-12-19 14:29:44 -02005007 /*
5008 * And finally store the new values in the power sequencer. The
5009 * backlight delays are set to 1 because we do manual waits on them. For
5010 * T8, even BSpec recommends doing it. For T9, if we don't do this,
5011 * we'll end up waiting for the backlight off delay twice: once when we
5012 * do the manual sleep, and once when we disable the panel and wait for
5013 * the PP_STATUS bit to become zero.
5014 */
Jani Nikulaf30d26e2013-01-16 10:53:40 +02005015 pp_on = (seq->t1_t3 << PANEL_POWER_UP_DELAY_SHIFT) |
Paulo Zanonib2f19d12013-12-19 14:29:44 -02005016 (1 << PANEL_LIGHT_ON_DELAY_SHIFT);
5017 pp_off = (1 << PANEL_LIGHT_OFF_DELAY_SHIFT) |
Jani Nikulaf30d26e2013-01-16 10:53:40 +02005018 (seq->t10 << PANEL_POWER_DOWN_DELAY_SHIFT);
Daniel Vetter67a54562012-10-20 20:57:45 +02005019 /* Compute the divisor for the pp clock, simply match the Bspec
5020 * formula. */
Jesse Barnes453c5422013-03-28 09:55:41 -07005021 pp_div = ((100 * div)/2 - 1) << PP_REFERENCE_DIVIDER_SHIFT;
Jani Nikulaf30d26e2013-01-16 10:53:40 +02005022 pp_div |= (DIV_ROUND_UP(seq->t11_t12, 1000)
Daniel Vetter67a54562012-10-20 20:57:45 +02005023 << PANEL_POWER_CYCLE_DELAY_SHIFT);
5024
5025 /* Haswell doesn't have any port selection bits for the panel
5026 * power sequencer any more. */
Imre Deakbc7d38a2013-05-16 14:40:36 +03005027 if (IS_VALLEYVIEW(dev)) {
Ville Syrjäläad933b52014-08-18 22:15:56 +03005028 port_sel = PANEL_PORT_SELECT_VLV(port);
Imre Deakbc7d38a2013-05-16 14:40:36 +03005029 } else if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev)) {
Ville Syrjäläad933b52014-08-18 22:15:56 +03005030 if (port == PORT_A)
Jani Nikulaa24c1442013-09-05 16:44:46 +03005031 port_sel = PANEL_PORT_SELECT_DPA;
Daniel Vetter67a54562012-10-20 20:57:45 +02005032 else
Jani Nikulaa24c1442013-09-05 16:44:46 +03005033 port_sel = PANEL_PORT_SELECT_DPD;
Daniel Vetter67a54562012-10-20 20:57:45 +02005034 }
5035
Jesse Barnes453c5422013-03-28 09:55:41 -07005036 pp_on |= port_sel;
5037
5038 I915_WRITE(pp_on_reg, pp_on);
5039 I915_WRITE(pp_off_reg, pp_off);
5040 I915_WRITE(pp_div_reg, pp_div);
Daniel Vetter67a54562012-10-20 20:57:45 +02005041
Daniel Vetter67a54562012-10-20 20:57:45 +02005042 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 -07005043 I915_READ(pp_on_reg),
5044 I915_READ(pp_off_reg),
5045 I915_READ(pp_div_reg));
Keith Packardc8110e52009-05-06 11:51:10 -07005046}
5047
Vandana Kannanb33a2812015-02-13 15:33:03 +05305048/**
5049 * intel_dp_set_drrs_state - program registers for RR switch to take effect
5050 * @dev: DRM device
5051 * @refresh_rate: RR to be programmed
5052 *
5053 * This function gets called when refresh rate (RR) has to be changed from
5054 * one frequency to another. Switches can be between high and low RR
5055 * supported by the panel or to any other RR based on media playback (in
5056 * this case, RR value needs to be passed from user space).
5057 *
5058 * The caller of this function needs to take a lock on dev_priv->drrs.
5059 */
Vandana Kannan96178ee2015-01-10 02:25:56 +05305060static void intel_dp_set_drrs_state(struct drm_device *dev, int refresh_rate)
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305061{
5062 struct drm_i915_private *dev_priv = dev->dev_private;
5063 struct intel_encoder *encoder;
Vandana Kannan96178ee2015-01-10 02:25:56 +05305064 struct intel_digital_port *dig_port = NULL;
5065 struct intel_dp *intel_dp = dev_priv->drrs.dp;
Ander Conselvan de Oliveira5cec2582015-01-15 14:55:21 +02005066 struct intel_crtc_state *config = NULL;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305067 struct intel_crtc *intel_crtc = NULL;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305068 u32 reg, val;
Vandana Kannan96178ee2015-01-10 02:25:56 +05305069 enum drrs_refresh_rate_type index = DRRS_HIGH_RR;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305070
5071 if (refresh_rate <= 0) {
5072 DRM_DEBUG_KMS("Refresh rate should be positive non-zero.\n");
5073 return;
5074 }
5075
Vandana Kannan96178ee2015-01-10 02:25:56 +05305076 if (intel_dp == NULL) {
5077 DRM_DEBUG_KMS("DRRS not supported.\n");
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305078 return;
5079 }
5080
Daniel Vetter1fcc9d12014-07-11 10:30:10 -07005081 /*
Rodrigo Vivie4d59f62014-11-20 02:22:08 -08005082 * FIXME: This needs proper synchronization with psr state for some
5083 * platforms that cannot have PSR and DRRS enabled at the same time.
Daniel Vetter1fcc9d12014-07-11 10:30:10 -07005084 */
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305085
Vandana Kannan96178ee2015-01-10 02:25:56 +05305086 dig_port = dp_to_dig_port(intel_dp);
5087 encoder = &dig_port->base;
Ander Conselvan de Oliveira723f9aa2015-03-20 16:18:18 +02005088 intel_crtc = to_intel_crtc(encoder->base.crtc);
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305089
5090 if (!intel_crtc) {
5091 DRM_DEBUG_KMS("DRRS: intel_crtc not initialized\n");
5092 return;
5093 }
5094
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02005095 config = intel_crtc->config;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305096
Vandana Kannan96178ee2015-01-10 02:25:56 +05305097 if (dev_priv->drrs.type < SEAMLESS_DRRS_SUPPORT) {
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305098 DRM_DEBUG_KMS("Only Seamless DRRS supported.\n");
5099 return;
5100 }
5101
Vandana Kannan96178ee2015-01-10 02:25:56 +05305102 if (intel_dp->attached_connector->panel.downclock_mode->vrefresh ==
5103 refresh_rate)
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305104 index = DRRS_LOW_RR;
5105
Vandana Kannan96178ee2015-01-10 02:25:56 +05305106 if (index == dev_priv->drrs.refresh_rate_type) {
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305107 DRM_DEBUG_KMS(
5108 "DRRS requested for previously set RR...ignoring\n");
5109 return;
5110 }
5111
5112 if (!intel_crtc->active) {
5113 DRM_DEBUG_KMS("eDP encoder disabled. CRTC not Active\n");
5114 return;
5115 }
5116
Durgadoss R44395bf2015-02-13 15:33:02 +05305117 if (INTEL_INFO(dev)->gen >= 8 && !IS_CHERRYVIEW(dev)) {
Vandana Kannana4c30b12015-02-13 15:33:00 +05305118 switch (index) {
5119 case DRRS_HIGH_RR:
5120 intel_dp_set_m_n(intel_crtc, M1_N1);
5121 break;
5122 case DRRS_LOW_RR:
5123 intel_dp_set_m_n(intel_crtc, M2_N2);
5124 break;
5125 case DRRS_MAX_RR:
5126 default:
5127 DRM_ERROR("Unsupported refreshrate type\n");
5128 }
5129 } else if (INTEL_INFO(dev)->gen > 6) {
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02005130 reg = PIPECONF(intel_crtc->config->cpu_transcoder);
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305131 val = I915_READ(reg);
Vandana Kannana4c30b12015-02-13 15:33:00 +05305132
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305133 if (index > DRRS_HIGH_RR) {
Vandana Kannan6fa7aec2015-02-13 15:33:01 +05305134 if (IS_VALLEYVIEW(dev))
5135 val |= PIPECONF_EDP_RR_MODE_SWITCH_VLV;
5136 else
5137 val |= PIPECONF_EDP_RR_MODE_SWITCH;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305138 } else {
Vandana Kannan6fa7aec2015-02-13 15:33:01 +05305139 if (IS_VALLEYVIEW(dev))
5140 val &= ~PIPECONF_EDP_RR_MODE_SWITCH_VLV;
5141 else
5142 val &= ~PIPECONF_EDP_RR_MODE_SWITCH;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305143 }
5144 I915_WRITE(reg, val);
5145 }
5146
Vandana Kannan4e9ac942015-01-22 15:14:45 +05305147 dev_priv->drrs.refresh_rate_type = index;
5148
5149 DRM_DEBUG_KMS("eDP Refresh Rate set to : %dHz\n", refresh_rate);
5150}
5151
Vandana Kannanb33a2812015-02-13 15:33:03 +05305152/**
5153 * intel_edp_drrs_enable - init drrs struct if supported
5154 * @intel_dp: DP struct
5155 *
5156 * Initializes frontbuffer_bits and drrs.dp
5157 */
Vandana Kannanc3955782015-01-22 15:17:40 +05305158void intel_edp_drrs_enable(struct intel_dp *intel_dp)
5159{
5160 struct drm_device *dev = intel_dp_to_dev(intel_dp);
5161 struct drm_i915_private *dev_priv = dev->dev_private;
5162 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
5163 struct drm_crtc *crtc = dig_port->base.base.crtc;
5164 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
5165
5166 if (!intel_crtc->config->has_drrs) {
5167 DRM_DEBUG_KMS("Panel doesn't support DRRS\n");
5168 return;
5169 }
5170
5171 mutex_lock(&dev_priv->drrs.mutex);
5172 if (WARN_ON(dev_priv->drrs.dp)) {
5173 DRM_ERROR("DRRS already enabled\n");
5174 goto unlock;
5175 }
5176
5177 dev_priv->drrs.busy_frontbuffer_bits = 0;
5178
5179 dev_priv->drrs.dp = intel_dp;
5180
5181unlock:
5182 mutex_unlock(&dev_priv->drrs.mutex);
5183}
5184
Vandana Kannanb33a2812015-02-13 15:33:03 +05305185/**
5186 * intel_edp_drrs_disable - Disable DRRS
5187 * @intel_dp: DP struct
5188 *
5189 */
Vandana Kannanc3955782015-01-22 15:17:40 +05305190void intel_edp_drrs_disable(struct intel_dp *intel_dp)
5191{
5192 struct drm_device *dev = intel_dp_to_dev(intel_dp);
5193 struct drm_i915_private *dev_priv = dev->dev_private;
5194 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
5195 struct drm_crtc *crtc = dig_port->base.base.crtc;
5196 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
5197
5198 if (!intel_crtc->config->has_drrs)
5199 return;
5200
5201 mutex_lock(&dev_priv->drrs.mutex);
5202 if (!dev_priv->drrs.dp) {
5203 mutex_unlock(&dev_priv->drrs.mutex);
5204 return;
5205 }
5206
5207 if (dev_priv->drrs.refresh_rate_type == DRRS_LOW_RR)
5208 intel_dp_set_drrs_state(dev_priv->dev,
5209 intel_dp->attached_connector->panel.
5210 fixed_mode->vrefresh);
5211
5212 dev_priv->drrs.dp = NULL;
5213 mutex_unlock(&dev_priv->drrs.mutex);
5214
5215 cancel_delayed_work_sync(&dev_priv->drrs.work);
5216}
5217
Vandana Kannan4e9ac942015-01-22 15:14:45 +05305218static void intel_edp_drrs_downclock_work(struct work_struct *work)
5219{
5220 struct drm_i915_private *dev_priv =
5221 container_of(work, typeof(*dev_priv), drrs.work.work);
5222 struct intel_dp *intel_dp;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305223
Vandana Kannan96178ee2015-01-10 02:25:56 +05305224 mutex_lock(&dev_priv->drrs.mutex);
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305225
Vandana Kannan4e9ac942015-01-22 15:14:45 +05305226 intel_dp = dev_priv->drrs.dp;
5227
5228 if (!intel_dp)
5229 goto unlock;
5230
5231 /*
5232 * The delayed work can race with an invalidate hence we need to
5233 * recheck.
5234 */
5235
5236 if (dev_priv->drrs.busy_frontbuffer_bits)
5237 goto unlock;
5238
5239 if (dev_priv->drrs.refresh_rate_type != DRRS_LOW_RR)
5240 intel_dp_set_drrs_state(dev_priv->dev,
5241 intel_dp->attached_connector->panel.
5242 downclock_mode->vrefresh);
5243
5244unlock:
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305245
Vandana Kannan96178ee2015-01-10 02:25:56 +05305246 mutex_unlock(&dev_priv->drrs.mutex);
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305247}
5248
Vandana Kannanb33a2812015-02-13 15:33:03 +05305249/**
5250 * intel_edp_drrs_invalidate - Invalidate DRRS
5251 * @dev: DRM device
5252 * @frontbuffer_bits: frontbuffer plane tracking bits
5253 *
5254 * When there is a disturbance on screen (due to cursor movement/time
5255 * update etc), DRRS needs to be invalidated, i.e. need to switch to
5256 * high RR.
5257 *
5258 * Dirty frontbuffers relevant to DRRS are tracked in busy_frontbuffer_bits.
5259 */
Vandana Kannana93fad02015-01-10 02:25:59 +05305260void intel_edp_drrs_invalidate(struct drm_device *dev,
5261 unsigned frontbuffer_bits)
5262{
5263 struct drm_i915_private *dev_priv = dev->dev_private;
5264 struct drm_crtc *crtc;
5265 enum pipe pipe;
5266
5267 if (!dev_priv->drrs.dp)
5268 return;
5269
Ramalingam C3954e732015-03-03 12:11:46 +05305270 cancel_delayed_work_sync(&dev_priv->drrs.work);
5271
Vandana Kannana93fad02015-01-10 02:25:59 +05305272 mutex_lock(&dev_priv->drrs.mutex);
5273 crtc = dp_to_dig_port(dev_priv->drrs.dp)->base.base.crtc;
5274 pipe = to_intel_crtc(crtc)->pipe;
5275
5276 if (dev_priv->drrs.refresh_rate_type == DRRS_LOW_RR) {
Vandana Kannana93fad02015-01-10 02:25:59 +05305277 intel_dp_set_drrs_state(dev_priv->dev,
5278 dev_priv->drrs.dp->attached_connector->panel.
5279 fixed_mode->vrefresh);
5280 }
5281
5282 frontbuffer_bits &= INTEL_FRONTBUFFER_ALL_MASK(pipe);
5283
5284 dev_priv->drrs.busy_frontbuffer_bits |= frontbuffer_bits;
5285 mutex_unlock(&dev_priv->drrs.mutex);
5286}
5287
Vandana Kannanb33a2812015-02-13 15:33:03 +05305288/**
5289 * intel_edp_drrs_flush - Flush DRRS
5290 * @dev: DRM device
5291 * @frontbuffer_bits: frontbuffer plane tracking bits
5292 *
5293 * When there is no movement on screen, DRRS work can be scheduled.
5294 * This DRRS work is responsible for setting relevant registers after a
5295 * timeout of 1 second.
5296 *
5297 * Dirty frontbuffers relevant to DRRS are tracked in busy_frontbuffer_bits.
5298 */
Vandana Kannana93fad02015-01-10 02:25:59 +05305299void intel_edp_drrs_flush(struct drm_device *dev,
5300 unsigned frontbuffer_bits)
5301{
5302 struct drm_i915_private *dev_priv = dev->dev_private;
5303 struct drm_crtc *crtc;
5304 enum pipe pipe;
5305
5306 if (!dev_priv->drrs.dp)
5307 return;
5308
Ramalingam C3954e732015-03-03 12:11:46 +05305309 cancel_delayed_work_sync(&dev_priv->drrs.work);
5310
Vandana Kannana93fad02015-01-10 02:25:59 +05305311 mutex_lock(&dev_priv->drrs.mutex);
5312 crtc = dp_to_dig_port(dev_priv->drrs.dp)->base.base.crtc;
5313 pipe = to_intel_crtc(crtc)->pipe;
5314 dev_priv->drrs.busy_frontbuffer_bits &= ~frontbuffer_bits;
5315
Vandana Kannana93fad02015-01-10 02:25:59 +05305316 if (dev_priv->drrs.refresh_rate_type != DRRS_LOW_RR &&
5317 !dev_priv->drrs.busy_frontbuffer_bits)
5318 schedule_delayed_work(&dev_priv->drrs.work,
5319 msecs_to_jiffies(1000));
5320 mutex_unlock(&dev_priv->drrs.mutex);
5321}
5322
Vandana Kannanb33a2812015-02-13 15:33:03 +05305323/**
5324 * DOC: Display Refresh Rate Switching (DRRS)
5325 *
5326 * Display Refresh Rate Switching (DRRS) is a power conservation feature
5327 * which enables swtching between low and high refresh rates,
5328 * dynamically, based on the usage scenario. This feature is applicable
5329 * for internal panels.
5330 *
5331 * Indication that the panel supports DRRS is given by the panel EDID, which
5332 * would list multiple refresh rates for one resolution.
5333 *
5334 * DRRS is of 2 types - static and seamless.
5335 * Static DRRS involves changing refresh rate (RR) by doing a full modeset
5336 * (may appear as a blink on screen) and is used in dock-undock scenario.
5337 * Seamless DRRS involves changing RR without any visual effect to the user
5338 * and can be used during normal system usage. This is done by programming
5339 * certain registers.
5340 *
5341 * Support for static/seamless DRRS may be indicated in the VBT based on
5342 * inputs from the panel spec.
5343 *
5344 * DRRS saves power by switching to low RR based on usage scenarios.
5345 *
5346 * eDP DRRS:-
5347 * The implementation is based on frontbuffer tracking implementation.
5348 * When there is a disturbance on the screen triggered by user activity or a
5349 * periodic system activity, DRRS is disabled (RR is changed to high RR).
5350 * When there is no movement on screen, after a timeout of 1 second, a switch
5351 * to low RR is made.
5352 * For integration with frontbuffer tracking code,
5353 * intel_edp_drrs_invalidate() and intel_edp_drrs_flush() are called.
5354 *
5355 * DRRS can be further extended to support other internal panels and also
5356 * the scenario of video playback wherein RR is set based on the rate
5357 * requested by userspace.
5358 */
5359
5360/**
5361 * intel_dp_drrs_init - Init basic DRRS work and mutex.
5362 * @intel_connector: eDP connector
5363 * @fixed_mode: preferred mode of panel
5364 *
5365 * This function is called only once at driver load to initialize basic
5366 * DRRS stuff.
5367 *
5368 * Returns:
5369 * Downclock mode if panel supports it, else return NULL.
5370 * DRRS support is determined by the presence of downclock mode (apart
5371 * from VBT setting).
5372 */
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305373static struct drm_display_mode *
Vandana Kannan96178ee2015-01-10 02:25:56 +05305374intel_dp_drrs_init(struct intel_connector *intel_connector,
5375 struct drm_display_mode *fixed_mode)
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305376{
5377 struct drm_connector *connector = &intel_connector->base;
Vandana Kannan96178ee2015-01-10 02:25:56 +05305378 struct drm_device *dev = connector->dev;
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305379 struct drm_i915_private *dev_priv = dev->dev_private;
5380 struct drm_display_mode *downclock_mode = NULL;
5381
5382 if (INTEL_INFO(dev)->gen <= 6) {
5383 DRM_DEBUG_KMS("DRRS supported for Gen7 and above\n");
5384 return NULL;
5385 }
5386
5387 if (dev_priv->vbt.drrs_type != SEAMLESS_DRRS_SUPPORT) {
Damien Lespiau4079b8d2014-08-05 10:39:42 +01005388 DRM_DEBUG_KMS("VBT doesn't support DRRS\n");
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305389 return NULL;
5390 }
5391
5392 downclock_mode = intel_find_panel_downclock
5393 (dev, fixed_mode, connector);
5394
5395 if (!downclock_mode) {
Ramalingam Ca1d26342015-02-23 17:38:33 +05305396 DRM_DEBUG_KMS("Downclock mode is not found. DRRS not supported\n");
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305397 return NULL;
5398 }
5399
Vandana Kannan4e9ac942015-01-22 15:14:45 +05305400 INIT_DELAYED_WORK(&dev_priv->drrs.work, intel_edp_drrs_downclock_work);
5401
Vandana Kannan96178ee2015-01-10 02:25:56 +05305402 mutex_init(&dev_priv->drrs.mutex);
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305403
Vandana Kannan96178ee2015-01-10 02:25:56 +05305404 dev_priv->drrs.type = dev_priv->vbt.drrs_type;
Pradeep Bhat439d7ac2014-04-05 12:13:28 +05305405
Vandana Kannan96178ee2015-01-10 02:25:56 +05305406 dev_priv->drrs.refresh_rate_type = DRRS_HIGH_RR;
Damien Lespiau4079b8d2014-08-05 10:39:42 +01005407 DRM_DEBUG_KMS("seamless DRRS supported for eDP panel.\n");
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305408 return downclock_mode;
5409}
5410
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005411static bool intel_edp_init_connector(struct intel_dp *intel_dp,
Ville Syrjälä36b5f422014-10-16 21:27:30 +03005412 struct intel_connector *intel_connector)
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005413{
5414 struct drm_connector *connector = &intel_connector->base;
5415 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
Paulo Zanoni63635212014-04-22 19:55:42 -03005416 struct intel_encoder *intel_encoder = &intel_dig_port->base;
5417 struct drm_device *dev = intel_encoder->base.dev;
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005418 struct drm_i915_private *dev_priv = dev->dev_private;
5419 struct drm_display_mode *fixed_mode = NULL;
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305420 struct drm_display_mode *downclock_mode = NULL;
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005421 bool has_dpcd;
5422 struct drm_display_mode *scan;
5423 struct edid *edid;
Ville Syrjälä6517d272014-11-07 11:16:02 +02005424 enum pipe pipe = INVALID_PIPE;
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005425
5426 if (!is_edp(intel_dp))
5427 return true;
5428
Ville Syrjälä49e6bc52014-10-28 16:15:52 +02005429 pps_lock(intel_dp);
5430 intel_edp_panel_vdd_sanitize(intel_dp);
5431 pps_unlock(intel_dp);
Paulo Zanoni63635212014-04-22 19:55:42 -03005432
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005433 /* Cache DPCD and EDID for edp. */
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005434 has_dpcd = intel_dp_get_dpcd(intel_dp);
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005435
5436 if (has_dpcd) {
5437 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11)
5438 dev_priv->no_aux_handshake =
5439 intel_dp->dpcd[DP_MAX_DOWNSPREAD] &
5440 DP_NO_AUX_HANDSHAKE_LINK_TRAINING;
5441 } else {
5442 /* if this fails, presume the device is a ghost */
5443 DRM_INFO("failed to retrieve link info, disabling eDP\n");
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005444 return false;
5445 }
5446
5447 /* We now know it's not a ghost, init power sequence regs. */
Ville Syrjälä773538e82014-09-04 14:54:56 +03005448 pps_lock(intel_dp);
Ville Syrjälä36b5f422014-10-16 21:27:30 +03005449 intel_dp_init_panel_power_sequencer_registers(dev, intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03005450 pps_unlock(intel_dp);
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005451
Daniel Vetter060c8772014-03-21 23:22:35 +01005452 mutex_lock(&dev->mode_config.mutex);
Jani Nikula0b998362014-03-14 16:51:17 +02005453 edid = drm_get_edid(connector, &intel_dp->aux.ddc);
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005454 if (edid) {
5455 if (drm_add_edid_modes(connector, edid)) {
5456 drm_mode_connector_update_edid_property(connector,
5457 edid);
5458 drm_edid_to_eld(connector, edid);
5459 } else {
5460 kfree(edid);
5461 edid = ERR_PTR(-EINVAL);
5462 }
5463 } else {
5464 edid = ERR_PTR(-ENOENT);
5465 }
5466 intel_connector->edid = edid;
5467
5468 /* prefer fixed mode from EDID if available */
5469 list_for_each_entry(scan, &connector->probed_modes, head) {
5470 if ((scan->type & DRM_MODE_TYPE_PREFERRED)) {
5471 fixed_mode = drm_mode_duplicate(dev, scan);
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305472 downclock_mode = intel_dp_drrs_init(
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305473 intel_connector, fixed_mode);
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005474 break;
5475 }
5476 }
5477
5478 /* fallback to VBT if available for eDP */
5479 if (!fixed_mode && dev_priv->vbt.lfp_lvds_vbt_mode) {
5480 fixed_mode = drm_mode_duplicate(dev,
5481 dev_priv->vbt.lfp_lvds_vbt_mode);
5482 if (fixed_mode)
5483 fixed_mode->type |= DRM_MODE_TYPE_PREFERRED;
5484 }
Daniel Vetter060c8772014-03-21 23:22:35 +01005485 mutex_unlock(&dev->mode_config.mutex);
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005486
Clint Taylor01527b32014-07-07 13:01:46 -07005487 if (IS_VALLEYVIEW(dev)) {
5488 intel_dp->edp_notifier.notifier_call = edp_notify_handler;
5489 register_reboot_notifier(&intel_dp->edp_notifier);
Ville Syrjälä6517d272014-11-07 11:16:02 +02005490
5491 /*
5492 * Figure out the current pipe for the initial backlight setup.
5493 * If the current pipe isn't valid, try the PPS pipe, and if that
5494 * fails just assume pipe A.
5495 */
5496 if (IS_CHERRYVIEW(dev))
5497 pipe = DP_PORT_TO_PIPE_CHV(intel_dp->DP);
5498 else
5499 pipe = PORT_TO_PIPE(intel_dp->DP);
5500
5501 if (pipe != PIPE_A && pipe != PIPE_B)
5502 pipe = intel_dp->pps_pipe;
5503
5504 if (pipe != PIPE_A && pipe != PIPE_B)
5505 pipe = PIPE_A;
5506
5507 DRM_DEBUG_KMS("using pipe %c for initial backlight setup\n",
5508 pipe_name(pipe));
Clint Taylor01527b32014-07-07 13:01:46 -07005509 }
5510
Pradeep Bhat4f9db5b2014-04-05 12:12:31 +05305511 intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode);
Jani Nikula73580fb72014-08-12 17:11:41 +03005512 intel_connector->panel.backlight_power = intel_edp_backlight_power;
Ville Syrjälä6517d272014-11-07 11:16:02 +02005513 intel_panel_setup_backlight(connector, pipe);
Paulo Zanonied92f0b2013-06-12 17:27:24 -03005514
5515 return true;
5516}
5517
Paulo Zanoni16c25532013-06-12 17:27:25 -03005518bool
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005519intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
5520 struct intel_connector *intel_connector)
Keith Packarda4fc5ed2009-04-07 16:16:42 -07005521{
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005522 struct drm_connector *connector = &intel_connector->base;
5523 struct intel_dp *intel_dp = &intel_dig_port->dp;
5524 struct intel_encoder *intel_encoder = &intel_dig_port->base;
5525 struct drm_device *dev = intel_encoder->base.dev;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07005526 struct drm_i915_private *dev_priv = dev->dev_private;
Paulo Zanoni174edf12012-10-26 19:05:50 -02005527 enum port port = intel_dig_port->port;
Jani Nikula0b998362014-03-14 16:51:17 +02005528 int type;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07005529
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03005530 intel_dp->pps_pipe = INVALID_PIPE;
5531
Damien Lespiauec5b01d2014-01-21 13:35:39 +00005532 /* intel_dp vfuncs */
Damien Lespiaub6b5e382014-01-20 16:00:59 +00005533 if (INTEL_INFO(dev)->gen >= 9)
5534 intel_dp->get_aux_clock_divider = skl_get_aux_clock_divider;
5535 else if (IS_VALLEYVIEW(dev))
Damien Lespiauec5b01d2014-01-21 13:35:39 +00005536 intel_dp->get_aux_clock_divider = vlv_get_aux_clock_divider;
5537 else if (IS_HASWELL(dev) || IS_BROADWELL(dev))
5538 intel_dp->get_aux_clock_divider = hsw_get_aux_clock_divider;
5539 else if (HAS_PCH_SPLIT(dev))
5540 intel_dp->get_aux_clock_divider = ilk_get_aux_clock_divider;
5541 else
5542 intel_dp->get_aux_clock_divider = i9xx_get_aux_clock_divider;
5543
Damien Lespiaub9ca5fa2014-01-20 16:01:00 +00005544 if (INTEL_INFO(dev)->gen >= 9)
5545 intel_dp->get_aux_send_ctl = skl_get_aux_send_ctl;
5546 else
5547 intel_dp->get_aux_send_ctl = i9xx_get_aux_send_ctl;
Damien Lespiau153b1102014-01-21 13:37:15 +00005548
Daniel Vetter07679352012-09-06 22:15:42 +02005549 /* Preserve the current hw state. */
5550 intel_dp->DP = I915_READ(intel_dp->output_reg);
Jani Nikuladd06f902012-10-19 14:51:50 +03005551 intel_dp->attached_connector = intel_connector;
Chris Wilson3d3dc142011-02-12 10:33:12 +00005552
Ville Syrjälä3b32a352013-11-01 18:22:41 +02005553 if (intel_dp_is_edp(dev, port))
Gajanan Bhat19c03922012-09-27 19:13:07 +05305554 type = DRM_MODE_CONNECTOR_eDP;
Ville Syrjälä3b32a352013-11-01 18:22:41 +02005555 else
5556 type = DRM_MODE_CONNECTOR_DisplayPort;
Adam Jacksonb3295302010-07-16 14:46:28 -04005557
Imre Deakf7d24902013-05-08 13:14:05 +03005558 /*
5559 * For eDP we always set the encoder type to INTEL_OUTPUT_EDP, but
5560 * for DP the encoder type can be set by the caller to
5561 * INTEL_OUTPUT_UNKNOWN for DDI, so don't rewrite it.
5562 */
5563 if (type == DRM_MODE_CONNECTOR_eDP)
5564 intel_encoder->type = INTEL_OUTPUT_EDP;
5565
Ville Syrjäläc17ed5b2014-10-16 21:27:27 +03005566 /* eDP only on port B and/or C on vlv/chv */
5567 if (WARN_ON(IS_VALLEYVIEW(dev) && is_edp(intel_dp) &&
5568 port != PORT_B && port != PORT_C))
5569 return false;
5570
Imre Deake7281ea2013-05-08 13:14:08 +03005571 DRM_DEBUG_KMS("Adding %s connector on port %c\n",
5572 type == DRM_MODE_CONNECTOR_eDP ? "eDP" : "DP",
5573 port_name(port));
5574
Adam Jacksonb3295302010-07-16 14:46:28 -04005575 drm_connector_init(dev, connector, &intel_dp_connector_funcs, type);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07005576 drm_connector_helper_add(connector, &intel_dp_connector_helper_funcs);
5577
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005578 connector->interlace_allowed = true;
5579 connector->doublescan_allowed = 0;
Ma Lingf8aed702009-08-24 13:50:24 +08005580
Daniel Vetter66a92782012-07-12 20:08:18 +02005581 INIT_DELAYED_WORK(&intel_dp->panel_vdd_work,
Daniel Vetter4be73782014-01-17 14:39:48 +01005582 edp_panel_vdd_work);
Zhenyu Wang6251ec02010-01-12 05:38:32 +08005583
Chris Wilsondf0e9242010-09-09 16:20:55 +01005584 intel_connector_attach_encoder(intel_connector, intel_encoder);
Thomas Wood34ea3d32014-05-29 16:57:41 +01005585 drm_connector_register(connector);
Keith Packarda4fc5ed2009-04-07 16:16:42 -07005586
Paulo Zanoniaffa9352012-11-23 15:30:39 -02005587 if (HAS_DDI(dev))
Paulo Zanonibcbc8892012-10-26 19:05:51 -02005588 intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
5589 else
5590 intel_connector->get_hw_state = intel_connector_get_hw_state;
Imre Deak80f65de2014-02-11 17:12:49 +02005591 intel_connector->unregister = intel_dp_connector_unregister;
Paulo Zanonibcbc8892012-10-26 19:05:51 -02005592
Jani Nikula0b998362014-03-14 16:51:17 +02005593 /* Set up the hotplug pin. */
Paulo Zanoniab9d7c32012-07-17 17:53:45 -03005594 switch (port) {
5595 case PORT_A:
Egbert Eich1d843f92013-02-25 12:06:49 -05005596 intel_encoder->hpd_pin = HPD_PORT_A;
Paulo Zanoniab9d7c32012-07-17 17:53:45 -03005597 break;
5598 case PORT_B:
Egbert Eich1d843f92013-02-25 12:06:49 -05005599 intel_encoder->hpd_pin = HPD_PORT_B;
Paulo Zanoniab9d7c32012-07-17 17:53:45 -03005600 break;
5601 case PORT_C:
Egbert Eich1d843f92013-02-25 12:06:49 -05005602 intel_encoder->hpd_pin = HPD_PORT_C;
Paulo Zanoniab9d7c32012-07-17 17:53:45 -03005603 break;
5604 case PORT_D:
Egbert Eich1d843f92013-02-25 12:06:49 -05005605 intel_encoder->hpd_pin = HPD_PORT_D;
Paulo Zanoniab9d7c32012-07-17 17:53:45 -03005606 break;
5607 default:
Damien Lespiauad1c0b12013-03-07 15:30:28 +00005608 BUG();
Zhenyu Wang5eb08b62009-07-24 01:00:31 +08005609 }
5610
Imre Deakdada1a92014-01-29 13:25:41 +02005611 if (is_edp(intel_dp)) {
Ville Syrjälä773538e82014-09-04 14:54:56 +03005612 pps_lock(intel_dp);
Ville Syrjälä1e74a322014-10-28 16:15:51 +02005613 intel_dp_init_panel_power_timestamps(intel_dp);
5614 if (IS_VALLEYVIEW(dev))
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03005615 vlv_initial_power_sequencer_setup(intel_dp);
Ville Syrjälä1e74a322014-10-28 16:15:51 +02005616 else
Ville Syrjälä36b5f422014-10-16 21:27:30 +03005617 intel_dp_init_panel_power_sequencer(dev, intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03005618 pps_unlock(intel_dp);
Imre Deakdada1a92014-01-29 13:25:41 +02005619 }
Paulo Zanoni0095e6d2013-12-19 14:29:39 -02005620
Jani Nikula9d1a1032014-03-14 16:51:15 +02005621 intel_dp_aux_init(intel_dp, intel_connector);
Dave Airliec1f05262012-08-30 11:06:18 +10005622
Dave Airlie0e32b392014-05-02 14:02:48 +10005623 /* init MST on ports that can support it */
Damien Lespiauc86ea3d2014-12-12 14:26:58 +00005624 if (IS_HASWELL(dev) || IS_BROADWELL(dev) || INTEL_INFO(dev)->gen >= 9) {
Dave Airlie0e32b392014-05-02 14:02:48 +10005625 if (port == PORT_B || port == PORT_C || port == PORT_D) {
Ville Syrjäläa4a5d2f2014-09-04 14:54:20 +03005626 intel_dp_mst_encoder_init(intel_dig_port,
5627 intel_connector->base.base.id);
Dave Airlie0e32b392014-05-02 14:02:48 +10005628 }
5629 }
5630
Ville Syrjälä36b5f422014-10-16 21:27:30 +03005631 if (!intel_edp_init_connector(intel_dp, intel_connector)) {
Dave Airlie4f71d0c2014-06-04 16:02:28 +10005632 drm_dp_aux_unregister(&intel_dp->aux);
Paulo Zanoni15b1d172013-06-12 17:27:27 -03005633 if (is_edp(intel_dp)) {
5634 cancel_delayed_work_sync(&intel_dp->panel_vdd_work);
Ville Syrjälä951468f2014-09-04 14:55:31 +03005635 /*
5636 * vdd might still be enabled do to the delayed vdd off.
5637 * Make sure vdd is actually turned off here.
5638 */
Ville Syrjälä773538e82014-09-04 14:54:56 +03005639 pps_lock(intel_dp);
Daniel Vetter4be73782014-01-17 14:39:48 +01005640 edp_panel_vdd_off_sync(intel_dp);
Ville Syrjälä773538e82014-09-04 14:54:56 +03005641 pps_unlock(intel_dp);
Paulo Zanoni15b1d172013-06-12 17:27:27 -03005642 }
Thomas Wood34ea3d32014-05-29 16:57:41 +01005643 drm_connector_unregister(connector);
Paulo Zanonib2f246a2013-06-12 17:27:26 -03005644 drm_connector_cleanup(connector);
Paulo Zanoni16c25532013-06-12 17:27:25 -03005645 return false;
Paulo Zanonib2f246a2013-06-12 17:27:26 -03005646 }
Zhenyu Wang32f9d652009-07-24 01:00:32 +08005647
Chris Wilsonf6849602010-09-19 09:29:33 +01005648 intel_dp_add_properties(intel_dp, connector);
5649
Keith Packarda4fc5ed2009-04-07 16:16:42 -07005650 /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
5651 * 0xd. Failure to do so will result in spurious interrupts being
5652 * generated on the port when a cable is not attached.
5653 */
5654 if (IS_G4X(dev) && !IS_GM45(dev)) {
5655 u32 temp = I915_READ(PEG_BAND_GAP_DATA);
5656 I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
5657 }
Paulo Zanoni16c25532013-06-12 17:27:25 -03005658
Jani Nikulaaa7471d2015-04-01 11:15:21 +03005659 i915_debugfs_connector_add(connector);
5660
Paulo Zanoni16c25532013-06-12 17:27:25 -03005661 return true;
Keith Packarda4fc5ed2009-04-07 16:16:42 -07005662}
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005663
5664void
5665intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
5666{
Dave Airlie13cf5502014-06-18 11:29:35 +10005667 struct drm_i915_private *dev_priv = dev->dev_private;
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005668 struct intel_digital_port *intel_dig_port;
5669 struct intel_encoder *intel_encoder;
5670 struct drm_encoder *encoder;
5671 struct intel_connector *intel_connector;
5672
Daniel Vetterb14c5672013-09-19 12:18:32 +02005673 intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005674 if (!intel_dig_port)
5675 return;
5676
Ander Conselvan de Oliveira9bdbd0b2015-04-10 10:59:10 +03005677 intel_connector = intel_connector_alloc();
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005678 if (!intel_connector) {
5679 kfree(intel_dig_port);
5680 return;
5681 }
5682
5683 intel_encoder = &intel_dig_port->base;
5684 encoder = &intel_encoder->base;
5685
5686 drm_encoder_init(dev, &intel_encoder->base, &intel_dp_enc_funcs,
5687 DRM_MODE_ENCODER_TMDS);
5688
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01005689 intel_encoder->compute_config = intel_dp_compute_config;
Paulo Zanoni00c09d72012-10-26 19:05:52 -02005690 intel_encoder->disable = intel_disable_dp;
Paulo Zanoni00c09d72012-10-26 19:05:52 -02005691 intel_encoder->get_hw_state = intel_dp_get_hw_state;
Jesse Barnes045ac3b2013-05-14 17:08:26 -07005692 intel_encoder->get_config = intel_dp_get_config;
Imre Deak07f9cd02014-08-18 14:42:45 +03005693 intel_encoder->suspend = intel_dp_encoder_suspend;
Chon Ming Leee4a1d842014-04-09 13:28:20 +03005694 if (IS_CHERRYVIEW(dev)) {
Ville Syrjälä9197c882014-04-09 13:29:05 +03005695 intel_encoder->pre_pll_enable = chv_dp_pre_pll_enable;
Chon Ming Leee4a1d842014-04-09 13:28:20 +03005696 intel_encoder->pre_enable = chv_pre_enable_dp;
5697 intel_encoder->enable = vlv_enable_dp;
Ville Syrjälä580d3812014-04-09 13:29:00 +03005698 intel_encoder->post_disable = chv_post_disable_dp;
Chon Ming Leee4a1d842014-04-09 13:28:20 +03005699 } else if (IS_VALLEYVIEW(dev)) {
Jani Nikulaecff4f32013-09-06 07:38:29 +03005700 intel_encoder->pre_pll_enable = vlv_dp_pre_pll_enable;
Jani Nikulaab1f90f2013-07-30 12:20:30 +03005701 intel_encoder->pre_enable = vlv_pre_enable_dp;
5702 intel_encoder->enable = vlv_enable_dp;
Ville Syrjälä49277c32014-03-31 18:21:26 +03005703 intel_encoder->post_disable = vlv_post_disable_dp;
Jani Nikulaab1f90f2013-07-30 12:20:30 +03005704 } else {
Jani Nikulaecff4f32013-09-06 07:38:29 +03005705 intel_encoder->pre_enable = g4x_pre_enable_dp;
5706 intel_encoder->enable = g4x_enable_dp;
Ville Syrjälä08aff3f2014-08-18 22:16:09 +03005707 if (INTEL_INFO(dev)->gen >= 5)
5708 intel_encoder->post_disable = ilk_post_disable_dp;
Jani Nikulaab1f90f2013-07-30 12:20:30 +03005709 }
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005710
Paulo Zanoni174edf12012-10-26 19:05:50 -02005711 intel_dig_port->port = port;
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005712 intel_dig_port->dp.output_reg = output_reg;
5713
Paulo Zanoni00c09d72012-10-26 19:05:52 -02005714 intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT;
Ville Syrjälä882ec382014-04-28 14:07:43 +03005715 if (IS_CHERRYVIEW(dev)) {
5716 if (port == PORT_D)
5717 intel_encoder->crtc_mask = 1 << 2;
5718 else
5719 intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
5720 } else {
5721 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
5722 }
Ville Syrjäläbc079e82014-03-03 16:15:28 +02005723 intel_encoder->cloneable = 0;
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005724 intel_encoder->hot_plug = intel_dp_hot_plug;
5725
Dave Airlie13cf5502014-06-18 11:29:35 +10005726 intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
5727 dev_priv->hpd_irq_port[port] = intel_dig_port;
5728
Paulo Zanoni15b1d172013-06-12 17:27:27 -03005729 if (!intel_dp_init_connector(intel_dig_port, intel_connector)) {
5730 drm_encoder_cleanup(encoder);
5731 kfree(intel_dig_port);
Paulo Zanonib2f246a2013-06-12 17:27:26 -03005732 kfree(intel_connector);
Paulo Zanoni15b1d172013-06-12 17:27:27 -03005733 }
Paulo Zanonif0fec3f2012-10-26 19:05:48 -02005734}
Dave Airlie0e32b392014-05-02 14:02:48 +10005735
5736void intel_dp_mst_suspend(struct drm_device *dev)
5737{
5738 struct drm_i915_private *dev_priv = dev->dev_private;
5739 int i;
5740
5741 /* disable MST */
5742 for (i = 0; i < I915_MAX_PORTS; i++) {
5743 struct intel_digital_port *intel_dig_port = dev_priv->hpd_irq_port[i];
5744 if (!intel_dig_port)
5745 continue;
5746
5747 if (intel_dig_port->base.type == INTEL_OUTPUT_DISPLAYPORT) {
5748 if (!intel_dig_port->dp.can_mst)
5749 continue;
5750 if (intel_dig_port->dp.is_mst)
5751 drm_dp_mst_topology_mgr_suspend(&intel_dig_port->dp.mst_mgr);
5752 }
5753 }
5754}
5755
5756void intel_dp_mst_resume(struct drm_device *dev)
5757{
5758 struct drm_i915_private *dev_priv = dev->dev_private;
5759 int i;
5760
5761 for (i = 0; i < I915_MAX_PORTS; i++) {
5762 struct intel_digital_port *intel_dig_port = dev_priv->hpd_irq_port[i];
5763 if (!intel_dig_port)
5764 continue;
5765 if (intel_dig_port->base.type == INTEL_OUTPUT_DISPLAYPORT) {
5766 int ret;
5767
5768 if (!intel_dig_port->dp.can_mst)
5769 continue;
5770
5771 ret = drm_dp_mst_topology_mgr_resume(&intel_dig_port->dp.mst_mgr);
5772 if (ret != 0) {
5773 intel_dp_check_mst_status(&intel_dig_port->dp);
5774 }
5775 }
5776 }
5777}