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