Re: [PATCH v7 1/6] MdeModulePkg/PciHostBridge: io range is not mandatory


Ard Biesheuvel
 

On Thu, 2 Jun 2022 at 15:15, Gerd Hoffmann <kraxel@...> wrote:

Hi,

I did a quick test with both ArmVirtQemu and microvm (using this
series but omitting the MdeModulePkg), and I can confirm that not
having a I/O resource window at all seems to work fine if none of the
PCI devices have I/O BARs.

Gerd, do you remember why exactly this patch is needed? Is it related
to devices that have I/O BARs but don't actually require them to
function correctly?
Well, the difference seem to be pcie root ports. When plugging my
virtio device into the root bus everything is fine:

PCI Bus First Scanning
PciBus: Discovered PCI @ [00|00|00]

PciBus: Discovered PCI @ [00|01|00]
BAR[1]: Type = Mem32; Alignment = 0xFFF; Length = 0x1000; Offset = 0x14
BAR[4]: Type = PMem64; Alignment = 0x3FFF; Length = 0x4000; Offset = 0x20
[ ... ]
PciHostBridge: NotifyPhase (AllocateResources)
RootBridge: PciRoot(0x0)
Mem64: Base/Length/Alignment = 6000000000/100000/FFFFF - Success
Mem: Base/Length/Alignment = C0000000/100000/FFFFF - Success
PciBus: HostBridge->NotifyPhase(AllocateResources) - Success

When plugging the virtio device into a pcie root port it doesn't work
and the log looks like this:

PCI Bus First Scanning
PciBus: Discovered PCI @ [00|00|00]

PciBus: Discovered PPB @ [00|08|00]
Padding: Type = Mem32; Alignment = 0x1FFFFF; Length = 0x200000
Padding: Type = Io; Alignment = 0x1FF; Length = 0x200
BAR[0]: Type = Mem32; Alignment = 0xFFF; Length = 0x1000; Offset = 0x10

PciBus: Discovered PCI @ [01|00|00]
BAR[1]: Type = Mem32; Alignment = 0xFFF; Length = 0x1000; Offset = 0x14
BAR[4]: Type = PMem64; Alignment = 0x3FFF; Length = 0x4000; Offset = 0x20
[ ... ]
PciHostBridge: NotifyPhase (AllocateResources)
RootBridge: PciRoot(0x0)
Mem: Base/Length/Alignment = C0000000/300000/1FFFFF - Success
Mem64: Base/Length/Alignment = 6000000000/100000/FFFFF - Success
I/O: Base/Length/Alignment = FFFFFFFFFFFFFFFF/1000/FFF - Out Of Resource!
[ ... ]
PciHostBridge: NotifyPhase (AllocateResources)
RootBridge: PciRoot(0x0)
Mem64: Base/Length/Alignment = 6000000000/100000/FFFFF - Success
Mem: Base/Length/Alignment = C0000000/200000/FFFFF - Success
I/O: Base/Length/Alignment = FFFFFFFFFFFFFFFF/0/FFF - Out Of Resource!

So, it's apparently the io window of the pcie root port which causes
edk2 try allocate io resources.
This seems to be related to the padding logic, i.e., we are trying to
preserve some extra I/O space for the root port in case we hotplug
something that might need it.

The hack below gets around this - we'll need something suitable check
here that avoids I/O padding when the root port has not I/O resource
window in the first place. Care to cook something up?



--- a/OvmfPkg/PciHotPlugInitDxe/PciHotPlugInit.c
+++ b/OvmfPkg/PciHotPlugInitDxe/PciHotPlugInit.c
@@ -733,7 +733,7 @@ GetResourcePadding (
}
}

- if (DefaultIo) {
+ if (DefaultIo && FALSE) {
//
// Request defaults.
//

Join devel@edk2.groups.io to automatically receive all group messages.