intel_cdclk.c 81.6 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
/*
 * Copyright © 2006-2017 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.
 */

24
#include <linux/time.h>
25

26
#include "intel_atomic.h"
27
#include "intel_bw.h"
28
#include "intel_cdclk.h"
29
#include "intel_de.h"
30
#include "intel_display_types.h"
31
#include "intel_sideband.h"
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

/**
 * DOC: CDCLK / RAWCLK
 *
 * The display engine uses several different clocks to do its work. There
 * are two main clocks involved that aren't directly related to the actual
 * pixel clock or any symbol/bit clock of the actual output port. These
 * are the core display clock (CDCLK) and RAWCLK.
 *
 * CDCLK clocks most of the display pipe logic, and thus its frequency
 * must be high enough to support the rate at which pixels are flowing
 * through the pipes. Downscaling must also be accounted as that increases
 * the effective pixel rate.
 *
 * On several platforms the CDCLK frequency can be changed dynamically
 * to minimize power consumption for a given display configuration.
 * Typically changes to the CDCLK frequency require all the display pipes
 * to be shut down while the frequency is being changed.
 *
 * On SKL+ the DMC will toggle the CDCLK off/on during DC5/6 entry/exit.
 * DMC will not change the active CDCLK frequency however, so that part
 * will still be performed by the driver directly.
 *
 * RAWCLK is a fixed frequency clock, often used by various auxiliary
 * blocks such as AUX CH or backlight PWM. Hence the only thing we
 * really need to know about RAWCLK is its frequency so that various
 * dividers can be programmed correctly.
 */

61
static void fixed_133mhz_get_cdclk(struct drm_i915_private *dev_priv,
62
				   struct intel_cdclk_config *cdclk_config)
63
{
64
	cdclk_config->cdclk = 133333;
65 66
}

67
static void fixed_200mhz_get_cdclk(struct drm_i915_private *dev_priv,
68
				   struct intel_cdclk_config *cdclk_config)
69
{
70
	cdclk_config->cdclk = 200000;
71 72
}

73
static void fixed_266mhz_get_cdclk(struct drm_i915_private *dev_priv,
74
				   struct intel_cdclk_config *cdclk_config)
75
{
76
	cdclk_config->cdclk = 266667;
77 78
}

79
static void fixed_333mhz_get_cdclk(struct drm_i915_private *dev_priv,
80
				   struct intel_cdclk_config *cdclk_config)
81
{
82
	cdclk_config->cdclk = 333333;
83 84
}

85
static void fixed_400mhz_get_cdclk(struct drm_i915_private *dev_priv,
86
				   struct intel_cdclk_config *cdclk_config)
87
{
88
	cdclk_config->cdclk = 400000;
89 90
}

91
static void fixed_450mhz_get_cdclk(struct drm_i915_private *dev_priv,
92
				   struct intel_cdclk_config *cdclk_config)
93
{
94
	cdclk_config->cdclk = 450000;
95 96
}

97
static void i85x_get_cdclk(struct drm_i915_private *dev_priv,
98
			   struct intel_cdclk_config *cdclk_config)
99
{
100
	struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
101 102 103 104 105 106 107
	u16 hpllcc = 0;

	/*
	 * 852GM/852GMV only supports 133 MHz and the HPLLCC
	 * encoding is different :(
	 * FIXME is this the right way to detect 852GM/852GMV?
	 */
108
	if (pdev->revision == 0x1) {
109
		cdclk_config->cdclk = 133333;
110 111
		return;
	}
112 113 114 115 116 117 118 119 120 121 122

	pci_bus_read_config_word(pdev->bus,
				 PCI_DEVFN(0, 3), HPLLCC, &hpllcc);

	/* Assume that the hardware is in the high speed state.  This
	 * should be the default.
	 */
	switch (hpllcc & GC_CLOCK_CONTROL_MASK) {
	case GC_CLOCK_133_200:
	case GC_CLOCK_133_200_2:
	case GC_CLOCK_100_200:
123
		cdclk_config->cdclk = 200000;
124
		break;
125
	case GC_CLOCK_166_250:
126
		cdclk_config->cdclk = 250000;
127
		break;
128
	case GC_CLOCK_100_133:
129
		cdclk_config->cdclk = 133333;
130
		break;
131 132 133
	case GC_CLOCK_133_266:
	case GC_CLOCK_133_266_2:
	case GC_CLOCK_166_266:
134
		cdclk_config->cdclk = 266667;
135
		break;
136 137 138
	}
}

139
static void i915gm_get_cdclk(struct drm_i915_private *dev_priv,
140
			     struct intel_cdclk_config *cdclk_config)
141
{
142
	struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
143 144 145 146
	u16 gcfgc = 0;

	pci_read_config_word(pdev, GCFGC, &gcfgc);

147
	if (gcfgc & GC_LOW_FREQUENCY_ENABLE) {
148
		cdclk_config->cdclk = 133333;
149 150
		return;
	}
151 152 153

	switch (gcfgc & GC_DISPLAY_CLOCK_MASK) {
	case GC_DISPLAY_CLOCK_333_320_MHZ:
154
		cdclk_config->cdclk = 333333;
155
		break;
156 157
	default:
	case GC_DISPLAY_CLOCK_190_200_MHZ:
158
		cdclk_config->cdclk = 190000;
159
		break;
160 161 162
	}
}

163
static void i945gm_get_cdclk(struct drm_i915_private *dev_priv,
164
			     struct intel_cdclk_config *cdclk_config)
165
{
166
	struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
167 168 169 170
	u16 gcfgc = 0;

	pci_read_config_word(pdev, GCFGC, &gcfgc);

171
	if (gcfgc & GC_LOW_FREQUENCY_ENABLE) {
172
		cdclk_config->cdclk = 133333;
173 174
		return;
	}
175 176 177

	switch (gcfgc & GC_DISPLAY_CLOCK_MASK) {
	case GC_DISPLAY_CLOCK_333_320_MHZ:
178
		cdclk_config->cdclk = 320000;
179
		break;
180 181
	default:
	case GC_DISPLAY_CLOCK_190_200_MHZ:
182
		cdclk_config->cdclk = 200000;
183
		break;
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
	}
}

static unsigned int intel_hpll_vco(struct drm_i915_private *dev_priv)
{
	static const unsigned int blb_vco[8] = {
		[0] = 3200000,
		[1] = 4000000,
		[2] = 5333333,
		[3] = 4800000,
		[4] = 6400000,
	};
	static const unsigned int pnv_vco[8] = {
		[0] = 3200000,
		[1] = 4000000,
		[2] = 5333333,
		[3] = 4800000,
		[4] = 2666667,
	};
	static const unsigned int cl_vco[8] = {
		[0] = 3200000,
		[1] = 4000000,
		[2] = 5333333,
		[3] = 6400000,
		[4] = 3333333,
		[5] = 3566667,
		[6] = 4266667,
	};
	static const unsigned int elk_vco[8] = {
		[0] = 3200000,
		[1] = 4000000,
		[2] = 5333333,
		[3] = 4800000,
	};
	static const unsigned int ctg_vco[8] = {
		[0] = 3200000,
		[1] = 4000000,
		[2] = 5333333,
		[3] = 6400000,
		[4] = 2666667,
		[5] = 4266667,
	};
	const unsigned int *vco_table;
	unsigned int vco;
228
	u8 tmp = 0;
229 230 231 232

	/* FIXME other chipsets? */
	if (IS_GM45(dev_priv))
		vco_table = ctg_vco;
233
	else if (IS_G45(dev_priv))
234 235 236 237 238 239 240 241 242 243
		vco_table = elk_vco;
	else if (IS_I965GM(dev_priv))
		vco_table = cl_vco;
	else if (IS_PINEVIEW(dev_priv))
		vco_table = pnv_vco;
	else if (IS_G33(dev_priv))
		vco_table = blb_vco;
	else
		return 0;

244 245
	tmp = intel_de_read(dev_priv,
			    IS_PINEVIEW(dev_priv) || IS_MOBILE(dev_priv) ? HPLLVCO_MOBILE : HPLLVCO);
246 247 248

	vco = vco_table[tmp & 0x7];
	if (vco == 0)
249 250
		drm_err(&dev_priv->drm, "Bad HPLL VCO (HPLLVCO=0x%02x)\n",
			tmp);
251
	else
252
		drm_dbg_kms(&dev_priv->drm, "HPLL VCO %u kHz\n", vco);
253 254 255 256

	return vco;
}

257
static void g33_get_cdclk(struct drm_i915_private *dev_priv,
258
			  struct intel_cdclk_config *cdclk_config)
259
{
260
	struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
261 262 263 264 265
	static const u8 div_3200[] = { 12, 10,  8,  7, 5, 16 };
	static const u8 div_4000[] = { 14, 12, 10,  8, 6, 20 };
	static const u8 div_4800[] = { 20, 14, 12, 10, 8, 24 };
	static const u8 div_5333[] = { 20, 16, 12, 12, 8, 28 };
	const u8 *div_table;
266
	unsigned int cdclk_sel;
267
	u16 tmp = 0;
268

269
	cdclk_config->vco = intel_hpll_vco(dev_priv);
270

271 272 273 274 275 276 277
	pci_read_config_word(pdev, GCFGC, &tmp);

	cdclk_sel = (tmp >> 4) & 0x7;

	if (cdclk_sel >= ARRAY_SIZE(div_3200))
		goto fail;

278
	switch (cdclk_config->vco) {
279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294
	case 3200000:
		div_table = div_3200;
		break;
	case 4000000:
		div_table = div_4000;
		break;
	case 4800000:
		div_table = div_4800;
		break;
	case 5333333:
		div_table = div_5333;
		break;
	default:
		goto fail;
	}

295 296
	cdclk_config->cdclk = DIV_ROUND_CLOSEST(cdclk_config->vco,
						div_table[cdclk_sel]);
297
	return;
298 299

fail:
300 301
	drm_err(&dev_priv->drm,
		"Unable to determine CDCLK. HPLL VCO=%u kHz, CFGC=0x%08x\n",
302 303
		cdclk_config->vco, tmp);
	cdclk_config->cdclk = 190476;
304 305
}

306
static void pnv_get_cdclk(struct drm_i915_private *dev_priv,
307
			  struct intel_cdclk_config *cdclk_config)
308
{
309
	struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
310 311 312 313 314 315
	u16 gcfgc = 0;

	pci_read_config_word(pdev, GCFGC, &gcfgc);

	switch (gcfgc & GC_DISPLAY_CLOCK_MASK) {
	case GC_DISPLAY_CLOCK_267_MHZ_PNV:
316
		cdclk_config->cdclk = 266667;
317
		break;
318
	case GC_DISPLAY_CLOCK_333_MHZ_PNV:
319
		cdclk_config->cdclk = 333333;
320
		break;
321
	case GC_DISPLAY_CLOCK_444_MHZ_PNV:
322
		cdclk_config->cdclk = 444444;
323
		break;
324
	case GC_DISPLAY_CLOCK_200_MHZ_PNV:
325
		cdclk_config->cdclk = 200000;
326
		break;
327
	default:
328 329
		drm_err(&dev_priv->drm,
			"Unknown pnv display core clock 0x%04x\n", gcfgc);
330
		fallthrough;
331
	case GC_DISPLAY_CLOCK_133_MHZ_PNV:
332
		cdclk_config->cdclk = 133333;
333
		break;
334
	case GC_DISPLAY_CLOCK_167_MHZ_PNV:
335
		cdclk_config->cdclk = 166667;
336
		break;
337 338 339
	}
}

340
static void i965gm_get_cdclk(struct drm_i915_private *dev_priv,
341
			     struct intel_cdclk_config *cdclk_config)
342
{
343
	struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
344 345 346 347
	static const u8 div_3200[] = { 16, 10,  8 };
	static const u8 div_4000[] = { 20, 12, 10 };
	static const u8 div_5333[] = { 24, 16, 14 };
	const u8 *div_table;
348
	unsigned int cdclk_sel;
349
	u16 tmp = 0;
350

351
	cdclk_config->vco = intel_hpll_vco(dev_priv);
352

353 354 355 356 357 358 359
	pci_read_config_word(pdev, GCFGC, &tmp);

	cdclk_sel = ((tmp >> 8) & 0x1f) - 1;

	if (cdclk_sel >= ARRAY_SIZE(div_3200))
		goto fail;

360
	switch (cdclk_config->vco) {
361 362 363 364 365 366 367 368 369 370 371 372 373
	case 3200000:
		div_table = div_3200;
		break;
	case 4000000:
		div_table = div_4000;
		break;
	case 5333333:
		div_table = div_5333;
		break;
	default:
		goto fail;
	}

374 375
	cdclk_config->cdclk = DIV_ROUND_CLOSEST(cdclk_config->vco,
						div_table[cdclk_sel]);
376
	return;
377 378

fail:
379 380
	drm_err(&dev_priv->drm,
		"Unable to determine CDCLK. HPLL VCO=%u kHz, CFGC=0x%04x\n",
381 382
		cdclk_config->vco, tmp);
	cdclk_config->cdclk = 200000;
383 384
}

385
static void gm45_get_cdclk(struct drm_i915_private *dev_priv,
386
			   struct intel_cdclk_config *cdclk_config)
387
{
388
	struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
389
	unsigned int cdclk_sel;
390
	u16 tmp = 0;
391

392
	cdclk_config->vco = intel_hpll_vco(dev_priv);
393

394 395 396 397
	pci_read_config_word(pdev, GCFGC, &tmp);

	cdclk_sel = (tmp >> 12) & 0x1;

398
	switch (cdclk_config->vco) {
399 400 401
	case 2666667:
	case 4000000:
	case 5333333:
402
		cdclk_config->cdclk = cdclk_sel ? 333333 : 222222;
403
		break;
404
	case 3200000:
405
		cdclk_config->cdclk = cdclk_sel ? 320000 : 228571;
406
		break;
407
	default:
408 409
		drm_err(&dev_priv->drm,
			"Unable to determine CDCLK. HPLL VCO=%u, CFGC=0x%04x\n",
410 411
			cdclk_config->vco, tmp);
		cdclk_config->cdclk = 222222;
412
		break;
413 414 415
	}
}

416
static void hsw_get_cdclk(struct drm_i915_private *dev_priv,
417
			  struct intel_cdclk_config *cdclk_config)
418
{
419
	u32 lcpll = intel_de_read(dev_priv, LCPLL_CTL);
420
	u32 freq = lcpll & LCPLL_CLK_FREQ_MASK;
421 422

	if (lcpll & LCPLL_CD_SOURCE_FCLK)
423
		cdclk_config->cdclk = 800000;
424
	else if (intel_de_read(dev_priv, FUSE_STRAP) & HSW_CDCLK_LIMIT)
425
		cdclk_config->cdclk = 450000;
426
	else if (freq == LCPLL_CLK_FREQ_450)
427
		cdclk_config->cdclk = 450000;
428
	else if (IS_HSW_ULT(dev_priv))
429
		cdclk_config->cdclk = 337500;
430
	else
431
		cdclk_config->cdclk = 540000;
432 433
}

434
static int vlv_calc_cdclk(struct drm_i915_private *dev_priv, int min_cdclk)
435 436 437 438 439 440 441 442 443
{
	int freq_320 = (dev_priv->hpll_freq <<  1) % 320000 != 0 ?
		333333 : 320000;

	/*
	 * We seem to get an unstable or solid color picture at 200MHz.
	 * Not sure what's wrong. For now use 200MHz only when all pipes
	 * are off.
	 */
444
	if (IS_VALLEYVIEW(dev_priv) && min_cdclk > freq_320)
445
		return 400000;
446
	else if (min_cdclk > 266667)
447
		return freq_320;
448
	else if (min_cdclk > 0)
449 450 451 452 453
		return 266667;
	else
		return 200000;
}

