drm/i915: ->disable hook for WRPLLs
[deliverable/linux.git] / drivers / gpu / drm / i915 / intel_ddi.c
CommitLineData
45244b87
ED
1/*
2 * Copyright © 2012 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 * Eugeni Dodonov <eugeni.dodonov@intel.com>
25 *
26 */
27
28#include "i915_drv.h"
29#include "intel_drv.h"
30
31/* HDMI/DVI modes ignore everything but the last 2 items. So we share
32 * them for both DP and FDI transports, allowing those ports to
33 * automatically adapt to HDMI connections as well
34 */
35static const u32 hsw_ddi_translations_dp[] = {
36 0x00FFFFFF, 0x0006000E, /* DP parameters */
37 0x00D75FFF, 0x0005000A,
38 0x00C30FFF, 0x00040006,
39 0x80AAAFFF, 0x000B0000,
40 0x00FFFFFF, 0x0005000A,
41 0x00D75FFF, 0x000C0004,
42 0x80C30FFF, 0x000B0000,
43 0x00FFFFFF, 0x00040006,
44 0x80D75FFF, 0x000B0000,
45244b87
ED
45};
46
47static const u32 hsw_ddi_translations_fdi[] = {
48 0x00FFFFFF, 0x0007000E, /* FDI parameters */
49 0x00D75FFF, 0x000F000A,
50 0x00C30FFF, 0x00060006,
51 0x00AAAFFF, 0x001E0000,
52 0x00FFFFFF, 0x000F000A,
53 0x00D75FFF, 0x00160004,
54 0x00C30FFF, 0x001E0000,
55 0x00FFFFFF, 0x00060006,
56 0x00D75FFF, 0x001E0000,
6acab15a
PZ
57};
58
59static const u32 hsw_ddi_translations_hdmi[] = {
60 /* Idx NT mV diff T mV diff db */
61 0x00FFFFFF, 0x0006000E, /* 0: 400 400 0 */
62 0x00E79FFF, 0x000E000C, /* 1: 400 500 2 */
63 0x00D75FFF, 0x0005000A, /* 2: 400 600 3.5 */
64 0x00FFFFFF, 0x0005000A, /* 3: 600 600 0 */
65 0x00E79FFF, 0x001D0007, /* 4: 600 750 2 */
66 0x00D75FFF, 0x000C0004, /* 5: 600 900 3.5 */
67 0x00FFFFFF, 0x00040006, /* 6: 800 800 0 */
68 0x80E79FFF, 0x00030002, /* 7: 800 1000 2 */
69 0x00FFFFFF, 0x00140005, /* 8: 850 850 0 */
70 0x00FFFFFF, 0x000C0004, /* 9: 900 900 0 */
71 0x00FFFFFF, 0x001C0003, /* 10: 950 950 0 */
72 0x80FFFFFF, 0x00030002, /* 11: 1000 1000 0 */
45244b87
ED
73};
74
300644c7 75static const u32 bdw_ddi_translations_edp[] = {
e1b22732 76 0x00FFFFFF, 0x00000012, /* eDP parameters */
300644c7
PZ
77 0x00EBAFFF, 0x00020011,
78 0x00C71FFF, 0x0006000F,
9576c27f 79 0x00AAAFFF, 0x000E000A,
300644c7
PZ
80 0x00FFFFFF, 0x00020011,
81 0x00DB6FFF, 0x0005000F,
82 0x00BEEFFF, 0x000A000C,
83 0x00FFFFFF, 0x0005000F,
84 0x00DB6FFF, 0x000A000C,
300644c7
PZ
85 0x00FFFFFF, 0x00140006 /* HDMI parameters 800mV 0dB*/
86};
87
e58623cb
AR
88static const u32 bdw_ddi_translations_dp[] = {
89 0x00FFFFFF, 0x0007000E, /* DP parameters */
90 0x00D75FFF, 0x000E000A,
91 0x00BEFFFF, 0x00140006,
9576c27f 92 0x80B2CFFF, 0x001B0002,
e58623cb
AR
93 0x00FFFFFF, 0x000E000A,
94 0x00D75FFF, 0x00180004,
95 0x80CB2FFF, 0x001B0002,
96 0x00F7DFFF, 0x00180004,
97 0x80D75FFF, 0x001B0002,
e58623cb
AR
98 0x00FFFFFF, 0x00140006 /* HDMI parameters 800mV 0dB*/
99};
100
101static const u32 bdw_ddi_translations_fdi[] = {
102 0x00FFFFFF, 0x0001000E, /* FDI parameters */
103 0x00D75FFF, 0x0004000A,
104 0x00C30FFF, 0x00070006,
105 0x00AAAFFF, 0x000C0000,
106 0x00FFFFFF, 0x0004000A,
107 0x00D75FFF, 0x00090004,
108 0x00C30FFF, 0x000C0000,
109 0x00FFFFFF, 0x00070006,
110 0x00D75FFF, 0x000C0000,
111 0x00FFFFFF, 0x00140006 /* HDMI parameters 800mV 0dB*/
112};
113
20f4dbe4 114enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder)
fc914639 115{
0bdee30e 116 struct drm_encoder *encoder = &intel_encoder->base;
fc914639
PZ
117 int type = intel_encoder->type;
118
174edf1f 119 if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP ||
00c09d70 120 type == INTEL_OUTPUT_HDMI || type == INTEL_OUTPUT_UNKNOWN) {
174edf1f
PZ
121 struct intel_digital_port *intel_dig_port =
122 enc_to_dig_port(encoder);
123 return intel_dig_port->port;
0bdee30e 124
fc914639
PZ
125 } else if (type == INTEL_OUTPUT_ANALOG) {
126 return PORT_E;
0bdee30e 127
fc914639
PZ
128 } else {
129 DRM_ERROR("Invalid DDI encoder type %d\n", type);
130 BUG();
131 }
132}
133
e58623cb
AR
134/*
135 * Starting with Haswell, DDI port buffers must be programmed with correct
136 * values in advance. The buffer values are different for FDI and DP modes,
45244b87
ED
137 * but the HDMI/DVI fields are shared among those. So we program the DDI
138 * in either FDI or DP modes only, as HDMI connections will work with both
139 * of those
140 */
ad8d270c 141static void intel_prepare_ddi_buffers(struct drm_device *dev, enum port port)
45244b87
ED
142{
143 struct drm_i915_private *dev_priv = dev->dev_private;
144 u32 reg;
145 int i;
6acab15a 146 int hdmi_level = dev_priv->vbt.ddi_port_info[port].hdmi_level_shift;
e58623cb
AR
147 const u32 *ddi_translations_fdi;
148 const u32 *ddi_translations_dp;
300644c7 149 const u32 *ddi_translations_edp;
e58623cb
AR
150 const u32 *ddi_translations;
151
152 if (IS_BROADWELL(dev)) {
153 ddi_translations_fdi = bdw_ddi_translations_fdi;
154 ddi_translations_dp = bdw_ddi_translations_dp;
300644c7 155 ddi_translations_edp = bdw_ddi_translations_edp;
e58623cb
AR
156 } else if (IS_HASWELL(dev)) {
157 ddi_translations_fdi = hsw_ddi_translations_fdi;
158 ddi_translations_dp = hsw_ddi_translations_dp;
300644c7 159 ddi_translations_edp = hsw_ddi_translations_dp;
e58623cb
AR
160 } else {
161 WARN(1, "ddi translation table missing\n");
300644c7 162 ddi_translations_edp = bdw_ddi_translations_dp;
e58623cb
AR
163 ddi_translations_fdi = bdw_ddi_translations_fdi;
164 ddi_translations_dp = bdw_ddi_translations_dp;
165 }
166
300644c7
PZ
167 switch (port) {
168 case PORT_A:
169 ddi_translations = ddi_translations_edp;
170 break;
171 case PORT_B:
172 case PORT_C:
300644c7
PZ
173 ddi_translations = ddi_translations_dp;
174 break;
77d8d009 175 case PORT_D:
5d8a7752 176 if (intel_dp_is_edp(dev, PORT_D))
77d8d009
PZ
177 ddi_translations = ddi_translations_edp;
178 else
179 ddi_translations = ddi_translations_dp;
180 break;
300644c7
PZ
181 case PORT_E:
182 ddi_translations = ddi_translations_fdi;
183 break;
184 default:
185 BUG();
186 }
45244b87 187
f72d19f0
PZ
188 for (i = 0, reg = DDI_BUF_TRANS(port);
189 i < ARRAY_SIZE(hsw_ddi_translations_fdi); i++) {
45244b87
ED
190 I915_WRITE(reg, ddi_translations[i]);
191 reg += 4;
192 }
6acab15a
PZ
193 /* Entry 9 is for HDMI: */
194 for (i = 0; i < 2; i++) {
195 I915_WRITE(reg, hsw_ddi_translations_hdmi[hdmi_level * 2 + i]);
196 reg += 4;
197 }
45244b87
ED
198}
199
200/* Program DDI buffers translations for DP. By default, program ports A-D in DP
201 * mode and port E for FDI.
202 */
203void intel_prepare_ddi(struct drm_device *dev)
204{
205 int port;
206
0d536cb4
PZ
207 if (!HAS_DDI(dev))
208 return;
45244b87 209
ad8d270c
PZ
210 for (port = PORT_A; port <= PORT_E; port++)
211 intel_prepare_ddi_buffers(dev, port);
45244b87 212}
c82e4d26
ED
213
214static const long hsw_ddi_buf_ctl_values[] = {
215 DDI_BUF_EMP_400MV_0DB_HSW,
216 DDI_BUF_EMP_400MV_3_5DB_HSW,
217 DDI_BUF_EMP_400MV_6DB_HSW,
218 DDI_BUF_EMP_400MV_9_5DB_HSW,
219 DDI_BUF_EMP_600MV_0DB_HSW,
220 DDI_BUF_EMP_600MV_3_5DB_HSW,
221 DDI_BUF_EMP_600MV_6DB_HSW,
222 DDI_BUF_EMP_800MV_0DB_HSW,
223 DDI_BUF_EMP_800MV_3_5DB_HSW
224};
225
248138b5
PZ
226static void intel_wait_ddi_buf_idle(struct drm_i915_private *dev_priv,
227 enum port port)
228{
229 uint32_t reg = DDI_BUF_CTL(port);
230 int i;
231
232 for (i = 0; i < 8; i++) {
233 udelay(1);
234 if (I915_READ(reg) & DDI_BUF_IS_IDLE)
235 return;
236 }
237 DRM_ERROR("Timeout waiting for DDI BUF %c idle bit\n", port_name(port));
238}
c82e4d26
ED
239
240/* Starting with Haswell, different DDI ports can work in FDI mode for
241 * connection to the PCH-located connectors. For this, it is necessary to train
242 * both the DDI port and PCH receiver for the desired DDI buffer settings.
243 *
244 * The recommended port to work in FDI mode is DDI E, which we use here. Also,
245 * please note that when FDI mode is active on DDI E, it shares 2 lines with
246 * DDI A (which is used for eDP)
247 */
248
249void hsw_fdi_link_train(struct drm_crtc *crtc)
250{
251 struct drm_device *dev = crtc->dev;
252 struct drm_i915_private *dev_priv = dev->dev_private;
253 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
04945641 254 u32 temp, i, rx_ctl_val;
c82e4d26 255
04945641
PZ
256 /* Set the FDI_RX_MISC pwrdn lanes and the 2 workarounds listed at the
257 * mode set "sequence for CRT port" document:
258 * - TP1 to TP2 time with the default value
259 * - FDI delay to 90h
8693a824
DL
260 *
261 * WaFDIAutoLinkSetTimingOverrride:hsw
04945641
PZ
262 */
263 I915_WRITE(_FDI_RXA_MISC, FDI_RX_PWRDN_LANE1_VAL(2) |
264 FDI_RX_PWRDN_LANE0_VAL(2) |
265 FDI_RX_TP1_TO_TP2_48 | FDI_RX_FDI_DELAY_90);
266
267 /* Enable the PCH Receiver FDI PLL */
3e68320e 268 rx_ctl_val = dev_priv->fdi_rx_config | FDI_RX_ENHANCE_FRAME_ENABLE |
33d29b14 269 FDI_RX_PLL_ENABLE |
627eb5a3 270 FDI_DP_PORT_WIDTH(intel_crtc->config.fdi_lanes);
04945641
PZ
271 I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
272 POSTING_READ(_FDI_RXA_CTL);
273 udelay(220);
274
275 /* Switch from Rawclk to PCDclk */
276 rx_ctl_val |= FDI_PCDCLK;
277 I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
278
279 /* Configure Port Clock Select */
de7cfc63
DV
280 I915_WRITE(PORT_CLK_SEL(PORT_E), intel_crtc->config.ddi_pll_sel);
281 WARN_ON(intel_crtc->config.ddi_pll_sel != PORT_CLK_SEL_SPLL);
04945641
PZ
282
283 /* Start the training iterating through available voltages and emphasis,
284 * testing each value twice. */
285 for (i = 0; i < ARRAY_SIZE(hsw_ddi_buf_ctl_values) * 2; i++) {
c82e4d26
ED
286 /* Configure DP_TP_CTL with auto-training */
287 I915_WRITE(DP_TP_CTL(PORT_E),
288 DP_TP_CTL_FDI_AUTOTRAIN |
289 DP_TP_CTL_ENHANCED_FRAME_ENABLE |
290 DP_TP_CTL_LINK_TRAIN_PAT1 |
291 DP_TP_CTL_ENABLE);
292
876a8cdf
DL
293 /* Configure and enable DDI_BUF_CTL for DDI E with next voltage.
294 * DDI E does not support port reversal, the functionality is
295 * achieved on the PCH side in FDI_RX_CTL, so no need to set the
296 * port reversal bit */
c82e4d26 297 I915_WRITE(DDI_BUF_CTL(PORT_E),
04945641 298 DDI_BUF_CTL_ENABLE |
33d29b14 299 ((intel_crtc->config.fdi_lanes - 1) << 1) |
04945641
PZ
300 hsw_ddi_buf_ctl_values[i / 2]);
301 POSTING_READ(DDI_BUF_CTL(PORT_E));
c82e4d26
ED
302
303 udelay(600);
304
04945641
PZ
305 /* Program PCH FDI Receiver TU */
306 I915_WRITE(_FDI_RXA_TUSIZE1, TU_SIZE(64));
307
308 /* Enable PCH FDI Receiver with auto-training */
309 rx_ctl_val |= FDI_RX_ENABLE | FDI_LINK_TRAIN_AUTO;
310 I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
311 POSTING_READ(_FDI_RXA_CTL);
312
313 /* Wait for FDI receiver lane calibration */
314 udelay(30);
315
316 /* Unset FDI_RX_MISC pwrdn lanes */
317 temp = I915_READ(_FDI_RXA_MISC);
318 temp &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
319 I915_WRITE(_FDI_RXA_MISC, temp);
320 POSTING_READ(_FDI_RXA_MISC);
321
322 /* Wait for FDI auto training time */
323 udelay(5);
c82e4d26
ED
324
325 temp = I915_READ(DP_TP_STATUS(PORT_E));
326 if (temp & DP_TP_STATUS_AUTOTRAIN_DONE) {
04945641 327 DRM_DEBUG_KMS("FDI link training done on step %d\n", i);
c82e4d26
ED
328
329 /* Enable normal pixel sending for FDI */
330 I915_WRITE(DP_TP_CTL(PORT_E),
04945641
PZ
331 DP_TP_CTL_FDI_AUTOTRAIN |
332 DP_TP_CTL_LINK_TRAIN_NORMAL |
333 DP_TP_CTL_ENHANCED_FRAME_ENABLE |
334 DP_TP_CTL_ENABLE);
c82e4d26 335
04945641 336 return;
c82e4d26 337 }
04945641 338
248138b5
PZ
339 temp = I915_READ(DDI_BUF_CTL(PORT_E));
340 temp &= ~DDI_BUF_CTL_ENABLE;
341 I915_WRITE(DDI_BUF_CTL(PORT_E), temp);
342 POSTING_READ(DDI_BUF_CTL(PORT_E));
343
04945641 344 /* Disable DP_TP_CTL and FDI_RX_CTL and retry */
248138b5
PZ
345 temp = I915_READ(DP_TP_CTL(PORT_E));
346 temp &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
347 temp |= DP_TP_CTL_LINK_TRAIN_PAT1;
348 I915_WRITE(DP_TP_CTL(PORT_E), temp);
349 POSTING_READ(DP_TP_CTL(PORT_E));
350
351 intel_wait_ddi_buf_idle(dev_priv, PORT_E);
04945641
PZ
352
353 rx_ctl_val &= ~FDI_RX_ENABLE;
354 I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
248138b5 355 POSTING_READ(_FDI_RXA_CTL);
04945641
PZ
356
357 /* Reset FDI_RX_MISC pwrdn lanes */
358 temp = I915_READ(_FDI_RXA_MISC);
359 temp &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
360 temp |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2);
361 I915_WRITE(_FDI_RXA_MISC, temp);
248138b5 362 POSTING_READ(_FDI_RXA_MISC);
c82e4d26
ED
363 }
364
04945641 365 DRM_ERROR("FDI link training failed!\n");
c82e4d26 366}
0e72a5b5 367
8d9ddbcb
PZ
368static struct intel_encoder *
369intel_ddi_get_crtc_encoder(struct drm_crtc *crtc)
370{
371 struct drm_device *dev = crtc->dev;
372 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
373 struct intel_encoder *intel_encoder, *ret = NULL;
374 int num_encoders = 0;
375
376 for_each_encoder_on_crtc(dev, crtc, intel_encoder) {
377 ret = intel_encoder;
378 num_encoders++;
379 }
380
381 if (num_encoders != 1)
84f44ce7
VS
382 WARN(1, "%d encoders on crtc for pipe %c\n", num_encoders,
383 pipe_name(intel_crtc->pipe));
8d9ddbcb
PZ
384
385 BUG_ON(ret == NULL);
386 return ret;
387}
388
6441ab5f
PZ
389void intel_ddi_put_crtc_pll(struct drm_crtc *crtc)
390{
391 struct drm_i915_private *dev_priv = crtc->dev->dev_private;
392 struct intel_ddi_plls *plls = &dev_priv->ddi_plls;
393 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
12030431 394 struct intel_shared_dpll *pll = intel_crtc_to_shared_dpll(intel_crtc);
6441ab5f 395
de7cfc63 396 switch (intel_crtc->config.ddi_pll_sel) {
6441ab5f
PZ
397 case PORT_CLK_SEL_WRPLL1:
398 plls->wrpll1_refcount--;
399 if (plls->wrpll1_refcount == 0) {
12030431 400 pll->disable(dev_priv, pll);
6441ab5f 401 }
0e50338c 402 intel_crtc->config.ddi_pll_sel = PORT_CLK_SEL_NONE;
6441ab5f
PZ
403 break;
404 case PORT_CLK_SEL_WRPLL2:
405 plls->wrpll2_refcount--;
406 if (plls->wrpll2_refcount == 0) {
12030431 407 pll->disable(dev_priv, pll);
6441ab5f 408 }
0e50338c 409 intel_crtc->config.ddi_pll_sel = PORT_CLK_SEL_NONE;
6441ab5f
PZ
410 break;
411 }
412
6441ab5f
PZ
413 WARN(plls->wrpll1_refcount < 0, "Invalid WRPLL1 refcount\n");
414 WARN(plls->wrpll2_refcount < 0, "Invalid WRPLL2 refcount\n");
6441ab5f
PZ
415}
416
1c0b85c5
DL
417#define LC_FREQ 2700
418#define LC_FREQ_2K (LC_FREQ * 2000)
419
420#define P_MIN 2
421#define P_MAX 64
422#define P_INC 2
423
424/* Constraints for PLL good behavior */
425#define REF_MIN 48
426#define REF_MAX 400
427#define VCO_MIN 2400
428#define VCO_MAX 4800
429
430#define ABS_DIFF(a, b) ((a > b) ? (a - b) : (b - a))
431
432struct wrpll_rnp {
433 unsigned p, n2, r2;
434};
435
436static unsigned wrpll_get_budget_for_freq(int clock)
6441ab5f 437{
1c0b85c5
DL
438 unsigned budget;
439
440 switch (clock) {
441 case 25175000:
442 case 25200000:
443 case 27000000:
444 case 27027000:
445 case 37762500:
446 case 37800000:
447 case 40500000:
448 case 40541000:
449 case 54000000:
450 case 54054000:
451 case 59341000:
452 case 59400000:
453 case 72000000:
454 case 74176000:
455 case 74250000:
456 case 81000000:
457 case 81081000:
458 case 89012000:
459 case 89100000:
460 case 108000000:
461 case 108108000:
462 case 111264000:
463 case 111375000:
464 case 148352000:
465 case 148500000:
466 case 162000000:
467 case 162162000:
468 case 222525000:
469 case 222750000:
470 case 296703000:
471 case 297000000:
472 budget = 0;
473 break;
474 case 233500000:
475 case 245250000:
476 case 247750000:
477 case 253250000:
478 case 298000000:
479 budget = 1500;
480 break;
481 case 169128000:
482 case 169500000:
483 case 179500000:
484 case 202000000:
485 budget = 2000;
486 break;
487 case 256250000:
488 case 262500000:
489 case 270000000:
490 case 272500000:
491 case 273750000:
492 case 280750000:
493 case 281250000:
494 case 286000000:
495 case 291750000:
496 budget = 4000;
497 break;
498 case 267250000:
499 case 268500000:
500 budget = 5000;
501 break;
502 default:
503 budget = 1000;
504 break;
505 }
6441ab5f 506
1c0b85c5
DL
507 return budget;
508}
509
510static void wrpll_update_rnp(uint64_t freq2k, unsigned budget,
511 unsigned r2, unsigned n2, unsigned p,
512 struct wrpll_rnp *best)
513{
514 uint64_t a, b, c, d, diff, diff_best;
6441ab5f 515
1c0b85c5
DL
516 /* No best (r,n,p) yet */
517 if (best->p == 0) {
518 best->p = p;
519 best->n2 = n2;
520 best->r2 = r2;
521 return;
522 }
6441ab5f 523
1c0b85c5
DL
524 /*
525 * Output clock is (LC_FREQ_2K / 2000) * N / (P * R), which compares to
526 * freq2k.
527 *
528 * delta = 1e6 *
529 * abs(freq2k - (LC_FREQ_2K * n2/(p * r2))) /
530 * freq2k;
531 *
532 * and we would like delta <= budget.
533 *
534 * If the discrepancy is above the PPM-based budget, always prefer to
535 * improve upon the previous solution. However, if you're within the
536 * budget, try to maximize Ref * VCO, that is N / (P * R^2).
537 */
538 a = freq2k * budget * p * r2;
539 b = freq2k * budget * best->p * best->r2;
540 diff = ABS_DIFF((freq2k * p * r2), (LC_FREQ_2K * n2));
541 diff_best = ABS_DIFF((freq2k * best->p * best->r2),
542 (LC_FREQ_2K * best->n2));
543 c = 1000000 * diff;
544 d = 1000000 * diff_best;
545
546 if (a < c && b < d) {
547 /* If both are above the budget, pick the closer */
548 if (best->p * best->r2 * diff < p * r2 * diff_best) {
549 best->p = p;
550 best->n2 = n2;
551 best->r2 = r2;
552 }
553 } else if (a >= c && b < d) {
554 /* If A is below the threshold but B is above it? Update. */
555 best->p = p;
556 best->n2 = n2;
557 best->r2 = r2;
558 } else if (a >= c && b >= d) {
559 /* Both are below the limit, so pick the higher n2/(r2*r2) */
560 if (n2 * best->r2 * best->r2 > best->n2 * r2 * r2) {
561 best->p = p;
562 best->n2 = n2;
563 best->r2 = r2;
564 }
565 }
566 /* Otherwise a < c && b >= d, do nothing */
567}
568
11578553
JB
569static int intel_ddi_calc_wrpll_link(struct drm_i915_private *dev_priv,
570 int reg)
571{
572 int refclk = LC_FREQ;
573 int n, p, r;
574 u32 wrpll;
575
576 wrpll = I915_READ(reg);
114fe488
DV
577 switch (wrpll & WRPLL_PLL_REF_MASK) {
578 case WRPLL_PLL_SSC:
579 case WRPLL_PLL_NON_SSC:
11578553
JB
580 /*
581 * We could calculate spread here, but our checking
582 * code only cares about 5% accuracy, and spread is a max of
583 * 0.5% downspread.
584 */
585 refclk = 135;
586 break;
114fe488 587 case WRPLL_PLL_LCPLL:
11578553
JB
588 refclk = LC_FREQ;
589 break;
590 default:
591 WARN(1, "bad wrpll refclk\n");
592 return 0;
593 }
594
595 r = wrpll & WRPLL_DIVIDER_REF_MASK;
596 p = (wrpll & WRPLL_DIVIDER_POST_MASK) >> WRPLL_DIVIDER_POST_SHIFT;
597 n = (wrpll & WRPLL_DIVIDER_FB_MASK) >> WRPLL_DIVIDER_FB_SHIFT;
598
20f0ec16
JB
599 /* Convert to KHz, p & r have a fixed point portion */
600 return (refclk * n * 100) / (p * r);
11578553
JB
601}
602
603static void intel_ddi_clock_get(struct intel_encoder *encoder,
604 struct intel_crtc_config *pipe_config)
605{
606 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
11578553
JB
607 int link_clock = 0;
608 u32 val, pll;
609
26804afd 610 val = pipe_config->ddi_pll_sel;
11578553
JB
611 switch (val & PORT_CLK_SEL_MASK) {
612 case PORT_CLK_SEL_LCPLL_810:
613 link_clock = 81000;
614 break;
615 case PORT_CLK_SEL_LCPLL_1350:
616 link_clock = 135000;
617 break;
618 case PORT_CLK_SEL_LCPLL_2700:
619 link_clock = 270000;
620 break;
621 case PORT_CLK_SEL_WRPLL1:
622 link_clock = intel_ddi_calc_wrpll_link(dev_priv, WRPLL_CTL1);
623 break;
624 case PORT_CLK_SEL_WRPLL2:
625 link_clock = intel_ddi_calc_wrpll_link(dev_priv, WRPLL_CTL2);
626 break;
627 case PORT_CLK_SEL_SPLL:
628 pll = I915_READ(SPLL_CTL) & SPLL_PLL_FREQ_MASK;
629 if (pll == SPLL_PLL_FREQ_810MHz)
630 link_clock = 81000;
631 else if (pll == SPLL_PLL_FREQ_1350MHz)
632 link_clock = 135000;
633 else if (pll == SPLL_PLL_FREQ_2700MHz)
634 link_clock = 270000;
635 else {
636 WARN(1, "bad spll freq\n");
637 return;
638 }
639 break;
640 default:
641 WARN(1, "bad port clock sel\n");
642 return;
643 }
644
645 pipe_config->port_clock = link_clock * 2;
646
647 if (pipe_config->has_pch_encoder)
648 pipe_config->adjusted_mode.crtc_clock =
649 intel_dotclock_calculate(pipe_config->port_clock,
650 &pipe_config->fdi_m_n);
651 else if (pipe_config->has_dp_encoder)
652 pipe_config->adjusted_mode.crtc_clock =
653 intel_dotclock_calculate(pipe_config->port_clock,
654 &pipe_config->dp_m_n);
655 else
656 pipe_config->adjusted_mode.crtc_clock = pipe_config->port_clock;
657}
658
1c0b85c5
DL
659static void
660intel_ddi_calculate_wrpll(int clock /* in Hz */,
661 unsigned *r2_out, unsigned *n2_out, unsigned *p_out)
662{
663 uint64_t freq2k;
664 unsigned p, n2, r2;
665 struct wrpll_rnp best = { 0, 0, 0 };
666 unsigned budget;
667
668 freq2k = clock / 100;
669
670 budget = wrpll_get_budget_for_freq(clock);
671
672 /* Special case handling for 540 pixel clock: bypass WR PLL entirely
673 * and directly pass the LC PLL to it. */
674 if (freq2k == 5400000) {
675 *n2_out = 2;
676 *p_out = 1;
677 *r2_out = 2;
678 return;
679 }
680
681 /*
682 * Ref = LC_FREQ / R, where Ref is the actual reference input seen by
683 * the WR PLL.
684 *
685 * We want R so that REF_MIN <= Ref <= REF_MAX.
686 * Injecting R2 = 2 * R gives:
687 * REF_MAX * r2 > LC_FREQ * 2 and
688 * REF_MIN * r2 < LC_FREQ * 2
689 *
690 * Which means the desired boundaries for r2 are:
691 * LC_FREQ * 2 / REF_MAX < r2 < LC_FREQ * 2 / REF_MIN
692 *
693 */
694 for (r2 = LC_FREQ * 2 / REF_MAX + 1;
695 r2 <= LC_FREQ * 2 / REF_MIN;
696 r2++) {
697
698 /*
699 * VCO = N * Ref, that is: VCO = N * LC_FREQ / R
700 *
701 * Once again we want VCO_MIN <= VCO <= VCO_MAX.
702 * Injecting R2 = 2 * R and N2 = 2 * N, we get:
703 * VCO_MAX * r2 > n2 * LC_FREQ and
704 * VCO_MIN * r2 < n2 * LC_FREQ)
705 *
706 * Which means the desired boundaries for n2 are:
707 * VCO_MIN * r2 / LC_FREQ < n2 < VCO_MAX * r2 / LC_FREQ
708 */
709 for (n2 = VCO_MIN * r2 / LC_FREQ + 1;
710 n2 <= VCO_MAX * r2 / LC_FREQ;
711 n2++) {
712
713 for (p = P_MIN; p <= P_MAX; p += P_INC)
714 wrpll_update_rnp(freq2k, budget,
715 r2, n2, p, &best);
716 }
717 }
6441ab5f 718
1c0b85c5
DL
719 *n2_out = best.n2;
720 *p_out = best.p;
721 *r2_out = best.r2;
6441ab5f
PZ
722}
723
566b734a
PZ
724/*
725 * Tries to find a PLL for the CRTC. If it finds, it increases the refcount and
726 * stores it in intel_crtc->ddi_pll_sel, so other mode sets won't be able to
727 * steal the selected PLL. You need to call intel_ddi_pll_enable to actually
728 * enable the PLL.
729 */
730bool intel_ddi_pll_select(struct intel_crtc *intel_crtc)
6441ab5f 731{
566b734a 732 struct drm_crtc *crtc = &intel_crtc->base;
6441ab5f
PZ
733 struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
734 struct drm_i915_private *dev_priv = crtc->dev->dev_private;
735 struct intel_ddi_plls *plls = &dev_priv->ddi_plls;
736 int type = intel_encoder->type;
737 enum pipe pipe = intel_crtc->pipe;
ff9a6750 738 int clock = intel_crtc->config.port_clock;
6441ab5f 739
6441ab5f
PZ
740 intel_ddi_put_crtc_pll(crtc);
741
0e50338c 742 if (type == INTEL_OUTPUT_HDMI) {
566b734a 743 uint32_t reg, val;
1c0b85c5 744 unsigned p, n2, r2;
6441ab5f 745
0694001b
PZ
746 intel_ddi_calculate_wrpll(clock * 1000, &r2, &n2, &p);
747
114fe488 748 val = WRPLL_PLL_ENABLE | WRPLL_PLL_LCPLL |
0694001b
PZ
749 WRPLL_DIVIDER_REFERENCE(r2) | WRPLL_DIVIDER_FEEDBACK(n2) |
750 WRPLL_DIVIDER_POST(p);
751
752 if (val == I915_READ(WRPLL_CTL1)) {
753 DRM_DEBUG_KMS("Reusing WRPLL 1 on pipe %c\n",
754 pipe_name(pipe));
755 reg = WRPLL_CTL1;
756 } else if (val == I915_READ(WRPLL_CTL2)) {
757 DRM_DEBUG_KMS("Reusing WRPLL 2 on pipe %c\n",
758 pipe_name(pipe));
759 reg = WRPLL_CTL2;
760 } else if (plls->wrpll1_refcount == 0) {
6441ab5f
PZ
761 DRM_DEBUG_KMS("Using WRPLL 1 on pipe %c\n",
762 pipe_name(pipe));
6441ab5f 763 reg = WRPLL_CTL1;
6441ab5f
PZ
764 } else if (plls->wrpll2_refcount == 0) {
765 DRM_DEBUG_KMS("Using WRPLL 2 on pipe %c\n",
766 pipe_name(pipe));
6441ab5f 767 reg = WRPLL_CTL2;
6441ab5f
PZ
768 } else {
769 DRM_ERROR("No WRPLLs available!\n");
770 return false;
771 }
772
566b734a
PZ
773 DRM_DEBUG_KMS("WRPLL: %dKHz refresh rate with p=%d, n2=%d r2=%d\n",
774 clock, p, n2, r2);
775
0694001b
PZ
776 if (reg == WRPLL_CTL1) {
777 plls->wrpll1_refcount++;
de7cfc63 778 intel_crtc->config.ddi_pll_sel = PORT_CLK_SEL_WRPLL1;
9cd86933 779 intel_crtc->config.shared_dpll = DPLL_ID_WRPLL1;
0694001b
PZ
780 } else {
781 plls->wrpll2_refcount++;
de7cfc63 782 intel_crtc->config.ddi_pll_sel = PORT_CLK_SEL_WRPLL2;
9cd86933 783 intel_crtc->config.shared_dpll = DPLL_ID_WRPLL2;
0694001b 784 }
d452c5b6
DV
785
786 intel_crtc->config.dpll_hw_state.wrpll = val;
6441ab5f
PZ
787 }
788
6441ab5f
PZ
789 return true;
790}
791
566b734a
PZ
792/*
793 * To be called after intel_ddi_pll_select(). That one selects the PLL to be
794 * used, this one actually enables the PLL.
795 */
796void intel_ddi_pll_enable(struct intel_crtc *crtc)
797{
798 struct drm_device *dev = crtc->base.dev;
799 struct drm_i915_private *dev_priv = dev->dev_private;
800 struct intel_ddi_plls *plls = &dev_priv->ddi_plls;
801 int clock = crtc->config.port_clock;
802 uint32_t reg, cur_val, new_val;
803 int refcount;
804 const char *pll_name;
805 uint32_t enable_bit = (1 << 31);
806 unsigned int p, n2, r2;
807
808 BUILD_BUG_ON(enable_bit != SPLL_PLL_ENABLE);
809 BUILD_BUG_ON(enable_bit != WRPLL_PLL_ENABLE);
810
de7cfc63 811 switch (crtc->config.ddi_pll_sel) {
566b734a
PZ
812 case PORT_CLK_SEL_WRPLL1:
813 case PORT_CLK_SEL_WRPLL2:
de7cfc63 814 if (crtc->config.ddi_pll_sel == PORT_CLK_SEL_WRPLL1) {
566b734a
PZ
815 pll_name = "WRPLL1";
816 reg = WRPLL_CTL1;
817 refcount = plls->wrpll1_refcount;
818 } else {
819 pll_name = "WRPLL2";
820 reg = WRPLL_CTL2;
821 refcount = plls->wrpll2_refcount;
822 }
823
824 intel_ddi_calculate_wrpll(clock * 1000, &r2, &n2, &p);
825
114fe488 826 new_val = WRPLL_PLL_ENABLE | WRPLL_PLL_LCPLL |
566b734a
PZ
827 WRPLL_DIVIDER_REFERENCE(r2) |
828 WRPLL_DIVIDER_FEEDBACK(n2) | WRPLL_DIVIDER_POST(p);
829
830 break;
831
832 case PORT_CLK_SEL_NONE:
833 WARN(1, "Bad selected pll: PORT_CLK_SEL_NONE\n");
834 return;
835 default:
566b734a
PZ
836 return;
837 }
838
839 cur_val = I915_READ(reg);
840
841 WARN(refcount < 1, "Bad %s refcount: %d\n", pll_name, refcount);
842 if (refcount == 1) {
843 WARN(cur_val & enable_bit, "%s already enabled\n", pll_name);
844 I915_WRITE(reg, new_val);
845 POSTING_READ(reg);
846 udelay(20);
847 } else {
848 WARN((cur_val & enable_bit) == 0, "%s disabled\n", pll_name);
849 }
850}
851
dae84799
PZ
852void intel_ddi_set_pipe_settings(struct drm_crtc *crtc)
853{
854 struct drm_i915_private *dev_priv = crtc->dev->dev_private;
855 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
856 struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
3b117c8f 857 enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
dae84799
PZ
858 int type = intel_encoder->type;
859 uint32_t temp;
860
861 if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
862
c9809791 863 temp = TRANS_MSA_SYNC_CLK;
965e0c48 864 switch (intel_crtc->config.pipe_bpp) {
dae84799 865 case 18:
c9809791 866 temp |= TRANS_MSA_6_BPC;
dae84799
PZ
867 break;
868 case 24:
c9809791 869 temp |= TRANS_MSA_8_BPC;
dae84799
PZ
870 break;
871 case 30:
c9809791 872 temp |= TRANS_MSA_10_BPC;
dae84799
PZ
873 break;
874 case 36:
c9809791 875 temp |= TRANS_MSA_12_BPC;
dae84799
PZ
876 break;
877 default:
4e53c2e0 878 BUG();
dae84799 879 }
c9809791 880 I915_WRITE(TRANS_MSA_MISC(cpu_transcoder), temp);
dae84799
PZ
881 }
882}
883
8228c251 884void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc)
8d9ddbcb
PZ
885{
886 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
887 struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
7739c33b 888 struct drm_encoder *encoder = &intel_encoder->base;
c7670b10
PZ
889 struct drm_device *dev = crtc->dev;
890 struct drm_i915_private *dev_priv = dev->dev_private;
8d9ddbcb 891 enum pipe pipe = intel_crtc->pipe;
3b117c8f 892 enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
174edf1f 893 enum port port = intel_ddi_get_encoder_port(intel_encoder);
7739c33b 894 int type = intel_encoder->type;
8d9ddbcb
PZ
895 uint32_t temp;
896
ad80a810
PZ
897 /* Enable TRANS_DDI_FUNC_CTL for the pipe to work in HDMI mode */
898 temp = TRANS_DDI_FUNC_ENABLE;
174edf1f 899 temp |= TRANS_DDI_SELECT_PORT(port);
dfcef252 900
965e0c48 901 switch (intel_crtc->config.pipe_bpp) {
dfcef252 902 case 18:
ad80a810 903 temp |= TRANS_DDI_BPC_6;
dfcef252
PZ
904 break;
905 case 24:
ad80a810 906 temp |= TRANS_DDI_BPC_8;
dfcef252
PZ
907 break;
908 case 30:
ad80a810 909 temp |= TRANS_DDI_BPC_10;
dfcef252
PZ
910 break;
911 case 36:
ad80a810 912 temp |= TRANS_DDI_BPC_12;
dfcef252
PZ
913 break;
914 default:
4e53c2e0 915 BUG();
dfcef252 916 }
72662e10 917
a666283e 918 if (intel_crtc->config.adjusted_mode.flags & DRM_MODE_FLAG_PVSYNC)
ad80a810 919 temp |= TRANS_DDI_PVSYNC;
a666283e 920 if (intel_crtc->config.adjusted_mode.flags & DRM_MODE_FLAG_PHSYNC)
ad80a810 921 temp |= TRANS_DDI_PHSYNC;
f63eb7c4 922
e6f0bfc4
PZ
923 if (cpu_transcoder == TRANSCODER_EDP) {
924 switch (pipe) {
925 case PIPE_A:
c7670b10
PZ
926 /* On Haswell, can only use the always-on power well for
927 * eDP when not using the panel fitter, and when not
928 * using motion blur mitigation (which we don't
929 * support). */
fabf6e51
DV
930 if (IS_HASWELL(dev) &&
931 (intel_crtc->config.pch_pfit.enabled ||
932 intel_crtc->config.pch_pfit.force_thru))
d6dd9eb1
DV
933 temp |= TRANS_DDI_EDP_INPUT_A_ONOFF;
934 else
935 temp |= TRANS_DDI_EDP_INPUT_A_ON;
e6f0bfc4
PZ
936 break;
937 case PIPE_B:
938 temp |= TRANS_DDI_EDP_INPUT_B_ONOFF;
939 break;
940 case PIPE_C:
941 temp |= TRANS_DDI_EDP_INPUT_C_ONOFF;
942 break;
943 default:
944 BUG();
945 break;
946 }
947 }
948
7739c33b 949 if (type == INTEL_OUTPUT_HDMI) {
6897b4b5 950 if (intel_crtc->config.has_hdmi_sink)
ad80a810 951 temp |= TRANS_DDI_MODE_SELECT_HDMI;
8d9ddbcb 952 else
ad80a810 953 temp |= TRANS_DDI_MODE_SELECT_DVI;
8d9ddbcb 954
7739c33b 955 } else if (type == INTEL_OUTPUT_ANALOG) {
ad80a810 956 temp |= TRANS_DDI_MODE_SELECT_FDI;
33d29b14 957 temp |= (intel_crtc->config.fdi_lanes - 1) << 1;
7739c33b
PZ
958
959 } else if (type == INTEL_OUTPUT_DISPLAYPORT ||
960 type == INTEL_OUTPUT_EDP) {
961 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
962
ad80a810 963 temp |= TRANS_DDI_MODE_SELECT_DP_SST;
7739c33b 964
17aa6be9 965 temp |= DDI_PORT_WIDTH(intel_dp->lane_count);
8d9ddbcb 966 } else {
84f44ce7
VS
967 WARN(1, "Invalid encoder type %d for pipe %c\n",
968 intel_encoder->type, pipe_name(pipe));
8d9ddbcb
PZ
969 }
970
ad80a810 971 I915_WRITE(TRANS_DDI_FUNC_CTL(cpu_transcoder), temp);
8d9ddbcb 972}
72662e10 973
ad80a810
PZ
974void intel_ddi_disable_transcoder_func(struct drm_i915_private *dev_priv,
975 enum transcoder cpu_transcoder)
8d9ddbcb 976{
ad80a810 977 uint32_t reg = TRANS_DDI_FUNC_CTL(cpu_transcoder);
8d9ddbcb
PZ
978 uint32_t val = I915_READ(reg);
979
ad80a810
PZ
980 val &= ~(TRANS_DDI_FUNC_ENABLE | TRANS_DDI_PORT_MASK);
981 val |= TRANS_DDI_PORT_NONE;
8d9ddbcb 982 I915_WRITE(reg, val);
72662e10
ED
983}
984
bcbc889b
PZ
985bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector)
986{
987 struct drm_device *dev = intel_connector->base.dev;
988 struct drm_i915_private *dev_priv = dev->dev_private;
989 struct intel_encoder *intel_encoder = intel_connector->encoder;
990 int type = intel_connector->base.connector_type;
991 enum port port = intel_ddi_get_encoder_port(intel_encoder);
992 enum pipe pipe = 0;
993 enum transcoder cpu_transcoder;
882244a3 994 enum intel_display_power_domain power_domain;
bcbc889b
PZ
995 uint32_t tmp;
996
882244a3
PZ
997 power_domain = intel_display_port_power_domain(intel_encoder);
998 if (!intel_display_power_enabled(dev_priv, power_domain))
999 return false;
1000
bcbc889b
PZ
1001 if (!intel_encoder->get_hw_state(intel_encoder, &pipe))
1002 return false;
1003
1004 if (port == PORT_A)
1005 cpu_transcoder = TRANSCODER_EDP;
1006 else
1a240d4d 1007 cpu_transcoder = (enum transcoder) pipe;
bcbc889b
PZ
1008
1009 tmp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
1010
1011 switch (tmp & TRANS_DDI_MODE_SELECT_MASK) {
1012 case TRANS_DDI_MODE_SELECT_HDMI:
1013 case TRANS_DDI_MODE_SELECT_DVI:
1014 return (type == DRM_MODE_CONNECTOR_HDMIA);
1015
1016 case TRANS_DDI_MODE_SELECT_DP_SST:
1017 if (type == DRM_MODE_CONNECTOR_eDP)
1018 return true;
1019 case TRANS_DDI_MODE_SELECT_DP_MST:
1020 return (type == DRM_MODE_CONNECTOR_DisplayPort);
1021
1022 case TRANS_DDI_MODE_SELECT_FDI:
1023 return (type == DRM_MODE_CONNECTOR_VGA);
1024
1025 default:
1026 return false;
1027 }
1028}
1029
85234cdc
DV
1030bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
1031 enum pipe *pipe)
1032{
1033 struct drm_device *dev = encoder->base.dev;
1034 struct drm_i915_private *dev_priv = dev->dev_private;
fe43d3f5 1035 enum port port = intel_ddi_get_encoder_port(encoder);
6d129bea 1036 enum intel_display_power_domain power_domain;
85234cdc
DV
1037 u32 tmp;
1038 int i;
1039
6d129bea
ID
1040 power_domain = intel_display_port_power_domain(encoder);
1041 if (!intel_display_power_enabled(dev_priv, power_domain))
1042 return false;
1043
fe43d3f5 1044 tmp = I915_READ(DDI_BUF_CTL(port));
85234cdc
DV
1045
1046 if (!(tmp & DDI_BUF_CTL_ENABLE))
1047 return false;
1048
ad80a810
PZ
1049 if (port == PORT_A) {
1050 tmp = I915_READ(TRANS_DDI_FUNC_CTL(TRANSCODER_EDP));
85234cdc 1051
ad80a810
PZ
1052 switch (tmp & TRANS_DDI_EDP_INPUT_MASK) {
1053 case TRANS_DDI_EDP_INPUT_A_ON:
1054 case TRANS_DDI_EDP_INPUT_A_ONOFF:
1055 *pipe = PIPE_A;
1056 break;
1057 case TRANS_DDI_EDP_INPUT_B_ONOFF:
1058 *pipe = PIPE_B;
1059 break;
1060 case TRANS_DDI_EDP_INPUT_C_ONOFF:
1061 *pipe = PIPE_C;
1062 break;
1063 }
1064
1065 return true;
1066 } else {
1067 for (i = TRANSCODER_A; i <= TRANSCODER_C; i++) {
1068 tmp = I915_READ(TRANS_DDI_FUNC_CTL(i));
1069
1070 if ((tmp & TRANS_DDI_PORT_MASK)
1071 == TRANS_DDI_SELECT_PORT(port)) {
1072 *pipe = i;
1073 return true;
1074 }
85234cdc
DV
1075 }
1076 }
1077
84f44ce7 1078 DRM_DEBUG_KMS("No pipe for ddi port %c found\n", port_name(port));
85234cdc 1079
22f9fe50 1080 return false;
85234cdc
DV
1081}
1082
6441ab5f
PZ
1083void intel_ddi_setup_hw_pll_state(struct drm_device *dev)
1084{
1085 struct drm_i915_private *dev_priv = dev->dev_private;
1086 enum pipe pipe;
1087 struct intel_crtc *intel_crtc;
1088
0882dae9
PZ
1089 dev_priv->ddi_plls.wrpll1_refcount = 0;
1090 dev_priv->ddi_plls.wrpll2_refcount = 0;
1091
6441ab5f
PZ
1092 for_each_pipe(pipe) {
1093 intel_crtc =
1094 to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);
1095
0882dae9 1096 if (!intel_crtc->active) {
de7cfc63 1097 intel_crtc->config.ddi_pll_sel = PORT_CLK_SEL_NONE;
6441ab5f 1098 continue;
0882dae9 1099 }
6441ab5f 1100
de7cfc63 1101 switch (intel_crtc->config.ddi_pll_sel) {
6441ab5f
PZ
1102 case PORT_CLK_SEL_WRPLL1:
1103 dev_priv->ddi_plls.wrpll1_refcount++;
1104 break;
1105 case PORT_CLK_SEL_WRPLL2:
1106 dev_priv->ddi_plls.wrpll2_refcount++;
1107 break;
1108 }
1109 }
1110}
1111
fc914639
PZ
1112void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc)
1113{
1114 struct drm_crtc *crtc = &intel_crtc->base;
1115 struct drm_i915_private *dev_priv = crtc->dev->dev_private;
1116 struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
1117 enum port port = intel_ddi_get_encoder_port(intel_encoder);
3b117c8f 1118 enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
fc914639 1119
bb523fc0
PZ
1120 if (cpu_transcoder != TRANSCODER_EDP)
1121 I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
1122 TRANS_CLK_SEL_PORT(port));
fc914639
PZ
1123}
1124
1125void intel_ddi_disable_pipe_clock(struct intel_crtc *intel_crtc)
1126{
1127 struct drm_i915_private *dev_priv = intel_crtc->base.dev->dev_private;
3b117c8f 1128 enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
fc914639 1129
bb523fc0
PZ
1130 if (cpu_transcoder != TRANSCODER_EDP)
1131 I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
1132 TRANS_CLK_SEL_DISABLED);
fc914639
PZ
1133}
1134
00c09d70 1135static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder)
6441ab5f 1136{
c19b0669 1137 struct drm_encoder *encoder = &intel_encoder->base;
c19b0669 1138 struct drm_i915_private *dev_priv = encoder->dev->dev_private;
30cf6db8 1139 struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
6441ab5f 1140 enum port port = intel_ddi_get_encoder_port(intel_encoder);
82a4d9c0 1141 int type = intel_encoder->type;
6441ab5f 1142
30cf6db8
DV
1143 if (crtc->config.has_audio) {
1144 DRM_DEBUG_DRIVER("Audio on pipe %c on DDI\n",
1145 pipe_name(crtc->pipe));
1146
1147 /* write eld */
1148 DRM_DEBUG_DRIVER("DDI audio: write eld information\n");
1149 intel_write_eld(encoder, &crtc->config.adjusted_mode);
1150 }
1151
82a4d9c0
PZ
1152 if (type == INTEL_OUTPUT_EDP) {
1153 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
4be73780 1154 intel_edp_panel_on(intel_dp);
82a4d9c0 1155 }
6441ab5f 1156
de7cfc63
DV
1157 WARN_ON(crtc->config.ddi_pll_sel == PORT_CLK_SEL_NONE);
1158 I915_WRITE(PORT_CLK_SEL(port), crtc->config.ddi_pll_sel);
c19b0669 1159
82a4d9c0 1160 if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
c19b0669 1161 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
30cf6db8
DV
1162 struct intel_digital_port *intel_dig_port =
1163 enc_to_dig_port(encoder);
1164
1165 intel_dp->DP = intel_dig_port->saved_port_bits |
1166 DDI_BUF_CTL_ENABLE | DDI_BUF_EMP_400MV_0DB_HSW;
1167 intel_dp->DP |= DDI_PORT_WIDTH(intel_dp->lane_count);
c19b0669
PZ
1168
1169 intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
1170 intel_dp_start_link_train(intel_dp);
1171 intel_dp_complete_link_train(intel_dp);
3ab9c637
ID
1172 if (port != PORT_A)
1173 intel_dp_stop_link_train(intel_dp);
30cf6db8
DV
1174 } else if (type == INTEL_OUTPUT_HDMI) {
1175 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
1176
1177 intel_hdmi->set_infoframes(encoder,
1178 crtc->config.has_hdmi_sink,
1179 &crtc->config.adjusted_mode);
c19b0669 1180 }
6441ab5f
PZ
1181}
1182
00c09d70 1183static void intel_ddi_post_disable(struct intel_encoder *intel_encoder)
6441ab5f
PZ
1184{
1185 struct drm_encoder *encoder = &intel_encoder->base;
1186 struct drm_i915_private *dev_priv = encoder->dev->dev_private;
1187 enum port port = intel_ddi_get_encoder_port(intel_encoder);
82a4d9c0 1188 int type = intel_encoder->type;
2886e93f 1189 uint32_t val;
a836bdf9 1190 bool wait = false;
2886e93f
PZ
1191
1192 val = I915_READ(DDI_BUF_CTL(port));
1193 if (val & DDI_BUF_CTL_ENABLE) {
1194 val &= ~DDI_BUF_CTL_ENABLE;
1195 I915_WRITE(DDI_BUF_CTL(port), val);
a836bdf9 1196 wait = true;
2886e93f 1197 }
6441ab5f 1198
a836bdf9
PZ
1199 val = I915_READ(DP_TP_CTL(port));
1200 val &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
1201 val |= DP_TP_CTL_LINK_TRAIN_PAT1;
1202 I915_WRITE(DP_TP_CTL(port), val);
1203
1204 if (wait)
1205 intel_wait_ddi_buf_idle(dev_priv, port);
1206
76bb80ed 1207 if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
82a4d9c0 1208 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
76bb80ed 1209 intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
24f3e092 1210 intel_edp_panel_vdd_on(intel_dp);
4be73780 1211 intel_edp_panel_off(intel_dp);
82a4d9c0
PZ
1212 }
1213
6441ab5f
PZ
1214 I915_WRITE(PORT_CLK_SEL(port), PORT_CLK_SEL_NONE);
1215}
1216
00c09d70 1217static void intel_enable_ddi(struct intel_encoder *intel_encoder)
72662e10 1218{
6547fef8 1219 struct drm_encoder *encoder = &intel_encoder->base;
7b9f35a6
WX
1220 struct drm_crtc *crtc = encoder->crtc;
1221 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1222 int pipe = intel_crtc->pipe;
6547fef8 1223 struct drm_device *dev = encoder->dev;
72662e10 1224 struct drm_i915_private *dev_priv = dev->dev_private;
6547fef8
PZ
1225 enum port port = intel_ddi_get_encoder_port(intel_encoder);
1226 int type = intel_encoder->type;
7b9f35a6 1227 uint32_t tmp;
72662e10 1228
6547fef8 1229 if (type == INTEL_OUTPUT_HDMI) {
876a8cdf
DL
1230 struct intel_digital_port *intel_dig_port =
1231 enc_to_dig_port(encoder);
1232
6547fef8
PZ
1233 /* In HDMI/DVI mode, the port width, and swing/emphasis values
1234 * are ignored so nothing special needs to be done besides
1235 * enabling the port.
1236 */
876a8cdf 1237 I915_WRITE(DDI_BUF_CTL(port),
bcf53de4
SM
1238 intel_dig_port->saved_port_bits |
1239 DDI_BUF_CTL_ENABLE);
d6c50ff8
PZ
1240 } else if (type == INTEL_OUTPUT_EDP) {
1241 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1242
3ab9c637
ID
1243 if (port == PORT_A)
1244 intel_dp_stop_link_train(intel_dp);
1245
4be73780 1246 intel_edp_backlight_on(intel_dp);
4906557e 1247 intel_edp_psr_enable(intel_dp);
6547fef8 1248 }
7b9f35a6 1249
9ed109a7 1250 if (intel_crtc->config.has_audio) {
d45a0bf5 1251 intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO);
7b9f35a6
WX
1252 tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
1253 tmp |= ((AUDIO_OUTPUT_ENABLE_A | AUDIO_ELD_VALID_A) << (pipe * 4));
1254 I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
1255 }
5ab432ef
DV
1256}
1257
00c09d70 1258static void intel_disable_ddi(struct intel_encoder *intel_encoder)
5ab432ef 1259{
d6c50ff8 1260 struct drm_encoder *encoder = &intel_encoder->base;
7b9f35a6
WX
1261 struct drm_crtc *crtc = encoder->crtc;
1262 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1263 int pipe = intel_crtc->pipe;
d6c50ff8 1264 int type = intel_encoder->type;
7b9f35a6
WX
1265 struct drm_device *dev = encoder->dev;
1266 struct drm_i915_private *dev_priv = dev->dev_private;
1267 uint32_t tmp;
d6c50ff8 1268
d45a0bf5
PZ
1269 /* We can't touch HSW_AUD_PIN_ELD_CP_VLD uncionditionally because this
1270 * register is part of the power well on Haswell. */
1271 if (intel_crtc->config.has_audio) {
1272 tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
1273 tmp &= ~((AUDIO_OUTPUT_ENABLE_A | AUDIO_ELD_VALID_A) <<
1274 (pipe * 4));
1275 I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
1276 intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO);
1277 }
2831d842 1278
d6c50ff8
PZ
1279 if (type == INTEL_OUTPUT_EDP) {
1280 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1281
4906557e 1282 intel_edp_psr_disable(intel_dp);
4be73780 1283 intel_edp_backlight_off(intel_dp);
d6c50ff8 1284 }
72662e10 1285}
79f689aa 1286
b8fc2f6a 1287int intel_ddi_get_cdclk_freq(struct drm_i915_private *dev_priv)
79f689aa 1288{
e39bf98a 1289 struct drm_device *dev = dev_priv->dev;
a4006641 1290 uint32_t lcpll = I915_READ(LCPLL_CTL);
e39bf98a 1291 uint32_t freq = lcpll & LCPLL_CLK_FREQ_MASK;
a4006641 1292
e39bf98a 1293 if (lcpll & LCPLL_CD_SOURCE_FCLK) {
a4006641 1294 return 800000;
e3589908 1295 } else if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT) {
b2b877ff 1296 return 450000;
e39bf98a 1297 } else if (freq == LCPLL_CLK_FREQ_450) {
b2b877ff 1298 return 450000;
e39bf98a
PZ
1299 } else if (IS_HASWELL(dev)) {
1300 if (IS_ULT(dev))
1301 return 337500;
1302 else
1303 return 540000;
1304 } else {
1305 if (freq == LCPLL_CLK_FREQ_54O_BDW)
1306 return 540000;
1307 else if (freq == LCPLL_CLK_FREQ_337_5_BDW)
1308 return 337500;
1309 else
1310 return 675000;
1311 }
79f689aa
PZ
1312}
1313
12030431
DV
1314static void hsw_ddi_pll_disable(struct drm_i915_private *dev_priv,
1315 struct intel_shared_dpll *pll)
1316{
1317 uint32_t val;
1318
1319 val = I915_READ(WRPLL_CTL(pll->id));
1320 WARN_ON(!(val & WRPLL_PLL_ENABLE));
1321 I915_WRITE(WRPLL_CTL(pll->id), val & ~WRPLL_PLL_ENABLE);
1322 POSTING_READ(WRPLL_CTL(pll->id));
1323}
1324
d452c5b6
DV
1325static bool hsw_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
1326 struct intel_shared_dpll *pll,
1327 struct intel_dpll_hw_state *hw_state)
1328{
1329 uint32_t val;
1330
1331 if (!intel_display_power_enabled(dev_priv, POWER_DOMAIN_PLLS))
1332 return false;
1333
1334 val = I915_READ(WRPLL_CTL(pll->id));
1335 hw_state->wrpll = val;
1336
1337 return val & WRPLL_PLL_ENABLE;
1338}
1339
9cd86933
DV
1340static char *hsw_ddi_pll_names[] = {
1341 "WRPLL 1",
1342 "WRPLL 2",
1343};
1344
79f689aa
PZ
1345void intel_ddi_pll_init(struct drm_device *dev)
1346{
1347 struct drm_i915_private *dev_priv = dev->dev_private;
1348 uint32_t val = I915_READ(LCPLL_CTL);
9cd86933
DV
1349 int i;
1350
1351 /* Dummy setup until everything is moved over to avoid upsetting the hw
1352 * state cross checker. */
1353 dev_priv->num_shared_dpll = 0;
1354
1355 for (i = 0; i < 2; i++) {
1356 dev_priv->shared_dplls[i].id = i;
1357 dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i];
12030431 1358 dev_priv->shared_dplls[i].disable = hsw_ddi_pll_disable;
d452c5b6
DV
1359 dev_priv->shared_dplls[i].get_hw_state =
1360 hsw_ddi_pll_get_hw_state;
9cd86933 1361 }
79f689aa
PZ
1362
1363 /* The LCPLL register should be turned on by the BIOS. For now let's
1364 * just check its state and print errors in case something is wrong.
1365 * Don't even try to turn it on.
1366 */
1367
b2b877ff 1368 DRM_DEBUG_KMS("CDCLK running at %dKHz\n",
79f689aa
PZ
1369 intel_ddi_get_cdclk_freq(dev_priv));
1370
1371 if (val & LCPLL_CD_SOURCE_FCLK)
1372 DRM_ERROR("CDCLK source is not LCPLL\n");
1373
1374 if (val & LCPLL_PLL_DISABLE)
1375 DRM_ERROR("LCPLL is disabled\n");
1376}
c19b0669
PZ
1377
1378void intel_ddi_prepare_link_retrain(struct drm_encoder *encoder)
1379{
174edf1f
PZ
1380 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
1381 struct intel_dp *intel_dp = &intel_dig_port->dp;
c19b0669 1382 struct drm_i915_private *dev_priv = encoder->dev->dev_private;
174edf1f 1383 enum port port = intel_dig_port->port;
c19b0669 1384 uint32_t val;
f3e227df 1385 bool wait = false;
c19b0669
PZ
1386
1387 if (I915_READ(DP_TP_CTL(port)) & DP_TP_CTL_ENABLE) {
1388 val = I915_READ(DDI_BUF_CTL(port));
1389 if (val & DDI_BUF_CTL_ENABLE) {
1390 val &= ~DDI_BUF_CTL_ENABLE;
1391 I915_WRITE(DDI_BUF_CTL(port), val);
1392 wait = true;
1393 }
1394
1395 val = I915_READ(DP_TP_CTL(port));
1396 val &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
1397 val |= DP_TP_CTL_LINK_TRAIN_PAT1;
1398 I915_WRITE(DP_TP_CTL(port), val);
1399 POSTING_READ(DP_TP_CTL(port));
1400
1401 if (wait)
1402 intel_wait_ddi_buf_idle(dev_priv, port);
1403 }
1404
1405 val = DP_TP_CTL_ENABLE | DP_TP_CTL_MODE_SST |
1406 DP_TP_CTL_LINK_TRAIN_PAT1 | DP_TP_CTL_SCRAMBLE_DISABLE;
6aba5b6c 1407 if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
c19b0669
PZ
1408 val |= DP_TP_CTL_ENHANCED_FRAME_ENABLE;
1409 I915_WRITE(DP_TP_CTL(port), val);
1410 POSTING_READ(DP_TP_CTL(port));
1411
1412 intel_dp->DP |= DDI_BUF_CTL_ENABLE;
1413 I915_WRITE(DDI_BUF_CTL(port), intel_dp->DP);
1414 POSTING_READ(DDI_BUF_CTL(port));
1415
1416 udelay(600);
1417}
00c09d70 1418
1ad960f2
PZ
1419void intel_ddi_fdi_disable(struct drm_crtc *crtc)
1420{
1421 struct drm_i915_private *dev_priv = crtc->dev->dev_private;
1422 struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
1423 uint32_t val;
1424
1425 intel_ddi_post_disable(intel_encoder);
1426
1427 val = I915_READ(_FDI_RXA_CTL);
1428 val &= ~FDI_RX_ENABLE;
1429 I915_WRITE(_FDI_RXA_CTL, val);
1430
1431 val = I915_READ(_FDI_RXA_MISC);
1432 val &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
1433 val |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2);
1434 I915_WRITE(_FDI_RXA_MISC, val);
1435
1436 val = I915_READ(_FDI_RXA_CTL);
1437 val &= ~FDI_PCDCLK;
1438 I915_WRITE(_FDI_RXA_CTL, val);
1439
1440 val = I915_READ(_FDI_RXA_CTL);
1441 val &= ~FDI_RX_PLL_ENABLE;
1442 I915_WRITE(_FDI_RXA_CTL, val);
1443}
1444
00c09d70
PZ
1445static void intel_ddi_hot_plug(struct intel_encoder *intel_encoder)
1446{
1447 struct intel_dp *intel_dp = enc_to_intel_dp(&intel_encoder->base);
1448 int type = intel_encoder->type;
1449
1450 if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP)
1451 intel_dp_check_link_status(intel_dp);
1452}
1453
6801c18c
VS
1454void intel_ddi_get_config(struct intel_encoder *encoder,
1455 struct intel_crtc_config *pipe_config)
045ac3b5
JB
1456{
1457 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
1458 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
1459 enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
1460 u32 temp, flags = 0;
1461
1462 temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
1463 if (temp & TRANS_DDI_PHSYNC)
1464 flags |= DRM_MODE_FLAG_PHSYNC;
1465 else
1466 flags |= DRM_MODE_FLAG_NHSYNC;
1467 if (temp & TRANS_DDI_PVSYNC)
1468 flags |= DRM_MODE_FLAG_PVSYNC;
1469 else
1470 flags |= DRM_MODE_FLAG_NVSYNC;
1471
1472 pipe_config->adjusted_mode.flags |= flags;
42571aef
VS
1473
1474 switch (temp & TRANS_DDI_BPC_MASK) {
1475 case TRANS_DDI_BPC_6:
1476 pipe_config->pipe_bpp = 18;
1477 break;
1478 case TRANS_DDI_BPC_8:
1479 pipe_config->pipe_bpp = 24;
1480 break;
1481 case TRANS_DDI_BPC_10:
1482 pipe_config->pipe_bpp = 30;
1483 break;
1484 case TRANS_DDI_BPC_12:
1485 pipe_config->pipe_bpp = 36;
1486 break;
1487 default:
1488 break;
1489 }
eb14cb74
VS
1490
1491 switch (temp & TRANS_DDI_MODE_SELECT_MASK) {
1492 case TRANS_DDI_MODE_SELECT_HDMI:
6897b4b5 1493 pipe_config->has_hdmi_sink = true;
eb14cb74
VS
1494 case TRANS_DDI_MODE_SELECT_DVI:
1495 case TRANS_DDI_MODE_SELECT_FDI:
1496 break;
1497 case TRANS_DDI_MODE_SELECT_DP_SST:
1498 case TRANS_DDI_MODE_SELECT_DP_MST:
1499 pipe_config->has_dp_encoder = true;
1500 intel_dp_get_m_n(intel_crtc, pipe_config);
1501 break;
1502 default:
1503 break;
1504 }
10214420 1505
a60551b1
PZ
1506 if (intel_display_power_enabled(dev_priv, POWER_DOMAIN_AUDIO)) {
1507 temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
1508 if (temp & (AUDIO_OUTPUT_ENABLE_A << (intel_crtc->pipe * 4)))
1509 pipe_config->has_audio = true;
1510 }
9ed109a7 1511
10214420
DV
1512 if (encoder->type == INTEL_OUTPUT_EDP && dev_priv->vbt.edp_bpp &&
1513 pipe_config->pipe_bpp > dev_priv->vbt.edp_bpp) {
1514 /*
1515 * This is a big fat ugly hack.
1516 *
1517 * Some machines in UEFI boot mode provide us a VBT that has 18
1518 * bpp and 1.62 GHz link bandwidth for eDP, which for reasons
1519 * unknown we fail to light up. Yet the same BIOS boots up with
1520 * 24 bpp and 2.7 GHz link. Use the same bpp as the BIOS uses as
1521 * max, not what it tells us to use.
1522 *
1523 * Note: This will still be broken if the eDP panel is not lit
1524 * up by the BIOS, and thus we can't get the mode at module
1525 * load.
1526 */
1527 DRM_DEBUG_KMS("pipe has %d bpp for eDP panel, overriding BIOS-provided max %d bpp\n",
1528 pipe_config->pipe_bpp, dev_priv->vbt.edp_bpp);
1529 dev_priv->vbt.edp_bpp = pipe_config->pipe_bpp;
1530 }
11578553
JB
1531
1532 intel_ddi_clock_get(encoder, pipe_config);
045ac3b5
JB
1533}
1534
00c09d70
PZ
1535static void intel_ddi_destroy(struct drm_encoder *encoder)
1536{
1537 /* HDMI has nothing special to destroy, so we can go with this. */
1538 intel_dp_encoder_destroy(encoder);
1539}
1540
5bfe2ac0
DV
1541static bool intel_ddi_compute_config(struct intel_encoder *encoder,
1542 struct intel_crtc_config *pipe_config)
00c09d70 1543{
5bfe2ac0 1544 int type = encoder->type;
eccb140b 1545 int port = intel_ddi_get_encoder_port(encoder);
00c09d70 1546
5bfe2ac0 1547 WARN(type == INTEL_OUTPUT_UNKNOWN, "compute_config() on unknown output!\n");
00c09d70 1548
eccb140b
DV
1549 if (port == PORT_A)
1550 pipe_config->cpu_transcoder = TRANSCODER_EDP;
1551
00c09d70 1552 if (type == INTEL_OUTPUT_HDMI)
5bfe2ac0 1553 return intel_hdmi_compute_config(encoder, pipe_config);
00c09d70 1554 else
5bfe2ac0 1555 return intel_dp_compute_config(encoder, pipe_config);
00c09d70
PZ
1556}
1557
1558static const struct drm_encoder_funcs intel_ddi_funcs = {
1559 .destroy = intel_ddi_destroy,
1560};
1561
4a28ae58
PZ
1562static struct intel_connector *
1563intel_ddi_init_dp_connector(struct intel_digital_port *intel_dig_port)
1564{
1565 struct intel_connector *connector;
1566 enum port port = intel_dig_port->port;
1567
1568 connector = kzalloc(sizeof(*connector), GFP_KERNEL);
1569 if (!connector)
1570 return NULL;
1571
1572 intel_dig_port->dp.output_reg = DDI_BUF_CTL(port);
1573 if (!intel_dp_init_connector(intel_dig_port, connector)) {
1574 kfree(connector);
1575 return NULL;
1576 }
1577
1578 return connector;
1579}
1580
1581static struct intel_connector *
1582intel_ddi_init_hdmi_connector(struct intel_digital_port *intel_dig_port)
1583{
1584 struct intel_connector *connector;
1585 enum port port = intel_dig_port->port;
1586
1587 connector = kzalloc(sizeof(*connector), GFP_KERNEL);
1588 if (!connector)
1589 return NULL;
1590
1591 intel_dig_port->hdmi.hdmi_reg = DDI_BUF_CTL(port);
1592 intel_hdmi_init_connector(intel_dig_port, connector);
1593
1594 return connector;
1595}
1596
00c09d70
PZ
1597void intel_ddi_init(struct drm_device *dev, enum port port)
1598{
876a8cdf 1599 struct drm_i915_private *dev_priv = dev->dev_private;
00c09d70
PZ
1600 struct intel_digital_port *intel_dig_port;
1601 struct intel_encoder *intel_encoder;
1602 struct drm_encoder *encoder;
1603 struct intel_connector *hdmi_connector = NULL;
1604 struct intel_connector *dp_connector = NULL;
311a2094
PZ
1605 bool init_hdmi, init_dp;
1606
1607 init_hdmi = (dev_priv->vbt.ddi_port_info[port].supports_dvi ||
1608 dev_priv->vbt.ddi_port_info[port].supports_hdmi);
1609 init_dp = dev_priv->vbt.ddi_port_info[port].supports_dp;
1610 if (!init_dp && !init_hdmi) {
1611 DRM_DEBUG_KMS("VBT says port %c is not DVI/HDMI/DP compatible\n",
1612 port_name(port));
1613 init_hdmi = true;
1614 init_dp = true;
1615 }
00c09d70 1616
b14c5679 1617 intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
00c09d70
PZ
1618 if (!intel_dig_port)
1619 return;
1620
00c09d70
PZ
1621 intel_encoder = &intel_dig_port->base;
1622 encoder = &intel_encoder->base;
1623
1624 drm_encoder_init(dev, encoder, &intel_ddi_funcs,
1625 DRM_MODE_ENCODER_TMDS);
00c09d70 1626
5bfe2ac0 1627 intel_encoder->compute_config = intel_ddi_compute_config;
00c09d70
PZ
1628 intel_encoder->enable = intel_enable_ddi;
1629 intel_encoder->pre_enable = intel_ddi_pre_enable;
1630 intel_encoder->disable = intel_disable_ddi;
1631 intel_encoder->post_disable = intel_ddi_post_disable;
1632 intel_encoder->get_hw_state = intel_ddi_get_hw_state;
045ac3b5 1633 intel_encoder->get_config = intel_ddi_get_config;
00c09d70
PZ
1634
1635 intel_dig_port->port = port;
bcf53de4
SM
1636 intel_dig_port->saved_port_bits = I915_READ(DDI_BUF_CTL(port)) &
1637 (DDI_BUF_PORT_REVERSAL |
1638 DDI_A_4_LANES);
00c09d70
PZ
1639
1640 intel_encoder->type = INTEL_OUTPUT_UNKNOWN;
1641 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
bc079e8b 1642 intel_encoder->cloneable = 0;
00c09d70
PZ
1643 intel_encoder->hot_plug = intel_ddi_hot_plug;
1644
13cf5504
DA
1645 intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
1646 dev_priv->hpd_irq_port[port] = intel_dig_port;
1647
4a28ae58
PZ
1648 if (init_dp)
1649 dp_connector = intel_ddi_init_dp_connector(intel_dig_port);
21a8e6a4 1650
311a2094
PZ
1651 /* In theory we don't need the encoder->type check, but leave it just in
1652 * case we have some really bad VBTs... */
4a28ae58
PZ
1653 if (intel_encoder->type != INTEL_OUTPUT_EDP && init_hdmi)
1654 hdmi_connector = intel_ddi_init_hdmi_connector(intel_dig_port);
21a8e6a4 1655
4a28ae58
PZ
1656 if (!dp_connector && !hdmi_connector) {
1657 drm_encoder_cleanup(encoder);
1658 kfree(intel_dig_port);
21a8e6a4 1659 }
00c09d70 1660}
This page took 0.246669 seconds and 5 git commands to generate.