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

ccmdma.c (5362B)


      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  * Purpose: SOC CCM DMA driver.
      8  */
      9 
     10 #include <shared/bsl.h>
     11 
     12 #include <sal/core/boot.h>
     13 #include <sal/core/libc.h>
     14 #include <shared/alloc.h>
     15 
     16 #include <soc/drv.h>
     17 #include <soc/debug.h>
     18 #include <soc/cm.h>
     19 #include <soc/ccmdma_internal.h>
     20 
     21 #if defined(BCM_ESW_SUPPORT) || defined(BCM_SAND_SUPPORT)
     22 #ifdef BCM_CCMDMA_SUPPORT
     23 
     24 #if (!defined(_LIMITS_H)) && !defined(_LIBC_LIMITS_H_)
     25 
     26 #if (!defined(INT_MIN)) && !defined(INT_MAX)
     27 #define INT_MIN (((int)1)<<(sizeof(int)*8-1))
     28 #define INT_MAX (~INT_MIN)
     29 #endif
     30 
     31 #ifndef UINT_MAX
     32 #define UINT_MAX ((unsigned)-1)
     33 #endif
     34 
     35 #endif
     36 
     37 STATIC soc_ccmdma_drv_t _ccmdma_drv[SOC_MAX_NUM_DEVICES];
     38 
     39 /*******************************************
     40 * @function soc_ccmdma_ch_get
     41 * purpose get idle DMA channel
     42 *
     43 * @param unit [in] unit #
     44 * @param vchan [out] channel number
     45 *
     46 * @returns SOC_E_BUSY
     47 * @returns SOC_E_NONE
     48 *
     49 * @end
     50  */
     51 extern int
     52 soc_ccmdma_ch_get(int unit, int *vchan)
     53 {
     54     int rv = SOC_E_UNAVAIL;
     55 
     56     if (_ccmdma_drv[unit].soc_ccmdma_ch_get != NULL) {
     57         rv = _ccmdma_drv[unit].soc_ccmdma_ch_get(unit, vchan);
     58     }
     59 
     60     return rv;
     61 }
     62 
     63 /*******************************************
     64 * @function soc_ccmdma_ch_put
     65 * purpose put back the channel on free list
     66 *
     67 * @param ch [in] channel number
     68 *
     69 * @returns SOC_E_PARAM
     70 * @returns SOC_E_NONE
     71 *
     72 * @end
     73  */
     74 extern int
     75 soc_ccmdma_ch_put(int unit, int vchan)
     76 {
     77     int rv = SOC_E_UNAVAIL;
     78 
     79     if (_ccmdma_drv[unit].soc_ccmdma_ch_put != NULL) {
     80         rv = _ccmdma_drv[unit].soc_ccmdma_ch_put(unit, vchan);
     81     }
     82 
     83     return rv;
     84 }
     85 
     86 /*******************************************
     87 * @function soc_ccmdma_copy
     88 * purpose to initiate DMA from source to
     89 *            destination memory on vchan
     90 * @param srcbuf [in] pointer to source memory
     91 * @param dstbuf [in] pointer to dest memory
     92 * @param count [in] number of bytes to xfer
     93 * @param flags [in]
     94 * @param vchan [in] channel number
     95 *
     96 * @returns SOC_E_XXXX
     97 * @returns SOC_E_NONE
     98 *
     99 * @end
    100  */
    101 int
    102 soc_ccmdma_copy(int unit,  sal_paddr_t *srcbuf, sal_paddr_t *dstbuf,
    103                 unsigned int src_is_internal, unsigned int dst_is_internal,
    104                 int count, int flags, int vchan)
    105 {
    106     int rv = SOC_E_UNAVAIL;
    107 
    108     if (_ccmdma_drv[unit].soc_ccmdma_copy != NULL) {
    109         rv = _ccmdma_drv[unit].soc_ccmdma_copy(unit, srcbuf, dstbuf,
    110                                                src_is_internal, dst_is_internal,
    111                                                count, flags, vchan);
    112     }
    113 
    114     return rv;
    115 }
    116 
    117 /*******************************************
    118 * @function soc_ccmdma_copy_wait
    119 * purpose to initiate DMA from source to
    120 *            destination memory on vchan
    121 * @param vchan [in] channel number
    122 *
    123 * @returns SOC_E_XXXX
    124 * @returns SOC_E_NONE
    125 *
    126 * @end
    127  */
    128 extern int
    129 soc_ccmdma_copy_wait(int unit, int vchan)
    130 {
    131     int rv = SOC_E_UNAVAIL;
    132 
    133     if (_ccmdma_drv[unit].soc_ccmdma_copy_wait!= NULL) {
    134         rv = _ccmdma_drv[unit].soc_ccmdma_copy_wait(unit, vchan);
    135     }
    136 
    137     return rv;
    138 }
    139 
    140 /*******************************************
    141 * @function soc_ccmdma_abort
    142 * purpose to abort active DMA operation on
    143 *            given channel
    144 * @param vchan [in] channel number
    145 *
    146 * @returns SOC_E_XXXX
    147 * @returns SOC_E_NONE
    148 *
    149 * @end
    150  */
    151 extern int
    152 soc_ccmdma_abort(int unit, int vchan)
    153 {
    154     int rv = SOC_E_UNAVAIL;
    155 
    156     if (_ccmdma_drv[unit].soc_ccmdma_abort != NULL) {
    157         rv = _ccmdma_drv[unit].soc_ccmdma_abort(unit, vchan);
    158     }
    159 
    160     return rv;
    161 }
    162 
    163 /*******************************************
    164 * @function soc_ccmdma_clean
    165 * purpose to clean ccmdma
    166 * @param max_cmx [in] max cmc
    167 *
    168 * @returns SOC_E_XXXX
    169 * @returns SOC_E_NONE
    170 *
    171 * @end
    172  */
    173 extern int
    174 soc_ccmdma_clean(int unit, int max_cmc)
    175 {
    176     int rv = SOC_E_UNAVAIL;
    177 
    178     if (_ccmdma_drv[unit].soc_ccmdma_clean != NULL) {
    179         rv = _ccmdma_drv[unit].soc_ccmdma_clean(unit, max_cmc);
    180     }
    181 
    182     return rv;
    183 }
    184 
    185 /*******************************************
    186 * @function soc_ccmdma_init
    187 * purpose API to Initialize CCM DMA
    188 *
    189 * @param unit [in] unit
    190 *
    191 * @returns SOC_E_NONE
    192 * @returns SOC_E_XXX
    193 *
    194 * @end
    195  */
    196 int soc_ccmdma_init(int unit)
    197 {
    198 #ifdef BCM_CMICM_SUPPORT
    199     if (soc_feature(unit, soc_feature_cmicm)) {
    200         SOC_IF_ERROR_RETURN(cmicm_ccmdma_init(unit,
    201                             &_ccmdma_drv[unit]));
    202     }
    203 #endif
    204 #ifdef BCM_CMICX_SUPPORT
    205     if (soc_feature(unit, soc_feature_cmicx)) {
    206         SOC_IF_ERROR_RETURN(cmicx_ccmdma_init(unit,
    207                             &_ccmdma_drv[unit]));
    208     }
    209 #endif
    210     return SOC_E_NONE;
    211 }
    212 
    213 /*******************************************
    214 * @function soc_ccmdma_deinit
    215 * purpose API to Deinitialize CCM DMA
    216 *
    217 * @param unit [in] unit
    218 *
    219 * @returns SOC_E_NONE
    220 *
    221 * @end
    222  */
    223 int soc_ccmdma_deinit(int unit)
    224 {
    225 #ifdef BCM_CMICM_SUPPORT
    226     if (soc_feature(unit, soc_feature_cmicm)) {
    227 
    228         SOC_IF_ERROR_RETURN(cmicm_ccmdma_deinit(unit,
    229                             &_ccmdma_drv[unit]));
    230     }
    231 #endif
    232 #ifdef BCM_CMICX_SUPPORT
    233     if (soc_feature(unit, soc_feature_cmicx)) {
    234 
    235         SOC_IF_ERROR_RETURN(cmicx_ccmdma_deinit(unit,
    236                             &_ccmdma_drv[unit]));
    237     }
    238 #endif
    239     return SOC_E_NONE;
    240 }
    241 
    242 #endif /* BCM_CCMDMA_SUPPORT */
    243 #endif /* defined(BCM_ESW_SUPPORT) || defined(BCM_SAND_SUPPORT) */