454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472
static u8 vlv_calc_voltage_level(struct drm_i915_private *dev_priv, int cdclk)
{
	if (IS_VALLEYVIEW(dev_priv)) {
		if (cdclk >= 320000) /* jump to highest voltage for 400MHz too */
			return 2;
		else if (cdclk >= 266667)
			return 1;
		else
			return 0;
	} else {
		/*
		 * Specs are full of misinformation, but testing on actual
		 * hardware has shown that we just need to write the desired
		 * CCK divider into the Punit register.
		 */
		return DIV_ROUND_CLOSEST(dev_priv->hpll_freq << 1, cdclk) - 1;
	}
}

473
static void vlv_get_cdclk(struct drm_i915_private *dev_priv,
474
			  struct intel_cdclk_config *cdclk_config)
475
{
476 477
	u32 val;

478 479 480
	vlv_iosf_sb_get(dev_priv,
			BIT(VLV_IOSF_SB_CCK) | BIT(VLV_IOSF_SB_PUNIT));

481 482 483 484
	cdclk_config->vco = vlv_get_hpll_vco(dev_priv);
	cdclk_config->cdclk = vlv_get_cck_clock(dev_priv, "cdclk",
						CCK_DISPLAY_CLOCK_CONTROL,
						cdclk_config->vco);
485

486
	val = vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM);
487 488 489

	vlv_iosf_sb_put(dev_priv,
			BIT(VLV_IOSF_SB_CCK) | BIT(VLV_IOSF_SB_PUNIT));
490 491

	if (IS_VALLEYVIEW(dev_priv))
492
		cdclk_config->voltage_level = (val & DSPFREQGUAR_MASK) >>
493 494
			DSPFREQGUAR_SHIFT;
	else
495
		cdclk_config->voltage_level = (val & DSPFREQGUAR_MASK_CHV) >>
496
			DSPFREQGUAR_SHIFT_CHV;
497 498 499 500 501 502 503 504 505 506 507
}

static void vlv_program_pfi_credits(struct drm_i915_private *dev_priv)
{
	unsigned int credits, default_credits;

	if (IS_CHERRYVIEW(dev_priv))
		default_credits = PFI_CREDIT(12);
	else
		default_credits = PFI_CREDIT(8);

508
	if (dev_priv->cdclk.hw.cdclk >= dev_priv->czclk_freq) {
509 510 511 512 513 514 515 516 517 518 519 520 521
		/* CHV suggested value is 31 or 63 */
		if (IS_CHERRYVIEW(dev_priv))
			credits = PFI_CREDIT_63;
		else
			credits = PFI_CREDIT(15);
	} else {
		credits = default_credits;
	}

	/*
	 * WA - write default credits before re-programming
	 * FIXME: should we also set the resend bit here?
	 */
522 523
	intel_de_write(dev_priv, GCI_CONTROL,
		       VGA_FAST_MODE_DISABLE | default_credits);
524

525 526
	intel_de_write(dev_priv, GCI_CONTROL,
		       VGA_FAST_MODE_DISABLE | credits | PFI_CREDIT_RESEND);
527 528 529 530 531

	/*
	 * FIXME is this guaranteed to clear
	 * immediately or should we poll for it?
	 */
532 533
	drm_WARN_ON(&dev_priv->drm,
		    intel_de_read(dev_priv, GCI_CONTROL) & PFI_CREDIT_RESEND);
534 535
}

536
static void vlv_set_cdclk(struct drm_i915_private *dev_priv,
537
			  const struct intel_cdclk_config *cdclk_config,
538
			  enum pipe pipe)
539
{
540 541
	int cdclk = cdclk_config->cdclk;
	u32 val, cmd = cdclk_config->voltage_level;
542
	intel_wakeref_t wakeref;
543

544 545 546 547 548 549 550 551 552 553 554 555
	switch (cdclk) {
	case 400000:
	case 333333:
	case 320000:
	case 266667:
	case 200000:
		break;
	default:
		MISSING_CASE(cdclk);
		return;
	}

556 557 558
	/* There are cases where we can end up here with power domains
	 * off and a CDCLK frequency other than the minimum, like when
	 * issuing a modeset without actually changing any display after
559
	 * a system suspend.  So grab the display core domain, which covers
560 561
	 * the HW blocks needed for the following programming.
	 */
562
	wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_DISPLAY_CORE);
563

564 565 566 567 568
	vlv_iosf_sb_get(dev_priv,
			BIT(VLV_IOSF_SB_CCK) |
			BIT(VLV_IOSF_SB_BUNIT) |
			BIT(VLV_IOSF_SB_PUNIT));

569
	val = vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM);
570 571
	val &= ~DSPFREQGUAR_MASK;
	val |= (cmd << DSPFREQGUAR_SHIFT);
572 573
	vlv_punit_write(dev_priv, PUNIT_REG_DSPSSPM, val);
	if (wait_for((vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM) &
574 575
		      DSPFREQSTAT_MASK) == (cmd << DSPFREQSTAT_SHIFT),
		     50)) {
576 577
		drm_err(&dev_priv->drm,
			"timed out waiting for CDclk change\n");
578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594
	}

	if (cdclk == 400000) {
		u32 divider;

		divider = DIV_ROUND_CLOSEST(dev_priv->hpll_freq << 1,
					    cdclk) - 1;

		/* adjust cdclk divider */
		val = vlv_cck_read(dev_priv, CCK_DISPLAY_CLOCK_CONTROL);
		val &= ~CCK_FREQUENCY_VALUES;
		val |= divider;
		vlv_cck_write(dev_priv, CCK_DISPLAY_CLOCK_CONTROL, val);

		if (wait_for((vlv_cck_read(dev_priv, CCK_DISPLAY_CLOCK_CONTROL) &
			      CCK_FREQUENCY_STATUS) == (divider << CCK_FREQUENCY_STATUS_SHIFT),
			     50))
595 596
			drm_err(&dev_priv->drm,
				"timed out waiting for CDclk change\n");
597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612
	}

	/* adjust self-refresh exit latency value */
	val = vlv_bunit_read(dev_priv, BUNIT_REG_BISOC);
	val &= ~0x7f;

	/*
	 * For high bandwidth configs, we set a higher latency in the bunit
	 * so that the core display fetch happens in time to avoid underruns.
	 */
	if (cdclk == 400000)
		val |= 4500 / 250; /* 4.5 usec */
	else
		val |= 3000 / 250; /* 3.0 usec */
	vlv_bunit_write(dev_priv, BUNIT_REG_BISOC, val);

613
	vlv_iosf_sb_put(dev_priv,
614 615 616
			BIT(VLV_IOSF_SB_CCK) |
			BIT(VLV_IOSF_SB_BUNIT) |
			BIT(VLV_IOSF_SB_PUNIT));
617 618

	intel_update_cdclk(dev_priv);
619 620

	vlv_program_pfi_credits(dev_priv);
621

622
	intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
623 624
}

625
static void chv_set_cdclk(struct drm_i915_private *dev_priv,
626
			  const struct intel_cdclk_config *cdclk_config,
627
			  enum pipe pipe)
628
{
629 630
	int cdclk = cdclk_config->cdclk;
	u32 val, cmd = cdclk_config->voltage_level;
631
	intel_wakeref_t wakeref;
632 633 634 635 636 637 638 639 640 641 642 643

	switch (cdclk) {
	case 333333:
	case 320000:
	case 266667:
	case 200000:
		break;
	default:
		MISSING_CASE(cdclk);
		return;
	}

644 645 646
	/* There are cases where we can end up here with power domains
	 * off and a CDCLK frequency other than the minimum, like when
	 * issuing a modeset without actually changing any display after
647
	 * a system suspend.  So grab the display core domain, which covers
648 649
	 * the HW blocks needed for the following programming.
	 */
650
	wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_DISPLAY_CORE);
651

652
	vlv_punit_get(dev_priv);
653
	val = vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM);
654 655
	val &= ~DSPFREQGUAR_MASK_CHV;
	val |= (cmd << DSPFREQGUAR_SHIFT_CHV);
656 657
	vlv_punit_write(dev_priv, PUNIT_REG_DSPSSPM, val);
	if (wait_for((vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM) &
658 659
		      DSPFREQSTAT_MASK_CHV) == (cmd << DSPFREQSTAT_SHIFT_CHV),
		     50)) {
660 661
		drm_err(&dev_priv->drm,
			"timed out waiting for CDclk change\n");
662
	}
663 664

	vlv_punit_put(dev_priv);
665 666

	intel_update_cdclk(dev_priv);
667 668

	vlv_program_pfi_credits(dev_priv);
669

670
	intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
671 672
}

673
static int bdw_calc_cdclk(int min_cdclk)
674
{
675
	if (min_cdclk > 540000)
676
		return 675000;
677
	else if (min_cdclk > 450000)
678
		return 540000;
679
	else if (min_cdclk > 337500)
680 681 682 683 684
		return 450000;
	else
		return 337500;
}

685 686 687 688 689 690 691 692 693 694 695 696 697 698 699
static u8 bdw_calc_voltage_level(int cdclk)
{
	switch (cdclk) {
	default:
	case 337500:
		return 2;
	case 450000:
		return 0;
	case 540000:
		return 1;
	case 675000:
		return 3;
	}
}

700
static void bdw_get_cdclk(struct drm_i915_private *dev_priv,
701
			  struct intel_cdclk_config *cdclk_config)
702
{
703
	u32 lcpll = intel_de_read(dev_priv, LCPLL_CTL);
704
	u32 freq = lcpll & LCPLL_CLK_FREQ_MASK;
705 706

	if (lcpll & LCPLL_CD_SOURCE_FCLK)
707
		cdclk_config->cdclk = 800000;
708
	else if (intel_de_read(dev_priv, FUSE_STRAP) & HSW_CDCLK_LIMIT)
709
		cdclk_config->cdclk = 450000;
710
	else if (freq == LCPLL_CLK_FREQ_450)
711
		cdclk_config->cdclk = 450000;
712
	else if (freq == LCPLL_CLK_FREQ_54O_BDW)
713
		cdclk_config->cdclk = 540000;
714
	else if (freq == LCPLL_CLK_FREQ_337_5_BDW)
715
		cdclk_config->cdclk = 337500;
716
	else
717
		cdclk_config->cdclk = 675000;
718 719 720 721 722

	/*
	 * Can't read this out :( Let's assume it's
	 * at least what the CDCLK frequency requires.
	 */
723 724
	cdclk_config->voltage_level =
		bdw_calc_voltage_level(cdclk_config->cdclk);
725 726
}

727
static void bdw_set_cdclk(struct drm_i915_private *dev_priv,
728
			  const struct intel_cdclk_config *cdclk_config,
729
			  enum pipe pipe)
730
{
731
	int cdclk = cdclk_config->cdclk;
732
	u32 val;
733 734
	int ret;

735 736 737 738 739 740 741
	if (drm_WARN(&dev_priv->drm,
		     (intel_de_read(dev_priv, LCPLL_CTL) &
		      (LCPLL_PLL_DISABLE | LCPLL_PLL_LOCK |
		       LCPLL_CD_CLOCK_DISABLE | LCPLL_ROOT_CD_CLOCK_DISABLE |
		       LCPLL_CD2X_CLOCK_DISABLE | LCPLL_POWER_DOWN_ALLOW |
		       LCPLL_CD_SOURCE_FCLK)) != LCPLL_PLL_LOCK,
		     "trying to change cdclk frequency with cdclk not enabled\n"))
742 743 744 745 746
		return;

	ret = sandybridge_pcode_write(dev_priv,
				      BDW_PCODE_DISPLAY_FREQ_CHANGE_REQ, 0x0);
	if (ret) {
747 748
		drm_err(&dev_priv->drm,
			"failed to inform pcode about cdclk change\n");
749 750 751
		return;
	}

752
	val = intel_de_read(dev_priv, LCPLL_CTL);
753
	val |= LCPLL_CD_SOURCE_FCLK;
754
	intel_de_write(dev_priv, LCPLL_CTL, val);
755

756 757 758 759
	/*
	 * According to the spec, it should be enough to poll for this 1 us.
	 * However, extensive testing shows that this can take longer.
	 */
760
	if (wait_for_us(intel_de_read(dev_priv, LCPLL_CTL) &
761
			LCPLL_CD_SOURCE_FCLK_DONE, 100))
762
		drm_err(&dev_priv->drm, "Switching to FCLK failed\n");
763

764
	val = intel_de_read(dev_priv, LCPLL_CTL);
765 766 767
	val &= ~LCPLL_CLK_FREQ_MASK;

	switch (cdclk) {
768 769
	default:
		MISSING_CASE(cdclk);
770
		fallthrough;
771 772 773
	case 337500:
		val |= LCPLL_CLK_FREQ_337_5_BDW;
		break;
774 775 776 777 778 779 780 781 782 783 784
	case 450000:
		val |= LCPLL_CLK_FREQ_450;
		break;
	case 540000:
		val |= LCPLL_CLK_FREQ_54O_BDW;
		break;
	case 675000:
		val |= LCPLL_CLK_FREQ_675_BDW;
		break;
	}

785
	intel_de_write(dev_priv, LCPLL_CTL, val);
786

787
	val = intel_de_read(dev_priv, LCPLL_CTL);
788
	val &= ~LCPLL_CD_SOURCE_FCLK;
789
	intel_de_write(dev_priv, LCPLL_CTL, val);
790

791 792
	if (wait_for_us((intel_de_read(dev_priv, LCPLL_CTL) &
			 LCPLL_CD_SOURCE_FCLK_DONE) == 0, 1))
793
		drm_err(&dev_priv->drm, "Switching back to LCPLL failed\n");
794

795
	sandybridge_pcode_write(dev_priv, HSW_PCODE_DE_WRITE_FREQ_REQ,
796
				cdclk_config->voltage_level);
797

798 799
	intel_de_write(dev_priv, CDCLK_FREQ,
		       DIV_ROUND_CLOSEST(cdclk, 1000) - 1);
800 801 802 803

	intel_update_cdclk(dev_priv);
}

804
static int skl_calc_cdclk(int min_cdclk, int vco)
805 806
{
	if (vco == 8640000) {
807
		if (min_cdclk > 540000)
808
			return 617143;
809
		else if (min_cdclk > 432000)
810
			return 540000;
811
		else if (min_cdclk > 308571)
812 813 814 815
			return 432000;
		else
			return 308571;
	} else {
816
		if (min_cdclk > 540000)
817
			return 675000;
818
		else if (min_cdclk > 450000)
819
			return 540000;
820
		else if (min_cdclk > 337500)
821 822 823 824 825 826
			return 450000;
		else
			return 337500;
	}
}

827 828
static u8 skl_calc_voltage_level(int cdclk)
{
829
	if (cdclk > 540000)
830
		return 3;
831 832 833 834 835 836
	else if (cdclk > 450000)
		return 2;
	else if (cdclk > 337500)
		return 1;
	else
		return 0;
837 838
}

839
static void skl_dpll0_update(struct drm_i915_private *dev_priv,
840
			     struct intel_cdclk_config *cdclk_config)
