Configuring device with I2C mux

Alex Qiu xqiu at google.com
Thu Jan 9 04:54:20 AEDT 2020


Hi James,

Yes, we have multiple devices sitting behind the mux, and they're onboard
devices instead of standalone FRUs. The parent bus is described as the FRU
for each PCIe card.

After naming the mux channels, can these names be used somehow to config
I2C devices? For example, {"Bus": "$bus", "ChannelNames":
["C0", "C1", "C2", "C3"]} for the mux, and {"Bus": "$bus.C1"} for devices
behind the mux on channel 1.

Thanks!

- Alex Qiu


On Wed, Jan 8, 2020 at 9:47 AM James Feist <james.feist at linux.intel.com>
wrote:

> On 1/8/20 9:25 AM, Alex Qiu wrote:
> > Hi Milton,
> >
> > Yes, the child buses are traceable in the sysfs, but actually my
> > question is, does entity-manager supports tracing child buses through
> > the sysfs? If it does, how shall I write the JSON config to take
> > advantage of this feature?
> >
> > For example, we have a I2C device sitting at the same level as the mux,
> > configured as {"Address": "0x40", "Bus": "$bus"}, and now I don't find
> > the way to add or subtract a certain number to $bus to find a child bus.
> > Do we have a feature with syntax like {"Address": "0x50", "Bus":
> > "$bus.mux.0x70.channel.1"} to configure devices on child buses, with mux
> > sitting on 0x70 of the parent bus?
>
> Do you have a device sitting behind the mux? Generally in most our
> situations we have another FRU behind the mux, and we can use "$bus" to
> describe this.
>
> Second option is you can name the mux channels, like this:
>
> https://github.com/openbmc/entity-manager/blob/01542d2af1b1f45335cc8813fffcd3ed07f22989/configurations/WFT%20Baseboard.json#L1023
>
> And then in /dev/ you'll get symlinks like this:
>
> root at intel-obmc:~# ls -al /dev/i2c-mux/M2_Mux/
> drwxr-xr-x    2 root     root            80 Jan  1 00:01 .
> drwxr-xr-x    9 root     root           180 Jan  1 00:01 ..
> lrwxrwxrwx    1 root     root            11 Jan  1 00:01 M2Slot1 ->
> /dev/i2c-14
> lrwxrwxrwx    1 root     root            11 Jan  1 00:01 M2Slot2 ->
> /dev/i2c-15
>
> -James
>
>
> >
> > Thank you!
> >
> > - Alex Qiu
> >
> >
> > On Wed, Jan 8, 2020 at 6:43 AM Milton Miller II <miltonm at us.ibm.com
> > <mailto:miltonm at us.ibm.com>> wrote:
> >
> >     About 01/07/2020 07:14PM in some timezone, Alex Qiu wrote:
> >      >Hi folks,
> >      >
> >      >We have a JSON file configuring I2C devices of a PCIe card which
> has
> >      >an 8-channel I2C mux for entity-manager. After we properly
> configure
> >      >the mux of the card, we get 8 new I2C buses in sysfs; however, we
> >      >don't find an arithmetic way to describe the relationship between
> the
> >      >new buses and their parent buses.
> >      >
> >      >For example, we have a mux on physical BMC I2C bus i2c-8 spawning a
> >      >couple of child buses including i2c-24 and i2c-26, which are the
> >      >buses for each PCIe card. The mux on i2c-24 PCIe card spawned 8
> buses
> >      >from i2c-70 to i2c-77, and the mux on i2c-26 PCIe card spawned ones
> >      >from i2c-62 to i2c-69. We have I2C devices on i2c-76 and i2c-68
> needs
> >      >to be configured together with the PCIe card on i2c-24 and i2c-26
> >      >separately.
> >      >
> >      >How do we implement this in the JSON file? If that's not possible
> to
> >      >do it in JSON merely, what's the suggested approach to implement
> this
> >      >feature? Device tree? Implement code in entity-manager to walk
> >      >through the I2C sysfs?
> >
> >
> >     I would expect the i2c buses provied by the mux to appear in sysfs
> >     under the hierarchy of the parent bus.  Explore the sysfs directory
> >     structure, I'm making this up, but I've now peeked at i2c-mux.c and
> >     have a better chance getting reality.
> >
> >
> >     /sys/bus/i2c/devices/i2c-8 -> /sys/devices/platform/ahb-432000/i2c-8
> >
> >     /sys/bus/i2c/devices/i2c-24 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-24
> >     /sys/bus/i2c/devices/i2c-24 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-25
> >     /sys/bus/i2c/devices/i2c-24 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-26
> >
> >     /sys/bus/i2c/devices/i2c-62 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-26/i2c-62
> >     /sys/bus/i2c/devices/i2c-63 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-26/i2c-63
> >     /sys/bus/i2c/devices/i2c-64 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-26/i2c-64
> >     /sys/bus/i2c/devices/i2c-65 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-26/i2c-65
> >     /sys/bus/i2c/devices/i2c-66 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-26/i2c-66
> >     /sys/bus/i2c/devices/i2c-67 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-26/i2c-67
> >     /sys/bus/i2c/devices/i2c-68 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-26/i2c-68
> >     /sys/bus/i2c/devices/i2c-69 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-26/i2c-69
> >     /sys/bus/i2c/devices/i2c-70 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-24/i2c-70
> >     /sys/bus/i2c/devices/i2c-71 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-24/i2c-71
> >     /sys/bus/i2c/devices/i2c-72 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-24/i2c-72
> >     /sys/bus/i2c/devices/i2c-73 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-24/i2c-73
> >     /sys/bus/i2c/devices/i2c-74 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-24/i2c-74
> >     /sys/bus/i2c/devices/i2c-75 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-24/i2c-75
> >     /sys/bus/i2c/devices/i2c-76 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-24/i2c-76
> >     /sys/bus/i2c/devices/i2c-77 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-24/i2c-77
> >
> >     /sys/bus/i2c/devices/i2c-24/mux_device ->
> >     /sys/devices/platform/ahb-432000/i2c-8/8-52
> >     /sys/bus/i2c/devices/i2c-25/mux_device ->
> >     /sys/devices/platform/ahb-432000/i2c-8/8-52
> >     /sys/bus/i2c/devices/i2c-26/mux_device ->
> >     /sys/devices/platform/ahb-432000/i2c-8/8-52
> >
> >     /sys/bus/i2c/devices/8-52/channel-0 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-24
> >     /sys/bus/i2c/devices/8-52/channel-1 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-25
> >     /sys/bus/i2c/devices/8-52/channel-2 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-26
> >
> >     /sys/bus/i2c/devices/24-52/channel-0 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-24/i2c-62
> >     /sys/bus/i2c/devices/24-52/channel-1 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-24/i2c-63
> >     /sys/bus/i2c/devices/24-52/channel-2 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-24/i2c-64
> >     /sys/bus/i2c/devices/24-52/channel-3 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-24/i2c-65
> >     /sys/bus/i2c/devices/24-52/channel-4 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-24/i2c-66
> >     /sys/bus/i2c/devices/24-52/channel-5 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-24/i2c-67
> >     /sys/bus/i2c/devices/24-52/channel-6 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-24/i2c-68
> >     /sys/bus/i2c/devices/24-52/channel-7 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-24/i2c-69
> >     /sys/bus/i2c/devices/26-52/channel-0 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-26/i2c-70
> >     /sys/bus/i2c/devices/26-52/channel-1 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-26/i2c-71
> >     /sys/bus/i2c/devices/26-52/channel-2 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-26/i2c-72
> >     /sys/bus/i2c/devices/26-52/channel-3 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-26/i2c-73
> >     /sys/bus/i2c/devices/26-52/channel-4 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-26/i2c-74
> >     /sys/bus/i2c/devices/26-52/channel-5 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-26/i2c-75
> >     /sys/bus/i2c/devices/26-52/channel-6 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-26/i2c-76
> >     /sys/bus/i2c/devices/26-52/channel-7 ->
> >     /sys/devices/platform/ahb-432000/i2c-8/i2c-26/i2c-77
> >
> >     The child bus will have a symlink "mux_device" pointing to the mux.
> >     The mux device node will have n symlinks "channel-1" where 1 is
> >     the channel id.
> >
> >     Hmm, there is no apparent code to put a "mux_channel" attribute in
> >     the adapter node.  The adapter name attribute does include the
> channel
> >     id, but its long descriptive text.  Regardless, you should be able to
> >     find the buses from the mux channel-3 symlinks.
> >
> >     Note: I haven't looked at the JSON to see how much it will change
> once
> >     your find the bus.  I'm guessing you will have to generate it by
> taking
> >     a template and substituting the bus numbers you find to make the
> slots
> >     common, alhtough you could just go from the 8-52/channel-3 symlink to
> >     the adapter bus (the device name will still have the bus number in
> it).
> >
> >     I hope this helps you,
> >
> >     milton
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ozlabs.org/pipermail/openbmc/attachments/20200108/53bc1a40/attachment-0001.htm>


More information about the openbmc mailing list