Hi Neil

On Mon, 28 Aug 2023 at 09:49, <neil.armstr...@linaro.org> wrote:
>
> Hi Jessica,
>
> On 25/08/2023 20:37, Jessica Zhang wrote:
> >
> >
> > On 8/21/2023 3:01 AM, neil.armstr...@linaro.org wrote:
> >> Hi Maxime,
> >>
> >> On 21/08/2023 10:17, Maxime Ripard wrote:
> >>> Hi,
> >>>
> >>> On Fri, Aug 18, 2023 at 10:25:48AM +0200, neil.armstr...@linaro.org wrote:
> >>>> On 17/08/2023 20:35, Dmitry Baryshkov wrote:
> >>>>> On 16/08/2023 10:51, neil.armstr...@linaro.org wrote:
> >>>>>> Sending HS commands will always work on any controller, it's all
> >>>>>> about LP commands. The Samsung panels you listed only send HS
> >>>>>> commands so they can use prepare_prev_first and work on any
> >>>>>> controllers.
> >>>>>
> >>>>> I think there is some misunderstanding there, supported by the
> >>>>> description of the flag.
> >>>>>
> >>>>> If I remember correctly, some hosts (sunxi) can not send DCS
> >>>>> commands after enabling video stream and switching to HS mode, see
> >>>>> [1]. Thus, as you know, most of the drivers have all DSI panel setup
> >>>>> commands in drm_panel_funcs::prepare() /
> >>>>> drm_bridge_funcs::pre_enable() callbacks, not paying attention
> >>>>> whether these commands are to be sent in LP or in HS mode.
> >>>>>
> >>>>> Previously DSI source drivers could power on the DSI link either in
> >>>>> mode_set() or in pre_enable() callbacks, with mode_set() being the
> >>>>> hack to make panel/bridge drivers to be able to send commands from
> >>>>> their prepare() / pre_enable() callbacks.
> >>>>>
> >>>>> With the prev_first flags being introduced, we have established that
> >>>>> DSI link should be enabled in DSI host's pre_enable() callback and
> >>>>> switched to HS mode (be it command or video) in the enable()
> >>>>> callback.
> >>>>>
> >>>>> So far so good.
> >>>>
> >>>> It seems coherent, I would like first to have a state of all DSI host
> >>>> drivers and make this would actually work first before adding the
> >>>> prev_first flag to all the required panels.
> >>>
> >>> This is definitely what we should do in an ideal world, but at least for
> >>> sunxi there's no easy way for it at the moment. There's no documentation
> >>> for it and the driver provided doesn't allow this to happen.
> >>>
> >>> Note that I'm not trying to discourage you or something here, I'm simply
> >>> pointing out that this will be something that we will have to take into
> >>> account. And it's possible that other drivers are in a similar
> >>> situation.
> >>>
> >>>>> Unfortunately this change is not fully backwards-compatible. This
> >>>>> requires that all DSI panels sending commands from prepare() should
> >>>>> have the prepare_prev_first flag. In some sense, all such patches
> >>>>> might have Fixes: 5ea6b1702781 ("drm/panel: Add prepare_prev_first
> >>>>> flag to drm_panel").
> >>>>
> >>>> This kind of migration should be done *before* any possible
> >>>> regression, not the other way round.
> >>>>
> >>>> If all panels sending commands from prepare() should have the
> >>>> prepare_prev_first flag, then it should be first, check for
> >>>> regressions then continue.
> >>>>
> >>>> <snip>
> >>>>
> >>>>>>
> >>>>>> I understand, but this patch doesn't qualify as a fix for
> >>>>>> 9e15123eca79 and is too late to be merged in drm-misc-next for
> >>>>>> v6.6, and since 9e15123eca79 actually breaks some support it
> >>>>>> should be reverted (+ deps) since we are late in the rc cycles.
> >>>>>
> >>>>> If we go this way, we can never reapply these patches. There will be
> >>>>> no guarantee that all panel drivers are completely converted. We
> >>>>> already have a story without an observable end -
> >>>>> DRM_BRIDGE_ATTACH_NO_CONNECTOR.
> >>>>
> >>>> I don't understand this point, who would block re-applying the patches ?
> >>>>
> >>>> The migration to DRM_BRIDGE_ATTACH_NO_CONNECTOR was done over multiple
> >>>> Linux version and went smoothly because we reverted regressing patches
> >>>> and restarted when needed, I don't understand why we can't do this
> >>>> here aswell.
> >>>>
> >>>>> I'd consider that the DSI driver is correct here and it is about the
> >>>>> panel drivers that require fixes patches. If you care about the
> >>>>> particular Fixes tag, I have provided one several lines above.
> >>>>
> >>>> Unfortunately it should be done in the other way round, prepare for
> >>>> migration, then migrate,
> >>>>
> >>>> I mean if it's a required migration, then it should be done and I'll
> >>>> support it from both bridge and panel PoV.
> >>>>
> >>>> So, first this patch has the wrong Fixes tag, and I would like a
> >>>> better explanation on the commit message in any case. Then I would
> >>>> like to have an ack from some drm-misc maintainers before applying it
> >>>> because it fixes a patch that was sent via the msm tree thus per the
> >>>> drm-misc rules I cannot apply it via the drm-misc-next-fixes tree.
> >>>
> >>> Sorry, it's not clear to me what you'd like our feedback on exactly?
> >>
> >> So let me resume the situation:
> >>
> >> - pre_enable_prev_first was introduced in [1]
> >> - some panels made use of pre_enable_prev_first
> >> - Visionox VTDR6130 was enabled on SM8550 systems and works on v6.5 
> >> kernels and before
> >> - patch [2] was introduced on MSM DRM tree, breaking VTDR6130 on SM8550 
> >> systems (and probably other Video mode panels on Qcom platforms)
> >> - this fix was sent late, and is now too late to be merged via 
> >> drm-misc-next
> >
> > Hi Neil and Maxime,
> >
> > I agree with Neil that 9e15123eca79 was the commit that introduced the 
> > issue (since it changed the MSM DSI host behavior).
> >
> > However, I'm not too keen on simply reverting that patch because
> >
> > 1) it's not wrong to have the dsi_power_on in pre_enable. Arguably, it 
> > actually makes more sense to power on DSI host in pre_enable than in 
> > modeset (since modeset is meant for setting the bridge mode), and
>
> I never objected that, it's the right path to go.
>
> >
> > 2) I think it would be good practice to keep specific bridge chip checks 
> > out of the DSI host driver.
>
> We discussed about a plan with Maxime and Dmitry about that, and it would 
> require adding
> a proper atomic panel API to handle a "negociation" with the host controller.
>
> >
> >
> > That being said, what do you think about setting the default value of 
> > prepare_prev_first to true (possibly in panel_bridge_attach)?
>
> As Dmitry pointed, all panels sending LP commands in pre_enable() should have 
> prepare_prev_first to true.

