[PATCH 1/2] drm/i915/display: Move port clock calculation
Kahola, Mika
mika.kahola at intel.com
Thu May 16 10:55:59 UTC 2024
> -----Original Message-----
> From: Sousa, Gustavo <gustavo.sousa at intel.com>
> Sent: Wednesday, May 15, 2024 4:24 PM
> To: Kahola, Mika <mika.kahola at intel.com>; intel-gfx at lists.freedesktop.org
> Cc: Deak, Imre <imre.deak at intel.com>; Kahola, Mika <mika.kahola at intel.com>
> Subject: Re: [PATCH 1/2] drm/i915/display: Move port clock calculation
>
> Quoting Mika Kahola (2024-05-15 03:45:23-03:00)
> >As a preparation to remove .clock member from pll state structure,
> >let's move the port clock calculation on better location
> >
> >Signed-off-by: Mika Kahola <mika.kahola at intel.com>
> >---
> > drivers/gpu/drm/i915/display/intel_cx0_phy.c | 176 ++++++++++---------
> > 1 file changed, 91 insertions(+), 85 deletions(-)
> >
> >diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >index 1b1ebafa49e8..9f860a05e623 100644
> >--- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >@@ -1970,13 +1970,92 @@ static const struct intel_c20pll_state * const
> mtl_c20_hdmi_tables[] = {
> > NULL,
> > };
> >
> >-static int intel_c10_phy_check_hdmi_link_rate(int clock)
> >+static int intel_c10pll_calc_port_clock(struct intel_encoder *encoder,
> >+ const struct
> >+intel_c10pll_state *pll_state) {
> >+ unsigned int frac_quot = 0, frac_rem = 0, frac_den = 1;
> >+ unsigned int multiplier, tx_clk_div, hdmi_div, refclk = 38400;
> >+ int tmpclk = 0;
> >+
> >+ if (pll_state->pll[0] & C10_PLL0_FRACEN) {
> >+ frac_quot = pll_state->pll[12] << 8 | pll_state->pll[11];
> >+ frac_rem = pll_state->pll[14] << 8 | pll_state->pll[13];
> >+ frac_den = pll_state->pll[10] << 8 | pll_state->pll[9];
> >+ }
> >+
> >+ multiplier = (REG_FIELD_GET8(C10_PLL3_MULTIPLIERH_MASK, pll_state-
> >pll[3]) << 8 |
> >+ pll_state->pll[2]) / 2 + 16;
> >+
> >+ tx_clk_div = REG_FIELD_GET8(C10_PLL15_TXCLKDIV_MASK, pll_state-
> >pll[15]);
> >+ hdmi_div = REG_FIELD_GET8(C10_PLL15_HDMIDIV_MASK,
> >+ pll_state->pll[15]);
> >+
> >+ tmpclk = DIV_ROUND_CLOSEST_ULL(mul_u32_u32(refclk, (multiplier << 16) +
> frac_quot) +
> >+ DIV_ROUND_CLOSEST(refclk * frac_rem, frac_den),
> >+ 10 << (tx_clk_div + 16));
> >+ tmpclk *= (hdmi_div ? 2 : 1);
> >+
> >+ return tmpclk;
> >+}
> >+
> >+static bool intel_c20phy_use_mpllb(const struct intel_c20pll_state
> >+*state) {
> >+ return state->tx[0] & C20_PHY_USE_MPLLB; }
> >+
> >+static int intel_c20pll_calc_port_clock(struct intel_encoder *encoder,
>
> While at it, also remove the unused "encoder" parameter?
>
> Also, note that there are legitimate checkpatch issues reported for this patch, with
> those addressed:
That's true. I will fix the checkpatch issues.
Thanks for the review!
-Mika-
>
> Reviewed-by: Gustavo Sousa <gustavo.sousa at intel.com>
>
> >+ const struct
> >+intel_c20pll_state *pll_state) {
> >+ unsigned int frac, frac_en, frac_quot, frac_rem, frac_den;
> >+ unsigned int multiplier, refclk = 38400;
> >+ unsigned int tx_clk_div;
> >+ unsigned int ref_clk_mpllb_div;
> >+ unsigned int fb_clk_div4_en;
> >+ unsigned int ref, vco;
> >+ unsigned int tx_rate_mult;
> >+ unsigned int tx_rate = REG_FIELD_GET(C20_PHY_TX_RATE,
> >+pll_state->tx[0]);
> >+
> >+ if (intel_c20phy_use_mpllb(pll_state)) {
> >+ tx_rate_mult = 1;
> >+ frac_en = REG_FIELD_GET(C20_MPLLB_FRACEN, pll_state->mpllb[6]);
> >+ frac_quot = pll_state->mpllb[8];
> >+ frac_rem = pll_state->mpllb[9];
> >+ frac_den = pll_state->mpllb[7];
> >+ multiplier = REG_FIELD_GET(C20_MULTIPLIER_MASK, pll_state-
> >mpllb[0]);
> >+ tx_clk_div = REG_FIELD_GET(C20_MPLLB_TX_CLK_DIV_MASK, pll_state-
> >mpllb[0]);
> >+ ref_clk_mpllb_div = REG_FIELD_GET(C20_REF_CLK_MPLLB_DIV_MASK,
> pll_state->mpllb[6]);
> >+ fb_clk_div4_en = 0;
> >+ } else {
> >+ tx_rate_mult = 2;
> >+ frac_en = REG_FIELD_GET(C20_MPLLA_FRACEN, pll_state->mplla[6]);
> >+ frac_quot = pll_state->mplla[8];
> >+ frac_rem = pll_state->mplla[9];
> >+ frac_den = pll_state->mplla[7];
> >+ multiplier = REG_FIELD_GET(C20_MULTIPLIER_MASK, pll_state-
> >mplla[0]);
> >+ tx_clk_div = REG_FIELD_GET(C20_MPLLA_TX_CLK_DIV_MASK, pll_state-
> >mplla[1]);
> >+ ref_clk_mpllb_div = REG_FIELD_GET(C20_REF_CLK_MPLLB_DIV_MASK,
> pll_state->mplla[6]);
> >+ fb_clk_div4_en = REG_FIELD_GET(C20_FB_CLK_DIV4_EN, pll_state-
> >mplla[0]);
> >+ }
> >+
> >+ if (frac_en)
> >+ frac = frac_quot + DIV_ROUND_CLOSEST(frac_rem, frac_den);
> >+ else
> >+ frac = 0;
> >+
> >+ ref = DIV_ROUND_CLOSEST(refclk * (1 << (1 + fb_clk_div4_en)), 1 <<
> ref_clk_mpllb_div);
> >+ vco = DIV_ROUND_CLOSEST_ULL(mul_u32_u32(ref, (multiplier <<
> >+ (17 - 2)) + frac) >> 17, 10);
> >+
> >+ return vco << tx_rate_mult >> tx_clk_div >> tx_rate; }
> >+
> >+static int intel_c10_phy_check_hdmi_link_rate(struct intel_encoder *encoder,
> >+ int clock)
> > {
> > const struct intel_c10pll_state * const *tables = mtl_c10_hdmi_tables;
> > int i;
> >
> > for (i = 0; tables[i]; i++) {
> >- if (clock == tables[i]->clock)
> >+ int port_clock = intel_c10pll_calc_port_clock(encoder, tables[i]);
> >+ if (clock == port_clock)
> > return MODE_OK;
> > }
> >
> >@@ -2035,7 +2114,8 @@ static int intel_c10pll_calc_state(struct intel_crtc_state
> *crtc_state,
> > return -EINVAL;
> >
> > for (i = 0; tables[i]; i++) {
> >- if (crtc_state->port_clock == tables[i]->clock) {
> >+ int port_clock = intel_c10pll_calc_port_clock(encoder, tables[i]);
> >+ if (crtc_state->port_clock == port_clock) {
> > crtc_state->dpll_hw_state.cx0pll.c10 = *tables[i];
> > intel_c10pll_update_pll(crtc_state, encoder);
> >
> >@@ -2209,13 +2289,15 @@ static int intel_c20_compute_hdmi_tmds_pll(u64
> pixel_clock, struct intel_c20pll_
> > return 0;
> > }
> >
> >-static int intel_c20_phy_check_hdmi_link_rate(int clock)
> >+static int intel_c20_phy_check_hdmi_link_rate(struct intel_encoder *encoder,
> >+ int clock)
> > {
> > const struct intel_c20pll_state * const *tables = mtl_c20_hdmi_tables;
> > int i;
> >
> > for (i = 0; tables[i]; i++) {
> >- if (clock == tables[i]->clock)
> >+ int port_clock = intel_c20pll_calc_port_clock(encoder, tables[i]);
> >+ if (clock == port_clock)
> > return MODE_OK;
> > }
> >
> >@@ -2230,8 +2312,8 @@ int intel_cx0_phy_check_hdmi_link_rate(struct
> intel_hdmi *hdmi, int clock)
> > struct intel_digital_port *dig_port = hdmi_to_dig_port(hdmi);
> >
> > if (intel_encoder_is_c10phy(&dig_port->base))
> >- return intel_c10_phy_check_hdmi_link_rate(clock);
> >- return intel_c20_phy_check_hdmi_link_rate(clock);
> >+ return intel_c10_phy_check_hdmi_link_rate(hdmi->attached_connector-
> >encoder, clock);
> >+ return
> >+ intel_c20_phy_check_hdmi_link_rate(hdmi->attached_connector->encoder,
> >+ clock);
> > }
> >
> > static const struct intel_c20pll_state * const * @@ -2275,7 +2357,8 @@
> >static int intel_c20pll_calc_state(struct intel_crtc_state *crtc_state,
> > return -EINVAL;
> >
> > for (i = 0; tables[i]; i++) {
> >- if (crtc_state->port_clock == tables[i]->clock) {
> >+ int port_clock = intel_c20pll_calc_port_clock(encoder, tables[i]);
> >+ if (crtc_state->port_clock == port_clock) {
> > crtc_state->dpll_hw_state.cx0pll.c20 = *tables[i];
> > return 0;
> > }
> >@@ -2292,56 +2375,6 @@ int intel_cx0pll_calc_state(struct intel_crtc_state
> *crtc_state,
> > return intel_c20pll_calc_state(crtc_state, encoder); }
> >
> >-static bool intel_c20phy_use_mpllb(const struct intel_c20pll_state
> >*state) -{
> >- return state->tx[0] & C20_PHY_USE_MPLLB;
> >-}
> >-
> >-static int intel_c20pll_calc_port_clock(struct intel_encoder *encoder,
> >- const struct intel_c20pll_state *pll_state)
> >-{
> >- unsigned int frac, frac_en, frac_quot, frac_rem, frac_den;
> >- unsigned int multiplier, refclk = 38400;
> >- unsigned int tx_clk_div;
> >- unsigned int ref_clk_mpllb_div;
> >- unsigned int fb_clk_div4_en;
> >- unsigned int ref, vco;
> >- unsigned int tx_rate_mult;
> >- unsigned int tx_rate = REG_FIELD_GET(C20_PHY_TX_RATE, pll_state->tx[0]);
> >-
> >- if (intel_c20phy_use_mpllb(pll_state)) {
> >- tx_rate_mult = 1;
> >- frac_en = REG_FIELD_GET(C20_MPLLB_FRACEN, pll_state->mpllb[6]);
> >- frac_quot = pll_state->mpllb[8];
> >- frac_rem = pll_state->mpllb[9];
> >- frac_den = pll_state->mpllb[7];
> >- multiplier = REG_FIELD_GET(C20_MULTIPLIER_MASK, pll_state-
> >mpllb[0]);
> >- tx_clk_div = REG_FIELD_GET(C20_MPLLB_TX_CLK_DIV_MASK, pll_state-
> >mpllb[0]);
> >- ref_clk_mpllb_div = REG_FIELD_GET(C20_REF_CLK_MPLLB_DIV_MASK,
> pll_state->mpllb[6]);
> >- fb_clk_div4_en = 0;
> >- } else {
> >- tx_rate_mult = 2;
> >- frac_en = REG_FIELD_GET(C20_MPLLA_FRACEN, pll_state->mplla[6]);
> >- frac_quot = pll_state->mplla[8];
> >- frac_rem = pll_state->mplla[9];
> >- frac_den = pll_state->mplla[7];
> >- multiplier = REG_FIELD_GET(C20_MULTIPLIER_MASK, pll_state-
> >mplla[0]);
> >- tx_clk_div = REG_FIELD_GET(C20_MPLLA_TX_CLK_DIV_MASK, pll_state-
> >mplla[1]);
> >- ref_clk_mpllb_div = REG_FIELD_GET(C20_REF_CLK_MPLLB_DIV_MASK,
> pll_state->mplla[6]);
> >- fb_clk_div4_en = REG_FIELD_GET(C20_FB_CLK_DIV4_EN, pll_state-
> >mplla[0]);
> >- }
> >-
> >- if (frac_en)
> >- frac = frac_quot + DIV_ROUND_CLOSEST(frac_rem, frac_den);
> >- else
> >- frac = 0;
> >-
> >- ref = DIV_ROUND_CLOSEST(refclk * (1 << (1 + fb_clk_div4_en)), 1 <<
> ref_clk_mpllb_div);
> >- vco = DIV_ROUND_CLOSEST_ULL(mul_u32_u32(ref, (multiplier << (17 - 2)) +
> frac) >> 17, 10);
> >-
> >- return vco << tx_rate_mult >> tx_clk_div >> tx_rate;
> >-}
> >-
> > static void intel_c20pll_readout_hw_state(struct intel_encoder *encoder,
> > struct intel_c20pll_state
> >*pll_state) { @@ -2636,33 +2669,6 @@ static void
> >intel_c20_pll_program(struct drm_i915_private *i915,
> > BIT(0), cntx ? 0 : 1, MB_WRITE_COMMITTED); }
> >
> >-static int intel_c10pll_calc_port_clock(struct intel_encoder *encoder,
> >- const struct intel_c10pll_state *pll_state)
> >-{
> >- unsigned int frac_quot = 0, frac_rem = 0, frac_den = 1;
> >- unsigned int multiplier, tx_clk_div, hdmi_div, refclk = 38400;
> >- int tmpclk = 0;
> >-
> >- if (pll_state->pll[0] & C10_PLL0_FRACEN) {
> >- frac_quot = pll_state->pll[12] << 8 | pll_state->pll[11];
> >- frac_rem = pll_state->pll[14] << 8 | pll_state->pll[13];
> >- frac_den = pll_state->pll[10] << 8 | pll_state->pll[9];
> >- }
> >-
> >- multiplier = (REG_FIELD_GET8(C10_PLL3_MULTIPLIERH_MASK, pll_state-
> >pll[3]) << 8 |
> >- pll_state->pll[2]) / 2 + 16;
> >-
> >- tx_clk_div = REG_FIELD_GET8(C10_PLL15_TXCLKDIV_MASK, pll_state-
> >pll[15]);
> >- hdmi_div = REG_FIELD_GET8(C10_PLL15_HDMIDIV_MASK, pll_state->pll[15]);
> >-
> >- tmpclk = DIV_ROUND_CLOSEST_ULL(mul_u32_u32(refclk, (multiplier << 16) +
> frac_quot) +
> >- DIV_ROUND_CLOSEST(refclk * frac_rem, frac_den),
> >- 10 << (tx_clk_div + 16));
> >- tmpclk *= (hdmi_div ? 2 : 1);
> >-
> >- return tmpclk;
> >-}
> >-
> > static void intel_program_port_clock_ctl(struct intel_encoder *encoder,
> > const struct intel_crtc_state *crtc_state,
> > bool lane_reversal)
> >--
> >2.34.1
> >
More information about the Intel-gfx
mailing list