mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-31 19:23:54 +01:00 
			
		
		
		
	RFC: https://bugzilla.tianocore.org/show_bug.cgi?id=3429 Function of UpdatePciInfo() in PciEnumeratorSupport.c is used to update the bar information for those incompatible PCI device. It is the right place to check if the OptionRom need to be ignored. According to "Table 20. ACPI 2.0 & 3.0 QWORD Address Space Descriptor Usage" in PI Spec 1.7, Type-specific flags can be set to 0 when Address Translation Offset == 6 to skip device option ROM (do not probe option rom BAR). Cc: Jian J Wang <jian.j.wang@intel.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Hao A Wu <hao.a.wu@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Brijesh Singh <brijesh.singh@amd.com> Cc: Erdem Aktas <erdemaktas@google.com> Cc: James Bottomley <jejb@linux.ibm.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Tom Lendacky <thomas.lendacky@amd.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Acked-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Ray Ni <ray.ni@intel.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com> Signed-off-by: Min Xu <min.m.xu@intel.com>
		
			
				
	
	
		
			483 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			483 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   PCI enumeration support functions declaration for PCI Bus module.
 | |
| 
 | |
| Copyright (c) 2006 - 2021, 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.
 | |
|   @param IgnoreOptionRom  Output If the option rom of incompatible device need to be ignored.
 | |
| 
 | |
|   @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,
 | |
|   OUT BOOLEAN           *IgnoreOptionRom
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   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
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Dump the PCI BAR information.
 | |
| 
 | |
|   @param PciIoDevice     PCI IO instance.
 | |
| **/
 | |
| VOID
 | |
| DumpPciBars (
 | |
|   IN PCI_IO_DEVICE  *PciIoDevice
 | |
|   );
 | |
| 
 | |
| #endif
 |