Any panel wishing the clock and data lanes to be in a defined LP-11
state before pre_enable() is called need to set prepare_prev_first to
true. This is not a universal requirement of all DSI peripherals for
which commands are sent from pre_enable - a number will happily power
up at LP-00.
It is true that no harm will occur on those devices that do support
non-LP-11 power up if the host is in LP-11, so a blanket setting of
the flag for any panel driver sending DSI commands in pre_enable
should be safe.

It is documented [1] that transfer can be called at any time,
regardless of the state of the host. The MSM driver isn't supporting
that, hence issues.
[2] further clarifies that it is expected to power up the host
controller, send the message, and power down again.

[1] 
https://github.com/torvalds/linux/blob/master/include/drm/drm_mipi_dsi.h#L84-L87
[2] 
https://github.com/torvalds/linux/blob/master/drivers/gpu/drm/drm_bridge.c#L185-L188

> >
> > It seems to me that most panel drivers send DCS commands during pre_enable, 
> > so maybe it would make more sense to power on DSI host before panel 
> > enable() by default. Any panel that needs DSI host to be powered on later 
> > could then explicitly set the flag to false in their respective drivers.
>
> A proper migration should be done, yes, but not as a fix on top of v6.5.

I looked at this when adding prepare_prev_first, but as the DSI
control path is separate from the bridge chain there's no obvious way
to automatically set a bridge flag from the mipi_dsi registration.

  Dave

> Neil
>
> >
> > Thanks,
> >
> > Jessica Zhang
> >
> >
> >>
> >> I do not consider it's the right way to fix regression caused by [2]
> >> I consider [2] should be reverted, panels migrated to 
> >> pre_enable_prev_first when needed, tested and the [2] applied again
> >>
> >> I have no objection about [2] and it should be done widely over the whole 
> >> DSI controllers
> >> and DSI Video panels.
> >>
> >> I also object about the Fixes tag of this patch, which is wrong, and 
> >> Dmitry considers [1]
> >> should be used but it's even more wrong since [2] really caused the 
> >> regression.
> >>
> >> And if [2] was to correct one to use, it was pushed via the MSM tree so it 
> >> couldn't be
> >> applied via drm-misc-next-fixes, right ?
> >>
> >> [1] 4fb912e5e190 ("drm/bridge: Introduce pre_enable_prev_first to alter 
> >> bridge init order")
> >> [2] 9e15123eca79 ("drm/msm/dsi: Stop unconditionally powering up DSI hosts 
> >> at modeset")
> >>
> >> Thanks,
> >> Neil
> >>
> >>>
> >>> Maxime
> >>
>

Reply via email to