drm/i915: ->enable 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) {
e0b01be4 743 struct intel_shared_dpll *pll;
566b734a 744 uint32_t reg, val;
1c0b85c5 745 unsigned p, n2, r2;
6441ab5f 746
0694001b
PZ
747 intel_ddi_calculate_wrpll(clock * 1000, &r2, &n2, &p);
748
114fe488 749 val = WRPLL_PLL_ENABLE | WRPLL_PLL_LCPLL |
0694001b
PZ
750 WRPLL_DIVIDER_REFERENCE(r2) | WRPLL_DIVIDER_FEEDBACK(n2) |
751 WRPLL_DIVIDER_POST(p);
752
753 if (val == I915_READ(WRPLL_CTL1)) {
754 DRM_DEBUG_KMS("Reusing WRPLL 1 on pipe %c\n",
755 pipe_name(pipe));
756 reg = WRPLL_CTL1;
757 } else if (val == I915_READ(WRPLL_CTL2)) {
758 DRM_DEBUG_KMS("Reusing WRPLL 2 on pipe %c\n",
759 pipe_name(pipe));
760 reg = WRPLL_CTL2;
761 } else if (plls->wrpll1_refcount == 0) {
6441ab5f
PZ
762 DRM_DEBUG_KMS("Using WRPLL 1 on pipe %c\n",
763 pipe_name(pipe));
6441ab5f 764 reg = WRPLL_CTL1;
6441ab5f
PZ
765 } else if (plls->wrpll2_refcount == 0) {
766 DRM_DEBUG_KMS("Using WRPLL 2 on pipe %c\n",
767 pipe_name(pipe));
6441ab5f 768 reg = WRPLL_CTL2;
6441ab5f
PZ
769 } else {
770 DRM_ERROR("No WRPLLs available!\n");
771 return false;
772 }
773
566b734a
PZ
774 DRM_DEBUG_KMS("WRPLL: %dKHz refresh rate with p=%d, n2=%d r2=%d\n",
775 clock, p, n2, r2);
776
0694001b
PZ
777 if (reg == WRPLL_CTL1) {
778 plls->wrpll1_refcount++;
de7cfc63 779 intel_crtc->config.ddi_pll_sel = PORT_CLK_SEL_WRPLL1;
9cd86933 780 intel_crtc->config.shared_dpll = DPLL_ID_WRPLL1;
0694001b
PZ
781 } else {
782 plls->wrpll2_refcount++;
de7cfc63 783 intel_crtc->config.ddi_pll_sel = PORT_CLK_SEL_WRPLL2;
9cd86933 784 intel_crtc->config.shared_dpll = DPLL_ID_WRPLL2;
0694001b 785 }
d452c5b6
DV
786
787 intel_crtc->config.dpll_hw_state.wrpll = val;
e0b01be4
DV
788
789 pll = &dev_priv->shared_dplls[intel_crtc->config.shared_dpll];
790 pll->hw_state.wrpll = val;
6441ab5f
PZ
791 }
792
6441ab5f
PZ
793 return true;
794}
795
566b734a
PZ
796/*
797 * To be called after intel_ddi_pll_select(). That one selects the PLL to be
798 * used, this one actually enables the PLL.
799 */
800void intel_ddi_pll_enable(struct intel_crtc *crtc)
801{
802 struct drm_device *dev = crtc->base.dev;
803 struct drm_i915_private *dev_priv = dev->dev_private;
804 struct intel_ddi_plls *plls = &dev_priv->ddi_plls;
566b734a 805 int refcount;
e0b01be4 806 struct intel_shared_dpll *pll = intel_crtc_to_shared_dpll(crtc);
566b734a 807
de7cfc63 808 switch (crtc->config.ddi_pll_sel) {
566b734a
PZ
809 case PORT_CLK_SEL_WRPLL1:
810 case PORT_CLK_SEL_WRPLL2:
de7cfc63 811 if (crtc->config.ddi_pll_sel == PORT_CLK_SEL_WRPLL1) {
566b734a
PZ
812 refcount = plls->wrpll1_refcount;
813 } else {
566b734a
PZ
814 refcount = plls->wrpll2_refcount;
815 }
566b734a 816 break;
566b734a 817 default:
566b734a
PZ
818 return;
819 }
820
566b734a 821 if (refcount == 1) {
e0b01be4 822 pll->enable(dev_priv, pll);
566b734a
PZ
823 }
824}
825
dae84799
PZ
826void intel_ddi_set_pipe_settings(struct drm_crtc *crtc)
827{
828 struct drm_i915_private *dev_priv = crtc->dev->dev_private;
829 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
830 struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
3b117c8f 831 enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
dae84799
PZ
832 int type = intel_encoder->type;
833 uint32_t temp;
834
835 if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
836
c9809791 837 temp = TRANS_MSA_SYNC_CLK;
965e0c48 838 switch (intel_crtc->config.pipe_bpp) {
dae84799 839 case 18:
c9809791 840 temp |= TRANS_MSA_6_BPC;
dae84799
PZ
841 break;
842 case 24:
c9809791 843 temp |= TRANS_MSA_8_BPC;
dae84799
PZ
844 break;
845 case 30:
c9809791 846 temp |= TRANS_MSA_10_BPC;
dae84799
PZ
847 break;
848 case 36:
c9809791 849 temp |= TRANS_MSA_12_BPC;
dae84799
PZ
850 break;
851 default:
4e53c2e0 852 BUG();
dae84799 853 }
c9809791 854 I915_WRITE(TRANS_MSA_MISC(cpu_transcoder), temp);
dae84799
PZ
855 }
856}
857
8228c251 858void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc)
8d9ddbcb
PZ
859{
860 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
861 struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
7739c33b 862 struct drm_encoder *encoder = &intel_encoder->base;
c7670b10
PZ
863 struct drm_device *dev = crtc->dev;
864 struct drm_i915_private *dev_priv = dev->dev_private;
8d9ddbcb 865 enum pipe pipe = intel_crtc->pipe;
3b117c8f 866 enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
174edf1f 867 enum port port = intel_ddi_get_encoder_port(intel_encoder);
7739c33b 868 int type = intel_encoder->type;
8d9ddbcb
PZ
869 uint32_t temp;
870
ad80a810
PZ
871 /* Enable TRANS_DDI_FUNC_CTL for the pipe to work in HDMI mode */
872 temp = TRANS_DDI_FUNC_ENABLE;
174edf1f 873 temp |= TRANS_DDI_SELECT_PORT(port);
dfcef252 874
965e0c48 875 switch (intel_crtc->config.pipe_bpp) {
dfcef252 876 case 18:
ad80a810 877 temp |= TRANS_DDI_BPC_6;
dfcef252
PZ
878 break;
879 case 24:
ad80a810 880 temp |= TRANS_DDI_BPC_8;
dfcef252
PZ
881 break;
882 case 30:
ad80a810 883 temp |= TRANS_DDI_BPC_10;
dfcef252
PZ
884 break;
885 case 36:
ad80a810 886 temp |= TRANS_DDI_BPC_12;
dfcef252
PZ
887 break;
888 default:
4e53c2e0 889 BUG();
dfcef252 890 }
72662e10 891
a666283e 892 if (intel_crtc->config.adjusted_mode.flags & DRM_MODE_FLAG_PVSYNC)
ad80a810 893 temp |= TRANS_DDI_PVSYNC;
a666283e 894 if (intel_crtc->config.adjusted_mode.flags & DRM_MODE_FLAG_PHSYNC)
ad80a810 895 temp |= TRANS_DDI_PHSYNC;
f63eb7c4 896
e6f0bfc4
PZ
897 if (cpu_transcoder == TRANSCODER_EDP) {
898 switch (pipe) {
899 case PIPE_A:
c7670b10
PZ
900 /* On Haswell, can only use the always-on power well for
901 * eDP when not using the panel fitter, and when not
902 * using motion blur mitigation (which we don't
903 * support). */
fabf6e51
DV
904 if (IS_HASWELL(dev) &&
905 (intel_crtc->config.pch_pfit.enabled ||
906 intel_crtc->config.pch_pfit.force_thru))
d6dd9eb1
DV
907 temp |= TRANS_DDI_EDP_INPUT_A_ONOFF;
908 else
909 temp |= TRANS_DDI_EDP_INPUT_A_ON;
e6f0bfc4
PZ
910 break;
911 case PIPE_B:
912 temp |= TRANS_DDI_EDP_INPUT_B_ONOFF;
913 break;
914 case PIPE_C:
915 temp |= TRANS_DDI_EDP_INPUT_C_ONOFF;
916 break;
917 default:
918 BUG();
919 break;
920 }
921 }
922
7739c33b 923 if (type == INTEL_OUTPUT_HDMI) {
6897b4b5 924 if (intel_crtc->config.has_hdmi_sink)
ad80a810 925 temp |= TRANS_DDI_MODE_SELECT_HDMI;
8d9ddbcb 926 else
ad80a810 927 temp |= TRANS_DDI_MODE_SELECT_DVI;
8d9ddbcb 928
7739c33b 929 } else if (type == INTEL_OUTPUT_ANALOG) {
ad80a810 930 temp |= TRANS_DDI_MODE_SELECT_FDI;
33d29b14 931 temp |= (intel_crtc->config.fdi_lanes - 1) << 1;
7739c33b
PZ
932
933 } else if (type == INTEL_OUTPUT_DISPLAYPORT ||
934 type == INTEL_OUTPUT_EDP) {
935 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
936
ad80a810 937 temp |= TRANS_DDI_MODE_SELECT_DP_SST;
7739c33b 938
17aa6be9 939 temp |= DDI_PORT_WIDTH(intel_dp->lane_count);
8d9ddbcb 940 } else {
84f44ce7
VS
941 WARN(1, "Invalid encoder type %d for pipe %c\n",
942 intel_encoder->type, pipe_name(pipe));
8d9ddbcb
PZ
943 }
944
ad80a810 945 I915_WRITE(TRANS_DDI_FUNC_CTL(cpu_transcoder), temp);
8d9ddbcb 946}
72662e10 947
ad80a810
PZ
948void intel_ddi_disable_transcoder_func(struct drm_i915_private *dev_priv,
949 enum transcoder cpu_transcoder)
8d9ddbcb 950{
ad80a810 951 uint32_t reg = TRANS_DDI_FUNC_CTL(cpu_transcoder);
8d9ddbcb
PZ
952 uint32_t val = I915_READ(reg);
953
ad80a810
PZ
954 val &= ~(TRANS_DDI_FUNC_ENABLE | TRANS_DDI_PORT_MASK);
955 val |= TRANS_DDI_PORT_NONE;
8d9ddbcb 956 I915_WRITE(reg, val);
72662e10
ED
957}
958
bcbc889b
PZ
959bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector)
960{
961 struct drm_device *dev = intel_connector->base.dev;
962 struct drm_i915_private *dev_priv = dev->dev_private;
963 struct intel_encoder *intel_encoder = intel_connector->encoder;
964 int type = intel_connector->base.connector_type;
965 enum port port = intel_ddi_get_encoder_port(intel_encoder);
966 enum pipe pipe = 0;
967 enum transcoder cpu_transcoder;
882244a3 968 enum intel_display_power_domain power_domain;
bcbc889b
PZ
969 uint32_t tmp;
970
882244a3
PZ
971 power_domain = intel_display_port_power_domain(intel_encoder);
972 if (!intel_display_power_enabled(dev_priv, power_domain))
973 return false;
974
bcbc889b
PZ
975 if (!intel_encoder->get_hw_state(intel_encoder, &pipe))
976 return false;
977
978 if (port == PORT_A)
979 cpu_transcoder = TRANSCODER_EDP;
980 else
1a240d4d 981 cpu_transcoder = (enum transcoder) pipe;
bcbc889b
PZ
982
983 tmp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
984
985 switch (tmp & TRANS_DDI_MODE_SELECT_MASK) {
986 case TRANS_DDI_MODE_SELECT_HDMI:
987 case TRANS_DDI_MODE_SELECT_DVI:
988 return (type == DRM_MODE_CONNECTOR_HDMIA);
989
990 case TRANS_DDI_MODE_SELECT_DP_SST:
991 if (type == DRM_MODE_CONNECTOR_eDP)
992 return true;
993 case TRANS_DDI_MODE_SELECT_DP_MST:
994 return (type == DRM_MODE_CONNECTOR_DisplayPort);
995
996 case TRANS_DDI_MODE_SELECT_FDI:
997 return (type == DRM_MODE_CONNECTOR_VGA);
998
999 default:
1000 return false;
1001 }
1002}
1003
85234cdc
DV
1004bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
1005 enum pipe *pipe)
1006{
1007 struct drm_device *dev = encoder->base.dev;
1008 struct drm_i915_private *dev_priv = dev->dev_private;
fe43d3f5 1009 enum port port = intel_ddi_get_encoder_port(encoder);
6d129bea 1010 enum intel_display_power_domain power_domain;
85234cdc
DV
1011 u32 tmp;
1012 int i;
1013
6d129bea
ID
1014 power_domain = intel_display_port_power_domain(encoder);
1015 if (!intel_display_power_enabled(dev_priv, power_domain))
1016 return false;
1017
fe43d3f5 1018 tmp = I915_READ(DDI_BUF_CTL(port));
85234cdc
DV
1019
1020 if (!(tmp & DDI_BUF_CTL_ENABLE))
1021 return false;
1022
ad80a810
PZ
1023 if (port == PORT_A) {
1024 tmp = I915_READ(TRANS_DDI_FUNC_CTL(TRANSCODER_EDP));
85234cdc 1025
ad80a810
PZ
1026 switch (tmp & TRANS_DDI_EDP_INPUT_MASK) {
1027 case TRANS_DDI_EDP_INPUT_A_ON:
1028 case TRANS_DDI_EDP_INPUT_A_ONOFF:
1029 *pipe = PIPE_A;
1030 break;
1031 case TRANS_DDI_EDP_INPUT_B_ONOFF:
1032 *pipe = PIPE_B;
1033 break;
1034 case TRANS_DDI_EDP_INPUT_C_ONOFF:
1035 *pipe = PIPE_C;
1036 break;
1037 }
1038
1039 return true;
1040 } else {
1041 for (i = TRANSCODER_A; i <= TRANSCODER_C; i++) {
1042 tmp = I915_READ(TRANS_DDI_FUNC_CTL(i));
1043
1044 if ((tmp & TRANS_DDI_PORT_MASK)
1045 == TRANS_DDI_SELECT_PORT(port)) {
1046 *pipe = i;
1047 return true;
1048 }
85234cdc
DV
1049 }
1050 }
1051
84f44ce7 1052 DRM_DEBUG_KMS("No pipe for ddi port %c found\n", port_name(port));
85234cdc 1053
22f9fe50 1054 return false;
85234cdc
DV
1055}
1056
6441ab5f
PZ
1057void intel_ddi_setup_hw_pll_state(struct drm_device *dev)
1058{
1059 struct drm_i915_private *dev_priv = dev->dev_private;
1060 enum pipe pipe;
1061 struct intel_crtc *intel_crtc;
1062
0882dae9
PZ
1063 dev_priv->ddi_plls.wrpll1_refcount = 0;
1064 dev_priv->ddi_plls.wrpll2_refcount = 0;
1065
6441ab5f
PZ
1066 for_each_pipe(pipe) {
1067 intel_crtc =
1068 to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);
1069
0882dae9 1070 if (!intel_crtc->active) {
de7cfc63 1071 intel_crtc->config.ddi_pll_sel = PORT_CLK_SEL_NONE;
6441ab5f 1072 continue;
0882dae9 1073 }
6441ab5f 1074
de7cfc63 1075 switch (intel_crtc->config.ddi_pll_sel) {
6441ab5f
PZ
1076 case PORT_CLK_SEL_WRPLL1:
1077 dev_priv->ddi_plls.wrpll1_refcount++;
1078 break;
1079 case PORT_CLK_SEL_WRPLL2:
1080 dev_priv->ddi_plls.wrpll2_refcount++;
1081 break;
1082 }
1083 }
1084}
1085
fc914639
PZ
1086void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc)
1087{
1088 struct drm_crtc *crtc = &intel_crtc->base;
1089 struct drm_i915_private *dev_priv = crtc->dev->dev_private;
1090 struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
1091 enum port port = intel_ddi_get_encoder_port(intel_encoder);
3b117c8f 1092 enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
fc914639 1093
bb523fc0
PZ
1094 if (cpu_transcoder != TRANSCODER_EDP)
1095 I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
1096 TRANS_CLK_SEL_PORT(port));
fc914639
PZ
1097}
1098
1099void intel_ddi_disable_pipe_clock(struct intel_crtc *intel_crtc)
1100{
1101 struct drm_i915_private *dev_priv = intel_crtc->base.dev->dev_private;
3b117c8f 1102 enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
fc914639 1103
bb523fc0
PZ
1104 if (cpu_transcoder != TRANSCODER_EDP)
1105 I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
1106 TRANS_CLK_SEL_DISABLED);
fc914639
PZ
1107}
1108
00c09d70 1109static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder)
6441ab5f 1110{
c19b0669 1111 struct drm_encoder *encoder = &intel_encoder->base;
c19b0669 1112 struct drm_i915_private *dev_priv = encoder->dev->dev_private;
30cf6db8 1113 struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
6441ab5f 1114 enum port port = intel_ddi_get_encoder_port(intel_encoder);
82a4d9c0 1115 int type = intel_encoder->type;
6441ab5f 1116
30cf6db8
DV
1117 if (crtc->config.has_audio) {
1118 DRM_DEBUG_DRIVER("Audio on pipe %c on DDI\n",
1119 pipe_name(crtc->pipe));
1120
1121 /* write eld */
1122 DRM_DEBUG_DRIVER("DDI audio: write eld information\n");
1123 intel_write_eld(encoder, &crtc->config.adjusted_mode);
1124 }
1125
82a4d9c0
PZ
1126 if (type == INTEL_OUTPUT_EDP) {
1127 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
4be73780 1128 intel_edp_panel_on(intel_dp);
82a4d9c0 1129 }
6441ab5f 1130
de7cfc63
DV
1131 WARN_ON(crtc->config.ddi_pll_sel == PORT_CLK_SEL_NONE);
1132 I915_WRITE(PORT_CLK_SEL(port), crtc->config.ddi_pll_sel);
c19b0669 1133
82a4d9c0 1134 if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
c19b0669 1135 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
30cf6db8
DV
1136 struct intel_digital_port *intel_dig_port =
1137 enc_to_dig_port(encoder);
1138
1139 intel_dp->DP = intel_dig_port->saved_port_bits |
1140 DDI_BUF_CTL_ENABLE | DDI_BUF_EMP_400MV_0DB_HSW;
1141 intel_dp->DP |= DDI_PORT_WIDTH(intel_dp->lane_count);
c19b0669
PZ
1142
1143 intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
1144 intel_dp_start_link_train(intel_dp);
1145 intel_dp_complete_link_train(intel_dp);
3ab9c637
ID
1146 if (port != PORT_A)
1147 intel_dp_stop_link_train(intel_dp);
30cf6db8
DV
1148 } else if (type == INTEL_OUTPUT_HDMI) {
1149 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
1150
1151 intel_hdmi->set_infoframes(encoder,
1152 crtc->config.has_hdmi_sink,
1153 &crtc->config.adjusted_mode);
c19b0669 1154 }
6441ab5f
PZ
1155}
1156
00c09d70 1157static void intel_ddi_post_disable(struct intel_encoder *intel_encoder)
6441ab5f
PZ
1158{
1159 struct drm_encoder *encoder = &intel_encoder->base;
1160 struct drm_i915_private *dev_priv = encoder->dev->dev_private;
1161 enum port port = intel_ddi_get_encoder_port(intel_encoder);
82a4d9c0 1162 int type = intel_encoder->type;
2886e93f 1163 uint32_t val;
a836bdf9 1164 bool wait = false;
2886e93f
PZ
1165
1166 val = I915_READ(DDI_BUF_CTL(port));
1167 if (val & DDI_BUF_CTL_ENABLE) {
1168 val &= ~DDI_BUF_CTL_ENABLE;
1169 I915_WRITE(DDI_BUF_CTL(port), val);
a836bdf9 1170 wait = true;
2886e93f 1171 }
6441ab5f 1172
a836bdf9
PZ
1173 val = I915_READ(DP_TP_CTL(port));
1174 val &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
1175 val |= DP_TP_CTL_LINK_TRAIN_PAT1;
1176 I915_WRITE(DP_TP_CTL(port), val);
1177
1178 if (wait)
1179 intel_wait_ddi_buf_idle(dev_priv, port);
1180
76bb80ed 1181 if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
82a4d9c0 1182 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
76bb80ed 1183 intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
24f3e092 1184 intel_edp_panel_vdd_on(intel_dp);
4be73780 1185 intel_edp_panel_off(intel_dp);
82a4d9c0
PZ
1186 }
1187
6441ab5f
PZ
1188 I915_WRITE(PORT_CLK_SEL(port), PORT_CLK_SEL_NONE);
1189}
1190
00c09d70 1191static void intel_enable_ddi(struct intel_encoder *intel_encoder)
72662e10 1192{
6547fef8 1193 struct drm_encoder *encoder = &intel_encoder->base;
7b9f35a6
WX
1194 struct drm_crtc *crtc = encoder->crtc;
1195 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1196 int pipe = intel_crtc->pipe;
6547fef8 1197 struct drm_device *dev = encoder->dev;
72662e10 1198 struct drm_i915_private *dev_priv = dev->dev_private;
6547fef8
PZ
1199 enum port port = intel_ddi_get_encoder_port(intel_encoder);
1200 int type = intel_encoder->type;
7b9f35a6 1201 uint32_t tmp;
72662e10 1202
6547fef8 1203 if (type == INTEL_OUTPUT_HDMI) {
876a8cdf
DL
1204 struct intel_digital_port *intel_dig_port =
1205 enc_to_dig_port(encoder);
1206
6547fef8
PZ
1207 /* In HDMI/DVI mode, the port width, and swing/emphasis values
1208 * are ignored so nothing special needs to be done besides
1209 * enabling the port.
1210 */
876a8cdf 1211 I915_WRITE(DDI_BUF_CTL(port),
bcf53de4
SM
1212 intel_dig_port->saved_port_bits |
1213 DDI_BUF_CTL_ENABLE);
d6c50ff8
PZ
1214 } else if (type == INTEL_OUTPUT_EDP) {
1215 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1216
3ab9c637
ID
1217 if (port == PORT_A)
1218 intel_dp_stop_link_train(intel_dp);
1219
4be73780 1220 intel_edp_backlight_on(intel_dp);
4906557e 1221 intel_edp_psr_enable(intel_dp);
6547fef8 1222 }
7b9f35a6 1223
9ed109a7 1224 if (intel_crtc->config.has_audio) {
d45a0bf5 1225 intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO);
7b9f35a6
WX
1226 tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
1227 tmp |= ((AUDIO_OUTPUT_ENABLE_A | AUDIO_ELD_VALID_A) << (pipe * 4));
1228 I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
1229 }
5ab432ef
DV
1230}
1231
00c09d70 1232static void intel_disable_ddi(struct intel_encoder *intel_encoder)
5ab432ef 1233{
d6c50ff8 1234 struct drm_encoder *encoder = &intel_encoder->base;
7b9f35a6
WX
1235 struct drm_crtc *crtc = encoder->crtc;
1236 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1237 int pipe = intel_crtc->pipe;
d6c50ff8 1238 int type = intel_encoder->type;
7b9f35a6
WX
1239 struct drm_device *dev = encoder->dev;
1240 struct drm_i915_private *dev_priv = dev->dev_private;
1241 uint32_t tmp;
d6c50ff8 1242
d45a0bf5
PZ
1243 /* We can't touch HSW_AUD_PIN_ELD_CP_VLD uncionditionally because this
1244 * register is part of the power well on Haswell. */
1245 if (intel_crtc->config.has_audio) {
1246 tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
1247 tmp &= ~((AUDIO_OUTPUT_ENABLE_A | AUDIO_ELD_VALID_A) <<
1248 (pipe * 4));
1249 I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
1250 intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO);
1251 }
2831d842 1252
d6c50ff8
PZ
1253 if (type == INTEL_OUTPUT_EDP) {
1254 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1255
4906557e 1256 intel_edp_psr_disable(intel_dp);
4be73780 1257 intel_edp_backlight_off(intel_dp);
d6c50ff8 1258 }
72662e10 1259}
79f689aa 1260
b8fc2f6a 1261int intel_ddi_get_cdclk_freq(struct drm_i915_private *dev_priv)
79f689aa 1262{
e39bf98a 1263 struct drm_device *dev = dev_priv->dev;
a4006641 1264 uint32_t lcpll = I915_READ(LCPLL_CTL);
e39bf98a 1265 uint32_t freq = lcpll & LCPLL_CLK_FREQ_MASK;
a4006641 1266
e39bf98a 1267 if (lcpll & LCPLL_CD_SOURCE_FCLK) {
a4006641 1268 return 800000;
e3589908 1269 } else if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT) {
b2b877ff 1270 return 450000;
e39bf98a 1271 } else if (freq == LCPLL_CLK_FREQ_450) {
b2b877ff 1272 return 450000;
e39bf98a
PZ
1273 } else if (IS_HASWELL(dev)) {
1274 if (IS_ULT(dev))
1275 return 337500;
1276 else
1277 return 540000;
1278 } else {
1279 if (freq == LCPLL_CLK_FREQ_54O_BDW)
1280 return 540000;
1281 else if (freq == LCPLL_CLK_FREQ_337_5_BDW)
1282 return 337500;
1283 else
1284 return 675000;
1285 }
79f689aa
PZ
1286}
1287
e0b01be4
DV
1288static void hsw_ddi_pll_enable(struct drm_i915_private *dev_priv,
1289 struct intel_shared_dpll *pll)
1290{
1291 uint32_t cur_val;
1292
1293 cur_val = I915_READ(WRPLL_CTL(pll->id));
1294 WARN(cur_val & WRPLL_PLL_ENABLE, "%s already enabled\n", pll->name);
1295 I915_WRITE(WRPLL_CTL(pll->id), pll->hw_state.wrpll);
1296 POSTING_READ(WRPLL_CTL(pll->id));
1297 udelay(20);
1298}
1299
12030431
DV
1300static void hsw_ddi_pll_disable(struct drm_i915_private *dev_priv,
1301 struct intel_shared_dpll *pll)
1302{
1303 uint32_t val;
1304
1305 val = I915_READ(WRPLL_CTL(pll->id));
1306 WARN_ON(!(val & WRPLL_PLL_ENABLE));
1307 I915_WRITE(WRPLL_CTL(pll->id), val & ~WRPLL_PLL_ENABLE);
1308 POSTING_READ(WRPLL_CTL(pll->id));
1309}
1310
d452c5b6
DV
1311static bool hsw_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
1312 struct intel_shared_dpll *pll,
1313 struct intel_dpll_hw_state *hw_state)
1314{
1315 uint32_t val;
1316
1317 if (!intel_display_power_enabled(dev_priv, POWER_DOMAIN_PLLS))
1318 return false;
1319
1320 val = I915_READ(WRPLL_CTL(pll->id));
1321 hw_state->wrpll = val;
1322
1323 return val & WRPLL_PLL_ENABLE;
1324}
1325
9cd86933
DV
1326static char *hsw_ddi_pll_names[] = {
1327 "WRPLL 1",
1328 "WRPLL 2",
1329};
1330
79f689aa
PZ
1331void intel_ddi_pll_init(struct drm_device *dev)
1332{
1333 struct drm_i915_private *dev_priv = dev->dev_private;
1334 uint32_t val = I915_READ(LCPLL_CTL);
9cd86933
DV
1335 int i;
1336
1337 /* Dummy setup until everything is moved over to avoid upsetting the hw
1338 * state cross checker. */
1339 dev_priv->num_shared_dpll = 0;
1340
1341 for (i = 0; i < 2; i++) {
1342 dev_priv->shared_dplls[i].id = i;
1343 dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i];
12030431 1344 dev_priv->shared_dplls[i].disable = hsw_ddi_pll_disable;
e0b01be4 1345 dev_priv->shared_dplls[i].enable = hsw_ddi_pll_enable;
d452c5b6
DV
1346 dev_priv->shared_dplls[i].get_hw_state =
1347 hsw_ddi_pll_get_hw_state;
9cd86933 1348 }
79f689aa
PZ
1349
1350 /* The LCPLL register should be turned on by the BIOS. For now let's
1351 * just check its state and print errors in case something is wrong.
1352 * Don't even try to turn it on.
1353 */
1354
b2b877ff 1355 DRM_DEBUG_KMS("CDCLK running at %dKHz\n",
79f689aa
PZ
1356 intel_ddi_get_cdclk_freq(dev_priv));
1357
1358 if (val & LCPLL_CD_SOURCE_FCLK)
1359 DRM_ERROR("CDCLK source is not LCPLL\n");
1360
1361 if (val & LCPLL_PLL_DISABLE)
1362 DRM_ERROR("LCPLL is disabled\n");
1363}
c19b0669
PZ
1364
1365void intel_ddi_prepare_link_retrain(struct drm_encoder *encoder)
1366{
174edf1f
PZ
1367 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
1368 struct intel_dp *intel_dp = &intel_dig_port->dp;
c19b0669 1369 struct drm_i915_private *dev_priv = encoder->dev->dev_private;
174edf1f 1370 enum port port = intel_dig_port->port;
c19b0669 1371 uint32_t val;
f3e227df 1372 bool wait = false;
c19b0669
PZ
1373
1374 if (I915_READ(DP_TP_CTL(port)) & DP_TP_CTL_ENABLE) {
1375 val = I915_READ(DDI_BUF_CTL(port));
1376 if (val & DDI_BUF_CTL_ENABLE) {
1377 val &= ~DDI_BUF_CTL_ENABLE;
1378 I915_WRITE(DDI_BUF_CTL(port), val);
1379 wait = true;
1380 }
1381
1382 val = I915_READ(DP_TP_CTL(port));
1383 val &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
1384 val |= DP_TP_CTL_LINK_TRAIN_PAT1;
1385 I915_WRITE(DP_TP_CTL(port), val);
1386 POSTING_READ(DP_TP_CTL(port));
1387
1388 if (wait)
1389 intel_wait_ddi_buf_idle(dev_priv, port);
1390 }
1391
1392 val = DP_TP_CTL_ENABLE | DP_TP_CTL_MODE_SST |
1393 DP_TP_CTL_LINK_TRAIN_PAT1 | DP_TP_CTL_SCRAMBLE_DISABLE;
6aba5b6c 1394 if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
c19b0669
PZ
1395 val |= DP_TP_CTL_ENHANCED_FRAME_ENABLE;
1396 I915_WRITE(DP_TP_CTL(port), val);
1397 POSTING_READ(DP_TP_CTL(port));
1398
1399 intel_dp->DP |= DDI_BUF_CTL_ENABLE;
1400 I915_WRITE(DDI_BUF_CTL(port), intel_dp->DP);
1401 POSTING_READ(DDI_BUF_CTL(port));
1402
1403 udelay(600);
1404}
00c09d70 1405
1ad960f2
PZ
1406void intel_ddi_fdi_disable(struct drm_crtc *crtc)
1407{
1408 struct drm_i915_private *dev_priv = crtc->dev->dev_private;
1409 struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
1410 uint32_t val;
1411
1412 intel_ddi_post_disable(intel_encoder);
1413
1414 val = I915_READ(_FDI_RXA_CTL);
1415 val &= ~FDI_RX_ENABLE;
1416 I915_WRITE(_FDI_RXA_CTL, val);
1417
1418 val = I915_READ(_FDI_RXA_MISC);
1419 val &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
1420 val |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2);
1421 I915_WRITE(_FDI_RXA_MISC, val);
1422
1423 val = I915_READ(_FDI_RXA_CTL);
1424 val &= ~FDI_PCDCLK;
1425 I915_WRITE(_FDI_RXA_CTL, val);
1426
1427 val = I915_READ(_FDI_RXA_CTL);
1428 val &= ~FDI_RX_PLL_ENABLE;
1429 I915_WRITE(_FDI_RXA_CTL, val);
1430}
1431
00c09d70
PZ
1432static void intel_ddi_hot_plug(struct intel_encoder *intel_encoder)
1433{
1434 struct intel_dp *intel_dp = enc_to_intel_dp(&intel_encoder->base);
1435 int type = intel_encoder->type;
1436
1437 if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP)
1438 intel_dp_check_link_status(intel_dp);
1439}
1440
6801c18c
VS
1441void intel_ddi_get_config(struct intel_encoder *encoder,
1442 struct intel_crtc_config *pipe_config)
045ac3b5
JB
1443{
1444 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
1445 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
1446 enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
1447 u32 temp, flags = 0;
1448
1449 temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
1450 if (temp & TRANS_DDI_PHSYNC)
1451 flags |= DRM_MODE_FLAG_PHSYNC;
1452 else
1453 flags |= DRM_MODE_FLAG_NHSYNC;
1454 if (temp & TRANS_DDI_PVSYNC)
1455 flags |= DRM_MODE_FLAG_PVSYNC;
1456 else
1457 flags |= DRM_MODE_FLAG_NVSYNC;
1458
1459 pipe_config->adjusted_mode.flags |= flags;
42571aef
VS
1460
1461 switch (temp & TRANS_DDI_BPC_MASK) {
1462 case TRANS_DDI_BPC_6:
1463 pipe_config->pipe_bpp = 18;
1464 break;
1465 case TRANS_DDI_BPC_8:
1466 pipe_config->pipe_bpp = 24;
1467 break;
1468 case TRANS_DDI_BPC_10:
1469 pipe_config->pipe_bpp = 30;
1470 break;
1471 case TRANS_DDI_BPC_12:
1472 pipe_config->pipe_bpp = 36;
1473 break;
1474 default:
1475 break;
1476 }
eb14cb74
VS
1477
1478 switch (temp & TRANS_DDI_MODE_SELECT_MASK) {
1479 case TRANS_DDI_MODE_SELECT_HDMI:
6897b4b5 1480 pipe_config->has_hdmi_sink = true;
eb14cb74
VS
1481 case TRANS_DDI_MODE_SELECT_DVI:
1482 case TRANS_DDI_MODE_SELECT_FDI:
1483 break;
1484 case TRANS_DDI_MODE_SELECT_DP_SST:
1485 case TRANS_DDI_MODE_SELECT_DP_MST:
1486 pipe_config->has_dp_encoder = true;
1487 intel_dp_get_m_n(intel_crtc, pipe_config);
1488 break;
1489 default:
1490 break;
1491 }
10214420 1492
a60551b1
PZ
1493 if (intel_display_power_enabled(dev_priv, POWER_DOMAIN_AUDIO)) {
1494 temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
1495 if (temp & (AUDIO_OUTPUT_ENABLE_A << (intel_crtc->pipe * 4)))
1496 pipe_config->has_audio = true;
1497 }
9ed109a7 1498
10214420
DV
1499 if (encoder->type == INTEL_OUTPUT_EDP && dev_priv->vbt.edp_bpp &&
1500 pipe_config->pipe_bpp > dev_priv->vbt.edp_bpp) {
1501 /*
1502 * This is a big fat ugly hack.
1503 *
1504 * Some machines in UEFI boot mode provide us a VBT that has 18
1505 * bpp and 1.62 GHz link bandwidth for eDP, which for reasons
1506 * unknown we fail to light up. Yet the same BIOS boots up with
1507 * 24 bpp and 2.7 GHz link. Use the same bpp as the BIOS uses as
1508 * max, not what it tells us to use.
1509 *
1510 * Note: This will still be broken if the eDP panel is not lit
1511 * up by the BIOS, and thus we can't get the mode at module
1512 * load.
1513 */
1514 DRM_DEBUG_KMS("pipe has %d bpp for eDP panel, overriding BIOS-provided max %d bpp\n",
1515 pipe_config->pipe_bpp, dev_priv->vbt.edp_bpp);
1516 dev_priv->vbt.edp_bpp = pipe_config->pipe_bpp;
1517 }
11578553
JB
1518
1519 intel_ddi_clock_get(encoder, pipe_config);
045ac3b5
JB
1520}
1521
00c09d70
PZ
1522static void intel_ddi_destroy(struct drm_encoder *encoder)
1523{
1524 /* HDMI has nothing special to destroy, so we can go with this. */
1525 intel_dp_encoder_destroy(encoder);
1526}
1527
5bfe2ac0
DV
1528static bool intel_ddi_compute_config(struct intel_encoder *encoder,
1529 struct intel_crtc_config *pipe_config)
00c09d70 1530{
5bfe2ac0 1531 int type = encoder->type;
eccb140b 1532 int port = intel_ddi_get_encoder_port(encoder);
00c09d70 1533
5bfe2ac0 1534 WARN(type == INTEL_OUTPUT_UNKNOWN, "compute_config() on unknown output!\n");
00c09d70 1535
eccb140b
DV
1536 if (port == PORT_A)
1537 pipe_config->cpu_transcoder = TRANSCODER_EDP;
1538
00c09d70 1539 if (type == INTEL_OUTPUT_HDMI)
5bfe2ac0 1540 return intel_hdmi_compute_config(encoder, pipe_config);
00c09d70 1541 else
5bfe2ac0 1542 return intel_dp_compute_config(encoder, pipe_config);
00c09d70
PZ
1543}
1544
1545static const struct drm_encoder_funcs intel_ddi_funcs = {
1546 .destroy = intel_ddi_destroy,
1547};
1548
4a28ae58
PZ
1549static struct intel_connector *
1550intel_ddi_init_dp_connector(struct intel_digital_port *intel_dig_port)
1551{
1552 struct intel_connector *connector;
1553 enum port port = intel_dig_port->port;
1554
1555 connector = kzalloc(sizeof(*connector), GFP_KERNEL);
1556 if (!connector)
1557 return NULL;
1558
1559 intel_dig_port->dp.output_reg = DDI_BUF_CTL(port);
1560 if (!intel_dp_init_connector(intel_dig_port, connector)) {
1561 kfree(connector);
1562 return NULL;
1563 }
1564
1565 return connector;
1566}
1567
1568static struct intel_connector *
1569intel_ddi_init_hdmi_connector(struct intel_digital_port *intel_dig_port)
1570{
1571 struct intel_connector *connector;
1572 enum port port = intel_dig_port->port;
1573
1574 connector = kzalloc(sizeof(*connector), GFP_KERNEL);
1575 if (!connector)
1576 return NULL;
1577
1578 intel_dig_port->hdmi.hdmi_reg = DDI_BUF_CTL(port);
1579 intel_hdmi_init_connector(intel_dig_port, connector);
1580
1581 return connector;
1582}
1583
00c09d70
PZ
1584void intel_ddi_init(struct drm_device *dev, enum port port)
1585{
876a8cdf 1586 struct drm_i915_private *dev_priv = dev->dev_private;
00c09d70
PZ
1587 struct intel_digital_port *intel_dig_port;
1588 struct intel_encoder *intel_encoder;
1589 struct drm_encoder *encoder;
1590 struct intel_connector *hdmi_connector = NULL;
1591 struct intel_connector *dp_connector = NULL;
311a2094
PZ
1592 bool init_hdmi, init_dp;
1593
1594 init_hdmi = (dev_priv->vbt.ddi_port_info[port].supports_dvi ||
1595 dev_priv->vbt.ddi_port_info[port].supports_hdmi);
1596 init_dp = dev_priv->vbt.ddi_port_info[port].supports_dp;
1597 if (!init_dp && !init_hdmi) {
1598 DRM_DEBUG_KMS("VBT says port %c is not DVI/HDMI/DP compatible\n",
1599 port_name(port));
1600 init_hdmi = true;
1601 init_dp = true;
1602 }
00c09d70 1603
b14c5679 1604 intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
00c09d70
PZ
1605 if (!intel_dig_port)
1606 return;
1607
00c09d70
PZ
1608 intel_encoder = &intel_dig_port->base;
1609 encoder = &intel_encoder->base;
1610
1611 drm_encoder_init(dev, encoder, &intel_ddi_funcs,
1612 DRM_MODE_ENCODER_TMDS);
00c09d70 1613
5bfe2ac0 1614 intel_encoder->compute_config = intel_ddi_compute_config;
00c09d70
PZ
1615 intel_encoder->enable = intel_enable_ddi;
1616 intel_encoder->pre_enable = intel_ddi_pre_enable;
1617 intel_encoder->disable = intel_disable_ddi;
1618 intel_encoder->post_disable = intel_ddi_post_disable;
1619 intel_encoder->get_hw_state = intel_ddi_get_hw_state;
045ac3b5 1620 intel_encoder->get_config = intel_ddi_get_config;
00c09d70
PZ
1621
1622 intel_dig_port->port = port;
bcf53de4
SM
1623 intel_dig_port->saved_port_bits = I915_READ(DDI_BUF_CTL(port)) &
1624 (DDI_BUF_PORT_REVERSAL |
1625 DDI_A_4_LANES);
00c09d70
PZ
1626
1627 intel_encoder->type = INTEL_OUTPUT_UNKNOWN;
1628 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
bc079e8b 1629 intel_encoder->cloneable = 0;
00c09d70
PZ
1630 intel_encoder->hot_plug = intel_ddi_hot_plug;
1631
13cf5504
DA
1632 intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
1633 dev_priv->hpd_irq_port[port] = intel_dig_port;
1634
4a28ae58
PZ
1635 if (init_dp)
1636 dp_connector = intel_ddi_init_dp_connector(intel_dig_port);
21a8e6a4 1637
311a2094
PZ
1638 /* In theory we don't need the encoder->type check, but leave it just in
1639 * case we have some really bad VBTs... */
4a28ae58
PZ
1640 if (intel_encoder->type != INTEL_OUTPUT_EDP && init_hdmi)
1641 hdmi_connector = intel_ddi_init_hdmi_connector(intel_dig_port);
21a8e6a4 1642
4a28ae58
PZ
1643 if (!dp_connector && !hdmi_connector) {
1644 drm_encoder_cleanup(encoder);
1645 kfree(intel_dig_port);
21a8e6a4 1646 }
00c09d70 1647}
This page took 0.253338 seconds and 5 git commands to generate.