From: Star Zeng Date: Thu, 13 Sep 2018 06:27:47 +0000 (+0800) Subject: IntelSiliconPkg IntelVTdDxe: Check HeaderType if func 0 is implemented X-Git-Tag: edk2-stable201903~1024 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=b06dfd40bb5cf9fdd626a79a300253f193b600ae IntelSiliconPkg IntelVTdDxe: Check HeaderType if func 0 is implemented 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 Cc: Rangasai V Chaganty Cc: Tomson Chang Cc: Jenny Huang Cc: Amy Chan Cc: Ruiyu Ni Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Star Zeng Reviewed-by: Jiewen Yao --- diff --git a/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/PciInfo.c b/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/PciInfo.c index 305995de03..6ae5df589c 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; + } + } } }