REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1169
Current code checks HeaderType of Function 0 even Function 0 is not implemented. HeaderType value will be 0xFF if Function 0 is not implemented, then MaxFunction will be set to PCI_MAX_FUNC + 1. The code can be optimized to only check HeaderType if Function 0 is implemented. Test done: With this patch, the result is same with the result after the patch at https://lists.01.org/pipermail/edk2-devel/2018-September/029623.html. Cc: Jiewen Yao <jiewen....@intel.com> Cc: Rangasai V Chaganty <rangasai.v.chaga...@intel.com> Cc: Tomson Chang <tomson.ch...@intel.com> Cc: Jenny Huang <jenny.hu...@intel.com> Cc: Amy Chan <amy.c...@intel.com> Cc: Ruiyu Ni <ruiyu...@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Star Zeng <star.z...@intel.com> --- IntelSiliconPkg/Feature/VTd/IntelVTdDxe/PciInfo.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/PciInfo.c b/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/PciInfo.c index 305995de032c..6ae5df589c1e 100644 --- a/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/PciInfo.c +++ b/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/PciInfo.c @@ -231,19 +231,13 @@ ScanPciBus ( UINT8 HeaderType; UINT8 BaseClass; UINT8 SubClass; - UINT32 MaxFunction; UINT16 VendorID; UINT16 DeviceID; EFI_STATUS Status; // Scan the PCI bus for devices - for (Device = 0; Device < PCI_MAX_DEVICE + 1; Device++) { - HeaderType = PciSegmentRead8 (PCI_SEGMENT_LIB_ADDRESS(Segment, Bus, Device, 0, PCI_HEADER_TYPE_OFFSET)); - MaxFunction = PCI_MAX_FUNC + 1; - if ((HeaderType & HEADER_TYPE_MULTI_FUNCTION) == 0x00) { - MaxFunction = 1; - } - for (Function = 0; Function < MaxFunction; Function++) { + for (Device = 0; Device <= PCI_MAX_DEVICE; Device++) { + for (Function = 0; Function <= PCI_MAX_FUNC; Function++) { VendorID = PciSegmentRead16 (PCI_SEGMENT_LIB_ADDRESS(Segment, Bus, Device, Function, PCI_VENDOR_ID_OFFSET)); DeviceID = PciSegmentRead16 (PCI_SEGMENT_LIB_ADDRESS(Segment, Bus, Device, Function, PCI_DEVICE_ID_OFFSET)); if (VendorID == 0xFFFF && DeviceID == 0xFFFF) { @@ -275,6 +269,16 @@ ScanPciBus ( } } } + + if (Function == 0) { + HeaderType = PciSegmentRead8 (PCI_SEGMENT_LIB_ADDRESS(Segment, Bus, Device, 0, PCI_HEADER_TYPE_OFFSET)); + if ((HeaderType & HEADER_TYPE_MULTI_FUNCTION) == 0x00) { + // + // It is not a multi-function device, do not scan other functions. + // + break; + } + } } } -- 2.7.0.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel