blob: 43b38d76761cf84079ea20a62ea33311a8d802ae [file] [log] [blame]
Eugeni Dodonov45244b82012-05-09 15:37:20 -03001/*
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
Jani Nikula10122052014-08-27 16:27:30 +030031struct ddi_buf_trans {
32 u32 trans1; /* balance leg enable, de-emph level */
33 u32 trans2; /* vref sel, vswing */
34};
35
Eugeni Dodonov45244b82012-05-09 15:37:20 -030036/* 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 */
Jani Nikula10122052014-08-27 16:27:30 +030040static 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 },
Eugeni Dodonov45244b82012-05-09 15:37:20 -030050};
51
Jani Nikula10122052014-08-27 16:27:30 +030052static 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 },
Paulo Zanoni6acab152013-09-12 17:06:24 -030062};
63
Jani Nikula10122052014-08-27 16:27:30 +030064static 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 */
Eugeni Dodonov45244b82012-05-09 15:37:20 -030078};
79
Jani Nikula10122052014-08-27 16:27:30 +030080static 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 },
Paulo Zanoni300644c2013-11-02 21:07:42 -070090};
91
Jani Nikula10122052014-08-27 16:27:30 +030092static const struct ddi_buf_trans bdw_ddi_translations_dp[] = {
93 { 0x00FFFFFF, 0x0007000E },
94 { 0x00D75FFF, 0x000E000A },
95 { 0x00BEFFFF, 0x00140006 },
96 { 0x80B2CFFF, 0x001B0002 },
97 { 0x00FFFFFF, 0x000E000A },
Rodrigo Vivi17b523b2014-09-24 20:32:43 -040098 { 0x00DB6FFF, 0x00160005 },
Rodrigo Vivi6805b2a2014-09-25 12:28:32 -040099 { 0x80C71FFF, 0x001A0002 },
Jani Nikula10122052014-08-27 16:27:30 +0300100 { 0x00F7DFFF, 0x00180004 },
101 { 0x80D75FFF, 0x001B0002 },
Art Runyane58623c2013-11-02 21:07:41 -0700102};
103
Jani Nikula10122052014-08-27 16:27:30 +0300104static 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 },
Art Runyane58623c2013-11-02 21:07:41 -0700114};
115
Jani Nikula10122052014-08-27 16:27:30 +0300116static 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 */
Damien Lespiaua26aa8b2014-08-01 11:07:55 +0100128};
129
Damien Lespiau7f88e3a2013-12-03 13:56:25 +0000130static const struct ddi_buf_trans skl_ddi_translations_dp[] = {
Damien Lespiau6c930682014-11-26 13:37:26 +0000131 { 0x00000018, 0x000000a2 },
132 { 0x00004014, 0x0000009B },
Damien Lespiau7f88e3a2013-12-03 13:56:25 +0000133 { 0x00006012, 0x00000088 },
Damien Lespiau6c930682014-11-26 13:37:26 +0000134 { 0x00008010, 0x00000087 },
135 { 0x00000018, 0x0000009B },
Damien Lespiau7f88e3a2013-12-03 13:56:25 +0000136 { 0x00004014, 0x00000088 },
Damien Lespiau6c930682014-11-26 13:37:26 +0000137 { 0x00006012, 0x00000087 },
Damien Lespiau7f88e3a2013-12-03 13:56:25 +0000138 { 0x00000018, 0x00000088 },
Damien Lespiau6c930682014-11-26 13:37:26 +0000139 { 0x00004014, 0x00000087 },
Damien Lespiau7f88e3a2013-12-03 13:56:25 +0000140};
141
Sonika Jindal7ad14a22015-02-25 10:29:12 +0530142/* 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
Damien Lespiau7f88e3a2013-12-03 13:56:25 +0000157static const struct ddi_buf_trans skl_ddi_translations_hdmi[] = {
Sonika Jindalb7192a52015-04-15 11:02:33 +0530158 { 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 },
Damien Lespiau7f88e3a2013-12-03 13:56:25 +0000169};
170
Jani Nikula20f4dbe2013-08-30 19:40:28 +0300171enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder)
Paulo Zanonifc914632012-10-05 12:05:54 -0300172{
Paulo Zanoni0bdee302012-10-15 15:51:38 -0300173 struct drm_encoder *encoder = &intel_encoder->base;
Paulo Zanonifc914632012-10-05 12:05:54 -0300174 int type = intel_encoder->type;
175
Dave Airlie0e32b392014-05-02 14:02:48 +1000176 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 ||
Paulo Zanoni00c09d72012-10-26 19:05:52 -0200180 type == INTEL_OUTPUT_HDMI || type == INTEL_OUTPUT_UNKNOWN) {
Paulo Zanoni174edf12012-10-26 19:05:50 -0200181 struct intel_digital_port *intel_dig_port =
182 enc_to_dig_port(encoder);
183 return intel_dig_port->port;
Paulo Zanoni0bdee302012-10-15 15:51:38 -0300184
Paulo Zanonifc914632012-10-05 12:05:54 -0300185 } else if (type == INTEL_OUTPUT_ANALOG) {
186 return PORT_E;
Paulo Zanoni0bdee302012-10-15 15:51:38 -0300187
Paulo Zanonifc914632012-10-05 12:05:54 -0300188 } else {
189 DRM_ERROR("Invalid DDI encoder type %d\n", type);
190 BUG();
191 }
192}
193
Damien Lespiauce3b7e92014-08-04 15:04:43 +0100194static 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
Art Runyane58623c2013-11-02 21:07:41 -0700200/*
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,
Eugeni Dodonov45244b82012-05-09 15:37:20 -0300203 * 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 */
Damien Lespiaub4037452014-08-04 22:01:33 +0100207static void intel_prepare_ddi_buffers(struct drm_device *dev,
208 struct intel_digital_port *intel_dig_port)
Eugeni Dodonov45244b82012-05-09 15:37:20 -0300209{
210 struct drm_i915_private *dev_priv = dev->dev_private;
211 u32 reg;
Damien Lespiaub4037452014-08-04 22:01:33 +0100212 int port = intel_dig_port->port;
Damien Lespiau7ff44672015-03-02 16:19:36 +0000213 int i, n_hdmi_entries, n_dp_entries, n_edp_entries, hdmi_default_entry,
Sonika Jindal7ad14a22015-02-25 10:29:12 +0530214 size;
Paulo Zanoni6acab152013-09-12 17:06:24 -0300215 int hdmi_level = dev_priv->vbt.ddi_port_info[port].hdmi_level_shift;
Jani Nikula10122052014-08-27 16:27:30 +0300216 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;
Art Runyane58623c2013-11-02 21:07:41 -0700221
Damien Lespiau7f88e3a2013-12-03 13:56:25 +0000222 if (IS_SKYLAKE(dev)) {
223 ddi_translations_fdi = NULL;
224 ddi_translations_dp = skl_ddi_translations_dp;
Sonika Jindal7ad14a22015-02-25 10:29:12 +0530225 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
Damien Lespiau7f88e3a2013-12-03 13:56:25 +0000234 ddi_translations_hdmi = skl_ddi_translations_hdmi;
235 n_hdmi_entries = ARRAY_SIZE(skl_ddi_translations_hdmi);
Sonika Jindalb7192a52015-04-15 11:02:33 +0530236 hdmi_default_entry = 7;
Damien Lespiau7f88e3a2013-12-03 13:56:25 +0000237 } else if (IS_BROADWELL(dev)) {
Art Runyane58623c2013-11-02 21:07:41 -0700238 ddi_translations_fdi = bdw_ddi_translations_fdi;
239 ddi_translations_dp = bdw_ddi_translations_dp;
Paulo Zanoni300644c2013-11-02 21:07:42 -0700240 ddi_translations_edp = bdw_ddi_translations_edp;
Damien Lespiaua26aa8b2014-08-01 11:07:55 +0100241 ddi_translations_hdmi = bdw_ddi_translations_hdmi;
Sonika Jindal7ad14a22015-02-25 10:29:12 +0530242 n_edp_entries = ARRAY_SIZE(bdw_ddi_translations_edp);
243 n_dp_entries = ARRAY_SIZE(bdw_ddi_translations_dp);
Jani Nikula10122052014-08-27 16:27:30 +0300244 n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
Damien Lespiau7ff44672015-03-02 16:19:36 +0000245 hdmi_default_entry = 7;
Art Runyane58623c2013-11-02 21:07:41 -0700246 } else if (IS_HASWELL(dev)) {
247 ddi_translations_fdi = hsw_ddi_translations_fdi;
248 ddi_translations_dp = hsw_ddi_translations_dp;
Paulo Zanoni300644c2013-11-02 21:07:42 -0700249 ddi_translations_edp = hsw_ddi_translations_dp;
Damien Lespiaua26aa8b2014-08-01 11:07:55 +0100250 ddi_translations_hdmi = hsw_ddi_translations_hdmi;
Sonika Jindal7ad14a22015-02-25 10:29:12 +0530251 n_dp_entries = n_edp_entries = ARRAY_SIZE(hsw_ddi_translations_dp);
Jani Nikula10122052014-08-27 16:27:30 +0300252 n_hdmi_entries = ARRAY_SIZE(hsw_ddi_translations_hdmi);
Damien Lespiau7ff44672015-03-02 16:19:36 +0000253 hdmi_default_entry = 6;
Art Runyane58623c2013-11-02 21:07:41 -0700254 } else {
255 WARN(1, "ddi translation table missing\n");
Paulo Zanoni300644c2013-11-02 21:07:42 -0700256 ddi_translations_edp = bdw_ddi_translations_dp;
Art Runyane58623c2013-11-02 21:07:41 -0700257 ddi_translations_fdi = bdw_ddi_translations_fdi;
258 ddi_translations_dp = bdw_ddi_translations_dp;
Damien Lespiaua26aa8b2014-08-01 11:07:55 +0100259 ddi_translations_hdmi = bdw_ddi_translations_hdmi;
Sonika Jindal7ad14a22015-02-25 10:29:12 +0530260 n_edp_entries = ARRAY_SIZE(bdw_ddi_translations_edp);
261 n_dp_entries = ARRAY_SIZE(bdw_ddi_translations_dp);
Jani Nikula10122052014-08-27 16:27:30 +0300262 n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
Damien Lespiau7ff44672015-03-02 16:19:36 +0000263 hdmi_default_entry = 7;
Art Runyane58623c2013-11-02 21:07:41 -0700264 }
265
Paulo Zanoni300644c2013-11-02 21:07:42 -0700266 switch (port) {
267 case PORT_A:
268 ddi_translations = ddi_translations_edp;
Sonika Jindal7ad14a22015-02-25 10:29:12 +0530269 size = n_edp_entries;
Paulo Zanoni300644c2013-11-02 21:07:42 -0700270 break;
271 case PORT_B:
272 case PORT_C:
Paulo Zanoni300644c2013-11-02 21:07:42 -0700273 ddi_translations = ddi_translations_dp;
Sonika Jindal7ad14a22015-02-25 10:29:12 +0530274 size = n_dp_entries;
Paulo Zanoni300644c2013-11-02 21:07:42 -0700275 break;
Paulo Zanoni77d8d002013-11-02 21:07:45 -0700276 case PORT_D:
Sonika Jindal7ad14a22015-02-25 10:29:12 +0530277 if (intel_dp_is_edp(dev, PORT_D)) {
Paulo Zanoni77d8d002013-11-02 21:07:45 -0700278 ddi_translations = ddi_translations_edp;
Sonika Jindal7ad14a22015-02-25 10:29:12 +0530279 size = n_edp_entries;
280 } else {
Paulo Zanoni77d8d002013-11-02 21:07:45 -0700281 ddi_translations = ddi_translations_dp;
Sonika Jindal7ad14a22015-02-25 10:29:12 +0530282 size = n_dp_entries;
283 }
Paulo Zanoni77d8d002013-11-02 21:07:45 -0700284 break;
Paulo Zanoni300644c2013-11-02 21:07:42 -0700285 case PORT_E:
Damien Lespiau7f88e3a2013-12-03 13:56:25 +0000286 if (ddi_translations_fdi)
287 ddi_translations = ddi_translations_fdi;
288 else
289 ddi_translations = ddi_translations_dp;
Sonika Jindal7ad14a22015-02-25 10:29:12 +0530290 size = n_dp_entries;
Paulo Zanoni300644c2013-11-02 21:07:42 -0700291 break;
292 default:
293 BUG();
294 }
Eugeni Dodonov45244b82012-05-09 15:37:20 -0300295
Sonika Jindal7ad14a22015-02-25 10:29:12 +0530296 for (i = 0, reg = DDI_BUF_TRANS(port); i < size; i++) {
Jani Nikula10122052014-08-27 16:27:30 +0300297 I915_WRITE(reg, ddi_translations[i].trans1);
298 reg += 4;
299 I915_WRITE(reg, ddi_translations[i].trans2);
Eugeni Dodonov45244b82012-05-09 15:37:20 -0300300 reg += 4;
301 }
Damien Lespiauce4dd492014-08-01 11:07:54 +0100302
Damien Lespiauce3b7e92014-08-04 15:04:43 +0100303 if (!intel_dig_port_supports_hdmi(intel_dig_port))
304 return;
305
Damien Lespiauce4dd492014-08-01 11:07:54 +0100306 /* Choose a good default if VBT is badly populated */
307 if (hdmi_level == HDMI_LEVEL_SHIFT_UNKNOWN ||
308 hdmi_level >= n_hdmi_entries)
Damien Lespiau7ff44672015-03-02 16:19:36 +0000309 hdmi_level = hdmi_default_entry;
Damien Lespiauce4dd492014-08-01 11:07:54 +0100310
Paulo Zanoni6acab152013-09-12 17:06:24 -0300311 /* Entry 9 is for HDMI: */
Jani Nikula10122052014-08-27 16:27:30 +0300312 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;
Eugeni Dodonov45244b82012-05-09 15:37:20 -0300316}
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{
Damien Lespiaub4037452014-08-04 22:01:33 +0100323 struct intel_digital_port *intel_dig_port;
324 bool visited[I915_MAX_PORTS] = { 0, };
Eugeni Dodonov45244b82012-05-09 15:37:20 -0300325
Paulo Zanoni0d536cb2012-11-23 16:46:41 -0200326 if (!HAS_DDI(dev))
327 return;
Eugeni Dodonov45244b82012-05-09 15:37:20 -0300328
Damien Lespiaub4037452014-08-04 22:01:33 +0100329 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 }
Eugeni Dodonov45244b82012-05-09 15:37:20 -0300336}
Eugeni Dodonovc82e4d22012-05-09 15:37:21 -0300337
Paulo Zanoni248138b2012-11-29 11:29:31 -0200338static 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
Vandana Kannan3449ca82015-03-27 14:19:09 +0200344 for (i = 0; i < 16; i++) {
Paulo Zanoni248138b2012-11-29 11:29:31 -0200345 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}
Eugeni Dodonovc82e4d22012-05-09 15:37:21 -0300351
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);
Paulo Zanoni04945642012-11-01 21:00:59 -0200366 u32 temp, i, rx_ctl_val;
Eugeni Dodonovc82e4d22012-05-09 15:37:21 -0300367
Paulo Zanoni04945642012-11-01 21:00:59 -0200368 /* 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
Damien Lespiau8693a822013-05-03 18:48:11 +0100372 *
373 * WaFDIAutoLinkSetTimingOverrride:hsw
Paulo Zanoni04945642012-11-01 21:00:59 -0200374 */
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 */
Damien Lespiau3e683202012-12-11 18:48:29 +0000380 rx_ctl_val = dev_priv->fdi_rx_config | FDI_RX_ENHANCE_FRAME_ENABLE |
Daniel Vetter33d29b12013-02-13 18:04:45 +0100381 FDI_RX_PLL_ENABLE |
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +0200382 FDI_DP_PORT_WIDTH(intel_crtc->config->fdi_lanes);
Paulo Zanoni04945642012-11-01 21:00:59 -0200383 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 */
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +0200392 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);
Paulo Zanoni04945642012-11-01 21:00:59 -0200394
395 /* Start the training iterating through available voltages and emphasis,
396 * testing each value twice. */
Jani Nikula10122052014-08-27 16:27:30 +0300397 for (i = 0; i < ARRAY_SIZE(hsw_ddi_translations_fdi) * 2; i++) {
Eugeni Dodonovc82e4d22012-05-09 15:37:21 -0300398 /* 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
Damien Lespiau876a8cd2012-12-11 18:48:30 +0000405 /* 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 */
Eugeni Dodonovc82e4d22012-05-09 15:37:21 -0300409 I915_WRITE(DDI_BUF_CTL(PORT_E),
Paulo Zanoni04945642012-11-01 21:00:59 -0200410 DDI_BUF_CTL_ENABLE |
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +0200411 ((intel_crtc->config->fdi_lanes - 1) << 1) |
Sonika Jindalc5fe6a02014-08-11 08:57:36 +0530412 DDI_BUF_TRANS_SELECT(i / 2));
Paulo Zanoni04945642012-11-01 21:00:59 -0200413 POSTING_READ(DDI_BUF_CTL(PORT_E));
Eugeni Dodonovc82e4d22012-05-09 15:37:21 -0300414
415 udelay(600);
416
Paulo Zanoni04945642012-11-01 21:00:59 -0200417 /* Program PCH FDI Receiver TU */
418 I915_WRITE(_FDI_RXA_TUSIZE1, TU_SIZE(64));
Eugeni Dodonov4acf5182012-07-04 20:15:16 -0300419
Paulo Zanoni04945642012-11-01 21:00:59 -0200420 /* 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);
Eugeni Dodonovc82e4d22012-05-09 15:37:21 -0300436
437 temp = I915_READ(DP_TP_STATUS(PORT_E));
438 if (temp & DP_TP_STATUS_AUTOTRAIN_DONE) {
Paulo Zanoni04945642012-11-01 21:00:59 -0200439 DRM_DEBUG_KMS("FDI link training done on step %d\n", i);
Eugeni Dodonovc82e4d22012-05-09 15:37:21 -0300440
441 /* Enable normal pixel sending for FDI */
442 I915_WRITE(DP_TP_CTL(PORT_E),
Paulo Zanoni04945642012-11-01 21:00:59 -0200443 DP_TP_CTL_FDI_AUTOTRAIN |
444 DP_TP_CTL_LINK_TRAIN_NORMAL |
445 DP_TP_CTL_ENHANCED_FRAME_ENABLE |
446 DP_TP_CTL_ENABLE);
Eugeni Dodonovc82e4d22012-05-09 15:37:21 -0300447
Paulo Zanoni04945642012-11-01 21:00:59 -0200448 return;
Eugeni Dodonovc82e4d22012-05-09 15:37:21 -0300449 }
Paulo Zanoni04945642012-11-01 21:00:59 -0200450
Paulo Zanoni248138b2012-11-29 11:29:31 -0200451 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
Paulo Zanoni04945642012-11-01 21:00:59 -0200456 /* Disable DP_TP_CTL and FDI_RX_CTL and retry */
Paulo Zanoni248138b2012-11-29 11:29:31 -0200457 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);
Paulo Zanoni04945642012-11-01 21:00:59 -0200464
465 rx_ctl_val &= ~FDI_RX_ENABLE;
466 I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
Paulo Zanoni248138b2012-11-29 11:29:31 -0200467 POSTING_READ(_FDI_RXA_CTL);
Paulo Zanoni04945642012-11-01 21:00:59 -0200468
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);
Paulo Zanoni248138b2012-11-29 11:29:31 -0200474 POSTING_READ(_FDI_RXA_MISC);
Eugeni Dodonovc82e4d22012-05-09 15:37:21 -0300475 }
476
Paulo Zanoni04945642012-11-01 21:00:59 -0200477 DRM_ERROR("FDI link training failed!\n");
Eugeni Dodonovc82e4d22012-05-09 15:37:21 -0300478}
Eugeni Dodonov0e72a5b2012-05-09 15:37:27 -0300479
Dave Airlie44905a22014-05-02 13:36:43 +1000480void 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 |
Sonika Jindalc5fe6a02014-08-11 08:57:36 +0530487 DDI_BUF_CTL_ENABLE | DDI_BUF_TRANS_SELECT(0);
Dave Airlie44905a22014-05-02 13:36:43 +1000488 intel_dp->DP |= DDI_PORT_WIDTH(intel_dp->lane_count);
489
490}
491
Paulo Zanoni8d9ddbc2012-10-05 12:05:53 -0300492static 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)
Ville Syrjälä84f44ce2013-04-17 17:48:49 +0300506 WARN(1, "%d encoders on crtc for pipe %c\n", num_encoders,
507 pipe_name(intel_crtc->pipe));
Paulo Zanoni8d9ddbc2012-10-05 12:05:53 -0300508
509 BUG_ON(ret == NULL);
510 return ret;
511}
512
Satheeshakrishna Mbcddf612014-08-22 09:49:10 +0530513struct intel_encoder *
Ander Conselvan de Oliveira3165c072015-03-20 16:18:12 +0200514intel_ddi_get_crtc_new_encoder(struct intel_crtc_state *crtc_state)
Ander Conselvan de Oliveirad0737e12014-10-29 11:32:30 +0200515{
Ander Conselvan de Oliveira3165c072015-03-20 16:18:12 +0200516 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
517 struct intel_encoder *ret = NULL;
518 struct drm_atomic_state *state;
Ander Conselvan de Oliveirad0737e12014-10-29 11:32:30 +0200519 int num_encoders = 0;
Ander Conselvan de Oliveira3165c072015-03-20 16:18:12 +0200520 int i;
Ander Conselvan de Oliveirad0737e12014-10-29 11:32:30 +0200521
Ander Conselvan de Oliveira3165c072015-03-20 16:18:12 +0200522 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++;
Ander Conselvan de Oliveirad0737e12014-10-29 11:32:30 +0200531 }
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
Damien Lespiau1c0b85c2013-05-10 14:01:51 +0100540#define LC_FREQ 2700
Damien Lespiau27893392014-09-04 12:27:23 +0100541#define LC_FREQ_2K U64_C(LC_FREQ * 2000)
Damien Lespiau1c0b85c2013-05-10 14:01:51 +0100542
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
Damien Lespiau27893392014-09-04 12:27:23 +0100553#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); })
Damien Lespiau1c0b85c2013-05-10 14:01:51 +0100558
559struct wrpll_rnp {
560 unsigned p, n2, r2;
561};
562
563static unsigned wrpll_get_budget_for_freq(int clock)
Paulo Zanoni6441ab52012-10-05 12:05:58 -0300564{
Damien Lespiau1c0b85c2013-05-10 14:01:51 +0100565 unsigned budget;
Paulo Zanoni6441ab52012-10-05 12:05:58 -0300566
Damien Lespiau1c0b85c2013-05-10 14:01:51 +0100567 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 }
Paulo Zanoni6441ab52012-10-05 12:05:58 -0300633
Damien Lespiau1c0b85c2013-05-10 14:01:51 +0100634 return budget;
635}
Paulo Zanoni6441ab52012-10-05 12:05:58 -0300636
Damien Lespiau1c0b85c2013-05-10 14:01:51 +0100637static 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;
Paulo Zanoni6441ab52012-10-05 12:05:58 -0300642
Damien Lespiau1c0b85c2013-05-10 14:01:51 +0100643 /* 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 }
Paulo Zanoni6441ab52012-10-05 12:05:58 -0300650
Damien Lespiau1c0b85c2013-05-10 14:01:51 +0100651 /*
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;
Damien Lespiau27893392014-09-04 12:27:23 +0100667 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);
Damien Lespiau1c0b85c2013-05-10 14:01:51 +0100670 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
Jesse Barnes11578552014-01-21 12:42:10 -0800696static 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);
Daniel Vetter114fe482014-06-25 22:01:48 +0300704 switch (wrpll & WRPLL_PLL_REF_MASK) {
705 case WRPLL_PLL_SSC:
706 case WRPLL_PLL_NON_SSC:
Jesse Barnes11578552014-01-21 12:42:10 -0800707 /*
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;
Daniel Vetter114fe482014-06-25 22:01:48 +0300714 case WRPLL_PLL_LCPLL:
Jesse Barnes11578552014-01-21 12:42:10 -0800715 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
Jesse Barnes20f0ec12014-01-22 12:58:04 -0800726 /* Convert to KHz, p & r have a fixed point portion */
727 return (refclk * n * 100) / (p * r);
Jesse Barnes11578552014-01-21 12:42:10 -0800728}
729
Satheeshakrishna M540e7322014-11-13 14:55:16 +0000730static 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,
Ander Conselvan de Oliveira5cec2582015-01-15 14:55:21 +0200792 struct intel_crtc_state *pipe_config)
Satheeshakrishna M540e7322014-11-13 14:55:16 +0000793{
794 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
Satheeshakrishna M540e7322014-11-13 14:55:16 +0000795 int link_clock = 0;
796 uint32_t dpll_ctl1, dpll;
797
Damien Lespiau134ffa42014-11-14 17:24:34 +0000798 dpll = pipe_config->ddi_pll_sel;
Satheeshakrishna M540e7322014-11-13 14:55:16 +0000799
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;
Sonika Jindala8f3ef62015-03-05 10:02:30 +0530812 case DPLL_CRTL1_LINK_RATE_1080:
813 link_clock = 108000;
814 break;
Satheeshakrishna M540e7322014-11-13 14:55:16 +0000815 case DPLL_CRTL1_LINK_RATE_1350:
816 link_clock = 135000;
817 break;
Sonika Jindala8f3ef62015-03-05 10:02:30 +0530818 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;
Satheeshakrishna M540e7322014-11-13 14:55:16 +0000824 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)
Ander Conselvan de Oliveira2d112de2015-01-15 14:55:22 +0200837 pipe_config->base.adjusted_mode.crtc_clock =
Satheeshakrishna M540e7322014-11-13 14:55:16 +0000838 intel_dotclock_calculate(pipe_config->port_clock,
839 &pipe_config->dp_m_n);
840 else
Ander Conselvan de Oliveira2d112de2015-01-15 14:55:22 +0200841 pipe_config->base.adjusted_mode.crtc_clock = pipe_config->port_clock;
Satheeshakrishna M540e7322014-11-13 14:55:16 +0000842}
843
Daniel Vetter3d51278a2014-07-29 20:57:08 +0200844static void hsw_ddi_clock_get(struct intel_encoder *encoder,
Ander Conselvan de Oliveira5cec2582015-01-15 14:55:21 +0200845 struct intel_crtc_state *pipe_config)
Jesse Barnes11578552014-01-21 12:42:10 -0800846{
847 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
Jesse Barnes11578552014-01-21 12:42:10 -0800848 int link_clock = 0;
849 u32 val, pll;
850
Daniel Vetter26804af2014-06-25 22:01:55 +0300851 val = pipe_config->ddi_pll_sel;
Jesse Barnes11578552014-01-21 12:42:10 -0800852 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)
Ander Conselvan de Oliveira2d112de2015-01-15 14:55:22 +0200889 pipe_config->base.adjusted_mode.crtc_clock =
Jesse Barnes11578552014-01-21 12:42:10 -0800890 intel_dotclock_calculate(pipe_config->port_clock,
891 &pipe_config->fdi_m_n);
892 else if (pipe_config->has_dp_encoder)
Ander Conselvan de Oliveira2d112de2015-01-15 14:55:22 +0200893 pipe_config->base.adjusted_mode.crtc_clock =
Jesse Barnes11578552014-01-21 12:42:10 -0800894 intel_dotclock_calculate(pipe_config->port_clock,
895 &pipe_config->dp_m_n);
896 else
Ander Conselvan de Oliveira2d112de2015-01-15 14:55:22 +0200897 pipe_config->base.adjusted_mode.crtc_clock = pipe_config->port_clock;
Jesse Barnes11578552014-01-21 12:42:10 -0800898}
899
Satheeshakrishna M977bb382014-08-22 09:49:12 +0530900static 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
Daniel Vetter3d51278a2014-07-29 20:57:08 +0200926void intel_ddi_clock_get(struct intel_encoder *encoder,
Ander Conselvan de Oliveira5cec2582015-01-15 14:55:21 +0200927 struct intel_crtc_state *pipe_config)
Daniel Vetter3d51278a2014-07-29 20:57:08 +0200928{
Damien Lespiau22606a12014-12-12 14:26:57 +0000929 struct drm_device *dev = encoder->base.dev;
930
931 if (INTEL_INFO(dev)->gen <= 8)
932 hsw_ddi_clock_get(encoder, pipe_config);
Satheeshakrishna M977bb382014-08-22 09:49:12 +0530933 else if (IS_SKYLAKE(dev))
Damien Lespiau22606a12014-12-12 14:26:57 +0000934 skl_ddi_clock_get(encoder, pipe_config);
Satheeshakrishna M977bb382014-08-22 09:49:12 +0530935 else if (IS_BROXTON(dev))
936 bxt_ddi_clock_get(encoder, pipe_config);
Daniel Vetter3d51278a2014-07-29 20:57:08 +0200937}
938
Damien Lespiau1c0b85c2013-05-10 14:01:51 +0100939static void
Damien Lespiaud664c0c2014-07-29 18:06:23 +0100940hsw_ddi_calculate_wrpll(int clock /* in Hz */,
941 unsigned *r2_out, unsigned *n2_out, unsigned *p_out)
Damien Lespiau1c0b85c2013-05-10 14:01:51 +0100942{
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 }
998
999 *n2_out = best.n2;
1000 *p_out = best.p;
1001 *r2_out = best.r2;
Paulo Zanoni6441ab52012-10-05 12:05:58 -03001002}
1003
Damien Lespiau0220ab62014-07-29 18:06:22 +01001004static bool
Damien Lespiaud664c0c2014-07-29 18:06:23 +01001005hsw_ddi_pll_select(struct intel_crtc *intel_crtc,
Ander Conselvan de Oliveira190f68c2015-01-15 14:55:23 +02001006 struct intel_crtc_state *crtc_state,
Damien Lespiaud664c0c2014-07-29 18:06:23 +01001007 struct intel_encoder *intel_encoder,
1008 int clock)
Paulo Zanoni6441ab52012-10-05 12:05:58 -03001009{
Damien Lespiaud664c0c2014-07-29 18:06:23 +01001010 if (intel_encoder->type == INTEL_OUTPUT_HDMI) {
Daniel Vettere0b01be2014-06-25 22:02:01 +03001011 struct intel_shared_dpll *pll;
Daniel Vetter716c2e52014-06-25 22:02:02 +03001012 uint32_t val;
Damien Lespiau1c0b85c2013-05-10 14:01:51 +01001013 unsigned p, n2, r2;
Paulo Zanoni6441ab52012-10-05 12:05:58 -03001014
Damien Lespiaud664c0c2014-07-29 18:06:23 +01001015 hsw_ddi_calculate_wrpll(clock * 1000, &r2, &n2, &p);
Paulo Zanoni6441ab52012-10-05 12:05:58 -03001016
Daniel Vetter114fe482014-06-25 22:01:48 +03001017 val = WRPLL_PLL_ENABLE | WRPLL_PLL_LCPLL |
Paulo Zanoni6441ab52012-10-05 12:05:58 -03001018 WRPLL_DIVIDER_REFERENCE(r2) | WRPLL_DIVIDER_FEEDBACK(n2) |
1019 WRPLL_DIVIDER_POST(p);
1020
Ander Conselvan de Oliveira190f68c2015-01-15 14:55:23 +02001021 crtc_state->dpll_hw_state.wrpll = val;
Daniel Vetter716c2e52014-06-25 22:02:02 +03001022
Ander Conselvan de Oliveira190f68c2015-01-15 14:55:23 +02001023 pll = intel_get_shared_dpll(intel_crtc, crtc_state);
Daniel Vetter716c2e52014-06-25 22:02:02 +03001024 if (pll == NULL) {
1025 DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
1026 pipe_name(intel_crtc->pipe));
Paulo Zanoni06940012013-10-30 18:27:43 -02001027 return false;
1028 }
1029
Ander Conselvan de Oliveira190f68c2015-01-15 14:55:23 +02001030 crtc_state->ddi_pll_sel = PORT_CLK_SEL_WRPLL(pll->id);
Paulo Zanoni6441ab52012-10-05 12:05:58 -03001031 }
1032
Paulo Zanoni6441ab52012-10-05 12:05:58 -03001033 return true;
1034}
1035
Satheeshakrishna M82d35432014-11-13 14:55:20 +00001036struct 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 */
Damien Lespiau21318cc2014-11-14 14:20:27 +00001051 uint64_t dco_central_freq[3] = {8400000000ULL,
1052 9000000000ULL,
1053 9600000000ULL};
Satheeshakrishna M82d35432014-11-13 14:55:20 +00001054 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]) {
Damien Lespiau21318cc2014-11-14 14:20:27 +00001126 case 9600000000ULL:
Satheeshakrishna M82d35432014-11-13 14:55:20 +00001127 wrpll_params->central_freq = 0;
1128 break;
Damien Lespiau21318cc2014-11-14 14:20:27 +00001129 case 9000000000ULL:
Satheeshakrishna M82d35432014-11-13 14:55:20 +00001130 wrpll_params->central_freq = 1;
1131 break;
Damien Lespiau21318cc2014-11-14 14:20:27 +00001132 case 8400000000ULL:
Satheeshakrishna M82d35432014-11-13 14:55:20 +00001133 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,
Ander Conselvan de Oliveira190f68c2015-01-15 14:55:23 +02001193 struct intel_crtc_state *crtc_state,
Satheeshakrishna M82d35432014-11-13 14:55:20 +00001194 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
Ander Conselvan de Oliveira190f68c2015-01-15 14:55:23 +02001243 crtc_state->dpll_hw_state.ctrl1 = ctrl1;
1244 crtc_state->dpll_hw_state.cfgcr1 = cfgcr1;
1245 crtc_state->dpll_hw_state.cfgcr2 = cfgcr2;
Satheeshakrishna M82d35432014-11-13 14:55:20 +00001246
Ander Conselvan de Oliveira190f68c2015-01-15 14:55:23 +02001247 pll = intel_get_shared_dpll(intel_crtc, crtc_state);
Satheeshakrishna M82d35432014-11-13 14:55:20 +00001248 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 */
Ander Conselvan de Oliveira190f68c2015-01-15 14:55:23 +02001255 crtc_state->ddi_pll_sel = pll->id + 1;
Satheeshakrishna M82d35432014-11-13 14:55:20 +00001256
1257 return true;
1258}
Damien Lespiau0220ab62014-07-29 18:06:22 +01001259
Satheeshakrishna Md683f3b2014-08-22 09:49:08 +05301260/* 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
Damien Lespiau0220ab62014-07-29 18:06:22 +01001386/*
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 */
Ander Conselvan de Oliveira190f68c2015-01-15 14:55:23 +02001393bool intel_ddi_pll_select(struct intel_crtc *intel_crtc,
1394 struct intel_crtc_state *crtc_state)
Damien Lespiau0220ab62014-07-29 18:06:22 +01001395{
Satheeshakrishna M82d35432014-11-13 14:55:20 +00001396 struct drm_device *dev = intel_crtc->base.dev;
Ander Conselvan de Oliveirad0737e12014-10-29 11:32:30 +02001397 struct intel_encoder *intel_encoder =
Ander Conselvan de Oliveira3165c072015-03-20 16:18:12 +02001398 intel_ddi_get_crtc_new_encoder(crtc_state);
Ander Conselvan de Oliveira190f68c2015-01-15 14:55:23 +02001399 int clock = crtc_state->port_clock;
Damien Lespiau0220ab62014-07-29 18:06:22 +01001400
Satheeshakrishna M82d35432014-11-13 14:55:20 +00001401 if (IS_SKYLAKE(dev))
Ander Conselvan de Oliveira190f68c2015-01-15 14:55:23 +02001402 return skl_ddi_pll_select(intel_crtc, crtc_state,
1403 intel_encoder, clock);
Satheeshakrishna Md683f3b2014-08-22 09:49:08 +05301404 else if (IS_BROXTON(dev))
1405 return bxt_ddi_pll_select(intel_crtc, crtc_state,
1406 intel_encoder, clock);
Satheeshakrishna M82d35432014-11-13 14:55:20 +00001407 else
Ander Conselvan de Oliveira190f68c2015-01-15 14:55:23 +02001408 return hsw_ddi_pll_select(intel_crtc, crtc_state,
1409 intel_encoder, clock);
Damien Lespiau0220ab62014-07-29 18:06:22 +01001410}
1411
Paulo Zanonidae84792012-10-15 15:51:30 -03001412void 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);
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001417 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
Paulo Zanonidae84792012-10-15 15:51:30 -03001418 int type = intel_encoder->type;
1419 uint32_t temp;
1420
Dave Airlie0e32b392014-05-02 14:02:48 +10001421 if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP || type == INTEL_OUTPUT_DP_MST) {
Paulo Zanonic9809792012-10-23 18:30:00 -02001422 temp = TRANS_MSA_SYNC_CLK;
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001423 switch (intel_crtc->config->pipe_bpp) {
Paulo Zanonidae84792012-10-15 15:51:30 -03001424 case 18:
Paulo Zanonic9809792012-10-23 18:30:00 -02001425 temp |= TRANS_MSA_6_BPC;
Paulo Zanonidae84792012-10-15 15:51:30 -03001426 break;
1427 case 24:
Paulo Zanonic9809792012-10-23 18:30:00 -02001428 temp |= TRANS_MSA_8_BPC;
Paulo Zanonidae84792012-10-15 15:51:30 -03001429 break;
1430 case 30:
Paulo Zanonic9809792012-10-23 18:30:00 -02001431 temp |= TRANS_MSA_10_BPC;
Paulo Zanonidae84792012-10-15 15:51:30 -03001432 break;
1433 case 36:
Paulo Zanonic9809792012-10-23 18:30:00 -02001434 temp |= TRANS_MSA_12_BPC;
Paulo Zanonidae84792012-10-15 15:51:30 -03001435 break;
1436 default:
Daniel Vetter4e53c2e2013-03-27 00:44:58 +01001437 BUG();
Paulo Zanonidae84792012-10-15 15:51:30 -03001438 }
Paulo Zanonic9809792012-10-23 18:30:00 -02001439 I915_WRITE(TRANS_MSA_MISC(cpu_transcoder), temp);
Paulo Zanonidae84792012-10-15 15:51:30 -03001440 }
1441}
1442
Dave Airlie0e32b392014-05-02 14:02:48 +10001443void 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;
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001448 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
Dave Airlie0e32b392014-05-02 14:02:48 +10001449 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
Damien Lespiau8228c252013-03-07 15:30:27 +00001458void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc)
Paulo Zanoni8d9ddbc2012-10-05 12:05:53 -03001459{
1460 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1461 struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
Paulo Zanoni7739c332012-10-15 15:51:29 -03001462 struct drm_encoder *encoder = &intel_encoder->base;
Paulo Zanonic7670b12013-11-02 21:07:37 -07001463 struct drm_device *dev = crtc->dev;
1464 struct drm_i915_private *dev_priv = dev->dev_private;
Paulo Zanoni8d9ddbc2012-10-05 12:05:53 -03001465 enum pipe pipe = intel_crtc->pipe;
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001466 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
Paulo Zanoni174edf12012-10-26 19:05:50 -02001467 enum port port = intel_ddi_get_encoder_port(intel_encoder);
Paulo Zanoni7739c332012-10-15 15:51:29 -03001468 int type = intel_encoder->type;
Paulo Zanoni8d9ddbc2012-10-05 12:05:53 -03001469 uint32_t temp;
1470
Paulo Zanoniad80a812012-10-24 16:06:19 -02001471 /* Enable TRANS_DDI_FUNC_CTL for the pipe to work in HDMI mode */
1472 temp = TRANS_DDI_FUNC_ENABLE;
Paulo Zanoni174edf12012-10-26 19:05:50 -02001473 temp |= TRANS_DDI_SELECT_PORT(port);
Paulo Zanonidfcef252012-08-08 14:15:29 -03001474
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001475 switch (intel_crtc->config->pipe_bpp) {
Paulo Zanonidfcef252012-08-08 14:15:29 -03001476 case 18:
Paulo Zanoniad80a812012-10-24 16:06:19 -02001477 temp |= TRANS_DDI_BPC_6;
Paulo Zanonidfcef252012-08-08 14:15:29 -03001478 break;
1479 case 24:
Paulo Zanoniad80a812012-10-24 16:06:19 -02001480 temp |= TRANS_DDI_BPC_8;
Paulo Zanonidfcef252012-08-08 14:15:29 -03001481 break;
1482 case 30:
Paulo Zanoniad80a812012-10-24 16:06:19 -02001483 temp |= TRANS_DDI_BPC_10;
Paulo Zanonidfcef252012-08-08 14:15:29 -03001484 break;
1485 case 36:
Paulo Zanoniad80a812012-10-24 16:06:19 -02001486 temp |= TRANS_DDI_BPC_12;
Paulo Zanonidfcef252012-08-08 14:15:29 -03001487 break;
1488 default:
Daniel Vetter4e53c2e2013-03-27 00:44:58 +01001489 BUG();
Paulo Zanonidfcef252012-08-08 14:15:29 -03001490 }
Eugeni Dodonov72662e12012-05-09 15:37:31 -03001491
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001492 if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_PVSYNC)
Paulo Zanoniad80a812012-10-24 16:06:19 -02001493 temp |= TRANS_DDI_PVSYNC;
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001494 if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_PHSYNC)
Paulo Zanoniad80a812012-10-24 16:06:19 -02001495 temp |= TRANS_DDI_PHSYNC;
Paulo Zanonif63eb7c2012-08-08 14:15:28 -03001496
Paulo Zanonie6f0bfc2012-10-23 18:30:04 -02001497 if (cpu_transcoder == TRANSCODER_EDP) {
1498 switch (pipe) {
1499 case PIPE_A:
Paulo Zanonic7670b12013-11-02 21:07:37 -07001500 /* 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). */
Daniel Vetterfabf6e52014-05-29 14:10:22 +02001504 if (IS_HASWELL(dev) &&
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001505 (intel_crtc->config->pch_pfit.enabled ||
1506 intel_crtc->config->pch_pfit.force_thru))
Daniel Vetterd6dd9eb2013-01-29 16:35:20 -02001507 temp |= TRANS_DDI_EDP_INPUT_A_ONOFF;
1508 else
1509 temp |= TRANS_DDI_EDP_INPUT_A_ON;
Paulo Zanonie6f0bfc2012-10-23 18:30:04 -02001510 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
Paulo Zanoni7739c332012-10-15 15:51:29 -03001523 if (type == INTEL_OUTPUT_HDMI) {
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001524 if (intel_crtc->config->has_hdmi_sink)
Paulo Zanoniad80a812012-10-24 16:06:19 -02001525 temp |= TRANS_DDI_MODE_SELECT_HDMI;
Paulo Zanoni8d9ddbc2012-10-05 12:05:53 -03001526 else
Paulo Zanoniad80a812012-10-24 16:06:19 -02001527 temp |= TRANS_DDI_MODE_SELECT_DVI;
Paulo Zanoni8d9ddbc2012-10-05 12:05:53 -03001528
Paulo Zanoni7739c332012-10-15 15:51:29 -03001529 } else if (type == INTEL_OUTPUT_ANALOG) {
Paulo Zanoniad80a812012-10-24 16:06:19 -02001530 temp |= TRANS_DDI_MODE_SELECT_FDI;
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001531 temp |= (intel_crtc->config->fdi_lanes - 1) << 1;
Paulo Zanoni7739c332012-10-15 15:51:29 -03001532
1533 } else if (type == INTEL_OUTPUT_DISPLAYPORT ||
1534 type == INTEL_OUTPUT_EDP) {
1535 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1536
Dave Airlie0e32b392014-05-02 14:02:48 +10001537 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;
Paulo Zanoni7739c332012-10-15 15:51:29 -03001550
Daniel Vetter17aa6be2013-04-30 14:01:40 +02001551 temp |= DDI_PORT_WIDTH(intel_dp->lane_count);
Paulo Zanoni8d9ddbc2012-10-05 12:05:53 -03001552 } else {
Ville Syrjälä84f44ce2013-04-17 17:48:49 +03001553 WARN(1, "Invalid encoder type %d for pipe %c\n",
1554 intel_encoder->type, pipe_name(pipe));
Paulo Zanoni8d9ddbc2012-10-05 12:05:53 -03001555 }
1556
Paulo Zanoniad80a812012-10-24 16:06:19 -02001557 I915_WRITE(TRANS_DDI_FUNC_CTL(cpu_transcoder), temp);
Paulo Zanoni8d9ddbc2012-10-05 12:05:53 -03001558}
1559
Paulo Zanoniad80a812012-10-24 16:06:19 -02001560void intel_ddi_disable_transcoder_func(struct drm_i915_private *dev_priv,
1561 enum transcoder cpu_transcoder)
Paulo Zanoni8d9ddbc2012-10-05 12:05:53 -03001562{
Paulo Zanoniad80a812012-10-24 16:06:19 -02001563 uint32_t reg = TRANS_DDI_FUNC_CTL(cpu_transcoder);
Paulo Zanoni8d9ddbc2012-10-05 12:05:53 -03001564 uint32_t val = I915_READ(reg);
1565
Dave Airlie0e32b392014-05-02 14:02:48 +10001566 val &= ~(TRANS_DDI_FUNC_ENABLE | TRANS_DDI_PORT_MASK | TRANS_DDI_DP_VC_PAYLOAD_ALLOC);
Paulo Zanoniad80a812012-10-24 16:06:19 -02001567 val |= TRANS_DDI_PORT_NONE;
Paulo Zanoni8d9ddbc2012-10-05 12:05:53 -03001568 I915_WRITE(reg, val);
Eugeni Dodonov72662e12012-05-09 15:37:31 -03001569}
1570
Paulo Zanonibcbc8892012-10-26 19:05:51 -02001571bool 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;
Paulo Zanoni882244a2014-04-01 14:55:12 -03001580 enum intel_display_power_domain power_domain;
Paulo Zanonibcbc8892012-10-26 19:05:51 -02001581 uint32_t tmp;
1582
Paulo Zanoni882244a2014-04-01 14:55:12 -03001583 power_domain = intel_display_port_power_domain(intel_encoder);
Daniel Vetterf458ebb2014-09-30 10:56:39 +02001584 if (!intel_display_power_is_enabled(dev_priv, power_domain))
Paulo Zanoni882244a2014-04-01 14:55:12 -03001585 return false;
1586
Paulo Zanonibcbc8892012-10-26 19:05:51 -02001587 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
Daniel Vetter1a240d42012-11-29 22:18:51 +01001593 cpu_transcoder = (enum transcoder) pipe;
Paulo Zanonibcbc8892012-10-26 19:05:51 -02001594
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;
Paulo Zanonibcbc8892012-10-26 19:05:51 -02001605 return (type == DRM_MODE_CONNECTOR_DisplayPort);
Dave Airlie0e32b392014-05-02 14:02:48 +10001606 case TRANS_DDI_MODE_SELECT_DP_MST:
1607 /* if the transcoder is in MST state then
1608 * connector isn't connected */
1609 return false;
Paulo Zanonibcbc8892012-10-26 19:05:51 -02001610
1611 case TRANS_DDI_MODE_SELECT_FDI:
1612 return (type == DRM_MODE_CONNECTOR_VGA);
1613
1614 default:
1615 return false;
1616 }
1617}
1618
Daniel Vetter85234cd2012-07-02 13:27:29 +02001619bool 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;
Paulo Zanonife43d3f2012-10-15 15:51:39 -03001624 enum port port = intel_ddi_get_encoder_port(encoder);
Imre Deak6d129be2014-03-05 16:20:54 +02001625 enum intel_display_power_domain power_domain;
Daniel Vetter85234cd2012-07-02 13:27:29 +02001626 u32 tmp;
1627 int i;
1628
Imre Deak6d129be2014-03-05 16:20:54 +02001629 power_domain = intel_display_port_power_domain(encoder);
Daniel Vetterf458ebb2014-09-30 10:56:39 +02001630 if (!intel_display_power_is_enabled(dev_priv, power_domain))
Imre Deak6d129be2014-03-05 16:20:54 +02001631 return false;
1632
Paulo Zanonife43d3f2012-10-15 15:51:39 -03001633 tmp = I915_READ(DDI_BUF_CTL(port));
Daniel Vetter85234cd2012-07-02 13:27:29 +02001634
1635 if (!(tmp & DDI_BUF_CTL_ENABLE))
1636 return false;
1637
Paulo Zanoniad80a812012-10-24 16:06:19 -02001638 if (port == PORT_A) {
1639 tmp = I915_READ(TRANS_DDI_FUNC_CTL(TRANSCODER_EDP));
Daniel Vetter85234cd2012-07-02 13:27:29 +02001640
Paulo Zanoniad80a812012-10-24 16:06:19 -02001641 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)) {
Dave Airlie0e32b392014-05-02 14:02:48 +10001661 if ((tmp & TRANS_DDI_MODE_SELECT_MASK) == TRANS_DDI_MODE_SELECT_DP_MST)
1662 return false;
1663
Paulo Zanoniad80a812012-10-24 16:06:19 -02001664 *pipe = i;
1665 return true;
1666 }
Daniel Vetter85234cd2012-07-02 13:27:29 +02001667 }
1668 }
1669
Ville Syrjälä84f44ce2013-04-17 17:48:49 +03001670 DRM_DEBUG_KMS("No pipe for ddi port %c found\n", port_name(port));
Daniel Vetter85234cd2012-07-02 13:27:29 +02001671
Jesse Barnes22f9fe52013-04-02 10:03:55 -07001672 return false;
Daniel Vetter85234cd2012-07-02 13:27:29 +02001673}
1674
Paulo Zanonifc914632012-10-05 12:05:54 -03001675void 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);
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001681 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
Paulo Zanonifc914632012-10-05 12:05:54 -03001682
Paulo Zanonibb523fc2012-10-23 18:29:56 -02001683 if (cpu_transcoder != TRANSCODER_EDP)
1684 I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
1685 TRANS_CLK_SEL_PORT(port));
Paulo Zanonifc914632012-10-05 12:05:54 -03001686}
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;
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001691 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
Paulo Zanonifc914632012-10-05 12:05:54 -03001692
Paulo Zanonibb523fc2012-10-23 18:29:56 -02001693 if (cpu_transcoder != TRANSCODER_EDP)
1694 I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
1695 TRANS_CLK_SEL_DISABLED);
Paulo Zanonifc914632012-10-05 12:05:54 -03001696}
1697
Paulo Zanoni00c09d72012-10-26 19:05:52 -02001698static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder)
Paulo Zanoni6441ab52012-10-05 12:05:58 -03001699{
Paulo Zanonic19b0662012-10-15 15:51:41 -03001700 struct drm_encoder *encoder = &intel_encoder->base;
Satheeshakrishna Mefa80ad2014-11-13 14:55:19 +00001701 struct drm_device *dev = encoder->dev;
1702 struct drm_i915_private *dev_priv = dev->dev_private;
Daniel Vetter30cf6db2014-04-24 23:54:58 +02001703 struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
Paulo Zanoni6441ab52012-10-05 12:05:58 -03001704 enum port port = intel_ddi_get_encoder_port(intel_encoder);
Paulo Zanoni82a4d9c2012-10-23 18:30:07 -02001705 int type = intel_encoder->type;
1706
1707 if (type == INTEL_OUTPUT_EDP) {
1708 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
Daniel Vetter4be73782014-01-17 14:39:48 +01001709 intel_edp_panel_on(intel_dp);
Paulo Zanoni82a4d9c2012-10-23 18:30:07 -02001710 }
Paulo Zanoni6441ab52012-10-05 12:05:58 -03001711
Satheeshakrishna Mefa80ad2014-11-13 14:55:19 +00001712 if (IS_SKYLAKE(dev)) {
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001713 uint32_t dpll = crtc->config->ddi_pll_sel;
Satheeshakrishna Mefa80ad2014-11-13 14:55:19 +00001714 uint32_t val;
1715
Damien Lespiau5416d872014-11-14 17:24:33 +00001716 /*
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));
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001728 val |= crtc->config->dpll_hw_state.ctrl1 << (dpll * 6);
Damien Lespiau5416d872014-11-14 17:24:33 +00001729
1730 I915_WRITE(DPLL_CTRL1, val);
1731 POSTING_READ(DPLL_CTRL1);
1732 }
1733
1734 /* DDI -> PLL mapping */
Satheeshakrishna Mefa80ad2014-11-13 14:55:19 +00001735 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);
Damien Lespiau5416d872014-11-14 17:24:33 +00001743
Satheeshakrishna M1ab23382014-08-22 09:49:06 +05301744 } else if (INTEL_INFO(dev)->gen < 9) {
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001745 WARN_ON(crtc->config->ddi_pll_sel == PORT_CLK_SEL_NONE);
1746 I915_WRITE(PORT_CLK_SEL(port), crtc->config->ddi_pll_sel);
Satheeshakrishna Mefa80ad2014-11-13 14:55:19 +00001747 }
Paulo Zanonic19b0662012-10-15 15:51:41 -03001748
Paulo Zanoni82a4d9c2012-10-23 18:30:07 -02001749 if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
Paulo Zanonic19b0662012-10-15 15:51:41 -03001750 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
Daniel Vetter30cf6db2014-04-24 23:54:58 +02001751
Dave Airlie44905a22014-05-02 13:36:43 +10001752 intel_ddi_init_dp_buf_reg(intel_encoder);
Paulo Zanonic19b0662012-10-15 15:51:41 -03001753
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);
Vandana Kannan23f08d82014-11-13 14:55:22 +00001757 if (port != PORT_A || INTEL_INFO(dev)->gen >= 9)
Imre Deak3ab9c632013-05-03 12:57:41 +03001758 intel_dp_stop_link_train(intel_dp);
Daniel Vetter30cf6db2014-04-24 23:54:58 +02001759 } else if (type == INTEL_OUTPUT_HDMI) {
1760 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
1761
1762 intel_hdmi->set_infoframes(encoder,
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001763 crtc->config->has_hdmi_sink,
1764 &crtc->config->base.adjusted_mode);
Paulo Zanonic19b0662012-10-15 15:51:41 -03001765 }
Paulo Zanoni6441ab52012-10-05 12:05:58 -03001766}
1767
Paulo Zanoni00c09d72012-10-26 19:05:52 -02001768static void intel_ddi_post_disable(struct intel_encoder *intel_encoder)
Paulo Zanoni6441ab52012-10-05 12:05:58 -03001769{
1770 struct drm_encoder *encoder = &intel_encoder->base;
Satheeshakrishna Mefa80ad2014-11-13 14:55:19 +00001771 struct drm_device *dev = encoder->dev;
1772 struct drm_i915_private *dev_priv = dev->dev_private;
Paulo Zanoni6441ab52012-10-05 12:05:58 -03001773 enum port port = intel_ddi_get_encoder_port(intel_encoder);
Paulo Zanoni82a4d9c2012-10-23 18:30:07 -02001774 int type = intel_encoder->type;
Paulo Zanoni2886e932012-10-05 12:06:00 -03001775 uint32_t val;
Paulo Zanonia836bdf2012-10-15 15:51:32 -03001776 bool wait = false;
Paulo Zanoni2886e932012-10-05 12:06:00 -03001777
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);
Paulo Zanonia836bdf2012-10-15 15:51:32 -03001782 wait = true;
Paulo Zanoni2886e932012-10-05 12:06:00 -03001783 }
Paulo Zanoni6441ab52012-10-05 12:05:58 -03001784
Paulo Zanonia836bdf2012-10-15 15:51:32 -03001785 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
Jani Nikula76bb80e2013-11-15 15:29:57 +02001793 if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
Paulo Zanoni82a4d9c2012-10-23 18:30:07 -02001794 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
Jani Nikula76bb80e2013-11-15 15:29:57 +02001795 intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
Jani Nikula24f3e092014-03-17 16:43:36 +02001796 intel_edp_panel_vdd_on(intel_dp);
Daniel Vetter4be73782014-01-17 14:39:48 +01001797 intel_edp_panel_off(intel_dp);
Paulo Zanoni82a4d9c2012-10-23 18:30:07 -02001798 }
1799
Satheeshakrishna Mefa80ad2014-11-13 14:55:19 +00001800 if (IS_SKYLAKE(dev))
1801 I915_WRITE(DPLL_CTRL2, (I915_READ(DPLL_CTRL2) |
1802 DPLL_CTRL2_DDI_CLK_OFF(port)));
Satheeshakrishna M1ab23382014-08-22 09:49:06 +05301803 else if (INTEL_INFO(dev)->gen < 9)
Satheeshakrishna Mefa80ad2014-11-13 14:55:19 +00001804 I915_WRITE(PORT_CLK_SEL(port), PORT_CLK_SEL_NONE);
Paulo Zanoni6441ab52012-10-05 12:05:58 -03001805}
1806
Paulo Zanoni00c09d72012-10-26 19:05:52 -02001807static void intel_enable_ddi(struct intel_encoder *intel_encoder)
Eugeni Dodonov72662e12012-05-09 15:37:31 -03001808{
Paulo Zanoni6547fef2012-10-15 15:51:40 -03001809 struct drm_encoder *encoder = &intel_encoder->base;
Wang Xingchao7b9f35a2013-01-22 23:25:25 +08001810 struct drm_crtc *crtc = encoder->crtc;
1811 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Paulo Zanoni6547fef2012-10-15 15:51:40 -03001812 struct drm_device *dev = encoder->dev;
Eugeni Dodonov72662e12012-05-09 15:37:31 -03001813 struct drm_i915_private *dev_priv = dev->dev_private;
Paulo Zanoni6547fef2012-10-15 15:51:40 -03001814 enum port port = intel_ddi_get_encoder_port(intel_encoder);
1815 int type = intel_encoder->type;
Eugeni Dodonov72662e12012-05-09 15:37:31 -03001816
Paulo Zanoni6547fef2012-10-15 15:51:40 -03001817 if (type == INTEL_OUTPUT_HDMI) {
Damien Lespiau876a8cd2012-12-11 18:48:30 +00001818 struct intel_digital_port *intel_dig_port =
1819 enc_to_dig_port(encoder);
1820
Paulo Zanoni6547fef2012-10-15 15:51:40 -03001821 /* 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 */
Damien Lespiau876a8cd2012-12-11 18:48:30 +00001825 I915_WRITE(DDI_BUF_CTL(port),
Stéphane Marchesinbcf53de2013-07-12 13:54:41 -07001826 intel_dig_port->saved_port_bits |
1827 DDI_BUF_CTL_ENABLE);
Paulo Zanonid6c50ff2012-10-23 18:30:06 -02001828 } else if (type == INTEL_OUTPUT_EDP) {
1829 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1830
Vandana Kannan23f08d82014-11-13 14:55:22 +00001831 if (port == PORT_A && INTEL_INFO(dev)->gen < 9)
Imre Deak3ab9c632013-05-03 12:57:41 +03001832 intel_dp_stop_link_train(intel_dp);
1833
Daniel Vetter4be73782014-01-17 14:39:48 +01001834 intel_edp_backlight_on(intel_dp);
Rodrigo Vivi0bc12bc2014-11-14 08:52:28 -08001835 intel_psr_enable(intel_dp);
Vandana Kannanc3955782015-01-22 15:17:40 +05301836 intel_edp_drrs_enable(intel_dp);
Paulo Zanoni6547fef2012-10-15 15:51:40 -03001837 }
Wang Xingchao7b9f35a2013-01-22 23:25:25 +08001838
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001839 if (intel_crtc->config->has_audio) {
Paulo Zanonid45a0bf2014-05-21 17:29:31 -03001840 intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO);
Jani Nikula69bfe1a2014-10-27 16:26:50 +02001841 intel_audio_codec_enable(intel_encoder);
Wang Xingchao7b9f35a2013-01-22 23:25:25 +08001842 }
Daniel Vetter5ab432e2012-06-30 08:59:56 +02001843}
1844
Paulo Zanoni00c09d72012-10-26 19:05:52 -02001845static void intel_disable_ddi(struct intel_encoder *intel_encoder)
Daniel Vetter5ab432e2012-06-30 08:59:56 +02001846{
Paulo Zanonid6c50ff2012-10-23 18:30:06 -02001847 struct drm_encoder *encoder = &intel_encoder->base;
Wang Xingchao7b9f35a2013-01-22 23:25:25 +08001848 struct drm_crtc *crtc = encoder->crtc;
1849 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Paulo Zanonid6c50ff2012-10-23 18:30:06 -02001850 int type = intel_encoder->type;
Wang Xingchao7b9f35a2013-01-22 23:25:25 +08001851 struct drm_device *dev = encoder->dev;
1852 struct drm_i915_private *dev_priv = dev->dev_private;
Paulo Zanonid6c50ff2012-10-23 18:30:06 -02001853
Ander Conselvan de Oliveira6e3c9712015-01-15 14:55:25 +02001854 if (intel_crtc->config->has_audio) {
Jani Nikula69bfe1a2014-10-27 16:26:50 +02001855 intel_audio_codec_disable(intel_encoder);
Paulo Zanonid45a0bf2014-05-21 17:29:31 -03001856 intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO);
1857 }
Paulo Zanoni2831d8422013-03-06 20:03:09 -03001858
Paulo Zanonid6c50ff2012-10-23 18:30:06 -02001859 if (type == INTEL_OUTPUT_EDP) {
1860 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1861
Vandana Kannanc3955782015-01-22 15:17:40 +05301862 intel_edp_drrs_disable(intel_dp);
Rodrigo Vivi0bc12bc2014-11-14 08:52:28 -08001863 intel_psr_disable(intel_dp);
Daniel Vetter4be73782014-01-17 14:39:48 +01001864 intel_edp_backlight_off(intel_dp);
Paulo Zanonid6c50ff2012-10-23 18:30:06 -02001865 }
Eugeni Dodonov72662e12012-05-09 15:37:31 -03001866}
Paulo Zanoni79f689a2012-10-05 12:05:52 -03001867
Daniel Vettere0b01be2014-06-25 22:02:01 +03001868static void hsw_ddi_pll_enable(struct drm_i915_private *dev_priv,
1869 struct intel_shared_dpll *pll)
1870{
Ander Conselvan de Oliveira3e369b72014-10-29 11:32:32 +02001871 I915_WRITE(WRPLL_CTL(pll->id), pll->config.hw_state.wrpll);
Daniel Vettere0b01be2014-06-25 22:02:01 +03001872 POSTING_READ(WRPLL_CTL(pll->id));
1873 udelay(20);
1874}
1875
Daniel Vetter12030432014-06-25 22:02:00 +03001876static 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));
Daniel Vetter12030432014-06-25 22:02:00 +03001882 I915_WRITE(WRPLL_CTL(pll->id), val & ~WRPLL_PLL_ENABLE);
1883 POSTING_READ(WRPLL_CTL(pll->id));
1884}
1885
Daniel Vetterd452c5b2014-07-04 11:27:39 -03001886static 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
Daniel Vetterf458ebb2014-09-30 10:56:39 +02001892 if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
Daniel Vetterd452c5b2014-07-04 11:27:39 -03001893 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
Damien Lespiauca1381b2014-07-15 15:05:33 +01001901static const char * const hsw_ddi_pll_names[] = {
Daniel Vetter9cd86932014-06-25 22:01:57 +03001902 "WRPLL 1",
1903 "WRPLL 2",
1904};
1905
Damien Lespiau143b3072014-07-29 18:06:19 +01001906static void hsw_shared_dplls_init(struct drm_i915_private *dev_priv)
Paulo Zanoni79f689a2012-10-05 12:05:52 -03001907{
Daniel Vetter9cd86932014-06-25 22:01:57 +03001908 int i;
1909
Daniel Vetter716c2e52014-06-25 22:02:02 +03001910 dev_priv->num_shared_dpll = 2;
Daniel Vetter9cd86932014-06-25 22:01:57 +03001911
Daniel Vetter716c2e52014-06-25 22:02:02 +03001912 for (i = 0; i < dev_priv->num_shared_dpll; i++) {
Daniel Vetter9cd86932014-06-25 22:01:57 +03001913 dev_priv->shared_dplls[i].id = i;
1914 dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i];
Daniel Vetter12030432014-06-25 22:02:00 +03001915 dev_priv->shared_dplls[i].disable = hsw_ddi_pll_disable;
Daniel Vettere0b01be2014-06-25 22:02:01 +03001916 dev_priv->shared_dplls[i].enable = hsw_ddi_pll_enable;
Daniel Vetterd452c5b2014-07-04 11:27:39 -03001917 dev_priv->shared_dplls[i].get_hw_state =
1918 hsw_ddi_pll_get_hw_state;
Daniel Vetter9cd86932014-06-25 22:01:57 +03001919 }
Damien Lespiau143b3072014-07-29 18:06:19 +01001920}
1921
Satheeshakrishna Md1a2dc72014-11-13 14:55:18 +00001922static 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
Vandana Kannan5c6706e2014-11-24 13:37:39 +05302043static 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
Satheeshakrishna Mdfb82402014-08-22 09:49:09 +05302167static 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
Damien Lespiau143b3072014-07-29 18:06:19 +01002330void 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
Satheeshakrishna Md1a2dc72014-11-13 14:55:18 +00002335 if (IS_SKYLAKE(dev))
2336 skl_shared_dplls_init(dev_priv);
Satheeshakrishna Mdfb82402014-08-22 09:49:09 +05302337 else if (IS_BROXTON(dev))
2338 bxt_shared_dplls_init(dev_priv);
Satheeshakrishna Md1a2dc72014-11-13 14:55:18 +00002339 else
2340 hsw_shared_dplls_init(dev_priv);
Paulo Zanoni79f689a2012-10-05 12:05:52 -03002341
Paulo Zanonib2b877f2013-05-03 17:23:42 -03002342 DRM_DEBUG_KMS("CDCLK running at %dKHz\n",
Ville Syrjälä1652d192015-03-31 14:12:01 +03002343 dev_priv->display.get_display_clock_speed(dev));
Paulo Zanoni79f689a2012-10-05 12:05:52 -03002344
Satheeshakrishna M121643c2014-11-13 14:55:15 +00002345 if (IS_SKYLAKE(dev)) {
2346 if (!(I915_READ(LCPLL1_CTL) & LCPLL_PLL_ENABLE))
2347 DRM_ERROR("LCPLL1 is disabled\n");
Vandana Kannanf8437dd12014-11-24 13:37:39 +05302348 } else if (IS_BROXTON(dev)) {
2349 broxton_init_cdclk(dev);
Vandana Kannan5c6706e2014-11-24 13:37:39 +05302350 broxton_ddi_phy_init(dev);
Satheeshakrishna M121643c2014-11-13 14:55:15 +00002351 } 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 */
Paulo Zanoni79f689a2012-10-05 12:05:52 -03002357
Satheeshakrishna M121643c2014-11-13 14:55:15 +00002358 if (val & LCPLL_CD_SOURCE_FCLK)
2359 DRM_ERROR("CDCLK source is not LCPLL\n");
2360
2361 if (val & LCPLL_PLL_DISABLE)
2362 DRM_ERROR("LCPLL is disabled\n");
2363 }
Paulo Zanoni79f689a2012-10-05 12:05:52 -03002364}
Paulo Zanonic19b0662012-10-15 15:51:41 -03002365
2366void intel_ddi_prepare_link_retrain(struct drm_encoder *encoder)
2367{
Paulo Zanoni174edf12012-10-26 19:05:50 -02002368 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
2369 struct intel_dp *intel_dp = &intel_dig_port->dp;
Paulo Zanonic19b0662012-10-15 15:51:41 -03002370 struct drm_i915_private *dev_priv = encoder->dev->dev_private;
Paulo Zanoni174edf12012-10-26 19:05:50 -02002371 enum port port = intel_dig_port->port;
Paulo Zanonic19b0662012-10-15 15:51:41 -03002372 uint32_t val;
Syam Sidhardhanf3e227d2013-02-25 04:05:38 +05302373 bool wait = false;
Paulo Zanonic19b0662012-10-15 15:51:41 -03002374
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
Dave Airlie0e32b392014-05-02 14:02:48 +10002393 val = DP_TP_CTL_ENABLE |
Paulo Zanonic19b0662012-10-15 15:51:41 -03002394 DP_TP_CTL_LINK_TRAIN_PAT1 | DP_TP_CTL_SCRAMBLE_DISABLE;
Dave Airlie0e32b392014-05-02 14:02:48 +10002395 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 }
Paulo Zanonic19b0662012-10-15 15:51:41 -03002402 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}
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002411
Paulo Zanoni1ad960f2012-11-01 21:05:05 -02002412void 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
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002438static void intel_ddi_hot_plug(struct intel_encoder *intel_encoder)
2439{
Dave Airlie0e32b392014-05-02 14:02:48 +10002440 struct intel_digital_port *intel_dig_port = enc_to_dig_port(&intel_encoder->base);
2441 int type = intel_dig_port->base.type;
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002442
Dave Airlie0e32b392014-05-02 14:02:48 +10002443 if (type != INTEL_OUTPUT_DISPLAYPORT &&
2444 type != INTEL_OUTPUT_EDP &&
2445 type != INTEL_OUTPUT_UNKNOWN) {
2446 return;
2447 }
2448
2449 intel_dp_hot_plug(intel_encoder);
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002450}
2451
Ville Syrjälä6801c182013-09-24 14:24:05 +03002452void intel_ddi_get_config(struct intel_encoder *encoder,
Ander Conselvan de Oliveira5cec2582015-01-15 14:55:21 +02002453 struct intel_crtc_state *pipe_config)
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002454{
2455 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
2456 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
Ander Conselvan de Oliveira0cb09a92015-01-30 12:17:23 +02002457 enum transcoder cpu_transcoder = pipe_config->cpu_transcoder;
Daniel Vetterbbd440f2014-11-20 22:33:59 +01002458 struct intel_hdmi *intel_hdmi;
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002459 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
Ander Conselvan de Oliveira2d112de2015-01-15 14:55:22 +02002471 pipe_config->base.adjusted_mode.flags |= flags;
Ville Syrjälä42571ae2013-09-06 23:29:00 +03002472
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 }
Ville Syrjäläeb14cb72013-09-10 17:02:54 +03002489
2490 switch (temp & TRANS_DDI_MODE_SELECT_MASK) {
2491 case TRANS_DDI_MODE_SELECT_HDMI:
Daniel Vetter6897b4b2014-04-24 23:54:47 +02002492 pipe_config->has_hdmi_sink = true;
Daniel Vetterbbd440f2014-11-20 22:33:59 +01002493 intel_hdmi = enc_to_intel_hdmi(&encoder->base);
2494
2495 if (intel_hdmi->infoframe_enabled(&encoder->base))
2496 pipe_config->has_infoframe = true;
Jesse Barnescbc572a2014-11-17 13:08:47 -08002497 break;
Ville Syrjäläeb14cb72013-09-10 17:02:54 +03002498 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 }
Daniel Vetter10214422013-11-18 07:38:16 +01002509
Daniel Vetterf458ebb2014-09-30 10:56:39 +02002510 if (intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_AUDIO)) {
Paulo Zanonia60551b2014-05-21 16:23:20 -03002511 temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
Jani Nikula82910ac2014-10-27 16:26:59 +02002512 if (temp & AUDIO_OUTPUT_ENABLE(intel_crtc->pipe))
Paulo Zanonia60551b2014-05-21 16:23:20 -03002513 pipe_config->has_audio = true;
2514 }
Daniel Vetter9ed109a2014-04-24 23:54:52 +02002515
Daniel Vetter10214422013-11-18 07:38:16 +01002516 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 }
Jesse Barnes11578552014-01-21 12:42:10 -08002535
Damien Lespiau22606a12014-12-12 14:26:57 +00002536 intel_ddi_clock_get(encoder, pipe_config);
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002537}
2538
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002539static 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
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01002545static bool intel_ddi_compute_config(struct intel_encoder *encoder,
Ander Conselvan de Oliveira5cec2582015-01-15 14:55:21 +02002546 struct intel_crtc_state *pipe_config)
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002547{
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01002548 int type = encoder->type;
Daniel Vettereccb1402013-05-22 00:50:22 +02002549 int port = intel_ddi_get_encoder_port(encoder);
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002550
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01002551 WARN(type == INTEL_OUTPUT_UNKNOWN, "compute_config() on unknown output!\n");
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002552
Daniel Vettereccb1402013-05-22 00:50:22 +02002553 if (port == PORT_A)
2554 pipe_config->cpu_transcoder = TRANSCODER_EDP;
2555
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002556 if (type == INTEL_OUTPUT_HDMI)
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01002557 return intel_hdmi_compute_config(encoder, pipe_config);
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002558 else
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01002559 return intel_dp_compute_config(encoder, pipe_config);
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002560}
2561
2562static const struct drm_encoder_funcs intel_ddi_funcs = {
2563 .destroy = intel_ddi_destroy,
2564};
2565
Paulo Zanoni4a28ae52013-10-09 13:52:36 -03002566static 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
Ander Conselvan de Oliveira9bdbd0b2015-04-10 10:59:10 +03002572 connector = intel_connector_alloc();
Paulo Zanoni4a28ae52013-10-09 13:52:36 -03002573 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
Ander Conselvan de Oliveira9bdbd0b2015-04-10 10:59:10 +03002591 connector = intel_connector_alloc();
Paulo Zanoni4a28ae52013-10-09 13:52:36 -03002592 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
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002601void intel_ddi_init(struct drm_device *dev, enum port port)
2602{
Damien Lespiau876a8cd2012-12-11 18:48:30 +00002603 struct drm_i915_private *dev_priv = dev->dev_private;
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002604 struct intel_digital_port *intel_dig_port;
2605 struct intel_encoder *intel_encoder;
2606 struct drm_encoder *encoder;
Paulo Zanoni311a2092013-09-12 17:12:18 -03002607 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) {
Chris Wilsonf68d6972014-08-04 07:15:09 +01002613 DRM_DEBUG_KMS("VBT says port %c is not DVI/HDMI/DP compatible, assuming it is\n",
Paulo Zanoni311a2092013-09-12 17:12:18 -03002614 port_name(port));
2615 init_hdmi = true;
2616 init_dp = true;
2617 }
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002618
Daniel Vetterb14c5672013-09-19 12:18:32 +02002619 intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002620 if (!intel_dig_port)
2621 return;
2622
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002623 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);
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002628
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01002629 intel_encoder->compute_config = intel_ddi_compute_config;
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002630 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;
Jesse Barnes045ac3b2013-05-14 17:08:26 -07002635 intel_encoder->get_config = intel_ddi_get_config;
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002636
2637 intel_dig_port->port = port;
Stéphane Marchesinbcf53de2013-07-12 13:54:41 -07002638 intel_dig_port->saved_port_bits = I915_READ(DDI_BUF_CTL(port)) &
2639 (DDI_BUF_PORT_REVERSAL |
2640 DDI_A_4_LANES);
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002641
2642 intel_encoder->type = INTEL_OUTPUT_UNKNOWN;
Chris Wilsonf68d6972014-08-04 07:15:09 +01002643 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
Ville Syrjäläbc079e82014-03-03 16:15:28 +02002644 intel_encoder->cloneable = 0;
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002645 intel_encoder->hot_plug = intel_ddi_hot_plug;
2646
Chris Wilsonf68d6972014-08-04 07:15:09 +01002647 if (init_dp) {
2648 if (!intel_ddi_init_dp_connector(intel_dig_port))
2649 goto err;
Dave Airlie13cf5502014-06-18 11:29:35 +10002650
Chris Wilsonf68d6972014-08-04 07:15:09 +01002651 intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
2652 dev_priv->hpd_irq_port[port] = intel_dig_port;
2653 }
Daniel Vetter21a8e6a2013-04-10 23:28:35 +02002654
Paulo Zanoni311a2092013-09-12 17:12:18 -03002655 /* In theory we don't need the encoder->type check, but leave it just in
2656 * case we have some really bad VBTs... */
Chris Wilsonf68d6972014-08-04 07:15:09 +01002657 if (intel_encoder->type != INTEL_OUTPUT_EDP && init_hdmi) {
2658 if (!intel_ddi_init_hdmi_connector(intel_dig_port))
2659 goto err;
Daniel Vetter21a8e6a2013-04-10 23:28:35 +02002660 }
Chris Wilsonf68d6972014-08-04 07:15:09 +01002661
2662 return;
2663
2664err:
2665 drm_encoder_cleanup(encoder);
2666 kfree(intel_dig_port);
Paulo Zanoni00c09d72012-10-26 19:05:52 -02002667}