[Intel-gfx] [PATCH] drm/i915: Disable FLT if DP config changes
Ander Conselvan De Oliveira
conselvan2 at gmail.com
Fri Nov 27 04:01:31 PST 2015
Hi,
> drm/i915: Disable FLT if DP config changes
Please just spell out fast link training.
On Wed, 2015-11-25 at 13:26 +0200, Mika Kahola wrote:
> Disable DP fast link training if DP link configuration
> changes. If one of the DP link parameters i.e. link
> bandwidth, lane count, rate selection, port clock or bpp
> changes the link training does no longer apply the
> previously computed voltage swing and pre-emphasis values.
> Instead, the link training is started with zero values.
I think there is a more fundamental problem with our fast link training
implementation. The requirements imposed by the spec for it are:
- HPD line was high the whole time since the link was in full operation
(except for IRQ_HPD);
- the NO_AUX_TRANSACTION_LINK_TRAINING bit is set in DP_MAX_DOWNSPREAD.
If both those conditions are met, then link training can skip the AUX
transactions and start with the last known good voltage swing and pre-emphasis.
Ville has seen an issue with a dongle that causes a lot of DPCD defers when link
training starts with non-zero values [1]. I wonder if we should disable fast lin
k training completely until we can meet those requirements.
[1] http://lists.freedesktop.org/archives/intel-gfx/2015-November/079277.html
Ander
>
> The patch is fix for reported screen flickering issue in
>
> https://bugs.freedesktop.org/show_bug.cgi?id=91393
>
> Signed-off-by: Mika Kahola <mika.kahola at intel.com>
> ---
> drivers/gpu/drm/i915/intel_dp.c | 6 ++++++
> drivers/gpu/drm/i915/intel_dp_link_training.c | 27
> +++++++++++++++++++++++++++
> drivers/gpu/drm/i915/intel_drv.h | 6 +++++-
> 3 files changed, 38 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index 2805f0d..3694e3f 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -1621,6 +1621,12 @@ found:
> intel_dp_compute_rate(intel_dp, pipe_config->port_clock,
> &link_bw, &rate_select);
>
> + intel_dp->link_bw = link_bw;
> + intel_dp->rate_select = rate_select;
> + intel_dp->lane_count = lane_count;
> + intel_dp->port_clock = pipe_config->port_clock;
> + intel_dp->bpp = bpp;
> +
> DRM_DEBUG_KMS("DP link bw %02x rate select %02x lane count %d clock
> %d bpp %d\n",
> link_bw, rate_select, pipe_config->lane_count,
> pipe_config->port_clock, bpp);
> diff --git a/drivers/gpu/drm/i915/intel_dp_link_training.c
> b/drivers/gpu/drm/i915/intel_dp_link_training.c
> index 8888793..36a5294 100644
> --- a/drivers/gpu/drm/i915/intel_dp_link_training.c
> +++ b/drivers/gpu/drm/i915/intel_dp_link_training.c
> @@ -82,9 +82,31 @@ intel_dp_set_link_train(struct intel_dp *intel_dp,
> }
>
> static bool
> +intel_dp_check_conf(struct intel_dp *intel_dp)
> +{
> + if (intel_dp->link_bw != intel_dp->old_link_bw)
> + return false;
> + else if (intel_dp->lane_count != intel_dp->old_lane_count)
> + return false;
> + else if (intel_dp->rate_select != intel_dp->old_rate_select)
> + return false;
> + else if (intel_dp->port_clock != intel_dp->old_port_clock)
> + return false;
> + else if (intel_dp->bpp != intel_dp->old_bpp)
> + return false;
> + else
> + return true;
> +}
> +
> +static bool
> intel_dp_reset_link_train(struct intel_dp *intel_dp,
> uint8_t dp_train_pat)
> {
> + intel_dp->train_set_valid &= intel_dp_check_conf(intel_dp);
> +
> + DRM_DEBUG_KMS("flt enabled: %s\n",
> + intel_dp->train_set_valid ? "true" : "false");
> +
> if (!intel_dp->train_set_valid)
> memset(intel_dp->train_set, 0, sizeof(intel_dp->train_set));
> intel_dp_set_signal_levels(intel_dp);
> @@ -305,6 +327,11 @@ intel_dp_link_training_channel_equalization(struct
> intel_dp *intel_dp)
>
> if (channel_eq) {
> intel_dp->train_set_valid = true;
> + intel_dp->old_link_bw = intel_dp->link_bw;
> + intel_dp->old_rate_select = intel_dp->rate_select;
> + intel_dp->old_lane_count = intel_dp->lane_count;
> + intel_dp->old_port_clock = intel_dp->port_clock;
> + intel_dp->old_bpp = intel_dp->bpp;
> DRM_DEBUG_KMS("Channel EQ done. DP Training successful\n");
> }
> }
> diff --git a/drivers/gpu/drm/i915/intel_drv.h
> b/drivers/gpu/drm/i915/intel_drv.h
> index 8fae824..8db9288 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -742,7 +742,11 @@ struct intel_dp {
> i915_reg_t aux_ch_data_reg[5];
> uint32_t DP;
> int link_rate;
> - uint8_t lane_count;
> + uint8_t lane_count, old_lane_count;
> + uint8_t link_bw, old_link_bw;
> + uint8_t rate_select, old_rate_select;
> + int port_clock, old_port_clock;
> + int bpp, old_bpp;
> bool has_audio;
> enum hdmi_force_audio force_audio;
> bool limited_color_range;
More information about the Intel-gfx
mailing list