841 842 843
{
	u32 val;

844 845
	cdclk_config->ref = 24000;
	cdclk_config->vco = 0;
846

847
	val = intel_de_read(dev_priv, LCPLL1_CTL);
848 849 850
	if ((val & LCPLL_PLL_ENABLE) == 0)
		return;

851
	if (drm_WARN_ON(&dev_priv->drm, (val & LCPLL_PLL_LOCK) == 0))
852 853
		return;

854
	val = intel_de_read(dev_priv, DPLL_CTRL1);
855

856 857 858 859 860
	if (drm_WARN_ON(&dev_priv->drm,
			(val & (DPLL_CTRL1_HDMI_MODE(SKL_DPLL0) |
				DPLL_CTRL1_SSC(SKL_DPLL0) |
				DPLL_CTRL1_OVERRIDE(SKL_DPLL0))) !=
			DPLL_CTRL1_OVERRIDE(SKL_DPLL0)))
861 862 863 864 865 866 867
		return;

	switch (val & DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0)) {
	case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, SKL_DPLL0):
	case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350, SKL_DPLL0):
	case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620, SKL_DPLL0):
	case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700, SKL_DPLL0):
868
		cdclk_config->vco = 8100000;
869 870 871
		break;
	case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080, SKL_DPLL0):
	case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160, SKL_DPLL0):
872
		cdclk_config->vco = 8640000;
873 874 875 876 877 878 879
		break;
	default:
		MISSING_CASE(val & DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0));
		break;
	}
}

880
static void skl_get_cdclk(struct drm_i915_private *dev_priv,
881
			  struct intel_cdclk_config *cdclk_config)
882 883 884
{
	u32 cdctl;

885
	skl_dpll0_update(dev_priv, cdclk_config);
886

887
	cdclk_config->cdclk = cdclk_config->bypass = cdclk_config->ref;
888

889
	if (cdclk_config->vco == 0)
890
		goto out;
891

892
	cdctl = intel_de_read(dev_priv, CDCLK_CTL);
893

894
	if (cdclk_config->vco == 8640000) {
895 896
		switch (cdctl & CDCLK_FREQ_SEL_MASK) {
		case CDCLK_FREQ_450_432:
897
			cdclk_config->cdclk = 432000;
898
			break;
899
		case CDCLK_FREQ_337_308:
900
			cdclk_config->cdclk = 308571;
901
			break;
902
		case CDCLK_FREQ_540:
903
			cdclk_config->cdclk = 540000;
904
			break;
905
		case CDCLK_FREQ_675_617:
906
			cdclk_config->cdclk = 617143;
907
			break;
908 909
		default:
			MISSING_CASE(cdctl & CDCLK_FREQ_SEL_MASK);
910
			break;
911 912 913 914
		}
	} else {
		switch (cdctl & CDCLK_FREQ_SEL_MASK) {
		case CDCLK_FREQ_450_432:
915
			cdclk_config->cdclk = 450000;
916
			break;
917
		case CDCLK_FREQ_337_308:
918
			cdclk_config->cdclk = 337500;
919
			break;
920
		case CDCLK_FREQ_540:
921
			cdclk_config->cdclk = 540000;
922
			break;
923
		case CDCLK_FREQ_675_617:
924
			cdclk_config->cdclk = 675000;
925
			break;
926 927
		default:
			MISSING_CASE(cdctl & CDCLK_FREQ_SEL_MASK);
928
			break;
929 930
		}
	}
931 932 933 934 935 936

 out:
	/*
	 * Can't read this out :( Let's assume it's
	 * at least what the CDCLK frequency requires.
	 */
937 938
	cdclk_config->voltage_level =
		skl_calc_voltage_level(cdclk_config->cdclk);
939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961
}

/* convert from kHz to .1 fixpoint MHz with -1MHz offset */
static int skl_cdclk_decimal(int cdclk)
{
	return DIV_ROUND_CLOSEST(cdclk - 1000, 500);
}

static void skl_set_preferred_cdclk_vco(struct drm_i915_private *dev_priv,
					int vco)
{
	bool changed = dev_priv->skl_preferred_vco_freq != vco;

	dev_priv->skl_preferred_vco_freq = vco;

	if (changed)
		intel_update_max_cdclk(dev_priv);
}

static void skl_dpll0_enable(struct drm_i915_private *dev_priv, int vco)
{
	u32 val;

962
	drm_WARN_ON(&dev_priv->drm, vco != 8100000 && vco != 8640000);
963 964 965 966 967 968 969 970 971 972

	/*
	 * We always enable DPLL0 with the lowest link rate possible, but still
	 * taking into account the VCO required to operate the eDP panel at the
	 * desired frequency. The usual DP link rates operate with a VCO of
	 * 8100 while the eDP 1.4 alternate link rates need a VCO of 8640.
	 * The modeset code is responsible for the selection of the exact link
	 * rate later on, with the constraint of choosing a frequency that
	 * works with vco.
	 */
973
	val = intel_de_read(dev_priv, DPLL_CTRL1);
974 975 976 977 978 979 980 981 982 983 984

	val &= ~(DPLL_CTRL1_HDMI_MODE(SKL_DPLL0) | DPLL_CTRL1_SSC(SKL_DPLL0) |
		 DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0));
	val |= DPLL_CTRL1_OVERRIDE(SKL_DPLL0);
	if (vco == 8640000)
		val |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080,
					    SKL_DPLL0);
	else
		val |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810,
					    SKL_DPLL0);

985 986
	intel_de_write(dev_priv, DPLL_CTRL1, val);
	intel_de_posting_read(dev_priv, DPLL_CTRL1);
987

988 989
	intel_de_write(dev_priv, LCPLL1_CTL,
		       intel_de_read(dev_priv, LCPLL1_CTL) | LCPLL_PLL_ENABLE);
990

991
	if (intel_de_wait_for_set(dev_priv, LCPLL1_CTL, LCPLL_PLL_LOCK, 5))
992
		drm_err(&dev_priv->drm, "DPLL0 not locked\n");
993

994
	dev_priv->cdclk.hw.vco = vco;
995 996 997 998 999 1000 1001

	/* We'll want to keep using the current vco from now on. */
	skl_set_preferred_cdclk_vco(dev_priv, vco);
}

static void skl_dpll0_disable(struct drm_i915_private *dev_priv)
{
1002 1003
	intel_de_write(dev_priv, LCPLL1_CTL,
		       intel_de_read(dev_priv, LCPLL1_CTL) & ~LCPLL_PLL_ENABLE);
1004
	if (intel_de_wait_for_clear(dev_priv, LCPLL1_CTL, LCPLL_PLL_LOCK, 1))
1005
		drm_err(&dev_priv->drm, "Couldn't disable DPLL0\n");
1006

1007
	dev_priv->cdclk.hw.vco = 0;
1008 1009 1010
}

static void skl_set_cdclk(struct drm_i915_private *dev_priv,
1011
			  const struct intel_cdclk_config *cdclk_config,
1012
			  enum pipe pipe)
1013
{
1014 1015
	int cdclk = cdclk_config->cdclk;
	int vco = cdclk_config->vco;
1016
	u32 freq_select, cdclk_ctl;
1017 1018
	int ret;

1019 1020 1021 1022 1023 1024 1025 1026
	/*
	 * Based on WA#1183 CDCLK rates 308 and 617MHz CDCLK rates are
	 * unsupported on SKL. In theory this should never happen since only
	 * the eDP1.4 2.16 and 4.32Gbps rates require it, but eDP1.4 is not
	 * supported on SKL either, see the above WA. WARN whenever trying to
	 * use the corresponding VCO freq as that always leads to using the
	 * minimum 308MHz CDCLK.
	 */
1027 1028
	drm_WARN_ON_ONCE(&dev_priv->drm,
			 IS_SKYLAKE(dev_priv) && vco == 8640000);
1029

1030 1031 1032 1033 1034
	ret = skl_pcode_request(dev_priv, SKL_PCODE_CDCLK_CONTROL,
				SKL_CDCLK_PREPARE_FOR_CHANGE,
				SKL_CDCLK_READY_FOR_CHANGE,
				SKL_CDCLK_READY_FOR_CHANGE, 3);
	if (ret) {
1035 1036
		drm_err(&dev_priv->drm,
			"Failed to inform PCU about cdclk change (%d)\n", ret);
1037 1038 1039
		return;
	}

1040
	/* Choose frequency for this cdclk */
1041
	switch (cdclk) {
1042
	default:
1043 1044 1045
		drm_WARN_ON(&dev_priv->drm,
			    cdclk != dev_priv->cdclk.hw.bypass);
		drm_WARN_ON(&dev_priv->drm, vco != 0);
1046
		fallthrough;
1047 1048 1049 1050
	case 308571:
	case 337500:
		freq_select = CDCLK_FREQ_337_308;
		break;
1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063
	case 450000:
	case 432000:
		freq_select = CDCLK_FREQ_450_432;
		break;
	case 540000:
		freq_select = CDCLK_FREQ_540;
		break;
	case 617143:
	case 675000:
		freq_select = CDCLK_FREQ_675_617;
		break;
	}

1064 1065
	if (dev_priv->cdclk.hw.vco != 0 &&
	    dev_priv->cdclk.hw.vco != vco)
1066 1067
		skl_dpll0_disable(dev_priv);

1068
	cdclk_ctl = intel_de_read(dev_priv, CDCLK_CTL);
1069 1070 1071 1072 1073

	if (dev_priv->cdclk.hw.vco != vco) {
		/* Wa Display #1183: skl,kbl,cfl */
		cdclk_ctl &= ~(CDCLK_FREQ_SEL_MASK | CDCLK_FREQ_DECIMAL_MASK);
		cdclk_ctl |= freq_select | skl_cdclk_decimal(cdclk);
1074
		intel_de_write(dev_priv, CDCLK_CTL, cdclk_ctl);
1075 1076 1077 1078
	}

	/* Wa Display #1183: skl,kbl,cfl */
	cdclk_ctl |= CDCLK_DIVMUX_CD_OVERRIDE;
1079 1080
	intel_de_write(dev_priv, CDCLK_CTL, cdclk_ctl);
	intel_de_posting_read(dev_priv, CDCLK_CTL);
1081

1082
	if (dev_priv->cdclk.hw.vco != vco)
1083 1084
		skl_dpll0_enable(dev_priv, vco);

1085 1086
	/* Wa Display #1183: skl,kbl,cfl */
	cdclk_ctl &= ~(CDCLK_FREQ_SEL_MASK | CDCLK_FREQ_DECIMAL_MASK);
1087
	intel_de_write(dev_priv, CDCLK_CTL, cdclk_ctl);
1088 1089

	cdclk_ctl |= freq_select | skl_cdclk_decimal(cdclk);
1090
	intel_de_write(dev_priv, CDCLK_CTL, cdclk_ctl);
1091 1092 1093

	/* Wa Display #1183: skl,kbl,cfl */
	cdclk_ctl &= ~CDCLK_DIVMUX_CD_OVERRIDE;
1094 1095
	intel_de_write(dev_priv, CDCLK_CTL, cdclk_ctl);
	intel_de_posting_read(dev_priv, CDCLK_CTL);
1096 1097

	/* inform PCU of the change */
1098
	sandybridge_pcode_write(dev_priv, SKL_PCODE_CDCLK_CONTROL,
1099
				cdclk_config->voltage_level);
1100 1101 1102 1103 1104 1105

	intel_update_cdclk(dev_priv);
}

static void skl_sanitize_cdclk(struct drm_i915_private *dev_priv)
{
1106
	u32 cdctl, expected;
1107 1108 1109 1110 1111 1112

	/*
	 * check if the pre-os initialized the display
	 * There is SWF18 scratchpad register defined which is set by the
	 * pre-os which can be used by the OS drivers to check the status
	 */
1113
	if ((intel_de_read(dev_priv, SWF_ILK(0x18)) & 0x00FFFFFF) == 0)
1114 1115 1116
		goto sanitize;

	intel_update_cdclk(dev_priv);
1117
	intel_dump_cdclk_config(&dev_priv->cdclk.hw, "Current CDCLK");
1118

1119
	/* Is PLL enabled and locked ? */
1120
	if (dev_priv->cdclk.hw.vco == 0 ||
1121
	    dev_priv->cdclk.hw.cdclk == dev_priv->cdclk.hw.bypass)
1122 1123 1124 1125 1126 1127 1128 1129
		goto sanitize;

	/* DPLL okay; verify the cdclock
	 *
	 * Noticed in some instances that the freq selection is correct but
	 * decimal part is programmed wrong from BIOS where pre-os does not
	 * enable display. Verify the same as well.
	 */
1130
	cdctl = intel_de_read(dev_priv, CDCLK_CTL);
1131
	expected = (cdctl & CDCLK_FREQ_SEL_MASK) |
1132
		skl_cdclk_decimal(dev_priv->cdclk.hw.cdclk);
1133 1134 1135 1136 1137
	if (cdctl == expected)
		/* All well; nothing to sanitize */
		return;

sanitize:
1138
	drm_dbg_kms(&dev_priv->drm, "Sanitizing cdclk programmed by pre-os\n");
1139 1140

	/* force cdclk programming */
1141
	dev_priv->cdclk.hw.cdclk = 0;
1142
	/* force full PLL disable + enable */
1143
	dev_priv->cdclk.hw.vco = -1;
1144 1145
}

1146
static void skl_cdclk_init_hw(struct drm_i915_private *dev_priv)
1147
{
1148
	struct intel_cdclk_config cdclk_config;
1149 1150 1151

	skl_sanitize_cdclk(dev_priv);

1152 1153
	if (dev_priv->cdclk.hw.cdclk != 0 &&
	    dev_priv->cdclk.hw.vco != 0) {
1154 1155 1156 1157 1158 1159
		/*
		 * Use the current vco as our initial
		 * guess as to what the preferred vco is.
		 */
		if (dev_priv->skl_preferred_vco_freq == 0)
			skl_set_preferred_cdclk_vco(dev_priv,
1160
						    dev_priv->cdclk.hw.vco);
1161 1162 1163
		return;
	}

1164
	cdclk_config = dev_priv->cdclk.hw;
1165

1166 1167 1168 1169 1170
	cdclk_config.vco = dev_priv->skl_preferred_vco_freq;
	if (cdclk_config.vco == 0)
		cdclk_config.vco = 8100000;
	cdclk_config.cdclk = skl_calc_cdclk(0, cdclk_config.vco);
	cdclk_config.voltage_level = skl_calc_voltage_level(cdclk_config.cdclk);
1171

1172
	skl_set_cdclk(dev_priv, &cdclk_config, INVALID_PIPE);
1173 1174
}

1175
static void skl_cdclk_uninit_hw(struct drm_i915_private *dev_priv)
1176
{
1177
	struct intel_cdclk_config cdclk_config = dev_priv->cdclk.hw;
1178

1179 1180 1181
	cdclk_config.cdclk = cdclk_config.bypass;
	cdclk_config.vco = 0;
	cdclk_config.voltage_level = skl_calc_voltage_level(cdclk_config.cdclk);
1182

1183
	skl_set_cdclk(dev_priv, &cdclk_config, INVALID_PIPE);
1184 1185
}

1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236
static const struct intel_cdclk_vals bxt_cdclk_table[] = {
	{ .refclk = 19200, .cdclk = 144000, .divider = 8, .ratio = 60 },
	{ .refclk = 19200, .cdclk = 288000, .divider = 4, .ratio = 60 },
	{ .refclk = 19200, .cdclk = 384000, .divider = 3, .ratio = 60 },
	{ .refclk = 19200, .cdclk = 576000, .divider = 2, .ratio = 60 },
	{ .refclk = 19200, .cdclk = 624000, .divider = 2, .ratio = 65 },
	{}
};

