• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <linux/math.h>
25 #include <linux/string_helpers.h>
26 
27 #include "i915_reg.h"
28 #include "intel_de.h"
29 #include "intel_display_types.h"
30 #include "intel_dkl_phy.h"
31 #include "intel_dkl_phy_regs.h"
32 #include "intel_dpio_phy.h"
33 #include "intel_dpll.h"
34 #include "intel_dpll_mgr.h"
35 #include "intel_hti.h"
36 #include "intel_mg_phy_regs.h"
37 #include "intel_pch_refclk.h"
38 #include "intel_tc.h"
39 
40 /**
41  * DOC: Display PLLs
42  *
43  * Display PLLs used for driving outputs vary by platform. While some have
44  * per-pipe or per-encoder dedicated PLLs, others allow the use of any PLL
45  * from a pool. In the latter scenario, it is possible that multiple pipes
46  * share a PLL if their configurations match.
47  *
48  * This file provides an abstraction over display PLLs. The function
49  * intel_shared_dpll_init() initializes the PLLs for the given platform.  The
50  * users of a PLL are tracked and that tracking is integrated with the atomic
51  * modset interface. During an atomic operation, required PLLs can be reserved
52  * for a given CRTC and encoder configuration by calling
53  * intel_reserve_shared_dplls() and previously reserved PLLs can be released
54  * with intel_release_shared_dplls().
55  * Changes to the users are first staged in the atomic state, and then made
56  * effective by calling intel_shared_dpll_swap_state() during the atomic
57  * commit phase.
58  */
59 
60 /* platform specific hooks for managing DPLLs */
61 struct intel_shared_dpll_funcs {
62 	/*
63 	 * Hook for enabling the pll, called from intel_enable_shared_dpll() if
64 	 * the pll is not already enabled.
65 	 */
66 	void (*enable)(struct drm_i915_private *i915,
67 		       struct intel_shared_dpll *pll);
68 
69 	/*
70 	 * Hook for disabling the pll, called from intel_disable_shared_dpll()
71 	 * only when it is safe to disable the pll, i.e., there are no more
72 	 * tracked users for it.
73 	 */
74 	void (*disable)(struct drm_i915_private *i915,
75 			struct intel_shared_dpll *pll);
76 
77 	/*
78 	 * Hook for reading the values currently programmed to the DPLL
79 	 * registers. This is used for initial hw state readout and state
80 	 * verification after a mode set.
81 	 */
82 	bool (*get_hw_state)(struct drm_i915_private *i915,
83 			     struct intel_shared_dpll *pll,
84 			     struct intel_dpll_hw_state *hw_state);
85 
86 	/*
87 	 * Hook for calculating the pll's output frequency based on its passed
88 	 * in state.
89 	 */
90 	int (*get_freq)(struct drm_i915_private *i915,
91 			const struct intel_shared_dpll *pll,
92 			const struct intel_dpll_hw_state *pll_state);
93 };
94 
95 struct intel_dpll_mgr {
96 	const struct dpll_info *dpll_info;
97 
98 	int (*compute_dplls)(struct intel_atomic_state *state,
99 			     struct intel_crtc *crtc,
100 			     struct intel_encoder *encoder);
101 	int (*get_dplls)(struct intel_atomic_state *state,
102 			 struct intel_crtc *crtc,
103 			 struct intel_encoder *encoder);
104 	void (*put_dplls)(struct intel_atomic_state *state,
105 			  struct intel_crtc *crtc);
106 	void (*update_active_dpll)(struct intel_atomic_state *state,
107 				   struct intel_crtc *crtc,
108 				   struct intel_encoder *encoder);
109 	void (*update_ref_clks)(struct drm_i915_private *i915);
110 	void (*dump_hw_state)(struct drm_i915_private *dev_priv,
111 			      const struct intel_dpll_hw_state *hw_state);
112 };
113 
114 static void
intel_atomic_duplicate_dpll_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll_state * shared_dpll)115 intel_atomic_duplicate_dpll_state(struct drm_i915_private *dev_priv,
116 				  struct intel_shared_dpll_state *shared_dpll)
117 {
118 	enum intel_dpll_id i;
119 
120 	/* Copy shared dpll state */
121 	for (i = 0; i < dev_priv->display.dpll.num_shared_dpll; i++) {
122 		struct intel_shared_dpll *pll = &dev_priv->display.dpll.shared_dplls[i];
123 
124 		shared_dpll[i] = pll->state;
125 	}
126 }
127 
128 static struct intel_shared_dpll_state *
intel_atomic_get_shared_dpll_state(struct drm_atomic_state * s)129 intel_atomic_get_shared_dpll_state(struct drm_atomic_state *s)
130 {
131 	struct intel_atomic_state *state = to_intel_atomic_state(s);
132 
133 	drm_WARN_ON(s->dev, !drm_modeset_is_locked(&s->dev->mode_config.connection_mutex));
134 
135 	if (!state->dpll_set) {
136 		state->dpll_set = true;
137 
138 		intel_atomic_duplicate_dpll_state(to_i915(s->dev),
139 						  state->shared_dpll);
140 	}
141 
142 	return state->shared_dpll;
143 }
144 
145 /**
146  * intel_get_shared_dpll_by_id - get a DPLL given its id
147  * @dev_priv: i915 device instance
148  * @id: pll id
149  *
150  * Returns:
151  * A pointer to the DPLL with @id
152  */
153 struct intel_shared_dpll *
intel_get_shared_dpll_by_id(struct drm_i915_private * dev_priv,enum intel_dpll_id id)154 intel_get_shared_dpll_by_id(struct drm_i915_private *dev_priv,
155 			    enum intel_dpll_id id)
156 {
157 	return &dev_priv->display.dpll.shared_dplls[id];
158 }
159 
160 /* For ILK+ */
assert_shared_dpll(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,bool state)161 void assert_shared_dpll(struct drm_i915_private *dev_priv,
162 			struct intel_shared_dpll *pll,
163 			bool state)
164 {
165 	bool cur_state;
166 	struct intel_dpll_hw_state hw_state;
167 
168 	if (drm_WARN(&dev_priv->drm, !pll,
169 		     "asserting DPLL %s with no DPLL\n", str_on_off(state)))
170 		return;
171 
172 	cur_state = intel_dpll_get_hw_state(dev_priv, pll, &hw_state);
173 	I915_STATE_WARN(dev_priv, cur_state != state,
174 			"%s assertion failure (expected %s, current %s)\n",
175 			pll->info->name, str_on_off(state),
176 			str_on_off(cur_state));
177 }
178 
icl_pll_id_to_tc_port(enum intel_dpll_id id)179 static enum tc_port icl_pll_id_to_tc_port(enum intel_dpll_id id)
180 {
181 	return TC_PORT_1 + id - DPLL_ID_ICL_MGPLL1;
182 }
183 
icl_tc_port_to_pll_id(enum tc_port tc_port)184 enum intel_dpll_id icl_tc_port_to_pll_id(enum tc_port tc_port)
185 {
186 	return tc_port - TC_PORT_1 + DPLL_ID_ICL_MGPLL1;
187 }
188 
189 static i915_reg_t
intel_combo_pll_enable_reg(struct drm_i915_private * i915,struct intel_shared_dpll * pll)190 intel_combo_pll_enable_reg(struct drm_i915_private *i915,
191 			   struct intel_shared_dpll *pll)
192 {
193 	if (IS_DG1(i915))
194 		return DG1_DPLL_ENABLE(pll->info->id);
195 	else if ((IS_JASPERLAKE(i915) || IS_ELKHARTLAKE(i915)) &&
196 		 (pll->info->id == DPLL_ID_EHL_DPLL4))
197 		return MG_PLL_ENABLE(0);
198 
199 	return ICL_DPLL_ENABLE(pll->info->id);
200 }
201 
202 static i915_reg_t
intel_tc_pll_enable_reg(struct drm_i915_private * i915,struct intel_shared_dpll * pll)203 intel_tc_pll_enable_reg(struct drm_i915_private *i915,
204 			struct intel_shared_dpll *pll)
205 {
206 	const enum intel_dpll_id id = pll->info->id;
207 	enum tc_port tc_port = icl_pll_id_to_tc_port(id);
208 
209 	if (IS_ALDERLAKE_P(i915))
210 		return ADLP_PORTTC_PLL_ENABLE(tc_port);
211 
212 	return MG_PLL_ENABLE(tc_port);
213 }
214 
215 /**
216  * intel_enable_shared_dpll - enable a CRTC's shared DPLL
217  * @crtc_state: CRTC, and its state, which has a shared DPLL
218  *
219  * Enable the shared DPLL used by @crtc.
220  */
intel_enable_shared_dpll(const struct intel_crtc_state * crtc_state)221 void intel_enable_shared_dpll(const struct intel_crtc_state *crtc_state)
222 {
223 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
224 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
225 	struct intel_shared_dpll *pll = crtc_state->shared_dpll;
226 	unsigned int pipe_mask = BIT(crtc->pipe);
227 	unsigned int old_mask;
228 
229 	if (drm_WARN_ON(&dev_priv->drm, pll == NULL))
230 		return;
231 
232 	mutex_lock(&dev_priv->display.dpll.lock);
233 	old_mask = pll->active_mask;
234 
235 	if (drm_WARN_ON(&dev_priv->drm, !(pll->state.pipe_mask & pipe_mask)) ||
236 	    drm_WARN_ON(&dev_priv->drm, pll->active_mask & pipe_mask))
237 		goto out;
238 
239 	pll->active_mask |= pipe_mask;
240 
241 	drm_dbg_kms(&dev_priv->drm,
242 		    "enable %s (active 0x%x, on? %d) for [CRTC:%d:%s]\n",
243 		    pll->info->name, pll->active_mask, pll->on,
244 		    crtc->base.base.id, crtc->base.name);
245 
246 	if (old_mask) {
247 		drm_WARN_ON(&dev_priv->drm, !pll->on);
248 		assert_shared_dpll_enabled(dev_priv, pll);
249 		goto out;
250 	}
251 	drm_WARN_ON(&dev_priv->drm, pll->on);
252 
253 	drm_dbg_kms(&dev_priv->drm, "enabling %s\n", pll->info->name);
254 	pll->info->funcs->enable(dev_priv, pll);
255 	pll->on = true;
256 
257 out:
258 	mutex_unlock(&dev_priv->display.dpll.lock);
259 }
260 
261 /**
262  * intel_disable_shared_dpll - disable a CRTC's shared DPLL
263  * @crtc_state: CRTC, and its state, which has a shared DPLL
264  *
265  * Disable the shared DPLL used by @crtc.
266  */
intel_disable_shared_dpll(const struct intel_crtc_state * crtc_state)267 void intel_disable_shared_dpll(const struct intel_crtc_state *crtc_state)
268 {
269 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
270 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
271 	struct intel_shared_dpll *pll = crtc_state->shared_dpll;
272 	unsigned int pipe_mask = BIT(crtc->pipe);
273 
274 	/* PCH only available on ILK+ */
275 	if (DISPLAY_VER(dev_priv) < 5)
276 		return;
277 
278 	if (pll == NULL)
279 		return;
280 
281 	mutex_lock(&dev_priv->display.dpll.lock);
282 	if (drm_WARN(&dev_priv->drm, !(pll->active_mask & pipe_mask),
283 		     "%s not used by [CRTC:%d:%s]\n", pll->info->name,
284 		     crtc->base.base.id, crtc->base.name))
285 		goto out;
286 
287 	drm_dbg_kms(&dev_priv->drm,
288 		    "disable %s (active 0x%x, on? %d) for [CRTC:%d:%s]\n",
289 		    pll->info->name, pll->active_mask, pll->on,
290 		    crtc->base.base.id, crtc->base.name);
291 
292 	assert_shared_dpll_enabled(dev_priv, pll);
293 	drm_WARN_ON(&dev_priv->drm, !pll->on);
294 
295 	pll->active_mask &= ~pipe_mask;
296 	if (pll->active_mask)
297 		goto out;
298 
299 	drm_dbg_kms(&dev_priv->drm, "disabling %s\n", pll->info->name);
300 	pll->info->funcs->disable(dev_priv, pll);
301 	pll->on = false;
302 
303 out:
304 	mutex_unlock(&dev_priv->display.dpll.lock);
305 }
306 
307 static struct intel_shared_dpll *
intel_find_shared_dpll(struct intel_atomic_state * state,const struct intel_crtc * crtc,const struct intel_dpll_hw_state * pll_state,unsigned long dpll_mask)308 intel_find_shared_dpll(struct intel_atomic_state *state,
309 		       const struct intel_crtc *crtc,
310 		       const struct intel_dpll_hw_state *pll_state,
311 		       unsigned long dpll_mask)
312 {
313 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
314 	struct intel_shared_dpll *pll, *unused_pll = NULL;
315 	struct intel_shared_dpll_state *shared_dpll;
316 	enum intel_dpll_id i;
317 
318 	shared_dpll = intel_atomic_get_shared_dpll_state(&state->base);
319 
320 	drm_WARN_ON(&dev_priv->drm, dpll_mask & ~(BIT(I915_NUM_PLLS) - 1));
321 
322 	for_each_set_bit(i, &dpll_mask, I915_NUM_PLLS) {
323 		pll = &dev_priv->display.dpll.shared_dplls[i];
324 
325 		/* Only want to check enabled timings first */
326 		if (shared_dpll[i].pipe_mask == 0) {
327 			if (!unused_pll)
328 				unused_pll = pll;
329 			continue;
330 		}
331 
332 		if (memcmp(pll_state,
333 			   &shared_dpll[i].hw_state,
334 			   sizeof(*pll_state)) == 0) {
335 			drm_dbg_kms(&dev_priv->drm,
336 				    "[CRTC:%d:%s] sharing existing %s (pipe mask 0x%x, active 0x%x)\n",
337 				    crtc->base.base.id, crtc->base.name,
338 				    pll->info->name,
339 				    shared_dpll[i].pipe_mask,
340 				    pll->active_mask);
341 			return pll;
342 		}
343 	}
344 
345 	/* Ok no matching timings, maybe there's a free one? */
346 	if (unused_pll) {
347 		drm_dbg_kms(&dev_priv->drm, "[CRTC:%d:%s] allocated %s\n",
348 			    crtc->base.base.id, crtc->base.name,
349 			    unused_pll->info->name);
350 		return unused_pll;
351 	}
352 
353 	return NULL;
354 }
355 
356 /**
357  * intel_reference_shared_dpll_crtc - Get a DPLL reference for a CRTC
358  * @crtc: CRTC on which behalf the reference is taken
359  * @pll: DPLL for which the reference is taken
360  * @shared_dpll_state: the DPLL atomic state in which the reference is tracked
361  *
362  * Take a reference for @pll tracking the use of it by @crtc.
363  */
364 static void
intel_reference_shared_dpll_crtc(const struct intel_crtc * crtc,const struct intel_shared_dpll * pll,struct intel_shared_dpll_state * shared_dpll_state)365 intel_reference_shared_dpll_crtc(const struct intel_crtc *crtc,
366 				 const struct intel_shared_dpll *pll,
367 				 struct intel_shared_dpll_state *shared_dpll_state)
368 {
369 	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
370 
371 	drm_WARN_ON(&i915->drm, (shared_dpll_state->pipe_mask & BIT(crtc->pipe)) != 0);
372 
373 	shared_dpll_state->pipe_mask |= BIT(crtc->pipe);
374 
375 	drm_dbg_kms(&i915->drm, "[CRTC:%d:%s] reserving %s\n",
376 		    crtc->base.base.id, crtc->base.name, pll->info->name);
377 }
378 
379 static void
intel_reference_shared_dpll(struct intel_atomic_state * state,const struct intel_crtc * crtc,const struct intel_shared_dpll * pll,const struct intel_dpll_hw_state * pll_state)380 intel_reference_shared_dpll(struct intel_atomic_state *state,
381 			    const struct intel_crtc *crtc,
382 			    const struct intel_shared_dpll *pll,
383 			    const struct intel_dpll_hw_state *pll_state)
384 {
385 	struct intel_shared_dpll_state *shared_dpll;
386 	const enum intel_dpll_id id = pll->info->id;
387 
388 	shared_dpll = intel_atomic_get_shared_dpll_state(&state->base);
389 
390 	if (shared_dpll[id].pipe_mask == 0)
391 		shared_dpll[id].hw_state = *pll_state;
392 
393 	intel_reference_shared_dpll_crtc(crtc, pll, &shared_dpll[id]);
394 }
395 
396 /**
397  * intel_unreference_shared_dpll_crtc - Drop a DPLL reference for a CRTC
398  * @crtc: CRTC on which behalf the reference is dropped
399  * @pll: DPLL for which the reference is dropped
400  * @shared_dpll_state: the DPLL atomic state in which the reference is tracked
401  *
402  * Drop a reference for @pll tracking the end of use of it by @crtc.
403  */
404 void
intel_unreference_shared_dpll_crtc(const struct intel_crtc * crtc,const struct intel_shared_dpll * pll,struct intel_shared_dpll_state * shared_dpll_state)405 intel_unreference_shared_dpll_crtc(const struct intel_crtc *crtc,
406 				   const struct intel_shared_dpll *pll,
407 				   struct intel_shared_dpll_state *shared_dpll_state)
408 {
409 	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
410 
411 	drm_WARN_ON(&i915->drm, (shared_dpll_state->pipe_mask & BIT(crtc->pipe)) == 0);
412 
413 	shared_dpll_state->pipe_mask &= ~BIT(crtc->pipe);
414 
415 	drm_dbg_kms(&i915->drm, "[CRTC:%d:%s] releasing %s\n",
416 		    crtc->base.base.id, crtc->base.name, pll->info->name);
417 }
418 
intel_unreference_shared_dpll(struct intel_atomic_state * state,const struct intel_crtc * crtc,const struct intel_shared_dpll * pll)419 static void intel_unreference_shared_dpll(struct intel_atomic_state *state,
420 					  const struct intel_crtc *crtc,
421 					  const struct intel_shared_dpll *pll)
422 {
423 	struct intel_shared_dpll_state *shared_dpll;
424 	const enum intel_dpll_id id = pll->info->id;
425 
426 	shared_dpll = intel_atomic_get_shared_dpll_state(&state->base);
427 
428 	intel_unreference_shared_dpll_crtc(crtc, pll, &shared_dpll[id]);
429 }
430 
intel_put_dpll(struct intel_atomic_state * state,struct intel_crtc * crtc)431 static void intel_put_dpll(struct intel_atomic_state *state,
432 			   struct intel_crtc *crtc)
433 {
434 	const struct intel_crtc_state *old_crtc_state =
435 		intel_atomic_get_old_crtc_state(state, crtc);
436 	struct intel_crtc_state *new_crtc_state =
437 		intel_atomic_get_new_crtc_state(state, crtc);
438 
439 	new_crtc_state->shared_dpll = NULL;
440 
441 	if (!old_crtc_state->shared_dpll)
442 		return;
443 
444 	intel_unreference_shared_dpll(state, crtc, old_crtc_state->shared_dpll);
445 }
446 
447 /**
448  * intel_shared_dpll_swap_state - make atomic DPLL configuration effective
449  * @state: atomic state
450  *
451  * This is the dpll version of drm_atomic_helper_swap_state() since the
452  * helper does not handle driver-specific global state.
453  *
454  * For consistency with atomic helpers this function does a complete swap,
455  * i.e. it also puts the current state into @state, even though there is no
456  * need for that at this moment.
457  */
intel_shared_dpll_swap_state(struct intel_atomic_state * state)458 void intel_shared_dpll_swap_state(struct intel_atomic_state *state)
459 {
460 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
461 	struct intel_shared_dpll_state *shared_dpll = state->shared_dpll;
462 	enum intel_dpll_id i;
463 
464 	if (!state->dpll_set)
465 		return;
466 
467 	for (i = 0; i < dev_priv->display.dpll.num_shared_dpll; i++) {
468 		struct intel_shared_dpll *pll =
469 			&dev_priv->display.dpll.shared_dplls[i];
470 
471 		swap(pll->state, shared_dpll[i]);
472 	}
473 }
474 
ibx_pch_dpll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)475 static bool ibx_pch_dpll_get_hw_state(struct drm_i915_private *dev_priv,
476 				      struct intel_shared_dpll *pll,
477 				      struct intel_dpll_hw_state *hw_state)
478 {
479 	const enum intel_dpll_id id = pll->info->id;
480 	intel_wakeref_t wakeref;
481 	u32 val;
482 
483 	wakeref = intel_display_power_get_if_enabled(dev_priv,
484 						     POWER_DOMAIN_DISPLAY_CORE);
485 	if (!wakeref)
486 		return false;
487 
488 	val = intel_de_read(dev_priv, PCH_DPLL(id));
489 	hw_state->dpll = val;
490 	hw_state->fp0 = intel_de_read(dev_priv, PCH_FP0(id));
491 	hw_state->fp1 = intel_de_read(dev_priv, PCH_FP1(id));
492 
493 	intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
494 
495 	return val & DPLL_VCO_ENABLE;
496 }
497 
ibx_assert_pch_refclk_enabled(struct drm_i915_private * dev_priv)498 static void ibx_assert_pch_refclk_enabled(struct drm_i915_private *dev_priv)
499 {
500 	u32 val;
501 	bool enabled;
502 
503 	val = intel_de_read(dev_priv, PCH_DREF_CONTROL);
504 	enabled = !!(val & (DREF_SSC_SOURCE_MASK | DREF_NONSPREAD_SOURCE_MASK |
505 			    DREF_SUPERSPREAD_SOURCE_MASK));
506 	I915_STATE_WARN(dev_priv, !enabled,
507 			"PCH refclk assertion failure, should be active but is disabled\n");
508 }
509 
ibx_pch_dpll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)510 static void ibx_pch_dpll_enable(struct drm_i915_private *dev_priv,
511 				struct intel_shared_dpll *pll)
512 {
513 	const enum intel_dpll_id id = pll->info->id;
514 
515 	/* PCH refclock must be enabled first */
516 	ibx_assert_pch_refclk_enabled(dev_priv);
517 
518 	intel_de_write(dev_priv, PCH_FP0(id), pll->state.hw_state.fp0);
519 	intel_de_write(dev_priv, PCH_FP1(id), pll->state.hw_state.fp1);
520 
521 	intel_de_write(dev_priv, PCH_DPLL(id), pll->state.hw_state.dpll);
522 
523 	/* Wait for the clocks to stabilize. */
524 	intel_de_posting_read(dev_priv, PCH_DPLL(id));
525 	udelay(150);
526 
527 	/* The pixel multiplier can only be updated once the
528 	 * DPLL is enabled and the clocks are stable.
529 	 *
530 	 * So write it again.
531 	 */
532 	intel_de_write(dev_priv, PCH_DPLL(id), pll->state.hw_state.dpll);
533 	intel_de_posting_read(dev_priv, PCH_DPLL(id));
534 	udelay(200);
535 }
536 
ibx_pch_dpll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)537 static void ibx_pch_dpll_disable(struct drm_i915_private *dev_priv,
538 				 struct intel_shared_dpll *pll)
539 {
540 	const enum intel_dpll_id id = pll->info->id;
541 
542 	intel_de_write(dev_priv, PCH_DPLL(id), 0);
543 	intel_de_posting_read(dev_priv, PCH_DPLL(id));
544 	udelay(200);
545 }
546 
ibx_compute_dpll(struct intel_atomic_state * state,struct intel_crtc * crtc,struct intel_encoder * encoder)547 static int ibx_compute_dpll(struct intel_atomic_state *state,
548 			    struct intel_crtc *crtc,
549 			    struct intel_encoder *encoder)
550 {
551 	return 0;
552 }
553 
ibx_get_dpll(struct intel_atomic_state * state,struct intel_crtc * crtc,struct intel_encoder * encoder)554 static int ibx_get_dpll(struct intel_atomic_state *state,
555 			struct intel_crtc *crtc,
556 			struct intel_encoder *encoder)
557 {
558 	struct intel_crtc_state *crtc_state =
559 		intel_atomic_get_new_crtc_state(state, crtc);
560 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
561 	struct intel_shared_dpll *pll;
562 	enum intel_dpll_id i;
563 
564 	if (HAS_PCH_IBX(dev_priv)) {
565 		/* Ironlake PCH has a fixed PLL->PCH pipe mapping. */
566 		i = (enum intel_dpll_id) crtc->pipe;
567 		pll = &dev_priv->display.dpll.shared_dplls[i];
568 
569 		drm_dbg_kms(&dev_priv->drm,
570 			    "[CRTC:%d:%s] using pre-allocated %s\n",
571 			    crtc->base.base.id, crtc->base.name,
572 			    pll->info->name);
573 	} else {
574 		pll = intel_find_shared_dpll(state, crtc,
575 					     &crtc_state->dpll_hw_state,
576 					     BIT(DPLL_ID_PCH_PLL_B) |
577 					     BIT(DPLL_ID_PCH_PLL_A));
578 	}
579 
580 	if (!pll)
581 		return -EINVAL;
582 
583 	/* reference the pll */
584 	intel_reference_shared_dpll(state, crtc,
585 				    pll, &crtc_state->dpll_hw_state);
586 
587 	crtc_state->shared_dpll = pll;
588 
589 	return 0;
590 }
591 
ibx_dump_hw_state(struct drm_i915_private * dev_priv,const struct intel_dpll_hw_state * hw_state)592 static void ibx_dump_hw_state(struct drm_i915_private *dev_priv,
593 			      const struct intel_dpll_hw_state *hw_state)
594 {
595 	drm_dbg_kms(&dev_priv->drm,
596 		    "dpll_hw_state: dpll: 0x%x, dpll_md: 0x%x, "
597 		    "fp0: 0x%x, fp1: 0x%x\n",
598 		    hw_state->dpll,
599 		    hw_state->dpll_md,
600 		    hw_state->fp0,
601 		    hw_state->fp1);
602 }
603 
604 static const struct intel_shared_dpll_funcs ibx_pch_dpll_funcs = {
605 	.enable = ibx_pch_dpll_enable,
606 	.disable = ibx_pch_dpll_disable,
607 	.get_hw_state = ibx_pch_dpll_get_hw_state,
608 };
609 
610 static const struct dpll_info pch_plls[] = {
611 	{ "PCH DPLL A", &ibx_pch_dpll_funcs, DPLL_ID_PCH_PLL_A, 0 },
612 	{ "PCH DPLL B", &ibx_pch_dpll_funcs, DPLL_ID_PCH_PLL_B, 0 },
613 	{ },
614 };
615 
616 static const struct intel_dpll_mgr pch_pll_mgr = {
617 	.dpll_info = pch_plls,
618 	.compute_dplls = ibx_compute_dpll,
619 	.get_dplls = ibx_get_dpll,
620 	.put_dplls = intel_put_dpll,
621 	.dump_hw_state = ibx_dump_hw_state,
622 };
623 
hsw_ddi_wrpll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)624 static void hsw_ddi_wrpll_enable(struct drm_i915_private *dev_priv,
625 				 struct intel_shared_dpll *pll)
626 {
627 	const enum intel_dpll_id id = pll->info->id;
628 
629 	intel_de_write(dev_priv, WRPLL_CTL(id), pll->state.hw_state.wrpll);
630 	intel_de_posting_read(dev_priv, WRPLL_CTL(id));
631 	udelay(20);
632 }
633 
hsw_ddi_spll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)634 static void hsw_ddi_spll_enable(struct drm_i915_private *dev_priv,
635 				struct intel_shared_dpll *pll)
636 {
637 	intel_de_write(dev_priv, SPLL_CTL, pll->state.hw_state.spll);
638 	intel_de_posting_read(dev_priv, SPLL_CTL);
639 	udelay(20);
640 }
641 
hsw_ddi_wrpll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)642 static void hsw_ddi_wrpll_disable(struct drm_i915_private *dev_priv,
643 				  struct intel_shared_dpll *pll)
644 {
645 	const enum intel_dpll_id id = pll->info->id;
646 
647 	intel_de_rmw(dev_priv, WRPLL_CTL(id), WRPLL_PLL_ENABLE, 0);
648 	intel_de_posting_read(dev_priv, WRPLL_CTL(id));
649 
650 	/*
651 	 * Try to set up the PCH reference clock once all DPLLs
652 	 * that depend on it have been shut down.
653 	 */
654 	if (dev_priv->display.dpll.pch_ssc_use & BIT(id))
655 		intel_init_pch_refclk(dev_priv);
656 }
657 
hsw_ddi_spll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)658 static void hsw_ddi_spll_disable(struct drm_i915_private *dev_priv,
659 				 struct intel_shared_dpll *pll)
660 {
661 	enum intel_dpll_id id = pll->info->id;
662 
663 	intel_de_rmw(dev_priv, SPLL_CTL, SPLL_PLL_ENABLE, 0);
664 	intel_de_posting_read(dev_priv, SPLL_CTL);
665 
666 	/*
667 	 * Try to set up the PCH reference clock once all DPLLs
668 	 * that depend on it have been shut down.
669 	 */
670 	if (dev_priv->display.dpll.pch_ssc_use & BIT(id))
671 		intel_init_pch_refclk(dev_priv);
672 }
673 
hsw_ddi_wrpll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)674 static bool hsw_ddi_wrpll_get_hw_state(struct drm_i915_private *dev_priv,
675 				       struct intel_shared_dpll *pll,
676 				       struct intel_dpll_hw_state *hw_state)
677 {
678 	const enum intel_dpll_id id = pll->info->id;
679 	intel_wakeref_t wakeref;
680 	u32 val;
681 
682 	wakeref = intel_display_power_get_if_enabled(dev_priv,
683 						     POWER_DOMAIN_DISPLAY_CORE);
684 	if (!wakeref)
685 		return false;
686 
687 	val = intel_de_read(dev_priv, WRPLL_CTL(id));
688 	hw_state->wrpll = val;
689 
690 	intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
691 
692 	return val & WRPLL_PLL_ENABLE;
693 }
694 
hsw_ddi_spll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)695 static bool hsw_ddi_spll_get_hw_state(struct drm_i915_private *dev_priv,
696 				      struct intel_shared_dpll *pll,
697 				      struct intel_dpll_hw_state *hw_state)
698 {
699 	intel_wakeref_t wakeref;
700 	u32 val;
701 
702 	wakeref = intel_display_power_get_if_enabled(dev_priv,
703 						     POWER_DOMAIN_DISPLAY_CORE);
704 	if (!wakeref)
705 		return false;
706 
707 	val = intel_de_read(dev_priv, SPLL_CTL);
708 	hw_state->spll = val;
709 
710 	intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
711 
712 	return val & SPLL_PLL_ENABLE;
713 }
714 
715 #define LC_FREQ 2700
716 #define LC_FREQ_2K U64_C(LC_FREQ * 2000)
717 
718 #define P_MIN 2
719 #define P_MAX 64
720 #define P_INC 2
721 
722 /* Constraints for PLL good behavior */
723 #define REF_MIN 48
724 #define REF_MAX 400
725 #define VCO_MIN 2400
726 #define VCO_MAX 4800
727 
728 struct hsw_wrpll_rnp {
729 	unsigned p, n2, r2;
730 };
731 
hsw_wrpll_get_budget_for_freq(int clock)732 static unsigned hsw_wrpll_get_budget_for_freq(int clock)
733 {
734 	switch (clock) {
735 	case 25175000:
736 	case 25200000:
737 	case 27000000:
738 	case 27027000:
739 	case 37762500:
740 	case 37800000:
741 	case 40500000:
742 	case 40541000:
743 	case 54000000:
744 	case 54054000:
745 	case 59341000:
746 	case 59400000:
747 	case 72000000:
748 	case 74176000:
749 	case 74250000:
750 	case 81000000:
751 	case 81081000:
752 	case 89012000:
753 	case 89100000:
754 	case 108000000:
755 	case 108108000:
756 	case 111264000:
757 	case 111375000:
758 	case 148352000:
759 	case 148500000:
760 	case 162000000:
761 	case 162162000:
762 	case 222525000:
763 	case 222750000:
764 	case 296703000:
765 	case 297000000:
766 		return 0;
767 	case 233500000:
768 	case 245250000:
769 	case 247750000:
770 	case 253250000:
771 	case 298000000:
772 		return 1500;
773 	case 169128000:
774 	case 169500000:
775 	case 179500000:
776 	case 202000000:
777 		return 2000;
778 	case 256250000:
779 	case 262500000:
780 	case 270000000:
781 	case 272500000:
782 	case 273750000:
783 	case 280750000:
784 	case 281250000:
785 	case 286000000:
786 	case 291750000:
787 		return 4000;
788 	case 267250000:
789 	case 268500000:
790 		return 5000;
791 	default:
792 		return 1000;
793 	}
794 }
795 
hsw_wrpll_update_rnp(u64 freq2k,unsigned int budget,unsigned int r2,unsigned int n2,unsigned int p,struct hsw_wrpll_rnp * best)796 static void hsw_wrpll_update_rnp(u64 freq2k, unsigned int budget,
797 				 unsigned int r2, unsigned int n2,
798 				 unsigned int p,
799 				 struct hsw_wrpll_rnp *best)
800 {
801 	u64 a, b, c, d, diff, diff_best;
802 
803 	/* No best (r,n,p) yet */
804 	if (best->p == 0) {
805 		best->p = p;
806 		best->n2 = n2;
807 		best->r2 = r2;
808 		return;
809 	}
810 
811 	/*
812 	 * Output clock is (LC_FREQ_2K / 2000) * N / (P * R), which compares to
813 	 * freq2k.
814 	 *
815 	 * delta = 1e6 *
816 	 *	   abs(freq2k - (LC_FREQ_2K * n2/(p * r2))) /
817 	 *	   freq2k;
818 	 *
819 	 * and we would like delta <= budget.
820 	 *
821 	 * If the discrepancy is above the PPM-based budget, always prefer to
822 	 * improve upon the previous solution.  However, if you're within the
823 	 * budget, try to maximize Ref * VCO, that is N / (P * R^2).
824 	 */
825 	a = freq2k * budget * p * r2;
826 	b = freq2k * budget * best->p * best->r2;
827 	diff = abs_diff(freq2k * p * r2, LC_FREQ_2K * n2);
828 	diff_best = abs_diff(freq2k * best->p * best->r2,
829 			     LC_FREQ_2K * best->n2);
830 	c = 1000000 * diff;
831 	d = 1000000 * diff_best;
832 
833 	if (a < c && b < d) {
834 		/* If both are above the budget, pick the closer */
835 		if (best->p * best->r2 * diff < p * r2 * diff_best) {
836 			best->p = p;
837 			best->n2 = n2;
838 			best->r2 = r2;
839 		}
840 	} else if (a >= c && b < d) {
841 		/* If A is below the threshold but B is above it?  Update. */
842 		best->p = p;
843 		best->n2 = n2;
844 		best->r2 = r2;
845 	} else if (a >= c && b >= d) {
846 		/* Both are below the limit, so pick the higher n2/(r2*r2) */
847 		if (n2 * best->r2 * best->r2 > best->n2 * r2 * r2) {
848 			best->p = p;
849 			best->n2 = n2;
850 			best->r2 = r2;
851 		}
852 	}
853 	/* Otherwise a < c && b >= d, do nothing */
854 }
855 
856 static void
hsw_ddi_calculate_wrpll(int clock,unsigned * r2_out,unsigned * n2_out,unsigned * p_out)857 hsw_ddi_calculate_wrpll(int clock /* in Hz */,
858 			unsigned *r2_out, unsigned *n2_out, unsigned *p_out)
859 {
860 	u64 freq2k;
861 	unsigned p, n2, r2;
862 	struct hsw_wrpll_rnp best = {};
863 	unsigned budget;
864 
865 	freq2k = clock / 100;
866 
867 	budget = hsw_wrpll_get_budget_for_freq(clock);
868 
869 	/* Special case handling for 540 pixel clock: bypass WR PLL entirely
870 	 * and directly pass the LC PLL to it. */
871 	if (freq2k == 5400000) {
872 		*n2_out = 2;
873 		*p_out = 1;
874 		*r2_out = 2;
875 		return;
876 	}
877 
878 	/*
879 	 * Ref = LC_FREQ / R, where Ref is the actual reference input seen by
880 	 * the WR PLL.
881 	 *
882 	 * We want R so that REF_MIN <= Ref <= REF_MAX.
883 	 * Injecting R2 = 2 * R gives:
884 	 *   REF_MAX * r2 > LC_FREQ * 2 and
885 	 *   REF_MIN * r2 < LC_FREQ * 2
886 	 *
887 	 * Which means the desired boundaries for r2 are:
888 	 *  LC_FREQ * 2 / REF_MAX < r2 < LC_FREQ * 2 / REF_MIN
889 	 *
890 	 */
891 	for (r2 = LC_FREQ * 2 / REF_MAX + 1;
892 	     r2 <= LC_FREQ * 2 / REF_MIN;
893 	     r2++) {
894 
895 		/*
896 		 * VCO = N * Ref, that is: VCO = N * LC_FREQ / R
897 		 *
898 		 * Once again we want VCO_MIN <= VCO <= VCO_MAX.
899 		 * Injecting R2 = 2 * R and N2 = 2 * N, we get:
900 		 *   VCO_MAX * r2 > n2 * LC_FREQ and
901 		 *   VCO_MIN * r2 < n2 * LC_FREQ)
902 		 *
903 		 * Which means the desired boundaries for n2 are:
904 		 * VCO_MIN * r2 / LC_FREQ < n2 < VCO_MAX * r2 / LC_FREQ
905 		 */
906 		for (n2 = VCO_MIN * r2 / LC_FREQ + 1;
907 		     n2 <= VCO_MAX * r2 / LC_FREQ;
908 		     n2++) {
909 
910 			for (p = P_MIN; p <= P_MAX; p += P_INC)
911 				hsw_wrpll_update_rnp(freq2k, budget,
912 						     r2, n2, p, &best);
913 		}
914 	}
915 
916 	*n2_out = best.n2;
917 	*p_out = best.p;
918 	*r2_out = best.r2;
919 }
920 
hsw_ddi_wrpll_get_freq(struct drm_i915_private * dev_priv,const struct intel_shared_dpll * pll,const struct intel_dpll_hw_state * pll_state)921 static int hsw_ddi_wrpll_get_freq(struct drm_i915_private *dev_priv,
922 				  const struct intel_shared_dpll *pll,
923 				  const struct intel_dpll_hw_state *pll_state)
924 {
925 	int refclk;
926 	int n, p, r;
927 	u32 wrpll = pll_state->wrpll;
928 
929 	switch (wrpll & WRPLL_REF_MASK) {
930 	case WRPLL_REF_SPECIAL_HSW:
931 		/* Muxed-SSC for BDW, non-SSC for non-ULT HSW. */
932 		if (IS_HASWELL(dev_priv) && !IS_HASWELL_ULT(dev_priv)) {
933 			refclk = dev_priv->display.dpll.ref_clks.nssc;
934 			break;
935 		}
936 		fallthrough;
937 	case WRPLL_REF_PCH_SSC:
938 		/*
939 		 * We could calculate spread here, but our checking
940 		 * code only cares about 5% accuracy, and spread is a max of
941 		 * 0.5% downspread.
942 		 */
943 		refclk = dev_priv->display.dpll.ref_clks.ssc;
944 		break;
945 	case WRPLL_REF_LCPLL:
946 		refclk = 2700000;
947 		break;
948 	default:
949 		MISSING_CASE(wrpll);
950 		return 0;
951 	}
952 
953 	r = wrpll & WRPLL_DIVIDER_REF_MASK;
954 	p = (wrpll & WRPLL_DIVIDER_POST_MASK) >> WRPLL_DIVIDER_POST_SHIFT;
955 	n = (wrpll & WRPLL_DIVIDER_FB_MASK) >> WRPLL_DIVIDER_FB_SHIFT;
956 
957 	/* Convert to KHz, p & r have a fixed point portion */
958 	return (refclk * n / 10) / (p * r) * 2;
959 }
960 
961 static int
hsw_ddi_wrpll_compute_dpll(struct intel_atomic_state * state,struct intel_crtc * crtc)962 hsw_ddi_wrpll_compute_dpll(struct intel_atomic_state *state,
963 			   struct intel_crtc *crtc)
964 {
965 	struct drm_i915_private *i915 = to_i915(state->base.dev);
966 	struct intel_crtc_state *crtc_state =
967 		intel_atomic_get_new_crtc_state(state, crtc);
968 	unsigned int p, n2, r2;
969 
970 	hsw_ddi_calculate_wrpll(crtc_state->port_clock * 1000, &r2, &n2, &p);
971 
972 	crtc_state->dpll_hw_state.wrpll =
973 		WRPLL_PLL_ENABLE | WRPLL_REF_LCPLL |
974 		WRPLL_DIVIDER_REFERENCE(r2) | WRPLL_DIVIDER_FEEDBACK(n2) |
975 		WRPLL_DIVIDER_POST(p);
976 
977 	crtc_state->port_clock = hsw_ddi_wrpll_get_freq(i915, NULL,
978 							&crtc_state->dpll_hw_state);
979 
980 	return 0;
981 }
982 
983 static struct intel_shared_dpll *
hsw_ddi_wrpll_get_dpll(struct intel_atomic_state * state,struct intel_crtc * crtc)984 hsw_ddi_wrpll_get_dpll(struct intel_atomic_state *state,
985 		       struct intel_crtc *crtc)
986 {
987 	struct intel_crtc_state *crtc_state =
988 		intel_atomic_get_new_crtc_state(state, crtc);
989 
990 	return intel_find_shared_dpll(state, crtc,
991 				      &crtc_state->dpll_hw_state,
992 				      BIT(DPLL_ID_WRPLL2) |
993 				      BIT(DPLL_ID_WRPLL1));
994 }
995 
996 static int
hsw_ddi_lcpll_compute_dpll(struct intel_crtc_state * crtc_state)997 hsw_ddi_lcpll_compute_dpll(struct intel_crtc_state *crtc_state)
998 {
999 	struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
1000 	int clock = crtc_state->port_clock;
1001 
1002 	switch (clock / 2) {
1003 	case 81000:
1004 	case 135000:
1005 	case 270000:
1006 		return 0;
1007 	default:
1008 		drm_dbg_kms(&dev_priv->drm, "Invalid clock for DP: %d\n",
1009 			    clock);
1010 		return -EINVAL;
1011 	}
1012 }
1013 
1014 static struct intel_shared_dpll *
hsw_ddi_lcpll_get_dpll(struct intel_crtc_state * crtc_state)1015 hsw_ddi_lcpll_get_dpll(struct intel_crtc_state *crtc_state)
1016 {
1017 	struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
1018 	struct intel_shared_dpll *pll;
1019 	enum intel_dpll_id pll_id;
1020 	int clock = crtc_state->port_clock;
1021 
1022 	switch (clock / 2) {
1023 	case 81000:
1024 		pll_id = DPLL_ID_LCPLL_810;
1025 		break;
1026 	case 135000:
1027 		pll_id = DPLL_ID_LCPLL_1350;
1028 		break;
1029 	case 270000:
1030 		pll_id = DPLL_ID_LCPLL_2700;
1031 		break;
1032 	default:
1033 		MISSING_CASE(clock / 2);
1034 		return NULL;
1035 	}
1036 
1037 	pll = intel_get_shared_dpll_by_id(dev_priv, pll_id);
1038 
1039 	if (!pll)
1040 		return NULL;
1041 
1042 	return pll;
1043 }
1044 
hsw_ddi_lcpll_get_freq(struct drm_i915_private * i915,const struct intel_shared_dpll * pll,const struct intel_dpll_hw_state * pll_state)1045 static int hsw_ddi_lcpll_get_freq(struct drm_i915_private *i915,
1046 				  const struct intel_shared_dpll *pll,
1047 				  const struct intel_dpll_hw_state *pll_state)
1048 {
1049 	int link_clock = 0;
1050 
1051 	switch (pll->info->id) {
1052 	case DPLL_ID_LCPLL_810:
1053 		link_clock = 81000;
1054 		break;
1055 	case DPLL_ID_LCPLL_1350:
1056 		link_clock = 135000;
1057 		break;
1058 	case DPLL_ID_LCPLL_2700:
1059 		link_clock = 270000;
1060 		break;
1061 	default:
1062 		drm_WARN(&i915->drm, 1, "bad port clock sel\n");
1063 		break;
1064 	}
1065 
1066 	return link_clock * 2;
1067 }
1068 
1069 static int
hsw_ddi_spll_compute_dpll(struct intel_atomic_state * state,struct intel_crtc * crtc)1070 hsw_ddi_spll_compute_dpll(struct intel_atomic_state *state,
1071 			  struct intel_crtc *crtc)
1072 {
1073 	struct intel_crtc_state *crtc_state =
1074 		intel_atomic_get_new_crtc_state(state, crtc);
1075 
1076 	if (drm_WARN_ON(crtc->base.dev, crtc_state->port_clock / 2 != 135000))
1077 		return -EINVAL;
1078 
1079 	crtc_state->dpll_hw_state.spll =
1080 		SPLL_PLL_ENABLE | SPLL_FREQ_1350MHz | SPLL_REF_MUXED_SSC;
1081 
1082 	return 0;
1083 }
1084 
1085 static struct intel_shared_dpll *
hsw_ddi_spll_get_dpll(struct intel_atomic_state * state,struct intel_crtc * crtc)1086 hsw_ddi_spll_get_dpll(struct intel_atomic_state *state,
1087 		      struct intel_crtc *crtc)
1088 {
1089 	struct intel_crtc_state *crtc_state =
1090 		intel_atomic_get_new_crtc_state(state, crtc);
1091 
1092 	return intel_find_shared_dpll(state, crtc, &crtc_state->dpll_hw_state,
1093 				      BIT(DPLL_ID_SPLL));
1094 }
1095 
hsw_ddi_spll_get_freq(struct drm_i915_private * i915,const struct intel_shared_dpll * pll,const struct intel_dpll_hw_state * pll_state)1096 static int hsw_ddi_spll_get_freq(struct drm_i915_private *i915,
1097 				 const struct intel_shared_dpll *pll,
1098 				 const struct intel_dpll_hw_state *pll_state)
1099 {
1100 	int link_clock = 0;
1101 
1102 	switch (pll_state->spll & SPLL_FREQ_MASK) {
1103 	case SPLL_FREQ_810MHz:
1104 		link_clock = 81000;
1105 		break;
1106 	case SPLL_FREQ_1350MHz:
1107 		link_clock = 135000;
1108 		break;
1109 	case SPLL_FREQ_2700MHz:
1110 		link_clock = 270000;
1111 		break;
1112 	default:
1113 		drm_WARN(&i915->drm, 1, "bad spll freq\n");
1114 		break;
1115 	}
1116 
1117 	return link_clock * 2;
1118 }
1119 
hsw_compute_dpll(struct intel_atomic_state * state,struct intel_crtc * crtc,struct intel_encoder * encoder)1120 static int hsw_compute_dpll(struct intel_atomic_state *state,
1121 			    struct intel_crtc *crtc,
1122 			    struct intel_encoder *encoder)
1123 {
1124 	struct intel_crtc_state *crtc_state =
1125 		intel_atomic_get_new_crtc_state(state, crtc);
1126 
1127 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI))
1128 		return hsw_ddi_wrpll_compute_dpll(state, crtc);
1129 	else if (intel_crtc_has_dp_encoder(crtc_state))
1130 		return hsw_ddi_lcpll_compute_dpll(crtc_state);
1131 	else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_ANALOG))
1132 		return hsw_ddi_spll_compute_dpll(state, crtc);
1133 	else
1134 		return -EINVAL;
1135 }
1136 
hsw_get_dpll(struct intel_atomic_state * state,struct intel_crtc * crtc,struct intel_encoder * encoder)1137 static int hsw_get_dpll(struct intel_atomic_state *state,
1138 			struct intel_crtc *crtc,
1139 			struct intel_encoder *encoder)
1140 {
1141 	struct intel_crtc_state *crtc_state =
1142 		intel_atomic_get_new_crtc_state(state, crtc);
1143 	struct intel_shared_dpll *pll = NULL;
1144 
1145 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI))
1146 		pll = hsw_ddi_wrpll_get_dpll(state, crtc);
1147 	else if (intel_crtc_has_dp_encoder(crtc_state))
1148 		pll = hsw_ddi_lcpll_get_dpll(crtc_state);
1149 	else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_ANALOG))
1150 		pll = hsw_ddi_spll_get_dpll(state, crtc);
1151 
1152 	if (!pll)
1153 		return -EINVAL;
1154 
1155 	intel_reference_shared_dpll(state, crtc,
1156 				    pll, &crtc_state->dpll_hw_state);
1157 
1158 	crtc_state->shared_dpll = pll;
1159 
1160 	return 0;
1161 }
1162 
hsw_update_dpll_ref_clks(struct drm_i915_private * i915)1163 static void hsw_update_dpll_ref_clks(struct drm_i915_private *i915)
1164 {
1165 	i915->display.dpll.ref_clks.ssc = 135000;
1166 	/* Non-SSC is only used on non-ULT HSW. */
1167 	if (intel_de_read(i915, FUSE_STRAP3) & HSW_REF_CLK_SELECT)
1168 		i915->display.dpll.ref_clks.nssc = 24000;
1169 	else
1170 		i915->display.dpll.ref_clks.nssc = 135000;
1171 }
1172 
hsw_dump_hw_state(struct drm_i915_private * dev_priv,const struct intel_dpll_hw_state * hw_state)1173 static void hsw_dump_hw_state(struct drm_i915_private *dev_priv,
1174 			      const struct intel_dpll_hw_state *hw_state)
1175 {
1176 	drm_dbg_kms(&dev_priv->drm, "dpll_hw_state: wrpll: 0x%x spll: 0x%x\n",
1177 		    hw_state->wrpll, hw_state->spll);
1178 }
1179 
1180 static const struct intel_shared_dpll_funcs hsw_ddi_wrpll_funcs = {
1181 	.enable = hsw_ddi_wrpll_enable,
1182 	.disable = hsw_ddi_wrpll_disable,
1183 	.get_hw_state = hsw_ddi_wrpll_get_hw_state,
1184 	.get_freq = hsw_ddi_wrpll_get_freq,
1185 };
1186 
1187 static const struct intel_shared_dpll_funcs hsw_ddi_spll_funcs = {
1188 	.enable = hsw_ddi_spll_enable,
1189 	.disable = hsw_ddi_spll_disable,
1190 	.get_hw_state = hsw_ddi_spll_get_hw_state,
1191 	.get_freq = hsw_ddi_spll_get_freq,
1192 };
1193 
hsw_ddi_lcpll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)1194 static void hsw_ddi_lcpll_enable(struct drm_i915_private *dev_priv,
1195 				 struct intel_shared_dpll *pll)
1196 {
1197 }
1198 
hsw_ddi_lcpll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)1199 static void hsw_ddi_lcpll_disable(struct drm_i915_private *dev_priv,
1200 				  struct intel_shared_dpll *pll)
1201 {
1202 }
1203 
hsw_ddi_lcpll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)1204 static bool hsw_ddi_lcpll_get_hw_state(struct drm_i915_private *dev_priv,
1205 				       struct intel_shared_dpll *pll,
1206 				       struct intel_dpll_hw_state *hw_state)
1207 {
1208 	return true;
1209 }
1210 
1211 static const struct intel_shared_dpll_funcs hsw_ddi_lcpll_funcs = {
1212 	.enable = hsw_ddi_lcpll_enable,
1213 	.disable = hsw_ddi_lcpll_disable,
1214 	.get_hw_state = hsw_ddi_lcpll_get_hw_state,
1215 	.get_freq = hsw_ddi_lcpll_get_freq,
1216 };
1217 
1218 static const struct dpll_info hsw_plls[] = {
1219 	{ "WRPLL 1",    &hsw_ddi_wrpll_funcs, DPLL_ID_WRPLL1,     0 },
1220 	{ "WRPLL 2",    &hsw_ddi_wrpll_funcs, DPLL_ID_WRPLL2,     0 },
1221 	{ "SPLL",       &hsw_ddi_spll_funcs,  DPLL_ID_SPLL,       0 },
1222 	{ "LCPLL 810",  &hsw_ddi_lcpll_funcs, DPLL_ID_LCPLL_810,  INTEL_DPLL_ALWAYS_ON },
1223 	{ "LCPLL 1350", &hsw_ddi_lcpll_funcs, DPLL_ID_LCPLL_1350, INTEL_DPLL_ALWAYS_ON },
1224 	{ "LCPLL 2700", &hsw_ddi_lcpll_funcs, DPLL_ID_LCPLL_2700, INTEL_DPLL_ALWAYS_ON },
1225 	{ },
1226 };
1227 
1228 static const struct intel_dpll_mgr hsw_pll_mgr = {
1229 	.dpll_info = hsw_plls,
1230 	.compute_dplls = hsw_compute_dpll,
1231 	.get_dplls = hsw_get_dpll,
1232 	.put_dplls = intel_put_dpll,
1233 	.update_ref_clks = hsw_update_dpll_ref_clks,
1234 	.dump_hw_state = hsw_dump_hw_state,
1235 };
1236 
1237 struct skl_dpll_regs {
1238 	i915_reg_t ctl, cfgcr1, cfgcr2;
1239 };
1240 
1241 /* this array is indexed by the *shared* pll id */
1242 static const struct skl_dpll_regs skl_dpll_regs[4] = {
1243 	{
1244 		/* DPLL 0 */
1245 		.ctl = LCPLL1_CTL,
1246 		/* DPLL 0 doesn't support HDMI mode */
1247 	},
1248 	{
1249 		/* DPLL 1 */
1250 		.ctl = LCPLL2_CTL,
1251 		.cfgcr1 = DPLL_CFGCR1(SKL_DPLL1),
1252 		.cfgcr2 = DPLL_CFGCR2(SKL_DPLL1),
1253 	},
1254 	{
1255 		/* DPLL 2 */
1256 		.ctl = WRPLL_CTL(0),
1257 		.cfgcr1 = DPLL_CFGCR1(SKL_DPLL2),
1258 		.cfgcr2 = DPLL_CFGCR2(SKL_DPLL2),
1259 	},
1260 	{
1261 		/* DPLL 3 */
1262 		.ctl = WRPLL_CTL(1),
1263 		.cfgcr1 = DPLL_CFGCR1(SKL_DPLL3),
1264 		.cfgcr2 = DPLL_CFGCR2(SKL_DPLL3),
1265 	},
1266 };
1267 
skl_ddi_pll_write_ctrl1(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)1268 static void skl_ddi_pll_write_ctrl1(struct drm_i915_private *dev_priv,
1269 				    struct intel_shared_dpll *pll)
1270 {
1271 	const enum intel_dpll_id id = pll->info->id;
1272 
1273 	intel_de_rmw(dev_priv, DPLL_CTRL1,
1274 		     DPLL_CTRL1_HDMI_MODE(id) | DPLL_CTRL1_SSC(id) | DPLL_CTRL1_LINK_RATE_MASK(id),
1275 		     pll->state.hw_state.ctrl1 << (id * 6));
1276 	intel_de_posting_read(dev_priv, DPLL_CTRL1);
1277 }
1278 
skl_ddi_pll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)1279 static void skl_ddi_pll_enable(struct drm_i915_private *dev_priv,
1280 			       struct intel_shared_dpll *pll)
1281 {
1282 	const struct skl_dpll_regs *regs = skl_dpll_regs;
1283 	const enum intel_dpll_id id = pll->info->id;
1284 
1285 	skl_ddi_pll_write_ctrl1(dev_priv, pll);
1286 
1287 	intel_de_write(dev_priv, regs[id].cfgcr1, pll->state.hw_state.cfgcr1);
1288 	intel_de_write(dev_priv, regs[id].cfgcr2, pll->state.hw_state.cfgcr2);
1289 	intel_de_posting_read(dev_priv, regs[id].cfgcr1);
1290 	intel_de_posting_read(dev_priv, regs[id].cfgcr2);
1291 
1292 	/* the enable bit is always bit 31 */
1293 	intel_de_rmw(dev_priv, regs[id].ctl, 0, LCPLL_PLL_ENABLE);
1294 
1295 	if (intel_de_wait_for_set(dev_priv, DPLL_STATUS, DPLL_LOCK(id), 5))
1296 		drm_err(&dev_priv->drm, "DPLL %d not locked\n", id);
1297 }
1298 
skl_ddi_dpll0_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)1299 static void skl_ddi_dpll0_enable(struct drm_i915_private *dev_priv,
1300 				 struct intel_shared_dpll *pll)
1301 {
1302 	skl_ddi_pll_write_ctrl1(dev_priv, pll);
1303 }
1304 
skl_ddi_pll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)1305 static void skl_ddi_pll_disable(struct drm_i915_private *dev_priv,
1306 				struct intel_shared_dpll *pll)
1307 {
1308 	const struct skl_dpll_regs *regs = skl_dpll_regs;
1309 	const enum intel_dpll_id id = pll->info->id;
1310 
1311 	/* the enable bit is always bit 31 */
1312 	intel_de_rmw(dev_priv, regs[id].ctl, LCPLL_PLL_ENABLE, 0);
1313 	intel_de_posting_read(dev_priv, regs[id].ctl);
1314 }
1315 
skl_ddi_dpll0_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)1316 static void skl_ddi_dpll0_disable(struct drm_i915_private *dev_priv,
1317 				  struct intel_shared_dpll *pll)
1318 {
1319 }
1320 
skl_ddi_pll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)1321 static bool skl_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
1322 				     struct intel_shared_dpll *pll,
1323 				     struct intel_dpll_hw_state *hw_state)
1324 {
1325 	u32 val;
1326 	const struct skl_dpll_regs *regs = skl_dpll_regs;
1327 	const enum intel_dpll_id id = pll->info->id;
1328 	intel_wakeref_t wakeref;
1329 	bool ret;
1330 
1331 	wakeref = intel_display_power_get_if_enabled(dev_priv,
1332 						     POWER_DOMAIN_DISPLAY_CORE);
1333 	if (!wakeref)
1334 		return false;
1335 
1336 	ret = false;
1337 
1338 	val = intel_de_read(dev_priv, regs[id].ctl);
1339 	if (!(val & LCPLL_PLL_ENABLE))
1340 		goto out;
1341 
1342 	val = intel_de_read(dev_priv, DPLL_CTRL1);
1343 	hw_state->ctrl1 = (val >> (id * 6)) & 0x3f;
1344 
1345 	/* avoid reading back stale values if HDMI mode is not enabled */
1346 	if (val & DPLL_CTRL1_HDMI_MODE(id)) {
1347 		hw_state->cfgcr1 = intel_de_read(dev_priv, regs[id].cfgcr1);
1348 		hw_state->cfgcr2 = intel_de_read(dev_priv, regs[id].cfgcr2);
1349 	}
1350 	ret = true;
1351 
1352 out:
1353 	intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
1354 
1355 	return ret;
1356 }
1357 
skl_ddi_dpll0_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)1358 static bool skl_ddi_dpll0_get_hw_state(struct drm_i915_private *dev_priv,
1359 				       struct intel_shared_dpll *pll,
1360 				       struct intel_dpll_hw_state *hw_state)
1361 {
1362 	const struct skl_dpll_regs *regs = skl_dpll_regs;
1363 	const enum intel_dpll_id id = pll->info->id;
1364 	intel_wakeref_t wakeref;
1365 	u32 val;
1366 	bool ret;
1367 
1368 	wakeref = intel_display_power_get_if_enabled(dev_priv,
1369 						     POWER_DOMAIN_DISPLAY_CORE);
1370 	if (!wakeref)
1371 		return false;
1372 
1373 	ret = false;
1374 
1375 	/* DPLL0 is always enabled since it drives CDCLK */
1376 	val = intel_de_read(dev_priv, regs[id].ctl);
1377 	if (drm_WARN_ON(&dev_priv->drm, !(val & LCPLL_PLL_ENABLE)))
1378 		goto out;
1379 
1380 	val = intel_de_read(dev_priv, DPLL_CTRL1);
1381 	hw_state->ctrl1 = (val >> (id * 6)) & 0x3f;
1382 
1383 	ret = true;
1384 
1385 out:
1386 	intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
1387 
1388 	return ret;
1389 }
1390 
1391 struct skl_wrpll_context {
1392 	u64 min_deviation;		/* current minimal deviation */
1393 	u64 central_freq;		/* chosen central freq */
1394 	u64 dco_freq;			/* chosen dco freq */
1395 	unsigned int p;			/* chosen divider */
1396 };
1397 
1398 /* DCO freq must be within +1%/-6%  of the DCO central freq */
1399 #define SKL_DCO_MAX_PDEVIATION	100
1400 #define SKL_DCO_MAX_NDEVIATION	600
1401 
skl_wrpll_try_divider(struct skl_wrpll_context * ctx,u64 central_freq,u64 dco_freq,unsigned int divider)1402 static void skl_wrpll_try_divider(struct skl_wrpll_context *ctx,
1403 				  u64 central_freq,
1404 				  u64 dco_freq,
1405 				  unsigned int divider)
1406 {
1407 	u64 deviation;
1408 
1409 	deviation = div64_u64(10000 * abs_diff(dco_freq, central_freq),
1410 			      central_freq);
1411 
1412 	/* positive deviation */
1413 	if (dco_freq >= central_freq) {
1414 		if (deviation < SKL_DCO_MAX_PDEVIATION &&
1415 		    deviation < ctx->min_deviation) {
1416 			ctx->min_deviation = deviation;
1417 			ctx->central_freq = central_freq;
1418 			ctx->dco_freq = dco_freq;
1419 			ctx->p = divider;
1420 		}
1421 	/* negative deviation */
1422 	} else if (deviation < SKL_DCO_MAX_NDEVIATION &&
1423 		   deviation < ctx->min_deviation) {
1424 		ctx->min_deviation = deviation;
1425 		ctx->central_freq = central_freq;
1426 		ctx->dco_freq = dco_freq;
1427 		ctx->p = divider;
1428 	}
1429 }
1430 
skl_wrpll_get_multipliers(unsigned int p,unsigned int * p0,unsigned int * p1,unsigned int * p2)1431 static void skl_wrpll_get_multipliers(unsigned int p,
1432 				      unsigned int *p0 /* out */,
1433 				      unsigned int *p1 /* out */,
1434 				      unsigned int *p2 /* out */)
1435 {
1436 	/* even dividers */
1437 	if (p % 2 == 0) {
1438 		unsigned int half = p / 2;
1439 
1440 		if (half == 1 || half == 2 || half == 3 || half == 5) {
1441 			*p0 = 2;
1442 			*p1 = 1;
1443 			*p2 = half;
1444 		} else if (half % 2 == 0) {
1445 			*p0 = 2;
1446 			*p1 = half / 2;
1447 			*p2 = 2;
1448 		} else if (half % 3 == 0) {
1449 			*p0 = 3;
1450 			*p1 = half / 3;
1451 			*p2 = 2;
1452 		} else if (half % 7 == 0) {
1453 			*p0 = 7;
1454 			*p1 = half / 7;
1455 			*p2 = 2;
1456 		}
1457 	} else if (p == 3 || p == 9) {  /* 3, 5, 7, 9, 15, 21, 35 */
1458 		*p0 = 3;
1459 		*p1 = 1;
1460 		*p2 = p / 3;
1461 	} else if (p == 5 || p == 7) {
1462 		*p0 = p;
1463 		*p1 = 1;
1464 		*p2 = 1;
1465 	} else if (p == 15) {
1466 		*p0 = 3;
1467 		*p1 = 1;
1468 		*p2 = 5;
1469 	} else if (p == 21) {
1470 		*p0 = 7;
1471 		*p1 = 1;
1472 		*p2 = 3;
1473 	} else if (p == 35) {
1474 		*p0 = 7;
1475 		*p1 = 1;
1476 		*p2 = 5;
1477 	}
1478 }
1479 
1480 struct skl_wrpll_params {
1481 	u32 dco_fraction;
1482 	u32 dco_integer;
1483 	u32 qdiv_ratio;
1484 	u32 qdiv_mode;
1485 	u32 kdiv;
1486 	u32 pdiv;
1487 	u32 central_freq;
1488 };
1489 
skl_wrpll_params_populate(struct skl_wrpll_params * params,u64 afe_clock,int ref_clock,u64 central_freq,u32 p0,u32 p1,u32 p2)1490 static void skl_wrpll_params_populate(struct skl_wrpll_params *params,
1491 				      u64 afe_clock,
1492 				      int ref_clock,
1493 				      u64 central_freq,
1494 				      u32 p0, u32 p1, u32 p2)
1495 {
1496 	u64 dco_freq;
1497 
1498 	switch (central_freq) {
1499 	case 9600000000ULL:
1500 		params->central_freq = 0;
1501 		break;
1502 	case 9000000000ULL:
1503 		params->central_freq = 1;
1504 		break;
1505 	case 8400000000ULL:
1506 		params->central_freq = 3;
1507 	}
1508 
1509 	switch (p0) {
1510 	case 1:
1511 		params->pdiv = 0;
1512 		break;
1513 	case 2:
1514 		params->pdiv = 1;
1515 		break;
1516 	case 3:
1517 		params->pdiv = 2;
1518 		break;
1519 	case 7:
1520 		params->pdiv = 4;
1521 		break;
1522 	default:
1523 		WARN(1, "Incorrect PDiv\n");
1524 	}
1525 
1526 	switch (p2) {
1527 	case 5:
1528 		params->kdiv = 0;
1529 		break;
1530 	case 2:
1531 		params->kdiv = 1;
1532 		break;
1533 	case 3:
1534 		params->kdiv = 2;
1535 		break;
1536 	case 1:
1537 		params->kdiv = 3;
1538 		break;
1539 	default:
1540 		WARN(1, "Incorrect KDiv\n");
1541 	}
1542 
1543 	params->qdiv_ratio = p1;
1544 	params->qdiv_mode = (params->qdiv_ratio == 1) ? 0 : 1;
1545 
1546 	dco_freq = p0 * p1 * p2 * afe_clock;
1547 
1548 	/*
1549 	 * Intermediate values are in Hz.
1550 	 * Divide by MHz to match bsepc
1551 	 */
1552 	params->dco_integer = div_u64(dco_freq, ref_clock * KHz(1));
1553 	params->dco_fraction =
1554 		div_u64((div_u64(dco_freq, ref_clock / KHz(1)) -
1555 			 params->dco_integer * MHz(1)) * 0x8000, MHz(1));
1556 }
1557 
1558 static int
skl_ddi_calculate_wrpll(int clock,int ref_clock,struct skl_wrpll_params * wrpll_params)1559 skl_ddi_calculate_wrpll(int clock,
1560 			int ref_clock,
1561 			struct skl_wrpll_params *wrpll_params)
1562 {
1563 	static const u64 dco_central_freq[3] = { 8400000000ULL,
1564 						 9000000000ULL,
1565 						 9600000000ULL };
1566 	static const u8 even_dividers[] = {  4,  6,  8, 10, 12, 14, 16, 18, 20,
1567 					    24, 28, 30, 32, 36, 40, 42, 44,
1568 					    48, 52, 54, 56, 60, 64, 66, 68,
1569 					    70, 72, 76, 78, 80, 84, 88, 90,
1570 					    92, 96, 98 };
1571 	static const u8 odd_dividers[] = { 3, 5, 7, 9, 15, 21, 35 };
1572 	static const struct {
1573 		const u8 *list;
1574 		int n_dividers;
1575 	} dividers[] = {
1576 		{ even_dividers, ARRAY_SIZE(even_dividers) },
1577 		{ odd_dividers, ARRAY_SIZE(odd_dividers) },
1578 	};
1579 	struct skl_wrpll_context ctx = {
1580 		.min_deviation = U64_MAX,
1581 	};
1582 	unsigned int dco, d, i;
1583 	unsigned int p0, p1, p2;
1584 	u64 afe_clock = (u64)clock * 1000 * 5; /* AFE Clock is 5x Pixel clock, in Hz */
1585 
1586 	for (d = 0; d < ARRAY_SIZE(dividers); d++) {
1587 		for (dco = 0; dco < ARRAY_SIZE(dco_central_freq); dco++) {
1588 			for (i = 0; i < dividers[d].n_dividers; i++) {
1589 				unsigned int p = dividers[d].list[i];
1590 				u64 dco_freq = p * afe_clock;
1591 
1592 				skl_wrpll_try_divider(&ctx,
1593 						      dco_central_freq[dco],
1594 						      dco_freq,
1595 						      p);
1596 				/*
1597 				 * Skip the remaining dividers if we're sure to
1598 				 * have found the definitive divider, we can't
1599 				 * improve a 0 deviation.
1600 				 */
1601 				if (ctx.min_deviation == 0)
1602 					goto skip_remaining_dividers;
1603 			}
1604 		}
1605 
1606 skip_remaining_dividers:
1607 		/*
1608 		 * If a solution is found with an even divider, prefer
1609 		 * this one.
1610 		 */
1611 		if (d == 0 && ctx.p)
1612 			break;
1613 	}
1614 
1615 	if (!ctx.p)
1616 		return -EINVAL;
1617 
1618 	/*
1619 	 * gcc incorrectly analyses that these can be used without being
1620 	 * initialized. To be fair, it's hard to guess.
1621 	 */
1622 	p0 = p1 = p2 = 0;
1623 	skl_wrpll_get_multipliers(ctx.p, &p0, &p1, &p2);
1624 	skl_wrpll_params_populate(wrpll_params, afe_clock, ref_clock,
1625 				  ctx.central_freq, p0, p1, p2);
1626 
1627 	return 0;
1628 }
1629 
skl_ddi_wrpll_get_freq(struct drm_i915_private * i915,const struct intel_shared_dpll * pll,const struct intel_dpll_hw_state * pll_state)1630 static int skl_ddi_wrpll_get_freq(struct drm_i915_private *i915,
1631 				  const struct intel_shared_dpll *pll,
1632 				  const struct intel_dpll_hw_state *pll_state)
1633 {
1634 	int ref_clock = i915->display.dpll.ref_clks.nssc;
1635 	u32 p0, p1, p2, dco_freq;
1636 
1637 	p0 = pll_state->cfgcr2 & DPLL_CFGCR2_PDIV_MASK;
1638 	p2 = pll_state->cfgcr2 & DPLL_CFGCR2_KDIV_MASK;
1639 
1640 	if (pll_state->cfgcr2 &  DPLL_CFGCR2_QDIV_MODE(1))
1641 		p1 = (pll_state->cfgcr2 & DPLL_CFGCR2_QDIV_RATIO_MASK) >> 8;
1642 	else
1643 		p1 = 1;
1644 
1645 
1646 	switch (p0) {
1647 	case DPLL_CFGCR2_PDIV_1:
1648 		p0 = 1;
1649 		break;
1650 	case DPLL_CFGCR2_PDIV_2:
1651 		p0 = 2;
1652 		break;
1653 	case DPLL_CFGCR2_PDIV_3:
1654 		p0 = 3;
1655 		break;
1656 	case DPLL_CFGCR2_PDIV_7_INVALID:
1657 		/*
1658 		 * Incorrect ASUS-Z170M BIOS setting, the HW seems to ignore bit#0,
1659 		 * handling it the same way as PDIV_7.
1660 		 */
1661 		drm_dbg_kms(&i915->drm, "Invalid WRPLL PDIV divider value, fixing it.\n");
1662 		fallthrough;
1663 	case DPLL_CFGCR2_PDIV_7:
1664 		p0 = 7;
1665 		break;
1666 	default:
1667 		MISSING_CASE(p0);
1668 		return 0;
1669 	}
1670 
1671 	switch (p2) {
1672 	case DPLL_CFGCR2_KDIV_5:
1673 		p2 = 5;
1674 		break;
1675 	case DPLL_CFGCR2_KDIV_2:
1676 		p2 = 2;
1677 		break;
1678 	case DPLL_CFGCR2_KDIV_3:
1679 		p2 = 3;
1680 		break;
1681 	case DPLL_CFGCR2_KDIV_1:
1682 		p2 = 1;
1683 		break;
1684 	default:
1685 		MISSING_CASE(p2);
1686 		return 0;
1687 	}
1688 
1689 	dco_freq = (pll_state->cfgcr1 & DPLL_CFGCR1_DCO_INTEGER_MASK) *
1690 		   ref_clock;
1691 
1692 	dco_freq += ((pll_state->cfgcr1 & DPLL_CFGCR1_DCO_FRACTION_MASK) >> 9) *
1693 		    ref_clock / 0x8000;
1694 
1695 	if (drm_WARN_ON(&i915->drm, p0 == 0 || p1 == 0 || p2 == 0))
1696 		return 0;
1697 
1698 	return dco_freq / (p0 * p1 * p2 * 5);
1699 }
1700 
skl_ddi_hdmi_pll_dividers(struct intel_crtc_state * crtc_state)1701 static int skl_ddi_hdmi_pll_dividers(struct intel_crtc_state *crtc_state)
1702 {
1703 	struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
1704 	struct skl_wrpll_params wrpll_params = {};
1705 	u32 ctrl1, cfgcr1, cfgcr2;
1706 	int ret;
1707 
1708 	/*
1709 	 * See comment in intel_dpll_hw_state to understand why we always use 0
1710 	 * as the DPLL id in this function.
1711 	 */
1712 	ctrl1 = DPLL_CTRL1_OVERRIDE(0);
1713 
1714 	ctrl1 |= DPLL_CTRL1_HDMI_MODE(0);
1715 
1716 	ret = skl_ddi_calculate_wrpll(crtc_state->port_clock,
1717 				      i915->display.dpll.ref_clks.nssc, &wrpll_params);
1718 	if (ret)
1719 		return ret;
1720 
1721 	cfgcr1 = DPLL_CFGCR1_FREQ_ENABLE |
1722 		DPLL_CFGCR1_DCO_FRACTION(wrpll_params.dco_fraction) |
1723 		wrpll_params.dco_integer;
1724 
1725 	cfgcr2 = DPLL_CFGCR2_QDIV_RATIO(wrpll_params.qdiv_ratio) |
1726 		DPLL_CFGCR2_QDIV_MODE(wrpll_params.qdiv_mode) |
1727 		DPLL_CFGCR2_KDIV(wrpll_params.kdiv) |
1728 		DPLL_CFGCR2_PDIV(wrpll_params.pdiv) |
1729 		wrpll_params.central_freq;
1730 
1731 	crtc_state->dpll_hw_state.ctrl1 = ctrl1;
1732 	crtc_state->dpll_hw_state.cfgcr1 = cfgcr1;
1733 	crtc_state->dpll_hw_state.cfgcr2 = cfgcr2;
1734 
1735 	crtc_state->port_clock = skl_ddi_wrpll_get_freq(i915, NULL,
1736 							&crtc_state->dpll_hw_state);
1737 
1738 	return 0;
1739 }
1740 
1741 static int
skl_ddi_dp_set_dpll_hw_state(struct intel_crtc_state * crtc_state)1742 skl_ddi_dp_set_dpll_hw_state(struct intel_crtc_state *crtc_state)
1743 {
1744 	u32 ctrl1;
1745 
1746 	/*
1747 	 * See comment in intel_dpll_hw_state to understand why we always use 0
1748 	 * as the DPLL id in this function.
1749 	 */
1750 	ctrl1 = DPLL_CTRL1_OVERRIDE(0);
1751 	switch (crtc_state->port_clock / 2) {
1752 	case 81000:
1753 		ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, 0);
1754 		break;
1755 	case 135000:
1756 		ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350, 0);
1757 		break;
1758 	case 270000:
1759 		ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700, 0);
1760 		break;
1761 		/* eDP 1.4 rates */
1762 	case 162000:
1763 		ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620, 0);
1764 		break;
1765 	case 108000:
1766 		ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080, 0);
1767 		break;
1768 	case 216000:
1769 		ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160, 0);
1770 		break;
1771 	}
1772 
1773 	crtc_state->dpll_hw_state.ctrl1 = ctrl1;
1774 
1775 	return 0;
1776 }
1777 
skl_ddi_lcpll_get_freq(struct drm_i915_private * i915,const struct intel_shared_dpll * pll,const struct intel_dpll_hw_state * pll_state)1778 static int skl_ddi_lcpll_get_freq(struct drm_i915_private *i915,
1779 				  const struct intel_shared_dpll *pll,
1780 				  const struct intel_dpll_hw_state *pll_state)
1781 {
1782 	int link_clock = 0;
1783 
1784 	switch ((pll_state->ctrl1 & DPLL_CTRL1_LINK_RATE_MASK(0)) >>
1785 		DPLL_CTRL1_LINK_RATE_SHIFT(0)) {
1786 	case DPLL_CTRL1_LINK_RATE_810:
1787 		link_clock = 81000;
1788 		break;
1789 	case DPLL_CTRL1_LINK_RATE_1080:
1790 		link_clock = 108000;
1791 		break;
1792 	case DPLL_CTRL1_LINK_RATE_1350:
1793 		link_clock = 135000;
1794 		break;
1795 	case DPLL_CTRL1_LINK_RATE_1620:
1796 		link_clock = 162000;
1797 		break;
1798 	case DPLL_CTRL1_LINK_RATE_2160:
1799 		link_clock = 216000;
1800 		break;
1801 	case DPLL_CTRL1_LINK_RATE_2700:
1802 		link_clock = 270000;
1803 		break;
1804 	default:
1805 		drm_WARN(&i915->drm, 1, "Unsupported link rate\n");
1806 		break;
1807 	}
1808 
1809 	return link_clock * 2;
1810 }
1811 
skl_compute_dpll(struct intel_atomic_state * state,struct intel_crtc * crtc,struct intel_encoder * encoder)1812 static int skl_compute_dpll(struct intel_atomic_state *state,
1813 			    struct intel_crtc *crtc,
1814 			    struct intel_encoder *encoder)
1815 {
1816 	struct intel_crtc_state *crtc_state =
1817 		intel_atomic_get_new_crtc_state(state, crtc);
1818 
1819 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI))
1820 		return skl_ddi_hdmi_pll_dividers(crtc_state);
1821 	else if (intel_crtc_has_dp_encoder(crtc_state))
1822 		return skl_ddi_dp_set_dpll_hw_state(crtc_state);
1823 	else
1824 		return -EINVAL;
1825 }
1826 
skl_get_dpll(struct intel_atomic_state * state,struct intel_crtc * crtc,struct intel_encoder * encoder)1827 static int skl_get_dpll(struct intel_atomic_state *state,
1828 			struct intel_crtc *crtc,
1829 			struct intel_encoder *encoder)
1830 {
1831 	struct intel_crtc_state *crtc_state =
1832 		intel_atomic_get_new_crtc_state(state, crtc);
1833 	struct intel_shared_dpll *pll;
1834 
1835 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP))
1836 		pll = intel_find_shared_dpll(state, crtc,
1837 					     &crtc_state->dpll_hw_state,
1838 					     BIT(DPLL_ID_SKL_DPLL0));
1839 	else
1840 		pll = intel_find_shared_dpll(state, crtc,
1841 					     &crtc_state->dpll_hw_state,
1842 					     BIT(DPLL_ID_SKL_DPLL3) |
1843 					     BIT(DPLL_ID_SKL_DPLL2) |
1844 					     BIT(DPLL_ID_SKL_DPLL1));
1845 	if (!pll)
1846 		return -EINVAL;
1847 
1848 	intel_reference_shared_dpll(state, crtc,
1849 				    pll, &crtc_state->dpll_hw_state);
1850 
1851 	crtc_state->shared_dpll = pll;
1852 
1853 	return 0;
1854 }
1855 
skl_ddi_pll_get_freq(struct drm_i915_private * i915,const struct intel_shared_dpll * pll,const struct intel_dpll_hw_state * pll_state)1856 static int skl_ddi_pll_get_freq(struct drm_i915_private *i915,
1857 				const struct intel_shared_dpll *pll,
1858 				const struct intel_dpll_hw_state *pll_state)
1859 {
1860 	/*
1861 	 * ctrl1 register is already shifted for each pll, just use 0 to get
1862 	 * the internal shift for each field
1863 	 */
1864 	if (pll_state->ctrl1 & DPLL_CTRL1_HDMI_MODE(0))
1865 		return skl_ddi_wrpll_get_freq(i915, pll, pll_state);
1866 	else
1867 		return skl_ddi_lcpll_get_freq(i915, pll, pll_state);
1868 }
1869 
skl_update_dpll_ref_clks(struct drm_i915_private * i915)1870 static void skl_update_dpll_ref_clks(struct drm_i915_private *i915)
1871 {
1872 	/* No SSC ref */
1873 	i915->display.dpll.ref_clks.nssc = i915->display.cdclk.hw.ref;
1874 }
1875 
skl_dump_hw_state(struct drm_i915_private * dev_priv,const struct intel_dpll_hw_state * hw_state)1876 static void skl_dump_hw_state(struct drm_i915_private *dev_priv,
1877 			      const struct intel_dpll_hw_state *hw_state)
1878 {
1879 	drm_dbg_kms(&dev_priv->drm, "dpll_hw_state: "
1880 		      "ctrl1: 0x%x, cfgcr1: 0x%x, cfgcr2: 0x%x\n",
1881 		      hw_state->ctrl1,
1882 		      hw_state->cfgcr1,
1883 		      hw_state->cfgcr2);
1884 }
1885 
1886 static const struct intel_shared_dpll_funcs skl_ddi_pll_funcs = {
1887 	.enable = skl_ddi_pll_enable,
1888 	.disable = skl_ddi_pll_disable,
1889 	.get_hw_state = skl_ddi_pll_get_hw_state,
1890 	.get_freq = skl_ddi_pll_get_freq,
1891 };
1892 
1893 static const struct intel_shared_dpll_funcs skl_ddi_dpll0_funcs = {
1894 	.enable = skl_ddi_dpll0_enable,
1895 	.disable = skl_ddi_dpll0_disable,
1896 	.get_hw_state = skl_ddi_dpll0_get_hw_state,
1897 	.get_freq = skl_ddi_pll_get_freq,
1898 };
1899 
1900 static const struct dpll_info skl_plls[] = {
1901 	{ "DPLL 0", &skl_ddi_dpll0_funcs, DPLL_ID_SKL_DPLL0, INTEL_DPLL_ALWAYS_ON },
1902 	{ "DPLL 1", &skl_ddi_pll_funcs,   DPLL_ID_SKL_DPLL1, 0 },
1903 	{ "DPLL 2", &skl_ddi_pll_funcs,   DPLL_ID_SKL_DPLL2, 0 },
1904 	{ "DPLL 3", &skl_ddi_pll_funcs,   DPLL_ID_SKL_DPLL3, 0 },
1905 	{ },
1906 };
1907 
1908 static const struct intel_dpll_mgr skl_pll_mgr = {
1909 	.dpll_info = skl_plls,
1910 	.compute_dplls = skl_compute_dpll,
1911 	.get_dplls = skl_get_dpll,
1912 	.put_dplls = intel_put_dpll,
1913 	.update_ref_clks = skl_update_dpll_ref_clks,
1914 	.dump_hw_state = skl_dump_hw_state,
1915 };
1916 
bxt_ddi_pll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)1917 static void bxt_ddi_pll_enable(struct drm_i915_private *dev_priv,
1918 				struct intel_shared_dpll *pll)
1919 {
1920 	u32 temp;
1921 	enum port port = (enum port)pll->info->id; /* 1:1 port->PLL mapping */
1922 	enum dpio_phy phy;
1923 	enum dpio_channel ch;
1924 
1925 	bxt_port_to_phy_channel(dev_priv, port, &phy, &ch);
1926 
1927 	/* Non-SSC reference */
1928 	intel_de_rmw(dev_priv, BXT_PORT_PLL_ENABLE(port), 0, PORT_PLL_REF_SEL);
1929 
1930 	if (IS_GEMINILAKE(dev_priv)) {
1931 		intel_de_rmw(dev_priv, BXT_PORT_PLL_ENABLE(port),
1932 			     0, PORT_PLL_POWER_ENABLE);
1933 
1934 		if (wait_for_us((intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port)) &
1935 				 PORT_PLL_POWER_STATE), 200))
1936 			drm_err(&dev_priv->drm,
1937 				"Power state not set for PLL:%d\n", port);
1938 	}
1939 
1940 	/* Disable 10 bit clock */
1941 	intel_de_rmw(dev_priv, BXT_PORT_PLL_EBB_4(phy, ch),
1942 		     PORT_PLL_10BIT_CLK_ENABLE, 0);
1943 
1944 	/* Write P1 & P2 */
1945 	intel_de_rmw(dev_priv, BXT_PORT_PLL_EBB_0(phy, ch),
1946 		     PORT_PLL_P1_MASK | PORT_PLL_P2_MASK, pll->state.hw_state.ebb0);
1947 
1948 	/* Write M2 integer */
1949 	intel_de_rmw(dev_priv, BXT_PORT_PLL(phy, ch, 0),
1950 		     PORT_PLL_M2_INT_MASK, pll->state.hw_state.pll0);
1951 
1952 	/* Write N */
1953 	intel_de_rmw(dev_priv, BXT_PORT_PLL(phy, ch, 1),
1954 		     PORT_PLL_N_MASK, pll->state.hw_state.pll1);
1955 
1956 	/* Write M2 fraction */
1957 	intel_de_rmw(dev_priv, BXT_PORT_PLL(phy, ch, 2),
1958 		     PORT_PLL_M2_FRAC_MASK, pll->state.hw_state.pll2);
1959 
1960 	/* Write M2 fraction enable */
1961 	intel_de_rmw(dev_priv, BXT_PORT_PLL(phy, ch, 3),
1962 		     PORT_PLL_M2_FRAC_ENABLE, pll->state.hw_state.pll3);
1963 
1964 	/* Write coeff */
1965 	temp = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 6));
1966 	temp &= ~PORT_PLL_PROP_COEFF_MASK;
1967 	temp &= ~PORT_PLL_INT_COEFF_MASK;
1968 	temp &= ~PORT_PLL_GAIN_CTL_MASK;
1969 	temp |= pll->state.hw_state.pll6;
1970 	intel_de_write(dev_priv, BXT_PORT_PLL(phy, ch, 6), temp);
1971 
1972 	/* Write calibration val */
1973 	intel_de_rmw(dev_priv, BXT_PORT_PLL(phy, ch, 8),
1974 		     PORT_PLL_TARGET_CNT_MASK, pll->state.hw_state.pll8);
1975 
1976 	intel_de_rmw(dev_priv, BXT_PORT_PLL(phy, ch, 9),
1977 		     PORT_PLL_LOCK_THRESHOLD_MASK, pll->state.hw_state.pll9);
1978 
1979 	temp = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 10));
1980 	temp &= ~PORT_PLL_DCO_AMP_OVR_EN_H;
1981 	temp &= ~PORT_PLL_DCO_AMP_MASK;
1982 	temp |= pll->state.hw_state.pll10;
1983 	intel_de_write(dev_priv, BXT_PORT_PLL(phy, ch, 10), temp);
1984 
1985 	/* Recalibrate with new settings */
1986 	temp = intel_de_read(dev_priv, BXT_PORT_PLL_EBB_4(phy, ch));
1987 	temp |= PORT_PLL_RECALIBRATE;
1988 	intel_de_write(dev_priv, BXT_PORT_PLL_EBB_4(phy, ch), temp);
1989 	temp &= ~PORT_PLL_10BIT_CLK_ENABLE;
1990 	temp |= pll->state.hw_state.ebb4;
1991 	intel_de_write(dev_priv, BXT_PORT_PLL_EBB_4(phy, ch), temp);
1992 
1993 	/* Enable PLL */
1994 	intel_de_rmw(dev_priv, BXT_PORT_PLL_ENABLE(port), 0, PORT_PLL_ENABLE);
1995 	intel_de_posting_read(dev_priv, BXT_PORT_PLL_ENABLE(port));
1996 
1997 	if (wait_for_us((intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port)) & PORT_PLL_LOCK),
1998 			200))
1999 		drm_err(&dev_priv->drm, "PLL %d not locked\n", port);
2000 
2001 	if (IS_GEMINILAKE(dev_priv)) {
2002 		temp = intel_de_read(dev_priv, BXT_PORT_TX_DW5_LN0(phy, ch));
2003 		temp |= DCC_DELAY_RANGE_2;
2004 		intel_de_write(dev_priv, BXT_PORT_TX_DW5_GRP(phy, ch), temp);
2005 	}
2006 
2007 	/*
2008 	 * While we write to the group register to program all lanes at once we
2009 	 * can read only lane registers and we pick lanes 0/1 for that.
2010 	 */
2011 	temp = intel_de_read(dev_priv, BXT_PORT_PCS_DW12_LN01(phy, ch));
2012 	temp &= ~LANE_STAGGER_MASK;
2013 	temp &= ~LANESTAGGER_STRAP_OVRD;
2014 	temp |= pll->state.hw_state.pcsdw12;
2015 	intel_de_write(dev_priv, BXT_PORT_PCS_DW12_GRP(phy, ch), temp);
2016 }
2017 
bxt_ddi_pll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)2018 static void bxt_ddi_pll_disable(struct drm_i915_private *dev_priv,
2019 					struct intel_shared_dpll *pll)
2020 {
2021 	enum port port = (enum port)pll->info->id; /* 1:1 port->PLL mapping */
2022 
2023 	intel_de_rmw(dev_priv, BXT_PORT_PLL_ENABLE(port), PORT_PLL_ENABLE, 0);
2024 	intel_de_posting_read(dev_priv, BXT_PORT_PLL_ENABLE(port));
2025 
2026 	if (IS_GEMINILAKE(dev_priv)) {
2027 		intel_de_rmw(dev_priv, BXT_PORT_PLL_ENABLE(port),
2028 			     PORT_PLL_POWER_ENABLE, 0);
2029 
2030 		if (wait_for_us(!(intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port)) &
2031 				  PORT_PLL_POWER_STATE), 200))
2032 			drm_err(&dev_priv->drm,
2033 				"Power state not reset for PLL:%d\n", port);
2034 	}
2035 }
2036 
bxt_ddi_pll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)2037 static bool bxt_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
2038 					struct intel_shared_dpll *pll,
2039 					struct intel_dpll_hw_state *hw_state)
2040 {
2041 	enum port port = (enum port)pll->info->id; /* 1:1 port->PLL mapping */
2042 	intel_wakeref_t wakeref;
2043 	enum dpio_phy phy;
2044 	enum dpio_channel ch;
2045 	u32 val;
2046 	bool ret;
2047 
2048 	bxt_port_to_phy_channel(dev_priv, port, &phy, &ch);
2049 
2050 	wakeref = intel_display_power_get_if_enabled(dev_priv,
2051 						     POWER_DOMAIN_DISPLAY_CORE);
2052 	if (!wakeref)
2053 		return false;
2054 
2055 	ret = false;
2056 
2057 	val = intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port));
2058 	if (!(val & PORT_PLL_ENABLE))
2059 		goto out;
2060 
2061 	hw_state->ebb0 = intel_de_read(dev_priv, BXT_PORT_PLL_EBB_0(phy, ch));
2062 	hw_state->ebb0 &= PORT_PLL_P1_MASK | PORT_PLL_P2_MASK;
2063 
2064 	hw_state->ebb4 = intel_de_read(dev_priv, BXT_PORT_PLL_EBB_4(phy, ch));
2065 	hw_state->ebb4 &= PORT_PLL_10BIT_CLK_ENABLE;
2066 
2067 	hw_state->pll0 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 0));
2068 	hw_state->pll0 &= PORT_PLL_M2_INT_MASK;
2069 
2070 	hw_state->pll1 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 1));
2071 	hw_state->pll1 &= PORT_PLL_N_MASK;
2072 
2073 	hw_state->pll2 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 2));
2074 	hw_state->pll2 &= PORT_PLL_M2_FRAC_MASK;
2075 
2076 	hw_state->pll3 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 3));
2077 	hw_state->pll3 &= PORT_PLL_M2_FRAC_ENABLE;
2078 
2079 	hw_state->pll6 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 6));
2080 	hw_state->pll6 &= PORT_PLL_PROP_COEFF_MASK |
2081 			  PORT_PLL_INT_COEFF_MASK |
2082 			  PORT_PLL_GAIN_CTL_MASK;
2083 
2084 	hw_state->pll8 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 8));
2085 	hw_state->pll8 &= PORT_PLL_TARGET_CNT_MASK;
2086 
2087 	hw_state->pll9 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 9));
2088 	hw_state->pll9 &= PORT_PLL_LOCK_THRESHOLD_MASK;
2089 
2090 	hw_state->pll10 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 10));
2091 	hw_state->pll10 &= PORT_PLL_DCO_AMP_OVR_EN_H |
2092 			   PORT_PLL_DCO_AMP_MASK;
2093 
2094 	/*
2095 	 * While we write to the group register to program all lanes at once we
2096 	 * can read only lane registers. We configure all lanes the same way, so
2097 	 * here just read out lanes 0/1 and output a note if lanes 2/3 differ.
2098 	 */
2099 	hw_state->pcsdw12 = intel_de_read(dev_priv,
2100 					  BXT_PORT_PCS_DW12_LN01(phy, ch));
2101 	if (intel_de_read(dev_priv, BXT_PORT_PCS_DW12_LN23(phy, ch)) != hw_state->pcsdw12)
2102 		drm_dbg(&dev_priv->drm,
2103 			"lane stagger config different for lane 01 (%08x) and 23 (%08x)\n",
2104 			hw_state->pcsdw12,
2105 			intel_de_read(dev_priv,
2106 				      BXT_PORT_PCS_DW12_LN23(phy, ch)));
2107 	hw_state->pcsdw12 &= LANE_STAGGER_MASK | LANESTAGGER_STRAP_OVRD;
2108 
2109 	ret = true;
2110 
2111 out:
2112 	intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
2113 
2114 	return ret;
2115 }
2116 
2117 /* pre-calculated values for DP linkrates */
2118 static const struct dpll bxt_dp_clk_val[] = {
2119 	/* m2 is .22 binary fixed point */
2120 	{ .dot = 162000, .p1 = 4, .p2 = 2, .n = 1, .m1 = 2, .m2 = 0x819999a /* 32.4 */ },
2121 	{ .dot = 270000, .p1 = 4, .p2 = 1, .n = 1, .m1 = 2, .m2 = 0x6c00000 /* 27.0 */ },
2122 	{ .dot = 540000, .p1 = 2, .p2 = 1, .n = 1, .m1 = 2, .m2 = 0x6c00000 /* 27.0 */ },
2123 	{ .dot = 216000, .p1 = 3, .p2 = 2, .n = 1, .m1 = 2, .m2 = 0x819999a /* 32.4 */ },
2124 	{ .dot = 243000, .p1 = 4, .p2 = 1, .n = 1, .m1 = 2, .m2 = 0x6133333 /* 24.3 */ },
2125 	{ .dot = 324000, .p1 = 4, .p2 = 1, .n = 1, .m1 = 2, .m2 = 0x819999a /* 32.4 */ },
2126 	{ .dot = 432000, .p1 = 3, .p2 = 1, .n = 1, .m1 = 2, .m2 = 0x819999a /* 32.4 */ },
2127 };
2128 
2129 static int
bxt_ddi_hdmi_pll_dividers(struct intel_crtc_state * crtc_state,struct dpll * clk_div)2130 bxt_ddi_hdmi_pll_dividers(struct intel_crtc_state *crtc_state,
2131 			  struct dpll *clk_div)
2132 {
2133 	struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
2134 
2135 	/* Calculate HDMI div */
2136 	/*
2137 	 * FIXME: tie the following calculation into
2138 	 * i9xx_crtc_compute_clock
2139 	 */
2140 	if (!bxt_find_best_dpll(crtc_state, clk_div))
2141 		return -EINVAL;
2142 
2143 	drm_WARN_ON(&i915->drm, clk_div->m1 != 2);
2144 
2145 	return 0;
2146 }
2147 
bxt_ddi_dp_pll_dividers(struct intel_crtc_state * crtc_state,struct dpll * clk_div)2148 static void bxt_ddi_dp_pll_dividers(struct intel_crtc_state *crtc_state,
2149 				    struct dpll *clk_div)
2150 {
2151 	struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
2152 	int i;
2153 
2154 	*clk_div = bxt_dp_clk_val[0];
2155 	for (i = 0; i < ARRAY_SIZE(bxt_dp_clk_val); ++i) {
2156 		if (crtc_state->port_clock == bxt_dp_clk_val[i].dot) {
2157 			*clk_div = bxt_dp_clk_val[i];
2158 			break;
2159 		}
2160 	}
2161 
2162 	chv_calc_dpll_params(i915->display.dpll.ref_clks.nssc, clk_div);
2163 
2164 	drm_WARN_ON(&i915->drm, clk_div->vco == 0 ||
2165 		    clk_div->dot != crtc_state->port_clock);
2166 }
2167 
bxt_ddi_set_dpll_hw_state(struct intel_crtc_state * crtc_state,const struct dpll * clk_div)2168 static int bxt_ddi_set_dpll_hw_state(struct intel_crtc_state *crtc_state,
2169 				     const struct dpll *clk_div)
2170 {
2171 	struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
2172 	struct intel_dpll_hw_state *dpll_hw_state = &crtc_state->dpll_hw_state;
2173 	int clock = crtc_state->port_clock;
2174 	int vco = clk_div->vco;
2175 	u32 prop_coef, int_coef, gain_ctl, targ_cnt;
2176 	u32 lanestagger;
2177 
2178 	if (vco >= 6200000 && vco <= 6700000) {
2179 		prop_coef = 4;
2180 		int_coef = 9;
2181 		gain_ctl = 3;
2182 		targ_cnt = 8;
2183 	} else if ((vco > 5400000 && vco < 6200000) ||
2184 			(vco >= 4800000 && vco < 5400000)) {
2185 		prop_coef = 5;
2186 		int_coef = 11;
2187 		gain_ctl = 3;
2188 		targ_cnt = 9;
2189 	} else if (vco == 5400000) {
2190 		prop_coef = 3;
2191 		int_coef = 8;
2192 		gain_ctl = 1;
2193 		targ_cnt = 9;
2194 	} else {
2195 		drm_err(&i915->drm, "Invalid VCO\n");
2196 		return -EINVAL;
2197 	}
2198 
2199 	if (clock > 270000)
2200 		lanestagger = 0x18;
2201 	else if (clock > 135000)
2202 		lanestagger = 0x0d;
2203 	else if (clock > 67000)
2204 		lanestagger = 0x07;
2205 	else if (clock > 33000)
2206 		lanestagger = 0x04;
2207 	else
2208 		lanestagger = 0x02;
2209 
2210 	dpll_hw_state->ebb0 = PORT_PLL_P1(clk_div->p1) | PORT_PLL_P2(clk_div->p2);
2211 	dpll_hw_state->pll0 = PORT_PLL_M2_INT(clk_div->m2 >> 22);
2212 	dpll_hw_state->pll1 = PORT_PLL_N(clk_div->n);
2213 	dpll_hw_state->pll2 = PORT_PLL_M2_FRAC(clk_div->m2 & 0x3fffff);
2214 
2215 	if (clk_div->m2 & 0x3fffff)
2216 		dpll_hw_state->pll3 = PORT_PLL_M2_FRAC_ENABLE;
2217 
2218 	dpll_hw_state->pll6 = PORT_PLL_PROP_COEFF(prop_coef) |
2219 		PORT_PLL_INT_COEFF(int_coef) |
2220 		PORT_PLL_GAIN_CTL(gain_ctl);
2221 
2222 	dpll_hw_state->pll8 = PORT_PLL_TARGET_CNT(targ_cnt);
2223 
2224 	dpll_hw_state->pll9 = PORT_PLL_LOCK_THRESHOLD(5);
2225 
2226 	dpll_hw_state->pll10 = PORT_PLL_DCO_AMP(15) |
2227 		PORT_PLL_DCO_AMP_OVR_EN_H;
2228 
2229 	dpll_hw_state->ebb4 = PORT_PLL_10BIT_CLK_ENABLE;
2230 
2231 	dpll_hw_state->pcsdw12 = LANESTAGGER_STRAP_OVRD | lanestagger;
2232 
2233 	return 0;
2234 }
2235 
bxt_ddi_pll_get_freq(struct drm_i915_private * i915,const struct intel_shared_dpll * pll,const struct intel_dpll_hw_state * pll_state)2236 static int bxt_ddi_pll_get_freq(struct drm_i915_private *i915,
2237 				const struct intel_shared_dpll *pll,
2238 				const struct intel_dpll_hw_state *pll_state)
2239 {
2240 	struct dpll clock;
2241 
2242 	clock.m1 = 2;
2243 	clock.m2 = REG_FIELD_GET(PORT_PLL_M2_INT_MASK, pll_state->pll0) << 22;
2244 	if (pll_state->pll3 & PORT_PLL_M2_FRAC_ENABLE)
2245 		clock.m2 |= REG_FIELD_GET(PORT_PLL_M2_FRAC_MASK, pll_state->pll2);
2246 	clock.n = REG_FIELD_GET(PORT_PLL_N_MASK, pll_state->pll1);
2247 	clock.p1 = REG_FIELD_GET(PORT_PLL_P1_MASK, pll_state->ebb0);
2248 	clock.p2 = REG_FIELD_GET(PORT_PLL_P2_MASK, pll_state->ebb0);
2249 
2250 	return chv_calc_dpll_params(i915->display.dpll.ref_clks.nssc, &clock);
2251 }
2252 
2253 static int
bxt_ddi_dp_set_dpll_hw_state(struct intel_crtc_state * crtc_state)2254 bxt_ddi_dp_set_dpll_hw_state(struct intel_crtc_state *crtc_state)
2255 {
2256 	struct dpll clk_div = {};
2257 
2258 	bxt_ddi_dp_pll_dividers(crtc_state, &clk_div);
2259 
2260 	return bxt_ddi_set_dpll_hw_state(crtc_state, &clk_div);
2261 }
2262 
2263 static int
bxt_ddi_hdmi_set_dpll_hw_state(struct intel_crtc_state * crtc_state)2264 bxt_ddi_hdmi_set_dpll_hw_state(struct intel_crtc_state *crtc_state)
2265 {
2266 	struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
2267 	struct dpll clk_div = {};
2268 	int ret;
2269 
2270 	bxt_ddi_hdmi_pll_dividers(crtc_state, &clk_div);
2271 
2272 	ret = bxt_ddi_set_dpll_hw_state(crtc_state, &clk_div);
2273 	if (ret)
2274 		return ret;
2275 
2276 	crtc_state->port_clock = bxt_ddi_pll_get_freq(i915, NULL,
2277 						      &crtc_state->dpll_hw_state);
2278 
2279 	return 0;
2280 }
2281 
bxt_compute_dpll(struct intel_atomic_state * state,struct intel_crtc * crtc,struct intel_encoder * encoder)2282 static int bxt_compute_dpll(struct intel_atomic_state *state,
2283 			    struct intel_crtc *crtc,
2284 			    struct intel_encoder *encoder)
2285 {
2286 	struct intel_crtc_state *crtc_state =
2287 		intel_atomic_get_new_crtc_state(state, crtc);
2288 
2289 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI))
2290 		return bxt_ddi_hdmi_set_dpll_hw_state(crtc_state);
2291 	else if (intel_crtc_has_dp_encoder(crtc_state))
2292 		return bxt_ddi_dp_set_dpll_hw_state(crtc_state);
2293 	else
2294 		return -EINVAL;
2295 }
2296 
bxt_get_dpll(struct intel_atomic_state * state,struct intel_crtc * crtc,struct intel_encoder * encoder)2297 static int bxt_get_dpll(struct intel_atomic_state *state,
2298 			struct intel_crtc *crtc,
2299 			struct intel_encoder *encoder)
2300 {
2301 	struct intel_crtc_state *crtc_state =
2302 		intel_atomic_get_new_crtc_state(state, crtc);
2303 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
2304 	struct intel_shared_dpll *pll;
2305 	enum intel_dpll_id id;
2306 
2307 	/* 1:1 mapping between ports and PLLs */
2308 	id = (enum intel_dpll_id) encoder->port;
2309 	pll = intel_get_shared_dpll_by_id(dev_priv, id);
2310 
2311 	drm_dbg_kms(&dev_priv->drm, "[CRTC:%d:%s] using pre-allocated %s\n",
2312 		    crtc->base.base.id, crtc->base.name, pll->info->name);
2313 
2314 	intel_reference_shared_dpll(state, crtc,
2315 				    pll, &crtc_state->dpll_hw_state);
2316 
2317 	crtc_state->shared_dpll = pll;
2318 
2319 	return 0;
2320 }
2321 
bxt_update_dpll_ref_clks(struct drm_i915_private * i915)2322 static void bxt_update_dpll_ref_clks(struct drm_i915_private *i915)
2323 {
2324 	i915->display.dpll.ref_clks.ssc = 100000;
2325 	i915->display.dpll.ref_clks.nssc = 100000;
2326 	/* DSI non-SSC ref 19.2MHz */
2327 }
2328 
bxt_dump_hw_state(struct drm_i915_private * dev_priv,const struct intel_dpll_hw_state * hw_state)2329 static void bxt_dump_hw_state(struct drm_i915_private *dev_priv,
2330 			      const struct intel_dpll_hw_state *hw_state)
2331 {
2332 	drm_dbg_kms(&dev_priv->drm, "dpll_hw_state: ebb0: 0x%x, ebb4: 0x%x,"
2333 		    "pll0: 0x%x, pll1: 0x%x, pll2: 0x%x, pll3: 0x%x, "
2334 		    "pll6: 0x%x, pll8: 0x%x, pll9: 0x%x, pll10: 0x%x, pcsdw12: 0x%x\n",
2335 		    hw_state->ebb0,
2336 		    hw_state->ebb4,
2337 		    hw_state->pll0,
2338 		    hw_state->pll1,
2339 		    hw_state->pll2,
2340 		    hw_state->pll3,
2341 		    hw_state->pll6,
2342 		    hw_state->pll8,
2343 		    hw_state->pll9,
2344 		    hw_state->pll10,
2345 		    hw_state->pcsdw12);
2346 }
2347 
2348 static const struct intel_shared_dpll_funcs bxt_ddi_pll_funcs = {
2349 	.enable = bxt_ddi_pll_enable,
2350 	.disable = bxt_ddi_pll_disable,
2351 	.get_hw_state = bxt_ddi_pll_get_hw_state,
2352 	.get_freq = bxt_ddi_pll_get_freq,
2353 };
2354 
2355 static const struct dpll_info bxt_plls[] = {
2356 	{ "PORT PLL A", &bxt_ddi_pll_funcs, DPLL_ID_SKL_DPLL0, 0 },
2357 	{ "PORT PLL B", &bxt_ddi_pll_funcs, DPLL_ID_SKL_DPLL1, 0 },
2358 	{ "PORT PLL C", &bxt_ddi_pll_funcs, DPLL_ID_SKL_DPLL2, 0 },
2359 	{ },
2360 };
2361 
2362 static const struct intel_dpll_mgr bxt_pll_mgr = {
2363 	.dpll_info = bxt_plls,
2364 	.compute_dplls = bxt_compute_dpll,
2365 	.get_dplls = bxt_get_dpll,
2366 	.put_dplls = intel_put_dpll,
2367 	.update_ref_clks = bxt_update_dpll_ref_clks,
2368 	.dump_hw_state = bxt_dump_hw_state,
2369 };
2370 
icl_wrpll_get_multipliers(int bestdiv,int * pdiv,int * qdiv,int * kdiv)2371 static void icl_wrpll_get_multipliers(int bestdiv, int *pdiv,
2372 				      int *qdiv, int *kdiv)
2373 {
2374 	/* even dividers */
2375 	if (bestdiv % 2 == 0) {
2376 		if (bestdiv == 2) {
2377 			*pdiv = 2;
2378 			*qdiv = 1;
2379 			*kdiv = 1;
2380 		} else if (bestdiv % 4 == 0) {
2381 			*pdiv = 2;
2382 			*qdiv = bestdiv / 4;
2383 			*kdiv = 2;
2384 		} else if (bestdiv % 6 == 0) {
2385 			*pdiv = 3;
2386 			*qdiv = bestdiv / 6;
2387 			*kdiv = 2;
2388 		} else if (bestdiv % 5 == 0) {
2389 			*pdiv = 5;
2390 			*qdiv = bestdiv / 10;
2391 			*kdiv = 2;
2392 		} else if (bestdiv % 14 == 0) {
2393 			*pdiv = 7;
2394 			*qdiv = bestdiv / 14;
2395 			*kdiv = 2;
2396 		}
2397 	} else {
2398 		if (bestdiv == 3 || bestdiv == 5 || bestdiv == 7) {
2399 			*pdiv = bestdiv;
2400 			*qdiv = 1;
2401 			*kdiv = 1;
2402 		} else { /* 9, 15, 21 */
2403 			*pdiv = bestdiv / 3;
2404 			*qdiv = 1;
2405 			*kdiv = 3;
2406 		}
2407 	}
2408 }
2409 
icl_wrpll_params_populate(struct skl_wrpll_params * params,u32 dco_freq,u32 ref_freq,int pdiv,int qdiv,int kdiv)2410 static void icl_wrpll_params_populate(struct skl_wrpll_params *params,
2411 				      u32 dco_freq, u32 ref_freq,
2412 				      int pdiv, int qdiv, int kdiv)
2413 {
2414 	u32 dco;
2415 
2416 	switch (kdiv) {
2417 	case 1:
2418 		params->kdiv = 1;
2419 		break;
2420 	case 2:
2421 		params->kdiv = 2;
2422 		break;
2423 	case 3:
2424 		params->kdiv = 4;
2425 		break;
2426 	default:
2427 		WARN(1, "Incorrect KDiv\n");
2428 	}
2429 
2430 	switch (pdiv) {
2431 	case 2:
2432 		params->pdiv = 1;
2433 		break;
2434 	case 3:
2435 		params->pdiv = 2;
2436 		break;
2437 	case 5:
2438 		params->pdiv = 4;
2439 		break;
2440 	case 7:
2441 		params->pdiv = 8;
2442 		break;
2443 	default:
2444 		WARN(1, "Incorrect PDiv\n");
2445 	}
2446 
2447 	WARN_ON(kdiv != 2 && qdiv != 1);
2448 
2449 	params->qdiv_ratio = qdiv;
2450 	params->qdiv_mode = (qdiv == 1) ? 0 : 1;
2451 
2452 	dco = div_u64((u64)dco_freq << 15, ref_freq);
2453 
2454 	params->dco_integer = dco >> 15;
2455 	params->dco_fraction = dco & 0x7fff;
2456 }
2457 
2458 /*
2459  * Display WA #22010492432: ehl, tgl, adl-s, adl-p
2460  * Program half of the nominal DCO divider fraction value.
2461  */
2462 static bool
ehl_combo_pll_div_frac_wa_needed(struct drm_i915_private * i915)2463 ehl_combo_pll_div_frac_wa_needed(struct drm_i915_private *i915)
2464 {
2465 	return ((IS_ELKHARTLAKE(i915) &&
2466 		 IS_DISPLAY_STEP(i915, STEP_B0, STEP_FOREVER)) ||
2467 		 IS_TIGERLAKE(i915) || IS_ALDERLAKE_S(i915) || IS_ALDERLAKE_P(i915)) &&
2468 		 i915->display.dpll.ref_clks.nssc == 38400;
2469 }
2470 
2471 struct icl_combo_pll_params {
2472 	int clock;
2473 	struct skl_wrpll_params wrpll;
2474 };
2475 
2476 /*
2477  * These values alrea already adjusted: they're the bits we write to the
2478  * registers, not the logical values.
2479  */
2480 static const struct icl_combo_pll_params icl_dp_combo_pll_24MHz_values[] = {
2481 	{ 540000,
2482 	  { .dco_integer = 0x151, .dco_fraction = 0x4000,		/* [0]: 5.4 */
2483 	    .pdiv = 0x2 /* 3 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2484 	{ 270000,
2485 	  { .dco_integer = 0x151, .dco_fraction = 0x4000,		/* [1]: 2.7 */
2486 	    .pdiv = 0x2 /* 3 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2487 	{ 162000,
2488 	  { .dco_integer = 0x151, .dco_fraction = 0x4000,		/* [2]: 1.62 */
2489 	    .pdiv = 0x4 /* 5 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2490 	{ 324000,
2491 	  { .dco_integer = 0x151, .dco_fraction = 0x4000,		/* [3]: 3.24 */
2492 	    .pdiv = 0x4 /* 5 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2493 	{ 216000,
2494 	  { .dco_integer = 0x168, .dco_fraction = 0x0000,		/* [4]: 2.16 */
2495 	    .pdiv = 0x1 /* 2 */, .kdiv = 2, .qdiv_mode = 1, .qdiv_ratio = 2, }, },
2496 	{ 432000,
2497 	  { .dco_integer = 0x168, .dco_fraction = 0x0000,		/* [5]: 4.32 */
2498 	    .pdiv = 0x1 /* 2 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2499 	{ 648000,
2500 	  { .dco_integer = 0x195, .dco_fraction = 0x0000,		/* [6]: 6.48 */
2501 	    .pdiv = 0x2 /* 3 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2502 	{ 810000,
2503 	  { .dco_integer = 0x151, .dco_fraction = 0x4000,		/* [7]: 8.1 */
2504 	    .pdiv = 0x1 /* 2 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2505 };
2506 
2507 
2508 /* Also used for 38.4 MHz values. */
2509 static const struct icl_combo_pll_params icl_dp_combo_pll_19_2MHz_values[] = {
2510 	{ 540000,
2511 	  { .dco_integer = 0x1A5, .dco_fraction = 0x7000,		/* [0]: 5.4 */
2512 	    .pdiv = 0x2 /* 3 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2513 	{ 270000,
2514 	  { .dco_integer = 0x1A5, .dco_fraction = 0x7000,		/* [1]: 2.7 */
2515 	    .pdiv = 0x2 /* 3 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2516 	{ 162000,
2517 	  { .dco_integer = 0x1A5, .dco_fraction = 0x7000,		/* [2]: 1.62 */
2518 	    .pdiv = 0x4 /* 5 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2519 	{ 324000,
2520 	  { .dco_integer = 0x1A5, .dco_fraction = 0x7000,		/* [3]: 3.24 */
2521 	    .pdiv = 0x4 /* 5 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2522 	{ 216000,
2523 	  { .dco_integer = 0x1C2, .dco_fraction = 0x0000,		/* [4]: 2.16 */
2524 	    .pdiv = 0x1 /* 2 */, .kdiv = 2, .qdiv_mode = 1, .qdiv_ratio = 2, }, },
2525 	{ 432000,
2526 	  { .dco_integer = 0x1C2, .dco_fraction = 0x0000,		/* [5]: 4.32 */
2527 	    .pdiv = 0x1 /* 2 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2528 	{ 648000,
2529 	  { .dco_integer = 0x1FA, .dco_fraction = 0x2000,		/* [6]: 6.48 */
2530 	    .pdiv = 0x2 /* 3 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2531 	{ 810000,
2532 	  { .dco_integer = 0x1A5, .dco_fraction = 0x7000,		/* [7]: 8.1 */
2533 	    .pdiv = 0x1 /* 2 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2534 };
2535 
2536 static const struct skl_wrpll_params icl_tbt_pll_24MHz_values = {
2537 	.dco_integer = 0x151, .dco_fraction = 0x4000,
2538 	.pdiv = 0x4 /* 5 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0,
2539 };
2540 
2541 static const struct skl_wrpll_params icl_tbt_pll_19_2MHz_values = {
2542 	.dco_integer = 0x1A5, .dco_fraction = 0x7000,
2543 	.pdiv = 0x4 /* 5 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0,
2544 };
2545 
2546 static const struct skl_wrpll_params tgl_tbt_pll_19_2MHz_values = {
2547 	.dco_integer = 0x54, .dco_fraction = 0x3000,
2548 	/* the following params are unused */
2549 	.pdiv = 0, .kdiv = 0, .qdiv_mode = 0, .qdiv_ratio = 0,
2550 };
2551 
2552 static const struct skl_wrpll_params tgl_tbt_pll_24MHz_values = {
2553 	.dco_integer = 0x43, .dco_fraction = 0x4000,
2554 	/* the following params are unused */
2555 };
2556 
icl_calc_dp_combo_pll(struct intel_crtc_state * crtc_state,struct skl_wrpll_params * pll_params)2557 static int icl_calc_dp_combo_pll(struct intel_crtc_state *crtc_state,
2558 				 struct skl_wrpll_params *pll_params)
2559 {
2560 	struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
2561 	const struct icl_combo_pll_params *params =
2562 		dev_priv->display.dpll.ref_clks.nssc == 24000 ?
2563 		icl_dp_combo_pll_24MHz_values :
2564 		icl_dp_combo_pll_19_2MHz_values;
2565 	int clock = crtc_state->port_clock;
2566 	int i;
2567 
2568 	for (i = 0; i < ARRAY_SIZE(icl_dp_combo_pll_24MHz_values); i++) {
2569 		if (clock == params[i].clock) {
2570 			*pll_params = params[i].wrpll;
2571 			return 0;
2572 		}
2573 	}
2574 
2575 	MISSING_CASE(clock);
2576 	return -EINVAL;
2577 }
2578 
icl_calc_tbt_pll(struct intel_crtc_state * crtc_state,struct skl_wrpll_params * pll_params)2579 static int icl_calc_tbt_pll(struct intel_crtc_state *crtc_state,
2580 			    struct skl_wrpll_params *pll_params)
2581 {
2582 	struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
2583 
2584 	if (DISPLAY_VER(dev_priv) >= 12) {
2585 		switch (dev_priv->display.dpll.ref_clks.nssc) {
2586 		default:
2587 			MISSING_CASE(dev_priv->display.dpll.ref_clks.nssc);
2588 			fallthrough;
2589 		case 19200:
2590 		case 38400:
2591 			*pll_params = tgl_tbt_pll_19_2MHz_values;
2592 			break;
2593 		case 24000:
2594 			*pll_params = tgl_tbt_pll_24MHz_values;
2595 			break;
2596 		}
2597 	} else {
2598 		switch (dev_priv->display.dpll.ref_clks.nssc) {
2599 		default:
2600 			MISSING_CASE(dev_priv->display.dpll.ref_clks.nssc);
2601 			fallthrough;
2602 		case 19200:
2603 		case 38400:
2604 			*pll_params = icl_tbt_pll_19_2MHz_values;
2605 			break;
2606 		case 24000:
2607 			*pll_params = icl_tbt_pll_24MHz_values;
2608 			break;
2609 		}
2610 	}
2611 
2612 	return 0;
2613 }
2614 
icl_ddi_tbt_pll_get_freq(struct drm_i915_private * i915,const struct intel_shared_dpll * pll,const struct intel_dpll_hw_state * pll_state)2615 static int icl_ddi_tbt_pll_get_freq(struct drm_i915_private *i915,
2616 				    const struct intel_shared_dpll *pll,
2617 				    const struct intel_dpll_hw_state *pll_state)
2618 {
2619 	/*
2620 	 * The PLL outputs multiple frequencies at the same time, selection is
2621 	 * made at DDI clock mux level.
2622 	 */
2623 	drm_WARN_ON(&i915->drm, 1);
2624 
2625 	return 0;
2626 }
2627 
icl_wrpll_ref_clock(struct drm_i915_private * i915)2628 static int icl_wrpll_ref_clock(struct drm_i915_private *i915)
2629 {
2630 	int ref_clock = i915->display.dpll.ref_clks.nssc;
2631 
2632 	/*
2633 	 * For ICL+, the spec states: if reference frequency is 38.4,
2634 	 * use 19.2 because the DPLL automatically divides that by 2.
2635 	 */
2636 	if (ref_clock == 38400)
2637 		ref_clock = 19200;
2638 
2639 	return ref_clock;
2640 }
2641 
2642 static int
icl_calc_wrpll(struct intel_crtc_state * crtc_state,struct skl_wrpll_params * wrpll_params)2643 icl_calc_wrpll(struct intel_crtc_state *crtc_state,
2644 	       struct skl_wrpll_params *wrpll_params)
2645 {
2646 	struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
2647 	int ref_clock = icl_wrpll_ref_clock(i915);
2648 	u32 afe_clock = crtc_state->port_clock * 5;
2649 	u32 dco_min = 7998000;
2650 	u32 dco_max = 10000000;
2651 	u32 dco_mid = (dco_min + dco_max) / 2;
2652 	static const int dividers[] = {  2,  4,  6,  8, 10, 12,  14,  16,
2653 					 18, 20, 24, 28, 30, 32,  36,  40,
2654 					 42, 44, 48, 50, 52, 54,  56,  60,
2655 					 64, 66, 68, 70, 72, 76,  78,  80,
2656 					 84, 88, 90, 92, 96, 98, 100, 102,
2657 					  3,  5,  7,  9, 15, 21 };
2658 	u32 dco, best_dco = 0, dco_centrality = 0;
2659 	u32 best_dco_centrality = U32_MAX; /* Spec meaning of 999999 MHz */
2660 	int d, best_div = 0, pdiv = 0, qdiv = 0, kdiv = 0;
2661 
2662 	for (d = 0; d < ARRAY_SIZE(dividers); d++) {
2663 		dco = afe_clock * dividers[d];
2664 
2665 		if (dco <= dco_max && dco >= dco_min) {
2666 			dco_centrality = abs(dco - dco_mid);
2667 
2668 			if (dco_centrality < best_dco_centrality) {
2669 				best_dco_centrality = dco_centrality;
2670 				best_div = dividers[d];
2671 				best_dco = dco;
2672 			}
2673 		}
2674 	}
2675 
2676 	if (best_div == 0)
2677 		return -EINVAL;
2678 
2679 	icl_wrpll_get_multipliers(best_div, &pdiv, &qdiv, &kdiv);
2680 	icl_wrpll_params_populate(wrpll_params, best_dco, ref_clock,
2681 				  pdiv, qdiv, kdiv);
2682 
2683 	return 0;
2684 }
2685 
icl_ddi_combo_pll_get_freq(struct drm_i915_private * i915,const struct intel_shared_dpll * pll,const struct intel_dpll_hw_state * pll_state)2686 static int icl_ddi_combo_pll_get_freq(struct drm_i915_private *i915,
2687 				      const struct intel_shared_dpll *pll,
2688 				      const struct intel_dpll_hw_state *pll_state)
2689 {
2690 	int ref_clock = icl_wrpll_ref_clock(i915);
2691 	u32 dco_fraction;
2692 	u32 p0, p1, p2, dco_freq;
2693 
2694 	p0 = pll_state->cfgcr1 & DPLL_CFGCR1_PDIV_MASK;
2695 	p2 = pll_state->cfgcr1 & DPLL_CFGCR1_KDIV_MASK;
2696 
2697 	if (pll_state->cfgcr1 & DPLL_CFGCR1_QDIV_MODE(1))
2698 		p1 = (pll_state->cfgcr1 & DPLL_CFGCR1_QDIV_RATIO_MASK) >>
2699 			DPLL_CFGCR1_QDIV_RATIO_SHIFT;
2700 	else
2701 		p1 = 1;
2702 
2703 	switch (p0) {
2704 	case DPLL_CFGCR1_PDIV_2:
2705 		p0 = 2;
2706 		break;
2707 	case DPLL_CFGCR1_PDIV_3:
2708 		p0 = 3;
2709 		break;
2710 	case DPLL_CFGCR1_PDIV_5:
2711 		p0 = 5;
2712 		break;
2713 	case DPLL_CFGCR1_PDIV_7:
2714 		p0 = 7;
2715 		break;
2716 	}
2717 
2718 	switch (p2) {
2719 	case DPLL_CFGCR1_KDIV_1:
2720 		p2 = 1;
2721 		break;
2722 	case DPLL_CFGCR1_KDIV_2:
2723 		p2 = 2;
2724 		break;
2725 	case DPLL_CFGCR1_KDIV_3:
2726 		p2 = 3;
2727 		break;
2728 	}
2729 
2730 	dco_freq = (pll_state->cfgcr0 & DPLL_CFGCR0_DCO_INTEGER_MASK) *
2731 		   ref_clock;
2732 
2733 	dco_fraction = (pll_state->cfgcr0 & DPLL_CFGCR0_DCO_FRACTION_MASK) >>
2734 		       DPLL_CFGCR0_DCO_FRACTION_SHIFT;
2735 
2736 	if (ehl_combo_pll_div_frac_wa_needed(i915))
2737 		dco_fraction *= 2;
2738 
2739 	dco_freq += (dco_fraction * ref_clock) / 0x8000;
2740 
2741 	if (drm_WARN_ON(&i915->drm, p0 == 0 || p1 == 0 || p2 == 0))
2742 		return 0;
2743 
2744 	return dco_freq / (p0 * p1 * p2 * 5);
2745 }
2746 
icl_calc_dpll_state(struct drm_i915_private * i915,const struct skl_wrpll_params * pll_params,struct intel_dpll_hw_state * pll_state)2747 static void icl_calc_dpll_state(struct drm_i915_private *i915,
2748 				const struct skl_wrpll_params *pll_params,
2749 				struct intel_dpll_hw_state *pll_state)
2750 {
2751 	u32 dco_fraction = pll_params->dco_fraction;
2752 
2753 	if (ehl_combo_pll_div_frac_wa_needed(i915))
2754 		dco_fraction = DIV_ROUND_CLOSEST(dco_fraction, 2);
2755 
2756 	pll_state->cfgcr0 = DPLL_CFGCR0_DCO_FRACTION(dco_fraction) |
2757 			    pll_params->dco_integer;
2758 
2759 	pll_state->cfgcr1 = DPLL_CFGCR1_QDIV_RATIO(pll_params->qdiv_ratio) |
2760 			    DPLL_CFGCR1_QDIV_MODE(pll_params->qdiv_mode) |
2761 			    DPLL_CFGCR1_KDIV(pll_params->kdiv) |
2762 			    DPLL_CFGCR1_PDIV(pll_params->pdiv);
2763 
2764 	if (DISPLAY_VER(i915) >= 12)
2765 		pll_state->cfgcr1 |= TGL_DPLL_CFGCR1_CFSELOVRD_NORMAL_XTAL;
2766 	else
2767 		pll_state->cfgcr1 |= DPLL_CFGCR1_CENTRAL_FREQ_8400;
2768 
2769 	if (i915->display.vbt.override_afc_startup)
2770 		pll_state->div0 = TGL_DPLL0_DIV0_AFC_STARTUP(i915->display.vbt.override_afc_startup_val);
2771 }
2772 
icl_mg_pll_find_divisors(int clock_khz,bool is_dp,bool use_ssc,u32 * target_dco_khz,struct intel_dpll_hw_state * state,bool is_dkl)2773 static int icl_mg_pll_find_divisors(int clock_khz, bool is_dp, bool use_ssc,
2774 				    u32 *target_dco_khz,
2775 				    struct intel_dpll_hw_state *state,
2776 				    bool is_dkl)
2777 {
2778 	static const u8 div1_vals[] = { 7, 5, 3, 2 };
2779 	u32 dco_min_freq, dco_max_freq;
2780 	unsigned int i;
2781 	int div2;
2782 
2783 	dco_min_freq = is_dp ? 8100000 : use_ssc ? 8000000 : 7992000;
2784 	dco_max_freq = is_dp ? 8100000 : 10000000;
2785 
2786 	for (i = 0; i < ARRAY_SIZE(div1_vals); i++) {
2787 		int div1 = div1_vals[i];
2788 
2789 		for (div2 = 10; div2 > 0; div2--) {
2790 			int dco = div1 * div2 * clock_khz * 5;
2791 			int a_divratio, tlinedrv, inputsel;
2792 			u32 hsdiv;
2793 
2794 			if (dco < dco_min_freq || dco > dco_max_freq)
2795 				continue;
2796 
2797 			if (div2 >= 2) {
2798 				/*
2799 				 * Note: a_divratio not matching TGL BSpec
2800 				 * algorithm but matching hardcoded values and
2801 				 * working on HW for DP alt-mode at least
2802 				 */
2803 				a_divratio = is_dp ? 10 : 5;
2804 				tlinedrv = is_dkl ? 1 : 2;
2805 			} else {
2806 				a_divratio = 5;
2807 				tlinedrv = 0;
2808 			}
2809 			inputsel = is_dp ? 0 : 1;
2810 
2811 			switch (div1) {
2812 			default:
2813 				MISSING_CASE(div1);
2814 				fallthrough;
2815 			case 2:
2816 				hsdiv = MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_2;
2817 				break;
2818 			case 3:
2819 				hsdiv = MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_3;
2820 				break;
2821 			case 5:
2822 				hsdiv = MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_5;
2823 				break;
2824 			case 7:
2825 				hsdiv = MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_7;
2826 				break;
2827 			}
2828 
2829 			*target_dco_khz = dco;
2830 
2831 			state->mg_refclkin_ctl = MG_REFCLKIN_CTL_OD_2_MUX(1);
2832 
2833 			state->mg_clktop2_coreclkctl1 =
2834 				MG_CLKTOP2_CORECLKCTL1_A_DIVRATIO(a_divratio);
2835 
2836 			state->mg_clktop2_hsclkctl =
2837 				MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL(tlinedrv) |
2838 				MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL(inputsel) |
2839 				hsdiv |
2840 				MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO(div2);
2841 
2842 			return 0;
2843 		}
2844 	}
2845 
2846 	return -EINVAL;
2847 }
2848 
2849 /*
2850  * The specification for this function uses real numbers, so the math had to be
2851  * adapted to integer-only calculation, that's why it looks so different.
2852  */
icl_calc_mg_pll_state(struct intel_crtc_state * crtc_state,struct intel_dpll_hw_state * pll_state)2853 static int icl_calc_mg_pll_state(struct intel_crtc_state *crtc_state,
2854 				 struct intel_dpll_hw_state *pll_state)
2855 {
2856 	struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
2857 	int refclk_khz = dev_priv->display.dpll.ref_clks.nssc;
2858 	int clock = crtc_state->port_clock;
2859 	u32 dco_khz, m1div, m2div_int, m2div_rem, m2div_frac;
2860 	u32 iref_ndiv, iref_trim, iref_pulse_w;
2861 	u32 prop_coeff, int_coeff;
2862 	u32 tdc_targetcnt, feedfwgain;
2863 	u64 ssc_stepsize, ssc_steplen, ssc_steplog;
2864 	u64 tmp;
2865 	bool use_ssc = false;
2866 	bool is_dp = !intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI);
2867 	bool is_dkl = DISPLAY_VER(dev_priv) >= 12;
2868 	int ret;
2869 
2870 	ret = icl_mg_pll_find_divisors(clock, is_dp, use_ssc, &dco_khz,
2871 				       pll_state, is_dkl);
2872 	if (ret)
2873 		return ret;
2874 
2875 	m1div = 2;
2876 	m2div_int = dco_khz / (refclk_khz * m1div);
2877 	if (m2div_int > 255) {
2878 		if (!is_dkl) {
2879 			m1div = 4;
2880 			m2div_int = dco_khz / (refclk_khz * m1div);
2881 		}
2882 
2883 		if (m2div_int > 255)
2884 			return -EINVAL;
2885 	}
2886 	m2div_rem = dco_khz % (refclk_khz * m1div);
2887 
2888 	tmp = (u64)m2div_rem * (1 << 22);
2889 	do_div(tmp, refclk_khz * m1div);
2890 	m2div_frac = tmp;
2891 
2892 	switch (refclk_khz) {
2893 	case 19200:
2894 		iref_ndiv = 1;
2895 		iref_trim = 28;
2896 		iref_pulse_w = 1;
2897 		break;
2898 	case 24000:
2899 		iref_ndiv = 1;
2900 		iref_trim = 25;
2901 		iref_pulse_w = 2;
2902 		break;
2903 	case 38400:
2904 		iref_ndiv = 2;
2905 		iref_trim = 28;
2906 		iref_pulse_w = 1;
2907 		break;
2908 	default:
2909 		MISSING_CASE(refclk_khz);
2910 		return -EINVAL;
2911 	}
2912 
2913 	/*
2914 	 * tdc_res = 0.000003
2915 	 * tdc_targetcnt = int(2 / (tdc_res * 8 * 50 * 1.1) / refclk_mhz + 0.5)
2916 	 *
2917 	 * The multiplication by 1000 is due to refclk MHz to KHz conversion. It
2918 	 * was supposed to be a division, but we rearranged the operations of
2919 	 * the formula to avoid early divisions so we don't multiply the
2920 	 * rounding errors.
2921 	 *
2922 	 * 0.000003 * 8 * 50 * 1.1 = 0.00132, also known as 132 / 100000, which
2923 	 * we also rearrange to work with integers.
2924 	 *
2925 	 * The 0.5 transformed to 5 results in a multiplication by 10 and the
2926 	 * last division by 10.
2927 	 */
2928 	tdc_targetcnt = (2 * 1000 * 100000 * 10 / (132 * refclk_khz) + 5) / 10;
2929 
2930 	/*
2931 	 * Here we divide dco_khz by 10 in order to allow the dividend to fit in
2932 	 * 32 bits. That's not a problem since we round the division down
2933 	 * anyway.
2934 	 */
2935 	feedfwgain = (use_ssc || m2div_rem > 0) ?
2936 		m1div * 1000000 * 100 / (dco_khz * 3 / 10) : 0;
2937 
2938 	if (dco_khz >= 9000000) {
2939 		prop_coeff = 5;
2940 		int_coeff = 10;
2941 	} else {
2942 		prop_coeff = 4;
2943 		int_coeff = 8;
2944 	}
2945 
2946 	if (use_ssc) {
2947 		tmp = mul_u32_u32(dco_khz, 47 * 32);
2948 		do_div(tmp, refclk_khz * m1div * 10000);
2949 		ssc_stepsize = tmp;
2950 
2951 		tmp = mul_u32_u32(dco_khz, 1000);
2952 		ssc_steplen = DIV_ROUND_UP_ULL(tmp, 32 * 2 * 32);
2953 	} else {
2954 		ssc_stepsize = 0;
2955 		ssc_steplen = 0;
2956 	}
2957 	ssc_steplog = 4;
2958 
2959 	/* write pll_state calculations */
2960 	if (is_dkl) {
2961 		pll_state->mg_pll_div0 = DKL_PLL_DIV0_INTEG_COEFF(int_coeff) |
2962 					 DKL_PLL_DIV0_PROP_COEFF(prop_coeff) |
2963 					 DKL_PLL_DIV0_FBPREDIV(m1div) |
2964 					 DKL_PLL_DIV0_FBDIV_INT(m2div_int);
2965 		if (dev_priv->display.vbt.override_afc_startup) {
2966 			u8 val = dev_priv->display.vbt.override_afc_startup_val;
2967 
2968 			pll_state->mg_pll_div0 |= DKL_PLL_DIV0_AFC_STARTUP(val);
2969 		}
2970 
2971 		pll_state->mg_pll_div1 = DKL_PLL_DIV1_IREF_TRIM(iref_trim) |
2972 					 DKL_PLL_DIV1_TDC_TARGET_CNT(tdc_targetcnt);
2973 
2974 		pll_state->mg_pll_ssc = DKL_PLL_SSC_IREF_NDIV_RATIO(iref_ndiv) |
2975 					DKL_PLL_SSC_STEP_LEN(ssc_steplen) |
2976 					DKL_PLL_SSC_STEP_NUM(ssc_steplog) |
2977 					(use_ssc ? DKL_PLL_SSC_EN : 0);
2978 
2979 		pll_state->mg_pll_bias = (m2div_frac ? DKL_PLL_BIAS_FRAC_EN_H : 0) |
2980 					  DKL_PLL_BIAS_FBDIV_FRAC(m2div_frac);
2981 
2982 		pll_state->mg_pll_tdc_coldst_bias =
2983 				DKL_PLL_TDC_SSC_STEP_SIZE(ssc_stepsize) |
2984 				DKL_PLL_TDC_FEED_FWD_GAIN(feedfwgain);
2985 
2986 	} else {
2987 		pll_state->mg_pll_div0 =
2988 			(m2div_rem > 0 ? MG_PLL_DIV0_FRACNEN_H : 0) |
2989 			MG_PLL_DIV0_FBDIV_FRAC(m2div_frac) |
2990 			MG_PLL_DIV0_FBDIV_INT(m2div_int);
2991 
2992 		pll_state->mg_pll_div1 =
2993 			MG_PLL_DIV1_IREF_NDIVRATIO(iref_ndiv) |
2994 			MG_PLL_DIV1_DITHER_DIV_2 |
2995 			MG_PLL_DIV1_NDIVRATIO(1) |
2996 			MG_PLL_DIV1_FBPREDIV(m1div);
2997 
2998 		pll_state->mg_pll_lf =
2999 			MG_PLL_LF_TDCTARGETCNT(tdc_targetcnt) |
3000 			MG_PLL_LF_AFCCNTSEL_512 |
3001 			MG_PLL_LF_GAINCTRL(1) |
3002 			MG_PLL_LF_INT_COEFF(int_coeff) |
3003 			MG_PLL_LF_PROP_COEFF(prop_coeff);
3004 
3005 		pll_state->mg_pll_frac_lock =
3006 			MG_PLL_FRAC_LOCK_TRUELOCK_CRIT_32 |
3007 			MG_PLL_FRAC_LOCK_EARLYLOCK_CRIT_32 |
3008 			MG_PLL_FRAC_LOCK_LOCKTHRESH(10) |
3009 			MG_PLL_FRAC_LOCK_DCODITHEREN |
3010 			MG_PLL_FRAC_LOCK_FEEDFWRDGAIN(feedfwgain);
3011 		if (use_ssc || m2div_rem > 0)
3012 			pll_state->mg_pll_frac_lock |=
3013 				MG_PLL_FRAC_LOCK_FEEDFWRDCAL_EN;
3014 
3015 		pll_state->mg_pll_ssc =
3016 			(use_ssc ? MG_PLL_SSC_EN : 0) |
3017 			MG_PLL_SSC_TYPE(2) |
3018 			MG_PLL_SSC_STEPLENGTH(ssc_steplen) |
3019 			MG_PLL_SSC_STEPNUM(ssc_steplog) |
3020 			MG_PLL_SSC_FLLEN |
3021 			MG_PLL_SSC_STEPSIZE(ssc_stepsize);
3022 
3023 		pll_state->mg_pll_tdc_coldst_bias =
3024 			MG_PLL_TDC_COLDST_COLDSTART |
3025 			MG_PLL_TDC_COLDST_IREFINT_EN |
3026 			MG_PLL_TDC_COLDST_REFBIAS_START_PULSE_W(iref_pulse_w) |
3027 			MG_PLL_TDC_TDCOVCCORR_EN |
3028 			MG_PLL_TDC_TDCSEL(3);
3029 
3030 		pll_state->mg_pll_bias =
3031 			MG_PLL_BIAS_BIAS_GB_SEL(3) |
3032 			MG_PLL_BIAS_INIT_DCOAMP(0x3F) |
3033 			MG_PLL_BIAS_BIAS_BONUS(10) |
3034 			MG_PLL_BIAS_BIASCAL_EN |
3035 			MG_PLL_BIAS_CTRIM(12) |
3036 			MG_PLL_BIAS_VREF_RDAC(4) |
3037 			MG_PLL_BIAS_IREFTRIM(iref_trim);
3038 
3039 		if (refclk_khz == 38400) {
3040 			pll_state->mg_pll_tdc_coldst_bias_mask =
3041 				MG_PLL_TDC_COLDST_COLDSTART;
3042 			pll_state->mg_pll_bias_mask = 0;
3043 		} else {
3044 			pll_state->mg_pll_tdc_coldst_bias_mask = -1U;
3045 			pll_state->mg_pll_bias_mask = -1U;
3046 		}
3047 
3048 		pll_state->mg_pll_tdc_coldst_bias &=
3049 			pll_state->mg_pll_tdc_coldst_bias_mask;
3050 		pll_state->mg_pll_bias &= pll_state->mg_pll_bias_mask;
3051 	}
3052 
3053 	return 0;
3054 }
3055 
icl_ddi_mg_pll_get_freq(struct drm_i915_private * dev_priv,const struct intel_shared_dpll * pll,const struct intel_dpll_hw_state * pll_state)3056 static int icl_ddi_mg_pll_get_freq(struct drm_i915_private *dev_priv,
3057 				   const struct intel_shared_dpll *pll,
3058 				   const struct intel_dpll_hw_state *pll_state)
3059 {
3060 	u32 m1, m2_int, m2_frac, div1, div2, ref_clock;
3061 	u64 tmp;
3062 
3063 	ref_clock = dev_priv->display.dpll.ref_clks.nssc;
3064 
3065 	if (DISPLAY_VER(dev_priv) >= 12) {
3066 		m1 = pll_state->mg_pll_div0 & DKL_PLL_DIV0_FBPREDIV_MASK;
3067 		m1 = m1 >> DKL_PLL_DIV0_FBPREDIV_SHIFT;
3068 		m2_int = pll_state->mg_pll_div0 & DKL_PLL_DIV0_FBDIV_INT_MASK;
3069 
3070 		if (pll_state->mg_pll_bias & DKL_PLL_BIAS_FRAC_EN_H) {
3071 			m2_frac = pll_state->mg_pll_bias &
3072 				  DKL_PLL_BIAS_FBDIV_FRAC_MASK;
3073 			m2_frac = m2_frac >> DKL_PLL_BIAS_FBDIV_SHIFT;
3074 		} else {
3075 			m2_frac = 0;
3076 		}
3077 	} else {
3078 		m1 = pll_state->mg_pll_div1 & MG_PLL_DIV1_FBPREDIV_MASK;
3079 		m2_int = pll_state->mg_pll_div0 & MG_PLL_DIV0_FBDIV_INT_MASK;
3080 
3081 		if (pll_state->mg_pll_div0 & MG_PLL_DIV0_FRACNEN_H) {
3082 			m2_frac = pll_state->mg_pll_div0 &
3083 				  MG_PLL_DIV0_FBDIV_FRAC_MASK;
3084 			m2_frac = m2_frac >> MG_PLL_DIV0_FBDIV_FRAC_SHIFT;
3085 		} else {
3086 			m2_frac = 0;
3087 		}
3088 	}
3089 
3090 	switch (pll_state->mg_clktop2_hsclkctl &
3091 		MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK) {
3092 	case MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_2:
3093 		div1 = 2;
3094 		break;
3095 	case MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_3:
3096 		div1 = 3;
3097 		break;
3098 	case MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_5:
3099 		div1 = 5;
3100 		break;
3101 	case MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_7:
3102 		div1 = 7;
3103 		break;
3104 	default:
3105 		MISSING_CASE(pll_state->mg_clktop2_hsclkctl);
3106 		return 0;
3107 	}
3108 
3109 	div2 = (pll_state->mg_clktop2_hsclkctl &
3110 		MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK) >>
3111 		MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_SHIFT;
3112 
3113 	/* div2 value of 0 is same as 1 means no div */
3114 	if (div2 == 0)
3115 		div2 = 1;
3116 
3117 	/*
3118 	 * Adjust the original formula to delay the division by 2^22 in order to
3119 	 * minimize possible rounding errors.
3120 	 */
3121 	tmp = (u64)m1 * m2_int * ref_clock +
3122 	      (((u64)m1 * m2_frac * ref_clock) >> 22);
3123 	tmp = div_u64(tmp, 5 * div1 * div2);
3124 
3125 	return tmp;
3126 }
3127 
3128 /**
3129  * icl_set_active_port_dpll - select the active port DPLL for a given CRTC
3130  * @crtc_state: state for the CRTC to select the DPLL for
3131  * @port_dpll_id: the active @port_dpll_id to select
3132  *
3133  * Select the given @port_dpll_id instance from the DPLLs reserved for the
3134  * CRTC.
3135  */
icl_set_active_port_dpll(struct intel_crtc_state * crtc_state,enum icl_port_dpll_id port_dpll_id)3136 void icl_set_active_port_dpll(struct intel_crtc_state *crtc_state,
3137 			      enum icl_port_dpll_id port_dpll_id)
3138 {
3139 	struct icl_port_dpll *port_dpll =
3140 		&crtc_state->icl_port_dplls[port_dpll_id];
3141 
3142 	crtc_state->shared_dpll = port_dpll->pll;
3143 	crtc_state->dpll_hw_state = port_dpll->hw_state;
3144 }
3145 
icl_update_active_dpll(struct intel_atomic_state * state,struct intel_crtc * crtc,struct intel_encoder * encoder)3146 static void icl_update_active_dpll(struct intel_atomic_state *state,
3147 				   struct intel_crtc *crtc,
3148 				   struct intel_encoder *encoder)
3149 {
3150 	struct intel_crtc_state *crtc_state =
3151 		intel_atomic_get_new_crtc_state(state, crtc);
3152 	struct intel_digital_port *primary_port;
3153 	enum icl_port_dpll_id port_dpll_id = ICL_PORT_DPLL_DEFAULT;
3154 
3155 	primary_port = encoder->type == INTEL_OUTPUT_DP_MST ?
3156 		enc_to_mst(encoder)->primary :
3157 		enc_to_dig_port(encoder);
3158 
3159 	if (primary_port &&
3160 	    (intel_tc_port_in_dp_alt_mode(primary_port) ||
3161 	     intel_tc_port_in_legacy_mode(primary_port)))
3162 		port_dpll_id = ICL_PORT_DPLL_MG_PHY;
3163 
3164 	icl_set_active_port_dpll(crtc_state, port_dpll_id);
3165 }
3166 
icl_compute_combo_phy_dpll(struct intel_atomic_state * state,struct intel_crtc * crtc)3167 static int icl_compute_combo_phy_dpll(struct intel_atomic_state *state,
3168 				      struct intel_crtc *crtc)
3169 {
3170 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
3171 	struct intel_crtc_state *crtc_state =
3172 		intel_atomic_get_new_crtc_state(state, crtc);
3173 	struct icl_port_dpll *port_dpll =
3174 		&crtc_state->icl_port_dplls[ICL_PORT_DPLL_DEFAULT];
3175 	struct skl_wrpll_params pll_params = {};
3176 	int ret;
3177 
3178 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI) ||
3179 	    intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DSI))
3180 		ret = icl_calc_wrpll(crtc_state, &pll_params);
3181 	else
3182 		ret = icl_calc_dp_combo_pll(crtc_state, &pll_params);
3183 
3184 	if (ret)
3185 		return ret;
3186 
3187 	icl_calc_dpll_state(dev_priv, &pll_params, &port_dpll->hw_state);
3188 
3189 	/* this is mainly for the fastset check */
3190 	icl_set_active_port_dpll(crtc_state, ICL_PORT_DPLL_DEFAULT);
3191 
3192 	crtc_state->port_clock = icl_ddi_combo_pll_get_freq(dev_priv, NULL,
3193 							    &port_dpll->hw_state);
3194 
3195 	return 0;
3196 }
3197 
icl_get_combo_phy_dpll(struct intel_atomic_state * state,struct intel_crtc * crtc,struct intel_encoder * encoder)3198 static int icl_get_combo_phy_dpll(struct intel_atomic_state *state,
3199 				  struct intel_crtc *crtc,
3200 				  struct intel_encoder *encoder)
3201 {
3202 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
3203 	struct intel_crtc_state *crtc_state =
3204 		intel_atomic_get_new_crtc_state(state, crtc);
3205 	struct icl_port_dpll *port_dpll =
3206 		&crtc_state->icl_port_dplls[ICL_PORT_DPLL_DEFAULT];
3207 	enum port port = encoder->port;
3208 	unsigned long dpll_mask;
3209 
3210 	if (IS_ALDERLAKE_S(dev_priv)) {
3211 		dpll_mask =
3212 			BIT(DPLL_ID_DG1_DPLL3) |
3213 			BIT(DPLL_ID_DG1_DPLL2) |
3214 			BIT(DPLL_ID_ICL_DPLL1) |
3215 			BIT(DPLL_ID_ICL_DPLL0);
3216 	} else if (IS_DG1(dev_priv)) {
3217 		if (port == PORT_D || port == PORT_E) {
3218 			dpll_mask =
3219 				BIT(DPLL_ID_DG1_DPLL2) |
3220 				BIT(DPLL_ID_DG1_DPLL3);
3221 		} else {
3222 			dpll_mask =
3223 				BIT(DPLL_ID_DG1_DPLL0) |
3224 				BIT(DPLL_ID_DG1_DPLL1);
3225 		}
3226 	} else if (IS_ROCKETLAKE(dev_priv)) {
3227 		dpll_mask =
3228 			BIT(DPLL_ID_EHL_DPLL4) |
3229 			BIT(DPLL_ID_ICL_DPLL1) |
3230 			BIT(DPLL_ID_ICL_DPLL0);
3231 	} else if ((IS_JASPERLAKE(dev_priv) || IS_ELKHARTLAKE(dev_priv)) &&
3232 				port != PORT_A) {
3233 		dpll_mask =
3234 			BIT(DPLL_ID_EHL_DPLL4) |
3235 			BIT(DPLL_ID_ICL_DPLL1) |
3236 			BIT(DPLL_ID_ICL_DPLL0);
3237 	} else {
3238 		dpll_mask = BIT(DPLL_ID_ICL_DPLL1) | BIT(DPLL_ID_ICL_DPLL0);
3239 	}
3240 
3241 	/* Eliminate DPLLs from consideration if reserved by HTI */
3242 	dpll_mask &= ~intel_hti_dpll_mask(dev_priv);
3243 
3244 	port_dpll->pll = intel_find_shared_dpll(state, crtc,
3245 						&port_dpll->hw_state,
3246 						dpll_mask);
3247 	if (!port_dpll->pll)
3248 		return -EINVAL;
3249 
3250 	intel_reference_shared_dpll(state, crtc,
3251 				    port_dpll->pll, &port_dpll->hw_state);
3252 
3253 	icl_update_active_dpll(state, crtc, encoder);
3254 
3255 	return 0;
3256 }
3257 
icl_compute_tc_phy_dplls(struct intel_atomic_state * state,struct intel_crtc * crtc)3258 static int icl_compute_tc_phy_dplls(struct intel_atomic_state *state,
3259 				    struct intel_crtc *crtc)
3260 {
3261 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
3262 	struct intel_crtc_state *crtc_state =
3263 		intel_atomic_get_new_crtc_state(state, crtc);
3264 	struct icl_port_dpll *port_dpll =
3265 		&crtc_state->icl_port_dplls[ICL_PORT_DPLL_DEFAULT];
3266 	struct skl_wrpll_params pll_params = {};
3267 	int ret;
3268 
3269 	port_dpll = &crtc_state->icl_port_dplls[ICL_PORT_DPLL_DEFAULT];
3270 	ret = icl_calc_tbt_pll(crtc_state, &pll_params);
3271 	if (ret)
3272 		return ret;
3273 
3274 	icl_calc_dpll_state(dev_priv, &pll_params, &port_dpll->hw_state);
3275 
3276 	port_dpll = &crtc_state->icl_port_dplls[ICL_PORT_DPLL_MG_PHY];
3277 	ret = icl_calc_mg_pll_state(crtc_state, &port_dpll->hw_state);
3278 	if (ret)
3279 		return ret;
3280 
3281 	/* this is mainly for the fastset check */
3282 	icl_set_active_port_dpll(crtc_state, ICL_PORT_DPLL_MG_PHY);
3283 
3284 	crtc_state->port_clock = icl_ddi_mg_pll_get_freq(dev_priv, NULL,
3285 							 &port_dpll->hw_state);
3286 
3287 	return 0;
3288 }
3289 
icl_get_tc_phy_dplls(struct intel_atomic_state * state,struct intel_crtc * crtc,struct intel_encoder * encoder)3290 static int icl_get_tc_phy_dplls(struct intel_atomic_state *state,
3291 				struct intel_crtc *crtc,
3292 				struct intel_encoder *encoder)
3293 {
3294 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
3295 	struct intel_crtc_state *crtc_state =
3296 		intel_atomic_get_new_crtc_state(state, crtc);
3297 	struct icl_port_dpll *port_dpll =
3298 		&crtc_state->icl_port_dplls[ICL_PORT_DPLL_DEFAULT];
3299 	enum intel_dpll_id dpll_id;
3300 	int ret;
3301 
3302 	port_dpll = &crtc_state->icl_port_dplls[ICL_PORT_DPLL_DEFAULT];
3303 	port_dpll->pll = intel_find_shared_dpll(state, crtc,
3304 						&port_dpll->hw_state,
3305 						BIT(DPLL_ID_ICL_TBTPLL));
3306 	if (!port_dpll->pll)
3307 		return -EINVAL;
3308 	intel_reference_shared_dpll(state, crtc,
3309 				    port_dpll->pll, &port_dpll->hw_state);
3310 
3311 
3312 	port_dpll = &crtc_state->icl_port_dplls[ICL_PORT_DPLL_MG_PHY];
3313 	dpll_id = icl_tc_port_to_pll_id(intel_port_to_tc(dev_priv,
3314 							 encoder->port));
3315 	port_dpll->pll = intel_find_shared_dpll(state, crtc,
3316 						&port_dpll->hw_state,
3317 						BIT(dpll_id));
3318 	if (!port_dpll->pll) {
3319 		ret = -EINVAL;
3320 		goto err_unreference_tbt_pll;
3321 	}
3322 	intel_reference_shared_dpll(state, crtc,
3323 				    port_dpll->pll, &port_dpll->hw_state);
3324 
3325 	icl_update_active_dpll(state, crtc, encoder);
3326 
3327 	return 0;
3328 
3329 err_unreference_tbt_pll:
3330 	port_dpll = &crtc_state->icl_port_dplls[ICL_PORT_DPLL_DEFAULT];
3331 	intel_unreference_shared_dpll(state, crtc, port_dpll->pll);
3332 
3333 	return ret;
3334 }
3335 
icl_compute_dplls(struct intel_atomic_state * state,struct intel_crtc * crtc,struct intel_encoder * encoder)3336 static int icl_compute_dplls(struct intel_atomic_state *state,
3337 			     struct intel_crtc *crtc,
3338 			     struct intel_encoder *encoder)
3339 {
3340 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
3341 	enum phy phy = intel_port_to_phy(dev_priv, encoder->port);
3342 
3343 	if (intel_phy_is_combo(dev_priv, phy))
3344 		return icl_compute_combo_phy_dpll(state, crtc);
3345 	else if (intel_phy_is_tc(dev_priv, phy))
3346 		return icl_compute_tc_phy_dplls(state, crtc);
3347 
3348 	MISSING_CASE(phy);
3349 
3350 	return 0;
3351 }
3352 
icl_get_dplls(struct intel_atomic_state * state,struct intel_crtc * crtc,struct intel_encoder * encoder)3353 static int icl_get_dplls(struct intel_atomic_state *state,
3354 			 struct intel_crtc *crtc,
3355 			 struct intel_encoder *encoder)
3356 {
3357 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
3358 	enum phy phy = intel_port_to_phy(dev_priv, encoder->port);
3359 
3360 	if (intel_phy_is_combo(dev_priv, phy))
3361 		return icl_get_combo_phy_dpll(state, crtc, encoder);
3362 	else if (intel_phy_is_tc(dev_priv, phy))
3363 		return icl_get_tc_phy_dplls(state, crtc, encoder);
3364 
3365 	MISSING_CASE(phy);
3366 
3367 	return -EINVAL;
3368 }
3369 
icl_put_dplls(struct intel_atomic_state * state,struct intel_crtc * crtc)3370 static void icl_put_dplls(struct intel_atomic_state *state,
3371 			  struct intel_crtc *crtc)
3372 {
3373 	const struct intel_crtc_state *old_crtc_state =
3374 		intel_atomic_get_old_crtc_state(state, crtc);
3375 	struct intel_crtc_state *new_crtc_state =
3376 		intel_atomic_get_new_crtc_state(state, crtc);
3377 	enum icl_port_dpll_id id;
3378 
3379 	new_crtc_state->shared_dpll = NULL;
3380 
3381 	for (id = ICL_PORT_DPLL_DEFAULT; id < ICL_PORT_DPLL_COUNT; id++) {
3382 		const struct icl_port_dpll *old_port_dpll =
3383 			&old_crtc_state->icl_port_dplls[id];
3384 		struct icl_port_dpll *new_port_dpll =
3385 			&new_crtc_state->icl_port_dplls[id];
3386 
3387 		new_port_dpll->pll = NULL;
3388 
3389 		if (!old_port_dpll->pll)
3390 			continue;
3391 
3392 		intel_unreference_shared_dpll(state, crtc, old_port_dpll->pll);
3393 	}
3394 }
3395 
mg_pll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)3396 static bool mg_pll_get_hw_state(struct drm_i915_private *dev_priv,
3397 				struct intel_shared_dpll *pll,
3398 				struct intel_dpll_hw_state *hw_state)
3399 {
3400 	const enum intel_dpll_id id = pll->info->id;
3401 	enum tc_port tc_port = icl_pll_id_to_tc_port(id);
3402 	intel_wakeref_t wakeref;
3403 	bool ret = false;
3404 	u32 val;
3405 
3406 	i915_reg_t enable_reg = intel_tc_pll_enable_reg(dev_priv, pll);
3407 
3408 	wakeref = intel_display_power_get_if_enabled(dev_priv,
3409 						     POWER_DOMAIN_DISPLAY_CORE);
3410 	if (!wakeref)
3411 		return false;
3412 
3413 	val = intel_de_read(dev_priv, enable_reg);
3414 	if (!(val & PLL_ENABLE))
3415 		goto out;
3416 
3417 	hw_state->mg_refclkin_ctl = intel_de_read(dev_priv,
3418 						  MG_REFCLKIN_CTL(tc_port));
3419 	hw_state->mg_refclkin_ctl &= MG_REFCLKIN_CTL_OD_2_MUX_MASK;
3420 
3421 	hw_state->mg_clktop2_coreclkctl1 =
3422 		intel_de_read(dev_priv, MG_CLKTOP2_CORECLKCTL1(tc_port));
3423 	hw_state->mg_clktop2_coreclkctl1 &=
3424 		MG_CLKTOP2_CORECLKCTL1_A_DIVRATIO_MASK;
3425 
3426 	hw_state->mg_clktop2_hsclkctl =
3427 		intel_de_read(dev_priv, MG_CLKTOP2_HSCLKCTL(tc_port));
3428 	hw_state->mg_clktop2_hsclkctl &=
3429 		MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL_MASK |
3430 		MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL_MASK |
3431 		MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK |
3432 		MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK;
3433 
3434 	hw_state->mg_pll_div0 = intel_de_read(dev_priv, MG_PLL_DIV0(tc_port));
3435 	hw_state->mg_pll_div1 = intel_de_read(dev_priv, MG_PLL_DIV1(tc_port));
3436 	hw_state->mg_pll_lf = intel_de_read(dev_priv, MG_PLL_LF(tc_port));
3437 	hw_state->mg_pll_frac_lock = intel_de_read(dev_priv,
3438 						   MG_PLL_FRAC_LOCK(tc_port));
3439 	hw_state->mg_pll_ssc = intel_de_read(dev_priv, MG_PLL_SSC(tc_port));
3440 
3441 	hw_state->mg_pll_bias = intel_de_read(dev_priv, MG_PLL_BIAS(tc_port));
3442 	hw_state->mg_pll_tdc_coldst_bias =
3443 		intel_de_read(dev_priv, MG_PLL_TDC_COLDST_BIAS(tc_port));
3444 
3445 	if (dev_priv->display.dpll.ref_clks.nssc == 38400) {
3446 		hw_state->mg_pll_tdc_coldst_bias_mask = MG_PLL_TDC_COLDST_COLDSTART;
3447 		hw_state->mg_pll_bias_mask = 0;
3448 	} else {
3449 		hw_state->mg_pll_tdc_coldst_bias_mask = -1U;
3450 		hw_state->mg_pll_bias_mask = -1U;
3451 	}
3452 
3453 	hw_state->mg_pll_tdc_coldst_bias &= hw_state->mg_pll_tdc_coldst_bias_mask;
3454 	hw_state->mg_pll_bias &= hw_state->mg_pll_bias_mask;
3455 
3456 	ret = true;
3457 out:
3458 	intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
3459 	return ret;
3460 }
3461 
dkl_pll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)3462 static bool dkl_pll_get_hw_state(struct drm_i915_private *dev_priv,
3463 				 struct intel_shared_dpll *pll,
3464 				 struct intel_dpll_hw_state *hw_state)
3465 {
3466 	const enum intel_dpll_id id = pll->info->id;
3467 	enum tc_port tc_port = icl_pll_id_to_tc_port(id);
3468 	intel_wakeref_t wakeref;
3469 	bool ret = false;
3470 	u32 val;
3471 
3472 	wakeref = intel_display_power_get_if_enabled(dev_priv,
3473 						     POWER_DOMAIN_DISPLAY_CORE);
3474 	if (!wakeref)
3475 		return false;
3476 
3477 	val = intel_de_read(dev_priv, intel_tc_pll_enable_reg(dev_priv, pll));
3478 	if (!(val & PLL_ENABLE))
3479 		goto out;
3480 
3481 	/*
3482 	 * All registers read here have the same HIP_INDEX_REG even though
3483 	 * they are on different building blocks
3484 	 */
3485 	hw_state->mg_refclkin_ctl = intel_dkl_phy_read(dev_priv,
3486 						       DKL_REFCLKIN_CTL(tc_port));
3487 	hw_state->mg_refclkin_ctl &= MG_REFCLKIN_CTL_OD_2_MUX_MASK;
3488 
3489 	hw_state->mg_clktop2_hsclkctl =
3490 		intel_dkl_phy_read(dev_priv, DKL_CLKTOP2_HSCLKCTL(tc_port));
3491 	hw_state->mg_clktop2_hsclkctl &=
3492 		MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL_MASK |
3493 		MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL_MASK |
3494 		MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK |
3495 		MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK;
3496 
3497 	hw_state->mg_clktop2_coreclkctl1 =
3498 		intel_dkl_phy_read(dev_priv, DKL_CLKTOP2_CORECLKCTL1(tc_port));
3499 	hw_state->mg_clktop2_coreclkctl1 &=
3500 		MG_CLKTOP2_CORECLKCTL1_A_DIVRATIO_MASK;
3501 
3502 	hw_state->mg_pll_div0 = intel_dkl_phy_read(dev_priv, DKL_PLL_DIV0(tc_port));
3503 	val = DKL_PLL_DIV0_MASK;
3504 	if (dev_priv->display.vbt.override_afc_startup)
3505 		val |= DKL_PLL_DIV0_AFC_STARTUP_MASK;
3506 	hw_state->mg_pll_div0 &= val;
3507 
3508 	hw_state->mg_pll_div1 = intel_dkl_phy_read(dev_priv, DKL_PLL_DIV1(tc_port));
3509 	hw_state->mg_pll_div1 &= (DKL_PLL_DIV1_IREF_TRIM_MASK |
3510 				  DKL_PLL_DIV1_TDC_TARGET_CNT_MASK);
3511 
3512 	hw_state->mg_pll_ssc = intel_dkl_phy_read(dev_priv, DKL_PLL_SSC(tc_port));
3513 	hw_state->mg_pll_ssc &= (DKL_PLL_SSC_IREF_NDIV_RATIO_MASK |
3514 				 DKL_PLL_SSC_STEP_LEN_MASK |
3515 				 DKL_PLL_SSC_STEP_NUM_MASK |
3516 				 DKL_PLL_SSC_EN);
3517 
3518 	hw_state->mg_pll_bias = intel_dkl_phy_read(dev_priv, DKL_PLL_BIAS(tc_port));
3519 	hw_state->mg_pll_bias &= (DKL_PLL_BIAS_FRAC_EN_H |
3520 				  DKL_PLL_BIAS_FBDIV_FRAC_MASK);
3521 
3522 	hw_state->mg_pll_tdc_coldst_bias =
3523 		intel_dkl_phy_read(dev_priv, DKL_PLL_TDC_COLDST_BIAS(tc_port));
3524 	hw_state->mg_pll_tdc_coldst_bias &= (DKL_PLL_TDC_SSC_STEP_SIZE_MASK |
3525 					     DKL_PLL_TDC_FEED_FWD_GAIN_MASK);
3526 
3527 	ret = true;
3528 out:
3529 	intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
3530 	return ret;
3531 }
3532 
icl_pll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state,i915_reg_t enable_reg)3533 static bool icl_pll_get_hw_state(struct drm_i915_private *dev_priv,
3534 				 struct intel_shared_dpll *pll,
3535 				 struct intel_dpll_hw_state *hw_state,
3536 				 i915_reg_t enable_reg)
3537 {
3538 	const enum intel_dpll_id id = pll->info->id;
3539 	intel_wakeref_t wakeref;
3540 	bool ret = false;
3541 	u32 val;
3542 
3543 	wakeref = intel_display_power_get_if_enabled(dev_priv,
3544 						     POWER_DOMAIN_DISPLAY_CORE);
3545 	if (!wakeref)
3546 		return false;
3547 
3548 	val = intel_de_read(dev_priv, enable_reg);
3549 	if (!(val & PLL_ENABLE))
3550 		goto out;
3551 
3552 	if (IS_ALDERLAKE_S(dev_priv)) {
3553 		hw_state->cfgcr0 = intel_de_read(dev_priv, ADLS_DPLL_CFGCR0(id));
3554 		hw_state->cfgcr1 = intel_de_read(dev_priv, ADLS_DPLL_CFGCR1(id));
3555 	} else if (IS_DG1(dev_priv)) {
3556 		hw_state->cfgcr0 = intel_de_read(dev_priv, DG1_DPLL_CFGCR0(id));
3557 		hw_state->cfgcr1 = intel_de_read(dev_priv, DG1_DPLL_CFGCR1(id));
3558 	} else if (IS_ROCKETLAKE(dev_priv)) {
3559 		hw_state->cfgcr0 = intel_de_read(dev_priv,
3560 						 RKL_DPLL_CFGCR0(id));
3561 		hw_state->cfgcr1 = intel_de_read(dev_priv,
3562 						 RKL_DPLL_CFGCR1(id));
3563 	} else if (DISPLAY_VER(dev_priv) >= 12) {
3564 		hw_state->cfgcr0 = intel_de_read(dev_priv,
3565 						 TGL_DPLL_CFGCR0(id));
3566 		hw_state->cfgcr1 = intel_de_read(dev_priv,
3567 						 TGL_DPLL_CFGCR1(id));
3568 		if (dev_priv->display.vbt.override_afc_startup) {
3569 			hw_state->div0 = intel_de_read(dev_priv, TGL_DPLL0_DIV0(id));
3570 			hw_state->div0 &= TGL_DPLL0_DIV0_AFC_STARTUP_MASK;
3571 		}
3572 	} else {
3573 		if ((IS_JASPERLAKE(dev_priv) || IS_ELKHARTLAKE(dev_priv)) &&
3574 		    id == DPLL_ID_EHL_DPLL4) {
3575 			hw_state->cfgcr0 = intel_de_read(dev_priv,
3576 							 ICL_DPLL_CFGCR0(4));
3577 			hw_state->cfgcr1 = intel_de_read(dev_priv,
3578 							 ICL_DPLL_CFGCR1(4));
3579 		} else {
3580 			hw_state->cfgcr0 = intel_de_read(dev_priv,
3581 							 ICL_DPLL_CFGCR0(id));
3582 			hw_state->cfgcr1 = intel_de_read(dev_priv,
3583 							 ICL_DPLL_CFGCR1(id));
3584 		}
3585 	}
3586 
3587 	ret = true;
3588 out:
3589 	intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
3590 	return ret;
3591 }
3592 
combo_pll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)3593 static bool combo_pll_get_hw_state(struct drm_i915_private *dev_priv,
3594 				   struct intel_shared_dpll *pll,
3595 				   struct intel_dpll_hw_state *hw_state)
3596 {
3597 	i915_reg_t enable_reg = intel_combo_pll_enable_reg(dev_priv, pll);
3598 
3599 	return icl_pll_get_hw_state(dev_priv, pll, hw_state, enable_reg);
3600 }
3601 
tbt_pll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)3602 static bool tbt_pll_get_hw_state(struct drm_i915_private *dev_priv,
3603 				 struct intel_shared_dpll *pll,
3604 				 struct intel_dpll_hw_state *hw_state)
3605 {
3606 	return icl_pll_get_hw_state(dev_priv, pll, hw_state, TBT_PLL_ENABLE);
3607 }
3608 
icl_dpll_write(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)3609 static void icl_dpll_write(struct drm_i915_private *dev_priv,
3610 			   struct intel_shared_dpll *pll)
3611 {
3612 	struct intel_dpll_hw_state *hw_state = &pll->state.hw_state;
3613 	const enum intel_dpll_id id = pll->info->id;
3614 	i915_reg_t cfgcr0_reg, cfgcr1_reg, div0_reg = INVALID_MMIO_REG;
3615 
3616 	if (IS_ALDERLAKE_S(dev_priv)) {
3617 		cfgcr0_reg = ADLS_DPLL_CFGCR0(id);
3618 		cfgcr1_reg = ADLS_DPLL_CFGCR1(id);
3619 	} else if (IS_DG1(dev_priv)) {
3620 		cfgcr0_reg = DG1_DPLL_CFGCR0(id);
3621 		cfgcr1_reg = DG1_DPLL_CFGCR1(id);
3622 	} else if (IS_ROCKETLAKE(dev_priv)) {
3623 		cfgcr0_reg = RKL_DPLL_CFGCR0(id);
3624 		cfgcr1_reg = RKL_DPLL_CFGCR1(id);
3625 	} else if (DISPLAY_VER(dev_priv) >= 12) {
3626 		cfgcr0_reg = TGL_DPLL_CFGCR0(id);
3627 		cfgcr1_reg = TGL_DPLL_CFGCR1(id);
3628 		div0_reg = TGL_DPLL0_DIV0(id);
3629 	} else {
3630 		if ((IS_JASPERLAKE(dev_priv) || IS_ELKHARTLAKE(dev_priv)) &&
3631 		    id == DPLL_ID_EHL_DPLL4) {
3632 			cfgcr0_reg = ICL_DPLL_CFGCR0(4);
3633 			cfgcr1_reg = ICL_DPLL_CFGCR1(4);
3634 		} else {
3635 			cfgcr0_reg = ICL_DPLL_CFGCR0(id);
3636 			cfgcr1_reg = ICL_DPLL_CFGCR1(id);
3637 		}
3638 	}
3639 
3640 	intel_de_write(dev_priv, cfgcr0_reg, hw_state->cfgcr0);
3641 	intel_de_write(dev_priv, cfgcr1_reg, hw_state->cfgcr1);
3642 	drm_WARN_ON_ONCE(&dev_priv->drm, dev_priv->display.vbt.override_afc_startup &&
3643 			 !i915_mmio_reg_valid(div0_reg));
3644 	if (dev_priv->display.vbt.override_afc_startup &&
3645 	    i915_mmio_reg_valid(div0_reg))
3646 		intel_de_rmw(dev_priv, div0_reg,
3647 			     TGL_DPLL0_DIV0_AFC_STARTUP_MASK, hw_state->div0);
3648 	intel_de_posting_read(dev_priv, cfgcr1_reg);
3649 }
3650 
icl_mg_pll_write(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)3651 static void icl_mg_pll_write(struct drm_i915_private *dev_priv,
3652 			     struct intel_shared_dpll *pll)
3653 {
3654 	struct intel_dpll_hw_state *hw_state = &pll->state.hw_state;
3655 	enum tc_port tc_port = icl_pll_id_to_tc_port(pll->info->id);
3656 
3657 	/*
3658 	 * Some of the following registers have reserved fields, so program
3659 	 * these with RMW based on a mask. The mask can be fixed or generated
3660 	 * during the calc/readout phase if the mask depends on some other HW
3661 	 * state like refclk, see icl_calc_mg_pll_state().
3662 	 */
3663 	intel_de_rmw(dev_priv, MG_REFCLKIN_CTL(tc_port),
3664 		     MG_REFCLKIN_CTL_OD_2_MUX_MASK, hw_state->mg_refclkin_ctl);
3665 
3666 	intel_de_rmw(dev_priv, MG_CLKTOP2_CORECLKCTL1(tc_port),
3667 		     MG_CLKTOP2_CORECLKCTL1_A_DIVRATIO_MASK,
3668 		     hw_state->mg_clktop2_coreclkctl1);
3669 
3670 	intel_de_rmw(dev_priv, MG_CLKTOP2_HSCLKCTL(tc_port),
3671 		     MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL_MASK |
3672 		     MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL_MASK |
3673 		     MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK |
3674 		     MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK,
3675 		     hw_state->mg_clktop2_hsclkctl);
3676 
3677 	intel_de_write(dev_priv, MG_PLL_DIV0(tc_port), hw_state->mg_pll_div0);
3678 	intel_de_write(dev_priv, MG_PLL_DIV1(tc_port), hw_state->mg_pll_div1);
3679 	intel_de_write(dev_priv, MG_PLL_LF(tc_port), hw_state->mg_pll_lf);
3680 	intel_de_write(dev_priv, MG_PLL_FRAC_LOCK(tc_port),
3681 		       hw_state->mg_pll_frac_lock);
3682 	intel_de_write(dev_priv, MG_PLL_SSC(tc_port), hw_state->mg_pll_ssc);
3683 
3684 	intel_de_rmw(dev_priv, MG_PLL_BIAS(tc_port),
3685 		     hw_state->mg_pll_bias_mask, hw_state->mg_pll_bias);
3686 
3687 	intel_de_rmw(dev_priv, MG_PLL_TDC_COLDST_BIAS(tc_port),
3688 		     hw_state->mg_pll_tdc_coldst_bias_mask,
3689 		     hw_state->mg_pll_tdc_coldst_bias);
3690 
3691 	intel_de_posting_read(dev_priv, MG_PLL_TDC_COLDST_BIAS(tc_port));
3692 }
3693 
dkl_pll_write(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)3694 static void dkl_pll_write(struct drm_i915_private *dev_priv,
3695 			  struct intel_shared_dpll *pll)
3696 {
3697 	struct intel_dpll_hw_state *hw_state = &pll->state.hw_state;
3698 	enum tc_port tc_port = icl_pll_id_to_tc_port(pll->info->id);
3699 	u32 val;
3700 
3701 	/*
3702 	 * All registers programmed here have the same HIP_INDEX_REG even
3703 	 * though on different building block
3704 	 */
3705 	/* All the registers are RMW */
3706 	val = intel_dkl_phy_read(dev_priv, DKL_REFCLKIN_CTL(tc_port));
3707 	val &= ~MG_REFCLKIN_CTL_OD_2_MUX_MASK;
3708 	val |= hw_state->mg_refclkin_ctl;
3709 	intel_dkl_phy_write(dev_priv, DKL_REFCLKIN_CTL(tc_port), val);
3710 
3711 	val = intel_dkl_phy_read(dev_priv, DKL_CLKTOP2_CORECLKCTL1(tc_port));
3712 	val &= ~MG_CLKTOP2_CORECLKCTL1_A_DIVRATIO_MASK;
3713 	val |= hw_state->mg_clktop2_coreclkctl1;
3714 	intel_dkl_phy_write(dev_priv, DKL_CLKTOP2_CORECLKCTL1(tc_port), val);
3715 
3716 	val = intel_dkl_phy_read(dev_priv, DKL_CLKTOP2_HSCLKCTL(tc_port));
3717 	val &= ~(MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL_MASK |
3718 		 MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL_MASK |
3719 		 MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK |
3720 		 MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK);
3721 	val |= hw_state->mg_clktop2_hsclkctl;
3722 	intel_dkl_phy_write(dev_priv, DKL_CLKTOP2_HSCLKCTL(tc_port), val);
3723 
3724 	val = DKL_PLL_DIV0_MASK;
3725 	if (dev_priv->display.vbt.override_afc_startup)
3726 		val |= DKL_PLL_DIV0_AFC_STARTUP_MASK;
3727 	intel_dkl_phy_rmw(dev_priv, DKL_PLL_DIV0(tc_port), val,
3728 			  hw_state->mg_pll_div0);
3729 
3730 	val = intel_dkl_phy_read(dev_priv, DKL_PLL_DIV1(tc_port));
3731 	val &= ~(DKL_PLL_DIV1_IREF_TRIM_MASK |
3732 		 DKL_PLL_DIV1_TDC_TARGET_CNT_MASK);
3733 	val |= hw_state->mg_pll_div1;
3734 	intel_dkl_phy_write(dev_priv, DKL_PLL_DIV1(tc_port), val);
3735 
3736 	val = intel_dkl_phy_read(dev_priv, DKL_PLL_SSC(tc_port));
3737 	val &= ~(DKL_PLL_SSC_IREF_NDIV_RATIO_MASK |
3738 		 DKL_PLL_SSC_STEP_LEN_MASK |
3739 		 DKL_PLL_SSC_STEP_NUM_MASK |
3740 		 DKL_PLL_SSC_EN);
3741 	val |= hw_state->mg_pll_ssc;
3742 	intel_dkl_phy_write(dev_priv, DKL_PLL_SSC(tc_port), val);
3743 
3744 	val = intel_dkl_phy_read(dev_priv, DKL_PLL_BIAS(tc_port));
3745 	val &= ~(DKL_PLL_BIAS_FRAC_EN_H |
3746 		 DKL_PLL_BIAS_FBDIV_FRAC_MASK);
3747 	val |= hw_state->mg_pll_bias;
3748 	intel_dkl_phy_write(dev_priv, DKL_PLL_BIAS(tc_port), val);
3749 
3750 	val = intel_dkl_phy_read(dev_priv, DKL_PLL_TDC_COLDST_BIAS(tc_port));
3751 	val &= ~(DKL_PLL_TDC_SSC_STEP_SIZE_MASK |
3752 		 DKL_PLL_TDC_FEED_FWD_GAIN_MASK);
3753 	val |= hw_state->mg_pll_tdc_coldst_bias;
3754 	intel_dkl_phy_write(dev_priv, DKL_PLL_TDC_COLDST_BIAS(tc_port), val);
3755 
3756 	intel_dkl_phy_posting_read(dev_priv, DKL_PLL_TDC_COLDST_BIAS(tc_port));
3757 }
3758 
icl_pll_power_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,i915_reg_t enable_reg)3759 static void icl_pll_power_enable(struct drm_i915_private *dev_priv,
3760 				 struct intel_shared_dpll *pll,
3761 				 i915_reg_t enable_reg)
3762 {
3763 	intel_de_rmw(dev_priv, enable_reg, 0, PLL_POWER_ENABLE);
3764 
3765 	/*
3766 	 * The spec says we need to "wait" but it also says it should be
3767 	 * immediate.
3768 	 */
3769 	if (intel_de_wait_for_set(dev_priv, enable_reg, PLL_POWER_STATE, 1))
3770 		drm_err(&dev_priv->drm, "PLL %d Power not enabled\n",
3771 			pll->info->id);
3772 }
3773 
icl_pll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,i915_reg_t enable_reg)3774 static void icl_pll_enable(struct drm_i915_private *dev_priv,
3775 			   struct intel_shared_dpll *pll,
3776 			   i915_reg_t enable_reg)
3777 {
3778 	intel_de_rmw(dev_priv, enable_reg, 0, PLL_ENABLE);
3779 
3780 	/* Timeout is actually 600us. */
3781 	if (intel_de_wait_for_set(dev_priv, enable_reg, PLL_LOCK, 1))
3782 		drm_err(&dev_priv->drm, "PLL %d not locked\n", pll->info->id);
3783 }
3784 
adlp_cmtg_clock_gating_wa(struct drm_i915_private * i915,struct intel_shared_dpll * pll)3785 static void adlp_cmtg_clock_gating_wa(struct drm_i915_private *i915, struct intel_shared_dpll *pll)
3786 {
3787 	u32 val;
3788 
3789 	if (!(IS_ALDERLAKE_P(i915) && IS_DISPLAY_STEP(i915, STEP_A0, STEP_B0)) ||
3790 	    pll->info->id != DPLL_ID_ICL_DPLL0)
3791 		return;
3792 	/*
3793 	 * Wa_16011069516:adl-p[a0]
3794 	 *
3795 	 * All CMTG regs are unreliable until CMTG clock gating is disabled,
3796 	 * so we can only assume the default TRANS_CMTG_CHICKEN reg value and
3797 	 * sanity check this assumption with a double read, which presumably
3798 	 * returns the correct value even with clock gating on.
3799 	 *
3800 	 * Instead of the usual place for workarounds we apply this one here,
3801 	 * since TRANS_CMTG_CHICKEN is only accessible while DPLL0 is enabled.
3802 	 */
3803 	val = intel_de_read(i915, TRANS_CMTG_CHICKEN);
3804 	val = intel_de_rmw(i915, TRANS_CMTG_CHICKEN, ~0, DISABLE_DPT_CLK_GATING);
3805 	if (drm_WARN_ON(&i915->drm, val & ~DISABLE_DPT_CLK_GATING))
3806 		drm_dbg_kms(&i915->drm, "Unexpected flags in TRANS_CMTG_CHICKEN: %08x\n", val);
3807 }
3808 
combo_pll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)3809 static void combo_pll_enable(struct drm_i915_private *dev_priv,
3810 			     struct intel_shared_dpll *pll)
3811 {
3812 	i915_reg_t enable_reg = intel_combo_pll_enable_reg(dev_priv, pll);
3813 
3814 	if ((IS_JASPERLAKE(dev_priv) || IS_ELKHARTLAKE(dev_priv)) &&
3815 	    pll->info->id == DPLL_ID_EHL_DPLL4) {
3816 
3817 		/*
3818 		 * We need to disable DC states when this DPLL is enabled.
3819 		 * This can be done by taking a reference on DPLL4 power
3820 		 * domain.
3821 		 */
3822 		pll->wakeref = intel_display_power_get(dev_priv,
3823 						       POWER_DOMAIN_DC_OFF);
3824 	}
3825 
3826 	icl_pll_power_enable(dev_priv, pll, enable_reg);
3827 
3828 	icl_dpll_write(dev_priv, pll);
3829 
3830 	/*
3831 	 * DVFS pre sequence would be here, but in our driver the cdclk code
3832 	 * paths should already be setting the appropriate voltage, hence we do
3833 	 * nothing here.
3834 	 */
3835 
3836 	icl_pll_enable(dev_priv, pll, enable_reg);
3837 
3838 	adlp_cmtg_clock_gating_wa(dev_priv, pll);
3839 
3840 	/* DVFS post sequence would be here. See the comment above. */
3841 }
3842 
tbt_pll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)3843 static void tbt_pll_enable(struct drm_i915_private *dev_priv,
3844 			   struct intel_shared_dpll *pll)
3845 {
3846 	icl_pll_power_enable(dev_priv, pll, TBT_PLL_ENABLE);
3847 
3848 	icl_dpll_write(dev_priv, pll);
3849 
3850 	/*
3851 	 * DVFS pre sequence would be here, but in our driver the cdclk code
3852 	 * paths should already be setting the appropriate voltage, hence we do
3853 	 * nothing here.
3854 	 */
3855 
3856 	icl_pll_enable(dev_priv, pll, TBT_PLL_ENABLE);
3857 
3858 	/* DVFS post sequence would be here. See the comment above. */
3859 }
3860 
mg_pll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)3861 static void mg_pll_enable(struct drm_i915_private *dev_priv,
3862 			  struct intel_shared_dpll *pll)
3863 {
3864 	i915_reg_t enable_reg = intel_tc_pll_enable_reg(dev_priv, pll);
3865 
3866 	icl_pll_power_enable(dev_priv, pll, enable_reg);
3867 
3868 	if (DISPLAY_VER(dev_priv) >= 12)
3869 		dkl_pll_write(dev_priv, pll);
3870 	else
3871 		icl_mg_pll_write(dev_priv, pll);
3872 
3873 	/*
3874 	 * DVFS pre sequence would be here, but in our driver the cdclk code
3875 	 * paths should already be setting the appropriate voltage, hence we do
3876 	 * nothing here.
3877 	 */
3878 
3879 	icl_pll_enable(dev_priv, pll, enable_reg);
3880 
3881 	/* DVFS post sequence would be here. See the comment above. */
3882 }
3883 
icl_pll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,i915_reg_t enable_reg)3884 static void icl_pll_disable(struct drm_i915_private *dev_priv,
3885 			    struct intel_shared_dpll *pll,
3886 			    i915_reg_t enable_reg)
3887 {
3888 	/* The first steps are done by intel_ddi_post_disable(). */
3889 
3890 	/*
3891 	 * DVFS pre sequence would be here, but in our driver the cdclk code
3892 	 * paths should already be setting the appropriate voltage, hence we do
3893 	 * nothing here.
3894 	 */
3895 
3896 	intel_de_rmw(dev_priv, enable_reg, PLL_ENABLE, 0);
3897 
3898 	/* Timeout is actually 1us. */
3899 	if (intel_de_wait_for_clear(dev_priv, enable_reg, PLL_LOCK, 1))
3900 		drm_err(&dev_priv->drm, "PLL %d locked\n", pll->info->id);
3901 
3902 	/* DVFS post sequence would be here. See the comment above. */
3903 
3904 	intel_de_rmw(dev_priv, enable_reg, PLL_POWER_ENABLE, 0);
3905 
3906 	/*
3907 	 * The spec says we need to "wait" but it also says it should be
3908 	 * immediate.
3909 	 */
3910 	if (intel_de_wait_for_clear(dev_priv, enable_reg, PLL_POWER_STATE, 1))
3911 		drm_err(&dev_priv->drm, "PLL %d Power not disabled\n",
3912 			pll->info->id);
3913 }
3914 
combo_pll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)3915 static void combo_pll_disable(struct drm_i915_private *dev_priv,
3916 			      struct intel_shared_dpll *pll)
3917 {
3918 	i915_reg_t enable_reg = intel_combo_pll_enable_reg(dev_priv, pll);
3919 
3920 	icl_pll_disable(dev_priv, pll, enable_reg);
3921 
3922 	if ((IS_JASPERLAKE(dev_priv) || IS_ELKHARTLAKE(dev_priv)) &&
3923 	    pll->info->id == DPLL_ID_EHL_DPLL4)
3924 		intel_display_power_put(dev_priv, POWER_DOMAIN_DC_OFF,
3925 					pll->wakeref);
3926 }
3927 
tbt_pll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)3928 static void tbt_pll_disable(struct drm_i915_private *dev_priv,
3929 			    struct intel_shared_dpll *pll)
3930 {
3931 	icl_pll_disable(dev_priv, pll, TBT_PLL_ENABLE);
3932 }
3933 
mg_pll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)3934 static void mg_pll_disable(struct drm_i915_private *dev_priv,
3935 			   struct intel_shared_dpll *pll)
3936 {
3937 	i915_reg_t enable_reg = intel_tc_pll_enable_reg(dev_priv, pll);
3938 
3939 	icl_pll_disable(dev_priv, pll, enable_reg);
3940 }
3941 
icl_update_dpll_ref_clks(struct drm_i915_private * i915)3942 static void icl_update_dpll_ref_clks(struct drm_i915_private *i915)
3943 {
3944 	/* No SSC ref */
3945 	i915->display.dpll.ref_clks.nssc = i915->display.cdclk.hw.ref;
3946 }
3947 
icl_dump_hw_state(struct drm_i915_private * dev_priv,const struct intel_dpll_hw_state * hw_state)3948 static void icl_dump_hw_state(struct drm_i915_private *dev_priv,
3949 			      const struct intel_dpll_hw_state *hw_state)
3950 {
3951 	drm_dbg_kms(&dev_priv->drm,
3952 		    "dpll_hw_state: cfgcr0: 0x%x, cfgcr1: 0x%x, div0: 0x%x, "
3953 		    "mg_refclkin_ctl: 0x%x, hg_clktop2_coreclkctl1: 0x%x, "
3954 		    "mg_clktop2_hsclkctl: 0x%x, mg_pll_div0: 0x%x, "
3955 		    "mg_pll_div2: 0x%x, mg_pll_lf: 0x%x, "
3956 		    "mg_pll_frac_lock: 0x%x, mg_pll_ssc: 0x%x, "
3957 		    "mg_pll_bias: 0x%x, mg_pll_tdc_coldst_bias: 0x%x\n",
3958 		    hw_state->cfgcr0, hw_state->cfgcr1,
3959 		    hw_state->div0,
3960 		    hw_state->mg_refclkin_ctl,
3961 		    hw_state->mg_clktop2_coreclkctl1,
3962 		    hw_state->mg_clktop2_hsclkctl,
3963 		    hw_state->mg_pll_div0,
3964 		    hw_state->mg_pll_div1,
3965 		    hw_state->mg_pll_lf,
3966 		    hw_state->mg_pll_frac_lock,
3967 		    hw_state->mg_pll_ssc,
3968 		    hw_state->mg_pll_bias,
3969 		    hw_state->mg_pll_tdc_coldst_bias);
3970 }
3971 
3972 static const struct intel_shared_dpll_funcs combo_pll_funcs = {
3973 	.enable = combo_pll_enable,
3974 	.disable = combo_pll_disable,
3975 	.get_hw_state = combo_pll_get_hw_state,
3976 	.get_freq = icl_ddi_combo_pll_get_freq,
3977 };
3978 
3979 static const struct intel_shared_dpll_funcs tbt_pll_funcs = {
3980 	.enable = tbt_pll_enable,
3981 	.disable = tbt_pll_disable,
3982 	.get_hw_state = tbt_pll_get_hw_state,
3983 	.get_freq = icl_ddi_tbt_pll_get_freq,
3984 };
3985 
3986 static const struct intel_shared_dpll_funcs mg_pll_funcs = {
3987 	.enable = mg_pll_enable,
3988 	.disable = mg_pll_disable,
3989 	.get_hw_state = mg_pll_get_hw_state,
3990 	.get_freq = icl_ddi_mg_pll_get_freq,
3991 };
3992 
3993 static const struct dpll_info icl_plls[] = {
3994 	{ "DPLL 0",   &combo_pll_funcs, DPLL_ID_ICL_DPLL0,  0 },
3995 	{ "DPLL 1",   &combo_pll_funcs, DPLL_ID_ICL_DPLL1,  0 },
3996 	{ "TBT PLL",  &tbt_pll_funcs, DPLL_ID_ICL_TBTPLL, 0 },
3997 	{ "MG PLL 1", &mg_pll_funcs, DPLL_ID_ICL_MGPLL1, 0 },
3998 	{ "MG PLL 2", &mg_pll_funcs, DPLL_ID_ICL_MGPLL2, 0 },
3999 	{ "MG PLL 3", &mg_pll_funcs, DPLL_ID_ICL_MGPLL3, 0 },
4000 	{ "MG PLL 4", &mg_pll_funcs, DPLL_ID_ICL_MGPLL4, 0 },
4001 	{ },
4002 };
4003 
4004 static const struct intel_dpll_mgr icl_pll_mgr = {
4005 	.dpll_info = icl_plls,
4006 	.compute_dplls = icl_compute_dplls,
4007 	.get_dplls = icl_get_dplls,
4008 	.put_dplls = icl_put_dplls,
4009 	.update_active_dpll = icl_update_active_dpll,
4010 	.update_ref_clks = icl_update_dpll_ref_clks,
4011 	.dump_hw_state = icl_dump_hw_state,
4012 };
4013 
4014 static const struct dpll_info ehl_plls[] = {
4015 	{ "DPLL 0", &combo_pll_funcs, DPLL_ID_ICL_DPLL0, 0 },
4016 	{ "DPLL 1", &combo_pll_funcs, DPLL_ID_ICL_DPLL1, 0 },
4017 	{ "DPLL 4", &combo_pll_funcs, DPLL_ID_EHL_DPLL4, 0 },
4018 	{ },
4019 };
4020 
4021 static const struct intel_dpll_mgr ehl_pll_mgr = {
4022 	.dpll_info = ehl_plls,
4023 	.compute_dplls = icl_compute_dplls,
4024 	.get_dplls = icl_get_dplls,
4025 	.put_dplls = icl_put_dplls,
4026 	.update_ref_clks = icl_update_dpll_ref_clks,
4027 	.dump_hw_state = icl_dump_hw_state,
4028 };
4029 
4030 static const struct intel_shared_dpll_funcs dkl_pll_funcs = {
4031 	.enable = mg_pll_enable,
4032 	.disable = mg_pll_disable,
4033 	.get_hw_state = dkl_pll_get_hw_state,
4034 	.get_freq = icl_ddi_mg_pll_get_freq,
4035 };
4036 
4037 static const struct dpll_info tgl_plls[] = {
4038 	{ "DPLL 0", &combo_pll_funcs, DPLL_ID_ICL_DPLL0,  0 },
4039 	{ "DPLL 1", &combo_pll_funcs, DPLL_ID_ICL_DPLL1,  0 },
4040 	{ "TBT PLL",  &tbt_pll_funcs, DPLL_ID_ICL_TBTPLL, 0 },
4041 	{ "TC PLL 1", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL1, 0 },
4042 	{ "TC PLL 2", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL2, 0 },
4043 	{ "TC PLL 3", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL3, 0 },
4044 	{ "TC PLL 4", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL4, 0 },
4045 	{ "TC PLL 5", &dkl_pll_funcs, DPLL_ID_TGL_MGPLL5, 0 },
4046 	{ "TC PLL 6", &dkl_pll_funcs, DPLL_ID_TGL_MGPLL6, 0 },
4047 	{ },
4048 };
4049 
4050 static const struct intel_dpll_mgr tgl_pll_mgr = {
4051 	.dpll_info = tgl_plls,
4052 	.compute_dplls = icl_compute_dplls,
4053 	.get_dplls = icl_get_dplls,
4054 	.put_dplls = icl_put_dplls,
4055 	.update_active_dpll = icl_update_active_dpll,
4056 	.update_ref_clks = icl_update_dpll_ref_clks,
4057 	.dump_hw_state = icl_dump_hw_state,
4058 };
4059 
4060 static const struct dpll_info rkl_plls[] = {
4061 	{ "DPLL 0", &combo_pll_funcs, DPLL_ID_ICL_DPLL0, 0 },
4062 	{ "DPLL 1", &combo_pll_funcs, DPLL_ID_ICL_DPLL1, 0 },
4063 	{ "DPLL 4", &combo_pll_funcs, DPLL_ID_EHL_DPLL4, 0 },
4064 	{ },
4065 };
4066 
4067 static const struct intel_dpll_mgr rkl_pll_mgr = {
4068 	.dpll_info = rkl_plls,
4069 	.compute_dplls = icl_compute_dplls,
4070 	.get_dplls = icl_get_dplls,
4071 	.put_dplls = icl_put_dplls,
4072 	.update_ref_clks = icl_update_dpll_ref_clks,
4073 	.dump_hw_state = icl_dump_hw_state,
4074 };
4075 
4076 static const struct dpll_info dg1_plls[] = {
4077 	{ "DPLL 0", &combo_pll_funcs, DPLL_ID_DG1_DPLL0, 0 },
4078 	{ "DPLL 1", &combo_pll_funcs, DPLL_ID_DG1_DPLL1, 0 },
4079 	{ "DPLL 2", &combo_pll_funcs, DPLL_ID_DG1_DPLL2, 0 },
4080 	{ "DPLL 3", &combo_pll_funcs, DPLL_ID_DG1_DPLL3, 0 },
4081 	{ },
4082 };
4083 
4084 static const struct intel_dpll_mgr dg1_pll_mgr = {
4085 	.dpll_info = dg1_plls,
4086 	.compute_dplls = icl_compute_dplls,
4087 	.get_dplls = icl_get_dplls,
4088 	.put_dplls = icl_put_dplls,
4089 	.update_ref_clks = icl_update_dpll_ref_clks,
4090 	.dump_hw_state = icl_dump_hw_state,
4091 };
4092 
4093 static const struct dpll_info adls_plls[] = {
4094 	{ "DPLL 0", &combo_pll_funcs, DPLL_ID_ICL_DPLL0, 0 },
4095 	{ "DPLL 1", &combo_pll_funcs, DPLL_ID_ICL_DPLL1, 0 },
4096 	{ "DPLL 2", &combo_pll_funcs, DPLL_ID_DG1_DPLL2, 0 },
4097 	{ "DPLL 3", &combo_pll_funcs, DPLL_ID_DG1_DPLL3, 0 },
4098 	{ },
4099 };
4100 
4101 static const struct intel_dpll_mgr adls_pll_mgr = {
4102 	.dpll_info = adls_plls,
4103 	.compute_dplls = icl_compute_dplls,
4104 	.get_dplls = icl_get_dplls,
4105 	.put_dplls = icl_put_dplls,
4106 	.update_ref_clks = icl_update_dpll_ref_clks,
4107 	.dump_hw_state = icl_dump_hw_state,
4108 };
4109 
4110 static const struct dpll_info adlp_plls[] = {
4111 	{ "DPLL 0", &combo_pll_funcs, DPLL_ID_ICL_DPLL0,  0 },
4112 	{ "DPLL 1", &combo_pll_funcs, DPLL_ID_ICL_DPLL1,  0 },
4113 	{ "TBT PLL",  &tbt_pll_funcs, DPLL_ID_ICL_TBTPLL, 0 },
4114 	{ "TC PLL 1", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL1, 0 },
4115 	{ "TC PLL 2", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL2, 0 },
4116 	{ "TC PLL 3", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL3, 0 },
4117 	{ "TC PLL 4", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL4, 0 },
4118 	{ },
4119 };
4120 
4121 static const struct intel_dpll_mgr adlp_pll_mgr = {
4122 	.dpll_info = adlp_plls,
4123 	.compute_dplls = icl_compute_dplls,
4124 	.get_dplls = icl_get_dplls,
4125 	.put_dplls = icl_put_dplls,
4126 	.update_active_dpll = icl_update_active_dpll,
4127 	.update_ref_clks = icl_update_dpll_ref_clks,
4128 	.dump_hw_state = icl_dump_hw_state,
4129 };
4130 
4131 /**
4132  * intel_shared_dpll_init - Initialize shared DPLLs
4133  * @dev_priv: i915 device
4134  *
4135  * Initialize shared DPLLs for @dev_priv.
4136  */
intel_shared_dpll_init(struct drm_i915_private * dev_priv)4137 void intel_shared_dpll_init(struct drm_i915_private *dev_priv)
4138 {
4139 	const struct intel_dpll_mgr *dpll_mgr = NULL;
4140 	const struct dpll_info *dpll_info;
4141 	int i;
4142 
4143 	mutex_init(&dev_priv->display.dpll.lock);
4144 
4145 	if (DISPLAY_VER(dev_priv) >= 14 || IS_DG2(dev_priv))
4146 		/* No shared DPLLs on DG2; port PLLs are part of the PHY */
4147 		dpll_mgr = NULL;
4148 	else if (IS_ALDERLAKE_P(dev_priv))
4149 		dpll_mgr = &adlp_pll_mgr;
4150 	else if (IS_ALDERLAKE_S(dev_priv))
4151 		dpll_mgr = &adls_pll_mgr;
4152 	else if (IS_DG1(dev_priv))
4153 		dpll_mgr = &dg1_pll_mgr;
4154 	else if (IS_ROCKETLAKE(dev_priv))
4155 		dpll_mgr = &rkl_pll_mgr;
4156 	else if (DISPLAY_VER(dev_priv) >= 12)
4157 		dpll_mgr = &tgl_pll_mgr;
4158 	else if (IS_JASPERLAKE(dev_priv) || IS_ELKHARTLAKE(dev_priv))
4159 		dpll_mgr = &ehl_pll_mgr;
4160 	else if (DISPLAY_VER(dev_priv) >= 11)
4161 		dpll_mgr = &icl_pll_mgr;
4162 	else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))
4163 		dpll_mgr = &bxt_pll_mgr;
4164 	else if (DISPLAY_VER(dev_priv) == 9)
4165 		dpll_mgr = &skl_pll_mgr;
4166 	else if (HAS_DDI(dev_priv))
4167 		dpll_mgr = &hsw_pll_mgr;
4168 	else if (HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv))
4169 		dpll_mgr = &pch_pll_mgr;
4170 
4171 	if (!dpll_mgr) {
4172 		dev_priv->display.dpll.num_shared_dpll = 0;
4173 		return;
4174 	}
4175 
4176 	dpll_info = dpll_mgr->dpll_info;
4177 
4178 	for (i = 0; dpll_info[i].name; i++) {
4179 		if (drm_WARN_ON(&dev_priv->drm,
4180 				i >= ARRAY_SIZE(dev_priv->display.dpll.shared_dplls)))
4181 			break;
4182 
4183 		drm_WARN_ON(&dev_priv->drm, i != dpll_info[i].id);
4184 		dev_priv->display.dpll.shared_dplls[i].info = &dpll_info[i];
4185 	}
4186 
4187 	dev_priv->display.dpll.mgr = dpll_mgr;
4188 	dev_priv->display.dpll.num_shared_dpll = i;
4189 }
4190 
4191 /**
4192  * intel_compute_shared_dplls - compute DPLL state CRTC and encoder combination
4193  * @state: atomic state
4194  * @crtc: CRTC to compute DPLLs for
4195  * @encoder: encoder
4196  *
4197  * This function computes the DPLL state for the given CRTC and encoder.
4198  *
4199  * The new configuration in the atomic commit @state is made effective by
4200  * calling intel_shared_dpll_swap_state().
4201  *
4202  * Returns:
4203  * 0 on success, negative error code on falure.
4204  */
intel_compute_shared_dplls(struct intel_atomic_state * state,struct intel_crtc * crtc,struct intel_encoder * encoder)4205 int intel_compute_shared_dplls(struct intel_atomic_state *state,
4206 			       struct intel_crtc *crtc,
4207 			       struct intel_encoder *encoder)
4208 {
4209 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
4210 	const struct intel_dpll_mgr *dpll_mgr = dev_priv->display.dpll.mgr;
4211 
4212 	if (drm_WARN_ON(&dev_priv->drm, !dpll_mgr))
4213 		return -EINVAL;
4214 
4215 	return dpll_mgr->compute_dplls(state, crtc, encoder);
4216 }
4217 
4218 /**
4219  * intel_reserve_shared_dplls - reserve DPLLs for CRTC and encoder combination
4220  * @state: atomic state
4221  * @crtc: CRTC to reserve DPLLs for
4222  * @encoder: encoder
4223  *
4224  * This function reserves all required DPLLs for the given CRTC and encoder
4225  * combination in the current atomic commit @state and the new @crtc atomic
4226  * state.
4227  *
4228  * The new configuration in the atomic commit @state is made effective by
4229  * calling intel_shared_dpll_swap_state().
4230  *
4231  * The reserved DPLLs should be released by calling
4232  * intel_release_shared_dplls().
4233  *
4234  * Returns:
4235  * 0 if all required DPLLs were successfully reserved,
4236  * negative error code otherwise.
4237  */
intel_reserve_shared_dplls(struct intel_atomic_state * state,struct intel_crtc * crtc,struct intel_encoder * encoder)4238 int intel_reserve_shared_dplls(struct intel_atomic_state *state,
4239 			       struct intel_crtc *crtc,
4240 			       struct intel_encoder *encoder)
4241 {
4242 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
4243 	const struct intel_dpll_mgr *dpll_mgr = dev_priv->display.dpll.mgr;
4244 
4245 	if (drm_WARN_ON(&dev_priv->drm, !dpll_mgr))
4246 		return -EINVAL;
4247 
4248 	return dpll_mgr->get_dplls(state, crtc, encoder);
4249 }
4250 
4251 /**
4252  * intel_release_shared_dplls - end use of DPLLs by CRTC in atomic state
4253  * @state: atomic state
4254  * @crtc: crtc from which the DPLLs are to be released
4255  *
4256  * This function releases all DPLLs reserved by intel_reserve_shared_dplls()
4257  * from the current atomic commit @state and the old @crtc atomic state.
4258  *
4259  * The new configuration in the atomic commit @state is made effective by
4260  * calling intel_shared_dpll_swap_state().
4261  */
intel_release_shared_dplls(struct intel_atomic_state * state,struct intel_crtc * crtc)4262 void intel_release_shared_dplls(struct intel_atomic_state *state,
4263 				struct intel_crtc *crtc)
4264 {
4265 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
4266 	const struct intel_dpll_mgr *dpll_mgr = dev_priv->display.dpll.mgr;
4267 
4268 	/*
4269 	 * FIXME: this function is called for every platform having a
4270 	 * compute_clock hook, even though the platform doesn't yet support
4271 	 * the shared DPLL framework and intel_reserve_shared_dplls() is not
4272 	 * called on those.
4273 	 */
4274 	if (!dpll_mgr)
4275 		return;
4276 
4277 	dpll_mgr->put_dplls(state, crtc);
4278 }
4279 
4280 /**
4281  * intel_update_active_dpll - update the active DPLL for a CRTC/encoder
4282  * @state: atomic state
4283  * @crtc: the CRTC for which to update the active DPLL
4284  * @encoder: encoder determining the type of port DPLL
4285  *
4286  * Update the active DPLL for the given @crtc/@encoder in @crtc's atomic state,
4287  * from the port DPLLs reserved previously by intel_reserve_shared_dplls(). The
4288  * DPLL selected will be based on the current mode of the encoder's port.
4289  */
intel_update_active_dpll(struct intel_atomic_state * state,struct intel_crtc * crtc,struct intel_encoder * encoder)4290 void intel_update_active_dpll(struct intel_atomic_state *state,
4291 			      struct intel_crtc *crtc,
4292 			      struct intel_encoder *encoder)
4293 {
4294 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
4295 	const struct intel_dpll_mgr *dpll_mgr = dev_priv->display.dpll.mgr;
4296 
4297 	if (drm_WARN_ON(&dev_priv->drm, !dpll_mgr))
4298 		return;
4299 
4300 	dpll_mgr->update_active_dpll(state, crtc, encoder);
4301 }
4302 
4303 /**
4304  * intel_dpll_get_freq - calculate the DPLL's output frequency
4305  * @i915: i915 device
4306  * @pll: DPLL for which to calculate the output frequency
4307  * @pll_state: DPLL state from which to calculate the output frequency
4308  *
4309  * Return the output frequency corresponding to @pll's passed in @pll_state.
4310  */
intel_dpll_get_freq(struct drm_i915_private * i915,const struct intel_shared_dpll * pll,const struct intel_dpll_hw_state * pll_state)4311 int intel_dpll_get_freq(struct drm_i915_private *i915,
4312 			const struct intel_shared_dpll *pll,
4313 			const struct intel_dpll_hw_state *pll_state)
4314 {
4315 	if (drm_WARN_ON(&i915->drm, !pll->info->funcs->get_freq))
4316 		return 0;
4317 
4318 	return pll->info->funcs->get_freq(i915, pll, pll_state);
4319 }
4320 
4321 /**
4322  * intel_dpll_get_hw_state - readout the DPLL's hardware state
4323  * @i915: i915 device
4324  * @pll: DPLL for which to calculate the output frequency
4325  * @hw_state: DPLL's hardware state
4326  *
4327  * Read out @pll's hardware state into @hw_state.
4328  */
intel_dpll_get_hw_state(struct drm_i915_private * i915,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)4329 bool intel_dpll_get_hw_state(struct drm_i915_private *i915,
4330 			     struct intel_shared_dpll *pll,
4331 			     struct intel_dpll_hw_state *hw_state)
4332 {
4333 	return pll->info->funcs->get_hw_state(i915, pll, hw_state);
4334 }
4335 
readout_dpll_hw_state(struct drm_i915_private * i915,struct intel_shared_dpll * pll)4336 static void readout_dpll_hw_state(struct drm_i915_private *i915,
4337 				  struct intel_shared_dpll *pll)
4338 {
4339 	struct intel_crtc *crtc;
4340 
4341 	pll->on = intel_dpll_get_hw_state(i915, pll, &pll->state.hw_state);
4342 
4343 	if ((IS_JASPERLAKE(i915) || IS_ELKHARTLAKE(i915)) &&
4344 	    pll->on &&
4345 	    pll->info->id == DPLL_ID_EHL_DPLL4) {
4346 		pll->wakeref = intel_display_power_get(i915,
4347 						       POWER_DOMAIN_DC_OFF);
4348 	}
4349 
4350 	pll->state.pipe_mask = 0;
4351 	for_each_intel_crtc(&i915->drm, crtc) {
4352 		struct intel_crtc_state *crtc_state =
4353 			to_intel_crtc_state(crtc->base.state);
4354 
4355 		if (crtc_state->hw.active && crtc_state->shared_dpll == pll)
4356 			intel_reference_shared_dpll_crtc(crtc, pll, &pll->state);
4357 	}
4358 	pll->active_mask = pll->state.pipe_mask;
4359 
4360 	drm_dbg_kms(&i915->drm,
4361 		    "%s hw state readout: pipe_mask 0x%x, on %i\n",
4362 		    pll->info->name, pll->state.pipe_mask, pll->on);
4363 }
4364 
intel_dpll_update_ref_clks(struct drm_i915_private * i915)4365 void intel_dpll_update_ref_clks(struct drm_i915_private *i915)
4366 {
4367 	if (i915->display.dpll.mgr && i915->display.dpll.mgr->update_ref_clks)
4368 		i915->display.dpll.mgr->update_ref_clks(i915);
4369 }
4370 
intel_dpll_readout_hw_state(struct drm_i915_private * i915)4371 void intel_dpll_readout_hw_state(struct drm_i915_private *i915)
4372 {
4373 	int i;
4374 
4375 	for (i = 0; i < i915->display.dpll.num_shared_dpll; i++)
4376 		readout_dpll_hw_state(i915, &i915->display.dpll.shared_dplls[i]);
4377 }
4378 
sanitize_dpll_state(struct drm_i915_private * i915,struct intel_shared_dpll * pll)4379 static void sanitize_dpll_state(struct drm_i915_private *i915,
4380 				struct intel_shared_dpll *pll)
4381 {
4382 	if (!pll->on)
4383 		return;
4384 
4385 	adlp_cmtg_clock_gating_wa(i915, pll);
4386 
4387 	if (pll->active_mask)
4388 		return;
4389 
4390 	drm_dbg_kms(&i915->drm,
4391 		    "%s enabled but not in use, disabling\n",
4392 		    pll->info->name);
4393 
4394 	pll->info->funcs->disable(i915, pll);
4395 	pll->on = false;
4396 }
4397 
intel_dpll_sanitize_state(struct drm_i915_private * i915)4398 void intel_dpll_sanitize_state(struct drm_i915_private *i915)
4399 {
4400 	int i;
4401 
4402 	for (i = 0; i < i915->display.dpll.num_shared_dpll; i++)
4403 		sanitize_dpll_state(i915, &i915->display.dpll.shared_dplls[i]);
4404 }
4405 
4406 /**
4407  * intel_dpll_dump_hw_state - write hw_state to dmesg
4408  * @dev_priv: i915 drm device
4409  * @hw_state: hw state to be written to the log
4410  *
4411  * Write the relevant values in @hw_state to dmesg using drm_dbg_kms.
4412  */
intel_dpll_dump_hw_state(struct drm_i915_private * dev_priv,const struct intel_dpll_hw_state * hw_state)4413 void intel_dpll_dump_hw_state(struct drm_i915_private *dev_priv,
4414 			      const struct intel_dpll_hw_state *hw_state)
4415 {
4416 	if (dev_priv->display.dpll.mgr) {
4417 		dev_priv->display.dpll.mgr->dump_hw_state(dev_priv, hw_state);
4418 	} else {
4419 		/* fallback for platforms that don't use the shared dpll
4420 		 * infrastructure
4421 		 */
4422 		drm_dbg_kms(&dev_priv->drm,
4423 			    "dpll_hw_state: dpll: 0x%x, dpll_md: 0x%x, "
4424 			    "fp0: 0x%x, fp1: 0x%x\n",
4425 			    hw_state->dpll,
4426 			    hw_state->dpll_md,
4427 			    hw_state->fp0,
4428 			    hw_state->fp1);
4429 	}
4430 }
4431 
4432 static void
verify_single_dpll_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_crtc * crtc,struct intel_crtc_state * new_crtc_state)4433 verify_single_dpll_state(struct drm_i915_private *dev_priv,
4434 			 struct intel_shared_dpll *pll,
4435 			 struct intel_crtc *crtc,
4436 			 struct intel_crtc_state *new_crtc_state)
4437 {
4438 	struct intel_dpll_hw_state dpll_hw_state;
4439 	u8 pipe_mask;
4440 	bool active;
4441 
4442 	memset(&dpll_hw_state, 0, sizeof(dpll_hw_state));
4443 
4444 	drm_dbg_kms(&dev_priv->drm, "%s\n", pll->info->name);
4445 
4446 	active = intel_dpll_get_hw_state(dev_priv, pll, &dpll_hw_state);
4447 
4448 	if (!(pll->info->flags & INTEL_DPLL_ALWAYS_ON)) {
4449 		I915_STATE_WARN(dev_priv, !pll->on && pll->active_mask,
4450 				"pll in active use but not on in sw tracking\n");
4451 		I915_STATE_WARN(dev_priv, pll->on && !pll->active_mask,
4452 				"pll is on but not used by any active pipe\n");
4453 		I915_STATE_WARN(dev_priv, pll->on != active,
4454 				"pll on state mismatch (expected %i, found %i)\n",
4455 				pll->on, active);
4456 	}
4457 
4458 	if (!crtc) {
4459 		I915_STATE_WARN(dev_priv,
4460 				pll->active_mask & ~pll->state.pipe_mask,
4461 				"more active pll users than references: 0x%x vs 0x%x\n",
4462 				pll->active_mask, pll->state.pipe_mask);
4463 
4464 		return;
4465 	}
4466 
4467 	pipe_mask = BIT(crtc->pipe);
4468 
4469 	if (new_crtc_state->hw.active)
4470 		I915_STATE_WARN(dev_priv, !(pll->active_mask & pipe_mask),
4471 				"pll active mismatch (expected pipe %c in active mask 0x%x)\n",
4472 				pipe_name(crtc->pipe), pll->active_mask);
4473 	else
4474 		I915_STATE_WARN(dev_priv, pll->active_mask & pipe_mask,
4475 				"pll active mismatch (didn't expect pipe %c in active mask 0x%x)\n",
4476 				pipe_name(crtc->pipe), pll->active_mask);
4477 
4478 	I915_STATE_WARN(dev_priv, !(pll->state.pipe_mask & pipe_mask),
4479 			"pll enabled crtcs mismatch (expected 0x%x in 0x%x)\n",
4480 			pipe_mask, pll->state.pipe_mask);
4481 
4482 	I915_STATE_WARN(dev_priv,
4483 			pll->on && memcmp(&pll->state.hw_state, &dpll_hw_state,
4484 					  sizeof(dpll_hw_state)),
4485 			"pll hw state mismatch\n");
4486 }
4487 
intel_shared_dpll_state_verify(struct intel_crtc * crtc,struct intel_crtc_state * old_crtc_state,struct intel_crtc_state * new_crtc_state)4488 void intel_shared_dpll_state_verify(struct intel_crtc *crtc,
4489 				    struct intel_crtc_state *old_crtc_state,
4490 				    struct intel_crtc_state *new_crtc_state)
4491 {
4492 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
4493 
4494 	if (new_crtc_state->shared_dpll)
4495 		verify_single_dpll_state(dev_priv, new_crtc_state->shared_dpll,
4496 					 crtc, new_crtc_state);
4497 
4498 	if (old_crtc_state->shared_dpll &&
4499 	    old_crtc_state->shared_dpll != new_crtc_state->shared_dpll) {
4500 		u8 pipe_mask = BIT(crtc->pipe);
4501 		struct intel_shared_dpll *pll = old_crtc_state->shared_dpll;
4502 
4503 		I915_STATE_WARN(dev_priv, pll->active_mask & pipe_mask,
4504 				"pll active mismatch (didn't expect pipe %c in active mask (0x%x))\n",
4505 				pipe_name(crtc->pipe), pll->active_mask);
4506 		I915_STATE_WARN(dev_priv, pll->state.pipe_mask & pipe_mask,
4507 				"pll enabled crtcs mismatch (found %x in enabled mask (0x%x))\n",
4508 				pipe_name(crtc->pipe), pll->state.pipe_mask);
4509 	}
4510 }
4511 
intel_shared_dpll_verify_disabled(struct drm_i915_private * i915)4512 void intel_shared_dpll_verify_disabled(struct drm_i915_private *i915)
4513 {
4514 	int i;
4515 
4516 	for (i = 0; i < i915->display.dpll.num_shared_dpll; i++)
4517 		verify_single_dpll_state(i915, &i915->display.dpll.shared_dplls[i],
4518 					 NULL, NULL);
4519 }
4520