Unverified Commit 11895f37 authored by Hans de Goede's avatar Hans de Goede Committed by Rodrigo Vivi
Browse files

drm/i915/bios: Apply vlv_fixup_mipi_sequences() to v2 mipi-sequences too

It turns out that the fixup from vlv_fixup_mipi_sequences() is necessary
for some DSI panel's with version 2 mipi-sequences too.

Specifically the Acer Iconia One 8 A1-840 (not to be confused with the
A1-840FHD which is different) has the following sequences:

BDB block 53 (1284 bytes) - MIPI sequence block:
	Sequence block version v2
	Panel 0 *

Sequence 2 - MIPI_SEQ_INIT_OTP
	GPIO index 9, source 0, set 0 (0x00)
	Delay: 50000 us
	GPIO index 9, source 0, set 1 (0x01)
	Delay: 6000 us
	GPIO index 9, source 0, set 0 (0x00)
	Delay: 6000 us
	GPIO index 9, source 0, set 1 (0x01)
	Delay: 25000 us
	Send DCS: Port A, VC 0, LP, Type 39, Length 5, Data ff aa 55 a5 80
	Send DCS: Port A, VC 0, LP, Type 39, Length 3, Data 6f 11 00
	...
	Send DCS: Port A, VC 0, LP, Type 05, Length 1, Data 29
	Delay: 120000 us

Sequence 4 - MIPI_SEQ_DISPLAY_OFF
	Send DCS: Port A, VC 0, LP, Type 05, Length 1, Data 28
	Delay: 105000 us
	Send DCS: Port A, VC 0, LP, Type 05, Length 2, Data 10 00
	Delay: 10000 us

Sequence 5 - MIPI_SEQ_ASSERT_RESET
	Delay: 10000 us
	GPIO index 9, source 0, set 0 (0x00)

Notice how there is no MIPI_SEQ_DEASSERT_RESET, instead the deassert
is done at the beginning of MIPI_SEQ_INIT_OTP, which is exactly what
the fixup from vlv_fixup_mipi_sequences() fixes up.

Extend it to also apply to v2 sequences, this fixes the panel not working
on the Acer Iconia One 8 A1-840.

Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14605


Signed-off-by: default avatarHans de Goede <hansg@kernel.org>
Acked-by: default avatarJani Nikula <jani.nikula@intel.com>
Link: https://lore.kernel.org/r/20250703143824.7121-1-hansg@kernel.org


Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
parent d6a59ee8
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -1939,7 +1939,7 @@ static int get_init_otp_deassert_fragment_len(struct intel_display *display,
	int index, len;

	if (drm_WARN_ON(display->drm,
			!data || panel->vbt.dsi.seq_version != 1))
			!data || panel->vbt.dsi.seq_version >= 3))
		return 0;

	/* index = 1 to skip sequence byte */
@@ -1962,7 +1962,7 @@ static int get_init_otp_deassert_fragment_len(struct intel_display *display,
}

/*
 * Some v1 VBT MIPI sequences do the deassert in the init OTP sequence.
 * Some v1/v2 VBT MIPI sequences do the deassert in the init OTP sequence.
 * The deassert must be done before calling intel_dsi_device_ready, so for
 * these devices we split the init OTP sequence into a deassert sequence and
 * the actual init OTP part.
@@ -1973,9 +1973,9 @@ static void vlv_fixup_mipi_sequences(struct intel_display *display,
	u8 *init_otp;
	int len;

	/* Limit this to v1 vid-mode sequences */
	/* Limit this to v1/v2 vid-mode sequences */
	if (panel->vbt.dsi.config->is_cmd_mode ||
	    panel->vbt.dsi.seq_version != 1)
	    panel->vbt.dsi.seq_version >= 3)
		return;

	/* Only do this if there are otp and assert seqs and no deassert seq */