Re: DT connectors, thoughts

From: David Gibson
Date: Fri Jul 22 2016 - 00:26:26 EST


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:
> > Hi,
> >
> > Here's some of my thoughts on how a connector format for the DT could
> > be done. Sorry it's taken longer than I hoped - I've been pretty
> > swamped in my day job.
> >
> > This is pretty early thoughts, but gives an outline of the approach I
> > prefer.
> >
> > So.. start with an example of a board DT including a widget socket,
> > which contains pins for an MMIO bus, an i2c bus and 2 interrupt lines.
> >
> > /dts-v1/;
> >
> > / {
> > compatible = "foo,oldboard";
> > ranges;
> > soc@... {
> > ranges;
> > mmio: mmio-bus@... {
> > #address-cells = <2>;
> > #size-cells = <2>;
> > ranges;
> > };
> > i2c: i2c@... {
> > };
> > intc: intc@... {
> > #interrupt-cells = <2>;
> > };
> > };
> >
> > connectors {
> > widget1 {
> > compatible = "foo,widget-socket";
> > w1_irqs: irqs {
> > interrupt-controller;
> > #address-cells = <0>;
> > #interrupt-cells = <1>;
> > interrupt-map-mask = <0xffffffff>;
> > interrupt-map = <
> > 0 &intc 7 0
> > 1 &intc 8 0
> > >;
> > };
> > aliases = {
> > i2c = &i2c;
> > intc = &w1_irqs;
>
> 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.

> > mmio = &mmio;
> > };
> > };
> > };
> > };
> >
> > Note that the symbols are local to the connector, and explicitly
> > listed, rather than including all labels in the tree. This is to
> > enforce (or at the very least encourage) plugins to only access those
> > parts of the base tree.
> >
> > Note also the use of an interrupt nexus node contained within the
> > connector to control which irqs the socketed device can use. I think
> > this needs some work to properly handle unit addresses, but hope
> > that's enough to give the rough idea.
> >
> > So, what does the thing that goes in the socket look like? I'm
> > thinking some new dts syntax like this:
> >
> > /dts-v1/;
> >
> > /plugin/ foo,widget-socket {
> > compatible = "foo,whirligig-widget";
> > };
> >
> > &i2c {
> > whirligig-controller@... {
> > ...
> > interrupt-parent = <&widget-irqs>;
> > interrupts = <0>;
> > };
> > };
> >
> > Use of the /plugin/ keyword is rather different from existing
> > practice, so we may want a new one instead.
> >
> > The idea is that this would be compiled to something like:
> >
> > /dts-v1/;
> >
> > / {
> > socket-type = "foo,widget-socket";
> > compatible = "foo,whirligig-widget";
> >
> > fragment@0 {
> > target-alias = "i2c";
>
> Yet another way to express the target... Every new feature for
> overlays seems to define a new way.

Well, yes. Frankly I think that's because the original ways of
describing the target were not well thought out. Using a phandle is
awkward because it will always be -1 until fixups are applied, which
seems a bit pointless (why not have the alias/label directly). Using
a full path means that the overlay can overwrite anywhere in the base
tree which doesn't seem like good practice.

> My thinking was the target is a
> connector node and all devices are under it.

I thought about this, and I think it's technically possible, but it
gets really ugly. The trouble is that connectors frequently have pins
onto multiple buses. In order to combine those into a single parent
node, we'd have to combine the address spaces of all those buses.
That can be done using some complex multi-cell encoding, but it won't
be pretty. Then to make the connection point be a single node in the
base tree you'd essentially have to combine all the buses used in the
connector throughout the base board DT, so that ugly multi-cell
encoding will have to be used throughout most of the base DT, not just
in the connector stuff.

> In your case, the
> connector is not part of the hierarchy for any devices in the overlay.
> That may simplify adding OS support, but seems to be a less accurate
> representation of the h/w.

I think its the best we can do. Because connectors usually combine
multiple logically distinct buses, they really don't exist as a
well-defined point in a single heirarchy.

> > __overlay__ {
> > whirligig-controller@... {
> > ...
> > interrupt-parent = <0xffffffff>;
> > interrupts = <0>;
> > };
> > };
> > };
> > __phandle_fixups__ {
> > /* These are (path, property, offset) tuples) */
> > widget-irqs =
> > "/fragment@0/__overlay__/whirligig-controller@...",
> > "interrupt-parent", <0>;
> > };
> > };
>

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