On 06/30/2016 11:47 AM, Laszlo Ersek wrote:
On 06/30/16 18:39, Marcel Apfelbaum wrote:
On 06/30/2016 07:21 PM, Marcel Apfelbaum wrote:
On 06/30/2016 04:07 PM, Laszlo Ersek wrote:
Hi,
does anyone on this list have experience with $SUBJECT, using physical
UEFI firmware derived from edk2?
The problem we're seeing with OVMF is the following: PCIe hotplug works
with PCIe root ports, but it doesn't work with PCIe downstream ports.
The error messages reported by both Linux and Windows guests indicate
"lack of resources" for the device being plugged.
In my understanding:
* Each PCIe downstream port qualifies as a separate bus / bridge.
* Bridges need IO and MMIO resources for themselves. When a device is
behind a bridge at boot, the device's IO and MMIO BARs are carved out
of the bridge's IO and MMIO apertures. For IO, the standard bridge
aperture size is 4096 (byte-sized) ports.
* If no device behind a bridge needs a specific type of resource (for
example, no devices behind a bridge have IO BARs), then that kind of
aperture is not necessary for the bridge either.
A special case of this is when there are no devices behind a bridge
at all. Example: PCIe downstream port empty at boot. In this case,
the bridge needs no resources at all, at boot.
* Different firmwares seem to follow different policies in the last
case (-> bridge empty at boot). SeaBIOS for example allocates the
0x1000 IO ports nonetheless. The PCI bus driver in edk2 does not: it
allocates no apertures for bridges that have no devices behind them
at boot.
This appears to be a trade-off: if the bridge remains empty for the
entire lifetime of the OS, then any IO ports that have been allocated
in advance will be in vain (wasted). However, if the aperture is not
allocated at boot, then hotplug under the bridge may not work --
resources for the device being hot-plugged cannot be allocated from
nonexistent bridge apertures.
Hi Laszlo,
I fully agree with your assessment.
From the firmware point of view it seems like a waste to allocate an
IO/MEM range for
an unused PCI/PCIe-bridge indeed. Especially IO.
But what about MEM?
Let's have a look to this special case: PCIe downstream ports on
64-bit systems.
1. PCIe spec requires devices to work correctly even without enabling
their IO BARs.
2. 64-bit Memory space is pretty large, decent CPUs support 46-bit
addresses, so even if the system uses Terabytes of RAM
and has dozens of switches we still have enough unused MEM space.
My point is we can skip assigning IO for PCIe ports but we can assign
a 4K MEM range in 64-bit memory for them
without being too greedy.
I meant 2M MEM range, sorry. 4k is the min range for IO, of course.
One thing to watch out for is prefetchable vs. non-prefetchable MEM
ranges. On Intel chipsets, the high (64-bit) MMIO range is always
prefetchable, which mainly makes it useful for frame buffers,
accelerator cards with RAM mapped to MMIO in the host, and the like.
Only the low (32-bit) MMIO space is non-prefetchable, and suitable for
registers and things which need precise ordering of loads and stores.
So you can demote a prefetchable BAR into non-prefetchable MMIO space if
necessary, but not the other way around. Which is a shame, because the
32-bit MMIO space is much more limited in size than the 64-bit space.
I've just been looking at the values reserved by SeaBIOS [src/fw/pciinit.c]:
#define PCI_BRIDGE_MEM_MIN (1<<21) // 2M == hugepage size
#define PCI_BRIDGE_IO_MIN 0x1000 // mandated by pci bridge spec
2MB sounds perfectly fine for MEM, especially given that OVMF supports a
64-bit MMIO aperture (32GB in size by default).
We discussed the IO size earlier -- I think 4K is overkill (despite
being required by the standard). We considered half K, 1K, 2K earlier...
I think I'll take a stab at half K first.
It depends on what your hardware (physical or virtual) supports. A
standards-compliant bridge may not be able to map I/O ports to targets
on less than a 4k boundary. Yes, 4k is ridiculous overkill, but it may
be your only choice, depending on the details of the h/w and/or VMM.
We've had to add special cases in BIOS for certain cards we support
which request IO space, but don't actually use it. We can safely skip
allocating IO ports to those cards, saving significant space in the
overall IO port map. We've worked with the card vendors on cleaning up
their PCIe advertisements and eliminating the use of IO ports, but it
takes time.
--
Brian
--------------------------------------------------------------------
"My software never has bugs. It just develops random features."
-- Quoted by Khan Tran
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel