[PATCH v4 2/2] drm/i915/cx0_phy: Update HDMI TMDS C20 algorithm value

Kandpal, Suraj suraj.kandpal at intel.com
Thu Dec 26 05:19:19 UTC 2024



> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces at lists.freedesktop.org> On Behalf Of
> Dnyaneshwar Bhadane
> Sent: Wednesday, December 18, 2024 1:43 AM
> To: intel-gfx at lists.freedesktop.org
> Cc: Bhadane, Dnyaneshwar <dnyaneshwar.bhadane at intel.com>
> Subject: [PATCH v4 2/2] drm/i915/cx0_phy: Update HDMI TMDS C20
> algorithm value
> 
> In the C20 algorithm for HDMI TMDS, certain fields have been updated in the
> BSpec to set values for SRAM_GENERIC_<A/B>_TX_CNTX_CFG_1, such as
> tx_misc and dac_ctrl_range for Xe2LPD, Xe2HPD and MTL/ARL.
> This patch covers fields that need to be set based on the platform type.
> 
> Some ARLs SoCs cannot be directly distinguished by their GMD version Id,
> Specifically to set value of tx_misc, so PCI Host Bridge IDs are used for
> differentiation.
> 
> v2:
> - Relocate defines and Restructure the code(Jani)
> 
> v3:
> - Replace conditions with display.platform.<platform> (jani)
> - Move host bridge check to new function (Jani)
> 
> v4:
> - Identify/Replace arrowlake_u as meteorlake_u(Jani)
> 
> Bspec:74165,74491
> Signed-off-by: Dnyaneshwar Bhadane <dnyaneshwar.bhadane at intel.com>

LGTM,
Reviewed-by: Suraj Kandpal <suraj.kandpal at intel.com>

