From c095122d4b5f3152417cd97dabecfe31cc3b6508 Mon Sep 17 00:00:00 2001 From: Ray Ni Date: Wed, 29 Dec 2021 21:21:09 +0800 Subject: [PATCH] MdeModulePkg/PciBusDxe: Enumerator to check for RCiEP before looking for RP Before trying to access parent root port to check ARI capabilities, enumerator should see if Endpoint device is not Root Complex integrated to avoid undefined parent register accesses. Signed-off-by: Damian Bassa Reviewed-by: Ray Ni --- .../Bus/Pci/PciBusDxe/PciEnumeratorSupport.c | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c index ed7f2d4ac6..9251388bc2 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c @@ -2115,6 +2115,27 @@ AuthenticatePciDevice ( return EFI_SUCCESS; } +/** + Checks if PCI device is Root Bridge. + + @param PciIoDevice Instance of PCI device + + @retval TRUE Device is Root Bridge + @retval FALSE Device is not Root Bridge + +**/ +BOOLEAN +IsRootBridge ( + IN PCI_IO_DEVICE *PciIoDevice + ) +{ + if (PciIoDevice->Parent == NULL) { + return TRUE; + } else { + return FALSE; + } +} + /** Create and initialize general PCI I/O device instance for PCI device/bridge device/hotplug bridge device. @@ -2217,7 +2238,10 @@ CreatePciIoDevice ( return NULL; } - if (PcdGetBool (PcdAriSupport)) { + // + // Check if device's parent is not Root Bridge + // + if (PcdGetBool (PcdAriSupport) && !IsRootBridge (Bridge)) { // // Check if the device is an ARI device. //