)\r
{\r
PCI_IO_DEVICE *PciIoDevice;\r
+ BOOLEAN IgnoreOptionRom;\r
\r
- PciIoDevice = NULL;\r
+ PciIoDevice = NULL;\r
+ IgnoreOptionRom = FALSE;\r
\r
DEBUG ((\r
DEBUG_INFO,\r
//\r
// Update the bar information for this PCI device so as to support some specific device\r
//\r
- UpdatePciInfo (PciIoDevice);\r
+ UpdatePciInfo (PciIoDevice, &IgnoreOptionRom);\r
\r
if (PciIoDevice->DevicePath == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
// Detect this function has option rom\r
//\r
if (gFullEnumeration) {\r
- if (!IS_CARDBUS_BRIDGE (Pci)) {\r
+ if (!IS_CARDBUS_BRIDGE (Pci) && !IgnoreOptionRom) {\r
GetOpRomInfo (PciIoDevice);\r
}\r
\r
\r
@param PciIoDevice Input Pci device instance. Output Pci device instance with updated\r
Bar information.\r
+ @param IgnoreOptionRom Output If the option rom of incompatible device need to be ignored.\r
\r
@retval EFI_SUCCESS Successfully updated bar information.\r
@retval EFI_UNSUPPORTED Given PCI device doesn't belong to incompatible PCI device list.\r
**/\r
EFI_STATUS\r
UpdatePciInfo (\r
- IN OUT PCI_IO_DEVICE *PciIoDevice\r
+ IN OUT PCI_IO_DEVICE *PciIoDevice,\r
+ OUT BOOLEAN *IgnoreOptionRom\r
)\r
{\r
EFI_STATUS Status;\r
break;\r
}\r
\r
+ //\r
+ // According to "Table 20. ACPI 2.0 & 3.0 QWORD Address Space Descriptor Usage"\r
+ // in PI Spec 1.7, Type-specific flags can be set to 0 when Address Translation\r
+ // Offset == 6 to skip device option ROM (do not probe option rom BAR).\r
+ //\r
+ if (((Ptr->AddrTranslationOffset == PCI_MAX_BAR) && (Ptr->SpecificFlag == 0))) {\r
+ *IgnoreOptionRom = TRUE;\r
+ Ptr++;\r
+ continue;\r
+ }\r
+\r
for (BarIndex = 0; BarIndex < PCI_MAX_BAR; BarIndex++) {\r
if ((Ptr->AddrTranslationOffset != MAX_UINT64) &&\r
(Ptr->AddrTranslationOffset != MAX_UINT8) &&\r