> ---
>  drivers/gpu/drm/i915/display/intel_cx0_phy.c  | 48 +++++++++++++++----
> .../gpu/drm/i915/display/intel_cx0_phy_regs.h |  6 +++
>  .../drm/i915/display/intel_display_device.h   | 11 +++++
>  3 files changed, 57 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> index 142de06818a7..223fa8ffc889 100644
> --- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> +++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> @@ -2177,9 +2177,47 @@ static void intel_c10pll_dump_hw_state(struct
> intel_display *display,
>  			    i + 2, hw_state->pll[i + 2], i + 3, hw_state->pll[i + 3]);
> }
> 
> -static int intel_c20_compute_hdmi_tmds_pll(struct intel_crtc_state
> *crtc_state)
> +/*
> + * Some ARLs SoCs have the same drm PCI IDs, so need a helper to
> +differentiate based
> + * on the host bridge device ID to get the correct txx_mics value.
> + */
> +static bool is_arrowlake_s_by_host_bridge(void)
> +{
> +	struct pci_dev *pdev = NULL;
> +	u16 host_bridge_pci_dev_id;
> +
> +	while ((pdev = pci_get_class(PCI_CLASS_BRIDGE_HOST << 8, pdev)))
> +		host_bridge_pci_dev_id = pdev->device;
> +
> +	return pdev &&
> +IS_ARROWLAKE_S_BY_HOST_BRIDGE_ID(host_bridge_pci_dev_id);
> +}
> +
> +static u16 intel_c20_hdmi_tmds_tx_cgf_1(struct intel_crtc_state
> +*crtc_state)
>  {
>  	struct intel_display *display = to_intel_display(crtc_state);
> +	u16 tx_misc;
> +	u16 tx_dcc_cal_dac_ctrl_range = 8;
> +	u16 tx_term_ctrl = 2;
> +
> +	if (DISPLAY_VER(display) >= 20) {
> +		tx_misc = 5;
> +		tx_term_ctrl = 4;
> +	} else if (display->platform.battlemage) {
> +		tx_misc = 0;
> +	} else if (display->platform.meteorlake_u ||
> +		   is_arrowlake_s_by_host_bridge()) {
> +		tx_misc = 3;
> +	} else {
> +		tx_misc = 7;
> +	}
> +
> +	return (C20_PHY_TX_MISC(tx_misc) |
> +		C20_PHY_TX_DCC_CAL_RANGE(tx_dcc_cal_dac_ctrl_range) |
> +		C20_PHY_TX_DCC_BYPASS |
> C20_PHY_TX_TERM_CTL(tx_term_ctrl));
> +}
> +
> +static int intel_c20_compute_hdmi_tmds_pll(struct intel_crtc_state
> +*crtc_state) {
>  	struct intel_c20pll_state *pll_state = &crtc_state-
> >dpll_hw_state.cx0pll.c20;
>  	u64 datarate;
>  	u64 mpll_tx_clk_div;
> @@ -2189,7 +2227,6 @@ static int intel_c20_compute_hdmi_tmds_pll(struct
> intel_crtc_state *crtc_state)
>  	u64 mpll_multiplier;
>  	u64 mpll_fracn_quot;
>  	u64 mpll_fracn_rem;
> -	u16 tx_misc;
>  	u8  mpllb_ana_freq_vco;
>  	u8  mpll_div_multiplier;
> 
> @@ -2209,11 +2246,6 @@ static int
> intel_c20_compute_hdmi_tmds_pll(struct intel_crtc_state *crtc_state)
>  	mpll_div_multiplier = min_t(u8, div64_u64((vco_freq * 16 + (datarate
> >> 1)),
>  						  datarate), 255);
> 
> -	if (DISPLAY_VER(display) >= 20)
> -		tx_misc = 0x5;
> -	else
> -		tx_misc = 0x0;
> -
>  	if (vco_freq <= DATARATE_3000000000)
>  		mpllb_ana_freq_vco = MPLLB_ANA_FREQ_VCO_3;
>  	else if (vco_freq <= DATARATE_3500000000) @@ -2225,7 +2257,7 @@
> static int intel_c20_compute_hdmi_tmds_pll(struct intel_crtc_state
> *crtc_state)
> 
>  	pll_state->clock	= crtc_state->port_clock;
>  	pll_state->tx[0]	= 0xbe88;
> -	pll_state->tx[1]	= 0x9800 | C20_PHY_TX_MISC(tx_misc);
> +	pll_state->tx[1]	= intel_c20_hdmi_tmds_tx_cgf_1(crtc_state);
>  	pll_state->tx[2]	= 0x0000;
>  	pll_state->cmn[0]	= 0x0500;
>  	pll_state->cmn[1]	= 0x0005;
> diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy_regs.h
> b/drivers/gpu/drm/i915/display/intel_cx0_phy_regs.h
> index 4dc6e179a774..0bc651c2351d 100644
> --- a/drivers/gpu/drm/i915/display/intel_cx0_phy_regs.h
> +++ b/drivers/gpu/drm/i915/display/intel_cx0_phy_regs.h
> @@ -294,6 +294,12 @@
>  #define   C20_PHY_TX_RATE		REG_GENMASK(2, 0)
>  #define   C20_PHY_TX_MISC_MASK		REG_GENMASK16(7, 0)
>  #define   C20_PHY_TX_MISC(val)
> 	REG_FIELD_PREP16(C20_PHY_TX_MISC_MASK, (val))
> +#define   C20_PHY_TX_DCC_CAL_RANGE_MASK 	REG_GENMASK16(11,
> 8)
> +#define   C20_PHY_TX_DCC_CAL_RANGE(val) \
> +		REG_FIELD_PREP16(C20_PHY_TX_DCC_CAL_RANGE_MASK,
> (val))
> +#define   C20_PHY_TX_DCC_BYPASS	REG_BIT(12)
> +#define   C20_PHY_TX_TERM_CTL_MASK	REG_GENMASK16(15, 13)
> +#define   C20_PHY_TX_TERM_CTL(val)
> 	REG_FIELD_PREP16(C20_PHY_TX_TERM_CTL_MASK, (val))
> 
>  #define PHY_C20_A_CMN_CNTX_CFG(i915, idx) \
>  		((_IS_XE2HPD_C20(i915) ? _XE2HPD_C20_A_CMN_CNTX_CFG
> : _MTL_C20_A_CMN_CNTX_CFG) - (idx)) diff --git
> a/drivers/gpu/drm/i915/display/intel_display_device.h
> b/drivers/gpu/drm/i915/display/intel_display_device.h
> index 5853472bb9c2..a7b5ce69cf17 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_device.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_device.h
> @@ -234,6 +234,17 @@ struct intel_display_platforms {
>  	(drm_WARN_ON(__to_intel_display(__display)->drm,
> INTEL_DISPLAY_STEP(__display) == STEP_NONE), \
>  	 INTEL_DISPLAY_STEP(__display) >= (since) &&
> INTEL_DISPLAY_STEP(__display) < (until))
> 
> +#define ARLS_HOST_BRIDGE_PCI_ID1 0x7D1C #define
> +ARLS_HOST_BRIDGE_PCI_ID2 0x7D2D #define ARLS_HOST_BRIDGE_PCI_ID3
> 0x7D2E
> +#define ARLS_HOST_BRIDGE_PCI_ID4 0x7D2F
> +
> +#define IS_ARROWLAKE_S_BY_HOST_BRIDGE_ID(id)  \
> +	(((id) == ARLS_HOST_BRIDGE_PCI_ID1) || \
> +	 ((id) == ARLS_HOST_BRIDGE_PCI_ID2) || \
> +	 ((id) == ARLS_HOST_BRIDGE_PCI_ID3) || \
> +	 ((id) == ARLS_HOST_BRIDGE_PCI_ID4))
> +
>  struct intel_display_runtime_info {
>  	struct intel_display_ip_ver {
>  		u16 ver;
> --
> 2.34.1



More information about the Intel-gfx mailing list