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

commit 1d7631e6129f605d7725c0a747e1eeecc01ea21c
parent 1736dfd9677314fddeaab1120d920f294cf62bce
Author: Broadcom SDK Release <sdk.releases@broadcom.com>
Date:   Tue,  7 Jan 2020 19:39:50 -0800

SDK-166533: Flags supported and Ramon API fix.

Devices: 88790_A0
Module: SOC

Symptom:
Support to add new flags in _cmicx_sbusdma_reg_array_write_prog()

Diffstat:
Msdk-6.5.16/include/soc/sbusdma_internal.h | 8++++++--
Msdk-6.5.16/src/soc/common/cmicx_sbusdma_common.c | 19+++++++++++++------
Msdk-6.5.16/src/soc/common/cmicx_sbusdma_desc.c | 4++--
Msdk-6.5.16/src/soc/common/cmicx_sbusdma_reg.c | 49+++++++++++++++++++++++++++++++++++++++----------
4 files changed, 60 insertions(+), 20 deletions(-)

diff --git a/sdk-6.5.16/include/soc/sbusdma_internal.h b/sdk-6.5.16/include/soc/sbusdma_internal.h @@ -402,6 +402,7 @@ cmicx_sbusdma_intr_init(int unit); * @param cmc [in] cmc * @param ch [in] channel * @param interval [in] timeout +* @param do_not_perform_start_operation [in] if the argument is non-zero, the operation is assumed to be already started. * * @returns SOC_E_NONE * @returns SOC_E_XXX @@ -409,7 +410,7 @@ cmicx_sbusdma_intr_init(int unit); * @end */ extern int -cmicx_sbusdma_intr_wait(int unit, int cmc, int ch, int timeout); +cmicx_sbusdma_intr_wait(int unit, int cmc, int ch, int timeout, uint32 do_not_perform_start_operation); /******************************************* * @function cmicx_sbusdma_poll_wait @@ -419,6 +420,7 @@ cmicx_sbusdma_intr_wait(int unit, int cmc, int ch, int timeout); * @param cmc [in] cmc * @param ch [in] channel * @param interval [in] timeout +* @param do_not_perform_start_operation [in] if the argument is non-zero, the operation is assumed to be already started. * * @returns SOC_E_NONE * @returns SOC_E_XXX @@ -426,7 +428,7 @@ cmicx_sbusdma_intr_wait(int unit, int cmc, int ch, int timeout); * @end */ extern int -cmicx_sbusdma_poll_wait(int unit, int cmc, int ch, int timeout); +cmicx_sbusdma_poll_wait(int unit, int cmc, int ch, int timeout, uint32 do_not_perform_start_operation); /******************************************* * @function cmicx_sbusdma_stop @@ -443,6 +445,8 @@ cmicx_sbusdma_poll_wait(int unit, int cmc, int ch, int timeout); int cmicx_sbusdma_stop(int unit, int cmc, int ch); +int +_cmicx_sbusdma_start(int unit, int cmc, int ch); #endif /* !_SOC_SBUSDMA_INTERNAL_H */ diff --git a/sdk-6.5.16/src/soc/common/cmicx_sbusdma_common.c b/sdk-6.5.16/src/soc/common/cmicx_sbusdma_common.c @@ -509,7 +509,7 @@ cmicx_sbusdma_ch_endian_set(int unit, int cmc, int ch, int be) * * @end */ -STATIC int +int _cmicx_sbusdma_start(int unit, int cmc, int ch) { int rv = SOC_E_NONE; @@ -561,6 +561,7 @@ cmicx_sbusdma_stop(int unit, int cmc, int ch) * @param cmc [in] cmc * @param ch [in] channel * @param interval [in] timeout +* @param do_not_perform_start_operation [in] if the argument is non-zero, the operation is assumed to be already started. * * @returns SOC_E_NONE * @returns SOC_E_XXX @@ -568,7 +569,7 @@ cmicx_sbusdma_stop(int unit, int cmc, int ch) * @end */ int -cmicx_sbusdma_intr_wait(int unit, int cmc, int ch, int timeout) +cmicx_sbusdma_intr_wait(int unit, int cmc, int ch, int timeout, uint32 do_not_perform_start_operation) { int rv = SOC_E_NONE; int rval; @@ -580,8 +581,11 @@ cmicx_sbusdma_intr_wait(int unit, int cmc, int ch, int timeout) cmc, ch, timeout)); soc_cmic_intr_enable(unit, INTR_SBUSDMA(cmc, ch)); - _cmicx_sbusdma_start(unit, cmc, ch); - _cmicx_sbusdma_ch.wait[unit][cmc] |= (0x01 << ch); + + if (do_not_perform_start_operation == 0 ) { + _cmicx_sbusdma_start(unit, cmc, ch); + } + _cmicx_sbusdma_ch.wait[unit][cmc] |= (0x01 << ch); if (sal_sem_take(soc->sbusDmaIntrs[cmc][ch], timeout) < 0) { rv = SOC_E_TIMEOUT; @@ -618,6 +622,7 @@ cmicx_sbusdma_intr_wait(int unit, int cmc, int ch, int timeout) * @param cmc [in] cmc * @param ch [in] channel * @param interval [in] timeout +* @param do_not_perform_start_operation [in] if the argument is non-zero, the operation is assumed to be already started. * * @returns SOC_E_NONE * @returns SOC_E_XXX @@ -625,13 +630,15 @@ cmicx_sbusdma_intr_wait(int unit, int cmc, int ch, int timeout) * @end */ int -cmicx_sbusdma_poll_wait(int unit, int cmc, int ch, int timeout) +cmicx_sbusdma_poll_wait(int unit, int cmc, int ch, int timeout, uint32 do_not_perform_start_operation) { soc_timeout_t to; int rv = SOC_E_TIMEOUT; int rval; - _cmicx_sbusdma_start(unit, cmc, ch); + if (do_not_perform_start_operation == 0 ) { + _cmicx_sbusdma_start(unit, cmc, ch); + } _cmicx_sbusdma_ch.wait[unit][cmc] |= (0x01 << ch); soc_timeout_init(&to, timeout, 0); diff --git a/sdk-6.5.16/src/soc/common/cmicx_sbusdma_desc.c b/sdk-6.5.16/src/soc/common/cmicx_sbusdma_desc.c @@ -267,12 +267,12 @@ _cmicx_sbusdma_wait(int unit, int cmc, int ch, int interval, uint8 intrEnb) uint32 ctrl; if (intrEnb) { - rv = cmicx_sbusdma_intr_wait(unit, cmc, ch, interval); + rv = cmicx_sbusdma_intr_wait(unit, cmc, ch, interval, 0); if (rv != SOC_E_TIMEOUT) { SOC_CONTROL(unit)->stat.intr_desc++; } } else { - rv = cmicx_sbusdma_poll_wait(unit, cmc, ch, interval); + rv = cmicx_sbusdma_poll_wait(unit, cmc, ch, interval, 0); } if (rv != SOC_E_NONE) { diff --git a/sdk-6.5.16/src/soc/common/cmicx_sbusdma_reg.c b/sdk-6.5.16/src/soc/common/cmicx_sbusdma_reg.c @@ -188,6 +188,7 @@ _cmicx_sbusdma_reg_complete(int unit, void *data, void *wparam) { int rv; + uint32 do_not_perform_start_operation = 0; uint32 ctrl, rval; cmic_sbusdma_wait_t *wait; soc_sbusdma_reg_param_t *param; @@ -208,16 +209,19 @@ _cmicx_sbusdma_reg_complete(int unit, void *data, data_beats = soc_mem_entry_words(unit, param->mem); wait->start_time = sal_time_usecs(); #endif - + if((param->flags & SOC_MEM_WRITE_STATUS_ONLY) != 0) + { + do_not_perform_start_operation = 1; + } if (wait->intr_enb) { rv = cmicx_sbusdma_intr_wait(unit, wait->cmc, wait->ch, - wait->timeout); + wait->timeout, do_not_perform_start_operation); if (rv != SOC_E_TIMEOUT) { SOC_CONTROL(unit)->stat.intr_tslam++; } } else { rv = cmicx_sbusdma_poll_wait(unit, wait->cmc, wait->ch, - wait->timeout); + wait->timeout, do_not_perform_start_operation); } #ifdef PRINT_DMA_TIME @@ -535,6 +539,18 @@ _cmicx_sbusdma_reg_array_write_prog(int unit, } param = (soc_sbusdma_reg_param_t *)data; + if ((param->flags & (SOC_MEM_WRITE_COMMIT_ONLY | SOC_MEM_WRITE_STATUS_ONLY | SOC_MEM_WRITE_SET_ONLY)) != 0 && param->array_id_start < param->array_id_end) { + LOG_ERROR(BSL_LS_SOC_DMA, (BSL_META_U(unit, + "cannot perform partial write operations for multiple memory array indices\n"))); + return SOC_E_PARAM; + } + + if ((param->flags & SOC_MEM_WRITE_COMMIT_ONLY) != 0 && param->vchan != -1) { + SOC_IF_ERROR_RETURN(cmicx_sbusdma_vchan_to_cmc_ch(unit, + param->vchan, &prog.cmc, &prog.ch)); + _cmicx_sbusdma_start(unit, prog.cmc, prog.ch); + return 0; + } wait = SBUSDMA_REG_WAIT(wparam); if (wait == NULL) { @@ -558,10 +574,20 @@ _cmicx_sbusdma_reg_array_write_prog(int unit, param->data_beats = soc_mem_entry_words(unit, param->mem); - SOC_IF_ERROR_RETURN(_cmicx_sbusdma_reg_prog_init(unit, param, &msg, - &prog, WRITE_MEMORY_CMD_MSG)); - - prog.mem_clear = param->mem_clear; + if ((param->flags & (SOC_MEM_WRITE_COMMIT_ONLY | SOC_MEM_WRITE_STATUS_ONLY)) == 0) { /* used by SOC_MEM_WRITE_SET_ONLY */ + SOC_IF_ERROR_RETURN(_cmicx_sbusdma_reg_prog_init(unit, param, &msg, + &prog, WRITE_MEMORY_CMD_MSG)); + prog.mem_clear = param->mem_clear; + } else { /* calculate channel instead */ + if (param->vchan == -1) { + LOG_ERROR(BSL_LS_SOC_DMA, (BSL_META_U(unit, + "SOC_MEM_WRITE_STATUS_ONLY requires a channel to be specified\n"))); + return SOC_E_PARAM; + } else { + SOC_IF_ERROR_RETURN(cmicx_sbusdma_vchan_to_cmc_ch(unit, + param->vchan, &prog.cmc, &prog.ch)); + } + } /* fill out the interrupt data */ wait->ch = prog.ch; wait->cmc = prog.cmc; @@ -570,7 +596,7 @@ _cmicx_sbusdma_reg_array_write_prog(int unit, for (array_index = param->array_id_start; array_index <= param->array_id_end; ++array_index) { - if (!param->flags || (param->flags & SOC_MEM_WRITE_SET_ONLY)) { + if ((param->flags & (SOC_MEM_WRITE_COMMIT_ONLY | SOC_MEM_WRITE_STATUS_ONLY)) == 0) { /* used by SOC_MEM_WRITE_SET_ONLY */ prog.start_addr = soc_mem_addr_get(unit, param->mem, array_index, param->copyno, param->index_begin, &at); @@ -590,7 +616,8 @@ _cmicx_sbusdma_reg_array_write_prog(int unit, soc_cm_sflush(unit, param->buffer, WORDS2BYTES(prog.data_beats) * prog.count); } - + } + if ((param->flags & SOC_MEM_WRITE_SET_ONLY ) == 0) { /* used by SOC_MEM_WRITE_STATUS_ONLY */ /* Wait for each index to finish, except the last one */ if (array_index != param->array_id_end) { rv = _cmicx_sbusdma_reg_complete(unit, param, wparam); @@ -628,7 +655,9 @@ _cmicx_sbusdma_reg_array_write(int unit, soc_sbusdma_reg_param_t *param) rv = _cmicx_sbusdma_reg_array_write_prog(unit, param, &wparam); SOC_IF_ERROR_RETURN(rv); - rv = _cmicx_sbusdma_reg_complete(unit, param, &wparam); + if ((param->flags & (SOC_MEM_WRITE_COMMIT_ONLY | SOC_MEM_WRITE_SET_ONLY)) == 0) { /* used by SOC_MEM_WRITE_STATUS_ONLY */ + rv = _cmicx_sbusdma_reg_complete(unit, param, &wparam); + } return rv; }