(+ Leif) On 24 May 2017 at 01:34, Scott Telford <[email protected]> wrote: > Hi Ard, > > Firstly, this patch was meant for my edk2-staging branch, not mainline edk2 - > sorry, forgot to edit the subject line! >
Ah ok. In that case, do whatever you like :-) > The issue is that, without this workaround, PCI(e) bridges and devices will > be detected multiple times during bus scanning, e.g. a bridge at bus 1 device > 0 will also be seen at bus 1 device 1, bus 1 device 2 etc and hence all the > devices on the other side of the bridge will be duplicated too. I copied this > workaround from the old Juno PCIe driver as I was seeing the same problem > when I was testing the Cadence PCIe host bridge library I have been working > on. I agree there should probably be a more elegant solution, but I don't > know the generic PCI driver code well enough to suggest one at the moment. > As I said, the workaround belongs in PciExpressLib. You can just clone that and put the workaround in there. Interestingly, though, this PCIe IP works fine with the generic ECAM driver in Linux, so I wonder what the difference is. Leif, were you aware of this issue? >> -----Original Message----- >> From: Ard Biesheuvel [mailto:[email protected]] >> Sent: 23 May 2017 17:42 >> To: Scott Telford <[email protected]> >> Cc: [email protected] <[email protected]>; Tian, Feng >> <[email protected]>; Zeng, Star <[email protected]> >> Subject: Re: [edk2] [PATCH] Copy bus scanning workaround from ARM Juno >> PCIe driver. >> >> On 23 May 2017 at 09:15, Scott Telford <[email protected]> wrote: >> > Copy workaround previously in >> > >> ArmPlatformPkg/ArmJunoPkg/Drivers/PciHostBridgeDxe/PciRootBridge.c:Pci >> RbPciRead() >> > to RootBridgeIoPciAccess(), to avoid spurious multiple detections when >> > scanning buses. >> > >> > Contributed-under: TianoCore Contribution Agreement 1.0 >> > Signed-off-by: Scott Telford <[email protected]> >> > --- >> > MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c | 13 >> +++++++++++++ >> >> This does not belong in the generic driver. >> >> Could you please explain in more detail what the issue is? In any >> case, we will need to put this workaround in a Juno specific >> implementation of PciExpressLib >> >> > 1 file changed, 13 insertions(+) >> > >> > diff --git a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c >> b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c >> > index a0e7e5b..3cca3c1 100644 >> > --- a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c >> > +++ b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c >> > @@ -945,6 +945,19 @@ RootBridgeIoPciAccess ( >> > PciAddress.ExtendedRegister = PciAddress.Register; >> > } >> > >> > + // The UEFI PCI enumerator scans for devices at all possible addresses, >> > + // and ignores some PCI rules - this results in some hardware being >> > + // detected multiple times. We work around this by faking absent >> > + // devices >> > + if ((PciAddress.Bus == 0) && ((PciAddress.Device != 0) || >> (PciAddress.Function != 0))) { >> > + *((UINT32 *)Buffer) = 0xffffffff; >> > + return EFI_SUCCESS; >> > + } >> > + if ((PciAddress.Bus == 1) && ((PciAddress.Device != 0) || >> (PciAddress.Function != 0))) { >> > + *((UINT32 *)Buffer) = 0xffffffff; >> > + return EFI_SUCCESS; >> > + } >> > + >> > Address = PCI_SEGMENT_LIB_ADDRESS ( >> > RootBridge->RootBridgeIo.SegmentNumber, >> > PciAddress.Bus, >> > -- >> > 2.2.2 >> > >> > _______________________________________________ >> > edk2-devel mailing list >> > [email protected] >> > https://urldefense.proofpoint.com/v2/url?u=https- >> 3A__lists.01.org_mailman_listinfo_edk2- >> 2Ddevel&d=DwIBaQ&c=aUq983L2pue2FqKFoP6PGHMJQyoJ7kl3s3GZ- >> _haXqY&r=0b2qZ7fqn6FWL0d7Bhx7saDL- >> B7sx3Cxz3HPARO7ozc&m=7SGL_JTC4ZjVpm7zTv_uO5MHMY48vYsBzhKmKB >> q66zw&s=W6S9XFt8B-FdfcvWjCtvHTGo3uddEyMfM6BIEMe8dtY&e= _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