static const struct intel_cdclk_vals glk_cdclk_table[] = {
	{ .refclk = 19200, .cdclk =  79200, .divider = 8, .ratio = 33 },
	{ .refclk = 19200, .cdclk = 158400, .divider = 4, .ratio = 33 },
	{ .refclk = 19200, .cdclk = 316800, .divider = 2, .ratio = 33 },
	{}
};

static const struct intel_cdclk_vals cnl_cdclk_table[] = {
	{ .refclk = 19200, .cdclk = 168000, .divider = 4, .ratio = 35 },
	{ .refclk = 19200, .cdclk = 336000, .divider = 2, .ratio = 35 },
	{ .refclk = 19200, .cdclk = 528000, .divider = 2, .ratio = 55 },

	{ .refclk = 24000, .cdclk = 168000, .divider = 4, .ratio = 28 },
	{ .refclk = 24000, .cdclk = 336000, .divider = 2, .ratio = 28 },
	{ .refclk = 24000, .cdclk = 528000, .divider = 2, .ratio = 44 },
	{}
};

static const struct intel_cdclk_vals icl_cdclk_table[] = {
	{ .refclk = 19200, .cdclk = 172800, .divider = 2, .ratio = 18 },
	{ .refclk = 19200, .cdclk = 192000, .divider = 2, .ratio = 20 },
	{ .refclk = 19200, .cdclk = 307200, .divider = 2, .ratio = 32 },
	{ .refclk = 19200, .cdclk = 326400, .divider = 4, .ratio = 68 },
	{ .refclk = 19200, .cdclk = 556800, .divider = 2, .ratio = 58 },
	{ .refclk = 19200, .cdclk = 652800, .divider = 2, .ratio = 68 },

	{ .refclk = 24000, .cdclk = 180000, .divider = 2, .ratio = 15 },
	{ .refclk = 24000, .cdclk = 192000, .divider = 2, .ratio = 16 },
	{ .refclk = 24000, .cdclk = 312000, .divider = 2, .ratio = 26 },
	{ .refclk = 24000, .cdclk = 324000, .divider = 4, .ratio = 54 },
	{ .refclk = 24000, .cdclk = 552000, .divider = 2, .ratio = 46 },
	{ .refclk = 24000, .cdclk = 648000, .divider = 2, .ratio = 54 },

	{ .refclk = 38400, .cdclk = 172800, .divider = 2, .ratio =  9 },
	{ .refclk = 38400, .cdclk = 192000, .divider = 2, .ratio = 10 },
	{ .refclk = 38400, .cdclk = 307200, .divider = 2, .ratio = 16 },
	{ .refclk = 38400, .cdclk = 326400, .divider = 4, .ratio = 34 },
	{ .refclk = 38400, .cdclk = 556800, .divider = 2, .ratio = 29 },
	{ .refclk = 38400, .cdclk = 652800, .divider = 2, .ratio = 34 },
	{}
};

M
Matt Roper 已提交
1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260
static const struct intel_cdclk_vals rkl_cdclk_table[] = {
	{ .refclk = 19200, .cdclk = 172800, .divider = 4, .ratio =  36 },
	{ .refclk = 19200, .cdclk = 192000, .divider = 4, .ratio =  40 },
	{ .refclk = 19200, .cdclk = 307200, .divider = 4, .ratio =  64 },
	{ .refclk = 19200, .cdclk = 326400, .divider = 8, .ratio = 136 },
	{ .refclk = 19200, .cdclk = 556800, .divider = 4, .ratio = 116 },
	{ .refclk = 19200, .cdclk = 652800, .divider = 4, .ratio = 136 },

	{ .refclk = 24000, .cdclk = 180000, .divider = 4, .ratio =  30 },
	{ .refclk = 24000, .cdclk = 192000, .divider = 4, .ratio =  32 },
	{ .refclk = 24000, .cdclk = 312000, .divider = 4, .ratio =  52 },
	{ .refclk = 24000, .cdclk = 324000, .divider = 8, .ratio = 108 },
	{ .refclk = 24000, .cdclk = 552000, .divider = 4, .ratio =  92 },
	{ .refclk = 24000, .cdclk = 648000, .divider = 4, .ratio = 108 },

	{ .refclk = 38400, .cdclk = 172800, .divider = 4, .ratio = 18 },
	{ .refclk = 38400, .cdclk = 192000, .divider = 4, .ratio = 20 },
	{ .refclk = 38400, .cdclk = 307200, .divider = 4, .ratio = 32 },
	{ .refclk = 38400, .cdclk = 326400, .divider = 8, .ratio = 68 },
	{ .refclk = 38400, .cdclk = 556800, .divider = 4, .ratio = 58 },
	{ .refclk = 38400, .cdclk = 652800, .divider = 4, .ratio = 68 },
	{}
};

1261 1262 1263 1264 1265 1266 1267 1268 1269 1270
static int bxt_calc_cdclk(struct drm_i915_private *dev_priv, int min_cdclk)
{
	const struct intel_cdclk_vals *table = dev_priv->cdclk.table;
	int i;

	for (i = 0; table[i].refclk; i++)
		if (table[i].refclk == dev_priv->cdclk.hw.ref &&
		    table[i].cdclk >= min_cdclk)
			return table[i].cdclk;

1271 1272 1273
	drm_WARN(&dev_priv->drm, 1,
		 "Cannot satisfy minimum cdclk %d with refclk %u\n",
		 min_cdclk, dev_priv->cdclk.hw.ref);
1274
	return 0;
1275 1276
}

1277
static int bxt_calc_cdclk_pll_vco(struct drm_i915_private *dev_priv, int cdclk)
1278
{
1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289
	const struct intel_cdclk_vals *table = dev_priv->cdclk.table;
	int i;

	if (cdclk == dev_priv->cdclk.hw.bypass)
		return 0;

	for (i = 0; table[i].refclk; i++)
		if (table[i].refclk == dev_priv->cdclk.hw.ref &&
		    table[i].cdclk == cdclk)
			return dev_priv->cdclk.hw.ref * table[i].ratio;

1290 1291
	drm_WARN(&dev_priv->drm, 1, "cdclk %d not valid for refclk %u\n",
		 cdclk, dev_priv->cdclk.hw.ref);
1292
	return 0;
1293 1294
}

1295 1296 1297 1298 1299
static u8 bxt_calc_voltage_level(int cdclk)
{
	return DIV_ROUND_UP(cdclk, 25000);
}

1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321
static u8 cnl_calc_voltage_level(int cdclk)
{
	if (cdclk > 336000)
		return 2;
	else if (cdclk > 168000)
		return 1;
	else
		return 0;
}

static u8 icl_calc_voltage_level(int cdclk)
{
	if (cdclk > 556800)
		return 2;
	else if (cdclk > 312000)
		return 1;
	else
		return 0;
}

static u8 ehl_calc_voltage_level(int cdclk)
{
1322 1323 1324
	if (cdclk > 326400)
		return 3;
	else if (cdclk > 312000)
1325 1326 1327 1328 1329 1330 1331
		return 2;
	else if (cdclk > 180000)
		return 1;
	else
		return 0;
}

1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343
static u8 tgl_calc_voltage_level(int cdclk)
{
	if (cdclk > 556800)
		return 3;
	else if (cdclk > 326400)
		return 2;
	else if (cdclk > 312000)
		return 1;
	else
		return 0;
}

1344
static void cnl_readout_refclk(struct drm_i915_private *dev_priv,
1345
			       struct intel_cdclk_config *cdclk_config)
1346
{
1347
	if (intel_de_read(dev_priv, SKL_DSSM) & CNL_DSSM_CDCLK_PLL_REFCLK_24MHz)
1348
		cdclk_config->ref = 24000;
1349
	else
1350
		cdclk_config->ref = 19200;
1351
}
1352

1353
static void icl_readout_refclk(struct drm_i915_private *dev_priv,
1354
			       struct intel_cdclk_config *cdclk_config)
1355
{
1356
	u32 dssm = intel_de_read(dev_priv, SKL_DSSM) & ICL_DSSM_CDCLK_PLL_REFCLK_MASK;
1357 1358 1359 1360

	switch (dssm) {
	default:
		MISSING_CASE(dssm);
1361
		fallthrough;
1362
	case ICL_DSSM_CDCLK_PLL_REFCLK_24MHz:
1363
		cdclk_config->ref = 24000;
1364 1365
		break;
	case ICL_DSSM_CDCLK_PLL_REFCLK_19_2MHz:
1366
		cdclk_config->ref = 19200;
1367 1368
		break;
	case ICL_DSSM_CDCLK_PLL_REFCLK_38_4MHz:
1369
		cdclk_config->ref = 38400;
1370 1371 1372 1373 1374
		break;
	}
}

static void bxt_de_pll_readout(struct drm_i915_private *dev_priv,
1375
			       struct intel_cdclk_config *cdclk_config)
1376 1377 1378
{
	u32 val, ratio;

1379
	if (DISPLAY_VER(dev_priv) >= 11)
1380
		icl_readout_refclk(dev_priv, cdclk_config);
1381
	else if (IS_CANNONLAKE(dev_priv))
1382
		cnl_readout_refclk(dev_priv, cdclk_config);
1383
	else
1384
		cdclk_config->ref = 19200;
1385

1386
	val = intel_de_read(dev_priv, BXT_DE_PLL_ENABLE);
1387 1388 1389 1390 1391 1392
	if ((val & BXT_DE_PLL_PLL_ENABLE) == 0 ||
	    (val & BXT_DE_PLL_LOCK) == 0) {
		/*
		 * CDCLK PLL is disabled, the VCO/ratio doesn't matter, but
		 * setting it to zero is a way to signal that.
		 */
1393
		cdclk_config->vco = 0;
1394
		return;
1395
	}
1396

1397 1398 1399 1400
	/*
	 * CNL+ have the ratio directly in the PLL enable register, gen9lp had
	 * it in a separate PLL control register.
	 */
1401
	if (DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv))
1402 1403
		ratio = val & CNL_CDCLK_PLL_RATIO_MASK;
	else
1404
		ratio = intel_de_read(dev_priv, BXT_DE_PLL_CTL) & BXT_DE_PLL_RATIO_MASK;
1405

1406
	cdclk_config->vco = ratio * cdclk_config->ref;
1407 1408
}

1409
static void bxt_get_cdclk(struct drm_i915_private *dev_priv,
1410
			  struct intel_cdclk_config *cdclk_config)
1411 1412
{
	u32 divider;
1413
	int div;
1414

1415
	bxt_de_pll_readout(dev_priv, cdclk_config);
1416

1417
	if (DISPLAY_VER(dev_priv) >= 12)
1418
		cdclk_config->bypass = cdclk_config->ref / 2;
1419
	else if (DISPLAY_VER(dev_priv) >= 11)
1420
		cdclk_config->bypass = 50000;
1421
	else
1422
		cdclk_config->bypass = cdclk_config->ref;
1423

1424 1425
	if (cdclk_config->vco == 0) {
		cdclk_config->cdclk = cdclk_config->bypass;
1426
		goto out;
1427
	}
1428

1429
	divider = intel_de_read(dev_priv, CDCLK_CTL) & BXT_CDCLK_CD2X_DIV_SEL_MASK;
1430 1431 1432 1433 1434 1435

	switch (divider) {
	case BXT_CDCLK_CD2X_DIV_SEL_1:
		div = 2;
		break;
	case BXT_CDCLK_CD2X_DIV_SEL_1_5:
1436
		drm_WARN(&dev_priv->drm,
1437
			 DISPLAY_VER(dev_priv) >= 10,
1438
			 "Unsupported divider\n");
1439 1440 1441 1442 1443 1444
		div = 3;
		break;
	case BXT_CDCLK_CD2X_DIV_SEL_2:
		div = 4;
		break;
	case BXT_CDCLK_CD2X_DIV_SEL_4:
1445 1446
		drm_WARN(&dev_priv->drm,
			 DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv),
1447
			 "Unsupported divider\n");
1448 1449 1450 1451
		div = 8;
		break;
	default:
		MISSING_CASE(divider);
1452
		return;
1453 1454
	}

1455
	cdclk_config->cdclk = DIV_ROUND_CLOSEST(cdclk_config->vco, div);
1456 1457 1458 1459 1460 1461

 out:
	/*
	 * Can't read this out :( Let's assume it's
	 * at least what the CDCLK frequency requires.
	 */
1462 1463
	cdclk_config->voltage_level =
		dev_priv->display.calc_voltage_level(cdclk_config->cdclk);
1464 1465 1466 1467
}

static void bxt_de_pll_disable(struct drm_i915_private *dev_priv)
{
1468
	intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, 0);
1469 1470

	/* Timeout 200us */
1471 1472
	if (intel_de_wait_for_clear(dev_priv,
				    BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 1))
1473
		drm_err(&dev_priv->drm, "timeout waiting for DE PLL unlock\n");
1474

1475
	dev_priv->cdclk.hw.vco = 0;
1476 1477 1478 1479
}

static void bxt_de_pll_enable(struct drm_i915_private *dev_priv, int vco)
{
1480
	int ratio = DIV_ROUND_CLOSEST(vco, dev_priv->cdclk.hw.ref);
1481 1482
	u32 val;

1483
	val = intel_de_read(dev_priv, BXT_DE_PLL_CTL);
1484 1485
	val &= ~BXT_DE_PLL_RATIO_MASK;
	val |= BXT_DE_PLL_RATIO(ratio);
1486
	intel_de_write(dev_priv, BXT_DE_PLL_CTL, val);
1487

1488
	intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, BXT_DE_PLL_PLL_ENABLE);
1489 1490

	/* Timeout 200us */
1491 1492
	if (intel_de_wait_for_set(dev_priv,
				  BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 1))
1493
		drm_err(&dev_priv->drm, "timeout waiting for DE PLL lock\n");
1494

1495
	dev_priv->cdclk.hw.vco = vco;
1496 1497
}

1498 1499 1500 1501
static void cnl_cdclk_pll_disable(struct drm_i915_private *dev_priv)
{
	u32 val;

1502
	val = intel_de_read(dev_priv, BXT_DE_PLL_ENABLE);
1503
	val &= ~BXT_DE_PLL_PLL_ENABLE;
1504
	intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, val);
1505 1506

	/* Timeout 200us */
1507
	if (wait_for((intel_de_read(dev_priv, BXT_DE_PLL_ENABLE) & BXT_DE_PLL_LOCK) == 0, 1))
1508 1509
		drm_err(&dev_priv->drm,
			"timeout waiting for CDCLK PLL unlock\n");
1510 1511 1512 1513 1514 1515 1516 1517 1518 1519

	dev_priv->cdclk.hw.vco = 0;
}

static void cnl_cdclk_pll_enable(struct drm_i915_private *dev_priv, int vco)
{
	int ratio = DIV_ROUND_CLOSEST(vco, dev_priv->cdclk.hw.ref);
	u32 val;

	val = CNL_CDCLK_PLL_RATIO(ratio);
1520
	intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, val);
1521 1522

	val |= BXT_DE_PLL_PLL_ENABLE;
1523
	intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, val);
1524 1525

	/* Timeout 200us */
1526
	if (wait_for((intel_de_read(dev_priv, BXT_DE_PLL_ENABLE) & BXT_DE_PLL_LOCK) != 0, 1))
1527 1528
		drm_err(&dev_priv->drm,
			"timeout waiting for CDCLK PLL lock\n");
1529 1530 1531 1532

	dev_priv->cdclk.hw.vco = vco;
}

1533 1534
static u32 bxt_cdclk_cd2x_pipe(struct drm_i915_private *dev_priv, enum pipe pipe)
{
1535
	if (DISPLAY_VER(dev_priv) >= 12) {
1536 1537 1538 1539
		if (pipe == INVALID_PIPE)
			return TGL_CDCLK_CD2X_PIPE_NONE;
		else
			return TGL_CDCLK_CD2X_PIPE(pipe);
1540
	} else if (DISPLAY_VER(dev_priv) >= 11) {
1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552
		if (pipe == INVALID_PIPE)
			return ICL_CDCLK_CD2X_PIPE_NONE;
		else
			return ICL_CDCLK_CD2X_PIPE(pipe);
	} else {
		if (pipe == INVALID_PIPE)
			return BXT_CDCLK_CD2X_PIPE_NONE;
		else
			return BXT_CDCLK_CD2X_PIPE(pipe);
	}
}

1553
static void bxt_set_cdclk(struct drm_i915_private *dev_priv,
1554
			  const struct intel_cdclk_config *cdclk_config,
1555
			  enum pipe pipe)
1556
{
1557 1558
	int cdclk = cdclk_config->cdclk;
	int vco = cdclk_config->vco;
1559
	u32 val, divider;
1560
	int ret;
1561

1562
	/* Inform power controller of upcoming frequency change. */
1563
	if (DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv))
1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577
		ret = skl_pcode_request(dev_priv, SKL_PCODE_CDCLK_CONTROL,
					SKL_CDCLK_PREPARE_FOR_CHANGE,
					SKL_CDCLK_READY_FOR_CHANGE,
					SKL_CDCLK_READY_FOR_CHANGE, 3);
	else
		/*
		 * BSpec requires us to wait up to 150usec, but that leads to
		 * timeouts; the 2ms used here is based on experiment.
		 */
		ret = sandybridge_pcode_write_timeout(dev_priv,
						      HSW_PCODE_DE_WRITE_FREQ_REQ,
						      0x80000000, 150, 2);

	if (ret) {
1578 1579 1580
		drm_err(&dev_priv->drm,
			"Failed to inform PCU about cdclk change (err %d, freq %d)\n",
			ret, cdclk);
1581 1582 1583
		return;
	}

1584 1585
	/* cdclk = vco / 2 / div{1,1.5,2,4} */
	switch (DIV_ROUND_CLOSEST(vco, cdclk)) {
1586
	default:
1587 1588 1589
		drm_WARN_ON(&dev_priv->drm,
			    cdclk != dev_priv->cdclk.hw.bypass);
		drm_WARN_ON(&dev_priv->drm, vco != 0);
1590
		fallthrough;
1591 1592
	case 2:
		divider = BXT_CDCLK_CD2X_DIV_SEL_1;
1593 1594
		break;
	case 3:
1595
		drm_WARN(&dev_priv->drm,
1596
			 DISPLAY_VER(dev_priv) >= 10,
1597
			 "Unsupported divider\n");
1598 1599
		divider = BXT_CDCLK_CD2X_DIV_SEL_1_5;
		break;
1600 1601
	case 4:
		divider = BXT_CDCLK_CD2X_DIV_SEL_2;
1602
		break;
1603
	case 8:
1604 1605
		drm_WARN(&dev_priv->drm,
			 DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv),
1606
			 "Unsupported divider\n");
1607
		divider = BXT_CDCLK_CD2X_DIV_SEL_4;
1608 1609 1610
		break;
	}

1611
	if (DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)) {
1612 1613 1614
		if (dev_priv->cdclk.hw.vco != 0 &&
		    dev_priv->cdclk.hw.vco != vco)
			cnl_cdclk_pll_disable(dev_priv);
1615

1616 1617
		if (dev_priv->cdclk.hw.vco != vco)
			cnl_cdclk_pll_enable(dev_priv, vco);
1618

1619 1620 1621 1622 1623 1624 1625 1626
	} else {
		if (dev_priv->cdclk.hw.vco != 0 &&
		    dev_priv->cdclk.hw.vco != vco)
			bxt_de_pll_disable(dev_priv);

		if (dev_priv->cdclk.hw.vco != vco)
			bxt_de_pll_enable(dev_priv, vco);
	}
1627

1628 1629
	val = divider | skl_cdclk_decimal(cdclk) |
		bxt_cdclk_cd2x_pipe(dev_priv, pipe);
1630

1631 1632 1633 1634
	/*
	 * Disable SSA Precharge when CD clock frequency < 500 MHz,
	 * enable otherwise.
	 */
1635 1636
	if ((IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) &&
	    cdclk >= 500000)
1637
		val |= BXT_CDCLK_SSA_PRECHARGE_ENABLE;
1638
	intel_de_write(dev_priv, CDCLK_CTL, val);
1639

1640 1641 1642
	if (pipe != INVALID_PIPE)
		intel_wait_for_vblank(dev_priv, pipe);

1643
	if (DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)) {
1644
		ret = sandybridge_pcode_write(dev_priv, SKL_PCODE_CDCLK_CONTROL,
1645
					      cdclk_config->voltage_level);
1646 1647 1648 1649 1650 1651 1652 1653 1654
	} else {
		/*
		 * The timeout isn't specified, the 2ms used here is based on
		 * experiment.
		 * FIXME: Waiting for the request completion could be delayed
		 * until the next PCODE request based on BSpec.
		 */
		ret = sandybridge_pcode_write_timeout(dev_priv,
						      HSW_PCODE_DE_WRITE_FREQ_REQ,
1655
						      cdclk_config->voltage_level,
1656 1657 1658
						      150, 2);
	}

1659
	if (ret) {
1660 1661 1662
		drm_err(&dev_priv->drm,
			"PCode CDCLK freq set failed, (err %d, freq %d)\n",
			ret, cdclk);
1663 1664 1665 1666
		return;
	}

	intel_update_cdclk(dev_priv);
1667

1668
	if (DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv))
1669 1670 1671 1672
		/*
		 * Can't read out the voltage level :(
		 * Let's just assume everything is as expected.
		 */
1673
		dev_priv->cdclk.hw.voltage_level = cdclk_config->voltage_level;
1674 1675 1676 1677 1678
}

static void bxt_sanitize_cdclk(struct drm_i915_private *dev_priv)
{
	u32 cdctl, expected;
1679
	int cdclk, vco;
1680 1681

	intel_update_cdclk(dev_priv);
1682
	intel_dump_cdclk_config(&dev_priv->cdclk.hw, "Current CDCLK");
1683

1684
	if (dev_priv->cdclk.hw.vco == 0 ||
1685
	    dev_priv->cdclk.hw.cdclk == dev_priv->cdclk.hw.bypass)
1686 1687 1688 1689 1690 1691 1692 1693
		goto sanitize;

	/* DPLL okay; verify the cdclock
	 *
	 * Some BIOS versions leave an incorrect decimal frequency value and
	 * set reserved MBZ bits in CDCLK_CTL at least during exiting from S4,
	 * so sanitize this register.
	 */
1694
	cdctl = intel_de_read(dev_priv, CDCLK_CTL);
1695 1696 1697 1698 1699
	/*
	 * Let's ignore the pipe field, since BIOS could have configured the
	 * dividers both synching to an active pipe, or asynchronously
	 * (PIPE_NONE).
	 */
1700
	cdctl &= ~bxt_cdclk_cd2x_pipe(dev_priv, INVALID_PIPE);
1701

1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732
	/* Make sure this is a legal cdclk value for the platform */
	cdclk = bxt_calc_cdclk(dev_priv, dev_priv->cdclk.hw.cdclk);
	if (cdclk != dev_priv->cdclk.hw.cdclk)
		goto sanitize;

	/* Make sure the VCO is correct for the cdclk */
	vco = bxt_calc_cdclk_pll_vco(dev_priv, cdclk);
	if (vco != dev_priv->cdclk.hw.vco)
		goto sanitize;

	expected = skl_cdclk_decimal(cdclk);

	/* Figure out what CD2X divider we should be using for this cdclk */
	switch (DIV_ROUND_CLOSEST(dev_priv->cdclk.hw.vco,
				  dev_priv->cdclk.hw.cdclk)) {
	case 2:
		expected |= BXT_CDCLK_CD2X_DIV_SEL_1;
		break;
	case 3:
		expected |= BXT_CDCLK_CD2X_DIV_SEL_1_5;
		break;
	case 4:
		expected |= BXT_CDCLK_CD2X_DIV_SEL_2;
		break;
	case 8:
		expected |= BXT_CDCLK_CD2X_DIV_SEL_4;
		break;
	default:
		goto sanitize;
	}

1733 1734 1735 1736
	/*
	 * Disable SSA Precharge when CD clock frequency < 500 MHz,
	 * enable otherwise.
	 */
1737 1738
	if ((IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) &&
	    dev_priv->cdclk.hw.cdclk >= 500000)
1739 1740 1741 1742 1743 1744 1745
		expected |= BXT_CDCLK_SSA_PRECHARGE_ENABLE;

	if (cdctl == expected)
		/* All well; nothing to sanitize */
		return;

sanitize:
1746
	drm_dbg_kms(&dev_priv->drm, "Sanitizing cdclk programmed by pre-os\n");
1747 1748

	/* force cdclk programming */
1749
	dev_priv->cdclk.hw.cdclk = 0;
1750 1751

	/* force full PLL disable + enable */
1752
	dev_priv->cdclk.hw.vco = -1;
1753 1754
}

1755
static void bxt_cdclk_init_hw(struct drm_i915_private *dev_priv)
1756
{
1757
	struct intel_cdclk_config cdclk_config;
1758 1759 1760

	bxt_sanitize_cdclk(dev_priv);

1761 1762
	if (dev_priv->cdclk.hw.cdclk != 0 &&
	    dev_priv->cdclk.hw.vco != 0)
1763 1764
		return;

1765
	cdclk_config = dev_priv->cdclk.hw;
1766

1767 1768 1769 1770 1771
	/*
	 * FIXME:
	 * - The initial CDCLK needs to be read from VBT.
	 *   Need to make this change after VBT has changes for BXT.
	 */
1772 1773 1774 1775
	cdclk_config.cdclk = bxt_calc_cdclk(dev_priv, 0);
	cdclk_config.vco = bxt_calc_cdclk_pll_vco(dev_priv, cdclk_config.cdclk);
	cdclk_config.voltage_level =
		dev_priv->display.calc_voltage_level(cdclk_config.cdclk);
1776

1777
	bxt_set_cdclk(dev_priv, &cdclk_config, INVALID_PIPE);
1778 1779
}

1780
static void bxt_cdclk_uninit_hw(struct drm_i915_private *dev_priv)
1781
{
1782
	struct intel_cdclk_config cdclk_config = dev_priv->cdclk.hw;
1783

1784 1785 1786 1787
	cdclk_config.cdclk = cdclk_config.bypass;
	cdclk_config.vco = 0;
	cdclk_config.voltage_level =
		dev_priv->display.calc_voltage_level(cdclk_config.cdclk);
1788

1789
	bxt_set_cdclk(dev_priv, &cdclk_config, INVALID_PIPE);
1790 1791
}

1792
/**
1793
 * intel_cdclk_init_hw - Initialize CDCLK hardware
1794 1795 1796 1797 1798 1799 1800
 * @i915: i915 device
 *
 * Initialize CDCLK. This consists mainly of initializing dev_priv->cdclk.hw and
 * sanitizing the state of the hardware if needed. This is generally done only
 * during the display core initialization sequence, after which the DMC will
 * take care of turning CDCLK off/on as needed.
 */
1801
void intel_cdclk_init_hw(struct drm_i915_private *i915)
1802
{
1803
	if (DISPLAY_VER(i915) >= 10 || IS_BROXTON(i915))
1804
		bxt_cdclk_init_hw(i915);
1805
	else if (DISPLAY_VER(i915) == 9)
1806
		skl_cdclk_init_hw(i915);
1807 1808 1809
}

/**
1810
 * intel_cdclk_uninit_hw - Uninitialize CDCLK hardware
1811 1812 1813 1814 1815
 * @i915: i915 device
 *
 * Uninitialize CDCLK. This is done only during the display core
 * uninitialization sequence.
 */
1816
void intel_cdclk_uninit_hw(struct drm_i915_private *i915)
1817
{
1818
	if (DISPLAY_VER(i915) >= 10 || IS_BROXTON(i915))
1819
		bxt_cdclk_uninit_hw(i915);
1820
	else if (DISPLAY_VER(i915) == 9)
1821
		skl_cdclk_uninit_hw(i915);
1822 1823
}

1824
/**
1825 1826 1827 1828
 * intel_cdclk_needs_modeset - Determine if changong between the CDCLK
 *                             configurations requires a modeset on all pipes
 * @a: first CDCLK configuration
 * @b: second CDCLK configuration
1829 1830
 *
 * Returns:
1831 1832
 * True if changing between the two CDCLK configurations
 * requires all pipes to be off, false if not.
1833
 */
1834 1835
bool intel_cdclk_needs_modeset(const struct intel_cdclk_config *a,
			       const struct intel_cdclk_config *b)
1836
{
1837 1838 1839 1840 1841
	return a->cdclk != b->cdclk ||
		a->vco != b->vco ||
		a->ref != b->ref;
}

1842
/**
1843 1844 1845 1846 1847
 * intel_cdclk_can_cd2x_update - Determine if changing between the two CDCLK
 *                               configurations requires only a cd2x divider update
 * @dev_priv: i915 device
 * @a: first CDCLK configuration
 * @b: second CDCLK configuration
1848 1849
 *
 * Returns:
1850 1851
 * True if changing between the two CDCLK configurations
 * can be done with just a cd2x divider update, false if not.
1852
 */
1853
static bool intel_cdclk_can_cd2x_update(struct drm_i915_private *dev_priv,
1854 1855
					const struct intel_cdclk_config *a,
					const struct intel_cdclk_config *b)
1856 1857
{
	/* Older hw doesn't have the capability */
1858
	if (DISPLAY_VER(dev_priv) < 10 && !IS_BROXTON(dev_priv))
1859 1860 1861 1862 1863 1864 1865
		return false;

	return a->cdclk != b->cdclk &&
		a->vco == b->vco &&
		a->ref == b->ref;
}

1866
/**
1867 1868 1869
 * intel_cdclk_changed - Determine if two CDCLK configurations are different
 * @a: first CDCLK configuration
 * @b: second CDCLK configuration
1870 1871
 *
 * Returns:
1872
 * True if the CDCLK configurations don't match, false if they do.
1873
 */
1874 1875
static bool intel_cdclk_changed(const struct intel_cdclk_config *a,
				const struct intel_cdclk_config *b)
1876 1877 1878
{
	return intel_cdclk_needs_modeset(a, b) ||
		a->voltage_level != b->voltage_level;
1879 1880
}

1881 1882
void intel_dump_cdclk_config(const struct intel_cdclk_config *cdclk_config,
			     const char *context)
1883
{
1884
	DRM_DEBUG_DRIVER("%s %d kHz, VCO %d kHz, ref %d kHz, bypass %d kHz, voltage level %d\n",
1885 1886 1887
			 context, cdclk_config->cdclk, cdclk_config->vco,
			 cdclk_config->ref, cdclk_config->bypass,
			 cdclk_config->voltage_level);
1888 1889
}

