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:
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;
}