On Wed, Jun 26, 2019 at 12:14:15PM +0200, Paolo Bonzini wrote: > On 26/06/19 06:46, Markus Armbruster wrote: > >> I'm not sure how to wire it together without the bus abstraction? So > >> I'll stick with the bus for now. It *is* extremely convenient! > > > > As far as I can tell offhand, a common use of bus-less connections > > between devices is wiring together composite devices. Example: > > > > static void designware_pcie_host_init(Object *obj) > > { > > DesignwarePCIEHost *s = DESIGNWARE_PCIE_HOST(obj); > > DesignwarePCIERoot *root = &s->root; > > > > object_initialize_child(obj, "root", root, sizeof(*root), > > TYPE_DESIGNWARE_PCIE_ROOT, &error_abort, > > NULL); > > qdev_prop_set_int32(DEVICE(root), "addr", PCI_DEVFN(0, 0)); > > qdev_prop_set_bit(DEVICE(root), "multifunction", false); > > } > > > > This creates a TYPE_DESIGNWARE_PCIE_ROOT device "within" the > > TYPE_DESIGNWARE_PCIE_HOST device. > > > > Bus-less connections between separate devices (i.e. neither device is a > > part of the other) are also possible. But I'm failing at grep right > > now. Here's an example for connecting a device to a machine: > > > > static void mch_realize(PCIDevice *d, Error **errp) > > { > > int i; > > MCHPCIState *mch = MCH_PCI_DEVICE(d); > > > > [...] > > object_property_add_const_link(qdev_get_machine(), "smram", > > OBJECT(&mch->smram), &error_abort); > > [...] > > } > > This is a link to a memory region. A connection to a separate device > can be found in hw/dma/xilinx_axidma.c and hw/net/xilinx_axienet.c, > where you have > > data stream <------------> data stream > / \ > dma enet > \ / > control stream <------> control stream > > where the horizontal links in the middle are set up by board code, while > the diagonal lines on the side are set up by device code. > > > Paolo, can you provide guidance on when to use a bus, and when not to? > > I would definitely use a bus if 1) it is common for the user (and not > for machine code) to set up the connection 2) the relationship is > parent-child. Link properties are basically unused on the command line, > and it only makes sense to make something different if the connection is > some kind of graph so bus-child does not cut it. >
Definitely looks like the bus is the way to go. The controller/namespace relationship is strictly parent-child. Thanks both of you for the advice! Klaus