On Thu, Nov 21, 2013 at 9:06 PM, Gerd Hoffmann <kra...@redhat.com> wrote: > On Do, 2013-11-21 at 13:12 +1000, Dave Airlie wrote: >> On Wed, Nov 20, 2013 at 10:02 PM, Gerd Hoffmann <kra...@redhat.com> wrote: >> > On Mi, 2013-11-20 at 15:52 +1000, Dave Airlie wrote: >> >> From: Dave Airlie <airl...@redhat.com> >> >> >> >> This is a virtio-vga device built on top of the virtio-gpu device. >> > >> > Ah, I see what you use the wrapping for. Hmm. I think you should use a >> > common base class instead, i.e. something like virtio-gpu-base which >> > holds all the common stuff. Both virtio-gpu and virtio-vga can use that >> > as TypeInfo->parent then. This way virtio-vga doesn't have to muck with >> > virtio-gpu internals. virtio-gpu-base can be tagged as abstract class >> > (using .abstract = true) so it will not be instantiated directly. >> > >> >> I'm not sure what that buys me here, I need the virtio-vga to attach >> the vga ops the first console that the virtio-gpu registers, it can't >> be a separate console, and since virtio-gpu initialises before >> virtio-vga I can't tell it to not register the console. > > virtio-gpu-core registers no consoles. It just export the hw_ops > functions. virtio-gpu-core inly initializes the stuff which is > identical for both virtio-gpu and virtio-vga, everything else is left to > the init functions of the subclasses. > > virtio-gpu uses virtio-gpu-core as parent. Registers the the consoles, > using the hw_ops functions exported by virtio-gpu-core. Also sets the > pci class to DISPLAY_OTHER. > > virtio-vga uses virtio-gpu-core as parent too. Registers the consoles, > using functions basically doing "if vgamode then call vga hw_ops else > call virtio-gpu-core hw_ops". Simliar to what you have today but > without the funky wrapping. Sets pci class to DISPLAY_VGA and > initializes vga stuff. > > cheers, > Gerd
Okay I'm really missing something here and I think I've confused myself completely. My plan was virtio-gpu-base - VirtIOGPUBase object - VirtIODevice parent_obj - abstract class - contains vqs + exposes ops virtio-gpu - virtio-gpu-base wrapper with init sequence for non-VGA virtio gpus (mmio + pci) virtio-gpu-pci - VirtIOPCIProxy parent_obj - contains a VirtIOGPU vdev that it instantiates in its instance init like all the PCI wrappers Now the advice given was to have virtio-vga wrap virtio-gpu-base but from what I can see it really can't. Since it needs to act and look like a PCI device virtio-vga: Also has a VirtIOPCIProxy parent_obj, however as virtio-gpu-base is abstract I can't directly instantiate it, and I can't instantiate virtio-gpu as its the wrong thing, so do I really need to add another class? rename virtio-vga to virtio-pci-vga and add a new virtio-vga that just wraps virtio-gpu-base? This is getting a lot messier than the code I had, and the benefits are escaping me, which must mean I'm misinterpreting the instructions given. This then led to another question how do I call the virtio-gpu-base init functions? directly? as I can't use qdev as they are abstract from what I can see. Dave.