Reviewed-by: jiewen....@intel.com > -----Original Message----- > From: Zeng, Star > Sent: Thursday, September 13, 2018 2:29 PM > To: edk2-devel@lists.01.org > Cc: Zeng, Star <star.z...@intel.com>; Yao, Jiewen <jiewen....@intel.com>; > Chaganty, Rangasai V <rangasai.v.chaga...@intel.com>; Chang, Tomson > <tomson.ch...@intel.com>; Huang, Jenny <jenny.hu...@intel.com>; Chan, > Amy <amy.c...@intel.com>; Ni, Ruiyu <ruiyu...@intel.com> > Subject: [PATCH] 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 <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