Home | History | Annotate | Download | only in PciHostBridgeDxe
      1 /** @file
      2   The Header file of the Pci Host Bridge Driver
      3 
      4   Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR>
      5   This program and the accompanying materials are
      6   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 _PCI_HOST_BRIDGE_H_
     16 #define _PCI_HOST_BRIDGE_H_
     17 
     18 #include <PiDxe.h>
     19 
     20 #include <IndustryStandard/Pci.h>
     21 #include <IndustryStandard/Acpi.h>
     22 
     23 #include <Protocol/PciHostBridgeResourceAllocation.h>
     24 #include <Protocol/PciRootBridgeIo.h>
     25 #include <Protocol/Metronome.h>
     26 #include <Protocol/DevicePath.h>
     27 
     28 
     29 #include <Library/BaseLib.h>
     30 #include <Library/DebugLib.h>
     31 #include <Library/BaseMemoryLib.h>
     32 #include <Library/MemoryAllocationLib.h>
     33 #include <Library/UefiLib.h>
     34 #include <Library/UefiBootServicesTableLib.h>
     35 #include <Library/DxeServicesTableLib.h>
     36 #include <Library/DevicePathLib.h>
     37 #include <Library/IoLib.h>
     38 #include <Library/PciLib.h>
     39 #include <Library/PcdLib.h>
     40 
     41 //
     42 // Hard code the host bridge number in the platform.
     43 // In this chipset, there is only one host bridge.
     44 //
     45 #define HOST_BRIDGE_NUMBER  1
     46 
     47 #define MAX_PCI_DEVICE_NUMBER      31
     48 #define MAX_PCI_FUNCTION_NUMBER    7
     49 #define MAX_PCI_REG_ADDRESS        (SIZE_4KB - 1)
     50 
     51 typedef enum {
     52   IoOperation,
     53   MemOperation,
     54   PciOperation
     55 } OPERATION_TYPE;
     56 
     57 #define PCI_HOST_BRIDGE_SIGNATURE  SIGNATURE_32('e', 'h', 's', 't')
     58 typedef struct {
     59   UINTN                                             Signature;
     60   EFI_HANDLE                                        HostBridgeHandle;
     61   UINTN                                             RootBridgeNumber;
     62   LIST_ENTRY                                        Head;
     63   BOOLEAN                                           ResourceSubmited;
     64   BOOLEAN                                           CanRestarted;
     65   EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL  ResAlloc;
     66 } PCI_HOST_BRIDGE_INSTANCE;
     67 
     68 #define INSTANCE_FROM_RESOURCE_ALLOCATION_THIS(a) \
     69   CR(a, PCI_HOST_BRIDGE_INSTANCE, ResAlloc, PCI_HOST_BRIDGE_SIGNATURE)
     70 
     71 //
     72 //  HostBridge Resource Allocation interface
     73 //
     74 
     75 /**
     76    These are the notifications from the PCI bus driver that it is about to enter a certain
     77    phase of the PCI enumeration process.
     78 
     79    This member function can be used to notify the host bridge driver to perform specific actions,
     80    including any chipset-specific initialization, so that the chipset is ready to enter the next phase.
     81    Eight notification points are defined at this time. See belows:
     82    EfiPciHostBridgeBeginEnumeration       Resets the host bridge PCI apertures and internal data
     83                                           structures. The PCI enumerator should issue this notification
     84                                           before starting a fresh enumeration process. Enumeration cannot
     85                                           be restarted after sending any other notification such as
     86                                           EfiPciHostBridgeBeginBusAllocation.
     87    EfiPciHostBridgeBeginBusAllocation     The bus allocation phase is about to begin. No specific action is
     88                                           required here. This notification can be used to perform any
     89                                           chipset-specific programming.
     90    EfiPciHostBridgeEndBusAllocation       The bus allocation and bus programming phase is complete. No
     91                                           specific action is required here. This notification can be used to
     92                                           perform any chipset-specific programming.
     93    EfiPciHostBridgeBeginResourceAllocation
     94                                           The resource allocation phase is about to begin. No specific
     95                                           action is required here. This notification can be used to perform
     96                                           any chipset-specific programming.
     97    EfiPciHostBridgeAllocateResources      Allocates resources per previously submitted requests for all the PCI
     98                                           root bridges. These resource settings are returned on the next call to
     99                                           GetProposedResources(). Before calling NotifyPhase() with a Phase of
    100                                           EfiPciHostBridgeAllocateResource, the PCI bus enumerator is responsible
    101                                           for gathering I/O and memory requests for
    102                                           all the PCI root bridges and submitting these requests using
    103                                           SubmitResources(). This function pads the resource amount
    104                                           to suit the root bridge hardware, takes care of dependencies between
    105                                           the PCI root bridges, and calls the Global Coherency Domain (GCD)
    106                                           with the allocation request. In the case of padding, the allocated range
    107                                           could be bigger than what was requested.
    108    EfiPciHostBridgeSetResources           Programs the host bridge hardware to decode previously allocated
    109                                           resources (proposed resources) for all the PCI root bridges. After the
    110                                           hardware is programmed, reassigning resources will not be supported.
    111                                           The bus settings are not affected.
    112    EfiPciHostBridgeFreeResources          Deallocates resources that were previously allocated for all the PCI
    113                                           root bridges and resets the I/O and memory apertures to their initial
    114                                           state. The bus settings are not affected. If the request to allocate
    115                                           resources fails, the PCI enumerator can use this notification to
    116                                           deallocate previous resources, adjust the requests, and retry
    117                                           allocation.
    118    EfiPciHostBridgeEndResourceAllocation  The resource allocation phase is completed. No specific action is
    119                                           required here. This notification can be used to perform any chipsetspecific
    120                                           programming.
    121 
    122    @param[in] This                The instance pointer of EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL
    123    @param[in] Phase               The phase during enumeration
    124 
    125    @retval EFI_NOT_READY          This phase cannot be entered at this time. For example, this error
    126                                   is valid for a Phase of EfiPciHostBridgeAllocateResources if
    127                                   SubmitResources() has not been called for one or more
    128                                   PCI root bridges before this call
    129    @retval EFI_DEVICE_ERROR       Programming failed due to a hardware error. This error is valid
    130                                   for a Phase of EfiPciHostBridgeSetResources.
    131    @retval EFI_INVALID_PARAMETER  Invalid phase parameter
    132    @retval EFI_OUT_OF_RESOURCES   The request could not be completed due to a lack of resources.
    133                                   This error is valid for a Phase of EfiPciHostBridgeAllocateResources if the
    134                                   previously submitted resource requests cannot be fulfilled or
    135                                   were only partially fulfilled.
    136    @retval EFI_SUCCESS            The notification was accepted without any errors.
    137 
    138 **/
    139 EFI_STATUS
    140 EFIAPI
    141 NotifyPhase(
    142   IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
    143   IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PHASE    Phase
    144   );
    145 
    146 /**
    147    Return the device handle of the next PCI root bridge that is associated with this Host Bridge.
    148 
    149    This function is called multiple times to retrieve the device handles of all the PCI root bridges that
    150    are associated with this PCI host bridge. Each PCI host bridge is associated with one or more PCI
    151    root bridges. On each call, the handle that was returned by the previous call is passed into the
    152    interface, and on output the interface returns the device handle of the next PCI root bridge. The
    153    caller can use the handle to obtain the instance of the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
    154    for that root bridge. When there are no more PCI root bridges to report, the interface returns
    155    EFI_NOT_FOUND. A PCI enumerator must enumerate the PCI root bridges in the order that they
    156    are returned by this function.
    157    For D945 implementation, there is only one root bridge in PCI host bridge.
    158 
    159    @param[in]       This              The instance pointer of EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL
    160    @param[in, out]  RootBridgeHandle  Returns the device handle of the next PCI root bridge.
    161 
    162    @retval EFI_SUCCESS            If parameter RootBridgeHandle = NULL, then return the first Rootbridge handle of the
    163                                   specific Host bridge and return EFI_SUCCESS.
    164    @retval EFI_NOT_FOUND          Can not find the any more root bridge in specific host bridge.
    165    @retval EFI_INVALID_PARAMETER  RootBridgeHandle is not an EFI_HANDLE that was
    166                                   returned on a previous call to GetNextRootBridge().
    167 **/
    168 EFI_STATUS
    169 EFIAPI
    170 GetNextRootBridge(
    171   IN       EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
    172   IN OUT   EFI_HANDLE                                       *RootBridgeHandle
    173   );
    174 
    175 /**
    176    Returns the allocation attributes of a PCI root bridge.
    177 
    178    The function returns the allocation attributes of a specific PCI root bridge. The attributes can vary
    179    from one PCI root bridge to another. These attributes are different from the decode-related
    180    attributes that are returned by the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.GetAttributes() member function. The
    181    RootBridgeHandle parameter is used to specify the instance of the PCI root bridge. The device
    182    handles of all the root bridges that are associated with this host bridge must be obtained by calling
    183    GetNextRootBridge(). The attributes are static in the sense that they do not change during or
    184    after the enumeration process. The hardware may provide mechanisms to change the attributes on
    185    the fly, but such changes must be completed before EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL is
    186    installed. The permitted values of EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_ATTRIBUTES are defined in
    187    "Related Definitions" below. The caller uses these attributes to combine multiple resource requests.
    188    For example, if the flag EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM is set, the PCI bus enumerator needs to
    189    include requests for the prefetchable memory in the nonprefetchable memory pool and not request any
    190    prefetchable memory.
    191       Attribute                                 Description
    192    ------------------------------------         ----------------------------------------------------------------------
    193    EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM         If this bit is set, then the PCI root bridge does not support separate
    194                                                 windows for nonprefetchable and prefetchable memory. A PCI bus
    195                                                 driver needs to include requests for prefetchable memory in the
    196                                                 nonprefetchable memory pool.
    197 
    198    EFI_PCI_HOST_BRIDGE_MEM64_DECODE             If this bit is set, then the PCI root bridge supports 64-bit memory
    199                                                 windows. If this bit is not set, the PCI bus driver needs to include
    200                                                 requests for a 64-bit memory address in the corresponding 32-bit
    201                                                 memory pool.
    202 
    203    @param[in]   This               The instance pointer of EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL
    204    @param[in]   RootBridgeHandle   The device handle of the PCI root bridge in which the caller is interested. Type
    205                                    EFI_HANDLE is defined in InstallProtocolInterface() in the UEFI 2.0 Specification.
    206    @param[out]  Attributes         The pointer to attribte of root bridge, it is output parameter
    207 
    208    @retval EFI_INVALID_PARAMETER   Attribute pointer is NULL
    209    @retval EFI_INVALID_PARAMETER   RootBridgehandle is invalid.
    210    @retval EFI_SUCCESS             Success to get attribute of interested root bridge.
    211 
    212 **/
    213 EFI_STATUS
    214 EFIAPI
    215 GetAttributes(
    216   IN  EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
    217   IN  EFI_HANDLE                                       RootBridgeHandle,
    218   OUT UINT64                                           *Attributes
    219   );
    220 
    221 /**
    222    Sets up the specified PCI root bridge for the bus enumeration process.
    223 
    224    This member function sets up the root bridge for bus enumeration and returns the PCI bus range
    225    over which the search should be performed in ACPI 2.0 resource descriptor format.
    226 
    227    @param[in]   This              The EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_ PROTOCOL instance.
    228    @param[in]   RootBridgeHandle  The PCI Root Bridge to be set up.
    229    @param[out]  Configuration     Pointer to the pointer to the PCI bus resource descriptor.
    230 
    231    @retval EFI_INVALID_PARAMETER Invalid Root bridge's handle
    232    @retval EFI_OUT_OF_RESOURCES  Fail to allocate ACPI resource descriptor tag.
    233    @retval EFI_SUCCESS           Sucess to allocate ACPI resource descriptor.
    234 
    235 **/
    236 EFI_STATUS
    237 EFIAPI
    238 StartBusEnumeration(
    239   IN  EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
    240   IN  EFI_HANDLE                                       RootBridgeHandle,
    241   OUT VOID                                             **Configuration
    242   );
    243 
    244 /**
    245    Programs the PCI root bridge hardware so that it decodes the specified PCI bus range.
    246 
    247    This member function programs the specified PCI root bridge to decode the bus range that is
    248    specified by the input parameter Configuration.
    249    The bus range information is specified in terms of the ACPI 2.0 resource descriptor format.
    250 
    251    @param[in] This              The EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_ PROTOCOL instance
    252    @param[in] RootBridgeHandle  The PCI Root Bridge whose bus range is to be programmed
    253    @param[in] Configuration     The pointer to the PCI bus resource descriptor
    254 
    255    @retval EFI_INVALID_PARAMETER  RootBridgeHandle is not a valid root bridge handle.
    256    @retval EFI_INVALID_PARAMETER  Configuration is NULL.
    257    @retval EFI_INVALID_PARAMETER  Configuration does not point to a valid ACPI 2.0 resource descriptor.
    258    @retval EFI_INVALID_PARAMETER  Configuration does not include a valid ACPI 2.0 bus resource descriptor.
    259    @retval EFI_INVALID_PARAMETER  Configuration includes valid ACPI 2.0 resource descriptors other than
    260                                   bus descriptors.
    261    @retval EFI_INVALID_PARAMETER  Configuration contains one or more invalid ACPI resource descriptors.
    262    @retval EFI_INVALID_PARAMETER  "Address Range Minimum" is invalid for this root bridge.
    263    @retval EFI_INVALID_PARAMETER  "Address Range Length" is invalid for this root bridge.
    264    @retval EFI_DEVICE_ERROR       Programming failed due to a hardware error.
    265    @retval EFI_SUCCESS            The bus range for the PCI root bridge was programmed.
    266 
    267 **/
    268 EFI_STATUS
    269 EFIAPI
    270 SetBusNumbers(
    271   IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
    272   IN EFI_HANDLE                                       RootBridgeHandle,
    273   IN VOID                                             *Configuration
    274   );
    275 
    276 /**
    277    Submits the I/O and memory resource requirements for the specified PCI root bridge.
    278 
    279    This function is used to submit all the I/O and memory resources that are required by the specified
    280    PCI root bridge. The input parameter Configuration is used to specify the following:
    281    - The various types of resources that are required
    282    - The associated lengths in terms of ACPI 2.0 resource descriptor format
    283 
    284    @param[in] This              Pointer to the EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL instance.
    285    @param[in] RootBridgeHandle  The PCI root bridge whose I/O and memory resource requirements are being submitted.
    286    @param[in] Configuration     The pointer to the PCI I/O and PCI memory resource descriptor.
    287 
    288    @retval EFI_SUCCESS            The I/O and memory resource requests for a PCI root bridge were accepted.
    289    @retval EFI_INVALID_PARAMETER  RootBridgeHandle is not a valid root bridge handle.
    290    @retval EFI_INVALID_PARAMETER  Configuration is NULL.
    291    @retval EFI_INVALID_PARAMETER  Configuration does not point to a valid ACPI 2.0 resource descriptor.
    292    @retval EFI_INVALID_PARAMETER  Configuration includes requests for one or more resource types that are
    293                                   not supported by this PCI root bridge. This error will happen if the caller
    294                                   did not combine resources according to Attributes that were returned by
    295                                   GetAllocAttributes().
    296    @retval EFI_INVALID_PARAMETER  Address Range Maximum" is invalid.
    297    @retval EFI_INVALID_PARAMETER  "Address Range Length" is invalid for this PCI root bridge.
    298    @retval EFI_INVALID_PARAMETER  "Address Space Granularity" is invalid for this PCI root bridge.
    299 
    300 **/
    301 EFI_STATUS
    302 EFIAPI
    303 SubmitResources(
    304   IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
    305   IN EFI_HANDLE                                       RootBridgeHandle,
    306   IN VOID                                             *Configuration
    307   );
    308 
    309 /**
    310    Returns the proposed resource settings for the specified PCI root bridge.
    311 
    312    This member function returns the proposed resource settings for the specified PCI root bridge. The
    313    proposed resource settings are prepared when NotifyPhase() is called with a Phase of
    314    EfiPciHostBridgeAllocateResources. The output parameter Configuration
    315    specifies the following:
    316    - The various types of resources, excluding bus resources, that are allocated
    317    - The associated lengths in terms of ACPI 2.0 resource descriptor format
    318 
    319    @param[in]  This              Pointer to the EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL instance.
    320    @param[in]  RootBridgeHandle  The PCI root bridge handle. Type EFI_HANDLE is defined in InstallProtocolInterface() in the UEFI 2.0 Specification.
    321    @param[out] Configuration     The pointer to the pointer to the PCI I/O and memory resource descriptor.
    322 
    323    @retval EFI_SUCCESS            The requested parameters were returned.
    324    @retval EFI_INVALID_PARAMETER  RootBridgeHandle is not a valid root bridge handle.
    325    @retval EFI_DEVICE_ERROR       Programming failed due to a hardware error.
    326    @retval EFI_OUT_OF_RESOURCES   The request could not be completed due to a lack of resources.
    327 
    328 **/
    329 EFI_STATUS
    330 EFIAPI
    331 GetProposedResources(
    332   IN  EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
    333   IN  EFI_HANDLE                                       RootBridgeHandle,
    334   OUT VOID                                             **Configuration
    335   );
    336 
    337 /**
    338    Provides the hooks from the PCI bus driver to every PCI controller (device/function) at various
    339    stages of the PCI enumeration process that allow the host bridge driver to preinitialize individual
    340    PCI controllers before enumeration.
    341 
    342    This function is called during the PCI enumeration process. No specific action is expected from this
    343    member function. It allows the host bridge driver to preinitialize individual PCI controllers before
    344    enumeration.
    345 
    346    @param This              Pointer to the EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL instance.
    347    @param RootBridgeHandle  The associated PCI root bridge handle. Type EFI_HANDLE is defined in
    348                             InstallProtocolInterface() in the UEFI 2.0 Specification.
    349    @param PciAddress        The address of the PCI device on the PCI bus. This address can be passed to the
    350                             EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL member functions to access the PCI
    351                             configuration space of the device. See Table 12-1 in the UEFI 2.0 Specification for
    352                             the definition of EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_PCI_ADDRESS.
    353    @param Phase             The phase of the PCI device enumeration.
    354 
    355    @retval EFI_SUCCESS              The requested parameters were returned.
    356    @retval EFI_INVALID_PARAMETER    RootBridgeHandle is not a valid root bridge handle.
    357    @retval EFI_INVALID_PARAMETER    Phase is not a valid phase that is defined in
    358                                     EFI_PCI_CONTROLLER_RESOURCE_ALLOCATION_PHASE.
    359    @retval EFI_DEVICE_ERROR         Programming failed due to a hardware error. The PCI enumerator should
    360                                     not enumerate this device, including its child devices if it is a PCI-to-PCI
    361                                     bridge.
    362 
    363 **/
    364 EFI_STATUS
    365 EFIAPI
    366 PreprocessController (
    367   IN  EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL  *This,
    368   IN  EFI_HANDLE                                        RootBridgeHandle,
    369   IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_PCI_ADDRESS       PciAddress,
    370   IN  EFI_PCI_CONTROLLER_RESOURCE_ALLOCATION_PHASE      Phase
    371   );
    372 
    373 
    374 //
    375 // Define resource status constant
    376 //
    377 #define EFI_RESOURCE_NONEXISTENT   0xFFFFFFFFFFFFFFFFULL
    378 #define EFI_RESOURCE_LESS          0xFFFFFFFFFFFFFFFEULL
    379 
    380 
    381 //
    382 // Driver Instance Data Prototypes
    383 //
    384 
    385 typedef struct {
    386   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_OPERATION  Operation;
    387   UINTN                                      NumberOfBytes;
    388   UINTN                                      NumberOfPages;
    389   EFI_PHYSICAL_ADDRESS                       HostAddress;
    390   EFI_PHYSICAL_ADDRESS                       MappedHostAddress;
    391 } MAP_INFO;
    392 
    393 typedef struct {
    394   ACPI_HID_DEVICE_PATH              AcpiDevicePath;
    395   EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
    396 } EFI_PCI_ROOT_BRIDGE_DEVICE_PATH;
    397 
    398 typedef struct {
    399   UINT64          BusBase;
    400   UINT64          BusLimit;
    401 
    402   UINT64          MemBase;
    403   UINT64          MemLimit;
    404 
    405   UINT64          IoBase;
    406   UINT64          IoLimit;
    407   UINT64          IoTranslation;
    408 } PCI_ROOT_BRIDGE_RESOURCE_APERTURE;
    409 
    410 typedef enum {
    411   TypeIo = 0,
    412   TypeMem32,
    413   TypePMem32,
    414   TypeMem64,
    415   TypePMem64,
    416   TypeBus,
    417   TypeMax
    418 } PCI_RESOURCE_TYPE;
    419 
    420 typedef enum {
    421   ResNone = 0,
    422   ResSubmitted,
    423   ResRequested,
    424   ResAllocated,
    425   ResStatusMax
    426 } RES_STATUS;
    427 
    428 typedef struct {
    429   PCI_RESOURCE_TYPE Type;
    430   UINT64            Base;
    431   UINT64            Length;
    432   UINT64            Alignment;
    433   RES_STATUS        Status;
    434 } PCI_RES_NODE;
    435 
    436 #define PCI_ROOT_BRIDGE_SIGNATURE  SIGNATURE_32('e', '2', 'p', 'b')
    437 
    438 typedef struct {
    439   UINT32                 Signature;
    440   LIST_ENTRY             Link;
    441   EFI_HANDLE             Handle;
    442   UINT64                 RootBridgeAttrib;
    443   UINT64                 Attributes;
    444   UINT64                 Supports;
    445 
    446   //
    447   // Specific for this memory controller: Bus, I/O, Mem
    448   //
    449   PCI_RES_NODE           ResAllocNode[6];
    450 
    451   //
    452   // Addressing for Memory and I/O and Bus arrange
    453   //
    454   UINT64                 BusBase;
    455   UINT64                 MemBase;
    456   UINT64                 IoBase;
    457   UINT64                 BusLimit;
    458   UINT64                 MemLimit;
    459   UINT64                 IoLimit;
    460   UINT64                 IoTranslation;
    461 
    462   EFI_DEVICE_PATH_PROTOCOL                *DevicePath;
    463   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL         Io;
    464 
    465 } PCI_ROOT_BRIDGE_INSTANCE;
    466 
    467 
    468 //
    469 // Driver Instance Data Macros
    470 //
    471 #define DRIVER_INSTANCE_FROM_PCI_ROOT_BRIDGE_IO_THIS(a) \
    472   CR(a, PCI_ROOT_BRIDGE_INSTANCE, Io, PCI_ROOT_BRIDGE_SIGNATURE)
    473 
    474 
    475 #define DRIVER_INSTANCE_FROM_LIST_ENTRY(a) \
    476   CR(a, PCI_ROOT_BRIDGE_INSTANCE, Link, PCI_ROOT_BRIDGE_SIGNATURE)
    477 
    478 /**
    479 
    480   Construct the Pci Root Bridge Io protocol
    481 
    482   @param Protocol         Point to protocol instance
    483   @param HostBridgeHandle Handle of host bridge
    484   @param Attri            Attribute of host bridge
    485   @param ResAperture      ResourceAperture for host bridge
    486 
    487   @retval EFI_SUCCESS Success to initialize the Pci Root Bridge.
    488 
    489 **/
    490 EFI_STATUS
    491 RootBridgeConstructor (
    492   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL    *Protocol,
    493   IN EFI_HANDLE                         HostBridgeHandle,
    494   IN UINT64                             Attri,
    495   IN PCI_ROOT_BRIDGE_RESOURCE_APERTURE  *ResAperture
    496   );
    497 
    498 #endif
    499