intel_ddi.c 70.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
/*
 * Copyright © 2012 Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 * IN THE SOFTWARE.
 *
 * Authors:
 *    Eugeni Dodonov <eugeni.dodonov@intel.com>
 *
 */

#include "i915_drv.h"
#include "intel_drv.h"

31 32 33
struct ddi_buf_trans {
	u32 trans1;	/* balance leg enable, de-emph level */
	u32 trans2;	/* vref sel, vswing */
34
	u8 i_boost;	/* SKL: I_boost; valid: 0x0, 0x1, 0x3, 0x7 */
35 36
};

37 38 39 40
/* HDMI/DVI modes ignore everything but the last 2 items. So we share
 * them for both DP and FDI transports, allowing those ports to
 * automatically adapt to HDMI connections as well
 */
41
static const struct ddi_buf_trans hsw_ddi_translations_dp[] = {
42 43 44 45 46 47 48 49 50
	{ 0x00FFFFFF, 0x0006000E, 0x0 },
	{ 0x00D75FFF, 0x0005000A, 0x0 },
	{ 0x00C30FFF, 0x00040006, 0x0 },
	{ 0x80AAAFFF, 0x000B0000, 0x0 },
	{ 0x00FFFFFF, 0x0005000A, 0x0 },
	{ 0x00D75FFF, 0x000C0004, 0x0 },
	{ 0x80C30FFF, 0x000B0000, 0x0 },
	{ 0x00FFFFFF, 0x00040006, 0x0 },
	{ 0x80D75FFF, 0x000B0000, 0x0 },
51 52
};

53
static const struct ddi_buf_trans hsw_ddi_translations_fdi[] = {
54 55 56 57 58 59 60 61 62
	{ 0x00FFFFFF, 0x0007000E, 0x0 },
	{ 0x00D75FFF, 0x000F000A, 0x0 },
	{ 0x00C30FFF, 0x00060006, 0x0 },
	{ 0x00AAAFFF, 0x001E0000, 0x0 },
	{ 0x00FFFFFF, 0x000F000A, 0x0 },
	{ 0x00D75FFF, 0x00160004, 0x0 },
	{ 0x00C30FFF, 0x001E0000, 0x0 },
	{ 0x00FFFFFF, 0x00060006, 0x0 },
	{ 0x00D75FFF, 0x001E0000, 0x0 },
63 64
};

65 66
static const struct ddi_buf_trans hsw_ddi_translations_hdmi[] = {
					/* Idx	NT mV d	T mV d	db	*/
67 68 69 70 71 72 73 74 75 76 77 78
	{ 0x00FFFFFF, 0x0006000E, 0x0 },/* 0:	400	400	0	*/
	{ 0x00E79FFF, 0x000E000C, 0x0 },/* 1:	400	500	2	*/
	{ 0x00D75FFF, 0x0005000A, 0x0 },/* 2:	400	600	3.5	*/
	{ 0x00FFFFFF, 0x0005000A, 0x0 },/* 3:	600	600	0	*/
	{ 0x00E79FFF, 0x001D0007, 0x0 },/* 4:	600	750	2	*/
	{ 0x00D75FFF, 0x000C0004, 0x0 },/* 5:	600	900	3.5	*/
	{ 0x00FFFFFF, 0x00040006, 0x0 },/* 6:	800	800	0	*/
	{ 0x80E79FFF, 0x00030002, 0x0 },/* 7:	800	1000	2	*/
	{ 0x00FFFFFF, 0x00140005, 0x0 },/* 8:	850	850	0	*/
	{ 0x00FFFFFF, 0x000C0004, 0x0 },/* 9:	900	900	0	*/
	{ 0x00FFFFFF, 0x001C0003, 0x0 },/* 10:	950	950	0	*/
	{ 0x80FFFFFF, 0x00030002, 0x0 },/* 11:	1000	1000	0	*/
79 80
};

81
static const struct ddi_buf_trans bdw_ddi_translations_edp[] = {
82 83 84 85 86 87 88 89 90
	{ 0x00FFFFFF, 0x00000012, 0x0 },
	{ 0x00EBAFFF, 0x00020011, 0x0 },
	{ 0x00C71FFF, 0x0006000F, 0x0 },
	{ 0x00AAAFFF, 0x000E000A, 0x0 },
	{ 0x00FFFFFF, 0x00020011, 0x0 },
	{ 0x00DB6FFF, 0x0005000F, 0x0 },
	{ 0x00BEEFFF, 0x000A000C, 0x0 },
	{ 0x00FFFFFF, 0x0005000F, 0x0 },
	{ 0x00DB6FFF, 0x000A000C, 0x0 },
91 92
};

93
static const struct ddi_buf_trans bdw_ddi_translations_dp[] = {
94 95 96 97 98 99 100 101 102
	{ 0x00FFFFFF, 0x0007000E, 0x0 },
	{ 0x00D75FFF, 0x000E000A, 0x0 },
	{ 0x00BEFFFF, 0x00140006, 0x0 },
	{ 0x80B2CFFF, 0x001B0002, 0x0 },
	{ 0x00FFFFFF, 0x000E000A, 0x0 },
	{ 0x00DB6FFF, 0x00160005, 0x0 },
	{ 0x80C71FFF, 0x001A0002, 0x0 },
	{ 0x00F7DFFF, 0x00180004, 0x0 },
	{ 0x80D75FFF, 0x001B0002, 0x0 },
103 104
};

105
static const struct ddi_buf_trans bdw_ddi_translations_fdi[] = {
106 107 108 109 110 111 112 113 114
	{ 0x00FFFFFF, 0x0001000E, 0x0 },
	{ 0x00D75FFF, 0x0004000A, 0x0 },
	{ 0x00C30FFF, 0x00070006, 0x0 },
	{ 0x00AAAFFF, 0x000C0000, 0x0 },
	{ 0x00FFFFFF, 0x0004000A, 0x0 },
	{ 0x00D75FFF, 0x00090004, 0x0 },
	{ 0x00C30FFF, 0x000C0000, 0x0 },
	{ 0x00FFFFFF, 0x00070006, 0x0 },
	{ 0x00D75FFF, 0x000C0000, 0x0 },
115 116
};

117 118
static const struct ddi_buf_trans bdw_ddi_translations_hdmi[] = {
					/* Idx	NT mV d	T mV df	db	*/
119 120 121 122 123 124 125 126 127 128
	{ 0x00FFFFFF, 0x0007000E, 0x0 },/* 0:	400	400	0	*/
	{ 0x00D75FFF, 0x000E000A, 0x0 },/* 1:	400	600	3.5	*/
	{ 0x00BEFFFF, 0x00140006, 0x0 },/* 2:	400	800	6	*/
	{ 0x00FFFFFF, 0x0009000D, 0x0 },/* 3:	450	450	0	*/
	{ 0x00FFFFFF, 0x000E000A, 0x0 },/* 4:	600	600	0	*/
	{ 0x00D7FFFF, 0x00140006, 0x0 },/* 5:	600	800	2.5	*/
	{ 0x80CB2FFF, 0x001B0002, 0x0 },/* 6:	600	1000	4.5	*/
	{ 0x00FFFFFF, 0x00140006, 0x0 },/* 7:	800	800	0	*/
	{ 0x80E79FFF, 0x001B0002, 0x0 },/* 8:	800	1000	2	*/
	{ 0x80FFFFFF, 0x001B0002, 0x0 },/* 9:	1000	1000	0	*/
129 130
};

131
/* Skylake H and S */
132
static const struct ddi_buf_trans skl_ddi_translations_dp[] = {
133 134 135
	{ 0x00002016, 0x000000A0, 0x0 },
	{ 0x00005012, 0x0000009B, 0x0 },
	{ 0x00007011, 0x00000088, 0x0 },
136
	{ 0x80009010, 0x000000C0, 0x1 },
137 138
	{ 0x00002016, 0x0000009B, 0x0 },
	{ 0x00005012, 0x00000088, 0x0 },
139
	{ 0x80007011, 0x000000C0, 0x1 },
140
	{ 0x00002016, 0x000000DF, 0x0 },
141
	{ 0x80005012, 0x000000C0, 0x1 },
142 143
};

144 145
/* Skylake U */
static const struct ddi_buf_trans skl_u_ddi_translations_dp[] = {
146
	{ 0x0000201B, 0x000000A2, 0x0 },
147
	{ 0x00005012, 0x00000088, 0x0 },
148
	{ 0x80007011, 0x000000CD, 0x0 },
149
	{ 0x80009010, 0x000000C0, 0x1 },
150
	{ 0x0000201B, 0x0000009D, 0x0 },
151 152
	{ 0x80005012, 0x000000C0, 0x1 },
	{ 0x80007011, 0x000000C0, 0x1 },
153
	{ 0x00002016, 0x00000088, 0x0 },
154
	{ 0x80005012, 0x000000C0, 0x1 },
155 156
};

157 158
/* Skylake Y */
static const struct ddi_buf_trans skl_y_ddi_translations_dp[] = {
159 160
	{ 0x00000018, 0x000000A2, 0x0 },
	{ 0x00005012, 0x00000088, 0x0 },
161
	{ 0x80007011, 0x000000CD, 0x0 },
162
	{ 0x80009010, 0x000000C0, 0x3 },
163
	{ 0x00000018, 0x0000009D, 0x0 },
164 165
	{ 0x80005012, 0x000000C0, 0x3 },
	{ 0x80007011, 0x000000C0, 0x3 },
166
	{ 0x00000018, 0x00000088, 0x0 },
167
	{ 0x80005012, 0x000000C0, 0x3 },
168 169 170
};

/*
171
 * Skylake H and S
172 173
 * eDP 1.4 low vswing translation parameters
 */
174
static const struct ddi_buf_trans skl_ddi_translations_edp[] = {
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
	{ 0x00000018, 0x000000A8, 0x0 },
	{ 0x00004013, 0x000000A9, 0x0 },
	{ 0x00007011, 0x000000A2, 0x0 },
	{ 0x00009010, 0x0000009C, 0x0 },
	{ 0x00000018, 0x000000A9, 0x0 },
	{ 0x00006013, 0x000000A2, 0x0 },
	{ 0x00007011, 0x000000A6, 0x0 },
	{ 0x00000018, 0x000000AB, 0x0 },
	{ 0x00007013, 0x0000009F, 0x0 },
	{ 0x00000018, 0x000000DF, 0x0 },
};

/*
 * Skylake U
 * eDP 1.4 low vswing translation parameters
 */
static const struct ddi_buf_trans skl_u_ddi_translations_edp[] = {
	{ 0x00000018, 0x000000A8, 0x0 },
	{ 0x00004013, 0x000000A9, 0x0 },
	{ 0x00007011, 0x000000A2, 0x0 },
	{ 0x00009010, 0x0000009C, 0x0 },
	{ 0x00000018, 0x000000A9, 0x0 },
	{ 0x00006013, 0x000000A2, 0x0 },
	{ 0x00007011, 0x000000A6, 0x0 },
	{ 0x00002016, 0x000000AB, 0x0 },
	{ 0x00005013, 0x0000009F, 0x0 },
	{ 0x00000018, 0x000000DF, 0x0 },
202 203
};

204
/*
205
 * Skylake Y
206 207
 * eDP 1.4 low vswing translation parameters
 */
208
static const struct ddi_buf_trans skl_y_ddi_translations_edp[] = {
209 210 211 212 213 214 215 216 217 218 219
	{ 0x00000018, 0x000000A8, 0x0 },
	{ 0x00004013, 0x000000AB, 0x0 },
	{ 0x00007011, 0x000000A4, 0x0 },
	{ 0x00009010, 0x000000DF, 0x0 },
	{ 0x00000018, 0x000000AA, 0x0 },
	{ 0x00006013, 0x000000A4, 0x0 },
	{ 0x00007011, 0x0000009D, 0x0 },
	{ 0x00000018, 0x000000A0, 0x0 },
	{ 0x00006012, 0x000000DF, 0x0 },
	{ 0x00000018, 0x0000008A, 0x0 },
};
220

221
/* Skylake U, H and S */
222
static const struct ddi_buf_trans skl_ddi_translations_hdmi[] = {
223 224 225 226 227 228
	{ 0x00000018, 0x000000AC, 0x0 },
	{ 0x00005012, 0x0000009D, 0x0 },
	{ 0x00007011, 0x00000088, 0x0 },
	{ 0x00000018, 0x000000A1, 0x0 },
	{ 0x00000018, 0x00000098, 0x0 },
	{ 0x00004013, 0x00000088, 0x0 },
229
	{ 0x80006012, 0x000000CD, 0x1 },
230
	{ 0x00000018, 0x000000DF, 0x0 },
231 232 233
	{ 0x80003015, 0x000000CD, 0x1 },	/* Default */
	{ 0x80003015, 0x000000C0, 0x1 },
	{ 0x80000018, 0x000000C0, 0x1 },
234 235
};

236 237
/* Skylake Y */
static const struct ddi_buf_trans skl_y_ddi_translations_hdmi[] = {
238 239
	{ 0x00000018, 0x000000A1, 0x0 },
	{ 0x00005012, 0x000000DF, 0x0 },
240
	{ 0x80007011, 0x000000CB, 0x3 },
241 242 243
	{ 0x00000018, 0x000000A4, 0x0 },
	{ 0x00000018, 0x0000009D, 0x0 },
	{ 0x00004013, 0x00000080, 0x0 },
244
	{ 0x80006013, 0x000000C0, 0x3 },
245
	{ 0x00000018, 0x0000008A, 0x0 },
246 247 248
	{ 0x80003015, 0x000000C0, 0x3 },	/* Default */
	{ 0x80003015, 0x000000C0, 0x3 },
	{ 0x80000018, 0x000000C0, 0x3 },
249 250
};

