Hi, On Thu, Jun 15, 2023 at 12:49 AM Neil Armstrong <neil.armstrong@xxxxxxxxxx> wrote: > > On 14/06/2023 22:58, Linus Walleij wrote: > > On Tue, Jun 13, 2023 at 11:08 PM Stephan Gerhold <stephan@xxxxxxxxxxx> wrote: > > > >> I'm still quite confused about what exactly is supposed to be in > >> (un)prepare and what in enable/disable. I've seen some related > >> discussion every now and then but it's still quite inconsistent across > >> different panel drivers... Can someone clarify this? > > > > It is somewhat clarified in commit 45527d435c5e39b6eec4aa0065a562e7cf05d503 > > that added the callbacks: > > > > Author: Ajay Kumar <ajaykumar.rs@xxxxxxxxxxx> > > Date: Fri Jul 18 02:13:48 2014 +0530 > > > > drm/panel: add .prepare() and .unprepare() functions > > > > Panels often require an initialization sequence that consists of three > > steps: a) powering up the panel, b) starting transmission of video data > > and c) enabling the panel (e.g. turn on backlight). This is usually > > necessary to avoid visual glitches at the beginning of video data > > transmission. > > > > Similarly, the shutdown sequence is typically done in three steps as > > well: a) disable the panel (e.g. turn off backlight), b) cease video > > data transmission and c) power down the panel. > > > > Currently drivers can only implement .enable() and .disable() functions, > > which is not enough to implement the above sequences. This commit adds a > > second pair of functions, .prepare() and .unprepare() to allow more > > fine-grained control over when the above steps are performed. > > > > Signed-off-by: Ajay Kumar <ajaykumar.rs@xxxxxxxxxxx> > > [treding: rewrite changelog, add kerneldoc] > > Signed-off-by: Thierry Reding <treding@xxxxxxxxxx> > > > > My interpretation is that .enable/.disable is for enabling/disabling > > backlight and well, make things show up on the display, and that > > happens quickly. > > > > prepare/unprepare is for everything else setting up/tearing down > > the data transmission pipeline. > > > > In the clock subsystem the enable/disable could be called in fastpath > > and prepare/unprepare only from slowpath so e.g an IRQ handler > > can gate a simple gated clock. This semantic seems to have nothing > > to do with the display semantic. :/ > > It had to do, .prepare is called when the DSI link is at LP11 state > before it has switched to the VIDEO mode, and .unprepare is the > reverse when VIDEO mode has been disabled and before the DSI link > is totally disabled. > > https://elixir.bootlin.com/linux/latest/source/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c#L938 > > then > > https://elixir.bootlin.com/linux/latest/source/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c#L855 > > but Doug has started changing this starting with MSM DSI driver, leading to > current panel drivers not working anymore with the current DSI init mode > and requires setting pre_enable_prev_first for only some DSI hosts > who switched out of set_mode(). > > The DSI init model doesn't fit at all with the atomic bridge model and > some DSI controllers doesn't support the same features like the allwinner > DSI controller not support sending LP commands when in HS video mode > for example. Summary of the history here as I understand it: 1. Before the switch to DRM_PANEL_BRIDGE, things worked OK. 2. After the switch to DRM_PANEL_BRIDGE, things broke for tc358762. That led to commit 7d8e9a90509f ("drm/msm/dsi: move DSI host powerup to modeset time"), which was a little ugly but sorta OK, except ... 3. Moving the DSI host powerup to modeset time broke ps8640. That led to commit ec7981e6c614 ("drm/msm/dsi: don't powerup at modeset time for parade-ps8640"), which was a hack. 4. We fixed tc358762 using the new "pre_enable_prev_first" in commit 55cac10739d5 ("drm/bridge: tc358762: Set pre_enable_prev_first") and thus were able to undo moving DSI host powerup to modeset time and then undo the ps8640 hack. I talk about this a bit more in the message for commit 9e15123eca79 ("drm/msm/dsi: Stop unconditionally powering up DSI hosts at modeset"). If there are other things that need "pre_enable_prev_first" we could do that. If I understand Dave Stevenson [1], though, this doesn't hurt but technically shouldn't be required. He says that "It is documented that the mipi_dsi_host_ops transfer function should be called with the host in any state [1], so the host driver is failing there." Even if it shouldn't be required, though, "pre_enable_prev_first" can still have a benefit as Dave says [2] because it would mean that the DSI controller doesn't have to power itself up and down for each transfer... If I understand, if the MSM DSI driver did what Dave said (proactive turn on if someone sends commands) then we'd actually be OK even with ps8640, since we don't send any commands in the ps8640 pre_enable() function. I guess one other point of reference is commit a3ee9e0b57f8 ("drm/panel: boe-tv101wum-nl6: Ensure DSI writes succeed during disable"). I think Stephen made that change before "pre_enable_prev_first" was widely available... Hopefully I summarized all that correctly. If I messed up, please yell. I guess the tl;dr (summary of my summary) is: a) Moving panels like this to "pre_enable_prev_first" seems like a reasonable idea anyway and (presumably) works around the issue. b) Moving some commands between disable() / post_diable() or pre_enable() / enable() can also make sense and isn't terrible. As people have pointed out, there is some vagueness on exactly what belongs in each. c) Ideally someone could fix the MSM DSI driver to behave as Dave documented. [1] https://lore.kernel.org/r/CAPY8ntA=Dq6GFQ3gEOm9PzPyOa9bHTr8JrpXLibnai7xKqRbpQ@xxxxxxxxxxxxxx [2] https://lore.kernel.org/r/CAPY8ntAUhVB6UtQTeHAcxNW950Ou+NcEoGwk3JnVWLay89_0Nw@xxxxxxxxxxxxxx