On Thu, May 10, 2012 at 12:24 PM, Evgeny Voevodin <e.voevo...@samsung.com> wrote: > Hi, guys! > > While trying to refactor virtio-pci as continuation of my RFC > virtio-mmio patch series: > http://lists.gnu.org/archive/html/qemu-devel/2012-04/msg03665.html > I've faced a problem. > > I try to create virtio-pci-transport device to which virtio-blk,net,etc > could be connected. Any board could create as many transport devices as > it wants and then any actual back-end could be connected to that > transport through a provided virtio-pci.x bus. virtio-pci-transport is > derived from TYPE_PCI_DEVICE. > The problem is that if I create transport devices and wish to connect > back-ends to them, each back-end would set its properties to the class, > not to the object. > For example, vendor_id property is different for blk and net, but since > they are both have same class PCIDeviceClass, they share that property. > > How to deal with this?
I think you are asking how a virtio-pci adapter can have device_id value that depends on its VirtioDevice (not known at compile-time and different between virtio-pci adapters). You should be able to set the PCI device ID at runtime: pci_config_set_device_id(pci_dev->config, device_id_from_virtio_device); Take a look at hw/pci.c:pci_qdev_init(). The order of operations is important: 1. do_pci_register_device() sets up default values from PCIDeviceClass. 2. ->init(pci_dev) gets called, this is where your init code gets executed. So it should be fine to set the PCI device ID at runtime from VirtioPCIAdapter::init(). Stefan