251 252 253 254 255 256 257 258 259 260
struct bxt_ddi_buf_trans {
	u32 margin;	/* swing value */
	u32 scale;	/* scale value */
	u32 enable;	/* scale enable */
	u32 deemphasis;
	bool default_index; /* true if the entry represents default value */
};

static const struct bxt_ddi_buf_trans bxt_ddi_translations_dp[] = {
					/* Idx	NT mV diff	db  */
261 262 263 264 265 266 267 268 269
	{ 52,  0x9A, 0, 128, true  },	/* 0:	400		0   */
	{ 78,  0x9A, 0, 85,  false },	/* 1:	400		3.5 */
	{ 104, 0x9A, 0, 64,  false },	/* 2:	400		6   */
	{ 154, 0x9A, 0, 43,  false },	/* 3:	400		9.5 */
	{ 77,  0x9A, 0, 128, false },	/* 4:	600		0   */
	{ 116, 0x9A, 0, 85,  false },	/* 5:	600		3.5 */
	{ 154, 0x9A, 0, 64,  false },	/* 6:	600		6   */
	{ 102, 0x9A, 0, 128, false },	/* 7:	800		0   */
	{ 154, 0x9A, 0, 85,  false },	/* 8:	800		3.5 */
270
	{ 154, 0x9A, 1, 128, false },	/* 9:	1200		0   */
271 272
};

273 274 275 276 277 278 279 280 281 282 283 284 285 286
static const struct bxt_ddi_buf_trans bxt_ddi_translations_edp[] = {
					/* Idx	NT mV diff	db  */
	{ 26, 0, 0, 128, false },	/* 0:	200		0   */
	{ 38, 0, 0, 112, false },	/* 1:	200		1.5 */
	{ 48, 0, 0, 96,  false },	/* 2:	200		4   */
	{ 54, 0, 0, 69,  false },	/* 3:	200		6   */
	{ 32, 0, 0, 128, false },	/* 4:	250		0   */
	{ 48, 0, 0, 104, false },	/* 5:	250		1.5 */
	{ 54, 0, 0, 85,  false },	/* 6:	250		4   */
	{ 43, 0, 0, 128, false },	/* 7:	300		0   */
	{ 54, 0, 0, 101, false },	/* 8:	300		1.5 */
	{ 48, 0, 0, 128, false },	/* 9:	300		0   */
};

287 288 289 290 291
/* BSpec has 2 recommended values - entries 0 and 8.
 * Using the entry with higher vswing.
 */
static const struct bxt_ddi_buf_trans bxt_ddi_translations_hdmi[] = {
					/* Idx	NT mV diff	db  */
292 293 294 295 296 297 298 299 300
	{ 52,  0x9A, 0, 128, false },	/* 0:	400		0   */
	{ 52,  0x9A, 0, 85,  false },	/* 1:	400		3.5 */
	{ 52,  0x9A, 0, 64,  false },	/* 2:	400		6   */
	{ 42,  0x9A, 0, 43,  false },	/* 3:	400		9.5 */
	{ 77,  0x9A, 0, 128, false },	/* 4:	600		0   */
	{ 77,  0x9A, 0, 85,  false },	/* 5:	600		3.5 */
	{ 77,  0x9A, 0, 64,  false },	/* 6:	600		6   */
	{ 102, 0x9A, 0, 128, false },	/* 7:	800		0   */
	{ 102, 0x9A, 0, 85,  false },	/* 8:	800		3.5 */
301 302 303
	{ 154, 0x9A, 1, 128, true },	/* 9:	1200		0   */
};

304
enum port intel_ddi_get_encoder_port(struct intel_encoder *encoder)
305
{
306
	switch (encoder->type) {
307
	case INTEL_OUTPUT_DP_MST:
308
		return enc_to_mst(&encoder->base)->primary->port;
309
	case INTEL_OUTPUT_DP:
310 311 312
	case INTEL_OUTPUT_EDP:
	case INTEL_OUTPUT_HDMI:
	case INTEL_OUTPUT_UNKNOWN:
313
		return enc_to_dig_port(&encoder->base)->port;
314
	case INTEL_OUTPUT_ANALOG:
315 316 317 318
		return PORT_E;
	default:
		MISSING_CASE(encoder->type);
		return PORT_A;
319 320 321
	}
}

322
static const struct ddi_buf_trans *
323
skl_get_buf_trans_dp(struct drm_i915_private *dev_priv, int *n_entries)
324
{
325
	if (IS_SKL_ULX(dev_priv) || IS_KBL_ULX(dev_priv)) {
326
		*n_entries = ARRAY_SIZE(skl_y_ddi_translations_dp);
327
		return skl_y_ddi_translations_dp;
328
	} else if (IS_SKL_ULT(dev_priv) || IS_KBL_ULT(dev_priv)) {
329
		*n_entries = ARRAY_SIZE(skl_u_ddi_translations_dp);
330
		return skl_u_ddi_translations_dp;
331 332
	} else {
		*n_entries = ARRAY_SIZE(skl_ddi_translations_dp);
333
		return skl_ddi_translations_dp;
334 335 336
	}
}

337
static const struct ddi_buf_trans *
338
skl_get_buf_trans_edp(struct drm_i915_private *dev_priv, int *n_entries)
339
{
340
	if (dev_priv->vbt.edp.low_vswing) {
341
		if (IS_SKL_ULX(dev_priv) || IS_KBL_ULX(dev_priv)) {
342
			*n_entries = ARRAY_SIZE(skl_y_ddi_translations_edp);
343
			return skl_y_ddi_translations_edp;
344
		} else if (IS_SKL_ULT(dev_priv) || IS_KBL_ULT(dev_priv)) {
345
			*n_entries = ARRAY_SIZE(skl_u_ddi_translations_edp);
346
			return skl_u_ddi_translations_edp;
347 348
		} else {
			*n_entries = ARRAY_SIZE(skl_ddi_translations_edp);
349
			return skl_ddi_translations_edp;
350 351
		}
	}
352

353
	return skl_get_buf_trans_dp(dev_priv, n_entries);
354 355 356
}

static const struct ddi_buf_trans *
357
skl_get_buf_trans_hdmi(struct drm_i915_private *dev_priv, int *n_entries)
358
{
359
	if (IS_SKL_ULX(dev_priv) || IS_KBL_ULX(dev_priv)) {
360
		*n_entries = ARRAY_SIZE(skl_y_ddi_translations_hdmi);
361
		return skl_y_ddi_translations_hdmi;
362 363
	} else {
		*n_entries = ARRAY_SIZE(skl_ddi_translations_hdmi);
364
		return skl_ddi_translations_hdmi;
365 366 367
	}
}

368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401
static int intel_ddi_hdmi_level(struct drm_i915_private *dev_priv, enum port port)
{
	int n_hdmi_entries;
	int hdmi_level;
	int hdmi_default_entry;

	hdmi_level = dev_priv->vbt.ddi_port_info[port].hdmi_level_shift;

	if (IS_BROXTON(dev_priv))
		return hdmi_level;

	if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) {
		skl_get_buf_trans_hdmi(dev_priv, &n_hdmi_entries);
		hdmi_default_entry = 8;
	} else if (IS_BROADWELL(dev_priv)) {
		n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
		hdmi_default_entry = 7;
	} else if (IS_HASWELL(dev_priv)) {
		n_hdmi_entries = ARRAY_SIZE(hsw_ddi_translations_hdmi);
		hdmi_default_entry = 6;
	} else {
		WARN(1, "ddi translation table missing\n");
		n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
		hdmi_default_entry = 7;
	}

	/* Choose a good default if VBT is badly populated */
	if (hdmi_level == HDMI_LEVEL_SHIFT_UNKNOWN ||
	    hdmi_level >= n_hdmi_entries)
		hdmi_level = hdmi_default_entry;

	return hdmi_level;
}

402 403
/*
 * Starting with Haswell, DDI port buffers must be programmed with correct
404 405
 * values in advance. This function programs the correct values for
 * DP/eDP/FDI use cases.
406
 */
407
void intel_prepare_dp_ddi_buffers(struct intel_encoder *encoder)
408
{
409
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
410
	u32 iboost_bit = 0;
411 412
	int i, n_dp_entries, n_edp_entries, size;
	enum port port = intel_ddi_get_encoder_port(encoder);
413 414 415 416
	const struct ddi_buf_trans *ddi_translations_fdi;
	const struct ddi_buf_trans *ddi_translations_dp;
	const struct ddi_buf_trans *ddi_translations_edp;
	const struct ddi_buf_trans *ddi_translations;
417

418
	if (IS_BROXTON(dev_priv))
419
		return;
420 421

	if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) {
422
		ddi_translations_fdi = NULL;
423
		ddi_translations_dp =
424
				skl_get_buf_trans_dp(dev_priv, &n_dp_entries);
425
		ddi_translations_edp =
426
				skl_get_buf_trans_edp(dev_priv, &n_edp_entries);
427

428
		/* If we're boosting the current, set bit 31 of trans1 */
429
		if (dev_priv->vbt.ddi_port_info[port].dp_boost_level)
430
			iboost_bit = DDI_BUF_BALANCE_LEG_ENABLE;
431

432 433 434
		if (WARN_ON(encoder->type == INTEL_OUTPUT_EDP &&
			    port != PORT_A && port != PORT_E &&
			    n_edp_entries > 9))
435
			n_edp_entries = 9;
436
	} else if (IS_BROADWELL(dev_priv)) {
437 438
		ddi_translations_fdi = bdw_ddi_translations_fdi;
		ddi_translations_dp = bdw_ddi_translations_dp;
439 440 441 442 443 444 445
		if (dev_priv->vbt.edp.low_vswing) {
			ddi_translations_edp = bdw_ddi_translations_edp;
			n_edp_entries = ARRAY_SIZE(bdw_ddi_translations_edp);
		} else {
			ddi_translations_edp = bdw_ddi_translations_dp;
			n_edp_entries = ARRAY_SIZE(bdw_ddi_translations_dp);
		}
446
		n_dp_entries = ARRAY_SIZE(bdw_ddi_translations_dp);
447
	} else if (IS_HASWELL(dev_priv)) {
448 449
		ddi_translations_fdi = hsw_ddi_translations_fdi;
		ddi_translations_dp = hsw_ddi_translations_dp;
450
		ddi_translations_edp = hsw_ddi_translations_dp;
451
		n_dp_entries = n_edp_entries = ARRAY_SIZE(hsw_ddi_translations_dp);
452 453
	} else {
		WARN(1, "ddi translation table missing\n");
454
		ddi_translations_edp = bdw_ddi_translations_dp;
455 456
		ddi_translations_fdi = bdw_ddi_translations_fdi;
		ddi_translations_dp = bdw_ddi_translations_dp;
457 458
		n_edp_entries = ARRAY_SIZE(bdw_ddi_translations_edp);
		n_dp_entries = ARRAY_SIZE(bdw_ddi_translations_dp);
459 460
	}

461 462
	switch (encoder->type) {
	case INTEL_OUTPUT_EDP:
463
		ddi_translations = ddi_translations_edp;
464
		size = n_edp_entries;
465
		break;
466
	case INTEL_OUTPUT_DP:
467
		ddi_translations = ddi_translations_dp;
468
		size = n_dp_entries;
469
		break;
470 471
	case INTEL_OUTPUT_ANALOG:
		ddi_translations = ddi_translations_fdi;
472
		size = n_dp_entries;
473 474 475 476
		break;
	default:
		BUG();
	}
477

478 479 480 481 482
	for (i = 0; i < size; i++) {
		I915_WRITE(DDI_BUF_TRANS_LO(port, i),
			   ddi_translations[i].trans1 | iboost_bit);
		I915_WRITE(DDI_BUF_TRANS_HI(port, i),
			   ddi_translations[i].trans2);
483
	}
484 485 486 487 488 489 490 491 492 493 494 495 496 497
}

/*
 * Starting with Haswell, DDI port buffers must be programmed with correct
 * values in advance. This function programs the correct values for
 * HDMI/DVI use cases.
 */
static void intel_prepare_hdmi_ddi_buffers(struct intel_encoder *encoder)
{
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
	u32 iboost_bit = 0;
	int n_hdmi_entries, hdmi_level;
	enum port port = intel_ddi_get_encoder_port(encoder);
	const struct ddi_buf_trans *ddi_translations_hdmi;
498

499
	if (IS_BROXTON(dev_priv))
500 501
		return;

502 503 504 505
	hdmi_level = intel_ddi_hdmi_level(dev_priv, port);

	if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) {
		ddi_translations_hdmi = skl_get_buf_trans_hdmi(dev_priv, &n_hdmi_entries);
506

507
		/* If we're boosting the current, set bit 31 of trans1 */
508
		if (dev_priv->vbt.ddi_port_info[port].hdmi_boost_level)
509 510 511 512 513 514 515 516 517 518 519 520 521
			iboost_bit = DDI_BUF_BALANCE_LEG_ENABLE;
	} else if (IS_BROADWELL(dev_priv)) {
		ddi_translations_hdmi = bdw_ddi_translations_hdmi;
		n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
	} else if (IS_HASWELL(dev_priv)) {
		ddi_translations_hdmi = hsw_ddi_translations_hdmi;
		n_hdmi_entries = ARRAY_SIZE(hsw_ddi_translations_hdmi);
	} else {
		WARN(1, "ddi translation table missing\n");
		ddi_translations_hdmi = bdw_ddi_translations_hdmi;
		n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
	}

522
	/* Entry 9 is for HDMI: */
