All of lore.kernel.org
 help / color / mirror / Atom feed
From: Markus Armbruster <armbru@redhat.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: "QEMU Developers" <qemu-devel@nongnu.org>,
	"Philippe Mathieu-Daudé" <f4bug@amsat.org>
Subject: Re: ensuring a machine's buses have unique names
Date: Wed, 22 Sep 2021 09:02:16 +0200	[thread overview]
Message-ID: <878rzprt3b.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <CAFEAcA_ExFiv3AurBAtTan10yuXRnsHMQS0yHa-vJpwB9u4HoA@mail.gmail.com> (Peter Maydell's message of "Tue, 21 Sep 2021 14:20:57 +0100")

Peter Maydell <peter.maydell@linaro.org> writes:

> On Wed, 15 Sept 2021 at 05:28, Markus Armbruster <armbru@redhat.com> wrote:
>>
>> Peter Maydell <peter.maydell@linaro.org> writes:
>> > I'm not sure how best to sort this tangle out. We could:
>> >  * make controller devices pass in NULL as bus name; this
>> >    means that some bus names will change, which is an annoying
>> >    breakage but for these minor bus types we can probably
>> >    get away with it. This brings these buses into line with
>> >    how we've been handling uniqueness for ide and scsi.
>>
>> To gauge the breakage, we need a list of the affected bus names.
>
> Looking through, there are a few single-use or special
> purpose buses I'm going to ignore for now (eg vmbus, or
> the s390 ones). The four big bus types where controllers
> often specify a bus name and override the 'autogenerate
> unique name' handling are pci, ssi, sd, and i2c. (pci mostly
> gets away with it I expect by machines only having one pci
> bus.) Of those, I've gone through i2c. These are all the
> places where we create a specifically-named i2c bus (via
> i2c_init_bus()), together with the affected boards:
>
>    hw/arm/pxa2xx.c
>     - the PXA SoC code creates both the intended-for-use
>       i2c buses (which get auto-names) and also several i2c
>       buses intended for internal board-code use only which
>       are all given the same name "dummy".
>       Boards: connex, verdex, tosa, mainstone, akita, spitz,
>       borzoi, terrier, z2
>    hw/arm/stellaris.c
>     - The i2c controller names its bus "i2c". There is only one i2c
>       controller on these boards, so no name conflicts.
>       Boards: lm3s811evb, lm3s6965evb
>    hw/display/ati.c
>     - The ATI VGA device has an on-board i2c controller which it
>       connects the DDC that holds the EDID information. The bus is
>       always named "ati-vga.ddc", so if you have multiple of this
>       PCI device in the system the buses have the same names.
>    hw/display/sm501.c
>     - Same as ATI, but the bus name is "sm501.i2c"
>    hw/i2c/aspeed_i2c.c
>     - This I2C controller has either 14 or 16 (!) different i2c
>       buses, and it assigns them names "aspeed.i2c.N" for N = 0,1,2,...
>       The board code mostly seems to use these to wire up various
>       on-board i2c devices.
>       Boards: palmetto-bmc, supermicrox11-bmc, ast2500-evb, romulus-bmc,
>       swift-bmc, sonorapass-bmc, witherspoon-bmc, ast2600-evb,
>       tacoma-bmc, g220a-bmc, quanta-q71l-bmc, rainier-bmc
>    hw/i2c/bitbang_i2c.c
>     - the "GPIO to I2C bridge" device always names its bus "i2c".
>       Used only on musicpal, which only creates one of these buses.
>       Boards: musicpal
>    hw/i2c/exynos4210_i2c.c
>     - This i2c controller always names its bus "i2c". There are 9
>       of these controllers on the board, so they all have clashing
>       names.
>       Boards: nuri, smdkc210
>    hw/i2c/i2c_mux_pca954x.c
>     - This is an i2c multiplexer. All the child buses are named
>       "i2c-bus". The multiplexer is used by the aspeed and npcm7xx
>       boards. (There's a programmable way to get at individual
>       downstream i2c buses despite the name clash; none of the boards
>       using this multiplexer actually connect any devices downstream of
>       it yet.)
>       Boards: palmetto-bmc, supermicrox11-bmc, ast2500-evb, romulus-bmc,
>       swift-bmc, sonorapass-bmc, witherspoon-bmc, ast2600-evb,
>       tacoma-bmc, g220a-bmc, quanta-q71l-bmc, rainier-bmc,
>       npcm750-evb, quanta-gsj, quanta-gbs-bmc, kudo-bmc
>    hw/i2c/mpc_i2c.c
>     - This controller always names its bus "i2c". There is only one
>       of these controllers in the machine.
>       Boards: ppce500, mpc8544ds
>    hw/i2c/npcm7xx_smbus.c
>     - This controller always names its bus "i2c-bus". There are multiple
>       controllers on the boards. The name also clashes with the one used
>       by the pca954x muxes on these boards (see above).
>       Boards: npcm750-evb, quanta-gsj, quanta-gbs-bmc, kudo-bmc
>    hw/i2c/pm_smbus.c
>     - This is the PC SMBUS implementation (it is not a QOM device...)
>       The bus is always called "i2c".
>       Boards: haven't worked through; at least all the x86 PC-like
>       boards, I guess
>    hw/i2c/ppc4xx_i2c.c
>     - This controller always names its bus "i2c". The taihu and
>       ref405ep have only one controller, but sam460ex has two which
>       will have non-unique names.
>       Boards: taihu, ref405ep, sam460ex
>    hw/i2c/versatile_i2c.c
>     - This controller always names its bus "i2c". The MPS boards all
>       have multiples of this controller with clashing names; the others
>       have only one controller.
>       Boards: mps2-an385, mps2-an386, mps2-an500, mps2-an511,
>       mps2-an505, mps2-an521, mps3-an524, mps3-an547,
>       realview-eb, realview-eb-mpcore, realview-pb-a8, realview-pbx-a9,
>       versatileab, versatilepb, vexpress-a9, vexpress-a15
>
> In a lot of these cases I suspect the i2c controllers are
> provided either to allow connection of various internal-to-the-board
> devices, or simply so that guest OS bootup code that initializes
> the i2c controller doesn't fall over. However since there's
> nothing stopping users from creating i2c devices themselves
> on the commandline, some people might be doing that.

