openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

sbusdma_internal.h (10945B)


      1 /*
      2  * 
      3  * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file.
      4  * 
      5  * Copyright 2007-2019 Broadcom Inc. All rights reserved.
      6  *
      7  * File:        sbusdma_internal.h
      8  * Purpose:     Maps out structures used for SBUSDMA operations and
      9  *              exports routines.
     10  */
     11 
     12 #ifndef _SOC_SBUSDMA_INTERNAL_H
     13 #define _SOC_SBUSDMA_INTERNAL_H
     14 
     15 #include <soc/defs.h>
     16 #include <soc/types.h>
     17 #include <sal/types.h>
     18 #include <sal/core/time.h>
     19 #include <sal/core/sync.h>
     20 #include <sal/core/thread.h>
     21 #include <soc/sbusdma.h>
     22 #if defined(BCM_SOC_ASYNC_SUPPORT) || (defined(BCM_CMICX_SUPPORT) && defined(BCM_SBUSDMA_SUPPORT))
     23 #include <soc/soc_async.h>
     24 #endif
     25 
     26 #define CMIC_CMCx_SBUSDMA_CHSELECT_TIMEOUT    (1000)
     27 
     28 typedef struct cmic_sbusdma_wait_s {
     29     int         opcode;
     30     int         intr_enb;
     31     int         timeout;
     32     int         intr;
     33     int         count;
     34     int         ch;
     35     int         cmc;
     36 #ifdef PRINT_DMA_TIME
     37     sal_usecs_t   start_time;
     38 #endif
     39 }cmic_sbusdma_wait_t;
     40 
     41 #if defined(BCM_SOC_ASYNC_SUPPORT) || (defined(BCM_CMICX_SUPPORT) && defined(BCM_SBUSDMA_SUPPORT))
     42 typedef struct cmic_sbusdma_wparam_s {
     43   cmic_sbusdma_wait_t wait;
     44   void *cookie;
     45   soc_async_cb_f  cb_f;
     46 }cmic_sbusdma_wparam_t;
     47 #endif
     48 
     49 /* Register SBUS DMA function pointers */
     50 typedef struct soc_sbusdma_reg_drv_s {
     51     int (*soc_mem_sbusdma_read)(int unit, soc_sbusdma_reg_param_t  *param);
     52     int (*soc_mem_sbusdma_write)(int unit, soc_sbusdma_reg_param_t *param);
     53     int (*soc_mem_sbusdma_clear)(int unit, soc_sbusdma_reg_param_t *param);
     54     int (*soc_sbusdma_read_prog)(int unit,
     55             void *data, void *wparam);
     56     int (*soc_sbusdma_write_prog)(int unit,
     57             void *data, void *wparam);
     58     int (*soc_sbusdma_clear_prog)(int unit,
     59             void *data, void *wparam);
     60     int (*soc_sbusdma_reg_complete)(int unit,
     61             void *data, void *wparam);
     62     uint32 (*soc_sbusdma_cmc_max_num_ch_get)(int unit);
     63 }soc_sbusdma_reg_drv_t;
     64 
     65 /* Descriptor SBUS DMA function pointers */
     66 
     67 typedef struct soc_sbusdma_desc_drv_s {
     68 int (*soc_sbusdma_desc_create)(int unit, soc_sbusdma_desc_ctrl_t *ctrl,
     69                         soc_sbusdma_desc_cfg_t *cfg, void **desc);
     70 int (*soc_sbusdma_program)(int unit, int *cmc, _soc_sbusdma_state_t *swd,
     71                            int *ch);
     72 int (*soc_sbusdma_desc_detach)(int unit);
     73 int (*soc_sbusdma_wait)(int unit, int cmc, int ch, int interval,
     74                        uint8 intrEnb);
     75 }soc_sbusdma_desc_drv_t;
     76 
     77 typedef struct soc_sbusdma_cmic_ch_s {
     78     int (*soc_sbusdma_ch_try_get)(int unit, int cmc, int ch);
     79     int (*soc_sbusdma_ch_put)(int unit, int cmc, int ch);
     80 } soc_sbusdma_cmic_ch_t;
     81 
     82 #define SOC_CHECK_MULTI_CMC(unit) \
     83          (soc_feature(unit, soc_feature_cmicm_multi_dma_cmc) && \
     84                 (SOC_PCI_CMCS_NUM(unit) > 1))
     85 
     86 /*******************************************
     87 * @function cmicm_sbusdma_ch_init
     88 * purpose API to Initialize sbusdma channel seletion mechanism
     89 *
     90 * @param unit [in] unit
     91 * @param timeout [in] int
     92 * @param cmic_ch [out] pointer type soc_sbusdma_cmic_ch_t
     93 *
     94 * @returns SOC_E_NONE
     95 * @returns SOC_E_XXX
     96 *
     97 * @end
     98  */
     99 extern int
    100 cmicm_sbusdma_ch_init(int unit, int timeout,
    101                            soc_sbusdma_cmic_ch_t *cmic_ch);
    102 
    103 
    104 
    105 /*******************************************
    106 * @function cmicm_sbusdma_ch_put
    107 * purpose put back the freed channel on cmc
    108 *
    109 * @param cmc [in] cmc number
    110 * @param ch [in] channel number
    111 *
    112 * @returns SOC_E_PARAM
    113 * @returns SOC_E_NONE
    114 *
    115 * @end
    116  */
    117 extern int
    118 cmicm_sbusdma_ch_put(int unit, int cmc, int ch);
    119 
    120 /*******************************************
    121 * @function cmicm_sbusdma_ch_get
    122 * purpose get idle channel on cmc
    123 *
    124 * @param unit [in] unit #
    125 * @param cmc [out] cmc number
    126 * @param ch [out] channel number
    127 *
    128 * @returns SOC_E_BUSY
    129 * @returns SOC_E_NONE
    130 *
    131 * @end
    132  */
    133 extern int
    134 cmicm_sbusdma_ch_get(int unit, int *cmc, int *ch);
    135 
    136 /*******************************************
    137 * @function cmicm_sbusdma_ch_try_get
    138 * purpose get idle channel on cmc
    139 *
    140 * @param unit [in] unit #
    141 * @param cmc [in] cmc number
    142 * @param ch [in] channel number
    143 *
    144 * @returns SOC_E_BUSY
    145 * @returns SOC_E_NONE
    146 *
    147 * @end
    148  */
    149 extern int
    150 cmicm_sbusdma_ch_try_get(int unit, int cmc, int ch);
    151 
    152 /*******************************************
    153 * @function cmicm_sbusdma_reg_init
    154 * purpose API to Initialize cmicm register DMA
    155 *
    156 * @param unit [in] unit
    157 * @param drv [out] soc_sbusdma_reg_drv_t pointer
    158 *
    159 * @returns SOC_E_NONE
    160 * @returns SOC_E_XXX
    161 *
    162 * @end
    163  */
    164 extern int cmicm_sbusdma_reg_init(int unit, soc_sbusdma_reg_drv_t *drv);
    165 
    166 /*******************************************
    167 * @function cmicm_sbusdma_desc_init
    168 * purpose API to Initialize cmicm Descriptor DMA
    169 *
    170 * @param unit [in] unit
    171 * @param drv [out] soc_sbusdma_desc_drv_t pointer
    172 *
    173 * @returns SOC_E_NONE
    174 * @returns SOC_E_XXX
    175 *
    176 * @end
    177  */
    178 extern int cmicm_sbusdma_desc_init(int unit, soc_sbusdma_desc_drv_t *drv);
    179 
    180 /*******************************************
    181 * @function cmicm_sbusdma_curr_op_details
    182 * purpose API to print cmic operation registers
    183 *
    184 * @param unit [in] unit
    185 * @param cmc [in] cmc
    186 * @param ch [in] channel#
    187 *
    188 * @returns void
    189 *
    190 * @end
    191  */
    192 extern void
    193 cmicm_sbusdma_curr_op_details(int unit, int cmc, int ch);
    194 
    195 /*******************************************
    196 * @function cmicm_sbusdma_error_details
    197 * purpose API to print cmic error registers
    198 *
    199 * @param unit [in] unit
    200 * @param rval [in] return value
    201 *
    202 * @returns void
    203 *
    204 * @end
    205  */
    206 extern void
    207 cmicm_sbusdma_error_details(int unit, uint32 rval);
    208 
    209 /*******************************************
    210 * @function cmicx_sbusdma_ch_init
    211 * purpose API to Initialize sbusdma channel seletion mechanism
    212 *
    213 * @param unit [in] intt
    214 * @param timeout [in] int
    215 * @param cmic_ch [out] pointer type soc_sbusdma_cmic_ch_t
    216 *
    217 * @returns SOC_E_NONE
    218 * @returns SOC_E_XXX
    219 *
    220 * @end
    221  */
    222 extern int
    223 cmicx_sbusdma_ch_init(int unit, int timeout,
    224                       soc_sbusdma_cmic_ch_t *cmic_ch);
    225 
    226 /*******************************************
    227 * @function cmicx_sbusdma_ch_deinit
    228 * purpose API to de-Initialize sbusdma channel
    229 *
    230 * @param unit [in] unit
    231 *
    232 * @returns SOC_E_NONE
    233 * @returns SOC_E_XXX
    234 *
    235 * @end
    236  */
    237 extern int
    238 cmicx_sbusdma_ch_deinit(int unit);
    239 
    240 /*******************************************
    241 * @function cmicx_sbusdma_ch_put
    242 * purpose put back the freed channel on cmc
    243 *
    244 * @param cmc [in] cmc number
    245 * @param ch [in] channel number
    246 *
    247 * @returns SOC_E_PARAM
    248 * @returns SOC_E_NONE
    249 *
    250 * @end
    251  */
    252 extern int
    253 cmicx_sbusdma_ch_put(int unit, int cmc, int ch);
    254 
    255 /*******************************************
    256 * @function cmicx_sbusdma_ch_get
    257 * purpose get idle channel on cmc
    258 *
    259 * @param unit [in] unit #
    260 * @param cmc [out] cmc number
    261 * @param ch [out] channel number
    262 *
    263 * @returns SOC_E_BUSY
    264 * @returns SOC_E_NONE
    265 *
    266 * @end
    267  */
    268 extern int
    269 cmicx_sbusdma_ch_get(int unit, int *cmc, int *ch);
    270 
    271 /*******************************************
    272 * @function cmicx_sbusdma_ch_try_get
    273 * purpose get idle channel on cmc
    274 *
    275 * @param unit [in] unit #
    276 * @param cmc [out] cmc number
    277 * @param ch [out] channel number
    278 *
    279 * @returns SOC_E_BUSY
    280 * @returns SOC_E_NONE
    281 *
    282 * @end
    283  */
    284 extern int
    285 cmicx_sbusdma_ch_try_get(int unit, int cmc, int ch);
    286 
    287 /*******************************************
    288 * @function cmicx_sbusdma_ch_endian_set
    289 * set the endianess value
    290 *
    291 * @param cmc [in] cmc number
    292 * @param ch [in] channel number
    293 * @param ch [in] big_endian
    294 *
    295 * @returns SOC_E_PARAM
    296 * @returns SOC_E_NONE
    297 *
    298 * @end
    299  */
    300 extern int
    301 cmicx_sbusdma_ch_endian_set(int unit, int cmc, int ch, int be);
    302 
    303 /*******************************************
    304 * @function cmicx_sbusdma_vchan_to_cmc_ch
    305 * API takes vchan as input and return cmc and channel
    306 *
    307 * @param unit [in] int
    308 * @param vchan [in] virtual channel
    309 * @param cmc [out] cmc associated
    310 * @param channel [out] channel associated
    311 *
    312 * @returns SOC_E_NONE
    313 * @returns SOC_E_XXX
    314 *
    315 * @end
    316  */
    317 extern int
    318 cmicx_sbusdma_vchan_to_cmc_ch(int unit, int vchan,
    319                                int *cmc, int *ch);
    320 
    321 /*******************************************
    322 * @function cmicx_sbusdma_error_details
    323 * purpose Print error details
    324 *
    325 * @param unit [in] unit
    326 * @param rval [in] Error value
    327 *
    328 * @returns SOC_E_NONE
    329 * @returns SOC_E_XXX
    330 *
    331 * @end
    332  */
    333 extern void
    334 cmicx_sbusdma_error_details(int unit, uint32 rval);
    335 
    336 /*******************************************
    337 * @function cmicx_sbusdma_curr_op_details
    338 * purpose Print operation details
    339 *
    340 * @param unit [in] unit
    341 * @param cmc [in] cmc number
    342 * @param ch [in] channel number
    343 *
    344 * @returns SOC_E_NONE
    345 * @returns SOC_E_XXX
    346 *
    347 * @end
    348  */
    349 extern void
    350 cmicx_sbusdma_curr_op_details(int unit, int cmc, int ch);
    351 
    352 /*******************************************
    353 * @function cmicx_sbusdma_reg_init
    354 * purpose API to Initialize cmicx Register DMA
    355 *
    356 * @param unit [in] unit
    357 * @param drv [out] soc_sbusdma_desc_drv_t pointer
    358 *
    359 * @returns SOC_E_NONE
    360 * @returns SOC_E_XXX
    361 *
    362 * @end
    363  */
    364 extern int
    365 cmicx_sbusdma_reg_init(int unit, soc_sbusdma_reg_drv_t *drv);
    366 
    367 
    368 /*******************************************
    369 * @function cmicx_sbusdma_desc_init
    370 * purpose API to Initialize cmicx Descriptor DMA
    371 *
    372 * @param unit [in] unit
    373 * @param drv [out] soc_sbusdma_desc_drv_t pointer
    374 *
    375 * @returns SOC_E_NONE
    376 * @returns SOC_E_XXX
    377 *
    378 * @end
    379  */
    380 extern int
    381 cmicx_sbusdma_desc_init(int unit, soc_sbusdma_desc_drv_t *drv);
    382 
    383 /*******************************************
    384 * @function cmicx_sbusdma_intr_init
    385 * purpose API to Initialize SBUSDMA interrupts
    386 *
    387 * @param unit [in] unit
    388 *
    389 * @returns SOC_E_NONE
    390 * @returns SOC_E_XXX
    391 *
    392 * @end
    393  */
    394 extern int
    395 cmicx_sbusdma_intr_init(int unit);
    396 
    397 /*******************************************
    398 * @function cmicx_sbusdma_intr_wait
    399 * purpose API to wait for DMA complete using interrupt mode
    400 *
    401 * @param unit [in] unit
    402 * @param cmc [in] cmc
    403 * @param ch [in] channel
    404 * @param interval [in] timeout
    405 * @param do_not_perform_start_operation [in] if the argument is non-zero, the operation is assumed to be already started.
    406 *
    407 * @returns SOC_E_NONE
    408 * @returns SOC_E_XXX
    409 *
    410 * @end
    411  */
    412 extern int
    413 cmicx_sbusdma_intr_wait(int unit, int cmc, int ch, int timeout, uint32 do_not_perform_start_operation);
    414 
    415 /*******************************************
    416 * @function cmicx_sbusdma_poll_wait
    417 * purpose API to wait DMA to complete using Polling mode
    418 *
    419 * @param unit [in] unit
    420 * @param cmc [in] cmc
    421 * @param ch [in] channel
    422 * @param interval [in] timeout
    423 * @param do_not_perform_start_operation [in] if the argument is non-zero, the operation is assumed to be already started.
    424 *
    425 * @returns SOC_E_NONE
    426 * @returns SOC_E_XXX
    427 *
    428 * @end
    429  */
    430 extern int
    431 cmicx_sbusdma_poll_wait(int unit, int cmc, int ch, int timeout, uint32 do_not_perform_start_operation);
    432 
    433 /*******************************************
    434 * @function cmicx_sbusdma_stop
    435 * start the SBUSDMA
    436 *
    437 * @param unit [in] unit
    438 * @param cmc [in] cmc
    439 * @param ch [in] channel
    440 *
    441 * @returns SOC_E_NONE
    442 *
    443 * @end
    444  */
    445 int
    446 cmicx_sbusdma_stop(int unit, int cmc, int ch);
    447 
    448 int
    449 _cmicx_sbusdma_start(int unit, int cmc, int ch);
    450 
    451 
    452 #endif /* !_SOC_SBUSDMA_INTERNAL_H */