1890
/**
1891
 * intel_set_cdclk - Push the CDCLK configuration to the hardware
1892
 * @dev_priv: i915 device
1893
 * @cdclk_config: new CDCLK configuration
1894
 * @pipe: pipe with which to synchronize the update
1895 1896 1897 1898
 *
 * Program the hardware based on the passed in CDCLK state,
 * if necessary.
 */
1899
static void intel_set_cdclk(struct drm_i915_private *dev_priv,
1900
			    const struct intel_cdclk_config *cdclk_config,
1901
			    enum pipe pipe)
1902
{
1903 1904
	struct intel_encoder *encoder;

1905
	if (!intel_cdclk_changed(&dev_priv->cdclk.hw, cdclk_config))
1906 1907
		return;

1908
	if (drm_WARN_ON_ONCE(&dev_priv->drm, !dev_priv->display.set_cdclk))
1909 1910
		return;

1911
	intel_dump_cdclk_config(cdclk_config, "Changing CDCLK to");
1912

1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925
	/*
	 * Lock aux/gmbus while we change cdclk in case those
	 * functions use cdclk. Not all platforms/ports do,
	 * but we'll lock them all for simplicity.
	 */
	mutex_lock(&dev_priv->gmbus_mutex);
	for_each_intel_dp(&dev_priv->drm, encoder) {
		struct intel_dp *intel_dp = enc_to_intel_dp(encoder);

		mutex_lock_nest_lock(&intel_dp->aux.hw_mutex,
				     &dev_priv->gmbus_mutex);
	}

1926
	dev_priv->display.set_cdclk(dev_priv, cdclk_config, pipe);
1927

1928 1929 1930 1931 1932 1933 1934
	for_each_intel_dp(&dev_priv->drm, encoder) {
		struct intel_dp *intel_dp = enc_to_intel_dp(encoder);

		mutex_unlock(&intel_dp->aux.hw_mutex);
	}
	mutex_unlock(&dev_priv->gmbus_mutex);

1935 1936 1937
	if (drm_WARN(&dev_priv->drm,
		     intel_cdclk_changed(&dev_priv->cdclk.hw, cdclk_config),
		     "cdclk state doesn't match!\n")) {
1938 1939
		intel_dump_cdclk_config(&dev_priv->cdclk.hw, "[hw state]");
		intel_dump_cdclk_config(cdclk_config, "[sw state]");
1940
	}
1941 1942
}

1943
/**
1944 1945
 * intel_set_cdclk_pre_plane_update - Push the CDCLK state to the hardware
 * @state: intel atomic state
1946
 *
1947 1948
 * Program the hardware before updating the HW plane state based on the
 * new CDCLK state, if necessary.
1949 1950
 */
void
1951
intel_set_cdclk_pre_plane_update(struct intel_atomic_state *state)
1952
{
1953
	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
1954 1955 1956 1957
	const struct intel_cdclk_state *old_cdclk_state =
		intel_atomic_get_old_cdclk_state(state);
	const struct intel_cdclk_state *new_cdclk_state =
		intel_atomic_get_new_cdclk_state(state);
1958
	enum pipe pipe = new_cdclk_state->pipe;
1959

1960 1961 1962 1963
	if (!intel_cdclk_changed(&old_cdclk_state->actual,
				 &new_cdclk_state->actual))
		return;

1964
	if (pipe == INVALID_PIPE ||
1965
	    old_cdclk_state->actual.cdclk <= new_cdclk_state->actual.cdclk) {
1966
		drm_WARN_ON(&dev_priv->drm, !new_cdclk_state->base.changed);
1967

1968
		intel_set_cdclk(dev_priv, &new_cdclk_state->actual, pipe);
1969
	}
1970 1971 1972
}

/**
1973 1974
 * intel_set_cdclk_post_plane_update - Push the CDCLK state to the hardware
 * @state: intel atomic state
1975
 *
1976
 * Program the hardware after updating the HW plane state based on the
1977
 * new CDCLK state, if necessary.
1978 1979
 */
void
1980
intel_set_cdclk_post_plane_update(struct intel_atomic_state *state)
1981
{
1982
	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
1983 1984 1985 1986
	const struct intel_cdclk_state *old_cdclk_state =
		intel_atomic_get_old_cdclk_state(state);
	const struct intel_cdclk_state *new_cdclk_state =
		intel_atomic_get_new_cdclk_state(state);
1987
	enum pipe pipe = new_cdclk_state->pipe;
1988

1989 1990 1991 1992
	if (!intel_cdclk_changed(&old_cdclk_state->actual,
				 &new_cdclk_state->actual))
		return;

1993
	if (pipe != INVALID_PIPE &&
1994
	    old_cdclk_state->actual.cdclk > new_cdclk_state->actual.cdclk) {
1995
		drm_WARN_ON(&dev_priv->drm, !new_cdclk_state->base.changed);
1996

1997
		intel_set_cdclk(dev_priv, &new_cdclk_state->actual, pipe);
1998
	}
1999 2000
}

2001
static int intel_pixel_rate_to_cdclk(const struct intel_crtc_state *crtc_state)
2002
{
2003
	struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
2004 2005
	int pixel_rate = crtc_state->pixel_rate;

2006
	if (DISPLAY_VER(dev_priv) >= 10)
2007
		return DIV_ROUND_UP(pixel_rate, 2);
2008
	else if (DISPLAY_VER(dev_priv) == 9 ||
2009 2010 2011 2012
		 IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
		return pixel_rate;
	else if (IS_CHERRYVIEW(dev_priv))
		return DIV_ROUND_UP(pixel_rate * 100, 95);
2013 2014
	else if (crtc_state->double_wide)
		return DIV_ROUND_UP(pixel_rate * 100, 90 * 2);
2015 2016 2017 2018
	else
		return DIV_ROUND_UP(pixel_rate * 100, 90);
}

2019 2020
static int intel_planes_min_cdclk(const struct intel_crtc_state *crtc_state)
{
2021
	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
2022 2023 2024 2025 2026 2027 2028 2029 2030 2031
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
	struct intel_plane *plane;
	int min_cdclk = 0;

	for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, plane)
		min_cdclk = max(crtc_state->min_cdclk[plane->id], min_cdclk);

	return min_cdclk;
}

2032
int intel_crtc_compute_min_cdclk(const struct intel_crtc_state *crtc_state)
2033 2034
{
	struct drm_i915_private *dev_priv =
2035
		to_i915(crtc_state->uapi.crtc->dev);
2036 2037
	int min_cdclk;

2038
	if (!crtc_state->hw.enable)
2039 2040
		return 0;

2041
	min_cdclk = intel_pixel_rate_to_cdclk(crtc_state);
2042 2043

	/* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */
2044
	if (IS_BROADWELL(dev_priv) && hsw_crtc_state_ips_capable(crtc_state))
2045
		min_cdclk = DIV_ROUND_UP(min_cdclk * 100, 95);
2046

2047 2048 2049
	/* BSpec says "Do not use DisplayPort with CDCLK less than 432 MHz,
	 * audio enabled, port width x4, and link rate HBR2 (5.4 GHz), or else
	 * there may be audio corruption or screen corruption." This cdclk
2050
	 * restriction for GLK is 316.8 MHz.
2051 2052 2053 2054
	 */
	if (intel_crtc_has_dp_encoder(crtc_state) &&
	    crtc_state->has_audio &&
	    crtc_state->port_clock >= 540000 &&
2055
	    crtc_state->lane_count == 4) {
2056
		if (DISPLAY_VER(dev_priv) == 10) {
2057 2058
			/* Display WA #1145: glk,cnl */
			min_cdclk = max(316800, min_cdclk);
2059
		} else if (DISPLAY_VER(dev_priv) == 9 || IS_BROADWELL(dev_priv)) {
2060 2061 2062
			/* Display WA #1144: skl,bxt */
			min_cdclk = max(432000, min_cdclk);
		}
2063
	}
2064

2065 2066
	/*
	 * According to BSpec, "The CD clock frequency must be at least twice
2067 2068
	 * the frequency of the Azalia BCLK." and BCLK is 96 MHz by default.
	 */
2069
	if (crtc_state->has_audio && DISPLAY_VER(dev_priv) >= 9)
2070
		min_cdclk = max(2 * 96000, min_cdclk);
2071

2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082
	/*
	 * "For DP audio configuration, cdclk frequency shall be set to
	 *  meet the following requirements:
	 *  DP Link Frequency(MHz) | Cdclk frequency(MHz)
	 *  270                    | 320 or higher
	 *  162                    | 200 or higher"
	 */
	if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
	    intel_crtc_has_dp_encoder(crtc_state) && crtc_state->has_audio)
		min_cdclk = max(crtc_state->port_clock, min_cdclk);

2083 2084 2085 2086 2087 2088 2089 2090
	/*
	 * On Valleyview some DSI panels lose (v|h)sync when the clock is lower
	 * than 320000KHz.
	 */
	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DSI) &&
	    IS_VALLEYVIEW(dev_priv))
		min_cdclk = max(320000, min_cdclk);

2091 2092 2093 2094 2095 2096 2097 2098 2099
	/*
	 * On Geminilake once the CDCLK gets as low as 79200
	 * picture gets unstable, despite that values are
	 * correct for DSI PLL and DE PLL.
	 */
	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DSI) &&
	    IS_GEMINILAKE(dev_priv))
		min_cdclk = max(158400, min_cdclk);

2100 2101 2102
	/* Account for additional needs from the planes */
	min_cdclk = max(intel_planes_min_cdclk(crtc_state), min_cdclk);

2103 2104 2105 2106 2107 2108 2109 2110 2111
	/*
	 * HACK. Currently for TGL platforms we calculate
	 * min_cdclk initially based on pixel_rate divided
	 * by 2, accounting for also plane requirements,
	 * however in some cases the lowest possible CDCLK
	 * doesn't work and causing the underruns.
	 * Explicitly stating here that this seems to be currently
	 * rather a Hack, than final solution.
	 */
2112 2113 2114 2115 2116 2117 2118 2119 2120
	if (IS_TIGERLAKE(dev_priv)) {
		/*
		 * Clamp to max_cdclk_freq in case pixel rate is higher,
		 * in order not to break an 8K, but still leave W/A at place.
		 */
		min_cdclk = max_t(int, min_cdclk,
				  min_t(int, crtc_state->pixel_rate,
					dev_priv->max_cdclk_freq));
	}
2121

2122
	if (min_cdclk > dev_priv->max_cdclk_freq) {
2123 2124 2125
		drm_dbg_kms(&dev_priv->drm,
			    "required cdclk (%d kHz) exceeds max (%d kHz)\n",
			    min_cdclk, dev_priv->max_cdclk_freq);
2126 2127 2128
		return -EINVAL;
	}

2129
	return min_cdclk;
2130 2131
}

2132
static int intel_compute_min_cdclk(struct intel_cdclk_state *cdclk_state)
2133
{
2134
	struct intel_atomic_state *state = cdclk_state->base.state;
2135 2136
	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
	struct intel_bw_state *bw_state = NULL;
2137
	struct intel_crtc *crtc;
2138
	struct intel_crtc_state *crtc_state;
2139
	int min_cdclk, i;
2140
	enum pipe pipe;
2141

2142
	for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
2143 2144
		int ret;

2145 2146 2147 2148
		min_cdclk = intel_crtc_compute_min_cdclk(crtc_state);
		if (min_cdclk < 0)
			return min_cdclk;

2149 2150 2151 2152
		bw_state = intel_atomic_get_bw_state(state);
		if (IS_ERR(bw_state))
			return PTR_ERR(bw_state);

2153
		if (cdclk_state->min_cdclk[crtc->pipe] == min_cdclk)
2154 2155
			continue;

2156
		cdclk_state->min_cdclk[crtc->pipe] = min_cdclk;
2157

2158
		ret = intel_atomic_lock_global_state(&cdclk_state->base);
2159 2160
		if (ret)
			return ret;
2161
	}
2162

2163
	min_cdclk = cdclk_state->force_min_cdclk;
2164 2165
	for_each_pipe(dev_priv, pipe) {
		min_cdclk = max(cdclk_state->min_cdclk[pipe], min_cdclk);
2166

2167 2168
		if (!bw_state)
			continue;
2169 2170 2171

		min_cdclk = max(bw_state->min_cdclk, min_cdclk);
	}
2172

2173
	return min_cdclk;
2174 2175
}

2176
/*
2177 2178 2179 2180
 * Account for port clock min voltage level requirements.
 * This only really does something on CNL+ but can be
 * called on earlier platforms as well.
 *
2181 2182 2183 2184 2185 2186 2187 2188
 * Note that this functions assumes that 0 is
 * the lowest voltage value, and higher values
 * correspond to increasingly higher voltages.
 *
 * Should that relationship no longer hold on
 * future platforms this code will need to be
 * adjusted.
 */
2189
static int bxt_compute_min_voltage_level(struct intel_cdclk_state *cdclk_state)
2190
{
2191
	struct intel_atomic_state *state = cdclk_state->base.state;
2192 2193 2194 2195 2196 2197 2198 2199
	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
	struct intel_crtc *crtc;
	struct intel_crtc_state *crtc_state;
	u8 min_voltage_level;
	int i;
	enum pipe pipe;

	for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
2200 2201
		int ret;

2202
		if (crtc_state->hw.enable)
2203
			min_voltage_level = crtc_state->min_voltage_level;
2204
		else
2205 2206
			min_voltage_level = 0;

2207
		if (cdclk_state->min_voltage_level[crtc->pipe] == min_voltage_level)
2208 2209
			continue;

2210
		cdclk_state->min_voltage_level[crtc->pipe] = min_voltage_level;
2211

2212
		ret = intel_atomic_lock_global_state(&cdclk_state->base);
2213 2214
		if (ret)
			return ret;
2215 2216 2217 2218
	}

	min_voltage_level = 0;
	for_each_pipe(dev_priv, pipe)
2219
		min_voltage_level = max(cdclk_state->min_voltage_level[pipe],
2220 2221 2222 2223 2224
					min_voltage_level);

	return min_voltage_level;
}

2225
static int vlv_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
2226
{
2227
	struct intel_atomic_state *state = cdclk_state->base.state;
2228
	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
2229
	int min_cdclk, cdclk;
2230

2231
	min_cdclk = intel_compute_min_cdclk(cdclk_state);
2232 2233
	if (min_cdclk < 0)
		return min_cdclk;
2234

2235
	cdclk = vlv_calc_cdclk(dev_priv, min_cdclk);
2236

2237 2238
	cdclk_state->logical.cdclk = cdclk;
	cdclk_state->logical.voltage_level =
2239
		vlv_calc_voltage_level(dev_priv, cdclk);
2240

2241
	if (!cdclk_state->active_pipes) {
2242
		cdclk = vlv_calc_cdclk(dev_priv, cdclk_state->force_min_cdclk);
2243

2244 2245
		cdclk_state->actual.cdclk = cdclk;
		cdclk_state->actual.voltage_level =
2246
			vlv_calc_voltage_level(dev_priv, cdclk);
2247
	} else {
2248
		cdclk_state->actual = cdclk_state->logical;
2249
	}
2250 2251 2252 2253

	return 0;
}

