[edk2] [PATCH 0/7] OvmfPkg/PciHotPlugInitDxe: obey PCI resource reservation hints from QEMU

Laszlo Ersek posted 7 patches 7 years, 3 months ago
Failed in applying to current master (apply log)
MdePkg/Include/IndustryStandard/Pci23.h                      |  10 +
OvmfPkg/Include/IndustryStandard/QemuPciBridgeCapabilities.h |  60 ++
OvmfPkg/PciHotPlugInitDxe/PciHotPlugInit.c                   | 661 ++++++++++++++++++--
OvmfPkg/PciHotPlugInitDxe/PciHotPlugInit.inf                 |   6 +-
4 files changed, 674 insertions(+), 63 deletions(-)
create mode 100644 OvmfPkg/Include/IndustryStandard/QemuPciBridgeCapabilities.h
[edk2] [PATCH 0/7] OvmfPkg/PciHotPlugInitDxe: obey PCI resource reservation hints from QEMU
Posted by Laszlo Ersek 7 years, 3 months ago
Repo:   https://github.com/lersek/edk2.git
Branch: pci_resource_reserve

"OvmfPkg/PciHotPlugInitDxe" implements EFI_PCI_HOT_PLUG_INIT_PROTOCOL
from the PI spec. Currently it returns fixed resource reservations (512B
IO space and 2MB non-prefetchable 32-bit MMIO space) for all bridges.
This is not flexible enough:

(1) For PCI Express bridges (such as root ports and downstream ports),
reserving any IO space is wasteful, and limits the number of ports.
(This is because each such port can only accept one (multi-function)
device, and because the 512B reservation is rounded up to 4KB, and
because the IO space under OVMF/Q35 consists of 10 * 4KB.)

(2) For hot-plugging PCI Express devices with large MMIO BARs into such
ports, the reservation of only 2MB MMIO (and even that limited to
non-prefetchable, hence 32-bit, address space) is insufficient.

QEMU has recently gained the ability to control these reservation sizes
on the command line. At this point the hints are only supported for the
"pcie-root-port" device -- which implies the Q35 machine type, given
that i440fx only supports conventional PCI, not PCI Express --, with the
following properties:

- pcie-root-port.bus-reserve=uint32
- pcie-root-port.io-reserve=size
- pcie-root-port.mem-reserve=size
- pcie-root-port.pref32-reserve=size
- pcie-root-port.pref64-reserve=size

The hints are exposed to the guest in the conventional config space of
the device, using a vendor-specific capability (which is documented in
the QEMU source tree; see all references in the individual patches). It
is expected that, if any future hotplug controllers in QEMU gain the
same ability, they will reuse the mechanism identically.

This series generally implements the parsing of this capability in
OvmfPkg/PciHotPlugInitDxe, and the translation thereof to the ACPI
address space descriptor format that the Platform Init spec defines for
EFI_PCI_HOT_PLUG_INIT_PROTOCOL.GetResourcePadding().

The first patch is for "MdePkg/IndustryStandard"; it introduces the
vendor-specific capability header, from the PCI 2.3 spec. The rest of
the patches is for OvmfPkg.

Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Marcel Apfelbaum <marcel@redhat.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Ruiyu Ni <ruiyu.ni@intel.com>

Thanks
Laszlo

Laszlo Ersek (7):
  MdePkg/IndustryStandard/Pci23: add vendor-specific capability header
  OvmfPkg/IndustryStandard: define PCI Capabilities for QEMU's PCI
    Bridges
  OvmfPkg/PciHotPlugInitDxe: clean up protocol usage comment
  OvmfPkg/PciHotPlugInitDxe: clean up addr. range for non-prefetchable
    MMIO
  OvmfPkg/PciHotPlugInitDxe: generalize RESOURCE_PADDING composition
  OvmfPkg/PciHotPlugInitDxe: add helper functions for setting up
    paddings
  OvmfPkg/PciHotPlugInitDxe: translate QEMU's resource reservation hints

 MdePkg/Include/IndustryStandard/Pci23.h                      |  10 +
 OvmfPkg/Include/IndustryStandard/QemuPciBridgeCapabilities.h |  60 ++
 OvmfPkg/PciHotPlugInitDxe/PciHotPlugInit.c                   | 661 ++++++++++++++++++--
 OvmfPkg/PciHotPlugInitDxe/PciHotPlugInit.inf                 |   6 +-
 4 files changed, 674 insertions(+), 63 deletions(-)
 create mode 100644 OvmfPkg/Include/IndustryStandard/QemuPciBridgeCapabilities.h

