On Thu, Aug 18, 2011 at 05:18:46PM +0200, Marc-André Lureau wrote: > Hi > > I have started looking at: https://bugzilla.redhat.com/show_bug.cgi?id=725670 > > My initial thought was to just add a new type of controller: > > <controller type='usb2' index='0'/> > > But it also needs the 3 companion UHCI controllers (see bug). We can > either include them implicitely (not really elegant in libvirt, but > doable), or with more flexibility list all the controllers in the XML: > > <controller type='ich9-usb-ehci1' index='0'/> > <controller type='ich9-usb-uhci1' index='0' masterbus='0' firstport='0'> > <controller type='ich9-usb-uhci2' index='0' masterbus='0' firstport='2'> > <controller type='ich9-usb-uhci3' index='0' masterbus='0' firstport='4'> > > Any other idea? > Daniel, have you also started working on USB2 & usb-redir support? I'm not actively doing any work on it, merely experimenting with QEMU to understand how everything fits together. There are some key observations I have - A guest can have multiple USB controllers, either USB1 or USB2. The USB1 controller may be a function on the PIIX, or it may be a dedicate card - Since the companion controllers have associated PCI addresses, we must represent them explicitly in the XML, so it is clear to apps what PCI slots/functions are used. - Historically QEMU would auto-create hubs. For migration stability we must not let it do this. We must create any neccessary hubs ourself. - QEMU does not currently have any USB2 hub, and when it does, it will likely be USB2 only, no USB1 support. This makes hubs less desirable than multiple controllers, since you'd need to choose between USB1 or USB2 when creating the hub, while a controller can dynamically switch between USB1 & 2 thanks to the companion controllers. - Since there can be multiple controllers, we need a way specify physical addressing for USB devices, to ensure stablility across migration and hotplug/unplug. This needs to include the controller index, and the port number. The control index needs to span across USB1 and USB2 controllers. What all this means.... 1. Add a new controller type 'usb' <controller type='usb' index='0' /> 2. Add a 'model' for the usb controller type, allowing things like piix3-uhci, uhci, ich9-ehci, etc. If none is specified, then we need to auto-fill the basic default (piix3-uchi). <controller type='usb' index='0' model='ich9-ehci'/> 3. A USB controller will have a PCI address child element. <controller type='usb' index='0' model='ich9-ehci'> <address type='pci' domain='0' bus='0' slot='4' function='7'/> </controller> 4. All USB devices will gain a new USB address child element. <input type='tablet' bus='usb'> <address type='usb' bus='0' port='4'/> </input> 5. USB companion controllers use type='usb' too, but with an extra 'master' attribute to associate them <controller type='usb' index='0' model='ich9-ehci'> <address type='pci' domain='0' bus='0' slot='4' function='7'/> </controller> <controller type='usb' index='0' model='ich9-ehci1'> <master startport='0'/> <address type='pci' domain='0' bus='0' slot='4' function='1'/> </controller> <controller type='usb' index='0' model='ich9-uhci2'> <master startport='2'/> <address type='pci' domain='0' bus='0' slot='4' function='2'/> </controller> <controller type='usb' index='0' model='ich9-uhci3'> <master startport='4'/> <address type='pci' domain='0' bus='0' slot='4' function='2'/> </controller> 6. A USB hub should appear as a normal device <hub type='usb'> <address type='usb' bus='0' port='1'/> </hub> 7. A USB device address port should include the hub path eg. Plug a hub into port 1 of the first USB bus <hub type='usb'> <address type='usb' bus='0' port='1'/> </hub> then put a device and another hub into that hub: <input type='mouse' type='usb'> <address type='usb' bus='0' port='1.1'/> </hub> <hub type='usb'> <address type='usb' bus='0' port='1.2'/> </hub> Finally add 2 more devices into the second hub <input type='mouse' type='usb'> <address type='usb' bus='0' port='1.2.1'/> </hub> <input type='mouse' type='usb'> <address type='usb' bus='0' port='1.2.2'/> </hub> 7. If no USB controller is in the XML, we need to prefill the default PIIX3 controller 8. If no USB addresses are specified, we should autoassign addrs starting against the first controller. A complex example. We create the default USB1 controllers, and two USB2 controllers. We put a USB tablet on the USB1 controller, and then create a USB smartcards on one of the USB2 controllers, and assign two host devices to the other USB2 controller: <controller type='usb' index='0' model='piix3-uhci'> <address type='pci' domain='0' bus='0' slot='1' function='3'/> </controller> <controller type='usb' index='1' model='ich9-ehci'> <address type='pci' domain='0' bus='0' slot='4' function='7'/> </controller> <controller type='usb' index='0' model='ich9-ehci1'> <master startport='0'/> <address type='pci' domain='0' bus='0' slot='4' function='1'/> </controller> <controller type='usb' index='0' model='ich9-uhci2'> <master startport='2'/> <address type='pci' domain='0' bus='0' slot='4' function='2'/> </controller> <controller type='usb' index='0' model='ich9-uhci3'> <master startport='4'/> <address type='pci' domain='0' bus='0' slot='4' function='3'/> </controller> <controller type='usb' index='2' model='ich9-ehci'> <address type='pci' domain='0' bus='0' slot='5' function='7'/> </controller> <controller type='usb' index='2' model='ich9-ehci1'> <master startport='0'/> <address type='pci' domain='0' bus='0' slot='5' function='1'/> </controller> <controller type='usb' index='2' model='ich9-uhci2'> <master startport='2'/> <address type='pci' domain='0' bus='0' slot='5' function='2'/> </controller> <controller type='usb' index='2' model='ich9-uhci3'> <master startport='4'/> <address type='pci' domain='0' bus='0' slot='5' function='3'/> </controller> <input type='tablet' bus='usb'> <address type='usb' bus='0' port='4'/> </input> <smartcard> <address type='usb' bus='1' port='1'/> </input> <hostdev mode=subsys type=usb> <source> <address bus='14' device='6'/> </source> <address type='usb' bus='2' port='1'/> </input> <hostdev mode=subsys type=usb> <source> <address bus='14' device='6'/> </source> <address type='usb' bus='2' port='2'/> </input> Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list