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