/** @file Support PCI chipset initialization. @copyright Copyright 1999 - 2021 Intel Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "PiDxe.h" #include #include #include #include #include #include "IndustryStandard/Pci.h" #include "PciSupportLib.h" PCIE_STACK mPcieStack; /** This routine is used to check whether the pci device is present @retval None **/ BOOLEAN IsPciDevicePresent ( IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo, OUT PCI_TYPE00 *Pci, UINT8 Bus, UINT8 Device, UINT8 Func ) // TODO: PciRootBridgeIo - add argument and description to function comment // TODO: Pci - add argument and description to function comment // TODO: Bus - add argument and description to function comment // TODO: Device - add argument and description to function comment // TODO: Func - add argument and description to function comment // TODO: EFI_SUCCESS - add return value to function comment // TODO: EFI_NOT_FOUND - add return value to function comment { UINT64 Address; UINT32 Dummy; EFI_STATUS Status; Dummy = 0xFFFFFFFF; // // Create PCI address map in terms of Bus, Device and Func // Address = EFI_PCI_ADDRESS (Bus, Device, Func, 0); // // Read the Vendor Id register // Status = PciRootBridgeIo->Pci.Read ( PciRootBridgeIo, EfiPciWidthUint32, Address, 1, Pci ); if ((Pci->Hdr).VendorId == 0xFFFF) { // // The PCIe card could have been assigned a temporary bus number earlier in // the boot flow. Performing a write cycle can be used to cause the PCIe // card to latch the new bus number. Try to writing the Vendor Id register, // then recheck if the card is present. // Status = PciRootBridgeIo->Pci.Write( PciRootBridgeIo, EfiPciWidthUint32, Address, 1, &Dummy ); // // Retry the previous read after the PCI write cycle. // Status = PciRootBridgeIo->Pci.Read ( PciRootBridgeIo, EfiPciWidthUint32, Address, 1, Pci ); } if (!EFI_ERROR (Status) && (Pci->Hdr).VendorId != 0xFFFF) { // // Read the entire config header for the device // Status = PciRootBridgeIo->Pci.Read ( PciRootBridgeIo, EfiPciWidthUint32, Address, sizeof (PCI_TYPE00) / sizeof (UINT32), Pci ); return TRUE; } return FALSE; }