Home | History | Annotate | Download | only in PcieInitDxe
      1 /** @file
      2 *
      3 *  Copyright (c) 2016, Hisilicon Limited. All rights reserved.
      4 *  Copyright (c) 2016, Linaro Limited. 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 __PCIE_KERNEL_API_H__
     17 #define __PCIE_KERNEL_API_H__
     18 
     19 #define PCIE_HOST_BRIDGE_NUM            (1)
     20 #define PCIE_MAX_PORT_NUM               (4)
     21 #define PCIE_MAX_OUTBOUND               (6)
     22 #define PCIE_MAX_INBOUND               (4)
     23 #define PCIE3_MAX_OUTBOUND               (16)
     24 #define PCIE3_MAX_INBOUND                (16)
     25 
     26 #define PCIE_LINK_LOOP_CNT          (0x1000)
     27 #define PCIE_IATU_ADDR_MASK         (0xFFFFF000)
     28 #define PCIE_1M_ALIGN_SHIRFT        (20)
     29 #define PCIE_BDF_MASK               (0xF0000FFF)
     30 #define PCIE_BUS_SHIRFT             (20)
     31 #define PCIE_DEV_SHIRFT             (15)
     32 #define PCIE_FUNC_SHIRFT            (12)
     33 
     34 #define PCIE_DBI_CS2_ENABLE              (0x1)
     35 #define PCIE_DBI_CS2_DISABLE             (0x0)
     36 
     37 #define PCIE_DMA_CHANLE_READ             (0x1)
     38 #define PCIE_DMA_CHANLE_WRITE             (0x0)
     39 
     40 
     41 #define PCIE_ERR_IATU_TABLE_NULL            EFIERR (1)
     42 #define PCIE_ERR_LINK_OVER_TIME             EFIERR (2)
     43 #define PCIE_ERR_UNIMPLEMENT_PCIE_TYPE      EFIERR (3)
     44 #define PCIE_ERR_ALREADY_INIT               EFIERR (4)
     45 #define PCIE_ERR_PARAM_INVALID              EFIERR (5)
     46 #define PCIE_ERR_MEM_OPT_OVER               EFIERR (6)
     47 #define PCIE_ERR_NOT_INIT                   EFIERR (7)
     48 #define PCIE_ERR_CFG_OPT_OVER               EFIERR (8)
     49 #define PCIE_ERR_DMA_READ_CHANLE_BUSY       EFIERR (9)
     50 #define PCIE_ERR_DMA_WRITE_CHANLE_BUSY      EFIERR (10)
     51 #define PCIE_ERR_DMAR_NO_RESORCE            EFIERR (11)
     52 #define PCIE_ERR_DMAW_NO_RESORCE            EFIERR (12)
     53 #define PCIE_ERR_DMA_OVER_MAX_RESORCE       EFIERR (13)
     54 #define PCIE_ERR_NO_IATU_WINDOW             EFIERR (14)
     55 #define PCIE_ERR_DMA_TRANSPORT_OVER_TIME    EFIERR (15)
     56 #define PCIE_ERR_DMA_MEM_ALLOC_ERROR        EFIERR (16)
     57 #define PCIE_ERR_DMA_ABORT                  EFIERR (17)
     58 #define PCIE_ERR_UNSUPPORT_BAR_TYPE         EFIERR (18)
     59 
     60 typedef enum {
     61     PCIE_ROOT_COMPLEX,
     62     PCIE_END_POINT,
     63     PCIE_NTB_TO_NTB,
     64     PCIE_NTB_TO_RP,
     65 } PCIE_PORT_TYPE;
     66 
     67 typedef enum {
     68     PCIE_GEN1_0 = 1,    //PCIE 1.0
     69     PCIE_GEN2_0 = 2,    //PCIE 2.0
     70     PCIE_GEN3_0 = 4     //PCIE 3.0
     71 } PCIE_PORT_GEN;
     72 
     73 typedef enum {
     74     PCIE_WITDH_X1 = 0x1,
     75     PCIE_WITDH_X2 = 0x3,
     76     PCIE_WITDH_X4 = 0x7,
     77     PCIE_WITDH_X8 = 0xf,
     78     PCIE_WITDH_INVALID
     79 } PCIE_PORT_WIDTH;
     80 
     81 
     82 typedef struct {
     83     PCIE_PORT_TYPE      PortType;
     84     PCIE_PORT_WIDTH     PortWidth;
     85     PCIE_PORT_GEN       PortGen;
     86     UINT8               PcieLinkUp;
     87 } PCIE_PORT_INFO;
     88 
     89 typedef struct tagPciecfg_params
     90 {
     91     UINT32 preemphasis;
     92     UINT32 deemphasis;
     93     UINT32 swing;
     94     UINT32 balance;
     95 }pcie_cfg_params_s;
     96 
     97 typedef enum {
     98     PCIE_CORRECTABLE_ERROR = 0,
     99     PCIE_NON_FATAL_ERROR,
    100     PCIE_FATAL_ERROR,
    101     PCIE_UNSUPPORTED_REQUEST_ERROR,
    102     PCIE_ALL_ERROR
    103 } PCIE_ERROR_TYPE;
    104 
    105 typedef union tagPcieDeviceStatus
    106 {
    107        struct
    108         {
    109             UINT16 correctable_error : 1;
    110             UINT16 non_fatal_error : 1;
    111             UINT16 fatal_error : 1;
    112             UINT16 unsupported_error : 1;
    113             UINT16 aux_power : 1;
    114             UINT16 transaction_pending : 1;
    115             UINT16 reserved_6_15 : 10;
    116        }Bits;
    117 
    118     UINT16 Value;
    119 }pcie_device_status_u;
    120 
    121 
    122 typedef union tagPcieUcAerStatus
    123 {
    124       struct
    125         {
    126             UINT32    undefined   : 1   ; /* [0] undefined  */
    127             UINT32    reserved_1_3   : 3   ; /* reserved */
    128             UINT32    data_link_proto_error   : 1   ; /* Data Link Protocol Error Status */
    129             UINT32    reserved_5_11   : 7   ; /* reserved */
    130             UINT32    poisoned_tlp_status   : 1   ; /* Poisoned TLP Status */
    131             UINT32    flow_control_proto_error   : 1   ; /* Flow Control Protocol Error Status */
    132             UINT32    completion_time_out   : 1   ; /* Completion Timeout Status */
    133             UINT32    compler_abort_status   : 1   ; /* Completer Abort Status */
    134             UINT32    unexpect_completion_status   : 1   ; /* Unexpected Completion Status */
    135             UINT32    receiver_overflow_status   : 1   ; /*Receiver Overflow Status */
    136             UINT32    malformed_tlp_status   : 1   ; /* Malformed TLP Status*/
    137             UINT32    ecrc_error_status   : 1   ; /* ECRC Error Status */
    138             UINT32    unsupport_request_error_status   : 1   ; /* Unsupported Request Error Status */
    139             UINT32    reserved_21   : 1   ; /*  reserved */
    140             UINT32    uncorrectable_interal_error   : 1   ; /* Uncorrectable Internal Error Status */
    141             UINT32    reserved_23   : 1   ; /* reserved*/
    142             UINT32    atomicop_egress_blocked_status   : 1   ; /* AtomicOp Egress Blocked Status */
    143             UINT32    tlp_prefix_blocked_error_status   : 1   ; /* TLP Prefix Blocked Error Status */
    144             UINT32    reserved_26_31   : 1   ; /* reserved */
    145        }Bits;
    146 
    147        UINT32 Value;
    148 }pcie_uc_aer_status_u;
    149 
    150 typedef union tagPcieCoAerStatus
    151 {
    152        struct
    153         {
    154             UINT32    receiver_error_status   : 1   ; /* Receiver Error Status  */
    155             UINT32    reserved_1_5   : 5   ; /* Reserved */
    156             UINT32    bad_tlp_status   : 1   ; /* Bad TLP Status */
    157             UINT32    bad_dllp_status   : 1   ; /* Bad DLLP Status */
    158             UINT32    reply_num_rollover_status   : 1   ; /* REPLAY_NUM Rollover Status*/
    159             UINT32    reserved_9_11   : 3   ; /* Reserved */
    160             UINT32    reply_timer_timeout   : 1   ; /* Replay Timer Timeout Status */
    161             UINT32    advisory_nonfatal_error   : 1   ; /* Advisory Non-Fatal Error Status*/
    162             UINT32    corrected_internal_error   : 1   ; /*Corrected Internal Error Status*/
    163             UINT32    reserved_15_31   : 1   ; /* Reserved */
    164        }Bits;
    165        UINT32 Value;
    166 }pcie_co_aer_status_u;
    167 
    168 typedef struct tagPcieAerStatus
    169 {
    170     pcie_uc_aer_status_u uc_aer_status;
    171     pcie_co_aer_status_u co_aer_status;
    172 }pcie_aer_status_s;
    173 
    174 
    175 
    176 typedef struct tagPcieLoopTestResult
    177 {
    178    UINT32 tx_pkts_cnt;
    179    UINT32 rx_pkts_cnt;
    180    UINT32 error_pkts_cnt;
    181    UINT32 droped_pkts_cnt;
    182    UINT32 push_cnt;
    183    pcie_device_status_u device_status;
    184    pcie_aer_status_s    pcie_aer_status;
    185 } pcie_loop_test_result_s;
    186 
    187 typedef struct tagPcieDmaChannelAttrs {
    188     UINT32 dma_chan_en;
    189     UINT32 dma_mode;
    190     UINT32 channel_status;
    191 }pcie_dma_channel_attrs_s;
    192 
    193 typedef enum tagPcieDmaChannelStatus
    194 {
    195     PCIE_DMA_CS_RESERVED = 0,
    196     PCIE_DMA_CS_RUNNING = 1,
    197     PCIE_DMA_CS_HALTED = 2,
    198     PCIE_DMA_CS_STOPPED = 3
    199 }pcie_dma_channel_status_e;
    200 
    201 typedef enum tagPcieDmaIntType{
    202     PCIE_DMA_INT_TYPE_DONE=0,
    203     PCIE_DMA_INT_TYPE_ABORT,
    204     PCIE_DMA_INT_ALL,
    205     PCIE_DMA_INT_NONE
    206 }pcie_dma_int_type_e;
    207 
    208 typedef enum tagPcieMulWinSize
    209 {
    210     WIN_SIZE_4K = 0xc,
    211     WIN_SIZE_8K,
    212     WIN_SIZE_16K,
    213     WIN_SIZE_32K,
    214     WIN_SIZE_64K,
    215     WIN_SIZE_128K,
    216     WIN_SIZE_256K,
    217     WIN_SIZE_512K,
    218     WIN_SIZE_1M,
    219     WIN_SIZE_2M,
    220     WIN_SIZE_4M,
    221     WIN_SIZE_8M,
    222     WIN_SIZE_16M,
    223     WIN_SIZE_32M,
    224     WIN_SIZE_64M,
    225     WIN_SIZE_128M,
    226     WIN_SIZE_256M,
    227     WIN_SIZE_512M,
    228     WIN_SIZE_1G,
    229     WIN_SIZE_2G,
    230     WIN_SIZE_4G,
    231     WIN_SIZE_8G,
    232     WIN_SIZE_16G,
    233     WIN_SIZE_32G,
    234     WIN_SIZE_64G,
    235     WIN_SIZE_128G,
    236     WIN_SIZE_256G,
    237     WIN_SIZE_512G = 0x27,
    238 }pcie_mul_win_size_e;
    239 
    240 typedef struct tagPcieMultiCastCfg
    241 {
    242     UINT64 multicast_base_addr;
    243     pcie_mul_win_size_e base_addr_size;
    244     UINT64 base_translate_addr;
    245 }pcie_multicast_cfg_s;
    246 
    247 typedef enum tagPcieMode
    248 {
    249     PCIE_EP_DEVICE = 0x0,
    250     LEGACY_PCIE_EP_DEVICE = 0x1,
    251     RP_OF_PCIE_RC = 0x4,
    252     PCIE_INVALID = 0x100
    253 }pcie_mode_e;
    254 
    255 typedef struct{
    256     UINT32              PortIndex;
    257     PCIE_PORT_INFO      PortInfo;
    258     UINT64              iep_bar01; /*iep bar 01*/
    259     UINT64              iep_bar23;
    260     UINT64              iep_bar45;
    261     UINT64              iep_bar01_xlat;
    262     UINT64              iep_bar23_xlat;
    263     UINT64              iep_bar45_xlat;
    264     UINT64              iep_bar_lmt23;
    265     UINT64              iep_bar_lmt45; /*bar limit*/
    266     UINT64              eep_bar01;
    267     UINT64              eep_bar23;
    268     UINT64              eep_bar45;
    269     UINT64              eep_bar23_xlat;
    270     UINT64              eep_bar45_xlat;
    271     UINT64              eep_bar_lmt23; /*bar limit*/
    272     UINT64              eep_bar_lmt45; /*bar limit*/
    273 } PCIE_NTB_CFG;
    274 
    275 extern int pcie_mode_get(UINT32 Port, PCIE_PORT_INFO *port_info);
    276 
    277 extern int pcie_port_ctrl(UINT32 Port, UINT32 port_ctrl);
    278 
    279 extern int pcie_link_speed_set(UINT32 Port, PCIE_PORT_GEN speed);
    280 
    281 extern int pcie_port_cfg_set(UINT32 Port, pcie_cfg_params_s *cfg_params);
    282 
    283 extern int pcie_port_cfg_get(UINT32 Port, pcie_cfg_params_s *cfg_params);
    284 
    285 
    286 extern int pcie_dma_chan_ctl(UINT32 Port,UINT32 channel,UINT32 control);
    287 
    288 extern int pcie_dma_chan_attribu_set(UINT32 Port,UINT32 channel, pcie_dma_channel_attrs_s *dma_attribute);
    289 
    290 extern int pcie_dma_cur_status_get(UINT32 Port, UINT32 channel, pcie_dma_channel_status_e *dma_channel_status);
    291 
    292 extern int pcie_dma_int_enable(UINT32 Port, UINT32 channel, pcie_dma_int_type_e int_type);
    293 
    294 extern int pcie_dma_int_mask(UINT32 Port, UINT32 channel, pcie_dma_int_type_e int_type);
    295 
    296 extern int pcie_dma_tranfer_stop(UINT32 Port, UINT32 channel);
    297 
    298 
    299 extern int pcie_dma_int_status_get(UINT32 Port, UINT32 channel, int *dma_int_status);
    300 
    301 extern int pcie_dma_int_clear(UINT32 Port, UINT32 channel, pcie_dma_int_type_e dma_int_type);
    302 
    303 
    304 extern int pcie_dma_read(UINT32 Port,void *source, void *dest,UINT32 transfer_size, UINT32 burst_size);
    305 
    306 extern int pcie_dma_write(UINT32 Port,void *source, void *dest,UINT32 transfer_size, UINT32 burst_size);
    307 
    308 extern int pcie_multicast_cfg_set(UINT32 Port,pcie_multicast_cfg_s *multicast_cfg,UINT32 win_num);
    309 
    310 extern int pcie_setup_ntb(UINT32 Port, PCIE_NTB_CFG *ntb_cfg);
    311 
    312 extern int pcie_ntb_doorbell_send(UINT32 Port,UINT32 doorbell);
    313 
    314 extern int pcie_loop_test_start(UINT32 Port, UINT32 loop_type);
    315 
    316 extern int pcie_loop_test_stop(UINT32 Port, UINT32 loop_type);
    317 
    318 extern int pcie_loop_test_get(UINT32 Port, UINT32 loop_type, pcie_loop_test_result_s *test_result);
    319 extern int pcie_port_reset(UINT32 Port);
    320 
    321 extern int pcie_port_error_report_enable(UINT32 Port, UINT32 bus, UINT32 dev, UINT32 func, PCIE_ERROR_TYPE pcie_error);
    322 
    323 extern int pcie_port_error_report_disable(UINT32 Port, UINT32 bus, UINT32 dev, UINT32 func, PCIE_ERROR_TYPE pcie_error);
    324 
    325 extern int pcie_device_error_status_get(UINT32 Port, UINT32 bus, UINT32 dev, UINT32 func,UINT32 clear, \
    326 pcie_device_status_u *pcie_stat);
    327 extern int pcie_port_aer_cap_get(UINT32 Port, UINT32 bus, UINT32 dev, UINT32 func,UINT32 *aer_cap);
    328 
    329 extern int pcie_port_aer_status_get(UINT32 Port, UINT32 bus, UINT32 dev, UINT32 func,pcie_uc_aer_status_u *pcie_aer_status);
    330 extern int pcie_port_aer_status_clr(UINT32 Port, UINT32 bus, UINT32 dev, UINT32 func);
    331 
    332 extern int pcie_port_aer_report_enable(UINT32 Port, PCIE_ERROR_TYPE pcie_aer_type);
    333 
    334 
    335 extern int pcie_port_aer_report_disable(UINT32 Port, PCIE_ERROR_TYPE pcie_aer_type);
    336 
    337 
    338 extern int pcie_cfg_read(UINT32 Port, UINT32 bus, UINT32 dev, UINT32 func, UINT32 reg_offset, UINT32 * value, UINT32 length);
    339 
    340 extern int pcie_cfg_write(UINT32 Port, UINT32 bus, UINT32 dev, UINT32 func, UINT32 reg_offset, UINT8 * data, UINT32 length);
    341 
    342 extern int pcie_mem_read(UINT32 Port,void * local_addr, void *pcie_mem_addr,UINT32 length);
    343 
    344 extern int pcie_mem_write(UINT32 Port,void *local_addr , void *pcie_mem_addr,UINT32 length);
    345 
    346 #endif
    347