The resource dumping logic contains a bug which cannot dump the resource for hot plug controller correctly. The patch fixes this bug. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Feng Tian <feng.tian@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18718 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			477 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			477 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   PCI emumeration support functions declaration for PCI Bus module.
 | |
| 
 | |
| Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
 | |
| 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
 | |
| 
 | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| 
 | |
| **/
 | |
| 
 | |
| #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 begining.
 | |
| 
 | |
|   @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
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Seach 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 deivce.
 | |
| 
 | |
|   @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    Inout 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 initiliaze 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
 |