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. > > *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