Home | History | Annotate | Download | only in PciHostBridgeDxe
      1 /** @file
      2 *  Header containing the structure specific to the Xpress-RICH3 PCIe Root Complex
      3 *
      4 *  Copyright (c) 2011-2015, ARM Ltd. All rights reserved.
      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 #ifndef __PCIHOSTBRIDGE_H
     17 #define __PCIHOSTBRIDGE_H
     18 
     19 #include <PiDxe.h>
     20 
     21 #include "XPressRich3.h"
     22 
     23 #include <IndustryStandard/Pci.h>
     24 #include <IndustryStandard/Acpi.h>
     25 
     26 #include <Library/BaseLib.h>
     27 #include <Library/BaseMemoryLib.h>
     28 #include <Library/DebugLib.h>
     29 #include <Library/DxeServicesTableLib.h>
     30 #include <Library/IoLib.h>
     31 #include <Library/MemoryAllocationLib.h>
     32 #include <Library/PcdLib.h>
     33 #include <Library/UefiBootServicesTableLib.h>
     34 
     35 #include <Protocol/PciHostBridgeResourceAllocation.h>
     36 #include <Protocol/PciRootBridgeIo.h>
     37 #include <Protocol/PciIo.h>
     38 #include <Protocol/DevicePath.h>
     39 #include <Protocol/CpuIo2.h>
     40 #include <Protocol/Metronome.h>
     41 
     42 #define PCI_TRACE(txt)  DEBUG((EFI_D_VERBOSE, "ARM_PCI: " txt "\n"))
     43 
     44 #define PCIE_ROOTPORT_WRITE32(Add, Val) { UINT32 Value = (UINT32)(Val); CpuIo->Mem.Write (CpuIo,EfiCpuIoWidthUint32,(UINT64)(PcdGet64 (PcdPcieRootPortBaseAddress)+(Add)),1,&Value); }
     45 #define PCIE_ROOTPORT_READ32(Add, Val) { CpuIo->Mem.Read (CpuIo,EfiCpuIoWidthUint32,(UINT64)(PcdGet64 (PcdPcieRootPortBaseAddress)+(Add)),1,&Val); }
     46 
     47 #define PCIE_CONTROL_WRITE32(Add, Val) { UINT32 Value = (UINT32)(Val); CpuIo->Mem.Write (CpuIo,EfiCpuIoWidthUint32,(UINT64)(PcdGet64 (PcdPcieControlBaseAddress)+(Add)),1,&Value); }
     48 #define PCIE_CONTROL_READ32(Add, Val) { CpuIo->Mem.Read (CpuIo,EfiCpuIoWidthUint32,(UINT64)(PcdGet64 (PcdPcieControlBaseAddress)+(Add)),1,&Val); }
     49 
     50 /**
     51  * PCI Root Bridge Device Path (ACPI Device Node + End Node)
     52  */
     53 typedef struct {
     54   ACPI_HID_DEVICE_PATH          Acpi;
     55   EFI_DEVICE_PATH_PROTOCOL      End;
     56 } EFI_PCI_ROOT_BRIDGE_DEVICE_PATH;
     57 
     58 typedef enum {
     59   ResTypeIo = 0,
     60   ResTypeMem32,
     61   ResTypePMem32,
     62   ResTypeMem64,
     63   ResTypePMem64,
     64   ResTypeMax
     65 } PCI_RESOURCE_TYPE;
     66 
     67 #define ACPI_SPECFLAG_PREFETCHABLE      0x06
     68 #define EFI_RESOURCE_NONEXISTENT        0xFFFFFFFFFFFFFFFFULL
     69 #define EFI_RESOURCE_LESS               0xFFFFFFFFFFFFFFFEULL
     70 
     71 typedef struct {
     72   UINT64  Base;
     73   UINT64  Length;
     74   UINT64  Alignment;
     75 } PCI_RESOURCE_ALLOC;
     76 
     77 typedef struct _PCI_HOST_BRIDGE_INSTANCE PCI_HOST_BRIDGE_INSTANCE;
     78 
     79 /**
     80  * PCI Root Bridge Instance structure
     81  **/
     82 typedef struct {
     83   UINTN                            Signature;
     84   EFI_HANDLE                       Handle;
     85   PCI_HOST_BRIDGE_INSTANCE        *HostBridge;
     86   //
     87   // Set Type of memory allocation (could be EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM
     88   // and EFI_PCI_HOST_BRIDGE_MEM64_DECODE).
     89   //
     90   UINT64                           MemAllocAttributes;
     91   PCI_RESOURCE_ALLOC               ResAlloc[ResTypeMax];
     92   UINTN                            BusStart;
     93   UINTN                            BusLength;
     94   UINT64                           Supports;
     95   UINT64                           Attributes;
     96   EFI_PCI_ROOT_BRIDGE_DEVICE_PATH  DevicePath;
     97   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  Io;
     98 } PCI_ROOT_BRIDGE_INSTANCE;
     99 
    100 /**
    101  * PCI Host Bridge Instance structure
    102  **/
    103 struct _PCI_HOST_BRIDGE_INSTANCE {
    104   UINTN                                             Signature;
    105   EFI_HANDLE                                        Handle;
    106   EFI_HANDLE                                        ImageHandle;
    107   PCI_ROOT_BRIDGE_INSTANCE                         *RootBridge;
    108   //
    109   // The enumeration cannot be restarted after the process goes into the non initial
    110   // enumeration phase.
    111   //
    112   BOOLEAN                                           CanRestarted;
    113   EFI_CPU_IO2_PROTOCOL                             *CpuIo;
    114   EFI_METRONOME_ARCH_PROTOCOL                      *Metronome;
    115   EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL  ResAlloc;
    116 };
    117 
    118 #define PCI_HOST_BRIDGE_SIGNATURE                   SIGNATURE_32 ('e', 'h', 's', 't')
    119 #define PCI_ROOT_BRIDGE_SIGNATURE                   SIGNATURE_32 ('e', '2', 'p', 'b')
    120 #define INSTANCE_FROM_RESOURCE_ALLOCATION_THIS(a)   CR (a, PCI_HOST_BRIDGE_INSTANCE, ResAlloc, PCI_HOST_BRIDGE_SIGNATURE)
    121 #define INSTANCE_FROM_ROOT_BRIDGE_IO_THIS(a)        CR (a, PCI_ROOT_BRIDGE_INSTANCE, Io, PCI_ROOT_BRIDGE_SIGNATURE)
    122 
    123 /**
    124  * PCI Host Bridge Resource Allocator Functions
    125  **/
    126 EFI_STATUS PciHbRaNotifyPhase (
    127   IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
    128   IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PHASE     Phase
    129   );
    130 
    131 EFI_STATUS PciHbRaGetNextRootBridge (
    132   IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL  *This,
    133   IN OUT EFI_HANDLE                                    *RootBridgeHandle
    134   );
    135 
    136 EFI_STATUS PciHbRaGetAllocAttributes (
    137   IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL  *This,
    138   IN  EFI_HANDLE                                        RootBridgeHandle,
    139   OUT UINT64                                           *Attributes
    140   );
    141 
    142 EFI_STATUS PciHbRaStartBusEnumeration (
    143   IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL  *This,
    144   IN  EFI_HANDLE                                        RootBridgeHandle,
    145   OUT VOID                                            **Configuration
    146   );
    147 
    148 EFI_STATUS PciHbRaSetBusNumbers (
    149   IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL  *This,
    150   IN EFI_HANDLE                                         RootBridgeHandle,
    151   IN VOID                                              *Configuration
    152   );
    153 
    154 EFI_STATUS PciHbRaSubmitResources (
    155   IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL  *This,
    156   IN EFI_HANDLE                                         RootBridgeHandle,
    157   IN VOID                                              *Configuration
    158   );
    159 
    160 EFI_STATUS PciHbRaGetProposedResources (
    161   IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL  *This,
    162   IN  EFI_HANDLE                                        RootBridgeHandle,
    163   OUT VOID                                            **Configuration
    164   );
    165 
    166 EFI_STATUS PciHbRaPreprocessController (
    167   IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL  *This,
    168   IN  EFI_HANDLE                                        RootBridgeHandle,
    169   IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_PCI_ADDRESS       PciAddress,
    170   IN  EFI_PCI_CONTROLLER_RESOURCE_ALLOCATION_PHASE      Phase
    171   );
    172 
    173 
    174 /**
    175  * PCI Root Bridge
    176  **/
    177 EFI_STATUS PciRbPollMem (
    178   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL           *This,
    179   IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH    Width,
    180   IN  UINT64                                   Address,
    181   IN  UINT64                                   Mask,
    182   IN  UINT64                                   Value,
    183   IN  UINT64                                   Delay,
    184   OUT UINT64                                   *Result
    185   );
    186 
    187 EFI_STATUS PciRbPollIo (
    188   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL           *This,
    189   IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH    Width,
    190   IN  UINT64                                   Address,
    191   IN  UINT64                                   Mask,
    192   IN  UINT64                                   Value,
    193   IN  UINT64                                   Delay,
    194   OUT UINT64                                   *Result
    195   );
    196 
    197 EFI_STATUS PciRbMemRead (
    198   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL              *This,
    199   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH    Width,
    200   IN     UINT64                                   Address,
    201   IN     UINTN                                    Count,
    202   IN OUT VOID                                     *Buffer
    203   );
    204 
    205 EFI_STATUS PciRbMemWrite (
    206   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL              *This,
    207   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH    Width,
    208   IN     UINT64                                   Address,
    209   IN     UINTN                                    Count,
    210   IN OUT VOID                                     *Buffer
    211   );
    212 
    213 EFI_STATUS PciRbIoRead (
    214   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL              *This,
    215   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH    Width,
    216   IN     UINT64                                   Address,
    217   IN     UINTN                                    Count,
    218   IN OUT VOID                                     *Buffer
    219   );
    220 
    221 EFI_STATUS PciRbIoWrite (
    222   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL              *This,
    223   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH    Width,
    224   IN     UINT64                                   Address,
    225   IN     UINTN                                    Count,
    226   IN OUT VOID                                     *Buffer
    227   );
    228 
    229 EFI_STATUS PciRbPciRead (
    230   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL              *This,
    231   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH    Width,
    232   IN     UINT64                                   Address,
    233   IN     UINTN                                    Count,
    234   IN OUT VOID                                     *Buffer
    235   );
    236 
    237 EFI_STATUS PciRbPciWrite (
    238   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL              *This,
    239   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH    Width,
    240   IN     UINT64                                   Address,
    241   IN     UINTN                                    Count,
    242   IN OUT VOID                                     *Buffer
    243   );
    244 
    245 EFI_STATUS PciRbCopyMem (
    246   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL              *This,
    247   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH    Width,
    248   IN     UINT64                                   DestAddress,
    249   IN     UINT64                                   SrcAddress,
    250   IN     UINTN                                    Count
    251   );
    252 
    253 EFI_STATUS PciRbMap (
    254   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL                *This,
    255   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_OPERATION  Operation,
    256   IN     VOID                                       *HostAddress,
    257   IN OUT UINTN                                      *NumberOfBytes,
    258   OUT    EFI_PHYSICAL_ADDRESS                       *DeviceAddress,
    259   OUT    VOID                                       **Mapping
    260   );
    261 
    262 EFI_STATUS PciRbUnMap (
    263   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL           *This,
    264   IN  VOID                                     *Mapping
    265   );
    266 
    267 EFI_STATUS PciRbAllocateBuffer (
    268   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL              *This,
    269   IN     EFI_ALLOCATE_TYPE                        Type,
    270   IN     EFI_MEMORY_TYPE                          MemoryType,
    271   IN     UINTN                                    Pages,
    272   IN OUT VOID                                     **HostAddress,
    273   IN     UINT64                                   Attributes
    274   );
    275 
    276 EFI_STATUS PciRbFreeBuffer (
    277   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL           *This,
    278   IN  UINTN                                    Pages,
    279   IN  VOID                                     *HostAddress
    280   );
    281 
    282 EFI_STATUS PciRbFlush (
    283   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  *This
    284   );
    285 
    286 EFI_STATUS PciRbSetAttributes (
    287   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL              *This,
    288   IN     UINT64                                   Attributes,
    289   IN OUT UINT64                                   *ResourceBase,
    290   IN OUT UINT64                                   *ResourceLength
    291   );
    292 
    293 EFI_STATUS PciRbGetAttributes (
    294   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL           *This,
    295   OUT UINT64                                   *Supports,
    296   OUT UINT64                                   *Attributes
    297   );
    298 
    299 EFI_STATUS PciRbConfiguration (
    300   IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL          *This,
    301   OUT VOID                                     **Resources
    302   );
    303 
    304 /**
    305  * PCI Root Bridge Functions
    306  **/
    307 EFI_STATUS
    308 PciRbConstructor (
    309   IN  PCI_HOST_BRIDGE_INSTANCE *HostBridge,
    310   IN  UINT32 PciAcpiUid,
    311   IN  UINT64 MemAllocAttributes
    312   );
    313 
    314 EFI_STATUS
    315 PciRbDestructor (
    316   IN  PCI_ROOT_BRIDGE_INSTANCE* RootBridge
    317   );
    318 
    319 EFI_STATUS
    320 HWPciRbInit (
    321   IN  EFI_CPU_IO2_PROTOCOL *CpuIo
    322   );
    323 
    324 #endif
    325