What are the devices they could add?  Anything they could *reasonably*
want to add?  Breaking "unreasonable" uses could be defendable.

The only spot where we set ->bus_type = TYPE_I2C_BUS is
i2c_slave_class_init().  Therefore, only the concrete subtypes of
TYPE_I2C_SLAVE can go on an i2c bus, which makes sense.  These are:

    TYPE_ADM1272            "adm1272"
    TYPE_AER915             "aer915"
    TYPE_AT24C_EE           "at24c-eeprom"
    TYPE_DS1338             "ds1338"
                            "emc1413"
                            "emc1414"
    TYPE_I2CDDC             "i2c-ddc"
    TYPE_LM8323             "lm8323"
    TYPE_M41T80             "m41t80"
    TYPE_MAX34451           "max34451"
    TYPE_MAX7310            "max7310"
    TYPE_PCA9546            "pca9546"
    TYPE_PCA9548            "pca9548"
    TYPE_PCA9552            "pca9552"
    TYPE_PXA2XX_I2C_SLAVE   "pxa2xx-i2c-slave"
    TYPE_SII9022            "sii9022"
    TYPE_SMBUS_DEVICE       "smbus-device"
    TYPE_SMBUS_EEPROM       "smbus-eeprom"
    TYPE_SMBUS_IPMI         "smbus-ipmi"
    TYPE_SSD0303            "ssd0303"
    TYPE_TMP105             "tmp105"
                            "tmp421"
                            "tmp422"
                            "tmp423"
    TYPE_TOSA_DAC           "tosa_dac"
    TYPE_TWL92230           "twl92230"
    TYPE_WM8750             "wm8750"

