]> git.proxmox.com Git - mirror_edk2.git/commit - OvmfPkg/OvmfPkg.dec
OvmfPkg: introduce PciCapPciIoLib
authorLaszlo Ersek <lersek@redhat.com>
Sat, 28 Apr 2018 21:23:10 +0000 (23:23 +0200)
committerLaszlo Ersek <lersek@redhat.com>
Thu, 24 May 2018 19:20:42 +0000 (21:20 +0200)
commit02b9a8343ffce442195ae8569b4a35424242e67e
tree1b070dfef1c12b2c34e3c8ca4c76fc9e01d2fee1
parent6a744d40d0c707b43202ae9b6a1d6ae89f6f864b
OvmfPkg: introduce PciCapPciIoLib

Add a library class, and a UEFI_DRIVER lib instance, that are layered on
top of PciCapLib, and allow clients to plug an EFI_PCI_IO_PROTOCOL backend
into PciCapLib, for config space access.

(Side note:

Although the UEFI spec says that EFI_PCI_IO_PROTOCOL_CONFIG() returns
EFI_UNSUPPORTED if "[t]he address range specified by Offset, Width, and
Count is not valid for the PCI configuration header of the PCI
controller", this patch doesn't directly document the EFI_UNSUPPORTED
error code, for ProtoDevTransferConfig() and its callers
ProtoDevReadConfig() and ProtoDevWriteConfig(). Instead, the patch refers
to "unspecified error codes". The reason is that in edk2, the
PciIoConfigRead() and PciIoConfigWrite() functions [1] can also return
EFI_INVALID_PARAMETER for the above situation.

Namely, PciIoConfigRead() and PciIoConfigWrite() first call
PciIoVerifyConfigAccess(), which indeed produces the standard
EFI_UNSUPPORTED error code, if the device's config space is exceeded.
However, if PciIoVerifyConfigAccess() passes, and we reach
RootBridgeIoPciRead() and RootBridgeIoPciWrite() [2], then
RootBridgeIoCheckParameter() can still fail, e.g. if the root bridge
doesn't support extended config space (see commit 014b472053ae3).

For all kinds of Limit violations in IO, MMIO, and config space,
RootBridgeIoCheckParameter() returns EFI_INVALID_PARAMETER, not
EFI_UNSUPPORTED. That error code is then propagated up to, and out of,
PciIoConfigRead() and PciIoConfigWrite().

[1] MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c
[2] MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c
)

Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
OvmfPkg/Include/Library/PciCapPciIoLib.h [new file with mode: 0644]
OvmfPkg/Library/UefiPciCapPciIoLib/UefiPciCapPciIoLib.c [new file with mode: 0644]
OvmfPkg/Library/UefiPciCapPciIoLib/UefiPciCapPciIoLib.h [new file with mode: 0644]
OvmfPkg/Library/UefiPciCapPciIoLib/UefiPciCapPciIoLib.inf [new file with mode: 0644]
OvmfPkg/OvmfPkg.dec