523
	I915_WRITE(DDI_BUF_TRANS_LO(port, 9),
524
		   ddi_translations_hdmi[hdmi_level].trans1 | iboost_bit);
525
	I915_WRITE(DDI_BUF_TRANS_HI(port, 9),
526
		   ddi_translations_hdmi[hdmi_level].trans2);
527 528
}

529 530 531
static void intel_wait_ddi_buf_idle(struct drm_i915_private *dev_priv,
				    enum port port)
{
532
	i915_reg_t reg = DDI_BUF_CTL(port);
533 534
	int i;

535
	for (i = 0; i < 16; i++) {
536 537 538 539 540 541
		udelay(1);
		if (I915_READ(reg) & DDI_BUF_IS_IDLE)
			return;
	}
	DRM_ERROR("Timeout waiting for DDI BUF %c idle bit\n", port_name(port));
}
542 543 544 545 546 547 548 549 550 551 552 553 554

/* Starting with Haswell, different DDI ports can work in FDI mode for
 * connection to the PCH-located connectors. For this, it is necessary to train
 * both the DDI port and PCH receiver for the desired DDI buffer settings.
 *
 * The recommended port to work in FDI mode is DDI E, which we use here. Also,
 * please note that when FDI mode is active on DDI E, it shares 2 lines with
 * DDI A (which is used for eDP)
 */

void hsw_fdi_link_train(struct drm_crtc *crtc)
{
	struct drm_device *dev = crtc->dev;
555
	struct drm_i915_private *dev_priv = to_i915(dev);
556
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
557
	struct intel_encoder *encoder;
558
	u32 temp, i, rx_ctl_val;
559

560 561
	for_each_encoder_on_crtc(dev, crtc, encoder) {
		WARN_ON(encoder->type != INTEL_OUTPUT_ANALOG);
562
		intel_prepare_dp_ddi_buffers(encoder);
563 564
	}

565 566 567 568
	/* Set the FDI_RX_MISC pwrdn lanes and the 2 workarounds listed at the
	 * mode set "sequence for CRT port" document:
	 * - TP1 to TP2 time with the default value
	 * - FDI delay to 90h
569 570
	 *
	 * WaFDIAutoLinkSetTimingOverrride:hsw
571
	 */
572
	I915_WRITE(FDI_RX_MISC(PIPE_A), FDI_RX_PWRDN_LANE1_VAL(2) |
573 574 575 576
				  FDI_RX_PWRDN_LANE0_VAL(2) |
				  FDI_RX_TP1_TO_TP2_48 | FDI_RX_FDI_DELAY_90);

	/* Enable the PCH Receiver FDI PLL */
577
	rx_ctl_val = dev_priv->fdi_rx_config | FDI_RX_ENHANCE_FRAME_ENABLE |
578
		     FDI_RX_PLL_ENABLE |
579
		     FDI_DP_PORT_WIDTH(intel_crtc->config->fdi_lanes);
580 581
	I915_WRITE(FDI_RX_CTL(PIPE_A), rx_ctl_val);
	POSTING_READ(FDI_RX_CTL(PIPE_A));
582 583 584 585
	udelay(220);

	/* Switch from Rawclk to PCDclk */
	rx_ctl_val |= FDI_PCDCLK;
586
	I915_WRITE(FDI_RX_CTL(PIPE_A), rx_ctl_val);
587 588

	/* Configure Port Clock Select */
589 590
	I915_WRITE(PORT_CLK_SEL(PORT_E), intel_crtc->config->ddi_pll_sel);
	WARN_ON(intel_crtc->config->ddi_pll_sel != PORT_CLK_SEL_SPLL);
591 592 593

	/* Start the training iterating through available voltages and emphasis,
	 * testing each value twice. */
594
	for (i = 0; i < ARRAY_SIZE(hsw_ddi_translations_fdi) * 2; i++) {
595 596 597 598 599 600 601
		/* Configure DP_TP_CTL with auto-training */
		I915_WRITE(DP_TP_CTL(PORT_E),
					DP_TP_CTL_FDI_AUTOTRAIN |
					DP_TP_CTL_ENHANCED_FRAME_ENABLE |
					DP_TP_CTL_LINK_TRAIN_PAT1 |
					DP_TP_CTL_ENABLE);

602 603 604 605
		/* Configure and enable DDI_BUF_CTL for DDI E with next voltage.
		 * DDI E does not support port reversal, the functionality is
		 * achieved on the PCH side in FDI_RX_CTL, so no need to set the
		 * port reversal bit */
606
		I915_WRITE(DDI_BUF_CTL(PORT_E),
607
			   DDI_BUF_CTL_ENABLE |
608
			   ((intel_crtc->config->fdi_lanes - 1) << 1) |
609
			   DDI_BUF_TRANS_SELECT(i / 2));
610
		POSTING_READ(DDI_BUF_CTL(PORT_E));
611 612 613

		udelay(600);

614
		/* Program PCH FDI Receiver TU */
615
		I915_WRITE(FDI_RX_TUSIZE1(PIPE_A), TU_SIZE(64));
616 617 618

		/* Enable PCH FDI Receiver with auto-training */
		rx_ctl_val |= FDI_RX_ENABLE | FDI_LINK_TRAIN_AUTO;
619 620
		I915_WRITE(FDI_RX_CTL(PIPE_A), rx_ctl_val);
		POSTING_READ(FDI_RX_CTL(PIPE_A));
621 622 623 624 625

		/* Wait for FDI receiver lane calibration */
		udelay(30);

		/* Unset FDI_RX_MISC pwrdn lanes */
626
		temp = I915_READ(FDI_RX_MISC(PIPE_A));
627
		temp &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
628 629
		I915_WRITE(FDI_RX_MISC(PIPE_A), temp);
		POSTING_READ(FDI_RX_MISC(PIPE_A));
630 631 632

		/* Wait for FDI auto training time */
		udelay(5);
633 634 635

		temp = I915_READ(DP_TP_STATUS(PORT_E));
		if (temp & DP_TP_STATUS_AUTOTRAIN_DONE) {
636
			DRM_DEBUG_KMS("FDI link training done on step %d\n", i);
637 638
			break;
		}
639

640 641 642 643 644 645 646
		/*
		 * Leave things enabled even if we failed to train FDI.
		 * Results in less fireworks from the state checker.
		 */
		if (i == ARRAY_SIZE(hsw_ddi_translations_fdi) * 2 - 1) {
			DRM_ERROR("FDI link training failed!\n");
			break;
647
		}
648

649 650 651 652
		rx_ctl_val &= ~FDI_RX_ENABLE;
		I915_WRITE(FDI_RX_CTL(PIPE_A), rx_ctl_val);
		POSTING_READ(FDI_RX_CTL(PIPE_A));

653 654 655 656 657
		temp = I915_READ(DDI_BUF_CTL(PORT_E));
		temp &= ~DDI_BUF_CTL_ENABLE;
		I915_WRITE(DDI_BUF_CTL(PORT_E), temp);
		POSTING_READ(DDI_BUF_CTL(PORT_E));

658
		/* Disable DP_TP_CTL and FDI_RX_CTL and retry */
659 660 661 662 663 664 665
		temp = I915_READ(DP_TP_CTL(PORT_E));
		temp &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
		temp |= DP_TP_CTL_LINK_TRAIN_PAT1;
		I915_WRITE(DP_TP_CTL(PORT_E), temp);
		POSTING_READ(DP_TP_CTL(PORT_E));

		intel_wait_ddi_buf_idle(dev_priv, PORT_E);
666 667

		/* Reset FDI_RX_MISC pwrdn lanes */
668
		temp = I915_READ(FDI_RX_MISC(PIPE_A));
669 670
		temp &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
		temp |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2);
671 672
		I915_WRITE(FDI_RX_MISC(PIPE_A), temp);
		POSTING_READ(FDI_RX_MISC(PIPE_A));
673 674
	}

675 676 677 678 679 680
	/* Enable normal pixel sending for FDI */
	I915_WRITE(DP_TP_CTL(PORT_E),
		   DP_TP_CTL_FDI_AUTOTRAIN |
		   DP_TP_CTL_LINK_TRAIN_NORMAL |
		   DP_TP_CTL_ENHANCED_FRAME_ENABLE |
		   DP_TP_CTL_ENABLE);
681
}
682

683 684 685 686 687 688 689
void intel_ddi_init_dp_buf_reg(struct intel_encoder *encoder)
{
	struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
	struct intel_digital_port *intel_dig_port =
		enc_to_dig_port(&encoder->base);

	intel_dp->DP = intel_dig_port->saved_port_bits |
690
		DDI_BUF_CTL_ENABLE | DDI_BUF_TRANS_SELECT(0);
691
	intel_dp->DP |= DDI_PORT_WIDTH(intel_dp->lane_count);
692 693
}

694 695 696 697 698 699 700 701 702 703 704 705 706 707
static struct intel_encoder *
intel_ddi_get_crtc_encoder(struct drm_crtc *crtc)
{
	struct drm_device *dev = crtc->dev;
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
	struct intel_encoder *intel_encoder, *ret = NULL;
	int num_encoders = 0;

	for_each_encoder_on_crtc(dev, crtc, intel_encoder) {
		ret = intel_encoder;
		num_encoders++;
	}

	if (num_encoders != 1)
708 709
		WARN(1, "%d encoders on crtc for pipe %c\n", num_encoders,
		     pipe_name(intel_crtc->pipe));
710 711 712 713 714

	BUG_ON(ret == NULL);
	return ret;
}

715
struct intel_encoder *
716
intel_ddi_get_crtc_new_encoder(struct intel_crtc_state *crtc_state)
717
{
718 719 720
	struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
	struct intel_encoder *ret = NULL;
	struct drm_atomic_state *state;
721 722
	struct drm_connector *connector;
	struct drm_connector_state *connector_state;
723
	int num_encoders = 0;
724
	int i;
725

726 727
	state = crtc_state->base.state;

728 729
	for_each_connector_in_state(state, connector, connector_state, i) {
		if (connector_state->crtc != crtc_state->base.crtc)
730 731
			continue;

732
		ret = to_intel_encoder(connector_state->best_encoder);
733
		num_encoders++;
734 735 736 737 738 739 740 741 742
	}

	WARN(num_encoders != 1, "%d encoders on crtc for pipe %c\n", num_encoders,
	     pipe_name(crtc->pipe));

	BUG_ON(ret == NULL);
	return ret;
}

743 744
#define LC_FREQ 2700

745 746
static int hsw_ddi_calc_wrpll_link(struct drm_i915_private *dev_priv,
				   i915_reg_t reg)
747 748 749 750 751 752
{
	int refclk = LC_FREQ;
	int n, p, r;
	u32 wrpll;

	wrpll = I915_READ(reg);
753 754 755
	switch (wrpll & WRPLL_PLL_REF_MASK) {
	case WRPLL_PLL_SSC:
	case WRPLL_PLL_NON_SSC:
756 757 758 759 760 761 762
		/*
		 * We could calculate spread here, but our checking
		 * code only cares about 5% accuracy, and spread is a max of
		 * 0.5% downspread.
		 */
		refclk = 135;
		break;
763
	case WRPLL_PLL_LCPLL:
764 765 766 767 768 769 770 771 772 773 774
		refclk = LC_FREQ;
		break;
	default:
		WARN(1, "bad wrpll refclk\n");
		return 0;
	}

	r = wrpll & WRPLL_DIVIDER_REF_MASK;
	p = (wrpll & WRPLL_DIVIDER_POST_MASK) >> WRPLL_DIVIDER_POST_SHIFT;
	n = (wrpll & WRPLL_DIVIDER_FB_MASK) >> WRPLL_DIVIDER_FB_SHIFT;

775 776
	/* Convert to KHz, p & r have a fixed point portion */
	return (refclk * n * 100) / (p * r);
777 778
}

779 780 781
static int skl_calc_wrpll_link(struct drm_i915_private *dev_priv,
			       uint32_t dpll)
{
782
	i915_reg_t cfgcr1_reg, cfgcr2_reg;
783 784 785
	uint32_t cfgcr1_val, cfgcr2_val;
	uint32_t p0, p1, p2, dco_freq;

786 787
	cfgcr1_reg = DPLL_CFGCR1(dpll);
	cfgcr2_reg = DPLL_CFGCR2(dpll);
788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838

	cfgcr1_val = I915_READ(cfgcr1_reg);
	cfgcr2_val = I915_READ(cfgcr2_reg);

	p0 = cfgcr2_val & DPLL_CFGCR2_PDIV_MASK;
	p2 = cfgcr2_val & DPLL_CFGCR2_KDIV_MASK;

	if (cfgcr2_val &  DPLL_CFGCR2_QDIV_MODE(1))
		p1 = (cfgcr2_val & DPLL_CFGCR2_QDIV_RATIO_MASK) >> 8;
	else
		p1 = 1;


	switch (p0) {
	case DPLL_CFGCR2_PDIV_1:
		p0 = 1;
		break;
	case DPLL_CFGCR2_PDIV_2:
		p0 = 2;
		break;
	case DPLL_CFGCR2_PDIV_3:
		p0 = 3;
		break;
	case DPLL_CFGCR2_PDIV_7:
		p0 = 7;
		break;
	}

	switch (p2) {
	case DPLL_CFGCR2_KDIV_5:
		p2 = 5;
		break;
	case DPLL_CFGCR2_KDIV_2:
		p2 = 2;
		break;
	case DPLL_CFGCR2_KDIV_3:
		p2 = 3;
		break;
	case DPLL_CFGCR2_KDIV_1:
		p2 = 1;
		break;
	}

	dco_freq = (cfgcr1_val & DPLL_CFGCR1_DCO_INTEGER_MASK) * 24 * 1000;

	dco_freq += (((cfgcr1_val & DPLL_CFGCR1_DCO_FRACTION_MASK) >> 9) * 24 *
		1000) / 0x8000;

	return dco_freq / (p0 * p1 * p2 * 5);
}

