Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ray Ni <ray.ni@intel.com> Reviewed-by: Hao Wu <hao.a.wu@intel.com>
		
			
				
	
	
		
			463 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			463 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   PCI resources support functions declaration for PCI Bus module.
 | |
| 
 | |
| Copyright (c) 2006 - 2019, 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_RESOURCE_SUPPORT_H_
 | |
| #define _EFI_PCI_RESOURCE_SUPPORT_H_
 | |
| 
 | |
| typedef enum {
 | |
|   PciResUsageTypical,
 | |
|   PciResUsagePadding
 | |
| } PCI_RESOURCE_USAGE;
 | |
| 
 | |
| #define PCI_RESOURCE_SIGNATURE  SIGNATURE_32 ('p', 'c', 'r', 'c')
 | |
| 
 | |
| typedef struct {
 | |
|   UINT32              Signature;
 | |
|   LIST_ENTRY          Link;
 | |
|   LIST_ENTRY          ChildList;
 | |
|   PCI_IO_DEVICE       *PciDev;
 | |
|   UINT64              Alignment;
 | |
|   UINT64              Offset;
 | |
|   UINT8               Bar;
 | |
|   PCI_BAR_TYPE        ResType;
 | |
|   UINT64              Length;
 | |
|   BOOLEAN             Reserved;
 | |
|   PCI_RESOURCE_USAGE  ResourceUsage;
 | |
|   BOOLEAN             Virtual;
 | |
| } PCI_RESOURCE_NODE;
 | |
| 
 | |
| #define RESOURCE_NODE_FROM_LINK(a) \
 | |
|   CR (a, PCI_RESOURCE_NODE, Link, PCI_RESOURCE_SIGNATURE)
 | |
| 
 | |
| /**
 | |
|   The function is used to skip VGA range.
 | |
| 
 | |
|   @param Start    Returned start address including VGA range.
 | |
|   @param Length   The length of VGA range.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| SkipVGAAperture (
 | |
|   OUT UINT64   *Start,
 | |
|   IN  UINT64   Length
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to skip ISA aliasing aperture.
 | |
| 
 | |
|   @param Start    Returned start address including ISA aliasing aperture.
 | |
|   @param Length   The length of ISA aliasing aperture.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| SkipIsaAliasAperture (
 | |
|   OUT UINT64   *Start,
 | |
|   IN  UINT64   Length
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function inserts a resource node into the resource list.
 | |
|   The resource list is sorted in descend order.
 | |
| 
 | |
|   @param Bridge  PCI resource node for bridge.
 | |
|   @param ResNode Resource node want to be inserted.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| InsertResourceNode (
 | |
|   IN OUT PCI_RESOURCE_NODE   *Bridge,
 | |
|   IN     PCI_RESOURCE_NODE   *ResNode
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This routine is used to merge two different resource trees in need of
 | |
|   resource degradation.
 | |
| 
 | |
|   For example, if an upstream PPB doesn't support,
 | |
|   prefetchable memory decoding, the PCI bus driver will choose to call this function
 | |
|   to merge prefetchable memory resource list into normal memory list.
 | |
| 
 | |
|   If the TypeMerge is TRUE, Res resource type is changed to the type of destination resource
 | |
|   type.
 | |
|   If Dst is NULL or Res is NULL, ASSERT ().
 | |
| 
 | |
|   @param Dst        Point to destination resource tree.
 | |
|   @param Res        Point to source resource tree.
 | |
|   @param TypeMerge  If the TypeMerge is TRUE, Res resource type is changed to the type of
 | |
|                     destination resource type.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| MergeResourceTree (
 | |
|   IN PCI_RESOURCE_NODE   *Dst,
 | |
|   IN PCI_RESOURCE_NODE   *Res,
 | |
|   IN BOOLEAN             TypeMerge
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to calculate the IO16 aperture
 | |
|   for a bridge.
 | |
| 
 | |
|   @param Bridge    PCI resource node for bridge.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| CalculateApertureIo16 (
 | |
|   IN PCI_RESOURCE_NODE    *Bridge
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to calculate the resource aperture
 | |
|   for a given bridge device.
 | |
| 
 | |
|   @param Bridge      PCI resource node for given bridge device.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| CalculateResourceAperture (
 | |
|   IN PCI_RESOURCE_NODE    *Bridge
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Get IO/Memory resource info for given PCI device.
 | |
| 
 | |
|   @param PciDev     Pci device instance.
 | |
|   @param IoNode     Resource info node for IO .
 | |
|   @param Mem32Node  Resource info node for 32-bit memory.
 | |
|   @param PMem32Node Resource info node for 32-bit Prefetchable Memory.
 | |
|   @param Mem64Node  Resource info node for 64-bit memory.
 | |
|   @param PMem64Node Resource info node for 64-bit Prefetchable Memory.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| GetResourceFromDevice (
 | |
|   IN     PCI_IO_DEVICE     *PciDev,
 | |
|   IN OUT PCI_RESOURCE_NODE *IoNode,
 | |
|   IN OUT PCI_RESOURCE_NODE *Mem32Node,
 | |
|   IN OUT PCI_RESOURCE_NODE *PMem32Node,
 | |
|   IN OUT PCI_RESOURCE_NODE *Mem64Node,
 | |
|   IN OUT PCI_RESOURCE_NODE *PMem64Node
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to create a resource node.
 | |
| 
 | |
|   @param PciDev       Pci device instance.
 | |
|   @param Length       Length of Io/Memory resource.
 | |
|   @param Alignment    Alignment of resource.
 | |
|   @param Bar          Bar index.
 | |
|   @param ResType      Type of resource: IO/Memory.
 | |
|   @param ResUsage     Resource usage.
 | |
| 
 | |
|   @return PCI resource node created for given PCI device.
 | |
|           NULL means PCI resource node is not created.
 | |
| 
 | |
| **/
 | |
