drm/i915: Introduce some local PLL state variables
Spinkle local PLL hw_state variables into various low level PLL functions. Will make subsequent changes cleaner when we don't have to touch so many places when renaming struct members and whatnot. Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20240412182703.19916-5-ville.syrjala@linux.intel.com Reviewed-by: Jani Nikula <jani.nikula@intel.com>
This commit is contained in:
parent
3420841fd6
commit
4d6e86fbec
@ -555,15 +555,16 @@ static void ibx_assert_pch_refclk_enabled(struct drm_i915_private *i915)
|
||||
static void ibx_pch_dpll_enable(struct drm_i915_private *i915,
|
||||
struct intel_shared_dpll *pll)
|
||||
{
|
||||
const struct intel_dpll_hw_state *hw_state = &pll->state.hw_state;
|
||||
const enum intel_dpll_id id = pll->info->id;
|
||||
|
||||
/* PCH refclock must be enabled first */
|
||||
ibx_assert_pch_refclk_enabled(i915);
|
||||
|
||||
intel_de_write(i915, PCH_FP0(id), pll->state.hw_state.fp0);
|
||||
intel_de_write(i915, PCH_FP1(id), pll->state.hw_state.fp1);
|
||||
intel_de_write(i915, PCH_FP0(id), hw_state->fp0);
|
||||
intel_de_write(i915, PCH_FP1(id), hw_state->fp1);
|
||||
|
||||
intel_de_write(i915, PCH_DPLL(id), pll->state.hw_state.dpll);
|
||||
intel_de_write(i915, PCH_DPLL(id), hw_state->dpll);
|
||||
|
||||
/* Wait for the clocks to stabilize. */
|
||||
intel_de_posting_read(i915, PCH_DPLL(id));
|
||||
@ -574,7 +575,7 @@ static void ibx_pch_dpll_enable(struct drm_i915_private *i915,
|
||||
*
|
||||
* So write it again.
|
||||
*/
|
||||
intel_de_write(i915, PCH_DPLL(id), pll->state.hw_state.dpll);
|
||||
intel_de_write(i915, PCH_DPLL(id), hw_state->dpll);
|
||||
intel_de_posting_read(i915, PCH_DPLL(id));
|
||||
udelay(200);
|
||||
}
|
||||
@ -678,9 +679,10 @@ static const struct intel_dpll_mgr pch_pll_mgr = {
|
||||
static void hsw_ddi_wrpll_enable(struct drm_i915_private *i915,
|
||||
struct intel_shared_dpll *pll)
|
||||
{
|
||||
const struct intel_dpll_hw_state *hw_state = &pll->state.hw_state;
|
||||
const enum intel_dpll_id id = pll->info->id;
|
||||
|
||||
intel_de_write(i915, WRPLL_CTL(id), pll->state.hw_state.wrpll);
|
||||
intel_de_write(i915, WRPLL_CTL(id), hw_state->wrpll);
|
||||
intel_de_posting_read(i915, WRPLL_CTL(id));
|
||||
udelay(20);
|
||||
}
|
||||
@ -688,7 +690,9 @@ static void hsw_ddi_wrpll_enable(struct drm_i915_private *i915,
|
||||
static void hsw_ddi_spll_enable(struct drm_i915_private *i915,
|
||||
struct intel_shared_dpll *pll)
|
||||
{
|
||||
intel_de_write(i915, SPLL_CTL, pll->state.hw_state.spll);
|
||||
const struct intel_dpll_hw_state *hw_state = &pll->state.hw_state;
|
||||
|
||||
intel_de_write(i915, SPLL_CTL, hw_state->spll);
|
||||
intel_de_posting_read(i915, SPLL_CTL);
|
||||
udelay(20);
|
||||
}
|
||||
@ -1019,11 +1023,12 @@ hsw_ddi_wrpll_compute_dpll(struct intel_atomic_state *state,
|
||||
struct drm_i915_private *i915 = to_i915(state->base.dev);
|
||||
struct intel_crtc_state *crtc_state =
|
||||
intel_atomic_get_new_crtc_state(state, crtc);
|
||||
struct intel_dpll_hw_state *hw_state = &crtc_state->dpll_hw_state;
|
||||
unsigned int p, n2, r2;
|
||||
|
||||
hsw_ddi_calculate_wrpll(crtc_state->port_clock * 1000, &r2, &n2, &p);
|
||||
|
||||
crtc_state->dpll_hw_state.wrpll =
|
||||
hw_state->wrpll =
|
||||
WRPLL_PLL_ENABLE | WRPLL_REF_LCPLL |
|
||||
WRPLL_DIVIDER_REFERENCE(r2) | WRPLL_DIVIDER_FEEDBACK(n2) |
|
||||
WRPLL_DIVIDER_POST(p);
|
||||
@ -1126,11 +1131,12 @@ hsw_ddi_spll_compute_dpll(struct intel_atomic_state *state,
|
||||
{
|
||||
struct intel_crtc_state *crtc_state =
|
||||
intel_atomic_get_new_crtc_state(state, crtc);
|
||||
struct intel_dpll_hw_state *hw_state = &crtc_state->dpll_hw_state;
|
||||
|
||||
if (drm_WARN_ON(crtc->base.dev, crtc_state->port_clock / 2 != 135000))
|
||||
return -EINVAL;
|
||||
|
||||
crtc_state->dpll_hw_state.spll =
|
||||
hw_state->spll =
|
||||
SPLL_PLL_ENABLE | SPLL_FREQ_1350MHz | SPLL_REF_MUXED_SSC;
|
||||
|
||||
return 0;
|
||||
@ -1333,24 +1339,28 @@ static const struct skl_dpll_regs skl_dpll_regs[4] = {
|
||||
static void skl_ddi_pll_write_ctrl1(struct drm_i915_private *i915,
|
||||
struct intel_shared_dpll *pll)
|
||||
{
|
||||
const struct intel_dpll_hw_state *hw_state = &pll->state.hw_state;
|
||||
const enum intel_dpll_id id = pll->info->id;
|
||||
|
||||
intel_de_rmw(i915, DPLL_CTRL1,
|
||||
DPLL_CTRL1_HDMI_MODE(id) | DPLL_CTRL1_SSC(id) | DPLL_CTRL1_LINK_RATE_MASK(id),
|
||||
pll->state.hw_state.ctrl1 << (id * 6));
|
||||
DPLL_CTRL1_HDMI_MODE(id) |
|
||||
DPLL_CTRL1_SSC(id) |
|
||||
DPLL_CTRL1_LINK_RATE_MASK(id),
|
||||
hw_state->ctrl1 << (id * 6));
|
||||
intel_de_posting_read(i915, DPLL_CTRL1);
|
||||
}
|
||||
|
||||
static void skl_ddi_pll_enable(struct drm_i915_private *i915,
|
||||
struct intel_shared_dpll *pll)
|
||||
{
|
||||
const struct intel_dpll_hw_state *hw_state = &pll->state.hw_state;
|
||||
const struct skl_dpll_regs *regs = skl_dpll_regs;
|
||||
const enum intel_dpll_id id = pll->info->id;
|
||||
|
||||
skl_ddi_pll_write_ctrl1(i915, pll);
|
||||
|
||||
intel_de_write(i915, regs[id].cfgcr1, pll->state.hw_state.cfgcr1);
|
||||
intel_de_write(i915, regs[id].cfgcr2, pll->state.hw_state.cfgcr2);
|
||||
intel_de_write(i915, regs[id].cfgcr1, hw_state->cfgcr1);
|
||||
intel_de_write(i915, regs[id].cfgcr2, hw_state->cfgcr2);
|
||||
intel_de_posting_read(i915, regs[id].cfgcr1);
|
||||
intel_de_posting_read(i915, regs[id].cfgcr2);
|
||||
|
||||
@ -1766,37 +1776,35 @@ static int skl_ddi_wrpll_get_freq(struct drm_i915_private *i915,
|
||||
static int skl_ddi_hdmi_pll_dividers(struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
|
||||
struct intel_dpll_hw_state *hw_state = &crtc_state->dpll_hw_state;
|
||||
struct skl_wrpll_params wrpll_params = {};
|
||||
u32 ctrl1, cfgcr1, cfgcr2;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* See comment in intel_dpll_hw_state to understand why we always use 0
|
||||
* as the DPLL id in this function.
|
||||
*/
|
||||
ctrl1 = DPLL_CTRL1_OVERRIDE(0);
|
||||
|
||||
ctrl1 |= DPLL_CTRL1_HDMI_MODE(0);
|
||||
|
||||
ret = skl_ddi_calculate_wrpll(crtc_state->port_clock * 1000,
|
||||
i915->display.dpll.ref_clks.nssc, &wrpll_params);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
cfgcr1 = DPLL_CFGCR1_FREQ_ENABLE |
|
||||
/*
|
||||
* See comment in intel_dpll_hw_state to understand why we always use 0
|
||||
* as the DPLL id in this function.
|
||||
*/
|
||||
hw_state->ctrl1 =
|
||||
DPLL_CTRL1_OVERRIDE(0) |
|
||||
DPLL_CTRL1_HDMI_MODE(0);
|
||||
|
||||
hw_state->cfgcr1 =
|
||||
DPLL_CFGCR1_FREQ_ENABLE |
|
||||
DPLL_CFGCR1_DCO_FRACTION(wrpll_params.dco_fraction) |
|
||||
wrpll_params.dco_integer;
|
||||
|
||||
cfgcr2 = DPLL_CFGCR2_QDIV_RATIO(wrpll_params.qdiv_ratio) |
|
||||
hw_state->cfgcr2 =
|
||||
DPLL_CFGCR2_QDIV_RATIO(wrpll_params.qdiv_ratio) |
|
||||
DPLL_CFGCR2_QDIV_MODE(wrpll_params.qdiv_mode) |
|
||||
DPLL_CFGCR2_KDIV(wrpll_params.kdiv) |
|
||||
DPLL_CFGCR2_PDIV(wrpll_params.pdiv) |
|
||||
wrpll_params.central_freq;
|
||||
|
||||
crtc_state->dpll_hw_state.ctrl1 = ctrl1;
|
||||
crtc_state->dpll_hw_state.cfgcr1 = cfgcr1;
|
||||
crtc_state->dpll_hw_state.cfgcr2 = cfgcr2;
|
||||
|
||||
crtc_state->port_clock = skl_ddi_wrpll_get_freq(i915, NULL,
|
||||
&crtc_state->dpll_hw_state);
|
||||
|
||||
@ -1806,6 +1814,7 @@ static int skl_ddi_hdmi_pll_dividers(struct intel_crtc_state *crtc_state)
|
||||
static int
|
||||
skl_ddi_dp_set_dpll_hw_state(struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct intel_dpll_hw_state *hw_state = &crtc_state->dpll_hw_state;
|
||||
u32 ctrl1;
|
||||
|
||||
/*
|
||||
@ -1835,7 +1844,7 @@ skl_ddi_dp_set_dpll_hw_state(struct intel_crtc_state *crtc_state)
|
||||
break;
|
||||
}
|
||||
|
||||
crtc_state->dpll_hw_state.ctrl1 = ctrl1;
|
||||
hw_state->ctrl1 = ctrl1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1989,10 +1998,11 @@ static const struct intel_dpll_mgr skl_pll_mgr = {
|
||||
static void bxt_ddi_pll_enable(struct drm_i915_private *i915,
|
||||
struct intel_shared_dpll *pll)
|
||||
{
|
||||
u32 temp;
|
||||
const struct intel_dpll_hw_state *hw_state = &pll->state.hw_state;
|
||||
enum port port = (enum port)pll->info->id; /* 1:1 port->PLL mapping */
|
||||
enum dpio_phy phy;
|
||||
enum dpio_channel ch;
|
||||
u32 temp;
|
||||
|
||||
bxt_port_to_phy_channel(i915, port, &phy, &ch);
|
||||
|
||||
@ -2015,43 +2025,43 @@ static void bxt_ddi_pll_enable(struct drm_i915_private *i915,
|
||||
|
||||
/* Write P1 & P2 */
|
||||
intel_de_rmw(i915, BXT_PORT_PLL_EBB_0(phy, ch),
|
||||
PORT_PLL_P1_MASK | PORT_PLL_P2_MASK, pll->state.hw_state.ebb0);
|
||||
PORT_PLL_P1_MASK | PORT_PLL_P2_MASK, hw_state->ebb0);
|
||||
|
||||
/* Write M2 integer */
|
||||
intel_de_rmw(i915, BXT_PORT_PLL(phy, ch, 0),
|
||||
PORT_PLL_M2_INT_MASK, pll->state.hw_state.pll0);
|
||||
PORT_PLL_M2_INT_MASK, hw_state->pll0);
|
||||
|
||||
/* Write N */
|
||||
intel_de_rmw(i915, BXT_PORT_PLL(phy, ch, 1),
|
||||
PORT_PLL_N_MASK, pll->state.hw_state.pll1);
|
||||
PORT_PLL_N_MASK, hw_state->pll1);
|
||||
|
||||
/* Write M2 fraction */
|
||||
intel_de_rmw(i915, BXT_PORT_PLL(phy, ch, 2),
|
||||
PORT_PLL_M2_FRAC_MASK, pll->state.hw_state.pll2);
|
||||
PORT_PLL_M2_FRAC_MASK, hw_state->pll2);
|
||||
|
||||
/* Write M2 fraction enable */
|
||||
intel_de_rmw(i915, BXT_PORT_PLL(phy, ch, 3),
|
||||
PORT_PLL_M2_FRAC_ENABLE, pll->state.hw_state.pll3);
|
||||
PORT_PLL_M2_FRAC_ENABLE, hw_state->pll3);
|
||||
|
||||
/* Write coeff */
|
||||
temp = intel_de_read(i915, BXT_PORT_PLL(phy, ch, 6));
|
||||
temp &= ~PORT_PLL_PROP_COEFF_MASK;
|
||||
temp &= ~PORT_PLL_INT_COEFF_MASK;
|
||||
temp &= ~PORT_PLL_GAIN_CTL_MASK;
|
||||
temp |= pll->state.hw_state.pll6;
|
||||
temp |= hw_state->pll6;
|
||||
intel_de_write(i915, BXT_PORT_PLL(phy, ch, 6), temp);
|
||||
|
||||
/* Write calibration val */
|
||||
intel_de_rmw(i915, BXT_PORT_PLL(phy, ch, 8),
|
||||
PORT_PLL_TARGET_CNT_MASK, pll->state.hw_state.pll8);
|
||||
PORT_PLL_TARGET_CNT_MASK, hw_state->pll8);
|
||||
|
||||
intel_de_rmw(i915, BXT_PORT_PLL(phy, ch, 9),
|
||||
PORT_PLL_LOCK_THRESHOLD_MASK, pll->state.hw_state.pll9);
|
||||
PORT_PLL_LOCK_THRESHOLD_MASK, hw_state->pll9);
|
||||
|
||||
temp = intel_de_read(i915, BXT_PORT_PLL(phy, ch, 10));
|
||||
temp &= ~PORT_PLL_DCO_AMP_OVR_EN_H;
|
||||
temp &= ~PORT_PLL_DCO_AMP_MASK;
|
||||
temp |= pll->state.hw_state.pll10;
|
||||
temp |= hw_state->pll10;
|
||||
intel_de_write(i915, BXT_PORT_PLL(phy, ch, 10), temp);
|
||||
|
||||
/* Recalibrate with new settings */
|
||||
@ -2059,7 +2069,7 @@ static void bxt_ddi_pll_enable(struct drm_i915_private *i915,
|
||||
temp |= PORT_PLL_RECALIBRATE;
|
||||
intel_de_write(i915, BXT_PORT_PLL_EBB_4(phy, ch), temp);
|
||||
temp &= ~PORT_PLL_10BIT_CLK_ENABLE;
|
||||
temp |= pll->state.hw_state.ebb4;
|
||||
temp |= hw_state->ebb4;
|
||||
intel_de_write(i915, BXT_PORT_PLL_EBB_4(phy, ch), temp);
|
||||
|
||||
/* Enable PLL */
|
||||
@ -2083,7 +2093,7 @@ static void bxt_ddi_pll_enable(struct drm_i915_private *i915,
|
||||
temp = intel_de_read(i915, BXT_PORT_PCS_DW12_LN01(phy, ch));
|
||||
temp &= ~LANE_STAGGER_MASK;
|
||||
temp &= ~LANESTAGGER_STRAP_OVRD;
|
||||
temp |= pll->state.hw_state.pcsdw12;
|
||||
temp |= hw_state->pcsdw12;
|
||||
intel_de_write(i915, BXT_PORT_PCS_DW12_GRP(phy, ch), temp);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user