[Intel-gfx] [PATCH] drm/i915/tgl: Add HBR and HBR2+ voltage swing table
Almahallawy, Khaled
khaled.almahallawy at intel.com
Thu Jun 4 20:05:36 UTC 2020
On Tue, 2020-06-02 at 13:54 -0700, José Roberto de Souza wrote:
> As latest update we have now 2 voltage swing tables for DP over DKL
> PHY with only one difference in Level 0 pre-emphasis 3.
> So with 2 tables for DP is time to have one single function to return
> all DKL voltage swing tables.
>
> BSpec: 49292
> Cc: Khaled Almahallawy <khaled.almahallawy at intel.com>
> Signed-off-by: José Roberto de Souza <jose.souza at intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_ddi.c | 50 ++++++++++++++++++++
> ----
> 1 file changed, 42 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c
> b/drivers/gpu/drm/i915/display/intel_ddi.c
> index cd211f48c401..763d76056ca9 100644
> --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> @@ -641,6 +641,20 @@ static const struct tgl_dkl_phy_ddi_buf_trans
> tgl_dkl_phy_dp_ddi_trans[] = {
> { 0x7, 0x0, 0x00 }, /* 0 0 400mV 0 dB
> */
> { 0x5, 0x0, 0x05 }, /* 0 1 400mV 3.5
> dB */
> { 0x2, 0x0, 0x0B }, /* 0 2 400mV 6 dB
> */
> + { 0x0, 0x0, 0x18 }, /* 0 3 400mV 9.5
> dB */
> + { 0x5, 0x0, 0x00 }, /* 1 0 600mV 0 dB
> */
> + { 0x2, 0x0, 0x08 }, /* 1 1 600mV 3.5
> dB */
> + { 0x0, 0x0, 0x14 }, /* 1 2 600mV 6 dB
> */
> + { 0x2, 0x0, 0x00 }, /* 2 0 800mV 0 dB
> */
> + { 0x0, 0x0, 0x0B }, /* 2 1 800mV 3.5
> dB */
> + { 0x0, 0x0, 0x00 }, /* 3 0 1200mV 0 dB
> HDMI default */
> +};
> +
> +static const struct tgl_dkl_phy_ddi_buf_trans
> tgl_dkl_phy_dp_ddi_trans_hbr2[] = {
> + /* VS pre-emp Non-trans mV Pre-
> emph dB */
> + { 0x7, 0x0, 0x00 }, /* 0 0 400mV 0 dB
> */
> + { 0x5, 0x0, 0x05 }, /* 0 1 400mV 3.5
> dB */
> + { 0x2, 0x0, 0x0B }, /* 0 2 400mV 6 dB
> */
> { 0x0, 0x0, 0x19 }, /* 0 3 400mV 9.5
> dB */
> { 0x5, 0x0, 0x00 }, /* 1 0 600mV 0 dB
> */
> { 0x2, 0x0, 0x08 }, /* 1 1 600mV 3.5
> dB */
> @@ -1014,6 +1028,22 @@ tgl_get_combo_buf_trans(struct
> drm_i915_private *dev_priv, int type, int rate,
> return tgl_combo_phy_ddi_translations_dp_hbr;
> }
>
> +static const struct tgl_dkl_phy_ddi_buf_trans *
> +tgl_get_dkl_buf_trans(struct drm_i915_private *dev_priv, int type,
> int rate,
> + int *n_entries)
> +{
> + if (type == INTEL_OUTPUT_HDMI) {
> + *n_entries = ARRAY_SIZE(tgl_dkl_phy_hdmi_ddi_trans);
> + return tgl_dkl_phy_hdmi_ddi_trans;
> + } else if (rate > 270000) {
> + *n_entries = ARRAY_SIZE(tgl_dkl_phy_dp_ddi_trans_hbr2);
> + return tgl_dkl_phy_dp_ddi_trans_hbr2;
> + }
> +
> + *n_entries = ARRAY_SIZE(tgl_dkl_phy_dp_ddi_trans);
> + return tgl_dkl_phy_dp_ddi_trans;
> +}
> +
> static int intel_ddi_hdmi_level(struct intel_encoder *encoder)
> {
> struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> @@ -1025,7 +1055,8 @@ static int intel_ddi_hdmi_level(struct
> intel_encoder *encoder)
> tgl_get_combo_buf_trans(dev_priv,
> INTEL_OUTPUT_HDMI,
> 0, &n_entries);
> else
> - n_entries =
> ARRAY_SIZE(tgl_dkl_phy_hdmi_ddi_trans);
> + tgl_get_dkl_buf_trans(dev_priv,
> INTEL_OUTPUT_HDMI, 0,
> + &n_entries);
> default_entry = n_entries - 1;
> } else if (INTEL_GEN(dev_priv) == 11) {
> if (intel_phy_is_combo(dev_priv, phy))
> @@ -2108,7 +2139,8 @@ u8 intel_ddi_dp_voltage_max(struct
> intel_encoder *encoder)
> tgl_get_combo_buf_trans(dev_priv, encoder-
> >type,
> intel_dp->link_rate,
> &n_entries);
> else
> - n_entries =
> ARRAY_SIZE(tgl_dkl_phy_dp_ddi_trans);
> + tgl_get_dkl_buf_trans(dev_priv, encoder->type,
> + intel_dp->link_rate,
> &n_entries);
> } else if (INTEL_GEN(dev_priv) == 11) {
> if (IS_ELKHARTLAKE(dev_priv))
> ehl_get_combo_buf_trans(dev_priv, encoder-
> >type,
> @@ -2585,15 +2617,17 @@ tgl_dkl_phy_ddi_vswing_sequence(struct
> intel_encoder *encoder, int link_clock,
> enum tc_port tc_port = intel_port_to_tc(dev_priv, encoder-
> >port);
> const struct tgl_dkl_phy_ddi_buf_trans *ddi_translations;
> u32 n_entries, val, ln, dpcnt_mask, dpcnt_val;
> + int rate = 0;
>
> - if (encoder->type == INTEL_OUTPUT_HDMI) {
> - n_entries = ARRAY_SIZE(tgl_dkl_phy_hdmi_ddi_trans);
> - ddi_translations = tgl_dkl_phy_hdmi_ddi_trans;
> - } else {
> - n_entries = ARRAY_SIZE(tgl_dkl_phy_dp_ddi_trans);
> - ddi_translations = tgl_dkl_phy_dp_ddi_trans;
> + if (encoder->type != INTEL_OUTPUT_HDMI) {
> + struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
> +
> + rate = intel_dp->link_rate;
> }
>
> + ddi_translations = tgl_get_dkl_buf_trans(dev_priv, encoder-
> >type, rate,
> + &n_entries);
> +
> if (level >= n_entries)
> level = n_entries - 1;
>
This implementation passes DPoC1.4a Phy compliance PLTPAT tests.
Tested-by: Khaled Almahallawy <khaled.almahallawy at intel.com>
Reviewed-by: Khaled Almahallawy<khaled.almahallawy at intel.com>
More information about the Intel-gfx
mailing list