]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.h
Retired PciIncompatibleDeviceSupportLib from IntelFrameworkModulePkg.
[mirror_edk2.git] / IntelFrameworkModulePkg / Bus / Pci / PciBusDxe / PciResourceSupport.h
CommitLineData
eeefcb9d 1/** @file\r
8e8227d1 2 PCI resouces support functions declaration for PCI Bus module.\r
ead42efc 3\r
8e8227d1 4Copyright (c) 2006 - 2009, Intel Corporation\r
5All rights reserved. This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
ead42efc 12\r
3db51098 13**/\r
ead42efc 14\r
eeefcb9d 15#ifndef _EFI_PCI_RESOURCE_SUPPORT_H_\r
16#define _EFI_PCI_RESOURCE_SUPPORT_H_\r
ead42efc 17\r
ead42efc 18typedef enum {\r
19 PciResUsageTypical = 0,\r
20 PciResUsagePadding,\r
21 PciResUsageOptionRomProcessing\r
22} PCI_RESOURCE_USAGE;\r
23\r
f02bd376 24#define PCI_RESOURCE_SIGNATURE SIGNATURE_32 ('p', 'c', 'r', 'c')\r
ead42efc 25\r
26typedef struct {\r
27 UINT32 Signature;\r
28 LIST_ENTRY Link;\r
29 LIST_ENTRY ChildList;\r
30 PCI_IO_DEVICE *PciDev;\r
31 UINT64 Alignment;\r
32 UINT64 Offset;\r
33 UINT8 Bar;\r
34 PCI_BAR_TYPE ResType;\r
35 UINT64 Length;\r
36 BOOLEAN Reserved;\r
37 PCI_RESOURCE_USAGE ResourceUsage;\r
38} PCI_RESOURCE_NODE;\r
39\r
40#define RESOURCE_NODE_FROM_LINK(a) \\r
41 CR (a, PCI_RESOURCE_NODE, Link, PCI_RESOURCE_SIGNATURE)\r
42\r
57076f45 43/**\r
8e8227d1 44 The function is used to skip VGA range.\r
45\r
46 @param Start Returned start address including VGA range.\r
47 @param Length The length of VGA range.\r
48\r
57076f45 49**/\r
8e8227d1 50VOID\r
ead42efc 51SkipVGAAperture (\r
52 OUT UINT64 *Start,\r
53 IN UINT64 Length\r
ed66e1bc 54 );\r
ead42efc 55\r
57076f45 56/**\r
eeefcb9d 57 This function is used to skip ISA aliasing aperture.\r
8e8227d1 58\r
59 @param Start Returned start address including ISA aliasing aperture.\r
60 @param Length The length of ISA aliasing aperture.\r
61\r
57076f45 62**/\r
8e8227d1 63VOID\r
ead42efc 64SkipIsaAliasAperture (\r
65 OUT UINT64 *Start,\r
66 IN UINT64 Length\r
ed66e1bc 67 );\r
ead42efc 68\r
57076f45 69/**\r
70 This function inserts a resource node into the resource list.\r
71 The resource list is sorted in descend order.\r
ead42efc 72\r
eeefcb9d 73 @param Bridge PCI resource node for bridge.\r
74 @param ResNode Resource node want to be inserted.\r
8e8227d1 75\r
bcd70414 76**/\r
8e8227d1 77VOID\r
ead42efc 78InsertResourceNode (\r
9eb130ff 79 IN OUT PCI_RESOURCE_NODE *Bridge,\r
80 IN PCI_RESOURCE_NODE *ResNode\r
ed66e1bc 81 );\r
57076f45 82\r
bcd70414 83/**\r
8e8227d1 84 This routine is used to merge two different resource trees in need of\r
85 resoure degradation.\r
ead42efc 86\r
8e8227d1 87 For example, if an upstream PPB doesn't support,\r
57076f45 88 prefetchable memory decoding, the PCI bus driver will choose to call this function\r
89 to merge prefectchable memory resource list into normal memory list.\r
90\r
91 If the TypeMerge is TRUE, Res resource type is changed to the type of destination resource\r
92 type.\r
8e8227d1 93 If Dst is NULL or Res is NULL, ASSERT ().\r
57076f45 94\r
eeefcb9d 95 @param Dst Point to destination resource tree.\r
96 @param Res Point to source resource tree.\r
8e8227d1 97 @param TypeMerge If the TypeMerge is TRUE, Res resource type is changed to the type of\r
57076f45 98 destination resource type.\r
8e8227d1 99\r
bcd70414 100**/\r
8e8227d1 101VOID\r
ead42efc 102MergeResourceTree (\r
8e8227d1 103 IN PCI_RESOURCE_NODE *Dst,\r
104 IN PCI_RESOURCE_NODE *Res,\r
105 IN BOOLEAN TypeMerge\r
ed66e1bc 106 );\r
ead42efc 107\r
57076f45 108/**\r
109 This function is used to calculate the IO16 aperture\r
110 for a bridge.\r
ead42efc 111\r
8e8227d1 112 @param Bridge PCI resource node for bridge.\r
113\r
bcd70414 114**/\r
8e8227d1 115VOID\r
ead42efc 116CalculateApertureIo16 (\r
8e8227d1 117 IN PCI_RESOURCE_NODE *Bridge\r
ed66e1bc 118 );\r
ead42efc 119\r
57076f45 120/**\r
121 This function is used to calculate the resource aperture\r
eeefcb9d 122 for a given bridge device.\r
ead42efc 123\r
8e8227d1 124 @param Bridge PCI resouce node for given bridge device.\r
125\r
bcd70414 126**/\r
8e8227d1 127VOID\r
ead42efc 128CalculateResourceAperture (\r
8e8227d1 129 IN PCI_RESOURCE_NODE *Bridge\r
ed66e1bc 130 );\r
ead42efc 131\r
57076f45 132/**\r
eeefcb9d 133 Get IO/Memory resource infor for given PCI device.\r
8e8227d1 134\r
eeefcb9d 135 @param PciDev Pci device instance.\r
136 @param IoNode Resource info node for IO .\r
137 @param Mem32Node Resource info node for 32-bit memory.\r
8e8227d1 138 @param PMem32Node Resource info node for 32-bit Prefetchable Memory.\r
eeefcb9d 139 @param Mem64Node Resource info node for 64-bit memory.\r
8e8227d1 140 @param PMem64Node Resource info node for 64-bit Prefetchable Memory.\r
141\r
57076f45 142**/\r
8e8227d1 143VOID\r
ead42efc 144GetResourceFromDevice (\r
9eb130ff 145 IN PCI_IO_DEVICE *PciDev,\r
146 IN OUT PCI_RESOURCE_NODE *IoNode,\r
147 IN OUT PCI_RESOURCE_NODE *Mem32Node,\r
148 IN OUT PCI_RESOURCE_NODE *PMem32Node,\r
149 IN OUT PCI_RESOURCE_NODE *Mem64Node,\r
150 IN OUT PCI_RESOURCE_NODE *PMem64Node\r
ed66e1bc 151 );\r
ead42efc 152\r
57076f45 153/**\r
eeefcb9d 154 This function is used to create a resource node.\r
155\r
156 @param PciDev Pci device instance.\r
157 @param Length Length of Io/Memory resource.\r
158 @param Alignment Alignment of resource.\r
159 @param Bar Bar index.\r
160 @param ResType Type of resource: IO/Memory.\r
161 @param ResUsage Resource usage.\r
8e8227d1 162\r
163 @return PCI resource node created for given PCI device.\r
164 NULL means PCI resource node is not created.\r
165\r
57076f45 166**/\r
ead42efc 167PCI_RESOURCE_NODE *\r
168CreateResourceNode (\r
169 IN PCI_IO_DEVICE *PciDev,\r
170 IN UINT64 Length,\r
171 IN UINT64 Alignment,\r
172 IN UINT8 Bar,\r
173 IN PCI_BAR_TYPE ResType,\r
174 IN PCI_RESOURCE_USAGE ResUsage\r
ed66e1bc 175 );\r
ead42efc 176\r
57076f45 177/**\r
8e8227d1 178 This function is used to extract resource request from\r
57076f45 179 device node list.\r
ead42efc 180\r
eeefcb9d 181 @param Bridge Pci device instance.\r
182 @param IoNode Resource info node for IO.\r
183 @param Mem32Node Resource info node for 32-bit memory.\r
8e8227d1 184 @param PMem32Node Resource info node for 32-bit Prefetchable Memory.\r
eeefcb9d 185 @param Mem64Node Resource info node for 64-bit memory.\r
8e8227d1 186 @param PMem64Node Resource info node for 64-bit Prefetchable Memory.\r
ead42efc 187\r
bcd70414 188**/\r
8e8227d1 189VOID\r
ead42efc 190CreateResourceMap (\r
9eb130ff 191 IN PCI_IO_DEVICE *Bridge,\r
192 IN OUT PCI_RESOURCE_NODE *IoNode,\r
193 IN OUT PCI_RESOURCE_NODE *Mem32Node,\r
194 IN OUT PCI_RESOURCE_NODE *PMem32Node,\r
195 IN OUT PCI_RESOURCE_NODE *Mem64Node,\r
196 IN OUT PCI_RESOURCE_NODE *PMem64Node\r
ed66e1bc 197 );\r
ead42efc 198\r
57076f45 199/**\r
eeefcb9d 200 This function is used to do the resource padding for a specific platform.\r
ead42efc 201\r
eeefcb9d 202 @param PciDev Pci device instance.\r
8e8227d1 203 @param IoNode Resource info node for IO.\r
eeefcb9d 204 @param Mem32Node Resource info node for 32-bit memory.\r
8e8227d1 205 @param PMem32Node Resource info node for 32-bit Prefetchable Memory.\r
eeefcb9d 206 @param Mem64Node Resource info node for 64-bit memory.\r
8e8227d1 207 @param PMem64Node Resource info node for 64-bit Prefetchable Memory.\r
ead42efc 208\r
bcd70414 209**/\r
8e8227d1 210VOID\r
ead42efc 211ResourcePaddingPolicy (\r
8e8227d1 212 IN PCI_IO_DEVICE *PciDev,\r
213 IN PCI_RESOURCE_NODE *IoNode,\r
214 IN PCI_RESOURCE_NODE *Mem32Node,\r
215 IN PCI_RESOURCE_NODE *PMem32Node,\r
216 IN PCI_RESOURCE_NODE *Mem64Node,\r
217 IN PCI_RESOURCE_NODE *PMem64Node\r
ed66e1bc 218 );\r
ead42efc 219\r
57076f45 220/**\r
8e8227d1 221 This function is used to degrade resource if the upstream bridge\r
222 doesn't support certain resource. Degradation path is\r
57076f45 223 PMEM64 -> MEM64 -> MEM32\r
224 PMEM64 -> PMEM32 -> MEM32\r
8e8227d1 225 IO32 -> IO16.\r
57076f45 226\r
eeefcb9d 227 @param Bridge Pci device instance.\r
228 @param Mem32Node Resource info node for 32-bit memory.\r
8e8227d1 229 @param PMem32Node Resource info node for 32-bit Prefetchable Memory.\r
eeefcb9d 230 @param Mem64Node Resource info node for 64-bit memory.\r
8e8227d1 231 @param PMem64Node Resource info node for 64-bit Prefetchable Memory.\r
57076f45 232\r
57076f45 233**/\r
8e8227d1 234VOID\r
ead42efc 235DegradeResource (\r
236 IN PCI_IO_DEVICE *Bridge,\r
237 IN PCI_RESOURCE_NODE *Mem32Node,\r
238 IN PCI_RESOURCE_NODE *PMem32Node,\r
239 IN PCI_RESOURCE_NODE *Mem64Node,\r
240 IN PCI_RESOURCE_NODE *PMem64Node\r
ed66e1bc 241 );\r
ead42efc 242\r
57076f45 243/**\r
eeefcb9d 244 Test whether bridge device support decode resource.\r
8e8227d1 245\r
eeefcb9d 246 @param Bridge Bridge device instance.\r
247 @param Decode Decode type according to resource type.\r
8e8227d1 248\r
249 @return TRUE The bridge device support decode resource.\r
250 @return FALSE The bridge device don't support decode resource.\r
251\r
57076f45 252**/\r
ead42efc 253BOOLEAN\r
254BridgeSupportResourceDecode (\r
255 IN PCI_IO_DEVICE *Bridge,\r
256 IN UINT32 Decode\r
ed66e1bc 257 );\r
ead42efc 258\r
57076f45 259/**\r
8e8227d1 260 This function is used to program the resource allocated\r
261 for each resource node under specified bridge.\r
262\r
263 @param Base Base address of resource to be progammed.\r
264 @param Bridge PCI resource node for the bridge device.\r
265\r
266 @retval EFI_SUCCESS Successfully to program all resouces\r
267 on given PCI bridge device.\r
268 @retval EFI_OUT_OF_RESOURCES Base is all one.\r
269\r
57076f45 270**/\r
ead42efc 271EFI_STATUS\r
272ProgramResource (\r
273 IN UINT64 Base,\r
274 IN PCI_RESOURCE_NODE *Bridge\r
ed66e1bc 275 );\r
ead42efc 276\r
57076f45 277/**\r
8e8227d1 278 Program Bar register for PCI device.\r
279\r
280 @param Base Base address for PCI device resource to be progammed.\r
eeefcb9d 281 @param Node Point to resoure node structure.\r
8e8227d1 282\r
57076f45 283**/\r
8e8227d1 284VOID\r
ead42efc 285ProgramBar (\r
286 IN UINT64 Base,\r
287 IN PCI_RESOURCE_NODE *Node\r
ed66e1bc 288 );\r
ead42efc 289\r
57076f45 290/**\r
8e8227d1 291 Program PCI-PCI bridge apperture.\r
292\r
eeefcb9d 293 @param Base Base address for resource.\r
294 @param Node Point to resoure node structure.\r
8e8227d1 295\r
57076f45 296**/\r
8e8227d1 297VOID\r
ead42efc 298ProgramPpbApperture (\r
299 IN UINT64 Base,\r
300 IN PCI_RESOURCE_NODE *Node\r
ed66e1bc 301 );\r
ead42efc 302\r
57076f45 303/**\r
8e8227d1 304 Program parent bridge for Option Rom.\r
305\r
eeefcb9d 306 @param PciDevice Pci deivce instance.\r
8e8227d1 307 @param OptionRomBase Base address for Optiona Rom.\r
308 @param Enable Enable or disable PCI memory.\r
309\r
57076f45 310**/\r
8e8227d1 311VOID\r
ead42efc 312ProgrameUpstreamBridgeForRom (\r
313 IN PCI_IO_DEVICE *PciDevice,\r
314 IN UINT32 OptionRomBase,\r
315 IN BOOLEAN Enable\r
ed66e1bc 316 );\r
ead42efc 317\r
57076f45 318/**\r
eeefcb9d 319 Test whether resource exists for a bridge.\r
8e8227d1 320\r
eeefcb9d 321 @param Bridge Point to resource node for a bridge.\r
8e8227d1 322\r
323 @retval TRUE There is resource on the given bridge.\r
324 @retval FALSE There isn't resource on the given bridge.\r
325\r
57076f45 326**/\r
ead42efc 327BOOLEAN\r
328ResourceRequestExisted (\r
8e8227d1 329 IN PCI_RESOURCE_NODE *Bridge\r
ed66e1bc 330 );\r
ead42efc 331\r
57076f45 332/**\r
333 Initialize resource pool structure.\r
8e8227d1 334\r
335 @param ResourcePool Point to resource pool structure. This pool\r
336 is reset to all zero when returned.\r
eeefcb9d 337 @param ResourceType Type of resource.\r
8e8227d1 338\r
57076f45 339**/\r
8e8227d1 340VOID\r
ead42efc 341InitializeResourcePool (\r
8e8227d1 342 IN OUT PCI_RESOURCE_NODE *ResourcePool,\r
343 IN PCI_BAR_TYPE ResourceType\r
ed66e1bc 344 );\r
ead42efc 345\r
57076f45 346/**\r
eeefcb9d 347 Get all resource information for given Pci device.\r
8e8227d1 348\r
eeefcb9d 349 @param PciDev Pci device instance.\r
350 @param IoBridge Io resource node.\r
351 @param Mem32Bridge 32-bit memory node.\r
352 @param PMem32Bridge 32-bit Pmemory node.\r
353 @param Mem64Bridge 64-bit memory node.\r
354 @param PMem64Bridge 64-bit PMemory node.\r
355 @param IoPool Link list header for Io resource.\r
356 @param Mem32Pool Link list header for 32-bit memory.\r
8e8227d1 357 @param PMem32Pool Link list header for 32-bit Prefetchable memory.\r
eeefcb9d 358 @param Mem64Pool Link list header for 64-bit memory.\r
8e8227d1 359 @param PMem64Pool Link list header for 64-bit Prefetchable memory.\r
360\r
57076f45 361**/\r
8e8227d1 362VOID\r
ead42efc 363GetResourceMap (\r
8e8227d1 364 IN PCI_IO_DEVICE *PciDev,\r
365 IN PCI_RESOURCE_NODE **IoBridge,\r
366 IN PCI_RESOURCE_NODE **Mem32Bridge,\r
367 IN PCI_RESOURCE_NODE **PMem32Bridge,\r
368 IN PCI_RESOURCE_NODE **Mem64Bridge,\r
369 IN PCI_RESOURCE_NODE **PMem64Bridge,\r
370 IN PCI_RESOURCE_NODE *IoPool,\r
371 IN PCI_RESOURCE_NODE *Mem32Pool,\r
372 IN PCI_RESOURCE_NODE *PMem32Pool,\r
373 IN PCI_RESOURCE_NODE *Mem64Pool,\r
374 IN PCI_RESOURCE_NODE *PMem64Pool\r
ed66e1bc 375 );\r
ead42efc 376\r
57076f45 377/**\r
eeefcb9d 378 Destory given resource tree.\r
8e8227d1 379\r
380 @param Bridge PCI resource root node of resource tree.\r
381\r
57076f45 382**/\r
8e8227d1 383VOID\r
ead42efc 384DestroyResourceTree (\r
385 IN PCI_RESOURCE_NODE *Bridge\r
ed66e1bc 386 );\r
ead42efc 387\r
57076f45 388/**\r
eeefcb9d 389 Insert resource padding for P2C.\r
8e8227d1 390\r
eeefcb9d 391 @param PciDev Pci device instance.\r
8e8227d1 392 @param IoNode Resource info node for IO.\r
eeefcb9d 393 @param Mem32Node Resource info node for 32-bit memory.\r
8e8227d1 394 @param PMem32Node Resource info node for 32-bit Prefetchable Memory.\r
eeefcb9d 395 @param Mem64Node Resource info node for 64-bit memory.\r
8e8227d1 396 @param PMem64Node Resource info node for 64-bit Prefetchable Memory.\r
397\r
57076f45 398**/\r
8e8227d1 399VOID\r
ead42efc 400ResourcePaddingForCardBusBridge (\r
8e8227d1 401 IN PCI_IO_DEVICE *PciDev,\r
402 IN PCI_RESOURCE_NODE *IoNode,\r
403 IN PCI_RESOURCE_NODE *Mem32Node,\r
404 IN PCI_RESOURCE_NODE *PMem32Node,\r
405 IN PCI_RESOURCE_NODE *Mem64Node,\r
406 IN PCI_RESOURCE_NODE *PMem64Node\r
ed66e1bc 407 );\r
ead42efc 408\r
57076f45 409/**\r
8e8227d1 410 Program PCI Card device register for given resource node.\r
411\r
412 @param Base Base address of PCI Card device to be programmed.\r
57076f45 413 @param Node Given resource node.\r
8e8227d1 414\r
57076f45 415**/\r
8e8227d1 416VOID\r
ead42efc 417ProgramP2C (\r
418 IN UINT64 Base,\r
419 IN PCI_RESOURCE_NODE *Node\r
ed66e1bc 420 );\r
ead42efc 421\r
57076f45 422/**\r
423 Create padding resource node.\r
8e8227d1 424\r
eeefcb9d 425 @param PciDev Pci device instance.\r
8e8227d1 426 @param IoNode Resource info node for IO.\r
eeefcb9d 427 @param Mem32Node Resource info node for 32-bit memory.\r
8e8227d1 428 @param PMem32Node Resource info node for 32-bit Prefetchable Memory.\r
eeefcb9d 429 @param Mem64Node Resource info node for 64-bit memory.\r
8e8227d1 430 @param PMem64Node Resource info node for 64-bit Prefetchable Memory.\r
ead42efc 431\r
bcd70414 432**/\r
8e8227d1 433VOID\r
ead42efc 434ApplyResourcePadding (\r
8e8227d1 435 IN PCI_IO_DEVICE *PciDev,\r
436 IN PCI_RESOURCE_NODE *IoNode,\r
437 IN PCI_RESOURCE_NODE *Mem32Node,\r
438 IN PCI_RESOURCE_NODE *PMem32Node,\r
439 IN PCI_RESOURCE_NODE *Mem64Node,\r
440 IN PCI_RESOURCE_NODE *PMem64Node\r
ed66e1bc 441 );\r
ead42efc 442\r
57076f45 443/**\r
8e8227d1 444 Get padding resource for PCI-PCI bridge.\r
445\r
446 @param PciIoDevice PCI-PCI bridge device instance.\r
ead42efc 447\r
8e8227d1 448 @note Feature flag PcdPciBusHotplugDeviceSupport determines\r
449 whether need to pad resource for them.\r
bcd70414 450**/\r
ead42efc 451VOID\r
452GetResourcePaddingPpb (\r
453 IN PCI_IO_DEVICE *PciIoDevice\r
ed66e1bc 454 );\r
ead42efc 455\r
ead42efc 456#endif\r