mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-10 14:23:31 +01:00
457 lines
12 KiB
C
457 lines
12 KiB
C
|
/** @file
|
||
|
PCI resources 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_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
|