drm/i915: Don't write the HDMI buffer translation entry when not needed
[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
10122051
JN
31struct ddi_buf_trans {
32 u32 trans1; /* balance leg enable, de-emph level */
33 u32 trans2; /* vref sel, vswing */
34};
35
45244b87
ED
36/* HDMI/DVI modes ignore everything but the last 2 items. So we share
37 * them for both DP and FDI transports, allowing those ports to
38 * automatically adapt to HDMI connections as well
39 */
10122051
JN
40static const struct ddi_buf_trans hsw_ddi_translations_dp[] = {
41 { 0x00FFFFFF, 0x0006000E },
42 { 0x00D75FFF, 0x0005000A },
43 { 0x00C30FFF, 0x00040006 },
44 { 0x80AAAFFF, 0x000B0000 },
45 { 0x00FFFFFF, 0x0005000A },
46 { 0x00D75FFF, 0x000C0004 },
47 { 0x80C30FFF, 0x000B0000 },
48 { 0x00FFFFFF, 0x00040006 },
49 { 0x80D75FFF, 0x000B0000 },
45244b87
ED
50};
51
10122051
JN
52static const struct ddi_buf_trans hsw_ddi_translations_fdi[] = {
53 { 0x00FFFFFF, 0x0007000E },
54 { 0x00D75FFF, 0x000F000A },
55 { 0x00C30FFF, 0x00060006 },
56 { 0x00AAAFFF, 0x001E0000 },
57 { 0x00FFFFFF, 0x000F000A },
58 { 0x00D75FFF, 0x00160004 },
59 { 0x00C30FFF, 0x001E0000 },
60 { 0x00FFFFFF, 0x00060006 },
61 { 0x00D75FFF, 0x001E0000 },
6acab15a
PZ
62};
63
10122051
JN
64static const struct ddi_buf_trans hsw_ddi_translations_hdmi[] = {
65 /* Idx NT mV d T mV d db */
66 { 0x00FFFFFF, 0x0006000E }, /* 0: 400 400 0 */
67 { 0x00E79FFF, 0x000E000C }, /* 1: 400 500 2 */
68 { 0x00D75FFF, 0x0005000A }, /* 2: 400 600 3.5 */
69 { 0x00FFFFFF, 0x0005000A }, /* 3: 600 600 0 */
70 { 0x00E79FFF, 0x001D0007 }, /* 4: 600 750 2 */
71 { 0x00D75FFF, 0x000C0004 }, /* 5: 600 900 3.5 */
72 { 0x00FFFFFF, 0x00040006 }, /* 6: 800 800 0 */
73 { 0x80E79FFF, 0x00030002 }, /* 7: 800 1000 2 */
74 { 0x00FFFFFF, 0x00140005 }, /* 8: 850 850 0 */
75 { 0x00FFFFFF, 0x000C0004 }, /* 9: 900 900 0 */
76 { 0x00FFFFFF, 0x001C0003 }, /* 10: 950 950 0 */
77 { 0x80FFFFFF, 0x00030002 }, /* 11: 1000 1000 0 */
45244b87
ED
78};
79
10122051
JN
80static const struct ddi_buf_trans bdw_ddi_translations_edp[] = {
81 { 0x00FFFFFF, 0x00000012 },
82 { 0x00EBAFFF, 0x00020011 },
83 { 0x00C71FFF, 0x0006000F },
84 { 0x00AAAFFF, 0x000E000A },
85 { 0x00FFFFFF, 0x00020011 },
86 { 0x00DB6FFF, 0x0005000F },
87 { 0x00BEEFFF, 0x000A000C },
88 { 0x00FFFFFF, 0x0005000F },
89 { 0x00DB6FFF, 0x000A000C },
300644c7
PZ
90};
91
10122051
JN
92static const struct ddi_buf_trans bdw_ddi_translations_dp[] = {
93 { 0x00FFFFFF, 0x0007000E },
94 { 0x00D75FFF, 0x000E000A },
95 { 0x00BEFFFF, 0x00140006 },
96 { 0x80B2CFFF, 0x001B0002 },
97 { 0x00FFFFFF, 0x000E000A },
17b523ba 98 { 0x00DB6FFF, 0x00160005 },
6805b2a7 99 { 0x80C71FFF, 0x001A0002 },
10122051
JN
100 { 0x00F7DFFF, 0x00180004 },
101 { 0x80D75FFF, 0x001B0002 },
e58623cb
AR
102};
103
10122051
JN
104static const struct ddi_buf_trans bdw_ddi_translations_fdi[] = {
105 { 0x00FFFFFF, 0x0001000E },
106 { 0x00D75FFF, 0x0004000A },
107 { 0x00C30FFF, 0x00070006 },
108 { 0x00AAAFFF, 0x000C0000 },
109 { 0x00FFFFFF, 0x0004000A },
110 { 0x00D75FFF, 0x00090004 },
111 { 0x00C30FFF, 0x000C0000 },
112 { 0x00FFFFFF, 0x00070006 },
113 { 0x00D75FFF, 0x000C0000 },
e58623cb
AR
114};
115
10122051
JN
116static const struct ddi_buf_trans bdw_ddi_translations_hdmi[] = {
117 /* Idx NT mV d T mV df db */
118 { 0x00FFFFFF, 0x0007000E }, /* 0: 400 400 0 */
119 { 0x00D75FFF, 0x000E000A }, /* 1: 400 600 3.5 */
120 { 0x00BEFFFF, 0x00140006 }, /* 2: 400 800 6 */
121 { 0x00FFFFFF, 0x0009000D }, /* 3: 450 450 0 */
122 { 0x00FFFFFF, 0x000E000A }, /* 4: 600 600 0 */
123 { 0x00D7FFFF, 0x00140006 }, /* 5: 600 800 2.5 */
124 { 0x80CB2FFF, 0x001B0002 }, /* 6: 600 1000 4.5 */
125 { 0x00FFFFFF, 0x00140006 }, /* 7: 800 800 0 */
126 { 0x80E79FFF, 0x001B0002 }, /* 8: 800 1000 2 */
127 { 0x80FFFFFF, 0x001B0002 }, /* 9: 1000 1000 0 */
a26aa8ba
DL
128};
129
7f88e3af 130static const struct ddi_buf_trans skl_ddi_translations_dp[] = {
6c930688
DL
131 { 0x00000018, 0x000000a2 },
132 { 0x00004014, 0x0000009B },
7f88e3af 133 { 0x00006012, 0x00000088 },
6c930688
DL
134 { 0x00008010, 0x00000087 },
135 { 0x00000018, 0x0000009B },
7f88e3af 136 { 0x00004014, 0x00000088 },
6c930688 137 { 0x00006012, 0x00000087 },
7f88e3af 138 { 0x00000018, 0x00000088 },
6c930688 139 { 0x00004014, 0x00000087 },
7f88e3af
DL
140};
141
7ad14a29
SJ
142/* eDP 1.4 low vswing translation parameters */
143static const struct ddi_buf_trans skl_ddi_translations_edp[] = {
144 { 0x00000018, 0x000000a8 },
145 { 0x00002016, 0x000000ab },
146 { 0x00006012, 0x000000a2 },
147 { 0x00008010, 0x00000088 },
148 { 0x00000018, 0x000000ab },
149 { 0x00004014, 0x000000a2 },
150 { 0x00006012, 0x000000a6 },
151 { 0x00000018, 0x000000a2 },
152 { 0x00005013, 0x0000009c },
153 { 0x00000018, 0x00000088 },
154};
155
156
7f88e3af 157static const struct ddi_buf_trans skl_ddi_translations_hdmi[] = {
b7192a56
SJ
158 { 0x00000018, 0x000000ac },
159 { 0x00005012, 0x0000009d },
160 { 0x00007011, 0x00000088 },
161 { 0x00000018, 0x000000a1 },
162 { 0x00000018, 0x00000098 },
163 { 0x00004013, 0x00000088 },
164 { 0x00006012, 0x00000087 },
165 { 0x00000018, 0x000000df },
166 { 0x00003015, 0x00000087 },
167 { 0x00003015, 0x000000c7 },
168 { 0x00000018, 0x000000c7 },
7f88e3af
DL
169};
170
20f4dbe4 171enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder)
fc914639 172{
0bdee30e 173 struct drm_encoder *encoder = &intel_encoder->base;
fc914639
PZ
174 int type = intel_encoder->type;
175
0e32b39c
DA
176 if (type == INTEL_OUTPUT_DP_MST) {
177 struct intel_digital_port *intel_dig_port = enc_to_mst(encoder)->primary;
178 return intel_dig_port->port;
179 } else if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP ||
00c09d70 180 type == INTEL_OUTPUT_HDMI || type == INTEL_OUTPUT_UNKNOWN) {
174edf1f
PZ
181 struct intel_digital_port *intel_dig_port =
182 enc_to_dig_port(encoder);
183 return intel_dig_port->port;
0bdee30e 184
fc914639
PZ
185 } else if (type == INTEL_OUTPUT_ANALOG) {
186 return PORT_E;
0bdee30e 187
fc914639
PZ
188 } else {
189 DRM_ERROR("Invalid DDI encoder type %d\n", type);
190 BUG();
191 }
192}
193
ce3b7e9b
DL
194static bool
195intel_dig_port_supports_hdmi(const struct intel_digital_port *intel_dig_port)
196{
197 return intel_dig_port->hdmi.hdmi_reg;
198}
199
e58623cb
AR
200/*
201 * Starting with Haswell, DDI port buffers must be programmed with correct
202 * values in advance. The buffer values are different for FDI and DP modes,
45244b87
ED
203 * but the HDMI/DVI fields are shared among those. So we program the DDI
204 * in either FDI or DP modes only, as HDMI connections will work with both
205 * of those
206 */
b403745c
DL
207static void intel_prepare_ddi_buffers(struct drm_device *dev,
208 struct intel_digital_port *intel_dig_port)
45244b87
ED
209{
210 struct drm_i915_private *dev_priv = dev->dev_private;
211 u32 reg;
b403745c 212 int port = intel_dig_port->port;
7ff44670 213 int i, n_hdmi_entries, n_dp_entries, n_edp_entries, hdmi_default_entry,
7ad14a29 214 size;
6acab15a 215 int hdmi_level = dev_priv->vbt.ddi_port_info[port].hdmi_level_shift;
10122051
JN
216 const struct ddi_buf_trans *ddi_translations_fdi;
217 const struct ddi_buf_trans *ddi_translations_dp;
218 const struct ddi_buf_trans *ddi_translations_edp;
219 const struct ddi_buf_trans *ddi_translations_hdmi;
220 const struct ddi_buf_trans *ddi_translations;
e58623cb 221
7f88e3af
DL
222 if (IS_SKYLAKE(dev)) {
223 ddi_translations_fdi = NULL;
224 ddi_translations_dp = skl_ddi_translations_dp;
7ad14a29
SJ
225 n_dp_entries = ARRAY_SIZE(skl_ddi_translations_dp);
226 if (dev_priv->vbt.edp_low_vswing) {
227 ddi_translations_edp = skl_ddi_translations_edp;
228 n_edp_entries = ARRAY_SIZE(skl_ddi_translations_edp);
229 } else {
230 ddi_translations_edp = skl_ddi_translations_dp;
231 n_edp_entries = ARRAY_SIZE(skl_ddi_translations_dp);
232 }
233
7f88e3af
DL
234 ddi_translations_hdmi = skl_ddi_translations_hdmi;
235 n_hdmi_entries = ARRAY_SIZE(skl_ddi_translations_hdmi);
b7192a56 236 hdmi_default_entry = 7;
7f88e3af 237 } else if (IS_BROADWELL(dev)) {
e58623cb
AR
238 ddi_translations_fdi = bdw_ddi_translations_fdi;
239 ddi_translations_dp = bdw_ddi_translations_dp;
300644c7 240 ddi_translations_edp = bdw_ddi_translations_edp;
a26aa8ba 241 ddi_translations_hdmi = bdw_ddi_translations_hdmi;
7ad14a29
SJ
242 n_edp_entries = ARRAY_SIZE(bdw_ddi_translations_edp);
243 n_dp_entries = ARRAY_SIZE(bdw_ddi_translations_dp);
10122051 244 n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
7ff44670 245 hdmi_default_entry = 7;
e58623cb
AR
246 } else if (IS_HASWELL(dev)) {
247 ddi_translations_fdi = hsw_ddi_translations_fdi;
248 ddi_translations_dp = hsw_ddi_translations_dp;
300644c7 249 ddi_translations_edp = hsw_ddi_translations_dp;
a26aa8ba 250 ddi_translations_hdmi = hsw_ddi_translations_hdmi;
7ad14a29 251 n_dp_entries = n_edp_entries = ARRAY_SIZE(hsw_ddi_translations_dp);
10122051 252 n_hdmi_entries = ARRAY_SIZE(hsw_ddi_translations_hdmi);
7ff44670 253 hdmi_default_entry = 6;
e58623cb
AR
254 } else {
255 WARN(1, "ddi translation table missing\n");
300644c7 256 ddi_translations_edp = bdw_ddi_translations_dp;
e58623cb
AR
257 ddi_translations_fdi = bdw_ddi_translations_fdi;
258 ddi_translations_dp = bdw_ddi_translations_dp;
a26aa8ba 259 ddi_translations_hdmi = bdw_ddi_translations_hdmi;
7ad14a29
SJ
260 n_edp_entries = ARRAY_SIZE(bdw_ddi_translations_edp);
261 n_dp_entries = ARRAY_SIZE(bdw_ddi_translations_dp);
10122051 262 n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
7ff44670 263 hdmi_default_entry = 7;
e58623cb
AR
264 }
265
300644c7
PZ
266 switch (port) {
267 case PORT_A:
268 ddi_translations = ddi_translations_edp;
7ad14a29 269 size = n_edp_entries;
300644c7
PZ
270 break;
271 case PORT_B:
272 case PORT_C:
300644c7 273 ddi_translations = ddi_translations_dp;
7ad14a29 274 size = n_dp_entries;
300644c7 275 break;
77d8d009 276 case PORT_D:
7ad14a29 277 if (intel_dp_is_edp(dev, PORT_D)) {
77d8d009 278 ddi_translations = ddi_translations_edp;
7ad14a29
SJ
279 size = n_edp_entries;
280 } else {
77d8d009 281 ddi_translations = ddi_translations_dp;
7ad14a29
SJ
282 size = n_dp_entries;
283 }
77d8d009 284 break;
300644c7 285 case PORT_E:
7f88e3af
DL
286 if (ddi_translations_fdi)
287 ddi_translations = ddi_translations_fdi;
288 else
289 ddi_translations = ddi_translations_dp;
7ad14a29 290 size = n_dp_entries;
300644c7
PZ
291 break;
292 default:
293 BUG();
294 }
45244b87 295
7ad14a29 296 for (i = 0, reg = DDI_BUF_TRANS(port); i < size; i++) {
10122051
JN
297 I915_WRITE(reg, ddi_translations[i].trans1);
298 reg += 4;
299 I915_WRITE(reg, ddi_translations[i].trans2);
45244b87
ED
300 reg += 4;
301 }
ce4dd49e 302
ce3b7e9b
DL
303 if (!intel_dig_port_supports_hdmi(intel_dig_port))
304 return;
305
ce4dd49e
DL
306 /* Choose a good default if VBT is badly populated */
307 if (hdmi_level == HDMI_LEVEL_SHIFT_UNKNOWN ||
308 hdmi_level >= n_hdmi_entries)
7ff44670 309 hdmi_level = hdmi_default_entry;
ce4dd49e 310
6acab15a 311 /* Entry 9 is for HDMI: */
10122051
JN
312 I915_WRITE(reg, ddi_translations_hdmi[hdmi_level].trans1);
313 reg += 4;
314 I915_WRITE(reg, ddi_translations_hdmi[hdmi_level].trans2);
315 reg += 4;
45244b87
ED
316}
317
318/* Program DDI buffers translations for DP. By default, program ports A-D in DP
319 * mode and port E for FDI.
320 */
321void intel_prepare_ddi(struct drm_device *dev)
322{
b403745c
DL
323 struct intel_digital_port *intel_dig_port;
324 bool visited[I915_MAX_PORTS] = { 0, };
45244b87 325
0d536cb4
PZ
326 if (!HAS_DDI(dev))
327 return;
45244b87 328
b403745c
DL
329 for_each_digital_port(dev, intel_dig_port) {
330 if (visited[intel_dig_port->port])
331 continue;
332
333 intel_prepare_ddi_buffers(dev, intel_dig_port);
334 visited[intel_dig_port->port] = true;
335 }
45244b87 336}
c82e4d26 337
248138b5
PZ
338static void intel_wait_ddi_buf_idle(struct drm_i915_private *dev_priv,
339 enum port port)
340{
341 uint32_t reg = DDI_BUF_CTL(port);
342 int i;
343
3449ca85 344 for (i = 0; i < 16; i++) {
248138b5
PZ
345 udelay(1);
346 if (I915_READ(reg) & DDI_BUF_IS_IDLE)
347 return;
348 }
349 DRM_ERROR("Timeout waiting for DDI BUF %c idle bit\n", port_name(port));
350}
c82e4d26
ED
351
352/* Starting with Haswell, different DDI ports can work in FDI mode for
353 * connection to the PCH-located connectors. For this, it is necessary to train
354 * both the DDI port and PCH receiver for the desired DDI buffer settings.
355 *
356 * The recommended port to work in FDI mode is DDI E, which we use here. Also,
357 * please note that when FDI mode is active on DDI E, it shares 2 lines with
358 * DDI A (which is used for eDP)
359 */
360
361void hsw_fdi_link_train(struct drm_crtc *crtc)
362{
363 struct drm_device *dev = crtc->dev;
364 struct drm_i915_private *dev_priv = dev->dev_private;
365 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
04945641 366 u32 temp, i, rx_ctl_val;
c82e4d26 367
04945641
PZ
368 /* Set the FDI_RX_MISC pwrdn lanes and the 2 workarounds listed at the
369 * mode set "sequence for CRT port" document:
370 * - TP1 to TP2 time with the default value
371 * - FDI delay to 90h
8693a824
DL
372 *
373 * WaFDIAutoLinkSetTimingOverrride:hsw
04945641
PZ
374 */
375 I915_WRITE(_FDI_RXA_MISC, FDI_RX_PWRDN_LANE1_VAL(2) |
376 FDI_RX_PWRDN_LANE0_VAL(2) |
377 FDI_RX_TP1_TO_TP2_48 | FDI_RX_FDI_DELAY_90);
378
379 /* Enable the PCH Receiver FDI PLL */
3e68320e 380 rx_ctl_val = dev_priv->fdi_rx_config | FDI_RX_ENHANCE_FRAME_ENABLE |
33d29b14 381 FDI_RX_PLL_ENABLE |
6e3c9717 382 FDI_DP_PORT_WIDTH(intel_crtc->config->fdi_lanes);
04945641
PZ
383 I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
384 POSTING_READ(_FDI_RXA_CTL);
385 udelay(220);
386
387 /* Switch from Rawclk to PCDclk */
388 rx_ctl_val |= FDI_PCDCLK;
389 I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
390
391 /* Configure Port Clock Select */
6e3c9717
ACO
392 I915_WRITE(PORT_CLK_SEL(PORT_E), intel_crtc->config->ddi_pll_sel);
393 WARN_ON(intel_crtc->config->ddi_pll_sel != PORT_CLK_SEL_SPLL);
04945641
PZ
394
395 /* Start the training iterating through available voltages and emphasis,
396 * testing each value twice. */
10122051 397 for (i = 0; i < ARRAY_SIZE(hsw_ddi_translations_fdi) * 2; i++) {
c82e4d26
ED
398 /* Configure DP_TP_CTL with auto-training */
399 I915_WRITE(DP_TP_CTL(PORT_E),
400 DP_TP_CTL_FDI_AUTOTRAIN |
401 DP_TP_CTL_ENHANCED_FRAME_ENABLE |
402 DP_TP_CTL_LINK_TRAIN_PAT1 |
403 DP_TP_CTL_ENABLE);
404
876a8cdf
DL
405 /* Configure and enable DDI_BUF_CTL for DDI E with next voltage.
406 * DDI E does not support port reversal, the functionality is
407 * achieved on the PCH side in FDI_RX_CTL, so no need to set the
408 * port reversal bit */
c82e4d26 409 I915_WRITE(DDI_BUF_CTL(PORT_E),
04945641 410 DDI_BUF_CTL_ENABLE |
6e3c9717 411 ((intel_crtc->config->fdi_lanes - 1) << 1) |
c5fe6a06 412 DDI_BUF_TRANS_SELECT(i / 2));
04945641 413 POSTING_READ(DDI_BUF_CTL(PORT_E));
c82e4d26
ED
414
415 udelay(600);
416
04945641
PZ
417 /* Program PCH FDI Receiver TU */
418 I915_WRITE(_FDI_RXA_TUSIZE1, TU_SIZE(64));
419
420 /* Enable PCH FDI Receiver with auto-training */
421 rx_ctl_val |= FDI_RX_ENABLE | FDI_LINK_TRAIN_AUTO;
422 I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
423 POSTING_READ(_FDI_RXA_CTL);
424
425 /* Wait for FDI receiver lane calibration */
426 udelay(30);
427
428 /* Unset FDI_RX_MISC pwrdn lanes */
429 temp = I915_READ(_FDI_RXA_MISC);
430 temp &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
431 I915_WRITE(_FDI_RXA_MISC, temp);
432 POSTING_READ(_FDI_RXA_MISC);
433
434 /* Wait for FDI auto training time */
435 udelay(5);
c82e4d26
ED
436
437 temp = I915_READ(DP_TP_STATUS(PORT_E));
438 if (temp & DP_TP_STATUS_AUTOTRAIN_DONE) {
04945641 439 DRM_DEBUG_KMS("FDI link training done on step %d\n", i);
c82e4d26
ED
440
441 /* Enable normal pixel sending for FDI */
442 I915_WRITE(DP_TP_CTL(PORT_E),
04945641
PZ
443 DP_TP_CTL_FDI_AUTOTRAIN |
444 DP_TP_CTL_LINK_TRAIN_NORMAL |
445 DP_TP_CTL_ENHANCED_FRAME_ENABLE |
446 DP_TP_CTL_ENABLE);
c82e4d26 447
04945641 448 return;
c82e4d26 449 }
04945641 450
248138b5
PZ
451 temp = I915_READ(DDI_BUF_CTL(PORT_E));
452 temp &= ~DDI_BUF_CTL_ENABLE;
453 I915_WRITE(DDI_BUF_CTL(PORT_E), temp);
454 POSTING_READ(DDI_BUF_CTL(PORT_E));
455
04945641 456 /* Disable DP_TP_CTL and FDI_RX_CTL and retry */
248138b5
PZ
457 temp = I915_READ(DP_TP_CTL(PORT_E));
458 temp &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
459 temp |= DP_TP_CTL_LINK_TRAIN_PAT1;
460 I915_WRITE(DP_TP_CTL(PORT_E), temp);
461 POSTING_READ(DP_TP_CTL(PORT_E));
462
463 intel_wait_ddi_buf_idle(dev_priv, PORT_E);
04945641
PZ
464
465 rx_ctl_val &= ~FDI_RX_ENABLE;
466 I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
248138b5 467 POSTING_READ(_FDI_RXA_CTL);
04945641
PZ
468
469 /* Reset FDI_RX_MISC pwrdn lanes */
470 temp = I915_READ(_FDI_RXA_MISC);
471 temp &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
472 temp |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2);
473 I915_WRITE(_FDI_RXA_MISC, temp);
248138b5 474 POSTING_READ(_FDI_RXA_MISC);
c82e4d26
ED
475 }
476
04945641 477 DRM_ERROR("FDI link training failed!\n");
c82e4d26 478}
0e72a5b5 479
44905a27
DA
480void intel_ddi_init_dp_buf_reg(struct intel_encoder *encoder)
481{
482 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
483 struct intel_digital_port *intel_dig_port =
484 enc_to_dig_port(&encoder->base);
485
486 intel_dp->DP = intel_dig_port->saved_port_bits |
c5fe6a06 487 DDI_BUF_CTL_ENABLE | DDI_BUF_TRANS_SELECT(0);
44905a27
DA
488 intel_dp->DP |= DDI_PORT_WIDTH(intel_dp->lane_count);
489
490}
491
8d9ddbcb
PZ
492static struct intel_encoder *
493intel_ddi_get_crtc_encoder(struct drm_crtc *crtc)
494{
495 struct drm_device *dev = crtc->dev;
496 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
497 struct intel_encoder *intel_encoder, *ret = NULL;
498 int num_encoders = 0;
499
500 for_each_encoder_on_crtc(dev, crtc, intel_encoder) {
501 ret = intel_encoder;
502 num_encoders++;
503 }
504
505 if (num_encoders != 1)
84f44ce7
VS
506 WARN(1, "%d encoders on crtc for pipe %c\n", num_encoders,
507 pipe_name(intel_crtc->pipe));
8d9ddbcb
PZ
508
509 BUG_ON(ret == NULL);
510 return ret;
511}
512
bcddf610 513struct intel_encoder *
3165c074 514intel_ddi_get_crtc_new_encoder(struct intel_crtc_state *crtc_state)
d0737e1d 515{
3165c074
ACO
516 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
517 struct intel_encoder *ret = NULL;
518 struct drm_atomic_state *state;
d0737e1d 519 int num_encoders = 0;
3165c074 520 int i;
d0737e1d 521
3165c074
ACO
522 state = crtc_state->base.state;
523
524 for (i = 0; i < state->num_connector; i++) {
525 if (!state->connectors[i] ||
526 state->connector_states[i]->crtc != crtc_state->base.crtc)
527 continue;
528
529 ret = to_intel_encoder(state->connector_states[i]->best_encoder);
530 num_encoders++;
d0737e1d
ACO
531 }
532
533 WARN(num_encoders != 1, "%d encoders on crtc for pipe %c\n", num_encoders,
534 pipe_name(crtc->pipe));
535
536 BUG_ON(ret == NULL);
537 return ret;
538}
539
1c0b85c5 540#define LC_FREQ 2700
27893390 541#define LC_FREQ_2K U64_C(LC_FREQ * 2000)
1c0b85c5
DL
542
543#define P_MIN 2
544#define P_MAX 64
545#define P_INC 2
546
547/* Constraints for PLL good behavior */
548#define REF_MIN 48
549#define REF_MAX 400
550#define VCO_MIN 2400
551#define VCO_MAX 4800
552
27893390
DL
553#define abs_diff(a, b) ({ \
554 typeof(a) __a = (a); \
555 typeof(b) __b = (b); \
556 (void) (&__a == &__b); \
557 __a > __b ? (__a - __b) : (__b - __a); })
1c0b85c5
DL
558
559struct wrpll_rnp {
560 unsigned p, n2, r2;
561};
562
563static unsigned wrpll_get_budget_for_freq(int clock)
6441ab5f 564{
1c0b85c5
DL
565 unsigned budget;
566
567 switch (clock) {
568 case 25175000:
569 case 25200000:
570 case 27000000:
571 case 27027000:
572 case 37762500:
573 case 37800000:
574 case 40500000:
575 case 40541000:
576 case 54000000:
577 case 54054000:
578 case 59341000:
579 case 59400000:
580 case 72000000:
581 case 74176000:
582 case 74250000:
583 case 81000000:
584 case 81081000:
585 case 89012000:
586 case 89100000:
587 case 108000000:
588 case 108108000:
589 case 111264000:
590 case 111375000:
591 case 148352000:
592 case 148500000:
593 case 162000000:
594 case 162162000:
595 case 222525000:
596 case 222750000:
597 case 296703000:
598 case 297000000:
599 budget = 0;
600 break;
601 case 233500000:
602 case 245250000:
603 case 247750000:
604 case 253250000:
605 case 298000000:
606 budget = 1500;
607 break;
608 case 169128000:
609 case 169500000:
610 case 179500000:
611 case 202000000:
612 budget = 2000;
613 break;
614 case 256250000:
615 case 262500000:
616 case 270000000:
617 case 272500000:
618 case 273750000:
619 case 280750000:
620 case 281250000:
621 case 286000000:
622 case 291750000:
623 budget = 4000;
624 break;
625 case 267250000:
626 case 268500000:
627 budget = 5000;
628 break;
629 default:
630 budget = 1000;
631 break;
632 }
6441ab5f 633
1c0b85c5
DL
634 return budget;
635}
636
637static void wrpll_update_rnp(uint64_t freq2k, unsigned budget,
638 unsigned r2, unsigned n2, unsigned p,
639 struct wrpll_rnp *best)
640{
641 uint64_t a, b, c, d, diff, diff_best;
6441ab5f 642
1c0b85c5
DL
643 /* No best (r,n,p) yet */
644 if (best->p == 0) {
645 best->p = p;
646 best->n2 = n2;
647 best->r2 = r2;
648 return;
649 }
6441ab5f 650
1c0b85c5
DL
651 /*
652 * Output clock is (LC_FREQ_2K / 2000) * N / (P * R), which compares to
653 * freq2k.
654 *
655 * delta = 1e6 *
656 * abs(freq2k - (LC_FREQ_2K * n2/(p * r2))) /
657 * freq2k;
658 *
659 * and we would like delta <= budget.
660 *
661 * If the discrepancy is above the PPM-based budget, always prefer to
662 * improve upon the previous solution. However, if you're within the
663 * budget, try to maximize Ref * VCO, that is N / (P * R^2).
664 */
665 a = freq2k * budget * p * r2;
666 b = freq2k * budget * best->p * best->r2;
27893390
DL
667 diff = abs_diff(freq2k * p * r2, LC_FREQ_2K * n2);
668 diff_best = abs_diff(freq2k * best->p * best->r2,
669 LC_FREQ_2K * best->n2);
1c0b85c5
DL
670 c = 1000000 * diff;
671 d = 1000000 * diff_best;
672
673 if (a < c && b < d) {
674 /* If both are above the budget, pick the closer */
675 if (best->p * best->r2 * diff < p * r2 * diff_best) {
676 best->p = p;
677 best->n2 = n2;
678 best->r2 = r2;
679 }
680 } else if (a >= c && b < d) {
681 /* If A is below the threshold but B is above it? Update. */
682 best->p = p;
683 best->n2 = n2;
684 best->r2 = r2;
685 } else if (a >= c && b >= d) {
686 /* Both are below the limit, so pick the higher n2/(r2*r2) */
687 if (n2 * best->r2 * best->r2 > best->n2 * r2 * r2) {
688 best->p = p;
689 best->n2 = n2;
690 best->r2 = r2;
691 }
692 }
693 /* Otherwise a < c && b >= d, do nothing */
694}
695
11578553
JB
696static int intel_ddi_calc_wrpll_link(struct drm_i915_private *dev_priv,
697 int reg)
698{
699 int refclk = LC_FREQ;
700 int n, p, r;
701 u32 wrpll;
702
703 wrpll = I915_READ(reg);
114fe488
DV
704 switch (wrpll & WRPLL_PLL_REF_MASK) {
705 case WRPLL_PLL_SSC:
706 case WRPLL_PLL_NON_SSC:
11578553
JB
707 /*
708 * We could calculate spread here, but our checking
709 * code only cares about 5% accuracy, and spread is a max of
710 * 0.5% downspread.
711 */
712 refclk = 135;
713 break;
114fe488 714 case WRPLL_PLL_LCPLL:
11578553
JB
715 refclk = LC_FREQ;
716 break;
717 default:
718 WARN(1, "bad wrpll refclk\n");
719 return 0;
720 }
721
722 r = wrpll & WRPLL_DIVIDER_REF_MASK;
723 p = (wrpll & WRPLL_DIVIDER_POST_MASK) >> WRPLL_DIVIDER_POST_SHIFT;
724 n = (wrpll & WRPLL_DIVIDER_FB_MASK) >> WRPLL_DIVIDER_FB_SHIFT;
725
20f0ec16
JB
726 /* Convert to KHz, p & r have a fixed point portion */
727 return (refclk * n * 100) / (p * r);
11578553
JB
728}
729
540e732c
S
730static int skl_calc_wrpll_link(struct drm_i915_private *dev_priv,
731 uint32_t dpll)
732{
733 uint32_t cfgcr1_reg, cfgcr2_reg;
734 uint32_t cfgcr1_val, cfgcr2_val;
735 uint32_t p0, p1, p2, dco_freq;
736
737 cfgcr1_reg = GET_CFG_CR1_REG(dpll);
738 cfgcr2_reg = GET_CFG_CR2_REG(dpll);
739
740 cfgcr1_val = I915_READ(cfgcr1_reg);
741 cfgcr2_val = I915_READ(cfgcr2_reg);
742
743 p0 = cfgcr2_val & DPLL_CFGCR2_PDIV_MASK;
744 p2 = cfgcr2_val & DPLL_CFGCR2_KDIV_MASK;
745
746 if (cfgcr2_val & DPLL_CFGCR2_QDIV_MODE(1))
747 p1 = (cfgcr2_val & DPLL_CFGCR2_QDIV_RATIO_MASK) >> 8;
748 else
749 p1 = 1;
750
751
752 switch (p0) {
753 case DPLL_CFGCR2_PDIV_1:
754 p0 = 1;
755 break;
756 case DPLL_CFGCR2_PDIV_2:
757 p0 = 2;
758 break;
759 case DPLL_CFGCR2_PDIV_3:
760 p0 = 3;
761 break;
762 case DPLL_CFGCR2_PDIV_7:
763 p0 = 7;
764 break;
765 }
766
767 switch (p2) {
768 case DPLL_CFGCR2_KDIV_5:
769 p2 = 5;
770 break;
771 case DPLL_CFGCR2_KDIV_2:
772 p2 = 2;
773 break;
774 case DPLL_CFGCR2_KDIV_3:
775 p2 = 3;
776 break;
777 case DPLL_CFGCR2_KDIV_1:
778 p2 = 1;
779 break;
780 }
781
782 dco_freq = (cfgcr1_val & DPLL_CFGCR1_DCO_INTEGER_MASK) * 24 * 1000;
783
784 dco_freq += (((cfgcr1_val & DPLL_CFGCR1_DCO_FRACTION_MASK) >> 9) * 24 *
785 1000) / 0x8000;
786
787 return dco_freq / (p0 * p1 * p2 * 5);
788}
789
790
791static void skl_ddi_clock_get(struct intel_encoder *encoder,
5cec258b 792 struct intel_crtc_state *pipe_config)
540e732c
S
793{
794 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
540e732c
S
795 int link_clock = 0;
796 uint32_t dpll_ctl1, dpll;
797
134ffa44 798 dpll = pipe_config->ddi_pll_sel;
540e732c
S
799
800 dpll_ctl1 = I915_READ(DPLL_CTRL1);
801
802 if (dpll_ctl1 & DPLL_CTRL1_HDMI_MODE(dpll)) {
803 link_clock = skl_calc_wrpll_link(dev_priv, dpll);
804 } else {
805 link_clock = dpll_ctl1 & DPLL_CRTL1_LINK_RATE_MASK(dpll);
806 link_clock >>= DPLL_CRTL1_LINK_RATE_SHIFT(dpll);
807
808 switch (link_clock) {
809 case DPLL_CRTL1_LINK_RATE_810:
810 link_clock = 81000;
811 break;
a8f3ef61
SJ
812 case DPLL_CRTL1_LINK_RATE_1080:
813 link_clock = 108000;
814 break;
540e732c
S
815 case DPLL_CRTL1_LINK_RATE_1350:
816 link_clock = 135000;
817 break;
a8f3ef61
SJ
818 case DPLL_CRTL1_LINK_RATE_1620:
819 link_clock = 162000;
820 break;
821 case DPLL_CRTL1_LINK_RATE_2160:
822 link_clock = 216000;
823 break;
540e732c
S
824 case DPLL_CRTL1_LINK_RATE_2700:
825 link_clock = 270000;
826 break;
827 default:
828 WARN(1, "Unsupported link rate\n");
829 break;
830 }
831 link_clock *= 2;
832 }
833
834 pipe_config->port_clock = link_clock;
835
836 if (pipe_config->has_dp_encoder)
2d112de7 837 pipe_config->base.adjusted_mode.crtc_clock =
540e732c
S
838 intel_dotclock_calculate(pipe_config->port_clock,
839 &pipe_config->dp_m_n);
840 else
2d112de7 841 pipe_config->base.adjusted_mode.crtc_clock = pipe_config->port_clock;
540e732c
S
842}
843
3d51278a 844static void hsw_ddi_clock_get(struct intel_encoder *encoder,
5cec258b 845 struct intel_crtc_state *pipe_config)
11578553
JB
846{
847 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
11578553
JB
848 int link_clock = 0;
849 u32 val, pll;
850
26804afd 851 val = pipe_config->ddi_pll_sel;
11578553
JB
852 switch (val & PORT_CLK_SEL_MASK) {
853 case PORT_CLK_SEL_LCPLL_810:
854 link_clock = 81000;
855 break;
856 case PORT_CLK_SEL_LCPLL_1350:
857 link_clock = 135000;
858 break;
859 case PORT_CLK_SEL_LCPLL_2700:
860 link_clock = 270000;
861 break;
862 case PORT_CLK_SEL_WRPLL1:
863 link_clock = intel_ddi_calc_wrpll_link(dev_priv, WRPLL_CTL1);
864 break;
865 case PORT_CLK_SEL_WRPLL2:
866 link_clock = intel_ddi_calc_wrpll_link(dev_priv, WRPLL_CTL2);
867 break;
868 case PORT_CLK_SEL_SPLL:
869 pll = I915_READ(SPLL_CTL) & SPLL_PLL_FREQ_MASK;
870 if (pll == SPLL_PLL_FREQ_810MHz)
871 link_clock = 81000;
872 else if (pll == SPLL_PLL_FREQ_1350MHz)
873 link_clock = 135000;
874 else if (pll == SPLL_PLL_FREQ_2700MHz)
875 link_clock = 270000;
876 else {
877 WARN(1, "bad spll freq\n");
878 return;
879 }
880 break;
881 default:
882 WARN(1, "bad port clock sel\n");
883 return;
884 }
885
886 pipe_config->port_clock = link_clock * 2;
887
888 if (pipe_config->has_pch_encoder)
2d112de7 889 pipe_config->base.adjusted_mode.crtc_clock =
11578553
JB
890 intel_dotclock_calculate(pipe_config->port_clock,
891 &pipe_config->fdi_m_n);
892 else if (pipe_config->has_dp_encoder)
2d112de7 893 pipe_config->base.adjusted_mode.crtc_clock =
11578553
JB
894 intel_dotclock_calculate(pipe_config->port_clock,
895 &pipe_config->dp_m_n);
896 else
2d112de7 897 pipe_config->base.adjusted_mode.crtc_clock = pipe_config->port_clock;
11578553
JB
898}
899
977bb38d
S
900static int bxt_calc_pll_link(struct drm_i915_private *dev_priv,
901 enum intel_dpll_id dpll)
902{
903 /* FIXME formula not available in bspec */
904 return 0;
905}
906
907static void bxt_ddi_clock_get(struct intel_encoder *encoder,
908 struct intel_crtc_state *pipe_config)
909{
910 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
911 enum port port = intel_ddi_get_encoder_port(encoder);
912 uint32_t dpll = port;
913
914 pipe_config->port_clock =
915 bxt_calc_pll_link(dev_priv, dpll);
916
917 if (pipe_config->has_dp_encoder)
918 pipe_config->base.adjusted_mode.crtc_clock =
919 intel_dotclock_calculate(pipe_config->port_clock,
920 &pipe_config->dp_m_n);
921 else
922 pipe_config->base.adjusted_mode.crtc_clock =
923 pipe_config->port_clock;
924}
925
3d51278a 926void intel_ddi_clock_get(struct intel_encoder *encoder,
5cec258b 927 struct intel_crtc_state *pipe_config)
3d51278a 928{
22606a18
DL
929 struct drm_device *dev = encoder->base.dev;
930
931 if (INTEL_INFO(dev)->gen <= 8)
932 hsw_ddi_clock_get(encoder, pipe_config);
977bb38d 933 else if (IS_SKYLAKE(dev))
22606a18 934 skl_ddi_clock_get(encoder, pipe_config);
977bb38d
S
935 else if (IS_BROXTON(dev))
936 bxt_ddi_clock_get(encoder, pipe_config);
3d51278a
DV
937}
938
1c0b85c5 939static void
d664c0ce
DL
940hsw_ddi_calculate_wrpll(int clock /* in Hz */,
941 unsigned *r2_out, unsigned *n2_out, unsigned *p_out)
1c0b85c5
DL
942{
943 uint64_t freq2k;
944 unsigned p, n2, r2;
945 struct wrpll_rnp best = { 0, 0, 0 };
946 unsigned budget;
947
948 freq2k = clock / 100;
949
950 budget = wrpll_get_budget_for_freq(clock);
951
952 /* Special case handling for 540 pixel clock: bypass WR PLL entirely
953 * and directly pass the LC PLL to it. */
954 if (freq2k == 5400000) {
955 *n2_out = 2;
956 *p_out = 1;
957 *r2_out = 2;
958 return;
959 }
960
961 /*
962 * Ref = LC_FREQ / R, where Ref is the actual reference input seen by
963 * the WR PLL.
964 *
965 * We want R so that REF_MIN <= Ref <= REF_MAX.
966 * Injecting R2 = 2 * R gives:
967 * REF_MAX * r2 > LC_FREQ * 2 and
968 * REF_MIN * r2 < LC_FREQ * 2
969 *
970 * Which means the desired boundaries for r2 are:
971 * LC_FREQ * 2 / REF_MAX < r2 < LC_FREQ * 2 / REF_MIN
972 *
973 */
974 for (r2 = LC_FREQ * 2 / REF_MAX + 1;
975 r2 <= LC_FREQ * 2 / REF_MIN;
976 r2++) {
977
978 /*
979 * VCO = N * Ref, that is: VCO = N * LC_FREQ / R
980 *
981 * Once again we want VCO_MIN <= VCO <= VCO_MAX.
982 * Injecting R2 = 2 * R and N2 = 2 * N, we get:
983 * VCO_MAX * r2 > n2 * LC_FREQ and
984 * VCO_MIN * r2 < n2 * LC_FREQ)
985 *
986 * Which means the desired boundaries for n2 are:
987 * VCO_MIN * r2 / LC_FREQ < n2 < VCO_MAX * r2 / LC_FREQ
988 */
989 for (n2 = VCO_MIN * r2 / LC_FREQ + 1;
990 n2 <= VCO_MAX * r2 / LC_FREQ;
991 n2++) {
992
993 for (p = P_MIN; p <= P_MAX; p += P_INC)
994 wrpll_update_rnp(freq2k, budget,
995 r2, n2, p, &best);
996 }
997 }
6441ab5f 998
1c0b85c5
DL
999 *n2_out = best.n2;
1000 *p_out = best.p;
1001 *r2_out = best.r2;
6441ab5f
PZ
1002}
1003
0220ab6e 1004static bool
d664c0ce 1005hsw_ddi_pll_select(struct intel_crtc *intel_crtc,
190f68c5 1006 struct intel_crtc_state *crtc_state,
d664c0ce
DL
1007 struct intel_encoder *intel_encoder,
1008 int clock)
6441ab5f 1009{
d664c0ce 1010 if (intel_encoder->type == INTEL_OUTPUT_HDMI) {
e0b01be4 1011 struct intel_shared_dpll *pll;
716c2e55 1012 uint32_t val;
1c0b85c5 1013 unsigned p, n2, r2;
6441ab5f 1014
d664c0ce 1015 hsw_ddi_calculate_wrpll(clock * 1000, &r2, &n2, &p);
0694001b 1016
114fe488 1017 val = WRPLL_PLL_ENABLE | WRPLL_PLL_LCPLL |
0694001b
PZ
1018 WRPLL_DIVIDER_REFERENCE(r2) | WRPLL_DIVIDER_FEEDBACK(n2) |
1019 WRPLL_DIVIDER_POST(p);
1020
190f68c5 1021 crtc_state->dpll_hw_state.wrpll = val;
6441ab5f 1022
190f68c5 1023 pll = intel_get_shared_dpll(intel_crtc, crtc_state);
716c2e55
DV
1024 if (pll == NULL) {
1025 DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
1026 pipe_name(intel_crtc->pipe));
1027 return false;
0694001b 1028 }
d452c5b6 1029
190f68c5 1030 crtc_state->ddi_pll_sel = PORT_CLK_SEL_WRPLL(pll->id);
6441ab5f
PZ
1031 }
1032
6441ab5f
PZ
1033 return true;
1034}
1035
82d35437
S
1036struct skl_wrpll_params {
1037 uint32_t dco_fraction;
1038 uint32_t dco_integer;
1039 uint32_t qdiv_ratio;
1040 uint32_t qdiv_mode;
1041 uint32_t kdiv;
1042 uint32_t pdiv;
1043 uint32_t central_freq;
1044};
1045
1046static void
1047skl_ddi_calculate_wrpll(int clock /* in Hz */,
1048 struct skl_wrpll_params *wrpll_params)
1049{
1050 uint64_t afe_clock = clock * 5; /* AFE Clock is 5x Pixel clock */
21318cce
DL
1051 uint64_t dco_central_freq[3] = {8400000000ULL,
1052 9000000000ULL,
1053 9600000000ULL};
82d35437
S
1054 uint32_t min_dco_deviation = 400;
1055 uint32_t min_dco_index = 3;
1056 uint32_t P0[4] = {1, 2, 3, 7};
1057 uint32_t P2[4] = {1, 2, 3, 5};
1058 bool found = false;
1059 uint32_t candidate_p = 0;
1060 uint32_t candidate_p0[3] = {0}, candidate_p1[3] = {0};
1061 uint32_t candidate_p2[3] = {0};
1062 uint32_t dco_central_freq_deviation[3];
1063 uint32_t i, P1, k, dco_count;
1064 bool retry_with_odd = false;
1065 uint64_t dco_freq;
1066
1067 /* Determine P0, P1 or P2 */
1068 for (dco_count = 0; dco_count < 3; dco_count++) {
1069 found = false;
1070 candidate_p =
1071 div64_u64(dco_central_freq[dco_count], afe_clock);
1072 if (retry_with_odd == false)
1073 candidate_p = (candidate_p % 2 == 0 ?
1074 candidate_p : candidate_p + 1);
1075
1076 for (P1 = 1; P1 < candidate_p; P1++) {
1077 for (i = 0; i < 4; i++) {
1078 if (!(P0[i] != 1 || P1 == 1))
1079 continue;
1080
1081 for (k = 0; k < 4; k++) {
1082 if (P1 != 1 && P2[k] != 2)
1083 continue;
1084
1085 if (candidate_p == P0[i] * P1 * P2[k]) {
1086 /* Found possible P0, P1, P2 */
1087 found = true;
1088 candidate_p0[dco_count] = P0[i];
1089 candidate_p1[dco_count] = P1;
1090 candidate_p2[dco_count] = P2[k];
1091 goto found;
1092 }
1093
1094 }
1095 }
1096 }
1097
1098found:
1099 if (found) {
1100 dco_central_freq_deviation[dco_count] =
1101 div64_u64(10000 *
1102 abs_diff((candidate_p * afe_clock),
1103 dco_central_freq[dco_count]),
1104 dco_central_freq[dco_count]);
1105
1106 if (dco_central_freq_deviation[dco_count] <
1107 min_dco_deviation) {
1108 min_dco_deviation =
1109 dco_central_freq_deviation[dco_count];
1110 min_dco_index = dco_count;
1111 }
1112 }
1113
1114 if (min_dco_index > 2 && dco_count == 2) {
1115 retry_with_odd = true;
1116 dco_count = 0;
1117 }
1118 }
1119
1120 if (min_dco_index > 2) {
1121 WARN(1, "No valid values found for the given pixel clock\n");
1122 } else {
1123 wrpll_params->central_freq = dco_central_freq[min_dco_index];
1124
1125 switch (dco_central_freq[min_dco_index]) {
21318cce 1126 case 9600000000ULL:
82d35437
S
1127 wrpll_params->central_freq = 0;
1128 break;
21318cce 1129 case 9000000000ULL:
82d35437
S
1130 wrpll_params->central_freq = 1;
1131 break;
21318cce 1132 case 8400000000ULL:
82d35437
S
1133 wrpll_params->central_freq = 3;
1134 }
1135
1136 switch (candidate_p0[min_dco_index]) {
1137 case 1:
1138 wrpll_params->pdiv = 0;
1139 break;
1140 case 2:
1141 wrpll_params->pdiv = 1;
1142 break;
1143 case 3:
1144 wrpll_params->pdiv = 2;
1145 break;
1146 case 7:
1147 wrpll_params->pdiv = 4;
1148 break;
1149 default:
1150 WARN(1, "Incorrect PDiv\n");
1151 }
1152
1153 switch (candidate_p2[min_dco_index]) {
1154 case 5:
1155 wrpll_params->kdiv = 0;
1156 break;
1157 case 2:
1158 wrpll_params->kdiv = 1;
1159 break;
1160 case 3:
1161 wrpll_params->kdiv = 2;
1162 break;
1163 case 1:
1164 wrpll_params->kdiv = 3;
1165 break;
1166 default:
1167 WARN(1, "Incorrect KDiv\n");
1168 }
1169
1170 wrpll_params->qdiv_ratio = candidate_p1[min_dco_index];
1171 wrpll_params->qdiv_mode =
1172 (wrpll_params->qdiv_ratio == 1) ? 0 : 1;
1173
1174 dco_freq = candidate_p0[min_dco_index] *
1175 candidate_p1[min_dco_index] *
1176 candidate_p2[min_dco_index] * afe_clock;
1177
1178 /*
1179 * Intermediate values are in Hz.
1180 * Divide by MHz to match bsepc
1181 */
1182 wrpll_params->dco_integer = div_u64(dco_freq, (24 * MHz(1)));
1183 wrpll_params->dco_fraction =
1184 div_u64(((div_u64(dco_freq, 24) -
1185 wrpll_params->dco_integer * MHz(1)) * 0x8000), MHz(1));
1186
1187 }
1188}
1189
1190
1191static bool
1192skl_ddi_pll_select(struct intel_crtc *intel_crtc,
190f68c5 1193 struct intel_crtc_state *crtc_state,
82d35437
S
1194 struct intel_encoder *intel_encoder,
1195 int clock)
1196{
1197 struct intel_shared_dpll *pll;
1198 uint32_t ctrl1, cfgcr1, cfgcr2;
1199
1200 /*
1201 * See comment in intel_dpll_hw_state to understand why we always use 0
1202 * as the DPLL id in this function.
1203 */
1204
1205 ctrl1 = DPLL_CTRL1_OVERRIDE(0);
1206
1207 if (intel_encoder->type == INTEL_OUTPUT_HDMI) {
1208 struct skl_wrpll_params wrpll_params = { 0, };
1209
1210 ctrl1 |= DPLL_CTRL1_HDMI_MODE(0);
1211
1212 skl_ddi_calculate_wrpll(clock * 1000, &wrpll_params);
1213
1214 cfgcr1 = DPLL_CFGCR1_FREQ_ENABLE |
1215 DPLL_CFGCR1_DCO_FRACTION(wrpll_params.dco_fraction) |
1216 wrpll_params.dco_integer;
1217
1218 cfgcr2 = DPLL_CFGCR2_QDIV_RATIO(wrpll_params.qdiv_ratio) |
1219 DPLL_CFGCR2_QDIV_MODE(wrpll_params.qdiv_mode) |
1220 DPLL_CFGCR2_KDIV(wrpll_params.kdiv) |
1221 DPLL_CFGCR2_PDIV(wrpll_params.pdiv) |
1222 wrpll_params.central_freq;
1223 } else if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT) {
1224 struct drm_encoder *encoder = &intel_encoder->base;
1225 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1226
1227 switch (intel_dp->link_bw) {
1228 case DP_LINK_BW_1_62:
1229 ctrl1 |= DPLL_CRTL1_LINK_RATE(DPLL_CRTL1_LINK_RATE_810, 0);
1230 break;
1231 case DP_LINK_BW_2_7:
1232 ctrl1 |= DPLL_CRTL1_LINK_RATE(DPLL_CRTL1_LINK_RATE_1350, 0);
1233 break;
1234 case DP_LINK_BW_5_4:
1235 ctrl1 |= DPLL_CRTL1_LINK_RATE(DPLL_CRTL1_LINK_RATE_2700, 0);
1236 break;
1237 }
1238
1239 cfgcr1 = cfgcr2 = 0;
1240 } else /* eDP */
1241 return true;
1242
190f68c5
ACO
1243 crtc_state->dpll_hw_state.ctrl1 = ctrl1;
1244 crtc_state->dpll_hw_state.cfgcr1 = cfgcr1;
1245 crtc_state->dpll_hw_state.cfgcr2 = cfgcr2;
82d35437 1246
190f68c5 1247 pll = intel_get_shared_dpll(intel_crtc, crtc_state);
82d35437
S
1248 if (pll == NULL) {
1249 DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
1250 pipe_name(intel_crtc->pipe));
1251 return false;
1252 }
1253
1254 /* shared DPLL id 0 is DPLL 1 */
190f68c5 1255 crtc_state->ddi_pll_sel = pll->id + 1;
82d35437
S
1256
1257 return true;
1258}
0220ab6e 1259
d683f3bc
S
1260/* bxt clock parameters */
1261struct bxt_clk_div {
1262 uint32_t p1;
1263 uint32_t p2;
1264 uint32_t m2_int;
1265 uint32_t m2_frac;
1266 bool m2_frac_en;
1267 uint32_t n;
1268 uint32_t prop_coef;
1269 uint32_t int_coef;
1270 uint32_t gain_ctl;
1271 uint32_t targ_cnt;
1272 uint32_t lanestagger;
1273};
1274
1275/* pre-calculated values for DP linkrates */
1276static struct bxt_clk_div bxt_dp_clk_val[7] = {
1277 /* 162 */ {4, 2, 32, 1677722, 1, 1, 5, 11, 2, 9, 0xd},
1278 /* 270 */ {4, 1, 27, 0, 0, 1, 3, 8, 1, 9, 0xd},
1279 /* 540 */ {2, 1, 27, 0, 0, 1, 3, 8, 1, 9, 0x18},
1280 /* 216 */ {3, 2, 32, 1677722, 1, 1, 5, 11, 2, 9, 0xd},
1281 /* 243 */ {4, 1, 24, 1258291, 1, 1, 5, 11, 2, 9, 0xd},
1282 /* 324 */ {4, 1, 32, 1677722, 1, 1, 5, 11, 2, 9, 0xd},
1283 /* 432 */ {3, 1, 32, 1677722, 1, 1, 5, 11, 2, 9, 0x18}
1284};
1285
1286static bool
1287bxt_ddi_pll_select(struct intel_crtc *intel_crtc,
1288 struct intel_crtc_state *crtc_state,
1289 struct intel_encoder *intel_encoder,
1290 int clock)
1291{
1292 struct intel_shared_dpll *pll;
1293 struct bxt_clk_div clk_div = {0};
1294
1295 if (intel_encoder->type == INTEL_OUTPUT_HDMI) {
1296 intel_clock_t best_clock;
1297
1298 /* Calculate HDMI div */
1299 /*
1300 * FIXME: tie the following calculation into
1301 * i9xx_crtc_compute_clock
1302 */
1303 if (!bxt_find_best_dpll(crtc_state, clock, &best_clock)) {
1304 DRM_DEBUG_DRIVER("no PLL dividers found for clock %d pipe %c\n",
1305 clock, pipe_name(intel_crtc->pipe));
1306 return false;
1307 }
1308
1309 clk_div.p1 = best_clock.p1;
1310 clk_div.p2 = best_clock.p2;
1311 WARN_ON(best_clock.m1 != 2);
1312 clk_div.n = best_clock.n;
1313 clk_div.m2_int = best_clock.m2 >> 22;
1314 clk_div.m2_frac = best_clock.m2 & ((1 << 22) - 1);
1315 clk_div.m2_frac_en = clk_div.m2_frac != 0;
1316
1317 /* FIXME: set coef, gain, targcnt based on freq band */
1318 clk_div.prop_coef = 5;
1319 clk_div.int_coef = 11;
1320 clk_div.gain_ctl = 2;
1321 clk_div.targ_cnt = 9;
1322 if (clock > 270000)
1323 clk_div.lanestagger = 0x18;
1324 else if (clock > 135000)
1325 clk_div.lanestagger = 0x0d;
1326 else if (clock > 67000)
1327 clk_div.lanestagger = 0x07;
1328 else if (clock > 33000)
1329 clk_div.lanestagger = 0x04;
1330 else
1331 clk_div.lanestagger = 0x02;
1332 } else if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
1333 intel_encoder->type == INTEL_OUTPUT_EDP) {
1334 struct drm_encoder *encoder = &intel_encoder->base;
1335 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1336
1337 switch (intel_dp->link_bw) {
1338 case DP_LINK_BW_1_62:
1339 clk_div = bxt_dp_clk_val[0];
1340 break;
1341 case DP_LINK_BW_2_7:
1342 clk_div = bxt_dp_clk_val[1];
1343 break;
1344 case DP_LINK_BW_5_4:
1345 clk_div = bxt_dp_clk_val[2];
1346 break;
1347 default:
1348 clk_div = bxt_dp_clk_val[0];
1349 DRM_ERROR("Unknown link rate\n");
1350 }
1351 }
1352
1353 crtc_state->dpll_hw_state.ebb0 =
1354 PORT_PLL_P1(clk_div.p1) | PORT_PLL_P2(clk_div.p2);
1355 crtc_state->dpll_hw_state.pll0 = clk_div.m2_int;
1356 crtc_state->dpll_hw_state.pll1 = PORT_PLL_N(clk_div.n);
1357 crtc_state->dpll_hw_state.pll2 = clk_div.m2_frac;
1358
1359 if (clk_div.m2_frac_en)
1360 crtc_state->dpll_hw_state.pll3 =
1361 PORT_PLL_M2_FRAC_ENABLE;
1362
1363 crtc_state->dpll_hw_state.pll6 =
1364 clk_div.prop_coef | PORT_PLL_INT_COEFF(clk_div.int_coef);
1365 crtc_state->dpll_hw_state.pll6 |=
1366 PORT_PLL_GAIN_CTL(clk_div.gain_ctl);
1367
1368 crtc_state->dpll_hw_state.pll8 = clk_div.targ_cnt;
1369
1370 crtc_state->dpll_hw_state.pcsdw12 =
1371 LANESTAGGER_STRAP_OVRD | clk_div.lanestagger;
1372
1373 pll = intel_get_shared_dpll(intel_crtc, crtc_state);
1374 if (pll == NULL) {
1375 DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
1376 pipe_name(intel_crtc->pipe));
1377 return false;
1378 }
1379
1380 /* shared DPLL id 0 is DPLL A */
1381 crtc_state->ddi_pll_sel = pll->id;
1382
1383 return true;
1384}
1385
0220ab6e
DL
1386/*
1387 * Tries to find a *shared* PLL for the CRTC and store it in
1388 * intel_crtc->ddi_pll_sel.
1389 *
1390 * For private DPLLs, compute_config() should do the selection for us. This
1391 * function should be folded into compute_config() eventually.
1392 */
190f68c5
ACO
1393bool intel_ddi_pll_select(struct intel_crtc *intel_crtc,
1394 struct intel_crtc_state *crtc_state)
0220ab6e 1395{
82d35437 1396 struct drm_device *dev = intel_crtc->base.dev;
d0737e1d 1397 struct intel_encoder *intel_encoder =
3165c074 1398 intel_ddi_get_crtc_new_encoder(crtc_state);
190f68c5 1399 int clock = crtc_state->port_clock;
0220ab6e 1400
82d35437 1401 if (IS_SKYLAKE(dev))
190f68c5
ACO
1402 return skl_ddi_pll_select(intel_crtc, crtc_state,
1403 intel_encoder, clock);
d683f3bc
S
1404 else if (IS_BROXTON(dev))
1405 return bxt_ddi_pll_select(intel_crtc, crtc_state,
1406 intel_encoder, clock);
82d35437 1407 else
190f68c5
ACO
1408 return hsw_ddi_pll_select(intel_crtc, crtc_state,
1409 intel_encoder, clock);
0220ab6e
DL
1410}
1411
dae84799
PZ
1412void intel_ddi_set_pipe_settings(struct drm_crtc *crtc)
1413{
1414 struct drm_i915_private *dev_priv = crtc->dev->dev_private;
1415 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1416 struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
6e3c9717 1417 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
dae84799
PZ
1418 int type = intel_encoder->type;
1419 uint32_t temp;
1420
0e32b39c 1421 if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP || type == INTEL_OUTPUT_DP_MST) {
c9809791 1422 temp = TRANS_MSA_SYNC_CLK;
6e3c9717 1423 switch (intel_crtc->config->pipe_bpp) {
dae84799 1424 case 18:
c9809791 1425 temp |= TRANS_MSA_6_BPC;
dae84799
PZ
1426 break;
1427 case 24:
c9809791 1428 temp |= TRANS_MSA_8_BPC;
dae84799
PZ
1429 break;
1430 case 30:
c9809791 1431 temp |= TRANS_MSA_10_BPC;
dae84799
PZ
1432 break;
1433 case 36:
c9809791 1434 temp |= TRANS_MSA_12_BPC;
dae84799
PZ
1435 break;
1436 default:
4e53c2e0 1437 BUG();
dae84799 1438 }
c9809791 1439 I915_WRITE(TRANS_MSA_MISC(cpu_transcoder), temp);
dae84799
PZ
1440 }
1441}
1442
0e32b39c
DA
1443void intel_ddi_set_vc_payload_alloc(struct drm_crtc *crtc, bool state)
1444{
1445 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1446 struct drm_device *dev = crtc->dev;
1447 struct drm_i915_private *dev_priv = dev->dev_private;
6e3c9717 1448 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
0e32b39c
DA
1449 uint32_t temp;
1450 temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
1451 if (state == true)
1452 temp |= TRANS_DDI_DP_VC_PAYLOAD_ALLOC;
1453 else
1454 temp &= ~TRANS_DDI_DP_VC_PAYLOAD_ALLOC;
1455 I915_WRITE(TRANS_DDI_FUNC_CTL(cpu_transcoder), temp);
1456}
1457
8228c251 1458void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc)
8d9ddbcb
PZ
1459{
1460 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1461 struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
7739c33b 1462 struct drm_encoder *encoder = &intel_encoder->base;
c7670b10
PZ
1463 struct drm_device *dev = crtc->dev;
1464 struct drm_i915_private *dev_priv = dev->dev_private;
8d9ddbcb 1465 enum pipe pipe = intel_crtc->pipe;
6e3c9717 1466 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
174edf1f 1467 enum port port = intel_ddi_get_encoder_port(intel_encoder);
7739c33b 1468 int type = intel_encoder->type;
8d9ddbcb
PZ
1469 uint32_t temp;
1470
ad80a810
PZ
1471 /* Enable TRANS_DDI_FUNC_CTL for the pipe to work in HDMI mode */
1472 temp = TRANS_DDI_FUNC_ENABLE;
174edf1f 1473 temp |= TRANS_DDI_SELECT_PORT(port);
dfcef252 1474
6e3c9717 1475 switch (intel_crtc->config->pipe_bpp) {
dfcef252 1476 case 18:
ad80a810 1477 temp |= TRANS_DDI_BPC_6;
dfcef252
PZ
1478 break;
1479 case 24:
ad80a810 1480 temp |= TRANS_DDI_BPC_8;
dfcef252
PZ
1481 break;
1482 case 30:
ad80a810 1483 temp |= TRANS_DDI_BPC_10;
dfcef252
PZ
1484 break;
1485 case 36:
ad80a810 1486 temp |= TRANS_DDI_BPC_12;
dfcef252
PZ
1487 break;
1488 default:
4e53c2e0 1489 BUG();
dfcef252 1490 }
72662e10 1491
6e3c9717 1492 if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_PVSYNC)
ad80a810 1493 temp |= TRANS_DDI_PVSYNC;
6e3c9717 1494 if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_PHSYNC)
ad80a810 1495 temp |= TRANS_DDI_PHSYNC;
f63eb7c4 1496
e6f0bfc4
PZ
1497 if (cpu_transcoder == TRANSCODER_EDP) {
1498 switch (pipe) {
1499 case PIPE_A:
c7670b10
PZ
1500 /* On Haswell, can only use the always-on power well for
1501 * eDP when not using the panel fitter, and when not
1502 * using motion blur mitigation (which we don't
1503 * support). */
fabf6e51 1504 if (IS_HASWELL(dev) &&
6e3c9717
ACO
1505 (intel_crtc->config->pch_pfit.enabled ||
1506 intel_crtc->config->pch_pfit.force_thru))
d6dd9eb1
DV
1507 temp |= TRANS_DDI_EDP_INPUT_A_ONOFF;
1508 else
1509 temp |= TRANS_DDI_EDP_INPUT_A_ON;
e6f0bfc4
PZ
1510 break;
1511 case PIPE_B:
1512 temp |= TRANS_DDI_EDP_INPUT_B_ONOFF;
1513 break;
1514 case PIPE_C:
1515 temp |= TRANS_DDI_EDP_INPUT_C_ONOFF;
1516 break;
1517 default:
1518 BUG();
1519 break;
1520 }
1521 }
1522
7739c33b 1523 if (type == INTEL_OUTPUT_HDMI) {
6e3c9717 1524 if (intel_crtc->config->has_hdmi_sink)
ad80a810 1525 temp |= TRANS_DDI_MODE_SELECT_HDMI;
8d9ddbcb 1526 else
ad80a810 1527 temp |= TRANS_DDI_MODE_SELECT_DVI;
8d9ddbcb 1528
7739c33b 1529 } else if (type == INTEL_OUTPUT_ANALOG) {
ad80a810 1530 temp |= TRANS_DDI_MODE_SELECT_FDI;
6e3c9717 1531 temp |= (intel_crtc->config->fdi_lanes - 1) << 1;
7739c33b
PZ
1532
1533 } else if (type == INTEL_OUTPUT_DISPLAYPORT ||
1534 type == INTEL_OUTPUT_EDP) {
1535 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1536
0e32b39c
DA
1537 if (intel_dp->is_mst) {
1538 temp |= TRANS_DDI_MODE_SELECT_DP_MST;
1539 } else
1540 temp |= TRANS_DDI_MODE_SELECT_DP_SST;
1541
1542 temp |= DDI_PORT_WIDTH(intel_dp->lane_count);
1543 } else if (type == INTEL_OUTPUT_DP_MST) {
1544 struct intel_dp *intel_dp = &enc_to_mst(encoder)->primary->dp;
1545
1546 if (intel_dp->is_mst) {
1547 temp |= TRANS_DDI_MODE_SELECT_DP_MST;
1548 } else
1549 temp |= TRANS_DDI_MODE_SELECT_DP_SST;
7739c33b 1550
17aa6be9 1551 temp |= DDI_PORT_WIDTH(intel_dp->lane_count);
8d9ddbcb 1552 } else {
84f44ce7
VS
1553 WARN(1, "Invalid encoder type %d for pipe %c\n",
1554 intel_encoder->type, pipe_name(pipe));
8d9ddbcb
PZ
1555 }
1556
ad80a810 1557 I915_WRITE(TRANS_DDI_FUNC_CTL(cpu_transcoder), temp);
8d9ddbcb 1558}
72662e10 1559
ad80a810
PZ
1560void intel_ddi_disable_transcoder_func(struct drm_i915_private *dev_priv,
1561 enum transcoder cpu_transcoder)
8d9ddbcb 1562{
ad80a810 1563 uint32_t reg = TRANS_DDI_FUNC_CTL(cpu_transcoder);
8d9ddbcb
PZ
1564 uint32_t val = I915_READ(reg);
1565
0e32b39c 1566 val &= ~(TRANS_DDI_FUNC_ENABLE | TRANS_DDI_PORT_MASK | TRANS_DDI_DP_VC_PAYLOAD_ALLOC);
ad80a810 1567 val |= TRANS_DDI_PORT_NONE;
8d9ddbcb 1568 I915_WRITE(reg, val);
72662e10
ED
1569}
1570
bcbc889b
PZ
1571bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector)
1572{
1573 struct drm_device *dev = intel_connector->base.dev;
1574 struct drm_i915_private *dev_priv = dev->dev_private;
1575 struct intel_encoder *intel_encoder = intel_connector->encoder;
1576 int type = intel_connector->base.connector_type;
1577 enum port port = intel_ddi_get_encoder_port(intel_encoder);
1578 enum pipe pipe = 0;
1579 enum transcoder cpu_transcoder;
882244a3 1580 enum intel_display_power_domain power_domain;
bcbc889b
PZ
1581 uint32_t tmp;
1582
882244a3 1583 power_domain = intel_display_port_power_domain(intel_encoder);
f458ebbc 1584 if (!intel_display_power_is_enabled(dev_priv, power_domain))
882244a3
PZ
1585 return false;
1586
bcbc889b
PZ
1587 if (!intel_encoder->get_hw_state(intel_encoder, &pipe))
1588 return false;
1589
1590 if (port == PORT_A)
1591 cpu_transcoder = TRANSCODER_EDP;
1592 else
1a240d4d 1593 cpu_transcoder = (enum transcoder) pipe;
bcbc889b
PZ
1594
1595 tmp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
1596
1597 switch (tmp & TRANS_DDI_MODE_SELECT_MASK) {
1598 case TRANS_DDI_MODE_SELECT_HDMI:
1599 case TRANS_DDI_MODE_SELECT_DVI:
1600 return (type == DRM_MODE_CONNECTOR_HDMIA);
1601
1602 case TRANS_DDI_MODE_SELECT_DP_SST:
1603 if (type == DRM_MODE_CONNECTOR_eDP)
1604 return true;
bcbc889b 1605 return (type == DRM_MODE_CONNECTOR_DisplayPort);
0e32b39c
DA
1606 case TRANS_DDI_MODE_SELECT_DP_MST:
1607 /* if the transcoder is in MST state then
1608 * connector isn't connected */
1609 return false;
bcbc889b
PZ
1610
1611 case TRANS_DDI_MODE_SELECT_FDI:
1612 return (type == DRM_MODE_CONNECTOR_VGA);
1613
1614 default:
1615 return false;
1616 }
1617}
1618
85234cdc
DV
1619bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
1620 enum pipe *pipe)
1621{
1622 struct drm_device *dev = encoder->base.dev;
1623 struct drm_i915_private *dev_priv = dev->dev_private;
fe43d3f5 1624 enum port port = intel_ddi_get_encoder_port(encoder);
6d129bea 1625 enum intel_display_power_domain power_domain;
85234cdc
DV
1626 u32 tmp;
1627 int i;
1628
6d129bea 1629 power_domain = intel_display_port_power_domain(encoder);
f458ebbc 1630 if (!intel_display_power_is_enabled(dev_priv, power_domain))
6d129bea
ID
1631 return false;
1632
fe43d3f5 1633 tmp = I915_READ(DDI_BUF_CTL(port));
85234cdc
DV
1634
1635 if (!(tmp & DDI_BUF_CTL_ENABLE))
1636 return false;
1637
ad80a810
PZ
1638 if (port == PORT_A) {
1639 tmp = I915_READ(TRANS_DDI_FUNC_CTL(TRANSCODER_EDP));
85234cdc 1640
ad80a810
PZ
1641 switch (tmp & TRANS_DDI_EDP_INPUT_MASK) {
1642 case TRANS_DDI_EDP_INPUT_A_ON:
1643 case TRANS_DDI_EDP_INPUT_A_ONOFF:
1644 *pipe = PIPE_A;
1645 break;
1646 case TRANS_DDI_EDP_INPUT_B_ONOFF:
1647 *pipe = PIPE_B;
1648 break;
1649 case TRANS_DDI_EDP_INPUT_C_ONOFF:
1650 *pipe = PIPE_C;
1651 break;
1652 }
1653
1654 return true;
1655 } else {
1656 for (i = TRANSCODER_A; i <= TRANSCODER_C; i++) {
1657 tmp = I915_READ(TRANS_DDI_FUNC_CTL(i));
1658
1659 if ((tmp & TRANS_DDI_PORT_MASK)
1660 == TRANS_DDI_SELECT_PORT(port)) {
0e32b39c
DA
1661 if ((tmp & TRANS_DDI_MODE_SELECT_MASK) == TRANS_DDI_MODE_SELECT_DP_MST)
1662 return false;
1663
ad80a810
PZ
1664 *pipe = i;
1665 return true;
1666 }
85234cdc
DV
1667 }
1668 }
1669
84f44ce7 1670 DRM_DEBUG_KMS("No pipe for ddi port %c found\n", port_name(port));
85234cdc 1671
22f9fe50 1672 return false;
85234cdc
DV
1673}
1674
fc914639
PZ
1675void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc)
1676{
1677 struct drm_crtc *crtc = &intel_crtc->base;
1678 struct drm_i915_private *dev_priv = crtc->dev->dev_private;
1679 struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
1680 enum port port = intel_ddi_get_encoder_port(intel_encoder);
6e3c9717 1681 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
fc914639 1682
bb523fc0
PZ
1683 if (cpu_transcoder != TRANSCODER_EDP)
1684 I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
1685 TRANS_CLK_SEL_PORT(port));
fc914639
PZ
1686}
1687
1688void intel_ddi_disable_pipe_clock(struct intel_crtc *intel_crtc)
1689{
1690 struct drm_i915_private *dev_priv = intel_crtc->base.dev->dev_private;
6e3c9717 1691 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
fc914639 1692
bb523fc0
PZ
1693 if (cpu_transcoder != TRANSCODER_EDP)
1694 I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
1695 TRANS_CLK_SEL_DISABLED);
fc914639
PZ
1696}
1697
00c09d70 1698static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder)
6441ab5f 1699{
c19b0669 1700 struct drm_encoder *encoder = &intel_encoder->base;
efa80add
S
1701 struct drm_device *dev = encoder->dev;
1702 struct drm_i915_private *dev_priv = dev->dev_private;
30cf6db8 1703 struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
6441ab5f 1704 enum port port = intel_ddi_get_encoder_port(intel_encoder);
82a4d9c0 1705 int type = intel_encoder->type;
6441ab5f 1706
82a4d9c0
PZ
1707 if (type == INTEL_OUTPUT_EDP) {
1708 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
4be73780 1709 intel_edp_panel_on(intel_dp);
82a4d9c0 1710 }
6441ab5f 1711
efa80add 1712 if (IS_SKYLAKE(dev)) {
6e3c9717 1713 uint32_t dpll = crtc->config->ddi_pll_sel;
efa80add
S
1714 uint32_t val;
1715
5416d871
DL
1716 /*
1717 * DPLL0 is used for eDP and is the only "private" DPLL (as
1718 * opposed to shared) on SKL
1719 */
1720 if (type == INTEL_OUTPUT_EDP) {
1721 WARN_ON(dpll != SKL_DPLL0);
1722
1723 val = I915_READ(DPLL_CTRL1);
1724
1725 val &= ~(DPLL_CTRL1_HDMI_MODE(dpll) |
1726 DPLL_CTRL1_SSC(dpll) |
1727 DPLL_CRTL1_LINK_RATE_MASK(dpll));
6e3c9717 1728 val |= crtc->config->dpll_hw_state.ctrl1 << (dpll * 6);
5416d871
DL
1729
1730 I915_WRITE(DPLL_CTRL1, val);
1731 POSTING_READ(DPLL_CTRL1);
1732 }
1733
1734 /* DDI -> PLL mapping */
efa80add
S
1735 val = I915_READ(DPLL_CTRL2);
1736
1737 val &= ~(DPLL_CTRL2_DDI_CLK_OFF(port) |
1738 DPLL_CTRL2_DDI_CLK_SEL_MASK(port));
1739 val |= (DPLL_CTRL2_DDI_CLK_SEL(dpll, port) |
1740 DPLL_CTRL2_DDI_SEL_OVERRIDE(port));
1741
1742 I915_WRITE(DPLL_CTRL2, val);
5416d871 1743
1ab23380 1744 } else if (INTEL_INFO(dev)->gen < 9) {
6e3c9717
ACO
1745 WARN_ON(crtc->config->ddi_pll_sel == PORT_CLK_SEL_NONE);
1746 I915_WRITE(PORT_CLK_SEL(port), crtc->config->ddi_pll_sel);
efa80add 1747 }
c19b0669 1748
82a4d9c0 1749 if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
c19b0669 1750 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
30cf6db8 1751
44905a27 1752 intel_ddi_init_dp_buf_reg(intel_encoder);
c19b0669
PZ
1753
1754 intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
1755 intel_dp_start_link_train(intel_dp);
1756 intel_dp_complete_link_train(intel_dp);
23f08d83 1757 if (port != PORT_A || INTEL_INFO(dev)->gen >= 9)
3ab9c637 1758 intel_dp_stop_link_train(intel_dp);
30cf6db8
DV
1759 } else if (type == INTEL_OUTPUT_HDMI) {
1760 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
1761
1762 intel_hdmi->set_infoframes(encoder,
6e3c9717
ACO
1763 crtc->config->has_hdmi_sink,
1764 &crtc->config->base.adjusted_mode);
c19b0669 1765 }
6441ab5f
PZ
1766}
1767
00c09d70 1768static void intel_ddi_post_disable(struct intel_encoder *intel_encoder)
6441ab5f
PZ
1769{
1770 struct drm_encoder *encoder = &intel_encoder->base;
efa80add
S
1771 struct drm_device *dev = encoder->dev;
1772 struct drm_i915_private *dev_priv = dev->dev_private;
6441ab5f 1773 enum port port = intel_ddi_get_encoder_port(intel_encoder);
82a4d9c0 1774 int type = intel_encoder->type;
2886e93f 1775 uint32_t val;
a836bdf9 1776 bool wait = false;
2886e93f
PZ
1777
1778 val = I915_READ(DDI_BUF_CTL(port));
1779 if (val & DDI_BUF_CTL_ENABLE) {
1780 val &= ~DDI_BUF_CTL_ENABLE;
1781 I915_WRITE(DDI_BUF_CTL(port), val);
a836bdf9 1782 wait = true;
2886e93f 1783 }
6441ab5f 1784
a836bdf9
PZ
1785 val = I915_READ(DP_TP_CTL(port));
1786 val &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
1787 val |= DP_TP_CTL_LINK_TRAIN_PAT1;
1788 I915_WRITE(DP_TP_CTL(port), val);
1789
1790 if (wait)
1791 intel_wait_ddi_buf_idle(dev_priv, port);
1792
76bb80ed 1793 if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
82a4d9c0 1794 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
76bb80ed 1795 intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
24f3e092 1796 intel_edp_panel_vdd_on(intel_dp);
4be73780 1797 intel_edp_panel_off(intel_dp);
82a4d9c0
PZ
1798 }
1799
efa80add
S
1800 if (IS_SKYLAKE(dev))
1801 I915_WRITE(DPLL_CTRL2, (I915_READ(DPLL_CTRL2) |
1802 DPLL_CTRL2_DDI_CLK_OFF(port)));
1ab23380 1803 else if (INTEL_INFO(dev)->gen < 9)
efa80add 1804 I915_WRITE(PORT_CLK_SEL(port), PORT_CLK_SEL_NONE);
6441ab5f
PZ
1805}
1806
00c09d70 1807static void intel_enable_ddi(struct intel_encoder *intel_encoder)
72662e10 1808{
6547fef8 1809 struct drm_encoder *encoder = &intel_encoder->base;
7b9f35a6
WX
1810 struct drm_crtc *crtc = encoder->crtc;
1811 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
6547fef8 1812 struct drm_device *dev = encoder->dev;
72662e10 1813 struct drm_i915_private *dev_priv = dev->dev_private;
6547fef8
PZ
1814 enum port port = intel_ddi_get_encoder_port(intel_encoder);
1815 int type = intel_encoder->type;
72662e10 1816
6547fef8 1817 if (type == INTEL_OUTPUT_HDMI) {
876a8cdf
DL
1818 struct intel_digital_port *intel_dig_port =
1819 enc_to_dig_port(encoder);
1820
6547fef8
PZ
1821 /* In HDMI/DVI mode, the port width, and swing/emphasis values
1822 * are ignored so nothing special needs to be done besides
1823 * enabling the port.
1824 */
876a8cdf 1825 I915_WRITE(DDI_BUF_CTL(port),
bcf53de4
SM
1826 intel_dig_port->saved_port_bits |
1827 DDI_BUF_CTL_ENABLE);
d6c50ff8
PZ
1828 } else if (type == INTEL_OUTPUT_EDP) {
1829 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1830
23f08d83 1831 if (port == PORT_A && INTEL_INFO(dev)->gen < 9)
3ab9c637
ID
1832 intel_dp_stop_link_train(intel_dp);
1833
4be73780 1834 intel_edp_backlight_on(intel_dp);
0bc12bcb 1835 intel_psr_enable(intel_dp);
c395578e 1836 intel_edp_drrs_enable(intel_dp);
6547fef8 1837 }
7b9f35a6 1838
6e3c9717 1839 if (intel_crtc->config->has_audio) {
d45a0bf5 1840 intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO);
69bfe1a9 1841 intel_audio_codec_enable(intel_encoder);
7b9f35a6 1842 }
5ab432ef
DV
1843}
1844
00c09d70 1845static void intel_disable_ddi(struct intel_encoder *intel_encoder)
5ab432ef 1846{
d6c50ff8 1847 struct drm_encoder *encoder = &intel_encoder->base;
7b9f35a6
WX
1848 struct drm_crtc *crtc = encoder->crtc;
1849 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
d6c50ff8 1850 int type = intel_encoder->type;
7b9f35a6
WX
1851 struct drm_device *dev = encoder->dev;
1852 struct drm_i915_private *dev_priv = dev->dev_private;
d6c50ff8 1853
6e3c9717 1854 if (intel_crtc->config->has_audio) {
69bfe1a9 1855 intel_audio_codec_disable(intel_encoder);
d45a0bf5
PZ
1856 intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO);
1857 }
2831d842 1858
d6c50ff8
PZ
1859 if (type == INTEL_OUTPUT_EDP) {
1860 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1861
c395578e 1862 intel_edp_drrs_disable(intel_dp);
0bc12bcb 1863 intel_psr_disable(intel_dp);
4be73780 1864 intel_edp_backlight_off(intel_dp);
d6c50ff8 1865 }
72662e10 1866}
79f689aa 1867
e0b01be4
DV
1868static void hsw_ddi_pll_enable(struct drm_i915_private *dev_priv,
1869 struct intel_shared_dpll *pll)
1870{
3e369b76 1871 I915_WRITE(WRPLL_CTL(pll->id), pll->config.hw_state.wrpll);
e0b01be4
DV
1872 POSTING_READ(WRPLL_CTL(pll->id));
1873 udelay(20);
1874}
1875
12030431
DV
1876static void hsw_ddi_pll_disable(struct drm_i915_private *dev_priv,
1877 struct intel_shared_dpll *pll)
1878{
1879 uint32_t val;
1880
1881 val = I915_READ(WRPLL_CTL(pll->id));
12030431
DV
1882 I915_WRITE(WRPLL_CTL(pll->id), val & ~WRPLL_PLL_ENABLE);
1883 POSTING_READ(WRPLL_CTL(pll->id));
1884}
1885
d452c5b6
DV
1886static bool hsw_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
1887 struct intel_shared_dpll *pll,
1888 struct intel_dpll_hw_state *hw_state)
1889{
1890 uint32_t val;
1891
f458ebbc 1892 if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
d452c5b6
DV
1893 return false;
1894
1895 val = I915_READ(WRPLL_CTL(pll->id));
1896 hw_state->wrpll = val;
1897
1898 return val & WRPLL_PLL_ENABLE;
1899}
1900
ca1381b5 1901static const char * const hsw_ddi_pll_names[] = {
9cd86933
DV
1902 "WRPLL 1",
1903 "WRPLL 2",
1904};
1905
143b307c 1906static void hsw_shared_dplls_init(struct drm_i915_private *dev_priv)
79f689aa 1907{
9cd86933
DV
1908 int i;
1909
716c2e55 1910 dev_priv->num_shared_dpll = 2;
9cd86933 1911
716c2e55 1912 for (i = 0; i < dev_priv->num_shared_dpll; i++) {
9cd86933
DV
1913 dev_priv->shared_dplls[i].id = i;
1914 dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i];
12030431 1915 dev_priv->shared_dplls[i].disable = hsw_ddi_pll_disable;
e0b01be4 1916 dev_priv->shared_dplls[i].enable = hsw_ddi_pll_enable;
d452c5b6
DV
1917 dev_priv->shared_dplls[i].get_hw_state =
1918 hsw_ddi_pll_get_hw_state;
9cd86933 1919 }
143b307c
DL
1920}
1921
d1a2dc78
S
1922static const char * const skl_ddi_pll_names[] = {
1923 "DPLL 1",
1924 "DPLL 2",
1925 "DPLL 3",
1926};
1927
1928struct skl_dpll_regs {
1929 u32 ctl, cfgcr1, cfgcr2;
1930};
1931
1932/* this array is indexed by the *shared* pll id */
1933static const struct skl_dpll_regs skl_dpll_regs[3] = {
1934 {
1935 /* DPLL 1 */
1936 .ctl = LCPLL2_CTL,
1937 .cfgcr1 = DPLL1_CFGCR1,
1938 .cfgcr2 = DPLL1_CFGCR2,
1939 },
1940 {
1941 /* DPLL 2 */
1942 .ctl = WRPLL_CTL1,
1943 .cfgcr1 = DPLL2_CFGCR1,
1944 .cfgcr2 = DPLL2_CFGCR2,
1945 },
1946 {
1947 /* DPLL 3 */
1948 .ctl = WRPLL_CTL2,
1949 .cfgcr1 = DPLL3_CFGCR1,
1950 .cfgcr2 = DPLL3_CFGCR2,
1951 },
1952};
1953
1954static void skl_ddi_pll_enable(struct drm_i915_private *dev_priv,
1955 struct intel_shared_dpll *pll)
1956{
1957 uint32_t val;
1958 unsigned int dpll;
1959 const struct skl_dpll_regs *regs = skl_dpll_regs;
1960
1961 /* DPLL0 is not part of the shared DPLLs, so pll->id is 0 for DPLL1 */
1962 dpll = pll->id + 1;
1963
1964 val = I915_READ(DPLL_CTRL1);
1965
1966 val &= ~(DPLL_CTRL1_HDMI_MODE(dpll) | DPLL_CTRL1_SSC(dpll) |
1967 DPLL_CRTL1_LINK_RATE_MASK(dpll));
1968 val |= pll->config.hw_state.ctrl1 << (dpll * 6);
1969
1970 I915_WRITE(DPLL_CTRL1, val);
1971 POSTING_READ(DPLL_CTRL1);
1972
1973 I915_WRITE(regs[pll->id].cfgcr1, pll->config.hw_state.cfgcr1);
1974 I915_WRITE(regs[pll->id].cfgcr2, pll->config.hw_state.cfgcr2);
1975 POSTING_READ(regs[pll->id].cfgcr1);
1976 POSTING_READ(regs[pll->id].cfgcr2);
1977
1978 /* the enable bit is always bit 31 */
1979 I915_WRITE(regs[pll->id].ctl,
1980 I915_READ(regs[pll->id].ctl) | LCPLL_PLL_ENABLE);
1981
1982 if (wait_for(I915_READ(DPLL_STATUS) & DPLL_LOCK(dpll), 5))
1983 DRM_ERROR("DPLL %d not locked\n", dpll);
1984}
1985
1986static void skl_ddi_pll_disable(struct drm_i915_private *dev_priv,
1987 struct intel_shared_dpll *pll)
1988{
1989 const struct skl_dpll_regs *regs = skl_dpll_regs;
1990
1991 /* the enable bit is always bit 31 */
1992 I915_WRITE(regs[pll->id].ctl,
1993 I915_READ(regs[pll->id].ctl) & ~LCPLL_PLL_ENABLE);
1994 POSTING_READ(regs[pll->id].ctl);
1995}
1996
1997static bool skl_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
1998 struct intel_shared_dpll *pll,
1999 struct intel_dpll_hw_state *hw_state)
2000{
2001 uint32_t val;
2002 unsigned int dpll;
2003 const struct skl_dpll_regs *regs = skl_dpll_regs;
2004
2005 if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
2006 return false;
2007
2008 /* DPLL0 is not part of the shared DPLLs, so pll->id is 0 for DPLL1 */
2009 dpll = pll->id + 1;
2010
2011 val = I915_READ(regs[pll->id].ctl);
2012 if (!(val & LCPLL_PLL_ENABLE))
2013 return false;
2014
2015 val = I915_READ(DPLL_CTRL1);
2016 hw_state->ctrl1 = (val >> (dpll * 6)) & 0x3f;
2017
2018 /* avoid reading back stale values if HDMI mode is not enabled */
2019 if (val & DPLL_CTRL1_HDMI_MODE(dpll)) {
2020 hw_state->cfgcr1 = I915_READ(regs[pll->id].cfgcr1);
2021 hw_state->cfgcr2 = I915_READ(regs[pll->id].cfgcr2);
2022 }
2023
2024 return true;
2025}
2026
2027static void skl_shared_dplls_init(struct drm_i915_private *dev_priv)
2028{
2029 int i;
2030
2031 dev_priv->num_shared_dpll = 3;
2032
2033 for (i = 0; i < dev_priv->num_shared_dpll; i++) {
2034 dev_priv->shared_dplls[i].id = i;
2035 dev_priv->shared_dplls[i].name = skl_ddi_pll_names[i];
2036 dev_priv->shared_dplls[i].disable = skl_ddi_pll_disable;
2037 dev_priv->shared_dplls[i].enable = skl_ddi_pll_enable;
2038 dev_priv->shared_dplls[i].get_hw_state =
2039 skl_ddi_pll_get_hw_state;
2040 }
2041}
2042
5c6706e5
VK
2043static void broxton_phy_init(struct drm_i915_private *dev_priv,
2044 enum dpio_phy phy)
2045{
2046 enum port port;
2047 uint32_t val;
2048
2049 val = I915_READ(BXT_P_CR_GT_DISP_PWRON);
2050 val |= GT_DISPLAY_POWER_ON(phy);
2051 I915_WRITE(BXT_P_CR_GT_DISP_PWRON, val);
2052
2053 /* Considering 10ms timeout until BSpec is updated */
2054 if (wait_for(I915_READ(BXT_PORT_CL1CM_DW0(phy)) & PHY_POWER_GOOD, 10))
2055 DRM_ERROR("timeout during PHY%d power on\n", phy);
2056
2057 for (port = (phy == DPIO_PHY0 ? PORT_B : PORT_A);
2058 port <= (phy == DPIO_PHY0 ? PORT_C : PORT_A); port++) {
2059 int lane;
2060
2061 for (lane = 0; lane < 4; lane++) {
2062 val = I915_READ(BXT_PORT_TX_DW14_LN(port, lane));
2063 /*
2064 * Note that on CHV this flag is called UPAR, but has
2065 * the same function.
2066 */
2067 val &= ~LATENCY_OPTIM;
2068 if (lane != 1)
2069 val |= LATENCY_OPTIM;
2070
2071 I915_WRITE(BXT_PORT_TX_DW14_LN(port, lane), val);
2072 }
2073 }
2074
2075 /* Program PLL Rcomp code offset */
2076 val = I915_READ(BXT_PORT_CL1CM_DW9(phy));
2077 val &= ~IREF0RC_OFFSET_MASK;
2078 val |= 0xE4 << IREF0RC_OFFSET_SHIFT;
2079 I915_WRITE(BXT_PORT_CL1CM_DW9(phy), val);
2080
2081 val = I915_READ(BXT_PORT_CL1CM_DW10(phy));
2082 val &= ~IREF1RC_OFFSET_MASK;
2083 val |= 0xE4 << IREF1RC_OFFSET_SHIFT;
2084 I915_WRITE(BXT_PORT_CL1CM_DW10(phy), val);
2085
2086 /* Program power gating */
2087 val = I915_READ(BXT_PORT_CL1CM_DW28(phy));
2088 val |= OCL1_POWER_DOWN_EN | DW28_OLDO_DYN_PWR_DOWN_EN |
2089 SUS_CLK_CONFIG;
2090 I915_WRITE(BXT_PORT_CL1CM_DW28(phy), val);
2091
2092 if (phy == DPIO_PHY0) {
2093 val = I915_READ(BXT_PORT_CL2CM_DW6_BC);
2094 val |= DW6_OLDO_DYN_PWR_DOWN_EN;
2095 I915_WRITE(BXT_PORT_CL2CM_DW6_BC, val);
2096 }
2097
2098 val = I915_READ(BXT_PORT_CL1CM_DW30(phy));
2099 val &= ~OCL2_LDOFUSE_PWR_DIS;
2100 /*
2101 * On PHY1 disable power on the second channel, since no port is
2102 * connected there. On PHY0 both channels have a port, so leave it
2103 * enabled.
2104 * TODO: port C is only connected on BXT-P, so on BXT0/1 we should
2105 * power down the second channel on PHY0 as well.
2106 */
2107 if (phy == DPIO_PHY1)
2108 val |= OCL2_LDOFUSE_PWR_DIS;
2109 I915_WRITE(BXT_PORT_CL1CM_DW30(phy), val);
2110
2111 if (phy == DPIO_PHY0) {
2112 uint32_t grc_code;
2113 /*
2114 * PHY0 isn't connected to an RCOMP resistor so copy over
2115 * the corresponding calibrated value from PHY1, and disable
2116 * the automatic calibration on PHY0.
2117 */
2118 if (wait_for(I915_READ(BXT_PORT_REF_DW3(DPIO_PHY1)) & GRC_DONE,
2119 10))
2120 DRM_ERROR("timeout waiting for PHY1 GRC\n");
2121
2122 val = I915_READ(BXT_PORT_REF_DW6(DPIO_PHY1));
2123 val = (val & GRC_CODE_MASK) >> GRC_CODE_SHIFT;
2124 grc_code = val << GRC_CODE_FAST_SHIFT |
2125 val << GRC_CODE_SLOW_SHIFT |
2126 val;
2127 I915_WRITE(BXT_PORT_REF_DW6(DPIO_PHY0), grc_code);
2128
2129 val = I915_READ(BXT_PORT_REF_DW8(DPIO_PHY0));
2130 val |= GRC_DIS | GRC_RDY_OVRD;
2131 I915_WRITE(BXT_PORT_REF_DW8(DPIO_PHY0), val);
2132 }
2133
2134 val = I915_READ(BXT_PHY_CTL_FAMILY(phy));
2135 val |= COMMON_RESET_DIS;
2136 I915_WRITE(BXT_PHY_CTL_FAMILY(phy), val);
2137}
2138
2139void broxton_ddi_phy_init(struct drm_device *dev)
2140{
2141 /* Enable PHY1 first since it provides Rcomp for PHY0 */
2142 broxton_phy_init(dev->dev_private, DPIO_PHY1);
2143 broxton_phy_init(dev->dev_private, DPIO_PHY0);
2144}
2145
2146static void broxton_phy_uninit(struct drm_i915_private *dev_priv,
2147 enum dpio_phy phy)
2148{
2149 uint32_t val;
2150
2151 val = I915_READ(BXT_PHY_CTL_FAMILY(phy));
2152 val &= ~COMMON_RESET_DIS;
2153 I915_WRITE(BXT_PHY_CTL_FAMILY(phy), val);
2154}
2155
2156void broxton_ddi_phy_uninit(struct drm_device *dev)
2157{
2158 struct drm_i915_private *dev_priv = dev->dev_private;
2159
2160 broxton_phy_uninit(dev_priv, DPIO_PHY1);
2161 broxton_phy_uninit(dev_priv, DPIO_PHY0);
2162
2163 /* FIXME: do this in broxton_phy_uninit per phy */
2164 I915_WRITE(BXT_P_CR_GT_DISP_PWRON, 0);
2165}
2166
dfb82408
S
2167static const char * const bxt_ddi_pll_names[] = {
2168 "PORT PLL A",
2169 "PORT PLL B",
2170 "PORT PLL C",
2171};
2172
2173static void bxt_ddi_pll_enable(struct drm_i915_private *dev_priv,
2174 struct intel_shared_dpll *pll)
2175{
2176 uint32_t temp;
2177 enum port port = (enum port)pll->id; /* 1:1 port->PLL mapping */
2178
2179 temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
2180 temp &= ~PORT_PLL_REF_SEL;
2181 /* Non-SSC reference */
2182 I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
2183
2184 /* Disable 10 bit clock */
2185 temp = I915_READ(BXT_PORT_PLL_EBB_4(port));
2186 temp &= ~PORT_PLL_10BIT_CLK_ENABLE;
2187 I915_WRITE(BXT_PORT_PLL_EBB_4(port), temp);
2188
2189 /* Write P1 & P2 */
2190 temp = I915_READ(BXT_PORT_PLL_EBB_0(port));
2191 temp &= ~(PORT_PLL_P1_MASK | PORT_PLL_P2_MASK);
2192 temp |= pll->config.hw_state.ebb0;
2193 I915_WRITE(BXT_PORT_PLL_EBB_0(port), temp);
2194
2195 /* Write M2 integer */
2196 temp = I915_READ(BXT_PORT_PLL(port, 0));
2197 temp &= ~PORT_PLL_M2_MASK;
2198 temp |= pll->config.hw_state.pll0;
2199 I915_WRITE(BXT_PORT_PLL(port, 0), temp);
2200
2201 /* Write N */
2202 temp = I915_READ(BXT_PORT_PLL(port, 1));
2203 temp &= ~PORT_PLL_N_MASK;
2204 temp |= pll->config.hw_state.pll1;
2205 I915_WRITE(BXT_PORT_PLL(port, 1), temp);
2206
2207 /* Write M2 fraction */
2208 temp = I915_READ(BXT_PORT_PLL(port, 2));
2209 temp &= ~PORT_PLL_M2_FRAC_MASK;
2210 temp |= pll->config.hw_state.pll2;
2211 I915_WRITE(BXT_PORT_PLL(port, 2), temp);
2212
2213 /* Write M2 fraction enable */
2214 temp = I915_READ(BXT_PORT_PLL(port, 3));
2215 temp &= ~PORT_PLL_M2_FRAC_ENABLE;
2216 temp |= pll->config.hw_state.pll3;
2217 I915_WRITE(BXT_PORT_PLL(port, 3), temp);
2218
2219 /* Write coeff */
2220 temp = I915_READ(BXT_PORT_PLL(port, 6));
2221 temp &= ~PORT_PLL_PROP_COEFF_MASK;
2222 temp &= ~PORT_PLL_INT_COEFF_MASK;
2223 temp &= ~PORT_PLL_GAIN_CTL_MASK;
2224 temp |= pll->config.hw_state.pll6;
2225 I915_WRITE(BXT_PORT_PLL(port, 6), temp);
2226
2227 /* Write calibration val */
2228 temp = I915_READ(BXT_PORT_PLL(port, 8));
2229 temp &= ~PORT_PLL_TARGET_CNT_MASK;
2230 temp |= pll->config.hw_state.pll8;
2231 I915_WRITE(BXT_PORT_PLL(port, 8), temp);
2232
2233 /*
2234 * FIXME: program PORT_PLL_9/i_lockthresh according to the latest
2235 * specification update.
2236 */
2237
2238 /* Recalibrate with new settings */
2239 temp = I915_READ(BXT_PORT_PLL_EBB_4(port));
2240 temp |= PORT_PLL_RECALIBRATE;
2241 I915_WRITE(BXT_PORT_PLL_EBB_4(port), temp);
2242 /* Enable 10 bit clock */
2243 temp |= PORT_PLL_10BIT_CLK_ENABLE;
2244 I915_WRITE(BXT_PORT_PLL_EBB_4(port), temp);
2245
2246 /* Enable PLL */
2247 temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
2248 temp |= PORT_PLL_ENABLE;
2249 I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
2250 POSTING_READ(BXT_PORT_PLL_ENABLE(port));
2251
2252 if (wait_for_atomic_us((I915_READ(BXT_PORT_PLL_ENABLE(port)) &
2253 PORT_PLL_LOCK), 200))
2254 DRM_ERROR("PLL %d not locked\n", port);
2255
2256 /*
2257 * While we write to the group register to program all lanes at once we
2258 * can read only lane registers and we pick lanes 0/1 for that.
2259 */
2260 temp = I915_READ(BXT_PORT_PCS_DW12_LN01(port));
2261 temp &= ~LANE_STAGGER_MASK;
2262 temp &= ~LANESTAGGER_STRAP_OVRD;
2263 temp |= pll->config.hw_state.pcsdw12;
2264 I915_WRITE(BXT_PORT_PCS_DW12_GRP(port), temp);
2265}
2266
2267static void bxt_ddi_pll_disable(struct drm_i915_private *dev_priv,
2268 struct intel_shared_dpll *pll)
2269{
2270 enum port port = (enum port)pll->id; /* 1:1 port->PLL mapping */
2271 uint32_t temp;
2272
2273 temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
2274 temp &= ~PORT_PLL_ENABLE;
2275 I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
2276 POSTING_READ(BXT_PORT_PLL_ENABLE(port));
2277}
2278
2279static bool bxt_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
2280 struct intel_shared_dpll *pll,
2281 struct intel_dpll_hw_state *hw_state)
2282{
2283 enum port port = (enum port)pll->id; /* 1:1 port->PLL mapping */
2284 uint32_t val;
2285
2286 if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
2287 return false;
2288
2289 val = I915_READ(BXT_PORT_PLL_ENABLE(port));
2290 if (!(val & PORT_PLL_ENABLE))
2291 return false;
2292
2293 hw_state->ebb0 = I915_READ(BXT_PORT_PLL_EBB_0(port));
2294 hw_state->pll0 = I915_READ(BXT_PORT_PLL(port, 0));
2295 hw_state->pll1 = I915_READ(BXT_PORT_PLL(port, 1));
2296 hw_state->pll2 = I915_READ(BXT_PORT_PLL(port, 2));
2297 hw_state->pll3 = I915_READ(BXT_PORT_PLL(port, 3));
2298 hw_state->pll6 = I915_READ(BXT_PORT_PLL(port, 6));
2299 hw_state->pll8 = I915_READ(BXT_PORT_PLL(port, 8));
2300 /*
2301 * While we write to the group register to program all lanes at once we
2302 * can read only lane registers. We configure all lanes the same way, so
2303 * here just read out lanes 0/1 and output a note if lanes 2/3 differ.
2304 */
2305 hw_state->pcsdw12 = I915_READ(BXT_PORT_PCS_DW12_LN01(port));
2306 if (I915_READ(BXT_PORT_PCS_DW12_LN23(port) != hw_state->pcsdw12))
2307 DRM_DEBUG_DRIVER("lane stagger config different for lane 01 (%08x) and 23 (%08x)\n",
2308 hw_state->pcsdw12,
2309 I915_READ(BXT_PORT_PCS_DW12_LN23(port)));
2310
2311 return true;
2312}
2313
2314static void bxt_shared_dplls_init(struct drm_i915_private *dev_priv)
2315{
2316 int i;
2317
2318 dev_priv->num_shared_dpll = 3;
2319
2320 for (i = 0; i < dev_priv->num_shared_dpll; i++) {
2321 dev_priv->shared_dplls[i].id = i;
2322 dev_priv->shared_dplls[i].name = bxt_ddi_pll_names[i];
2323 dev_priv->shared_dplls[i].disable = bxt_ddi_pll_disable;
2324 dev_priv->shared_dplls[i].enable = bxt_ddi_pll_enable;
2325 dev_priv->shared_dplls[i].get_hw_state =
2326 bxt_ddi_pll_get_hw_state;
2327 }
2328}
2329
143b307c
DL
2330void intel_ddi_pll_init(struct drm_device *dev)
2331{
2332 struct drm_i915_private *dev_priv = dev->dev_private;
2333 uint32_t val = I915_READ(LCPLL_CTL);
2334
d1a2dc78
S
2335 if (IS_SKYLAKE(dev))
2336 skl_shared_dplls_init(dev_priv);
dfb82408
S
2337 else if (IS_BROXTON(dev))
2338 bxt_shared_dplls_init(dev_priv);
d1a2dc78
S
2339 else
2340 hsw_shared_dplls_init(dev_priv);
79f689aa 2341
b2b877ff 2342 DRM_DEBUG_KMS("CDCLK running at %dKHz\n",
1652d19e 2343 dev_priv->display.get_display_clock_speed(dev));
79f689aa 2344
121643c2
S
2345 if (IS_SKYLAKE(dev)) {
2346 if (!(I915_READ(LCPLL1_CTL) & LCPLL_PLL_ENABLE))
2347 DRM_ERROR("LCPLL1 is disabled\n");
f8437dd1
VK
2348 } else if (IS_BROXTON(dev)) {
2349 broxton_init_cdclk(dev);
5c6706e5 2350 broxton_ddi_phy_init(dev);
121643c2
S
2351 } else {
2352 /*
2353 * The LCPLL register should be turned on by the BIOS. For now
2354 * let's just check its state and print errors in case
2355 * something is wrong. Don't even try to turn it on.
2356 */
2357
2358 if (val & LCPLL_CD_SOURCE_FCLK)
2359 DRM_ERROR("CDCLK source is not LCPLL\n");
79f689aa 2360
121643c2
S
2361 if (val & LCPLL_PLL_DISABLE)
2362 DRM_ERROR("LCPLL is disabled\n");
2363 }
79f689aa 2364}
c19b0669
PZ
2365
2366void intel_ddi_prepare_link_retrain(struct drm_encoder *encoder)
2367{
174edf1f
PZ
2368 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
2369 struct intel_dp *intel_dp = &intel_dig_port->dp;
c19b0669 2370 struct drm_i915_private *dev_priv = encoder->dev->dev_private;
174edf1f 2371 enum port port = intel_dig_port->port;
c19b0669 2372 uint32_t val;
f3e227df 2373 bool wait = false;
c19b0669
PZ
2374
2375 if (I915_READ(DP_TP_CTL(port)) & DP_TP_CTL_ENABLE) {
2376 val = I915_READ(DDI_BUF_CTL(port));
2377 if (val & DDI_BUF_CTL_ENABLE) {
2378 val &= ~DDI_BUF_CTL_ENABLE;
2379 I915_WRITE(DDI_BUF_CTL(port), val);
2380 wait = true;
2381 }
2382
2383 val = I915_READ(DP_TP_CTL(port));
2384 val &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
2385 val |= DP_TP_CTL_LINK_TRAIN_PAT1;
2386 I915_WRITE(DP_TP_CTL(port), val);
2387 POSTING_READ(DP_TP_CTL(port));
2388
2389 if (wait)
2390 intel_wait_ddi_buf_idle(dev_priv, port);
2391 }
2392
0e32b39c 2393 val = DP_TP_CTL_ENABLE |
c19b0669 2394 DP_TP_CTL_LINK_TRAIN_PAT1 | DP_TP_CTL_SCRAMBLE_DISABLE;
0e32b39c
DA
2395 if (intel_dp->is_mst)
2396 val |= DP_TP_CTL_MODE_MST;
2397 else {
2398 val |= DP_TP_CTL_MODE_SST;
2399 if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
2400 val |= DP_TP_CTL_ENHANCED_FRAME_ENABLE;
2401 }
c19b0669
PZ
2402 I915_WRITE(DP_TP_CTL(port), val);
2403 POSTING_READ(DP_TP_CTL(port));
2404
2405 intel_dp->DP |= DDI_BUF_CTL_ENABLE;
2406 I915_WRITE(DDI_BUF_CTL(port), intel_dp->DP);
2407 POSTING_READ(DDI_BUF_CTL(port));
2408
2409 udelay(600);
2410}
00c09d70 2411
1ad960f2
PZ
2412void intel_ddi_fdi_disable(struct drm_crtc *crtc)
2413{
2414 struct drm_i915_private *dev_priv = crtc->dev->dev_private;
2415 struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
2416 uint32_t val;
2417
2418 intel_ddi_post_disable(intel_encoder);
2419
2420 val = I915_READ(_FDI_RXA_CTL);
2421 val &= ~FDI_RX_ENABLE;
2422 I915_WRITE(_FDI_RXA_CTL, val);
2423
2424 val = I915_READ(_FDI_RXA_MISC);
2425 val &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
2426 val |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2);
2427 I915_WRITE(_FDI_RXA_MISC, val);
2428
2429 val = I915_READ(_FDI_RXA_CTL);
2430 val &= ~FDI_PCDCLK;
2431 I915_WRITE(_FDI_RXA_CTL, val);
2432
2433 val = I915_READ(_FDI_RXA_CTL);
2434 val &= ~FDI_RX_PLL_ENABLE;
2435 I915_WRITE(_FDI_RXA_CTL, val);
2436}
2437
00c09d70
PZ
2438static void intel_ddi_hot_plug(struct intel_encoder *intel_encoder)
2439{
0e32b39c
DA
2440 struct intel_digital_port *intel_dig_port = enc_to_dig_port(&intel_encoder->base);
2441 int type = intel_dig_port->base.type;
2442
2443 if (type != INTEL_OUTPUT_DISPLAYPORT &&
2444 type != INTEL_OUTPUT_EDP &&
2445 type != INTEL_OUTPUT_UNKNOWN) {
2446 return;
2447 }
00c09d70 2448
0e32b39c 2449 intel_dp_hot_plug(intel_encoder);
00c09d70
PZ
2450}
2451
6801c18c 2452void intel_ddi_get_config(struct intel_encoder *encoder,
5cec258b 2453 struct intel_crtc_state *pipe_config)
045ac3b5
JB
2454{
2455 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
2456 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
0cb09a97 2457 enum transcoder cpu_transcoder = pipe_config->cpu_transcoder;
bbd440fb 2458 struct intel_hdmi *intel_hdmi;
045ac3b5
JB
2459 u32 temp, flags = 0;
2460
2461 temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
2462 if (temp & TRANS_DDI_PHSYNC)
2463 flags |= DRM_MODE_FLAG_PHSYNC;
2464 else
2465 flags |= DRM_MODE_FLAG_NHSYNC;
2466 if (temp & TRANS_DDI_PVSYNC)
2467 flags |= DRM_MODE_FLAG_PVSYNC;
2468 else
2469 flags |= DRM_MODE_FLAG_NVSYNC;
2470
2d112de7 2471 pipe_config->base.adjusted_mode.flags |= flags;
42571aef
VS
2472
2473 switch (temp & TRANS_DDI_BPC_MASK) {
2474 case TRANS_DDI_BPC_6:
2475 pipe_config->pipe_bpp = 18;
2476 break;
2477 case TRANS_DDI_BPC_8:
2478 pipe_config->pipe_bpp = 24;
2479 break;
2480 case TRANS_DDI_BPC_10:
2481 pipe_config->pipe_bpp = 30;
2482 break;
2483 case TRANS_DDI_BPC_12:
2484 pipe_config->pipe_bpp = 36;
2485 break;
2486 default:
2487 break;
2488 }
eb14cb74
VS
2489
2490 switch (temp & TRANS_DDI_MODE_SELECT_MASK) {
2491 case TRANS_DDI_MODE_SELECT_HDMI:
6897b4b5 2492 pipe_config->has_hdmi_sink = true;
bbd440fb
DV
2493 intel_hdmi = enc_to_intel_hdmi(&encoder->base);
2494
2495 if (intel_hdmi->infoframe_enabled(&encoder->base))
2496 pipe_config->has_infoframe = true;
cbc572a9 2497 break;
eb14cb74
VS
2498 case TRANS_DDI_MODE_SELECT_DVI:
2499 case TRANS_DDI_MODE_SELECT_FDI:
2500 break;
2501 case TRANS_DDI_MODE_SELECT_DP_SST:
2502 case TRANS_DDI_MODE_SELECT_DP_MST:
2503 pipe_config->has_dp_encoder = true;
2504 intel_dp_get_m_n(intel_crtc, pipe_config);
2505 break;
2506 default:
2507 break;
2508 }
10214420 2509
f458ebbc 2510 if (intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_AUDIO)) {
a60551b1 2511 temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
82910ac6 2512 if (temp & AUDIO_OUTPUT_ENABLE(intel_crtc->pipe))
a60551b1
PZ
2513 pipe_config->has_audio = true;
2514 }
9ed109a7 2515
10214420
DV
2516 if (encoder->type == INTEL_OUTPUT_EDP && dev_priv->vbt.edp_bpp &&
2517 pipe_config->pipe_bpp > dev_priv->vbt.edp_bpp) {
2518 /*
2519 * This is a big fat ugly hack.
2520 *
2521 * Some machines in UEFI boot mode provide us a VBT that has 18
2522 * bpp and 1.62 GHz link bandwidth for eDP, which for reasons
2523 * unknown we fail to light up. Yet the same BIOS boots up with
2524 * 24 bpp and 2.7 GHz link. Use the same bpp as the BIOS uses as
2525 * max, not what it tells us to use.
2526 *
2527 * Note: This will still be broken if the eDP panel is not lit
2528 * up by the BIOS, and thus we can't get the mode at module
2529 * load.
2530 */
2531 DRM_DEBUG_KMS("pipe has %d bpp for eDP panel, overriding BIOS-provided max %d bpp\n",
2532 pipe_config->pipe_bpp, dev_priv->vbt.edp_bpp);
2533 dev_priv->vbt.edp_bpp = pipe_config->pipe_bpp;
2534 }
11578553 2535
22606a18 2536 intel_ddi_clock_get(encoder, pipe_config);
045ac3b5
JB
2537}
2538
00c09d70
PZ
2539static void intel_ddi_destroy(struct drm_encoder *encoder)
2540{
2541 /* HDMI has nothing special to destroy, so we can go with this. */
2542 intel_dp_encoder_destroy(encoder);
2543}
2544
5bfe2ac0 2545static bool intel_ddi_compute_config(struct intel_encoder *encoder,
5cec258b 2546 struct intel_crtc_state *pipe_config)
00c09d70 2547{
5bfe2ac0 2548 int type = encoder->type;
eccb140b 2549 int port = intel_ddi_get_encoder_port(encoder);
00c09d70 2550
5bfe2ac0 2551 WARN(type == INTEL_OUTPUT_UNKNOWN, "compute_config() on unknown output!\n");
00c09d70 2552
eccb140b
DV
2553 if (port == PORT_A)
2554 pipe_config->cpu_transcoder = TRANSCODER_EDP;
2555
00c09d70 2556 if (type == INTEL_OUTPUT_HDMI)
5bfe2ac0 2557 return intel_hdmi_compute_config(encoder, pipe_config);
00c09d70 2558 else
5bfe2ac0 2559 return intel_dp_compute_config(encoder, pipe_config);
00c09d70
PZ
2560}
2561
2562static const struct drm_encoder_funcs intel_ddi_funcs = {
2563 .destroy = intel_ddi_destroy,
2564};
2565
4a28ae58
PZ
2566static struct intel_connector *
2567intel_ddi_init_dp_connector(struct intel_digital_port *intel_dig_port)
2568{
2569 struct intel_connector *connector;
2570 enum port port = intel_dig_port->port;
2571
9bdbd0b9 2572 connector = intel_connector_alloc();
4a28ae58
PZ
2573 if (!connector)
2574 return NULL;
2575
2576 intel_dig_port->dp.output_reg = DDI_BUF_CTL(port);
2577 if (!intel_dp_init_connector(intel_dig_port, connector)) {
2578 kfree(connector);
2579 return NULL;
2580 }
2581
2582 return connector;
2583}
2584
2585static struct intel_connector *
2586intel_ddi_init_hdmi_connector(struct intel_digital_port *intel_dig_port)
2587{
2588 struct intel_connector *connector;
2589 enum port port = intel_dig_port->port;
2590
9bdbd0b9 2591 connector = intel_connector_alloc();
4a28ae58
PZ
2592 if (!connector)
2593 return NULL;
2594
2595 intel_dig_port->hdmi.hdmi_reg = DDI_BUF_CTL(port);
2596 intel_hdmi_init_connector(intel_dig_port, connector);
2597
2598 return connector;
2599}
2600
00c09d70
PZ
2601void intel_ddi_init(struct drm_device *dev, enum port port)
2602{
876a8cdf 2603 struct drm_i915_private *dev_priv = dev->dev_private;
00c09d70
PZ
2604 struct intel_digital_port *intel_dig_port;
2605 struct intel_encoder *intel_encoder;
2606 struct drm_encoder *encoder;
311a2094
PZ
2607 bool init_hdmi, init_dp;
2608
2609 init_hdmi = (dev_priv->vbt.ddi_port_info[port].supports_dvi ||
2610 dev_priv->vbt.ddi_port_info[port].supports_hdmi);
2611 init_dp = dev_priv->vbt.ddi_port_info[port].supports_dp;
2612 if (!init_dp && !init_hdmi) {
f68d697e 2613 DRM_DEBUG_KMS("VBT says port %c is not DVI/HDMI/DP compatible, assuming it is\n",
311a2094
PZ
2614 port_name(port));
2615 init_hdmi = true;
2616 init_dp = true;
2617 }
00c09d70 2618
b14c5679 2619 intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
00c09d70
PZ
2620 if (!intel_dig_port)
2621 return;
2622
00c09d70
PZ
2623 intel_encoder = &intel_dig_port->base;
2624 encoder = &intel_encoder->base;
2625
2626 drm_encoder_init(dev, encoder, &intel_ddi_funcs,
2627 DRM_MODE_ENCODER_TMDS);
00c09d70 2628
5bfe2ac0 2629 intel_encoder->compute_config = intel_ddi_compute_config;
00c09d70
PZ
2630 intel_encoder->enable = intel_enable_ddi;
2631 intel_encoder->pre_enable = intel_ddi_pre_enable;
2632 intel_encoder->disable = intel_disable_ddi;
2633 intel_encoder->post_disable = intel_ddi_post_disable;
2634 intel_encoder->get_hw_state = intel_ddi_get_hw_state;
045ac3b5 2635 intel_encoder->get_config = intel_ddi_get_config;
00c09d70
PZ
2636
2637 intel_dig_port->port = port;
bcf53de4
SM
2638 intel_dig_port->saved_port_bits = I915_READ(DDI_BUF_CTL(port)) &
2639 (DDI_BUF_PORT_REVERSAL |
2640 DDI_A_4_LANES);
00c09d70
PZ
2641
2642 intel_encoder->type = INTEL_OUTPUT_UNKNOWN;
f68d697e 2643 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
bc079e8b 2644 intel_encoder->cloneable = 0;
00c09d70
PZ
2645 intel_encoder->hot_plug = intel_ddi_hot_plug;
2646
f68d697e
CW
2647 if (init_dp) {
2648 if (!intel_ddi_init_dp_connector(intel_dig_port))
2649 goto err;
13cf5504 2650
f68d697e
CW
2651 intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
2652 dev_priv->hpd_irq_port[port] = intel_dig_port;
2653 }
21a8e6a4 2654
311a2094
PZ
2655 /* In theory we don't need the encoder->type check, but leave it just in
2656 * case we have some really bad VBTs... */
f68d697e
CW
2657 if (intel_encoder->type != INTEL_OUTPUT_EDP && init_hdmi) {
2658 if (!intel_ddi_init_hdmi_connector(intel_dig_port))
2659 goto err;
21a8e6a4 2660 }
f68d697e
CW
2661
2662 return;
2663
2664err:
2665 drm_encoder_cleanup(encoder);
2666 kfree(intel_dig_port);
00c09d70 2667}
This page took 0.3568 seconds and 5 git commands to generate.