On Tue, 29 Aug 2023 at 22:21, Abhinav Kumar <quic_abhin...@quicinc.com> wrote:
>
>
>
> On 8/29/2023 12:15 PM, Dmitry Baryshkov wrote:
> > On Tue, 29 Aug 2023 at 22:09, Abhinav Kumar <quic_abhin...@quicinc.com> 
> > wrote:
> >>
> >>
> >>
> >> On 8/29/2023 11:51 AM, Dmitry Baryshkov wrote:
> >>> On Tue, 29 Aug 2023 at 20:22, Abhinav Kumar <quic_abhin...@quicinc.com> 
> >>> wrote:
> >>>>
> >>>>
> >>>>
> >>>> On 8/29/2023 9:43 AM, Dmitry Baryshkov wrote:
> >>>>> On Tue, 29 Aug 2023 at 19:37, Abhinav Kumar <quic_abhin...@quicinc.com> 
> >>>>> wrote:
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>> On 8/29/2023 2:26 AM, Dmitry Baryshkov wrote:
> >>>>>>> On Tue, 29 Aug 2023 at 12:22, <neil.armstr...@linaro.org> wrote:
> >>>>>>>>
> >>>>>>>> On 28/08/2023 19:07, Abhinav Kumar wrote:
> >>>>>>>>> Hi Neil
> >>>>>>>>>
> >>>>>>>>> Sorry I didnt respond earlier on this thread.
> >>>>>>>>>
> >>>>>>>>> On 8/28/2023 1:49 AM, 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.
> >>>>>>>>>>
> >>>>>>>>>
> >>>>>>>>> Ack.
> >>>>>>>>>
> >>>>>>>>>>>
> >>>>>>>>>>> 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.
> >>>>>>>>>>
> >>>>>>>>>
> >>>>>>>>> May I know what type of negotiation is needed here?
> >>>>>>>>>
> >>>>>>>>>>>
> >>>>>>>>>>>
> >>>>>>>>>>> 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.
> >>>>>>>>>>
> >>>>>>>>>
> >>>>>>>>> I wanted to respond to this earlier but didnt get a chance.
> >>>>>>>>>
> >>>>>>>>>      From the documentation of this flag, this has nothing to do 
> >>>>>>>>> whether panels are sending the LP commands (commands sent in LP 
> >>>>>>>>> mode) OR HS commands (commands sent in HS mode).
> >>>>>>>>>
> >>>>>>>>> This is more about sending the commands whether the lanes are in 
> >>>>>>>>> LP11 state before sending the ON commands.
> >>>>>>>>>
> >>>>>>>>> 195      * The previous controller should be prepared first, before 
> >>>>>>>>> the prepare
> >>>>>>>>> 196      * for the panel is called. This is largely required for 
> >>>>>>>>> DSI panels
> >>>>>>>>> 197      * where the DSI host controller should be initialised to 
> >>>>>>>>> LP-11 before
> >>>>>>>>> 198      * the panel is powered up.
> >>>>>>>>> 199      */
> >>>>>>>>> 200     bool prepare_prev_first;
> >>>>>>>>>
> >>>>>>>>> These are conceptually different and thats what I explained Dmitry 
> >>>>>>>>> in our call.
> >>>>>>>>>
> >>>>>>>>> Sending ON commands in LP11 state is a requirement I have seen with 
> >>>>>>>>> many panels and its actually the right expectation as well to send 
> >>>>>>>>> the commands when the lanes are in a well-defined LP11 state.
> >>>>>>>>>
> >>>>>>>>>      From the panels which I have seen, the opposite is never true 
> >>>>>>>>> (OR i have never seen it this way).
> >>>>>>>>>
> >>>>>>>>> The parade chip was the only exception and that issue was never 
> >>>>>>>>> root-caused leading us to have bridge specific handling in MSM 
> >>>>>>>>> driver.
> >>>>>>>>>
> >>>>>>>>> In other words, it would be very unlikely that a panel should be 
> >>>>>>>>> broken or shouldn't work when the ON commands are sent when the 
> >>>>>>>>> lanes are in LP11 state.
> >>>>>>>>>
> >>>>>>>>> So I agree with Jessica, that we should set the default value of 
> >>>>>>>>> this flag to true in the framework so that only the bridges/panels 
> >>>>>>>>> which need this to be false do that explicitly. From the examples I 
> >>>>>>>>> pointed out including MTK, even those vendors are powering on their 
> >>>>>>>>> DSI in pre_enable() which means none of these panels will work 
> >>>>>>>>> there too.
> >>>>>>>>>
> >>>>>>>>>>>
> >>>>>>>>>>> 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 am fine to drop this fix in favor of making the 
> >>>>>>>>> prepare_prev_first as default true but we need an agreement first. 
> >>>>>>>>> From what I can see, parade chip will be the only one which will 
> >>>>>>>>> need this to be set to false and we can make that change.
> >>>>>>>>>
> >>>>>>>>> Let me know if this works as a migration plan.
> >>>>>>>>
> >>>>>>>> Yep agreed, let's do this
> >>>>>>>>
> >>>>>>>> The panel's prepare_prev_first should be reversed to something like 
> >>>>>>>> not_prepare_prev_first to make it an exception.
> >>>>>>>
> >>>>>>> This will break all non-DSI panels, which might depend on the current
> >>>>>>> bridge calling order.
> >>>>>>>
> >>>>>>> I started looking at the explicit DSI power up sequencing, but it will
> >>>>>>> take a few more days to mature.
> >>>>>>>
> >>>>>>
> >>>>>> May I know why this would break all non-DSI panels?
> >>>>>
> >>>>> Existing panel drivers might be depending on the init order. Do we
> >>>>> know for sure that none of DPI panels will be broken if there is a
> >>>>> video stream ongoing during the reset procedure?
> >>>>> Or the panel-edp, which I'm pretty sure will require 
> >>>>> not_prepare_prev_first.
> >>>>>
> >>>>
> >>>> Can you please explain why would video stream be ON in pre_enable()?
> >>>>
> >>>> Even though we call msm_dsi_host_enable() in the DSI's pre_enable(), the
> >>>> timing engine is not enabled until the encoder's enable and the first
> >>>> commit after that so video stream wont be sent till then.
> >>>
> >>> You are describing the MSM DSI case. I was pointing to the fact that
> >>> parent's pre_enable if called too early might conflict with the next
> >>> bridge driver in the _generic_ case. E.g. eDP or DPI. Even if is not a
> >>> full-featured video stream, this state might confuse the panel. So we
> >>> can not blindly switch the order of pre_enable callbacks for the
> >>> bridge-panel pair.
> >>>
> >>
> >> Even if the end connector was a eDP or DPI, the input to the bridge was
> >> DSI so I think its unlikely that video stream was on before encoder's
> >> enable but I cannot speak for all these interfaces/vendors.
> >>
> >> So, to accommodate both worlds, does this work?
> >>
> >> diff --git a/drivers/gpu/drm/bridge/panel.c 
> >> b/drivers/gpu/drm/bridge/panel.c
> >> index 9316384b4474..2b38388d4e56 100644
> >> --- a/drivers/gpu/drm/bridge/panel.c
> >> +++ b/drivers/gpu/drm/bridge/panel.c
> >> @@ -416,7 +416,10 @@ struct drm_bridge
> >> *devm_drm_panel_bridge_add_typed(struct device *dev,
> >>                   return bridge;
> >>           }
> >>
> >> -       bridge->pre_enable_prev_first = panel->prepare_prev_first;
> >> +       if (connector_type == DRM_MODE_CONNECTOR_DSI)
> >> +               bridge->pre_enable_prev_first = true;
> >> +       else
> >> +               bridge->pre_enable_prev_first = panel->prepare_prev_first;
> >
> > looks like a hack.
> >
>
> Nope its not, DSI spec has clear mentions about LP11 state to be used
> during initialization.
>
> "After power-up, the host processor shall observe an initialization
> period, TINIT, during which it shall drive a
> sustained TX-Stop state (LP-11) on all Lanes of the Link. See [MIPI04]
> for descriptions of TINIT and the TX-Stop state.
>
> Peripherals shall power up in the RX-Stop state and monitor the Link to
> determine if the host processor has
> asserted a TX-Stop state for at least the TINIT period. The peripheral
> shall ignore all Link states prior to
> detection of a TINIT event. The peripheral shall be ready to accept bus
> transactions immediately following the end of the TINIT period."
>
> I am only extending this statement by mandating that the DSI PHY /
> controller be powered up so that its able to drive the lanes to LP11 state.
>
> Now, pls explain why this is a hack

Because it centers DSI panels only, not taking bridges into account.
Because doesn't allow the panel to override this decision, etc.

>
> >>
> >>           *ptr = bridge;
> >>           devres_add(dev, ptr);
> >>
> >>>>
> >>>> drm_atomic_bridge_chain_pre_enable() is called before the encoder's 
> >>>> enable.
> >>>>
> >>>> drm_atomic_bridge_chain_enable() is the one which is called after the
> >>>> encoder's enable().
> >>>>
> >>>>>>
> >>>>>> Like I said, we dont know the full details of the parade issue but I do
> >>>>>> not see any reason why powering on a bridge chip with the DSI lanes
> >>>>>> being in proper LP11 state should cause an issue. Its a well defined 
> >>>>>> and
> >>>>>> documented state in DSI spec.
> >>>>>>
> >>>>>> On the contrary, trying to turn on a bridge chip before powering on a
> >>>>>> controller could have more issues as we do not know what state the 
> >>>>>> lanes
> >>>>>> are in when the MIPI devices (panel or bridge) are powered up.
> >>>>>>
> >>>>>> This sets the expectation and handshake straight.
> >>>>>
> >>>>>
> >>>
> >>>
> >>>
> >
> >
> >



-- 
With best wishes
Dmitry

Reply via email to