git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10420 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			496 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			496 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  PCI resouces support functions declaration for PCI Bus module.
 | 
						|
 | 
						|
Copyright (c) 2006 - 2009, 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            = 0,
 | 
						|
  PciResUsagePadding,
 | 
						|
  PciResUsageOptionRomProcessing
 | 
						|
} 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
 | 
						|
  resoure 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 prefectchable 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 resouce node for given bridge device.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
CalculateResourceAperture (
 | 
						|
  IN PCI_RESOURCE_NODE    *Bridge
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Get IO/Memory resource infor 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 extract resource request from
 | 
						|
  IOV VF device node list.
 | 
						|
 | 
						|
  @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 *
 | 
						|
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 progammed.
 | 
						|
  @param Bridge   PCI resource node for the bridge device.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            Successfully to program all resouces
 | 
						|
                                 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 progammed.
 | 
						|
  @param Node  Point to resoure 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 progammed.
 | 
						|
  @param Node  Point to resoure node structure.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
ProgramVfBar (
 | 
						|
  IN UINT64            Base,
 | 
						|
  IN PCI_RESOURCE_NODE *Node
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Program PCI-PCI bridge apperture.
 | 
						|
 | 
						|
  @param Base  Base address for resource.
 | 
						|
  @param Node  Point to resoure node structure.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
ProgramPpbApperture (
 | 
						|
  IN UINT64            Base,
 | 
						|
  IN PCI_RESOURCE_NODE *Node
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Program parent bridge for Option Rom.
 | 
						|
 | 
						|
  @param PciDevice      Pci deivce instance.
 | 
						|
  @param OptionRomBase  Base address for Optiona Rom.
 | 
						|
  @param Enable         Enable or disable PCI memory.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
ProgrameUpstreamBridgeForRom (
 | 
						|
  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
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Get all resource information for given Pci device.
 | 
						|
 | 
						|
  @param PciDev         Pci device instance.
 | 
						|
  @param IoBridge       Io resource node.
 | 
						|
  @param Mem32Bridge    32-bit memory node.
 | 
						|
  @param PMem32Bridge   32-bit Pmemory node.
 | 
						|
  @param Mem64Bridge    64-bit memory node.
 | 
						|
  @param PMem64Bridge   64-bit PMemory node.
 | 
						|
  @param IoPool         Link list header for Io resource.
 | 
						|
  @param Mem32Pool      Link list header for 32-bit memory.
 | 
						|
  @param PMem32Pool     Link list header for 32-bit Prefetchable memory.
 | 
						|
  @param Mem64Pool      Link list header for 64-bit memory.
 | 
						|
  @param PMem64Pool     Link list header for 64-bit Prefetchable memory.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
GetResourceMap (
 | 
						|
  IN PCI_IO_DEVICE      *PciDev,
 | 
						|
  IN PCI_RESOURCE_NODE  **IoBridge,
 | 
						|
  IN PCI_RESOURCE_NODE  **Mem32Bridge,
 | 
						|
  IN PCI_RESOURCE_NODE  **PMem32Bridge,
 | 
						|
  IN PCI_RESOURCE_NODE  **Mem64Bridge,
 | 
						|
  IN PCI_RESOURCE_NODE  **PMem64Bridge,
 | 
						|
  IN PCI_RESOURCE_NODE  *IoPool,
 | 
						|
  IN PCI_RESOURCE_NODE  *Mem32Pool,
 | 
						|
  IN PCI_RESOURCE_NODE  *PMem32Pool,
 | 
						|
  IN PCI_RESOURCE_NODE  *Mem64Pool,
 | 
						|
  IN PCI_RESOURCE_NODE  *PMem64Pool
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Destory 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
 |