1 /** @file
2   PCI emumeration support functions declaration for PCI Bus module.
3 
4 Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
5 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
9 
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.
12 
13 **/
14 
15 #ifndef _EFI_PCI_ENUMERATOR_SUPPORT_H_
16 #define _EFI_PCI_ENUMERATOR_SUPPORT_H_
17 
18 /**
19   This routine is used to check whether the pci device is present.
20 
21   @param PciRootBridgeIo   Pointer to instance of EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.
22   @param Pci               Output buffer for PCI device configuration space.
23   @param Bus               PCI bus NO.
24   @param Device            PCI device NO.
25   @param Func              PCI Func NO.
26 
27   @retval EFI_NOT_FOUND    PCI device not present.
28   @retval EFI_SUCCESS      PCI device is found.
29 
30 **/
31 EFI_STATUS
32 PciDevicePresent (
33   IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL     *PciRootBridgeIo,
34   OUT PCI_TYPE00                          *Pci,
35   IN  UINT8                               Bus,
36   IN  UINT8                               Device,
37   IN  UINT8                               Func
38   );
39 
40 /**
41   Collect all the resource information under this root bridge.
42 
43   A database that records all the information about pci device subject to this
44   root bridge will then be created.
45 
46   @param Bridge         Parent bridge instance.
47   @param StartBusNumber Bus number of begining.
48 
49   @retval EFI_SUCCESS   PCI device is found.
50   @retval other         Some error occurred when reading PCI bridge information.
51 
52 **/
53 EFI_STATUS
54 PciPciDeviceInfoCollector (
55   IN PCI_IO_DEVICE                      *Bridge,
56   IN UINT8                              StartBusNumber
57   );
58 
59 /**
60   Seach required device and create PCI device instance.
61 
62   @param Bridge     Parent bridge instance.
63   @param Pci        Input PCI device information block.
64   @param Bus        PCI bus NO.
65   @param Device     PCI device NO.
66   @param Func       PCI func  NO.
67   @param PciDevice  Output of searched PCI device instance.
68 
69   @retval EFI_SUCCESS           Successfully created PCI device instance.
70   @retval EFI_OUT_OF_RESOURCES  Cannot get PCI device information.
71 
72 **/
73 EFI_STATUS
74 PciSearchDevice (
75   IN  PCI_IO_DEVICE                         *Bridge,
76   IN  PCI_TYPE00                            *Pci,
77   IN  UINT8                                 Bus,
78   IN  UINT8                                 Device,
79   IN  UINT8                                 Func,
80   OUT PCI_IO_DEVICE                         **PciDevice
81   );
82 
83 /**
84   Create PCI device instance for PCI device.
85 
86   @param Bridge   Parent bridge instance.
87   @param Pci      Input PCI device information block.
88   @param Bus      PCI device Bus NO.
89   @param Device   PCI device Device NO.
90   @param Func     PCI device's func NO.
91 
92   @return  Created PCI device instance.
93 
94 **/
95 PCI_IO_DEVICE *
96 GatherDeviceInfo (
97   IN PCI_IO_DEVICE                    *Bridge,
98   IN PCI_TYPE00                       *Pci,
99   IN UINT8                            Bus,
100   IN UINT8                            Device,
101   IN UINT8                            Func
102   );
103 
104 /**
105   Create PCI device instance for PCI-PCI bridge.
106 
107   @param Bridge   Parent bridge instance.
108   @param Pci      Input PCI device information block.
109   @param Bus      PCI device Bus NO.
110   @param Device   PCI device Device NO.
111   @param Func     PCI device's func NO.
112 
113   @return  Created PCI device instance.
114 
115 **/
116 PCI_IO_DEVICE *
117 GatherPpbInfo (
118   IN PCI_IO_DEVICE                    *Bridge,
119   IN PCI_TYPE00                       *Pci,
120   IN UINT8                            Bus,
121   IN UINT8                            Device,
122   IN UINT8                            Func
123   );
124 
125 /**
126   Create PCI device instance for PCI Card bridge device.
127 
128   @param Bridge   Parent bridge instance.
129   @param Pci      Input PCI device information block.
130   @param Bus      PCI device Bus NO.
131   @param Device   PCI device Device NO.
132   @param Func     PCI device's func NO.
133 
134   @return  Created PCI device instance.
135 
136 **/
137 PCI_IO_DEVICE *
138 GatherP2CInfo (
139   IN PCI_IO_DEVICE                    *Bridge,
140   IN PCI_TYPE00                       *Pci,
141   IN UINT8                            Bus,
142   IN UINT8                            Device,
143   IN UINT8                            Func
144   );
145 
146 /**
147   Create device path for pci deivce.
148 
149   @param ParentDevicePath  Parent bridge's path.
150   @param PciIoDevice       Pci device instance.
151 
152   @return device path protocol instance for specific pci device.
153 
154 **/
155 EFI_DEVICE_PATH_PROTOCOL *
156 CreatePciDevicePath (
157   IN  EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath,
158   IN  PCI_IO_DEVICE            *PciIoDevice
159   );
160 
161 /**
162   Check whether the PCI IOV VF bar is existed or not.
163 
164   @param PciIoDevice       A pointer to the PCI_IO_DEVICE.
165   @param Offset            The offset.
166   @param BarLengthValue    The bar length value returned.
167   @param OriginalBarValue  The original bar value returned.
168 
169   @retval EFI_NOT_FOUND    The bar doesn't exist.
170   @retval EFI_SUCCESS      The bar exist.
171 
172 **/
173 EFI_STATUS
174 VfBarExisted (
175   IN PCI_IO_DEVICE *PciIoDevice,
176   IN UINTN         Offset,
177   OUT UINT32       *BarLengthValue,
178   OUT UINT32       *OriginalBarValue
179   );
180 
181 /**
182   Check whether the bar is existed or not.
183 
184   @param PciIoDevice       A pointer to the PCI_IO_DEVICE.
185   @param Offset            The offset.
186   @param BarLengthValue    The bar length value returned.
187   @param OriginalBarValue  The original bar value returned.
188 
189   @retval EFI_NOT_FOUND    The bar doesn't exist.
190   @retval EFI_SUCCESS      The bar exist.
191 
192 **/
193 EFI_STATUS
194 BarExisted (
195   IN  PCI_IO_DEVICE *PciIoDevice,
196   IN  UINTN         Offset,
197   OUT UINT32        *BarLengthValue,
198   OUT UINT32        *OriginalBarValue
199   );
200 
201 /**
202   Test whether the device can support given attributes.
203 
204   @param PciIoDevice      Pci device instance.
205   @param Command          Input command register value, and
206                           returned supported register value.
207   @param BridgeControl    Inout bridge control value for PPB or P2C, and
208                           returned supported bridge control value.
209   @param OldCommand       Returned and stored old command register offset.
210   @param OldBridgeControl Returned and stored old Bridge control value for PPB or P2C.
211 
212 **/
213 VOID
214 PciTestSupportedAttribute (
215   IN     PCI_IO_DEVICE                      *PciIoDevice,
216   IN OUT UINT16                             *Command,
217   IN OUT UINT16                             *BridgeControl,
218      OUT UINT16                             *OldCommand,
219      OUT UINT16                             *OldBridgeControl
220   );
221 
222 /**
223   Set the supported or current attributes of a PCI device.
224 
225   @param PciIoDevice    Structure pointer for PCI device.
226   @param Command        Command register value.
227   @param BridgeControl  Bridge control value for PPB or P2C.
228   @param Option         Make a choice of EFI_SET_SUPPORTS or EFI_SET_ATTRIBUTES.
229 
230 **/
231 VOID
232 PciSetDeviceAttribute (
233   IN PCI_IO_DEVICE                      *PciIoDevice,
234   IN UINT16                             Command,
235   IN UINT16                             BridgeControl,
236   IN UINTN                              Option
237   );
238 
239 /**
240   Determine if the device can support Fast Back to Back attribute.
241 
242   @param PciIoDevice  Pci device instance.
243   @param StatusIndex  Status register value.
244 
245   @retval EFI_SUCCESS       This device support Fast Back to Back attribute.
246   @retval EFI_UNSUPPORTED   This device doesn't support Fast Back to Back attribute.
247 
248 **/
249 EFI_STATUS
250 GetFastBackToBackSupport (
251   IN PCI_IO_DEVICE                      *PciIoDevice,
252   IN UINT8                              StatusIndex
253   );
254 
255 /**
256   Determine the related attributes of all devices under a Root Bridge.
257 
258   @param PciIoDevice   PCI device instance.
259 
260 **/
261 EFI_STATUS
262 DetermineDeviceAttribute (
263   IN PCI_IO_DEVICE                      *PciIoDevice
264   );
265 
266 /**
267   This routine is used to update the bar information for those incompatible PCI device.
268 
269   @param PciIoDevice      Input Pci device instance. Output Pci device instance with updated
270                           Bar information.
271 
272   @retval EFI_SUCCESS     Successfully updated bar information.
273   @retval EFI_UNSUPPORTED Given PCI device doesn't belong to incompatible PCI device list.
274 
275 **/
276 EFI_STATUS
277 UpdatePciInfo (
278   IN OUT PCI_IO_DEVICE    *PciIoDevice
279   );
280 
281 /**
282   This routine will update the alignment with the new alignment.
283 
284   @param Alignment    Input Old alignment. Output updated alignment.
285   @param NewAlignment New alignment.
286 
287 **/
288 VOID
289 SetNewAlign (
290   IN OUT UINT64     *Alignment,
291   IN     UINT64     NewAlignment
292   );
293 
294 /**
295   Parse PCI bar information and fill them into PCI device instance.
296 
297   @param PciIoDevice  Pci device instance.
298   @param Offset       Bar offset.
299   @param BarIndex     Bar index.
300 
301   @return Next bar offset.
302 
303 **/
304 UINTN
305 PciParseBar (
306   IN PCI_IO_DEVICE  *PciIoDevice,
307   IN UINTN          Offset,
308   IN UINTN          BarIndex
309   );
310 
311 /**
312   Parse PCI IOV VF bar information and fill them into PCI device instance.
313 
314   @param PciIoDevice  Pci device instance.
315   @param Offset       Bar offset.
316   @param BarIndex     Bar index.
317 
318   @return Next bar offset.
319 
320 **/
321 UINTN
322 PciIovParseVfBar (
323   IN PCI_IO_DEVICE  *PciIoDevice,
324   IN UINTN          Offset,
325   IN UINTN          BarIndex
326   );
327 
328 /**
329   This routine is used to initialize the bar of a PCI device.
330 
331   @param PciIoDevice Pci device instance.
332 
333   @note It can be called typically when a device is going to be rejected.
334 
335 **/
336 VOID
337 InitializePciDevice (
338   IN PCI_IO_DEVICE    *PciIoDevice
339   );
340 
341 /**
342   This routine is used to initialize the bar of a PCI-PCI Bridge device.
343 
344   @param  PciIoDevice PCI-PCI bridge device instance.
345 
346 **/
347 VOID
348 InitializePpb (
349   IN PCI_IO_DEVICE    *PciIoDevice
350   );
351 
352 /**
353   This routine is used to initialize the bar of a PCI Card Bridge device.
354 
355   @param PciIoDevice  PCI Card bridge device.
356 
357 **/
358 VOID
359 InitializeP2C (
360   IN PCI_IO_DEVICE    *PciIoDevice
361   );
362 
363 /**
364   Create and initiliaze general PCI I/O device instance for
365   PCI device/bridge device/hotplug bridge device.
366 
367   @param Bridge            Parent bridge instance.
368   @param Pci               Input Pci information block.
369   @param Bus               Device Bus NO.
370   @param Device            Device device NO.
371   @param Func              Device func NO.
372 
373   @return Instance of PCI device. NULL means no instance created.
374 
375 **/
376 PCI_IO_DEVICE *
377 CreatePciIoDevice (
378   IN PCI_IO_DEVICE                    *Bridge,
379   IN PCI_TYPE00                       *Pci,
380   IN UINT8                            Bus,
381   IN UINT8                            Device,
382   IN UINT8                            Func
383   );
384 
385 /**
386   This routine is used to enumerate entire pci bus system
387   in a given platform.
388 
389   It is only called on the second start on the same Root Bridge.
390 
391   @param  Controller     Parent bridge handler.
392 
393   @retval EFI_SUCCESS    PCI enumeration finished successfully.
394   @retval other          Some error occurred when enumerating the pci bus system.
395 
396 **/
397 EFI_STATUS
398 PciEnumeratorLight (
399   IN EFI_HANDLE                    Controller
400   );
401 
402 /**
403   Get bus range from PCI resource descriptor list.
404 
405   @param Descriptors  A pointer to the address space descriptor.
406   @param MinBus       The min bus returned.
407   @param MaxBus       The max bus returned.
408   @param BusRange     The bus range returned.
409 
410   @retval EFI_SUCCESS    Successfully got bus range.
411   @retval EFI_NOT_FOUND  Can not find the specific bus.
412 
413 **/
414 EFI_STATUS
415 PciGetBusRange (
416   IN     EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR  **Descriptors,
417   OUT    UINT16                             *MinBus,
418   OUT    UINT16                             *MaxBus,
419   OUT    UINT16                             *BusRange
420   );
421 
422 /**
423   This routine can be used to start the root bridge.
424 
425   @param RootBridgeDev     Pci device instance.
426 
427   @retval EFI_SUCCESS      This device started.
428   @retval other            Failed to get PCI Root Bridge I/O protocol.
429 
430 **/
431 EFI_STATUS
432 StartManagingRootBridge (
433   IN PCI_IO_DEVICE *RootBridgeDev
434   );
435 
436 /**
437   This routine can be used to check whether a PCI device should be rejected when light enumeration.
438 
439   @param PciIoDevice  Pci device instance.
440 
441   @retval TRUE      This device should be rejected.
442   @retval FALSE     This device shouldn't be rejected.
443 
444 **/
445 BOOLEAN
446 IsPciDeviceRejected (
447   IN PCI_IO_DEVICE *PciIoDevice
448   );
449 
450 /**
451   Reset all bus number from specific bridge.
452 
453   @param Bridge           Parent specific bridge.
454   @param StartBusNumber   Start bus number.
455 
456 **/
457 VOID
458 ResetAllPpbBusNumber (
459   IN PCI_IO_DEVICE                      *Bridge,
460   IN UINT8                              StartBusNumber
461   );
462 
463 /**
464   Dump the PPB padding resource information.
465 
466   @param PciIoDevice     PCI IO instance.
467   @param ResourceType    The desired resource type to dump.
468                          PciBarTypeUnknown means to dump all types of resources.
469 **/
470 VOID
471 DumpPpbPaddingResource (
472   IN PCI_IO_DEVICE                    *PciIoDevice,
473   IN PCI_BAR_TYPE                     ResourceType
474   );
475 
476 #endif
477