839 840 841 842 843 844 845
static void ddi_dotclock_get(struct intel_crtc_state *pipe_config)
{
	int dotclock;

	if (pipe_config->has_pch_encoder)
		dotclock = intel_dotclock_calculate(pipe_config->port_clock,
						    &pipe_config->fdi_m_n);
846
	else if (intel_crtc_has_dp_encoder(pipe_config))
847 848 849 850 851 852 853 854 855 856 857 858
		dotclock = intel_dotclock_calculate(pipe_config->port_clock,
						    &pipe_config->dp_m_n);
	else if (pipe_config->has_hdmi_sink && pipe_config->pipe_bpp == 36)
		dotclock = pipe_config->port_clock * 2 / 3;
	else
		dotclock = pipe_config->port_clock;

	if (pipe_config->pixel_multiplier)
		dotclock /= pipe_config->pixel_multiplier;

	pipe_config->base.adjusted_mode.crtc_clock = dotclock;
}
859 860

static void skl_ddi_clock_get(struct intel_encoder *encoder,
861
				struct intel_crtc_state *pipe_config)
862
{
863
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
864 865 866
	int link_clock = 0;
	uint32_t dpll_ctl1, dpll;

867
	dpll = pipe_config->ddi_pll_sel;
868 869 870 871 872 873

	dpll_ctl1 = I915_READ(DPLL_CTRL1);

	if (dpll_ctl1 & DPLL_CTRL1_HDMI_MODE(dpll)) {
		link_clock = skl_calc_wrpll_link(dev_priv, dpll);
	} else {
874 875
		link_clock = dpll_ctl1 & DPLL_CTRL1_LINK_RATE_MASK(dpll);
		link_clock >>= DPLL_CTRL1_LINK_RATE_SHIFT(dpll);
876 877

		switch (link_clock) {
878
		case DPLL_CTRL1_LINK_RATE_810:
879 880
			link_clock = 81000;
			break;
881
		case DPLL_CTRL1_LINK_RATE_1080:
882 883
			link_clock = 108000;
			break;
884
		case DPLL_CTRL1_LINK_RATE_1350:
885 886
			link_clock = 135000;
			break;
887
		case DPLL_CTRL1_LINK_RATE_1620:
888 889
			link_clock = 162000;
			break;
890
		case DPLL_CTRL1_LINK_RATE_2160:
891 892
			link_clock = 216000;
			break;
893
		case DPLL_CTRL1_LINK_RATE_2700:
894 895 896 897 898 899 900 901 902 903 904
			link_clock = 270000;
			break;
		default:
			WARN(1, "Unsupported link rate\n");
			break;
		}
		link_clock *= 2;
	}

	pipe_config->port_clock = link_clock;

905
	ddi_dotclock_get(pipe_config);
906 907
}

908
static void hsw_ddi_clock_get(struct intel_encoder *encoder,
909
			      struct intel_crtc_state *pipe_config)
910
{
911
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
912 913 914
	int link_clock = 0;
	u32 val, pll;

915
	val = pipe_config->ddi_pll_sel;
916 917 918 919 920 921 922 923 924 925 926
	switch (val & PORT_CLK_SEL_MASK) {
	case PORT_CLK_SEL_LCPLL_810:
		link_clock = 81000;
		break;
	case PORT_CLK_SEL_LCPLL_1350:
		link_clock = 135000;
		break;
	case PORT_CLK_SEL_LCPLL_2700:
		link_clock = 270000;
		break;
	case PORT_CLK_SEL_WRPLL1:
927
		link_clock = hsw_ddi_calc_wrpll_link(dev_priv, WRPLL_CTL(0));
928 929
		break;
	case PORT_CLK_SEL_WRPLL2:
930
		link_clock = hsw_ddi_calc_wrpll_link(dev_priv, WRPLL_CTL(1));
931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951
		break;
	case PORT_CLK_SEL_SPLL:
		pll = I915_READ(SPLL_CTL) & SPLL_PLL_FREQ_MASK;
		if (pll == SPLL_PLL_FREQ_810MHz)
			link_clock = 81000;
		else if (pll == SPLL_PLL_FREQ_1350MHz)
			link_clock = 135000;
		else if (pll == SPLL_PLL_FREQ_2700MHz)
			link_clock = 270000;
		else {
			WARN(1, "bad spll freq\n");
			return;
		}
		break;
	default:
		WARN(1, "bad port clock sel\n");
		return;
	}

	pipe_config->port_clock = link_clock * 2;

952
	ddi_dotclock_get(pipe_config);
953 954
}

955 956 957
static int bxt_calc_pll_link(struct drm_i915_private *dev_priv,
				enum intel_dpll_id dpll)
{
958 959
	struct intel_shared_dpll *pll;
	struct intel_dpll_hw_state *state;
960
	struct dpll clock;
961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977

	/* For DDI ports we always use a shared PLL. */
	if (WARN_ON(dpll == DPLL_ID_PRIVATE))
		return 0;

	pll = &dev_priv->shared_dplls[dpll];
	state = &pll->config.hw_state;

	clock.m1 = 2;
	clock.m2 = (state->pll0 & PORT_PLL_M2_MASK) << 22;
	if (state->pll3 & PORT_PLL_M2_FRAC_ENABLE)
		clock.m2 |= state->pll2 & PORT_PLL_M2_FRAC_MASK;
	clock.n = (state->pll1 & PORT_PLL_N_MASK) >> PORT_PLL_N_SHIFT;
	clock.p1 = (state->ebb0 & PORT_PLL_P1_MASK) >> PORT_PLL_P1_SHIFT;
	clock.p2 = (state->ebb0 & PORT_PLL_P2_MASK) >> PORT_PLL_P2_SHIFT;

	return chv_calc_dpll_params(100000, &clock);
978 979 980 981 982
}

static void bxt_ddi_clock_get(struct intel_encoder *encoder,
				struct intel_crtc_state *pipe_config)
{
983
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
984 985 986
	enum port port = intel_ddi_get_encoder_port(encoder);
	uint32_t dpll = port;

987
	pipe_config->port_clock = bxt_calc_pll_link(dev_priv, dpll);
988

989
	ddi_dotclock_get(pipe_config);
990 991
}

992
void intel_ddi_clock_get(struct intel_encoder *encoder,
993
			 struct intel_crtc_state *pipe_config)
994
{
995 996 997 998
	struct drm_device *dev = encoder->base.dev;

	if (INTEL_INFO(dev)->gen <= 8)
		hsw_ddi_clock_get(encoder, pipe_config);
999
	else if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
1000
		skl_ddi_clock_get(encoder, pipe_config);
1001 1002
	else if (IS_BROXTON(dev))
		bxt_ddi_clock_get(encoder, pipe_config);
1003 1004
}

1005
static bool
1006
hsw_ddi_pll_select(struct intel_crtc *intel_crtc,
1007
		   struct intel_crtc_state *crtc_state,
1008
		   struct intel_encoder *intel_encoder)
1009
{
1010
	struct intel_shared_dpll *pll;
1011

1012 1013 1014 1015 1016 1017 1018
	pll = intel_get_shared_dpll(intel_crtc, crtc_state,
				    intel_encoder);
	if (!pll)
		DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
				 pipe_name(intel_crtc->pipe));

	return pll;
1019 1020
}

1021 1022
static bool
skl_ddi_pll_select(struct intel_crtc *intel_crtc,
1023
		   struct intel_crtc_state *crtc_state,
1024
		   struct intel_encoder *intel_encoder)
1025 1026 1027
{
	struct intel_shared_dpll *pll;

1028
	pll = intel_get_shared_dpll(intel_crtc, crtc_state, intel_encoder);
1029 1030 1031 1032 1033 1034 1035 1036
	if (pll == NULL) {
		DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
				 pipe_name(intel_crtc->pipe));
		return false;
	}

	return true;
}
1037

1038 1039 1040
static bool
bxt_ddi_pll_select(struct intel_crtc *intel_crtc,
		   struct intel_crtc_state *crtc_state,
1041
		   struct intel_encoder *intel_encoder)
1042
{
1043
	return !!intel_get_shared_dpll(intel_crtc, crtc_state, intel_encoder);
1044 1045
}

1046 1047 1048 1049 1050 1051 1052
/*
 * Tries to find a *shared* PLL for the CRTC and store it in
 * intel_crtc->ddi_pll_sel.
 *
 * For private DPLLs, compute_config() should do the selection for us. This
 * function should be folded into compute_config() eventually.
 */
1053 1054
bool intel_ddi_pll_select(struct intel_crtc *intel_crtc,
			  struct intel_crtc_state *crtc_state)
1055
{
1056
	struct drm_device *dev = intel_crtc->base.dev;
1057
	struct intel_encoder *intel_encoder =
1058
		intel_ddi_get_crtc_new_encoder(crtc_state);
1059

1060
	if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
1061
		return skl_ddi_pll_select(intel_crtc, crtc_state,
1062
					  intel_encoder);
1063 1064
	else if (IS_BROXTON(dev))
		return bxt_ddi_pll_select(intel_crtc, crtc_state,
1065
					  intel_encoder);
1066
	else
1067
		return hsw_ddi_pll_select(intel_crtc, crtc_state,
1068
					  intel_encoder);
1069 1070
}

1071 1072
void intel_ddi_set_pipe_settings(struct drm_crtc *crtc)
{
1073
	struct drm_i915_private *dev_priv = to_i915(crtc->dev);
1074 1075
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
	struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
1076
	enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
1077 1078 1079
	int type = intel_encoder->type;
	uint32_t temp;

1080
	if (type == INTEL_OUTPUT_DP || type == INTEL_OUTPUT_EDP || type == INTEL_OUTPUT_DP_MST) {
J
Jani Nikula 已提交
1081 1082
		WARN_ON(transcoder_is_dsi(cpu_transcoder));

1083
		temp = TRANS_MSA_SYNC_CLK;
1084
		switch (intel_crtc->config->pipe_bpp) {
1085
		case 18:
1086
			temp |= TRANS_MSA_6_BPC;
1087 1088
			break;
		case 24:
1089
			temp |= TRANS_MSA_8_BPC;
1090 1091
			break;
		case 30:
1092
			temp |= TRANS_MSA_10_BPC;
1093 1094
			break;
		case 36:
1095
			temp |= TRANS_MSA_12_BPC;
1096 1097
			break;
		default:
1098
			BUG();
1099
		}
1100
		I915_WRITE(TRANS_MSA_MISC(cpu_transcoder), temp);
1101 1102 1103
	}
}

1104 1105 1106 1107
void intel_ddi_set_vc_payload_alloc(struct drm_crtc *crtc, bool state)
{
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
	struct drm_device *dev = crtc->dev;
1108
	struct drm_i915_private *dev_priv = to_i915(dev);
1109
	enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
1110 1111 1112 1113 1114 1115 1116 1117 1118
	uint32_t temp;
	temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
	if (state == true)
		temp |= TRANS_DDI_DP_VC_PAYLOAD_ALLOC;
	else
		temp &= ~TRANS_DDI_DP_VC_PAYLOAD_ALLOC;
	I915_WRITE(TRANS_DDI_FUNC_CTL(cpu_transcoder), temp);
}

1119
void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc)
1120 1121 1122
{
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
	struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
1123
	struct drm_encoder *encoder = &intel_encoder->base;
1124
	struct drm_device *dev = crtc->dev;
1125
	struct drm_i915_private *dev_priv = to_i915(dev);
1126
	enum pipe pipe = intel_crtc->pipe;
1127
	enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
1128
	enum port port = intel_ddi_get_encoder_port(intel_encoder);
1129
	int type = intel_encoder->type;
1130 1131
	uint32_t temp;

1132 1133
	/* Enable TRANS_DDI_FUNC_CTL for the pipe to work in HDMI mode */
	temp = TRANS_DDI_FUNC_ENABLE;
1134
	temp |= TRANS_DDI_SELECT_PORT(port);
1135

1136
	switch (intel_crtc->config->pipe_bpp) {
1137
	case 18:
1138
		temp |= TRANS_DDI_BPC_6;
1139 1140
		break;
	case 24:
1141
		temp |= TRANS_DDI_BPC_8;
1142 1143
		break;
	case 30:
1144
		temp |= TRANS_DDI_BPC_10;
1145 1146
		break;
	case 36:
1147
		temp |= TRANS_DDI_BPC_12;
1148 1149
		break;
	default:
1150
		BUG();
1151
	}
1152

1153
	if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_PVSYNC)
1154
		temp |= TRANS_DDI_PVSYNC;
1155
	if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_PHSYNC)
1156
		temp |= TRANS_DDI_PHSYNC;
1157

1158 1159 1160
	if (cpu_transcoder == TRANSCODER_EDP) {
		switch (pipe) {
		case PIPE_A:
1161 1162 1163 1164
			/* On Haswell, can only use the always-on power well for
			 * eDP when not using the panel fitter, and when not
			 * using motion blur mitigation (which we don't
			 * support). */
1165
			if (IS_HASWELL(dev) &&
1166 1167
			    (intel_crtc->config->pch_pfit.enabled ||
			     intel_crtc->config->pch_pfit.force_thru))
1168 1169 1170
				temp |= TRANS_DDI_EDP_INPUT_A_ONOFF;
			else
				temp |= TRANS_DDI_EDP_INPUT_A_ON;
1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183
			break;
		case PIPE_B:
			temp |= TRANS_DDI_EDP_INPUT_B_ONOFF;
			break;
		case PIPE_C:
			temp |= TRANS_DDI_EDP_INPUT_C_ONOFF;
			break;
		default:
			BUG();
			break;
		}
	}