2254
static int bdw_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
2255
{
2256 2257
	int min_cdclk, cdclk;

2258
	min_cdclk = intel_compute_min_cdclk(cdclk_state);
2259 2260
	if (min_cdclk < 0)
		return min_cdclk;
2261 2262 2263 2264 2265

	/*
	 * FIXME should also account for plane ratio
	 * once 64bpp pixel formats are supported.
	 */
2266
	cdclk = bdw_calc_cdclk(min_cdclk);
2267

2268 2269
	cdclk_state->logical.cdclk = cdclk;
	cdclk_state->logical.voltage_level =
2270
		bdw_calc_voltage_level(cdclk);
2271

2272
	if (!cdclk_state->active_pipes) {
2273
		cdclk = bdw_calc_cdclk(cdclk_state->force_min_cdclk);
2274

2275 2276
		cdclk_state->actual.cdclk = cdclk;
		cdclk_state->actual.voltage_level =
2277
			bdw_calc_voltage_level(cdclk);
2278
	} else {
2279
		cdclk_state->actual = cdclk_state->logical;
2280
	}
2281 2282 2283 2284

	return 0;
}

2285
static int skl_dpll0_vco(struct intel_cdclk_state *cdclk_state)
2286
{
2287
	struct intel_atomic_state *state = cdclk_state->base.state;
2288
	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
2289 2290 2291 2292
	struct intel_crtc *crtc;
	struct intel_crtc_state *crtc_state;
	int vco, i;

2293
	vco = cdclk_state->logical.vco;
2294 2295 2296
	if (!vco)
		vco = dev_priv->skl_preferred_vco_freq;

2297
	for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
2298
		if (!crtc_state->hw.enable)
2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321
			continue;

		if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP))
			continue;

		/*
		 * DPLL0 VCO may need to be adjusted to get the correct
		 * clock for eDP. This will affect cdclk as well.
		 */
		switch (crtc_state->port_clock / 2) {
		case 108000:
		case 216000:
			vco = 8640000;
			break;
		default:
			vco = 8100000;
			break;
		}
	}

	return vco;
}

2322
static int skl_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
2323
{
2324 2325
	int min_cdclk, cdclk, vco;

2326
	min_cdclk = intel_compute_min_cdclk(cdclk_state);
2327 2328
	if (min_cdclk < 0)
		return min_cdclk;
2329

2330
	vco = skl_dpll0_vco(cdclk_state);
2331 2332 2333 2334 2335

	/*
	 * FIXME should also account for plane ratio
	 * once 64bpp pixel formats are supported.
	 */
2336
	cdclk = skl_calc_cdclk(min_cdclk, vco);
2337

2338 2339 2340
	cdclk_state->logical.vco = vco;
	cdclk_state->logical.cdclk = cdclk;
	cdclk_state->logical.voltage_level =
2341
		skl_calc_voltage_level(cdclk);
2342

2343
	if (!cdclk_state->active_pipes) {
2344
		cdclk = skl_calc_cdclk(cdclk_state->force_min_cdclk, vco);
2345

2346 2347 2348
		cdclk_state->actual.vco = vco;
		cdclk_state->actual.cdclk = cdclk;
		cdclk_state->actual.voltage_level =
2349
			skl_calc_voltage_level(cdclk);
2350
	} else {
2351
		cdclk_state->actual = cdclk_state->logical;
2352
	}
2353 2354 2355 2356

	return 0;
}

2357
static int bxt_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
2358
{
2359
	struct intel_atomic_state *state = cdclk_state->base.state;
2360
	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
2361
	int min_cdclk, min_voltage_level, cdclk, vco;
2362

2363
	min_cdclk = intel_compute_min_cdclk(cdclk_state);
2364 2365
	if (min_cdclk < 0)
		return min_cdclk;
2366

2367
	min_voltage_level = bxt_compute_min_voltage_level(cdclk_state);
2368 2369 2370
	if (min_voltage_level < 0)
		return min_voltage_level;

2371 2372
	cdclk = bxt_calc_cdclk(dev_priv, min_cdclk);
	vco = bxt_calc_cdclk_pll_vco(dev_priv, cdclk);
2373

2374 2375 2376
	cdclk_state->logical.vco = vco;
	cdclk_state->logical.cdclk = cdclk;
	cdclk_state->logical.voltage_level =
2377 2378
		max_t(int, min_voltage_level,
		      dev_priv->display.calc_voltage_level(cdclk));
2379

2380
	if (!cdclk_state->active_pipes) {
2381
		cdclk = bxt_calc_cdclk(dev_priv, cdclk_state->force_min_cdclk);
2382
		vco = bxt_calc_cdclk_pll_vco(dev_priv, cdclk);
2383

2384 2385 2386
		cdclk_state->actual.vco = vco;
		cdclk_state->actual.cdclk = cdclk;
		cdclk_state->actual.voltage_level =
2387
			dev_priv->display.calc_voltage_level(cdclk);
2388
	} else {
2389
		cdclk_state->actual = cdclk_state->logical;
2390 2391 2392 2393 2394
	}

	return 0;
}

2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411
static int intel_modeset_all_pipes(struct intel_atomic_state *state)
{
	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
	struct intel_crtc *crtc;

	/*
	 * Add all pipes to the state, and force
	 * a modeset on all the active ones.
	 */
	for_each_intel_crtc(&dev_priv->drm, crtc) {
		struct intel_crtc_state *crtc_state;
		int ret;

		crtc_state = intel_atomic_get_crtc_state(&state->base, crtc);
		if (IS_ERR(crtc_state))
			return PTR_ERR(crtc_state);

2412
		if (!crtc_state->hw.active ||
2413
		    drm_atomic_crtc_needs_modeset(&crtc_state->uapi))
2414 2415
			continue;

2416
		crtc_state->uapi.mode_changed = true;
2417 2418 2419 2420 2421 2422

		ret = drm_atomic_add_affected_connectors(&state->base,
							 &crtc->base);
		if (ret)
			return ret;

2423
		ret = intel_atomic_add_affected_planes(state, crtc);
2424 2425 2426 2427 2428 2429 2430 2431 2432
		if (ret)
			return ret;

		crtc_state->update_planes |= crtc_state->active_planes;
	}

	return 0;
}

2433
static int fixed_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
2434 2435 2436 2437 2438 2439 2440 2441
{
	int min_cdclk;

	/*
	 * We can't change the cdclk frequency, but we still want to
	 * check that the required minimum frequency doesn't exceed
	 * the actual cdclk frequency.
	 */
2442
	min_cdclk = intel_compute_min_cdclk(cdclk_state);
2443 2444 2445 2446 2447 2448
	if (min_cdclk < 0)
		return min_cdclk;

	return 0;
}

2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499
static struct intel_global_state *intel_cdclk_duplicate_state(struct intel_global_obj *obj)
{
	struct intel_cdclk_state *cdclk_state;

	cdclk_state = kmemdup(obj->state, sizeof(*cdclk_state), GFP_KERNEL);
	if (!cdclk_state)
		return NULL;

	cdclk_state->pipe = INVALID_PIPE;

	return &cdclk_state->base;
}

static void intel_cdclk_destroy_state(struct intel_global_obj *obj,
				      struct intel_global_state *state)
{
	kfree(state);
}

static const struct intel_global_state_funcs intel_cdclk_funcs = {
	.atomic_duplicate_state = intel_cdclk_duplicate_state,
	.atomic_destroy_state = intel_cdclk_destroy_state,
};

struct intel_cdclk_state *
intel_atomic_get_cdclk_state(struct intel_atomic_state *state)
{
	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
	struct intel_global_state *cdclk_state;

	cdclk_state = intel_atomic_get_global_obj_state(state, &dev_priv->cdclk.obj);
	if (IS_ERR(cdclk_state))
		return ERR_CAST(cdclk_state);

	return to_intel_cdclk_state(cdclk_state);
}

int intel_cdclk_init(struct drm_i915_private *dev_priv)
{
	struct intel_cdclk_state *cdclk_state;

	cdclk_state = kzalloc(sizeof(*cdclk_state), GFP_KERNEL);
	if (!cdclk_state)
		return -ENOMEM;

	intel_atomic_global_obj_init(dev_priv, &dev_priv->cdclk.obj,
				     &cdclk_state->base, &intel_cdclk_funcs);

	return 0;
}

2500 2501 2502
int intel_modeset_calc_cdclk(struct intel_atomic_state *state)
{
	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
2503 2504
	const struct intel_cdclk_state *old_cdclk_state;
	struct intel_cdclk_state *new_cdclk_state;
2505 2506 2507
	enum pipe pipe;
	int ret;

2508 2509 2510
	new_cdclk_state = intel_atomic_get_cdclk_state(state);
	if (IS_ERR(new_cdclk_state))
		return PTR_ERR(new_cdclk_state);
2511

2512
	old_cdclk_state = intel_atomic_get_old_cdclk_state(state);
2513

2514 2515 2516
	new_cdclk_state->active_pipes =
		intel_calc_active_pipes(state, old_cdclk_state->active_pipes);

2517
	ret = dev_priv->display.modeset_calc_cdclk(new_cdclk_state);
2518 2519 2520
	if (ret)
		return ret;

2521 2522
	if (intel_cdclk_changed(&old_cdclk_state->actual,
				&new_cdclk_state->actual)) {
2523 2524 2525 2526
		/*
		 * Also serialize commits across all crtcs
		 * if the actual hw needs to be poked.
		 */
2527
		ret = intel_atomic_serialize_global_state(&new_cdclk_state->base);
2528 2529
		if (ret)
			return ret;
2530
	} else if (old_cdclk_state->active_pipes != new_cdclk_state->active_pipes ||
2531
		   old_cdclk_state->force_min_cdclk != new_cdclk_state->force_min_cdclk ||
2532
		   intel_cdclk_changed(&old_cdclk_state->logical,
2533
				       &new_cdclk_state->logical)) {
2534
		ret = intel_atomic_lock_global_state(&new_cdclk_state->base);
2535
		if (ret)
2536
			return ret;
2537 2538
	} else {
		return 0;
2539 2540
	}

2541
	if (is_power_of_2(new_cdclk_state->active_pipes) &&
2542
	    intel_cdclk_can_cd2x_update(dev_priv,
2543 2544
					&old_cdclk_state->actual,
					&new_cdclk_state->actual)) {
2545 2546 2547
		struct intel_crtc *crtc;
		struct intel_crtc_state *crtc_state;

2548
		pipe = ilog2(new_cdclk_state->active_pipes);
2549
		crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
2550 2551 2552 2553 2554

		crtc_state = intel_atomic_get_crtc_state(&state->base, crtc);
		if (IS_ERR(crtc_state))
			return PTR_ERR(crtc_state);

2555
		if (drm_atomic_crtc_needs_modeset(&crtc_state->uapi))
2556 2557 2558 2559 2560
			pipe = INVALID_PIPE;
	} else {
		pipe = INVALID_PIPE;
	}

2561
	if (pipe != INVALID_PIPE) {
2562
		new_cdclk_state->pipe = pipe;
2563

2564 2565 2566
		drm_dbg_kms(&dev_priv->drm,
			    "Can change cdclk with pipe %c active\n",
			    pipe_name(pipe));
2567 2568
	} else if (intel_cdclk_needs_modeset(&old_cdclk_state->actual,
					     &new_cdclk_state->actual)) {
2569
		/* All pipes must be switched off while we change the cdclk. */
2570 2571 2572 2573
		ret = intel_modeset_all_pipes(state);
		if (ret)
			return ret;

2574
		new_cdclk_state->pipe = INVALID_PIPE;
2575

2576 2577
		drm_dbg_kms(&dev_priv->drm,
			    "Modeset required for cdclk change\n");
2578 2579
	}

2580 2581
	drm_dbg_kms(&dev_priv->drm,
		    "New cdclk calculated to be logical %u kHz, actual %u kHz\n",
2582 2583
		    new_cdclk_state->logical.cdclk,
		    new_cdclk_state->actual.cdclk);
2584 2585
	drm_dbg_kms(&dev_priv->drm,
		    "New voltage level calculated to be logical %u, actual %u\n",
2586 2587
		    new_cdclk_state->logical.voltage_level,
		    new_cdclk_state->actual.voltage_level);
2588 2589 2590 2591

	return 0;
}

