]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.h
1. Impl PI 1.2 PCI part. Major changes include:
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / PciBusDxe / PciEnumeratorSupport.h
diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.h b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.h
new file mode 100644 (file)
index 0000000..31238b4
--- /dev/null
@@ -0,0 +1,463 @@
+/** @file\r
+  PCI emumeration support functions declaration for PCI Bus module.\r
+\r
+Copyright (c) 2006 - 2009, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _EFI_PCI_ENUMERATOR_SUPPORT_H_\r
+#define _EFI_PCI_ENUMERATOR_SUPPORT_H_\r
+\r
+/**\r
+  This routine is used to check whether the pci device is present.\r
+\r
+  @param PciRootBridgeIo   Pointer to instance of EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.\r
+  @param Pci               Output buffer for PCI device configuration space.\r
+  @param Bus               PCI bus NO.\r
+  @param Device            PCI device NO.\r
+  @param Func              PCI Func NO.\r
+\r
+  @retval EFI_NOT_FOUND    PCI device not present.\r
+  @retval EFI_SUCCESS      PCI device is found.\r
+\r
+**/\r
+EFI_STATUS\r
+PciDevicePresent (\r
+  IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL     *PciRootBridgeIo,\r
+  OUT PCI_TYPE00                          *Pci,\r
+  IN  UINT8                               Bus,\r
+  IN  UINT8                               Device,\r
+  IN  UINT8                               Func\r
+  );\r
+\r
+/**\r
+  Collect all the resource information under this root bridge.\r
+\r
+  A database that records all the information about pci device subject to this\r
+  root bridge will then be created.\r
+\r
+  @param Bridge         Parent bridge instance.\r
+  @param StartBusNumber Bus number of begining.\r
+\r
+  @retval EFI_SUCCESS   PCI device is found.\r
+  @retval other         Some error occurred when reading PCI bridge information.\r
+\r
+**/\r
+EFI_STATUS\r
+PciPciDeviceInfoCollector (\r
+  IN PCI_IO_DEVICE                      *Bridge,\r
+  IN UINT8                              StartBusNumber\r
+  );\r
+\r
+/**\r
+  Seach required device and create PCI device instance.\r
+\r
+  @param Bridge     Parent bridge instance.\r
+  @param Pci        Input PCI device information block.\r
+  @param Bus        PCI bus NO.\r
+  @param Device     PCI device NO.\r
+  @param Func       PCI func  NO.\r
+  @param PciDevice  Output of searched PCI device instance.\r
+\r
+  @retval EFI_SUCCESS           Successfully created PCI device instance.\r
+  @retval EFI_OUT_OF_RESOURCES  Cannot get PCI device information.\r
+\r
+**/\r
+EFI_STATUS\r
+PciSearchDevice (\r
+  IN  PCI_IO_DEVICE                         *Bridge,\r
+  IN  PCI_TYPE00                            *Pci,\r
+  IN  UINT8                                 Bus,\r
+  IN  UINT8                                 Device,\r
+  IN  UINT8                                 Func,\r
+  OUT PCI_IO_DEVICE                         **PciDevice\r
+  );\r
+\r
+/**\r
+  Create PCI device instance for PCI device.\r
+\r
+  @param Bridge   Parent bridge instance.\r
+  @param Pci      Input PCI device information block.\r
+  @param Bus      PCI device Bus NO.\r
+  @param Device   PCI device Device NO.\r
+  @param Func     PCI device's func NO.\r
+\r
+  @return  Created PCI device instance.\r
+\r
+**/\r
+PCI_IO_DEVICE *\r
+GatherDeviceInfo (\r
+  IN PCI_IO_DEVICE                    *Bridge,\r
+  IN PCI_TYPE00                       *Pci,\r
+  IN UINT8                            Bus,\r
+  IN UINT8                            Device,\r
+  IN UINT8                            Func\r
+  );\r
+\r
+/**\r
+  Create PCI device instance for PCI-PCI bridge.\r
+\r
+  @param Bridge   Parent bridge instance.\r
+  @param Pci      Input PCI device information block.\r
+  @param Bus      PCI device Bus NO.\r
+  @param Device   PCI device Device NO.\r
+  @param Func     PCI device's func NO.\r
+\r
+  @return  Created PCI device instance.\r
+\r
+**/\r
+PCI_IO_DEVICE *\r
+GatherPpbInfo (\r
+  IN PCI_IO_DEVICE                    *Bridge,\r
+  IN PCI_TYPE00                       *Pci,\r
+  IN UINT8                            Bus,\r
+  IN UINT8                            Device,\r
+  IN UINT8                            Func\r
+  );\r
+\r
+/**\r
+  Create PCI device instance for PCI Card bridge device.\r
+\r
+  @param Bridge   Parent bridge instance.\r
+  @param Pci      Input PCI device information block.\r
+  @param Bus      PCI device Bus NO.\r
+  @param Device   PCI device Device NO.\r
+  @param Func     PCI device's func NO.\r
+\r
+  @return  Created PCI device instance.\r
+\r
+**/\r
+PCI_IO_DEVICE *\r
+GatherP2CInfo (\r
+  IN PCI_IO_DEVICE                    *Bridge,\r
+  IN PCI_TYPE00                       *Pci,\r
+  IN UINT8                            Bus,\r
+  IN UINT8                            Device,\r
+  IN UINT8                            Func\r
+  );\r
+\r
+/**\r
+  Create device path for pci deivce.\r
+\r
+  @param ParentDevicePath  Parent bridge's path.\r
+  @param PciIoDevice       Pci device instance.\r
+\r
+  @return device path protocol instance for specific pci device.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+CreatePciDevicePath (\r
+  IN  EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath,\r
+  IN  PCI_IO_DEVICE            *PciIoDevice\r
+  );\r
+\r
+/**\r
+  Check whether the PCI IOV VF bar is existed or not.\r
+\r
+  @param PciIoDevice       A pointer to the PCI_IO_DEVICE.\r
+  @param Offset            The offset.\r
+  @param BarLengthValue    The bar length value returned.\r
+  @param OriginalBarValue  The original bar value returned.\r
+\r
+  @retval EFI_NOT_FOUND    The bar doesn't exist.\r
+  @retval EFI_SUCCESS      The bar exist.\r
+\r
+**/\r
+EFI_STATUS\r
+VfBarExisted (\r
+  IN PCI_IO_DEVICE *PciIoDevice,\r
+  IN UINTN         Offset,\r
+  OUT UINT32       *BarLengthValue,\r
+  OUT UINT32       *OriginalBarValue\r
+  );\r
+\r
+/**\r
+  Check whether the bar is existed or not.\r
+\r
+  @param PciIoDevice       A pointer to the PCI_IO_DEVICE.\r
+  @param Offset            The offset.\r
+  @param BarLengthValue    The bar length value returned.\r
+  @param OriginalBarValue  The original bar value returned.\r
+\r
+  @retval EFI_NOT_FOUND    The bar doesn't exist.\r
+  @retval EFI_SUCCESS      The bar exist.\r
+\r
+**/\r
+EFI_STATUS\r
+BarExisted (\r
+  IN  PCI_IO_DEVICE *PciIoDevice,\r
+  IN  UINTN         Offset,\r
+  OUT UINT32        *BarLengthValue,\r
+  OUT UINT32        *OriginalBarValue\r
+  );\r
+\r
+/**\r
+  Test whether the device can support given attributes.\r
+\r
+  @param PciIoDevice      Pci device instance.\r
+  @param Command          Input command register value, and\r
+                          returned supported register value.\r
+  @param BridgeControl    Inout bridge control value for PPB or P2C, and\r
+                          returned supported bridge control value.\r
+  @param OldCommand       Returned and stored old command register offset.\r
+  @param OldBridgeControl Returned and stored old Bridge control value for PPB or P2C.\r
+\r
+**/\r
+VOID\r
+PciTestSupportedAttribute (\r
+  IN     PCI_IO_DEVICE                      *PciIoDevice,\r
+  IN OUT UINT16                             *Command,\r
+  IN OUT UINT16                             *BridgeControl,\r
+     OUT UINT16                             *OldCommand,\r
+     OUT UINT16                             *OldBridgeControl\r
+  );\r
+\r
+/**\r
+  Set the supported or current attributes of a PCI device.\r
+\r
+  @param PciIoDevice    Structure pointer for PCI device.\r
+  @param Command        Command register value.\r
+  @param BridgeControl  Bridge control value for PPB or P2C.\r
+  @param Option         Make a choice of EFI_SET_SUPPORTS or EFI_SET_ATTRIBUTES.\r
+\r
+**/\r
+VOID\r
+PciSetDeviceAttribute (\r
+  IN PCI_IO_DEVICE                      *PciIoDevice,\r
+  IN UINT16                             Command,\r
+  IN UINT16                             BridgeControl,\r
+  IN UINTN                              Option\r
+  );\r
+\r
+/**\r
+  Determine if the device can support Fast Back to Back attribute.\r
+\r
+  @param PciIoDevice  Pci device instance.\r
+  @param StatusIndex  Status register value.\r
+\r
+  @retval EFI_SUCCESS       This device support Fast Back to Back attribute.\r
+  @retval EFI_UNSUPPORTED   This device doesn't support Fast Back to Back attribute.\r
+\r
+**/\r
+EFI_STATUS\r
+GetFastBackToBackSupport (\r
+  IN PCI_IO_DEVICE                      *PciIoDevice,\r
+  IN UINT8                              StatusIndex\r
+  );\r
+\r
+/**\r
+  Determine the related attributes of all devices under a Root Bridge.\r
+\r
+  @param PciIoDevice   PCI device instance.\r
+\r
+**/\r
+EFI_STATUS\r
+DetermineDeviceAttribute (\r
+  IN PCI_IO_DEVICE                      *PciIoDevice\r
+  );\r
+\r
+/**\r
+  This routine is used to update the bar information for those incompatible PCI device.\r
+\r
+  @param PciIoDevice      Input Pci device instance. Output Pci device instance with updated\r
+                          Bar information.\r
+\r
+  @retval EFI_SUCCESS     Successfully updated bar information.\r
+  @retval EFI_UNSUPPORTED Given PCI device doesn't belong to incompatible PCI device list.\r
+\r
+**/\r
+EFI_STATUS\r
+UpdatePciInfo (\r
+  IN OUT PCI_IO_DEVICE    *PciIoDevice\r
+  );\r
+\r
+/**\r
+  This routine will update the alignment with the new alignment.\r
+\r
+  @param Alignment    Input Old alignment. Output updated alignment.\r
+  @param NewAlignment New alignment.\r
+\r
+**/\r
+VOID\r
+SetNewAlign (\r
+  IN OUT UINT64     *Alignment,\r
+  IN     UINT64     NewAlignment\r
+  );\r
+\r
+/**\r
+  Parse PCI bar information and fill them into PCI device instance.\r
+\r
+  @param PciIoDevice  Pci device instance.\r
+  @param Offset       Bar offset.\r
+  @param BarIndex     Bar index.\r
+\r
+  @return Next bar offset.\r
+\r
+**/\r
+UINTN\r
+PciParseBar (\r
+  IN PCI_IO_DEVICE  *PciIoDevice,\r
+  IN UINTN          Offset,\r
+  IN UINTN          BarIndex\r
+  );\r
+\r
+/**\r
+  Parse PCI IOV VF bar information and fill them into PCI device instance.\r
+\r
+  @param PciIoDevice  Pci device instance.\r
+  @param Offset       Bar offset.\r
+  @param BarIndex     Bar index.\r
+\r
+  @return Next bar offset.\r
+\r
+**/\r
+UINTN\r
+PciIovParseVfBar (\r
+  IN PCI_IO_DEVICE  *PciIoDevice,\r
+  IN UINTN          Offset,\r
+  IN UINTN          BarIndex\r
+  );\r
+\r
+/**\r
+  This routine is used to initialize the bar of a PCI device.\r
+\r
+  @param PciIoDevice Pci device instance.\r
+\r
+  @note It can be called typically when a device is going to be rejected.\r
+\r
+**/\r
+VOID\r
+InitializePciDevice (\r
+  IN PCI_IO_DEVICE    *PciIoDevice\r
+  );\r
+\r
+/**\r
+  This routine is used to initialize the bar of a PCI-PCI Bridge device.\r
+\r
+  @param  PciIoDevice PCI-PCI bridge device instance.\r
+\r
+**/\r
+VOID\r
+InitializePpb (\r
+  IN PCI_IO_DEVICE    *PciIoDevice\r
+  );\r
+\r
+/**\r
+  This routine is used to initialize the bar of a PCI Card Bridge device.\r
+\r
+  @param PciIoDevice  PCI Card bridge device.\r
+\r
+**/\r
+VOID\r
+InitializeP2C (\r
+  IN PCI_IO_DEVICE    *PciIoDevice\r
+  );\r
+\r
+/**\r
+  Create and initiliaze general PCI I/O device instance for\r
+  PCI device/bridge device/hotplug bridge device.\r
+\r
+  @param PciRootBridgeIo   Pointer to instance of EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.\r
+  @param Pci               Input Pci information block.\r
+  @param Bus               Device Bus NO.\r
+  @param Device            Device device NO.\r
+  @param Func              Device func NO.\r
+\r
+  @return Instance of PCI device. NULL means no instance created.\r
+\r
+**/\r
+PCI_IO_DEVICE *\r
+CreatePciIoDevice (\r
+  IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  *PciRootBridgeIo,\r
+  IN PCI_TYPE00                       *Pci,\r
+  IN UINT8                            Bus,\r
+  IN UINT8                            Device,\r
+  IN UINT8                            Func\r
+  );\r
+\r
+/**\r
+  This routine is used to enumerate entire pci bus system\r
+  in a given platform.\r
+\r
+  It is only called on the second start on the same Root Bridge.\r
+\r
+  @param  Controller     Parent bridge handler.\r
+\r
+  @retval EFI_SUCCESS    PCI enumeration finished successfully.\r
+  @retval other          Some error occurred when enumerating the pci bus system.\r
+\r
+**/\r
+EFI_STATUS\r
+PciEnumeratorLight (\r
+  IN EFI_HANDLE                    Controller\r
+  );\r
+\r
+/**\r
+  Get bus range from PCI resource descriptor list.\r
+\r
+  @param Descriptors  A pointer to the address space descriptor.\r
+  @param MinBus       The min bus returned.\r
+  @param MaxBus       The max bus returned.\r
+  @param BusRange     The bus range returned.\r
+\r
+  @retval EFI_SUCCESS    Successfully got bus range.\r
+  @retval EFI_NOT_FOUND  Can not find the specific bus.\r
+\r
+**/\r
+EFI_STATUS\r
+PciGetBusRange (\r
+  IN     EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR  **Descriptors,\r
+  OUT    UINT16                             *MinBus,\r
+  OUT    UINT16                             *MaxBus,\r
+  OUT    UINT16                             *BusRange\r
+  );\r
+\r
+/**\r
+  This routine can be used to start the root bridge.\r
+\r
+  @param RootBridgeDev     Pci device instance.\r
+\r
+  @retval EFI_SUCCESS      This device started.\r
+  @retval other            Failed to get PCI Root Bridge I/O protocol.\r
+\r
+**/\r
+EFI_STATUS\r
+StartManagingRootBridge (\r
+  IN PCI_IO_DEVICE *RootBridgeDev\r
+  );\r
+\r
+/**\r
+  This routine can be used to check whether a PCI device should be rejected when light enumeration.\r
+\r
+  @param PciIoDevice  Pci device instance.\r
+\r
+  @retval TRUE      This device should be rejected.\r
+  @retval FALSE     This device shouldn't be rejected.\r
+\r
+**/\r
+BOOLEAN\r
+IsPciDeviceRejected (\r
+  IN PCI_IO_DEVICE *PciIoDevice\r
+  );\r
+\r
+/**\r
+  Reset all bus number from specific bridge.\r
+\r
+  @param Bridge           Parent specific bridge.\r
+  @param StartBusNumber   Start bus number.\r
+\r
+**/\r
+VOID\r
+ResetAllPpbBusNumber (\r
+  IN PCI_IO_DEVICE                      *Bridge,\r
+  IN UINT8                              StartBusNumber\r
+  );\r
+\r
+#endif\r