1184
	if (type == INTEL_OUTPUT_HDMI) {
1185
		if (intel_crtc->config->has_hdmi_sink)
1186
			temp |= TRANS_DDI_MODE_SELECT_HDMI;
1187
		else
1188
			temp |= TRANS_DDI_MODE_SELECT_DVI;
1189

1190
	} else if (type == INTEL_OUTPUT_ANALOG) {
1191
		temp |= TRANS_DDI_MODE_SELECT_FDI;
1192
		temp |= (intel_crtc->config->fdi_lanes - 1) << 1;
1193

1194
	} else if (type == INTEL_OUTPUT_DP ||
1195 1196 1197
		   type == INTEL_OUTPUT_EDP) {
		struct intel_dp *intel_dp = enc_to_intel_dp(encoder);

1198 1199 1200 1201 1202
		if (intel_dp->is_mst) {
			temp |= TRANS_DDI_MODE_SELECT_DP_MST;
		} else
			temp |= TRANS_DDI_MODE_SELECT_DP_SST;

1203
		temp |= DDI_PORT_WIDTH(intel_crtc->config->lane_count);
1204 1205 1206 1207 1208 1209 1210
	} else if (type == INTEL_OUTPUT_DP_MST) {
		struct intel_dp *intel_dp = &enc_to_mst(encoder)->primary->dp;

		if (intel_dp->is_mst) {
			temp |= TRANS_DDI_MODE_SELECT_DP_MST;
		} else
			temp |= TRANS_DDI_MODE_SELECT_DP_SST;
1211

1212
		temp |= DDI_PORT_WIDTH(intel_crtc->config->lane_count);
1213
	} else {
1214 1215
		WARN(1, "Invalid encoder type %d for pipe %c\n",
		     intel_encoder->type, pipe_name(pipe));
1216 1217
	}

1218
	I915_WRITE(TRANS_DDI_FUNC_CTL(cpu_transcoder), temp);
1219
}
1220

1221 1222
void intel_ddi_disable_transcoder_func(struct drm_i915_private *dev_priv,
				       enum transcoder cpu_transcoder)
1223
{
1224
	i915_reg_t reg = TRANS_DDI_FUNC_CTL(cpu_transcoder);
1225 1226
	uint32_t val = I915_READ(reg);

1227
	val &= ~(TRANS_DDI_FUNC_ENABLE | TRANS_DDI_PORT_MASK | TRANS_DDI_DP_VC_PAYLOAD_ALLOC);
1228
	val |= TRANS_DDI_PORT_NONE;
1229
	I915_WRITE(reg, val);
1230 1231
}

1232 1233 1234
bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector)
{
	struct drm_device *dev = intel_connector->base.dev;
1235
	struct drm_i915_private *dev_priv = to_i915(dev);
1236 1237 1238 1239 1240
	struct intel_encoder *intel_encoder = intel_connector->encoder;
	int type = intel_connector->base.connector_type;
	enum port port = intel_ddi_get_encoder_port(intel_encoder);
	enum pipe pipe = 0;
	enum transcoder cpu_transcoder;
1241
	enum intel_display_power_domain power_domain;
1242
	uint32_t tmp;
1243
	bool ret;
1244

1245
	power_domain = intel_display_port_power_domain(intel_encoder);
1246
	if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
1247 1248
		return false;

1249 1250 1251 1252
	if (!intel_encoder->get_hw_state(intel_encoder, &pipe)) {
		ret = false;
		goto out;
	}
1253 1254 1255 1256

	if (port == PORT_A)
		cpu_transcoder = TRANSCODER_EDP;
	else
D
Daniel Vetter 已提交
1257
		cpu_transcoder = (enum transcoder) pipe;
1258 1259 1260 1261 1262 1263

	tmp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));

	switch (tmp & TRANS_DDI_MODE_SELECT_MASK) {
	case TRANS_DDI_MODE_SELECT_HDMI:
	case TRANS_DDI_MODE_SELECT_DVI:
1264 1265
		ret = type == DRM_MODE_CONNECTOR_HDMIA;
		break;
1266 1267

	case TRANS_DDI_MODE_SELECT_DP_SST:
1268 1269 1270 1271
		ret = type == DRM_MODE_CONNECTOR_eDP ||
		      type == DRM_MODE_CONNECTOR_DisplayPort;
		break;

1272 1273 1274
	case TRANS_DDI_MODE_SELECT_DP_MST:
		/* if the transcoder is in MST state then
		 * connector isn't connected */
1275 1276
		ret = false;
		break;
1277 1278

	case TRANS_DDI_MODE_SELECT_FDI:
1279 1280
		ret = type == DRM_MODE_CONNECTOR_VGA;
		break;
1281 1282

	default:
1283 1284
		ret = false;
		break;
1285
	}
1286 1287 1288 1289 1290

out:
	intel_display_power_put(dev_priv, power_domain);

	return ret;
1291 1292
}

1293 1294 1295 1296
bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
			    enum pipe *pipe)
{
	struct drm_device *dev = encoder->base.dev;
1297
	struct drm_i915_private *dev_priv = to_i915(dev);
1298
	enum port port = intel_ddi_get_encoder_port(encoder);
1299
	enum intel_display_power_domain power_domain;
1300 1301
	u32 tmp;
	int i;
1302
	bool ret;
1303

1304
	power_domain = intel_display_port_power_domain(encoder);
1305
	if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
1306 1307
		return false;

1308 1309
	ret = false;

1310
	tmp = I915_READ(DDI_BUF_CTL(port));
1311 1312

	if (!(tmp & DDI_BUF_CTL_ENABLE))
1313
		goto out;
1314

1315 1316
	if (port == PORT_A) {
		tmp = I915_READ(TRANS_DDI_FUNC_CTL(TRANSCODER_EDP));
1317

1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330
		switch (tmp & TRANS_DDI_EDP_INPUT_MASK) {
		case TRANS_DDI_EDP_INPUT_A_ON:
		case TRANS_DDI_EDP_INPUT_A_ONOFF:
			*pipe = PIPE_A;
			break;
		case TRANS_DDI_EDP_INPUT_B_ONOFF:
			*pipe = PIPE_B;
			break;
		case TRANS_DDI_EDP_INPUT_C_ONOFF:
			*pipe = PIPE_C;
			break;
		}

1331
		ret = true;
1332

1333 1334
		goto out;
	}
1335

1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347
	for (i = TRANSCODER_A; i <= TRANSCODER_C; i++) {
		tmp = I915_READ(TRANS_DDI_FUNC_CTL(i));

		if ((tmp & TRANS_DDI_PORT_MASK) == TRANS_DDI_SELECT_PORT(port)) {
			if ((tmp & TRANS_DDI_MODE_SELECT_MASK) ==
			    TRANS_DDI_MODE_SELECT_DP_MST)
				goto out;

			*pipe = i;
			ret = true;

			goto out;
1348 1349 1350
		}
	}

1351
	DRM_DEBUG_KMS("No pipe for ddi port %c found\n", port_name(port));
1352

1353
out:
1354 1355 1356 1357 1358 1359 1360 1361
	if (ret && IS_BROXTON(dev_priv)) {
		tmp = I915_READ(BXT_PHY_CTL(port));
		if ((tmp & (BXT_PHY_LANE_POWERDOWN_ACK |
			    BXT_PHY_LANE_ENABLED)) != BXT_PHY_LANE_ENABLED)
			DRM_ERROR("Port %c enabled but PHY powered down? "
				  "(PHY_CTL %08x)\n", port_name(port), tmp);
	}

1362 1363 1364
	intel_display_power_put(dev_priv, power_domain);

	return ret;
1365 1366
}

1367 1368 1369
void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc)
{
	struct drm_crtc *crtc = &intel_crtc->base;
1370
	struct drm_device *dev = crtc->dev;
1371
	struct drm_i915_private *dev_priv = to_i915(dev);
1372 1373
	struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
	enum port port = intel_ddi_get_encoder_port(intel_encoder);
1374
	enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
1375

1376 1377 1378
	if (cpu_transcoder != TRANSCODER_EDP)
		I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
			   TRANS_CLK_SEL_PORT(port));
1379 1380 1381 1382
}

void intel_ddi_disable_pipe_clock(struct intel_crtc *intel_crtc)
{
1383
	struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev);
1384
	enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
1385

1386 1387 1388
	if (cpu_transcoder != TRANSCODER_EDP)
		I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
			   TRANS_CLK_SEL_DISABLED);
1389 1390
}

1391 1392
static void _skl_ddi_set_iboost(struct drm_i915_private *dev_priv,
				enum port port, uint8_t iboost)
1393
{
1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410
	u32 tmp;

	tmp = I915_READ(DISPIO_CR_TX_BMU_CR0);
	tmp &= ~(BALANCE_LEG_MASK(port) | BALANCE_LEG_DISABLE(port));
	if (iboost)
		tmp |= iboost << BALANCE_LEG_SHIFT(port);
	else
		tmp |= BALANCE_LEG_DISABLE(port);
	I915_WRITE(DISPIO_CR_TX_BMU_CR0, tmp);
}

static void skl_ddi_set_iboost(struct intel_encoder *encoder, u32 level)
{
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(&encoder->base);
	struct drm_i915_private *dev_priv = to_i915(intel_dig_port->base.base.dev);
	enum port port = intel_dig_port->port;
	int type = encoder->type;
1411 1412
	const struct ddi_buf_trans *ddi_translations;
	uint8_t iboost;
1413
	uint8_t dp_iboost, hdmi_iboost;
1414 1415
	int n_entries;

1416 1417 1418 1419
	/* VBT may override standard boost values */
	dp_iboost = dev_priv->vbt.ddi_port_info[port].dp_boost_level;
	hdmi_iboost = dev_priv->vbt.ddi_port_info[port].hdmi_boost_level;

1420
	if (type == INTEL_OUTPUT_DP) {
1421 1422 1423
		if (dp_iboost) {
			iboost = dp_iboost;
		} else {
1424
			ddi_translations = skl_get_buf_trans_dp(dev_priv, &n_entries);
1425
			iboost = ddi_translations[level].i_boost;
1426
		}
1427
	} else if (type == INTEL_OUTPUT_EDP) {
1428 1429 1430
		if (dp_iboost) {
			iboost = dp_iboost;
		} else {
1431
			ddi_translations = skl_get_buf_trans_edp(dev_priv, &n_entries);
1432 1433 1434 1435 1436

			if (WARN_ON(port != PORT_A &&
				    port != PORT_E && n_entries > 9))
				n_entries = 9;

1437
			iboost = ddi_translations[level].i_boost;
1438
		}
1439
	} else if (type == INTEL_OUTPUT_HDMI) {
1440 1441 1442
		if (hdmi_iboost) {
			iboost = hdmi_iboost;
		} else {
1443
			ddi_translations = skl_get_buf_trans_hdmi(dev_priv, &n_entries);
1444
			iboost = ddi_translations[level].i_boost;
1445
		}
1446 1447 1448 1449 1450 1451 1452 1453 1454 1455
	} else {
		return;
	}

	/* Make sure that the requested I_boost is valid */
	if (iboost && iboost != 0x1 && iboost != 0x3 && iboost != 0x7) {
		DRM_ERROR("Invalid I_boost value %u\n", iboost);
		return;
	}

1456
	_skl_ddi_set_iboost(dev_priv, port, iboost);
1457

1458 1459
	if (port == PORT_A && intel_dig_port->max_lanes == 4)
		_skl_ddi_set_iboost(dev_priv, PORT_E, iboost);
1460 1461
}

1462 1463
static void bxt_ddi_vswing_sequence(struct drm_i915_private *dev_priv,
				    u32 level, enum port port, int type)
1464 1465 1466 1467 1468
{
	const struct bxt_ddi_buf_trans *ddi_translations;
	u32 n_entries, i;
	uint32_t val;

1469
	if (type == INTEL_OUTPUT_EDP && dev_priv->vbt.edp.low_vswing) {
1470 1471
		n_entries = ARRAY_SIZE(bxt_ddi_translations_edp);
		ddi_translations = bxt_ddi_translations_edp;
1472
	} else if (type == INTEL_OUTPUT_DP
1473
			|| type == INTEL_OUTPUT_EDP) {
1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510
		n_entries = ARRAY_SIZE(bxt_ddi_translations_dp);
		ddi_translations = bxt_ddi_translations_dp;
	} else if (type == INTEL_OUTPUT_HDMI) {
		n_entries = ARRAY_SIZE(bxt_ddi_translations_hdmi);
		ddi_translations = bxt_ddi_translations_hdmi;
	} else {
		DRM_DEBUG_KMS("Vswing programming not done for encoder %d\n",
				type);
		return;
	}

	/* Check if default value has to be used */
	if (level >= n_entries ||
	    (type == INTEL_OUTPUT_HDMI && level == HDMI_LEVEL_SHIFT_UNKNOWN)) {
		for (i = 0; i < n_entries; i++) {
			if (ddi_translations[i].default_index) {
				level = i;
				break;
			}
		}
	}

	/*
	 * While we write to the group register to program all lanes at once we
	 * can read only lane registers and we pick lanes 0/1 for that.
	 */
	val = I915_READ(BXT_PORT_PCS_DW10_LN01(port));
	val &= ~(TX2_SWING_CALC_INIT | TX1_SWING_CALC_INIT);
	I915_WRITE(BXT_PORT_PCS_DW10_GRP(port), val);

	val = I915_READ(BXT_PORT_TX_DW2_LN0(port));
	val &= ~(MARGIN_000 | UNIQ_TRANS_SCALE);
	val |= ddi_translations[level].margin << MARGIN_000_SHIFT |
	       ddi_translations[level].scale << UNIQ_TRANS_SCALE_SHIFT;
	I915_WRITE(BXT_PORT_TX_DW2_GRP(port), val);

	val = I915_READ(BXT_PORT_TX_DW3_LN0(port));
1511
	val &= ~SCALE_DCOMP_METHOD;
1512
	if (ddi_translations[level].enable)
1513 1514 1515 1516 1517
		val |= SCALE_DCOMP_METHOD;

	if ((val & UNIQUE_TRANGE_EN_METHOD) && !(val & SCALE_DCOMP_METHOD))
		DRM_ERROR("Disabled scaling while ouniqetrangenmethod was set");

1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529
	I915_WRITE(BXT_PORT_TX_DW3_GRP(port), val);

	val = I915_READ(BXT_PORT_TX_DW4_LN0(port));
	val &= ~DE_EMPHASIS;
	val |= ddi_translations[level].deemphasis << DEEMPH_SHIFT;
	I915_WRITE(BXT_PORT_TX_DW4_GRP(port), val);

	val = I915_READ(BXT_PORT_PCS_DW10_LN01(port));
	val |= TX2_SWING_CALC_INIT | TX1_SWING_CALC_INIT;
	I915_WRITE(BXT_PORT_PCS_DW10_GRP(port), val);
}

