On Thu, 2 Jun 2022 at 15:15, Gerd Hoffmann <kra...@redhat.com> 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. // -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#90161): https://edk2.groups.io/g/devel/message/90161 Mute This Topic: https://groups.io/mt/91495635/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-