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