Re: DT connectors, thoughts

From: David Gibson
Date: Tue Aug 30 2016 - 20:33:18 EST


On Mon, Aug 29, 2016 at 07:07:49PM -0700, Stephen Boyd wrote:
> Quoting David Gibson (2016-08-29 06:45:11)
> > On Thu, Aug 25, 2016 at 06:38:41PM -0700, Stephen Boyd wrote:
> > > Quoting David Gibson (2016-07-21 21:25:56)
> > > > On Thu, Jul 21, 2016 at 02:15:57PM -0500, Rob Herring wrote:
> > > > > On Mon, Jul 18, 2016 at 9:20 AM, David Gibson
> > > > > <david@xxxxxxxxxxxxxxxxxxxxx> wrote:
> > > > >
> > > > > I understand how you are using i2c alias, but not the intc. It would
> > > > > help if the same names were not used in multiple places unless they
> > > > > are the same thing.
> > > >
> > > > Yes, sorry. We have both the /soc/intc node which is the base board's
> > > > master interrupt controller. Then we have the connector local 'intc'
> > > > alias which describes the local interrupt space for just the
> > > > connector.
> > > >
> > > > > What does using aliases here buy us vs. just properties with a
> > > > > phandle?
> > > >
> > > > Um.. I'm not sure what you mean.
> > >
> > > I think Rob means drop the aliases node and just have:
> >
> > Oh, ok. The reason for the aliases node is that putting the aliases
> > (or whatever you want to call them) in the top level connector node
> > limits what potential extensions we can make to the connector format.
> > The aliases can essentially have any property name, so they could
> > collide with additional "metadata" properties we might want to add.
>
> Agreed. Putting them into a subnode will prevent any collisions, but
> what sorts of collisions would there even be? Presumably the one making
> up the connector binding will be choosing the phandles they want to
> export with specific properties, and during that time they can also
> choose to have other properties that don't conflict?

Hmm.. I suppose. It still seems conceptually cleaner to me to have
them in their own namespace.

> > > How would we support an expansion board that goes onto two
> > > sockets/connectors provided by the baseboard when the connectors
> > > "export" the same phandle aliases? From what I can tell with this design
> > > we'll be unable to describe a device on the expansion board that is
> > > wired to properties provided by the two connectors.
> >
> > Ok, so there are two parts to this.
> >
> > 1) Allowing a plugin to use multiple connectors.
> >
> > I thought a bit about this case, but didn't address it for
> > simplicity. That would require a different syntax, so we can rethink
> > this if it's a use case we think we need.
>
> Yes it would be nice to design for this case as well.
>
> >
> > 2) Dealing with alias collisions between connector types
> >
> > This one is fairly straightforward to handle. By default, we'll use
> > labels from connectors we plug into "as is". However, we can add a
> > syntax that allows us to locally rename labels from a connector (for
> > those familiar with Python, think "import foo from bar as baz").
> >
> >
> > So, combining those thoughts together, I'm thinking dtc format for
> > something connecting to two different widget sockets (pretty much the
> > worst case) would look something like:
> >
> > /plugin/ foo,widget-socket {
> > };
> >
> > /plugin/ foo,widget-socket {
> > realias {
> > i2c-b = "i2c";
> > intc-b = "intc";
> > mmio-b = "mmio";
> > };
> > };
> >
> > &i2c {
> > .. devices on the i2c from the first plug ..
> > };
> >
> > &i2c-b {
> > .. devices on the i2c from the second plug ..
> > };
> >
> > Obviously we'd also need to devise an encoding for this to compile
> > into, since the one I proposed previously won't work in this case.
> >
>
> I suppose we can distribute the realias nodes when we compile the plugin
> into overlay fragments. The socket matching is a little vague though.
> How would we know which socket to apply to when we have two identical
> looking sockets? I'm thinking we could put some of that information into
> the fragment itself.

So, my assumption in this example was that the plugin could plug into
*any* two widget sockets. If it needs to connect to specific ones,
then pretty much by definition, the sockets aren't really of
indistinguishable type.

>
> /{
> compatible = "foo,whirlgig-widget";
>
> fragment@0 { /* corresponds to i2c in example above */
> target-socket = "foo,widget-socket-a";
> target-alias = "i2c";
> __overlay__ {
> ....
> };
> };
>
> fragment@1 { /* corresponds to i2c-b in example above */
> target-socket = "foo,widget-socket-b";
> target-alias = "i2c";
> __overlay__ {
> ...
> };
> };
> };

We don't need any new construct here. In this case the sockets aren't
100% compatible, which we can notate with
compatible = "widget-socket-a", "widget-socket";
In the base board.

Devices which can plug into any widget socket will use target-socket =
"widget-socket", those which require a specific one (including
requiring both) can specifically list "widget-socket-a" and/or
"widget-socket-b".

> If we have two identical connectors maybe we'll have to enforce that the
> connectors have some more specific unique compatible string so that we
> can match up the right socket. But I don't see how we can require that
> the overlays know this detail if they only care about one socket and
> could go into either one of them. In that case we should have the loader
> ask the user which socket they connected this extension board to?
>
> I was also thinking it would be better to leave the gpio-map and
> interrupt-map properties at the connector level. For example:
>
> widget1 {
> compatible = "foo,widget-socket";
> interrupt-map-mask = <0xffffffff>;
> interrupt-map = <0 &intc 7 0>,
> <1 &intc 8 0>;
> };

That could work - but we should (and implicitly, do) support either
way. Using subnodes might be useful for particularly complex irq or
gpio mappings.

> and then we could put a label on the plugin/expansion syntax so we can
> reference the connector as a whole:
>
> /plugin/ connector: foo,widget-socket {
> compatible = "foo,whirlgig-widget";
> };
>
> &i2c {
> device@40 {
> interrupt-parent = <&connector>;
> interrupts = <1>;
> };
> };
>
> I also thought about making another alias inside the connector node to
> point to itself, but that fails when you get into the situation of two
> connectors and collisions, unless you rename them of course. It felt
> better to leave that choice to the overlay though.
>
> In conclusion, I see a few topics/patterns emerging:
>
> 1) Expose phandles through the connectors in some way that allows us to
> limit what the plugin/expansion boards can modify or use

Yes, I definitely think we want that.

> 2) Have some flexible syntax to remap cell sizes from the baseboard
> through the connector to provide a consistent connector size (i.e.
> remap interrupts and gpios from multiple sources, etc. into a fixed
> number of cells)

I don't think we need any new constructs here. If there are
mismatches we can put dummy bridges with appropriate ranges properties
on one side or the other.

The only thing I see that might want some help is that the connector
type should certainly imply a specific set of cell widths for all the
included buses. So possibly we should supply some stuff to help
enforce that.

> 3) Allow plugin/expansion boards to use multiple connectors from the
> baseboard in a consistent way

Seems reasonable.

> 4) Attempt to maintain almost all of the current overlay syntax with
> syntactic sugar

I'm not really sure what you mean by that.

> 5) Connectors on expansion boards should be supported

Again, seems like a good goal to me.

>
> Is there anything else we should add to this list?
>

--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson

Attachment: signature.asc
Description: PGP signature