1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578
static uint32_t translate_signal_level(int signal_levels)
{
	uint32_t level;

	switch (signal_levels) {
	default:
		DRM_DEBUG_KMS("Unsupported voltage swing/pre-emphasis level: 0x%x\n",
			      signal_levels);
	case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_0:
		level = 0;
		break;
	case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_1:
		level = 1;
		break;
	case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_2:
		level = 2;
		break;
	case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_3:
		level = 3;
		break;

	case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_0:
		level = 4;
		break;
	case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_1:
		level = 5;
		break;
	case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_2:
		level = 6;
		break;

	case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_0:
		level = 7;
		break;
	case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_1:
		level = 8;
		break;

	case DP_TRAIN_VOLTAGE_SWING_LEVEL_3 | DP_TRAIN_PRE_EMPH_LEVEL_0:
		level = 9;
		break;
	}

	return level;
}

uint32_t ddi_signal_levels(struct intel_dp *intel_dp)
{
	struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
1579
	struct drm_i915_private *dev_priv = to_i915(dport->base.base.dev);
1580 1581 1582 1583 1584 1585 1586 1587 1588
	struct intel_encoder *encoder = &dport->base;
	uint8_t train_set = intel_dp->train_set[0];
	int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK |
					 DP_TRAIN_PRE_EMPHASIS_MASK);
	enum port port = dport->port;
	uint32_t level;

	level = translate_signal_level(signal_levels);

1589
	if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv))
1590
		skl_ddi_set_iboost(encoder, level);
1591 1592
	else if (IS_BROXTON(dev_priv))
		bxt_ddi_vswing_sequence(dev_priv, level, port, encoder->type);
1593 1594 1595 1596

	return DDI_BUF_TRANS_SELECT(level);
}

1597 1598
void intel_ddi_clk_select(struct intel_encoder *encoder,
			  const struct intel_crtc_state *pipe_config)
1599
{
1600 1601
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
	enum port port = intel_ddi_get_encoder_port(encoder);
1602

1603 1604
	if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) {
		uint32_t dpll = pipe_config->ddi_pll_sel;
1605 1606
		uint32_t val;

1607
		/* DDI -> PLL mapping  */
1608 1609 1610 1611 1612 1613 1614 1615
		val = I915_READ(DPLL_CTRL2);

		val &= ~(DPLL_CTRL2_DDI_CLK_OFF(port) |
			DPLL_CTRL2_DDI_CLK_SEL_MASK(port));
		val |= (DPLL_CTRL2_DDI_CLK_SEL(dpll, port) |
			DPLL_CTRL2_DDI_SEL_OVERRIDE(port));

		I915_WRITE(DPLL_CTRL2, val);
1616

1617 1618 1619
	} else if (INTEL_INFO(dev_priv)->gen < 9) {
		WARN_ON(pipe_config->ddi_pll_sel == PORT_CLK_SEL_NONE);
		I915_WRITE(PORT_CLK_SEL(port), pipe_config->ddi_pll_sel);
1620
	}
1621 1622 1623 1624 1625
}

static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder)
{
	struct drm_encoder *encoder = &intel_encoder->base;
1626
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
1627 1628 1629
	struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
	enum port port = intel_ddi_get_encoder_port(intel_encoder);
	int type = intel_encoder->type;
1630

1631 1632 1633 1634 1635 1636
	if (type == INTEL_OUTPUT_HDMI) {
		struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);

		intel_dp_dual_mode_set_tmds_output(intel_hdmi, true);
	}

1637 1638 1639 1640 1641 1642
	if (type == INTEL_OUTPUT_EDP) {
		struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
		intel_edp_panel_on(intel_dp);
	}

	intel_ddi_clk_select(intel_encoder, crtc->config);
1643

1644
	if (type == INTEL_OUTPUT_DP || type == INTEL_OUTPUT_EDP) {
1645
		struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1646

1647 1648
		intel_prepare_dp_ddi_buffers(intel_encoder);

1649 1650
		intel_dp_set_link_params(intel_dp, crtc->config);

1651
		intel_ddi_init_dp_buf_reg(intel_encoder);
1652 1653 1654

		intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
		intel_dp_start_link_train(intel_dp);
1655
		if (port != PORT_A || INTEL_INFO(dev_priv)->gen >= 9)
1656
			intel_dp_stop_link_train(intel_dp);
1657 1658
	} else if (type == INTEL_OUTPUT_HDMI) {
		struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
1659 1660
		int level = intel_ddi_hdmi_level(dev_priv, port);

1661 1662
		intel_prepare_hdmi_ddi_buffers(intel_encoder);

1663 1664
		if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv))
			skl_ddi_set_iboost(intel_encoder, level);
1665 1666 1667
		else if (IS_BROXTON(dev_priv))
			bxt_ddi_vswing_sequence(dev_priv, level, port,
						INTEL_OUTPUT_HDMI);
1668 1669

		intel_hdmi->set_infoframes(encoder,
1670 1671
					   crtc->config->has_hdmi_sink,
					   &crtc->config->base.adjusted_mode);
1672
	}
1673 1674
}

P
Paulo Zanoni 已提交
1675
static void intel_ddi_post_disable(struct intel_encoder *intel_encoder)
1676 1677
{
	struct drm_encoder *encoder = &intel_encoder->base;
1678
	struct drm_device *dev = encoder->dev;
1679
	struct drm_i915_private *dev_priv = to_i915(dev);
1680
	enum port port = intel_ddi_get_encoder_port(intel_encoder);
1681
	int type = intel_encoder->type;
1682
	uint32_t val;
1683
	bool wait = false;
1684 1685 1686 1687 1688

	val = I915_READ(DDI_BUF_CTL(port));
	if (val & DDI_BUF_CTL_ENABLE) {
		val &= ~DDI_BUF_CTL_ENABLE;
		I915_WRITE(DDI_BUF_CTL(port), val);
1689
		wait = true;
1690
	}
1691

1692 1693 1694 1695 1696 1697 1698 1699
	val = I915_READ(DP_TP_CTL(port));
	val &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
	val |= DP_TP_CTL_LINK_TRAIN_PAT1;
	I915_WRITE(DP_TP_CTL(port), val);

	if (wait)
		intel_wait_ddi_buf_idle(dev_priv, port);

1700
	if (type == INTEL_OUTPUT_DP || type == INTEL_OUTPUT_EDP) {
1701
		struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1702
		intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
1703
		intel_edp_panel_vdd_on(intel_dp);
1704
		intel_edp_panel_off(intel_dp);
1705 1706
	}

1707
	if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
1708 1709
		I915_WRITE(DPLL_CTRL2, (I915_READ(DPLL_CTRL2) |
					DPLL_CTRL2_DDI_CLK_OFF(port)));
1710
	else if (INTEL_INFO(dev)->gen < 9)
1711
		I915_WRITE(PORT_CLK_SEL(port), PORT_CLK_SEL_NONE);
1712 1713 1714 1715 1716 1717

	if (type == INTEL_OUTPUT_HDMI) {
		struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);

		intel_dp_dual_mode_set_tmds_output(intel_hdmi, false);
	}
1718 1719
}

P
Paulo Zanoni 已提交
1720
static void intel_enable_ddi(struct intel_encoder *intel_encoder)
1721
{
1722
	struct drm_encoder *encoder = &intel_encoder->base;
1723 1724
	struct drm_crtc *crtc = encoder->crtc;
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1725
	struct drm_device *dev = encoder->dev;
1726
	struct drm_i915_private *dev_priv = to_i915(dev);
1727 1728
	enum port port = intel_ddi_get_encoder_port(intel_encoder);
	int type = intel_encoder->type;
1729

1730
	if (type == INTEL_OUTPUT_HDMI) {
1731 1732 1733
		struct intel_digital_port *intel_dig_port =
			enc_to_dig_port(encoder);

1734 1735 1736 1737
		/* In HDMI/DVI mode, the port width, and swing/emphasis values
		 * are ignored so nothing special needs to be done besides
		 * enabling the port.
		 */
1738
		I915_WRITE(DDI_BUF_CTL(port),
1739 1740
			   intel_dig_port->saved_port_bits |
			   DDI_BUF_CTL_ENABLE);
1741 1742 1743
	} else if (type == INTEL_OUTPUT_EDP) {
		struct intel_dp *intel_dp = enc_to_intel_dp(encoder);

1744
		if (port == PORT_A && INTEL_INFO(dev)->gen < 9)
1745 1746
			intel_dp_stop_link_train(intel_dp);

1747
		intel_edp_backlight_on(intel_dp);
R
Rodrigo Vivi 已提交
1748
		intel_psr_enable(intel_dp);
V
Vandana Kannan 已提交
1749
		intel_edp_drrs_enable(intel_dp);
1750
	}
1751

1752
	if (intel_crtc->config->has_audio) {
1753
		intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO);
1754
		intel_audio_codec_enable(intel_encoder);
1755
	}
1756 1757
}

P
Paulo Zanoni 已提交
1758
static void intel_disable_ddi(struct intel_encoder *intel_encoder)
1759
{
1760
	struct drm_encoder *encoder = &intel_encoder->base;
1761 1762
	struct drm_crtc *crtc = encoder->crtc;
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1763
	int type = intel_encoder->type;
1764
	struct drm_device *dev = encoder->dev;
1765
	struct drm_i915_private *dev_priv = to_i915(dev);
1766

1767
	if (intel_crtc->config->has_audio) {
1768
		intel_audio_codec_disable(intel_encoder);
1769 1770
		intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO);
	}
1771

1772 1773 1774
	if (type == INTEL_OUTPUT_EDP) {
		struct intel_dp *intel_dp = enc_to_intel_dp(encoder);

V
Vandana Kannan 已提交
1775
		intel_edp_drrs_disable(intel_dp);
R
Rodrigo Vivi 已提交
1776
		intel_psr_disable(intel_dp);
1777
		intel_edp_backlight_off(intel_dp);
1778
	}
1779
}
P
Paulo Zanoni 已提交
1780

1781 1782
bool bxt_ddi_phy_is_enabled(struct drm_i915_private *dev_priv,
			    enum dpio_phy phy)
1783
{
1784 1785
	enum port port;

1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810
	if (!(I915_READ(BXT_P_CR_GT_DISP_PWRON) & GT_DISPLAY_POWER_ON(phy)))
		return false;

	if ((I915_READ(BXT_PORT_CL1CM_DW0(phy)) &
	     (PHY_POWER_GOOD | PHY_RESERVED)) != PHY_POWER_GOOD) {
		DRM_DEBUG_DRIVER("DDI PHY %d powered, but power hasn't settled\n",
				 phy);

		return false;
	}

	if (phy == DPIO_PHY1 &&
	    !(I915_READ(BXT_PORT_REF_DW3(DPIO_PHY1)) & GRC_DONE)) {
		DRM_DEBUG_DRIVER("DDI PHY 1 powered, but GRC isn't done\n");

		return false;
	}

	if (!(I915_READ(BXT_PHY_CTL_FAMILY(phy)) & COMMON_RESET_DIS)) {
		DRM_DEBUG_DRIVER("DDI PHY %d powered, but still in reset\n",
				 phy);

		return false;
	}

1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825
	for_each_port_masked(port,
			     phy == DPIO_PHY0 ? BIT(PORT_B) | BIT(PORT_C) :
						BIT(PORT_A)) {
		u32 tmp = I915_READ(BXT_PHY_CTL(port));

		if (tmp & BXT_PHY_CMNLANE_POWERDOWN_ACK) {
			DRM_DEBUG_DRIVER("DDI PHY %d powered, but common lane "
					 "for port %c powered down "
					 "(PHY_CTL %08x)\n",
					 phy, port_name(port), tmp);

			return false;
		}
	}

1826 1827 1828
	return true;
}

1829
static u32 bxt_get_grc(struct drm_i915_private *dev_priv, enum dpio_phy phy)
1830 1831 1832 1833 1834 1835
{
	u32 val = I915_READ(BXT_PORT_REF_DW6(phy));

	return (val & GRC_CODE_MASK) >> GRC_CODE_SHIFT;
}

1836 1837
static void bxt_phy_wait_grc_done(struct drm_i915_private *dev_priv,
				  enum dpio_phy phy)
