On Wed, Nov 18, 2020 at 01:40:58PM +0100, Hans de Goede wrote: > Commit 25b4620ee822 ("drm/i915/dsi: Skip delays for v3 VBTs in vid-mode") > added an intel_dsi_msleep() helper which skips sleeping if the > MIPI-sequences have a version of 3 or newer and the panel is in vid-mode; > and it moved a bunch of msleep-s over to this new helper. > > This was based on my reading of the big comment around line 730 which > starts with "Panel enable/disable sequences from the VBT spec.", > where the "v3 video mode seq" column does not have any wait t# entries. > > Given that this code has been used on a lot of different devices without > issues until now, it seems that my interpretation of the spec here is > mostly correct. > > But now I have encountered one device, an Acer Aspire Switch 10 E > SW3-016, where the panel will not light up unless we do actually honor the > panel_on_delay after exexuting the MIPI_SEQ_PANEL_ON sequence. > > What seems to set this model apart is that it is lacking a > MIPI_SEQ_DEASSERT_RESET sequence, which is where the power-on > delay usually happens. > > Fix the panel not lighting up on this model by using an unconditional > msleep(panel_on_delay) instead of intel_dsi_msleep() when there is > no MIPI_SEQ_DEASSERT_RESET sequence. > > Fixes: 25b4620ee822 ("drm/i915/dsi: Skip delays for v3 VBTs in vid-mode") > Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> > --- > drivers/gpu/drm/i915/display/vlv_dsi.c | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/vlv_dsi.c b/drivers/gpu/drm/i915/display/vlv_dsi.c > index 194c239ab6b1..ef673277b36d 100644 > --- a/drivers/gpu/drm/i915/display/vlv_dsi.c > +++ b/drivers/gpu/drm/i915/display/vlv_dsi.c > @@ -816,10 +816,14 @@ static void intel_dsi_pre_enable(struct intel_atomic_state *state, > intel_dsi_prepare(encoder, pipe_config); > > intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_POWER_ON); > - intel_dsi_msleep(intel_dsi, intel_dsi->panel_on_delay); > > - /* Deassert reset */ > - intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DEASSERT_RESET); > + if (dev_priv->vbt.dsi.sequence[MIPI_SEQ_DEASSERT_RESET]) { > + intel_dsi_msleep(intel_dsi, intel_dsi->panel_on_delay); > + /* Deassert reset */ > + intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DEASSERT_RESET); > + } else { > + msleep(intel_dsi->panel_on_delay); > + } Could perhaps use a comment ot explain to the reader what's going on. Looks sane enough to me, and if we get this wrong we just get a bigger delay than necessary I guess. So mostly harmless. Reviewed-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > if (IS_GEMINILAKE(dev_priv)) { > glk_cold_boot = glk_dsi_enable_io(encoder); > -- > 2.28.0 -- Ville Syrjälä Intel _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel