1 /*
2  * Copyright © 2006-2016 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  */
23 
24 #include "intel_drv.h"
25 
26 /**
27  * DOC: Display PLLs
28  *
29  * Display PLLs used for driving outputs vary by platform. While some have
30  * per-pipe or per-encoder dedicated PLLs, others allow the use of any PLL
31  * from a pool. In the latter scenario, it is possible that multiple pipes
32  * share a PLL if their configurations match.
33  *
34  * This file provides an abstraction over display PLLs. The function
35  * intel_shared_dpll_init() initializes the PLLs for the given platform.  The
36  * users of a PLL are tracked and that tracking is integrated with the atomic
37  * modest interface. During an atomic operation, a PLL can be requested for a
38  * given CRTC and encoder configuration by calling intel_get_shared_dpll() and
39  * a previously used PLL can be released with intel_release_shared_dpll().
40  * Changes to the users are first staged in the atomic state, and then made
41  * effective by calling intel_shared_dpll_swap_state() during the atomic
42  * commit phase.
43  */
44 
45 static void
intel_atomic_duplicate_dpll_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll_state * shared_dpll)46 intel_atomic_duplicate_dpll_state(struct drm_i915_private *dev_priv,
47 				  struct intel_shared_dpll_state *shared_dpll)
48 {
49 	enum intel_dpll_id i;
50 
51 	/* Copy shared dpll state */
52 	for (i = 0; i < dev_priv->num_shared_dpll; i++) {
53 		struct intel_shared_dpll *pll = &dev_priv->shared_dplls[i];
54 
55 		shared_dpll[i] = pll->state;
56 	}
57 }
58 
59 static struct intel_shared_dpll_state *
intel_atomic_get_shared_dpll_state(struct drm_atomic_state * s)60 intel_atomic_get_shared_dpll_state(struct drm_atomic_state *s)
61 {
62 	struct intel_atomic_state *state = to_intel_atomic_state(s);
63 
64 	WARN_ON(!drm_modeset_is_locked(&s->dev->mode_config.connection_mutex));
65 
66 	if (!state->dpll_set) {
67 		state->dpll_set = true;
68 
69 		intel_atomic_duplicate_dpll_state(to_i915(s->dev),
70 						  state->shared_dpll);
71 	}
72 
73 	return state->shared_dpll;
74 }
75 
76 /**
77  * intel_get_shared_dpll_by_id - get a DPLL given its id
78  * @dev_priv: i915 device instance
79  * @id: pll id
80  *
81  * Returns:
82  * A pointer to the DPLL with @id
83  */
84 struct intel_shared_dpll *
intel_get_shared_dpll_by_id(struct drm_i915_private * dev_priv,enum intel_dpll_id id)85 intel_get_shared_dpll_by_id(struct drm_i915_private *dev_priv,
86 			    enum intel_dpll_id id)
87 {
88 	return &dev_priv->shared_dplls[id];
89 }
90 
91 /**
92  * intel_get_shared_dpll_id - get the id of a DPLL
93  * @dev_priv: i915 device instance
94  * @pll: the DPLL
95  *
96  * Returns:
97  * The id of @pll
98  */
99 enum intel_dpll_id
intel_get_shared_dpll_id(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)100 intel_get_shared_dpll_id(struct drm_i915_private *dev_priv,
101 			 struct intel_shared_dpll *pll)
102 {
103 	if (WARN_ON(pll < dev_priv->shared_dplls||
104 		    pll > &dev_priv->shared_dplls[dev_priv->num_shared_dpll]))
105 		return -1;
106 
107 	return (enum intel_dpll_id) (pll - dev_priv->shared_dplls);
108 }
109 
110 /* For ILK+ */
assert_shared_dpll(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,bool state)111 void assert_shared_dpll(struct drm_i915_private *dev_priv,
112 			struct intel_shared_dpll *pll,
113 			bool state)
114 {
115 	bool cur_state;
116 	struct intel_dpll_hw_state hw_state;
117 
118 	if (WARN(!pll, "asserting DPLL %s with no DPLL\n", onoff(state)))
119 		return;
120 
121 	cur_state = pll->info->funcs->get_hw_state(dev_priv, pll, &hw_state);
122 	I915_STATE_WARN(cur_state != state,
123 	     "%s assertion failure (expected %s, current %s)\n",
124 			pll->info->name, onoff(state), onoff(cur_state));
125 }
126 
127 /**
128  * intel_prepare_shared_dpll - call a dpll's prepare hook
129  * @crtc: CRTC which has a shared dpll
130  *
131  * This calls the PLL's prepare hook if it has one and if the PLL is not
132  * already enabled. The prepare hook is platform specific.
133  */
intel_prepare_shared_dpll(struct intel_crtc * crtc)134 void intel_prepare_shared_dpll(struct intel_crtc *crtc)
135 {
136 	struct drm_device *dev = crtc->base.dev;
137 	struct drm_i915_private *dev_priv = to_i915(dev);
138 	struct intel_shared_dpll *pll = crtc->config->shared_dpll;
139 
140 	if (WARN_ON(pll == NULL))
141 		return;
142 
143 	mutex_lock(&dev_priv->dpll_lock);
144 	WARN_ON(!pll->state.crtc_mask);
145 	if (!pll->active_mask) {
146 		DRM_DEBUG_DRIVER("setting up %s\n", pll->info->name);
147 		WARN_ON(pll->on);
148 		assert_shared_dpll_disabled(dev_priv, pll);
149 
150 		pll->info->funcs->prepare(dev_priv, pll);
151 	}
152 	mutex_unlock(&dev_priv->dpll_lock);
153 }
154 
155 /**
156  * intel_enable_shared_dpll - enable a CRTC's shared DPLL
157  * @crtc: CRTC which has a shared DPLL
158  *
159  * Enable the shared DPLL used by @crtc.
160  */
intel_enable_shared_dpll(struct intel_crtc * crtc)161 void intel_enable_shared_dpll(struct intel_crtc *crtc)
162 {
163 	struct drm_device *dev = crtc->base.dev;
164 	struct drm_i915_private *dev_priv = to_i915(dev);
165 	struct intel_shared_dpll *pll = crtc->config->shared_dpll;
166 	unsigned int crtc_mask = drm_crtc_mask(&crtc->base);
167 	unsigned int old_mask;
168 
169 	if (WARN_ON(pll == NULL))
170 		return;
171 
172 	mutex_lock(&dev_priv->dpll_lock);
173 	old_mask = pll->active_mask;
174 
175 	if (WARN_ON(!(pll->state.crtc_mask & crtc_mask)) ||
176 	    WARN_ON(pll->active_mask & crtc_mask))
177 		goto out;
178 
179 	pll->active_mask |= crtc_mask;
180 
181 	DRM_DEBUG_KMS("enable %s (active %x, on? %d) for crtc %d\n",
182 		      pll->info->name, pll->active_mask, pll->on,
183 		      crtc->base.base.id);
184 
185 	if (old_mask) {
186 		WARN_ON(!pll->on);
187 		assert_shared_dpll_enabled(dev_priv, pll);
188 		goto out;
189 	}
190 	WARN_ON(pll->on);
191 
192 	DRM_DEBUG_KMS("enabling %s\n", pll->info->name);
193 	pll->info->funcs->enable(dev_priv, pll);
194 	pll->on = true;
195 
196 out:
197 	mutex_unlock(&dev_priv->dpll_lock);
198 }
199 
200 /**
201  * intel_disable_shared_dpll - disable a CRTC's shared DPLL
202  * @crtc: CRTC which has a shared DPLL
203  *
204  * Disable the shared DPLL used by @crtc.
205  */
intel_disable_shared_dpll(struct intel_crtc * crtc)206 void intel_disable_shared_dpll(struct intel_crtc *crtc)
207 {
208 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
209 	struct intel_shared_dpll *pll = crtc->config->shared_dpll;
210 	unsigned int crtc_mask = drm_crtc_mask(&crtc->base);
211 
212 	/* PCH only available on ILK+ */
213 	if (INTEL_GEN(dev_priv) < 5)
214 		return;
215 
216 	if (pll == NULL)
217 		return;
218 
219 	mutex_lock(&dev_priv->dpll_lock);
220 	if (WARN_ON(!(pll->active_mask & crtc_mask)))
221 		goto out;
222 
223 	DRM_DEBUG_KMS("disable %s (active %x, on? %d) for crtc %d\n",
224 		      pll->info->name, pll->active_mask, pll->on,
225 		      crtc->base.base.id);
226 
227 	assert_shared_dpll_enabled(dev_priv, pll);
228 	WARN_ON(!pll->on);
229 
230 	pll->active_mask &= ~crtc_mask;
231 	if (pll->active_mask)
232 		goto out;
233 
234 	DRM_DEBUG_KMS("disabling %s\n", pll->info->name);
235 	pll->info->funcs->disable(dev_priv, pll);
236 	pll->on = false;
237 
238 out:
239 	mutex_unlock(&dev_priv->dpll_lock);
240 }
241 
242 static struct intel_shared_dpll *
intel_find_shared_dpll(struct intel_crtc * crtc,struct intel_crtc_state * crtc_state,enum intel_dpll_id range_min,enum intel_dpll_id range_max)243 intel_find_shared_dpll(struct intel_crtc *crtc,
244 		       struct intel_crtc_state *crtc_state,
245 		       enum intel_dpll_id range_min,
246 		       enum intel_dpll_id range_max)
247 {
248 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
249 	struct intel_shared_dpll *pll;
250 	struct intel_shared_dpll_state *shared_dpll;
251 	enum intel_dpll_id i;
252 
253 	shared_dpll = intel_atomic_get_shared_dpll_state(crtc_state->base.state);
254 
255 	for (i = range_min; i <= range_max; i++) {
256 		pll = &dev_priv->shared_dplls[i];
257 
258 		/* Only want to check enabled timings first */
259 		if (shared_dpll[i].crtc_mask == 0)
260 			continue;
261 
262 		if (memcmp(&crtc_state->dpll_hw_state,
263 			   &shared_dpll[i].hw_state,
264 			   sizeof(crtc_state->dpll_hw_state)) == 0) {
265 			DRM_DEBUG_KMS("[CRTC:%d:%s] sharing existing %s (crtc mask 0x%08x, active %x)\n",
266 				      crtc->base.base.id, crtc->base.name,
267 				      pll->info->name,
268 				      shared_dpll[i].crtc_mask,
269 				      pll->active_mask);
270 			return pll;
271 		}
272 	}
273 
274 	/* Ok no matching timings, maybe there's a free one? */
275 	for (i = range_min; i <= range_max; i++) {
276 		pll = &dev_priv->shared_dplls[i];
277 		if (shared_dpll[i].crtc_mask == 0) {
278 			DRM_DEBUG_KMS("[CRTC:%d:%s] allocated %s\n",
279 				      crtc->base.base.id, crtc->base.name,
280 				      pll->info->name);
281 			return pll;
282 		}
283 	}
284 
285 	return NULL;
286 }
287 
288 static void
intel_reference_shared_dpll(struct intel_shared_dpll * pll,struct intel_crtc_state * crtc_state)289 intel_reference_shared_dpll(struct intel_shared_dpll *pll,
290 			    struct intel_crtc_state *crtc_state)
291 {
292 	struct intel_shared_dpll_state *shared_dpll;
293 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
294 	const enum intel_dpll_id id = pll->info->id;
295 
296 	shared_dpll = intel_atomic_get_shared_dpll_state(crtc_state->base.state);
297 
298 	if (shared_dpll[id].crtc_mask == 0)
299 		shared_dpll[id].hw_state =
300 			crtc_state->dpll_hw_state;
301 
302 	crtc_state->shared_dpll = pll;
303 	DRM_DEBUG_DRIVER("using %s for pipe %c\n", pll->info->name,
304 			 pipe_name(crtc->pipe));
305 
306 	shared_dpll[id].crtc_mask |= 1 << crtc->pipe;
307 }
308 
309 /**
310  * intel_shared_dpll_swap_state - make atomic DPLL configuration effective
311  * @state: atomic state
312  *
313  * This is the dpll version of drm_atomic_helper_swap_state() since the
314  * helper does not handle driver-specific global state.
315  *
316  * For consistency with atomic helpers this function does a complete swap,
317  * i.e. it also puts the current state into @state, even though there is no
318  * need for that at this moment.
319  */
intel_shared_dpll_swap_state(struct drm_atomic_state * state)320 void intel_shared_dpll_swap_state(struct drm_atomic_state *state)
321 {
322 	struct drm_i915_private *dev_priv = to_i915(state->dev);
323 	struct intel_shared_dpll_state *shared_dpll;
324 	struct intel_shared_dpll *pll;
325 	enum intel_dpll_id i;
326 
327 	if (!to_intel_atomic_state(state)->dpll_set)
328 		return;
329 
330 	shared_dpll = to_intel_atomic_state(state)->shared_dpll;
331 	for (i = 0; i < dev_priv->num_shared_dpll; i++) {
332 		struct intel_shared_dpll_state tmp;
333 
334 		pll = &dev_priv->shared_dplls[i];
335 
336 		tmp = pll->state;
337 		pll->state = shared_dpll[i];
338 		shared_dpll[i] = tmp;
339 	}
340 }
341 
ibx_pch_dpll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)342 static bool ibx_pch_dpll_get_hw_state(struct drm_i915_private *dev_priv,
343 				      struct intel_shared_dpll *pll,
344 				      struct intel_dpll_hw_state *hw_state)
345 {
346 	const enum intel_dpll_id id = pll->info->id;
347 	uint32_t val;
348 
349 	if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
350 		return false;
351 
352 	val = I915_READ(PCH_DPLL(id));
353 	hw_state->dpll = val;
354 	hw_state->fp0 = I915_READ(PCH_FP0(id));
355 	hw_state->fp1 = I915_READ(PCH_FP1(id));
356 
357 	intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
358 
359 	return val & DPLL_VCO_ENABLE;
360 }
361 
ibx_pch_dpll_prepare(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)362 static void ibx_pch_dpll_prepare(struct drm_i915_private *dev_priv,
363 				 struct intel_shared_dpll *pll)
364 {
365 	const enum intel_dpll_id id = pll->info->id;
366 
367 	I915_WRITE(PCH_FP0(id), pll->state.hw_state.fp0);
368 	I915_WRITE(PCH_FP1(id), pll->state.hw_state.fp1);
369 }
370 
ibx_assert_pch_refclk_enabled(struct drm_i915_private * dev_priv)371 static void ibx_assert_pch_refclk_enabled(struct drm_i915_private *dev_priv)
372 {
373 	u32 val;
374 	bool enabled;
375 
376 	I915_STATE_WARN_ON(!(HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv)));
377 
378 	val = I915_READ(PCH_DREF_CONTROL);
379 	enabled = !!(val & (DREF_SSC_SOURCE_MASK | DREF_NONSPREAD_SOURCE_MASK |
380 			    DREF_SUPERSPREAD_SOURCE_MASK));
381 	I915_STATE_WARN(!enabled, "PCH refclk assertion failure, should be active but is disabled\n");
382 }
383 
ibx_pch_dpll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)384 static void ibx_pch_dpll_enable(struct drm_i915_private *dev_priv,
385 				struct intel_shared_dpll *pll)
386 {
387 	const enum intel_dpll_id id = pll->info->id;
388 
389 	/* PCH refclock must be enabled first */
390 	ibx_assert_pch_refclk_enabled(dev_priv);
391 
392 	I915_WRITE(PCH_DPLL(id), pll->state.hw_state.dpll);
393 
394 	/* Wait for the clocks to stabilize. */
395 	POSTING_READ(PCH_DPLL(id));
396 	udelay(150);
397 
398 	/* The pixel multiplier can only be updated once the
399 	 * DPLL is enabled and the clocks are stable.
400 	 *
401 	 * So write it again.
402 	 */
403 	I915_WRITE(PCH_DPLL(id), pll->state.hw_state.dpll);
404 	POSTING_READ(PCH_DPLL(id));
405 	udelay(200);
406 }
407 
ibx_pch_dpll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)408 static void ibx_pch_dpll_disable(struct drm_i915_private *dev_priv,
409 				 struct intel_shared_dpll *pll)
410 {
411 	const enum intel_dpll_id id = pll->info->id;
412 	struct drm_device *dev = &dev_priv->drm;
413 	struct intel_crtc *crtc;
414 
415 	/* Make sure no transcoder isn't still depending on us. */
416 	for_each_intel_crtc(dev, crtc) {
417 		if (crtc->config->shared_dpll == pll)
418 			assert_pch_transcoder_disabled(dev_priv, crtc->pipe);
419 	}
420 
421 	I915_WRITE(PCH_DPLL(id), 0);
422 	POSTING_READ(PCH_DPLL(id));
423 	udelay(200);
424 }
425 
426 static struct intel_shared_dpll *
ibx_get_dpll(struct intel_crtc * crtc,struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)427 ibx_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
428 	     struct intel_encoder *encoder)
429 {
430 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
431 	struct intel_shared_dpll *pll;
432 	enum intel_dpll_id i;
433 
434 	if (HAS_PCH_IBX(dev_priv)) {
435 		/* Ironlake PCH has a fixed PLL->PCH pipe mapping. */
436 		i = (enum intel_dpll_id) crtc->pipe;
437 		pll = &dev_priv->shared_dplls[i];
438 
439 		DRM_DEBUG_KMS("[CRTC:%d:%s] using pre-allocated %s\n",
440 			      crtc->base.base.id, crtc->base.name,
441 			      pll->info->name);
442 	} else {
443 		pll = intel_find_shared_dpll(crtc, crtc_state,
444 					     DPLL_ID_PCH_PLL_A,
445 					     DPLL_ID_PCH_PLL_B);
446 	}
447 
448 	if (!pll)
449 		return NULL;
450 
451 	/* reference the pll */
452 	intel_reference_shared_dpll(pll, crtc_state);
453 
454 	return pll;
455 }
456 
ibx_dump_hw_state(struct drm_i915_private * dev_priv,struct intel_dpll_hw_state * hw_state)457 static void ibx_dump_hw_state(struct drm_i915_private *dev_priv,
458 			      struct intel_dpll_hw_state *hw_state)
459 {
460 	DRM_DEBUG_KMS("dpll_hw_state: dpll: 0x%x, dpll_md: 0x%x, "
461 		      "fp0: 0x%x, fp1: 0x%x\n",
462 		      hw_state->dpll,
463 		      hw_state->dpll_md,
464 		      hw_state->fp0,
465 		      hw_state->fp1);
466 }
467 
468 static const struct intel_shared_dpll_funcs ibx_pch_dpll_funcs = {
469 	.prepare = ibx_pch_dpll_prepare,
470 	.enable = ibx_pch_dpll_enable,
471 	.disable = ibx_pch_dpll_disable,
472 	.get_hw_state = ibx_pch_dpll_get_hw_state,
473 };
474 
hsw_ddi_wrpll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)475 static void hsw_ddi_wrpll_enable(struct drm_i915_private *dev_priv,
476 			       struct intel_shared_dpll *pll)
477 {
478 	const enum intel_dpll_id id = pll->info->id;
479 
480 	I915_WRITE(WRPLL_CTL(id), pll->state.hw_state.wrpll);
481 	POSTING_READ(WRPLL_CTL(id));
482 	udelay(20);
483 }
484 
hsw_ddi_spll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)485 static void hsw_ddi_spll_enable(struct drm_i915_private *dev_priv,
486 				struct intel_shared_dpll *pll)
487 {
488 	I915_WRITE(SPLL_CTL, pll->state.hw_state.spll);
489 	POSTING_READ(SPLL_CTL);
490 	udelay(20);
491 }
492 
hsw_ddi_wrpll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)493 static void hsw_ddi_wrpll_disable(struct drm_i915_private *dev_priv,
494 				  struct intel_shared_dpll *pll)
495 {
496 	const enum intel_dpll_id id = pll->info->id;
497 	uint32_t val;
498 
499 	val = I915_READ(WRPLL_CTL(id));
500 	I915_WRITE(WRPLL_CTL(id), val & ~WRPLL_PLL_ENABLE);
501 	POSTING_READ(WRPLL_CTL(id));
502 }
503 
hsw_ddi_spll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)504 static void hsw_ddi_spll_disable(struct drm_i915_private *dev_priv,
505 				 struct intel_shared_dpll *pll)
506 {
507 	uint32_t val;
508 
509 	val = I915_READ(SPLL_CTL);
510 	I915_WRITE(SPLL_CTL, val & ~SPLL_PLL_ENABLE);
511 	POSTING_READ(SPLL_CTL);
512 }
513 
hsw_ddi_wrpll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)514 static bool hsw_ddi_wrpll_get_hw_state(struct drm_i915_private *dev_priv,
515 				       struct intel_shared_dpll *pll,
516 				       struct intel_dpll_hw_state *hw_state)
517 {
518 	const enum intel_dpll_id id = pll->info->id;
519 	uint32_t val;
520 
521 	if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
522 		return false;
523 
524 	val = I915_READ(WRPLL_CTL(id));
525 	hw_state->wrpll = val;
526 
527 	intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
528 
529 	return val & WRPLL_PLL_ENABLE;
530 }
531 
hsw_ddi_spll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)532 static bool hsw_ddi_spll_get_hw_state(struct drm_i915_private *dev_priv,
533 				      struct intel_shared_dpll *pll,
534 				      struct intel_dpll_hw_state *hw_state)
535 {
536 	uint32_t val;
537 
538 	if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
539 		return false;
540 
541 	val = I915_READ(SPLL_CTL);
542 	hw_state->spll = val;
543 
544 	intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
545 
546 	return val & SPLL_PLL_ENABLE;
547 }
548 
549 #define LC_FREQ 2700
550 #define LC_FREQ_2K U64_C(LC_FREQ * 2000)
551 
552 #define P_MIN 2
553 #define P_MAX 64
554 #define P_INC 2
555 
556 /* Constraints for PLL good behavior */
557 #define REF_MIN 48
558 #define REF_MAX 400
559 #define VCO_MIN 2400
560 #define VCO_MAX 4800
561 
562 struct hsw_wrpll_rnp {
563 	unsigned p, n2, r2;
564 };
565 
hsw_wrpll_get_budget_for_freq(int clock)566 static unsigned hsw_wrpll_get_budget_for_freq(int clock)
567 {
568 	unsigned budget;
569 
570 	switch (clock) {
571 	case 25175000:
572 	case 25200000:
573 	case 27000000:
574 	case 27027000:
575 	case 37762500:
576 	case 37800000:
577 	case 40500000:
578 	case 40541000:
579 	case 54000000:
580 	case 54054000:
581 	case 59341000:
582 	case 59400000:
583 	case 72000000:
584 	case 74176000:
585 	case 74250000:
586 	case 81000000:
587 	case 81081000:
588 	case 89012000:
589 	case 89100000:
590 	case 108000000:
591 	case 108108000:
592 	case 111264000:
593 	case 111375000:
594 	case 148352000:
595 	case 148500000:
596 	case 162000000:
597 	case 162162000:
598 	case 222525000:
599 	case 222750000:
600 	case 296703000:
601 	case 297000000:
602 		budget = 0;
603 		break;
604 	case 233500000:
605 	case 245250000:
606 	case 247750000:
607 	case 253250000:
608 	case 298000000:
609 		budget = 1500;
610 		break;
611 	case 169128000:
612 	case 169500000:
613 	case 179500000:
614 	case 202000000:
615 		budget = 2000;
616 		break;
617 	case 256250000:
618 	case 262500000:
619 	case 270000000:
620 	case 272500000:
621 	case 273750000:
622 	case 280750000:
623 	case 281250000:
624 	case 286000000:
625 	case 291750000:
626 		budget = 4000;
627 		break;
628 	case 267250000:
629 	case 268500000:
630 		budget = 5000;
631 		break;
632 	default:
633 		budget = 1000;
634 		break;
635 	}
636 
637 	return budget;
638 }
639 
hsw_wrpll_update_rnp(uint64_t freq2k,unsigned budget,unsigned r2,unsigned n2,unsigned p,struct hsw_wrpll_rnp * best)640 static void hsw_wrpll_update_rnp(uint64_t freq2k, unsigned budget,
641 				 unsigned r2, unsigned n2, unsigned p,
642 				 struct hsw_wrpll_rnp *best)
643 {
644 	uint64_t a, b, c, d, diff, diff_best;
645 
646 	/* No best (r,n,p) yet */
647 	if (best->p == 0) {
648 		best->p = p;
649 		best->n2 = n2;
650 		best->r2 = r2;
651 		return;
652 	}
653 
654 	/*
655 	 * Output clock is (LC_FREQ_2K / 2000) * N / (P * R), which compares to
656 	 * freq2k.
657 	 *
658 	 * delta = 1e6 *
659 	 *	   abs(freq2k - (LC_FREQ_2K * n2/(p * r2))) /
660 	 *	   freq2k;
661 	 *
662 	 * and we would like delta <= budget.
663 	 *
664 	 * If the discrepancy is above the PPM-based budget, always prefer to
665 	 * improve upon the previous solution.  However, if you're within the
666 	 * budget, try to maximize Ref * VCO, that is N / (P * R^2).
667 	 */
668 	a = freq2k * budget * p * r2;
669 	b = freq2k * budget * best->p * best->r2;
670 	diff = abs_diff(freq2k * p * r2, LC_FREQ_2K * n2);
671 	diff_best = abs_diff(freq2k * best->p * best->r2,
672 			     LC_FREQ_2K * best->n2);
673 	c = 1000000 * diff;
674 	d = 1000000 * diff_best;
675 
676 	if (a < c && b < d) {
677 		/* If both are above the budget, pick the closer */
678 		if (best->p * best->r2 * diff < p * r2 * diff_best) {
679 			best->p = p;
680 			best->n2 = n2;
681 			best->r2 = r2;
682 		}
683 	} else if (a >= c && b < d) {
684 		/* If A is below the threshold but B is above it?  Update. */
685 		best->p = p;
686 		best->n2 = n2;
687 		best->r2 = r2;
688 	} else if (a >= c && b >= d) {
689 		/* Both are below the limit, so pick the higher n2/(r2*r2) */
690 		if (n2 * best->r2 * best->r2 > best->n2 * r2 * r2) {
691 			best->p = p;
692 			best->n2 = n2;
693 			best->r2 = r2;
694 		}
695 	}
696 	/* Otherwise a < c && b >= d, do nothing */
697 }
698 
699 static void
hsw_ddi_calculate_wrpll(int clock,unsigned * r2_out,unsigned * n2_out,unsigned * p_out)700 hsw_ddi_calculate_wrpll(int clock /* in Hz */,
701 			unsigned *r2_out, unsigned *n2_out, unsigned *p_out)
702 {
703 	uint64_t freq2k;
704 	unsigned p, n2, r2;
705 	struct hsw_wrpll_rnp best = { 0, 0, 0 };
706 	unsigned budget;
707 
708 	freq2k = clock / 100;
709 
710 	budget = hsw_wrpll_get_budget_for_freq(clock);
711 
712 	/* Special case handling for 540 pixel clock: bypass WR PLL entirely
713 	 * and directly pass the LC PLL to it. */
714 	if (freq2k == 5400000) {
715 		*n2_out = 2;
716 		*p_out = 1;
717 		*r2_out = 2;
718 		return;
719 	}
720 
721 	/*
722 	 * Ref = LC_FREQ / R, where Ref is the actual reference input seen by
723 	 * the WR PLL.
724 	 *
725 	 * We want R so that REF_MIN <= Ref <= REF_MAX.
726 	 * Injecting R2 = 2 * R gives:
727 	 *   REF_MAX * r2 > LC_FREQ * 2 and
728 	 *   REF_MIN * r2 < LC_FREQ * 2
729 	 *
730 	 * Which means the desired boundaries for r2 are:
731 	 *  LC_FREQ * 2 / REF_MAX < r2 < LC_FREQ * 2 / REF_MIN
732 	 *
733 	 */
734 	for (r2 = LC_FREQ * 2 / REF_MAX + 1;
735 	     r2 <= LC_FREQ * 2 / REF_MIN;
736 	     r2++) {
737 
738 		/*
739 		 * VCO = N * Ref, that is: VCO = N * LC_FREQ / R
740 		 *
741 		 * Once again we want VCO_MIN <= VCO <= VCO_MAX.
742 		 * Injecting R2 = 2 * R and N2 = 2 * N, we get:
743 		 *   VCO_MAX * r2 > n2 * LC_FREQ and
744 		 *   VCO_MIN * r2 < n2 * LC_FREQ)
745 		 *
746 		 * Which means the desired boundaries for n2 are:
747 		 * VCO_MIN * r2 / LC_FREQ < n2 < VCO_MAX * r2 / LC_FREQ
748 		 */
749 		for (n2 = VCO_MIN * r2 / LC_FREQ + 1;
750 		     n2 <= VCO_MAX * r2 / LC_FREQ;
751 		     n2++) {
752 
753 			for (p = P_MIN; p <= P_MAX; p += P_INC)
754 				hsw_wrpll_update_rnp(freq2k, budget,
755 						     r2, n2, p, &best);
756 		}
757 	}
758 
759 	*n2_out = best.n2;
760 	*p_out = best.p;
761 	*r2_out = best.r2;
762 }
763 
hsw_ddi_hdmi_get_dpll(int clock,struct intel_crtc * crtc,struct intel_crtc_state * crtc_state)764 static struct intel_shared_dpll *hsw_ddi_hdmi_get_dpll(int clock,
765 						       struct intel_crtc *crtc,
766 						       struct intel_crtc_state *crtc_state)
767 {
768 	struct intel_shared_dpll *pll;
769 	uint32_t val;
770 	unsigned int p, n2, r2;
771 
772 	hsw_ddi_calculate_wrpll(clock * 1000, &r2, &n2, &p);
773 
774 	val = WRPLL_PLL_ENABLE | WRPLL_PLL_LCPLL |
775 	      WRPLL_DIVIDER_REFERENCE(r2) | WRPLL_DIVIDER_FEEDBACK(n2) |
776 	      WRPLL_DIVIDER_POST(p);
777 
778 	crtc_state->dpll_hw_state.wrpll = val;
779 
780 	pll = intel_find_shared_dpll(crtc, crtc_state,
781 				     DPLL_ID_WRPLL1, DPLL_ID_WRPLL2);
782 
783 	if (!pll)
784 		return NULL;
785 
786 	return pll;
787 }
788 
789 static struct intel_shared_dpll *
hsw_ddi_dp_get_dpll(struct intel_encoder * encoder,int clock)790 hsw_ddi_dp_get_dpll(struct intel_encoder *encoder, int clock)
791 {
792 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
793 	struct intel_shared_dpll *pll;
794 	enum intel_dpll_id pll_id;
795 
796 	switch (clock / 2) {
797 	case 81000:
798 		pll_id = DPLL_ID_LCPLL_810;
799 		break;
800 	case 135000:
801 		pll_id = DPLL_ID_LCPLL_1350;
802 		break;
803 	case 270000:
804 		pll_id = DPLL_ID_LCPLL_2700;
805 		break;
806 	default:
807 		DRM_DEBUG_KMS("Invalid clock for DP: %d\n", clock);
808 		return NULL;
809 	}
810 
811 	pll = intel_get_shared_dpll_by_id(dev_priv, pll_id);
812 
813 	if (!pll)
814 		return NULL;
815 
816 	return pll;
817 }
818 
819 static struct intel_shared_dpll *
hsw_get_dpll(struct intel_crtc * crtc,struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)820 hsw_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
821 	     struct intel_encoder *encoder)
822 {
823 	struct intel_shared_dpll *pll;
824 	int clock = crtc_state->port_clock;
825 
826 	memset(&crtc_state->dpll_hw_state, 0,
827 	       sizeof(crtc_state->dpll_hw_state));
828 
829 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
830 		pll = hsw_ddi_hdmi_get_dpll(clock, crtc, crtc_state);
831 	} else if (intel_crtc_has_dp_encoder(crtc_state)) {
832 		pll = hsw_ddi_dp_get_dpll(encoder, clock);
833 	} else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_ANALOG)) {
834 		if (WARN_ON(crtc_state->port_clock / 2 != 135000))
835 			return NULL;
836 
837 		crtc_state->dpll_hw_state.spll =
838 			SPLL_PLL_ENABLE | SPLL_PLL_FREQ_1350MHz | SPLL_PLL_SSC;
839 
840 		pll = intel_find_shared_dpll(crtc, crtc_state,
841 					     DPLL_ID_SPLL, DPLL_ID_SPLL);
842 	} else {
843 		return NULL;
844 	}
845 
846 	if (!pll)
847 		return NULL;
848 
849 	intel_reference_shared_dpll(pll, crtc_state);
850 
851 	return pll;
852 }
853 
hsw_dump_hw_state(struct drm_i915_private * dev_priv,struct intel_dpll_hw_state * hw_state)854 static void hsw_dump_hw_state(struct drm_i915_private *dev_priv,
855 			      struct intel_dpll_hw_state *hw_state)
856 {
857 	DRM_DEBUG_KMS("dpll_hw_state: wrpll: 0x%x spll: 0x%x\n",
858 		      hw_state->wrpll, hw_state->spll);
859 }
860 
861 static const struct intel_shared_dpll_funcs hsw_ddi_wrpll_funcs = {
862 	.enable = hsw_ddi_wrpll_enable,
863 	.disable = hsw_ddi_wrpll_disable,
864 	.get_hw_state = hsw_ddi_wrpll_get_hw_state,
865 };
866 
867 static const struct intel_shared_dpll_funcs hsw_ddi_spll_funcs = {
868 	.enable = hsw_ddi_spll_enable,
869 	.disable = hsw_ddi_spll_disable,
870 	.get_hw_state = hsw_ddi_spll_get_hw_state,
871 };
872 
hsw_ddi_lcpll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)873 static void hsw_ddi_lcpll_enable(struct drm_i915_private *dev_priv,
874 				 struct intel_shared_dpll *pll)
875 {
876 }
877 
hsw_ddi_lcpll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)878 static void hsw_ddi_lcpll_disable(struct drm_i915_private *dev_priv,
879 				  struct intel_shared_dpll *pll)
880 {
881 }
882 
hsw_ddi_lcpll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)883 static bool hsw_ddi_lcpll_get_hw_state(struct drm_i915_private *dev_priv,
884 				       struct intel_shared_dpll *pll,
885 				       struct intel_dpll_hw_state *hw_state)
886 {
887 	return true;
888 }
889 
890 static const struct intel_shared_dpll_funcs hsw_ddi_lcpll_funcs = {
891 	.enable = hsw_ddi_lcpll_enable,
892 	.disable = hsw_ddi_lcpll_disable,
893 	.get_hw_state = hsw_ddi_lcpll_get_hw_state,
894 };
895 
896 struct skl_dpll_regs {
897 	i915_reg_t ctl, cfgcr1, cfgcr2;
898 };
899 
900 /* this array is indexed by the *shared* pll id */
901 static const struct skl_dpll_regs skl_dpll_regs[4] = {
902 	{
903 		/* DPLL 0 */
904 		.ctl = LCPLL1_CTL,
905 		/* DPLL 0 doesn't support HDMI mode */
906 	},
907 	{
908 		/* DPLL 1 */
909 		.ctl = LCPLL2_CTL,
910 		.cfgcr1 = DPLL_CFGCR1(SKL_DPLL1),
911 		.cfgcr2 = DPLL_CFGCR2(SKL_DPLL1),
912 	},
913 	{
914 		/* DPLL 2 */
915 		.ctl = WRPLL_CTL(0),
916 		.cfgcr1 = DPLL_CFGCR1(SKL_DPLL2),
917 		.cfgcr2 = DPLL_CFGCR2(SKL_DPLL2),
918 	},
919 	{
920 		/* DPLL 3 */
921 		.ctl = WRPLL_CTL(1),
922 		.cfgcr1 = DPLL_CFGCR1(SKL_DPLL3),
923 		.cfgcr2 = DPLL_CFGCR2(SKL_DPLL3),
924 	},
925 };
926 
skl_ddi_pll_write_ctrl1(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)927 static void skl_ddi_pll_write_ctrl1(struct drm_i915_private *dev_priv,
928 				    struct intel_shared_dpll *pll)
929 {
930 	const enum intel_dpll_id id = pll->info->id;
931 	uint32_t val;
932 
933 	val = I915_READ(DPLL_CTRL1);
934 
935 	val &= ~(DPLL_CTRL1_HDMI_MODE(id) |
936 		 DPLL_CTRL1_SSC(id) |
937 		 DPLL_CTRL1_LINK_RATE_MASK(id));
938 	val |= pll->state.hw_state.ctrl1 << (id * 6);
939 
940 	I915_WRITE(DPLL_CTRL1, val);
941 	POSTING_READ(DPLL_CTRL1);
942 }
943 
skl_ddi_pll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)944 static void skl_ddi_pll_enable(struct drm_i915_private *dev_priv,
945 			       struct intel_shared_dpll *pll)
946 {
947 	const struct skl_dpll_regs *regs = skl_dpll_regs;
948 	const enum intel_dpll_id id = pll->info->id;
949 
950 	skl_ddi_pll_write_ctrl1(dev_priv, pll);
951 
952 	I915_WRITE(regs[id].cfgcr1, pll->state.hw_state.cfgcr1);
953 	I915_WRITE(regs[id].cfgcr2, pll->state.hw_state.cfgcr2);
954 	POSTING_READ(regs[id].cfgcr1);
955 	POSTING_READ(regs[id].cfgcr2);
956 
957 	/* the enable bit is always bit 31 */
958 	I915_WRITE(regs[id].ctl,
959 		   I915_READ(regs[id].ctl) | LCPLL_PLL_ENABLE);
960 
961 	if (intel_wait_for_register(dev_priv,
962 				    DPLL_STATUS,
963 				    DPLL_LOCK(id),
964 				    DPLL_LOCK(id),
965 				    5))
966 		DRM_ERROR("DPLL %d not locked\n", id);
967 }
968 
skl_ddi_dpll0_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)969 static void skl_ddi_dpll0_enable(struct drm_i915_private *dev_priv,
970 				 struct intel_shared_dpll *pll)
971 {
972 	skl_ddi_pll_write_ctrl1(dev_priv, pll);
973 }
974 
skl_ddi_pll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)975 static void skl_ddi_pll_disable(struct drm_i915_private *dev_priv,
976 				struct intel_shared_dpll *pll)
977 {
978 	const struct skl_dpll_regs *regs = skl_dpll_regs;
979 	const enum intel_dpll_id id = pll->info->id;
980 
981 	/* the enable bit is always bit 31 */
982 	I915_WRITE(regs[id].ctl,
983 		   I915_READ(regs[id].ctl) & ~LCPLL_PLL_ENABLE);
984 	POSTING_READ(regs[id].ctl);
985 }
986 
skl_ddi_dpll0_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)987 static void skl_ddi_dpll0_disable(struct drm_i915_private *dev_priv,
988 				  struct intel_shared_dpll *pll)
989 {
990 }
991 
skl_ddi_pll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)992 static bool skl_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
993 				     struct intel_shared_dpll *pll,
994 				     struct intel_dpll_hw_state *hw_state)
995 {
996 	uint32_t val;
997 	const struct skl_dpll_regs *regs = skl_dpll_regs;
998 	const enum intel_dpll_id id = pll->info->id;
999 	bool ret;
1000 
1001 	if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
1002 		return false;
1003 
1004 	ret = false;
1005 
1006 	val = I915_READ(regs[id].ctl);
1007 	if (!(val & LCPLL_PLL_ENABLE))
1008 		goto out;
1009 
1010 	val = I915_READ(DPLL_CTRL1);
1011 	hw_state->ctrl1 = (val >> (id * 6)) & 0x3f;
1012 
1013 	/* avoid reading back stale values if HDMI mode is not enabled */
1014 	if (val & DPLL_CTRL1_HDMI_MODE(id)) {
1015 		hw_state->cfgcr1 = I915_READ(regs[id].cfgcr1);
1016 		hw_state->cfgcr2 = I915_READ(regs[id].cfgcr2);
1017 	}
1018 	ret = true;
1019 
1020 out:
1021 	intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
1022 
1023 	return ret;
1024 }
1025 
skl_ddi_dpll0_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)1026 static bool skl_ddi_dpll0_get_hw_state(struct drm_i915_private *dev_priv,
1027 				       struct intel_shared_dpll *pll,
1028 				       struct intel_dpll_hw_state *hw_state)
1029 {
1030 	uint32_t val;
1031 	const struct skl_dpll_regs *regs = skl_dpll_regs;
1032 	const enum intel_dpll_id id = pll->info->id;
1033 	bool ret;
1034 
1035 	if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
1036 		return false;
1037 
1038 	ret = false;
1039 
1040 	/* DPLL0 is always enabled since it drives CDCLK */
1041 	val = I915_READ(regs[id].ctl);
1042 	if (WARN_ON(!(val & LCPLL_PLL_ENABLE)))
1043 		goto out;
1044 
1045 	val = I915_READ(DPLL_CTRL1);
1046 	hw_state->ctrl1 = (val >> (id * 6)) & 0x3f;
1047 
1048 	ret = true;
1049 
1050 out:
1051 	intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
1052 
1053 	return ret;
1054 }
1055 
1056 struct skl_wrpll_context {
1057 	uint64_t min_deviation;		/* current minimal deviation */
1058 	uint64_t central_freq;		/* chosen central freq */
1059 	uint64_t dco_freq;		/* chosen dco freq */
1060 	unsigned int p;			/* chosen divider */
1061 };
1062 
skl_wrpll_context_init(struct skl_wrpll_context * ctx)1063 static void skl_wrpll_context_init(struct skl_wrpll_context *ctx)
1064 {
1065 	memset(ctx, 0, sizeof(*ctx));
1066 
1067 	ctx->min_deviation = U64_MAX;
1068 }
1069 
1070 /* DCO freq must be within +1%/-6%  of the DCO central freq */
1071 #define SKL_DCO_MAX_PDEVIATION	100
1072 #define SKL_DCO_MAX_NDEVIATION	600
1073 
skl_wrpll_try_divider(struct skl_wrpll_context * ctx,uint64_t central_freq,uint64_t dco_freq,unsigned int divider)1074 static void skl_wrpll_try_divider(struct skl_wrpll_context *ctx,
1075 				  uint64_t central_freq,
1076 				  uint64_t dco_freq,
1077 				  unsigned int divider)
1078 {
1079 	uint64_t deviation;
1080 
1081 	deviation = div64_u64(10000 * abs_diff(dco_freq, central_freq),
1082 			      central_freq);
1083 
1084 	/* positive deviation */
1085 	if (dco_freq >= central_freq) {
1086 		if (deviation < SKL_DCO_MAX_PDEVIATION &&
1087 		    deviation < ctx->min_deviation) {
1088 			ctx->min_deviation = deviation;
1089 			ctx->central_freq = central_freq;
1090 			ctx->dco_freq = dco_freq;
1091 			ctx->p = divider;
1092 		}
1093 	/* negative deviation */
1094 	} else if (deviation < SKL_DCO_MAX_NDEVIATION &&
1095 		   deviation < ctx->min_deviation) {
1096 		ctx->min_deviation = deviation;
1097 		ctx->central_freq = central_freq;
1098 		ctx->dco_freq = dco_freq;
1099 		ctx->p = divider;
1100 	}
1101 }
1102 
skl_wrpll_get_multipliers(unsigned int p,unsigned int * p0,unsigned int * p1,unsigned int * p2)1103 static void skl_wrpll_get_multipliers(unsigned int p,
1104 				      unsigned int *p0 /* out */,
1105 				      unsigned int *p1 /* out */,
1106 				      unsigned int *p2 /* out */)
1107 {
1108 	/* even dividers */
1109 	if (p % 2 == 0) {
1110 		unsigned int half = p / 2;
1111 
1112 		if (half == 1 || half == 2 || half == 3 || half == 5) {
1113 			*p0 = 2;
1114 			*p1 = 1;
1115 			*p2 = half;
1116 		} else if (half % 2 == 0) {
1117 			*p0 = 2;
1118 			*p1 = half / 2;
1119 			*p2 = 2;
1120 		} else if (half % 3 == 0) {
1121 			*p0 = 3;
1122 			*p1 = half / 3;
1123 			*p2 = 2;
1124 		} else if (half % 7 == 0) {
1125 			*p0 = 7;
1126 			*p1 = half / 7;
1127 			*p2 = 2;
1128 		}
1129 	} else if (p == 3 || p == 9) {  /* 3, 5, 7, 9, 15, 21, 35 */
1130 		*p0 = 3;
1131 		*p1 = 1;
1132 		*p2 = p / 3;
1133 	} else if (p == 5 || p == 7) {
1134 		*p0 = p;
1135 		*p1 = 1;
1136 		*p2 = 1;
1137 	} else if (p == 15) {
1138 		*p0 = 3;
1139 		*p1 = 1;
1140 		*p2 = 5;
1141 	} else if (p == 21) {
1142 		*p0 = 7;
1143 		*p1 = 1;
1144 		*p2 = 3;
1145 	} else if (p == 35) {
1146 		*p0 = 7;
1147 		*p1 = 1;
1148 		*p2 = 5;
1149 	}
1150 }
1151 
1152 struct skl_wrpll_params {
1153 	uint32_t        dco_fraction;
1154 	uint32_t        dco_integer;
1155 	uint32_t        qdiv_ratio;
1156 	uint32_t        qdiv_mode;
1157 	uint32_t        kdiv;
1158 	uint32_t        pdiv;
1159 	uint32_t        central_freq;
1160 };
1161 
skl_wrpll_params_populate(struct skl_wrpll_params * params,uint64_t afe_clock,uint64_t central_freq,uint32_t p0,uint32_t p1,uint32_t p2)1162 static void skl_wrpll_params_populate(struct skl_wrpll_params *params,
1163 				      uint64_t afe_clock,
1164 				      uint64_t central_freq,
1165 				      uint32_t p0, uint32_t p1, uint32_t p2)
1166 {
1167 	uint64_t dco_freq;
1168 
1169 	switch (central_freq) {
1170 	case 9600000000ULL:
1171 		params->central_freq = 0;
1172 		break;
1173 	case 9000000000ULL:
1174 		params->central_freq = 1;
1175 		break;
1176 	case 8400000000ULL:
1177 		params->central_freq = 3;
1178 	}
1179 
1180 	switch (p0) {
1181 	case 1:
1182 		params->pdiv = 0;
1183 		break;
1184 	case 2:
1185 		params->pdiv = 1;
1186 		break;
1187 	case 3:
1188 		params->pdiv = 2;
1189 		break;
1190 	case 7:
1191 		params->pdiv = 4;
1192 		break;
1193 	default:
1194 		WARN(1, "Incorrect PDiv\n");
1195 	}
1196 
1197 	switch (p2) {
1198 	case 5:
1199 		params->kdiv = 0;
1200 		break;
1201 	case 2:
1202 		params->kdiv = 1;
1203 		break;
1204 	case 3:
1205 		params->kdiv = 2;
1206 		break;
1207 	case 1:
1208 		params->kdiv = 3;
1209 		break;
1210 	default:
1211 		WARN(1, "Incorrect KDiv\n");
1212 	}
1213 
1214 	params->qdiv_ratio = p1;
1215 	params->qdiv_mode = (params->qdiv_ratio == 1) ? 0 : 1;
1216 
1217 	dco_freq = p0 * p1 * p2 * afe_clock;
1218 
1219 	/*
1220 	 * Intermediate values are in Hz.
1221 	 * Divide by MHz to match bsepc
1222 	 */
1223 	params->dco_integer = div_u64(dco_freq, 24 * MHz(1));
1224 	params->dco_fraction =
1225 		div_u64((div_u64(dco_freq, 24) -
1226 			 params->dco_integer * MHz(1)) * 0x8000, MHz(1));
1227 }
1228 
1229 static bool
skl_ddi_calculate_wrpll(int clock,struct skl_wrpll_params * wrpll_params)1230 skl_ddi_calculate_wrpll(int clock /* in Hz */,
1231 			struct skl_wrpll_params *wrpll_params)
1232 {
1233 	uint64_t afe_clock = clock * 5; /* AFE Clock is 5x Pixel clock */
1234 	uint64_t dco_central_freq[3] = {8400000000ULL,
1235 					9000000000ULL,
1236 					9600000000ULL};
1237 	static const int even_dividers[] = {  4,  6,  8, 10, 12, 14, 16, 18, 20,
1238 					     24, 28, 30, 32, 36, 40, 42, 44,
1239 					     48, 52, 54, 56, 60, 64, 66, 68,
1240 					     70, 72, 76, 78, 80, 84, 88, 90,
1241 					     92, 96, 98 };
1242 	static const int odd_dividers[] = { 3, 5, 7, 9, 15, 21, 35 };
1243 	static const struct {
1244 		const int *list;
1245 		int n_dividers;
1246 	} dividers[] = {
1247 		{ even_dividers, ARRAY_SIZE(even_dividers) },
1248 		{ odd_dividers, ARRAY_SIZE(odd_dividers) },
1249 	};
1250 	struct skl_wrpll_context ctx;
1251 	unsigned int dco, d, i;
1252 	unsigned int p0, p1, p2;
1253 
1254 	skl_wrpll_context_init(&ctx);
1255 
1256 	for (d = 0; d < ARRAY_SIZE(dividers); d++) {
1257 		for (dco = 0; dco < ARRAY_SIZE(dco_central_freq); dco++) {
1258 			for (i = 0; i < dividers[d].n_dividers; i++) {
1259 				unsigned int p = dividers[d].list[i];
1260 				uint64_t dco_freq = p * afe_clock;
1261 
1262 				skl_wrpll_try_divider(&ctx,
1263 						      dco_central_freq[dco],
1264 						      dco_freq,
1265 						      p);
1266 				/*
1267 				 * Skip the remaining dividers if we're sure to
1268 				 * have found the definitive divider, we can't
1269 				 * improve a 0 deviation.
1270 				 */
1271 				if (ctx.min_deviation == 0)
1272 					goto skip_remaining_dividers;
1273 			}
1274 		}
1275 
1276 skip_remaining_dividers:
1277 		/*
1278 		 * If a solution is found with an even divider, prefer
1279 		 * this one.
1280 		 */
1281 		if (d == 0 && ctx.p)
1282 			break;
1283 	}
1284 
1285 	if (!ctx.p) {
1286 		DRM_DEBUG_DRIVER("No valid divider found for %dHz\n", clock);
1287 		return false;
1288 	}
1289 
1290 	/*
1291 	 * gcc incorrectly analyses that these can be used without being
1292 	 * initialized. To be fair, it's hard to guess.
1293 	 */
1294 	p0 = p1 = p2 = 0;
1295 	skl_wrpll_get_multipliers(ctx.p, &p0, &p1, &p2);
1296 	skl_wrpll_params_populate(wrpll_params, afe_clock, ctx.central_freq,
1297 				  p0, p1, p2);
1298 
1299 	return true;
1300 }
1301 
skl_ddi_hdmi_pll_dividers(struct intel_crtc * crtc,struct intel_crtc_state * crtc_state,int clock)1302 static bool skl_ddi_hdmi_pll_dividers(struct intel_crtc *crtc,
1303 				      struct intel_crtc_state *crtc_state,
1304 				      int clock)
1305 {
1306 	uint32_t ctrl1, cfgcr1, cfgcr2;
1307 	struct skl_wrpll_params wrpll_params = { 0, };
1308 
1309 	/*
1310 	 * See comment in intel_dpll_hw_state to understand why we always use 0
1311 	 * as the DPLL id in this function.
1312 	 */
1313 	ctrl1 = DPLL_CTRL1_OVERRIDE(0);
1314 
1315 	ctrl1 |= DPLL_CTRL1_HDMI_MODE(0);
1316 
1317 	if (!skl_ddi_calculate_wrpll(clock * 1000, &wrpll_params))
1318 		return false;
1319 
1320 	cfgcr1 = DPLL_CFGCR1_FREQ_ENABLE |
1321 		DPLL_CFGCR1_DCO_FRACTION(wrpll_params.dco_fraction) |
1322 		wrpll_params.dco_integer;
1323 
1324 	cfgcr2 = DPLL_CFGCR2_QDIV_RATIO(wrpll_params.qdiv_ratio) |
1325 		DPLL_CFGCR2_QDIV_MODE(wrpll_params.qdiv_mode) |
1326 		DPLL_CFGCR2_KDIV(wrpll_params.kdiv) |
1327 		DPLL_CFGCR2_PDIV(wrpll_params.pdiv) |
1328 		wrpll_params.central_freq;
1329 
1330 	memset(&crtc_state->dpll_hw_state, 0,
1331 	       sizeof(crtc_state->dpll_hw_state));
1332 
1333 	crtc_state->dpll_hw_state.ctrl1 = ctrl1;
1334 	crtc_state->dpll_hw_state.cfgcr1 = cfgcr1;
1335 	crtc_state->dpll_hw_state.cfgcr2 = cfgcr2;
1336 	return true;
1337 }
1338 
1339 static bool
skl_ddi_dp_set_dpll_hw_state(int clock,struct intel_dpll_hw_state * dpll_hw_state)1340 skl_ddi_dp_set_dpll_hw_state(int clock,
1341 			     struct intel_dpll_hw_state *dpll_hw_state)
1342 {
1343 	uint32_t ctrl1;
1344 
1345 	/*
1346 	 * See comment in intel_dpll_hw_state to understand why we always use 0
1347 	 * as the DPLL id in this function.
1348 	 */
1349 	ctrl1 = DPLL_CTRL1_OVERRIDE(0);
1350 	switch (clock / 2) {
1351 	case 81000:
1352 		ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, 0);
1353 		break;
1354 	case 135000:
1355 		ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350, 0);
1356 		break;
1357 	case 270000:
1358 		ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700, 0);
1359 		break;
1360 		/* eDP 1.4 rates */
1361 	case 162000:
1362 		ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620, 0);
1363 		break;
1364 	case 108000:
1365 		ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080, 0);
1366 		break;
1367 	case 216000:
1368 		ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160, 0);
1369 		break;
1370 	}
1371 
1372 	dpll_hw_state->ctrl1 = ctrl1;
1373 	return true;
1374 }
1375 
1376 static struct intel_shared_dpll *
skl_get_dpll(struct intel_crtc * crtc,struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)1377 skl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
1378 	     struct intel_encoder *encoder)
1379 {
1380 	struct intel_shared_dpll *pll;
1381 	int clock = crtc_state->port_clock;
1382 	bool bret;
1383 	struct intel_dpll_hw_state dpll_hw_state;
1384 
1385 	memset(&dpll_hw_state, 0, sizeof(dpll_hw_state));
1386 
1387 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
1388 		bret = skl_ddi_hdmi_pll_dividers(crtc, crtc_state, clock);
1389 		if (!bret) {
1390 			DRM_DEBUG_KMS("Could not get HDMI pll dividers.\n");
1391 			return NULL;
1392 		}
1393 	} else if (intel_crtc_has_dp_encoder(crtc_state)) {
1394 		bret = skl_ddi_dp_set_dpll_hw_state(clock, &dpll_hw_state);
1395 		if (!bret) {
1396 			DRM_DEBUG_KMS("Could not set DP dpll HW state.\n");
1397 			return NULL;
1398 		}
1399 		crtc_state->dpll_hw_state = dpll_hw_state;
1400 	} else {
1401 		return NULL;
1402 	}
1403 
1404 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP))
1405 		pll = intel_find_shared_dpll(crtc, crtc_state,
1406 					     DPLL_ID_SKL_DPLL0,
1407 					     DPLL_ID_SKL_DPLL0);
1408 	else
1409 		pll = intel_find_shared_dpll(crtc, crtc_state,
1410 					     DPLL_ID_SKL_DPLL1,
1411 					     DPLL_ID_SKL_DPLL3);
1412 	if (!pll)
1413 		return NULL;
1414 
1415 	intel_reference_shared_dpll(pll, crtc_state);
1416 
1417 	return pll;
1418 }
1419 
skl_dump_hw_state(struct drm_i915_private * dev_priv,struct intel_dpll_hw_state * hw_state)1420 static void skl_dump_hw_state(struct drm_i915_private *dev_priv,
1421 			      struct intel_dpll_hw_state *hw_state)
1422 {
1423 	DRM_DEBUG_KMS("dpll_hw_state: "
1424 		      "ctrl1: 0x%x, cfgcr1: 0x%x, cfgcr2: 0x%x\n",
1425 		      hw_state->ctrl1,
1426 		      hw_state->cfgcr1,
1427 		      hw_state->cfgcr2);
1428 }
1429 
1430 static const struct intel_shared_dpll_funcs skl_ddi_pll_funcs = {
1431 	.enable = skl_ddi_pll_enable,
1432 	.disable = skl_ddi_pll_disable,
1433 	.get_hw_state = skl_ddi_pll_get_hw_state,
1434 };
1435 
1436 static const struct intel_shared_dpll_funcs skl_ddi_dpll0_funcs = {
1437 	.enable = skl_ddi_dpll0_enable,
1438 	.disable = skl_ddi_dpll0_disable,
1439 	.get_hw_state = skl_ddi_dpll0_get_hw_state,
1440 };
1441 
bxt_ddi_pll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)1442 static void bxt_ddi_pll_enable(struct drm_i915_private *dev_priv,
1443 				struct intel_shared_dpll *pll)
1444 {
1445 	uint32_t temp;
1446 	enum port port = (enum port)pll->info->id; /* 1:1 port->PLL mapping */
1447 	enum dpio_phy phy;
1448 	enum dpio_channel ch;
1449 
1450 	bxt_port_to_phy_channel(dev_priv, port, &phy, &ch);
1451 
1452 	/* Non-SSC reference */
1453 	temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
1454 	temp |= PORT_PLL_REF_SEL;
1455 	I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
1456 
1457 	if (IS_GEMINILAKE(dev_priv)) {
1458 		temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
1459 		temp |= PORT_PLL_POWER_ENABLE;
1460 		I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
1461 
1462 		if (wait_for_us((I915_READ(BXT_PORT_PLL_ENABLE(port)) &
1463 				 PORT_PLL_POWER_STATE), 200))
1464 			DRM_ERROR("Power state not set for PLL:%d\n", port);
1465 	}
1466 
1467 	/* Disable 10 bit clock */
1468 	temp = I915_READ(BXT_PORT_PLL_EBB_4(phy, ch));
1469 	temp &= ~PORT_PLL_10BIT_CLK_ENABLE;
1470 	I915_WRITE(BXT_PORT_PLL_EBB_4(phy, ch), temp);
1471 
1472 	/* Write P1 & P2 */
1473 	temp = I915_READ(BXT_PORT_PLL_EBB_0(phy, ch));
1474 	temp &= ~(PORT_PLL_P1_MASK | PORT_PLL_P2_MASK);
1475 	temp |= pll->state.hw_state.ebb0;
1476 	I915_WRITE(BXT_PORT_PLL_EBB_0(phy, ch), temp);
1477 
1478 	/* Write M2 integer */
1479 	temp = I915_READ(BXT_PORT_PLL(phy, ch, 0));
1480 	temp &= ~PORT_PLL_M2_MASK;
1481 	temp |= pll->state.hw_state.pll0;
1482 	I915_WRITE(BXT_PORT_PLL(phy, ch, 0), temp);
1483 
1484 	/* Write N */
1485 	temp = I915_READ(BXT_PORT_PLL(phy, ch, 1));
1486 	temp &= ~PORT_PLL_N_MASK;
1487 	temp |= pll->state.hw_state.pll1;
1488 	I915_WRITE(BXT_PORT_PLL(phy, ch, 1), temp);
1489 
1490 	/* Write M2 fraction */
1491 	temp = I915_READ(BXT_PORT_PLL(phy, ch, 2));
1492 	temp &= ~PORT_PLL_M2_FRAC_MASK;
1493 	temp |= pll->state.hw_state.pll2;
1494 	I915_WRITE(BXT_PORT_PLL(phy, ch, 2), temp);
1495 
1496 	/* Write M2 fraction enable */
1497 	temp = I915_READ(BXT_PORT_PLL(phy, ch, 3));
1498 	temp &= ~PORT_PLL_M2_FRAC_ENABLE;
1499 	temp |= pll->state.hw_state.pll3;
1500 	I915_WRITE(BXT_PORT_PLL(phy, ch, 3), temp);
1501 
1502 	/* Write coeff */
1503 	temp = I915_READ(BXT_PORT_PLL(phy, ch, 6));
1504 	temp &= ~PORT_PLL_PROP_COEFF_MASK;
1505 	temp &= ~PORT_PLL_INT_COEFF_MASK;
1506 	temp &= ~PORT_PLL_GAIN_CTL_MASK;
1507 	temp |= pll->state.hw_state.pll6;
1508 	I915_WRITE(BXT_PORT_PLL(phy, ch, 6), temp);
1509 
1510 	/* Write calibration val */
1511 	temp = I915_READ(BXT_PORT_PLL(phy, ch, 8));
1512 	temp &= ~PORT_PLL_TARGET_CNT_MASK;
1513 	temp |= pll->state.hw_state.pll8;
1514 	I915_WRITE(BXT_PORT_PLL(phy, ch, 8), temp);
1515 
1516 	temp = I915_READ(BXT_PORT_PLL(phy, ch, 9));
1517 	temp &= ~PORT_PLL_LOCK_THRESHOLD_MASK;
1518 	temp |= pll->state.hw_state.pll9;
1519 	I915_WRITE(BXT_PORT_PLL(phy, ch, 9), temp);
1520 
1521 	temp = I915_READ(BXT_PORT_PLL(phy, ch, 10));
1522 	temp &= ~PORT_PLL_DCO_AMP_OVR_EN_H;
1523 	temp &= ~PORT_PLL_DCO_AMP_MASK;
1524 	temp |= pll->state.hw_state.pll10;
1525 	I915_WRITE(BXT_PORT_PLL(phy, ch, 10), temp);
1526 
1527 	/* Recalibrate with new settings */
1528 	temp = I915_READ(BXT_PORT_PLL_EBB_4(phy, ch));
1529 	temp |= PORT_PLL_RECALIBRATE;
1530 	I915_WRITE(BXT_PORT_PLL_EBB_4(phy, ch), temp);
1531 	temp &= ~PORT_PLL_10BIT_CLK_ENABLE;
1532 	temp |= pll->state.hw_state.ebb4;
1533 	I915_WRITE(BXT_PORT_PLL_EBB_4(phy, ch), temp);
1534 
1535 	/* Enable PLL */
1536 	temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
1537 	temp |= PORT_PLL_ENABLE;
1538 	I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
1539 	POSTING_READ(BXT_PORT_PLL_ENABLE(port));
1540 
1541 	if (wait_for_us((I915_READ(BXT_PORT_PLL_ENABLE(port)) & PORT_PLL_LOCK),
1542 			200))
1543 		DRM_ERROR("PLL %d not locked\n", port);
1544 
1545 	if (IS_GEMINILAKE(dev_priv)) {
1546 		temp = I915_READ(BXT_PORT_TX_DW5_LN0(phy, ch));
1547 		temp |= DCC_DELAY_RANGE_2;
1548 		I915_WRITE(BXT_PORT_TX_DW5_GRP(phy, ch), temp);
1549 	}
1550 
1551 	/*
1552 	 * While we write to the group register to program all lanes at once we
1553 	 * can read only lane registers and we pick lanes 0/1 for that.
1554 	 */
1555 	temp = I915_READ(BXT_PORT_PCS_DW12_LN01(phy, ch));
1556 	temp &= ~LANE_STAGGER_MASK;
1557 	temp &= ~LANESTAGGER_STRAP_OVRD;
1558 	temp |= pll->state.hw_state.pcsdw12;
1559 	I915_WRITE(BXT_PORT_PCS_DW12_GRP(phy, ch), temp);
1560 }
1561 
bxt_ddi_pll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)1562 static void bxt_ddi_pll_disable(struct drm_i915_private *dev_priv,
1563 					struct intel_shared_dpll *pll)
1564 {
1565 	enum port port = (enum port)pll->info->id; /* 1:1 port->PLL mapping */
1566 	uint32_t temp;
1567 
1568 	temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
1569 	temp &= ~PORT_PLL_ENABLE;
1570 	I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
1571 	POSTING_READ(BXT_PORT_PLL_ENABLE(port));
1572 
1573 	if (IS_GEMINILAKE(dev_priv)) {
1574 		temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
1575 		temp &= ~PORT_PLL_POWER_ENABLE;
1576 		I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
1577 
1578 		if (wait_for_us(!(I915_READ(BXT_PORT_PLL_ENABLE(port)) &
1579 				PORT_PLL_POWER_STATE), 200))
1580 			DRM_ERROR("Power state not reset for PLL:%d\n", port);
1581 	}
1582 }
1583 
bxt_ddi_pll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)1584 static bool bxt_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
1585 					struct intel_shared_dpll *pll,
1586 					struct intel_dpll_hw_state *hw_state)
1587 {
1588 	enum port port = (enum port)pll->info->id; /* 1:1 port->PLL mapping */
1589 	uint32_t val;
1590 	bool ret;
1591 	enum dpio_phy phy;
1592 	enum dpio_channel ch;
1593 
1594 	bxt_port_to_phy_channel(dev_priv, port, &phy, &ch);
1595 
1596 	if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
1597 		return false;
1598 
1599 	ret = false;
1600 
1601 	val = I915_READ(BXT_PORT_PLL_ENABLE(port));
1602 	if (!(val & PORT_PLL_ENABLE))
1603 		goto out;
1604 
1605 	hw_state->ebb0 = I915_READ(BXT_PORT_PLL_EBB_0(phy, ch));
1606 	hw_state->ebb0 &= PORT_PLL_P1_MASK | PORT_PLL_P2_MASK;
1607 
1608 	hw_state->ebb4 = I915_READ(BXT_PORT_PLL_EBB_4(phy, ch));
1609 	hw_state->ebb4 &= PORT_PLL_10BIT_CLK_ENABLE;
1610 
1611 	hw_state->pll0 = I915_READ(BXT_PORT_PLL(phy, ch, 0));
1612 	hw_state->pll0 &= PORT_PLL_M2_MASK;
1613 
1614 	hw_state->pll1 = I915_READ(BXT_PORT_PLL(phy, ch, 1));
1615 	hw_state->pll1 &= PORT_PLL_N_MASK;
1616 
1617 	hw_state->pll2 = I915_READ(BXT_PORT_PLL(phy, ch, 2));
1618 	hw_state->pll2 &= PORT_PLL_M2_FRAC_MASK;
1619 
1620 	hw_state->pll3 = I915_READ(BXT_PORT_PLL(phy, ch, 3));
1621 	hw_state->pll3 &= PORT_PLL_M2_FRAC_ENABLE;
1622 
1623 	hw_state->pll6 = I915_READ(BXT_PORT_PLL(phy, ch, 6));
1624 	hw_state->pll6 &= PORT_PLL_PROP_COEFF_MASK |
1625 			  PORT_PLL_INT_COEFF_MASK |
1626 			  PORT_PLL_GAIN_CTL_MASK;
1627 
1628 	hw_state->pll8 = I915_READ(BXT_PORT_PLL(phy, ch, 8));
1629 	hw_state->pll8 &= PORT_PLL_TARGET_CNT_MASK;
1630 
1631 	hw_state->pll9 = I915_READ(BXT_PORT_PLL(phy, ch, 9));
1632 	hw_state->pll9 &= PORT_PLL_LOCK_THRESHOLD_MASK;
1633 
1634 	hw_state->pll10 = I915_READ(BXT_PORT_PLL(phy, ch, 10));
1635 	hw_state->pll10 &= PORT_PLL_DCO_AMP_OVR_EN_H |
1636 			   PORT_PLL_DCO_AMP_MASK;
1637 
1638 	/*
1639 	 * While we write to the group register to program all lanes at once we
1640 	 * can read only lane registers. We configure all lanes the same way, so
1641 	 * here just read out lanes 0/1 and output a note if lanes 2/3 differ.
1642 	 */
1643 	hw_state->pcsdw12 = I915_READ(BXT_PORT_PCS_DW12_LN01(phy, ch));
1644 	if (I915_READ(BXT_PORT_PCS_DW12_LN23(phy, ch)) != hw_state->pcsdw12)
1645 		DRM_DEBUG_DRIVER("lane stagger config different for lane 01 (%08x) and 23 (%08x)\n",
1646 				 hw_state->pcsdw12,
1647 				 I915_READ(BXT_PORT_PCS_DW12_LN23(phy, ch)));
1648 	hw_state->pcsdw12 &= LANE_STAGGER_MASK | LANESTAGGER_STRAP_OVRD;
1649 
1650 	ret = true;
1651 
1652 out:
1653 	intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
1654 
1655 	return ret;
1656 }
1657 
1658 /* bxt clock parameters */
1659 struct bxt_clk_div {
1660 	int clock;
1661 	uint32_t p1;
1662 	uint32_t p2;
1663 	uint32_t m2_int;
1664 	uint32_t m2_frac;
1665 	bool m2_frac_en;
1666 	uint32_t n;
1667 
1668 	int vco;
1669 };
1670 
1671 /* pre-calculated values for DP linkrates */
1672 static const struct bxt_clk_div bxt_dp_clk_val[] = {
1673 	{162000, 4, 2, 32, 1677722, 1, 1},
1674 	{270000, 4, 1, 27,       0, 0, 1},
1675 	{540000, 2, 1, 27,       0, 0, 1},
1676 	{216000, 3, 2, 32, 1677722, 1, 1},
1677 	{243000, 4, 1, 24, 1258291, 1, 1},
1678 	{324000, 4, 1, 32, 1677722, 1, 1},
1679 	{432000, 3, 1, 32, 1677722, 1, 1}
1680 };
1681 
1682 static bool
bxt_ddi_hdmi_pll_dividers(struct intel_crtc * intel_crtc,struct intel_crtc_state * crtc_state,int clock,struct bxt_clk_div * clk_div)1683 bxt_ddi_hdmi_pll_dividers(struct intel_crtc *intel_crtc,
1684 			  struct intel_crtc_state *crtc_state, int clock,
1685 			  struct bxt_clk_div *clk_div)
1686 {
1687 	struct dpll best_clock;
1688 
1689 	/* Calculate HDMI div */
1690 	/*
1691 	 * FIXME: tie the following calculation into
1692 	 * i9xx_crtc_compute_clock
1693 	 */
1694 	if (!bxt_find_best_dpll(crtc_state, clock, &best_clock)) {
1695 		DRM_DEBUG_DRIVER("no PLL dividers found for clock %d pipe %c\n",
1696 				 clock, pipe_name(intel_crtc->pipe));
1697 		return false;
1698 	}
1699 
1700 	clk_div->p1 = best_clock.p1;
1701 	clk_div->p2 = best_clock.p2;
1702 	WARN_ON(best_clock.m1 != 2);
1703 	clk_div->n = best_clock.n;
1704 	clk_div->m2_int = best_clock.m2 >> 22;
1705 	clk_div->m2_frac = best_clock.m2 & ((1 << 22) - 1);
1706 	clk_div->m2_frac_en = clk_div->m2_frac != 0;
1707 
1708 	clk_div->vco = best_clock.vco;
1709 
1710 	return true;
1711 }
1712 
bxt_ddi_dp_pll_dividers(int clock,struct bxt_clk_div * clk_div)1713 static void bxt_ddi_dp_pll_dividers(int clock, struct bxt_clk_div *clk_div)
1714 {
1715 	int i;
1716 
1717 	*clk_div = bxt_dp_clk_val[0];
1718 	for (i = 0; i < ARRAY_SIZE(bxt_dp_clk_val); ++i) {
1719 		if (bxt_dp_clk_val[i].clock == clock) {
1720 			*clk_div = bxt_dp_clk_val[i];
1721 			break;
1722 		}
1723 	}
1724 
1725 	clk_div->vco = clock * 10 / 2 * clk_div->p1 * clk_div->p2;
1726 }
1727 
bxt_ddi_set_dpll_hw_state(int clock,struct bxt_clk_div * clk_div,struct intel_dpll_hw_state * dpll_hw_state)1728 static bool bxt_ddi_set_dpll_hw_state(int clock,
1729 			  struct bxt_clk_div *clk_div,
1730 			  struct intel_dpll_hw_state *dpll_hw_state)
1731 {
1732 	int vco = clk_div->vco;
1733 	uint32_t prop_coef, int_coef, gain_ctl, targ_cnt;
1734 	uint32_t lanestagger;
1735 
1736 	if (vco >= 6200000 && vco <= 6700000) {
1737 		prop_coef = 4;
1738 		int_coef = 9;
1739 		gain_ctl = 3;
1740 		targ_cnt = 8;
1741 	} else if ((vco > 5400000 && vco < 6200000) ||
1742 			(vco >= 4800000 && vco < 5400000)) {
1743 		prop_coef = 5;
1744 		int_coef = 11;
1745 		gain_ctl = 3;
1746 		targ_cnt = 9;
1747 	} else if (vco == 5400000) {
1748 		prop_coef = 3;
1749 		int_coef = 8;
1750 		gain_ctl = 1;
1751 		targ_cnt = 9;
1752 	} else {
1753 		DRM_ERROR("Invalid VCO\n");
1754 		return false;
1755 	}
1756 
1757 	if (clock > 270000)
1758 		lanestagger = 0x18;
1759 	else if (clock > 135000)
1760 		lanestagger = 0x0d;
1761 	else if (clock > 67000)
1762 		lanestagger = 0x07;
1763 	else if (clock > 33000)
1764 		lanestagger = 0x04;
1765 	else
1766 		lanestagger = 0x02;
1767 
1768 	dpll_hw_state->ebb0 = PORT_PLL_P1(clk_div->p1) | PORT_PLL_P2(clk_div->p2);
1769 	dpll_hw_state->pll0 = clk_div->m2_int;
1770 	dpll_hw_state->pll1 = PORT_PLL_N(clk_div->n);
1771 	dpll_hw_state->pll2 = clk_div->m2_frac;
1772 
1773 	if (clk_div->m2_frac_en)
1774 		dpll_hw_state->pll3 = PORT_PLL_M2_FRAC_ENABLE;
1775 
1776 	dpll_hw_state->pll6 = prop_coef | PORT_PLL_INT_COEFF(int_coef);
1777 	dpll_hw_state->pll6 |= PORT_PLL_GAIN_CTL(gain_ctl);
1778 
1779 	dpll_hw_state->pll8 = targ_cnt;
1780 
1781 	dpll_hw_state->pll9 = 5 << PORT_PLL_LOCK_THRESHOLD_SHIFT;
1782 
1783 	dpll_hw_state->pll10 =
1784 		PORT_PLL_DCO_AMP(PORT_PLL_DCO_AMP_DEFAULT)
1785 		| PORT_PLL_DCO_AMP_OVR_EN_H;
1786 
1787 	dpll_hw_state->ebb4 = PORT_PLL_10BIT_CLK_ENABLE;
1788 
1789 	dpll_hw_state->pcsdw12 = LANESTAGGER_STRAP_OVRD | lanestagger;
1790 
1791 	return true;
1792 }
1793 
1794 static bool
bxt_ddi_dp_set_dpll_hw_state(int clock,struct intel_dpll_hw_state * dpll_hw_state)1795 bxt_ddi_dp_set_dpll_hw_state(int clock,
1796 			     struct intel_dpll_hw_state *dpll_hw_state)
1797 {
1798 	struct bxt_clk_div clk_div = {0};
1799 
1800 	bxt_ddi_dp_pll_dividers(clock, &clk_div);
1801 
1802 	return bxt_ddi_set_dpll_hw_state(clock, &clk_div, dpll_hw_state);
1803 }
1804 
1805 static bool
bxt_ddi_hdmi_set_dpll_hw_state(struct intel_crtc * intel_crtc,struct intel_crtc_state * crtc_state,int clock,struct intel_dpll_hw_state * dpll_hw_state)1806 bxt_ddi_hdmi_set_dpll_hw_state(struct intel_crtc *intel_crtc,
1807 			       struct intel_crtc_state *crtc_state, int clock,
1808 			       struct intel_dpll_hw_state *dpll_hw_state)
1809 {
1810 	struct bxt_clk_div clk_div = { };
1811 
1812 	bxt_ddi_hdmi_pll_dividers(intel_crtc, crtc_state, clock, &clk_div);
1813 
1814 	return bxt_ddi_set_dpll_hw_state(clock, &clk_div, dpll_hw_state);
1815 }
1816 
1817 static struct intel_shared_dpll *
bxt_get_dpll(struct intel_crtc * crtc,struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)1818 bxt_get_dpll(struct intel_crtc *crtc,
1819 		struct intel_crtc_state *crtc_state,
1820 		struct intel_encoder *encoder)
1821 {
1822 	struct intel_dpll_hw_state dpll_hw_state = { };
1823 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1824 	struct intel_shared_dpll *pll;
1825 	int i, clock = crtc_state->port_clock;
1826 
1827 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI) &&
1828 	    !bxt_ddi_hdmi_set_dpll_hw_state(crtc, crtc_state, clock,
1829 					    &dpll_hw_state))
1830 		return NULL;
1831 
1832 	if (intel_crtc_has_dp_encoder(crtc_state) &&
1833 	    !bxt_ddi_dp_set_dpll_hw_state(clock, &dpll_hw_state))
1834 		return NULL;
1835 
1836 	memset(&crtc_state->dpll_hw_state, 0,
1837 	       sizeof(crtc_state->dpll_hw_state));
1838 
1839 	crtc_state->dpll_hw_state = dpll_hw_state;
1840 
1841 	/* 1:1 mapping between ports and PLLs */
1842 	i = (enum intel_dpll_id) encoder->port;
1843 	pll = intel_get_shared_dpll_by_id(dev_priv, i);
1844 
1845 	DRM_DEBUG_KMS("[CRTC:%d:%s] using pre-allocated %s\n",
1846 		      crtc->base.base.id, crtc->base.name, pll->info->name);
1847 
1848 	intel_reference_shared_dpll(pll, crtc_state);
1849 
1850 	return pll;
1851 }
1852 
bxt_dump_hw_state(struct drm_i915_private * dev_priv,struct intel_dpll_hw_state * hw_state)1853 static void bxt_dump_hw_state(struct drm_i915_private *dev_priv,
1854 			      struct intel_dpll_hw_state *hw_state)
1855 {
1856 	DRM_DEBUG_KMS("dpll_hw_state: ebb0: 0x%x, ebb4: 0x%x,"
1857 		      "pll0: 0x%x, pll1: 0x%x, pll2: 0x%x, pll3: 0x%x, "
1858 		      "pll6: 0x%x, pll8: 0x%x, pll9: 0x%x, pll10: 0x%x, pcsdw12: 0x%x\n",
1859 		      hw_state->ebb0,
1860 		      hw_state->ebb4,
1861 		      hw_state->pll0,
1862 		      hw_state->pll1,
1863 		      hw_state->pll2,
1864 		      hw_state->pll3,
1865 		      hw_state->pll6,
1866 		      hw_state->pll8,
1867 		      hw_state->pll9,
1868 		      hw_state->pll10,
1869 		      hw_state->pcsdw12);
1870 }
1871 
1872 static const struct intel_shared_dpll_funcs bxt_ddi_pll_funcs = {
1873 	.enable = bxt_ddi_pll_enable,
1874 	.disable = bxt_ddi_pll_disable,
1875 	.get_hw_state = bxt_ddi_pll_get_hw_state,
1876 };
1877 
intel_ddi_pll_init(struct drm_device * dev)1878 static void intel_ddi_pll_init(struct drm_device *dev)
1879 {
1880 	struct drm_i915_private *dev_priv = to_i915(dev);
1881 
1882 	if (INTEL_GEN(dev_priv) < 9) {
1883 		uint32_t val = I915_READ(LCPLL_CTL);
1884 
1885 		/*
1886 		 * The LCPLL register should be turned on by the BIOS. For now
1887 		 * let's just check its state and print errors in case
1888 		 * something is wrong.  Don't even try to turn it on.
1889 		 */
1890 
1891 		if (val & LCPLL_CD_SOURCE_FCLK)
1892 			DRM_ERROR("CDCLK source is not LCPLL\n");
1893 
1894 		if (val & LCPLL_PLL_DISABLE)
1895 			DRM_ERROR("LCPLL is disabled\n");
1896 	}
1897 }
1898 
1899 struct intel_dpll_mgr {
1900 	const struct dpll_info *dpll_info;
1901 
1902 	struct intel_shared_dpll *(*get_dpll)(struct intel_crtc *crtc,
1903 					      struct intel_crtc_state *crtc_state,
1904 					      struct intel_encoder *encoder);
1905 
1906 	void (*dump_hw_state)(struct drm_i915_private *dev_priv,
1907 			      struct intel_dpll_hw_state *hw_state);
1908 };
1909 
1910 static const struct dpll_info pch_plls[] = {
1911 	{ "PCH DPLL A", &ibx_pch_dpll_funcs, DPLL_ID_PCH_PLL_A, 0 },
1912 	{ "PCH DPLL B", &ibx_pch_dpll_funcs, DPLL_ID_PCH_PLL_B, 0 },
1913 	{ },
1914 };
1915 
1916 static const struct intel_dpll_mgr pch_pll_mgr = {
1917 	.dpll_info = pch_plls,
1918 	.get_dpll = ibx_get_dpll,
1919 	.dump_hw_state = ibx_dump_hw_state,
1920 };
1921 
1922 static const struct dpll_info hsw_plls[] = {
1923 	{ "WRPLL 1",    &hsw_ddi_wrpll_funcs, DPLL_ID_WRPLL1,     0 },
1924 	{ "WRPLL 2",    &hsw_ddi_wrpll_funcs, DPLL_ID_WRPLL2,     0 },
1925 	{ "SPLL",       &hsw_ddi_spll_funcs,  DPLL_ID_SPLL,       0 },
1926 	{ "LCPLL 810",  &hsw_ddi_lcpll_funcs, DPLL_ID_LCPLL_810,  INTEL_DPLL_ALWAYS_ON },
1927 	{ "LCPLL 1350", &hsw_ddi_lcpll_funcs, DPLL_ID_LCPLL_1350, INTEL_DPLL_ALWAYS_ON },
1928 	{ "LCPLL 2700", &hsw_ddi_lcpll_funcs, DPLL_ID_LCPLL_2700, INTEL_DPLL_ALWAYS_ON },
1929 	{ },
1930 };
1931 
1932 static const struct intel_dpll_mgr hsw_pll_mgr = {
1933 	.dpll_info = hsw_plls,
1934 	.get_dpll = hsw_get_dpll,
1935 	.dump_hw_state = hsw_dump_hw_state,
1936 };
1937 
1938 static const struct dpll_info skl_plls[] = {
1939 	{ "DPLL 0", &skl_ddi_dpll0_funcs, DPLL_ID_SKL_DPLL0, INTEL_DPLL_ALWAYS_ON },
1940 	{ "DPLL 1", &skl_ddi_pll_funcs,   DPLL_ID_SKL_DPLL1, 0 },
1941 	{ "DPLL 2", &skl_ddi_pll_funcs,   DPLL_ID_SKL_DPLL2, 0 },
1942 	{ "DPLL 3", &skl_ddi_pll_funcs,   DPLL_ID_SKL_DPLL3, 0 },
1943 	{ },
1944 };
1945 
1946 static const struct intel_dpll_mgr skl_pll_mgr = {
1947 	.dpll_info = skl_plls,
1948 	.get_dpll = skl_get_dpll,
1949 	.dump_hw_state = skl_dump_hw_state,
1950 };
1951 
1952 static const struct dpll_info bxt_plls[] = {
1953 	{ "PORT PLL A", &bxt_ddi_pll_funcs, DPLL_ID_SKL_DPLL0, 0 },
1954 	{ "PORT PLL B", &bxt_ddi_pll_funcs, DPLL_ID_SKL_DPLL1, 0 },
1955 	{ "PORT PLL C", &bxt_ddi_pll_funcs, DPLL_ID_SKL_DPLL2, 0 },
1956 	{ },
1957 };
1958 
1959 static const struct intel_dpll_mgr bxt_pll_mgr = {
1960 	.dpll_info = bxt_plls,
1961 	.get_dpll = bxt_get_dpll,
1962 	.dump_hw_state = bxt_dump_hw_state,
1963 };
1964 
cnl_ddi_pll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)1965 static void cnl_ddi_pll_enable(struct drm_i915_private *dev_priv,
1966 			       struct intel_shared_dpll *pll)
1967 {
1968 	const enum intel_dpll_id id = pll->info->id;
1969 	uint32_t val;
1970 
1971 	/* 1. Enable DPLL power in DPLL_ENABLE. */
1972 	val = I915_READ(CNL_DPLL_ENABLE(id));
1973 	val |= PLL_POWER_ENABLE;
1974 	I915_WRITE(CNL_DPLL_ENABLE(id), val);
1975 
1976 	/* 2. Wait for DPLL power state enabled in DPLL_ENABLE. */
1977 	if (intel_wait_for_register(dev_priv,
1978 				    CNL_DPLL_ENABLE(id),
1979 				    PLL_POWER_STATE,
1980 				    PLL_POWER_STATE,
1981 				    5))
1982 		DRM_ERROR("PLL %d Power not enabled\n", id);
1983 
1984 	/*
1985 	 * 3. Configure DPLL_CFGCR0 to set SSC enable/disable,
1986 	 * select DP mode, and set DP link rate.
1987 	 */
1988 	val = pll->state.hw_state.cfgcr0;
1989 	I915_WRITE(CNL_DPLL_CFGCR0(id), val);
1990 
1991 	/* 4. Reab back to ensure writes completed */
1992 	POSTING_READ(CNL_DPLL_CFGCR0(id));
1993 
1994 	/* 3. Configure DPLL_CFGCR0 */
1995 	/* Avoid touch CFGCR1 if HDMI mode is not enabled */
1996 	if (pll->state.hw_state.cfgcr0 & DPLL_CFGCR0_HDMI_MODE) {
1997 		val = pll->state.hw_state.cfgcr1;
1998 		I915_WRITE(CNL_DPLL_CFGCR1(id), val);
1999 		/* 4. Reab back to ensure writes completed */
2000 		POSTING_READ(CNL_DPLL_CFGCR1(id));
2001 	}
2002 
2003 	/*
2004 	 * 5. If the frequency will result in a change to the voltage
2005 	 * requirement, follow the Display Voltage Frequency Switching
2006 	 * Sequence Before Frequency Change
2007 	 *
2008 	 * Note: DVFS is actually handled via the cdclk code paths,
2009 	 * hence we do nothing here.
2010 	 */
2011 
2012 	/* 6. Enable DPLL in DPLL_ENABLE. */
2013 	val = I915_READ(CNL_DPLL_ENABLE(id));
2014 	val |= PLL_ENABLE;
2015 	I915_WRITE(CNL_DPLL_ENABLE(id), val);
2016 
2017 	/* 7. Wait for PLL lock status in DPLL_ENABLE. */
2018 	if (intel_wait_for_register(dev_priv,
2019 				    CNL_DPLL_ENABLE(id),
2020 				    PLL_LOCK,
2021 				    PLL_LOCK,
2022 				    5))
2023 		DRM_ERROR("PLL %d not locked\n", id);
2024 
2025 	/*
2026 	 * 8. If the frequency will result in a change to the voltage
2027 	 * requirement, follow the Display Voltage Frequency Switching
2028 	 * Sequence After Frequency Change
2029 	 *
2030 	 * Note: DVFS is actually handled via the cdclk code paths,
2031 	 * hence we do nothing here.
2032 	 */
2033 
2034 	/*
2035 	 * 9. turn on the clock for the DDI and map the DPLL to the DDI
2036 	 * Done at intel_ddi_clk_select
2037 	 */
2038 }
2039 
cnl_ddi_pll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)2040 static void cnl_ddi_pll_disable(struct drm_i915_private *dev_priv,
2041 				struct intel_shared_dpll *pll)
2042 {
2043 	const enum intel_dpll_id id = pll->info->id;
2044 	uint32_t val;
2045 
2046 	/*
2047 	 * 1. Configure DPCLKA_CFGCR0 to turn off the clock for the DDI.
2048 	 * Done at intel_ddi_post_disable
2049 	 */
2050 
2051 	/*
2052 	 * 2. If the frequency will result in a change to the voltage
2053 	 * requirement, follow the Display Voltage Frequency Switching
2054 	 * Sequence Before Frequency Change
2055 	 *
2056 	 * Note: DVFS is actually handled via the cdclk code paths,
2057 	 * hence we do nothing here.
2058 	 */
2059 
2060 	/* 3. Disable DPLL through DPLL_ENABLE. */
2061 	val = I915_READ(CNL_DPLL_ENABLE(id));
2062 	val &= ~PLL_ENABLE;
2063 	I915_WRITE(CNL_DPLL_ENABLE(id), val);
2064 
2065 	/* 4. Wait for PLL not locked status in DPLL_ENABLE. */
2066 	if (intel_wait_for_register(dev_priv,
2067 				    CNL_DPLL_ENABLE(id),
2068 				    PLL_LOCK,
2069 				    0,
2070 				    5))
2071 		DRM_ERROR("PLL %d locked\n", id);
2072 
2073 	/*
2074 	 * 5. If the frequency will result in a change to the voltage
2075 	 * requirement, follow the Display Voltage Frequency Switching
2076 	 * Sequence After Frequency Change
2077 	 *
2078 	 * Note: DVFS is actually handled via the cdclk code paths,
2079 	 * hence we do nothing here.
2080 	 */
2081 
2082 	/* 6. Disable DPLL power in DPLL_ENABLE. */
2083 	val = I915_READ(CNL_DPLL_ENABLE(id));
2084 	val &= ~PLL_POWER_ENABLE;
2085 	I915_WRITE(CNL_DPLL_ENABLE(id), val);
2086 
2087 	/* 7. Wait for DPLL power state disabled in DPLL_ENABLE. */
2088 	if (intel_wait_for_register(dev_priv,
2089 				    CNL_DPLL_ENABLE(id),
2090 				    PLL_POWER_STATE,
2091 				    0,
2092 				    5))
2093 		DRM_ERROR("PLL %d Power not disabled\n", id);
2094 }
2095 
cnl_ddi_pll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)2096 static bool cnl_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
2097 				     struct intel_shared_dpll *pll,
2098 				     struct intel_dpll_hw_state *hw_state)
2099 {
2100 	const enum intel_dpll_id id = pll->info->id;
2101 	uint32_t val;
2102 	bool ret;
2103 
2104 	if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
2105 		return false;
2106 
2107 	ret = false;
2108 
2109 	val = I915_READ(CNL_DPLL_ENABLE(id));
2110 	if (!(val & PLL_ENABLE))
2111 		goto out;
2112 
2113 	val = I915_READ(CNL_DPLL_CFGCR0(id));
2114 	hw_state->cfgcr0 = val;
2115 
2116 	/* avoid reading back stale values if HDMI mode is not enabled */
2117 	if (val & DPLL_CFGCR0_HDMI_MODE) {
2118 		hw_state->cfgcr1 = I915_READ(CNL_DPLL_CFGCR1(id));
2119 	}
2120 	ret = true;
2121 
2122 out:
2123 	intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
2124 
2125 	return ret;
2126 }
2127 
cnl_wrpll_get_multipliers(int bestdiv,int * pdiv,int * qdiv,int * kdiv)2128 static void cnl_wrpll_get_multipliers(int bestdiv, int *pdiv,
2129 				      int *qdiv, int *kdiv)
2130 {
2131 	/* even dividers */
2132 	if (bestdiv % 2 == 0) {
2133 		if (bestdiv == 2) {
2134 			*pdiv = 2;
2135 			*qdiv = 1;
2136 			*kdiv = 1;
2137 		} else if (bestdiv % 4 == 0) {
2138 			*pdiv = 2;
2139 			*qdiv = bestdiv / 4;
2140 			*kdiv = 2;
2141 		} else if (bestdiv % 6 == 0) {
2142 			*pdiv = 3;
2143 			*qdiv = bestdiv / 6;
2144 			*kdiv = 2;
2145 		} else if (bestdiv % 5 == 0) {
2146 			*pdiv = 5;
2147 			*qdiv = bestdiv / 10;
2148 			*kdiv = 2;
2149 		} else if (bestdiv % 14 == 0) {
2150 			*pdiv = 7;
2151 			*qdiv = bestdiv / 14;
2152 			*kdiv = 2;
2153 		}
2154 	} else {
2155 		if (bestdiv == 3 || bestdiv == 5 || bestdiv == 7) {
2156 			*pdiv = bestdiv;
2157 			*qdiv = 1;
2158 			*kdiv = 1;
2159 		} else { /* 9, 15, 21 */
2160 			*pdiv = bestdiv / 3;
2161 			*qdiv = 1;
2162 			*kdiv = 3;
2163 		}
2164 	}
2165 }
2166 
cnl_wrpll_params_populate(struct skl_wrpll_params * params,u32 dco_freq,u32 ref_freq,int pdiv,int qdiv,int kdiv)2167 static void cnl_wrpll_params_populate(struct skl_wrpll_params *params,
2168 				      u32 dco_freq, u32 ref_freq,
2169 				      int pdiv, int qdiv, int kdiv)
2170 {
2171 	u32 dco;
2172 
2173 	switch (kdiv) {
2174 	case 1:
2175 		params->kdiv = 1;
2176 		break;
2177 	case 2:
2178 		params->kdiv = 2;
2179 		break;
2180 	case 3:
2181 		params->kdiv = 4;
2182 		break;
2183 	default:
2184 		WARN(1, "Incorrect KDiv\n");
2185 	}
2186 
2187 	switch (pdiv) {
2188 	case 2:
2189 		params->pdiv = 1;
2190 		break;
2191 	case 3:
2192 		params->pdiv = 2;
2193 		break;
2194 	case 5:
2195 		params->pdiv = 4;
2196 		break;
2197 	case 7:
2198 		params->pdiv = 8;
2199 		break;
2200 	default:
2201 		WARN(1, "Incorrect PDiv\n");
2202 	}
2203 
2204 	WARN_ON(kdiv != 2 && qdiv != 1);
2205 
2206 	params->qdiv_ratio = qdiv;
2207 	params->qdiv_mode = (qdiv == 1) ? 0 : 1;
2208 
2209 	dco = div_u64((u64)dco_freq << 15, ref_freq);
2210 
2211 	params->dco_integer = dco >> 15;
2212 	params->dco_fraction = dco & 0x7fff;
2213 }
2214 
2215 static bool
cnl_ddi_calculate_wrpll(int clock,struct drm_i915_private * dev_priv,struct skl_wrpll_params * wrpll_params)2216 cnl_ddi_calculate_wrpll(int clock,
2217 			struct drm_i915_private *dev_priv,
2218 			struct skl_wrpll_params *wrpll_params)
2219 {
2220 	u32 afe_clock = clock * 5;
2221 	uint32_t ref_clock;
2222 	u32 dco_min = 7998000;
2223 	u32 dco_max = 10000000;
2224 	u32 dco_mid = (dco_min + dco_max) / 2;
2225 	static const int dividers[] = {  2,  4,  6,  8, 10, 12,  14,  16,
2226 					 18, 20, 24, 28, 30, 32,  36,  40,
2227 					 42, 44, 48, 50, 52, 54,  56,  60,
2228 					 64, 66, 68, 70, 72, 76,  78,  80,
2229 					 84, 88, 90, 92, 96, 98, 100, 102,
2230 					  3,  5,  7,  9, 15, 21 };
2231 	u32 dco, best_dco = 0, dco_centrality = 0;
2232 	u32 best_dco_centrality = U32_MAX; /* Spec meaning of 999999 MHz */
2233 	int d, best_div = 0, pdiv = 0, qdiv = 0, kdiv = 0;
2234 
2235 	for (d = 0; d < ARRAY_SIZE(dividers); d++) {
2236 		dco = afe_clock * dividers[d];
2237 
2238 		if ((dco <= dco_max) && (dco >= dco_min)) {
2239 			dco_centrality = abs(dco - dco_mid);
2240 
2241 			if (dco_centrality < best_dco_centrality) {
2242 				best_dco_centrality = dco_centrality;
2243 				best_div = dividers[d];
2244 				best_dco = dco;
2245 			}
2246 		}
2247 	}
2248 
2249 	if (best_div == 0)
2250 		return false;
2251 
2252 	cnl_wrpll_get_multipliers(best_div, &pdiv, &qdiv, &kdiv);
2253 
2254 	ref_clock = dev_priv->cdclk.hw.ref;
2255 
2256 	/*
2257 	 * For ICL, the spec states: if reference frequency is 38.4, use 19.2
2258 	 * because the DPLL automatically divides that by 2.
2259 	 */
2260 	if (IS_ICELAKE(dev_priv) && ref_clock == 38400)
2261 		ref_clock = 19200;
2262 
2263 	cnl_wrpll_params_populate(wrpll_params, best_dco, ref_clock, pdiv, qdiv,
2264 				  kdiv);
2265 
2266 	return true;
2267 }
2268 
cnl_ddi_hdmi_pll_dividers(struct intel_crtc * crtc,struct intel_crtc_state * crtc_state,int clock)2269 static bool cnl_ddi_hdmi_pll_dividers(struct intel_crtc *crtc,
2270 				      struct intel_crtc_state *crtc_state,
2271 				      int clock)
2272 {
2273 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
2274 	uint32_t cfgcr0, cfgcr1;
2275 	struct skl_wrpll_params wrpll_params = { 0, };
2276 
2277 	cfgcr0 = DPLL_CFGCR0_HDMI_MODE;
2278 
2279 	if (!cnl_ddi_calculate_wrpll(clock, dev_priv, &wrpll_params))
2280 		return false;
2281 
2282 	cfgcr0 |= DPLL_CFGCR0_DCO_FRACTION(wrpll_params.dco_fraction) |
2283 		wrpll_params.dco_integer;
2284 
2285 	cfgcr1 = DPLL_CFGCR1_QDIV_RATIO(wrpll_params.qdiv_ratio) |
2286 		DPLL_CFGCR1_QDIV_MODE(wrpll_params.qdiv_mode) |
2287 		DPLL_CFGCR1_KDIV(wrpll_params.kdiv) |
2288 		DPLL_CFGCR1_PDIV(wrpll_params.pdiv) |
2289 		DPLL_CFGCR1_CENTRAL_FREQ;
2290 
2291 	memset(&crtc_state->dpll_hw_state, 0,
2292 	       sizeof(crtc_state->dpll_hw_state));
2293 
2294 	crtc_state->dpll_hw_state.cfgcr0 = cfgcr0;
2295 	crtc_state->dpll_hw_state.cfgcr1 = cfgcr1;
2296 	return true;
2297 }
2298 
2299 static bool
cnl_ddi_dp_set_dpll_hw_state(int clock,struct intel_dpll_hw_state * dpll_hw_state)2300 cnl_ddi_dp_set_dpll_hw_state(int clock,
2301 			     struct intel_dpll_hw_state *dpll_hw_state)
2302 {
2303 	uint32_t cfgcr0;
2304 
2305 	cfgcr0 = DPLL_CFGCR0_SSC_ENABLE;
2306 
2307 	switch (clock / 2) {
2308 	case 81000:
2309 		cfgcr0 |= DPLL_CFGCR0_LINK_RATE_810;
2310 		break;
2311 	case 135000:
2312 		cfgcr0 |= DPLL_CFGCR0_LINK_RATE_1350;
2313 		break;
2314 	case 270000:
2315 		cfgcr0 |= DPLL_CFGCR0_LINK_RATE_2700;
2316 		break;
2317 		/* eDP 1.4 rates */
2318 	case 162000:
2319 		cfgcr0 |= DPLL_CFGCR0_LINK_RATE_1620;
2320 		break;
2321 	case 108000:
2322 		cfgcr0 |= DPLL_CFGCR0_LINK_RATE_1080;
2323 		break;
2324 	case 216000:
2325 		cfgcr0 |= DPLL_CFGCR0_LINK_RATE_2160;
2326 		break;
2327 	case 324000:
2328 		/* Some SKUs may require elevated I/O voltage to support this */
2329 		cfgcr0 |= DPLL_CFGCR0_LINK_RATE_3240;
2330 		break;
2331 	case 405000:
2332 		/* Some SKUs may require elevated I/O voltage to support this */
2333 		cfgcr0 |= DPLL_CFGCR0_LINK_RATE_4050;
2334 		break;
2335 	}
2336 
2337 	dpll_hw_state->cfgcr0 = cfgcr0;
2338 	return true;
2339 }
2340 
2341 static struct intel_shared_dpll *
cnl_get_dpll(struct intel_crtc * crtc,struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)2342 cnl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
2343 	     struct intel_encoder *encoder)
2344 {
2345 	struct intel_shared_dpll *pll;
2346 	int clock = crtc_state->port_clock;
2347 	bool bret;
2348 	struct intel_dpll_hw_state dpll_hw_state;
2349 
2350 	memset(&dpll_hw_state, 0, sizeof(dpll_hw_state));
2351 
2352 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
2353 		bret = cnl_ddi_hdmi_pll_dividers(crtc, crtc_state, clock);
2354 		if (!bret) {
2355 			DRM_DEBUG_KMS("Could not get HDMI pll dividers.\n");
2356 			return NULL;
2357 		}
2358 	} else if (intel_crtc_has_dp_encoder(crtc_state)) {
2359 		bret = cnl_ddi_dp_set_dpll_hw_state(clock, &dpll_hw_state);
2360 		if (!bret) {
2361 			DRM_DEBUG_KMS("Could not set DP dpll HW state.\n");
2362 			return NULL;
2363 		}
2364 		crtc_state->dpll_hw_state = dpll_hw_state;
2365 	} else {
2366 		DRM_DEBUG_KMS("Skip DPLL setup for output_types 0x%x\n",
2367 			      crtc_state->output_types);
2368 		return NULL;
2369 	}
2370 
2371 	pll = intel_find_shared_dpll(crtc, crtc_state,
2372 				     DPLL_ID_SKL_DPLL0,
2373 				     DPLL_ID_SKL_DPLL2);
2374 	if (!pll) {
2375 		DRM_DEBUG_KMS("No PLL selected\n");
2376 		return NULL;
2377 	}
2378 
2379 	intel_reference_shared_dpll(pll, crtc_state);
2380 
2381 	return pll;
2382 }
2383 
cnl_dump_hw_state(struct drm_i915_private * dev_priv,struct intel_dpll_hw_state * hw_state)2384 static void cnl_dump_hw_state(struct drm_i915_private *dev_priv,
2385 			      struct intel_dpll_hw_state *hw_state)
2386 {
2387 	DRM_DEBUG_KMS("dpll_hw_state: "
2388 		      "cfgcr0: 0x%x, cfgcr1: 0x%x\n",
2389 		      hw_state->cfgcr0,
2390 		      hw_state->cfgcr1);
2391 }
2392 
2393 static const struct intel_shared_dpll_funcs cnl_ddi_pll_funcs = {
2394 	.enable = cnl_ddi_pll_enable,
2395 	.disable = cnl_ddi_pll_disable,
2396 	.get_hw_state = cnl_ddi_pll_get_hw_state,
2397 };
2398 
2399 static const struct dpll_info cnl_plls[] = {
2400 	{ "DPLL 0", &cnl_ddi_pll_funcs, DPLL_ID_SKL_DPLL0, 0 },
2401 	{ "DPLL 1", &cnl_ddi_pll_funcs, DPLL_ID_SKL_DPLL1, 0 },
2402 	{ "DPLL 2", &cnl_ddi_pll_funcs, DPLL_ID_SKL_DPLL2, 0 },
2403 	{ },
2404 };
2405 
2406 static const struct intel_dpll_mgr cnl_pll_mgr = {
2407 	.dpll_info = cnl_plls,
2408 	.get_dpll = cnl_get_dpll,
2409 	.dump_hw_state = cnl_dump_hw_state,
2410 };
2411 
2412 /*
2413  * These values alrea already adjusted: they're the bits we write to the
2414  * registers, not the logical values.
2415  */
2416 static const struct skl_wrpll_params icl_dp_combo_pll_24MHz_values[] = {
2417 	{ .dco_integer = 0x151, .dco_fraction = 0x4000,		/* [0]: 5.4 */
2418 	  .pdiv = 0x2 /* 3 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0},
2419 	{ .dco_integer = 0x151, .dco_fraction = 0x4000,		/* [1]: 2.7 */
2420 	  .pdiv = 0x2 /* 3 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0},
2421 	{ .dco_integer = 0x151, .dco_fraction = 0x4000,		/* [2]: 1.62 */
2422 	  .pdiv = 0x4 /* 5 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0},
2423 	{ .dco_integer = 0x151, .dco_fraction = 0x4000,		/* [3]: 3.24 */
2424 	  .pdiv = 0x4 /* 5 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0},
2425 	{ .dco_integer = 0x168, .dco_fraction = 0x0000,		/* [4]: 2.16 */
2426 	  .pdiv = 0x1 /* 2 */, .kdiv = 2, .qdiv_mode = 1, .qdiv_ratio = 2},
2427 	{ .dco_integer = 0x168, .dco_fraction = 0x0000,		/* [5]: 4.32 */
2428 	  .pdiv = 0x1 /* 2 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0},
2429 	{ .dco_integer = 0x195, .dco_fraction = 0x0000,		/* [6]: 6.48 */
2430 	  .pdiv = 0x2 /* 3 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0},
2431 	{ .dco_integer = 0x151, .dco_fraction = 0x4000,		/* [7]: 8.1 */
2432 	  .pdiv = 0x1 /* 2 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0},
2433 };
2434 
2435 /* Also used for 38.4 MHz values. */
2436 static const struct skl_wrpll_params icl_dp_combo_pll_19_2MHz_values[] = {
2437 	{ .dco_integer = 0x1A5, .dco_fraction = 0x7000,		/* [0]: 5.4 */
2438 	  .pdiv = 0x2 /* 3 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0},
2439 	{ .dco_integer = 0x1A5, .dco_fraction = 0x7000,		/* [1]: 2.7 */
2440 	  .pdiv = 0x2 /* 3 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0},
2441 	{ .dco_integer = 0x1A5, .dco_fraction = 0x7000,		/* [2]: 1.62 */
2442 	  .pdiv = 0x4 /* 5 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0},
2443 	{ .dco_integer = 0x1A5, .dco_fraction = 0x7000,		/* [3]: 3.24 */
2444 	  .pdiv = 0x4 /* 5 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0},
2445 	{ .dco_integer = 0x1C2, .dco_fraction = 0x0000,		/* [4]: 2.16 */
2446 	  .pdiv = 0x1 /* 2 */, .kdiv = 2, .qdiv_mode = 1, .qdiv_ratio = 2},
2447 	{ .dco_integer = 0x1C2, .dco_fraction = 0x0000,		/* [5]: 4.32 */
2448 	  .pdiv = 0x1 /* 2 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0},
2449 	{ .dco_integer = 0x1FA, .dco_fraction = 0x2000,		/* [6]: 6.48 */
2450 	  .pdiv = 0x2 /* 3 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0},
2451 	{ .dco_integer = 0x1A5, .dco_fraction = 0x7000,		/* [7]: 8.1 */
2452 	  .pdiv = 0x1 /* 2 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0},
2453 };
2454 
icl_calc_dp_combo_pll(struct drm_i915_private * dev_priv,int clock,struct skl_wrpll_params * pll_params)2455 static bool icl_calc_dp_combo_pll(struct drm_i915_private *dev_priv, int clock,
2456 				  struct skl_wrpll_params *pll_params)
2457 {
2458 	const struct skl_wrpll_params *params;
2459 
2460 	params = dev_priv->cdclk.hw.ref == 24000 ?
2461 			icl_dp_combo_pll_24MHz_values :
2462 			icl_dp_combo_pll_19_2MHz_values;
2463 
2464 	switch (clock) {
2465 	case 540000:
2466 		*pll_params = params[0];
2467 		break;
2468 	case 270000:
2469 		*pll_params = params[1];
2470 		break;
2471 	case 162000:
2472 		*pll_params = params[2];
2473 		break;
2474 	case 324000:
2475 		*pll_params = params[3];
2476 		break;
2477 	case 216000:
2478 		*pll_params = params[4];
2479 		break;
2480 	case 432000:
2481 		*pll_params = params[5];
2482 		break;
2483 	case 648000:
2484 		*pll_params = params[6];
2485 		break;
2486 	case 810000:
2487 		*pll_params = params[7];
2488 		break;
2489 	default:
2490 		MISSING_CASE(clock);
2491 		return false;
2492 	}
2493 
2494 	return true;
2495 }
2496 
icl_calc_dpll_state(struct intel_crtc_state * crtc_state,struct intel_encoder * encoder,int clock,struct intel_dpll_hw_state * pll_state)2497 static bool icl_calc_dpll_state(struct intel_crtc_state *crtc_state,
2498 				struct intel_encoder *encoder, int clock,
2499 				struct intel_dpll_hw_state *pll_state)
2500 {
2501 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2502 	uint32_t cfgcr0, cfgcr1;
2503 	struct skl_wrpll_params pll_params = { 0 };
2504 	bool ret;
2505 
2506 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI))
2507 		ret = cnl_ddi_calculate_wrpll(clock, dev_priv, &pll_params);
2508 	else
2509 		ret = icl_calc_dp_combo_pll(dev_priv, clock, &pll_params);
2510 
2511 	if (!ret)
2512 		return false;
2513 
2514 	cfgcr0 = DPLL_CFGCR0_DCO_FRACTION(pll_params.dco_fraction) |
2515 		 pll_params.dco_integer;
2516 
2517 	cfgcr1 = DPLL_CFGCR1_QDIV_RATIO(pll_params.qdiv_ratio) |
2518 		 DPLL_CFGCR1_QDIV_MODE(pll_params.qdiv_mode) |
2519 		 DPLL_CFGCR1_KDIV(pll_params.kdiv) |
2520 		 DPLL_CFGCR1_PDIV(pll_params.pdiv) |
2521 		 DPLL_CFGCR1_CENTRAL_FREQ_8400;
2522 
2523 	pll_state->cfgcr0 = cfgcr0;
2524 	pll_state->cfgcr1 = cfgcr1;
2525 	return true;
2526 }
2527 
icl_calc_dp_combo_pll_link(struct drm_i915_private * dev_priv,uint32_t pll_id)2528 int icl_calc_dp_combo_pll_link(struct drm_i915_private *dev_priv,
2529 			       uint32_t pll_id)
2530 {
2531 	uint32_t cfgcr0, cfgcr1;
2532 	uint32_t pdiv, kdiv, qdiv_mode, qdiv_ratio, dco_integer, dco_fraction;
2533 	const struct skl_wrpll_params *params;
2534 	int index, n_entries, link_clock;
2535 
2536 	/* Read back values from DPLL CFGCR registers */
2537 	cfgcr0 = I915_READ(ICL_DPLL_CFGCR0(pll_id));
2538 	cfgcr1 = I915_READ(ICL_DPLL_CFGCR1(pll_id));
2539 
2540 	dco_integer = cfgcr0 & DPLL_CFGCR0_DCO_INTEGER_MASK;
2541 	dco_fraction = (cfgcr0 & DPLL_CFGCR0_DCO_FRACTION_MASK) >>
2542 		DPLL_CFGCR0_DCO_FRACTION_SHIFT;
2543 	pdiv = (cfgcr1 & DPLL_CFGCR1_PDIV_MASK) >> DPLL_CFGCR1_PDIV_SHIFT;
2544 	kdiv = (cfgcr1 & DPLL_CFGCR1_KDIV_MASK) >> DPLL_CFGCR1_KDIV_SHIFT;
2545 	qdiv_mode = (cfgcr1 & DPLL_CFGCR1_QDIV_MODE(1)) >>
2546 		DPLL_CFGCR1_QDIV_MODE_SHIFT;
2547 	qdiv_ratio = (cfgcr1 & DPLL_CFGCR1_QDIV_RATIO_MASK) >>
2548 		DPLL_CFGCR1_QDIV_RATIO_SHIFT;
2549 
2550 	params = dev_priv->cdclk.hw.ref == 24000 ?
2551 		icl_dp_combo_pll_24MHz_values :
2552 		icl_dp_combo_pll_19_2MHz_values;
2553 	n_entries = ARRAY_SIZE(icl_dp_combo_pll_24MHz_values);
2554 
2555 	for (index = 0; index < n_entries; index++) {
2556 		if (dco_integer == params[index].dco_integer &&
2557 		    dco_fraction == params[index].dco_fraction &&
2558 		    pdiv == params[index].pdiv &&
2559 		    kdiv == params[index].kdiv &&
2560 		    qdiv_mode == params[index].qdiv_mode &&
2561 		    qdiv_ratio == params[index].qdiv_ratio)
2562 			break;
2563 	}
2564 
2565 	/* Map PLL Index to Link Clock */
2566 	switch (index) {
2567 	default:
2568 		MISSING_CASE(index);
2569 		/* fall through */
2570 	case 0:
2571 		link_clock = 540000;
2572 		break;
2573 	case 1:
2574 		link_clock = 270000;
2575 		break;
2576 	case 2:
2577 		link_clock = 162000;
2578 		break;
2579 	case 3:
2580 		link_clock = 324000;
2581 		break;
2582 	case 4:
2583 		link_clock = 216000;
2584 		break;
2585 	case 5:
2586 		link_clock = 432000;
2587 		break;
2588 	case 6:
2589 		link_clock = 648000;
2590 		break;
2591 	case 7:
2592 		link_clock = 810000;
2593 		break;
2594 	}
2595 
2596 	return link_clock;
2597 }
2598 
icl_mg_pll_id_to_port(enum intel_dpll_id id)2599 static enum port icl_mg_pll_id_to_port(enum intel_dpll_id id)
2600 {
2601 	return id - DPLL_ID_ICL_MGPLL1 + PORT_C;
2602 }
2603 
icl_port_to_mg_pll_id(enum port port)2604 static enum intel_dpll_id icl_port_to_mg_pll_id(enum port port)
2605 {
2606 	return port - PORT_C + DPLL_ID_ICL_MGPLL1;
2607 }
2608 
icl_mg_pll_find_divisors(int clock_khz,bool is_dp,bool use_ssc,uint32_t * target_dco_khz,struct intel_dpll_hw_state * state)2609 static bool icl_mg_pll_find_divisors(int clock_khz, bool is_dp, bool use_ssc,
2610 				     uint32_t *target_dco_khz,
2611 				     struct intel_dpll_hw_state *state)
2612 {
2613 	uint32_t dco_min_freq, dco_max_freq;
2614 	int div1_vals[] = {7, 5, 3, 2};
2615 	unsigned int i;
2616 	int div2;
2617 
2618 	dco_min_freq = is_dp ? 8100000 : use_ssc ? 8000000 : 7992000;
2619 	dco_max_freq = is_dp ? 8100000 : 10000000;
2620 
2621 	for (i = 0; i < ARRAY_SIZE(div1_vals); i++) {
2622 		int div1 = div1_vals[i];
2623 
2624 		for (div2 = 10; div2 > 0; div2--) {
2625 			int dco = div1 * div2 * clock_khz * 5;
2626 			int a_divratio, tlinedrv, inputsel, hsdiv;
2627 
2628 			if (dco < dco_min_freq || dco > dco_max_freq)
2629 				continue;
2630 
2631 			if (div2 >= 2) {
2632 				a_divratio = is_dp ? 10 : 5;
2633 				tlinedrv = 2;
2634 			} else {
2635 				a_divratio = 5;
2636 				tlinedrv = 0;
2637 			}
2638 			inputsel = is_dp ? 0 : 1;
2639 
2640 			switch (div1) {
2641 			default:
2642 				MISSING_CASE(div1);
2643 				/* fall through */
2644 			case 2:
2645 				hsdiv = 0;
2646 				break;
2647 			case 3:
2648 				hsdiv = 1;
2649 				break;
2650 			case 5:
2651 				hsdiv = 2;
2652 				break;
2653 			case 7:
2654 				hsdiv = 3;
2655 				break;
2656 			}
2657 
2658 			*target_dco_khz = dco;
2659 
2660 			state->mg_refclkin_ctl = MG_REFCLKIN_CTL_OD_2_MUX(1);
2661 
2662 			state->mg_clktop2_coreclkctl1 =
2663 				MG_CLKTOP2_CORECLKCTL1_A_DIVRATIO(a_divratio);
2664 
2665 			state->mg_clktop2_hsclkctl =
2666 				MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL(tlinedrv) |
2667 				MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL(inputsel) |
2668 				MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO(hsdiv) |
2669 				MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO(div2);
2670 
2671 			return true;
2672 		}
2673 	}
2674 
2675 	return false;
2676 }
2677 
2678 /*
2679  * The specification for this function uses real numbers, so the math had to be
2680  * adapted to integer-only calculation, that's why it looks so different.
2681  */
icl_calc_mg_pll_state(struct intel_crtc_state * crtc_state,struct intel_encoder * encoder,int clock,struct intel_dpll_hw_state * pll_state)2682 static bool icl_calc_mg_pll_state(struct intel_crtc_state *crtc_state,
2683 				  struct intel_encoder *encoder, int clock,
2684 				  struct intel_dpll_hw_state *pll_state)
2685 {
2686 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2687 	int refclk_khz = dev_priv->cdclk.hw.ref;
2688 	uint32_t dco_khz, m1div, m2div_int, m2div_rem, m2div_frac;
2689 	uint32_t iref_ndiv, iref_trim, iref_pulse_w;
2690 	uint32_t prop_coeff, int_coeff;
2691 	uint32_t tdc_targetcnt, feedfwgain;
2692 	uint64_t ssc_stepsize, ssc_steplen, ssc_steplog;
2693 	uint64_t tmp;
2694 	bool use_ssc = false;
2695 	bool is_dp = !intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI);
2696 
2697 	if (!icl_mg_pll_find_divisors(clock, is_dp, use_ssc, &dco_khz,
2698 				      pll_state)) {
2699 		DRM_DEBUG_KMS("Failed to find divisors for clock %d\n", clock);
2700 		return false;
2701 	}
2702 
2703 	m1div = 2;
2704 	m2div_int = dco_khz / (refclk_khz * m1div);
2705 	if (m2div_int > 255) {
2706 		m1div = 4;
2707 		m2div_int = dco_khz / (refclk_khz * m1div);
2708 		if (m2div_int > 255) {
2709 			DRM_DEBUG_KMS("Failed to find mdiv for clock %d\n",
2710 				      clock);
2711 			return false;
2712 		}
2713 	}
2714 	m2div_rem = dco_khz % (refclk_khz * m1div);
2715 
2716 	tmp = (uint64_t)m2div_rem * (1 << 22);
2717 	do_div(tmp, refclk_khz * m1div);
2718 	m2div_frac = tmp;
2719 
2720 	switch (refclk_khz) {
2721 	case 19200:
2722 		iref_ndiv = 1;
2723 		iref_trim = 28;
2724 		iref_pulse_w = 1;
2725 		break;
2726 	case 24000:
2727 		iref_ndiv = 1;
2728 		iref_trim = 25;
2729 		iref_pulse_w = 2;
2730 		break;
2731 	case 38400:
2732 		iref_ndiv = 2;
2733 		iref_trim = 28;
2734 		iref_pulse_w = 1;
2735 		break;
2736 	default:
2737 		MISSING_CASE(refclk_khz);
2738 		return false;
2739 	}
2740 
2741 	/*
2742 	 * tdc_res = 0.000003
2743 	 * tdc_targetcnt = int(2 / (tdc_res * 8 * 50 * 1.1) / refclk_mhz + 0.5)
2744 	 *
2745 	 * The multiplication by 1000 is due to refclk MHz to KHz conversion. It
2746 	 * was supposed to be a division, but we rearranged the operations of
2747 	 * the formula to avoid early divisions so we don't multiply the
2748 	 * rounding errors.
2749 	 *
2750 	 * 0.000003 * 8 * 50 * 1.1 = 0.00132, also known as 132 / 100000, which
2751 	 * we also rearrange to work with integers.
2752 	 *
2753 	 * The 0.5 transformed to 5 results in a multiplication by 10 and the
2754 	 * last division by 10.
2755 	 */
2756 	tdc_targetcnt = (2 * 1000 * 100000 * 10 / (132 * refclk_khz) + 5) / 10;
2757 
2758 	/*
2759 	 * Here we divide dco_khz by 10 in order to allow the dividend to fit in
2760 	 * 32 bits. That's not a problem since we round the division down
2761 	 * anyway.
2762 	 */
2763 	feedfwgain = (use_ssc || m2div_rem > 0) ?
2764 		m1div * 1000000 * 100 / (dco_khz * 3 / 10) : 0;
2765 
2766 	if (dco_khz >= 9000000) {
2767 		prop_coeff = 5;
2768 		int_coeff = 10;
2769 	} else {
2770 		prop_coeff = 4;
2771 		int_coeff = 8;
2772 	}
2773 
2774 	if (use_ssc) {
2775 		tmp = (uint64_t)dco_khz * 47 * 32;
2776 		do_div(tmp, refclk_khz * m1div * 10000);
2777 		ssc_stepsize = tmp;
2778 
2779 		tmp = (uint64_t)dco_khz * 1000;
2780 		ssc_steplen = DIV_ROUND_UP_ULL(tmp, 32 * 2 * 32);
2781 	} else {
2782 		ssc_stepsize = 0;
2783 		ssc_steplen = 0;
2784 	}
2785 	ssc_steplog = 4;
2786 
2787 	pll_state->mg_pll_div0 = (m2div_rem > 0 ? MG_PLL_DIV0_FRACNEN_H : 0) |
2788 				  MG_PLL_DIV0_FBDIV_FRAC(m2div_frac) |
2789 				  MG_PLL_DIV0_FBDIV_INT(m2div_int);
2790 
2791 	pll_state->mg_pll_div1 = MG_PLL_DIV1_IREF_NDIVRATIO(iref_ndiv) |
2792 				 MG_PLL_DIV1_DITHER_DIV_2 |
2793 				 MG_PLL_DIV1_NDIVRATIO(1) |
2794 				 MG_PLL_DIV1_FBPREDIV(m1div);
2795 
2796 	pll_state->mg_pll_lf = MG_PLL_LF_TDCTARGETCNT(tdc_targetcnt) |
2797 			       MG_PLL_LF_AFCCNTSEL_512 |
2798 			       MG_PLL_LF_GAINCTRL(1) |
2799 			       MG_PLL_LF_INT_COEFF(int_coeff) |
2800 			       MG_PLL_LF_PROP_COEFF(prop_coeff);
2801 
2802 	pll_state->mg_pll_frac_lock = MG_PLL_FRAC_LOCK_TRUELOCK_CRIT_32 |
2803 				      MG_PLL_FRAC_LOCK_EARLYLOCK_CRIT_32 |
2804 				      MG_PLL_FRAC_LOCK_LOCKTHRESH(10) |
2805 				      MG_PLL_FRAC_LOCK_DCODITHEREN |
2806 				      MG_PLL_FRAC_LOCK_FEEDFWRDGAIN(feedfwgain);
2807 	if (use_ssc || m2div_rem > 0)
2808 		pll_state->mg_pll_frac_lock |= MG_PLL_FRAC_LOCK_FEEDFWRDCAL_EN;
2809 
2810 	pll_state->mg_pll_ssc = (use_ssc ? MG_PLL_SSC_EN : 0) |
2811 				MG_PLL_SSC_TYPE(2) |
2812 				MG_PLL_SSC_STEPLENGTH(ssc_steplen) |
2813 				MG_PLL_SSC_STEPNUM(ssc_steplog) |
2814 				MG_PLL_SSC_FLLEN |
2815 				MG_PLL_SSC_STEPSIZE(ssc_stepsize);
2816 
2817 	pll_state->mg_pll_tdc_coldst_bias = MG_PLL_TDC_COLDST_COLDSTART |
2818 					    MG_PLL_TDC_COLDST_IREFINT_EN |
2819 					    MG_PLL_TDC_COLDST_REFBIAS_START_PULSE_W(iref_pulse_w) |
2820 					    MG_PLL_TDC_TDCOVCCORR_EN |
2821 					    MG_PLL_TDC_TDCSEL(3);
2822 
2823 	pll_state->mg_pll_bias = MG_PLL_BIAS_BIAS_GB_SEL(3) |
2824 				 MG_PLL_BIAS_INIT_DCOAMP(0x3F) |
2825 				 MG_PLL_BIAS_BIAS_BONUS(10) |
2826 				 MG_PLL_BIAS_BIASCAL_EN |
2827 				 MG_PLL_BIAS_CTRIM(12) |
2828 				 MG_PLL_BIAS_VREF_RDAC(4) |
2829 				 MG_PLL_BIAS_IREFTRIM(iref_trim);
2830 
2831 	if (refclk_khz == 38400) {
2832 		pll_state->mg_pll_tdc_coldst_bias_mask = MG_PLL_TDC_COLDST_COLDSTART;
2833 		pll_state->mg_pll_bias_mask = 0;
2834 	} else {
2835 		pll_state->mg_pll_tdc_coldst_bias_mask = -1U;
2836 		pll_state->mg_pll_bias_mask = -1U;
2837 	}
2838 
2839 	pll_state->mg_pll_tdc_coldst_bias &= pll_state->mg_pll_tdc_coldst_bias_mask;
2840 	pll_state->mg_pll_bias &= pll_state->mg_pll_bias_mask;
2841 
2842 	return true;
2843 }
2844 
2845 static struct intel_shared_dpll *
icl_get_dpll(struct intel_crtc * crtc,struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)2846 icl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
2847 	     struct intel_encoder *encoder)
2848 {
2849 	struct intel_shared_dpll *pll;
2850 	struct intel_dpll_hw_state pll_state = {};
2851 	enum port port = encoder->port;
2852 	enum intel_dpll_id min, max;
2853 	int clock = crtc_state->port_clock;
2854 	bool ret;
2855 
2856 	switch (port) {
2857 	case PORT_A:
2858 	case PORT_B:
2859 		min = DPLL_ID_ICL_DPLL0;
2860 		max = DPLL_ID_ICL_DPLL1;
2861 		ret = icl_calc_dpll_state(crtc_state, encoder, clock,
2862 					  &pll_state);
2863 		break;
2864 	case PORT_C:
2865 	case PORT_D:
2866 	case PORT_E:
2867 	case PORT_F:
2868 		if (0 /* TODO: TBT PLLs */) {
2869 			min = DPLL_ID_ICL_TBTPLL;
2870 			max = min;
2871 			ret = icl_calc_dpll_state(crtc_state, encoder, clock,
2872 						  &pll_state);
2873 		} else {
2874 			min = icl_port_to_mg_pll_id(port);
2875 			max = min;
2876 			ret = icl_calc_mg_pll_state(crtc_state, encoder, clock,
2877 						    &pll_state);
2878 		}
2879 		break;
2880 	default:
2881 		MISSING_CASE(port);
2882 		return NULL;
2883 	}
2884 
2885 	if (!ret) {
2886 		DRM_DEBUG_KMS("Could not calculate PLL state.\n");
2887 		return NULL;
2888 	}
2889 
2890 	crtc_state->dpll_hw_state = pll_state;
2891 
2892 	pll = intel_find_shared_dpll(crtc, crtc_state, min, max);
2893 	if (!pll) {
2894 		DRM_DEBUG_KMS("No PLL selected\n");
2895 		return NULL;
2896 	}
2897 
2898 	intel_reference_shared_dpll(pll, crtc_state);
2899 
2900 	return pll;
2901 }
2902 
icl_pll_id_to_enable_reg(enum intel_dpll_id id)2903 static i915_reg_t icl_pll_id_to_enable_reg(enum intel_dpll_id id)
2904 {
2905 	switch (id) {
2906 	default:
2907 		MISSING_CASE(id);
2908 		/* fall through */
2909 	case DPLL_ID_ICL_DPLL0:
2910 	case DPLL_ID_ICL_DPLL1:
2911 		return CNL_DPLL_ENABLE(id);
2912 	case DPLL_ID_ICL_TBTPLL:
2913 		return TBT_PLL_ENABLE;
2914 	case DPLL_ID_ICL_MGPLL1:
2915 	case DPLL_ID_ICL_MGPLL2:
2916 	case DPLL_ID_ICL_MGPLL3:
2917 	case DPLL_ID_ICL_MGPLL4:
2918 		return MG_PLL_ENABLE(icl_mg_pll_id_to_port(id));
2919 	}
2920 }
2921 
icl_pll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)2922 static bool icl_pll_get_hw_state(struct drm_i915_private *dev_priv,
2923 				 struct intel_shared_dpll *pll,
2924 				 struct intel_dpll_hw_state *hw_state)
2925 {
2926 	const enum intel_dpll_id id = pll->info->id;
2927 	uint32_t val;
2928 	enum port port;
2929 	bool ret = false;
2930 
2931 	if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
2932 		return false;
2933 
2934 	val = I915_READ(icl_pll_id_to_enable_reg(id));
2935 	if (!(val & PLL_ENABLE))
2936 		goto out;
2937 
2938 	switch (id) {
2939 	case DPLL_ID_ICL_DPLL0:
2940 	case DPLL_ID_ICL_DPLL1:
2941 	case DPLL_ID_ICL_TBTPLL:
2942 		hw_state->cfgcr0 = I915_READ(ICL_DPLL_CFGCR0(id));
2943 		hw_state->cfgcr1 = I915_READ(ICL_DPLL_CFGCR1(id));
2944 		break;
2945 	case DPLL_ID_ICL_MGPLL1:
2946 	case DPLL_ID_ICL_MGPLL2:
2947 	case DPLL_ID_ICL_MGPLL3:
2948 	case DPLL_ID_ICL_MGPLL4:
2949 		port = icl_mg_pll_id_to_port(id);
2950 		hw_state->mg_refclkin_ctl = I915_READ(MG_REFCLKIN_CTL(port));
2951 		hw_state->mg_refclkin_ctl &= MG_REFCLKIN_CTL_OD_2_MUX_MASK;
2952 
2953 		hw_state->mg_clktop2_coreclkctl1 =
2954 			I915_READ(MG_CLKTOP2_CORECLKCTL1(port));
2955 		hw_state->mg_clktop2_coreclkctl1 &=
2956 			MG_CLKTOP2_CORECLKCTL1_A_DIVRATIO_MASK;
2957 
2958 		hw_state->mg_clktop2_hsclkctl =
2959 			I915_READ(MG_CLKTOP2_HSCLKCTL(port));
2960 		hw_state->mg_clktop2_hsclkctl &=
2961 			MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL_MASK |
2962 			MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL_MASK |
2963 			MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK |
2964 			MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK;
2965 
2966 		hw_state->mg_pll_div0 = I915_READ(MG_PLL_DIV0(port));
2967 		hw_state->mg_pll_div1 = I915_READ(MG_PLL_DIV1(port));
2968 		hw_state->mg_pll_lf = I915_READ(MG_PLL_LF(port));
2969 		hw_state->mg_pll_frac_lock = I915_READ(MG_PLL_FRAC_LOCK(port));
2970 		hw_state->mg_pll_ssc = I915_READ(MG_PLL_SSC(port));
2971 
2972 		hw_state->mg_pll_bias = I915_READ(MG_PLL_BIAS(port));
2973 		hw_state->mg_pll_tdc_coldst_bias =
2974 			I915_READ(MG_PLL_TDC_COLDST_BIAS(port));
2975 
2976 		if (dev_priv->cdclk.hw.ref == 38400) {
2977 			hw_state->mg_pll_tdc_coldst_bias_mask = MG_PLL_TDC_COLDST_COLDSTART;
2978 			hw_state->mg_pll_bias_mask = 0;
2979 		} else {
2980 			hw_state->mg_pll_tdc_coldst_bias_mask = -1U;
2981 			hw_state->mg_pll_bias_mask = -1U;
2982 		}
2983 
2984 		hw_state->mg_pll_tdc_coldst_bias &= hw_state->mg_pll_tdc_coldst_bias_mask;
2985 		hw_state->mg_pll_bias &= hw_state->mg_pll_bias_mask;
2986 		break;
2987 	default:
2988 		MISSING_CASE(id);
2989 	}
2990 
2991 	ret = true;
2992 out:
2993 	intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
2994 	return ret;
2995 }
2996 
icl_dpll_write(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)2997 static void icl_dpll_write(struct drm_i915_private *dev_priv,
2998 			   struct intel_shared_dpll *pll)
2999 {
3000 	struct intel_dpll_hw_state *hw_state = &pll->state.hw_state;
3001 	const enum intel_dpll_id id = pll->info->id;
3002 
3003 	I915_WRITE(ICL_DPLL_CFGCR0(id), hw_state->cfgcr0);
3004 	I915_WRITE(ICL_DPLL_CFGCR1(id), hw_state->cfgcr1);
3005 	POSTING_READ(ICL_DPLL_CFGCR1(id));
3006 }
3007 
icl_mg_pll_write(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)3008 static void icl_mg_pll_write(struct drm_i915_private *dev_priv,
3009 			     struct intel_shared_dpll *pll)
3010 {
3011 	struct intel_dpll_hw_state *hw_state = &pll->state.hw_state;
3012 	enum port port = icl_mg_pll_id_to_port(pll->info->id);
3013 	u32 val;
3014 
3015 	/*
3016 	 * Some of the following registers have reserved fields, so program
3017 	 * these with RMW based on a mask. The mask can be fixed or generated
3018 	 * during the calc/readout phase if the mask depends on some other HW
3019 	 * state like refclk, see icl_calc_mg_pll_state().
3020 	 */
3021 	val = I915_READ(MG_REFCLKIN_CTL(port));
3022 	val &= ~MG_REFCLKIN_CTL_OD_2_MUX_MASK;
3023 	val |= hw_state->mg_refclkin_ctl;
3024 	I915_WRITE(MG_REFCLKIN_CTL(port), val);
3025 
3026 	val = I915_READ(MG_CLKTOP2_CORECLKCTL1(port));
3027 	val &= ~MG_CLKTOP2_CORECLKCTL1_A_DIVRATIO_MASK;
3028 	val |= hw_state->mg_clktop2_coreclkctl1;
3029 	I915_WRITE(MG_CLKTOP2_CORECLKCTL1(port), val);
3030 
3031 	val = I915_READ(MG_CLKTOP2_HSCLKCTL(port));
3032 	val &= ~(MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL_MASK |
3033 		 MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL_MASK |
3034 		 MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK |
3035 		 MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK);
3036 	val |= hw_state->mg_clktop2_hsclkctl;
3037 	I915_WRITE(MG_CLKTOP2_HSCLKCTL(port), val);
3038 
3039 	I915_WRITE(MG_PLL_DIV0(port), hw_state->mg_pll_div0);
3040 	I915_WRITE(MG_PLL_DIV1(port), hw_state->mg_pll_div1);
3041 	I915_WRITE(MG_PLL_LF(port), hw_state->mg_pll_lf);
3042 	I915_WRITE(MG_PLL_FRAC_LOCK(port), hw_state->mg_pll_frac_lock);
3043 	I915_WRITE(MG_PLL_SSC(port), hw_state->mg_pll_ssc);
3044 
3045 	val = I915_READ(MG_PLL_BIAS(port));
3046 	val &= ~hw_state->mg_pll_bias_mask;
3047 	val |= hw_state->mg_pll_bias;
3048 	I915_WRITE(MG_PLL_BIAS(port), val);
3049 
3050 	val = I915_READ(MG_PLL_TDC_COLDST_BIAS(port));
3051 	val &= ~hw_state->mg_pll_tdc_coldst_bias_mask;
3052 	val |= hw_state->mg_pll_tdc_coldst_bias;
3053 	I915_WRITE(MG_PLL_TDC_COLDST_BIAS(port), val);
3054 
3055 	POSTING_READ(MG_PLL_TDC_COLDST_BIAS(port));
3056 }
3057 
icl_pll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)3058 static void icl_pll_enable(struct drm_i915_private *dev_priv,
3059 			   struct intel_shared_dpll *pll)
3060 {
3061 	const enum intel_dpll_id id = pll->info->id;
3062 	i915_reg_t enable_reg = icl_pll_id_to_enable_reg(id);
3063 	uint32_t val;
3064 
3065 	val = I915_READ(enable_reg);
3066 	val |= PLL_POWER_ENABLE;
3067 	I915_WRITE(enable_reg, val);
3068 
3069 	/*
3070 	 * The spec says we need to "wait" but it also says it should be
3071 	 * immediate.
3072 	 */
3073 	if (intel_wait_for_register(dev_priv, enable_reg, PLL_POWER_STATE,
3074 				    PLL_POWER_STATE, 1))
3075 		DRM_ERROR("PLL %d Power not enabled\n", id);
3076 
3077 	switch (id) {
3078 	case DPLL_ID_ICL_DPLL0:
3079 	case DPLL_ID_ICL_DPLL1:
3080 	case DPLL_ID_ICL_TBTPLL:
3081 		icl_dpll_write(dev_priv, pll);
3082 		break;
3083 	case DPLL_ID_ICL_MGPLL1:
3084 	case DPLL_ID_ICL_MGPLL2:
3085 	case DPLL_ID_ICL_MGPLL3:
3086 	case DPLL_ID_ICL_MGPLL4:
3087 		icl_mg_pll_write(dev_priv, pll);
3088 		break;
3089 	default:
3090 		MISSING_CASE(id);
3091 	}
3092 
3093 	/*
3094 	 * DVFS pre sequence would be here, but in our driver the cdclk code
3095 	 * paths should already be setting the appropriate voltage, hence we do
3096 	 * nothign here.
3097 	 */
3098 
3099 	val = I915_READ(enable_reg);
3100 	val |= PLL_ENABLE;
3101 	I915_WRITE(enable_reg, val);
3102 
3103 	if (intel_wait_for_register(dev_priv, enable_reg, PLL_LOCK, PLL_LOCK,
3104 				    1)) /* 600us actually. */
3105 		DRM_ERROR("PLL %d not locked\n", id);
3106 
3107 	/* DVFS post sequence would be here. See the comment above. */
3108 }
3109 
icl_pll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)3110 static void icl_pll_disable(struct drm_i915_private *dev_priv,
3111 			    struct intel_shared_dpll *pll)
3112 {
3113 	const enum intel_dpll_id id = pll->info->id;
3114 	i915_reg_t enable_reg = icl_pll_id_to_enable_reg(id);
3115 	uint32_t val;
3116 
3117 	/* The first steps are done by intel_ddi_post_disable(). */
3118 
3119 	/*
3120 	 * DVFS pre sequence would be here, but in our driver the cdclk code
3121 	 * paths should already be setting the appropriate voltage, hence we do
3122 	 * nothign here.
3123 	 */
3124 
3125 	val = I915_READ(enable_reg);
3126 	val &= ~PLL_ENABLE;
3127 	I915_WRITE(enable_reg, val);
3128 
3129 	/* Timeout is actually 1us. */
3130 	if (intel_wait_for_register(dev_priv, enable_reg, PLL_LOCK, 0, 1))
3131 		DRM_ERROR("PLL %d locked\n", id);
3132 
3133 	/* DVFS post sequence would be here. See the comment above. */
3134 
3135 	val = I915_READ(enable_reg);
3136 	val &= ~PLL_POWER_ENABLE;
3137 	I915_WRITE(enable_reg, val);
3138 
3139 	/*
3140 	 * The spec says we need to "wait" but it also says it should be
3141 	 * immediate.
3142 	 */
3143 	if (intel_wait_for_register(dev_priv, enable_reg, PLL_POWER_STATE, 0,
3144 				    1))
3145 		DRM_ERROR("PLL %d Power not disabled\n", id);
3146 }
3147 
icl_dump_hw_state(struct drm_i915_private * dev_priv,struct intel_dpll_hw_state * hw_state)3148 static void icl_dump_hw_state(struct drm_i915_private *dev_priv,
3149 			      struct intel_dpll_hw_state *hw_state)
3150 {
3151 	DRM_DEBUG_KMS("dpll_hw_state: cfgcr0: 0x%x, cfgcr1: 0x%x, "
3152 		      "mg_refclkin_ctl: 0x%x, hg_clktop2_coreclkctl1: 0x%x, "
3153 		      "mg_clktop2_hsclkctl: 0x%x, mg_pll_div0: 0x%x, "
3154 		      "mg_pll_div2: 0x%x, mg_pll_lf: 0x%x, "
3155 		      "mg_pll_frac_lock: 0x%x, mg_pll_ssc: 0x%x, "
3156 		      "mg_pll_bias: 0x%x, mg_pll_tdc_coldst_bias: 0x%x\n",
3157 		      hw_state->cfgcr0, hw_state->cfgcr1,
3158 		      hw_state->mg_refclkin_ctl,
3159 		      hw_state->mg_clktop2_coreclkctl1,
3160 		      hw_state->mg_clktop2_hsclkctl,
3161 		      hw_state->mg_pll_div0,
3162 		      hw_state->mg_pll_div1,
3163 		      hw_state->mg_pll_lf,
3164 		      hw_state->mg_pll_frac_lock,
3165 		      hw_state->mg_pll_ssc,
3166 		      hw_state->mg_pll_bias,
3167 		      hw_state->mg_pll_tdc_coldst_bias);
3168 }
3169 
3170 static const struct intel_shared_dpll_funcs icl_pll_funcs = {
3171 	.enable = icl_pll_enable,
3172 	.disable = icl_pll_disable,
3173 	.get_hw_state = icl_pll_get_hw_state,
3174 };
3175 
3176 static const struct dpll_info icl_plls[] = {
3177 	{ "DPLL 0",   &icl_pll_funcs, DPLL_ID_ICL_DPLL0,  0 },
3178 	{ "DPLL 1",   &icl_pll_funcs, DPLL_ID_ICL_DPLL1,  0 },
3179 	{ "TBT PLL",  &icl_pll_funcs, DPLL_ID_ICL_TBTPLL, 0 },
3180 	{ "MG PLL 1", &icl_pll_funcs, DPLL_ID_ICL_MGPLL1, 0 },
3181 	{ "MG PLL 2", &icl_pll_funcs, DPLL_ID_ICL_MGPLL2, 0 },
3182 	{ "MG PLL 3", &icl_pll_funcs, DPLL_ID_ICL_MGPLL3, 0 },
3183 	{ "MG PLL 4", &icl_pll_funcs, DPLL_ID_ICL_MGPLL4, 0 },
3184 	{ },
3185 };
3186 
3187 static const struct intel_dpll_mgr icl_pll_mgr = {
3188 	.dpll_info = icl_plls,
3189 	.get_dpll = icl_get_dpll,
3190 	.dump_hw_state = icl_dump_hw_state,
3191 };
3192 
3193 /**
3194  * intel_shared_dpll_init - Initialize shared DPLLs
3195  * @dev: drm device
3196  *
3197  * Initialize shared DPLLs for @dev.
3198  */
intel_shared_dpll_init(struct drm_device * dev)3199 void intel_shared_dpll_init(struct drm_device *dev)
3200 {
3201 	struct drm_i915_private *dev_priv = to_i915(dev);
3202 	const struct intel_dpll_mgr *dpll_mgr = NULL;
3203 	const struct dpll_info *dpll_info;
3204 	int i;
3205 
3206 	if (IS_ICELAKE(dev_priv))
3207 		dpll_mgr = &icl_pll_mgr;
3208 	else if (IS_CANNONLAKE(dev_priv))
3209 		dpll_mgr = &cnl_pll_mgr;
3210 	else if (IS_GEN9_BC(dev_priv))
3211 		dpll_mgr = &skl_pll_mgr;
3212 	else if (IS_GEN9_LP(dev_priv))
3213 		dpll_mgr = &bxt_pll_mgr;
3214 	else if (HAS_DDI(dev_priv))
3215 		dpll_mgr = &hsw_pll_mgr;
3216 	else if (HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv))
3217 		dpll_mgr = &pch_pll_mgr;
3218 
3219 	if (!dpll_mgr) {
3220 		dev_priv->num_shared_dpll = 0;
3221 		return;
3222 	}
3223 
3224 	dpll_info = dpll_mgr->dpll_info;
3225 
3226 	for (i = 0; dpll_info[i].name; i++) {
3227 		WARN_ON(i != dpll_info[i].id);
3228 		dev_priv->shared_dplls[i].info = &dpll_info[i];
3229 	}
3230 
3231 	dev_priv->dpll_mgr = dpll_mgr;
3232 	dev_priv->num_shared_dpll = i;
3233 	mutex_init(&dev_priv->dpll_lock);
3234 
3235 	BUG_ON(dev_priv->num_shared_dpll > I915_NUM_PLLS);
3236 
3237 	/* FIXME: Move this to a more suitable place */
3238 	if (HAS_DDI(dev_priv))
3239 		intel_ddi_pll_init(dev);
3240 }
3241 
3242 /**
3243  * intel_get_shared_dpll - get a shared DPLL for CRTC and encoder combination
3244  * @crtc: CRTC
3245  * @crtc_state: atomic state for @crtc
3246  * @encoder: encoder
3247  *
3248  * Find an appropriate DPLL for the given CRTC and encoder combination. A
3249  * reference from the @crtc to the returned pll is registered in the atomic
3250  * state. That configuration is made effective by calling
3251  * intel_shared_dpll_swap_state(). The reference should be released by calling
3252  * intel_release_shared_dpll().
3253  *
3254  * Returns:
3255  * A shared DPLL to be used by @crtc and @encoder with the given @crtc_state.
3256  */
3257 struct intel_shared_dpll *
intel_get_shared_dpll(struct intel_crtc * crtc,struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)3258 intel_get_shared_dpll(struct intel_crtc *crtc,
3259 		      struct intel_crtc_state *crtc_state,
3260 		      struct intel_encoder *encoder)
3261 {
3262 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
3263 	const struct intel_dpll_mgr *dpll_mgr = dev_priv->dpll_mgr;
3264 
3265 	if (WARN_ON(!dpll_mgr))
3266 		return NULL;
3267 
3268 	return dpll_mgr->get_dpll(crtc, crtc_state, encoder);
3269 }
3270 
3271 /**
3272  * intel_release_shared_dpll - end use of DPLL by CRTC in atomic state
3273  * @dpll: dpll in use by @crtc
3274  * @crtc: crtc
3275  * @state: atomic state
3276  *
3277  * This function releases the reference from @crtc to @dpll from the
3278  * atomic @state. The new configuration is made effective by calling
3279  * intel_shared_dpll_swap_state().
3280  */
intel_release_shared_dpll(struct intel_shared_dpll * dpll,struct intel_crtc * crtc,struct drm_atomic_state * state)3281 void intel_release_shared_dpll(struct intel_shared_dpll *dpll,
3282 			       struct intel_crtc *crtc,
3283 			       struct drm_atomic_state *state)
3284 {
3285 	struct intel_shared_dpll_state *shared_dpll_state;
3286 
3287 	shared_dpll_state = intel_atomic_get_shared_dpll_state(state);
3288 	shared_dpll_state[dpll->info->id].crtc_mask &= ~(1 << crtc->pipe);
3289 }
3290 
3291 /**
3292  * intel_shared_dpll_dump_hw_state - write hw_state to dmesg
3293  * @dev_priv: i915 drm device
3294  * @hw_state: hw state to be written to the log
3295  *
3296  * Write the relevant values in @hw_state to dmesg using DRM_DEBUG_KMS.
3297  */
intel_dpll_dump_hw_state(struct drm_i915_private * dev_priv,struct intel_dpll_hw_state * hw_state)3298 void intel_dpll_dump_hw_state(struct drm_i915_private *dev_priv,
3299 			      struct intel_dpll_hw_state *hw_state)
3300 {
3301 	if (dev_priv->dpll_mgr) {
3302 		dev_priv->dpll_mgr->dump_hw_state(dev_priv, hw_state);
3303 	} else {
3304 		/* fallback for platforms that don't use the shared dpll
3305 		 * infrastructure
3306 		 */
3307 		DRM_DEBUG_KMS("dpll_hw_state: dpll: 0x%x, dpll_md: 0x%x, "
3308 			      "fp0: 0x%x, fp1: 0x%x\n",
3309 			      hw_state->dpll,
3310 			      hw_state->dpll_md,
3311 			      hw_state->fp0,
3312 			      hw_state->fp1);
3313 	}
3314 }
3315