-- 
2.14.1.3.gb7cf6e02401b

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Re: [edk2] [PATCH 0/7] OvmfPkg/PciHotPlugInitDxe: obey PCI resource reservation hints from QEMU
Posted by Laszlo Ersek 7 years, 2 months ago
On 09/25/17 21:58, Laszlo Ersek wrote:
> Repo:   https://github.com/lersek/edk2.git
> Branch: pci_resource_reserve
> 
> "OvmfPkg/PciHotPlugInitDxe" implements EFI_PCI_HOT_PLUG_INIT_PROTOCOL
> from the PI spec. Currently it returns fixed resource reservations (512B
> IO space and 2MB non-prefetchable 32-bit MMIO space) for all bridges.
> This is not flexible enough:
> 
> (1) For PCI Express bridges (such as root ports and downstream ports),
> reserving any IO space is wasteful, and limits the number of ports.
> (This is because each such port can only accept one (multi-function)
> device, and because the 512B reservation is rounded up to 4KB, and
> because the IO space under OVMF/Q35 consists of 10 * 4KB.)
> 
> (2) For hot-plugging PCI Express devices with large MMIO BARs into such
> ports, the reservation of only 2MB MMIO (and even that limited to
> non-prefetchable, hence 32-bit, address space) is insufficient.
> 
> QEMU has recently gained the ability to control these reservation sizes
> on the command line. At this point the hints are only supported for the
> "pcie-root-port" device -- which implies the Q35 machine type, given
> that i440fx only supports conventional PCI, not PCI Express --, with the
> following properties:
> 
> - pcie-root-port.bus-reserve=uint32
> - pcie-root-port.io-reserve=size
> - pcie-root-port.mem-reserve=size
> - pcie-root-port.pref32-reserve=size
> - pcie-root-port.pref64-reserve=size
> 
> The hints are exposed to the guest in the conventional config space of
> the device, using a vendor-specific capability (which is documented in
> the QEMU source tree; see all references in the individual patches). It
> is expected that, if any future hotplug controllers in QEMU gain the
> same ability, they will reuse the mechanism identically.
> 
> This series generally implements the parsing of this capability in
> OvmfPkg/PciHotPlugInitDxe, and the translation thereof to the ACPI
> address space descriptor format that the Platform Init spec defines for
> EFI_PCI_HOT_PLUG_INIT_PROTOCOL.GetResourcePadding().
> 
> The first patch is for "MdePkg/IndustryStandard"; it introduces the
> vendor-specific capability header, from the PCI 2.3 spec. The rest of
> the patches is for OvmfPkg.
> 
> Cc: Jordan Justen <jordan.l.justen@intel.com>
> Cc: Liming Gao <liming.gao@intel.com>
> Cc: Marcel Apfelbaum <marcel@redhat.com>
> Cc: Michael D Kinney <michael.d.kinney@intel.com>
> Cc: Ruiyu Ni <ruiyu.ni@intel.com>
> 
> Thanks
> Laszlo
> 
> Laszlo Ersek (7):
>   MdePkg/IndustryStandard/Pci23: add vendor-specific capability header
>   OvmfPkg/IndustryStandard: define PCI Capabilities for QEMU's PCI
>     Bridges
>   OvmfPkg/PciHotPlugInitDxe: clean up protocol usage comment
>   OvmfPkg/PciHotPlugInitDxe: clean up addr. range for non-prefetchable
>     MMIO
>   OvmfPkg/PciHotPlugInitDxe: generalize RESOURCE_PADDING composition
>   OvmfPkg/PciHotPlugInitDxe: add helper functions for setting up
>     paddings
>   OvmfPkg/PciHotPlugInitDxe: translate QEMU's resource reservation hints
> 
>  MdePkg/Include/IndustryStandard/Pci23.h                      |  10 +
>  OvmfPkg/Include/IndustryStandard/QemuPciBridgeCapabilities.h |  60 ++
>  OvmfPkg/PciHotPlugInitDxe/PciHotPlugInit.c                   | 661 ++++++++++++++++++--
>  OvmfPkg/PciHotPlugInitDxe/PciHotPlugInit.inf                 |   6 +-
>  4 files changed, 674 insertions(+), 63 deletions(-)
>  create mode 100644 OvmfPkg/Include/IndustryStandard/QemuPciBridgeCapabilities.h
> 

Thanks All for the feedback, pushed as commit range
9425b34925d0..fe4049471bdf.

Laszlo
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel