Home | History | Annotate | Download | only in ArmJunoDxe
      1 /** @file
      2 
      3   Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
      4   Copyright (c) 2013 - 2014, ARM Ltd. All rights reserved.<BR>
      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 _PCI_ROOT_BRIDGE_H_
     17 #define _PCI_ROOT_BRIDGE_H_
     18 
     19 #include <PiDxe.h>
     20 
     21 #include <Library/BaseLib.h>
     22 #include <Library/BaseMemoryLib.h>
     23 #include <Library/DxeServicesTableLib.h>
     24 #include <Library/IoLib.h>
     25 #include <Library/MemoryAllocationLib.h>
     26 #include <Library/PciLib.h>
     27 #include <Library/UefiLib.h>
     28 #include <Library/DmaLib.h>
     29 
     30 #include <Protocol/EmbeddedExternalDevice.h>
     31 #include <Protocol/DevicePath.h>
     32 #include <Protocol/PciIo.h>
     33 #include <Protocol/PciRootBridgeIo.h>
     34 #include <Protocol/PciHostBridgeResourceAllocation.h>
     35 
     36 #include <IndustryStandard/Pci23.h>
     37 
     38 #include "ArmJunoDxeInternal.h"
     39 
     40 #define EFI_RESOURCE_NONEXISTENT  0xFFFFFFFFFFFFFFFFULL
     41 #define EFI_RESOURCE_LESS         0xFFFFFFFFFFFFFFFEULL
     42 #define EFI_RESOURCE_SATISFIED    0x0000000000000000ULL
     43 
     44 
     45 typedef struct {
     46   ACPI_HID_DEVICE_PATH      AcpiDevicePath;
     47   EFI_DEVICE_PATH_PROTOCOL  EndDevicePath;
     48 } EFI_PCI_ROOT_BRIDGE_DEVICE_PATH;
     49 
     50 
     51 #define ACPI_CONFIG_IO    0
     52 #define ACPI_CONFIG_MMIO  1
     53 #define ACPI_CONFIG_BUS   2
     54 
     55 typedef struct {
     56   EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR Desc[3];
     57   EFI_ACPI_END_TAG_DESCRIPTOR       EndDesc;
     58 } ACPI_CONFIG_INFO;
     59 
     60 
     61 #define PCI_ROOT_BRIDGE_SIGNATURE SIGNATURE_32 ('P', 'c', 'i', 'F')
     62 
     63 typedef struct {
     64   UINT32                                            Signature;
     65   EFI_HANDLE                                        Handle;
     66   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL                   Io;
     67   EFI_PCI_ROOT_BRIDGE_DEVICE_PATH                   DevicePath;
     68 
     69   UINT8   StartBus;
     70   UINT8   EndBus;
     71   UINT16  Type;
     72   UINT32  MemoryStart;
     73   UINT32  MemorySize;
     74   UINTN   IoOffset;
     75   UINT32  IoStart;
     76   UINT32  IoSize;
     77   UINT64  PciAttributes;
     78 
     79   ACPI_CONFIG_INFO  *Config;
     80 
     81 } PCI_ROOT_BRIDGE;
     82 
     83 
     84 #define INSTANCE_FROM_PCI_ROOT_BRIDGE_IO_THIS(a) CR (a, PCI_ROOT_BRIDGE, Io, PCI_ROOT_BRIDGE_SIGNATURE)
     85 
     86 
     87 typedef union {
     88   UINT8   volatile  *Buffer;
     89   UINT8   volatile  *Ui8;
     90   UINT16  volatile  *Ui16;
     91   UINT32  volatile  *Ui32;
     92   UINT64  volatile  *Ui64;
     93   UINTN   volatile  Ui;
     94 } PTR;
     95 
     96 
     97 
     98 EFI_STATUS
     99 EFIAPI
    100 PciRootBridgeIoPollMem (
    101   IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,
    102   IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,
    103   IN  UINT64                                 Address,
    104   IN  UINT64                                 Mask,
    105   IN  UINT64                                 Value,
    106   IN  UINT64                                 Delay,
    107   OUT UINT64                                 *Result
    108   );
    109 
    110 EFI_STATUS
    111 EFIAPI
    112 PciRootBridgeIoPollIo (
    113   IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,
    114   IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,
    115   IN  UINT64                                 Address,
    116   IN  UINT64                                 Mask,
    117   IN  UINT64                                 Value,
    118   IN  UINT64                                 Delay,
    119   OUT UINT64                                 *Result
    120   );
    121 
    122 EFI_STATUS
    123 EFIAPI
    124 PciRootBridgeIoMemRead (
    125   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,
    126   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,
    127   IN     UINT64                                 Address,
    128   IN     UINTN                                  Count,
    129   IN OUT VOID                                   *Buffer
    130   );
    131 
    132 EFI_STATUS
    133 EFIAPI
    134 PciRootBridgeIoMemWrite (
    135   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,
    136   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,
    137   IN     UINT64                                 Address,
    138   IN     UINTN                                  Count,
    139   IN OUT VOID                                   *Buffer
    140   );
    141 
    142 EFI_STATUS
    143 EFIAPI
    144 PciRootBridgeIoIoRead (
    145   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,
    146   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,
    147   IN     UINT64                                 UserAddress,
    148   IN     UINTN                                  Count,
    149   IN OUT VOID                                   *UserBuffer
    150   );
    151 
    152 EFI_STATUS
    153 EFIAPI
    154 PciRootBridgeIoIoWrite (
    155   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,
    156   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,
    157   IN     UINT64                                 UserAddress,
    158   IN     UINTN                                  Count,
    159   IN OUT VOID                                   *UserBuffer
    160   );
    161 
    162 EFI_STATUS
    163 EFIAPI
    164 PciRootBridgeIoCopyMem (
    165   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,
    166   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,
    167   IN UINT64                                 DestAddress,
    168   IN UINT64                                 SrcAddress,
    169   IN UINTN                                  Count
    170   );
    171 
    172 EFI_STATUS
    173 EFIAPI
    174 PciRootBridgeIoPciRead (
    175   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,
    176   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,
    177   IN     UINT64                                 Address,
    178   IN     UINTN                                  Count,
    179   IN OUT VOID                                   *Buffer
    180   );
    181 
    182 EFI_STATUS
    183 EFIAPI
    184 PciRootBridgeIoPciWrite (
    185   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,
    186   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,
    187   IN     UINT64                                 Address,
    188   IN     UINTN                                  Count,
    189   IN OUT VOID                                   *Buffer
    190   );
    191 
    192 EFI_STATUS
    193 EFIAPI
    194 PciRootBridgeIoMap (
    195   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL            *This,
    196   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_OPERATION  Operation,
    197   IN     VOID                                       *HostAddress,
    198   IN OUT UINTN                                      *NumberOfBytes,
    199   OUT    EFI_PHYSICAL_ADDRESS                       *DeviceAddress,
    200   OUT    VOID                                       **Mapping
    201   );
    202 
    203 EFI_STATUS
    204 EFIAPI
    205 PciRootBridgeIoUnmap (
    206   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  *This,
    207   IN VOID                             *Mapping
    208   );
    209 
    210 EFI_STATUS
    211 EFIAPI
    212 PciRootBridgeIoAllocateBuffer (
    213   IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  *This,
    214   IN  EFI_ALLOCATE_TYPE                Type,
    215   IN  EFI_MEMORY_TYPE                  MemoryType,
    216   IN  UINTN                            Pages,
    217   OUT VOID                             **HostAddress,
    218   IN  UINT64                           Attributes
    219   );
    220 
    221 EFI_STATUS
    222 EFIAPI
    223 PciRootBridgeIoFreeBuffer (
    224   IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  *This,
    225   IN  UINTN                            Pages,
    226   OUT VOID                             *HostAddress
    227   );
    228 
    229 EFI_STATUS
    230 EFIAPI
    231 PciRootBridgeIoFlush (
    232   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  *This
    233   );
    234 
    235 EFI_STATUS
    236 EFIAPI
    237 PciRootBridgeIoGetAttributes (
    238   IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  *This,
    239   OUT UINT64                           *Supported,
    240   OUT UINT64                           *Attributes
    241   );
    242 
    243 EFI_STATUS
    244 EFIAPI
    245 PciRootBridgeIoSetAttributes (
    246   IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  *This,
    247   IN     UINT64                           Attributes,
    248   IN OUT UINT64                           *ResourceBase,
    249   IN OUT UINT64                           *ResourceLength
    250   );
    251 
    252 EFI_STATUS
    253 EFIAPI
    254 PciRootBridgeIoConfiguration (
    255   IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  *This,
    256   OUT VOID                             **Resources
    257   );
    258 
    259 //
    260 // Private Function Prototypes
    261 //
    262 EFI_STATUS
    263 EFIAPI
    264 PciRootBridgeIoMemRW (
    265   IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,
    266   IN  UINTN                                  Count,
    267   IN  BOOLEAN                                InStrideFlag,
    268   IN  PTR                                    In,
    269   IN  BOOLEAN                                OutStrideFlag,
    270   OUT PTR                                    Out
    271   );
    272 
    273 BOOLEAN
    274 PciIoMemAddressValid (
    275   IN EFI_PCI_IO_PROTOCOL  *This,
    276   IN UINT64               Address
    277   );
    278 
    279 EFI_STATUS
    280 EmulatePciIoForEhci (
    281   INTN    MvPciIfMaxIf
    282   );
    283 
    284 #endif
    285