cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

intel_dpll_mgr.c (122687B)


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