All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bjorn Andersson <bjorn.andersson@linaro.org>
To: Doug Anderson <dianders@chromium.org>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
	Rob Clark <robdclark@gmail.com>, Sean Paul <sean@poorly.run>,
	David Airlie <airlied@linux.ie>, Daniel Vetter <daniel@ffwll.ch>,
	linux-arm-msm <linux-arm-msm@vger.kernel.org>,
	LKML <linux-kernel@vger.kernel.org>,
	Abhinav Kumar <abhinavk@codeaurora.org>,
	Stephen Boyd <swboyd@chromium.org>,
	Kuogee Hsieh <khsieh@codeaurora.org>,
	dri-devel <dri-devel@lists.freedesktop.org>,
	Vara Reddy <varar@codeaurora.org>,
	freedreno <freedreno@lists.freedesktop.org>
Subject: Re: [RFC] drm/msm/dp: Allow attaching a drm_panel
Date: Tue, 5 Oct 2021 19:29:25 -0700	[thread overview]
Message-ID: <YV0KBWxVtKgOp2Cj@ripper> (raw)
In-Reply-To: <CAD=FV=WY+g38p7--QKZCaQnSqx7VvdwC36jH-VKnrEWoxK=XHQ@mail.gmail.com>

On Tue 05 Oct 16:09 PDT 2021, Doug Anderson wrote:

> Hi,
> 
> On Tue, Oct 5, 2021 at 10:33 AM Bjorn Andersson
> <bjorn.andersson@linaro.org> wrote:
> >
> > On Tue 05 Oct 08:39 PDT 2021, Doug Anderson wrote:
> >
> > > Hi,
> > >
> > > On Mon, Oct 4, 2021 at 6:09 PM Bjorn Andersson
> > > <bjorn.andersson@linaro.org> wrote:
> > > >
> > > > On Mon 04 Oct 17:36 PDT 2021, Doug Anderson wrote:
> > > >
> > > > > Hi,
> > > > >
> > > > > On Fri, Oct 1, 2021 at 2:00 PM Bjorn Andersson
> > > > > <bjorn.andersson@linaro.org> wrote:
> > > > > >
> > > > > > On Fri 27 Aug 13:52 PDT 2021, Doug Anderson wrote:
> > > > > >
> > > > > > > Hi,
> > > > > > >
> > > > > > > On Mon, Jul 26, 2021 at 4:15 PM Bjorn Andersson
> > > > > > > <bjorn.andersson@linaro.org> wrote:
> > > > > > > >
> > > > > > > > +static int dp_parser_find_panel(struct dp_parser *parser)
> > > > > > > > +{
> > > > > > > > +       struct device_node *np = parser->pdev->dev.of_node;
> > > > > > > > +       int rc;
> > > > > > > > +
> > > > > > > > +       rc = drm_of_find_panel_or_bridge(np, 2, 0, &parser->drm_panel, NULL);
> > > > > > >
> > > > > > > Why port 2? Shouldn't this just be port 1 always? The yaml says that
> > > > > > > port 1 is "Output endpoint of the controller". We should just use port
> > > > > > > 1 here, right?
> > > > > > >
> > > > > >
> > > > > > Finally got back to this, changed it to 1 and figured out why I left it
> > > > > > at 2.
> > > > > >
> > > > > > drm_of_find_panel_or_bridge() on a DP controller will find the of_graph
> > > > > > reference to the USB-C controller, scan through the registered panels
> > > > > > and conclude that the of_node of the USB-C controller isn't a registered
> > > > > > panel and return -EPROBE_DEFER.
> > > > >
> > > > > I'm confused, but maybe it would help if I could see something
> > > > > concrete. Is there a specific board this was happening on?
> > > > >
> > > >
> > > > Right, let's make this more concrete with a snippet from the actual
> > > > SC8180x DT.
> > > >
> > > > > Under the DP node in the device tree I expect:
> > > > >
> > > > > ports {
> > > > >   port@1 {
> > > > >     reg = <1>;
> > > > >     edp_out: endpoint {
> > > > >       remote-endpoint = <&edp_panel_in>;
> > > > >     };
> > > > >   };
> > > > > };
> > > > >
> > > >
> > > > /* We got a panel */
> > > > panel {
> > > >     ...
> > > >     ports {
> > > >         port {
> > > >             auo_b133han05_in: endpoint {
> > > >                 remote-endpoint = <&mdss_edp_out>;
> > > >             };
> > > >         };
> > > >     };
> > > > };
> > > >
> > > > /* And a 2-port USB-C controller */
> > > > type-c-controller {
> > > >     ...
> > > >     connector@0 {
> > > >         ports {
> > > >             port@0 {
> > > >                 reg = <0>;
> > > >                 ucsi_port_0_dp: endpoint {
> > > >                     remote-endpoint = <&dp0_mode>;
> > > >                 };
> > > >             };
> > > >
> > > >             port@1 {
> > > >                 reg = <1>;
> > > >                 ucsi_port_0_switch: endpoint {
> > > >                     remote-endpoint = <&primary_qmp_phy>;
> > > >                 };
> > > >             };
> > > >         };
> > > >     };
> > > >
> > > >         connector@1 {
> > > >         ports {
> > > >             port@0 {
> > > >                 reg = <0>;
> > > >                 ucsi_port_1_dp: endpoint {
> > > >                     remote-endpoint = <&dp1_mode>;
> > > >                 };
> > > >             };
> > > >
> > > >             port@1 {
> > > >                 reg = <1>;
> > > >                 ucsi_port_1_switch: endpoint {
> > > >                     remote-endpoint = <&second_qmp_phy>;
> > > >                 };
> > > >             };
> > > >         };
> > > >         };
> > > > };
> > > >
> > > > /* And then our 2 DP and single eDP controllers */
> > > > &mdss_dp0 {
> > > >     ports {
> > > >         port@1 {
> > > >             reg = <1>;
> > > >             dp0_mode: endpoint {
> > > >                 remote-endpoint = <&ucsi_port_0_dp>;
> > > >             };
> > > >         };
> > > >     };
> > > > };
> > > >
> > > > &mdss_dp1 {
> > > >     ports {
> > > >         port@1 {
> > > >             reg = <1>;
> > > >             dp1_mode: endpoint {
> > > >                 remote-endpoint = <&ucsi_port_1_dp>;
> > > >             };
> > > >         };
> > > >     };
> > > > };
> > > >
> > > > &mdss_edp {
> > > >     ports {
> > > >         port@1 {
> > > >             reg = <1>;
> > > >             mdss_edp_out: endpoint {
> > > >                 remote-endpoint = <&auo_b133han05_in>;
> > > >             };
> > > >         };
> > > >     };
> > > > };
> > > >
> > > > > If you have "port@1" pointing to a USB-C controller but this instance
> > > > > of the DP controller is actually hooked up straight to a panel then
> > > > > you should simply delete the "port@1" that points to the typeC and
> > > > > replace it with one that points to a panel, right?
> > > > >
> > > >
> > > > As you can see, port 1 on &mdss_dp0 and &mdss_dp1 points to the two UCSI
> > > > connectors and the eDP points to the panel, exactly like we agreed.
> > > >
> > > > So now I call:
> > > >     drm_of_find_panel_or_bridge(dev->of_node, 1, 0, &panel, NULL);
> > > >
> > > > which for the two DP nodes will pass respective UCSI connector to
> > > > drm_find_panel() and get EPROBE_DEFER back - because they are not on
> > > > panel_list.
> > > >
> > > > There's nothing indicating in the of_graph that the USB connectors
> > > > aren't panels (or bridges), so I don't see a way to distinguish the two
> > > > types remotes.
> 
> To summarize where I think our out-of-band discussion went, I think
> you're OK w/ keeping this at "port@1" for both the DP and eDP case and
> we'll figure out _some_ way to make it work.
> 
> 
> > > As far as I can tell the way this would be solved would be to actually
> > > pass &bridge in and then make sure that a bridge would be in place for
> > > the DP connector. In the full DP case you'll get an -EPROBE_DEFER if
> > > the connector hasn't been probed but once it's probed then it should
> > > register as a bridge and thus give you the info you need (AKA that
> > > this isn't a panel).
> > >
> > > I haven't done the digging to see how all this works, but according to
> > > Laurent [1]: "Physical connectors are already handled as bridges, see
> > > drivers/gpu/drm/bridge/display-connector.c"
> > >
> >
> > All this seems to make sense for both eDP and "native" DP.
> >
> > > So basically I think this is solvable in code and there's no reason to
> > > mess with the devicetree bindings to solve this problem. Does that
> > > sound right?
> > >
> >
> > But I don't have a DisplayPort connector.
> >
> > I have a USB-C connector, that upon determining that it's time to play
> > DisplayPort will use the typec_mux abstraction to tell someone on the
> > other side of the of_graph about DisplayPort events (HPD).
> >
> > So where would I put this drm_bridge in the USB-C case?
> >
> > I don't see that it fits in the Type-C side of things and putting it on
> > the DP side would leave us with exactly the problem we have here. So we
> > would have to put a fake "DP connector" inbetween the DP node and the
> > Type-C controller?
> >
> >
> > For reference, this is how I thought one is supposed to tie the Type-C
> > controller to the display driver:
> > https://lore.kernel.org/all/20211005022451.2037405-1-bjorn.andersson@linaro.org/
> 
> OK, so I looked at that a bit. Fair warning that I've never looked at
> the type C code before today so anything I say could be totally wrong!
> :-)
> 
> ...but I _think_ you're abusing the "mux" API for this. I think a type
> C port can have exactly 1 mux, right? Right now you are claiming to be
> _the_ mux in the DP driver, but what about for other alt modes? If
> those wanted to be notified about similar things it would be
> impossible because you're already _the_ mux, right?
> 

I actually don't think so, because I acquire the typec_mux handle by the
means of:

mux_desc.svid = USB_TYPEC_DP_SID;
mux_desc.mode = USB_TYPEC_DP_MODE;
alt_port->mux = fwnode_typec_mux_get(fwnode, &mux_desc);

And in the DisplayPort node I provide svid = /bits/ 16 <0xff01>;

So I will be able to reference multiple different altmode
implementors using this scheme.

> I _think_ a mux is supposed to be something more like
> `drivers/phy/rockchip/phy-rockchip-typec.c` (though that code predates
> the type C framework we're looking at here). There the phy can do all
> the work of remuxing things / flipping orientation / etc. I don't
> think it's a requirement that every SoC be able to do this remuxing
> itself but (if memory serves) rk3399 implemented it so we didn't have
> to do it on the TCPC and could use a cheaper solution there.
> 

I'm afraid I don't see how this interacts with a display controller. It
seems more like it's the phy side of things, what we have split between
the Type-C controller and the QMP phy to set the pins in the right
state.

> In any case, my point is that I think there is supposed to be a
> _single_ mux per port that handles reassigning pins and that's what
> this API is for.
> 

If that's the case things such as typec_mux_match() is just completely
backwards.

> ...so I will still assert that the right thing to do is to have a
> drm_bridge for the type c connector and _that's_ what should be
> sending HPD.
> 

That still implies that all the current typec_mux code got it all wrong
and should be thrown out. If you instead consider that you have a Type-C
controller that upon switching DisplayPort on/off calls typec_mux_set()
to inform the functions that things has changed then all the current
code makes sense.

It also maps nicely to how the TypeC controller would call
typec_switch_set() to inform, in our case the QMP phy that the
orientation has switched.


It seems reasonable to have some common helper code that registers the
typec_mux and turn its notifications into HPD notifications to the
display code, but I still think that should live in the DRM framework,
separate from the USB code.

Regards,
Bjorn

> 
> > I'm afraid I must be missing something in Laurent and yours proposal
> > (although I think Laurent is talking about the native DP case?).
> >
> > Regards,
> > Bjorn
> >
> > > [1] https://lore.kernel.org/r/YUvMv+Y8tFcWPEHd@pendragon.ideasonboard.com/

  reply	other threads:[~2021-10-06  2:27 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-26 23:13 [RFC] drm/msm/dp: Allow attaching a drm_panel Bjorn Andersson
2021-07-26 23:13 ` Bjorn Andersson
2021-07-29  9:59 ` Dmitry Baryshkov
2021-07-29  9:59   ` Dmitry Baryshkov
2021-08-25 23:28   ` Bjorn Andersson
2021-08-26  1:31 ` Stephen Boyd
2021-08-26 20:36   ` Doug Anderson
2021-08-26 20:29 ` Doug Anderson
2021-08-27 20:52 ` Doug Anderson
2021-08-28 14:40   ` Bjorn Andersson
2021-08-30 16:01     ` Doug Anderson
2021-10-01 21:02   ` Bjorn Andersson
2021-10-05  0:36     ` Doug Anderson
2021-10-05  1:11       ` Bjorn Andersson
2021-10-05  1:50         ` Stephen Boyd
2021-10-05  2:11           ` Bjorn Andersson
2021-10-05 15:39         ` Doug Anderson
2021-10-05 17:34           ` Bjorn Andersson
2021-10-05 23:09             ` Doug Anderson
2021-10-06  2:29               ` Bjorn Andersson [this message]
2021-10-06 15:12                 ` Doug Anderson
2021-10-06 20:26                   ` Prashant Malani
2021-10-07 10:17                     ` Heikki Krogerus
2021-10-07 16:15                       ` Bjorn Andersson
2021-10-08 12:38                         ` Heikki Krogerus
2023-05-22 20:51                           ` Bjorn Andersson
2023-05-22 20:51                             ` Bjorn Andersson
2023-05-22 21:53                             ` Bjorn Andersson
2023-05-22 21:53                               ` Bjorn Andersson
2023-05-24  9:50                               ` Heikki Krogerus
2023-05-24  9:50                                 ` Heikki Krogerus
2021-12-06 22:31                       ` Bjorn Andersson
2021-12-06 22:31                         ` Bjorn Andersson
2021-12-07 12:26                         ` Heikki Krogerus
2021-12-07 12:26                           ` Heikki Krogerus
2021-12-07 16:56                           ` Hans de Goede
2021-12-07 16:56                             ` Hans de Goede
2021-12-07 17:29                             ` Bjorn Andersson
2021-12-07 17:29                               ` Bjorn Andersson
2021-12-07 17:54                           ` Imre Deak
2021-12-07 17:54                             ` Imre Deak

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YV0KBWxVtKgOp2Cj@ripper \
    --to=bjorn.andersson@linaro.org \
    --cc=abhinavk@codeaurora.org \
    --cc=airlied@linux.ie \
    --cc=daniel@ffwll.ch \
    --cc=dianders@chromium.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=freedreno@lists.freedesktop.org \
    --cc=khsieh@codeaurora.org \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=robdclark@gmail.com \
    --cc=sean@poorly.run \
    --cc=swboyd@chromium.org \
    --cc=varar@codeaurora.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.