On Sun, May 03, 2020 at 11:13:41PM +0100, Mark Cave-Ayland wrote: > On 02/05/2020 06:47, Markus Armbruster wrote: > > > Mark Cave-Ayland <mark.cave-ayl...@ilande.co.uk> writes: > > > >> On 30/04/2020 16:20, Markus Armbruster wrote: > >> > >>>> Ah I see now, these aliases are for individual properties rather than > >>>> objects. What I > >>>> was trying to ask was if it were possible to have something like this: > >>>> > >>>> /machine (SS-5-machine) > >>>> /builtin > >>>> /nic0 -> link to "lance" device > >>>> > >>>> Here nic0 is an alias "published" by the maintainer of the SS-5 machine > >>>> which is > >>>> configured in the machine init() function using > >>>> object_property_add_link() or a > >>>> suitable wrapper. Users can then configure these builtin devices from > >>>> the command > >>>> line using your -machine nic0.netdev=my-netdev-id syntax or similar. > >>> > >>> Got it now, thanks! > >>> > >>>> Having the default devices under /builtin or other known QOM path would > >>>> enable > >>>> builtin devices to be easily enumerated programatically and/or from the > >>>> command line > >>>> as required. > >>> > >>> There are three standard containers under /machine/: > >>> > >>> * /machine/peripheral/ > >>> > >>> Devices with a user-specified ID go here, as /machine/peripheral/ID. > >>> User-specified means -device or device_add. > >>> > >>> /machine/peripheral/ID is effectively a stable interface. It's just > >>> underdocumented (undocumented?). > >>> > >>> To be useful, the stuff below ID/ needed to be stable and documented, > >>> too. > >>> > >>> * /machine/peripheral-anon/ > >>> > >>> Same, but user elected not to give an ID. > >>> /machine/peripheral-anon/device[N], where N counts up from zero in > >>> creation order. > >>> > >>> N is obviously not stable, but this is a problem of the user's making. > >>> If you want to refer to a device, give it an ID. > >>> > >>> * /machine/unattached/ > >>> > >>> The orphanage. When a device has no parent when its realized, it gets > >>> put here, as /machine/unattached/device[N], where N counts up from > >>> zero in realization order. > >>> > >>> N is obviously not stable, and this time we can't blame the > >>> victim^Wuser. You can search for devices of a certain type. > >>> Sometimes that's good enough. > >>> > >>> All the onboard devices are here, and much more. We've fathered a lot > >>> of unloved red-headed children, it seems... > >>> > >>> Some of the "much more" is due to sloppy modelling, i.e. neglecting to > >>> set the proper parent. > >>> > >>> I figure we could put onboard devices in a nicer place, with nicer > >>> names. Need a convention for the place and the names, then make board > >>> code conform to it. > >> > >> That's good, it seems that this is already fairly close to how it works > >> for -device > >> at the moment. > >> > >> I don't think that it is possible to come up a single place for on-board > >> devices to > >> live directly though. Going back to one of my first examples: wiring up a > >> chardev to > >> a serial port on the macio device. To me it makes sense for that to exist > >> in QOM > >> under /machine/pci-bus/mac-io/escc. In contrast an in-built NIC could live > >> under > >> /machine/pci-bus/in-built/nic, and placing one or both of these devices > >> directly > >> under /machine/foo doesn't feel intuitive. > > > > I'm not familiar with this machine. You make me suspect the serial > > thingy is a component of a larger device. > > > > Properly modelled, a composite device has its components as children. > > These appear below their parent in the QOM composition tree. > > > > Example: a "serial-isa" device has a "serial" component. When the > > former is at /machine/unattached/device[28]/, the latter is at > > /machine/unattached/device[28]/serial/. > > > > I guess that's what you want for macio's serial port. > > > > Counter-example: a "isa-super-io" device has compoenents of type > > "isa-parallel", "isa-serial", "isa-fdc", "i8042", "isa-ide". > > Nevertheless, these appear next to their parent in /machine/unattached/. > > I'm still too much of a QOM ignoramus to explain why that's so. Paolo, > > can you? > > FWIW the older machines have a lot of calls to qdev_create(NULL, TYPE_FOO) for > devices that are part of the machine because they live within the machine > address > space but are not specifically attached to a qbus. > > >> AFAIK as per your ARM virt example I believe it is only possible to > >> register an alias > >> for a property rather than for an Object? The ultimate aim would be for > >> object_resolve_path("/machine/builtin/nic0") and > >> object_resolve_path("/machine/pci-bus/in-built/nic") to return the same > >> Object, and > >> for the aliases on built-in devices to be children of /machine/builtin to > >> allow easy > >> iteration and introspection. > > > > Paolo, could link properties achieve that? > > > > Mark, I guess you want the alias / link from builtin/nic0 to the actual > > place to simplify configuration: the user then needs to know less about > > the board. Correct? > > Correct. In a perfect world I'd love to say that Daniel's suggestion to use > QOM paths > would work, however from my experience they change far too much. This is one > of the > reasons that the TYPE_FW_PATH_PROVIDER interface exists so that the > generation of > (boot) paths for the firmware is separate from the QOM/qdev paths. > > I don't feel too strongly whether it's a link property, some kind of alias, or > perhaps like OpenFirmware just a string property containing the QOM path to > the > device, since ultimately I imagine there would be wrapper functions for > machine > init() to call which hide away the implementation details.
Whatever solution we use to make sure a new interface is stable, we must have automated test cases to ensure we don't break it in the future. Otherwise we will be creating yet another compatibility-keeping ritual that we fail to follow because nobody notices when we break it. I wouldn't like to move from "2 different object paths that can't be trusted to be stable" to "3 different object paths that can't be trusted to be stable". -- Eduardo