On Wed, 2022-06-08 at 12:49 +0200, Gerd Hoffmann wrote:
> On Tue, Jun 07, 2022 at 09:37:21AM -0600, Kevin Locke wrote:
>> With QEMU 7.0.0 and SeaBIOS 1.16.0, virtual machines with a PCIe
>> graphics card connected to a PCIe Root Port, rather than the Root
>> Complex, as recommended by the QEMU PCI Express Guidelines[1], are
>> unable to use VESA BIOS Extensions display modes.  For example,
> 
>> Am I correct in assuming this is a limitation of SeaVGABIOS?
> 
> Well, sort of.  There are two ways to reach the registers needed for
> the extended display modes, via ioports 0x01ce,0x01cf or via mmio bar
> (see docs/specs/standard-vga.txt in qemu source tree).
> 
> The ioport access is not forwarded over pci(e) bridges, the special
> exception bit for vga register access applies to the classic vga
> registers only not the vbe registers.
> 
> vgabios functions must be able to run in real mode, so it uses the
> ioports, because they are easily reachable.
> 
> ovmf driver runs in 32bit or 64bit anyway, so using the mmio bar is no
> problem and the driver prefers that if available.  Therefore it is
> possible to plug vga devices into a pcie root port (although I think
> it doesn't work for qxl due to mmio bar not being available there).
> 
> > If it's unlikely to change soon, would
> > it make sense for me to propose documenting this limitation in the
> > QEMU PCI Express Guidelines?
> 
> Yes, it makes sense to add an exception note there.  VGA devices should
> be placed on the root bus to make sure they are fully functional
> (libvirt does that by default btw).
> 
> When using UEFI it is possible to pick a device without vga
> compatibility (i.e. bochs-display or virtio-gpu-pci).  The legacy vga
> stuff (text mode and lowres graphics) wouldn't be used anyway ...

Thanks Gerd, I really appreciate the explanation!  I've tried to
incorporate your explanation in a patch to the QEMU PCI Express
Guidelines that I posted to qemu-devel for discussion.[1]  Feel free
to follow up there with any improvements or if I've misunderstood
anything.

Re: libvirt.  Interestingly, libvirt only appears to do so for the
first/primary display device.[2]  I ran into this issue after adding a
second video device to a VM in virt-manager, then removing the first,
which left the only video device on a Root Port leading to the missing
display modes.  I'm not sure if it's a bug worth filing/fixing.  Let
me know if you have any thoughts on it.

Thanks again,
Kevin

[1]: 
https://lore.kernel.org/qemu-devel/922cc3081ff9c986188f881ef4d1cf15bd3adf48.1654739990.git.ke...@kevinlocke.name/T/#u
[2]: 
https://gitlab.com/libvirt/libvirt/-/blob/v8.4.0/src/qemu/qemu_domain_address.c#L1825-1858
_______________________________________________
SeaBIOS mailing list -- seabios@seabios.org
To unsubscribe send an email to seabios-le...@seabios.org

Reply via email to