2592 2593 2594 2595
static int intel_compute_max_dotclk(struct drm_i915_private *dev_priv)
{
	int max_cdclk_freq = dev_priv->max_cdclk_freq;

2596
	if (DISPLAY_VER(dev_priv) >= 10)
2597
		return 2 * max_cdclk_freq;
2598
	else if (DISPLAY_VER(dev_priv) == 9 ||
2599
		 IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
2600 2601 2602
		return max_cdclk_freq;
	else if (IS_CHERRYVIEW(dev_priv))
		return max_cdclk_freq*95/100;
2603
	else if (DISPLAY_VER(dev_priv) < 4)
2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618
		return 2*max_cdclk_freq*90/100;
	else
		return max_cdclk_freq*90/100;
}

/**
 * intel_update_max_cdclk - Determine the maximum support CDCLK frequency
 * @dev_priv: i915 device
 *
 * Determine the maximum CDCLK frequency the platform supports, and also
 * derive the maximum dot clock frequency the maximum CDCLK frequency
 * allows.
 */
void intel_update_max_cdclk(struct drm_i915_private *dev_priv)
{
2619
	if (IS_JSL_EHL(dev_priv)) {
2620 2621 2622 2623
		if (dev_priv->cdclk.hw.ref == 24000)
			dev_priv->max_cdclk_freq = 552000;
		else
			dev_priv->max_cdclk_freq = 556800;
2624
	} else if (DISPLAY_VER(dev_priv) >= 11) {
2625 2626 2627 2628 2629
		if (dev_priv->cdclk.hw.ref == 24000)
			dev_priv->max_cdclk_freq = 648000;
		else
			dev_priv->max_cdclk_freq = 652800;
	} else if (IS_CANNONLAKE(dev_priv)) {
2630
		dev_priv->max_cdclk_freq = 528000;
2631 2632 2633 2634
	} else if (IS_GEMINILAKE(dev_priv)) {
		dev_priv->max_cdclk_freq = 316800;
	} else if (IS_BROXTON(dev_priv)) {
		dev_priv->max_cdclk_freq = 624000;
2635
	} else if (DISPLAY_VER(dev_priv) == 9) {
2636
		u32 limit = intel_de_read(dev_priv, SKL_DFSM) & SKL_DFSM_CDCLK_LIMIT_MASK;
2637 2638 2639
		int max_cdclk, vco;

		vco = dev_priv->skl_preferred_vco_freq;
2640
		drm_WARN_ON(&dev_priv->drm, vco != 8100000 && vco != 8640000);
2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663

		/*
		 * Use the lower (vco 8640) cdclk values as a
		 * first guess. skl_calc_cdclk() will correct it
		 * if the preferred vco is 8100 instead.
		 */
		if (limit == SKL_DFSM_CDCLK_LIMIT_675)
			max_cdclk = 617143;
		else if (limit == SKL_DFSM_CDCLK_LIMIT_540)
			max_cdclk = 540000;
		else if (limit == SKL_DFSM_CDCLK_LIMIT_450)
			max_cdclk = 432000;
		else
			max_cdclk = 308571;

		dev_priv->max_cdclk_freq = skl_calc_cdclk(max_cdclk, vco);
	} else if (IS_BROADWELL(dev_priv))  {
		/*
		 * FIXME with extra cooling we can allow
		 * 540 MHz for ULX and 675 Mhz for ULT.
		 * How can we know if extra cooling is
		 * available? PCI ID, VTB, something else?
		 */
2664
		if (intel_de_read(dev_priv, FUSE_STRAP) & HSW_CDCLK_LIMIT)
2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677
			dev_priv->max_cdclk_freq = 450000;
		else if (IS_BDW_ULX(dev_priv))
			dev_priv->max_cdclk_freq = 450000;
		else if (IS_BDW_ULT(dev_priv))
			dev_priv->max_cdclk_freq = 540000;
		else
			dev_priv->max_cdclk_freq = 675000;
	} else if (IS_CHERRYVIEW(dev_priv)) {
		dev_priv->max_cdclk_freq = 320000;
	} else if (IS_VALLEYVIEW(dev_priv)) {
		dev_priv->max_cdclk_freq = 400000;
	} else {
		/* otherwise assume cdclk is fixed */
2678
		dev_priv->max_cdclk_freq = dev_priv->cdclk.hw.cdclk;
2679 2680 2681 2682
	}

	dev_priv->max_dotclk_freq = intel_compute_max_dotclk(dev_priv);

2683 2684
	drm_dbg(&dev_priv->drm, "Max CD clock rate: %d kHz\n",
		dev_priv->max_cdclk_freq);
2685

2686 2687
	drm_dbg(&dev_priv->drm, "Max dotclock rate: %d kHz\n",
		dev_priv->max_dotclk_freq);
2688 2689 2690 2691 2692 2693 2694 2695 2696 2697
}

/**
 * intel_update_cdclk - Determine the current CDCLK frequency
 * @dev_priv: i915 device
 *
 * Determine the current CDCLK frequency.
 */
void intel_update_cdclk(struct drm_i915_private *dev_priv)
{
2698
	dev_priv->display.get_cdclk(dev_priv, &dev_priv->cdclk.hw);
2699 2700 2701 2702 2703 2704 2705 2706

	/*
	 * 9:0 CMBUS [sic] CDCLK frequency (cdfreq):
	 * Programmng [sic] note: bit[9:2] should be programmed to the number
	 * of cdclk that generates 4MHz reference clock freq which is used to
	 * generate GMBus clock. This will vary with the cdclk freq.
	 */
	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
2707
		intel_de_write(dev_priv, GMBUSFREQ_VLV,
V
Ville Syrjälä 已提交
2708
			       DIV_ROUND_UP(dev_priv->cdclk.hw.cdclk, 1000));
2709 2710
}

2711 2712 2713 2714 2715 2716
static int dg1_rawclk(struct drm_i915_private *dev_priv)
{
	/*
	 * DG1 always uses a 38.4 MHz rawclk.  The bspec tells us
	 * "Program Numerator=2, Denominator=4, Divider=37 decimal."
	 */
2717 2718
	intel_de_write(dev_priv, PCH_RAWCLK_FREQ,
		       CNP_RAWCLK_DEN(4) | CNP_RAWCLK_DIV(37) | ICP_RAWCLK_NUM(2));
2719 2720 2721 2722

	return 38400;
}

2723 2724 2725 2726 2727
static int cnp_rawclk(struct drm_i915_private *dev_priv)
{
	u32 rawclk;
	int divider, fraction;

2728
	if (intel_de_read(dev_priv, SFUSE_STRAP) & SFUSE_STRAP_RAW_FREQUENCY) {
2729 2730 2731 2732 2733 2734 2735 2736 2737
		/* 24 MHz */
		divider = 24000;
		fraction = 0;
	} else {
		/* 19.2 MHz */
		divider = 19000;
		fraction = 200;
	}

2738
	rawclk = CNP_RAWCLK_DIV(divider / 1000);
2739 2740
	if (fraction) {
		int numerator = 1;
2741

2742 2743
		rawclk |= CNP_RAWCLK_DEN(DIV_ROUND_CLOSEST(numerator * 1000,
							   fraction) - 1);
2744
		if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP)
2745
			rawclk |= ICP_RAWCLK_NUM(numerator);
2746 2747
	}

2748
	intel_de_write(dev_priv, PCH_RAWCLK_FREQ, rawclk);
2749
	return divider + fraction;
2750 2751
}

2752 2753
static int pch_rawclk(struct drm_i915_private *dev_priv)
{
2754
	return (intel_de_read(dev_priv, PCH_RAWCLK_FREQ) & RAWCLK_FREQ_MASK) * 1000;
2755 2756 2757 2758 2759 2760 2761 2762 2763
}

static int vlv_hrawclk(struct drm_i915_private *dev_priv)
{
	/* RAWCLK_FREQ_VLV register updated from power well code */
	return vlv_get_cck_clock_hpll(dev_priv, "hrawclk",
				      CCK_DISPLAY_REF_CLOCK_CONTROL);
}

2764
static int i9xx_hrawclk(struct drm_i915_private *dev_priv)
2765
{
2766
	u32 clkcfg;
2767

2768 2769 2770 2771 2772 2773 2774 2775 2776 2777
	/*
	 * hrawclock is 1/4 the FSB frequency
	 *
	 * Note that this only reads the state of the FSB
	 * straps, not the actual FSB frequency. Some BIOSen
	 * let you configure each independently. Ideally we'd
	 * read out the actual FSB frequency but sadly we
	 * don't know which registers have that information,
	 * and all the relevant docs have gone to bit heaven :(
	 */
2778 2779
	clkcfg = intel_de_read(dev_priv, CLKCFG) & CLKCFG_FSB_MASK;

2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816
	if (IS_MOBILE(dev_priv)) {
		switch (clkcfg) {
		case CLKCFG_FSB_400:
			return 100000;
		case CLKCFG_FSB_533:
			return 133333;
		case CLKCFG_FSB_667:
			return 166667;
		case CLKCFG_FSB_800:
			return 200000;
		case CLKCFG_FSB_1067:
			return 266667;
		case CLKCFG_FSB_1333:
			return 333333;
		default:
			MISSING_CASE(clkcfg);
			return 133333;
		}
	} else {
		switch (clkcfg) {
		case CLKCFG_FSB_400_ALT:
			return 100000;
		case CLKCFG_FSB_533:
			return 133333;
		case CLKCFG_FSB_667:
			return 166667;
		case CLKCFG_FSB_800:
			return 200000;
		case CLKCFG_FSB_1067_ALT:
			return 266667;
		case CLKCFG_FSB_1333_ALT:
			return 333333;
		case CLKCFG_FSB_1600_ALT:
			return 400000;
		default:
			return 133333;
		}
2817 2818 2819 2820
	}
}

/**
2821
 * intel_read_rawclk - Determine the current RAWCLK frequency
2822 2823 2824 2825 2826
 * @dev_priv: i915 device
 *
 * Determine the current RAWCLK frequency. RAWCLK is a fixed
 * frequency clock so this needs to done only once.
 */
2827
u32 intel_read_rawclk(struct drm_i915_private *dev_priv)
2828
{
2829 2830
	u32 freq;

2831 2832 2833
	if (INTEL_PCH_TYPE(dev_priv) >= PCH_DG1)
		freq = dg1_rawclk(dev_priv);
	else if (INTEL_PCH_TYPE(dev_priv) >= PCH_CNP)
2834
		freq = cnp_rawclk(dev_priv);
2835
	else if (HAS_PCH_SPLIT(dev_priv))
2836
		freq = pch_rawclk(dev_priv);
2837
	else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
2838
		freq = vlv_hrawclk(dev_priv);
2839
	else if (DISPLAY_VER(dev_priv) >= 3)
2840
		freq = i9xx_hrawclk(dev_priv);
2841 2842
	else
		/* no rawclk on other platforms, or no need to know it */
2843
		return 0;
2844

2845
	return freq;
2846 2847 2848 2849 2850 2851 2852 2853
}

/**
 * intel_init_cdclk_hooks - Initialize CDCLK related modesetting hooks
 * @dev_priv: i915 device
 */
void intel_init_cdclk_hooks(struct drm_i915_private *dev_priv)
{
M
Matt Roper 已提交
2854 2855 2856 2857 2858 2859
	if (IS_ROCKETLAKE(dev_priv)) {
		dev_priv->display.set_cdclk = bxt_set_cdclk;
		dev_priv->display.bw_calc_min_cdclk = skl_bw_calc_min_cdclk;
		dev_priv->display.modeset_calc_cdclk = bxt_modeset_calc_cdclk;
		dev_priv->display.calc_voltage_level = tgl_calc_voltage_level;
		dev_priv->cdclk.table = rkl_cdclk_table;
2860
	} else if (DISPLAY_VER(dev_priv) >= 12) {
2861
		dev_priv->display.set_cdclk = bxt_set_cdclk;
2862
		dev_priv->display.bw_calc_min_cdclk = skl_bw_calc_min_cdclk;
2863 2864 2865
		dev_priv->display.modeset_calc_cdclk = bxt_modeset_calc_cdclk;
		dev_priv->display.calc_voltage_level = tgl_calc_voltage_level;
		dev_priv->cdclk.table = icl_cdclk_table;
2866
	} else if (IS_JSL_EHL(dev_priv)) {
2867
		dev_priv->display.set_cdclk = bxt_set_cdclk;
2868
		dev_priv->display.bw_calc_min_cdclk = skl_bw_calc_min_cdclk;
2869
		dev_priv->display.modeset_calc_cdclk = bxt_modeset_calc_cdclk;
2870 2871
		dev_priv->display.calc_voltage_level = ehl_calc_voltage_level;
		dev_priv->cdclk.table = icl_cdclk_table;
2872
	} else if (DISPLAY_VER(dev_priv) >= 11) {
2873
		dev_priv->display.set_cdclk = bxt_set_cdclk;
2874
		dev_priv->display.bw_calc_min_cdclk = skl_bw_calc_min_cdclk;
2875
		dev_priv->display.modeset_calc_cdclk = bxt_modeset_calc_cdclk;
2876
		dev_priv->display.calc_voltage_level = icl_calc_voltage_level;
2877
		dev_priv->cdclk.table = icl_cdclk_table;
2878
	} else if (IS_CANNONLAKE(dev_priv)) {
2879
		dev_priv->display.bw_calc_min_cdclk = skl_bw_calc_min_cdclk;
2880
		dev_priv->display.set_cdclk = bxt_set_cdclk;
2881
		dev_priv->display.modeset_calc_cdclk = bxt_modeset_calc_cdclk;
2882
		dev_priv->display.calc_voltage_level = cnl_calc_voltage_level;
2883
		dev_priv->cdclk.table = cnl_cdclk_table;
2884
	} else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) {
2885
		dev_priv->display.bw_calc_min_cdclk = skl_bw_calc_min_cdclk;
2886
		dev_priv->display.set_cdclk = bxt_set_cdclk;
2887
		dev_priv->display.modeset_calc_cdclk = bxt_modeset_calc_cdclk;
2888
		dev_priv->display.calc_voltage_level = bxt_calc_voltage_level;
2889 2890 2891 2892
		if (IS_GEMINILAKE(dev_priv))
			dev_priv->cdclk.table = glk_cdclk_table;
		else
			dev_priv->cdclk.table = bxt_cdclk_table;
2893
	} else if (DISPLAY_VER(dev_priv) == 9) {
2894
		dev_priv->display.bw_calc_min_cdclk = skl_bw_calc_min_cdclk;
2895
		dev_priv->display.set_cdclk = skl_set_cdclk;
2896
		dev_priv->display.modeset_calc_cdclk = skl_modeset_calc_cdclk;
2897
	} else if (IS_BROADWELL(dev_priv)) {
2898
		dev_priv->display.bw_calc_min_cdclk = intel_bw_calc_min_cdclk;
2899
		dev_priv->display.set_cdclk = bdw_set_cdclk;
2900
		dev_priv->display.modeset_calc_cdclk = bdw_modeset_calc_cdclk;
2901
	} else if (IS_CHERRYVIEW(dev_priv)) {
2902
		dev_priv->display.bw_calc_min_cdclk = intel_bw_calc_min_cdclk;
2903
		dev_priv->display.set_cdclk = chv_set_cdclk;
2904
		dev_priv->display.modeset_calc_cdclk = vlv_modeset_calc_cdclk;
2905
	} else if (IS_VALLEYVIEW(dev_priv)) {
2906
		dev_priv->display.bw_calc_min_cdclk = intel_bw_calc_min_cdclk;
2907
		dev_priv->display.set_cdclk = vlv_set_cdclk;
2908
		dev_priv->display.modeset_calc_cdclk = vlv_modeset_calc_cdclk;
2909
	} else {
2910
		dev_priv->display.bw_calc_min_cdclk = intel_bw_calc_min_cdclk;
2911
		dev_priv->display.modeset_calc_cdclk = fixed_modeset_calc_cdclk;
2912 2913
	}

2914
	if (DISPLAY_VER(dev_priv) >= 10 || IS_BROXTON(dev_priv))
2915
		dev_priv->display.get_cdclk = bxt_get_cdclk;
2916
	else if (DISPLAY_VER(dev_priv) == 9)
2917
		dev_priv->display.get_cdclk = skl_get_cdclk;
2918 2919 2920 2921 2922 2923
	else if (IS_BROADWELL(dev_priv))
		dev_priv->display.get_cdclk = bdw_get_cdclk;
	else if (IS_HASWELL(dev_priv))
		dev_priv->display.get_cdclk = hsw_get_cdclk;
	else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
		dev_priv->display.get_cdclk = vlv_get_cdclk;
2924
	else if (IS_SANDYBRIDGE(dev_priv) || IS_IVYBRIDGE(dev_priv))
2925
		dev_priv->display.get_cdclk = fixed_400mhz_get_cdclk;
2926
	else if (IS_IRONLAKE(dev_priv))
2927 2928 2929
		dev_priv->display.get_cdclk = fixed_450mhz_get_cdclk;
	else if (IS_GM45(dev_priv))
		dev_priv->display.get_cdclk = gm45_get_cdclk;
2930
	else if (IS_G45(dev_priv))
2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953
		dev_priv->display.get_cdclk = g33_get_cdclk;
	else if (IS_I965GM(dev_priv))
		dev_priv->display.get_cdclk = i965gm_get_cdclk;
	else if (IS_I965G(dev_priv))
		dev_priv->display.get_cdclk = fixed_400mhz_get_cdclk;
	else if (IS_PINEVIEW(dev_priv))
		dev_priv->display.get_cdclk = pnv_get_cdclk;
	else if (IS_G33(dev_priv))
		dev_priv->display.get_cdclk = g33_get_cdclk;
	else if (IS_I945GM(dev_priv))
		dev_priv->display.get_cdclk = i945gm_get_cdclk;
	else if (IS_I945G(dev_priv))
		dev_priv->display.get_cdclk = fixed_400mhz_get_cdclk;
	else if (IS_I915GM(dev_priv))
		dev_priv->display.get_cdclk = i915gm_get_cdclk;
	else if (IS_I915G(dev_priv))
		dev_priv->display.get_cdclk = fixed_333mhz_get_cdclk;
	else if (IS_I865G(dev_priv))
		dev_priv->display.get_cdclk = fixed_266mhz_get_cdclk;
	else if (IS_I85X(dev_priv))
		dev_priv->display.get_cdclk = i85x_get_cdclk;
	else if (IS_I845G(dev_priv))
		dev_priv->display.get_cdclk = fixed_200mhz_get_cdclk;
2954 2955 2956 2957 2958
	else if (IS_I830(dev_priv))
		dev_priv->display.get_cdclk = fixed_133mhz_get_cdclk;

	if (drm_WARN(&dev_priv->drm, !dev_priv->display.get_cdclk,
		     "Unknown platform. Assuming 133 MHz CDCLK\n"))
2959 2960
		dev_priv->display.get_cdclk = fixed_133mhz_get_cdclk;
}