From: Jani Nikula <jani.nikula@linux.intel.com>
To: Ville Syrjala <ville.syrjala@linux.intel.com>,
intel-gfx@lists.freedesktop.org
Cc: stable@vger.kernel.org
Subject: Re: [PATCH] drm/i915/dsi: Go back to the previous INIT_OTP/DISPLAY_ON order, mostly
Date: Tue, 05 Mar 2024 16:11:33 +0200 [thread overview]
Message-ID: <87plw822ga.fsf@intel.com> (raw)
In-Reply-To: <20240305083659.8396-1-ville.syrjala@linux.intel.com>
On Tue, 05 Mar 2024, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Reinstate commit 88b065943cb5 ("drm/i915/dsi: Do display on
> sequence later on icl+"), for the most part. Turns out some
> machines (eg. Chuwi Minibook X) really do need that updated order.
> It is also the order the Windows driver uses.
>
> However we can't just undo the revert since that would again
> break Lenovo 82TQ. After staring at the VBT sequences for both
> machines I've concluded that the Lenovo 82TQ sequences look
> somewhat broken:
> - INIT_OTP is not present at all
> - what should be in INIT_OTP is found in DISPLAY_ON
> - what should be in DISPLAY_ON is found in BACKLIGHT_ON
> (along with the actual backlight stuff)
>
> The Chuwi Minibook X on the other hand has a full complement
> of sequences in its VBT.
>
> So let's try to deal with the broken sequences in the
> Lenovo 82TQ VBT by simply swapping the (non-existent)
> INIT_OTP sequence with the DISPLAY_ON sequence. Thus we
> execute DISPLAY_ON when intending to execute INIT_OTP,
> and execute nothing at all when intending to execute
> DISPLAY_ON. That should be 100% equivalent to the
> revert, for such broken VBTs.
>
> Cc: stable@vger.kernel.org
> Fixes: dc524d05974f ("Revert "drm/i915/dsi: Do display on sequence later on icl+"")
> References: https://gitlab.freedesktop.org/drm/intel/-/issues/10071
> Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/10334
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Yuck.
Acked-by: Jani Nikula <jani.nikula@intel.com>
> ---
> drivers/gpu/drm/i915/display/icl_dsi.c | 3 +-
> drivers/gpu/drm/i915/display/intel_bios.c | 43 +++++++++++++++++++----
> 2 files changed, 39 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c
> index eda4a8b88590..ac456a2275db 100644
> --- a/drivers/gpu/drm/i915/display/icl_dsi.c
> +++ b/drivers/gpu/drm/i915/display/icl_dsi.c
> @@ -1155,7 +1155,6 @@ static void gen11_dsi_powerup_panel(struct intel_encoder *encoder)
> }
>
> intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_INIT_OTP);
> - intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DISPLAY_ON);
>
> /* ensure all panel commands dispatched before enabling transcoder */
> wait_for_cmds_dispatched_to_panel(encoder);
> @@ -1256,6 +1255,8 @@ static void gen11_dsi_enable(struct intel_atomic_state *state,
> /* step6d: enable dsi transcoder */
> gen11_dsi_enable_transcoder(encoder);
>
> + intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DISPLAY_ON);
> +
> /* step7: enable backlight */
> intel_backlight_enable(crtc_state, conn_state);
> intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_BACKLIGHT_ON);
> diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c
> index 343726de9aa7..373291d10af9 100644
> --- a/drivers/gpu/drm/i915/display/intel_bios.c
> +++ b/drivers/gpu/drm/i915/display/intel_bios.c
> @@ -1955,16 +1955,12 @@ static int get_init_otp_deassert_fragment_len(struct drm_i915_private *i915,
> * these devices we split the init OTP sequence into a deassert sequence and
> * the actual init OTP part.
> */
> -static void fixup_mipi_sequences(struct drm_i915_private *i915,
> - struct intel_panel *panel)
> +static void vlv_fixup_mipi_sequences(struct drm_i915_private *i915,
> + struct intel_panel *panel)
> {
> u8 *init_otp;
> int len;
>
> - /* Limit this to VLV for now. */
> - if (!IS_VALLEYVIEW(i915))
> - return;
> -
> /* Limit this to v1 vid-mode sequences */
> if (panel->vbt.dsi.config->is_cmd_mode ||
> panel->vbt.dsi.seq_version != 1)
> @@ -2000,6 +1996,41 @@ static void fixup_mipi_sequences(struct drm_i915_private *i915,
> panel->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP] = init_otp + len - 1;
> }
>
> +/*
> + * Some machines (eg. Lenovo 82TQ) appear to have broken
> + * VBT sequences:
> + * - INIT_OTP is not present at all
> + * - what should be in INIT_OTP is in DISPLAY_ON
> + * - what should be in DISPLAY_ON is in BACKLIGHT_ON
> + * (along with the actual backlight stuff)
> + *
> + * To make those work we simply swap DISPLAY_ON and INIT_OTP.
> + *
> + * TODO: Do we need to limit this to specific machines,
> + * or examine the contents of the sequences to
> + * avoid false positives?
> + */
> +static void icl_fixup_mipi_sequences(struct drm_i915_private *i915,
> + struct intel_panel *panel)
> +{
> + if (!panel->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP] &&
> + panel->vbt.dsi.sequence[MIPI_SEQ_DISPLAY_ON]) {
> + drm_dbg_kms(&i915->drm, "Broken VBT: Swapping INIT_OTP and DISPLAY_ON sequences\n");
> +
> + swap(panel->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP],
> + panel->vbt.dsi.sequence[MIPI_SEQ_DISPLAY_ON]);
> + }
> +}
> +
> +static void fixup_mipi_sequences(struct drm_i915_private *i915,
> + struct intel_panel *panel)
> +{
> + if (DISPLAY_VER(i915) >= 11)
> + icl_fixup_mipi_sequences(i915, panel);
> + else if (IS_VALLEYVIEW(i915))
> + vlv_fixup_mipi_sequences(i915, panel);
> +}
> +
> static void
> parse_mipi_sequence(struct drm_i915_private *i915,
> struct intel_panel *panel)
--
Jani Nikula, Intel
next prev parent reply other threads:[~2024-03-05 14:11 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-05 8:36 [PATCH] drm/i915/dsi: Go back to the previous INIT_OTP/DISPLAY_ON order, mostly Ville Syrjala
2024-03-05 14:11 ` Jani Nikula [this message]
2024-03-05 19:16 ` ✗ Fi.CI.CHECKPATCH: warning for " Patchwork
2024-03-05 19:30 ` ✓ Fi.CI.BAT: success " Patchwork
2024-03-06 23:07 ` ✗ Fi.CI.IGT: failure " Patchwork
2024-03-07 3:47 ` ✗ Fi.CI.SPARSE: warning for drm/i915/dsi: Go back to the previous INIT_OTP/DISPLAY_ON order, mostly (rev2) Patchwork
2024-03-07 4:06 ` ✗ Fi.CI.BAT: 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=87plw822ga.fsf@intel.com \
--to=jani.nikula@linux.intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=stable@vger.kernel.org \
--cc=ville.syrjala@linux.intel.com \
/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.