> -----Original Message----- > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of > Laszlo Ersek > Sent: Wednesday, June 5, 2019 8:00 PM > To: Chen, Marc W <marc.w.c...@intel.com>; devel@edk2.groups.io > Cc: Justen, Jordan L <jordan.l.jus...@intel.com>; Ard Biesheuvel > <ard.biesheu...@linaro.org>; Anthony Perard <anthony.per...@citrix.com>; > Julien Grall <julien.gr...@arm.com>; Marc-André Lureau > <marcandre.lur...@redhat.com>; Stefan Berger <stef...@linux.ibm.com> > Subject: Re: [edk2-devel] [PATCH] OvmfPkg/QemuVideoDxe: Shouldn't > assume system in VGA alias mode. > > On 06/05/19 13:14, Marc W Chen wrote: > > Query the supported attributes firstly, then AND (&&) both > > VGA_IO and VGA_IO_16. > > I don't think you mean "logical AND" above. > > And if you mean "bitwise AND", then "&&" is incorrect.
Thanks for the feedback, yes, I mean "bitwise AND", I'll correct it in my commit message. > > > Since the supported attributes should > > only have VGA_IO or VGA_IO_16 set, the result of AND (&&) is > > either VGA_IO or IO_16. Then the result can be passed to > > PciIo->Attributes() to set the attributes. > > I don't understand what the problem is. > > In fact, do we have two problems? Such as, > > (1) We don't consider VGA_IO_16, only VGA_IO. Are you saying that we > should consider both, and (at the same time) make sure that at most one > is set? Yes, we should consider both since the mReserveVgaAliases in PciBusDxe driver is default FALSE(implies that device driver can only set VGA_IO_16 to PCI_ROOT_BRIDGE), and Platform code may not return EFI_RESERVE_VGA_IO_ALIAS in GetPlatformPolicy of PciPlatformProtocol to make mReserveVgaAliases become TRUE(implies that device driver can only set VGA_IO to PCI_ROOT_BRIDGE), currently OvmfPkg doesn't have issue due to it has hard code value in PCI_ROOT_BRIDGE's attribute field, so an IO read by PciIoProtocol will be success due to RootBridgeIoCheckParameter of PciRootBridgeIo.c will always get pass result for legacy IO access. But in our design(Edk2Platform:Platform\Intel\MinPlatformPkg), we only set Supports field of PCI_ROOT_BRIDGE, and keep Attributes field of PCI_ROOT_BRIDGE as 0, and let device driver to update the attribute of PCI_ROOT_BRIDGE for IO accessing, in that case, if BIOS doesn't return EFI_RESERVE_VGA_IO_ALIAS in GetPlatformPolicy of PciPlatformProtocol, then only VGA_IO_16 can be enabled by device driver, so this QemuVideoDriver failed to do IO access in our case. I believe if you change the Attributes filed of PCI_ROOT_BRIDGE of OvmfPkg to 0, then you should be able to see the issue. > > (2) We don't check whether VGA_IO* is supported, we just go ahead and > enable them. Are you saying that we should check before we enable? > Yes, please refer to my above explanation. > Furthermore, > > (3) did you encounter an practical problem with the current code? If so, > can you describe it in the commit message please? The subject line helps > a little (it implies that using VGA_IO over VGA_IO_16 assumes "VGA alias > mode"), but it should be described in more detail please. Yes, please refer to my above explanation, I'll update my commit message to describe it more detail. > > > > > Signed-off-by: Marc Chen <marc.w.c...@intel.com> > > Cc: Jordan Justen <jordan.l.jus...@intel.com> > > Cc: Laszlo Ersek <ler...@redhat.com> > > Cc: Ard Biesheuvel <ard.biesheu...@linaro.org> > > Cc: Anthony Perard <anthony.per...@citrix.com> > > Cc: Julien Grall <julien.gr...@arm.com> > > Cc: Marc-André Lureau <marcandre.lur...@redhat.com> > > Cc: Stefan Berger <stef...@linux.ibm.com> > > Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=1880 > > --- > > OvmfPkg/QemuVideoDxe/Driver.c | 22 +++++++++++++++++++++- > > 1 file changed, 21 insertions(+), 1 deletion(-) > > > > diff --git a/OvmfPkg/QemuVideoDxe/Driver.c > b/OvmfPkg/QemuVideoDxe/Driver.c > > index e8a613ef33..ba9210f24b 100644 > > --- a/OvmfPkg/QemuVideoDxe/Driver.c > > +++ b/OvmfPkg/QemuVideoDxe/Driver.c > > @@ -201,6 +201,7 @@ QemuVideoControllerDriverStart ( > > PCI_TYPE00 Pci; > > QEMU_VIDEO_CARD *Card; > > EFI_PCI_IO_PROTOCOL *ChildPciIo; > > + UINT64 Supports; > > > > OldTpl = gBS->RaiseTPL (TPL_CALLBACK); > > > > @@ -277,13 +278,32 @@ QemuVideoControllerDriverStart ( > > goto ClosePciIo; > > } > > > > + // > > + // Get supported PCI attributes > > + // > > + Status = Private->PciIo->Attributes ( > > + Private->PciIo, > > + EfiPciIoAttributeOperationSupported, > > + 0, > > + &Supports > > + ); > > (4) The arguments and the closing parenthesis are incorrectly aligned, > relative to the function designator. I'll update in next patch. > > > > + if (EFI_ERROR (Status)) { > > + goto ClosePciIo; > > + } > > + > > + Supports &= (UINT64)(EFI_PCI_IO_ATTRIBUTE_VGA_IO | > EFI_PCI_IO_ATTRIBUTE_VGA_IO_16); > > + if ((Supports == 0) || (Supports == (EFI_PCI_IO_ATTRIBUTE_VGA_IO | > EFI_PCI_IO_ATTRIBUTE_VGA_IO_16))) { > > + Status = EFI_UNSUPPORTED; > > + goto ClosePciIo; > > + } > > + > > I have two comments on this: > > (5) If we need a variable for tracking just these two bits, then it > should be named something more to-the-point than just "Supports". For > example, "SupportedVgaIo" or similar. I'll update in next patch. > > (6) I'm not convinced this logic is correct, according to the UEFI spec. > The spec seems to suggest that (VGA_IO | VGA_IO_16) should not be > *enabled* at the same time. However, it doesn't seem to require that a > PciIo protocol instance report at most one of these attributes as > *supported*. As my above explanation, when Attributes field of PCI_ROOT_BRIDGE is 0, if BIOS doesn't return EFI_RESERVE_VGA_IO_ALIAS in GetPlatformPolicy of PciPlatformProtocol, then only VGA_IO_16 can be enabled by device driver, if BIOS return EFI_RESERVE_VGA_IO_ALIAS in GetPlatformPolicy of PciPlatformProtocol, then only VGA_IO can be enabled by device driver, you can check the PciSetDeviceAttribute of PciEnumeratorSupport.c of PciBusDxe driver for detail. > > The spec says, near VGA_IO_16, "This bit may not be combined with > EFI_PCI_IO_ATTRIBUTE_VGA_IO [...]". I'm unsure whether this applies to > both EfiPciIoAttributeOperationSupported and > EfiPciIoAttributeOperationEnable. > > I think we have two options here: > - if the spec guarantees this exclusion, then we can either drop the > "both set" check, or even ASSERT that it never happens > - if the spec does not guarantee the exclusion, then we should pick > VGA_IO_16 first, and VGA_IO second (in this priority order). > > I think the last option is the most robust one. Thanks for your reply, I think your first option is good enough since PciBusDxe driver has guaranteed this exclusion. > > Thanks, > Laszlo > > > // > > // Set new PCI attributes > > // > > Status = Private->PciIo->Attributes ( > > Private->PciIo, > > EfiPciIoAttributeOperationEnable, > > - EFI_PCI_DEVICE_ENABLE | > EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY | EFI_PCI_IO_ATTRIBUTE_VGA_IO, > > + EFI_PCI_DEVICE_ENABLE | > EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY | Supports, > > NULL > > ); > > if (EFI_ERROR (Status)) { > > > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#41976): https://edk2.groups.io/g/devel/message/41976 Mute This Topic: https://groups.io/mt/31935803/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-