| PCI_RESOURCE_NODE *
 | |
| CreateResourceNode (
 | |
|   IN PCI_IO_DEVICE         *PciDev,
 | |
|   IN UINT64                Length,
 | |
|   IN UINT64                Alignment,
 | |
|   IN UINT8                 Bar,
 | |
|   IN PCI_BAR_TYPE          ResType,
 | |
|   IN PCI_RESOURCE_USAGE    ResUsage
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to create a IOV VF resource node.
 | |
| 
 | |
|   @param PciDev       Pci device instance.
 | |
|   @param Length       Length of Io/Memory resource.
 | |
|   @param Alignment    Alignment of resource.
 | |
|   @param Bar          Bar index.
 | |
|   @param ResType      Type of resource: IO/Memory.
 | |
|   @param ResUsage     Resource usage.
 | |
| 
 | |
|   @return PCI resource node created for given VF PCI device.
 | |
|           NULL means PCI resource node is not created.
 | |
| 
 | |
| **/
 | |
| PCI_RESOURCE_NODE *
 | |
| CreateVfResourceNode (
 | |
|   IN PCI_IO_DEVICE         *PciDev,
 | |
|   IN UINT64                Length,
 | |
|   IN UINT64                Alignment,
 | |
|   IN UINT8                 Bar,
 | |
|   IN PCI_BAR_TYPE          ResType,
 | |
|   IN PCI_RESOURCE_USAGE    ResUsage
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to extract resource request from
 | |
|   device node list.
 | |
| 
 | |
|   @param Bridge     Pci device instance.
 | |
|   @param IoNode     Resource info node for IO.
 | |
|   @param Mem32Node  Resource info node for 32-bit memory.
 | |
|   @param PMem32Node Resource info node for 32-bit Prefetchable Memory.
 | |
|   @param Mem64Node  Resource info node for 64-bit memory.
 | |
|   @param PMem64Node Resource info node for 64-bit Prefetchable Memory.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| CreateResourceMap (
 | |
|   IN     PCI_IO_DEVICE     *Bridge,
 | |
|   IN OUT PCI_RESOURCE_NODE *IoNode,
 | |
|   IN OUT PCI_RESOURCE_NODE *Mem32Node,
 | |
|   IN OUT PCI_RESOURCE_NODE *PMem32Node,
 | |
|   IN OUT PCI_RESOURCE_NODE *Mem64Node,
 | |
|   IN OUT PCI_RESOURCE_NODE *PMem64Node
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to do the resource padding for a specific platform.
 | |
| 
 | |
|   @param PciDev     Pci device instance.
 | |
|   @param IoNode     Resource info node for IO.
 | |
|   @param Mem32Node  Resource info node for 32-bit memory.
 | |
|   @param PMem32Node Resource info node for 32-bit Prefetchable Memory.
 | |
|   @param Mem64Node  Resource info node for 64-bit memory.
 | |
|   @param PMem64Node Resource info node for 64-bit Prefetchable Memory.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| ResourcePaddingPolicy (
 | |
|   IN PCI_IO_DEVICE     *PciDev,
 | |
|   IN PCI_RESOURCE_NODE *IoNode,
 | |
|   IN PCI_RESOURCE_NODE *Mem32Node,
 | |
|   IN PCI_RESOURCE_NODE *PMem32Node,
 | |
|   IN PCI_RESOURCE_NODE *Mem64Node,
 | |
|   IN PCI_RESOURCE_NODE *PMem64Node
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to degrade resource if the upstream bridge
 | |
|   doesn't support certain resource. Degradation path is
 | |
|   PMEM64 -> MEM64  -> MEM32
 | |
|   PMEM64 -> PMEM32 -> MEM32
 | |
|   IO32   -> IO16.
 | |
| 
 | |
|   @param Bridge     Pci device instance.
 | |
|   @param Mem32Node  Resource info node for 32-bit memory.
 | |
|   @param PMem32Node Resource info node for 32-bit Prefetchable Memory.
 | |
|   @param Mem64Node  Resource info node for 64-bit memory.
 | |
|   @param PMem64Node Resource info node for 64-bit Prefetchable Memory.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| DegradeResource (
 | |
|   IN PCI_IO_DEVICE     *Bridge,
 | |
|   IN PCI_RESOURCE_NODE *Mem32Node,
 | |
|   IN PCI_RESOURCE_NODE *PMem32Node,
 | |
|   IN PCI_RESOURCE_NODE *Mem64Node,
 | |
|   IN PCI_RESOURCE_NODE *PMem64Node
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Test whether bridge device support decode resource.
 | |
| 
 | |
|   @param Bridge    Bridge device instance.
 | |
|   @param Decode    Decode type according to resource type.
 | |
| 
 | |
|   @return TRUE     The bridge device support decode resource.
 | |
|   @return FALSE    The bridge device don't support decode resource.
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| BridgeSupportResourceDecode (
 | |
|   IN PCI_IO_DEVICE *Bridge,
 | |
|   IN UINT32        Decode
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to program the resource allocated
 | |
|   for each resource node under specified bridge.
 | |
| 
 | |
|   @param Base     Base address of resource to be programmed.
 | |
|   @param Bridge   PCI resource node for the bridge device.
 | |
| 
 | |
|   @retval EFI_SUCCESS            Successfully to program all resources
 | |
|                                  on given PCI bridge device.
 | |
|   @retval EFI_OUT_OF_RESOURCES   Base is all one.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| ProgramResource (
 | |
|   IN UINT64            Base,
 | |
|   IN PCI_RESOURCE_NODE *Bridge
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Program Bar register for PCI device.
 | |
| 
 | |
|   @param Base  Base address for PCI device resource to be programmed.
 | |
|   @param Node  Point to resource node structure.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| ProgramBar (
 | |
|   IN UINT64            Base,
 | |
|   IN PCI_RESOURCE_NODE *Node
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Program IOV VF Bar register for PCI device.
 | |
| 
 | |
|   @param Base  Base address for PCI device resource to be programmed.
 | |
|   @param Node  Point to resource node structure.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| ProgramVfBar (
 | |
|   IN UINT64            Base,
 | |
|   IN PCI_RESOURCE_NODE *Node
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Program PCI-PCI bridge aperture.
 | |
| 
 | |
|   @param Base  Base address for resource.
 | |
|   @param Node  Point to resource node structure.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| ProgramPpbApperture (
 | |
|   IN UINT64            Base,
 | |
|   IN PCI_RESOURCE_NODE *Node
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Program parent bridge for Option Rom.
 | |
| 
 | |
|   @param PciDevice      Pci device instance.
 | |
|   @param OptionRomBase  Base address for Option Rom.
 | |
|   @param Enable         Enable or disable PCI memory.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| ProgramUpstreamBridgeForRom (
 | |
|   IN PCI_IO_DEVICE   *PciDevice,
 | |
|   IN UINT32          OptionRomBase,
 | |
|   IN BOOLEAN         Enable
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Test whether resource exists for a bridge.
 | |
| 
 | |
|   @param Bridge  Point to resource node for a bridge.
 | |
| 
 | |
|   @retval TRUE   There is resource on the given bridge.
 | |
|   @retval FALSE  There isn't resource on the given bridge.
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| ResourceRequestExisted (
 | |
|   IN PCI_RESOURCE_NODE    *Bridge
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Initialize resource pool structure.
 | |
| 
 | |
|   @param ResourcePool Point to resource pool structure. This pool
 | |
|                       is reset to all zero when returned.
 | |
|   @param ResourceType Type of resource.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| InitializeResourcePool (
 | |
|   IN OUT PCI_RESOURCE_NODE   *ResourcePool,
 | |
|   IN     PCI_BAR_TYPE        ResourceType
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Destroy given resource tree.
 | |
| 
 | |
|   @param Bridge  PCI resource root node of resource tree.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| DestroyResourceTree (
 | |
|   IN PCI_RESOURCE_NODE *Bridge
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Insert resource padding for P2C.
 | |
| 
 | |
|   @param PciDev     Pci device instance.
 | |
|   @param IoNode     Resource info node for IO.
 | |
|   @param Mem32Node  Resource info node for 32-bit memory.
 | |
|   @param PMem32Node Resource info node for 32-bit Prefetchable Memory.
 | |
|   @param Mem64Node  Resource info node for 64-bit memory.
 | |
|   @param PMem64Node Resource info node for 64-bit Prefetchable Memory.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| ResourcePaddingForCardBusBridge (
 | |
|   IN PCI_IO_DEVICE        *PciDev,
 | |
|   IN PCI_RESOURCE_NODE    *IoNode,
 | |
|   IN PCI_RESOURCE_NODE    *Mem32Node,
 | |
|   IN PCI_RESOURCE_NODE    *PMem32Node,
 | |
|   IN PCI_RESOURCE_NODE    *Mem64Node,
 | |
|   IN PCI_RESOURCE_NODE    *PMem64Node
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Program PCI Card device register for given resource node.
 | |
| 
 | |
|   @param Base    Base address of PCI Card device to be programmed.
 | |
|   @param Node    Given resource node.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| ProgramP2C (
 | |
|   IN UINT64            Base,
 | |
|   IN PCI_RESOURCE_NODE *Node
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Create padding resource node.
 | |
| 
 | |
|   @param PciDev     Pci device instance.
 | |
|   @param IoNode     Resource info node for IO.
 | |
|   @param Mem32Node  Resource info node for 32-bit memory.
 | |
|   @param PMem32Node Resource info node for 32-bit Prefetchable Memory.
 | |
|   @param Mem64Node  Resource info node for 64-bit memory.
 | |
|   @param PMem64Node Resource info node for 64-bit Prefetchable Memory.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| ApplyResourcePadding (
 | |
|   IN PCI_IO_DEVICE         *PciDev,
 | |
|   IN PCI_RESOURCE_NODE     *IoNode,
 | |
|   IN PCI_RESOURCE_NODE     *Mem32Node,
 | |
|   IN PCI_RESOURCE_NODE     *PMem32Node,
 | |
|   IN PCI_RESOURCE_NODE     *Mem64Node,
 | |
|   IN PCI_RESOURCE_NODE     *PMem64Node
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Get padding resource for PCI-PCI bridge.
 | |
| 
 | |
|   @param  PciIoDevice     PCI-PCI bridge device instance.
 | |
| 
 | |
|   @note   Feature flag PcdPciBusHotplugDeviceSupport determines
 | |
|           whether need to pad resource for them.
 | |
| **/
 | |
| VOID
 | |
| GetResourcePaddingPpb (
 | |
|   IN  PCI_IO_DEVICE                  *PciIoDevice
 | |
|   );
 | |
| 
 | |
| #endif
 |