From: Jani Nikula <jani.nikula@linux.intel.com>
To: Chaitanya Kumar Borah <chaitanya.kumar.borah@intel.com>,
intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org
Subject: Re: [PATCH] drm/i915/dp: Add FEC Enable Retry mechanism
Date: Mon, 23 Sep 2024 10:10:12 +0300 [thread overview]
Message-ID: <87y13i7smj.fsf@intel.com> (raw)
In-Reply-To: <20240923045218.1813255-1-chaitanya.kumar.borah@intel.com>
On Mon, 23 Sep 2024, Chaitanya Kumar Borah <chaitanya.kumar.borah@intel.com> wrote:
> From PTL, FEC_DECODE_EN sequence can be sent to a DPRX independent
> of TRANS_CONF enable. This allows us to re-issue an FEC_DECODE_EN
> sequence without re-doing the whole mode set sequence. This separate
> control over FEC_ECODE_EN/DIS sequence enables us to have a retry
> mechanism in case the DPRX does not respond with an FEC_ENABLE
> within the stipulated 5ms.
>
> Signed-off-by: Chaitanya Kumar Borah <chaitanya.kumar.borah@intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_ddi.c | 61 +++++++++++++++++++++++-
> 1 file changed, 59 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> index 85e519a21542..589acea9906a 100644
> --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> @@ -78,6 +78,8 @@
> #include "skl_scaler.h"
> #include "skl_universal_plane.h"
>
> +#define FEC_RETRY_COUNT 3
If there's only one user, I wouldn't bother with a macro.
> +
> static const u8 index_to_dp_signal_levels[] = {
> [0] = DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_0,
> [1] = DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_1,
> @@ -2255,6 +2257,57 @@ static int read_fec_detected_status(struct drm_dp_aux *aux)
> return status;
> }
>
> +static void retry_fec_enable(struct intel_encoder *encoder,
> + const struct intel_crtc_state *crtc_state,
> + struct drm_dp_aux *aux)
> +{
> + struct drm_i915_private *i915 = to_i915(aux->drm_dev);
> + int ret = 0;
> +
> + /* Clear FEC enable */
> + intel_de_rmw(i915, dp_tp_ctl_reg(encoder, crtc_state),
> + DP_TP_CTL_FEC_ENABLE, 0);
> +
> + /* Set FEC enable */
> + intel_de_rmw(i915, dp_tp_ctl_reg(encoder, crtc_state),
> + 0, DP_TP_CTL_FEC_ENABLE);
> +
> + ret = intel_de_wait_for_set(i915, dp_tp_status_reg(encoder, crtc_state),
> + DP_TP_STATUS_FEC_ENABLE_LIVE, 1);
> + if (!ret)
> + drm_dbg_kms(&i915->drm,
> + "Timeout waiting for FEC live state to get enabled");
> +}
> +
> +static void wait_for_fec_detected_with_retry(struct intel_encoder *encoder,
> + const struct intel_crtc_state *crtc_state,
> + struct drm_dp_aux *aux)
> +{
> + struct drm_i915_private *i915 = to_i915(aux->drm_dev);
> + int status;
> + int err;
> + int retrycount = 0;
> +
> + do {
> + err = readx_poll_timeout(read_fec_detected_status, aux, status,
> + status & DP_FEC_DECODE_EN_DETECTED || status < 0,
> + 500, 5000);
> +
> + if (!err && status >= 0)
> + return;
> +
> + if (err == -ETIMEDOUT) {
> + drm_dbg_kms(&i915->drm,
> + "Timeout waiting for FEC ENABLE to get detected, retrying\n");
> + retry_fec_enable(encoder, crtc_state, aux);
> + } else {
> + drm_dbg_kms(&i915->drm, "FEC detected status read error: %d\n", status);
> + }
> + } while (retrycount++ < FEC_RETRY_COUNT);
Please use a regular for loop with for (i = 0; i < N; i++) so even I can
look at it and know in an instant how many times it's going to loop.
> +
> + drm_err(&i915->drm, "FEC enable Failed after Retry\n");
> +}
> +
There's just way, way too much duplication between the above two
functions and the existing intel_ddi_wait_for_fec_status() and
wait_for_fec_detected(). We'll want *one* code path with the retry baked
in, with no retries for older platforms.
BR,
Jani.
> static void wait_for_fec_detected(struct drm_dp_aux *aux, bool enabled)
> {
> struct drm_i915_private *i915 = to_i915(aux->drm_dev);
> @@ -2303,8 +2356,12 @@ void intel_ddi_wait_for_fec_status(struct intel_encoder *encoder,
> * At least the Synoptics MST hub doesn't set the detected flag for
> * FEC decoding disabling so skip waiting for that.
> */
> - if (enabled)
> - wait_for_fec_detected(&intel_dp->aux, enabled);
> + if (enabled) {
> + if (DISPLAY_VER(i915) >= 30)
> + wait_for_fec_detected_with_retry(encoder, crtc_state, &intel_dp->aux);
> + else
> + wait_for_fec_detected(&intel_dp->aux, enabled);
> + }
> }
>
> static void intel_ddi_enable_fec(struct intel_encoder *encoder,
--
Jani Nikula, Intel
next prev parent reply other threads:[~2024-09-23 7:10 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-23 4:52 [PATCH] drm/i915/dp: Add FEC Enable Retry mechanism Chaitanya Kumar Borah
2024-09-23 7:10 ` Jani Nikula [this message]
2024-09-25 6:32 ` Borah, Chaitanya Kumar
2024-09-23 10:46 ` Srikanth V, NagaVenkata
2024-09-25 6:31 ` Borah, Chaitanya Kumar
2024-09-26 3:53 ` Srikanth V, NagaVenkata
2024-09-25 15:50 ` ✓ CI.Patch_applied: success for " Patchwork
2024-09-25 15:52 ` ✗ CI.checkpatch: warning " Patchwork
2024-09-25 15:53 ` ✓ CI.KUnit: success " Patchwork
2024-09-25 15:56 ` ✗ CI.Build: failure " Patchwork
2024-09-25 17:02 ` ✓ CI.Patch_applied: success " Patchwork
2024-09-25 17:02 ` ✓ CI.checkpatch: " Patchwork
2024-09-25 17:04 ` ✓ CI.KUnit: " Patchwork
2024-09-25 17:15 ` ✓ CI.Build: " Patchwork
2024-09-25 17:17 ` ✓ CI.Hooks: " Patchwork
2024-09-25 17:19 ` ✗ CI.checksparse: warning " Patchwork
2024-09-25 17:44 ` ✗ CI.BAT: failure " Patchwork
2024-09-25 19:19 ` ✗ CI.FULL: " Patchwork
2024-09-26 12:18 ` ✓ Fi.CI.BAT: success " Patchwork
2024-09-26 15:55 ` ✗ Fi.CI.IGT: failure " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87y13i7smj.fsf@intel.com \
--to=jani.nikula@linux.intel.com \
--cc=chaitanya.kumar.borah@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.