https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Hao Wu <hao.a.wu@intel.com> Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
		
			
				
	
	
		
			471 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			471 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  PCI enumeration support functions declaration for PCI Bus module.
 | 
						|
 | 
						|
Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
 | 
						|
SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#ifndef _EFI_PCI_ENUMERATOR_SUPPORT_H_
 | 
						|
#define _EFI_PCI_ENUMERATOR_SUPPORT_H_
 | 
						|
 | 
						|
/**
 | 
						|
  This routine is used to check whether the pci device is present.
 | 
						|
 | 
						|
  @param PciRootBridgeIo   Pointer to instance of EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.
 | 
						|
  @param Pci               Output buffer for PCI device configuration space.
 | 
						|
  @param Bus               PCI bus NO.
 | 
						|
  @param Device            PCI device NO.
 | 
						|
  @param Func              PCI Func NO.
 | 
						|
 | 
						|
  @retval EFI_NOT_FOUND    PCI device not present.
 | 
						|
  @retval EFI_SUCCESS      PCI device is found.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
PciDevicePresent (
 | 
						|
  IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL     *PciRootBridgeIo,
 | 
						|
  OUT PCI_TYPE00                          *Pci,
 | 
						|
  IN  UINT8                               Bus,
 | 
						|
  IN  UINT8                               Device,
 | 
						|
  IN  UINT8                               Func
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Collect all the resource information under this root bridge.
 | 
						|
 | 
						|
  A database that records all the information about pci device subject to this
 | 
						|
  root bridge will then be created.
 | 
						|
 | 
						|
  @param Bridge         Parent bridge instance.
 | 
						|
  @param StartBusNumber Bus number of beginning.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS   PCI device is found.
 | 
						|
  @retval other         Some error occurred when reading PCI bridge information.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
PciPciDeviceInfoCollector (
 | 
						|
  IN PCI_IO_DEVICE                      *Bridge,
 | 
						|
  IN UINT8                              StartBusNumber
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Search required device and create PCI device instance.
 | 
						|
 | 
						|
  @param Bridge     Parent bridge instance.
 | 
						|
  @param Pci        Input PCI device information block.
 | 
						|
  @param Bus        PCI bus NO.
 | 
						|
  @param Device     PCI device NO.
 | 
						|
  @param Func       PCI func  NO.
 | 
						|
  @param PciDevice  Output of searched PCI device instance.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           Successfully created PCI device instance.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES  Cannot get PCI device information.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
PciSearchDevice (
 | 
						|
  IN  PCI_IO_DEVICE                         *Bridge,
 | 
						|
  IN  PCI_TYPE00                            *Pci,
 | 
						|
  IN  UINT8                                 Bus,
 | 
						|
  IN  UINT8                                 Device,
 | 
						|
  IN  UINT8                                 Func,
 | 
						|
  OUT PCI_IO_DEVICE                         **PciDevice
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Create PCI device instance for PCI device.
 | 
						|
 | 
						|
  @param Bridge   Parent bridge instance.
 | 
						|
  @param Pci      Input PCI device information block.
 | 
						|
  @param Bus      PCI device Bus NO.
 | 
						|
  @param Device   PCI device Device NO.
 | 
						|
  @param Func     PCI device's func NO.
 | 
						|
 | 
						|
  @return  Created PCI device instance.
 | 
						|
 | 
						|
**/
 | 
						|
PCI_IO_DEVICE *
 | 
						|
