2 PCI resouces support functions implemntation for PCI Bus module.
4 Copyright (c) 2006 - 2009, Intel Corporation
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 The function is used to skip VGA range.
20 @param Start Returned start address including VGA range.
21 @param Length The length of VGA range.
35 ASSERT (Start
!= NULL
);
37 // For legacy VGA, bit 10 to bit 15 is not decoded
42 StartOffset
= Original
& Mask
;
43 LimitOffset
= ((*Start
) + Length
- 1) & Mask
;
44 if (LimitOffset
>= VGABASE1
) {
45 *Start
= *Start
- StartOffset
+ VGALIMIT2
+ 1;
50 This function is used to skip ISA aliasing aperture.
52 @param Start Returned start address including ISA aliasing aperture.
53 @param Length The length of ISA aliasing aperture.
57 SkipIsaAliasAperture (
68 ASSERT (Start
!= NULL
);
71 // For legacy ISA, bit 10 to bit 15 is not decoded
76 StartOffset
= Original
& Mask
;
77 LimitOffset
= ((*Start
) + Length
- 1) & Mask
;
79 if (LimitOffset
>= ISABASE
) {
80 *Start
= *Start
- StartOffset
+ ISALIMIT
+ 1;
85 This function inserts a resource node into the resource list.
86 The resource list is sorted in descend order.
88 @param Bridge PCI resource node for bridge.
89 @param ResNode Resource node want to be inserted.
94 IN OUT PCI_RESOURCE_NODE
*Bridge
,
95 IN PCI_RESOURCE_NODE
*ResNode
98 LIST_ENTRY
*CurrentLink
;
99 PCI_RESOURCE_NODE
*Temp
;
100 UINT64 ResNodeAlignRest
;
101 UINT64 TempAlignRest
;
103 ASSERT (Bridge
!= NULL
);
104 ASSERT (ResNode
!= NULL
);
106 InsertHeadList (&Bridge
->ChildList
, &ResNode
->Link
);
108 CurrentLink
= Bridge
->ChildList
.ForwardLink
->ForwardLink
;
109 while (CurrentLink
!= &Bridge
->ChildList
) {
110 Temp
= RESOURCE_NODE_FROM_LINK (CurrentLink
);
112 if (ResNode
->Alignment
> Temp
->Alignment
) {
114 } else if (ResNode
->Alignment
== Temp
->Alignment
) {
115 ResNodeAlignRest
= ResNode
->Length
& ResNode
->Alignment
;
116 TempAlignRest
= Temp
->Length
& Temp
->Alignment
;
117 if ((ResNodeAlignRest
== 0) || (ResNodeAlignRest
>= TempAlignRest
)) {
122 SwapListEntries (&ResNode
->Link
, CurrentLink
);
124 CurrentLink
= ResNode
->Link
.ForwardLink
;
129 This routine is used to merge two different resource trees in need of
132 For example, if an upstream PPB doesn't support,
133 prefetchable memory decoding, the PCI bus driver will choose to call this function
134 to merge prefectchable memory resource list into normal memory list.
136 If the TypeMerge is TRUE, Res resource type is changed to the type of destination resource
138 If Dst is NULL or Res is NULL, ASSERT ().
140 @param Dst Point to destination resource tree.
141 @param Res Point to source resource tree.
142 @param TypeMerge If the TypeMerge is TRUE, Res resource type is changed to the type of
143 destination resource type.
148 IN PCI_RESOURCE_NODE
*Dst
,
149 IN PCI_RESOURCE_NODE
*Res
,
154 LIST_ENTRY
*CurrentLink
;
155 PCI_RESOURCE_NODE
*Temp
;
157 ASSERT (Dst
!= NULL
);
158 ASSERT (Res
!= NULL
);
160 while (!IsListEmpty (&Res
->ChildList
)) {
161 CurrentLink
= Res
->ChildList
.ForwardLink
;
163 Temp
= RESOURCE_NODE_FROM_LINK (CurrentLink
);
166 Temp
->ResType
= Dst
->ResType
;
169 RemoveEntryList (CurrentLink
);
170 InsertResourceNode (Dst
, Temp
);
175 This function is used to calculate the IO16 aperture
178 @param Bridge PCI resource node for bridge.
182 CalculateApertureIo16 (
183 IN PCI_RESOURCE_NODE
*Bridge
188 LIST_ENTRY
*CurrentLink
;
189 PCI_RESOURCE_NODE
*Node
;
193 EFI_PCI_PLATFORM_POLICY PciPolicy
;
196 // Always assume there is ISA device and VGA device on the platform
197 // will be customized later
203 // Check PciPlatform policy
205 if (gPciPlatformProtocol
!= NULL
) {
206 Status
= gPciPlatformProtocol
->GetPlatformPolicy (
207 gPciPlatformProtocol
,
210 if (!EFI_ERROR (Status
)) {
211 if ((PciPolicy
& EFI_RESERVE_ISA_IO_ALIAS
) != 0) {
214 if ((PciPolicy
& EFI_RESERVE_VGA_IO_ALIAS
) != 0) {
222 if (Bridge
== NULL
) {
226 CurrentLink
= Bridge
->ChildList
.ForwardLink
;
229 // Assume the bridge is aligned
231 while (CurrentLink
!= &Bridge
->ChildList
) {
233 Node
= RESOURCE_NODE_FROM_LINK (CurrentLink
);
236 // Consider the aperture alignment
238 Offset
= Aperture
& (Node
->Alignment
);
242 Aperture
= Aperture
+ (Node
->Alignment
+ 1) - Offset
;
247 // IsaEnable and VGAEnable can not be implemented now.
248 // If both of them are enabled, then the IO resource would
249 // become too limited to meet the requirement of most of devices.
251 if (IsaEnable
|| VGAEnable
) {
252 if (!IS_PCI_BRIDGE (&(Node
->PciDev
->Pci
)) && !IS_CARDBUS_BRIDGE (&(Node
->PciDev
->Pci
))) {
254 // Check if there is need to support ISA/VGA decoding
255 // If so, we need to avoid isa/vga aliasing range
258 SkipIsaAliasAperture (
262 Offset
= Aperture
& (Node
->Alignment
);
264 Aperture
= Aperture
+ (Node
->Alignment
+ 1) - Offset
;
266 } else if (VGAEnable
) {
271 Offset
= Aperture
& (Node
->Alignment
);
273 Aperture
= Aperture
+ (Node
->Alignment
+ 1) - Offset
;
279 Node
->Offset
= Aperture
;
282 // Increment aperture by the length of node
284 Aperture
+= Node
->Length
;
286 CurrentLink
= CurrentLink
->ForwardLink
;
290 // At last, adjust the aperture with the bridge's
293 Offset
= Aperture
& (Bridge
->Alignment
);
296 Aperture
= Aperture
+ (Bridge
->Alignment
+ 1) - Offset
;
299 Bridge
->Length
= Aperture
;
301 // At last, adjust the bridge's alignment to the first child's alignment
302 // if the bridge has at least one child
304 CurrentLink
= Bridge
->ChildList
.ForwardLink
;
305 if (CurrentLink
!= &Bridge
->ChildList
) {
306 Node
= RESOURCE_NODE_FROM_LINK (CurrentLink
);
307 if (Node
->Alignment
> Bridge
->Alignment
) {
308 Bridge
->Alignment
= Node
->Alignment
;
314 This function is used to calculate the resource aperture
315 for a given bridge device.
317 @param Bridge PCI resouce node for given bridge device.
321 CalculateResourceAperture (
322 IN PCI_RESOURCE_NODE
*Bridge
326 LIST_ENTRY
*CurrentLink
;
327 PCI_RESOURCE_NODE
*Node
;
333 if (Bridge
== NULL
) {
337 if (Bridge
->ResType
== PciBarTypeIo16
) {
339 CalculateApertureIo16 (Bridge
);
343 CurrentLink
= Bridge
->ChildList
.ForwardLink
;
346 // Assume the bridge is aligned
348 while (CurrentLink
!= &Bridge
->ChildList
) {
350 Node
= RESOURCE_NODE_FROM_LINK (CurrentLink
);
353 // Apply padding resource if available
355 Offset
= Aperture
& (Node
->Alignment
);
359 Aperture
= Aperture
+ (Node
->Alignment
+ 1) - Offset
;
364 // Recode current aperture as a offset
365 // this offset will be used in future real allocation
367 Node
->Offset
= Aperture
;
370 // Increment aperture by the length of node
372 Aperture
+= Node
->Length
;
375 // Consider the aperture alignment
377 CurrentLink
= CurrentLink
->ForwardLink
;
381 // At last, adjust the aperture with the bridge's
384 Offset
= Aperture
& (Bridge
->Alignment
);
386 Aperture
= Aperture
+ (Bridge
->Alignment
+ 1) - Offset
;
390 // If the bridge has already padded the resource and the
391 // amount of padded resource is larger, then keep the
394 if (Bridge
->Length
< Aperture
) {
395 Bridge
->Length
= Aperture
;
399 // At last, adjust the bridge's alignment to the first child's alignment
400 // if the bridge has at least one child
402 CurrentLink
= Bridge
->ChildList
.ForwardLink
;
403 if (CurrentLink
!= &Bridge
->ChildList
) {
404 Node
= RESOURCE_NODE_FROM_LINK (CurrentLink
);
405 if (Node
->Alignment
> Bridge
->Alignment
) {
406 Bridge
->Alignment
= Node
->Alignment
;
412 Get IO/Memory resource infor for given PCI device.
414 @param PciDev Pci device instance.
415 @param IoNode Resource info node for IO .
416 @param Mem32Node Resource info node for 32-bit memory.
417 @param PMem32Node Resource info node for 32-bit Prefetchable Memory.
418 @param Mem64Node Resource info node for 64-bit memory.
419 @param PMem64Node Resource info node for 64-bit Prefetchable Memory.
423 GetResourceFromDevice (
424 IN PCI_IO_DEVICE
*PciDev
,
425 IN OUT PCI_RESOURCE_NODE
*IoNode
,
426 IN OUT PCI_RESOURCE_NODE
*Mem32Node
,
427 IN OUT PCI_RESOURCE_NODE
*PMem32Node
,
428 IN OUT PCI_RESOURCE_NODE
*Mem64Node
,
429 IN OUT PCI_RESOURCE_NODE
*PMem64Node
434 PCI_RESOURCE_NODE
*Node
;
435 BOOLEAN ResourceRequested
;
438 ResourceRequested
= FALSE
;
440 for (Index
= 0; Index
< PCI_MAX_BAR
; Index
++) {
442 switch ((PciDev
->PciBar
)[Index
].BarType
) {
444 case PciBarTypeMem32
:
446 Node
= CreateResourceNode (
448 (PciDev
->PciBar
)[Index
].Length
,
449 (PciDev
->PciBar
)[Index
].Alignment
,
460 ResourceRequested
= TRUE
;
463 case PciBarTypeMem64
:
465 Node
= CreateResourceNode (
467 (PciDev
->PciBar
)[Index
].Length
,
468 (PciDev
->PciBar
)[Index
].Alignment
,
479 ResourceRequested
= TRUE
;
482 case PciBarTypePMem64
:
484 Node
= CreateResourceNode (
486 (PciDev
->PciBar
)[Index
].Length
,
487 (PciDev
->PciBar
)[Index
].Alignment
,
498 ResourceRequested
= TRUE
;
501 case PciBarTypePMem32
:
503 Node
= CreateResourceNode (
505 (PciDev
->PciBar
)[Index
].Length
,
506 (PciDev
->PciBar
)[Index
].Alignment
,
516 ResourceRequested
= TRUE
;
522 Node
= CreateResourceNode (
524 (PciDev
->PciBar
)[Index
].Length
,
525 (PciDev
->PciBar
)[Index
].Alignment
,
535 ResourceRequested
= TRUE
;
538 case PciBarTypeUnknown
:
549 for (Index
= 0; Index
< PCI_MAX_BAR
; Index
++) {
551 switch ((PciDev
->VfPciBar
)[Index
].BarType
) {
553 case PciBarTypeMem32
:
555 Node
= CreateVfResourceNode (
557 (PciDev
->VfPciBar
)[Index
].Length
,
558 (PciDev
->VfPciBar
)[Index
].Alignment
,
571 case PciBarTypeMem64
:
573 Node
= CreateVfResourceNode (
575 (PciDev
->VfPciBar
)[Index
].Length
,
576 (PciDev
->VfPciBar
)[Index
].Alignment
,
589 case PciBarTypePMem64
:
591 Node
= CreateVfResourceNode (
593 (PciDev
->VfPciBar
)[Index
].Length
,
594 (PciDev
->VfPciBar
)[Index
].Alignment
,
607 case PciBarTypePMem32
:
609 Node
= CreateVfResourceNode (
611 (PciDev
->VfPciBar
)[Index
].Length
,
612 (PciDev
->VfPciBar
)[Index
].Alignment
,
628 case PciBarTypeUnknown
:
635 // If there is no resource requested from this device,
636 // then we indicate this device has been allocated naturally.
638 if (!ResourceRequested
) {
639 PciDev
->Allocated
= TRUE
;
644 This function is used to create a resource node.
646 @param PciDev Pci device instance.
647 @param Length Length of Io/Memory resource.
648 @param Alignment Alignment of resource.
649 @param Bar Bar index.
650 @param ResType Type of resource: IO/Memory.
651 @param ResUsage Resource usage.
653 @return PCI resource node created for given PCI device.
654 NULL means PCI resource node is not created.
659 IN PCI_IO_DEVICE
*PciDev
,
663 IN PCI_BAR_TYPE ResType
,
664 IN PCI_RESOURCE_USAGE ResUsage
667 PCI_RESOURCE_NODE
*Node
;
671 Node
= AllocateZeroPool (sizeof (PCI_RESOURCE_NODE
));
672 ASSERT (Node
!= NULL
);
677 Node
->Signature
= PCI_RESOURCE_SIGNATURE
;
678 Node
->PciDev
= PciDev
;
679 Node
->Length
= Length
;
680 Node
->Alignment
= Alignment
;
682 Node
->ResType
= ResType
;
683 Node
->Reserved
= FALSE
;
684 Node
->ResourceUsage
= ResUsage
;
685 InitializeListHead (&Node
->ChildList
);
691 This function is used to create a IOV VF resource node.
693 @param PciDev Pci device instance.
694 @param Length Length of Io/Memory resource.
695 @param Alignment Alignment of resource.
696 @param Bar Bar index.
697 @param ResType Type of resource: IO/Memory.
698 @param ResUsage Resource usage.
700 @return PCI resource node created for given VF PCI device.
701 NULL means PCI resource node is not created.
705 CreateVfResourceNode (
706 IN PCI_IO_DEVICE
*PciDev
,
710 IN PCI_BAR_TYPE ResType
,
711 IN PCI_RESOURCE_USAGE ResUsage
714 PCI_RESOURCE_NODE
*Node
;
718 "PCI-IOV B%x.D%x.F%x - VfResource (Bar - 0x%x) (Type - 0x%x) (Length - 0x%x)\n",
719 (UINTN
)PciDev
->BusNumber
,
720 (UINTN
)PciDev
->DeviceNumber
,
721 (UINTN
)PciDev
->FunctionNumber
,
727 Node
= CreateResourceNode (PciDev
, Length
, Alignment
, Bar
, ResType
, ResUsage
);
732 Node
->Virtual
= TRUE
;
738 This function is used to extract resource request from
741 @param Bridge Pci device instance.
742 @param IoNode Resource info node for IO.
743 @param Mem32Node Resource info node for 32-bit memory.
744 @param PMem32Node Resource info node for 32-bit Prefetchable Memory.
745 @param Mem64Node Resource info node for 64-bit memory.
746 @param PMem64Node Resource info node for 64-bit Prefetchable Memory.
751 IN PCI_IO_DEVICE
*Bridge
,
752 IN OUT PCI_RESOURCE_NODE
*IoNode
,
753 IN OUT PCI_RESOURCE_NODE
*Mem32Node
,
754 IN OUT PCI_RESOURCE_NODE
*PMem32Node
,
755 IN OUT PCI_RESOURCE_NODE
*Mem64Node
,
756 IN OUT PCI_RESOURCE_NODE
*PMem64Node
760 PCI_RESOURCE_NODE
*IoBridge
;
761 PCI_RESOURCE_NODE
*Mem32Bridge
;
762 PCI_RESOURCE_NODE
*PMem32Bridge
;
763 PCI_RESOURCE_NODE
*Mem64Bridge
;
764 PCI_RESOURCE_NODE
*PMem64Bridge
;
765 LIST_ENTRY
*CurrentLink
;
767 CurrentLink
= Bridge
->ChildList
.ForwardLink
;
769 while (CurrentLink
!= NULL
&& CurrentLink
!= &Bridge
->ChildList
) {
771 Temp
= PCI_IO_DEVICE_FROM_LINK (CurrentLink
);
774 // Create resource nodes for this device by scanning the
775 // Bar array in the device private data
776 // If the upstream bridge doesn't support this device,
777 // no any resource node will be created for this device
779 GetResourceFromDevice (
788 if (IS_PCI_BRIDGE (&Temp
->Pci
)) {
791 // If the device has children, create a bridge resource node for this PPB
792 // Note: For PPB, memory aperture is aligned with 1MB and IO aperture
793 // is aligned with 4KB
794 // This device is typically a bridge device like PPB and P2C
795 // Note: 0x1000 aligned
797 IoBridge
= CreateResourceNode (
806 Mem32Bridge
= CreateResourceNode (
815 PMem32Bridge
= CreateResourceNode (
824 Mem64Bridge
= CreateResourceNode (
833 PMem64Bridge
= CreateResourceNode (
843 // Recursively create resouce map on this bridge
854 if (ResourceRequestExisted (IoBridge
)) {
865 // If there is node under this resource bridge,
866 // then calculate bridge's aperture of this type
867 // and insert it into the respective resource tree.
868 // If no, delete this resource bridge
870 if (ResourceRequestExisted (Mem32Bridge
)) {
876 FreePool (Mem32Bridge
);
881 // If there is node under this resource bridge,
882 // then calculate bridge's aperture of this type
883 // and insert it into the respective resource tree.
884 // If no, delete this resource bridge
886 if (ResourceRequestExisted (PMem32Bridge
)) {
892 FreePool (PMem32Bridge
);
897 // If there is node under this resource bridge,
898 // then calculate bridge's aperture of this type
899 // and insert it into the respective resource tree.
900 // If no, delete this resource bridge
902 if (ResourceRequestExisted (Mem64Bridge
)) {
908 FreePool (Mem64Bridge
);
913 // If there is node under this resource bridge,
914 // then calculate bridge's aperture of this type
915 // and insert it into the respective resource tree.
916 // If no, delete this resource bridge
918 if (ResourceRequestExisted (PMem64Bridge
)) {
924 FreePool (PMem64Bridge
);
931 // If it is P2C, apply hard coded resource padding
933 if (IS_CARDBUS_BRIDGE (&Temp
->Pci
)) {
934 ResourcePaddingForCardBusBridge (
944 CurrentLink
= CurrentLink
->ForwardLink
;
948 // To do some platform specific resource padding ...
950 ResourcePaddingPolicy (
960 // Degrade resource if necessary
971 // Calculate resource aperture for this bridge device
973 CalculateResourceAperture (Mem32Node
);
974 CalculateResourceAperture (PMem32Node
);
975 CalculateResourceAperture (Mem64Node
);
976 CalculateResourceAperture (PMem64Node
);
977 CalculateResourceAperture (IoNode
);
981 This function is used to do the resource padding for a specific platform.
983 @param PciDev Pci device instance.
984 @param IoNode Resource info node for IO.
985 @param Mem32Node Resource info node for 32-bit memory.
986 @param PMem32Node Resource info node for 32-bit Prefetchable Memory.
987 @param Mem64Node Resource info node for 64-bit memory.
988 @param PMem64Node Resource info node for 64-bit Prefetchable Memory.
992 ResourcePaddingPolicy (
993 IN PCI_IO_DEVICE
*PciDev
,
994 IN PCI_RESOURCE_NODE
*IoNode
,
995 IN PCI_RESOURCE_NODE
*Mem32Node
,
996 IN PCI_RESOURCE_NODE
*PMem32Node
,
997 IN PCI_RESOURCE_NODE
*Mem64Node
,
998 IN PCI_RESOURCE_NODE
*PMem64Node
1002 // Create padding resource node
1004 if (PciDev
->ResourcePaddingDescriptors
!= NULL
) {
1005 ApplyResourcePadding (
1017 This function is used to degrade resource if the upstream bridge
1018 doesn't support certain resource. Degradation path is
1019 PMEM64 -> MEM64 -> MEM32
1020 PMEM64 -> PMEM32 -> MEM32
1023 @param Bridge Pci device instance.
1024 @param Mem32Node Resource info node for 32-bit memory.
1025 @param PMem32Node Resource info node for 32-bit Prefetchable Memory.
1026 @param Mem64Node Resource info node for 64-bit memory.
1027 @param PMem64Node Resource info node for 64-bit Prefetchable Memory.
1032 IN PCI_IO_DEVICE
*Bridge
,
1033 IN PCI_RESOURCE_NODE
*Mem32Node
,
1034 IN PCI_RESOURCE_NODE
*PMem32Node
,
1035 IN PCI_RESOURCE_NODE
*Mem64Node
,
1036 IN PCI_RESOURCE_NODE
*PMem64Node
1040 PCI_IO_DEVICE
*Temp
;
1041 LIST_ENTRY
*CurrentLink
;
1044 // For RootBridge, PPB , P2C, go recursively to traverse all its children
1045 // to find if this bridge and downstream has OptionRom.
1048 CurrentLink
= Bridge
->ChildList
.ForwardLink
;
1049 while (CurrentLink
!= NULL
&& CurrentLink
!= &Bridge
->ChildList
) {
1051 Temp
= PCI_IO_DEVICE_FROM_LINK (CurrentLink
);
1052 if (Temp
->RomSize
!= 0) {
1056 CurrentLink
= CurrentLink
->ForwardLink
;
1060 // If bridge doesn't support Prefetchable
1061 // memory64, degrade it to Prefetchable memory32
1063 if (!BridgeSupportResourceDecode (Bridge
, EFI_BRIDGE_PMEM64_DECODE_SUPPORTED
)) {
1071 // if no PMem32 request and no OptionRom request, still keep PMem64. Otherwise degrade to PMem32
1073 if ((PMem32Node
!= NULL
&& (PMem32Node
->Length
!= 0 && Bridge
->Parent
!= NULL
)) || HasOprom
) {
1075 // Fixed the issue that there is no resource for 64-bit (above 4G)
1087 // If bridge doesn't support Mem64
1088 // degrade it to mem32
1090 if (!BridgeSupportResourceDecode (Bridge
, EFI_BRIDGE_MEM64_DECODE_SUPPORTED
)) {
1099 // If bridge doesn't support Pmem32
1100 // degrade it to mem32
1102 if (!BridgeSupportResourceDecode (Bridge
, EFI_BRIDGE_PMEM32_DECODE_SUPPORTED
)) {
1111 // if bridge supports combined Pmem Mem decoding
1112 // merge these two type of resource
1114 if (BridgeSupportResourceDecode (Bridge
, EFI_BRIDGE_PMEM_MEM_COMBINE_SUPPORTED
)) {
1130 Test whether bridge device support decode resource.
1132 @param Bridge Bridge device instance.
1133 @param Decode Decode type according to resource type.
1135 @return TRUE The bridge device support decode resource.
1136 @return FALSE The bridge device don't support decode resource.
1140 BridgeSupportResourceDecode (
1141 IN PCI_IO_DEVICE
*Bridge
,
1145 if (((Bridge
->Decodes
) & Decode
) != 0) {
1153 This function is used to program the resource allocated
1154 for each resource node under specified bridge.
1156 @param Base Base address of resource to be progammed.
1157 @param Bridge PCI resource node for the bridge device.
1159 @retval EFI_SUCCESS Successfully to program all resouces
1160 on given PCI bridge device.
1161 @retval EFI_OUT_OF_RESOURCES Base is all one.
1167 IN PCI_RESOURCE_NODE
*Bridge
1170 LIST_ENTRY
*CurrentLink
;
1171 PCI_RESOURCE_NODE
*Node
;
1174 if (Base
== gAllOne
) {
1175 return EFI_OUT_OF_RESOURCES
;
1178 CurrentLink
= Bridge
->ChildList
.ForwardLink
;
1180 while (CurrentLink
!= &Bridge
->ChildList
) {
1182 Node
= RESOURCE_NODE_FROM_LINK (CurrentLink
);
1184 if (!IS_PCI_BRIDGE (&(Node
->PciDev
->Pci
))) {
1186 if (IS_CARDBUS_BRIDGE (&(Node
->PciDev
->Pci
))) {
1188 // Program the PCI Card Bus device
1190 ProgramP2C (Base
, Node
);
1193 // Program the PCI device BAR
1195 ProgramBar (Base
, Node
);
1199 // Program the PCI devices under this bridge
1201 Status
= ProgramResource (Base
+ Node
->Offset
, Node
);
1202 if (EFI_ERROR (Status
)) {
1206 ProgramPpbApperture (Base
, Node
);
1209 CurrentLink
= CurrentLink
->ForwardLink
;
1216 Program Bar register for PCI device.
1218 @param Base Base address for PCI device resource to be progammed.
1219 @param Node Point to resoure node structure.
1225 IN PCI_RESOURCE_NODE
*Node
1228 EFI_PCI_IO_PROTOCOL
*PciIo
;
1232 ASSERT (Node
->Bar
< PCI_MAX_BAR
);
1237 if (Node
->Virtual
) {
1238 ProgramVfBar (Base
, Node
);
1242 PciIo
= &(Node
->PciDev
->PciIo
);
1244 Address
= Base
+ Node
->Offset
;
1247 // Indicate pci bus driver has allocated
1248 // resource for this device
1249 // It might be a temporary solution here since
1250 // pci device could have multiple bar
1252 Node
->PciDev
->Allocated
= TRUE
;
1254 switch ((Node
->PciDev
->PciBar
[Node
->Bar
]).BarType
) {
1256 case PciBarTypeIo16
:
1257 case PciBarTypeIo32
:
1258 case PciBarTypeMem32
:
1259 case PciBarTypePMem32
:
1263 EfiPciIoWidthUint32
,
1264 (Node
->PciDev
->PciBar
[Node
->Bar
]).Offset
,
1269 Node
->PciDev
->PciBar
[Node
->Bar
].BaseAddress
= Address
;
1273 case PciBarTypeMem64
:
1274 case PciBarTypePMem64
:
1276 Address32
= (UINT32
) (Address
& 0x00000000FFFFFFFF);
1280 EfiPciIoWidthUint32
,
1281 (Node
->PciDev
->PciBar
[Node
->Bar
]).Offset
,
1286 Address32
= (UINT32
) RShiftU64 (Address
, 32);
1290 EfiPciIoWidthUint32
,
1291 (UINT8
) ((Node
->PciDev
->PciBar
[Node
->Bar
]).Offset
+ 4),
1296 Node
->PciDev
->PciBar
[Node
->Bar
].BaseAddress
= Address
;
1306 Program IOV VF Bar register for PCI device.
1308 @param Base Base address for PCI device resource to be progammed.
1309 @param Node Point to resoure node structure.
1315 IN PCI_RESOURCE_NODE
*Node
1318 EFI_PCI_IO_PROTOCOL
*PciIo
;
1322 ASSERT (Node
->Virtual
);
1323 if (!Node
->Virtual
) {
1324 return EFI_UNSUPPORTED
;
1328 PciIo
= &(Node
->PciDev
->PciIo
);
1330 Address
= Base
+ Node
->Offset
;
1333 // Indicate pci bus driver has allocated
1334 // resource for this device
1335 // It might be a temporary solution here since
1336 // pci device could have multiple bar
1338 Node
->PciDev
->Allocated
= TRUE
;
1340 switch ((Node
->PciDev
->VfPciBar
[Node
->Bar
]).BarType
) {
1342 case PciBarTypeMem32
:
1343 case PciBarTypePMem32
:
1347 EfiPciIoWidthUint32
,
1348 (Node
->PciDev
->VfPciBar
[Node
->Bar
]).Offset
,
1353 Node
->PciDev
->VfPciBar
[Node
->Bar
].BaseAddress
= Address
;
1357 "PCI-IOV B%x.D%x.F%x - VF Bar (Offset - 0x%x) 32Mem (Address - 0x%x)\n",
1358 (UINTN
)Node
->PciDev
->BusNumber
,
1359 (UINTN
)Node
->PciDev
->DeviceNumber
,
1360 (UINTN
)Node
->PciDev
->FunctionNumber
,
1361 (UINTN
)(Node
->PciDev
->VfPciBar
[Node
->Bar
]).Offset
,
1367 case PciBarTypeMem64
:
1368 case PciBarTypePMem64
:
1370 Address32
= (UINT32
) (Address
& 0x00000000FFFFFFFF);
1374 EfiPciIoWidthUint32
,
1375 (Node
->PciDev
->VfPciBar
[Node
->Bar
]).Offset
,
1380 Address32
= (UINT32
) RShiftU64 (Address
, 32);
1384 EfiPciIoWidthUint32
,
1385 ((Node
->PciDev
->VfPciBar
[Node
->Bar
]).Offset
+ 4),
1390 Node
->PciDev
->VfPciBar
[Node
->Bar
].BaseAddress
= Address
;
1394 "PCI-IOV B%x.D%x.F%x - VF Bar (Offset - 0x%x) 64Mem (Address - 0x%lx)\n",
1395 (UINTN
)Node
->PciDev
->BusNumber
,
1396 (UINTN
)Node
->PciDev
->DeviceNumber
,
1397 (UINTN
)Node
->PciDev
->FunctionNumber
,
1398 (UINTN
)(Node
->PciDev
->VfPciBar
[Node
->Bar
]).Offset
,
1404 case PciBarTypeIo16
:
1405 case PciBarTypeIo32
:
1416 Program PCI-PCI bridge apperture.
1418 @param Base Base address for resource.
1419 @param Node Point to resoure node structure.
1423 ProgramPpbApperture (
1425 IN PCI_RESOURCE_NODE
*Node
1428 EFI_PCI_IO_PROTOCOL
*PciIo
;
1434 // If no device resource of this PPB, return anyway
1435 // Apperture is set default in the initialization code
1437 if (Node
->Length
== 0 || Node
->ResourceUsage
== PciResUsagePadding
) {
1439 // For padding resource node, just ignore when programming
1444 PciIo
= &(Node
->PciDev
->PciIo
);
1445 Address
= Base
+ Node
->Offset
;
1448 // Indicate the PPB resource has been allocated
1450 Node
->PciDev
->Allocated
= TRUE
;
1452 switch (Node
->Bar
) {
1458 EfiPciIoWidthUint32
,
1459 (Node
->PciDev
->PciBar
[Node
->Bar
]).Offset
,
1464 Node
->PciDev
->PciBar
[Node
->Bar
].BaseAddress
= Address
;
1465 Node
->PciDev
->PciBar
[Node
->Bar
].Length
= Node
->Length
;
1471 Address32
= ((UINT32
) (Address
)) >> 8;
1483 EfiPciIoWidthUint16
,
1489 Address32
= (UINT32
) (Address
+ Node
->Length
- 1);
1490 Address32
= ((UINT32
) (Address32
)) >> 8;
1502 EfiPciIoWidthUint16
,
1508 Node
->PciDev
->PciBar
[Node
->Bar
].BaseAddress
= Address
;
1509 Node
->PciDev
->PciBar
[Node
->Bar
].Length
= Node
->Length
;
1512 case PPB_MEM32_RANGE
:
1514 Address32
= ((UINT32
) (Address
)) >> 16;
1517 EfiPciIoWidthUint16
,
1523 Address32
= (UINT32
) (Address
+ Node
->Length
- 1);
1524 Address32
= ((UINT32
) (Address32
)) >> 16;
1527 EfiPciIoWidthUint16
,
1533 Node
->PciDev
->PciBar
[Node
->Bar
].BaseAddress
= Address
;
1534 Node
->PciDev
->PciBar
[Node
->Bar
].Length
= Node
->Length
;
1537 case PPB_PMEM32_RANGE
:
1538 case PPB_PMEM64_RANGE
:
1540 Address32
= ((UINT32
) (Address
)) >> 16;
1543 EfiPciIoWidthUint16
,
1549 Address32
= (UINT32
) (Address
+ Node
->Length
- 1);
1550 Address32
= ((UINT32
) (Address32
)) >> 16;
1553 EfiPciIoWidthUint16
,
1559 Address32
= (UINT32
) RShiftU64 (Address
, 32);
1562 EfiPciIoWidthUint32
,
1568 Address32
= (UINT32
) RShiftU64 ((Address
+ Node
->Length
- 1), 32);
1571 EfiPciIoWidthUint32
,
1577 Node
->PciDev
->PciBar
[Node
->Bar
].BaseAddress
= Address
;
1578 Node
->PciDev
->PciBar
[Node
->Bar
].Length
= Node
->Length
;
1587 Program parent bridge for Option Rom.
1589 @param PciDevice Pci deivce instance.
1590 @param OptionRomBase Base address for Optiona Rom.
1591 @param Enable Enable or disable PCI memory.
1595 ProgrameUpstreamBridgeForRom (
1596 IN PCI_IO_DEVICE
*PciDevice
,
1597 IN UINT32 OptionRomBase
,
1601 PCI_IO_DEVICE
*Parent
;
1602 PCI_RESOURCE_NODE Node
;
1604 // For root bridge, just return.
1606 Parent
= PciDevice
->Parent
;
1607 ZeroMem (&Node
, sizeof (Node
));
1608 while (Parent
!= NULL
) {
1609 if (!IS_PCI_BRIDGE (&Parent
->Pci
)) {
1613 Node
.PciDev
= Parent
;
1614 Node
.Length
= PciDevice
->RomSize
;
1616 Node
.Bar
= PPB_MEM32_RANGE
;
1617 Node
.ResType
= PciBarTypeMem32
;
1621 // Program PPB to only open a single <= 16MB apperture
1624 ProgramPpbApperture (OptionRomBase
, &Node
);
1625 PCI_ENABLE_COMMAND_REGISTER (Parent
, EFI_PCI_COMMAND_MEMORY_SPACE
);
1627 InitializePpb (Parent
);
1628 PCI_DISABLE_COMMAND_REGISTER (Parent
, EFI_PCI_COMMAND_MEMORY_SPACE
);
1631 Parent
= Parent
->Parent
;
1636 Test whether resource exists for a bridge.
1638 @param Bridge Point to resource node for a bridge.
1640 @retval TRUE There is resource on the given bridge.
1641 @retval FALSE There isn't resource on the given bridge.
1645 ResourceRequestExisted (
1646 IN PCI_RESOURCE_NODE
*Bridge
1649 if (Bridge
!= NULL
) {
1650 if (!IsListEmpty (&Bridge
->ChildList
) || Bridge
->Length
!= 0) {
1659 Initialize resource pool structure.
1661 @param ResourcePool Point to resource pool structure. This pool
1662 is reset to all zero when returned.
1663 @param ResourceType Type of resource.
1667 InitializeResourcePool (
1668 IN OUT PCI_RESOURCE_NODE
*ResourcePool
,
1669 IN PCI_BAR_TYPE ResourceType
1672 ZeroMem (ResourcePool
, sizeof (PCI_RESOURCE_NODE
));
1673 ResourcePool
->ResType
= ResourceType
;
1674 ResourcePool
->Signature
= PCI_RESOURCE_SIGNATURE
;
1675 InitializeListHead (&ResourcePool
->ChildList
);
1680 Get all resource information for given Pci device.
1682 @param PciDev Pci device instance.
1683 @param IoBridge Io resource node.
1684 @param Mem32Bridge 32-bit memory node.
1685 @param PMem32Bridge 32-bit Pmemory node.
1686 @param Mem64Bridge 64-bit memory node.
1687 @param PMem64Bridge 64-bit PMemory node.
1688 @param IoPool Link list header for Io resource.
1689 @param Mem32Pool Link list header for 32-bit memory.
1690 @param PMem32Pool Link list header for 32-bit Prefetchable memory.
1691 @param Mem64Pool Link list header for 64-bit memory.
1692 @param PMem64Pool Link list header for 64-bit Prefetchable memory.
1697 IN PCI_IO_DEVICE
*PciDev
,
1698 IN PCI_RESOURCE_NODE
**IoBridge
,
1699 IN PCI_RESOURCE_NODE
**Mem32Bridge
,
1700 IN PCI_RESOURCE_NODE
**PMem32Bridge
,
1701 IN PCI_RESOURCE_NODE
**Mem64Bridge
,
1702 IN PCI_RESOURCE_NODE
**PMem64Bridge
,
1703 IN PCI_RESOURCE_NODE
*IoPool
,
1704 IN PCI_RESOURCE_NODE
*Mem32Pool
,
1705 IN PCI_RESOURCE_NODE
*PMem32Pool
,
1706 IN PCI_RESOURCE_NODE
*Mem64Pool
,
1707 IN PCI_RESOURCE_NODE
*PMem64Pool
1711 PCI_RESOURCE_NODE
*Temp
;
1712 LIST_ENTRY
*CurrentLink
;
1714 CurrentLink
= IoPool
->ChildList
.ForwardLink
;
1717 // Get Io resource map
1719 while (CurrentLink
!= &IoPool
->ChildList
) {
1721 Temp
= RESOURCE_NODE_FROM_LINK (CurrentLink
);
1723 if (Temp
->PciDev
== PciDev
) {
1727 CurrentLink
= CurrentLink
->ForwardLink
;
1731 // Get Mem32 resource map
1733 CurrentLink
= Mem32Pool
->ChildList
.ForwardLink
;
1735 while (CurrentLink
!= &Mem32Pool
->ChildList
) {
1737 Temp
= RESOURCE_NODE_FROM_LINK (CurrentLink
);
1739 if (Temp
->PciDev
== PciDev
) {
1740 *Mem32Bridge
= Temp
;
1743 CurrentLink
= CurrentLink
->ForwardLink
;
1747 // Get Pmem32 resource map
1749 CurrentLink
= PMem32Pool
->ChildList
.ForwardLink
;
1751 while (CurrentLink
!= &PMem32Pool
->ChildList
) {
1753 Temp
= RESOURCE_NODE_FROM_LINK (CurrentLink
);
1755 if (Temp
->PciDev
== PciDev
) {
1756 *PMem32Bridge
= Temp
;
1759 CurrentLink
= CurrentLink
->ForwardLink
;
1763 // Get Mem64 resource map
1765 CurrentLink
= Mem64Pool
->ChildList
.ForwardLink
;
1767 while (CurrentLink
!= &Mem64Pool
->ChildList
) {
1769 Temp
= RESOURCE_NODE_FROM_LINK (CurrentLink
);
1771 if (Temp
->PciDev
== PciDev
) {
1772 *Mem64Bridge
= Temp
;
1775 CurrentLink
= CurrentLink
->ForwardLink
;
1779 // Get Pmem64 resource map
1781 CurrentLink
= PMem64Pool
->ChildList
.ForwardLink
;
1783 while (CurrentLink
!= &PMem64Pool
->ChildList
) {
1785 Temp
= RESOURCE_NODE_FROM_LINK (CurrentLink
);
1787 if (Temp
->PciDev
== PciDev
) {
1788 *PMem64Bridge
= Temp
;
1791 CurrentLink
= CurrentLink
->ForwardLink
;
1796 Destory given resource tree.
1798 @param Bridge PCI resource root node of resource tree.
1802 DestroyResourceTree (
1803 IN PCI_RESOURCE_NODE
*Bridge
1806 PCI_RESOURCE_NODE
*Temp
;
1807 LIST_ENTRY
*CurrentLink
;
1809 while (!IsListEmpty (&Bridge
->ChildList
)) {
1811 CurrentLink
= Bridge
->ChildList
.ForwardLink
;
1813 Temp
= RESOURCE_NODE_FROM_LINK (CurrentLink
);
1816 RemoveEntryList (CurrentLink
);
1818 if (IS_PCI_BRIDGE (&(Temp
->PciDev
->Pci
))) {
1819 DestroyResourceTree (Temp
);
1827 Insert resource padding for P2C.
1829 @param PciDev Pci device instance.
1830 @param IoNode Resource info node for IO.
1831 @param Mem32Node Resource info node for 32-bit memory.
1832 @param PMem32Node Resource info node for 32-bit Prefetchable Memory.
1833 @param Mem64Node Resource info node for 64-bit memory.
1834 @param PMem64Node Resource info node for 64-bit Prefetchable Memory.
1838 ResourcePaddingForCardBusBridge (
1839 IN PCI_IO_DEVICE
*PciDev
,
1840 IN PCI_RESOURCE_NODE
*IoNode
,
1841 IN PCI_RESOURCE_NODE
*Mem32Node
,
1842 IN PCI_RESOURCE_NODE
*PMem32Node
,
1843 IN PCI_RESOURCE_NODE
*Mem64Node
,
1844 IN PCI_RESOURCE_NODE
*PMem64Node
1847 PCI_RESOURCE_NODE
*Node
;
1852 // Memory Base/Limit Register 0
1853 // Bar 1 denodes memory range 0
1855 Node
= CreateResourceNode (
1864 InsertResourceNode (
1870 // Memory Base/Limit Register 1
1871 // Bar 2 denodes memory range1
1873 Node
= CreateResourceNode (
1882 InsertResourceNode (
1889 // Bar 3 denodes io range 0
1891 Node
= CreateResourceNode (
1900 InsertResourceNode (
1907 // Bar 4 denodes io range 0
1909 Node
= CreateResourceNode (
1918 InsertResourceNode (
1925 Program PCI Card device register for given resource node.
1927 @param Base Base address of PCI Card device to be programmed.
1928 @param Node Given resource node.
1934 IN PCI_RESOURCE_NODE
*Node
1937 EFI_PCI_IO_PROTOCOL
*PciIo
;
1940 UINT16 BridgeControl
;
1943 PciIo
= &(Node
->PciDev
->PciIo
);
1945 Address
= Base
+ Node
->Offset
;
1948 // Indicate pci bus driver has allocated
1949 // resource for this device
1950 // It might be a temporary solution here since
1951 // pci device could have multiple bar
1953 Node
->PciDev
->Allocated
= TRUE
;
1955 switch (Node
->Bar
) {
1960 EfiPciIoWidthUint32
,
1961 (Node
->PciDev
->PciBar
[Node
->Bar
]).Offset
,
1966 Node
->PciDev
->PciBar
[Node
->Bar
].BaseAddress
= Address
;
1967 Node
->PciDev
->PciBar
[Node
->Bar
].Length
= Node
->Length
;
1973 EfiPciIoWidthUint32
,
1974 PCI_CARD_MEMORY_BASE_0
,
1979 TempAddress
= Address
+ Node
->Length
- 1;
1982 EfiPciIoWidthUint32
,
1983 PCI_CARD_MEMORY_LIMIT_0
,
1988 if (Node
->ResType
== PciBarTypeMem32
) {
1990 // Set non-prefetchable bit
1994 EfiPciIoWidthUint16
,
1995 PCI_CARD_BRIDGE_CONTROL
,
2000 BridgeControl
&= (UINT16
) ~PCI_CARD_PREFETCHABLE_MEMORY_0_ENABLE
;
2003 EfiPciIoWidthUint16
,
2004 PCI_CARD_BRIDGE_CONTROL
,
2011 // Set pre-fetchable bit
2015 EfiPciIoWidthUint16
,
2016 PCI_CARD_BRIDGE_CONTROL
,
2021 BridgeControl
|= PCI_CARD_PREFETCHABLE_MEMORY_0_ENABLE
;
2024 EfiPciIoWidthUint16
,
2025 PCI_CARD_BRIDGE_CONTROL
,
2031 Node
->PciDev
->PciBar
[Node
->Bar
].BaseAddress
= Address
;
2032 Node
->PciDev
->PciBar
[Node
->Bar
].Length
= Node
->Length
;
2033 Node
->PciDev
->PciBar
[Node
->Bar
].BarType
= Node
->ResType
;
2040 EfiPciIoWidthUint32
,
2041 PCI_CARD_MEMORY_BASE_1
,
2046 TempAddress
= Address
+ Node
->Length
- 1;
2050 EfiPciIoWidthUint32
,
2051 PCI_CARD_MEMORY_LIMIT_1
,
2056 if (Node
->ResType
== PciBarTypeMem32
) {
2059 // Set non-prefetchable bit
2063 EfiPciIoWidthUint16
,
2064 PCI_CARD_BRIDGE_CONTROL
,
2069 BridgeControl
&= (UINT16
) ~(PCI_CARD_PREFETCHABLE_MEMORY_1_ENABLE
);
2072 EfiPciIoWidthUint16
,
2073 PCI_CARD_BRIDGE_CONTROL
,
2081 // Set pre-fetchable bit
2085 EfiPciIoWidthUint16
,
2086 PCI_CARD_BRIDGE_CONTROL
,
2091 BridgeControl
|= PCI_CARD_PREFETCHABLE_MEMORY_1_ENABLE
;
2094 EfiPciIoWidthUint16
,
2095 PCI_CARD_BRIDGE_CONTROL
,
2101 Node
->PciDev
->PciBar
[Node
->Bar
].BaseAddress
= Address
;
2102 Node
->PciDev
->PciBar
[Node
->Bar
].Length
= Node
->Length
;
2103 Node
->PciDev
->PciBar
[Node
->Bar
].BarType
= Node
->ResType
;
2109 EfiPciIoWidthUint32
,
2110 PCI_CARD_IO_BASE_0_LOWER
,
2115 TempAddress
= Address
+ Node
->Length
- 1;
2118 EfiPciIoWidthUint32
,
2119 PCI_CARD_IO_LIMIT_0_LOWER
,
2124 Node
->PciDev
->PciBar
[Node
->Bar
].BaseAddress
= Address
;
2125 Node
->PciDev
->PciBar
[Node
->Bar
].Length
= Node
->Length
;
2126 Node
->PciDev
->PciBar
[Node
->Bar
].BarType
= Node
->ResType
;
2133 EfiPciIoWidthUint32
,
2134 PCI_CARD_IO_BASE_1_LOWER
,
2139 TempAddress
= Address
+ Node
->Length
- 1;
2142 EfiPciIoWidthUint32
,
2143 PCI_CARD_IO_LIMIT_1_LOWER
,
2148 Node
->PciDev
->PciBar
[Node
->Bar
].BaseAddress
= Address
;
2149 Node
->PciDev
->PciBar
[Node
->Bar
].Length
= Node
->Length
;
2150 Node
->PciDev
->PciBar
[Node
->Bar
].BarType
= Node
->ResType
;
2159 Create padding resource node.
2161 @param PciDev Pci device instance.
2162 @param IoNode Resource info node for IO.
2163 @param Mem32Node Resource info node for 32-bit memory.
2164 @param PMem32Node Resource info node for 32-bit Prefetchable Memory.
2165 @param Mem64Node Resource info node for 64-bit memory.
2166 @param PMem64Node Resource info node for 64-bit Prefetchable Memory.
2170 ApplyResourcePadding (
2171 IN PCI_IO_DEVICE
*PciDev
,
2172 IN PCI_RESOURCE_NODE
*IoNode
,
2173 IN PCI_RESOURCE_NODE
*Mem32Node
,
2174 IN PCI_RESOURCE_NODE
*PMem32Node
,
2175 IN PCI_RESOURCE_NODE
*Mem64Node
,
2176 IN PCI_RESOURCE_NODE
*PMem64Node
2179 EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR
*Ptr
;
2180 PCI_RESOURCE_NODE
*Node
;
2181 UINT8 DummyBarIndex
;
2184 Ptr
= PciDev
->ResourcePaddingDescriptors
;
2186 while (((EFI_ACPI_END_TAG_DESCRIPTOR
*) Ptr
)->Desc
!= ACPI_END_TAG_DESCRIPTOR
) {
2188 if (Ptr
->Desc
== ACPI_ADDRESS_SPACE_DESCRIPTOR
&& Ptr
->ResType
== ACPI_ADDRESS_SPACE_TYPE_IO
) {
2189 if (Ptr
->AddrLen
!= 0) {
2191 Node
= CreateResourceNode (
2199 InsertResourceNode (
2209 if (Ptr
->Desc
== ACPI_ADDRESS_SPACE_DESCRIPTOR
&& Ptr
->ResType
== ACPI_ADDRESS_SPACE_TYPE_MEM
) {
2211 if (Ptr
->AddrSpaceGranularity
== 32) {
2216 if (Ptr
->SpecificFlag
== 0x6) {
2217 if (Ptr
->AddrLen
!= 0) {
2218 Node
= CreateResourceNode (
2226 InsertResourceNode (
2239 if (Ptr
->SpecificFlag
== 0) {
2240 if (Ptr
->AddrLen
!= 0) {
2241 Node
= CreateResourceNode (
2249 InsertResourceNode (
2260 if (Ptr
->AddrSpaceGranularity
== 64) {
2265 if (Ptr
->SpecificFlag
== 0x6) {
2266 if (Ptr
->AddrLen
!= 0) {
2267 Node
= CreateResourceNode (
2275 InsertResourceNode (
2288 if (Ptr
->SpecificFlag
== 0) {
2289 if (Ptr
->AddrLen
!= 0) {
2290 Node
= CreateResourceNode (
2298 InsertResourceNode (
2315 Get padding resource for PCI-PCI bridge.
2317 @param PciIoDevice PCI-PCI bridge device instance.
2319 @note Feature flag PcdPciBusHotplugDeviceSupport determines
2320 whether need to pad resource for them.
2323 GetResourcePaddingPpb (
2324 IN PCI_IO_DEVICE
*PciIoDevice
2327 if (gPciHotPlugInit
!= NULL
&& FeaturePcdGet (PcdPciBusHotplugDeviceSupport
)) {
2328 if (PciIoDevice
->ResourcePaddingDescriptors
== NULL
) {
2329 GetResourcePaddingForHpb (PciIoDevice
);