1838
{
1839 1840 1841 1842
	if (intel_wait_for_register(dev_priv,
				    BXT_PORT_REF_DW3(phy),
				    GRC_DONE, GRC_DONE,
				    10))
1843 1844 1845
		DRM_ERROR("timeout waiting for PHY%d GRC\n", phy);
}

1846
void bxt_ddi_phy_init(struct drm_i915_private *dev_priv, enum dpio_phy phy)
1847
{
1848
	u32 val;
1849

1850
	if (bxt_ddi_phy_is_enabled(dev_priv, phy)) {
1851
		/* Still read out the GRC value for state verification */
1852
		if (phy == DPIO_PHY0)
1853
			dev_priv->bxt_phy_grc = bxt_get_grc(dev_priv, phy);
1854

1855
		if (bxt_ddi_phy_verify_state(dev_priv, phy)) {
1856 1857 1858 1859 1860
			DRM_DEBUG_DRIVER("DDI PHY %d already enabled, "
					 "won't reprogram it\n", phy);

			return;
		}
1861

1862 1863 1864
		DRM_DEBUG_DRIVER("DDI PHY %d enabled with invalid state, "
				 "force reprogramming it\n", phy);
	}
1865

1866 1867 1868 1869
	val = I915_READ(BXT_P_CR_GT_DISP_PWRON);
	val |= GT_DISPLAY_POWER_ON(phy);
	I915_WRITE(BXT_P_CR_GT_DISP_PWRON, val);

1870 1871 1872 1873 1874 1875 1876 1877 1878 1879
	/*
	 * The PHY registers start out inaccessible and respond to reads with
	 * all 1s.  Eventually they become accessible as they power up, then
	 * the reserved bit will give the default 0.  Poll on the reserved bit
	 * becoming 0 to find when the PHY is accessible.
	 * HW team confirmed that the time to reach phypowergood status is
	 * anywhere between 50 us and 100us.
	 */
	if (wait_for_us(((I915_READ(BXT_PORT_CL1CM_DW0(phy)) &
		(PHY_RESERVED | PHY_POWER_GOOD)) == PHY_POWER_GOOD), 100)) {
1880
		DRM_ERROR("timeout during PHY%d power on\n", phy);
1881
	}
1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913

	/* Program PLL Rcomp code offset */
	val = I915_READ(BXT_PORT_CL1CM_DW9(phy));
	val &= ~IREF0RC_OFFSET_MASK;
	val |= 0xE4 << IREF0RC_OFFSET_SHIFT;
	I915_WRITE(BXT_PORT_CL1CM_DW9(phy), val);

	val = I915_READ(BXT_PORT_CL1CM_DW10(phy));
	val &= ~IREF1RC_OFFSET_MASK;
	val |= 0xE4 << IREF1RC_OFFSET_SHIFT;
	I915_WRITE(BXT_PORT_CL1CM_DW10(phy), val);

	/* Program power gating */
	val = I915_READ(BXT_PORT_CL1CM_DW28(phy));
	val |= OCL1_POWER_DOWN_EN | DW28_OLDO_DYN_PWR_DOWN_EN |
		SUS_CLK_CONFIG;
	I915_WRITE(BXT_PORT_CL1CM_DW28(phy), val);

	if (phy == DPIO_PHY0) {
		val = I915_READ(BXT_PORT_CL2CM_DW6_BC);
		val |= DW6_OLDO_DYN_PWR_DOWN_EN;
		I915_WRITE(BXT_PORT_CL2CM_DW6_BC, val);
	}

	val = I915_READ(BXT_PORT_CL1CM_DW30(phy));
	val &= ~OCL2_LDOFUSE_PWR_DIS;
	/*
	 * On PHY1 disable power on the second channel, since no port is
	 * connected there. On PHY0 both channels have a port, so leave it
	 * enabled.
	 * TODO: port C is only connected on BXT-P, so on BXT0/1 we should
	 * power down the second channel on PHY0 as well.
1914 1915 1916
	 *
	 * FIXME: Clarify programming of the following, the register is
	 * read-only with bit 6 fixed at 0 at least in stepping A.
1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928
	 */
	if (phy == DPIO_PHY1)
		val |= OCL2_LDOFUSE_PWR_DIS;
	I915_WRITE(BXT_PORT_CL1CM_DW30(phy), val);

	if (phy == DPIO_PHY0) {
		uint32_t grc_code;
		/*
		 * PHY0 isn't connected to an RCOMP resistor so copy over
		 * the corresponding calibrated value from PHY1, and disable
		 * the automatic calibration on PHY0.
		 */
1929
		val = dev_priv->bxt_phy_grc = bxt_get_grc(dev_priv, DPIO_PHY1);
1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942
		grc_code = val << GRC_CODE_FAST_SHIFT |
			   val << GRC_CODE_SLOW_SHIFT |
			   val;
		I915_WRITE(BXT_PORT_REF_DW6(DPIO_PHY0), grc_code);

		val = I915_READ(BXT_PORT_REF_DW8(DPIO_PHY0));
		val |= GRC_DIS | GRC_RDY_OVRD;
		I915_WRITE(BXT_PORT_REF_DW8(DPIO_PHY0), val);
	}

	val = I915_READ(BXT_PHY_CTL_FAMILY(phy));
	val |= COMMON_RESET_DIS;
	I915_WRITE(BXT_PHY_CTL_FAMILY(phy), val);
1943 1944

	if (phy == DPIO_PHY1)
1945
		bxt_phy_wait_grc_done(dev_priv, DPIO_PHY1);
1946 1947
}

1948
void bxt_ddi_phy_uninit(struct drm_i915_private *dev_priv, enum dpio_phy phy)
1949 1950 1951 1952 1953 1954
{
	uint32_t val;

	val = I915_READ(BXT_PHY_CTL_FAMILY(phy));
	val &= ~COMMON_RESET_DIS;
	I915_WRITE(BXT_PHY_CTL_FAMILY(phy), val);
1955 1956 1957 1958

	val = I915_READ(BXT_P_CR_GT_DISP_PWRON);
	val &= ~GT_DISPLAY_POWER_ON(phy);
	I915_WRITE(BXT_P_CR_GT_DISP_PWRON, val);
1959 1960
}

1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987
static bool __printf(6, 7)
__phy_reg_verify_state(struct drm_i915_private *dev_priv, enum dpio_phy phy,
		       i915_reg_t reg, u32 mask, u32 expected,
		       const char *reg_fmt, ...)
{
	struct va_format vaf;
	va_list args;
	u32 val;

	val = I915_READ(reg);
	if ((val & mask) == expected)
		return true;

	va_start(args, reg_fmt);
	vaf.fmt = reg_fmt;
	vaf.va = &args;

	DRM_DEBUG_DRIVER("DDI PHY %d reg %pV [%08x] state mismatch: "
			 "current %08x, expected %08x (mask %08x)\n",
			 phy, &vaf, reg.reg, val, (val & ~mask) | expected,
			 mask);

	va_end(args);

	return false;
}

1988 1989
bool bxt_ddi_phy_verify_state(struct drm_i915_private *dev_priv,
			      enum dpio_phy phy)
1990 1991 1992 1993 1994 1995 1996 1997
{
	uint32_t mask;
	bool ok;

#define _CHK(reg, mask, exp, fmt, ...)					\
	__phy_reg_verify_state(dev_priv, phy, reg, mask, exp, fmt,	\
			       ## __VA_ARGS__)

1998
	if (!bxt_ddi_phy_is_enabled(dev_priv, phy))
1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045
		return false;

	ok = true;

	/* PLL Rcomp code offset */
	ok &= _CHK(BXT_PORT_CL1CM_DW9(phy),
		    IREF0RC_OFFSET_MASK, 0xe4 << IREF0RC_OFFSET_SHIFT,
		    "BXT_PORT_CL1CM_DW9(%d)", phy);
	ok &= _CHK(BXT_PORT_CL1CM_DW10(phy),
		    IREF1RC_OFFSET_MASK, 0xe4 << IREF1RC_OFFSET_SHIFT,
		    "BXT_PORT_CL1CM_DW10(%d)", phy);

	/* Power gating */
	mask = OCL1_POWER_DOWN_EN | DW28_OLDO_DYN_PWR_DOWN_EN | SUS_CLK_CONFIG;
	ok &= _CHK(BXT_PORT_CL1CM_DW28(phy), mask, mask,
		    "BXT_PORT_CL1CM_DW28(%d)", phy);

	if (phy == DPIO_PHY0)
		ok &= _CHK(BXT_PORT_CL2CM_DW6_BC,
			   DW6_OLDO_DYN_PWR_DOWN_EN, DW6_OLDO_DYN_PWR_DOWN_EN,
			   "BXT_PORT_CL2CM_DW6_BC");

	/*
	 * TODO: Verify BXT_PORT_CL1CM_DW30 bit OCL2_LDOFUSE_PWR_DIS,
	 * at least on stepping A this bit is read-only and fixed at 0.
	 */

	if (phy == DPIO_PHY0) {
		u32 grc_code = dev_priv->bxt_phy_grc;

		grc_code = grc_code << GRC_CODE_FAST_SHIFT |
			   grc_code << GRC_CODE_SLOW_SHIFT |
			   grc_code;
		mask = GRC_CODE_FAST_MASK | GRC_CODE_SLOW_MASK |
		       GRC_CODE_NOM_MASK;
		ok &= _CHK(BXT_PORT_REF_DW6(DPIO_PHY0), mask, grc_code,
			    "BXT_PORT_REF_DW6(%d)", DPIO_PHY0);

		mask = GRC_DIS | GRC_RDY_OVRD;
		ok &= _CHK(BXT_PORT_REF_DW8(DPIO_PHY0), mask, mask,
			    "BXT_PORT_REF_DW8(%d)", DPIO_PHY0);
	}

	return ok;
#undef _CHK
}

2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106
static uint8_t
bxt_ddi_phy_calc_lane_lat_optim_mask(struct intel_encoder *encoder,
				     struct intel_crtc_state *pipe_config)
{
	switch (pipe_config->lane_count) {
	case 1:
		return 0;
	case 2:
		return BIT(2) | BIT(0);
	case 4:
		return BIT(3) | BIT(2) | BIT(0);
	default:
		MISSING_CASE(pipe_config->lane_count);

		return 0;
	}
}

static void bxt_ddi_pre_pll_enable(struct intel_encoder *encoder)
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
	struct drm_i915_private *dev_priv = to_i915(dport->base.base.dev);
	enum port port = dport->port;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
	int lane;

	for (lane = 0; lane < 4; lane++) {
		u32 val = I915_READ(BXT_PORT_TX_DW14_LN(port, lane));

		/*
		 * Note that on CHV this flag is called UPAR, but has
		 * the same function.
		 */
		val &= ~LATENCY_OPTIM;
		if (intel_crtc->config->lane_lat_optim_mask & BIT(lane))
			val |= LATENCY_OPTIM;

		I915_WRITE(BXT_PORT_TX_DW14_LN(port, lane), val);
	}
}

static uint8_t
bxt_ddi_phy_get_lane_lat_optim_mask(struct intel_encoder *encoder)
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
	struct drm_i915_private *dev_priv = to_i915(dport->base.base.dev);
	enum port port = dport->port;
	int lane;
	uint8_t mask;

	mask = 0;
	for (lane = 0; lane < 4; lane++) {
		u32 val = I915_READ(BXT_PORT_TX_DW14_LN(port, lane));

		if (val & LATENCY_OPTIM)
			mask |= BIT(lane);
	}

	return mask;
}

2107
void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp)
2108
{
2109 2110 2111
	struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
	struct drm_i915_private *dev_priv =
		to_i915(intel_dig_port->base.base.dev);
2112
	enum port port = intel_dig_port->port;
2113
	uint32_t val;
2114
	bool wait = false;
2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133

	if (I915_READ(DP_TP_CTL(port)) & DP_TP_CTL_ENABLE) {
		val = I915_READ(DDI_BUF_CTL(port));
		if (val & DDI_BUF_CTL_ENABLE) {
			val &= ~DDI_BUF_CTL_ENABLE;
			I915_WRITE(DDI_BUF_CTL(port), val);
			wait = true;
		}

		val = I915_READ(DP_TP_CTL(port));
		val &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
		val |= DP_TP_CTL_LINK_TRAIN_PAT1;
		I915_WRITE(DP_TP_CTL(port), val);
		POSTING_READ(DP_TP_CTL(port));

		if (wait)
			intel_wait_ddi_buf_idle(dev_priv, port);
	}

2134
	val = DP_TP_CTL_ENABLE |
2135
	      DP_TP_CTL_LINK_TRAIN_PAT1 | DP_TP_CTL_SCRAMBLE_DISABLE;
2136 2137 2138 2139 2140 2141 2142
	if (intel_dp->is_mst)
		val |= DP_TP_CTL_MODE_MST;
	else {
		val |= DP_TP_CTL_MODE_SST;
		if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
			val |= DP_TP_CTL_ENHANCED_FRAME_ENABLE;
	}
2143 2144 2145 2146 2147 2148 2149 2150 2151
	I915_WRITE(DP_TP_CTL(port), val);
	POSTING_READ(DP_TP_CTL(port));

	intel_dp->DP |= DDI_BUF_CTL_ENABLE;
	I915_WRITE(DDI_BUF_CTL(port), intel_dp->DP);
	POSTING_READ(DDI_BUF_CTL(port));

	udelay(600);
}
P
Paulo Zanoni 已提交
2152