Grep hits in:

    hw/arm/aspeed.c
    hw/arm/musicpal.c
    hw/arm/npcm7xx_boards.c
    hw/arm/nseries.c
    hw/arm/pxa2xx.c
    hw/arm/realview.c
    hw/arm/spitz.c
    hw/arm/stellaris.c
    hw/arm/tosa.c
    hw/arm/versatilepb.c
    hw/arm/vexpress.c
    hw/arm/z2.c
    hw/audio/marvell_88w8618.c
    hw/audio/wm8750.c
    hw/display/ati.c
    hw/display/i2c-ddc.c
    hw/display/sii9022.c
    hw/display/sm501.c
    hw/display/ssd0303.c
    hw/display/xlnx_dp.c
    hw/gpio/max7310.c
    hw/i2c/i2c_mux_pca954x.c
    hw/i2c/pmbus_device.c
    hw/i2c/smbus_eeprom.c
    hw/i2c/smbus_slave.c
    hw/input/lm832x.c
    hw/ipmi/smbus_ipmi.c
    hw/misc/pca9552.c
    hw/nvram/eeprom_at24c.c
    hw/ppc/e500.c
    hw/ppc/sam460ex.c
    hw/rtc/ds1338.c
    hw/rtc/m41t80.c
    hw/rtc/twl92230.c
    hw/sensor/adm1272.c
    hw/sensor/emc141x.c
    hw/sensor/max34451.c
    hw/sensor/tmp105.c
    hw/sensor/tmp421.c
    include/hw/audio/wm8750.h
    include/hw/display/i2c-ddc.h
    include/hw/i2c/i2c_mux_pca954x.h
    include/hw/i2c/smbus_slave.h
    include/hw/input/lm832x.h
    include/hw/misc/pca9552.h
    include/hw/sensor/tmp105.h
    tests/qtest/adm1272-test.c
    tests/qtest/ds1338-test.c
    tests/qtest/emc141x-test.c
    tests/qtest/max34451-test.c
    tests/qtest/pca9552-test.c
    tests/qtest/tmp105-test.c

>
> In some of these cases (eg the i2c bus on the ATI VGA driver)
> I suspect the desired behaviour is "unique bus name based on
> a standard template, eg 'ati-vga.ddc.0/1/...'. It sounds like
> we can't do that, though.

We could add yet another case to qbus_init(): if name is non-null, and
bus->parent has a flag set, we use

    "%s.%d", name, bus->parent->num_child_bus.

"Could" doesn not imply "should".

>                           (Also they probably don't want to
> permit users to command-line plug i2c devices into it...)

Then they should massage the bus so it doesn't accept additional
devices.  Didn't you post a patch related to this recently?



  parent reply	other threads:[~2021-09-22  7:04 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-12 11:05 ensuring a machine's buses have unique names Peter Maydell
2021-08-26 13:00 ` Peter Maydell
2021-08-26 14:08 ` Markus Armbruster
2021-09-14 15:25   ` Peter Maydell
2021-09-15  4:28     ` Markus Armbruster
2021-09-21 13:20       ` Peter Maydell
2021-09-21 15:48         ` BALATON Zoltan
2021-09-22  4:37           ` Markus Armbruster
2021-09-22  9:58             ` BALATON Zoltan
2021-09-22 13:07               ` Markus Armbruster
2021-09-22  7:02         ` Markus Armbruster [this message]
2021-09-22  8:14           ` Cédric Le Goater
2021-09-22  4:46     ` Markus Armbruster

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=878rzprt3b.fsf@dusky.pond.sub.org \
    --to=armbru@redhat.com \
    --cc=f4bug@amsat.org \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.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.