X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdeModulePkg%2FBus%2FPci%2FPciBusDxe%2FPciEnumeratorSupport.c;h=620933779c458c95fb47e41cf6e80d4ef9f749fa;hb=8db6a82c50fe16bd16a8dc53e890f13a8a91896c;hp=940d8d296108026c5a126b602687f1e6da40f02d;hpb=1ef267831621d709d685c6e65856bdf711ea7b79;p=mirror_edk2.git diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c index 940d8d2961..620933779c 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c @@ -1,8 +1,8 @@ /** @file PCI emumeration support functions implementation for PCI Bus module. -Copyright (c) 2006 - 2009, Intel Corporation -All rights reserved. This program and the accompanying materials +Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php @@ -14,6 +14,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include "PciBus.h" +extern CHAR16 *mBarTypeStr[]; + /** This routine is used to check whether the pci device is present. @@ -211,6 +213,15 @@ PciSearchDevice ( PciIoDevice = NULL; + DEBUG (( + EFI_D_INFO, + "PciBus: Discovered %s @ [%02x|%02x|%02x]\n", + IS_PCI_BRIDGE (Pci) ? L"PPB" : + IS_CARDBUS_BRIDGE (Pci) ? L"P2C" : + L"PCI", + Bus, Device, Func + )); + if (!IS_PCI_BRIDGE (Pci)) { if (IS_CARDBUS_BRIDGE (Pci)) { @@ -304,6 +315,46 @@ PciSearchDevice ( return EFI_SUCCESS; } +/** + Dump the PCI BAR information. + + @param PciIoDevice PCI IO instance. +**/ +VOID +DumpPciBars ( + IN PCI_IO_DEVICE *PciIoDevice + ) +{ + UINTN Index; + + for (Index = 0; Index < PCI_MAX_BAR; Index++) { + if (PciIoDevice->PciBar[Index].BarType == PciBarTypeUnknown) { + continue; + } + + DEBUG (( + EFI_D_INFO, + " BAR[%d]: Type = %s; Alignment = 0x%x;\tLength = 0x%x;\tOffset = 0x%02x\n", + Index, mBarTypeStr[MIN (PciIoDevice->PciBar[Index].BarType, PciBarTypeMaxType)], + PciIoDevice->PciBar[Index].Alignment, PciIoDevice->PciBar[Index].Length, PciIoDevice->PciBar[Index].Offset + )); + } + + for (Index = 0; Index < PCI_MAX_BAR; Index++) { + if ((PciIoDevice->VfPciBar[Index].BarType == PciBarTypeUnknown) && (PciIoDevice->VfPciBar[Index].Length == 0)) { + continue; + } + + DEBUG (( + EFI_D_INFO, + " VFBAR[%d]: Type = %s; Alignment = 0x%x;\tLength = 0x%x;\tOffset = 0x%02x\n", + Index, mBarTypeStr[MIN (PciIoDevice->VfPciBar[Index].BarType, PciBarTypeMaxType)], + PciIoDevice->VfPciBar[Index].Alignment, PciIoDevice->VfPciBar[Index].Length, PciIoDevice->VfPciBar[Index].Offset + )); + } + DEBUG ((EFI_D_INFO, "\n")); +} + /** Create PCI device instance for PCI device. @@ -328,11 +379,9 @@ GatherDeviceInfo ( UINTN Offset; UINTN BarIndex; PCI_IO_DEVICE *PciIoDevice; - EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo; - PciRootBridgeIo = Bridge->PciRootBridgeIo; PciIoDevice = CreatePciIoDevice ( - PciRootBridgeIo, + Bridge, Pci, Bus, Device, @@ -370,7 +419,7 @@ GatherDeviceInfo ( // // Parse the SR-IOV VF bars // - if ((PciIoDevice->SrIovCapabilityOffset != 0) && ((FeaturePcdGet(PcdSrIovSupport)& EFI_PCI_IOV_POLICY_SRIOV) != 0)) { + if (PcdGetBool (PcdSrIovSupport) && PciIoDevice->SrIovCapabilityOffset != 0) { for (Offset = PciIoDevice->SrIovCapabilityOffset + EFI_PCIE_CAPABILITY_ID_SRIOV_BAR0, BarIndex = 0; Offset <= PciIoDevice->SrIovCapabilityOffset + EFI_PCIE_CAPABILITY_ID_SRIOV_BAR5; BarIndex++) { @@ -379,6 +428,8 @@ GatherDeviceInfo ( Offset = PciIovParseVfBar (PciIoDevice, Offset, BarIndex); } } + + DEBUG_CODE (DumpPciBars (PciIoDevice);); return PciIoDevice; } @@ -403,16 +454,14 @@ GatherPpbInfo ( IN UINT8 Func ) { - EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo; PCI_IO_DEVICE *PciIoDevice; EFI_STATUS Status; UINT8 Value; EFI_PCI_IO_PROTOCOL *PciIo; UINT8 Temp; - PciRootBridgeIo = Bridge->PciRootBridgeIo; PciIoDevice = CreatePciIoDevice ( - PciRootBridgeIo, + Bridge, Pci, Bus, Device, @@ -481,11 +530,11 @@ GatherPpbInfo ( // if so, it is assumed non-stardard I/O window alignment is supported by this bridge. // Per spec, bit 3-1 of I/O Base Register are reserved bits, so its content can't be assumed. // - Value = Temp ^ (BIT3 | BIT2 | BIT1); + Value = (UINT8)(Temp ^ (BIT3 | BIT2 | BIT1)); PciIo->Pci.Write (PciIo, EfiPciIoWidthUint8, 0x1C, 1, &Value); PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0x1C, 1, &Value); PciIo->Pci.Write (PciIo, EfiPciIoWidthUint8, 0x1C, 1, &Temp); - Value = (Value ^ Temp) & (BIT3 | BIT2 | BIT1); + Value = (UINT8)((Value ^ Temp) & (BIT3 | BIT2 | BIT1)); switch (Value) { case BIT3: PciIoDevice->BridgeIoAlignment = 0x7FF; @@ -533,6 +582,8 @@ GatherPpbInfo ( GetResourcePaddingPpb (PciIoDevice); + DEBUG_CODE (DumpPciBars (PciIoDevice);); + return PciIoDevice; } @@ -558,12 +609,10 @@ GatherP2CInfo ( IN UINT8 Func ) { - EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo; PCI_IO_DEVICE *PciIoDevice; - PciRootBridgeIo = Bridge->PciRootBridgeIo; PciIoDevice = CreatePciIoDevice ( - PciRootBridgeIo, + Bridge, Pci, Bus, Device, @@ -604,6 +653,8 @@ GatherP2CInfo ( EFI_BRIDGE_PMEM32_DECODE_SUPPORTED | EFI_BRIDGE_IO32_DECODE_SUPPORTED; + DEBUG_CODE (DumpPciBars (PciIoDevice);); + return PciIoDevice; } @@ -916,9 +967,10 @@ PciSetDeviceAttribute ( EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM | EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE; - if ((Attributes & EFI_PCI_IO_ATTRIBUTE_IO) != 0) { - Attributes |= EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO; - Attributes |= EFI_PCI_IO_ATTRIBUTE_ISA_IO; + if (IS_PCI_LPC (&PciIoDevice->Pci)) { + Attributes |= EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO; + Attributes |= (mReserveIsaAliases ? EFI_PCI_IO_ATTRIBUTE_ISA_IO : \ + EFI_PCI_IO_ATTRIBUTE_ISA_IO_16); } if (IS_PCI_BRIDGE (&PciIoDevice->Pci) || IS_CARDBUS_BRIDGE (&PciIoDevice->Pci)) { @@ -927,6 +979,14 @@ PciSetDeviceAttribute ( // Attributes |= EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO; Attributes |= EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO; + + if (mReserveVgaAliases) { + Attributes &= ~(UINT64)(EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 | \ + EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16); + } else { + Attributes &= ~(UINT64)(EFI_PCI_IO_ATTRIBUTE_VGA_IO | \ + EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO); + } } else { if (IS_PCI_IDE (&PciIoDevice->Pci)) { @@ -936,7 +996,8 @@ PciSetDeviceAttribute ( if (IS_PCI_VGA (&PciIoDevice->Pci)) { Attributes |= EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY; - Attributes |= EFI_PCI_IO_ATTRIBUTE_VGA_IO; + Attributes |= (mReserveVgaAliases ? EFI_PCI_IO_ATTRIBUTE_VGA_IO : \ + EFI_PCI_IO_ATTRIBUTE_VGA_IO_16); } } @@ -946,6 +1007,15 @@ PciSetDeviceAttribute ( EFI_PCI_IO_ATTRIBUTE_BUS_MASTER ); } else { + // + // When this attribute is clear, the RomImage and RomSize fields in the PCI IO were + // initialized based on the PCI option ROM found through the ROM BAR of the PCI controller. + // When this attribute is set, the PCI option ROM described by the RomImage and RomSize + // fields is not from the the ROM BAR of the PCI controller. + // + if (!PciIoDevice->EmbeddedRom) { + Attributes |= EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM; + } PciIoDevice->Attributes = Attributes; } } @@ -1060,6 +1130,9 @@ DetermineDeviceAttribute ( if (EFI_ERROR (Status)) { return Status; } + PciIoDevice->Supports |= (EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE | + EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM); + } else { // @@ -1415,12 +1488,12 @@ PciIovParseVfBar ( // // Scan all the BARs anyway // - PciIoDevice->VfPciBar[BarIndex].Offset = (UINT8) Offset; + PciIoDevice->VfPciBar[BarIndex].Offset = (UINT16) Offset; return Offset + 4; } - PciIoDevice->VfPciBar[BarIndex].Offset = (UINT8) Offset; - if (Value & 0x01) { + PciIoDevice->VfPciBar[BarIndex].Offset = (UINT16) Offset; + if ((Value & 0x01) != 0) { // // Device I/Os. Impossible // @@ -1439,7 +1512,7 @@ PciIovParseVfBar ( //memory space; anywhere in 32 bit address space // case 0x00: - if (Value & 0x08) { + if ((Value & 0x08) != 0) { PciIoDevice->VfPciBar[BarIndex].BarType = PciBarTypePMem32; } else { PciIoDevice->VfPciBar[BarIndex].BarType = PciBarTypeMem32; @@ -1465,7 +1538,7 @@ PciIovParseVfBar ( // memory space; anywhere in 64 bit address space // case 0x04: - if (Value & 0x08) { + if ((Value & 0x08) != 0) { PciIoDevice->VfPciBar[BarIndex].BarType = PciBarTypePMem64; } else { PciIoDevice->VfPciBar[BarIndex].BarType = PciBarTypeMem64; @@ -1905,14 +1978,14 @@ InitializeP2C ( **/ PCI_IO_DEVICE * CreatePciIoDevice ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo, + IN PCI_IO_DEVICE *Bridge, IN PCI_TYPE00 *Pci, IN UINT8 Bus, IN UINT8 Device, IN UINT8 Func ) { - PCI_IO_DEVICE *PciIoDevice; + PCI_IO_DEVICE *PciIoDevice; EFI_PCI_IO_PROTOCOL *PciIo; EFI_STATUS Status; @@ -1923,7 +1996,7 @@ CreatePciIoDevice ( PciIoDevice->Signature = PCI_IO_DEVICE_SIGNATURE; PciIoDevice->Handle = NULL; - PciIoDevice->PciRootBridgeIo = PciRootBridgeIo; + PciIoDevice->PciRootBridgeIo = Bridge->PciRootBridgeIo; PciIoDevice->DevicePath = NULL; PciIoDevice->BusNumber = Bus; PciIoDevice->DeviceNumber = Device; @@ -1968,146 +2041,198 @@ CreatePciIoDevice ( PciIoDevice->IsPciExp = TRUE; } - // - // Initialize for PCI IOV - // - - // - // Check ARI for function 0 only - // - Status = LocatePciExpressCapabilityRegBlock ( - PciIoDevice, - EFI_PCIE_CAPABILITY_ID_ARI, - &PciIoDevice->AriCapabilityOffset, - NULL - ); - if (!EFI_ERROR (Status)) { - DEBUG (( - EFI_D_INFO, - "PCI-IOV B%x.D%x.F%x - ARI Cap offset - 0x%x\n", - (UINTN)Bus, - (UINTN)Device, - (UINTN)Func, - (UINTN)PciIoDevice->AriCapabilityOffset - )); - } + if (PcdGetBool (PcdAriSupport)) { + // + // Check if the device is an ARI device. + // + Status = LocatePciExpressCapabilityRegBlock ( + PciIoDevice, + EFI_PCIE_CAPABILITY_ID_ARI, + &PciIoDevice->AriCapabilityOffset, + NULL + ); + if (!EFI_ERROR (Status)) { + // + // We need to enable ARI feature before calculate BusReservation, + // because FirstVFOffset and VFStride may change after that. + // + EFI_PCI_IO_PROTOCOL *ParentPciIo; + UINT32 Data32; - Status = LocatePciExpressCapabilityRegBlock ( - PciIoDevice, - EFI_PCIE_CAPABILITY_ID_SRIOV, - &PciIoDevice->SrIovCapabilityOffset, - NULL - ); - if (!EFI_ERROR (Status)) { - DEBUG (( - EFI_D_INFO, - "PCI-IOV B%x.D%x.F%x - SRIOV Cap offset - 0x%x\n", - (UINTN)Bus, - (UINTN)Device, - (UINTN)Func, - (UINTN)PciIoDevice->SrIovCapabilityOffset - )); - } + // + // Check if its parent supports ARI forwarding. + // + ParentPciIo = &Bridge->PciIo; + ParentPciIo->Pci.Read ( + ParentPciIo, + EfiPciIoWidthUint32, + Bridge->PciExpressCapabilityOffset + EFI_PCIE_CAPABILITY_DEVICE_CAPABILITIES_2_OFFSET, + 1, + &Data32 + ); + if ((Data32 & EFI_PCIE_CAPABILITY_DEVICE_CAPABILITIES_2_ARI_FORWARDING) != 0) { + // + // ARI forward support in bridge, so enable it. + // + ParentPciIo->Pci.Read ( + ParentPciIo, + EfiPciIoWidthUint32, + Bridge->PciExpressCapabilityOffset + EFI_PCIE_CAPABILITY_DEVICE_CONTROL_2_OFFSET, + 1, + &Data32 + ); + if ((Data32 & EFI_PCIE_CAPABILITY_DEVICE_CONTROL_2_ARI_FORWARDING) == 0) { + Data32 |= EFI_PCIE_CAPABILITY_DEVICE_CONTROL_2_ARI_FORWARDING; + ParentPciIo->Pci.Write ( + ParentPciIo, + EfiPciIoWidthUint32, + Bridge->PciExpressCapabilityOffset + EFI_PCIE_CAPABILITY_DEVICE_CONTROL_2_OFFSET, + 1, + &Data32 + ); + DEBUG (( + EFI_D_INFO, + " ARI: forwarding enabled for PPB[%02x:%02x:%02x]\n", + Bridge->BusNumber, + Bridge->DeviceNumber, + Bridge->FunctionNumber + )); + } + } - Status = LocatePciExpressCapabilityRegBlock ( - PciIoDevice, - EFI_PCIE_CAPABILITY_ID_MRIOV, - &PciIoDevice->MrIovCapabilityOffset, - NULL - ); - if (!EFI_ERROR (Status)) { - DEBUG (( - EFI_D_INFO, - "PCI-IOV B%x.D%x.F%x - MRIOV Cap offset - 0x%x\n", - (UINTN)Bus, - (UINTN)Device, - (UINTN)Func, - (UINTN)PciIoDevice->MrIovCapabilityOffset - )); + DEBUG ((EFI_D_INFO, " ARI: CapOffset = 0x%x\n", PciIoDevice->AriCapabilityOffset)); + } } // - // Calculate SystemPageSize + // Initialization for SR-IOV // - if ((PciIoDevice->SrIovCapabilityOffset != 0) && ((FeaturePcdGet(PcdSrIovSupport)& EFI_PCI_IOV_POLICY_SRIOV) != 0)) { - PciIo->Pci.Read ( - PciIo, - EfiPciIoWidthUint32, - PciIoDevice->SrIovCapabilityOffset + EFI_PCIE_CAPABILITY_ID_SRIOV_SUPPORTED_PAGE_SIZE, - 1, - &PciIoDevice->SystemPageSize - ); - DEBUG ((EFI_D_INFO, "PCI-IOV B%x.D%x.F%x - SupportedPageSize - 0x%x\n", (UINTN)Bus, (UINTN)Device, (UINTN)Func, PciIoDevice->SystemPageSize)); + if (PcdGetBool (PcdSrIovSupport)) { + Status = LocatePciExpressCapabilityRegBlock ( + PciIoDevice, + EFI_PCIE_CAPABILITY_ID_SRIOV, + &PciIoDevice->SrIovCapabilityOffset, + NULL + ); + if (!EFI_ERROR (Status)) { + UINT32 SupportedPageSize; + UINT16 VFStride; + UINT16 FirstVFOffset; + UINT16 Data16; + UINT32 PFRid; + UINT32 LastVF; - PciIoDevice->SystemPageSize = (PcdGet32(PcdSrIovSystemPageSize) & PciIoDevice->SystemPageSize); - ASSERT (PciIoDevice->SystemPageSize != 0); + // + // If the SR-IOV device is an ARI device, then Set ARI Capable Hierarchy for the device. + // + if (PcdGetBool (PcdAriSupport) && PciIoDevice->AriCapabilityOffset != 0) { + PciIo->Pci.Read ( + PciIo, + EfiPciIoWidthUint16, + PciIoDevice->SrIovCapabilityOffset + EFI_PCIE_CAPABILITY_ID_SRIOV_CONTROL, + 1, + &Data16 + ); + Data16 |= EFI_PCIE_CAPABILITY_ID_SRIOV_CONTROL_ARI_HIERARCHY; + PciIo->Pci.Write ( + PciIo, + EfiPciIoWidthUint16, + PciIoDevice->SrIovCapabilityOffset + EFI_PCIE_CAPABILITY_ID_SRIOV_CONTROL, + 1, + &Data16 + ); + } - PciIo->Pci.Write ( - PciIo, - EfiPciIoWidthUint32, - PciIoDevice->SrIovCapabilityOffset + EFI_PCIE_CAPABILITY_ID_SRIOV_SYSTEM_PAGE_SIZE, - 1, - &PciIoDevice->SystemPageSize - ); - DEBUG ((EFI_D_INFO, "PCI-IOV B%x.D%x.F%x - SystemPageSize - 0x%x\n", (UINTN)Bus, (UINTN)Device, (UINTN)Func, PciIoDevice->SystemPageSize)); - // - // Adjust SystemPageSize for Alignment usage later - // - PciIoDevice->SystemPageSize <<= 12; - } + // + // Calculate SystemPageSize + // - // Calculate BusReservation for PCI IOV - // - if ((PciIoDevice->SrIovCapabilityOffset != 0) && ((FeaturePcdGet(PcdSrIovSupport)& EFI_PCI_IOV_POLICY_SRIOV) != 0)) { - UINT16 VFStride; - UINT16 FirstVFOffset; - UINT32 PFRID; - UINT32 LastVF; + PciIo->Pci.Read ( + PciIo, + EfiPciIoWidthUint32, + PciIoDevice->SrIovCapabilityOffset + EFI_PCIE_CAPABILITY_ID_SRIOV_SUPPORTED_PAGE_SIZE, + 1, + &SupportedPageSize + ); + PciIoDevice->SystemPageSize = (PcdGet32 (PcdSrIovSystemPageSize) & SupportedPageSize); + ASSERT (PciIoDevice->SystemPageSize != 0); + + PciIo->Pci.Write ( + PciIo, + EfiPciIoWidthUint32, + PciIoDevice->SrIovCapabilityOffset + EFI_PCIE_CAPABILITY_ID_SRIOV_SYSTEM_PAGE_SIZE, + 1, + &PciIoDevice->SystemPageSize + ); + // + // Adjust SystemPageSize for Alignment usage later + // + PciIoDevice->SystemPageSize <<= 12; - // - // Read First FirstVFOffset, InitialVFs, and VFStride - // - PciIo->Pci.Read ( - PciIo, - EfiPciIoWidthUint16, - PciIoDevice->SrIovCapabilityOffset + EFI_PCIE_CAPABILITY_ID_SRIOV_FIRSTVF, - 1, - &FirstVFOffset - ); - DEBUG ((EFI_D_INFO, "PCI-IOV B%x.D%x.F%x - FirstVFOffset - 0x%x\n", (UINTN)Bus, (UINTN)Device, (UINTN)Func, (UINTN)FirstVFOffset)); - - PciIo->Pci.Read ( - PciIo, - EfiPciIoWidthUint16, - PciIoDevice->SrIovCapabilityOffset + EFI_PCIE_CAPABILITY_ID_SRIOV_INITIALVFS, - 1, - &PciIoDevice->InitialVFs - ); - DEBUG ((EFI_D_INFO, "PCI-IOV B%x.D%x.F%x - InitialVFs - 0x%x\n", (UINTN)Bus, (UINTN)Device, (UINTN)Func, (UINTN)PciIoDevice->InitialVFs)); - - PciIo->Pci.Read ( - PciIo, - EfiPciIoWidthUint16, - PciIoDevice->SrIovCapabilityOffset + EFI_PCIE_CAPABILITY_ID_SRIOV_VFSTRIDE, - 1, - &VFStride - ); - DEBUG ((EFI_D_INFO, "PCI-IOV B%x.D%x.F%x - VFStride - 0x%x\n", (UINTN)Bus, (UINTN)Device, (UINTN)Func, (UINTN)VFStride)); + // + // Calculate BusReservation for PCI IOV + // - // - // Calculate LastVF - // - PFRID = EFI_PCI_RID(Bus, Device, Func); - LastVF = PFRID + FirstVFOffset + (PciIoDevice->InitialVFs - 1) * VFStride; + // + // Read First FirstVFOffset, InitialVFs, and VFStride + // + PciIo->Pci.Read ( + PciIo, + EfiPciIoWidthUint16, + PciIoDevice->SrIovCapabilityOffset + EFI_PCIE_CAPABILITY_ID_SRIOV_FIRSTVF, + 1, + &FirstVFOffset + ); + PciIo->Pci.Read ( + PciIo, + EfiPciIoWidthUint16, + PciIoDevice->SrIovCapabilityOffset + EFI_PCIE_CAPABILITY_ID_SRIOV_INITIALVFS, + 1, + &PciIoDevice->InitialVFs + ); + PciIo->Pci.Read ( + PciIo, + EfiPciIoWidthUint16, + PciIoDevice->SrIovCapabilityOffset + EFI_PCIE_CAPABILITY_ID_SRIOV_VFSTRIDE, + 1, + &VFStride + ); + // + // Calculate LastVF + // + PFRid = EFI_PCI_RID(Bus, Device, Func); + LastVF = PFRid + FirstVFOffset + (PciIoDevice->InitialVFs - 1) * VFStride; - // - // Calculate ReservedBusNum for this PF - // - PciIoDevice->ReservedBusNum = (UINT16)(EFI_PCI_BUS_OF_RID (LastVF) - Bus + 1); - DEBUG ((EFI_D_INFO, "PCI-IOV B%x.D%x.F%x - reserved bus number - 0x%x\n", (UINTN)Bus, (UINTN)Device, (UINTN)Func, (UINTN)PciIoDevice->ReservedBusNum)); + // + // Calculate ReservedBusNum for this PF + // + PciIoDevice->ReservedBusNum = (UINT16)(EFI_PCI_BUS_OF_RID (LastVF) - Bus + 1); + + DEBUG (( + EFI_D_INFO, + " SR-IOV: SupportedPageSize = 0x%x; SystemPageSize = 0x%x; FirstVFOffset = 0x%x;\n", + SupportedPageSize, PciIoDevice->SystemPageSize >> 12, FirstVFOffset + )); + DEBUG (( + EFI_D_INFO, + " InitialVFs = 0x%x; ReservedBusNum = 0x%x; CapOffset = 0x%x\n", + PciIoDevice->InitialVFs, PciIoDevice->ReservedBusNum, PciIoDevice->SrIovCapabilityOffset + )); + } } + if (PcdGetBool (PcdMrIovSupport)) { + Status = LocatePciExpressCapabilityRegBlock ( + PciIoDevice, + EFI_PCIE_CAPABILITY_ID_MRIOV, + &PciIoDevice->MrIovCapabilityOffset, + NULL + ); + if (!EFI_ERROR (Status)) { + DEBUG ((EFI_D_INFO, " MR-IOV: CapOffset = 0x%x\n", PciIoDevice->MrIovCapabilityOffset)); + } + } // // Initialize the reserved resource list