2153 2154
void intel_ddi_fdi_disable(struct drm_crtc *crtc)
{
2155
	struct drm_i915_private *dev_priv = to_i915(crtc->dev);
2156 2157 2158
	struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
	uint32_t val;

2159 2160 2161 2162 2163 2164
	/*
	 * Bspec lists this as both step 13 (before DDI_BUF_CTL disable)
	 * and step 18 (after clearing PORT_CLK_SEL). Based on a BUN,
	 * step 13 is the correct place for it. Step 18 is where it was
	 * originally before the BUN.
	 */
2165
	val = I915_READ(FDI_RX_CTL(PIPE_A));
2166
	val &= ~FDI_RX_ENABLE;
2167
	I915_WRITE(FDI_RX_CTL(PIPE_A), val);
2168

2169 2170
	intel_ddi_post_disable(intel_encoder);

2171
	val = I915_READ(FDI_RX_MISC(PIPE_A));
2172 2173
	val &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
	val |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2);
2174
	I915_WRITE(FDI_RX_MISC(PIPE_A), val);
2175

2176
	val = I915_READ(FDI_RX_CTL(PIPE_A));
2177
	val &= ~FDI_PCDCLK;
2178
	I915_WRITE(FDI_RX_CTL(PIPE_A), val);
2179

2180
	val = I915_READ(FDI_RX_CTL(PIPE_A));
2181
	val &= ~FDI_RX_PLL_ENABLE;
2182
	I915_WRITE(FDI_RX_CTL(PIPE_A), val);
2183 2184
}

2185
void intel_ddi_get_config(struct intel_encoder *encoder,
2186
			  struct intel_crtc_state *pipe_config)
2187
{
2188
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2189
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
2190
	enum transcoder cpu_transcoder = pipe_config->cpu_transcoder;
2191
	struct intel_hdmi *intel_hdmi;
2192 2193
	u32 temp, flags = 0;

J
Jani Nikula 已提交
2194 2195 2196 2197
	/* XXX: DSI transcoder paranoia */
	if (WARN_ON(transcoder_is_dsi(cpu_transcoder)))
		return;

2198 2199 2200 2201 2202 2203 2204 2205 2206 2207
	temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
	if (temp & TRANS_DDI_PHSYNC)
		flags |= DRM_MODE_FLAG_PHSYNC;
	else
		flags |= DRM_MODE_FLAG_NHSYNC;
	if (temp & TRANS_DDI_PVSYNC)
		flags |= DRM_MODE_FLAG_PVSYNC;
	else
		flags |= DRM_MODE_FLAG_NVSYNC;

2208
	pipe_config->base.adjusted_mode.flags |= flags;
2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225

	switch (temp & TRANS_DDI_BPC_MASK) {
	case TRANS_DDI_BPC_6:
		pipe_config->pipe_bpp = 18;
		break;
	case TRANS_DDI_BPC_8:
		pipe_config->pipe_bpp = 24;
		break;
	case TRANS_DDI_BPC_10:
		pipe_config->pipe_bpp = 30;
		break;
	case TRANS_DDI_BPC_12:
		pipe_config->pipe_bpp = 36;
		break;
	default:
		break;
	}
2226 2227 2228

	switch (temp & TRANS_DDI_MODE_SELECT_MASK) {
	case TRANS_DDI_MODE_SELECT_HDMI:
2229
		pipe_config->has_hdmi_sink = true;
2230 2231
		intel_hdmi = enc_to_intel_hdmi(&encoder->base);

2232
		if (intel_hdmi->infoframe_enabled(&encoder->base, pipe_config))
2233
			pipe_config->has_infoframe = true;
2234
		/* fall through */
2235
	case TRANS_DDI_MODE_SELECT_DVI:
2236 2237
		pipe_config->lane_count = 4;
		break;
2238 2239 2240 2241
	case TRANS_DDI_MODE_SELECT_FDI:
		break;
	case TRANS_DDI_MODE_SELECT_DP_SST:
	case TRANS_DDI_MODE_SELECT_DP_MST:
2242 2243
		pipe_config->lane_count =
			((temp & DDI_PORT_WIDTH_MASK) >> DDI_PORT_WIDTH_SHIFT) + 1;
2244 2245 2246 2247 2248
		intel_dp_get_m_n(intel_crtc, pipe_config);
		break;
	default:
		break;
	}
2249

2250 2251 2252 2253 2254
	if (intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_AUDIO)) {
		temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
		if (temp & AUDIO_OUTPUT_ENABLE(intel_crtc->pipe))
			pipe_config->has_audio = true;
	}
2255

2256 2257
	if (encoder->type == INTEL_OUTPUT_EDP && dev_priv->vbt.edp.bpp &&
	    pipe_config->pipe_bpp > dev_priv->vbt.edp.bpp) {
2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271
		/*
		 * This is a big fat ugly hack.
		 *
		 * Some machines in UEFI boot mode provide us a VBT that has 18
		 * bpp and 1.62 GHz link bandwidth for eDP, which for reasons
		 * unknown we fail to light up. Yet the same BIOS boots up with
		 * 24 bpp and 2.7 GHz link. Use the same bpp as the BIOS uses as
		 * max, not what it tells us to use.
		 *
		 * Note: This will still be broken if the eDP panel is not lit
		 * up by the BIOS, and thus we can't get the mode at module
		 * load.
		 */
		DRM_DEBUG_KMS("pipe has %d bpp for eDP panel, overriding BIOS-provided max %d bpp\n",
2272 2273
			      pipe_config->pipe_bpp, dev_priv->vbt.edp.bpp);
		dev_priv->vbt.edp.bpp = pipe_config->pipe_bpp;
2274
	}
2275

2276
	intel_ddi_clock_get(encoder, pipe_config);
2277 2278 2279 2280

	if (IS_BROXTON(dev_priv))
		pipe_config->lane_lat_optim_mask =
			bxt_ddi_phy_get_lane_lat_optim_mask(encoder);
2281 2282
}

2283
static bool intel_ddi_compute_config(struct intel_encoder *encoder,
2284
				     struct intel_crtc_state *pipe_config)
P
Paulo Zanoni 已提交
2285
{
2286
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2287
	int type = encoder->type;
2288
	int port = intel_ddi_get_encoder_port(encoder);
2289
	int ret;
P
Paulo Zanoni 已提交
2290

2291
	WARN(type == INTEL_OUTPUT_UNKNOWN, "compute_config() on unknown output!\n");
P
Paulo Zanoni 已提交
2292

2293 2294 2295
	if (port == PORT_A)
		pipe_config->cpu_transcoder = TRANSCODER_EDP;

P
Paulo Zanoni 已提交
2296
	if (type == INTEL_OUTPUT_HDMI)
2297
		ret = intel_hdmi_compute_config(encoder, pipe_config);
P
Paulo Zanoni 已提交
2298
	else
2299 2300 2301 2302 2303 2304 2305 2306 2307
		ret = intel_dp_compute_config(encoder, pipe_config);

	if (IS_BROXTON(dev_priv) && ret)
		pipe_config->lane_lat_optim_mask =
			bxt_ddi_phy_calc_lane_lat_optim_mask(encoder,
							     pipe_config);

	return ret;

P
Paulo Zanoni 已提交
2308 2309 2310
}

static const struct drm_encoder_funcs intel_ddi_funcs = {
2311 2312
	.reset = intel_dp_encoder_reset,
	.destroy = intel_dp_encoder_destroy,
P
Paulo Zanoni 已提交
2313 2314
};

2315 2316 2317 2318 2319 2320
static struct intel_connector *
intel_ddi_init_dp_connector(struct intel_digital_port *intel_dig_port)
{
	struct intel_connector *connector;
	enum port port = intel_dig_port->port;

2321
	connector = intel_connector_alloc();
2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339
	if (!connector)
		return NULL;

	intel_dig_port->dp.output_reg = DDI_BUF_CTL(port);
	if (!intel_dp_init_connector(intel_dig_port, connector)) {
		kfree(connector);
		return NULL;
	}

	return connector;
}

static struct intel_connector *
intel_ddi_init_hdmi_connector(struct intel_digital_port *intel_dig_port)
{
	struct intel_connector *connector;
	enum port port = intel_dig_port->port;

2340
	connector = intel_connector_alloc();
2341 2342 2343 2344 2345 2346 2347 2348 2349
	if (!connector)
		return NULL;

	intel_dig_port->hdmi.hdmi_reg = DDI_BUF_CTL(port);
	intel_hdmi_init_connector(intel_dig_port, connector);

	return connector;
}

P
Paulo Zanoni 已提交
2350 2351
void intel_ddi_init(struct drm_device *dev, enum port port)
{
2352
	struct drm_i915_private *dev_priv = to_i915(dev);
P
Paulo Zanoni 已提交
2353 2354 2355
	struct intel_digital_port *intel_dig_port;
	struct intel_encoder *intel_encoder;
	struct drm_encoder *encoder;
2356
	bool init_hdmi, init_dp;
2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383
	int max_lanes;

	if (I915_READ(DDI_BUF_CTL(PORT_A)) & DDI_A_4_LANES) {
		switch (port) {
		case PORT_A:
			max_lanes = 4;
			break;
		case PORT_E:
			max_lanes = 0;
			break;
		default:
			max_lanes = 4;
			break;
		}
	} else {
		switch (port) {
		case PORT_A:
			max_lanes = 2;
			break;
		case PORT_E:
			max_lanes = 2;
			break;
		default:
			max_lanes = 4;
			break;
		}
	}
2384 2385 2386 2387 2388

	init_hdmi = (dev_priv->vbt.ddi_port_info[port].supports_dvi ||
		     dev_priv->vbt.ddi_port_info[port].supports_hdmi);
	init_dp = dev_priv->vbt.ddi_port_info[port].supports_dp;
	if (!init_dp && !init_hdmi) {
2389
		DRM_DEBUG_KMS("VBT says port %c is not DVI/HDMI/DP compatible, respect it\n",
2390
			      port_name(port));
2391
		return;
2392
	}
P
Paulo Zanoni 已提交
2393

2394
	intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
P
Paulo Zanoni 已提交
2395 2396 2397 2398 2399 2400 2401
	if (!intel_dig_port)
		return;

	intel_encoder = &intel_dig_port->base;
	encoder = &intel_encoder->base;

	drm_encoder_init(dev, encoder, &intel_ddi_funcs,
2402
			 DRM_MODE_ENCODER_TMDS, "DDI %c", port_name(port));
P
Paulo Zanoni 已提交
2403

2404
	intel_encoder->compute_config = intel_ddi_compute_config;
P
Paulo Zanoni 已提交
2405
	intel_encoder->enable = intel_enable_ddi;
2406 2407
	if (IS_BROXTON(dev_priv))
		intel_encoder->pre_pll_enable = bxt_ddi_pre_pll_enable;
P
Paulo Zanoni 已提交
2408 2409 2410 2411
	intel_encoder->pre_enable = intel_ddi_pre_enable;
	intel_encoder->disable = intel_disable_ddi;
	intel_encoder->post_disable = intel_ddi_post_disable;
	intel_encoder->get_hw_state = intel_ddi_get_hw_state;
2412
	intel_encoder->get_config = intel_ddi_get_config;
2413
	intel_encoder->suspend = intel_dp_encoder_suspend;
P
Paulo Zanoni 已提交
2414 2415

	intel_dig_port->port = port;
2416 2417 2418
	intel_dig_port->saved_port_bits = I915_READ(DDI_BUF_CTL(port)) &
					  (DDI_BUF_PORT_REVERSAL |
					   DDI_A_4_LANES);
P
Paulo Zanoni 已提交
2419

2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430
	/*
	 * Bspec says that DDI_A_4_LANES is the only supported configuration
	 * for Broxton.  Yet some BIOS fail to set this bit on port A if eDP
	 * wasn't lit up at boot.  Force this bit on in our internal
	 * configuration so that we use the proper lane count for our
	 * calculations.
	 */
	if (IS_BROXTON(dev) && port == PORT_A) {
		if (!(intel_dig_port->saved_port_bits & DDI_A_4_LANES)) {
			DRM_DEBUG_KMS("BXT BIOS forgot to set DDI_A_4_LANES for port A; fixing\n");
			intel_dig_port->saved_port_bits |= DDI_A_4_LANES;
2431
			max_lanes = 4;
2432 2433 2434
		}
	}

2435 2436
	intel_dig_port->max_lanes = max_lanes;

P
Paulo Zanoni 已提交
2437
	intel_encoder->type = INTEL_OUTPUT_UNKNOWN;
2438
	intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
2439
	intel_encoder->cloneable = 0;
P
Paulo Zanoni 已提交
2440

2441 2442 2443
	if (init_dp) {
		if (!intel_ddi_init_dp_connector(intel_dig_port))
			goto err;
2444

2445
		intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
2446 2447 2448 2449
		/*
		 * On BXT A0/A1, sw needs to activate DDIA HPD logic and
		 * interrupts to check the external panel connection.
		 */
2450
		if (IS_BXT_REVID(dev, 0, BXT_REVID_A1) && port == PORT_B)
2451 2452 2453
			dev_priv->hotplug.irq_port[PORT_A] = intel_dig_port;
		else
			dev_priv->hotplug.irq_port[port] = intel_dig_port;
2454
	}
2455

2456 2457
	/* In theory we don't need the encoder->type check, but leave it just in
	 * case we have some really bad VBTs... */
2458 2459 2460
	if (intel_encoder->type != INTEL_OUTPUT_EDP && init_hdmi) {
		if (!intel_ddi_init_hdmi_connector(intel_dig_port))
			goto err;
2461
	}
2462 2463 2464 2465 2466 2467

	return;

err:
	drm_encoder_cleanup(encoder);
	kfree(intel_dig_port);
P
Paulo Zanoni 已提交
2468
}