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) */