GatherDeviceInfo (
 | 
						|
  IN PCI_IO_DEVICE                    *Bridge,
 | 
						|
  IN PCI_TYPE00                       *Pci,
 | 
						|
  IN UINT8                            Bus,
 | 
						|
  IN UINT8                            Device,
 | 
						|
  IN UINT8                            Func
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Create PCI device instance for PCI-PCI bridge.
 | 
						|
 | 
						|
  @param Bridge   Parent bridge instance.
 | 
						|
  @param Pci      Input PCI device information block.
 | 
						|
  @param Bus      PCI device Bus NO.
 | 
						|
  @param Device   PCI device Device NO.
 | 
						|
  @param Func     PCI device's func NO.
 | 
						|
 | 
						|
  @return  Created PCI device instance.
 | 
						|
 | 
						|
**/
 | 
						|
PCI_IO_DEVICE *
 | 
						|
GatherPpbInfo (
 | 
						|
  IN PCI_IO_DEVICE                    *Bridge,
 | 
						|
  IN PCI_TYPE00                       *Pci,
 | 
						|
  IN UINT8                            Bus,
 | 
						|
  IN UINT8                            Device,
 | 
						|
  IN UINT8                            Func
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Create PCI device instance for PCI Card bridge device.
 | 
						|
 | 
						|
  @param Bridge   Parent bridge instance.
 | 
						|
  @param Pci      Input PCI device information block.
 | 
						|
  @param Bus      PCI device Bus NO.
 | 
						|
  @param Device   PCI device Device NO.
 | 
						|
  @param Func     PCI device's func NO.
 | 
						|
 | 
						|
  @return  Created PCI device instance.
 | 
						|
 | 
						|
**/
 | 
						|
PCI_IO_DEVICE *
 | 
						|
GatherP2CInfo (
 | 
						|
  IN PCI_IO_DEVICE                    *Bridge,
 | 
						|
  IN PCI_TYPE00                       *Pci,
 | 
						|
  IN UINT8                            Bus,
 | 
						|
  IN UINT8                            Device,
 | 
						|
  IN UINT8                            Func
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Create device path for pci device.
 | 
						|
 | 
						|
  @param ParentDevicePath  Parent bridge's path.
 | 
						|
  @param PciIoDevice       Pci device instance.
 | 
						|
 | 
						|
  @return Device path protocol instance for specific pci device.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_DEVICE_PATH_PROTOCOL *
 | 
						|
CreatePciDevicePath (
 | 
						|
  IN  EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath,
 | 
						|
  IN  PCI_IO_DEVICE            *PciIoDevice
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Check whether the PCI IOV VF bar is existed or not.
 | 
						|
 | 
						|
  @param PciIoDevice       A pointer to the PCI_IO_DEVICE.
 | 
						|
  @param Offset            The offset.
 | 
						|
  @param BarLengthValue    The bar length value returned.
 | 
						|
  @param OriginalBarValue  The original bar value returned.
 | 
						|
 | 
						|
  @retval EFI_NOT_FOUND    The bar doesn't exist.
 | 
						|
  @retval EFI_SUCCESS      The bar exist.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
VfBarExisted (
 | 
						|
  IN PCI_IO_DEVICE *PciIoDevice,
 | 
						|
  IN UINTN         Offset,
 | 
						|
  OUT UINT32       *BarLengthValue,
 | 
						|
  OUT UINT32       *OriginalBarValue
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Check whether the bar is existed or not.
 | 
						|
 | 
						|
  @param PciIoDevice       A pointer to the PCI_IO_DEVICE.
 | 
						|
  @param Offset            The offset.
 | 
						|
  @param BarLengthValue    The bar length value returned.
 | 
						|
  @param OriginalBarValue  The original bar value returned.
 | 
						|
 | 
						|
  @retval EFI_NOT_FOUND    The bar doesn't exist.
 | 
						|
  @retval EFI_SUCCESS      The bar exist.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
BarExisted (
 | 
						|
  IN  PCI_IO_DEVICE *PciIoDevice,
 | 
						|
  IN  UINTN         Offset,
 | 
						|
  OUT UINT32        *BarLengthValue,
 | 
						|
  OUT UINT32        *OriginalBarValue
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Test whether the device can support given attributes.
 | 
						|
 | 
						|
  @param PciIoDevice      Pci device instance.
 | 
						|
  @param Command          Input command register value, and
 | 
						|
                          returned supported register value.
 | 
						|
  @param BridgeControl    Input bridge control value for PPB or P2C, and
 | 
						|
                          returned supported bridge control value.
 | 
						|
  @param OldCommand       Returned and stored old command register offset.
 | 
						|
  @param OldBridgeControl Returned and stored old Bridge control value for PPB or P2C.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
PciTestSupportedAttribute (
 | 
						|
  IN     PCI_IO_DEVICE                      *PciIoDevice,
 | 
						|
  IN OUT UINT16                             *Command,
 | 
						|
  IN OUT UINT16                             *BridgeControl,
 | 
						|
     OUT UINT16                             *OldCommand,
 | 
						|
     OUT UINT16                             *OldBridgeControl
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Set the supported or current attributes of a PCI device.
 | 
						|
 | 
						|
  @param PciIoDevice    Structure pointer for PCI device.
 | 
						|
  @param Command        Command register value.
 | 
						|
  @param BridgeControl  Bridge control value for PPB or P2C.
 | 
						|
  @param Option         Make a choice of EFI_SET_SUPPORTS or EFI_SET_ATTRIBUTES.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
PciSetDeviceAttribute (
 | 
						|
  IN PCI_IO_DEVICE                      *PciIoDevice,
 | 
						|
  IN UINT16                             Command,
 | 
						|
  IN UINT16                             BridgeControl,
 | 
						|
  IN UINTN                              Option
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Determine if the device can support Fast Back to Back attribute.
 | 
						|
 | 
						|
  @param PciIoDevice  Pci device instance.
 | 
						|
  @param StatusIndex  Status register value.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS       This device support Fast Back to Back attribute.
 | 
						|
  @retval EFI_UNSUPPORTED   This device doesn't support Fast Back to Back attribute.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
GetFastBackToBackSupport (
 | 
						|
  IN PCI_IO_DEVICE                      *PciIoDevice,
 | 
						|
  IN UINT8                              StatusIndex
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Determine the related attributes of all devices under a Root Bridge.
 | 
						|
 | 
						|
  @param PciIoDevice   PCI device instance.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
DetermineDeviceAttribute (
 | 
						|
  IN PCI_IO_DEVICE                      *PciIoDevice
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This routine is used to update the bar information for those incompatible PCI device.
 | 
						|
 | 
						|
  @param PciIoDevice      Input Pci device instance. Output Pci device instance with updated
 | 
						|
                          Bar information.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS     Successfully updated bar information.
 | 
						|
  @retval EFI_UNSUPPORTED Given PCI device doesn't belong to incompatible PCI device list.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
UpdatePciInfo (
 | 
						|
  IN OUT PCI_IO_DEVICE    *PciIoDevice
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This routine will update the alignment with the new alignment.
 | 
						|
 | 
						|
  @param Alignment    Input Old alignment. Output updated alignment.
 | 
						|
  @param NewAlignment New alignment.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
SetNewAlign (
 | 
						|
  IN OUT UINT64     *Alignment,
 | 
						|
  IN     UINT64     NewAlignment
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Parse PCI bar information and fill them into PCI device instance.
 | 
						|
 | 
						|
  @param PciIoDevice  Pci device instance.
 | 
						|
  @param Offset       Bar offset.
 | 
						|
  @param BarIndex     Bar index.
 | 
						|
 | 
						|
  @return Next bar offset.
 | 
						|
 | 
						|
**/
 | 
						|
UINTN
 | 
						|
PciParseBar (
 | 
						|
  IN PCI_IO_DEVICE  *PciIoDevice,
 | 
						|
  IN UINTN          Offset,
 | 
						|
  IN UINTN          BarIndex
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Parse PCI IOV VF bar information and fill them into PCI device instance.
 | 
						|
 | 
						|
  @param PciIoDevice  Pci device instance.
 | 
						|
  @param Offset       Bar offset.
 | 
						|
  @param BarIndex     Bar index.
 | 
						|
 | 
						|
  @return Next bar offset.
 | 
						|
 | 
						|
**/
 | 
						|
UINTN
 | 
						|
PciIovParseVfBar (
 | 
						|
  IN PCI_IO_DEVICE  *PciIoDevice,
 | 
						|
  IN UINTN          Offset,
 | 
						|
  IN UINTN          BarIndex
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This routine is used to initialize the bar of a PCI device.
 | 
						|
 | 
						|
  @param PciIoDevice Pci device instance.
 | 
						|
 | 
						|
  @note It can be called typically when a device is going to be rejected.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
InitializePciDevice (
 | 
						|
  IN PCI_IO_DEVICE    *PciIoDevice
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This routine is used to initialize the bar of a PCI-PCI Bridge device.
 | 
						|
 | 
						|
  @param  PciIoDevice PCI-PCI bridge device instance.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
InitializePpb (
 | 
						|
  IN PCI_IO_DEVICE    *PciIoDevice
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This routine is used to initialize the bar of a PCI Card Bridge device.
 | 
						|
 | 
						|
  @param PciIoDevice  PCI Card bridge device.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
InitializeP2C (
 | 
						|
  IN PCI_IO_DEVICE    *PciIoDevice
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Create and initialize general PCI I/O device instance for
 | 
						|
  PCI device/bridge device/hotplug bridge device.
 | 
						|
 | 
						|
  @param Bridge            Parent bridge instance.
 | 
						|
  @param Pci               Input Pci information block.
 | 
						|
  @param Bus               Device Bus NO.
 | 
						|
  @param Device            Device device NO.
 | 
						|
  @param Func              Device func NO.
 | 
						|
 | 
						|
  @return Instance of PCI device. NULL means no instance created.
 | 
						|
 | 
						|
**/
 | 
						|
PCI_IO_DEVICE *
 | 
						|
CreatePciIoDevice (
 | 
						|
  IN PCI_IO_DEVICE                    *Bridge,
 | 
						|
  IN PCI_TYPE00                       *Pci,
 | 
						|
  IN UINT8                            Bus,
 | 
						|
  IN UINT8                            Device,
 | 
						|
  IN UINT8                            Func
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This routine is used to enumerate entire pci bus system
 | 
						|
  in a given platform.
 | 
						|
 | 
						|
  It is only called on the second start on the same Root Bridge.
 | 
						|
 | 
						|
  @param  Controller     Parent bridge handler.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS    PCI enumeration finished successfully.
 | 
						|
  @retval other          Some error occurred when enumerating the pci bus system.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
PciEnumeratorLight (
 | 
						|
  IN EFI_HANDLE                    Controller
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Get bus range from PCI resource descriptor list.
 | 
						|
 | 
						|
  @param Descriptors  A pointer to the address space descriptor.
 | 
						|
  @param MinBus       The min bus returned.
 | 
						|
  @param MaxBus       The max bus returned.
 | 
						|
  @param BusRange     The bus range returned.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS    Successfully got bus range.
 | 
						|
  @retval EFI_NOT_FOUND  Can not find the specific bus.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
PciGetBusRange (
 | 
						|
  IN     EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR  **Descriptors,
 | 
						|
  OUT    UINT16                             *MinBus,
 | 
						|
  OUT    UINT16                             *MaxBus,
 | 
						|
  OUT    UINT16                             *BusRange
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This routine can be used to start the root bridge.
 | 
						|
 | 
						|
  @param RootBridgeDev     Pci device instance.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS      This device started.
 | 
						|
  @retval other            Failed to get PCI Root Bridge I/O protocol.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
StartManagingRootBridge (
 | 
						|
  IN PCI_IO_DEVICE *RootBridgeDev
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This routine can be used to check whether a PCI device should be rejected when light enumeration.
 | 
						|
 | 
						|
  @param PciIoDevice  Pci device instance.
 | 
						|
 | 
						|
  @retval TRUE      This device should be rejected.
 | 
						|
  @retval FALSE     This device shouldn't be rejected.
 | 
						|
 | 
						|
**/
 | 
						|
BOOLEAN
 | 
						|
IsPciDeviceRejected (
 | 
						|
  IN PCI_IO_DEVICE *PciIoDevice
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Reset all bus number from specific bridge.
 | 
						|
 | 
						|
  @param Bridge           Parent specific bridge.
 | 
						|
  @param StartBusNumber   Start bus number.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
ResetAllPpbBusNumber (
 | 
						|
  IN PCI_IO_DEVICE                      *Bridge,
 | 
						|
  IN UINT8                              StartBusNumber
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Dump the PPB padding resource information.
 | 
						|
 | 
						|
  @param PciIoDevice     PCI IO instance.
 | 
						|
  @param ResourceType    The desired resource type to dump.
 | 
						|
                         PciBarTypeUnknown means to dump all types of resources.
 | 
						|
**/
 | 
						|
VOID
 | 
						|
DumpPpbPaddingResource (
 | 
						|
  IN PCI_IO_DEVICE                    *PciIoDevice,
 | 
						|
  IN PCI_BAR_TYPE                     ResourceType
 | 
						|
  );
 | 
						|
 | 
						|
#endif
 |