On 7/18/23 18:15, Doug Anderson wrote:
Hi,
Hi,
On Tue, Jul 18, 2023 at 8:36 AM Marek Vasut <ma...@denx.de> wrote:
On 7/18/23 16:17, Doug Anderson wrote:
Hi,
Hi,
On Sun, Jul 9, 2023 at 6:52 AM Marek Vasut <ma...@denx.de> wrote:
The unprepared_time has to be initialized during probe to probe time
ktime, otherwise panel_simple_resume() panel_simple_wait() call may
wait too short time, or no time at all, which would violate the panel
timing specification. Initializing the unprepared_time() to probe time
ktime assures the delay is at least what the panel requires from the
time kernel started. The unprepared_time is then updated every time
the panel is suspended in panel_simple_suspend() too.
Fixes: e5e30dfcf3db ("drm: panel: simple: Defer unprepare delay till next prepare to
shorten it")
Signed-off-by: Marek Vasut <ma...@denx.de>
Can you talk in more detail about the problem you're seeing? Your
patch will likely cause boot speed regressions. While correctness
trumps performance, I'd like to make sure this is right before landing
it.
With AUO T215HVN01 panel, connected to LT9211 DSI-to-LVDS bridge,
connected to MX8M Mini DSIM , the panel just would not come up correctly
because this unprepare_time is not observed. The panel would only show
blue stripe on the left side, instead of actual image.
Specifically, I think your patch is nearly the opposite as what I did
in commit 691c1fcda535 ("regulator: core: Shorten off-on-delay-us for
always-on/boot-on by time since booted"). I think many of the same
arguments I made in that commit message argue against your patch.
You cannot guarantee in which state the panel is after boot/reboot,
Agreed. To the best extent possible, whatever solution we arrive at
should work regardless of how the bootloader left things.
so
I believe the kernel has to shut it down, and then bring it up, with the
correct timings.
If that's required for your panel then the driver should do what it
needs to do to ensure this.
The panel-simple driver used to do it. Now it no longer does, which
means the kernel is now running this AUO and possibly other panels out
of specification.
As indicated by my other comments, I
actually don't think your patch currently does in all cases. If the
panel is powered by a PMIC and the bootloader left the power on, your
patch series _won't_ shut it down and bring it back up, will it?
That depends on the regulator configuration. That itself is a separate
issue however, one which has been present even before any of this boot
time optimization attempt.
In any case, if your panel requires extra delays, it would be ideal if
this didn't inflict a penalty on all panels. I haven't personally
worked on any panels currently serviced by panel-simple, but for most
eDP panels the only strong timing requirement is that once you turn
off the main power rail that you don't turn it on again for ~500ms.
The extra delay is actually only inflicted on panels which do set delay
{ .unprepare = ... } constraint in their timing specification, and those
panels most certainly do need those extra delays to operate correctly.
For most panels it's OK to turn it on early (like as soon as the
regulator proves) and also OK if the main power rail stays on between
the bootloader and the kernel.
I would debate the "most" part, as that is not my experience with DPI
and LVDS panels, which, if they are not correctly power sequenced, can
go all kinds of weird and that weirdness is often very subtle. Or worse,
those panels start failing in deployment.
For eDP the one exception I've seen was
the "samsung-atna33xc20" panel and that panel has its own driver
specifically to deal with quirks like this. I talk about this a little
bit in commit 23ff866987de ("arm64: dts: qcom: sc7180: Start the
trogdor eDP/touchscreen regulator on") since homestar uses
"samsung-atna33xc20"
I seldom work with eDP panels, so I cannot comment on that part.
It is well possible the more complex electronics of the panel hides a
lot of the power sequencing details, I wouldn't be surprised by that.
...however, I guess in the case of the panel, things could be
different because regulators aren't directly controlled by the panel
code. Thus, I could imagine that your situation is this:
1. Bootloader runs and leaves the panel powered on.
Bootloader does not touch the panel at all.
Huh, then I'm pretty confused. Where is the timing violation then? If
the panel was off when the device started booting and the bootloader
didn't touch the panel, then the existing code should work fine. The
current code will make sure that we delay at least "unprepare" ms
since the kernel booted and so no specs should be violated.
Are you sure you aren't running into something like a case of
-EPROBE_DEFER where panel-simple powers the regulator on, then
un-probes, and then tries probing again? ...or maybe the default state
of the regulator at bootup _is_ powered on and that's the problem?
Have a look at panel_simple_resume() panel_simple_wait(), this is where
the extra delay is needed. You cannot predict how long the bootloader
took to reach the kernel time t=0 and you cannot know what happened
before the bootloader started (maybe abrupt sysrq reset), not on all
platforms anyway, so the best you can do is assume the worst, i.e. full
unprepare delay.