Home | History | Annotate | Download | only in PciHostBridge
      1 /** @file
      2 The Header file of the Pci Host Bridge Driver.
      3 
      4 Copyright (c) 2013-2015 Intel Corporation.
      5 
      6 This program and the accompanying materials
      7 are licensed and made available under the terms and conditions of the BSD License
      8 which accompanies this distribution.  The full text of the license may be found at
      9 http://opensource.org/licenses/bsd-license.php
     10 
     11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 
     15 **/
     16 
     17 #ifndef _PCI_HOST_BRIDGE_H_
     18 #define _PCI_HOST_BRIDGE_H_
     19 
     20 
     21 #include <PiDxe.h>
     22 #include <IndustryStandard/Acpi.h>
     23 #include <IndustryStandard/Pci.h>
     24 #include <PciRootBridge.h>
     25 #include <Library/UefiDriverEntryPoint.h>
     26 #include <IndustryStandard/Pci22.h>
     27 #include <Library/UefiLib.h>
     28 #include <Guid/HobList.h>
     29 #include <Library/UefiRuntimeServicesTableLib.h>
     30 #include <Protocol/PciHostBridgeResourceAllocation.h>
     31 
     32 #define PCI_HOST_BRIDGE_SIGNATURE SIGNATURE_32 ('e', 'h', 's', 't')
     33 typedef struct {
     34   UINTN                                             Signature;
     35   EFI_HANDLE                                        HostBridgeHandle;
     36   UINTN                                             RootBridgeCount;
     37   EFI_LIST_ENTRY                                    Head;
     38   BOOLEAN                                           ResourceSubmited;
     39   BOOLEAN                                           CanRestarted;
     40   EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL  ResAlloc;
     41 } PCI_HOST_BRIDGE_INSTANCE;
     42 
     43 #define INSTANCE_FROM_RESOURCE_ALLOCATION_THIS(a) CR (a, PCI_HOST_BRIDGE_INSTANCE, ResAlloc, PCI_HOST_BRIDGE_SIGNATURE)
     44 
     45 typedef enum {
     46   SocketResourceRatioChanged,
     47   SocketResourceRatioNotChanged,
     48   SocketResourceAdjustMax
     49 } SOCKET_RESOURCE_ADJUSTMENT_RESULT;
     50 
     51 //
     52 // Driver Entry Point
     53 //
     54 EFI_STATUS
     55 EFIAPI
     56 InitializePciHostBridge (
     57   IN EFI_HANDLE         ImageHandle,
     58   IN EFI_SYSTEM_TABLE   *SystemTable
     59   )
     60 /*++
     61 
     62 Routine Description:
     63 
     64   Entry point of this driver.
     65 
     66 Arguments:
     67 
     68   ImageHandle  -  Image handle of this driver.
     69   SystemTable  -  Pointer to standard EFI system table.
     70 
     71 Returns:
     72 
     73   EFI_SUCCESS       -  Succeed.
     74   EFI_DEVICE_ERROR  -  Fail to install PCI_ROOT_BRIDGE_IO protocol.
     75 
     76 --*/
     77 ;
     78 
     79 //
     80 //  HostBridge Resource Allocation interface
     81 //
     82 EFI_STATUS
     83 EFIAPI
     84 NotifyPhase (
     85   IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL   *This,
     86   IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PHASE      Phase
     87   )
     88 /*++
     89 
     90 Routine Description:
     91 
     92   Enter a certain phase of the PCI enumeration process.
     93 
     94 Arguments:
     95 
     96   This   -  The EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL instance.
     97   Phase  -  The phase during enumeration.
     98 
     99 Returns:
    100 
    101   EFI_SUCCESS            -  Succeed.
    102   EFI_INVALID_PARAMETER  -  Wrong phase parameter passed in.
    103   EFI_NOT_READY          -  Resources have not been submitted yet.
    104 
    105 --*/
    106 ;
    107 
    108 EFI_STATUS
    109 EFIAPI
    110 GetNextRootBridge (
    111   IN     EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
    112   IN OUT EFI_HANDLE                                       *RootBridgeHandle
    113   )
    114 /*++
    115 
    116 Routine Description:
    117 
    118   Return the device handle of the next PCI root bridge that is associated with
    119   this Host Bridge.
    120 
    121 Arguments:
    122 
    123   This              - The EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_ PROTOCOL instance.
    124   RootBridgeHandle  -  Returns the device handle of the next PCI Root Bridge.
    125                        On input, it holds the RootBridgeHandle returned by the most
    126                        recent call to GetNextRootBridge().The handle for the first
    127                        PCI Root Bridge is returned if RootBridgeHandle is NULL on input.
    128 
    129 Returns:
    130 
    131   EFI_SUCCESS            -  Succeed.
    132   EFI_NOT_FOUND          -  Next PCI root bridge not found.
    133   EFI_INVALID_PARAMETER  -  Wrong parameter passed in.
    134 
    135 --*/
    136 ;
    137 
    138 EFI_STATUS
    139 EFIAPI
    140 GetAttributes (
    141   IN  EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
    142   IN  EFI_HANDLE                                       RootBridgeHandle,
    143   OUT UINT64                                           *Attributes
    144   )
    145 /*++
    146 
    147 Routine Description:
    148 
    149   Returns the attributes of a PCI Root Bridge.
    150 
    151 Arguments:
    152 
    153   This              -  The EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_ PROTOCOL instance
    154   RootBridgeHandle  -  The device handle of the PCI Root Bridge
    155                        that the caller is interested in
    156   Attributes        -  The pointer to attributes of the PCI Root Bridge
    157 
    158 Returns:
    159 
    160   EFI_SUCCESS            -  Succeed.
    161   EFI_INVALID_PARAMETER  -  Attributes parameter passed in is NULL or
    162                             RootBridgeHandle is not an EFI_HANDLE
    163                             that was returned on a previous call to
    164                             GetNextRootBridge().
    165 
    166 --*/
    167 ;
    168 
    169 EFI_STATUS
    170 EFIAPI
    171 StartBusEnumeration (
    172   IN  EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
    173   IN  EFI_HANDLE                                       RootBridgeHandle,
    174   OUT VOID                                             **Configuration
    175   )
    176 /*++
    177 
    178 Routine Description:
    179 
    180   This is the request from the PCI enumerator to set up
    181   the specified PCI Root Bridge for bus enumeration process.
    182 
    183 Arguments:
    184 
    185   This              -  The EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_ PROTOCOL instance.
    186   RootBridgeHandle  -  The PCI Root Bridge to be set up.
    187   Configuration     -  Pointer to the pointer to the PCI bus resource descriptor.
    188 
    189 Returns:
    190 
    191   EFI_SUCCESS            -  Succeed.
    192   EFI_OUT_OF_RESOURCES   -  Not enough pool to be allocated.
    193   EFI_INVALID_PARAMETER  -  RootBridgeHandle is not a valid handle.
    194 
    195 --*/
    196 ;
    197 
    198 EFI_STATUS
    199 EFIAPI
    200 SetBusNumbers (
    201   IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
    202   IN EFI_HANDLE                                       RootBridgeHandle,
    203   IN VOID                                             *Configuration
    204   )
    205 /*++
    206 
    207 Routine Description:
    208 
    209   This function programs the PCI Root Bridge hardware so that
    210   it decodes the specified PCI bus range.
    211 
    212 Arguments:
    213 
    214   This              -  The EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_ PROTOCOL instance.
    215   RootBridgeHandle  -  The PCI Root Bridge whose bus range is to be programmed.
    216   Configuration     -  The pointer to the PCI bus resource descriptor.
    217 
    218 Returns:
    219 
    220   EFI_SUCCESS            -  Succeed.
    221   EFI_INVALID_PARAMETER  -  Wrong parameters passed in.
    222 
    223 --*/
    224 ;
    225 
    226 EFI_STATUS
    227 EFIAPI
    228 SubmitResources (
    229   IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
    230   IN EFI_HANDLE                                       RootBridgeHandle,
    231   IN VOID                                             *Configuration
    232   )
    233 /*++
    234 
    235 Routine Description:
    236 
    237   Submits the I/O and memory resource requirements for the specified PCI Root Bridge.
    238 
    239 Arguments:
    240 
    241   This              -  The EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_ PROTOCOL instance
    242   RootBridgeHandle  -  The PCI Root Bridge whose I/O and memory resource requirements
    243                        are being submitted
    244   Configuration     -  The pointer to the PCI I/O and PCI memory resource descriptor
    245 
    246 Returns:
    247 
    248   EFI_SUCCESS            -  Succeed.
    249   EFI_INVALID_PARAMETER  -  Wrong parameters passed in.
    250 
    251 --*/
    252 ;
    253 
    254 EFI_STATUS
    255 EFIAPI
    256 GetProposedResources (
    257   IN  EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
    258   IN  EFI_HANDLE                                       RootBridgeHandle,
    259   OUT VOID                                             **Configuration
    260   )
    261 /*++
    262 
    263 Routine Description:
    264 
    265   This function returns the proposed resource settings for the specified
    266   PCI Root Bridge.
    267 
    268 Arguments:
    269 
    270   This              -  The EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_ PROTOCOL instance.
    271   RootBridgeHandle  -  The PCI Root Bridge handle.
    272   Configuration     -  The pointer to the pointer to the PCI I/O
    273                        and memory resource descriptor.
    274 
    275 Returns:
    276 
    277   EFI_SUCCESS            -  Succeed.
    278   EFI_OUT_OF_RESOURCES   -  Not enough pool to be allocated.
    279   EFI_INVALID_PARAMETER  -  RootBridgeHandle is not a valid handle.
    280 
    281 --*/
    282 ;
    283 
    284 EFI_STATUS
    285 EFIAPI
    286 PreprocessController (
    287   IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL          *This,
    288   IN EFI_HANDLE                                                RootBridgeHandle,
    289   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_PCI_ADDRESS               PciAddress,
    290   IN EFI_PCI_CONTROLLER_RESOURCE_ALLOCATION_PHASE              Phase
    291   )
    292 /*++
    293 
    294 Routine Description:
    295 
    296   This function is called for all the PCI controllers that the PCI
    297   bus driver finds. Can be used to Preprogram the controller.
    298 
    299 Arguments:
    300 
    301   This              -  The EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_ PROTOCOL instance.
    302   RootBridgeHandle  -  The PCI Root Bridge handle.
    303   PciAddress        -  Address of the controller on the PCI bus.
    304   Phase             -  The Phase during resource allocation.
    305 
    306 Returns:
    307 
    308   EFI_SUCCESS            -  Succeed.
    309   EFI_INVALID_PARAMETER  -  RootBridgeHandle is not a valid handle.
    310 
    311 --*/
    312 ;
    313 
    314 //
    315 // Host Bridge Silicon specific hooks
    316 //
    317 UINT64
    318 GetAllocAttributes (
    319   IN  UINTN        RootBridgeIndex
    320   )
    321 /*++
    322 
    323 Routine Description:
    324 
    325   Returns the Allocation attributes for the BNB Root Bridge.
    326 
    327 Arguments:
    328 
    329   RootBridgeIndex  -  The root bridge number. 0 based.
    330 
    331 Returns:
    332 
    333   EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM | EFI_PCI_HOST_BRIDGE_MEM64_DECODE
    334 
    335 --*/
    336 ;
    337 
    338 EFI_STATUS
    339 GetHostBridgeMemApertures (
    340   IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL               *PciRootBridgeIo,
    341   OUT UINT32                                        *Mem32Base,
    342   OUT UINT32                                        *Mem32Limit,
    343   OUT UINT64                                        *Mem64Base,
    344   OUT UINT64                                        *Mem64Limit
    345   )
    346 /*++
    347 
    348 Routine Description:
    349 
    350   Returns memory apertures for the BNB Root Bridge.
    351 
    352 Arguments:
    353 
    354   PciRootBridgeIo  -  Pointer to Efi Pci root bridge Io protocol interface instance.
    355   Mem32Base        -  Pointer to 32 bit memory base. This is the lowest 32 bit memory address
    356                       that is decoded by the Host Bridge.
    357   Mem32Limit       -  Pointer to 32 bit memory limit.This is the highest 32 bit memory address
    358                       that is decoded by the Host Bridge. The size of the 32 bit window is
    359                       (Mem32Limit - Mem32base + 1).
    360   Mem64Base        -  Pointer to 64 bit memory base. This is the lowest 64 bit memory address
    361                       that is decoded by the Host Bridge.
    362   Mem64Limit       -  Pointer to 64 bit memory limit.This is the highest 64 bit memory address
    363                       that is decoded by the Host Bridge. The size of the 64 bit window is
    364                       (Mem64Limit - Mem64base + 1). Set Mem64Limit < Mem64Base if the host bridge
    365                       does not support 64 bit memory addresses.
    366 
    367 Returns:
    368 
    369   EFI_SUCCESS  -  Success.
    370 
    371 --*/
    372 ;
    373 
    374 UINT64
    375 Power2MaxMemory (
    376   IN UINT64         MemoryLength
    377   )
    378 /*++
    379 
    380 Routine Description:
    381 
    382   Calculate maximum memory length that can be fit to a mtrr.
    383 
    384 Arguments:
    385 
    386   MemoryLength  -  Input memory length.
    387 
    388 Returns:
    389 
    390   Returned Maximum length.
    391 
    392 --*/
    393 ;
    394 
    395 #endif
    396